From 23ed3c9897b953fbdfe79fc39124fafaf15d7e14 Mon Sep 17 00:00:00 2001 From: Lysec Date: Fri, 13 Feb 2026 13:56:29 +0100 Subject: [PATCH] NotificationHistoryPanel: add keybind controls --- Assets/Translations/en.json | 5 ++++- Assets/settings-default.json | 3 +++ Commons/Settings.qml | 1 + Helpers/Keybinds.js | 2 +- .../Settings/Tabs/General/KeybindsSubTab.qml | 9 +++++++++ Widgets/NKeybindRecorder.qml | 19 ++++++++++++++++++- 6 files changed, 36 insertions(+), 3 deletions(-) diff --git a/Assets/Translations/en.json b/Assets/Translations/en.json index d2006ff07..21fcba376 100644 --- a/Assets/Translations/en.json +++ b/Assets/Translations/en.json @@ -1047,6 +1047,9 @@ "keybinds-enter": "Confirm / Action", "keybinds-escape": "Close / Back", "keybinds-left": "Move left", + "keybinds-modifier-description": "Shortcuts must include a modifier key (Ctrl or Alt).", + "keybinds-modifier-title": "Modifier required", + "keybinds-remove": "Remove/Delete", "keybinds-right": "Move right", "keybinds-title": "Navigation keybinds", "keybinds-up": "Move up", @@ -1951,4 +1954,4 @@ "poor": "Poor" } } -} +} \ No newline at end of file diff --git a/Assets/settings-default.json b/Assets/settings-default.json index 1b43985e1..a4f469f50 100644 --- a/Assets/settings-default.json +++ b/Assets/settings-default.json @@ -119,6 +119,9 @@ ], "keyEscape": [ "Esc" + ], + "keyRemove": [ + "Del" ] } }, diff --git a/Commons/Settings.qml b/Commons/Settings.qml index 2a0663847..a2991fb33 100644 --- a/Commons/Settings.qml +++ b/Commons/Settings.qml @@ -297,6 +297,7 @@ Singleton { property list keyRight: ["Right"] property list keyEnter: ["Return"] property list keyEscape: ["Esc"] + property list keyRemove: ["Del"] } } diff --git a/Helpers/Keybinds.js b/Helpers/Keybinds.js index 371795e9f..20c0cd751 100644 --- a/Helpers/Keybinds.js +++ b/Helpers/Keybinds.js @@ -14,7 +14,7 @@ function getKeybindString(event) { keyName = String.fromCharCode(event.key); } else if (event.key >= Qt.Key_F1 && event.key <= Qt.Key_F12) { keyName = "F" + (event.key - Qt.Key_F1 + 1); - } else if (rawText && rawText.length > 0 && rawText.charCodeAt(0) > 31) { + } else if (rawText && rawText.length > 0 && rawText.charCodeAt(0) > 31 && rawText.charCodeAt(0) !== 127) { keyName = rawText.toUpperCase(); if (event.modifiers & Qt.ShiftModifier) { diff --git a/Modules/Panels/Settings/Tabs/General/KeybindsSubTab.qml b/Modules/Panels/Settings/Tabs/General/KeybindsSubTab.qml index 3364e103c..661589cc8 100644 --- a/Modules/Panels/Settings/Tabs/General/KeybindsSubTab.qml +++ b/Modules/Panels/Settings/Tabs/General/KeybindsSubTab.qml @@ -69,4 +69,13 @@ ColumnLayout { settingsPath: "general.keybinds.keyEscape" onKeybindsChanged: newKeybinds => Settings.data.general.keybinds.keyEscape = newKeybinds } + + NKeybindRecorder { + Layout.fillWidth: true + label: I18n.tr("panels.general.keybinds-remove") + currentKeybinds: Settings.data.general.keybinds.keyRemove + defaultKeybind: "Del" + settingsPath: "general.keybinds.keyRemove" + onKeybindsChanged: newKeybinds => Settings.data.general.keybinds.keyRemove = newKeybinds + } } diff --git a/Widgets/NKeybindRecorder.qml b/Widgets/NKeybindRecorder.qml index 06fb970f3..6e3a3f4ce 100644 --- a/Widgets/NKeybindRecorder.qml +++ b/Widgets/NKeybindRecorder.qml @@ -236,7 +236,7 @@ Item { keyName = String.fromCharCode(event.key); } else if (event.key >= Qt.Key_F1 && event.key <= Qt.Key_F12) { keyName = "F" + (event.key - Qt.Key_F1 + 1); - } else if (rawText && rawText.length > 0 && rawText.charCodeAt(0) > 31) { + } else if (rawText && rawText.length > 0 && rawText.charCodeAt(0) > 31 && rawText.charCodeAt(0) !== 127) { keyName = rawText.toUpperCase(); // Handle shifted digits @@ -308,6 +308,23 @@ Item { } if (keyName) { + // Enforce modifier requirement (Ctrl or Alt) for "normal" keys + // Allow Arrows, Nav, Function, and System keys without modifiers + const isSpecialKey = (event.key >= Qt.Key_F1 && event.key <= Qt.Key_F35) || (event.key >= Qt.Key_Left && event.key <= Qt.Key_Down) || (event.key === Qt.Key_Home || event.key === Qt.Key_End || event.key === Qt.Key_PageUp || event.key === Qt.Key_PageDown) || (event.key === Qt.Key_Insert || event.key === Qt.Key_Delete || event.key + === Qt.Key_Backspace) || (event.key === Qt.Key_Tab || event.key + === Qt.Key_Return || event.key === Qt.Key_Enter + || event.key === Qt.Key_Escape || event.key + === Qt.Key_Space); + + const hasModifier = (event.modifiers & Qt.ControlModifier) || (event.modifiers & Qt.AltModifier); + + if (!hasModifier && !isSpecialKey) { + hasConflict = true; + ToastService.showWarning(I18n.tr("panels.general.keybinds-modifier-title"), I18n.tr("panels.general.keybinds-modifier-description")); + conflictTimer.restart(); + return; + } + root._applyKeybind(keyStr + keyName); } event.accepted = true;