fix: Keymap sync override (#493)

This commit is contained in:
hstyi
2025-04-11 11:37:29 +08:00
committed by GitHub
parent d4b96edccf
commit f06e5d7dc1
2 changed files with 21 additions and 3 deletions

View File

@@ -1,7 +1,6 @@
package app.termora.keymap package app.termora.keymap
import app.termora.Application.ohMyJson import app.termora.Application.ohMyJson
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.* import kotlinx.serialization.json.*
import javax.swing.KeyStroke import javax.swing.KeyStroke
@@ -12,6 +11,10 @@ open class Keymap(
*/ */
private val parent: Keymap?, private val parent: Keymap?,
val isReadonly: Boolean = false, val isReadonly: Boolean = false,
/**
* 修改时间
*/
var updateDate: Long = 0L,
) { ) {
companion object { companion object {
@@ -23,7 +26,8 @@ open class Keymap(
val shortcuts = mutableListOf<Keymap>() val shortcuts = mutableListOf<Keymap>()
val name = json["name"]?.jsonPrimitive?.content ?: return null val name = json["name"]?.jsonPrimitive?.content ?: return null
val readonly = json["readonly"]?.jsonPrimitive?.booleanOrNull ?: return null val readonly = json["readonly"]?.jsonPrimitive?.booleanOrNull ?: return null
val keymap = Keymap(name, null, readonly) val updateDate = json["updateDate"]?.jsonPrimitive?.longOrNull ?: 0
val keymap = Keymap(name, null, readonly, updateDate)
for (shortcut in (json["shortcuts"]?.jsonArray ?: emptyList()).map { it.jsonObject }) { for (shortcut in (json["shortcuts"]?.jsonArray ?: emptyList()).map { it.jsonObject }) {
val keyStroke = shortcut["keyStroke"]?.jsonPrimitive?.contentOrNull ?: continue val keyStroke = shortcut["keyStroke"]?.jsonPrimitive?.contentOrNull ?: continue
@@ -40,6 +44,9 @@ open class Keymap(
} }
} }
// 最后设置修改时间
keymap.updateDate = updateDate
shortcuts.add(keymap) shortcuts.add(keymap)
return keymap return keymap
} }
@@ -51,6 +58,7 @@ open class Keymap(
val actionIds = shortcuts.getOrPut(shortcut) { mutableListOf() } val actionIds = shortcuts.getOrPut(shortcut) { mutableListOf() }
actionIds.removeIf { it == actionId } actionIds.removeIf { it == actionId }
actionIds.add(actionId) actionIds.add(actionId)
updateDate = System.currentTimeMillis()
} }
open fun removeAllActionShortcuts(actionId: Any) { open fun removeAllActionShortcuts(actionId: Any) {
@@ -62,6 +70,7 @@ open class Keymap(
iterator.remove() iterator.remove()
} }
} }
updateDate = System.currentTimeMillis()
} }
open fun getShortcut(actionId: Any): List<Shortcut> { open fun getShortcut(actionId: Any): List<Shortcut> {
@@ -102,6 +111,7 @@ open class Keymap(
return buildJsonObject { return buildJsonObject {
put("name", name) put("name", name)
put("readonly", isReadonly) put("readonly", isReadonly)
put("updateDate", updateDate)
parent?.let { put("parent", it.name) } parent?.let { put("parent", it.name) }
put("shortcuts", buildJsonArray { put("shortcuts", buildJsonArray {
for (entry in shortcuts.entries) { for (entry in shortcuts.entries) {

View File

@@ -390,7 +390,15 @@ abstract class SafetySyncer : Syncer {
protected fun decodeKeymaps(text: String, deletedData: List<DeletedData>, config: SyncConfig) { protected fun decodeKeymaps(text: String, deletedData: List<DeletedData>, config: SyncConfig) {
for (keymap in ohMyJson.decodeFromString<List<JsonObject>>(text).mapNotNull { Keymap.fromJSON(it) }) { val localKeymaps = keymapManager.getKeymaps().associateBy { it.name }
val remoteKeymaps = ohMyJson.decodeFromString<List<JsonObject>>(text).mapNotNull { Keymap.fromJSON(it) }
for (keymap in remoteKeymaps) {
val localKeymap = localKeymaps[keymap.name]
if (localKeymap != null) {
if (localKeymap.updateDate > keymap.updateDate) {
continue
}
}
keymapManager.addKeymap(keymap) keymapManager.addKeymap(keymap)
} }