diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2237ec8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.stfolder +.stversions diff --git a/.stfolder/syncthing-folder-13b209.txt b/.stfolder/syncthing-folder-13b209.txt deleted file mode 100644 index 876cb95..0000000 --- a/.stfolder/syncthing-folder-13b209.txt +++ /dev/null @@ -1,5 +0,0 @@ -# This directory is a Syncthing folder marker. -# Do not delete. - -folderID: quickshell -created: 2024-12-23T02:09:06-05:00 diff --git a/.stversions/PriorityScreens~20250509-203451.qml b/.stversions/PriorityScreens~20250509-203451.qml deleted file mode 100644 index ce2f7c0..0000000 --- a/.stversions/PriorityScreens~20250509-203451.qml +++ /dev/null @@ -1,8 +0,0 @@ -pragma Singleton - -import QtQuick -import Quickshell - -Singleton { - property var screens: ["LG ULTRAGEAR+", "NE135A1M-NY1"] -} diff --git a/.stversions/ReloadPopup~20250307-175400.qml b/.stversions/ReloadPopup~20250307-175400.qml deleted file mode 100644 index ff71c60..0000000 --- a/.stversions/ReloadPopup~20250307-175400.qml +++ /dev/null @@ -1,126 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Quickshell - -Scope { - id: root - property bool failed; - property string errorString; - - // Connect to the Quickshell global to listen for the reload signals. - Connections { - target: Quickshell - - function onReloadCompleted() { - root.failed = false; - popupLoader.loading = true; - } - - function onReloadFailed(error: string) { - // Close any existing popup before making a new one. - popupLoader.active = false; - - root.failed = true; - root.errorString = error; - popupLoader.loading = true; - } - } - - // Keep the popup in a loader because it isn't needed most of the timeand will take up - // memory that could be used for something else. - LazyLoader { - id: popupLoader - - PanelWindow { - id: popup - - anchors { - top: true - left: true - } - - margins { - top: 25 - left: 25 - } - - width: rect.width - height: rect.height - - // color blending is a bit odd as detailed in the type reference. - color: "black" - - Rectangle { - id: rect - color: failed ? "#40802020" : "#40009020" - - implicitHeight: layout.implicitHeight + 50 - implicitWidth: layout.implicitWidth + 30 - - // Fills the whole area of the rectangle, making any clicks go to it, - // which dismiss the popup. - MouseArea { - id: mouseArea - anchors.fill: parent - onClicked: popupLoader.active = false - - // makes the mouse area track mouse hovering, so the hide animation - // can be paused when hovering. - hoverEnabled: true - } - - ColumnLayout { - id: layout - anchors { - top: parent.top - topMargin: 20 - horizontalCenter: parent.horizontalCenter - } - - Text { - text: root.failed ? "Reload failed." : "Reloaded completed!" - color: "white" - } - - Text { - text: root.errorString - color: "white" - // When visible is false, it also takes up no space. - visible: root.errorString != "" - } - } - - // A progress bar on the bottom of the screen, showing how long until the - // popup is removed. - Rectangle { - id: bar - color: "#20ffffff" - anchors.bottom: parent.bottom - anchors.left: parent.left - height: 20 - - PropertyAnimation { - id: anim - target: bar - property: "width" - from: rect.width - to: 0 - duration: failed ? 10000 : 800 - onFinished: popupLoader.active = false - - // Pause the animation when the mouse is hovering over the popup, - // so it stays onscreen while reading. This updates reactively - // when the mouse moves on and off the popup. - paused: mouseArea.containsMouse - } - } - - // We could set `running: true` inside the animation, but the width of the - // rectangle might not be calculated yet, due to the layout. - // In the `Component.onCompleted` event handler, all of the component's - // properties and children have been initialized. - Component.onCompleted: anim.start() - } - } - } -} diff --git a/.stversions/ShellGlobals~20250307-175400.qml b/.stversions/ShellGlobals~20250307-175400.qml deleted file mode 100644 index 825d474..0000000 --- a/.stversions/ShellGlobals~20250307-175400.qml +++ /dev/null @@ -1,27 +0,0 @@ -pragma Singleton - -import QtQuick -import Quickshell - -Singleton { - SystemPalette { id: activePalette; colorGroup: SystemPalette.Active } - - readonly property var colors: QtObject { - readonly property color accent: activePalette.accent; - readonly property color alternateBase: activePalette.alternateBase; - readonly property color base: activePalette.base; - readonly property color button: activePalette.button; - readonly property color buttonText: activePalette.button; - readonly property color dark: activePalette.dark; - readonly property color highlight: activePalette.highlight; - readonly property color textHighlight: activePalette.highlightedText; - readonly property color light: activePalette.light; - readonly property color mid: activePalette.mid; - readonly property color midlight: activePalette.midlight; - readonly property color shadow: activePalette.shadow; - readonly property color text: activePalette.text; - readonly property color window: activePalette.window; - readonly property color windowText: activePalette.windowText; - readonly property color innerHighlight: "#416563"; - } -} diff --git a/.stversions/ShellGlobals~20250509-203451.qml b/.stversions/ShellGlobals~20250509-203451.qml deleted file mode 100644 index 222120a..0000000 --- a/.stversions/ShellGlobals~20250509-203451.qml +++ /dev/null @@ -1,32 +0,0 @@ -pragma Singleton - -import QtQuick -import Quickshell - -Singleton { - SystemPalette { - id: activePalette - colorGroup: SystemPalette.Active - } - - readonly property var colors: QtObject { - readonly property color accent: "lightblue" - //readonly property color accent: "#5AA097" - readonly property color base: "#161616" - readonly property color mid: "#1E1F1F" - readonly property color light: "#353636" - //readonly property color button: activePalette.button - //readonly property color buttonText: activePalette.button - //readonly property color dark: activePalette.dark - readonly property color highlight: activePalette.highlight - //readonly property color textHighlight: activePalette.highlightedText - //readonly property color light: activePalette.light - //readonly property color mid: activePalette.mid - readonly property color midlight: activePalette.midlight - readonly property color text: activePalette.text - //readonly property color window: activePalette.window - //readonly property color innerHighlight: "#416563" - - //readonly property color accent: "#5AA097" - } -} diff --git a/.stversions/bar/ActiveWindow~20250107-005428.qml b/.stversions/bar/ActiveWindow~20250107-005428.qml deleted file mode 100644 index 47f58ec..0000000 --- a/.stversions/bar/ActiveWindow~20250107-005428.qml +++ /dev/null @@ -1,31 +0,0 @@ -import QtQuick -import Quickshell.Hyprland -import ".." - -Rectangle { - width: 200; - height: parent.height; - - Text { - id: windowText; - text: ""; - color: ShellGlobals.colors.text; - font.pointSize: 11; - visible: text !== ""; - elide: Text.ElideRight; - anchors { - left: parent.left - right: parent.right; - verticalCenter: verticalCenter.parent; - - Connections { - target: Hyprland; - - function onRawEvent(event) { - if (event.name === "activewindow") { - windowText.text = event.parse(2)[1]; - } - } - } - } -} diff --git a/.stversions/bar/ActiveWindow~20250107-005503.qml b/.stversions/bar/ActiveWindow~20250107-005503.qml deleted file mode 100644 index b8377ec..0000000 --- a/.stversions/bar/ActiveWindow~20250107-005503.qml +++ /dev/null @@ -1,33 +0,0 @@ -import QtQuick -import Quickshell.Hyprland -import ".." - -Rectangle { - width: 200; - height: parent.height; - color: "black" - - Text { - id: windowText; - text: ""; - color: ShellGlobals.colors.text; - font.pointSize: 11; - visible: text !== ""; - elide: Text.ElideRight; - anchors { - left: parent.left - right: parent.right; - verticalCenter: verticalCenter.parent; - } - - Connections { - target: Hyprland; - - function onRawEvent(event) { - if (event.name === "activewindow") { - windowText.text = event.parse(2)[1]; - } - } - } - } -} diff --git a/.stversions/bar/ActiveWindow~20250107-005542.qml b/.stversions/bar/ActiveWindow~20250107-005542.qml deleted file mode 100644 index 4039fea..0000000 --- a/.stversions/bar/ActiveWindow~20250107-005542.qml +++ /dev/null @@ -1,34 +0,0 @@ -import QtQuick -import Quickshell.Hyprland -import ".." - -Rectangle { - width: 200; - height: parent.height; - color: "black" - - Text { - id: windowText; - text: ""; - color: ShellGlobals.colors.text; - font.pointSize: 11; - visible: text !== ""; - elide: Text.ElideRight; - - anchors { - left: parent.left - //right: parent.right; - verticalCenter: verticalCenter.parent; - } - - Connections { - target: Hyprland; - - function onRawEvent(event) { - if (event.name === "activewindow") { - windowText.text = event.parse(2)[1]; - } - } - } - } -} diff --git a/.stversions/bar/ActiveWindow~20250107-005825.qml b/.stversions/bar/ActiveWindow~20250107-005825.qml deleted file mode 100644 index 0fab3be..0000000 --- a/.stversions/bar/ActiveWindow~20250107-005825.qml +++ /dev/null @@ -1,34 +0,0 @@ -import QtQuick -import Quickshell.Hyprland -import ".." - -Rectangle { - width: 200; - height: parent.height; - color: "black" - - Text { - id: windowText; - text: ""; - color: ShellGlobals.colors.text; - font.pointSize: 11; - visible: text !== ""; - elide: Text.ElideRight; - - //anchors { - // left: parent.left - // //right: parent.right; - // verticalCenter: verticalCenter.parent; - //} - - Connections { - target: Hyprland; - - function onRawEvent(event) { - if (event.name === "activewindow") { - windowText.text = event.parse(2)[1]; - } - } - } - } -} diff --git a/.stversions/bar/ActiveWindow~20250307-175400.qml b/.stversions/bar/ActiveWindow~20250307-175400.qml deleted file mode 100644 index 56141f6..0000000 --- a/.stversions/bar/ActiveWindow~20250307-175400.qml +++ /dev/null @@ -1,22 +0,0 @@ -import QtQuick -import Quickshell.Hyprland -import ".." - -Text { - id: windowText; - text: ""; - color: ShellGlobals.colors.text; - font.pointSize: 11; - visible: text !== ""; - elide: Text.ElideRight; - - Connections { - target: Hyprland; - - function onRawEvent(event) { - if (event.name === "activewindow") { - windowText.text = event.parse(2)[1]; - } - } - } -} diff --git a/.stversions/bar/Bar~20250107-010815.qml b/.stversions/bar/Bar~20250107-010815.qml deleted file mode 100644 index 6578e3f..0000000 --- a/.stversions/bar/Bar~20250107-010815.qml +++ /dev/null @@ -1,94 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Quickshell -import "mpris" as Mpris -import "notifications" as Notifications -import "control" as Control -import ".." - -PanelWindow { - id: root; - color: ShellGlobals.colors.window; - height: 25 - - anchors { - top: true - left: true - right: true - } - - // Notifications - Notifications.Notifications { - bar: root; - } - - // Widgets - Everything here is sorted where it appears on the bar. - - // Left - RowLayout { - spacing: 15; - - anchors { - top: parent.top; - left: parent.left; - bottom: parent.bottom; - leftMargin: 10; - } - - Workspaces {} - - Separator { - visible: activeWindow.visible; - } - - ActiveWindow { - id: activeWindow; - Layout.preferredWidth: 250; - } - } - - - // Middle - - Mpris.MediaInfo { - id: mediaInfo; - bar: root; - anchors.centerIn: parent; - } - - // Right - RowLayout { - spacing: 20; - - anchors { - top: parent.top; - bottom: parent.bottom; - right: parent.right; - rightMargin: 10; - } - - SysTray { - id: sysTray; - bar: root; - } - - Separator { - visible: sysTray.visible - } - - BatteryIndicator { - id: batteryIndicator - } - - Control.Control { - bar: root; - } - - Separator {} - - Clock { - id: clock; - color: ShellGlobals.colors.text; - } - } -} diff --git a/.stversions/bar/Bar~20250107-010845.qml b/.stversions/bar/Bar~20250107-010845.qml deleted file mode 100644 index e1e8667..0000000 --- a/.stversions/bar/Bar~20250107-010845.qml +++ /dev/null @@ -1,98 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Quickshell -import "mpris" as Mpris -import "notifications" as Notifications -import "control" as Control -import ".." - -PanelWindow { - id: root; - color: ShellGlobals.colors.window; - height: 25 - - anchors { - top: true - left: true - right: true - } - - // Notifications - Notifications.Notifications { - bar: root; - } - - // Widgets - Everything here is sorted where it appears on the bar. - - // Left - RowLayout { - spacing: 15; - - anchors { - top: parent.top; - left: parent.left; - bottom: parent.bottom; - leftMargin: 10; - } - - Workspaces {} - - Separator { - visible: activeWindow.visible; - } - - ActiveWindow { - id: activeWindow; - Layout.preferredWidth: 250; - } - } - - - // Middle - - Mpris.MediaInfo { - id: mediaInfo; - bar: root; - anchors.centerIn: parent; - } - - // Right - RowLayout { - spacing: 20; - - anchors { - top: parent.top; - bottom: parent.bottom; - right: parent.right; - rightMargin: 10; - } - - SysTray { - id: sysTray; - bar: root; - } - - Separator { - visible: sysTray.visible - } - - RowLayout { - spacing: 15; - - BatteryIndicator { - id: batteryIndicator - } - - Control.Control { - bar: root; - } - } - - Separator {} - - Clock { - id: clock; - color: ShellGlobals.colors.text; - } - } -} diff --git a/.stversions/bar/Bar~20250107-010938.qml b/.stversions/bar/Bar~20250107-010938.qml deleted file mode 100644 index 538e846..0000000 --- a/.stversions/bar/Bar~20250107-010938.qml +++ /dev/null @@ -1,94 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Quickshell -import "mpris" as Mpris -import "notifications" as Notifications -import "control" as Control -import ".." - -PanelWindow { - id: root; - color: ShellGlobals.colors.window; - height: 25 - - anchors { - top: true - left: true - right: true - } - - // Notifications - Notifications.Notifications { - bar: root; - } - - // Widgets - Everything here is sorted where it appears on the bar. - - // Left - RowLayout { - spacing: 15; - - anchors { - top: parent.top; - left: parent.left; - bottom: parent.bottom; - leftMargin: 10; - } - - Workspaces {} - - Separator { - visible: activeWindow.visible; - } - - ActiveWindow { - id: activeWindow; - Layout.preferredWidth: 250; - } - } - - - // Middle - - Mpris.MediaInfo { - id: mediaInfo; - bar: root; - anchors.centerIn: parent; - } - - // Right - RowLayout { - spacing: 15; - - anchors { - top: parent.top; - bottom: parent.bottom; - right: parent.right; - rightMargin: 10; - } - - SysTray { - id: sysTray; - bar: root; - } - - Separator { - visible: sysTray.visible - } - - BatteryIndicator { - id: batteryIndicator - } - - Control.Control { - bar: root; - } - - Separator {} - - Clock { - id: clock; - color: ShellGlobals.colors.text; - } - } -} diff --git a/.stversions/bar/Bar~20250307-175400.qml b/.stversions/bar/Bar~20250307-175400.qml deleted file mode 100644 index 74135b9..0000000 --- a/.stversions/bar/Bar~20250307-175400.qml +++ /dev/null @@ -1,97 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Quickshell -import "mpris" as Mpris -import "notifications" as Notifications -import "control" as Control -import ".." - -PanelWindow { - id: root; - color: ShellGlobals.colors.window; - height: 25 - - anchors { - top: true - left: true - right: true - } - - // Notifications - Notifications.Notifications { - bar: root; - } - - // Widgets - Everything here is sorted where it appears on the bar. - - // Left - RowLayout { - spacing: 15; - - anchors { - top: parent.top; - left: parent.left; - bottom: parent.bottom; - leftMargin: 10; - } - - Workspaces {} - - Separator { - visible: activeWindow.visible; - } - - ActiveWindow { - id: activeWindow; - Layout.preferredWidth: 250; - } - } - - - // Middle - Mpris.MediaInfo { - id: mediaInfo; - bar: root; - anchors.centerIn: parent; - } - - // Right - RowLayout { - spacing: 15; - - anchors { - top: parent.top; - bottom: parent.bottom; - right: parent.right; - rightMargin: 10; - } - - SysTray { - id: sysTray; - bar: root; - } - - Separator { - visible: sysTray.visible - } - - RowLayout { - spacing: 5; - - BatteryIndicator { - id: batteryIndicator - } - - Control.Control { - bar: root; - } - } - - Separator {} - - Clock { - id: clock; - color: ShellGlobals.colors.text; - } - } -} diff --git a/.stversions/bar/Bar~20250509-203449.qml b/.stversions/bar/Bar~20250509-203449.qml deleted file mode 100644 index 1266ec5..0000000 --- a/.stversions/bar/Bar~20250509-203449.qml +++ /dev/null @@ -1,93 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Quickshell -import "mpris" as Mpris -import "volume" as Volume -import "../widgets" as Widgets -import ".." - -PanelWindow { - id: root - color: ShellGlobals.colors.base - height: 25 - - anchors { - top: true - left: true - right: true - } - - /// Widgets - Everything here is sorted where it appears on the bar. - - // Left - RowLayout { - spacing: 15 - - anchors { - top: parent.top - left: parent.left - bottom: parent.bottom - leftMargin: 10 - } - - // Whatever is available will display - HyprWorkspaces {} - SwayWorkspaces {} - - Widgets.Separator { - visible: activeWindow.visible - } - - ActiveWindow { - id: activeWindow - Layout.preferredWidth: 250 - } - } - - // Middle - Mpris.Status { - id: mprisStatus - bar: root - anchors.centerIn: parent - } - - // Right - RowLayout { - spacing: 15 - - anchors { - top: parent.top - bottom: parent.bottom - right: parent.right - rightMargin: 10 - } - - SysTray { - id: sysTray - bar: root - } - - Widgets.Separator { - visible: sysTray.visible - } - - RowLayout { - spacing: 5 - - BatteryIndicator { - id: batteryIndicator - } - - Volume.Button { - bar: root - } - } - - Widgets.Separator {} - - Clock { - id: clock - color: ShellGlobals.colors.text - } - } -} diff --git a/.stversions/bar/BatteryIndicator~20250307-175400.qml b/.stversions/bar/BatteryIndicator~20250307-175400.qml deleted file mode 100644 index bbba594..0000000 --- a/.stversions/bar/BatteryIndicator~20250307-175400.qml +++ /dev/null @@ -1,38 +0,0 @@ -import QtQuick -import Quickshell.Widgets -import Quickshell.Services.UPower -import ".." - -Item { - property string batteryStatus: { - if (!UPower.onBattery) { - return "charging"; - } - - let percentage = UPower.displayDevice.percentage * 100; - let roundedValue = Math.floor(percentage / 5) * 5; - return roundedValue.toString(); - } - - width: 30; - height: parent.height; - visible: UPower.displayDevice.isLaptopBattery; - - Rectangle { - color: ShellGlobals.colors.highlight; - width: 12; - height: 8; - visible: batteryStatus === "charging"; - - anchors { - centerIn: batteryImage; - } - } - - IconImage { - id: batteryImage; - implicitSize: 20; - source: Qt.resolvedUrl(`../resources/battery/battery-${batteryStatus}.svg`); - anchors.centerIn: parent; - } -} diff --git a/.stversions/bar/Clock~20250307-175400.qml b/.stversions/bar/Clock~20250307-175400.qml deleted file mode 100644 index 65a03c2..0000000 --- a/.stversions/bar/Clock~20250307-175400.qml +++ /dev/null @@ -1,20 +0,0 @@ -import QtQuick -import Quickshell - -Text { - property string ap: sysClock.hours >= 12 ? "PM" : "AM"; - property string minutes: sysClock.minutes.toString().padStart(2, '0'); - property string hours: { - var value = sysClock.hours % 12; - if (value === 0) return 12; - return value; - } - - SystemClock { - id: sysClock; - enabled: true; - } - - text: `${hours}:${minutes} ${ap}` - font.pointSize: 11; -} diff --git a/.stversions/bar/HyprWorkspaces~20250509-203448.qml b/.stversions/bar/HyprWorkspaces~20250509-203448.qml deleted file mode 100644 index 36df04c..0000000 --- a/.stversions/bar/HyprWorkspaces~20250509-203448.qml +++ /dev/null @@ -1,51 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Quickshell.Hyprland -import ".." - -RowLayout { - property var sortedWorkspaces: { - let values = Hyprland.workspaces.values.slice(); - values.sort(function (a, b) { - return a.id - b.id; - }); - - return values; - } - - spacing: 6 - visible: Hyprland.monitors.values.length != 0 - - Repeater { - model: parent.sortedWorkspaces - - Rectangle { - required property var modelData - width: 25 - height: 12 - radius: 10 - - color: { - let value = ShellGlobals.colors.light; - - if (!modelData?.id || !Hyprland.focusedMonitor?.activeWorkspace?.id) - return value; - - if (workspaceButton.containsMouse) { - value = ShellGlobals.colors.midlight; - } else if (Hyprland.focusedMonitor.activeWorkspace.id == modelData.id) { - value = ShellGlobals.colors.accent; - } - - return value; - } - - MouseArea { - id: workspaceButton - anchors.fill: parent - hoverEnabled: true - onPressed: Hyprland.dispatch(`workspace ${parent.modelData.id}`) - } - } - } -} diff --git a/.stversions/bar/Separator~20250307-175400.qml b/.stversions/bar/Separator~20250307-175400.qml deleted file mode 100644 index d2b8288..0000000 --- a/.stversions/bar/Separator~20250307-175400.qml +++ /dev/null @@ -1,9 +0,0 @@ -import QtQuick -import ".." - -Rectangle { - color: ShellGlobals.colors.highlight; - radius: 5; - width: 7.5; - height: 7.5; -} diff --git a/.stversions/bar/SwayWorkspaces~20250509-203451.qml b/.stversions/bar/SwayWorkspaces~20250509-203451.qml deleted file mode 100644 index 623d877..0000000 --- a/.stversions/bar/SwayWorkspaces~20250509-203451.qml +++ /dev/null @@ -1,56 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Quickshell.I3 -import ".." - -RowLayout { - property var sortedWorkspaces: { - let values = I3.workspaces.values.slice(); - values.sort(function (a, b) { - if (!a?.num) - return 1; - if (!b?.num) - return -1; - - return a.num - b.num; - }); - - return values; - } - - spacing: 6 - visible: I3.monitors.values.length != 0 - - Repeater { - model: parent.sortedWorkspaces - - Rectangle { - required property var modelData - width: 25 - height: 12 - radius: 10 - - color: getColor(modelData, workspaceButton.containsMouse) - - MouseArea { - id: workspaceButton - anchors.fill: parent - hoverEnabled: true - onPressed: I3.dispatch(`workspace number ${parent.modelData.num}`) - } - } - } - - function getColor(modelData, isHovered) { - if (!modelData?.id || !I3.focusedMonitor?.focusedWorkspace?.num) - return ShellGlobals.colors.light; - - if (isHovered) - return ShellGlobals.colors.midlight; - - if (I3.focusedMonitor.focusedWorkspace.num == modelData.num) - return ShellGlobals.colors.accent; - - return ShellGlobals.colors.light; - } -} diff --git a/.stversions/bar/SysTray~20250307-175400.qml b/.stversions/bar/SysTray~20250307-175400.qml deleted file mode 100644 index 6e17989..0000000 --- a/.stversions/bar/SysTray~20250307-175400.qml +++ /dev/null @@ -1,26 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Quickshell.Widgets -import Quickshell.Services.SystemTray -import "../widgets" as Widgets -import ".." - -RowLayout { - required property var bar; - - spacing: 10; - visible: SystemTray.items.values.length > 0 - - Repeater { - model: SystemTray.items; - - Widgets.IconButton { - id: iconButton; - implicitSize: 20; - source: modelData.icon; - - onClicked: modelData.display(bar, -parent.mapFromGlobal(0, 0).x, root.height+5); - } - - } -} diff --git a/.stversions/bar/SysTray~20250509-203448.qml b/.stversions/bar/SysTray~20250509-203448.qml deleted file mode 100644 index 9ba2a1f..0000000 --- a/.stversions/bar/SysTray~20250509-203448.qml +++ /dev/null @@ -1,41 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Quickshell -import Quickshell.Widgets -import Quickshell.Services.SystemTray -import "../widgets" as Widgets -import ".." - -RowLayout { - id: root - required property var bar - spacing: 10 - visible: SystemTray.items.values.length > 0 - - Repeater { - model: SystemTray.items - - Widgets.IconButton { - id: iconButton - implicitSize: 20 - source: modelData.icon - padding: 0 - - QsMenuAnchor { - id: menuAnchor - menu: modelData.menu - - anchor { - window: bar - adjustment: PopupAdjustment.Flip - - onAnchoring: { - anchor.rect = mapToItem(bar.contentItem, -2, height + 4, width + 2, 0); - } - } - } - - onClicked: menuAnchor.open() - } - } -} diff --git a/.stversions/bar/Workspaces~20250307-175400.qml b/.stversions/bar/Workspaces~20250307-175400.qml deleted file mode 100644 index c71e4c9..0000000 --- a/.stversions/bar/Workspaces~20250307-175400.qml +++ /dev/null @@ -1,49 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Quickshell.Hyprland -import Quickshell.Io -import ".." - -RowLayout { - property var sortedWorkspaces: { - let values = Hyprland.workspaces.values.slice(); - values.sort(function(a, b) { return a.id - b.id; }); - - return values; - }; - - spacing: 6; - - Repeater { - model: sortedWorkspaces; - - Rectangle { - required property var modelData; - width: 25; - height: 12; - radius: 10; - - color: { - let value = ShellGlobals.colors.light; - - if (!modelData?.id || !Hyprland.focusedMonitor?.activeWorkspace?.id) - return value; - - if (workspaceButton.containsMouse) { - value = ShellGlobals.colors.midlight; - } else if (Hyprland.focusedMonitor.activeWorkspace.id == modelData.id) { - value = ShellGlobals.colors.highlight; - } - - return value; - } - - MouseArea { - id: workspaceButton; - anchors.fill: parent; - hoverEnabled: true; - onPressed: Hyprland.dispatch('workspace ' + modelData.id); - } - } - } -} diff --git a/.stversions/bar/control/ControlButton~20250307-175400.qml b/.stversions/bar/control/ControlButton~20250307-175400.qml deleted file mode 100644 index 0dcf480..0000000 --- a/.stversions/bar/control/ControlButton~20250307-175400.qml +++ /dev/null @@ -1,74 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import QtQuick.Effects -import Quickshell.Widgets -import "../.." - -Item { - property string source; - property string text: ""; - property string subText: ""; - property real implicitSize; // icon implicit size - property real padding: 0; - property real radius: 5; - signal clicked(); - - id: root; - width: implicitSize*3; - height: implicitSize*1.25; - - Rectangle { - id: iconBackground; - color: iconButton.containsMouse - ? ShellGlobals.colors.innerHighlight - : ShellGlobals.colors.midlight; - border.color: iconButton.containsMouse - ? ShellGlobals.colors.highlight - : ShellGlobals.colors.light; - radius: root.radius; - anchors.fill: parent; - - RowLayout { - spacing: 5; - - anchors { - fill: parent; - margins: root.padding; - } - - IconImage { - id: iconImage; - implicitSize: root.implicitSize; - source: root.source; - } - - ColumnLayout { - id: textLayout; - spacing: 3; - Layout.fillWidth: true; - - Text { - text: root.text; - color: ShellGlobals.colors.text; - font.pointSize: 11; - font.bold: true; - visible: text.length > 0; - } - - Text { - text: root.subText; - color: ShellGlobals.colors.text; - font.pointSize: 10; - visible: text.length > 0; - } - } - } - - MouseArea { - id: iconButton; - hoverEnabled: true; - anchors.fill: parent; - onPressed: root.clicked(); - } - } -} diff --git a/.stversions/bar/control/ControlPanel~20250307-175400.qml b/.stversions/bar/control/ControlPanel~20250307-175400.qml deleted file mode 100644 index d3913cf..0000000 --- a/.stversions/bar/control/ControlPanel~20250307-175400.qml +++ /dev/null @@ -1,96 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Qt5Compat.GraphicalEffects -import Quickshell -import Quickshell.Io -import Quickshell.Services.UPower -import "../../widgets" as Widgets -import "../.." - -PopupWindow { - id: root; - width: controlContainer.implicitWidth+25 - height: controlContainer.implicitHeight+25 - //width: 275; - //height: 400; - color: "transparent" - visible: controlContainer.opacity > 0; - - function show(x, y) { - root.anchor.rect.x = x; - root.anchor.rect.y = y; - controlContainer.opacity = 1; - } - - function hide() { - controlContainer.opacity = 0; - } - - HoverHandler { - id: hoverHandler; - enabled: true; - acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad; - onHoveredChanged: { - if (hovered === false) { - hide(); - } - } - } - - Rectangle { - id: controlContainer; - color: ShellGlobals.colors.window; - radius: 5; - opacity: 0; // TODO: change to 0 - layer.enabled: true; - layer.effect: DropShadow { - transparentBorder: true; - spread: 0.02; - samples: 25; - color: "#80000000"; - } - - implicitWidth: columnLayout.implicitWidth + 20 // Add margins - implicitHeight: columnLayout.implicitHeight + 20 // Add margins - - anchors { - centerIn: parent; - margins: 5; - } - - Behavior on opacity { - NumberAnimation { - duration: 300; - easing.type: Easing.OutCubic; - } - } - - ColumnLayout { - id: columnLayout - spacing: 10; - - anchors { - left: parent.left - right: parent.right - top: parent.top - bottom: parent.bottom - margins: 10 // Padding from the parent rectangle - } - - RowLayout { - spacing: 10; - - Rectangle { - width: 120; - height: 120; - } - - Rectangle { - width: 120; - height: 120; - } - } - } - } -} - diff --git a/.stversions/bar/control/ControlSlider~20250307-175400.qml b/.stversions/bar/control/ControlSlider~20250307-175400.qml deleted file mode 100644 index ed88b42..0000000 --- a/.stversions/bar/control/ControlSlider~20250307-175400.qml +++ /dev/null @@ -1,64 +0,0 @@ -import QtQuick -import Qt5Compat.GraphicalEffects -import QtQuick.Controls -import Quickshell.Widgets -import "../.." - -Slider { - id: slider; - from: 0; - to: 100; - value: 50; - - background: Rectangle { - id: sliderContainer; - width: slider.availableWidth; - height: slider.availableHeight; - color: "#e0e0e0"; - radius: 10; - - layer.enabled: true - layer.effect: OpacityMask { - source: Rectangle { - width: sliderContainer.width; - height: sliderContainer.height; - radius: sliderContainer.radius; - color: "white"; - } - - maskSource: Rectangle { - width: sliderContainer.width; - height: sliderContainer.height; - radius: sliderContainer.radius; - color: "black"; - } - } - - Rectangle { - id: handle; - width: sliderContainer.width * (slider.value / slider.to); - height: sliderContainer.height; - color: ShellGlobals.colors.highlight; - - Behavior on width { - NumberAnimation { - duration: 100; - easing.type: Easing.OutQuad; - } - } - } - - //IconImage { - // implicitSize: 20; - // source: "root:resources/control/sleep.svg" - // - // anchors { - // verticalCenter: parent.verticalCenter; - // left: parent.left; - // leftMargin: 15; - // } - //} - } - - handle: Item { } -} diff --git a/.stversions/bar/control/ControlVSlider~20250307-175400.qml b/.stversions/bar/control/ControlVSlider~20250307-175400.qml deleted file mode 100644 index bb60c01..0000000 --- a/.stversions/bar/control/ControlVSlider~20250307-175400.qml +++ /dev/null @@ -1,70 +0,0 @@ -import QtQuick -import Qt5Compat.GraphicalEffects -import QtQuick.Controls -import Quickshell.Widgets -import "../.." - -Slider { - id: slider; - from: 0; - to: 100; - value: 50; - orientation: Qt.Vertical; - - background: Rectangle { - id: sliderContainer; - width: slider.availableWidth; - height: slider.availableHeight; - color: "#e0e0e0"; - radius: 10; - - layer.enabled: true - layer.effect: OpacityMask { - source: Rectangle { - width: sliderContainer.width; - height: sliderContainer.height; - radius: sliderContainer.radius; - color: "white"; - } - - maskSource: Rectangle { - width: sliderContainer.width; - height: sliderContainer.height; - radius: sliderContainer.radius; - color: "black"; - } - } - - Rectangle { - id: handle; - width: sliderContainer.width; - height: sliderContainer.height * (slider.value / slider.to); - color: ShellGlobals.colors.highlight; - - anchors { - bottom: sliderContainer.bottom; - horizontalCenter: sliderContainer.horizontalCenter; - } - - Behavior on height { - NumberAnimation { - duration: 100; - easing.type: Easing.OutQuad; - } - } - } - - //IconImage { - // implicitSize: 20; - // source: "root:resources/control/sleep.svg" - // - // anchors { - // verticalCenter: parent.verticalCenter; - // left: parent.left; - // leftMargin: 15; - // } - //} - } - - handle: Item { } -} diff --git a/.stversions/bar/control/Control~20250307-175400.qml b/.stversions/bar/control/Control~20250307-175400.qml deleted file mode 100644 index ecfd822..0000000 --- a/.stversions/bar/control/Control~20250307-175400.qml +++ /dev/null @@ -1,32 +0,0 @@ -import QtQuick -import Quickshell -import Quickshell.Widgets -import "../../widgets" as Widgets -import "../.." - -Widgets.IconButton { - required property var bar; - - id: root; - implicitSize: 20; - padding: 2; - source: "root:/resources/control/controls-button.svg"; - onClicked: { - if (controlLoader.item.visible) { - controlLoader.item.hide(); - } else { - controlLoader.item.show(-root.mapFromGlobal(0, 0).x, bar.height); - } - } - - LazyLoader { - id: controlLoader; - loading: true; - - ControlPanel { - id: controlPanel; - anchor.window: bar; - } - } -} - diff --git a/.stversions/bar/mpris/Card~20250509-203448.qml b/.stversions/bar/mpris/Card~20250509-203448.qml deleted file mode 100644 index 5d367eb..0000000 --- a/.stversions/bar/mpris/Card~20250509-203448.qml +++ /dev/null @@ -1,238 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import QtQuick.Controls -import Qt5Compat.GraphicalEffects -import Quickshell -import "../.." -import "../../widgets" as Widgets - -Rectangle { - required property var player - - radius: 5 - color: "transparent" - implicitHeight: 220 - - RowLayout { - id: cardLayout - spacing: 15 - - anchors { - fill: parent - leftMargin: 10 - rightMargin: 10 - topMargin: 10 // Added top margin for better spacing - bottomMargin: 10 // Added bottom margin for better spacing - } - - Rectangle { - id: mprisImage - color: "transparent" - radius: 10 - width: 200 - height: 200 - Layout.alignment: Qt.AlignVCenter - visible: true - - Image { - anchors.fill: parent - source: player.trackArtUrl - sourceSize.width: 256 - sourceSize.height: 256 - fillMode: Image.PreserveAspectFit - - layer.enabled: true - layer.effect: OpacityMask { - source: Rectangle { - width: mprisImage.width - height: mprisImage.height - radius: 10 - color: "white" - } - - maskSource: Rectangle { - width: mprisImage.width - height: mprisImage.height - radius: 10 - color: "black" - } - - layer.enabled: true - layer.effect: DropShadow { - transparentBorder: true - spread: 0.02 - samples: 25 - color: "#80000000" - } - } - } - } - - ColumnLayout { - Layout.fillWidth: true - Layout.fillHeight: true - spacing: 5 - - Text { - text: player.trackArtist - color: ShellGlobals.colors.text - font.pointSize: 13 - font.bold: true - horizontalAlignment: Text.AlignHCenter - Layout.fillWidth: true - elide: Text.ElideRight - } - - Text { - text: player.trackTitle - color: ShellGlobals.colors.text - font.pointSize: 13 - horizontalAlignment: Text.AlignHCenter - Layout.fillWidth: true - elide: Text.ElideRight - } - - RowLayout { - spacing: 2 - - Text { - text: timeStr(player.position) - color: ShellGlobals.colors.text - - font { - pointSize: 9 - bold: true - } - } - - ColorQuantizer { - id: colorQuantizer - source: Qt.resolvedUrl(Media.trackedPlayer?.trackArtUrl ?? "") - depth: 0 - rescaleSize: 64 - } - - Slider { - id: slider - from: 0 - to: player.length - enabled: false - //enabled: player.canSeek - value: player.position - - implicitHeight: 7 - Layout.fillWidth: true - Layout.margins: 10 - Layout.leftMargin: 5 - Layout.rightMargin: 5 - Layout.alignment: Qt.AlignBottom - - background: Rectangle { - id: sliderContainer - width: slider.availableWidth - height: slider.implicitHeight - color: "white" - radius: 4 - - layer.enabled: true - layer.effect: OpacityMask { - source: Rectangle { - width: sliderContainer.width - height: sliderContainer.height - radius: sliderContainer.radius - color: "white" - } - - maskSource: Rectangle { - width: sliderContainer.width - height: sliderContainer.height - radius: sliderContainer.radius - color: "black" - } - } - - Rectangle { - id: handle - width: sliderContainer.width * (slider.value / slider.to) - height: sliderContainer.height - color: colorQuantizer.colors[0].darker(1.2) - - Behavior on width { - NumberAnimation { - duration: 100 - easing.type: Easing.OutQuad - } - } - } - } - - handle: Rectangle { - x: slider.leftPadding + slider.visualPosition * (slider.availableWidth - width) - y: slider.topPadding + slider.availableHeight / 2 - height / 2 - width: 16 - height: 16 - radius: width / 2 - color: colorQuantizer.colors[0].darker(1.4) - - layer.enabled: true - layer.effect: DropShadow { - horizontalOffset: 0 - verticalOffset: 1 - radius: 4.0 - samples: 9 - color: "#30000000" - } - } - } - - Text { - text: timeStr(player.length) - color: ShellGlobals.colors.text - - font { - pointSize: 9 - bold: true - } - } - } - - // Music Controls - RowLayout { - spacing: 2 - Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter - - Widgets.IconButton { - implicitSize: 36 - padding: 4 - source: "root:resources/mpris/previous.svg" - onClicked: player.previous() - } - - Widgets.IconButton { - implicitSize: 36 - padding: 4 - source: player?.isPlaying ? "root:resources/mpris/pause.svg" : "root:resources/mpris/play.svg" - onClicked: { - if (!player.canPlay) - return; - player.isPlaying ? player.pause() : player.play(); - } - } - - Widgets.IconButton { - implicitSize: 36 - padding: 4 - source: "root:resources/mpris/next.svg" - onClicked: player.next() - } - } - } - } - - function timeStr(time: int): string { - const seconds = time % 60; - const minutes = Math.floor(time / 60); - - return `${minutes}:${seconds.toString().padStart(2, '0')}`; - } -} diff --git a/.stversions/bar/mpris/MediaInfo~20250107-004337.qml b/.stversions/bar/mpris/MediaInfo~20250107-004337.qml deleted file mode 100644 index bdc7027..0000000 --- a/.stversions/bar/mpris/MediaInfo~20250107-004337.qml +++ /dev/null @@ -1,95 +0,0 @@ -import QtQuick -import Quickshell.Services.Mpris -import Quickshell.Widgets -import "../.." - -Item { - required property var bar; - - width: statusInfo.width; - height: parent.height; - - MediaSwitcher { - id: mediaSwitcher; - anchor.window: bar; - } - - MouseArea { - id: playButton; - hoverEnabled: true; - acceptedButtons: Qt.LeftButton | Qt.RightButton - onClicked: (mouse)=> { - if (mouse.button === Qt.LeftButton) { - mediaSwitcher.visible = !mediaSwitcher.visible; - } else { - if (!Media.trackedPlayer.canPlay || Media.trackedPlayer == null) - return; - - if (Media.trackedPlayer.isPlaying) - Media.trackedPlayer.pause(); - else - Media.trackedPlayer.play(); - } - } - - anchors.fill: parent; - } - - Item { - id: statusInfo; - width: statusIcon.width + statusIcon.anchors.rightMargin + nowPlayingText.width; - visible: Media.trackedPlayer != null; - - anchors { - horizontalCenter: parent.horizontalCenter; - verticalCenter: parent.verticalCenter; - top: parent.top; - bottom: parent.botton; - margins: 3.5; - } - - Rectangle { - color: ShellGlobals.colors.innerHighlight; - border.color: ShellGlobals.colors.highlight; - radius: 5; - width: parent.width + 25; - height: parent.height; - visible: playButton.containsMouse; - anchors.centerIn: parent; - } - - IconImage { - id: statusIcon; - implicitSize: 13; - source: Media.trackedPlayer?.isPlaying - ? Qt.resolvedUrl("../../resources/mpris/pause.svg") - : Qt.resolvedUrl("../../resources/mpris/play.svg"); - - anchors { - verticalCenter: parent.verticalCenter; - right: nowPlayingText.left; - rightMargin: 10; - } - } - - Text { - id: nowPlayingText - color: ShellGlobals.colors.text; - text: `${Media.trackedPlayer?.trackArtist} - ${Media.trackedPlayer?.trackTitle}`; - font.pointSize: 11; - elide: Text.ElideRight; - - anchors { - verticalCenter: parent.verticalCenter; - right: parent.right; - } - } - } - - function truncate(text) { - if (text?.length > 40) { - return text.substring(0, 40) + " ..." - } - return text - } -} diff --git a/.stversions/bar/mpris/MediaInfo~20250107-004401.qml b/.stversions/bar/mpris/MediaInfo~20250107-004401.qml deleted file mode 100644 index b6b21f4..0000000 --- a/.stversions/bar/mpris/MediaInfo~20250107-004401.qml +++ /dev/null @@ -1,96 +0,0 @@ -import QtQuick -import Quickshell.Services.Mpris -import Quickshell.Widgets -import "../.." - -Item { - required property var bar; - - width: statusInfo.width; - height: parent.height; - - MediaSwitcher { - id: mediaSwitcher; - anchor.window: bar; - } - - MouseArea { - id: playButton; - hoverEnabled: true; - acceptedButtons: Qt.LeftButton | Qt.RightButton - onClicked: (mouse)=> { - if (mouse.button === Qt.LeftButton) { - mediaSwitcher.visible = !mediaSwitcher.visible; - } else { - if (!Media.trackedPlayer.canPlay || Media.trackedPlayer == null) - return; - - if (Media.trackedPlayer.isPlaying) - Media.trackedPlayer.pause(); - else - Media.trackedPlayer.play(); - } - } - - anchors.fill: parent; - } - - Item { - id: statusInfo; - width: statusIcon.width + statusIcon.anchors.rightMargin + nowPlayingText.width; - visible: Media.trackedPlayer != null; - - anchors { - horizontalCenter: parent.horizontalCenter; - verticalCenter: parent.verticalCenter; - top: parent.top; - bottom: parent.botton; - margins: 3.5; - } - - Rectangle { - color: ShellGlobals.colors.innerHighlight; - border.color: ShellGlobals.colors.highlight; - radius: 5; - width: parent.width + 25; - height: parent.height; - visible: playButton.containsMouse; - anchors.centerIn: parent; - } - - IconImage { - id: statusIcon; - implicitSize: 13; - source: Media.trackedPlayer?.isPlaying - ? Qt.resolvedUrl("../../resources/mpris/pause.svg") - : Qt.resolvedUrl("../../resources/mpris/play.svg"); - - anchors { - verticalCenter: parent.verticalCenter; - right: nowPlayingText.left; - rightMargin: 10; - } - } - - Text { - id: nowPlayingText - color: ShellGlobals.colors.text; - text: `${Media.trackedPlayer?.trackArtist} - ${Media.trackedPlayer?.trackTitle}`; - font.pointSize: 11; - elide: Text.ElideRight; - contentWidth: 100; - - anchors { - verticalCenter: parent.verticalCenter; - right: parent.right; - } - } - } - - function truncate(text) { - if (text?.length > 40) { - return text.substring(0, 40) + " ..." - } - return text - } -} diff --git a/.stversions/bar/mpris/MediaInfo~20250107-004431.qml b/.stversions/bar/mpris/MediaInfo~20250107-004431.qml deleted file mode 100644 index 84eabb9..0000000 --- a/.stversions/bar/mpris/MediaInfo~20250107-004431.qml +++ /dev/null @@ -1,96 +0,0 @@ -import QtQuick -import Quickshell.Services.Mpris -import Quickshell.Widgets -import "../.." - -Item { - required property var bar; - - width: statusInfo.width; - height: parent.height; - - MediaSwitcher { - id: mediaSwitcher; - anchor.window: bar; - } - - MouseArea { - id: playButton; - hoverEnabled: true; - acceptedButtons: Qt.LeftButton | Qt.RightButton - onClicked: (mouse)=> { - if (mouse.button === Qt.LeftButton) { - mediaSwitcher.visible = !mediaSwitcher.visible; - } else { - if (!Media.trackedPlayer.canPlay || Media.trackedPlayer == null) - return; - - if (Media.trackedPlayer.isPlaying) - Media.trackedPlayer.pause(); - else - Media.trackedPlayer.play(); - } - } - - anchors.fill: parent; - } - - Item { - id: statusInfo; - width: statusIcon.width + statusIcon.anchors.rightMargin + nowPlayingText.width; - visible: Media.trackedPlayer != null; - - anchors { - horizontalCenter: parent.horizontalCenter; - verticalCenter: parent.verticalCenter; - top: parent.top; - bottom: parent.botton; - margins: 3.5; - } - - Rectangle { - color: ShellGlobals.colors.innerHighlight; - border.color: ShellGlobals.colors.highlight; - radius: 5; - width: parent.width + 25; - height: parent.height; - visible: playButton.containsMouse; - anchors.centerIn: parent; - } - - IconImage { - id: statusIcon; - implicitSize: 13; - source: Media.trackedPlayer?.isPlaying - ? Qt.resolvedUrl("../../resources/mpris/pause.svg") - : Qt.resolvedUrl("../../resources/mpris/play.svg"); - - anchors { - verticalCenter: parent.verticalCenter; - right: nowPlayingText.left; - rightMargin: 10; - } - } - - Text { - id: nowPlayingText - color: ShellGlobals.colors.text; - text: `${Media.trackedPlayer?.trackArtist} - ${Media.trackedPlayer?.trackTitle}`; - font.pointSize: 11; - elide: Text.ElideRight; - width: 100; - - anchors { - verticalCenter: parent.verticalCenter; - right: parent.right; - } - } - } - - function truncate(text) { - if (text?.length > 40) { - return text.substring(0, 40) + " ..." - } - return text - } -} diff --git a/.stversions/bar/mpris/MediaInfo~20250107-004532.qml b/.stversions/bar/mpris/MediaInfo~20250107-004532.qml deleted file mode 100644 index 1cca802..0000000 --- a/.stversions/bar/mpris/MediaInfo~20250107-004532.qml +++ /dev/null @@ -1,96 +0,0 @@ -import QtQuick -import Quickshell.Services.Mpris -import Quickshell.Widgets -import "../.." - -Item { - required property var bar; - - width: statusInfo.width; - height: parent.height; - - MediaSwitcher { - id: mediaSwitcher; - anchor.window: bar; - } - - MouseArea { - id: playButton; - hoverEnabled: true; - acceptedButtons: Qt.LeftButton | Qt.RightButton - onClicked: (mouse)=> { - if (mouse.button === Qt.LeftButton) { - mediaSwitcher.visible = !mediaSwitcher.visible; - } else { - if (!Media.trackedPlayer.canPlay || Media.trackedPlayer == null) - return; - - if (Media.trackedPlayer.isPlaying) - Media.trackedPlayer.pause(); - else - Media.trackedPlayer.play(); - } - } - - anchors.fill: parent; - } - - Item { - id: statusInfo; - width: statusIcon.width + statusIcon.anchors.rightMargin + nowPlayingText.width; - visible: Media.trackedPlayer != null; - - anchors { - horizontalCenter: parent.horizontalCenter; - verticalCenter: parent.verticalCenter; - top: parent.top; - bottom: parent.botton; - margins: 3.5; - } - - Rectangle { - color: ShellGlobals.colors.innerHighlight; - border.color: ShellGlobals.colors.highlight; - radius: 5; - width: parent.width + 25; - height: parent.height; - visible: playButton.containsMouse; - anchors.centerIn: parent; - } - - IconImage { - id: statusIcon; - implicitSize: 13; - source: Media.trackedPlayer?.isPlaying - ? Qt.resolvedUrl("../../resources/mpris/pause.svg") - : Qt.resolvedUrl("../../resources/mpris/play.svg"); - - anchors { - verticalCenter: parent.verticalCenter; - right: nowPlayingText.left; - rightMargin: 10; - } - } - - Text { - id: nowPlayingText - color: ShellGlobals.colors.text; - text: `${Media.trackedPlayer?.trackArtist} - ${Media.trackedPlayer?.trackTitle}`; - font.pointSize: 11; - width: 250; - elide: Text.ElideRight; - - anchors { - verticalCenter: parent.verticalCenter; - right: parent.right; - } - } - } - - function truncate(text) { - if (text?.length > 40) { - return text.substring(0, 40) + " ..." - } - return text - } -} diff --git a/.stversions/bar/mpris/MediaInfo~20250307-175400.qml b/.stversions/bar/mpris/MediaInfo~20250307-175400.qml deleted file mode 100644 index 5748758..0000000 --- a/.stversions/bar/mpris/MediaInfo~20250307-175400.qml +++ /dev/null @@ -1,96 +0,0 @@ -import QtQuick -import Quickshell.Services.Mpris -import Quickshell.Widgets -import "../.." - -Item { - required property var bar; - - width: statusInfo.width; - height: parent.height; - - MediaSwitcher { - id: mediaSwitcher; - anchor.window: bar; - anchor.rect.x: parentWindow.width / 2 - width / 2; - anchor.rect.y: parentWindow.height; - } - - MouseArea { - id: playButton; - hoverEnabled: true; - acceptedButtons: Qt.LeftButton | Qt.RightButton - onClicked: (mouse)=> { - if (mouse.button === Qt.LeftButton) { - if (mediaSwitcher.visible) { - mediaSwitcher.hide(); - } else { - mediaSwitcher.show(); - } - //mediaSwitcher.visible = !mediaSwitcher.visible; - } else { - if (!Media.trackedPlayer.canPlay || Media.trackedPlayer == null) - return; - - if (Media.trackedPlayer.isPlaying) - Media.trackedPlayer.pause(); - else - Media.trackedPlayer.play(); - } - } - - anchors.fill: parent; - } - - Item { - id: statusInfo; - width: statusIcon.width + statusIcon.anchors.rightMargin + nowPlayingText.width; - visible: Media.trackedPlayer != null; - - anchors { - horizontalCenter: parent.horizontalCenter; - verticalCenter: parent.verticalCenter; - top: parent.top; - bottom: parent.botton; - margins: 3.5; - } - - Rectangle { - color: ShellGlobals.colors.innerHighlight; - border.color: ShellGlobals.colors.highlight; - radius: 3; - width: parent.width + 25; - height: parent.height; - visible: playButton.containsMouse; - anchors.centerIn: parent; - } - - IconImage { - id: statusIcon; - implicitSize: 13; - source: Media.trackedPlayer?.isPlaying - ? "root:resources/mpris/pause.svg" - : "root:resources/mpris/play.svg"; - - anchors { - verticalCenter: parent.verticalCenter; - right: nowPlayingText.left; - rightMargin: 10; - } - } - - Text { - id: nowPlayingText - color: ShellGlobals.colors.text; - text: `${Media.trackedPlayer?.trackArtist} - ${Media.trackedPlayer?.trackTitle}`; - font.pointSize: 11; - width: Math.min(implicitWidth, 250); - elide: Text.ElideRight; - - anchors { - verticalCenter: parent.verticalCenter; - right: parent.right; - } - } - } -} diff --git a/.stversions/bar/mpris/MediaSwitcher.qml~20250307-175400.bak b/.stversions/bar/mpris/MediaSwitcher.qml~20250307-175400.bak deleted file mode 100644 index 0d99bcb..0000000 --- a/.stversions/bar/mpris/MediaSwitcher.qml~20250307-175400.bak +++ /dev/null @@ -1,122 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Quickshell -import Quickshell.Widgets -import "../.." - -PopupWindow { - id: root; - width: 500 - height: 500 - color: "transparent"; - visible: false; - anchor.rect.x: parentWindow.width / 2 - width / 2 - anchor.rect.y: parentWindow.height + 5; - - Rectangle { - color: ShellGlobals.colors.window; - radius:5; - border.color: mouse.hovered - ? ShellGlobals.colors.highlight - : ShellGlobals.colors.light; - border.width: 2; - anchors.fill: parent; - - // NOTE: You cannot stack mouseArea's that have hovered enabled. - // This is the workaround for panel hover detection. - HoverHandler { - id: mouse - enabled: true; - acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad; - onHoveredChanged: { - if (hovered == false) { - root.visible = false; - } - } - } - - ColumnLayout { - spacing: 5; - - anchors { - horizontalCenter: parent.horizontalCenter; - top: parent.top; - margins: 20; - } - - Image { - Layout.alignment: Qt.AlignHCenter - Layout.preferredWidth: 300 - Layout.preferredHeight: 300 - source: Media.trackedPlayer.trackArtUrl - fillMode: Image.PreserveAspectFit - - sourceSize { - width: 512 - height: 512 - } - } - - Text { - text: truncate(Media.trackedPlayer.trackArtist); - color: ShellGlobals.colors.text; - font.pointSize: 13; - Layout.alignment: Qt.AlignHCenter; - Layout.topMargin: 20; - } - - Text { - text: truncate(Media.trackedPlayer.trackTitle); - color: ShellGlobals.colors.text; - font.pointSize: 13; - Layout.alignment: Qt.AlignHCenter; - } - - RowLayout { - spacing: 20; - Layout.alignment: Qt.AlignHCenter; - Layout.topMargin: 10; - - IconButton { - implicitSize: 32 - source: Qt.resolvedUrl("../../resources/mpris/previous.svg"); - onClicked: { - Media.trackedPlayer.previous(); - } - } - - IconButton { - implicitSize: 36; - source: Media.trackedPlayer?.isPlaying - ? Qt.resolvedUrl("../../resources/mpris/pause.svg") - : Qt.resolvedUrl("../../resources/mpris/play.svg"); - onClicked: { - if (!Media.trackedPlayer.canPlay || Media.trackedPlayer == null) - return; - - if (Media.trackedPlayer.isPlaying) - Media.trackedPlayer.pause(); - else - Media.trackedPlayer.play(); - } - } - - IconButton { - implicitSize: 32; - source: Qt.resolvedUrl("../../resources/mpris/next.svg"); - onClicked: { - Media.trackedPlayer.next(); - } - } - } - } - } - - // TODO: make this some sort of global function - function truncate(text) { - if (text?.length > 60) { - return text.substring(0, 60) + " ..." - } - return text - } -} diff --git a/.stversions/bar/mpris/MediaSwitcher~20250107-004917.qml b/.stversions/bar/mpris/MediaSwitcher~20250107-004917.qml deleted file mode 100644 index c6062ba..0000000 --- a/.stversions/bar/mpris/MediaSwitcher~20250107-004917.qml +++ /dev/null @@ -1,179 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Qt5Compat.GraphicalEffects -import Quickshell -import Quickshell.Services.Mpris -import "../.." - -PopupWindow { - id: root - width: mediaPlayerContainer.width + 15; - height: mediaPlayerContainer.height + 15; - color: "transparent" - visible: false - anchor.rect.x: parentWindow.width / 2 - width / 2 - anchor.rect.y: parentWindow.height; - - HoverHandler { - id: hoverHandler - enabled: true - acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad - onHoveredChanged: { - if (hovered == false) { - root.visible = false - } - } - } - - Rectangle { - id: mediaPlayerContainer; - width: 500; - height: mediaPlayerColumn.height + 20; - color: ShellGlobals.colors.window - radius: 5 - - layer.enabled: true - layer.effect: DropShadow { - transparentBorder: true; - spread: 0.02; - samples: 25; - color: "#80000000"; - } - - anchors.centerIn: parent; - - //border.color: hoverHandler.hovered - // ? ShellGlobals.colors.highlight - // : ShellGlobals.colors.light - //border.width: 2 - - ColumnLayout { - id: mediaPlayerColumn; - spacing: 10 - - anchors { - top: parent.top - left: parent.left - right: parent.right - margins: 10 - } - - Repeater { - model: Mpris.players - - Rectangle { - // TODO: do color quant for a background gradient and then blur it - required property var modelData; - radius: 5; - color: ShellGlobals.colors.light; - height: 80 - Layout.fillWidth: true - - RowLayout { - spacing: 15 - - anchors { - fill: parent - margins: 10 - } - - Item { - Layout.preferredWidth: 60 - Layout.preferredHeight: 60 - - Rectangle { - id: mask - anchors.fill: parent - radius: 5; - visible: false - } - - Image { - anchors.fill: parent - source: modelData.trackArtUrl - fillMode: Image.PreserveAspectFit - layer.enabled: true - layer.effect: OpacityMask { - maskSource: mask - } - } - } - - ColumnLayout { - Layout.fillWidth: true - spacing: 5 - Layout.alignment: Qt.AlignVCenter - - Text { - text: modelData.trackArtist; - color: ShellGlobals.colors.text - font.pointSize: 13 - font.bold: true - Layout.alignment: Qt.AlignLeft - Layout.fillWidth: true - width: 350; - elide: Text.ElideRight; - } - - Text { - text: modelData.trackTitle; - color: ShellGlobals.colors.text; - font.pointSize: 13; - Layout.alignment: Qt.AlignLeft; - Layout.fillWidth: true; - //width: 350; - elide: Text.ElideRight; - } - } - - // Spacer to push controls to the right - Item { - Layout.fillWidth: true - Layout.minimumWidth: 20 - } - - // Controls container - RowLayout { - spacing: 2 - Layout.alignment: Qt.AlignRight | Qt.AlignVCenter - - IconButton { - implicitSize: 24 - source: Qt.resolvedUrl("../../resources/mpris/previous.svg") - onClicked: modelData.previous() - } - - IconButton { - implicitSize: 24 - source: modelData?.isPlaying - ? Qt.resolvedUrl("../../resources/mpris/pause.svg") - : Qt.resolvedUrl("../../resources/mpris/play.svg") - onClicked: { - if (!modelData.canPlay) - return - modelData.isPlaying - ? modelData.pause() - : modelData.play() - } - } - - IconButton { - implicitSize: 24 - source: Qt.resolvedUrl("../../resources/mpris/next.svg") - onClicked: modelData.next() - } - } - } - } - } - } - } - - function truncate(text) { - if (text?.length > 30) { - return text.substring(0, 30) + " ..." - } - return text - } -} - diff --git a/.stversions/bar/mpris/MediaSwitcher~20250107-004927.qml b/.stversions/bar/mpris/MediaSwitcher~20250107-004927.qml deleted file mode 100644 index 25ddb5a..0000000 --- a/.stversions/bar/mpris/MediaSwitcher~20250107-004927.qml +++ /dev/null @@ -1,178 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Qt5Compat.GraphicalEffects -import Quickshell -import Quickshell.Services.Mpris -import "../.." - -PopupWindow { - id: root - width: mediaPlayerContainer.width + 15; - height: mediaPlayerContainer.height + 15; - color: "transparent" - visible: false - anchor.rect.x: parentWindow.width / 2 - width / 2 - anchor.rect.y: parentWindow.height; - - HoverHandler { - id: hoverHandler - enabled: true - acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad - onHoveredChanged: { - if (hovered == false) { - root.visible = false - } - } - } - - Rectangle { - id: mediaPlayerContainer; - width: 500; - height: mediaPlayerColumn.height + 20; - color: ShellGlobals.colors.window - radius: 5 - - layer.enabled: true - layer.effect: DropShadow { - transparentBorder: true; - spread: 0.02; - samples: 25; - color: "#80000000"; - } - - anchors.centerIn: parent; - - //border.color: hoverHandler.hovered - // ? ShellGlobals.colors.highlight - // : ShellGlobals.colors.light - //border.width: 2 - - ColumnLayout { - id: mediaPlayerColumn; - spacing: 10 - - anchors { - top: parent.top - left: parent.left - right: parent.right - margins: 10 - } - - Repeater { - model: Mpris.players - - Rectangle { - // TODO: do color quant for a background gradient and then blur it - required property var modelData; - radius: 5; - color: ShellGlobals.colors.light; - height: 80 - Layout.fillWidth: true - - RowLayout { - spacing: 15 - - anchors { - fill: parent - margins: 10 - } - - Item { - Layout.preferredWidth: 60 - Layout.preferredHeight: 60 - - Rectangle { - id: mask - anchors.fill: parent - radius: 5; - visible: false - } - - Image { - anchors.fill: parent - source: modelData.trackArtUrl - fillMode: Image.PreserveAspectFit - layer.enabled: true - layer.effect: OpacityMask { - maskSource: mask - } - } - } - - ColumnLayout { - Layout.fillWidth: true - spacing: 5 - Layout.alignment: Qt.AlignVCenter - - Text { - text: modelData.trackArtist; - color: ShellGlobals.colors.text - font.pointSize: 13 - font.bold: true - Layout.alignment: Qt.AlignLeft - Layout.fillWidth: true - width: 350; - elide: Text.ElideRight; - } - - Text { - text: modelData.trackTitle; - color: ShellGlobals.colors.text; - font.pointSize: 13; - Layout.alignment: Qt.AlignLeft; - Layout.fillWidth: true; - elide: Text.ElideRight; - } - } - - // Spacer to push controls to the right - Item { - Layout.fillWidth: true - Layout.minimumWidth: 20 - } - - // Controls container - RowLayout { - spacing: 2 - Layout.alignment: Qt.AlignRight | Qt.AlignVCenter - - IconButton { - implicitSize: 24 - source: Qt.resolvedUrl("../../resources/mpris/previous.svg") - onClicked: modelData.previous() - } - - IconButton { - implicitSize: 24 - source: modelData?.isPlaying - ? Qt.resolvedUrl("../../resources/mpris/pause.svg") - : Qt.resolvedUrl("../../resources/mpris/play.svg") - onClicked: { - if (!modelData.canPlay) - return - modelData.isPlaying - ? modelData.pause() - : modelData.play() - } - } - - IconButton { - implicitSize: 24 - source: Qt.resolvedUrl("../../resources/mpris/next.svg") - onClicked: modelData.next() - } - } - } - } - } - } - } - - function truncate(text) { - if (text?.length > 30) { - return text.substring(0, 30) + " ..." - } - return text - } -} - diff --git a/.stversions/bar/mpris/MediaSwitcher~20250107-004947.qml b/.stversions/bar/mpris/MediaSwitcher~20250107-004947.qml deleted file mode 100644 index 1e9b2b1..0000000 --- a/.stversions/bar/mpris/MediaSwitcher~20250107-004947.qml +++ /dev/null @@ -1,178 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Qt5Compat.GraphicalEffects -import Quickshell -import Quickshell.Services.Mpris -import "../.." - -PopupWindow { - id: root - width: mediaPlayerContainer.width + 15; - height: mediaPlayerContainer.height + 15; - color: "transparent" - visible: false - anchor.rect.x: parentWindow.width / 2 - width / 2 - anchor.rect.y: parentWindow.height; - - HoverHandler { - id: hoverHandler - enabled: true - acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad - onHoveredChanged: { - if (hovered == false) { - root.visible = false - } - } - } - - Rectangle { - id: mediaPlayerContainer; - width: 500; - height: mediaPlayerColumn.height + 20; - color: ShellGlobals.colors.window - radius: 5 - - layer.enabled: true - layer.effect: DropShadow { - transparentBorder: true; - spread: 0.02; - samples: 25; - color: "#80000000"; - } - - anchors.centerIn: parent; - - //border.color: hoverHandler.hovered - // ? ShellGlobals.colors.highlight - // : ShellGlobals.colors.light - //border.width: 2 - - ColumnLayout { - id: mediaPlayerColumn; - spacing: 10 - - anchors { - top: parent.top - left: parent.left - right: parent.right - margins: 10 - } - - Repeater { - model: Mpris.players - - Rectangle { - // TODO: do color quant for a background gradient and then blur it - required property var modelData; - radius: 5; - color: ShellGlobals.colors.light; - height: 80 - Layout.fillWidth: true - - RowLayout { - spacing: 15 - - anchors { - fill: parent - margins: 10 - } - - Item { - Layout.preferredWidth: 60 - Layout.preferredHeight: 60 - - Rectangle { - id: mask - anchors.fill: parent - radius: 5; - visible: false - } - - Image { - anchors.fill: parent - source: modelData.trackArtUrl - fillMode: Image.PreserveAspectFit - layer.enabled: true - layer.effect: OpacityMask { - maskSource: mask - } - } - } - - ColumnLayout { - Layout.fillWidth: true - spacing: 5 - Layout.alignment: Qt.AlignVCenter - - Text { - text: modelData.trackArtist; - color: ShellGlobals.colors.text - font.pointSize: 13 - font.bold: true - Layout.alignment: Qt.AlignLeft - Layout.fillWidth: true - //width: 350; - elide: Text.ElideRight; - } - - Text { - text: modelData.trackTitle; - color: ShellGlobals.colors.text; - font.pointSize: 13; - Layout.alignment: Qt.AlignLeft; - Layout.fillWidth: true; - elide: Text.ElideRight; - } - } - - // Spacer to push controls to the right - //Item { - // Layout.fillWidth: true - // Layout.minimumWidth: 20 - //} - - // Controls container - RowLayout { - spacing: 2 - Layout.alignment: Qt.AlignRight | Qt.AlignVCenter - - IconButton { - implicitSize: 24 - source: Qt.resolvedUrl("../../resources/mpris/previous.svg") - onClicked: modelData.previous() - } - - IconButton { - implicitSize: 24 - source: modelData?.isPlaying - ? Qt.resolvedUrl("../../resources/mpris/pause.svg") - : Qt.resolvedUrl("../../resources/mpris/play.svg") - onClicked: { - if (!modelData.canPlay) - return - modelData.isPlaying - ? modelData.pause() - : modelData.play() - } - } - - IconButton { - implicitSize: 24 - source: Qt.resolvedUrl("../../resources/mpris/next.svg") - onClicked: modelData.next() - } - } - } - } - } - } - } - - function truncate(text) { - if (text?.length > 30) { - return text.substring(0, 30) + " ..." - } - return text - } -} - diff --git a/.stversions/bar/mpris/MediaSwitcher~20250107-005025.qml b/.stversions/bar/mpris/MediaSwitcher~20250107-005025.qml deleted file mode 100644 index 0346d4a..0000000 --- a/.stversions/bar/mpris/MediaSwitcher~20250107-005025.qml +++ /dev/null @@ -1,171 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Qt5Compat.GraphicalEffects -import Quickshell -import Quickshell.Services.Mpris -import "../.." - -PopupWindow { - id: root - width: mediaPlayerContainer.width + 15; - height: mediaPlayerContainer.height + 15; - color: "transparent" - visible: false - anchor.rect.x: parentWindow.width / 2 - width / 2 - anchor.rect.y: parentWindow.height; - - HoverHandler { - id: hoverHandler - enabled: true - acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad - onHoveredChanged: { - if (hovered == false) { - root.visible = false - } - } - } - - Rectangle { - id: mediaPlayerContainer; - width: 500; - height: mediaPlayerColumn.height + 20; - color: ShellGlobals.colors.window - radius: 5 - - layer.enabled: true - layer.effect: DropShadow { - transparentBorder: true; - spread: 0.02; - samples: 25; - color: "#80000000"; - } - - anchors.centerIn: parent; - - //border.color: hoverHandler.hovered - // ? ShellGlobals.colors.highlight - // : ShellGlobals.colors.light - //border.width: 2 - - ColumnLayout { - id: mediaPlayerColumn; - spacing: 10 - - anchors { - top: parent.top - left: parent.left - right: parent.right - margins: 10 - } - - Repeater { - model: Mpris.players - - Rectangle { - // TODO: do color quant for a background gradient and then blur it - required property var modelData; - radius: 5; - color: ShellGlobals.colors.light; - height: 80 - Layout.fillWidth: true - - RowLayout { - spacing: 15 - - anchors { - fill: parent - margins: 10 - } - - Item { - Layout.preferredWidth: 60 - Layout.preferredHeight: 60 - - Rectangle { - id: mask - anchors.fill: parent - radius: 5; - visible: false - } - - Image { - anchors.fill: parent - source: modelData.trackArtUrl - fillMode: Image.PreserveAspectFit - layer.enabled: true - layer.effect: OpacityMask { - maskSource: mask - } - } - } - - ColumnLayout { - Layout.fillWidth: true - spacing: 5 - Layout.alignment: Qt.AlignVCenter - - Text { - text: modelData.trackArtist; - color: ShellGlobals.colors.text - font.pointSize: 13 - font.bold: true - Layout.alignment: Qt.AlignLeft - Layout.fillWidth: true - elide: Text.ElideRight; - } - - Text { - text: modelData.trackTitle; - color: ShellGlobals.colors.text; - font.pointSize: 13; - Layout.alignment: Qt.AlignLeft; - Layout.fillWidth: true; - elide: Text.ElideRight; - } - } - - // Controls container - RowLayout { - spacing: 2 - Layout.alignment: Qt.AlignRight | Qt.AlignVCenter - - IconButton { - implicitSize: 24 - source: Qt.resolvedUrl("../../resources/mpris/previous.svg") - onClicked: modelData.previous() - } - - IconButton { - implicitSize: 24 - source: modelData?.isPlaying - ? Qt.resolvedUrl("../../resources/mpris/pause.svg") - : Qt.resolvedUrl("../../resources/mpris/play.svg") - onClicked: { - if (!modelData.canPlay) - return - modelData.isPlaying - ? modelData.pause() - : modelData.play() - } - } - - IconButton { - implicitSize: 24 - source: Qt.resolvedUrl("../../resources/mpris/next.svg") - onClicked: modelData.next() - } - } - } - } - } - } - } - - function truncate(text) { - if (text?.length > 30) { - return text.substring(0, 30) + " ..." - } - return text - } -} - diff --git a/.stversions/bar/mpris/MediaSwitcher~20250307-175400.qml b/.stversions/bar/mpris/MediaSwitcher~20250307-175400.qml deleted file mode 100644 index cbc747c..0000000 --- a/.stversions/bar/mpris/MediaSwitcher~20250307-175400.qml +++ /dev/null @@ -1,191 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Qt5Compat.GraphicalEffects -import Quickshell -import Quickshell.Services.Mpris -import "../../widgets/" as Widgets -import "../.." - -PopupWindow { - id: root - width: mediaPlayerContainer.width + 10; - height: mediaPlayerContainer.height + 10; - color: "transparent" - visible: mediaPlayerContainer.opacity > 0; - - anchor.rect.x: parentWindow.width / 2 - width / 2; - anchor.rect.y: parentWindow.height; - - function show() { - mediaPlayerContainer.opacity = 1; - } - - function hide() { - mediaPlayerContainer.opacity = 0; - } - - HoverHandler { - id: hoverHandler; - enabled: true; - acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad; - onHoveredChanged: { - if (hovered == false) { - hide(); - } - } - } - - Rectangle { - id: mediaPlayerContainer; - width: 500; - height: mediaPlayerColumn.height + 20; - color: ShellGlobals.colors.window; - radius: 5; - opacity: 0; - - layer.enabled: true; - layer.effect: DropShadow { - transparentBorder: true; - spread: 0.02; - samples: 25; - color: "#80000000"; - } - - anchors.centerIn: parent; - - Behavior on opacity { - NumberAnimation { - duration: 300; - easing.type: Easing.OutCubic; - } - } - - - ColumnLayout { - id: mediaPlayerColumn; - spacing: 10 - - anchors { - top: parent.top - left: parent.left - right: parent.right - margins: 10 - } - - Repeater { - model: Mpris.players - - Rectangle { - required property var modelData; - radius: 5; - color: ShellGlobals.colors.midlight; - border.color: ShellGlobals.colors.light; - height: 75; - Layout.fillWidth: true; - - RowLayout { - spacing: 15; - - - anchors { - fill: parent; - leftMargin: 10; - rightMargin: 10; - topMargin: 0; - bottomMargin: 0; - } - - Item { - Layout.preferredWidth: 60; - Layout.preferredHeight: 60; - Layout.alignment: Qt.AlignVCenter; - visible: modelData.trackArtUrl != ""; - - Rectangle { - id: mask; - anchors.fill: parent; - radius: 5; - visible: false; - } - - Image { - anchors.fill: parent; - source: modelData.trackArtUrl; - fillMode: Image.PreserveAspectFit; - layer.enabled: true; - layer.effect: OpacityMask { - maskSource: mask; - } - } - } - - ColumnLayout { - Layout.fillWidth: true; - Layout.fillHeight: true; - spacing: 5; - Layout.alignment: Qt.AlignVCenter; - - Item { Layout.fillHeight: true; } - - Text { - text: modelData.trackArtist; - color: ShellGlobals.colors.text; - font.pointSize: 13; - font.bold: true; - Layout.alignment: Qt.AlignLeft; - Layout.fillWidth: true; - elide: Text.ElideRight; - } - - Text { - text: modelData.trackTitle; - color: ShellGlobals.colors.text; - font.pointSize: 13; - Layout.alignment: Qt.AlignLeft; - Layout.fillWidth: true; - elide: Text.ElideRight; - } - - Item { Layout.fillHeight: true; } - } - - RowLayout { - spacing: 2; - Layout.alignment: Qt.AlignRight | Qt.AlignVCenter; - - Widgets.IconButton { - implicitSize: 28; - padding: 4; - source: "root:resources/mpris/previous.svg"; - onClicked: modelData.previous(); - } - - Widgets.IconButton { - implicitSize: 28; - padding: 4; - source: modelData?.isPlaying - ? "root:resources/mpris/pause.svg" - : "root:resources/mpris/play.svg"; - onClicked: { - if (!modelData.canPlay) - return; - modelData.isPlaying - ? modelData.pause() - : modelData.play(); - } - } - - Widgets.IconButton { - implicitSize: 28; - padding: 4; - source: "root:resources/mpris/next.svg"; - onClicked: modelData.next(); - } - } - } - } - } - } - } -} - diff --git a/.stversions/bar/mpris/Media~20250307-175400.qml b/.stversions/bar/mpris/Media~20250307-175400.qml deleted file mode 100644 index 2c9a0cb..0000000 --- a/.stversions/bar/mpris/Media~20250307-175400.qml +++ /dev/null @@ -1,45 +0,0 @@ -pragma Singleton - -import QtQuick -import Quickshell -import Quickshell.Services.Mpris - -Singleton { - property MprisPlayer trackedPlayer; - - id: root; - - Instantiator { - model: Mpris.players; - - Connections { - required property MprisPlayer modelData; - target: modelData; - - Component.onCompleted: { - if (root.trackedPlayer == null || modelData.isPlaying) { - root.trackedPlayer = modelData; - } - } - - Component.onDestruction: { - if (root.trackedPlayer == null || !root.trackedPlayer.isPlaying) { - for (const player of Mpris.players.values) { - if (player.playbackState.isPlaying) { - root.trackedPlayer = player; - break; - } - } - - if (trackedPlayer == null && Mpris.players.values.length != 0) { - trackedPlayer = Mpris.players.values[0]; - } - } - } - - function onPlaybackStateChanged() { - if (root.trackedPlayer !== modelData) root.trackedPlayer = modelData; - } - } - } -} diff --git a/.stversions/bar/mpris/Player~20250509-203448.qml b/.stversions/bar/mpris/Player~20250509-203448.qml deleted file mode 100644 index 2d9dd49..0000000 --- a/.stversions/bar/mpris/Player~20250509-203448.qml +++ /dev/null @@ -1,151 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Qt5Compat.GraphicalEffects -import Quickshell -import Quickshell.Services.Mpris -import "../.." - -PopupWindow { - id: root - width: mediaPlayerContainer.width + 10 - height: mediaPlayerContainer.height + 10 - color: "transparent" - visible: mediaPlayerContainer.opacity > 0 - - anchor.rect.x: parentWindow.width / 2 - width / 2 - anchor.rect.y: parentWindow.height - - function show() { - mediaPlayerContainer.opacity = 1; - } - - function hide() { - mediaPlayerContainer.opacity = 0; - } - - HoverHandler { - id: hoverHandler - enabled: true - acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad - onHoveredChanged: { - if (hovered == false) { - hide(); - } - } - } - - Rectangle { - id: mediaPlayerContainer - width: 500 - height: mediaPlayerColumn.height + 20 - color: ShellGlobals.colors.base - radius: 5 - opacity: 0 - anchors.centerIn: parent - layer.enabled: true - layer.effect: OpacityMask { - source: Rectangle { - width: mediaPlayerContainer.width - height: mediaPlayerContainer.height - radius: mediaPlayerContainer.radius - color: "white" - } - - maskSource: Rectangle { - width: mediaPlayerContainer.width - height: mediaPlayerContainer.height - radius: mediaPlayerContainer.radius - color: "black" - } - - layer.enabled: true - layer.effect: DropShadow { - transparentBorder: true - spread: 0.02 - samples: 25 - color: "#80000000" - } - } - - Behavior on opacity { - NumberAnimation { - duration: 300 - easing.type: Easing.OutCubic - } - } - - ColorQuantizer { - id: colorQuantizer - source: Qt.resolvedUrl(Media.trackedPlayer?.trackArtUrl ?? "") - depth: 2 - rescaleSize: 64 - - onColorsChanged: { - Media.colors = colors; - } - } - - ShaderEffect { - property color topLeftColor: colorQuantizer?.colors[0] ?? "white" - property color topRightColor: colorQuantizer?.colors[1] ?? "black" - property color bottomLeftColor: colorQuantizer?.colors[2] ?? "white" - property color bottomRightColor: colorQuantizer?.colors[3] ?? "black" - - anchors.fill: parent - fragmentShader: "root:/shaders/vertexgradient.frag.qsb" - vertexShader: "root:/shaders/vertexgradient.vert.qsb" - - Behavior on topLeftColor { - ColorAnimation { - duration: 500 - easing.type: Easing.InOutQuad - } - } - Behavior on topRightColor { - ColorAnimation { - duration: 500 - easing.type: Easing.InOutQuad - } - } - Behavior on bottomLeftColor { - ColorAnimation { - duration: 500 - easing.type: Easing.InOutQuad - } - } - Behavior on bottomRightColor { - ColorAnimation { - duration: 500 - easing.type: Easing.InOutQuad - } - } - } - - ColumnLayout { - id: mediaPlayerColumn - spacing: 10 - Layout.fillWidth: true - Layout.preferredWidth: parent.width - Layout.margins: 10 - implicitHeight: childrenRect.height - - anchors { - top: parent.top - left: parent.left - right: parent.right - margins: 10 - } - - // Media Cards - Repeater { - model: Mpris.players - - Card { - required property var modelData - player: modelData - Layout.fillWidth: true - } - } - } - } -} diff --git a/.stversions/bar/mpris/Status~20250509-203451.qml b/.stversions/bar/mpris/Status~20250509-203451.qml deleted file mode 100644 index 1d31b29..0000000 --- a/.stversions/bar/mpris/Status~20250509-203451.qml +++ /dev/null @@ -1,174 +0,0 @@ -import QtQuick -import Quickshell.Widgets -import Quickshell.Services.Mpris -import Qt5Compat.GraphicalEffects -import "../.." - -Item { - id: root - required property var bar - - width: statusInfo.width + 125 - height: parent.height - visible: Mpris.players.values.length != 0 - - Player { - id: mediaPlayer - anchor.window: bar - anchor.rect.x: parentWindow.width / 2 - width / 2 - anchor.rect.y: parentWindow.height - } - - MouseArea { - id: playButton - hoverEnabled: true - acceptedButtons: Qt.LeftButton | Qt.RightButton - onClicked: mouse => { - if (mouse.button === Qt.LeftButton) { - if (mediaPlayer.visible) { - mediaPlayer.hide(); - } else { - mediaPlayer.show(); - } - } else { - if (!Media.trackedPlayer.canPlay || Media.trackedPlayer == null) - return; - - if (Media.trackedPlayer.isPlaying) - Media.trackedPlayer.pause(); - else - Media.trackedPlayer.play(); - } - } - - anchors.fill: parent - } - - ShaderEffect { - id: gradientShader - property color topLeftColor: Media?.colors[0] ?? "white" - property color topRightColor: Media?.colors[1] ?? "black" - property color bottomLeftColor: Media?.colors[2] ?? "white" - property color bottomRightColor: Media?.colors[3] ?? "black" - anchors.fill: parent - visible: false - fragmentShader: "root:/shaders/vertexgradient.frag.qsb" - vertexShader: "root:/shaders/vertexgradient.vert.qsb" - - Behavior on topLeftColor { - ColorAnimation { - duration: 500 - easing.type: Easing.InOutQuad - } - } - Behavior on topRightColor { - ColorAnimation { - duration: 500 - easing.type: Easing.InOutQuad - } - } - Behavior on bottomLeftColor { - ColorAnimation { - duration: 500 - easing.type: Easing.InOutQuad - } - } - Behavior on bottomRightColor { - ColorAnimation { - duration: 500 - easing.type: Easing.InOutQuad - } - } - } - - Rectangle { - id: artRect - anchors.fill: gradientShader - antialiasing: true - visible: false - gradient: Gradient { - orientation: Gradient.Horizontal - GradientStop { - position: 0.0 - color: "transparent" - } - GradientStop { - position: 0.5 - color: "white" - } - GradientStop { - position: 1.0 - color: "transparent" - } - } - } - - OpacityMask { - id: clip - source: gradientShader - anchors.fill: gradientShader - maskSource: artRect - cached: false - visible: false - } - - GaussianBlur { - id: blur - visible: root.visible - source: clip - anchors.fill: clip - radius: 16 - samples: radius * 2 - transparentBorder: true - } - - Item { - id: statusInfo - width: statusIcon.width + statusIcon.anchors.rightMargin + nowPlayingText.width - height: parent.height - visible: Media.trackedPlayer != null - - anchors { - horizontalCenter: parent.horizontalCenter - verticalCenter: parent.verticalCenter - top: parent.top - bottom: parent.botton - margins: 3.5 - } - - //Rectangle { - // color: ShellGlobals.colors.accent - // radius: 3 - // width: parent.width + 25 - // height: parent.height - 7 - // visible: playButton.containsMouse - // anchors.centerIn: parent - //} - - IconImage { - id: statusIcon - implicitSize: 13 - source: Media.trackedPlayer?.isPlaying ? "root:resources/mpris/pause.svg" : "root:resources/mpris/play.svg" - - anchors { - verticalCenter: parent.verticalCenter - right: nowPlayingText.left - rightMargin: 10 - } - } - - Text { - id: nowPlayingText - color: ShellGlobals.colors.text - text: `${Media.trackedPlayer?.trackArtist} - ${Media.trackedPlayer?.trackTitle}` - font.pointSize: 11 - width: Math.min(implicitWidth, 250) - elide: Text.ElideRight - - anchors { - verticalCenter: parent.verticalCenter - right: parent.right - } - } - } -} diff --git a/.stversions/bar/notifications/Notifications~20241229-025012.qml b/.stversions/bar/notifications/Notifications~20241229-025012.qml deleted file mode 100644 index 72eda3e..0000000 --- a/.stversions/bar/notifications/Notifications~20241229-025012.qml +++ /dev/null @@ -1,61 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Quickshell -import Quickshell.Services.Notifications -import ".." - -PanelWindow { - required property var bar; - - id: notificationWindow; - color: "transparent"; - width: 550; - height: 600; - visible: true; - mask: Region { item: notifLayout; } - - anchors { - top: true; - bottom: true; - } - - margins { - top: 5; - bottom: 5; - right: 5; - } - - - NotificationServer { - id: notificationServer; - actionsSupported: true; - persistenceSupported: true; - } - - Connections { - target: notificationServer; - - function onNotification(notification) { - notification.tracked = true; - } - } - - ColumnLayout { - id: notifLayout; - spacing: 5; - - anchors { - left: parent.left; - right: parent.right; - } - - Repeater { - model: notificationServer.trackedNotifications; - - Toast { - required property var modelData; - notification: modelData; - } - } - } -} diff --git a/.stversions/bar/notifications/Notifications~20250307-175400.qml b/.stversions/bar/notifications/Notifications~20250307-175400.qml deleted file mode 100644 index 5d6a69b..0000000 --- a/.stversions/bar/notifications/Notifications~20250307-175400.qml +++ /dev/null @@ -1,71 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Quickshell -import Quickshell.Services.Notifications -import ".." - -Scope { - required property var bar; - - NotificationServer { - id: notificationServer; - actionsSupported: true; - persistenceSupported: true; - } - - Connections { - target: notificationServer; - - function onNotification(notification) { - notificationLoader.item.visible = true; - notification.tracked = true; - } - } - - LazyLoader { - id: notificationLoader; - loading: true; - - PanelWindow { - id: notificationWindow; - color: "transparent"; - width: 500; - visible: false; - exclusionMode: ExclusionMode.Normal; - mask: Region { item: notifLayout; } - - anchors { - top: true; - bottom: true; - right: true; - } - - margins { - top: 5; - bottom: 5; - right: 5; - } - - ColumnLayout { - id: notifLayout; - spacing: 15; - - anchors { - top: parent.top; - left: parent.left; - right: parent.right; - margins: 5; - } - - Repeater { - model: notificationServer.trackedNotifications; - - Toast { - required property var modelData; - notification: modelData; - } - } - } - } - } -} diff --git a/.stversions/bar/notifications/Toast~20241229-025203.qml b/.stversions/bar/notifications/Toast~20241229-025203.qml deleted file mode 100644 index e9779b1..0000000 --- a/.stversions/bar/notifications/Toast~20241229-025203.qml +++ /dev/null @@ -1,105 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Quickshell -import Quickshell.Widgets -import Quickshell.Services.Notifications -import "../.." - -Rectangle { - required property var notification - - radius: 5; - color: ShellGlobals.colors.bar; - border.color: notificationArea.containsMouse - ? ShellGlobals.colors.highlight - : ShellGlobals.colors.light; - border.width: 2; - width: parent.width; - height: column.implicitHeight + 20; - - MouseArea { - id: notificationArea; - hoverEnabled: true; - anchors.fill: parent; - } - - ColumnLayout { - id: column; - spacing: 5; - - anchors { - fill: parent; - margins: 10; - } - - RowLayout { - spacing: 5; - Layout.fillWidth: true; - - IconImage { - visible: notification.appIcon == null; - source: Qt.resolvedUrl(notification.appIcon); - implicitSize: 25; - } - - Text { - id: summaryText - text: notification.summary - color: ShellGlobals.colors.text - font.pointSize: 14 - font.bold: true - wrapMode: Text.Wrap; - Layout.fillWidth: true - Layout.alignment: Qt.AlignBottom; - } - - Item { - width: 16; - height: 16; - Layout.alignment: Qt.AlighRight | Qt.AlignTop; - - Rectangle { - color: "#FF474D"; - radius: 5; - visible: closeButtonArea.containsMouse; - anchors.fill: parent; - } - - MouseArea { - id: closeButtonArea; - hoverEnabled: true; - anchors.fill: parent; - onPressed: { - notification.dismiss(); - } - } - - IconImage { - source: "image://icon/window-close"; - implicitSize: 28; - anchors.centerIn: parent; - } - } - } - - RowLayout { - Text { - id: bodyText - text: notification.body - color: ShellGlobals.colors.text - font.pointSize: 11; - wrapMode: Text.Wrap - Layout.fillWidth: true - } - - //IconImage { - // visible: notification.image != null; - // source: Qt.resolvedUrl(notification.image); - // implicitSize: 25; - //} - - Layout.fillWidth: true; - } - } -} - diff --git a/.stversions/bar/notifications/Toast~20241229-183725.qml b/.stversions/bar/notifications/Toast~20241229-183725.qml deleted file mode 100644 index abf22fd..0000000 --- a/.stversions/bar/notifications/Toast~20241229-183725.qml +++ /dev/null @@ -1,105 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Quickshell -import Quickshell.Widgets -import Quickshell.Services.Notifications -import "../.." - -Rectangle { - required property var notification - - radius: 5; - color: ShellGlobals.colors.bar; - border.color: notificationArea.containsMouse - ? ShellGlobals.colors.highlight - : ShellGlobals.colors.light; - border.width: 2; - width: parent.width; - height: column.implicitHeight + 20; - - MouseArea { - id: notificationArea; - hoverEnabled: true; - anchors.fill: parent; - } - - ColumnLayout { - id: column; - spacing: 5; - - anchors { - fill: parent; - margins: 10; - } - - RowLayout { - spacing: 5; - Layout.fillWidth: true; - - //IconImage { - // visible: notification.appIcon == null; - // source: Qt.resolvedUrl(notification.appIcon); - // implicitSize: 25; - //} - - Text { - id: summaryText - text: notification.summary - color: ShellGlobals.colors.text - font.pointSize: 14 - font.bold: true - wrapMode: Text.Wrap; - Layout.fillWidth: true - Layout.alignment: Qt.AlignBottom; - } - - Item { - width: 16; - height: 16; - Layout.alignment: Qt.AlighRight | Qt.AlignTop; - - Rectangle { - color: "#FF474D"; - radius: 5; - visible: closeButtonArea.containsMouse; - anchors.fill: parent; - } - - MouseArea { - id: closeButtonArea; - hoverEnabled: true; - anchors.fill: parent; - onPressed: { - notification.dismiss(); - } - } - - IconImage { - source: "image://icon/window-close"; - implicitSize: 28; - anchors.centerIn: parent; - } - } - } - - RowLayout { - Text { - id: bodyText - text: notification.body - color: ShellGlobals.colors.text - font.pointSize: 11; - wrapMode: Text.Wrap - Layout.fillWidth: true - } - - //IconImage { - // visible: notification.image != null; - // source: Qt.resolvedUrl(notification.image); - // implicitSize: 25; - //} - - Layout.fillWidth: true; - } - } -} - diff --git a/.stversions/bar/notifications/Toast~20241229-183824.qml b/.stversions/bar/notifications/Toast~20241229-183824.qml deleted file mode 100644 index c0e6076..0000000 --- a/.stversions/bar/notifications/Toast~20241229-183824.qml +++ /dev/null @@ -1,105 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Quickshell -import Quickshell.Widgets -import Quickshell.Services.Notifications -import "../.." - -Rectangle { - required property var notification - - radius: 5; - color: ShellGlobals.colors.bar; - border.color: notificationArea.containsMouse - ? ShellGlobals.colors.highlight - : ShellGlobals.colors.light; - border.width: 2; - width: parent.width; - height: column.implicitHeight + 20; - - MouseArea { - id: notificationArea; - hoverEnabled: true; - anchors.fill: parent; - } - - ColumnLayout { - id: column; - spacing: 5; - - anchors { - fill: parent; - margins: 10; - } - - RowLayout { - spacing: 5; - Layout.fillWidth: true; - - //IconImage { - // visible: notification.appIcon == null; - // source: Qt.resolvedUrl(notification.appIcon); - // implicitSize: 25; - //} - - Text { - id: summaryText - text: notification.summary - color: ShellGlobals.colors.text - font.pointSize: 14 - font.bold: true - wrapMode: Text.Wrap; - Layout.fillWidth: true - Layout.alignment: Qt.AlignBottom; - } - - Item { - width: 16; - height: 16; - Layout.alignment: Qt.AlighRight | Qt.AlignTop; - - Rectangle { - color: "#FF474D"; - radius: 5; - visible: closeButtonArea.containsMouse; - anchors.fill: parent; - } - - MouseArea { - id: closeButtonArea; - hoverEnabled: true; - anchors.fill: parent; - onPressed: { - notification.dismiss(); - } - } - - IconImage { - source: "image://icon/window-close"; - implicitSize: 28; - anchors.centerIn: parent; - } - } - } - - RowLayout { - Text { - id: bodyText - text: notification.body - color: ShellGlobals.colors.text - font.pointSize: 11; - wrapMode: Text.Wrap - Layout.fillWidth: true - } - - IconImage { - visible: notification.image != null; - source: Qt.resolvedUrl(notification.image); - implicitSize: 25; - } - - Layout.fillWidth: true; - } - } -} - diff --git a/.stversions/bar/notifications/Toast~20241229-184059.qml b/.stversions/bar/notifications/Toast~20241229-184059.qml deleted file mode 100644 index 63cff72..0000000 --- a/.stversions/bar/notifications/Toast~20241229-184059.qml +++ /dev/null @@ -1,105 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Quickshell -import Quickshell.Widgets -import Quickshell.Services.Notifications -import "../.." - -Rectangle { - required property var notification - - radius: 5; - color: ShellGlobals.colors.bar; - border.color: notificationArea.containsMouse - ? ShellGlobals.colors.highlight - : ShellGlobals.colors.light; - border.width: 2; - width: parent.width; - height: column.implicitHeight + 20; - - MouseArea { - id: notificationArea; - hoverEnabled: true; - anchors.fill: parent; - } - - ColumnLayout { - id: column; - spacing: 5; - - anchors { - fill: parent; - margins: 10; - } - - RowLayout { - spacing: 5; - Layout.fillWidth: true; - - IconImage { - visible: notification.appIcon == null; - source: Qt.resolvedUrl(notification.appIcon); - implicitSize: 25; - } - - Text { - id: summaryText - text: notification.summary - color: ShellGlobals.colors.text - font.pointSize: 14 - font.bold: true - wrapMode: Text.Wrap; - Layout.fillWidth: true - Layout.alignment: Qt.AlignBottom; - } - - Item { - width: 16; - height: 16; - Layout.alignment: Qt.AlighRight | Qt.AlignTop; - - Rectangle { - color: "#FF474D"; - radius: 5; - visible: closeButtonArea.containsMouse; - anchors.fill: parent; - } - - MouseArea { - id: closeButtonArea; - hoverEnabled: true; - anchors.fill: parent; - onPressed: { - notification.dismiss(); - } - } - - IconImage { - source: "image://icon/window-close"; - implicitSize: 28; - anchors.centerIn: parent; - } - } - } - - RowLayout { - Text { - id: bodyText - text: notification.body - color: ShellGlobals.colors.text - font.pointSize: 11; - wrapMode: Text.Wrap - Layout.fillWidth: true - } - - IconImage { - visible: notification.image != null; - source: Qt.resolvedUrl(notification.image); - implicitSize: 25; - } - - Layout.fillWidth: true; - } - } -} - diff --git a/.stversions/bar/notifications/Toast~20250307-175400.qml b/.stversions/bar/notifications/Toast~20250307-175400.qml deleted file mode 100644 index c1a69b7..0000000 --- a/.stversions/bar/notifications/Toast~20250307-175400.qml +++ /dev/null @@ -1,215 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Qt5Compat.GraphicalEffects -import Quickshell -import Quickshell.Widgets -import Quickshell.Services.Notifications -import ".." -import "../.." - -Rectangle { - required property var notification; - - id: notificationRoot; - radius: 5; - color: ShellGlobals.colors.window; - width: parent.width; - height: column.implicitHeight + 30; - - layer.enabled: true - layer.effect: DropShadow { - transparentBorder: true; - spread: 0.01; - samples: 25; - color: "#80000000"; - } - - Item { - property int totalDuration: 5000; - property int remainingTime: totalDuration; - property bool isRunning: false; - property real lastTime: 0; - - id: timerController; - - Timer { - id: internalTimer; - interval: 16; - repeat: true; - running: timerController.isRunning; - - onTriggered: { - var currentTime = Date.now() - if (timerController.lastTime > 0) { - var delta = currentTime - timerController.lastTime; - timerController.remainingTime -= delta; - if (timerController.remainingTime <= 0) { - timerController.isRunning = false; - notification.expire(); - } - } - timerController.lastTime = currentTime; - } - } - - function start() { - if (!isRunning) { - lastTime = Date.now(); - isRunning = true; - } - } - - function pause() { - isRunning = false; - lastTime = 0; - } - - Component.onCompleted: { - start(); - } - } - - MouseArea { - id: notificationArea; - hoverEnabled: true; - anchors.fill: parent; - - onContainsMouseChanged: { - progressAnimation.paused = containsMouse; - if (containsMouse) { - timerController.pause(); - } else { - timerController.start(); - } - } - } - - RowLayout { - id: column; - spacing: 5; - - anchors { - fill: parent; - margins: 15; - } - - ColumnLayout { - Layout.fillWidth: true; - - RowLayout { - id: topRow; - spacing: 10; - - IconImage { - visible: notification.appIcon != ""; - source: Quickshell.iconPath(notification.appIcon); - implicitSize: 24; - } - - RowLayout { - Text { - id: appName; - text: notification.appName; - color: ShellGlobals.colors.text; - font.pointSize: 11; - font.bold: true; - wrapMode: Text.Wrap; - Layout.fillWidth: false; - } - - Separator {} - - Text { - id: summaryText; - text: notification.summary; - color: ShellGlobals.colors.text; - font.pointSize: 11; - wrapMode: Text.Wrap; - Layout.fillWidth: true; - } - } - - Item { - id: closeButton; - width: 24; - height: 24; - Layout.alignment: Qt.AlignTop; - - Canvas { - id: progressCircle; - anchors.fill: parent; - antialiasing: true; - - property real progress: 1.0; - onProgressChanged: requestPaint(); - - onPaint: { - var ctx = getContext("2d"); - ctx.reset(); - - var centerX = width / 2; - var centerY = height / 2; - var radius = Math.min(width, height) / 2 - 2; - - ctx.beginPath(); - ctx.arc(centerX, centerY, radius, -Math.PI / 2, -Math.PI / 2 + 2 * Math.PI * progress); - ctx.strokeStyle = ShellGlobals.colors.highlight; - ctx.lineWidth = 2; - ctx.stroke(); - } - } - - NumberAnimation { - id: progressAnimation; - target: progressCircle; - property: "progress"; - from: 1.0; - to: 0.0; - duration: 5000; - running: true; - easing.type: Easing.Linear; - } - - Rectangle { - id: closeButtonBg; - anchors.centerIn: parent; - width: 16; - height: 16; - color: "#FF474D"; - radius: 10; - visible: closeButtonArea.containsMouse; - } - - MouseArea { - id: closeButtonArea; - hoverEnabled: true; - anchors.fill: parent; - onPressed: { - notification.dismiss(); - } - } - - IconImage { - source: "image://icon/window-close"; - implicitSize: 16; - anchors.centerIn: parent; - } - } - } - - RowLayout { - ColumnLayout { - Text { - id: bodyText; - text: notification.body; - color: ShellGlobals.colors.text; - font.pointSize: 11; - wrapMode: Text.Wrap; - Layout.fillWidth: true; - } - } - } - } - } -} - diff --git a/.stversions/bar/volume/Button~20250509-203451.qml b/.stversions/bar/volume/Button~20250509-203451.qml deleted file mode 100644 index 2d0d7da..0000000 --- a/.stversions/bar/volume/Button~20250509-203451.qml +++ /dev/null @@ -1,35 +0,0 @@ -import QtQuick -import Quickshell -import "../../widgets/" as Widgets -import "../.." - - -Widgets.IconButton { - required property var bar; - - id: iconButton - implicitSize: 20 - source: "root:/resources/volume/volume-full.svg" - padding: 2 - - onClicked:{ - if (volumeControl.visible) { - volumeControl.hide() - } - else { - volumeControl.show() - } - } - - ControlPanel { - id: volumeControl - - anchor { - window: bar - - onAnchoring: { - anchor.rect = mapToItem(bar.contentItem, 0, bar.height, width , 0); - } - } - } -} diff --git a/.stversions/bar/volume/Card~20250509-203451.qml b/.stversions/bar/volume/Card~20250509-203451.qml deleted file mode 100644 index 569f2c4..0000000 --- a/.stversions/bar/volume/Card~20250509-203451.qml +++ /dev/null @@ -1,76 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Quickshell.Services.Pipewire -import "../.." -import "../../widgets/" as Widgets - -Rectangle { - id: root - required property PwNode node - color: ShellGlobals.colors.light - radius: 5 - - PwObjectTracker { - id: defaultSourceTracker - objects: [root.node] - } - - RowLayout { - anchors.fill: parent - spacing: 8 - - Widgets.IconButton { - source: { - if (!node.properties["application.icon-name"]) { - return root.node.audio.muted ? "root:resources/volume/volume-mute.svg" : "root:resources/volume/volume-full.svg"; - } else { - return `image://icon/${node.properties["application.icon-name"]}`; - } - } - - implicitSize: 32 - padding: 4 - Layout.alignment: Qt.AlignVCenter - Layout.leftMargin: 5 - - onClicked: { - root.node.audio.muted = !root.node.audio.muted; - } - } - - ColumnLayout { - spacing: 4 - Layout.fillWidth: true - Layout.fillHeight: true - - Text { - color: ShellGlobals.colors.text - text: { - // Taken from quickshell-examples - const app = node.properties["application.name"] ?? (node.description != "" ? node.description : node.name); - const media = node.properties["media.name"]; - return media != undefined ? `${app} - ${media}` : app; - } - - font.bold: true - - elide: Text.ElideRight - Layout.fillWidth: true - Layout.topMargin: 5 - Layout.rightMargin: 5 - Layout.bottomMargin: 5 - } - - Widgets.RoundSlider { - implicitHeight: 7 - from: 0 - to: 1 - value: root.node.audio.volume - onValueChanged: node.audio.volume = value - Layout.fillWidth: true - Layout.rightMargin: 10 - Layout.bottomMargin: 5 - } - } - } -} diff --git a/.stversions/bar/volume/ControlPanel~20250509-203451.qml b/.stversions/bar/volume/ControlPanel~20250509-203451.qml deleted file mode 100644 index 0488048..0000000 --- a/.stversions/bar/volume/ControlPanel~20250509-203451.qml +++ /dev/null @@ -1,117 +0,0 @@ -import QtQuick -import QtQuick.Controls -import QtQuick.Layouts -import Qt5Compat.GraphicalEffects -import Quickshell -import Quickshell.Services.Pipewire -import "../.." - -PopupWindow { - id: root - width: mainContainer.width + 10 - height: mainContainer.height + 10 - color: "transparent" - visible: mainContainer.opacity > 0 - - function show() { - mainContainer.opacity = 1; - } - - function hide() { - mainContainer.opacity = 0; - } - - HoverHandler { - id: hoverHandler - enabled: true - acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad - onHoveredChanged: { - if (hovered == false) { - hide(); - } - } - } - - Rectangle { - id: mainContainer - width: 400 - height: 400 - color: ShellGlobals.colors.base - radius: 5 - opacity: 0 - anchors.centerIn: parent - - layer.enabled: true - layer.effect: DropShadow { - transparentBorder: true - spread: 0.02 - samples: 25 - color: "#80000000" - } - - Behavior on opacity { - NumberAnimation { - duration: 300 - easing.type: Easing.OutCubic - } - } - - ColumnLayout { - id: mainColumn - spacing: 10 - Layout.fillWidth: true - Layout.preferredWidth: parent.width - Layout.margins: 10 - - anchors { - top: parent.top - left: parent.left - right: parent.right - margins: 10 - } - - PwNodeLinkTracker { - id: linkTracker - node: Pipewire.defaultAudioSink - } - - Card { - node: Pipewire.defaultAudioSink - Layout.fillWidth: true - Layout.preferredHeight: 50 - } - - Rectangle { - Layout.fillWidth: true - color: ShellGlobals.colors.light - implicitHeight: 2 - radius: 1 - } - - ScrollView { - Layout.fillWidth: true - Layout.fillHeight: true - ScrollBar.vertical.policy: ScrollBar.AlwaysOff - ScrollBar.horizontal.policy: ScrollBar.AlwaysOff - contentWidth: availableWidth - - ColumnLayout { - width: parent.width - spacing: 10 - - Repeater { - model: linkTracker.linkGroups - - Card { - required property PwLinkGroup modelData - - node: modelData.source - Layout.fillWidth: true - Layout.preferredHeight: 45 - } - } - } - } - } - } -} diff --git a/.stversions/launcher/Controller~20250307-175400.qml b/.stversions/launcher/Controller~20250307-175400.qml deleted file mode 100644 index a7a1402..0000000 --- a/.stversions/launcher/Controller~20250307-175400.qml +++ /dev/null @@ -1,285 +0,0 @@ -pragma Singleton -pragma ComponentBehavior: Bound - -import QtQuick -import QtQuick.Layouts -import QtQuick.Controls -import Qt5Compat.GraphicalEffects -import Quickshell -import Quickshell.Io -import Quickshell.Wayland -import Quickshell.Widgets -import Quickshell.Services.SystemTray -import ".." - -Singleton { - PersistentProperties { - id: persist - property bool launcherOpen: false; - } - - IpcHandler { - target: "launcher" - - function open(): void { - persist.launcherOpen = true; - } - - function close(): void { - persist.launcherOpen = false; - } - - function toggle(): void { - persist.launcherOpen = !persist.launcherOpen - } - } - - LazyLoader { - id: loader - activeAsync: persist.launcherOpen - - PanelWindow { - width: 500 - height: 7 + searchContainer.implicitHeight + list.topMargin * 2 + list.delegateHeight * 10 - color: "transparent" - WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive - WlrLayershell.namespace: "shell:launcher" - - Rectangle { - Behavior on height { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } } - color: ShellGlobals.colors.window - radius: 5 - - layer.enabled: true; - layer.effect: DropShadow { - transparentBorder: true; - spread: 0.02; - samples: 25; - color: "#80000000"; - } - - anchors { - fill: parent - margins: 10; - } - - ColumnLayout { - anchors.fill: parent - anchors.margins: 7 - anchors.bottomMargin: 0 - spacing: 0 - - Rectangle { - id: searchContainer - Layout.fillWidth: true - implicitHeight: searchbox.implicitHeight + 10 - radius: 3 - color: ShellGlobals.colors.midlight; - border.color: ShellGlobals.colors.light; - - RowLayout { - id: searchbox - anchors.fill: parent - anchors.margins: 5 - - TextInput { - id: search; - Layout.fillWidth: true; - color: ShellGlobals.colors.text; - - focus: true - Keys.forwardTo: [list] - Keys.onEscapePressed: persist.launcherOpen = false - - Keys.onPressed: event => { - if (event.modifiers & Qt.ControlModifier) { - if (event.key == Qt.Key_J) { - list.currentIndex = list.currentIndex == list.count - 1 ? 0 : list.currentIndex + 1; - event.accepted = true; - } else if (event.key == Qt.Key_K) { - list.currentIndex = list.currentIndex == 0 ? list.count - 1 : list.currentIndex - 1; - event.accepted = true; - } - } - } - - onAccepted: { - if (list.currentItem) { - list.currentItem.clicked(null); - } - } - - onTextChanged: { - list.currentIndex = 0; - } - } - } - } - - ListView { - id: list - Layout.fillWidth: true - Layout.fillHeight: true - clip: true - cacheBuffer: 0 // works around QTBUG-131106 - //reuseItems: true - model: ScriptModel { - values: DesktopEntries.applications.values - .map(object => { - const stxt = search.text.toLowerCase(); - const ntxt = object.name.toLowerCase(); - let si = 0; - let ni = 0; - - let matches = []; - let startMatch = -1; - - for (let si = 0; si != stxt.length; ++si) { - const sc = stxt[si]; - - while (true) { - // Drop any entries with letters that don't exist in order - if (ni == ntxt.length) return null; - - const nc = ntxt[ni++]; - - if (nc == sc) { - if (startMatch == -1) startMatch = ni; - break; - } else { - if (startMatch != -1) { - matches.push({ - index: startMatch, - length: ni - startMatch, - }); - - startMatch = -1; - } - } - } - } - - if (startMatch != -1) { - matches.push({ - index: startMatch, - length: ni - startMatch + 1, - }); - } - - return { - object: object, - matches: matches, - }; - }) - .filter(entry => entry !== null) - .sort((a, b) => { - let ai = 0; - let bi = 0; - let s = 0; - - while (ai != a.matches.length && bi != b.matches.length) { - const am = a.matches[ai]; - const bm = b.matches[bi]; - - s = bm.length - am.length; - if (s != 0) return s; - - s = am.index - bm.index; - if (s != 0) return s; - - ++ai; - ++bi; - } - - s = a.matches.length - b.matches.length; - if (s != 0) return s; - - s = a.object.name.length - b.object.name.length; - if (s != 0) return s; - - return a.object.name.localeCompare(b.object.name); - }) - .map(entry => entry.object); - - onValuesChanged: list.currentIndex = 0 - } - - topMargin: 7 - bottomMargin: list.count == 0 ? 0 : 7 - - add: Transition { - NumberAnimation { property: "opacity"; from: 0; to: 1; duration: 100 } - } - - displaced: Transition { - NumberAnimation { property: "y"; duration: 200; easing.type: Easing.OutCubic } - NumberAnimation { property: "opacity"; to: 1; duration: 100 } - } - - move: Transition { - NumberAnimation { property: "y"; duration: 200; easing.type: Easing.OutCubic } - NumberAnimation { property: "opacity"; to: 1; duration: 100 } - } - - remove: Transition { - NumberAnimation { property: "y"; duration: 200; easing.type: Easing.OutCubic } - NumberAnimation { property: "opacity"; to: 0; duration: 100 } - } - - highlight: Rectangle { - radius: 5 - color: ShellGlobals.colors.innerHighlight; - border.color: ShellGlobals.colors.highlight; - } - - keyNavigationEnabled: true - keyNavigationWraps: true - highlightMoveVelocity: -1 - highlightMoveDuration: 100 - preferredHighlightBegin: list.topMargin - preferredHighlightEnd: list.height - list.bottomMargin - highlightRangeMode: ListView.ApplyRange - snapMode: ListView.SnapToItem - - readonly property real delegateHeight: 44 - - delegate: MouseArea { - required property DesktopEntry modelData; - - implicitHeight: list.delegateHeight - implicitWidth: ListView.view.width - - onClicked: { - modelData.execute(); - persist.launcherOpen = false; - } - - RowLayout { - id: delegateLayout - anchors { - verticalCenter: parent.verticalCenter - left: parent.left - leftMargin: 5 - } - - IconImage { - Layout.alignment: Qt.AlignVCenter - asynchronous: true - implicitSize: 30 - source: Quickshell.iconPath(modelData.icon) - } - Text { - text: modelData.name - color: ShellGlobals.colors.text; - Layout.alignment: Qt.AlignVCenter - } - } - } - } - } - } - } - } - - function init() {} -} diff --git a/.stversions/launcher/Controller~20250509-203448.qml b/.stversions/launcher/Controller~20250509-203448.qml deleted file mode 100644 index 67abd62..0000000 --- a/.stversions/launcher/Controller~20250509-203448.qml +++ /dev/null @@ -1,321 +0,0 @@ -pragma Singleton -pragma ComponentBehavior: Bound - -import QtQuick -import QtQuick.Layouts -import QtQuick.Controls -import Qt5Compat.GraphicalEffects -import Quickshell -import Quickshell.Io -import Quickshell.Wayland -import Quickshell.Widgets -import Quickshell.Services.SystemTray -import ".." - -Singleton { - PersistentProperties { - id: persist - property bool launcherOpen: false - } - - IpcHandler { - target: "launcher" - - function open(): void { - persist.launcherOpen = true; - } - - function close(): void { - persist.launcherOpen = false; - } - - function toggle(): void { - persist.launcherOpen = !persist.launcherOpen; - } - } - - LazyLoader { - id: loader - activeAsync: persist.launcherOpen - - PanelWindow { - width: 500 - height: 7 + searchContainer.implicitHeight + list.topMargin * 2 + list.delegateHeight * 10 - color: "transparent" - WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive - WlrLayershell.namespace: "shell:launcher" - - Rectangle { - Behavior on height { - NumberAnimation { - duration: 200 - easing.type: Easing.OutCubic - } - } - color: ShellGlobals.colors.base - radius: 5 - - layer.enabled: true - layer.effect: DropShadow { - transparentBorder: true - spread: 0.02 - samples: 25 - color: "#80000000" - } - - anchors { - fill: parent - margins: 10 - } - - ColumnLayout { - anchors.fill: parent - anchors.margins: 7 - anchors.bottomMargin: 0 - spacing: 0 - - Rectangle { - id: searchContainer - Layout.fillWidth: true - implicitHeight: searchbox.implicitHeight + 10 - radius: 3 - color: ShellGlobals.colors.midlight - border.color: ShellGlobals.colors.light - - RowLayout { - id: searchbox - anchors.fill: parent - anchors.margins: 5 - - TextInput { - id: search - Layout.fillWidth: true - color: ShellGlobals.colors.text - - focus: true - Keys.forwardTo: [list] - Keys.onEscapePressed: persist.launcherOpen = false - - Keys.onPressed: event => { - if (event.modifiers & Qt.ControlModifier) { - if (event.key == Qt.Key_J) { - list.currentIndex = list.currentIndex == list.count - 1 ? 0 : list.currentIndex + 1; - event.accepted = true; - } else if (event.key == Qt.Key_K) { - list.currentIndex = list.currentIndex == 0 ? list.count - 1 : list.currentIndex - 1; - event.accepted = true; - } - } - } - - onAccepted: { - if (list.currentItem) { - list.currentItem.clicked(null); - } - } - - onTextChanged: { - list.currentIndex = 0; - } - } - } - } - - ListView { - id: list - Layout.fillWidth: true - Layout.fillHeight: true - clip: true - cacheBuffer: 0 // works around QTBUG-131106 - //reuseItems: true - model: ScriptModel { - values: DesktopEntries.applications.values.map(object => { - const stxt = search.text.toLowerCase(); - const ntxt = object.name.toLowerCase(); - let si = 0; - let ni = 0; - - let matches = []; - let startMatch = -1; - - for (let si = 0; si != stxt.length; ++si) { - const sc = stxt[si]; - - while (true) { - // Drop any entries with letters that don't exist in order - if (ni == ntxt.length) - return null; - - const nc = ntxt[ni++]; - - if (nc == sc) { - if (startMatch == -1) - startMatch = ni; - break; - } else { - if (startMatch != -1) { - matches.push({ - index: startMatch, - length: ni - startMatch - }); - - startMatch = -1; - } - } - } - } - - if (startMatch != -1) { - matches.push({ - index: startMatch, - length: ni - startMatch + 1 - }); - } - - return { - object: object, - matches: matches - }; - }).filter(entry => entry !== null).sort((a, b) => { - let ai = 0; - let bi = 0; - let s = 0; - - while (ai != a.matches.length && bi != b.matches.length) { - const am = a.matches[ai]; - const bm = b.matches[bi]; - - s = bm.length - am.length; - if (s != 0) - return s; - - s = am.index - bm.index; - if (s != 0) - return s; - - ++ai; - ++bi; - } - - s = a.matches.length - b.matches.length; - if (s != 0) - return s; - - s = a.object.name.length - b.object.name.length; - if (s != 0) - return s; - - return a.object.name.localeCompare(b.object.name); - }).map(entry => entry.object) - - onValuesChanged: list.currentIndex = 0 - } - - topMargin: 7 - bottomMargin: list.count == 0 ? 0 : 7 - - add: Transition { - NumberAnimation { - property: "opacity" - from: 0 - to: 1 - duration: 100 - } - } - - displaced: Transition { - NumberAnimation { - property: "y" - duration: 200 - easing.type: Easing.OutCubic - } - NumberAnimation { - property: "opacity" - to: 1 - duration: 100 - } - } - - move: Transition { - NumberAnimation { - property: "y" - duration: 200 - easing.type: Easing.OutCubic - } - NumberAnimation { - property: "opacity" - to: 1 - duration: 100 - } - } - - remove: Transition { - NumberAnimation { - property: "y" - duration: 200 - easing.type: Easing.OutCubic - } - NumberAnimation { - property: "opacity" - to: 0 - duration: 100 - } - } - - highlight: Rectangle { - radius: 5 - color: ShellGlobals.colors.accent - } - - keyNavigationEnabled: true - keyNavigationWraps: true - highlightMoveVelocity: -1 - highlightMoveDuration: 100 - preferredHighlightBegin: list.topMargin - preferredHighlightEnd: list.height - list.bottomMargin - highlightRangeMode: ListView.ApplyRange - snapMode: ListView.SnapToItem - - readonly property real delegateHeight: 44 - - delegate: MouseArea { - required property DesktopEntry modelData - - implicitHeight: list.delegateHeight - implicitWidth: ListView.view.width - - onClicked: { - modelData.execute(); - persist.launcherOpen = false; - } - - RowLayout { - id: delegateLayout - anchors { - verticalCenter: parent.verticalCenter - left: parent.left - leftMargin: 5 - } - - IconImage { - Layout.alignment: Qt.AlignVCenter - asynchronous: true - implicitSize: 30 - source: Quickshell.iconPath(modelData.icon) - } - Text { - text: modelData.name - color: ShellGlobals.colors.text - Layout.alignment: Qt.AlignVCenter - } - } - } - } - } - } - } - } - - function init() { - } -} diff --git a/.stversions/notifications/Notifications~20250509-203451.qml b/.stversions/notifications/Notifications~20250509-203451.qml deleted file mode 100644 index 5916c43..0000000 --- a/.stversions/notifications/Notifications~20250509-203451.qml +++ /dev/null @@ -1,74 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Quickshell -import Quickshell.Services.Notifications -import ".." - -Scope { - id: root - required property var screen - - NotificationServer { - id: notificationServer - actionsSupported: true - persistenceSupported: true - } - - Connections { - target: notificationServer - - function onNotification(notification) { - notificationLoader.item.visible = true; - notification.tracked = true; - } - } - - LazyLoader { - id: notificationLoader - loading: true - - PanelWindow { - id: notificationWindow - color: "transparent" - width: 500 - visible: false - exclusionMode: ExclusionMode.Normal - mask: Region { - item: notifLayout - } - - anchors { - top: true - bottom: true - right: true - } - - margins { - top: 5 - bottom: 5 - right: 5 - } - - ColumnLayout { - id: notifLayout - spacing: 15 - - anchors { - top: parent.top - left: parent.left - right: parent.right - margins: 5 - } - - Repeater { - model: notificationServer.trackedNotifications - - Toast { - required property var modelData - notification: modelData - } - } - } - } - } -} diff --git a/.stversions/notifications/Notifications~20250605-105246.qml b/.stversions/notifications/Notifications~20250605-105246.qml deleted file mode 100644 index e12d7ed..0000000 --- a/.stversions/notifications/Notifications~20250605-105246.qml +++ /dev/null @@ -1,23 +0,0 @@ -pragma Singleton - -import QtQuick -import Quickshell -import Quickshell.Services.Notifications - -Singleton { - property alias notificationServer: notifServer - - NotificationServer { - id: notifServer - actionsSupported: true - persistenceSupported: true - } - - Connections { - target: notifServer - - function onNotification(notification) { - notification.tracked = true; - } - } -} diff --git a/.stversions/notifications/Toast~20250509-203448.qml b/.stversions/notifications/Toast~20250509-203448.qml deleted file mode 100644 index f2176be..0000000 --- a/.stversions/notifications/Toast~20250509-203448.qml +++ /dev/null @@ -1,213 +0,0 @@ -import QtQuick -import QtQuick.Layouts -import Qt5Compat.GraphicalEffects -import Quickshell -import Quickshell.Widgets -import Quickshell.Services.Notifications -import "../widgets/" as Widgets -import ".." -import "../.." - -Rectangle { - id: notificationRoot - required property var notification - radius: 5 - color: ShellGlobals.colors.base - width: parent.width - height: column.implicitHeight + 30 - - layer.enabled: true - layer.effect: DropShadow { - transparentBorder: true - spread: 0.01 - samples: 25 - color: "#80000000" - } - - Item { - id: timerController - property int totalDuration: 5000 - property int remainingTime: totalDuration - property bool isRunning: false - property real lastTime: 0 - - Timer { - id: internalTimer - interval: 16 - repeat: true - running: timerController.isRunning - - onTriggered: { - var currentTime = Date.now(); - if (timerController.lastTime > 0) { - var delta = currentTime - timerController.lastTime; - timerController.remainingTime -= delta; - if (timerController.remainingTime <= 0) { - timerController.isRunning = false; - notification.expire(); - } - } - timerController.lastTime = currentTime; - } - } - - function start() { - if (!isRunning) { - lastTime = Date.now(); - isRunning = true; - } - } - - function pause() { - isRunning = false; - lastTime = 0; - } - - Component.onCompleted: { - start(); - } - } - - MouseArea { - id: notificationArea - hoverEnabled: true - anchors.fill: parent - - onContainsMouseChanged: { - progressAnimation.paused = containsMouse; - if (containsMouse) { - timerController.pause(); - } else { - timerController.start(); - } - } - } - - RowLayout { - id: column - spacing: 5 - - anchors { - fill: parent - margins: 15 - } - - ColumnLayout { - Layout.fillWidth: true - - RowLayout { - id: topRow - spacing: 10 - - IconImage { - visible: notification.appIcon != "" - source: Quickshell.iconPath(notification.appIcon) - implicitSize: 24 - } - - RowLayout { - Text { - id: appName - text: notification.appName - color: ShellGlobals.colors.text - font.pointSize: 11 - font.bold: true - wrapMode: Text.Wrap - Layout.fillWidth: false - } - - Widgets.Separator {} - - Text { - id: summaryText - text: notification.summary - color: ShellGlobals.colors.text - font.pointSize: 11 - wrapMode: Text.Wrap - Layout.fillWidth: true - } - } - - Item { - id: closeButton - width: 24 - height: 24 - Layout.alignment: Qt.AlignTop - - Canvas { - id: progressCircle - anchors.fill: parent - antialiasing: true - - property real progress: 1.0 - onProgressChanged: requestPaint() - - onPaint: { - var ctx = getContext("2d"); - ctx.reset(); - - var centerX = width / 2; - var centerY = height / 2; - var radius = Math.min(width, height) / 2 - 2; - - ctx.beginPath(); - ctx.arc(centerX, centerY, radius, -Math.PI / 2, -Math.PI / 2 + 2 * Math.PI * progress); - ctx.strokeStyle = ShellGlobals.colors.accent; - ctx.lineWidth = 2; - ctx.stroke(); - } - } - - NumberAnimation { - id: progressAnimation - target: progressCircle - property: "progress" - from: 1.0 - to: 0.0 - duration: 5000 - running: true - easing.type: Easing.Linear - } - - Rectangle { - id: closeButtonBg - anchors.centerIn: parent - width: 16 - height: 16 - color: "#FF474D" - radius: 10 - visible: closeButtonArea.containsMouse - } - - MouseArea { - id: closeButtonArea - hoverEnabled: true - anchors.fill: parent - onPressed: { - notification.dismiss(); - } - } - - IconImage { - source: "image://icon/window-close" - implicitSize: 16 - anchors.centerIn: parent - } - } - } - - RowLayout { - ColumnLayout { - Text { - id: bodyText - text: notification.body - color: ShellGlobals.colors.text - font.pointSize: 11 - wrapMode: Text.Wrap - Layout.fillWidth: true - } - } - } - } - } -} diff --git a/.stversions/resources/battery/battery-100~20241228-024204.svg b/.stversions/resources/battery/battery-100~20241228-024204.svg deleted file mode 100644 index e1e66cb..0000000 --- a/.stversions/resources/battery/battery-100~20241228-024204.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/.stversions/resources/battery/battery-100~20250509-203448.svg b/.stversions/resources/battery/battery-100~20250509-203448.svg deleted file mode 100644 index 66b337d..0000000 --- a/.stversions/resources/battery/battery-100~20250509-203448.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/.stversions/resources/battery/battery-charging~20241228-024225.svg b/.stversions/resources/battery/battery-charging~20241228-024225.svg deleted file mode 100644 index 481509a..0000000 --- a/.stversions/resources/battery/battery-charging~20241228-024225.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/.stversions/resources/battery/battery-charging~20250509-203448.svg b/.stversions/resources/battery/battery-charging~20250509-203448.svg deleted file mode 100644 index 39e9d3f..0000000 --- a/.stversions/resources/battery/battery-charging~20250509-203448.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/.stversions/shell~20250307-175400.qml b/.stversions/shell~20250307-175400.qml deleted file mode 100644 index 228c802..0000000 --- a/.stversions/shell~20250307-175400.qml +++ /dev/null @@ -1,24 +0,0 @@ -//@ pragma UseQApplication - -import Quickshell -import QtQuick -import "bar" as Bar -import "launcher" as Launcher - -ShellRoot { - Component.onCompleted: [Launcher.Controller.init()] - - Variants { - model: Quickshell.screens; - - Scope { - property var modelData; - - Bar.Bar { - screen: modelData; - } - } - } - - ReloadPopup {} -} diff --git a/.stversions/shell~20250509-203449.qml b/.stversions/shell~20250509-203449.qml deleted file mode 100644 index 7a99639..0000000 --- a/.stversions/shell~20250509-203449.qml +++ /dev/null @@ -1,51 +0,0 @@ -//@ pragma UseQApplication - -import Quickshell -import Quickshell.Io -import QtQuick -import "bar" as Bar -import "notifications" as Notifications -import "launcher" as Launcher - -ShellRoot { - Component.onCompleted: [Launcher.Controller.init()] - - Variants { - model: { - // Check PriorityScreens for priortized screens, I only want the bar showing on - // screen at a time, because it doesnt make alot of sense to have on multiple - // monitors at a time. - const screens = Quickshell.screens; - console.log("Available Screens: " + screens.map(screen => screen.model)); - - const priorityScreen = PriorityScreens.screens.reduce((found, model) => { - if (found) - return found; - return screens.find(screen => screen.model === model); - }, null); - - return priorityScreen ? [priorityScreen] : []; - } - - Scope { - id: scope - property var modelData - - Bar.Bar { - screen: scope.modelData - } - - Notifications.Notifications { - screen: scope.modelData - } - - Process { - id: xPrimaryMoniorSetter - running: true - command: ["xrandr", "--output", scope.modelData.name, "--primary"] - } - } - } - - ReloadPopup {} -} diff --git a/.stversions/widgets/IconButton~20250307-175400.qml b/.stversions/widgets/IconButton~20250307-175400.qml deleted file mode 100644 index 547e13d..0000000 --- a/.stversions/widgets/IconButton~20250307-175400.qml +++ /dev/null @@ -1,42 +0,0 @@ -import QtQuick -import QtQuick.Effects -import Quickshell.Widgets -import ".." - -Item { - property string source; - property var implicitSize; - property var padding: 0; - property var radius: 5; - signal clicked(); - - id: root; - implicitWidth: implicitSize; - implicitHeight: implicitSize; - - Rectangle { - id: iconBackground; - color: ShellGlobals.colors.innerHighlight; - border.color: ShellGlobals.colors.highlight; - radius: root.radius; - visible: iconButton.containsMouse; - anchors.fill: parent; - } - - IconImage { - id: iconImage; - source: root.source; - - anchors { - fill: parent; - margins: padding; - } - } - - MouseArea { - id: iconButton; - hoverEnabled: true; - anchors.fill: parent; - onPressed: root.clicked(); - } -} diff --git a/.stversions/widgets/IconButton~20250509-203449.qml b/.stversions/widgets/IconButton~20250509-203449.qml deleted file mode 100644 index d7a2bf5..0000000 --- a/.stversions/widgets/IconButton~20250509-203449.qml +++ /dev/null @@ -1,40 +0,0 @@ -import QtQuick -import Quickshell.Widgets -import ".." - -Item { - id: root - property string source - property var implicitSize: 24 // Default size if not specified - property var padding: 0 - property var radius: 5 - signal clicked - - implicitWidth: implicitSize - implicitHeight: implicitSize - - Rectangle { - id: iconBackground - color: ShellGlobals.colors.accent - radius: root.radius - visible: iconButton.containsMouse - anchors.fill: parent - } - - IconImage { - id: iconImage - source: root.source - - anchors { - fill: parent - margins: root.padding - } - } - - MouseArea { - id: iconButton - hoverEnabled: true - anchors.fill: parent - onPressed: root.clicked() - } -} diff --git a/.stversions/widgets/RoundSlider~20250509-203448.qml b/.stversions/widgets/RoundSlider~20250509-203448.qml deleted file mode 100644 index 0cfa5a6..0000000 --- a/.stversions/widgets/RoundSlider~20250509-203448.qml +++ /dev/null @@ -1,60 +0,0 @@ -import QtQuick -import QtQuick.Controls -import Qt5Compat.GraphicalEffects -import ".." - -Slider { - id: slider - - background: Rectangle { - id: sliderContainer - width: slider.availableWidth - height: slider.implicitHeight - color: "white" - radius: 4 - - layer.enabled: true - layer.effect: OpacityMask { - source: Rectangle { - width: sliderContainer.width - height: sliderContainer.height - radius: sliderContainer.radius - color: "white" - } - - maskSource: Rectangle { - width: sliderContainer.width - height: sliderContainer.height - radius: sliderContainer.radius - color: "black" - } - } - - Rectangle { - id: handle - width: sliderContainer.width * (slider.value / slider.to) - height: sliderContainer.height - color: ShellGlobals.colors.accent - } - } - - handle: Rectangle { - x: slider.leftPadding + slider.visualPosition * (slider.availableWidth - width) - y: slider.topPadding + slider.availableHeight / 2 - height / 2 - width: 16 - height: 16 - radius: width / 2 - color: slider.pressed ? ShellGlobals.colors.accent.darker(1.2) : ShellGlobals.colors.accent - - layer.enabled: true - layer.effect: DropShadow { - horizontalOffset: 0 - verticalOffset: 1 - radius: 4.0 - samples: 9 - color: "#30000000" - } - } - - //handle: Item {} -} diff --git a/.stversions/widgets/Separator~20250509-203449.qml b/.stversions/widgets/Separator~20250509-203449.qml deleted file mode 100644 index fda1023..0000000 --- a/.stversions/widgets/Separator~20250509-203449.qml +++ /dev/null @@ -1,9 +0,0 @@ -import QtQuick -import ".." - -Rectangle { - color: ShellGlobals.colors.accent - radius: 5 - width: 7.5 - height: 7.5 -}