chore: improve keymap refresh

This commit is contained in:
hstyi
2025-07-11 14:57:24 +08:00
committed by GitHub
parent 72ba3757e2
commit 675ad4608a
5 changed files with 91 additions and 31 deletions

View File

@@ -0,0 +1,21 @@
package app.termora
import app.termora.database.DatabaseChangedExtension
import app.termora.database.DatabasePropertiesChangedExtension
import app.termora.plugin.Extension
import app.termora.plugin.InternalPlugin
internal class FramePlugin : InternalPlugin() {
init {
support.addExtension(DatabasePropertiesChangedExtension::class.java) { KeymapRefresher.getInstance() }
support.addExtension(DatabaseChangedExtension::class.java) { KeymapRefresher.getInstance() }
}
override fun getName(): String {
return "Frame"
}
override fun <T : Extension> getExtensions(clazz: Class<T>): List<T> {
return support.getExtensions(clazz)
}
}

View File

@@ -0,0 +1,65 @@
package app.termora
import app.termora.database.DatabaseChangedExtension
import app.termora.database.DatabasePropertiesChangedExtension
import app.termora.keymap.KeymapManager
internal class KeymapRefresher private constructor() : DatabasePropertiesChangedExtension, DatabaseChangedExtension {
companion object {
fun getInstance(): KeymapRefresher {
return ApplicationScope.forApplicationScope()
.getOrCreate(KeymapRefresher::class) { KeymapRefresher() }
}
}
private val listeners = mutableListOf<() -> Unit>()
private var currentKeymap: String? = null
private val keymapManager get() = KeymapManager.getInstance()
private val activeKeymapName get() = keymapManager.getActiveKeymap().name
override fun onDataChanged(
id: String,
type: String,
action: DatabaseChangedExtension.Action,
source: DatabaseChangedExtension.Source
) {
if (type != "Keymap") return
refresh()
}
override fun onPropertyChanged(name: String, key: String, value: String) {
if (name != "Setting.Properties") return
if (key != "Keymap.Active") return
refresh()
}
private fun refresh() {
synchronized(this) {
if (currentKeymap == activeKeymapName) {
return
}
currentKeymap = activeKeymapName
for (function in listeners) {
function.invoke()
}
}
}
fun addRefreshListener(listener: () -> Unit): Disposable {
synchronized(this) {
listeners.add(listener)
return object : Disposable {
override fun dispose() {
removeRefreshListener(listener)
}
}
}
}
fun removeRefreshListener(listener: () -> Unit) {
synchronized(this) { listeners.remove(listener) }
}
}

View File

@@ -9,7 +9,7 @@ import javax.swing.JComponent
import javax.swing.JPanel import javax.swing.JPanel
import javax.swing.UIManager import javax.swing.UIManager
class SettingsDialog(owner: Window) : DialogWrapper(owner) { internal class SettingsDialog(owner: Window) : DialogWrapper(owner) {
private val optionsPane = SettingsOptionsPane() private val optionsPane = SettingsOptionsPane()
private val properties get() = DatabaseManager.getInstance().properties private val properties get() = DatabaseManager.getInstance().properties

View File

@@ -2,8 +2,6 @@ package app.termora
import app.termora.actions.* import app.termora.actions.*
import app.termora.database.DatabaseChangedExtension
import app.termora.database.DatabasePropertiesChangedExtension
import app.termora.findeverywhere.FindEverywhereProvider import app.termora.findeverywhere.FindEverywhereProvider
import app.termora.findeverywhere.FindEverywhereProviderExtension import app.termora.findeverywhere.FindEverywhereProviderExtension
import app.termora.findeverywhere.FindEverywhereResult import app.termora.findeverywhere.FindEverywhereResult
@@ -73,12 +71,8 @@ class TermoraFrame : JFrame(), DataProvider {
} }
// 快捷键变动时重新监听 // 快捷键变动时重新监听
val refresher = KeymapRefresher() KeymapRefresher.getInstance().addRefreshListener { initKeymap() }
dynamicExtensionHandler.register(DatabasePropertiesChangedExtension::class.java, refresher)
.let { Disposer.register(windowScope, it) } .let { Disposer.register(windowScope, it) }
dynamicExtensionHandler.register(DatabaseChangedExtension::class.java, refresher)
.let { Disposer.register(windowScope, it) }
// FindEverywhere // FindEverywhere
dynamicExtensionHandler dynamicExtensionHandler
@@ -418,29 +412,6 @@ class TermoraFrame : JFrame(), DataProvider {
return object : MouseAdapter() {} return object : MouseAdapter() {}
} }
private inner class KeymapRefresher : DatabasePropertiesChangedExtension, DatabaseChangedExtension {
override fun onDataChanged(
id: String,
type: String,
action: DatabaseChangedExtension.Action,
source: DatabaseChangedExtension.Source
) {
if (type != "Keymap") return
refresh()
}
override fun onPropertyChanged(name: String, key: String, value: String) {
if (name != "Setting.Properties") return
if (key != "Keymap.Active") return
refresh()
}
private fun refresh() {
initKeymap()
}
}
private inner class RedirectAnActionEvent( private inner class RedirectAnActionEvent(
source: Any, source: Any,

View File

@@ -2,6 +2,7 @@ package app.termora.plugin
import app.termora.Application import app.termora.Application
import app.termora.ApplicationScope import app.termora.ApplicationScope
import app.termora.FramePlugin
import app.termora.account.AccountPlugin import app.termora.account.AccountPlugin
import app.termora.plugin.internal.badge.BadgePlugin import app.termora.plugin.internal.badge.BadgePlugin
import app.termora.plugin.internal.extension.DynamicExtensionPlugin import app.termora.plugin.internal.extension.DynamicExtensionPlugin
@@ -111,6 +112,8 @@ internal class PluginManager private constructor() {
plugins.add(PluginDescriptor(BadgePlugin(), origin = PluginOrigin.Internal, version = version)) plugins.add(PluginDescriptor(BadgePlugin(), origin = PluginOrigin.Internal, version = version))
// update plugin // update plugin
plugins.add(PluginDescriptor(UpdatePlugin(), origin = PluginOrigin.Internal, version = version)) plugins.add(PluginDescriptor(UpdatePlugin(), origin = PluginOrigin.Internal, version = version))
// frame plugin
plugins.add(PluginDescriptor(FramePlugin(), origin = PluginOrigin.Internal, version = version))
// ssh plugin // ssh plugin
plugins.add(PluginDescriptor(SSHInternalPlugin(), origin = PluginOrigin.Internal, version = version)) plugins.add(PluginDescriptor(SSHInternalPlugin(), origin = PluginOrigin.Internal, version = version))