system tray

This commit is contained in:
end-4
2025-04-11 23:35:05 +02:00
parent d77e4f14bf
commit dae2857391
9 changed files with 137 additions and 11 deletions
@@ -5,7 +5,7 @@ import QtQuick.Layouts
import Quickshell.Wayland
import Quickshell.Hyprland
Rectangle {
Item {
required property var bar
readonly property HyprlandMonitor monitor: Hyprland.monitorFor(bar.screen)
readonly property Toplevel activeWindow: ToplevelManager.activeToplevel
@@ -13,7 +13,6 @@ Rectangle {
height: parent.height
width: colLayout.width
color: "transparent"
Layout.leftMargin: Appearance.rounding.screenRounding
+26 -1
View File
@@ -1,4 +1,5 @@
import "../common"
import "../common/widgets"
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
@@ -30,8 +31,8 @@ Scope {
ActiveWindow {
bar: barRoot
}
// Scroll to switch workspaces
// Scroll to change brightness
WheelHandler {
onWheel: (event) => {
if (event.angleDelta.y < 0)
@@ -100,6 +101,30 @@ Scope {
// Right section
RowLayout {
anchors.right: parent.right
implicitHeight: barHeight
spacing: 20
SysTray {
bar: barRoot
}
Item { // TODO make this wifi & bluetooth
Layout.leftMargin: Appearance.rounding.screenRounding
}
// Scroll to change volume
WheelHandler {
onWheel: (event) => {
const currentVolume = Audio.sink?.audio.volume;
const step = currentVolume < 0.1 ? 0.01 : 0.02 || 0.2;
if (event.angleDelta.y < 0)
Audio.sink.audio.volume -= step;
else if (event.angleDelta.y > 0)
Audio.sink.audio.volume += step;
}
acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad
}
}
anchors {
+1 -2
View File
@@ -6,14 +6,13 @@ import Quickshell
import Quickshell.Io
import Quickshell.Services.Mpris
Rectangle {
Item {
readonly property MprisPlayer activePlayer: MprisController.activePlayer
readonly property string cleanedTitle: activePlayer?.trackTitle.replace(/【[^】]*】/, "") || "No media"
Layout.fillHeight: true
implicitWidth: rowLayout.implicitWidth + rowLayout.spacing * 2
implicitHeight: 40
color: "transparent"
// Background
Rectangle {
+1 -2
View File
@@ -5,14 +5,13 @@ import QtQuick.Layouts
import Quickshell
import Quickshell.Io
Rectangle {
Item {
required property string iconName
required property double percentage
property bool shown: true
clip: true
implicitWidth: resourceRowLayout.x < 0 ? 0 : childrenRect.width
implicitHeight: childrenRect.height
color: "transparent"
RowLayout {
spacing: 4
@@ -0,0 +1,39 @@
import "../common"
import "../common/widgets"
import QtQuick
import QtQuick.Layouts
import Quickshell.Hyprland
import Quickshell.Services.SystemTray
import Quickshell.Wayland
import Quickshell.Widgets
Item {
id: root
required property var bar
height: parent.height
implicitWidth: rowLayout.implicitWidth
Layout.leftMargin: Appearance.rounding.screenRounding
RowLayout {
id: rowLayout
anchors.fill: parent
spacing: 15
Repeater {
model: SystemTray.items
SysTrayItem {
required property SystemTrayItem modelData
bar: root.bar
item: modelData
}
}
}
}
@@ -0,0 +1,49 @@
import QtQuick
import QtQuick.Layouts
import Quickshell
import Quickshell.Services.SystemTray
import Quickshell.Widgets
MouseArea {
id: root
required property var bar
required property SystemTrayItem item
property bool targetMenuOpen: false
property int trayItemWidth: 16
acceptedButtons: Qt.LeftButton | Qt.RightButton
Layout.fillHeight: true
implicitWidth: trayItemWidth
onClicked: (event) => {
switch (event.button) {
case Qt.LeftButton:
item.activate();
break;
case Qt.RightButton:
item.hasMenu && menu.open();
break;
default:
console.log("Buttonevent unhandled");
}
}
QsMenuAnchor {
id: menu
menu: root.item.menu
anchor.window: bar
anchor.rect.x: root.x + bar.width
anchor.rect.y: root.y
anchor.rect.height: root.height * 3
anchor.edges: Edges.Left | Edges.Bottom
}
IconImage {
source: root.item.icon
anchors.centerIn: parent
width: parent.width
height: parent.height
}
}
@@ -8,7 +8,7 @@ import Quickshell.Wayland
import Quickshell.Hyprland
import Quickshell.Io
Rectangle {
Item {
required property var bar
readonly property HyprlandMonitor monitor: Hyprland.monitorFor(bar.screen)
readonly property Toplevel activeWindow: ToplevelManager.activeToplevel
@@ -48,7 +48,6 @@ Rectangle {
Layout.fillHeight: true
implicitWidth: rowLayout.implicitWidth + rowLayout.spacing * 2
implicitHeight: 40
color: "transparent"
// Background
Rectangle {
@@ -176,8 +175,7 @@ Rectangle {
}
background: Rectangle {
color: "transparent" // Transparent background
background: Item {
implicitWidth: workspaceButtonWidth
implicitHeight: workspaceButtonWidth
}
@@ -0,0 +1,16 @@
import QtQuick
import Quickshell
import Quickshell.Services.Pipewire
pragma Singleton
Singleton {
id: root
property var sink: Pipewire.defaultAudioSink
property var source: Pipewire.defaultAudioSource
PwObjectTracker {
objects: [Pipewire.defaultAudioSink, Pipewire.defaultAudioSource]
}
}
+2
View File
@@ -1,3 +1,5 @@
//@ pragma UseQApplication
//@ pragma IconTheme OneUI
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts