From fb126cc86c376b685038b5e5fb689e86a1826b89 Mon Sep 17 00:00:00 2001 From: kurrycat <44340227+kurrycat2004@users.noreply.github.com> Date: Sat, 8 Nov 2025 03:24:29 +0100 Subject: [PATCH 1/5] add option to refresh CustomButton text on click --- Assets/Translations/en.json | 9 +- Modules/Bar/Widgets/CustomButton.qml | 6 ++ .../WidgetSettings/CustomButtonSettings.qml | 87 ++++++++++++++----- Services/UI/BarWidgetRegistry.qml | 3 + Widgets/NToggle.qml | 1 + 5 files changed, 82 insertions(+), 24 deletions(-) diff --git a/Assets/Translations/en.json b/Assets/Translations/en.json index fccdafcd..871ca931 100644 --- a/Assets/Translations/en.json +++ b/Assets/Translations/en.json @@ -133,11 +133,13 @@ }, "left-click": { "description": "Command to execute when the button is left-clicked.", - "label": "Left click" + "label": "Left click", + "update-text": "Update displayed text on left-click" }, "middle-click": { "description": "Command to execute when the button is middle-clicked.", - "label": "Middle click" + "label": "Middle click", + "update-text": "Update displayed text on middle-click" }, "parse-json": { "description": "Parse the command output as a JSON object to dynamically set text and icon.", @@ -149,7 +151,8 @@ }, "right-click": { "description": "Command to execute when the button is right-clicked.", - "label": "Right click" + "label": "Right click", + "update-text": "Update displayed text on right-click" }, "text-stream": { "description": "Streamed lines from the command will be displayed as text on the button.", diff --git a/Modules/Bar/Widgets/CustomButton.qml b/Modules/Bar/Widgets/CustomButton.qml index 3e67fb0c..7e03fdb1 100644 --- a/Modules/Bar/Widgets/CustomButton.qml +++ b/Modules/Bar/Widgets/CustomButton.qml @@ -34,8 +34,11 @@ Item { readonly property string customIcon: widgetSettings.icon || widgetMetadata.icon readonly property string leftClickExec: widgetSettings.leftClickExec || widgetMetadata.leftClickExec + readonly property bool leftClickUpdateText: widgetSettings.leftClickUpdateText ?? widgetMetadata.leftClickUpdateText readonly property string rightClickExec: widgetSettings.rightClickExec || widgetMetadata.rightClickExec + readonly property bool rightClickUpdateText: widgetSettings.rightClickUpdateText ?? widgetMetadata.rightClickUpdateText readonly property string middleClickExec: widgetSettings.middleClickExec || widgetMetadata.middleClickExec + readonly property bool middleClickUpdateText: widgetSettings.middleClickUpdateText ?? widgetMetadata.middleClickUpdateText readonly property string textCommand: widgetSettings.textCommand !== undefined ? widgetSettings.textCommand : (widgetMetadata.textCommand || "") readonly property bool textStream: widgetSettings.textStream !== undefined ? widgetSettings.textStream : (widgetMetadata.textStream || false) readonly property int textIntervalMs: widgetSettings.textIntervalMs !== undefined ? widgetSettings.textIntervalMs : (widgetMetadata.textIntervalMs || 3000) @@ -210,6 +213,7 @@ Item { if (leftClickExec) { Quickshell.execDetached(["sh", "-c", leftClickExec]) Logger.i("CustomButton", `Executing command: ${leftClickExec}`) + if (leftClickUpdateText) runTextCommand() } else if (!hasExec) { // No script was defined, open settings var settingsPanel = PanelService.getPanel("settingsPanel", screen) @@ -222,6 +226,7 @@ Item { if (rightClickExec) { Quickshell.execDetached(["sh", "-c", rightClickExec]) Logger.i("CustomButton", `Executing command: ${rightClickExec}`) + if (rightClickUpdateText) runTextCommand() } } @@ -229,6 +234,7 @@ Item { if (middleClickExec) { Quickshell.execDetached(["sh", "-c", middleClickExec]) Logger.i("CustomButton", `Executing command: ${middleClickExec}`) + if (middleClickUpdateText) runTextCommand() } } diff --git a/Modules/Panels/Settings/Bar/WidgetSettings/CustomButtonSettings.qml b/Modules/Panels/Settings/Bar/WidgetSettings/CustomButtonSettings.qml index 715e4ef9..4b51db86 100644 --- a/Modules/Panels/Settings/Bar/WidgetSettings/CustomButtonSettings.qml +++ b/Modules/Panels/Settings/Bar/WidgetSettings/CustomButtonSettings.qml @@ -21,8 +21,11 @@ ColumnLayout { var settings = Object.assign({}, widgetData || {}) settings.icon = valueIcon settings.leftClickExec = leftClickExecInput.text + settings.leftClickUpdateText = leftClickUpdateText.checked settings.rightClickExec = rightClickExecInput.text + settings.rightClickUpdateText = rightClickUpdateText.checked settings.middleClickExec = middleClickExecInput.text + settings.middleClickUpdateText = middleClickUpdateText.checked settings.textCommand = textCommandInput.text settings.textCollapse = textCollapseInput.text settings.textStream = valueTextStream @@ -61,31 +64,73 @@ ColumnLayout { } } - NTextInput { - id: leftClickExecInput - Layout.fillWidth: true - label: I18n.tr("bar.widget-settings.custom-button.left-click.label") - description: I18n.tr("bar.widget-settings.custom-button.left-click.description") - placeholderText: I18n.tr("placeholders.enter-command") - text: widgetData?.leftClickExec || widgetMetadata.leftClickExec + RowLayout { + spacing: Style.marginM + + NTextInput { + id: leftClickExecInput + Layout.fillWidth: true + label: I18n.tr("bar.widget-settings.custom-button.left-click.label") + description: I18n.tr("bar.widget-settings.custom-button.left-click.description") + placeholderText: I18n.tr("placeholders.enter-command") + text: widgetData?.leftClickExec || widgetMetadata.leftClickExec + } + + NToggle { + id: leftClickUpdateText + Layout.alignment: Qt.AlignRight | Qt.AlignBottom + Layout.bottomMargin: Style.marginS + onEntered: TooltipService.show(Screen, leftClickUpdateText, I18n.tr("bar.widget-settings.custom-button.left-click.update-text"), "auto") + onExited: TooltipService.hide() + checked: widgetData?.leftClickUpdateText ?? widgetMetadata.leftClickUpdateText + onToggled: isChecked => checked = isChecked + } } - NTextInput { - id: rightClickExecInput - Layout.fillWidth: true - label: I18n.tr("bar.widget-settings.custom-button.right-click.label") - description: I18n.tr("bar.widget-settings.custom-button.right-click.description") - placeholderText: I18n.tr("placeholders.enter-command") - text: widgetData?.rightClickExec || widgetMetadata.rightClickExec + RowLayout { + spacing: Style.marginM + + NTextInput { + id: rightClickExecInput + Layout.fillWidth: true + label: I18n.tr("bar.widget-settings.custom-button.right-click.label") + description: I18n.tr("bar.widget-settings.custom-button.right-click.description") + placeholderText: I18n.tr("placeholders.enter-command") + text: widgetData?.rightClickExec || widgetMetadata.rightClickExec + } + + NToggle { + id: rightClickUpdateText + Layout.alignment: Qt.AlignRight | Qt.AlignBottom + Layout.bottomMargin: Style.marginS + onEntered: TooltipService.show(Screen, rightClickUpdateText, I18n.tr("bar.widget-settings.custom-button.right-click.update-text"), "auto") + onExited: TooltipService.hide() + checked: widgetData?.rightClickUpdateText ?? widgetMetadata.rightClickUpdateText + onToggled: isChecked => checked = isChecked + } } - NTextInput { - id: middleClickExecInput - Layout.fillWidth: true - label: I18n.tr("bar.widget-settings.custom-button.middle-click.label") - description: I18n.tr("bar.widget-settings.custom-button.middle-click.description") - placeholderText: I18n.tr("placeholders.enter-command") - text: widgetData.middleClickExec || widgetMetadata.middleClickExec + RowLayout { + spacing: Style.marginM + + NTextInput { + id: middleClickExecInput + Layout.fillWidth: true + label: I18n.tr("bar.widget-settings.custom-button.middle-click.label") + description: I18n.tr("bar.widget-settings.custom-button.middle-click.description") + placeholderText: I18n.tr("placeholders.enter-command") + text: widgetData.middleClickExec || widgetMetadata.middleClickExec + } + + NToggle { + id: middleClickUpdateText + Layout.alignment: Qt.AlignRight | Qt.AlignBottom + Layout.bottomMargin: Style.marginS + onEntered: TooltipService.show(Screen, middleClickUpdateText, I18n.tr("bar.widget-settings.custom-button.middle-click.update-text"), "auto") + onExited: TooltipService.hide() + checked: widgetData?.middleClickUpdateText ?? widgetMetadata.middleClickUpdateText + onToggled: isChecked => checked = isChecked + } } NDivider { diff --git a/Services/UI/BarWidgetRegistry.qml b/Services/UI/BarWidgetRegistry.qml index a2b4f470..99995aa4 100644 --- a/Services/UI/BarWidgetRegistry.qml +++ b/Services/UI/BarWidgetRegistry.qml @@ -93,8 +93,11 @@ Singleton { "allowUserSettings": true, "icon": "heart", "leftClickExec": "", + "leftClickUpdateText": true, "rightClickExec": "", + "rightClickUpdateText": true, "middleClickExec": "", + "middleClickUpdateText": true, "textCommand": "", "textStream": false, "textIntervalMs": 3000, diff --git a/Widgets/NToggle.qml b/Widgets/NToggle.qml index 82c54711..abbe75fc 100644 --- a/Widgets/NToggle.qml +++ b/Widgets/NToggle.qml @@ -25,6 +25,7 @@ RowLayout { NLabel { label: root.label description: root.description + visible: root.label !== "" || root.description !== "" } Rectangle { From c2278bdd2daa819a23cd8239f6a0df4113e13b54 Mon Sep 17 00:00:00 2001 From: kurrycat <44340227+kurrycat2004@users.noreply.github.com> Date: Tue, 11 Nov 2025 20:52:17 +0100 Subject: [PATCH 2/5] add missing import --- .../Panels/Settings/Bar/WidgetSettings/CustomButtonSettings.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/Panels/Settings/Bar/WidgetSettings/CustomButtonSettings.qml b/Modules/Panels/Settings/Bar/WidgetSettings/CustomButtonSettings.qml index 4b51db86..31c38c71 100644 --- a/Modules/Panels/Settings/Bar/WidgetSettings/CustomButtonSettings.qml +++ b/Modules/Panels/Settings/Bar/WidgetSettings/CustomButtonSettings.qml @@ -3,6 +3,7 @@ import QtQuick.Controls import QtQuick.Layouts import QtQuick.Window import qs.Commons +import qs.Services.UI import qs.Widgets ColumnLayout { From 4ea011b72a01fb29f5e9a06ec68000719dcaa422 Mon Sep 17 00:00:00 2001 From: kurrycat <44340227+kurrycat2004@users.noreply.github.com> Date: Tue, 11 Nov 2025 20:53:51 +0100 Subject: [PATCH 3/5] disable update-text toggle by default --- Services/UI/BarWidgetRegistry.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Services/UI/BarWidgetRegistry.qml b/Services/UI/BarWidgetRegistry.qml index 99995aa4..c6427c9e 100644 --- a/Services/UI/BarWidgetRegistry.qml +++ b/Services/UI/BarWidgetRegistry.qml @@ -93,11 +93,11 @@ Singleton { "allowUserSettings": true, "icon": "heart", "leftClickExec": "", - "leftClickUpdateText": true, + "leftClickUpdateText": false, "rightClickExec": "", - "rightClickUpdateText": true, + "rightClickUpdateText": false, "middleClickExec": "", - "middleClickUpdateText": true, + "middleClickUpdateText": false, "textCommand": "", "textStream": false, "textIntervalMs": 3000, From b717baf4ba6ed4cab1079a99227eb20a76244fbf Mon Sep 17 00:00:00 2001 From: kurrycat <44340227+kurrycat2004@users.noreply.github.com> Date: Wed, 12 Nov 2025 00:16:35 +0100 Subject: [PATCH 4/5] allow update-text toggle without command + disable update-text toggle in text stream mode --- Modules/Bar/Widgets/CustomButton.qml | 12 +++++++++--- .../Bar/WidgetSettings/CustomButtonSettings.qml | 3 +++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Modules/Bar/Widgets/CustomButton.qml b/Modules/Bar/Widgets/CustomButton.qml index 7e03fdb1..96de2515 100644 --- a/Modules/Bar/Widgets/CustomButton.qml +++ b/Modules/Bar/Widgets/CustomButton.qml @@ -213,20 +213,24 @@ Item { if (leftClickExec) { Quickshell.execDetached(["sh", "-c", leftClickExec]) Logger.i("CustomButton", `Executing command: ${leftClickExec}`) - if (leftClickUpdateText) runTextCommand() } else if (!hasExec) { // No script was defined, open settings var settingsPanel = PanelService.getPanel("settingsPanel", screen) settingsPanel.requestedTab = SettingsPanel.Tab.Bar settingsPanel.open() } + if (!textStream && leftClickUpdateText) { + runTextCommand() + } } function onRightClicked() { if (rightClickExec) { Quickshell.execDetached(["sh", "-c", rightClickExec]) Logger.i("CustomButton", `Executing command: ${rightClickExec}`) - if (rightClickUpdateText) runTextCommand() + } + if (!textStream && rightClickUpdateText) { + runTextCommand() } } @@ -234,7 +238,9 @@ Item { if (middleClickExec) { Quickshell.execDetached(["sh", "-c", middleClickExec]) Logger.i("CustomButton", `Executing command: ${middleClickExec}`) - if (middleClickUpdateText) runTextCommand() + } + if (!textStream && middleClickUpdateText) { + runTextCommand() } } diff --git a/Modules/Panels/Settings/Bar/WidgetSettings/CustomButtonSettings.qml b/Modules/Panels/Settings/Bar/WidgetSettings/CustomButtonSettings.qml index 31c38c71..208d4e11 100644 --- a/Modules/Panels/Settings/Bar/WidgetSettings/CustomButtonSettings.qml +++ b/Modules/Panels/Settings/Bar/WidgetSettings/CustomButtonSettings.qml @@ -79,6 +79,7 @@ ColumnLayout { NToggle { id: leftClickUpdateText + enabled: !valueTextStream Layout.alignment: Qt.AlignRight | Qt.AlignBottom Layout.bottomMargin: Style.marginS onEntered: TooltipService.show(Screen, leftClickUpdateText, I18n.tr("bar.widget-settings.custom-button.left-click.update-text"), "auto") @@ -102,6 +103,7 @@ ColumnLayout { NToggle { id: rightClickUpdateText + enabled: !valueTextStream Layout.alignment: Qt.AlignRight | Qt.AlignBottom Layout.bottomMargin: Style.marginS onEntered: TooltipService.show(Screen, rightClickUpdateText, I18n.tr("bar.widget-settings.custom-button.right-click.update-text"), "auto") @@ -125,6 +127,7 @@ ColumnLayout { NToggle { id: middleClickUpdateText + enabled: !valueTextStream Layout.alignment: Qt.AlignRight | Qt.AlignBottom Layout.bottomMargin: Style.marginS onEntered: TooltipService.show(Screen, middleClickUpdateText, I18n.tr("bar.widget-settings.custom-button.middle-click.update-text"), "auto") From 7be6ea57a515c33c82c3eb3ba2fd14084f19762b Mon Sep 17 00:00:00 2001 From: kurrycat <44340227+kurrycat2004@users.noreply.github.com> Date: Wed, 12 Nov 2025 16:51:37 +0100 Subject: [PATCH 5/5] don't open settings when clicking on empty command custom button with update-text enabled --- Modules/Bar/Widgets/CustomButton.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/Bar/Widgets/CustomButton.qml b/Modules/Bar/Widgets/CustomButton.qml index 96de2515..34aa3cbd 100644 --- a/Modules/Bar/Widgets/CustomButton.qml +++ b/Modules/Bar/Widgets/CustomButton.qml @@ -213,7 +213,7 @@ Item { if (leftClickExec) { Quickshell.execDetached(["sh", "-c", leftClickExec]) Logger.i("CustomButton", `Executing command: ${leftClickExec}`) - } else if (!hasExec) { + } else if (!hasExec && !leftClickUpdateText) { // No script was defined, open settings var settingsPanel = PanelService.getPanel("settingsPanel", screen) settingsPanel.requestedTab = SettingsPanel.Tab.Bar