forked from Shinonome/dots-hyprland
system tray
This commit is contained in:
@@ -5,7 +5,7 @@ import QtQuick.Layouts
|
|||||||
import Quickshell.Wayland
|
import Quickshell.Wayland
|
||||||
import Quickshell.Hyprland
|
import Quickshell.Hyprland
|
||||||
|
|
||||||
Rectangle {
|
Item {
|
||||||
required property var bar
|
required property var bar
|
||||||
readonly property HyprlandMonitor monitor: Hyprland.monitorFor(bar.screen)
|
readonly property HyprlandMonitor monitor: Hyprland.monitorFor(bar.screen)
|
||||||
readonly property Toplevel activeWindow: ToplevelManager.activeToplevel
|
readonly property Toplevel activeWindow: ToplevelManager.activeToplevel
|
||||||
@@ -13,7 +13,6 @@ Rectangle {
|
|||||||
|
|
||||||
height: parent.height
|
height: parent.height
|
||||||
width: colLayout.width
|
width: colLayout.width
|
||||||
color: "transparent"
|
|
||||||
Layout.leftMargin: Appearance.rounding.screenRounding
|
Layout.leftMargin: Appearance.rounding.screenRounding
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import "../common"
|
import "../common"
|
||||||
|
import "../common/widgets"
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
@@ -30,8 +31,8 @@ Scope {
|
|||||||
ActiveWindow {
|
ActiveWindow {
|
||||||
bar: barRoot
|
bar: barRoot
|
||||||
}
|
}
|
||||||
// Scroll to switch workspaces
|
|
||||||
|
|
||||||
|
// Scroll to change brightness
|
||||||
WheelHandler {
|
WheelHandler {
|
||||||
onWheel: (event) => {
|
onWheel: (event) => {
|
||||||
if (event.angleDelta.y < 0)
|
if (event.angleDelta.y < 0)
|
||||||
@@ -100,6 +101,30 @@ Scope {
|
|||||||
// Right section
|
// Right section
|
||||||
RowLayout {
|
RowLayout {
|
||||||
anchors.right: parent.right
|
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 {
|
anchors {
|
||||||
|
|||||||
@@ -6,14 +6,13 @@ import Quickshell
|
|||||||
import Quickshell.Io
|
import Quickshell.Io
|
||||||
import Quickshell.Services.Mpris
|
import Quickshell.Services.Mpris
|
||||||
|
|
||||||
Rectangle {
|
Item {
|
||||||
readonly property MprisPlayer activePlayer: MprisController.activePlayer
|
readonly property MprisPlayer activePlayer: MprisController.activePlayer
|
||||||
readonly property string cleanedTitle: activePlayer?.trackTitle.replace(/【[^】]*】/, "") || "No media"
|
readonly property string cleanedTitle: activePlayer?.trackTitle.replace(/【[^】]*】/, "") || "No media"
|
||||||
|
|
||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
implicitWidth: rowLayout.implicitWidth + rowLayout.spacing * 2
|
implicitWidth: rowLayout.implicitWidth + rowLayout.spacing * 2
|
||||||
implicitHeight: 40
|
implicitHeight: 40
|
||||||
color: "transparent"
|
|
||||||
|
|
||||||
// Background
|
// Background
|
||||||
Rectangle {
|
Rectangle {
|
||||||
|
|||||||
@@ -5,14 +5,13 @@ import QtQuick.Layouts
|
|||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Io
|
import Quickshell.Io
|
||||||
|
|
||||||
Rectangle {
|
Item {
|
||||||
required property string iconName
|
required property string iconName
|
||||||
required property double percentage
|
required property double percentage
|
||||||
property bool shown: true
|
property bool shown: true
|
||||||
clip: true
|
clip: true
|
||||||
implicitWidth: resourceRowLayout.x < 0 ? 0 : childrenRect.width
|
implicitWidth: resourceRowLayout.x < 0 ? 0 : childrenRect.width
|
||||||
implicitHeight: childrenRect.height
|
implicitHeight: childrenRect.height
|
||||||
color: "transparent"
|
|
||||||
|
|
||||||
RowLayout {
|
RowLayout {
|
||||||
spacing: 4
|
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.Hyprland
|
||||||
import Quickshell.Io
|
import Quickshell.Io
|
||||||
|
|
||||||
Rectangle {
|
Item {
|
||||||
required property var bar
|
required property var bar
|
||||||
readonly property HyprlandMonitor monitor: Hyprland.monitorFor(bar.screen)
|
readonly property HyprlandMonitor monitor: Hyprland.monitorFor(bar.screen)
|
||||||
readonly property Toplevel activeWindow: ToplevelManager.activeToplevel
|
readonly property Toplevel activeWindow: ToplevelManager.activeToplevel
|
||||||
@@ -48,7 +48,6 @@ Rectangle {
|
|||||||
Layout.fillHeight: true
|
Layout.fillHeight: true
|
||||||
implicitWidth: rowLayout.implicitWidth + rowLayout.spacing * 2
|
implicitWidth: rowLayout.implicitWidth + rowLayout.spacing * 2
|
||||||
implicitHeight: 40
|
implicitHeight: 40
|
||||||
color: "transparent"
|
|
||||||
|
|
||||||
// Background
|
// Background
|
||||||
Rectangle {
|
Rectangle {
|
||||||
@@ -176,8 +175,7 @@ Rectangle {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
background: Rectangle {
|
background: Item {
|
||||||
color: "transparent" // Transparent background
|
|
||||||
implicitWidth: workspaceButtonWidth
|
implicitWidth: workspaceButtonWidth
|
||||||
implicitHeight: 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]
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
//@ pragma UseQApplication
|
||||||
|
//@ pragma IconTheme OneUI
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
|
|||||||
Reference in New Issue
Block a user