diff options
| author | Gregor Kleen <gkleen@yggdrasil.li> | 2025-08-31 12:12:23 +0200 |
|---|---|---|
| committer | Gregor Kleen <gkleen@yggdrasil.li> | 2025-08-31 12:12:23 +0200 |
| commit | 9fc966ff7726d01267a6220483fb005c0efaa9c0 (patch) | |
| tree | 9e66f32774a55a7f51314883648bd40751250091 /accounts/gkleen@sif/shell/quickshell/SystemTray.qml | |
| parent | 97423da1a1e58a2820d12bed5b36f0896fd3cccc (diff) | |
| download | nixos-9fc966ff7726d01267a6220483fb005c0efaa9c0.tar nixos-9fc966ff7726d01267a6220483fb005c0efaa9c0.tar.gz nixos-9fc966ff7726d01267a6220483fb005c0efaa9c0.tar.bz2 nixos-9fc966ff7726d01267a6220483fb005c0efaa9c0.tar.xz nixos-9fc966ff7726d01267a6220483fb005c0efaa9c0.zip | |
...
Diffstat (limited to 'accounts/gkleen@sif/shell/quickshell/SystemTray.qml')
| -rw-r--r-- | accounts/gkleen@sif/shell/quickshell/SystemTray.qml | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/accounts/gkleen@sif/shell/quickshell/SystemTray.qml b/accounts/gkleen@sif/shell/quickshell/SystemTray.qml new file mode 100644 index 00000000..a02a81fd --- /dev/null +++ b/accounts/gkleen@sif/shell/quickshell/SystemTray.qml | |||
| @@ -0,0 +1,94 @@ | |||
| 1 | import QtQuick | ||
| 2 | import Quickshell | ||
| 3 | import Quickshell.Widgets | ||
| 4 | import Quickshell.Services.SystemTray | ||
| 5 | |||
| 6 | Item { | ||
| 7 | anchors.verticalCenter: parent.verticalCenter | ||
| 8 | width: systemTrayRow.childrenRect.width | ||
| 9 | height: parent.height | ||
| 10 | clip: true | ||
| 11 | |||
| 12 | Row { | ||
| 13 | id: systemTrayRow | ||
| 14 | anchors.centerIn: parent | ||
| 15 | width: childrenRect.width | ||
| 16 | height: parent.height | ||
| 17 | spacing: 0 | ||
| 18 | |||
| 19 | Repeater { | ||
| 20 | model: SystemTray.items.values | ||
| 21 | |||
| 22 | delegate: Item { | ||
| 23 | property var trayItem: modelData | ||
| 24 | property string iconSource: { | ||
| 25 | let icon = trayItem && trayItem.icon | ||
| 26 | if (typeof icon === 'string' || icon instanceof String) { | ||
| 27 | if (icon.includes("?path=")) { | ||
| 28 | const split = icon.split("?path=") | ||
| 29 | if (split.length !== 2) | ||
| 30 | return icon | ||
| 31 | const name = split[0] | ||
| 32 | const path = split[1] | ||
| 33 | const fileName = name.substring( | ||
| 34 | name.lastIndexOf("/") + 1) | ||
| 35 | return `file://${path}/${fileName}` | ||
| 36 | } | ||
| 37 | return icon | ||
| 38 | } | ||
| 39 | return "" | ||
| 40 | } | ||
| 41 | |||
| 42 | width: 16 | ||
| 43 | height: parent.height | ||
| 44 | anchors.verticalCenter: parent.verticalCenter | ||
| 45 | |||
| 46 | IconImage { | ||
| 47 | anchors.centerIn: parent | ||
| 48 | width: parent.width | ||
| 49 | height: parent.width | ||
| 50 | source: parent.iconSource | ||
| 51 | asynchronous: true | ||
| 52 | smooth: true | ||
| 53 | mipmap: true | ||
| 54 | } | ||
| 55 | |||
| 56 | MouseArea { | ||
| 57 | id: trayItemArea | ||
| 58 | |||
| 59 | anchors.fill: parent | ||
| 60 | acceptedButtons: Qt.LeftButton | Qt.RightButton | ||
| 61 | hoverEnabled: true | ||
| 62 | cursorShape: Qt.PointingHandCursor | ||
| 63 | onClicked: mouse => { | ||
| 64 | if (!trayItem) | ||
| 65 | return | ||
| 66 | |||
| 67 | if (mouse.button === Qt.LeftButton | ||
| 68 | && !trayItem.onlyMenu) { | ||
| 69 | trayItem.activate() | ||
| 70 | return | ||
| 71 | } | ||
| 72 | |||
| 73 | if (trayItem.hasMenu) { | ||
| 74 | var globalPos = mapToGlobal(0, 0) | ||
| 75 | var currentScreen = screen || Screen | ||
| 76 | var screenX = currentScreen.x || 0 | ||
| 77 | var relativeX = globalPos.x - screenX | ||
| 78 | menuAnchor.menu = trayItem.menu | ||
| 79 | menuAnchor.anchor.window = bar | ||
| 80 | menuAnchor.anchor.rect = Qt.rect( | ||
| 81 | relativeX, | ||
| 82 | 21, | ||
| 83 | parent.width, 1) | ||
| 84 | menuAnchor.open() | ||
| 85 | } | ||
| 86 | } | ||
| 87 | } | ||
| 88 | } | ||
| 89 | } | ||
| 90 | } | ||
| 91 | QsMenuAnchor { | ||
| 92 | id: menuAnchor | ||
| 93 | } | ||
| 94 | } | ||
