Skip to content

Commit f9c6a8b

Browse files
committed
Fix: ShortcutKeySettings now works correctly
Allow setting conflicting shortcuts and Add visual indication for conflicts
1 parent f85869f commit f9c6a8b

File tree

1 file changed

+50
-49
lines changed

1 file changed

+50
-49
lines changed

Diff for: daw/src/jvmMain/kotlin/com/eimsound/daw/window/dialogs/settings/ShortcutKeySettings.kt

+50-49
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.eimsound.daw.window.dialogs.settings
22

3+
import androidx.compose.foundation.layout.Box
34
import androidx.compose.foundation.layout.height
45
import androidx.compose.foundation.layout.width
56
import androidx.compose.foundation.text.KeyboardOptions
@@ -50,12 +51,13 @@ internal object ShortcutKeySettings : SettingTab {
5051
commandManager.customCommands.forEach { (key, commandName) ->
5152
commands[commandManager.commandsMap[commandName]!!] = key
5253
}
54+
val refreshState = remember { mutableStateOf(0) }
5355
SettingsSection(langs.shortcutKey) {
56+
val refresh = refreshState.value
5457
commands.forEach { (command, key) ->
5558
SettingsCard(command.displayName){
56-
var curKey by remember { mutableStateOf(key) }
5759
val keyCompose = remember { key.split(" ").map { Key(it.toLong()) }.toMutableStateSet() }
58-
val keyDown = remember { mutableStateSetOf<Key>() }
60+
val pressedKeySet = remember { mutableStateSetOf<Key>() }
5961
val preKeyCompose = remember { mutableStateListOf<Key>() }
6062

6163
fun cancel() {
@@ -66,59 +68,65 @@ internal object ShortcutKeySettings : SettingTab {
6668
}
6769
}
6870

69-
fun done() {
71+
fun done(keyStr: String) {
7072
selectKey = ""
71-
val keyStr = keyCompose.sortedKeys().joinToString(separator = " ") {
72-
it.keyCode.toString()
73-
}
74-
if (keyStr.isEmpty() || keyStr in commandManager.commands || keyStr in commandManager.customCommands) {
75-
cancel()
76-
return
77-
}
78-
if (curKey !in commandManager.commands && curKey !in commandManager.customCommands) {
73+
if (keyStr.isEmpty()) {
7974
cancel()
8075
return
8176
}
82-
val commandTar: String
83-
if (curKey in commandManager.customCommands) {
84-
commandTar = commandManager.customCommands[curKey]!!
85-
commandManager.customCommands -= curKey
77+
if (keyStr in commandManager.commands && commandManager.commands[keyStr]!!.name == command.name) {
78+
if (command.name in commandManager.customCommands.values) {
79+
commandManager.customCommands -= commandManager.customCommands.filterValues { it == command.name }.keys
80+
}
8681
} else {
87-
commandTar = commandManager.commands[curKey]!!.name
82+
commandManager.customCommands[keyStr] = command.name
8883
}
89-
commandManager.customCommands[keyStr] = commandTar
90-
curKey = keyStr
84+
commands[command] = keyStr
9185
commandManager.saveCustomShortcutKeys()
86+
refreshState.value = refreshState.value xor 1
9287
}
9388

94-
CustomOutlinedTextField(
95-
keyCompose.sortedKeys().joinToString(separator = "+") {
96-
var cur = it
97-
when (it) {
98-
Key.MetaLeft, Key.MetaRight -> if (SystemUtils.IS_OS_MAC) cur = Key.CtrlLeft
99-
Key.CtrlLeft, Key.CtrlRight -> if (SystemUtils.IS_OS_MAC) cur = Key.MetaLeft
89+
Box {
90+
val sortedKeyString = keyCompose.sortedKeys().joinToString(separator = " ") {
91+
it.keyCode.toString()
10092
}
101-
KeyEvent.getKeyText(cur.nativeKeyCode)
102-
},
103-
{
104-
EchoInMirror.currentPosition.bpm = it.toDoubleOrNull()?.coerceIn(1.0, 600.0) ?: return@CustomOutlinedTextField
105-
},
106-
Modifier.width(256.dp).height(36.dp)
93+
CustomOutlinedTextField(
94+
keyCompose.sortedKeys().joinToString(separator = "+") {
95+
var cur = it
96+
when (it) {
97+
Key.MetaLeft, Key.MetaRight -> if (SystemUtils.IS_OS_MAC) cur = Key.CtrlLeft
98+
Key.CtrlLeft, Key.CtrlRight -> if (SystemUtils.IS_OS_MAC) cur = Key.MetaLeft
99+
}
100+
KeyEvent.getKeyText(cur.nativeKeyCode)
101+
},
102+
{ },
103+
Modifier.width(256.dp).height(36.dp),
104+
singleLine = true,
105+
textStyle = MaterialTheme.typography.labelLarge.copy(LocalContentColor.current),
106+
colors = TextFieldDefaults.colors(
107+
unfocusedIndicatorColor = MaterialTheme.colorScheme.outlineVariant,
108+
focusedIndicatorColor = MaterialTheme.colorScheme.outlineVariant,
109+
),
110+
isError = commands.count { it.value == key } > 1,
111+
keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Number),
112+
paddingValues = TextFieldDefaults.contentPaddingWithLabel(6.dp, 6.dp, 3.dp, 4.dp)
113+
)
114+
Box(modifier = Modifier.matchParentSize()
107115
.onFocusChanged {
108-
if (!it.isFocused && selectKey == curKey) done()
116+
if (!it.isFocused && selectKey == key) done(sortedKeyString)
109117
}
110118
.clickableWithIcon {
111-
if (selectKey == curKey) {
112-
done()
119+
if (selectKey == key) {
120+
done(sortedKeyString)
113121
} else {
114-
selectKey = curKey
122+
selectKey = key
115123
preKeyCompose.clear()
116-
keyDown.clear()
124+
pressedKeySet.clear()
117125
preKeyCompose.addAll(keyCompose)
118126
keyCompose.clear()
119127
}
120128
}.onKeyEvent {
121-
if (selectKey != curKey) return@onKeyEvent false
129+
if (selectKey != key) return@onKeyEvent false
122130
var pressKey = it.key
123131
when (pressKey) {
124132
Key.MetaLeft, Key.MetaRight -> if (SystemUtils.IS_OS_MAC) pressKey = Key.CtrlLeft
@@ -132,25 +140,18 @@ internal object ShortcutKeySettings : SettingTab {
132140
Key.Escape -> cancel()
133141
Key.Enter -> return@onKeyEvent false
134142
else -> {
135-
keyDown.add(pressKey)
143+
pressedKeySet.add(pressKey)
136144
keyCompose.add(pressKey)
137145
}
138146
}
139147
} else if (it.type == KeyEventType.KeyUp) {
140-
keyDown.remove(pressKey)
141-
if (keyDown.isEmpty()) done()
148+
pressedKeySet.remove(pressKey)
149+
if (pressedKeySet.isEmpty()) done(sortedKeyString)
142150
}
143151
true
144-
},
145-
singleLine = true,
146-
textStyle = MaterialTheme.typography.labelLarge.copy(LocalContentColor.current),
147-
colors = TextFieldDefaults.colors(
148-
unfocusedIndicatorColor = MaterialTheme.colorScheme.outlineVariant,
149-
focusedIndicatorColor = MaterialTheme.colorScheme.outlineVariant,
150-
),
151-
keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Number),
152-
paddingValues = TextFieldDefaults.contentPaddingWithLabel(6.dp, 6.dp, 3.dp, 4.dp)
153-
)
152+
}
153+
)
154+
}
154155
}
155156
}
156157
}

0 commit comments

Comments
 (0)