mirror of
https://github.com/TermoraDev/termora.git
synced 2026-01-16 02:12:58 +08:00
chore: improve keymap refresh
This commit is contained in:
21
src/main/kotlin/app/termora/FramePlugin.kt
Normal file
21
src/main/kotlin/app/termora/FramePlugin.kt
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
65
src/main/kotlin/app/termora/KeymapRefresher.kt
Normal file
65
src/main/kotlin/app/termora/KeymapRefresher.kt
Normal 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) }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
Reference in New Issue
Block a user