Skip to content

Commit 9c37077

Browse files
fix: enhance shortcut handling and initialization in QML (#117)
* fix: simplify Pinyin handling in keyboard layout operations - Removed unnecessary checks for current layouts when setting Pinyin values. - Streamlined the logic for setting Pinyin in both lower and upper case scenarios. - Improved the SearchedTextRole to return Pinyin without leading spaces. Log: enhance Pinyin processing for better keyboard layout functionality bug: https://pms.uniontech.com/bug-view-336421.html * fix: enhance shortcut handling and initialization in QML - Introduced controlled properties for `enumerateForwardKeys` and `currentTriggerKeys` to prevent unnecessary updates. - Replaced direct property assignments with signal connections to ensure updates are handled correctly after user interactions. - Improved initialization logic for shortcut keys to ensure proper values are set from the configuration proxy. - Added logging for better debugging and tracking of changes in shortcut selections. Log: improve shortcut configuration handling and user experience in the QML interface bug: https://pms.uniontech.com/bug-view-336401.html
1 parent 47eb3c4 commit 9c37077

3 files changed

Lines changed: 83 additions & 38 deletions

File tree

src/dcc-fcitx5configtool/keyboard-layout/operation/keyboardwork.cpp

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -563,19 +563,11 @@ void KeyboardWorker::onPinyin()
563563
QStringList letterFirstList;
564564
if (letterFirst.isLower() || letterFirst.isUpper()) {
565565
letterFirstList << QString(letterFirst);
566-
if (currentLayouts.contains(key)) {
567-
md.setPinyin(" " + title);
568-
} else {
569-
md.setPinyin(title);
570-
}
566+
md.setPinyin(title);
571567
} else {
572568
QDBusMessage message = dbus_pinyin.call("Query", title);
573569
letterFirstList = message.arguments()[0].toStringList();
574-
if (currentLayouts.contains(key)) {
575-
md.setPinyin(" " + letterFirstList.at(0));
576-
} else {
577-
md.setPinyin(letterFirstList.at(0));
578-
}
570+
md.setPinyin(letterFirstList.at(0));
579571
}
580572
append(md);
581573
}

src/dcc-fcitx5configtool/keyboard-layout/operation/layoutsmodel.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ QVariant LayoutsModel::data(const QModelIndex &index, int role) const
4141
case Qt::DisplayRole:
4242
return data.text();
4343
case SearchedTextRole:
44-
return (data.pinyin().at(0) == ' ' ? data.pinyin().mid(1) : data.pinyin()) + data.key() + data.text();
44+
return data.pinyin() + data.key() + data.text();
4545
case IdRole:
4646
return data.key();
4747
case SectionRole:

src/dcc-fcitx5configtool/qml/ShortcutsModule.qml

Lines changed: 80 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,17 @@ import org.deepin.dtk 1.0 as D
88
import org.deepin.dcc 1.0
99

1010
DccObject {
11+
id: root
1112
readonly property var enumKeys: ["Ctrl+Shift", "Alt+Shift", "None"]
1213
readonly property var enumKeysI18n: ["Ctrl+Shift", "Alt+Shift", qsTr("None")]
1314
readonly property var triggerEnumKeys: ["Shift", "Ctrl+Space", "None"]
1415
readonly property var triggerEnumKeysI18n: ["Shift", "Ctrl+Space", qsTr("None")]
1516

1617
property var triggerKeys: dccData.fcitx5ConfigProxy.globalConfigOption(
1718
"Hotkey", "TriggerKeys")
18-
property int enumerateForwardKeys: calculateEnumerateForwardKeys(
19-
dccData.fcitx5ConfigProxy.globalConfigOption(
20-
"Hotkey",
21-
"EnumerateForwardKeys").value)
22-
property int currentTriggerKeys: calculateTriggerKeys(triggerKeys.value)
19+
// 改为受控属性,避免等值赋值不触发刷新
20+
property int enumerateForwardKeys: -1
21+
property int currentTriggerKeys: -1
2322
property bool isUserChanging: false
2423

2524
function calculateEnumerateForwardKeys(value) {
@@ -150,19 +149,45 @@ DccObject {
150149
// 设置翻译后的显示数组
151150
enumKeysDisplay = ["Ctrl+Shift", "Alt+Shift", qsTr("None")]
152151
triggerEnumKeysDisplay = ["Shift", "Ctrl+Space", qsTr("None")]
153-
154-
dccData.fcitx5ConfigProxy.onRequestConfigFinished.connect(() => {
155-
156-
let fullTriggerKeys = dccData.fcitx5ConfigProxy.globalConfigOption("Hotkey", "TriggerKeys")
157-
158-
if (!isUserChanging) {
159-
triggerKeys = fullTriggerKeys
160-
console.warn("Updated triggerKeys:", triggerKeys.value)
161-
} else {
162-
console.warn("Skipping config update - user is changing")
163-
}
164-
enumerateForwardKeys = calculateEnumerateForwardKeys(dccData.fcitx5ConfigProxy.globalConfigOption("Hotkey", "EnumerateForwardKeys").value)
165-
})
152+
153+
let enumInitOpt = dccData.fcitx5ConfigProxy.globalConfigOption("Hotkey", "EnumerateForwardKeys")
154+
let enumInitVal = enumInitOpt && enumInitOpt.value ? enumInitOpt.value : []
155+
let enumInitIdx = calculateEnumerateForwardKeys(enumInitVal)
156+
let triggerInitOpt = dccData.fcitx5ConfigProxy.globalConfigOption("Hotkey", "TriggerKeys")
157+
let triggerInitVal = triggerInitOpt && triggerInitOpt.value ? triggerInitOpt.value : []
158+
let triggerInitIdx = calculateTriggerKeys(triggerInitVal)
159+
currentTriggerKeys = triggerInitIdx
160+
}
161+
162+
// 使用 Connections 绑定信号,确保对象替换/重载后仍能收到
163+
Connections {
164+
target: dccData.fcitx5ConfigProxy
165+
function onRequestConfigFinished() {
166+
let fullTriggerKeys = dccData.fcitx5ConfigProxy.globalConfigOption("Hotkey", "TriggerKeys")
167+
let enumValue = dccData.fcitx5ConfigProxy.globalConfigOption("Hotkey", "EnumerateForwardKeys").value
168+
169+
170+
let newTriggerIdx = calculateTriggerKeys(fullTriggerKeys.value)
171+
if (!isUserChanging) {
172+
triggerKeys = fullTriggerKeys
173+
if (currentTriggerKeys === newTriggerIdx) {
174+
currentTriggerKeys = -1
175+
Qt.callLater(() => { currentTriggerKeys = newTriggerIdx })
176+
} else {
177+
currentTriggerKeys = newTriggerIdx
178+
}
179+
} else {
180+
console.warn("[QML] Skipping set triggerKeys (user changing)")
181+
}
182+
183+
const idxEnum = calculateEnumerateForwardKeys(enumValue)
184+
if (enumerateForwardKeys === idxEnum) {
185+
enumerateForwardKeys = -1
186+
Qt.callLater(() => { enumerateForwardKeys = idxEnum })
187+
} else {
188+
enumerateForwardKeys = idxEnum
189+
}
190+
}
166191
}
167192

168193
function reverseEnumerateForwardKeys(index) {
@@ -205,10 +230,23 @@ DccObject {
205230
flat: true
206231
model: enumKeysI18n
207232
currentIndex: enumerateForwardKeys
233+
// 恢复默认 delegate,由主题负责显示选中项勾号
234+
235+
Component.onCompleted: {
236+
if (root.enumerateForwardKeys === -1) {
237+
try {
238+
let ev = dccData.fcitx5ConfigProxy.globalConfigOption("Hotkey", "EnumerateForwardKeys").value || []
239+
let eidx = calculateEnumerateForwardKeys(ev)
240+
console.warn("[QML][page] init enum from backend idx=", eidx)
241+
root.enumerateForwardKeys = eidx
242+
} catch (e) {
243+
console.warn("[QML][page] init enum failed:", e)
244+
}
245+
}
246+
}
208247

209-
onCurrentIndexChanged: {
210-
console.log("Current index changed to:", currentIndex,
211-
"with text:", model[currentIndex])
248+
// 只在用户激活选择时写回,避免程序化更新触发写回
249+
onActivated: {
212250
dccData.fcitx5ConfigProxy.setValue(
213251
"Hotkey/EnumerateForwardKeys/0",
214252
reverseEnumerateForwardKeys(currentIndex), true)
@@ -236,22 +274,37 @@ DccObject {
236274
model: triggerEnumKeysI18n
237275
currentIndex: currentTriggerKeys
238276

277+
// 恢复默认 delegate,由主题负责显示选中项勾号
278+
279+
Component.onCompleted: {
280+
console.warn("[QML][page] trigger ComboBox created: idx=", triggerComboBox.currentIndex,
281+
" root.trigger=", root.currentTriggerKeys)
282+
if (root.currentTriggerKeys === -1) {
283+
try {
284+
let tv = dccData.fcitx5ConfigProxy.globalConfigOption("Hotkey", "TriggerKeys").value || []
285+
let tidx = calculateTriggerKeys(tv)
286+
console.warn("[QML][page] init trigger from backend idx=", tidx)
287+
root.currentTriggerKeys = tidx
288+
} catch (e) {
289+
console.warn("[QML][page] init trigger failed:", e)
290+
}
291+
}
292+
}
293+
239294
onCurrentIndexChanged: {
295+
console.warn("[QML] trigger onCurrentIndexChanged idx=", currentIndex, " text=", model[currentIndex])
240296
isUserChanging = true
241-
242297
if (currentIndex === 0) {
243-
// Shift选项:分别设置左右Shift
298+
console.warn("[QML] write TriggerKeys -> Shift_L + Shift_R")
244299
dccData.fcitx5ConfigProxy.setValue("Hotkey/TriggerKeys/0", ["Shift_L"], true)
245300
dccData.fcitx5ConfigProxy.setValue("Hotkey/TriggerKeys/1", ["Shift_R"], true)
246301
} else {
247302
let newKeys = reverseTriggerKeys(currentIndex)
303+
console.warn("[QML] write TriggerKeys ->", JSON.stringify(newKeys))
248304
dccData.fcitx5ConfigProxy.setValue("Hotkey/TriggerKeys/0", newKeys, true)
249305
dccData.fcitx5ConfigProxy.setValue("Hotkey/TriggerKeys/1", [""], true)
250306
}
251-
252-
Qt.callLater(() => {
253-
isUserChanging = false
254-
})
307+
Qt.callLater(() => { isUserChanging = false })
255308
}
256309
}
257310
}

0 commit comments

Comments
 (0)