settings: window rule editor on the shortcut editor's dialog and cards

fixes #3608
This commit is contained in:
bbedward
2026-09-29 11:11:23 -04:00
parent 35faa3130c
commit 00952d4d51
3 changed files with 1283 additions and 1665 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+65 -27
View File
@@ -243,48 +243,64 @@ Item {
});
}
property bool editorOpen: false
property bool editorMounted: false
property var editorRequest: null
function openRuleModal(window) {
if (readOnly) {
showHyprlandReadOnlyWarning();
return;
}
if (!PopoutService.windowRuleModalLoader)
return;
PopoutService.windowRuleModalLoader.active = true;
if (PopoutService.windowRuleModalLoader.item) {
PopoutService.windowRuleModalLoader.item.onRuleSubmitted.connect(loadWindowRules);
PopoutService.windowRuleModalLoader.item.show(window || null);
}
openEditor("new", window || null);
}
function editRule(rule) {
if (readOnly) {
showHyprlandReadOnlyWarning();
return;
}
if (!PopoutService.windowRuleModalLoader)
return;
PopoutService.windowRuleModalLoader.active = true;
if (PopoutService.windowRuleModalLoader.item) {
PopoutService.windowRuleModalLoader.item.onRuleSubmitted.connect(loadWindowRules);
PopoutService.windowRuleModalLoader.item.showEdit(rule);
}
openEditor("edit", rule);
}
function copyRuleToDms(rule) {
openEditor("copy", rule);
}
function openEditor(mode, payload) {
if (readOnly) {
showHyprlandReadOnlyWarning();
return;
}
if (!PopoutService.windowRuleModalLoader)
if (editorOpen)
return;
PopoutService.windowRuleModalLoader.active = true;
if (PopoutService.windowRuleModalLoader.item) {
PopoutService.windowRuleModalLoader.item.onRuleSubmitted.connect(loadWindowRules);
PopoutService.windowRuleModalLoader.item.showCopy(rule);
editorRequest = {
mode,
payload
};
editorOpen = true;
editorMounted = true;
if (editorLoader.item)
presentEditor();
}
function presentEditor() {
const request = editorRequest;
if (!request)
return;
switch (request.mode) {
case "edit":
editorLoader.item.showEdit(request.payload);
return;
case "copy":
editorLoader.item.showCopy(request.payload);
return;
default:
editorLoader.item.show(request.payload);
}
}
function closeEditor() {
if (!editorOpen)
return;
editorOpen = false;
editorRequest = null;
if (editorLoader.item)
editorLoader.item.opened = false;
}
function showHyprlandReadOnlyWarning() {
ToastService.showWarning(I18n.tr("Hyprland conf mode"), I18n.tr("This install is still using hyprland.conf. Run dms setup to migrate before changing these settings."), "dms setup", "hyprland-migration");
}
@@ -649,4 +665,26 @@ Item {
}
}
}
Loader {
id: editorLoader
parent: root.parentModal?.modalFocusScope ?? root
anchors.fill: parent
z: 100
active: root.editorMounted
onLoaded: root.presentEditor()
sourceComponent: WindowRuleEditorDialog {
supportingText: I18n.tr("Changes save to %1", "keybind editor dialog hint, %1 is the binds file path").arg(root.dmsRulesFileName)
onRejected: root.closeEditor()
onRuleSubmitted: {
root.loadWindowRules();
root.closeEditor();
}
onActiveChanged: {
if (!active && !root.editorOpen)
root.editorMounted = false;
}
}
}
}