mirror of
https://github.com/TermoraDev/termora.git
synced 2026-01-16 02:12:58 +08:00
perf: lazy loading OptionsPane and Fonts (#619)
This commit is contained in:
@@ -25,6 +25,7 @@ class HostDialog(owner: Window, host: Host? = null) : DialogWrapper(owner) {
|
||||
isModal = true
|
||||
title = I18n.getString("termora.new-host.title")
|
||||
setLocationRelativeTo(null)
|
||||
pane.setSelectedIndex(0)
|
||||
|
||||
init()
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ open class OptionsPane : JPanel(BorderLayout()) {
|
||||
}
|
||||
private val cardLayout = CardLayout()
|
||||
private val contentPanel = JPanel(cardLayout)
|
||||
private val loadedComponents = mutableMapOf<String, JComponent>()
|
||||
|
||||
init {
|
||||
initView()
|
||||
@@ -103,16 +104,15 @@ open class OptionsPane : JPanel(BorderLayout()) {
|
||||
throw UnsupportedOperationException("Title already exists")
|
||||
}
|
||||
}
|
||||
contentPanel.add(option.getJComponent(), option.getTitle())
|
||||
tabListModel.addElement(option)
|
||||
|
||||
if (tabList.selectedIndex < 0) {
|
||||
tabList.selectedIndex = 0
|
||||
}
|
||||
}
|
||||
|
||||
fun removeOption(option: Option) {
|
||||
contentPanel.remove(option.getJComponent())
|
||||
val title = option.getTitle()
|
||||
loadedComponents[title]?.let {
|
||||
contentPanel.remove(it)
|
||||
loadedComponents.remove(title)
|
||||
}
|
||||
tabListModel.removeElement(option)
|
||||
}
|
||||
|
||||
@@ -123,7 +123,17 @@ open class OptionsPane : JPanel(BorderLayout()) {
|
||||
private fun initEvents() {
|
||||
tabList.addListSelectionListener {
|
||||
if (tabList.selectedIndex >= 0) {
|
||||
cardLayout.show(contentPanel, tabListModel.get(tabList.selectedIndex).getTitle())
|
||||
val option = tabListModel.get(tabList.selectedIndex)
|
||||
val title = option.getTitle()
|
||||
|
||||
if (!loadedComponents.containsKey(title)) {
|
||||
val component = option.getJComponent()
|
||||
loadedComponents[title] = component
|
||||
contentPanel.add(component, title)
|
||||
SwingUtilities.updateComponentTreeUI(component)
|
||||
}
|
||||
|
||||
cardLayout.show(contentPanel, title)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,8 +3,6 @@ package app.termora
|
||||
import java.awt.BorderLayout
|
||||
import java.awt.Dimension
|
||||
import java.awt.Window
|
||||
import java.awt.event.WindowAdapter
|
||||
import java.awt.event.WindowEvent
|
||||
import javax.swing.BorderFactory
|
||||
import javax.swing.JComponent
|
||||
import javax.swing.JPanel
|
||||
@@ -20,8 +18,10 @@ class SettingsDialog(owner: Window) : DialogWrapper(owner) {
|
||||
title = I18n.getString("termora.setting")
|
||||
setLocationRelativeTo(null)
|
||||
|
||||
init()
|
||||
val index = properties.getString("Settings-SelectedOption")?.toIntOrNull() ?: 0
|
||||
optionsPane.setSelectedIndex(index)
|
||||
|
||||
init()
|
||||
initEvents()
|
||||
}
|
||||
|
||||
@@ -31,14 +31,6 @@ class SettingsDialog(owner: Window) : DialogWrapper(owner) {
|
||||
properties.putString("Settings-SelectedOption", optionsPane.getSelectedIndex().toString())
|
||||
}
|
||||
})
|
||||
|
||||
addWindowListener(object : WindowAdapter() {
|
||||
override fun windowActivated(e: WindowEvent) {
|
||||
removeWindowListener(this)
|
||||
val index = properties.getString("Settings-SelectedOption")?.toIntOrNull() ?: return
|
||||
optionsPane.setSelectedIndex(index)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
override fun createCenterPanel(): JComponent {
|
||||
|
||||
@@ -604,16 +604,28 @@ class SettingsOptionsPane : OptionsPane() {
|
||||
|
||||
shellComboBox.selectedItem = terminalSetting.localShell
|
||||
|
||||
val fonts = linkedSetOf("JetBrains Mono", "Source Code Pro", "Monospaced")
|
||||
FontUtils.getAllFonts().forEach {
|
||||
if (!fonts.contains(it.family)) {
|
||||
fonts.addLast(it.family)
|
||||
fontComboBox.addItem(terminalSetting.font)
|
||||
var fontsLoaded = false
|
||||
|
||||
fontComboBox.addPopupMenuListener(object : PopupMenuListener {
|
||||
override fun popupMenuWillBecomeVisible(e: PopupMenuEvent) {
|
||||
if (!fontsLoaded) {
|
||||
val selectedItem = fontComboBox.selectedItem
|
||||
fontComboBox.removeAllItems();
|
||||
fontComboBox.addItem("JetBrains Mono")
|
||||
fontComboBox.addItem("Source Code Pro")
|
||||
fontComboBox.addItem("Monospaced")
|
||||
FontUtils.getAvailableFontFamilyNames().forEach {
|
||||
fontComboBox.addItem(it)
|
||||
}
|
||||
fontComboBox.selectedItem = selectedItem
|
||||
fontsLoaded = true
|
||||
}
|
||||
}
|
||||
|
||||
for (font in fonts) {
|
||||
fontComboBox.addItem(font)
|
||||
}
|
||||
override fun popupMenuWillBecomeInvisible(e: PopupMenuEvent) {}
|
||||
override fun popupMenuCanceled(e: PopupMenuEvent) {}
|
||||
})
|
||||
|
||||
fontComboBox.selectedItem = terminalSetting.font
|
||||
debugComboBox.selectedItem = terminalSetting.debug
|
||||
|
||||
Reference in New Issue
Block a user