feat(clock): clock: per-widget click action w/overview as optional

Fixes 3993
Port 2.0
This commit is contained in:
purian23 committed 2026-10-30 00:12:12 -04:00
1 parent e777288904
commit d367e7e71b
4 files changed
+62 -4

No files matched your search

@@ -39,6 +39,27 @@ Column {
onToggled: checked => root.page.set("clockNotificationBadge", checked)
}
SettingsDropdownRow {
readonly property var actions: ["dash", "settings", "command", "none"]
resetStore: root.page
resetKeys: ["clockClickAction"]
text: I18n.tr("Click action", "clock widget option: what clicking the clock opens")
options: [I18n.tr("Dashboard"), I18n.tr("Time & weather"), I18n.tr("Custom command"), I18n.tr("None", "bar click action")]
currentValue: options[actions.indexOf(root.page.value("clockClickAction"))] ?? options[0]
onValueChanged: value => root.page.set("clockClickAction", actions[options.indexOf(value)] ?? "dash")
}
SettingsTextFieldRow {
resetStore: root.page
resetKeys: ["clockClickCommand"]
text: I18n.tr("Custom command")
visible: root.page.value("clockClickAction") === "command"
placeholderText: "gnome-clocks"
value: root.page.value("clockClickCommand")
onEditingFinished: value => root.page.set("clockClickCommand", value.trim())
}
SettingsNavRow {
iconName: "schedule"
title: I18n.tr("Time & weather")
@@ -1,9 +1,11 @@
pragma ComponentBehavior: Bound
import QtQuick
import Quickshell
import Quickshell.Services.SystemTray
import qs.Common
import qs.Services
import qs.Modules.DBar.Widgets
import qs.Modules.DDash
import "../DBar/WidgetModel.js" as WidgetModel
Item {
@@ -393,15 +395,32 @@ Item {
}
onClockClicked: {
const action = SettingsData.widgetOption("clock", clockWidget.widgetData, "clockClickAction");
if (action === "none")
return;
if (action === "settings") {
PopoutService.focusOrToggleSettingsWithTab("time_weather");
return;
}
if (action === "command") {
const command = SettingsData.widgetOption("clock", clockWidget.widgetData, "clockClickCommand");
if (command)
Quickshell.execDetached(["sh", "-c", command]);
return;
}
// requestTab would still show a disabled Overview as a detail page.
const tabId = DashRegistry.isSelectable(DashRegistry.overviewId) ? DashRegistry.overviewId : DashRegistry.defaultTabId;
if (!tabId)
return;
const section = root.getWidgetSection(parent) || "center";
root.openWidgetPopout({
loader: PopoutService.dankDashPopoutLoader,
widgetItem: clockWidget,
section,
useCenterSection: true,
triggerSource: root._dashTriggerSource(section, "overview"),
triggerSource: root._dashTriggerSource(section, tabId),
islandActivity: "home",
prepare: popout => popout.requestTab("overview"),
prepare: popout => popout.requestTab(tabId),
mode: "click",
setTriggerScreen: true
});