diff options
author | Gregor Kleen <gkleen@yggdrasil.li> | 2025-09-12 14:21:21 +0200 |
---|---|---|
committer | Gregor Kleen <gkleen@yggdrasil.li> | 2025-09-12 14:21:21 +0200 |
commit | 43af16801fcbb7056a51ed5fd6539c74ff5c0379 (patch) | |
tree | bbf61e0d0df1cac84c441afaddcb2184dc450181 /accounts/gkleen@sif/shell/quickshell/WorktimeWidget.qml | |
parent | da23e39c353e68fdc7c5839d78945e88352a7f92 (diff) | |
download | nixos-43af16801fcbb7056a51ed5fd6539c74ff5c0379.tar nixos-43af16801fcbb7056a51ed5fd6539c74ff5c0379.tar.gz nixos-43af16801fcbb7056a51ed5fd6539c74ff5c0379.tar.bz2 nixos-43af16801fcbb7056a51ed5fd6539c74ff5c0379.tar.xz nixos-43af16801fcbb7056a51ed5fd6539c74ff5c0379.zip |
...
Diffstat (limited to 'accounts/gkleen@sif/shell/quickshell/WorktimeWidget.qml')
-rw-r--r-- | accounts/gkleen@sif/shell/quickshell/WorktimeWidget.qml | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/accounts/gkleen@sif/shell/quickshell/WorktimeWidget.qml b/accounts/gkleen@sif/shell/quickshell/WorktimeWidget.qml new file mode 100644 index 00000000..04bcc581 --- /dev/null +++ b/accounts/gkleen@sif/shell/quickshell/WorktimeWidget.qml | |||
@@ -0,0 +1,120 @@ | |||
1 | import QtQml | ||
2 | import Quickshell | ||
3 | import Quickshell.Io | ||
4 | import QtQuick | ||
5 | import Quickshell.Widgets | ||
6 | |||
7 | Item { | ||
8 | id: root | ||
9 | |||
10 | required property string command | ||
11 | property var state: null | ||
12 | |||
13 | height: parent.height | ||
14 | width: label.contentWidth + 8 | ||
15 | anchors.verticalCenter: parent.verticalCenter | ||
16 | |||
17 | Process { | ||
18 | id: process | ||
19 | running: true | ||
20 | command: [ @worktime@, root.command, "--waybar" ] | ||
21 | stdout: StdioCollector { | ||
22 | id: processCollector | ||
23 | onStreamFinished: { | ||
24 | try { | ||
25 | root.state = JSON.parse(processCollector.text); | ||
26 | } catch (e) { | ||
27 | console.warn("Worktime: Failed to parse output:", processCollector.text, e); | ||
28 | } | ||
29 | } | ||
30 | } | ||
31 | } | ||
32 | |||
33 | Timer { | ||
34 | running: true | ||
35 | interval: 60 | ||
36 | repeat: true | ||
37 | onTriggered: process.running = true | ||
38 | } | ||
39 | |||
40 | WrapperMouseArea { | ||
41 | id: mouseArea | ||
42 | |||
43 | anchors.fill: parent | ||
44 | |||
45 | enabled: true | ||
46 | hoverEnabled: true | ||
47 | |||
48 | Item { | ||
49 | anchors.fill: parent | ||
50 | |||
51 | Text { | ||
52 | id: label | ||
53 | |||
54 | anchors.centerIn: parent | ||
55 | |||
56 | visible: root.state?.text ?? false | ||
57 | text: root.state?.text ?? "" | ||
58 | |||
59 | font.pointSize: 10 | ||
60 | font.family: "Fira Sans" | ||
61 | color: { | ||
62 | if (root.state?.class == "running") | ||
63 | return "white"; | ||
64 | if (root.state?.class == "over") | ||
65 | return "#f28a21"; | ||
66 | return "#555"; | ||
67 | } | ||
68 | } | ||
69 | } | ||
70 | } | ||
71 | |||
72 | PopupWindow { | ||
73 | id: tooltip | ||
74 | |||
75 | property bool nextVisible: Boolean(root.state?.tooltip ?? false) && (mouseArea.containsMouse || tooltipMouseArea.containsMouse) | ||
76 | |||
77 | anchor { | ||
78 | item: mouseArea | ||
79 | edges: Edges.Bottom | Edges.Left | ||
80 | } | ||
81 | visible: false | ||
82 | |||
83 | onNextVisibleChanged: hangTimer.restart() | ||
84 | |||
85 | Timer { | ||
86 | id: hangTimer | ||
87 | interval: 100 | ||
88 | onTriggered: tooltip.visible = tooltip.nextVisible | ||
89 | } | ||
90 | |||
91 | implicitWidth: tooltipText.contentWidth + 16 | ||
92 | implicitHeight: tooltipText.contentHeight + 16 | ||
93 | color: "black" | ||
94 | |||
95 | WrapperMouseArea { | ||
96 | id: tooltipMouseArea | ||
97 | |||
98 | enabled: true | ||
99 | hoverEnabled: true | ||
100 | |||
101 | anchors.fill: parent | ||
102 | |||
103 | Item { | ||
104 | anchors.fill: parent | ||
105 | |||
106 | Text { | ||
107 | id: tooltipText | ||
108 | |||
109 | anchors.centerIn: parent | ||
110 | |||
111 | font.pointSize: 10 | ||
112 | font.family: "Fira Sans" | ||
113 | color: "white" | ||
114 | |||
115 | text: root.state?.tooltip ?? "" | ||
116 | } | ||
117 | } | ||
118 | } | ||
119 | } | ||
120 | } | ||