Compare commits
62 changed files with 453 additions and 502 deletions
|
|
@ -25,7 +25,7 @@ stdenvNoCC.mkDerivation {
|
||||||
runHook preInstall
|
runHook preInstall
|
||||||
|
|
||||||
mkdir -p $out/share/nova-shell
|
mkdir -p $out/share/nova-shell
|
||||||
cp -r shell/shell.qml shell/modules shell/services shell/applets shell/lock shell/assets $out/share/nova-shell/
|
cp -r shell/shell.qml shell/modules shell/lock shell/assets $out/share/nova-shell/
|
||||||
|
|
||||||
# Compile fragment shader to Qt RHI format
|
# Compile fragment shader to Qt RHI format
|
||||||
qsb --qt6 \
|
qsb --qt6 \
|
||||||
|
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
module applets
|
|
||||||
HexWaveBackground 1.0 HexWaveBackground.qml
|
|
||||||
VolumeApplet 1.0 VolumeApplet.qml
|
|
||||||
MprisApplet 1.0 MprisApplet.qml
|
|
||||||
CpuApplet 1.0 CpuApplet.qml
|
|
||||||
MemoryApplet 1.0 MemoryApplet.qml
|
|
||||||
TemperatureApplet 1.0 TemperatureApplet.qml
|
|
||||||
DiskApplet 1.0 DiskApplet.qml
|
|
||||||
|
|
@ -2,7 +2,7 @@ import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Io
|
import Quickshell.Io
|
||||||
import Quickshell.Wayland
|
import Quickshell.Wayland
|
||||||
import "../services" as M
|
import "../modules" as M
|
||||||
|
|
||||||
Scope {
|
Scope {
|
||||||
id: root
|
id: root
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import "../services" as M
|
import "../modules" as M
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
id: root
|
id: root
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,8 @@ import Quickshell
|
||||||
import Quickshell.Wayland
|
import Quickshell.Wayland
|
||||||
import Quickshell.Services.Mpris
|
import Quickshell.Services.Mpris
|
||||||
import Quickshell.Services.Pipewire
|
import Quickshell.Services.Pipewire
|
||||||
import "../services" as M
|
import "../modules" as M
|
||||||
import "../applets" as C
|
import "../modules/content" as C
|
||||||
|
|
||||||
WlSessionLockSurface {
|
WlSessionLockSurface {
|
||||||
id: root
|
id: root
|
||||||
|
|
@ -179,7 +179,7 @@ WlSessionLockSurface {
|
||||||
readonly property var _mprisPlayer: _mprisPlayers[0] ?? null
|
readonly property var _mprisPlayer: _mprisPlayers[0] ?? null
|
||||||
readonly property bool _playing: _mprisPlayer?.playbackState === MprisPlaybackState.Playing
|
readonly property bool _playing: _mprisPlayer?.playbackState === MprisPlaybackState.Playing
|
||||||
|
|
||||||
C.MprisApplet {
|
C.MprisContent {
|
||||||
id: _mprisContent
|
id: _mprisContent
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
|
|
@ -209,7 +209,7 @@ WlSessionLockSurface {
|
||||||
objects: [Pipewire.defaultAudioSink]
|
objects: [Pipewire.defaultAudioSink]
|
||||||
}
|
}
|
||||||
|
|
||||||
C.VolumeApplet {
|
C.VolumeContent {
|
||||||
id: _volumeContent
|
id: _volumeContent
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ import QtQuick.Effects
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Wayland
|
import Quickshell.Wayland
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
PanelWindow {
|
PanelWindow {
|
||||||
id: root
|
id: root
|
||||||
|
|
@ -45,9 +44,9 @@ PanelWindow {
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
text: Qt.formatDateTime(clock.date, "HH")
|
text: Qt.formatDateTime(clock.date, "HH")
|
||||||
color: S.Theme.base0D
|
color: M.Theme.base0D
|
||||||
font.pixelSize: 72
|
font.pixelSize: 72
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
font.bold: true
|
font.bold: true
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
|
|
@ -55,22 +54,22 @@ PanelWindow {
|
||||||
text: ":"
|
text: ":"
|
||||||
color: colon._colors[colon._colorIdx % colon._colors.length]
|
color: colon._colors[colon._colorIdx % colon._colors.length]
|
||||||
Behavior on color {
|
Behavior on color {
|
||||||
enabled: !S.Theme.reducedMotion
|
enabled: !M.Theme.reducedMotion
|
||||||
ColorAnimation {
|
ColorAnimation {
|
||||||
duration: 500
|
duration: 500
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
font.pixelSize: 72
|
font.pixelSize: 72
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
font.bold: true
|
font.bold: true
|
||||||
opacity: colon.opacity
|
opacity: colon.opacity
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
Text {
|
Text {
|
||||||
text: Qt.formatDateTime(clock.date, "mm")
|
text: Qt.formatDateTime(clock.date, "mm")
|
||||||
color: S.Theme.base0E
|
color: M.Theme.base0E
|
||||||
font.pixelSize: 72
|
font.pixelSize: 72
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
font.bold: true
|
font.bold: true
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
|
|
@ -80,7 +79,7 @@ PanelWindow {
|
||||||
source: glowSource
|
source: glowSource
|
||||||
anchors.fill: glowSource
|
anchors.fill: glowSource
|
||||||
shadowEnabled: true
|
shadowEnabled: true
|
||||||
shadowColor: S.Theme.base0D
|
shadowColor: M.Theme.base0D
|
||||||
shadowBlur: 1.0
|
shadowBlur: 1.0
|
||||||
shadowVerticalOffset: 0
|
shadowVerticalOffset: 0
|
||||||
shadowHorizontalOffset: 0
|
shadowHorizontalOffset: 0
|
||||||
|
|
@ -93,10 +92,10 @@ PanelWindow {
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
text: Qt.formatDateTime(clock.date, "HH")
|
text: Qt.formatDateTime(clock.date, "HH")
|
||||||
color: S.Theme.base0D
|
color: M.Theme.base0D
|
||||||
opacity: 0.85
|
opacity: 0.85
|
||||||
font.pixelSize: 72
|
font.pixelSize: 72
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
font.bold: true
|
font.bold: true
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
|
|
@ -104,16 +103,16 @@ PanelWindow {
|
||||||
id: colon
|
id: colon
|
||||||
text: ":"
|
text: ":"
|
||||||
font.pixelSize: 72
|
font.pixelSize: 72
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
font.bold: true
|
font.bold: true
|
||||||
opacity: 0.85
|
opacity: 0.85
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
|
||||||
property int _colorIdx: 0
|
property int _colorIdx: 0
|
||||||
readonly property var _colors: [S.Theme.base08, S.Theme.base09, S.Theme.base0A, S.Theme.base0B, S.Theme.base0C, S.Theme.base0D, S.Theme.base0E, S.Theme.base05]
|
readonly property var _colors: [M.Theme.base08, M.Theme.base09, M.Theme.base0A, M.Theme.base0B, M.Theme.base0C, M.Theme.base0D, M.Theme.base0E, M.Theme.base05]
|
||||||
color: _colors[_colorIdx % _colors.length]
|
color: _colors[_colorIdx % _colors.length]
|
||||||
Behavior on color {
|
Behavior on color {
|
||||||
enabled: !S.Theme.reducedMotion
|
enabled: !M.Theme.reducedMotion
|
||||||
ColorAnimation {
|
ColorAnimation {
|
||||||
duration: 500
|
duration: 500
|
||||||
}
|
}
|
||||||
|
|
@ -141,7 +140,7 @@ PanelWindow {
|
||||||
Connections {
|
Connections {
|
||||||
target: clock
|
target: clock
|
||||||
function onDateChanged() {
|
function onDateChanged() {
|
||||||
if (S.Theme.reducedMotion)
|
if (M.Theme.reducedMotion)
|
||||||
return;
|
return;
|
||||||
colon._colorIdx++;
|
colon._colorIdx++;
|
||||||
colonAnim.restart();
|
colonAnim.restart();
|
||||||
|
|
@ -150,10 +149,10 @@ PanelWindow {
|
||||||
}
|
}
|
||||||
Text {
|
Text {
|
||||||
text: Qt.formatDateTime(clock.date, "mm")
|
text: Qt.formatDateTime(clock.date, "mm")
|
||||||
color: S.Theme.base0E
|
color: M.Theme.base0E
|
||||||
opacity: 0.85
|
opacity: 0.85
|
||||||
font.pixelSize: 72
|
font.pixelSize: 72
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
font.bold: true
|
font.bold: true
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
|
|
@ -165,16 +164,16 @@ PanelWindow {
|
||||||
id: dateText
|
id: dateText
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
text: Qt.formatDateTime(clock.date, "dddd, dd MMMM yyyy")
|
text: Qt.formatDateTime(clock.date, "dddd, dd MMMM yyyy")
|
||||||
color: S.Theme.base05
|
color: M.Theme.base05
|
||||||
opacity: 0.5
|
opacity: 0.5
|
||||||
font.pixelSize: 18
|
font.pixelSize: 18
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
font.letterSpacing: 4
|
font.letterSpacing: 4
|
||||||
|
|
||||||
layer.enabled: true
|
layer.enabled: true
|
||||||
layer.effect: MultiEffect {
|
layer.effect: MultiEffect {
|
||||||
shadowEnabled: true
|
shadowEnabled: true
|
||||||
shadowColor: S.Theme.base0D
|
shadowColor: M.Theme.base0D
|
||||||
shadowBlur: 0.4
|
shadowBlur: 0.4
|
||||||
shadowVerticalOffset: 0
|
shadowVerticalOffset: 0
|
||||||
shadowHorizontalOffset: 0
|
shadowHorizontalOffset: 0
|
||||||
|
|
@ -189,7 +188,7 @@ PanelWindow {
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
color: S.Theme.base02
|
color: M.Theme.base02
|
||||||
radius: 1
|
radius: 1
|
||||||
opacity: 0.3
|
opacity: 0.3
|
||||||
}
|
}
|
||||||
|
|
@ -198,7 +197,7 @@ PanelWindow {
|
||||||
height: parent.height
|
height: parent.height
|
||||||
color: colon._colors[colon._colorIdx % colon._colors.length]
|
color: colon._colors[colon._colorIdx % colon._colors.length]
|
||||||
Behavior on color {
|
Behavior on color {
|
||||||
enabled: !S.Theme.reducedMotion
|
enabled: !M.Theme.reducedMotion
|
||||||
ColorAnimation {
|
ColorAnimation {
|
||||||
duration: 500
|
duration: 500
|
||||||
}
|
}
|
||||||
|
|
@ -207,7 +206,7 @@ PanelWindow {
|
||||||
opacity: 0.6
|
opacity: 0.6
|
||||||
|
|
||||||
Behavior on width {
|
Behavior on width {
|
||||||
enabled: !S.Theme.reducedMotion
|
enabled: !M.Theme.reducedMotion
|
||||||
NumberAnimation {
|
NumberAnimation {
|
||||||
duration: 50
|
duration: 50
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,11 @@ import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Io
|
import Quickshell.Io
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
M.BarSection {
|
M.BarSection {
|
||||||
id: root
|
id: root
|
||||||
spacing: S.Theme.moduleSpacing
|
spacing: M.Theme.moduleSpacing
|
||||||
opacity: S.Modules.backlight.enable && percent > 0 ? 1 : 0
|
opacity: M.Modules.backlight.enable && percent > 0 ? 1 : 0
|
||||||
visible: opacity > 0
|
visible: opacity > 0
|
||||||
tooltip: ""
|
tooltip: ""
|
||||||
|
|
||||||
|
|
@ -45,7 +44,7 @@ M.BarSection {
|
||||||
}
|
}
|
||||||
|
|
||||||
function adjust(delta) {
|
function adjust(delta) {
|
||||||
const step = S.Modules.backlight.step || 5;
|
const step = M.Modules.backlight.step || 5;
|
||||||
adjProc.cmd = delta > 0 ? "light -A " + step : "light -U " + step;
|
adjProc.cmd = delta > 0 ? "light -A " + step : "light -U " + step;
|
||||||
adjProc.running = true;
|
adjProc.running = true;
|
||||||
}
|
}
|
||||||
|
|
@ -124,8 +123,8 @@ M.BarSection {
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
text: "\uF185"
|
text: "\uF185"
|
||||||
color: root.accentColor
|
color: root.accentColor
|
||||||
font.pixelSize: S.Theme.fontSize + 2
|
font.pixelSize: M.Theme.fontSize + 2
|
||||||
font.family: S.Theme.iconFontFamily
|
font.family: M.Theme.iconFontFamily
|
||||||
}
|
}
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
|
|
@ -139,7 +138,7 @@ M.BarSection {
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
color: S.Theme.base02
|
color: M.Theme.base02
|
||||||
radius: 3
|
radius: 3
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -177,9 +176,9 @@ M.BarSection {
|
||||||
anchors.rightMargin: 12
|
anchors.rightMargin: 12
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
text: root.percent + "%"
|
text: root.percent + "%"
|
||||||
color: S.Theme.base05
|
color: M.Theme.base05
|
||||||
font.pixelSize: S.Theme.fontSize
|
font.pixelSize: M.Theme.fontSize
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
width: 30
|
width: 30
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -3,7 +3,6 @@ import QtQuick.Layouts
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Wayland
|
import Quickshell.Wayland
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
PanelWindow {
|
PanelWindow {
|
||||||
id: bar
|
id: bar
|
||||||
|
|
@ -19,13 +18,13 @@ PanelWindow {
|
||||||
right: true
|
right: true
|
||||||
}
|
}
|
||||||
|
|
||||||
implicitHeight: S.Theme.barHeight
|
implicitHeight: M.Theme.barHeight
|
||||||
exclusiveZone: implicitHeight
|
exclusiveZone: implicitHeight
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
color: S.Theme.base00
|
color: M.Theme.base00
|
||||||
opacity: S.Theme.barOpacity
|
opacity: M.Theme.barOpacity
|
||||||
}
|
}
|
||||||
|
|
||||||
Canvas {
|
Canvas {
|
||||||
|
|
@ -35,7 +34,7 @@ PanelWindow {
|
||||||
const ctx = getContext("2d");
|
const ctx = getContext("2d");
|
||||||
const w = width;
|
const w = width;
|
||||||
const h = height;
|
const h = height;
|
||||||
const r = S.Theme.screenRadius;
|
const r = M.Theme.screenRadius;
|
||||||
const lw = 3;
|
const lw = 3;
|
||||||
const hw = lw / 2;
|
const hw = lw / 2;
|
||||||
|
|
||||||
|
|
@ -43,8 +42,8 @@ PanelWindow {
|
||||||
|
|
||||||
// Glow wash behind the border
|
// Glow wash behind the border
|
||||||
const glowGrad = ctx.createLinearGradient(0, 0, w, 0);
|
const glowGrad = ctx.createLinearGradient(0, 0, w, 0);
|
||||||
glowGrad.addColorStop(0, S.Theme.base0C.toString());
|
glowGrad.addColorStop(0, M.Theme.base0C.toString());
|
||||||
glowGrad.addColorStop(1, S.Theme.base09.toString());
|
glowGrad.addColorStop(1, M.Theme.base09.toString());
|
||||||
ctx.globalAlpha = 0.25;
|
ctx.globalAlpha = 0.25;
|
||||||
ctx.fillStyle = glowGrad;
|
ctx.fillStyle = glowGrad;
|
||||||
ctx.fillRect(0, 0, w, h);
|
ctx.fillRect(0, 0, w, h);
|
||||||
|
|
@ -61,8 +60,8 @@ PanelWindow {
|
||||||
|
|
||||||
// Horizontal gradient for the border
|
// Horizontal gradient for the border
|
||||||
const grad = ctx.createLinearGradient(0, 0, w, 0);
|
const grad = ctx.createLinearGradient(0, 0, w, 0);
|
||||||
grad.addColorStop(0, S.Theme.base0C.toString());
|
grad.addColorStop(0, M.Theme.base0C.toString());
|
||||||
grad.addColorStop(1, S.Theme.base09.toString());
|
grad.addColorStop(1, M.Theme.base09.toString());
|
||||||
ctx.strokeStyle = grad;
|
ctx.strokeStyle = grad;
|
||||||
ctx.lineWidth = lw;
|
ctx.lineWidth = lw;
|
||||||
|
|
||||||
|
|
@ -97,25 +96,25 @@ PanelWindow {
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
anchors.topMargin: S.Theme.groupSpacing
|
anchors.topMargin: M.Theme.groupSpacing
|
||||||
anchors.leftMargin: S.Theme.groupSpacing
|
anchors.leftMargin: M.Theme.groupSpacing
|
||||||
anchors.rightMargin: S.Theme.groupSpacing
|
anchors.rightMargin: M.Theme.groupSpacing
|
||||||
|
|
||||||
// ---- center (declared first so left/right can anchor to it) ----
|
// ---- center (declared first so left/right can anchor to it) ----
|
||||||
RowLayout {
|
RowLayout {
|
||||||
id: centerSection
|
id: centerSection
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
spacing: S.Theme.groupSpacing
|
spacing: M.Theme.groupSpacing
|
||||||
|
|
||||||
M.BarGroup {
|
M.BarGroup {
|
||||||
M.PrivacyModule {}
|
M.Privacy {}
|
||||||
M.ClockModule {
|
M.Clock {
|
||||||
visible: S.Modules.clock.enable
|
visible: M.Modules.clock.enable
|
||||||
}
|
}
|
||||||
M.NotificationsModule {
|
M.Notifications {
|
||||||
bar: bar
|
bar: bar
|
||||||
visible: S.Modules.notifications.enable
|
visible: M.Modules.notifications.enable
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -125,19 +124,19 @@ PanelWindow {
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: centerSection.left
|
anchors.right: centerSection.left
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
spacing: S.Theme.groupSpacing
|
spacing: M.Theme.groupSpacing
|
||||||
|
|
||||||
M.BarGroup {
|
M.BarGroup {
|
||||||
id: workspacesGroup
|
id: workspacesGroup
|
||||||
leftEdge: true
|
leftEdge: true
|
||||||
M.WorkspacesModule {
|
M.Workspaces {
|
||||||
bar: bar
|
bar: bar
|
||||||
visible: S.Modules.workspaces.enable
|
visible: M.Modules.workspaces.enable
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
M.BarGroup {
|
M.BarGroup {
|
||||||
leftEdge: !workspacesGroup.visible
|
leftEdge: !workspacesGroup.visible
|
||||||
M.TrayModule {
|
M.Tray {
|
||||||
bar: bar
|
bar: bar
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -145,10 +144,10 @@ PanelWindow {
|
||||||
id: _windowTitleGroup
|
id: _windowTitleGroup
|
||||||
Layout.minimumWidth: 0
|
Layout.minimumWidth: 0
|
||||||
clip: true
|
clip: true
|
||||||
visible: S.Modules.windowTitle.enable && M.NiriIpc.focusedTitle !== ""
|
visible: M.Modules.windowTitle.enable && M.NiriIpc.focusedTitle !== ""
|
||||||
M.WindowTitleModule {
|
M.WindowTitle {
|
||||||
id: _windowTitle
|
id: _windowTitle
|
||||||
readonly property real _maxWidth: Math.max(0, centerSection.x - _windowTitleGroup.x - 2 * S.Theme.groupPadding - S.Theme.groupSpacing)
|
readonly property real _maxWidth: Math.max(0, centerSection.x - _windowTitleGroup.x - 2 * M.Theme.groupPadding - M.Theme.groupSpacing)
|
||||||
width: Math.min(naturalWidth, _maxWidth)
|
width: Math.min(naturalWidth, _maxWidth)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -162,7 +161,7 @@ PanelWindow {
|
||||||
anchors.left: centerSection.right
|
anchors.left: centerSection.right
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
spacing: S.Theme.groupSpacing
|
spacing: M.Theme.groupSpacing
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
|
|
@ -170,63 +169,63 @@ PanelWindow {
|
||||||
|
|
||||||
// Media
|
// Media
|
||||||
M.BarGroup {
|
M.BarGroup {
|
||||||
M.MprisModule {
|
M.Mpris {
|
||||||
bar: bar
|
bar: bar
|
||||||
}
|
}
|
||||||
M.VolumeModule {
|
M.Volume {
|
||||||
visible: S.Modules.volume.enable
|
visible: M.Modules.volume.enable
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Connectivity
|
// Connectivity
|
||||||
M.BarGroup {
|
M.BarGroup {
|
||||||
M.NetworkModule {
|
M.Network {
|
||||||
bar: bar
|
bar: bar
|
||||||
visible: S.Modules.network.enable
|
visible: M.Modules.network.enable
|
||||||
}
|
}
|
||||||
M.BluetoothModule {
|
M.Bluetooth {
|
||||||
bar: bar
|
bar: bar
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Controls
|
// Controls
|
||||||
M.BarGroup {
|
M.BarGroup {
|
||||||
M.BacklightModule {}
|
M.Backlight {}
|
||||||
M.PowerProfileModule {
|
M.PowerProfile {
|
||||||
visible: S.Modules.powerProfile.enable
|
visible: M.Modules.powerProfile.enable
|
||||||
}
|
}
|
||||||
M.IdleInhibitorModule {
|
M.IdleInhibitor {
|
||||||
visible: S.Modules.idleInhibitor.enable
|
visible: M.Modules.idleInhibitor.enable
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stats
|
// Stats
|
||||||
M.BarGroup {
|
M.BarGroup {
|
||||||
M.CpuModule {
|
M.Cpu {
|
||||||
visible: S.Modules.cpu.enable
|
visible: M.Modules.cpu.enable
|
||||||
}
|
}
|
||||||
M.MemoryModule {
|
M.Memory {
|
||||||
visible: S.Modules.memory.enable
|
visible: M.Modules.memory.enable
|
||||||
}
|
}
|
||||||
M.GpuModule {}
|
M.Gpu {}
|
||||||
M.TemperatureModule {
|
M.Temperature {
|
||||||
visible: S.Modules.temperature.enable
|
visible: M.Modules.temperature.enable
|
||||||
}
|
}
|
||||||
M.WeatherModule {
|
M.Weather {
|
||||||
visible: S.Modules.weather.enable
|
visible: M.Modules.weather.enable
|
||||||
}
|
}
|
||||||
M.DiskModule {
|
M.Disk {
|
||||||
visible: S.Modules.disk.enable
|
visible: M.Modules.disk.enable
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Power
|
// Power
|
||||||
M.BarGroup {
|
M.BarGroup {
|
||||||
rightEdge: true
|
rightEdge: true
|
||||||
M.BatteryModule {}
|
M.Battery {}
|
||||||
M.PowerModule {
|
M.Power {
|
||||||
bar: bar
|
bar: bar
|
||||||
visible: S.Modules.power.enable
|
visible: M.Modules.power.enable
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ import QtQuick
|
||||||
import QtQuick.Effects
|
import QtQuick.Effects
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
id: root
|
id: root
|
||||||
|
|
@ -17,21 +16,21 @@ Item {
|
||||||
const gx = mapToGlobal(width / 2, 0).x - scr.x;
|
const gx = mapToGlobal(width / 2, 0).x - scr.x;
|
||||||
return Math.max(0, Math.min(1, gx / scr.width));
|
return Math.max(0, Math.min(1, gx / scr.width));
|
||||||
}
|
}
|
||||||
property color borderColor: Qt.rgba(S.Theme.base0C.r + (S.Theme.base09.r - S.Theme.base0C.r) * _posFrac, S.Theme.base0C.g + (S.Theme.base09.g - S.Theme.base0C.g) * _posFrac, S.Theme.base0C.b + (S.Theme.base09.b - S.Theme.base0C.b) * _posFrac, 1)
|
property color borderColor: Qt.rgba(M.Theme.base0C.r + (M.Theme.base09.r - M.Theme.base0C.r) * _posFrac, M.Theme.base0C.g + (M.Theme.base09.g - M.Theme.base0C.g) * _posFrac, M.Theme.base0C.b + (M.Theme.base09.b - M.Theme.base0C.b) * _posFrac, 1)
|
||||||
property bool leftEdge: false
|
property bool leftEdge: false
|
||||||
property bool rightEdge: false
|
property bool rightEdge: false
|
||||||
|
|
||||||
readonly property real _tlr: leftEdge ? S.Theme.screenRadius : S.Theme.radius
|
readonly property real _tlr: leftEdge ? M.Theme.screenRadius : M.Theme.radius
|
||||||
readonly property real _trr: rightEdge ? S.Theme.screenRadius : S.Theme.radius
|
readonly property real _trr: rightEdge ? M.Theme.screenRadius : M.Theme.radius
|
||||||
readonly property real _blr: S.Theme.radius
|
readonly property real _blr: M.Theme.radius
|
||||||
readonly property real _brr: S.Theme.radius
|
readonly property real _brr: M.Theme.radius
|
||||||
|
|
||||||
visible: row.visibleChildren.length > 0
|
visible: row.visibleChildren.length > 0
|
||||||
|
|
||||||
implicitWidth: row.implicitWidth + _pad * 2
|
implicitWidth: row.implicitWidth + _pad * 2
|
||||||
implicitHeight: S.Theme.barHeight - 3 - _pad
|
implicitHeight: M.Theme.barHeight - 3 - _pad
|
||||||
|
|
||||||
readonly property int _pad: S.Theme.groupPadding
|
readonly property int _pad: M.Theme.groupPadding
|
||||||
property bool _hovered: false
|
property bool _hovered: false
|
||||||
|
|
||||||
HoverHandler {
|
HoverHandler {
|
||||||
|
|
@ -45,7 +44,7 @@ Item {
|
||||||
topRightRadius: root._trr
|
topRightRadius: root._trr
|
||||||
bottomLeftRadius: root._blr
|
bottomLeftRadius: root._blr
|
||||||
bottomRightRadius: root._brr
|
bottomRightRadius: root._brr
|
||||||
color: Qt.rgba(S.Theme.base01.r, S.Theme.base01.g, S.Theme.base01.b, 0.55)
|
color: Qt.rgba(M.Theme.base01.r, M.Theme.base01.g, M.Theme.base01.b, 0.55)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Frost sheen — subtle white highlight, top-heavy
|
// Frost sheen — subtle white highlight, top-heavy
|
||||||
|
|
@ -144,7 +143,7 @@ Item {
|
||||||
id: row
|
id: row
|
||||||
property color accentColor: root.borderColor
|
property color accentColor: root.borderColor
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
spacing: S.Theme.moduleSpacing + 2
|
spacing: M.Theme.moduleSpacing + 2
|
||||||
}
|
}
|
||||||
|
|
||||||
// Separator lines overlaid between visible row children
|
// Separator lines overlaid between visible row children
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,13 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
id: root
|
id: root
|
||||||
property string icon: ""
|
property string icon: ""
|
||||||
property string tooltip: ""
|
property string tooltip: ""
|
||||||
property string minIcon: ""
|
property string minIcon: ""
|
||||||
property color accentColor: parent?.accentColor ?? S.Theme.base05
|
property color accentColor: parent?.accentColor ?? M.Theme.base05
|
||||||
property bool _hovered: false
|
property bool _hovered: false
|
||||||
property string _displayIcon: icon
|
property string _displayIcon: icon
|
||||||
property string _pendingIcon: ""
|
property string _pendingIcon: ""
|
||||||
|
|
@ -44,8 +43,8 @@ Text {
|
||||||
width: minIcon ? Math.max(implicitWidth, _minIconMetrics.width) : implicitWidth
|
width: minIcon ? Math.max(implicitWidth, _minIconMetrics.width) : implicitWidth
|
||||||
horizontalAlignment: minIcon ? Text.AlignHCenter : Text.AlignLeft
|
horizontalAlignment: minIcon ? Text.AlignHCenter : Text.AlignLeft
|
||||||
color: root.accentColor
|
color: root.accentColor
|
||||||
font.pixelSize: S.Theme.fontSize + 1
|
font.pixelSize: M.Theme.fontSize + 1
|
||||||
font.family: S.Theme.iconFontFamily
|
font.family: M.Theme.iconFontFamily
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
|
||||||
TextMetrics {
|
TextMetrics {
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,21 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
id: root
|
id: root
|
||||||
property string label: ""
|
property string label: ""
|
||||||
property string tooltip: ""
|
property string tooltip: ""
|
||||||
property string minText: ""
|
property string minText: ""
|
||||||
property color accentColor: parent?.accentColor ?? S.Theme.base05
|
property color accentColor: parent?.accentColor ?? M.Theme.base05
|
||||||
property bool _hovered: false
|
property bool _hovered: false
|
||||||
|
|
||||||
text: label
|
text: label
|
||||||
width: minText ? Math.max(implicitWidth, _minMetrics.width) : implicitWidth
|
width: minText ? Math.max(implicitWidth, _minMetrics.width) : implicitWidth
|
||||||
horizontalAlignment: minText ? Text.AlignHCenter : Text.AlignLeft
|
horizontalAlignment: minText ? Text.AlignHCenter : Text.AlignLeft
|
||||||
color: root.accentColor
|
color: root.accentColor
|
||||||
font.pixelSize: S.Theme.fontSize
|
font.pixelSize: M.Theme.fontSize
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
|
||||||
TextMetrics {
|
TextMetrics {
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,12 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
Row {
|
Row {
|
||||||
id: root
|
id: root
|
||||||
property string tooltip: ""
|
property string tooltip: ""
|
||||||
property bool _hovered: false
|
property bool _hovered: false
|
||||||
property color accentColor: parent?.accentColor ?? S.Theme.base05
|
property color accentColor: parent?.accentColor ?? M.Theme.base05
|
||||||
|
|
||||||
Behavior on opacity {
|
Behavior on opacity {
|
||||||
NumberAnimation {
|
NumberAnimation {
|
||||||
|
|
|
||||||
|
|
@ -3,22 +3,21 @@ import Quickshell
|
||||||
import Quickshell.Io
|
import Quickshell.Io
|
||||||
import Quickshell.Services.UPower
|
import Quickshell.Services.UPower
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
M.BarSection {
|
M.BarSection {
|
||||||
id: root
|
id: root
|
||||||
spacing: S.Theme.moduleSpacing
|
spacing: M.Theme.moduleSpacing
|
||||||
opacity: S.Modules.battery.enable && (UPower.displayDevice?.isLaptopBattery ?? false) ? 1 : 0
|
opacity: M.Modules.battery.enable && (UPower.displayDevice?.isLaptopBattery ?? false) ? 1 : 0
|
||||||
visible: opacity > 0
|
visible: opacity > 0
|
||||||
tooltip: ""
|
tooltip: ""
|
||||||
|
|
||||||
readonly property var dev: UPower.displayDevice
|
readonly property var dev: UPower.displayDevice
|
||||||
readonly property real pct: (dev?.percentage ?? 0) * 100
|
readonly property real pct: (dev?.percentage ?? 0) * 100
|
||||||
readonly property bool charging: dev?.state === UPowerDeviceState.Charging
|
readonly property bool charging: dev?.state === UPowerDeviceState.Charging
|
||||||
readonly property int _critThresh: S.Modules.battery.critical || 15
|
readonly property int _critThresh: M.Modules.battery.critical || 15
|
||||||
readonly property int _warnThresh: S.Modules.battery.warning || 25
|
readonly property int _warnThresh: M.Modules.battery.warning || 25
|
||||||
readonly property bool _critical: pct < _critThresh && !charging
|
readonly property bool _critical: pct < _critThresh && !charging
|
||||||
property color _stateColor: charging ? S.Theme.base0B : _critical ? S.Theme.base09 : pct < _warnThresh ? S.Theme.base0A : root.accentColor
|
property color _stateColor: charging ? M.Theme.base0B : _critical ? M.Theme.base09 : pct < _warnThresh ? M.Theme.base0A : root.accentColor
|
||||||
property real _blinkOpacity: 1
|
property real _blinkOpacity: 1
|
||||||
|
|
||||||
SequentialAnimation {
|
SequentialAnimation {
|
||||||
|
|
@ -119,7 +118,7 @@ M.BarSection {
|
||||||
}
|
}
|
||||||
color: root._stateColor
|
color: root._stateColor
|
||||||
opacity: root._blinkOpacity
|
opacity: root._blinkOpacity
|
||||||
font.pixelSize: S.Theme.fontSize + 2
|
font.pixelSize: M.Theme.fontSize + 2
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
TapHandler {
|
TapHandler {
|
||||||
cursorShape: Qt.PointingHandCursor
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
|
@ -164,8 +163,8 @@ M.BarSection {
|
||||||
return Math.round(root.pct) + "%" + (ts ? " " + ts : "");
|
return Math.round(root.pct) + "%" + (ts ? " " + ts : "");
|
||||||
}
|
}
|
||||||
color: root._stateColor
|
color: root._stateColor
|
||||||
font.pixelSize: S.Theme.fontSize
|
font.pixelSize: M.Theme.fontSize
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
font.bold: true
|
font.bold: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -185,7 +184,7 @@ M.BarSection {
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
color: S.Theme.base02
|
color: M.Theme.base02
|
||||||
radius: 3
|
radius: 3
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -209,7 +208,7 @@ M.BarSection {
|
||||||
width: 1
|
width: 1
|
||||||
height: parent.height + 4
|
height: parent.height + 4
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
color: S.Theme.base0A
|
color: M.Theme.base0A
|
||||||
opacity: 0.6
|
opacity: 0.6
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -219,7 +218,7 @@ M.BarSection {
|
||||||
width: 1
|
width: 1
|
||||||
height: parent.height + 4
|
height: parent.height + 4
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
color: S.Theme.base08
|
color: M.Theme.base08
|
||||||
opacity: 0.6
|
opacity: 0.6
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -269,7 +268,7 @@ M.BarSection {
|
||||||
|
|
||||||
// Warning threshold line
|
// Warning threshold line
|
||||||
const warnY = height - height * (root._warnThresh / 100);
|
const warnY = height - height * (root._warnThresh / 100);
|
||||||
ctx.strokeStyle = S.Theme.base0A.toString();
|
ctx.strokeStyle = M.Theme.base0A.toString();
|
||||||
ctx.globalAlpha = 0.3;
|
ctx.globalAlpha = 0.3;
|
||||||
ctx.lineWidth = 1;
|
ctx.lineWidth = 1;
|
||||||
ctx.setLineDash([3, 3]);
|
ctx.setLineDash([3, 3]);
|
||||||
|
|
@ -280,7 +279,7 @@ M.BarSection {
|
||||||
|
|
||||||
// Critical threshold line
|
// Critical threshold line
|
||||||
const critY = height - height * (root._critThresh / 100);
|
const critY = height - height * (root._critThresh / 100);
|
||||||
ctx.strokeStyle = S.Theme.base08.toString();
|
ctx.strokeStyle = M.Theme.base08.toString();
|
||||||
ctx.beginPath();
|
ctx.beginPath();
|
||||||
ctx.moveTo(0, critY);
|
ctx.moveTo(0, critY);
|
||||||
ctx.lineTo(width, critY);
|
ctx.lineTo(width, critY);
|
||||||
|
|
@ -328,9 +327,9 @@ M.BarSection {
|
||||||
anchors.leftMargin: 12
|
anchors.leftMargin: 12
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
text: "warn " + root._warnThresh + "% crit " + root._critThresh + "%"
|
text: "warn " + root._warnThresh + "% crit " + root._critThresh + "%"
|
||||||
color: S.Theme.base03
|
color: M.Theme.base03
|
||||||
font.pixelSize: S.Theme.fontSize - 3
|
font.pixelSize: M.Theme.fontSize - 3
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
font.letterSpacing: 0.5
|
font.letterSpacing: 0.5
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -339,9 +338,9 @@ M.BarSection {
|
||||||
anchors.rightMargin: 12
|
anchors.rightMargin: 12
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
text: "24h"
|
text: "24h"
|
||||||
color: S.Theme.base03
|
color: M.Theme.base03
|
||||||
font.pixelSize: S.Theme.fontSize - 3
|
font.pixelSize: M.Theme.fontSize - 3
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -350,7 +349,7 @@ M.BarSection {
|
||||||
width: parent.width - 16
|
width: parent.width - 16
|
||||||
height: 1
|
height: 1
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
color: S.Theme.base03
|
color: M.Theme.base03
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rate + health rows
|
// Rate + health rows
|
||||||
|
|
@ -364,9 +363,9 @@ M.BarSection {
|
||||||
anchors.leftMargin: 12
|
anchors.leftMargin: 12
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
text: root.charging ? "Charging" : "Discharging"
|
text: root.charging ? "Charging" : "Discharging"
|
||||||
color: S.Theme.base04
|
color: M.Theme.base04
|
||||||
font.pixelSize: S.Theme.fontSize - 2
|
font.pixelSize: M.Theme.fontSize - 2
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
|
|
@ -378,8 +377,8 @@ M.BarSection {
|
||||||
return r > 0 ? r.toFixed(1) + " W" : "";
|
return r > 0 ? r.toFixed(1) + " W" : "";
|
||||||
}
|
}
|
||||||
color: root._stateColor
|
color: root._stateColor
|
||||||
font.pixelSize: S.Theme.fontSize - 2
|
font.pixelSize: M.Theme.fontSize - 2
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -393,9 +392,9 @@ M.BarSection {
|
||||||
anchors.leftMargin: 12
|
anchors.leftMargin: 12
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
text: "Health"
|
text: "Health"
|
||||||
color: S.Theme.base04
|
color: M.Theme.base04
|
||||||
font.pixelSize: S.Theme.fontSize - 2
|
font.pixelSize: M.Theme.fontSize - 2
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
|
|
@ -405,10 +404,10 @@ M.BarSection {
|
||||||
text: Math.round((root.dev?.healthPercentage ?? 0) * 100) + "%"
|
text: Math.round((root.dev?.healthPercentage ?? 0) * 100) + "%"
|
||||||
color: {
|
color: {
|
||||||
const h = (root.dev?.healthPercentage ?? 1) * 100;
|
const h = (root.dev?.healthPercentage ?? 1) * 100;
|
||||||
return h < 50 ? S.Theme.base08 : h < 75 ? S.Theme.base0A : S.Theme.base0B;
|
return h < 50 ? M.Theme.base08 : h < 75 ? M.Theme.base0A : M.Theme.base0B;
|
||||||
}
|
}
|
||||||
font.pixelSize: S.Theme.fontSize - 2
|
font.pixelSize: M.Theme.fontSize - 2
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2,12 +2,11 @@ import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Io
|
import Quickshell.Io
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
M.BarSection {
|
M.BarSection {
|
||||||
id: root
|
id: root
|
||||||
spacing: S.Theme.moduleSpacing
|
spacing: M.Theme.moduleSpacing
|
||||||
opacity: S.Modules.bluetooth.enable && root.state !== "unavailable" ? 1 : 0
|
opacity: M.Modules.bluetooth.enable && root.state !== "unavailable" ? 1 : 0
|
||||||
visible: opacity > 0
|
visible: opacity > 0
|
||||||
tooltip: {
|
tooltip: {
|
||||||
if (root.state === "off")
|
if (root.state === "off")
|
||||||
|
|
@ -36,7 +35,7 @@ M.BarSection {
|
||||||
|
|
||||||
Process {
|
Process {
|
||||||
id: proc
|
id: proc
|
||||||
running: S.Modules.bluetooth.enable
|
running: M.Modules.bluetooth.enable
|
||||||
command: ["sh", "-c", "s=$(bluetoothctl show 2>/dev/null); " + "[ -z \"$s\" ] && echo unavailable && exit; " + "echo \"$s\" | grep -q 'Powered: yes' || { echo off:; exit; }; " + "info=$(bluetoothctl info 2>/dev/null); " + "d=$(echo \"$info\" | awk -F': ' '/\\tName:/{n=$2}/Connected: yes/{c=1}END{if(c)print n}'); " + "[ -n \"$d\" ] && echo \"connected:$d\" || { echo on:; exit; }; " + "bat=$(echo \"$info\" | awk -F': ' '/Battery Percentage.*\\(/{gsub(/[^0-9]/,\"\",$2);print $2}'); " + "[ -n \"$bat\" ] && echo \"bat:$bat\""]
|
command: ["sh", "-c", "s=$(bluetoothctl show 2>/dev/null); " + "[ -z \"$s\" ] && echo unavailable && exit; " + "echo \"$s\" | grep -q 'Powered: yes' || { echo off:; exit; }; " + "info=$(bluetoothctl info 2>/dev/null); " + "d=$(echo \"$info\" | awk -F': ' '/\\tName:/{n=$2}/Connected: yes/{c=1}END{if(c)print n}'); " + "[ -n \"$d\" ] && echo \"connected:$d\" || { echo on:; exit; }; " + "bat=$(echo \"$info\" | awk -F': ' '/Battery Percentage.*\\(/{gsub(/[^0-9]/,\"\",$2);print $2}'); " + "[ -n \"$bat\" ] && echo \"bat:$bat\""]
|
||||||
stdout: StdioCollector {
|
stdout: StdioCollector {
|
||||||
onStreamFinished: root._parse(text)
|
onStreamFinished: root._parse(text)
|
||||||
|
|
@ -45,7 +44,7 @@ M.BarSection {
|
||||||
// Event-driven: watch BlueZ DBus property changes
|
// Event-driven: watch BlueZ DBus property changes
|
||||||
Process {
|
Process {
|
||||||
id: btMonitor
|
id: btMonitor
|
||||||
running: S.Modules.bluetooth.enable
|
running: M.Modules.bluetooth.enable
|
||||||
command: ["sh", "-c", "dbus-monitor --system \"interface='org.freedesktop.DBus.Properties',member='PropertiesChanged',path_namespace='/org/bluez'\" 2>/dev/null"]
|
command: ["sh", "-c", "dbus-monitor --system \"interface='org.freedesktop.DBus.Properties',member='PropertiesChanged',path_namespace='/org/bluez'\" 2>/dev/null"]
|
||||||
stdout: SplitParser {
|
stdout: SplitParser {
|
||||||
splitMarker: "\n"
|
splitMarker: "\n"
|
||||||
|
|
@ -59,14 +58,14 @@ M.BarSection {
|
||||||
}
|
}
|
||||||
Timer {
|
Timer {
|
||||||
interval: 60000
|
interval: 60000
|
||||||
running: S.Modules.bluetooth.enable
|
running: M.Modules.bluetooth.enable
|
||||||
repeat: true
|
repeat: true
|
||||||
onTriggered: proc.running = true
|
onTriggered: proc.running = true
|
||||||
}
|
}
|
||||||
|
|
||||||
M.BarIcon {
|
M.BarIcon {
|
||||||
icon: "\uF294"
|
icon: "\uF294"
|
||||||
color: root.state === "off" ? S.Theme.base04 : root.accentColor
|
color: root.state === "off" ? M.Theme.base04 : root.accentColor
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
TapHandler {
|
TapHandler {
|
||||||
cursorShape: Qt.PointingHandCursor
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
|
@ -2,7 +2,6 @@ import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Io
|
import Quickshell.Io
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
M.HoverPanel {
|
M.HoverPanel {
|
||||||
id: menuWindow
|
id: menuWindow
|
||||||
|
|
@ -19,9 +18,9 @@ M.HoverPanel {
|
||||||
Text {
|
Text {
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
text: "\uF011"
|
text: "\uF011"
|
||||||
color: menuWindow._btEnabled ? menuWindow.accentColor : S.Theme.base04
|
color: menuWindow._btEnabled ? menuWindow.accentColor : M.Theme.base04
|
||||||
font.pixelSize: S.Theme.fontSize
|
font.pixelSize: M.Theme.fontSize
|
||||||
font.family: S.Theme.iconFontFamily
|
font.family: M.Theme.iconFontFamily
|
||||||
|
|
||||||
Behavior on color {
|
Behavior on color {
|
||||||
ColorAnimation {
|
ColorAnimation {
|
||||||
|
|
@ -120,8 +119,8 @@ M.HoverPanel {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
anchors.leftMargin: 4
|
anchors.leftMargin: 4
|
||||||
anchors.rightMargin: 4
|
anchors.rightMargin: 4
|
||||||
color: entryHover.hovered ? S.Theme.base02 : "transparent"
|
color: entryHover.hovered ? M.Theme.base02 : "transparent"
|
||||||
radius: S.Theme.radius
|
radius: M.Theme.radius
|
||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
|
|
@ -130,9 +129,9 @@ M.HoverPanel {
|
||||||
anchors.leftMargin: 12
|
anchors.leftMargin: 12
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
text: "\uF294"
|
text: "\uF294"
|
||||||
color: entry.modelData.connected ? menuWindow.accentColor : S.Theme.base04
|
color: entry.modelData.connected ? menuWindow.accentColor : M.Theme.base04
|
||||||
font.pixelSize: S.Theme.fontSize + 1
|
font.pixelSize: M.Theme.fontSize + 1
|
||||||
font.family: S.Theme.iconFontFamily
|
font.family: M.Theme.iconFontFamily
|
||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
|
|
@ -142,9 +141,9 @@ M.HoverPanel {
|
||||||
anchors.rightMargin: 4
|
anchors.rightMargin: 4
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
text: entry.modelData.name
|
text: entry.modelData.name
|
||||||
color: entry.modelData.connected ? menuWindow.accentColor : S.Theme.base05
|
color: entry.modelData.connected ? menuWindow.accentColor : M.Theme.base05
|
||||||
font.pixelSize: S.Theme.fontSize
|
font.pixelSize: M.Theme.fontSize
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
font.bold: entry.modelData.connected
|
font.bold: entry.modelData.connected
|
||||||
elide: Text.ElideRight
|
elide: Text.ElideRight
|
||||||
}
|
}
|
||||||
|
|
@ -155,9 +154,9 @@ M.HoverPanel {
|
||||||
anchors.rightMargin: 12
|
anchors.rightMargin: 12
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
text: entry.modelData.battery >= 0 ? entry.modelData.battery + "%" : ""
|
text: entry.modelData.battery >= 0 ? entry.modelData.battery + "%" : ""
|
||||||
color: S.Theme.base04
|
color: M.Theme.base04
|
||||||
font.pixelSize: S.Theme.fontSize - 1
|
font.pixelSize: M.Theme.fontSize - 1
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
width: entry.modelData.battery >= 0 ? implicitWidth : 0
|
width: entry.modelData.battery >= 0 ? implicitWidth : 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -182,8 +181,8 @@ M.HoverPanel {
|
||||||
horizontalAlignment: Text.AlignHCenter
|
horizontalAlignment: Text.AlignHCenter
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
text: menuWindow._btEnabled ? "No paired devices" : "Bluetooth is off"
|
text: menuWindow._btEnabled ? "No paired devices" : "Bluetooth is off"
|
||||||
color: S.Theme.base04
|
color: M.Theme.base04
|
||||||
font.pixelSize: S.Theme.fontSize
|
font.pixelSize: M.Theme.fontSize
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
M.BarLabel {
|
M.BarLabel {
|
||||||
SystemClock {
|
SystemClock {
|
||||||
|
|
@ -9,7 +8,7 @@ M.BarLabel {
|
||||||
precision: SystemClock.Seconds
|
precision: SystemClock.Seconds
|
||||||
}
|
}
|
||||||
|
|
||||||
font.pixelSize: S.Theme.fontSize + 1
|
font.pixelSize: M.Theme.fontSize + 1
|
||||||
label: Qt.formatDateTime(clock.date, "ddd, dd. MMM HH:mm")
|
label: Qt.formatDateTime(clock.date, "ddd, dd. MMM HH:mm")
|
||||||
tooltip: Qt.formatDateTime(clock.date, "dddd, dd. MMMM yyyy\nHH:mm:ss")
|
tooltip: Qt.formatDateTime(clock.date, "dddd, dd. MMMM yyyy\nHH:mm:ss")
|
||||||
}
|
}
|
||||||
|
|
@ -1,17 +1,16 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
import "content" as C
|
||||||
import "../applets" as C
|
|
||||||
|
|
||||||
M.BarSection {
|
M.BarSection {
|
||||||
id: root
|
id: root
|
||||||
spacing: Math.max(1, S.Theme.moduleSpacing - 2)
|
spacing: Math.max(1, M.Theme.moduleSpacing - 2)
|
||||||
tooltip: ""
|
tooltip: ""
|
||||||
|
|
||||||
readonly property var _cores: S.SystemStats.cpuCores
|
readonly property var _cores: M.SystemStats.cpuCores
|
||||||
readonly property var _coreMaxFreq: S.SystemStats.cpuCoreMaxFreq
|
readonly property var _coreMaxFreq: M.SystemStats.cpuCoreMaxFreq
|
||||||
readonly property var _coreTypes: S.SystemStats.cpuCoreTypes
|
readonly property var _coreTypes: M.SystemStats.cpuCoreTypes
|
||||||
|
|
||||||
property bool _pinned: false
|
property bool _pinned: false
|
||||||
readonly property bool _anyHover: root._hovered || hoverPanel.panelHovered
|
readonly property bool _anyHover: root._hovered || hoverPanel.panelHovered
|
||||||
|
|
@ -22,10 +21,10 @@ M.BarSection {
|
||||||
on_ShowPanelChanged: {
|
on_ShowPanelChanged: {
|
||||||
if (_showPanel && !_coreConsumerActive) {
|
if (_showPanel && !_coreConsumerActive) {
|
||||||
_coreConsumerActive = true;
|
_coreConsumerActive = true;
|
||||||
S.SystemStats.coreConsumers++;
|
M.SystemStats.coreConsumers++;
|
||||||
} else if (!_showPanel && _coreConsumerActive) {
|
} else if (!_showPanel && _coreConsumerActive) {
|
||||||
_coreConsumerActive = false;
|
_coreConsumerActive = false;
|
||||||
S.SystemStats.coreConsumers--;
|
M.SystemStats.coreConsumers--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -57,7 +56,7 @@ M.BarSection {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
M.BarLabel {
|
M.BarLabel {
|
||||||
label: S.SystemStats.cpuUsage.toString().padStart(2) + "%@" + S.SystemStats.cpuFreqGhz.toFixed(2)
|
label: M.SystemStats.cpuUsage.toString().padStart(2) + "%@" + M.SystemStats.cpuFreqGhz.toFixed(2)
|
||||||
minText: "99%@9.99"
|
minText: "99%@9.99"
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
TapHandler {
|
TapHandler {
|
||||||
|
|
@ -76,7 +75,7 @@ M.BarSection {
|
||||||
panelTitle: "CPU"
|
panelTitle: "CPU"
|
||||||
contentWidth: 260
|
contentWidth: 260
|
||||||
|
|
||||||
C.CpuApplet {
|
C.CpuContent {
|
||||||
width: hoverPanel.contentWidth
|
width: hoverPanel.contentWidth
|
||||||
cores: root._cores
|
cores: root._cores
|
||||||
coreMaxFreq: root._coreMaxFreq
|
coreMaxFreq: root._coreMaxFreq
|
||||||
|
|
@ -1,16 +1,15 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
import "content" as C
|
||||||
import "../applets" as C
|
|
||||||
|
|
||||||
M.BarSection {
|
M.BarSection {
|
||||||
id: root
|
id: root
|
||||||
spacing: Math.max(1, S.Theme.moduleSpacing - 2)
|
spacing: Math.max(1, M.Theme.moduleSpacing - 2)
|
||||||
tooltip: ""
|
tooltip: ""
|
||||||
|
|
||||||
property var _mounts: S.SystemStats.diskMounts
|
property var _mounts: M.SystemStats.diskMounts
|
||||||
property int _rootPct: S.SystemStats.diskRootPct
|
property int _rootPct: M.SystemStats.diskRootPct
|
||||||
|
|
||||||
property bool _pinned: false
|
property bool _pinned: false
|
||||||
readonly property bool _anyHover: root._hovered || hoverPanel.panelHovered
|
readonly property bool _anyHover: root._hovered || hoverPanel.panelHovered
|
||||||
|
|
@ -57,7 +56,7 @@ M.BarSection {
|
||||||
panelTitle: "Disk"
|
panelTitle: "Disk"
|
||||||
contentWidth: 260
|
contentWidth: 260
|
||||||
|
|
||||||
C.DiskApplet {
|
C.DiskContent {
|
||||||
width: hoverPanel.contentWidth
|
width: hoverPanel.contentWidth
|
||||||
mounts: root._mounts
|
mounts: root._mounts
|
||||||
accentColor: root.accentColor
|
accentColor: root.accentColor
|
||||||
|
|
@ -2,7 +2,6 @@ import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Wayland
|
import Quickshell.Wayland
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
PanelWindow {
|
PanelWindow {
|
||||||
id: root
|
id: root
|
||||||
|
|
@ -36,8 +35,8 @@ PanelWindow {
|
||||||
margins.top: 0
|
margins.top: 0
|
||||||
margins.left: Math.max(0, Math.min(Math.round(M.FlyoutState.itemX - implicitWidth / 2), screen.width - implicitWidth))
|
margins.left: Math.max(0, Math.min(Math.round(M.FlyoutState.itemX - implicitWidth / 2), screen.width - implicitWidth))
|
||||||
|
|
||||||
implicitWidth: label.implicitWidth + S.Theme.barPadding * 2
|
implicitWidth: label.implicitWidth + M.Theme.barPadding * 2
|
||||||
implicitHeight: label.implicitHeight + S.Theme.barPadding * 2
|
implicitHeight: label.implicitHeight + M.Theme.barPadding * 2
|
||||||
|
|
||||||
ParallelAnimation {
|
ParallelAnimation {
|
||||||
id: showAnim
|
id: showAnim
|
||||||
|
|
@ -94,9 +93,9 @@ PanelWindow {
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
text: M.FlyoutState.text.replace(/\n/g, "<br>")
|
text: M.FlyoutState.text.replace(/\n/g, "<br>")
|
||||||
textFormat: Text.RichText
|
textFormat: Text.RichText
|
||||||
color: S.Theme.base05
|
color: M.Theme.base05
|
||||||
font.pixelSize: S.Theme.fontSize
|
font.pixelSize: M.Theme.fontSize
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,11 @@
|
||||||
pragma Singleton
|
pragma Singleton
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
QtObject {
|
QtObject {
|
||||||
property bool visible: false
|
property bool visible: false
|
||||||
property string text: ""
|
property string text: ""
|
||||||
property real itemX: 0
|
property real itemX: 0
|
||||||
property var screen: null
|
property var screen: null
|
||||||
property color accentColor: S.Theme.base05
|
property color accentColor: M.Theme.base05
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,12 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
M.BarSection {
|
M.BarSection {
|
||||||
id: root
|
id: root
|
||||||
spacing: Math.max(1, S.Theme.moduleSpacing - 2)
|
spacing: Math.max(1, M.Theme.moduleSpacing - 2)
|
||||||
tooltip: ""
|
tooltip: ""
|
||||||
visible: S.Modules.gpu.enable && S.SystemStats.gpuAvailable
|
visible: M.Modules.gpu.enable && M.SystemStats.gpuAvailable
|
||||||
|
|
||||||
property bool _pinned: false
|
property bool _pinned: false
|
||||||
readonly property bool _anyHover: root._hovered || hoverPanel.panelHovered
|
readonly property bool _anyHover: root._hovered || hoverPanel.panelHovered
|
||||||
|
|
@ -28,8 +27,8 @@ M.BarSection {
|
||||||
|
|
||||||
function _loadColor(pct) {
|
function _loadColor(pct) {
|
||||||
const t = Math.max(0, Math.min(100, pct)) / 100;
|
const t = Math.max(0, Math.min(100, pct)) / 100;
|
||||||
const a = t < 0.5 ? S.Theme.base0B : S.Theme.base0A;
|
const a = t < 0.5 ? M.Theme.base0B : M.Theme.base0A;
|
||||||
const b = t < 0.5 ? S.Theme.base0A : S.Theme.base08;
|
const b = t < 0.5 ? M.Theme.base0A : M.Theme.base08;
|
||||||
const u = t < 0.5 ? t * 2 : (t - 0.5) * 2;
|
const u = t < 0.5 ? t * 2 : (t - 0.5) * 2;
|
||||||
return Qt.rgba(a.r + (b.r - a.r) * u, a.g + (b.g - a.g) * u, a.b + (b.b - a.b) * u, 1);
|
return Qt.rgba(a.r + (b.r - a.r) * u, a.g + (b.g - a.g) * u, a.b + (b.b - a.b) * u, 1);
|
||||||
}
|
}
|
||||||
|
|
@ -40,7 +39,7 @@ M.BarSection {
|
||||||
|
|
||||||
M.BarIcon {
|
M.BarIcon {
|
||||||
icon: "\uDB84\uDCB0"
|
icon: "\uDB84\uDCB0"
|
||||||
color: root._loadColor(S.SystemStats.gpuUsage)
|
color: root._loadColor(M.SystemStats.gpuUsage)
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
TapHandler {
|
TapHandler {
|
||||||
cursorShape: Qt.PointingHandCursor
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
|
@ -48,9 +47,9 @@ M.BarSection {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
M.BarLabel {
|
M.BarLabel {
|
||||||
label: S.SystemStats.gpuUsage + "%"
|
label: M.SystemStats.gpuUsage + "%"
|
||||||
minText: "100%"
|
minText: "100%"
|
||||||
color: root._loadColor(S.SystemStats.gpuUsage)
|
color: root._loadColor(M.SystemStats.gpuUsage)
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
TapHandler {
|
TapHandler {
|
||||||
cursorShape: Qt.PointingHandCursor
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
|
@ -77,10 +76,10 @@ M.BarSection {
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.leftMargin: 12
|
anchors.leftMargin: 12
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
text: S.SystemStats.gpuVendor.toUpperCase()
|
text: M.SystemStats.gpuVendor.toUpperCase()
|
||||||
color: S.Theme.base03
|
color: M.Theme.base03
|
||||||
font.pixelSize: S.Theme.fontSize - 3
|
font.pixelSize: M.Theme.fontSize - 3
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
font.letterSpacing: 1
|
font.letterSpacing: 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -88,10 +87,10 @@ M.BarSection {
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.rightMargin: 12
|
anchors.rightMargin: 12
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
text: S.SystemStats.gpuUsage + "%"
|
text: M.SystemStats.gpuUsage + "%"
|
||||||
color: root._loadColor(S.SystemStats.gpuUsage)
|
color: root._loadColor(M.SystemStats.gpuUsage)
|
||||||
font.pixelSize: S.Theme.fontSize
|
font.pixelSize: M.Theme.fontSize
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
font.bold: true
|
font.bold: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -111,14 +110,14 @@ M.BarSection {
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
color: S.Theme.base02
|
color: M.Theme.base02
|
||||||
radius: 3
|
radius: 3
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
width: parent.width * Math.min(1, S.SystemStats.gpuUsage / 100)
|
width: parent.width * Math.min(1, M.SystemStats.gpuUsage / 100)
|
||||||
height: parent.height
|
height: parent.height
|
||||||
color: root._loadColor(S.SystemStats.gpuUsage)
|
color: root._loadColor(M.SystemStats.gpuUsage)
|
||||||
radius: 3
|
radius: 3
|
||||||
Behavior on width {
|
Behavior on width {
|
||||||
enabled: root._showPanel
|
enabled: root._showPanel
|
||||||
|
|
@ -140,7 +139,7 @@ M.BarSection {
|
||||||
anchors.rightMargin: 12
|
anchors.rightMargin: 12
|
||||||
height: 36
|
height: 36
|
||||||
|
|
||||||
property var _hist: S.SystemStats.gpuHistory
|
property var _hist: M.SystemStats.gpuHistory
|
||||||
|
|
||||||
on_HistChanged: if (root._showPanel)
|
on_HistChanged: if (root._showPanel)
|
||||||
requestPaint()
|
requestPaint()
|
||||||
|
|
@ -178,7 +177,7 @@ M.BarSection {
|
||||||
width: parent.width - 16
|
width: parent.width - 16
|
||||||
height: 1
|
height: 1
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
color: S.Theme.base03
|
color: M.Theme.base03
|
||||||
}
|
}
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
|
|
@ -190,9 +189,9 @@ M.BarSection {
|
||||||
anchors.leftMargin: 12
|
anchors.leftMargin: 12
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
text: "VRAM"
|
text: "VRAM"
|
||||||
color: S.Theme.base03
|
color: M.Theme.base03
|
||||||
font.pixelSize: S.Theme.fontSize - 3
|
font.pixelSize: M.Theme.fontSize - 3
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
font.letterSpacing: 1
|
font.letterSpacing: 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -200,10 +199,10 @@ M.BarSection {
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.rightMargin: 12
|
anchors.rightMargin: 12
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
text: root._fmt(S.SystemStats.gpuVramUsedGb) + " / " + root._fmt(S.SystemStats.gpuVramTotalGb)
|
text: root._fmt(M.SystemStats.gpuVramUsedGb) + " / " + root._fmt(M.SystemStats.gpuVramTotalGb)
|
||||||
color: root.accentColor
|
color: root.accentColor
|
||||||
font.pixelSize: S.Theme.fontSize - 1
|
font.pixelSize: M.Theme.fontSize - 1
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
font.bold: true
|
font.bold: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -222,12 +221,12 @@ M.BarSection {
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
color: S.Theme.base02
|
color: M.Theme.base02
|
||||||
radius: 2
|
radius: 2
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
width: S.SystemStats.gpuVramTotalGb > 0 ? parent.width * Math.min(1, S.SystemStats.gpuVramUsedGb / S.SystemStats.gpuVramTotalGb) : 0
|
width: M.SystemStats.gpuVramTotalGb > 0 ? parent.width * Math.min(1, M.SystemStats.gpuVramUsedGb / M.SystemStats.gpuVramTotalGb) : 0
|
||||||
height: parent.height
|
height: parent.height
|
||||||
color: root.accentColor
|
color: root.accentColor
|
||||||
radius: 2
|
radius: 2
|
||||||
|
|
@ -246,26 +245,26 @@ M.BarSection {
|
||||||
Item {
|
Item {
|
||||||
width: parent.width
|
width: parent.width
|
||||||
height: 22
|
height: 22
|
||||||
visible: S.SystemStats.gpuTempC > 0
|
visible: M.SystemStats.gpuTempC > 0
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.leftMargin: 12
|
anchors.leftMargin: 12
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
text: "Temp"
|
text: "Temp"
|
||||||
color: S.Theme.base04
|
color: M.Theme.base04
|
||||||
font.pixelSize: S.Theme.fontSize - 2
|
font.pixelSize: M.Theme.fontSize - 2
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.rightMargin: 12
|
anchors.rightMargin: 12
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
text: S.SystemStats.gpuTempC + "\u00B0C"
|
text: M.SystemStats.gpuTempC + "\u00B0C"
|
||||||
color: S.SystemStats.gpuTempC > 85 ? S.Theme.base08 : S.SystemStats.gpuTempC > 70 ? S.Theme.base0A : S.Theme.base05
|
color: M.SystemStats.gpuTempC > 85 ? M.Theme.base08 : M.SystemStats.gpuTempC > 70 ? M.Theme.base0A : M.Theme.base05
|
||||||
font.pixelSize: S.Theme.fontSize - 2
|
font.pixelSize: M.Theme.fontSize - 2
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2,7 +2,6 @@ import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Wayland
|
import Quickshell.Wayland
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
// Unified bar panel — fullscreen transparent window so content can resize
|
// Unified bar panel — fullscreen transparent window so content can resize
|
||||||
// freely without triggering Wayland surface resizes.
|
// freely without triggering Wayland surface resizes.
|
||||||
|
|
@ -237,7 +236,7 @@ PanelWindow {
|
||||||
y: panelContainer.y
|
y: panelContainer.y
|
||||||
width: panelContainer.width
|
width: panelContainer.width
|
||||||
height: panelContainer.height
|
height: panelContainer.height
|
||||||
opacity: panelContainer.opacity * Math.max(S.Theme.barOpacity, 0.85)
|
opacity: panelContainer.opacity * Math.max(M.Theme.barOpacity, 0.85)
|
||||||
accentColor: root.accentColor
|
accentColor: root.accentColor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -302,9 +301,9 @@ PanelWindow {
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
text: root.panelTitle
|
text: root.panelTitle
|
||||||
color: root.accentColor
|
color: root.accentColor
|
||||||
font.pixelSize: S.Theme.fontSize - 1
|
font.pixelSize: M.Theme.fontSize - 1
|
||||||
font.bold: true
|
font.bold: true
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
}
|
}
|
||||||
|
|
||||||
// Action buttons — anchored left of pin button slot
|
// Action buttons — anchored left of pin button slot
|
||||||
|
|
@ -338,9 +337,9 @@ PanelWindow {
|
||||||
Text {
|
Text {
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
text: root._pinned ? "\uDB81\uDC03" : "\uDB82\uDD31"
|
text: root._pinned ? "\uDB81\uDC03" : "\uDB82\uDD31"
|
||||||
color: root._pinned ? root.accentColor : S.Theme.base04
|
color: root._pinned ? root.accentColor : M.Theme.base04
|
||||||
font.pixelSize: S.Theme.fontSize - 1
|
font.pixelSize: M.Theme.fontSize - 1
|
||||||
font.family: S.Theme.iconFontFamily
|
font.family: M.Theme.iconFontFamily
|
||||||
|
|
||||||
Behavior on color {
|
Behavior on color {
|
||||||
ColorAnimation {
|
ColorAnimation {
|
||||||
|
|
@ -356,7 +355,7 @@ PanelWindow {
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.bottom: parent.bottom
|
anchors.bottom: parent.bottom
|
||||||
height: 1
|
height: 1
|
||||||
color: S.Theme.base03
|
color: M.Theme.base03
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -376,7 +375,7 @@ PanelWindow {
|
||||||
color: "transparent"
|
color: "transparent"
|
||||||
border.color: root.accentColor
|
border.color: root.accentColor
|
||||||
border.width: 1
|
border.width: 1
|
||||||
radius: S.Theme.radius
|
radius: M.Theme.radius
|
||||||
opacity: panelContainer.opacity
|
opacity: panelContainer.opacity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,10 @@ import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Io
|
import Quickshell.Io
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
M.BarIcon {
|
M.BarIcon {
|
||||||
id: root
|
id: root
|
||||||
color: root.active ? S.Theme.base09 : root.accentColor
|
color: root.active ? M.Theme.base09 : root.accentColor
|
||||||
tooltip: {
|
tooltip: {
|
||||||
const parts = ["Idle inhibition: " + (root.active ? "active" : "inactive")];
|
const parts = ["Idle inhibition: " + (root.active ? "active" : "inactive")];
|
||||||
if (root._inhibitors)
|
if (root._inhibitors)
|
||||||
|
|
@ -1,20 +1,19 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
import "content" as C
|
||||||
import "../applets" as C
|
|
||||||
|
|
||||||
M.BarSection {
|
M.BarSection {
|
||||||
id: root
|
id: root
|
||||||
spacing: Math.max(1, S.Theme.moduleSpacing - 2)
|
spacing: Math.max(1, M.Theme.moduleSpacing - 2)
|
||||||
tooltip: ""
|
tooltip: ""
|
||||||
|
|
||||||
property int percent: S.SystemStats.memPercent
|
property int percent: M.SystemStats.memPercent
|
||||||
property real usedGb: S.SystemStats.memUsedGb
|
property real usedGb: M.SystemStats.memUsedGb
|
||||||
property real totalGb: S.SystemStats.memTotalGb
|
property real totalGb: M.SystemStats.memTotalGb
|
||||||
property real availGb: S.SystemStats.memAvailGb
|
property real availGb: M.SystemStats.memAvailGb
|
||||||
property real cachedGb: S.SystemStats.memCachedGb
|
property real cachedGb: M.SystemStats.memCachedGb
|
||||||
property real buffersGb: S.SystemStats.memBuffersGb
|
property real buffersGb: M.SystemStats.memBuffersGb
|
||||||
|
|
||||||
property bool _pinned: false
|
property bool _pinned: false
|
||||||
readonly property bool _anyHover: root._hovered || hoverPanel.panelHovered
|
readonly property bool _anyHover: root._hovered || hoverPanel.panelHovered
|
||||||
|
|
@ -67,7 +66,7 @@ M.BarSection {
|
||||||
panelTitle: "Memory"
|
panelTitle: "Memory"
|
||||||
contentWidth: 240
|
contentWidth: 240
|
||||||
|
|
||||||
C.MemoryApplet {
|
C.MemoryContent {
|
||||||
width: hoverPanel.contentWidth
|
width: hoverPanel.contentWidth
|
||||||
percent: root.percent
|
percent: root.percent
|
||||||
usedGb: root.usedGb
|
usedGb: root.usedGb
|
||||||
|
|
@ -3,13 +3,12 @@ import Quickshell
|
||||||
import Quickshell.Io
|
import Quickshell.Io
|
||||||
import Quickshell.Services.Mpris
|
import Quickshell.Services.Mpris
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
import "content" as C
|
||||||
import "../applets" as C
|
|
||||||
|
|
||||||
M.BarSection {
|
M.BarSection {
|
||||||
id: root
|
id: root
|
||||||
spacing: S.Theme.moduleSpacing
|
spacing: M.Theme.moduleSpacing
|
||||||
opacity: S.Modules.mpris.enable && player !== null ? 1 : 0
|
opacity: M.Modules.mpris.enable && player !== null ? 1 : 0
|
||||||
visible: opacity > 0
|
visible: opacity > 0
|
||||||
tooltip: ""
|
tooltip: ""
|
||||||
|
|
||||||
|
|
@ -124,7 +123,7 @@ M.BarSection {
|
||||||
panelTitle: "Now Playing"
|
panelTitle: "Now Playing"
|
||||||
contentWidth: 280
|
contentWidth: 280
|
||||||
|
|
||||||
C.MprisApplet {
|
C.MprisContent {
|
||||||
width: hoverPanel.contentWidth
|
width: hoverPanel.contentWidth
|
||||||
player: root.player
|
player: root.player
|
||||||
players: root._players
|
players: root._players
|
||||||
|
|
@ -2,11 +2,10 @@ import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Io
|
import Quickshell.Io
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
M.BarSection {
|
M.BarSection {
|
||||||
id: root
|
id: root
|
||||||
spacing: S.Theme.moduleSpacing
|
spacing: M.Theme.moduleSpacing
|
||||||
tooltip: ""
|
tooltip: ""
|
||||||
|
|
||||||
property string ifname: ""
|
property string ifname: ""
|
||||||
|
|
@ -17,7 +16,7 @@ M.BarSection {
|
||||||
|
|
||||||
Process {
|
Process {
|
||||||
id: proc
|
id: proc
|
||||||
running: S.Modules.network.enable
|
running: M.Modules.network.enable
|
||||||
command: ["sh", "-c", "line=$(nmcli -t -f NAME,TYPE,DEVICE connection show --active 2>/dev/null | head -1); if [ -z \"$line\" ]; then dev=$(nmcli -t -f DEVICE,STATE device 2>/dev/null | grep ':connected' | grep -v ':unmanaged\\|:unavailable\\|:disconnected\\|:connecting' | head -1 | cut -d: -f1); [ -n \"$dev\" ] && line=\"linked:linked:$dev\"; fi; [ -z \"$line\" ] && exit 0; echo \"$line\"; dev=$(echo \"$line\" | cut -d: -f3); ip=$(nmcli -t -f IP4.ADDRESS device show \"$dev\" 2>/dev/null | head -1 | cut -d: -f2); echo \"ip:${ip:-}\"; sig=$(nmcli -t -f GENERAL.SIGNAL device show \"$dev\" 2>/dev/null | head -1 | cut -d: -f2); echo \"sig:${sig:-}\""]
|
command: ["sh", "-c", "line=$(nmcli -t -f NAME,TYPE,DEVICE connection show --active 2>/dev/null | head -1); if [ -z \"$line\" ]; then dev=$(nmcli -t -f DEVICE,STATE device 2>/dev/null | grep ':connected' | grep -v ':unmanaged\\|:unavailable\\|:disconnected\\|:connecting' | head -1 | cut -d: -f1); [ -n \"$dev\" ] && line=\"linked:linked:$dev\"; fi; [ -z \"$line\" ] && exit 0; echo \"$line\"; dev=$(echo \"$line\" | cut -d: -f3); ip=$(nmcli -t -f IP4.ADDRESS device show \"$dev\" 2>/dev/null | head -1 | cut -d: -f2); echo \"ip:${ip:-}\"; sig=$(nmcli -t -f GENERAL.SIGNAL device show \"$dev\" 2>/dev/null | head -1 | cut -d: -f2); echo \"sig:${sig:-}\""]
|
||||||
stdout: StdioCollector {
|
stdout: StdioCollector {
|
||||||
onStreamFinished: {
|
onStreamFinished: {
|
||||||
|
|
@ -54,7 +53,7 @@ M.BarSection {
|
||||||
// Event-driven: re-poll on any network change
|
// Event-driven: re-poll on any network change
|
||||||
Process {
|
Process {
|
||||||
id: monitor
|
id: monitor
|
||||||
running: S.Modules.network.enable
|
running: M.Modules.network.enable
|
||||||
command: ["nmcli", "monitor"]
|
command: ["nmcli", "monitor"]
|
||||||
stdout: SplitParser {
|
stdout: SplitParser {
|
||||||
splitMarker: "\n"
|
splitMarker: "\n"
|
||||||
|
|
@ -72,7 +71,7 @@ M.BarSection {
|
||||||
// Fallback poll
|
// Fallback poll
|
||||||
Timer {
|
Timer {
|
||||||
interval: 60000
|
interval: 60000
|
||||||
running: S.Modules.network.enable
|
running: M.Modules.network.enable
|
||||||
repeat: true
|
repeat: true
|
||||||
onTriggered: proc.running = true
|
onTriggered: proc.running = true
|
||||||
}
|
}
|
||||||
|
|
@ -87,13 +86,13 @@ M.BarSection {
|
||||||
return "\uDB85\uDE16";
|
return "\uDB85\uDE16";
|
||||||
return "\uDB82\uDCFD";
|
return "\uDB82\uDCFD";
|
||||||
}
|
}
|
||||||
color: root.state === "disconnected" ? S.Theme.base08 : root.accentColor
|
color: root.state === "disconnected" ? M.Theme.base08 : root.accentColor
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
M.BarLabel {
|
M.BarLabel {
|
||||||
visible: root.state === "wifi"
|
visible: root.state === "wifi"
|
||||||
label: root.essid
|
label: root.essid
|
||||||
color: root.state === "disconnected" ? S.Theme.base08 : root.accentColor
|
color: root.state === "disconnected" ? M.Theme.base08 : root.accentColor
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2,7 +2,6 @@ import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Io
|
import Quickshell.Io
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
M.HoverPanel {
|
M.HoverPanel {
|
||||||
id: menuWindow
|
id: menuWindow
|
||||||
|
|
@ -18,9 +17,9 @@ M.HoverPanel {
|
||||||
Text {
|
Text {
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
text: "\uF011"
|
text: "\uF011"
|
||||||
color: menuWindow._wifiEnabled ? menuWindow.accentColor : S.Theme.base04
|
color: menuWindow._wifiEnabled ? menuWindow.accentColor : M.Theme.base04
|
||||||
font.pixelSize: S.Theme.fontSize
|
font.pixelSize: M.Theme.fontSize
|
||||||
font.family: S.Theme.iconFontFamily
|
font.family: M.Theme.iconFontFamily
|
||||||
|
|
||||||
Behavior on color {
|
Behavior on color {
|
||||||
ColorAnimation {
|
ColorAnimation {
|
||||||
|
|
@ -157,8 +156,8 @@ M.HoverPanel {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
anchors.leftMargin: 4
|
anchors.leftMargin: 4
|
||||||
anchors.rightMargin: 4
|
anchors.rightMargin: 4
|
||||||
color: entryHover.hovered ? S.Theme.base02 : "transparent"
|
color: entryHover.hovered ? M.Theme.base02 : "transparent"
|
||||||
radius: S.Theme.radius
|
radius: M.Theme.radius
|
||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
|
|
@ -167,9 +166,9 @@ M.HoverPanel {
|
||||||
anchors.leftMargin: 12
|
anchors.leftMargin: 12
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
text: entry.modelData.isWifi ? "\uF1EB" : "\uDB80\uDE00"
|
text: entry.modelData.isWifi ? "\uF1EB" : "\uDB80\uDE00"
|
||||||
color: entry.modelData.active ? menuWindow.accentColor : S.Theme.base05
|
color: entry.modelData.active ? menuWindow.accentColor : M.Theme.base05
|
||||||
font.pixelSize: S.Theme.fontSize + 1
|
font.pixelSize: M.Theme.fontSize + 1
|
||||||
font.family: S.Theme.iconFontFamily
|
font.family: M.Theme.iconFontFamily
|
||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
|
|
@ -179,9 +178,9 @@ M.HoverPanel {
|
||||||
anchors.rightMargin: 4
|
anchors.rightMargin: 4
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
text: entry.modelData.name
|
text: entry.modelData.name
|
||||||
color: entry.modelData.active ? menuWindow.accentColor : S.Theme.base05
|
color: entry.modelData.active ? menuWindow.accentColor : M.Theme.base05
|
||||||
font.pixelSize: S.Theme.fontSize
|
font.pixelSize: M.Theme.fontSize
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
font.bold: entry.modelData.active
|
font.bold: entry.modelData.active
|
||||||
elide: Text.ElideRight
|
elide: Text.ElideRight
|
||||||
}
|
}
|
||||||
|
|
@ -192,9 +191,9 @@ M.HoverPanel {
|
||||||
anchors.rightMargin: 12
|
anchors.rightMargin: 12
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
text: entry.modelData.signal >= 0 ? entry.modelData.signal + "%" : ""
|
text: entry.modelData.signal >= 0 ? entry.modelData.signal + "%" : ""
|
||||||
color: S.Theme.base04
|
color: M.Theme.base04
|
||||||
font.pixelSize: S.Theme.fontSize - 1
|
font.pixelSize: M.Theme.fontSize - 1
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
width: entry.modelData.signal >= 0 ? implicitWidth : 0
|
width: entry.modelData.signal >= 0 ? implicitWidth : 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -223,8 +222,8 @@ M.HoverPanel {
|
||||||
horizontalAlignment: Text.AlignHCenter
|
horizontalAlignment: Text.AlignHCenter
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
text: menuWindow._wifiEnabled ? "No networks available" : "Wi-Fi is off"
|
text: menuWindow._wifiEnabled ? "No networks available" : "Wi-Fi is off"
|
||||||
color: S.Theme.base04
|
color: M.Theme.base04
|
||||||
font.pixelSize: S.Theme.fontSize
|
font.pixelSize: M.Theme.fontSize
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Services.Notifications
|
import Quickshell.Services.Notifications
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
// Shared notification card: background, progress bar, urgency bar, icon, text, dismiss button.
|
// Shared notification card: background, progress bar, urgency bar, icon, text, dismiss button.
|
||||||
// Does NOT include dismiss animation or dismiss logic — emits dismissRequested() instead.
|
// Does NOT include dismiss animation or dismiss logic — emits dismissRequested() instead.
|
||||||
|
|
@ -15,7 +14,7 @@ Item {
|
||||||
property bool dismissOnAction: true
|
property bool dismissOnAction: true
|
||||||
property int iconSize: 32
|
property int iconSize: 32
|
||||||
property int bodyMaxLines: 3
|
property int bodyMaxLines: 3
|
||||||
property color accentColor: S.Theme.base0D
|
property color accentColor: M.Theme.base0D
|
||||||
|
|
||||||
signal dismissRequested
|
signal dismissRequested
|
||||||
|
|
||||||
|
|
@ -35,9 +34,9 @@ Item {
|
||||||
// Background: base01, base02 on hover
|
// Background: base01, base02 on hover
|
||||||
Rectangle {
|
Rectangle {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
color: _hover.hovered ? S.Theme.base02 : S.Theme.base01
|
color: _hover.hovered ? M.Theme.base02 : M.Theme.base01
|
||||||
opacity: _hover.hovered ? 1.0 : Math.max(S.Theme.barOpacity, 0.9)
|
opacity: _hover.hovered ? 1.0 : Math.max(M.Theme.barOpacity, 0.9)
|
||||||
radius: S.Theme.radius
|
radius: M.Theme.radius
|
||||||
|
|
||||||
Behavior on color {
|
Behavior on color {
|
||||||
ColorAnimation {
|
ColorAnimation {
|
||||||
|
|
@ -52,7 +51,7 @@ Item {
|
||||||
anchors.bottom: parent.bottom
|
anchors.bottom: parent.bottom
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
width: parent.width * Math.min(1, Math.max(0, (root.notif?.hints?.value ?? 0) / 100))
|
width: parent.width * Math.min(1, Math.max(0, (root.notif?.hints?.value ?? 0) / 100))
|
||||||
color: S.Theme.base03
|
color: M.Theme.base03
|
||||||
radius: parent.radius
|
radius: parent.radius
|
||||||
|
|
||||||
Behavior on width {
|
Behavior on width {
|
||||||
|
|
@ -72,7 +71,7 @@ Item {
|
||||||
radius: 1
|
radius: 1
|
||||||
color: {
|
color: {
|
||||||
const u = root.notif?.urgency ?? NotificationUrgency.Normal;
|
const u = root.notif?.urgency ?? NotificationUrgency.Normal;
|
||||||
return u === NotificationUrgency.Critical ? S.Theme.base08 : u === NotificationUrgency.Low ? S.Theme.base04 : S.Theme.base0D;
|
return u === NotificationUrgency.Critical ? M.Theme.base08 : u === NotificationUrgency.Low ? M.Theme.base04 : M.Theme.base0D;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -108,9 +107,9 @@ Item {
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
anchors.topMargin: 8
|
anchors.topMargin: 8
|
||||||
text: "\uF00D"
|
text: "\uF00D"
|
||||||
color: _dismissHover.hovered ? S.Theme.base08 : S.Theme.base03
|
color: _dismissHover.hovered ? M.Theme.base08 : M.Theme.base03
|
||||||
font.pixelSize: S.Theme.fontSize - 1
|
font.pixelSize: M.Theme.fontSize - 1
|
||||||
font.family: S.Theme.iconFontFamily
|
font.family: M.Theme.iconFontFamily
|
||||||
opacity: _hover.hovered ? 1 : 0
|
opacity: _hover.hovered ? 1 : 0
|
||||||
|
|
||||||
HoverHandler {
|
HoverHandler {
|
||||||
|
|
@ -164,9 +163,9 @@ Item {
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
text: root.notif?.appName ?? "Notification"
|
text: root.notif?.appName ?? "Notification"
|
||||||
color: S.Theme.base04
|
color: M.Theme.base04
|
||||||
font.pixelSize: S.Theme.fontSize - 2
|
font.pixelSize: M.Theme.fontSize - 2
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
width: parent.width - _timeText.implicitWidth - 4
|
width: parent.width - _timeText.implicitWidth - 4
|
||||||
elide: Text.ElideRight
|
elide: Text.ElideRight
|
||||||
}
|
}
|
||||||
|
|
@ -174,9 +173,9 @@ Item {
|
||||||
Text {
|
Text {
|
||||||
id: _timeText
|
id: _timeText
|
||||||
text: root.notif?.timeStr ?? ""
|
text: root.notif?.timeStr ?? ""
|
||||||
color: S.Theme.base03
|
color: M.Theme.base03
|
||||||
font.pixelSize: S.Theme.fontSize - 2
|
font.pixelSize: M.Theme.fontSize - 2
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -187,9 +186,9 @@ Item {
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
text: root.notif?.summary ?? ""
|
text: root.notif?.summary ?? ""
|
||||||
color: S.Theme.base05
|
color: M.Theme.base05
|
||||||
font.pixelSize: S.Theme.fontSize
|
font.pixelSize: M.Theme.fontSize
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
font.bold: true
|
font.bold: true
|
||||||
elide: Text.ElideRight
|
elide: Text.ElideRight
|
||||||
width: parent.width - _inlineTime.implicitWidth - 4
|
width: parent.width - _inlineTime.implicitWidth - 4
|
||||||
|
|
@ -198,9 +197,9 @@ Item {
|
||||||
Text {
|
Text {
|
||||||
id: _inlineTime
|
id: _inlineTime
|
||||||
text: root.notif?.timeStr ?? ""
|
text: root.notif?.timeStr ?? ""
|
||||||
color: S.Theme.base03
|
color: M.Theme.base03
|
||||||
font.pixelSize: S.Theme.fontSize - 2
|
font.pixelSize: M.Theme.fontSize - 2
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -209,9 +208,9 @@ Item {
|
||||||
visible: root.showAppName
|
visible: root.showAppName
|
||||||
width: parent.width
|
width: parent.width
|
||||||
text: root.notif?.summary ?? ""
|
text: root.notif?.summary ?? ""
|
||||||
color: S.Theme.base05
|
color: M.Theme.base05
|
||||||
font.pixelSize: S.Theme.fontSize
|
font.pixelSize: M.Theme.fontSize
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
font.bold: true
|
font.bold: true
|
||||||
elide: Text.ElideRight
|
elide: Text.ElideRight
|
||||||
wrapMode: Text.WordWrap
|
wrapMode: Text.WordWrap
|
||||||
|
|
@ -221,9 +220,9 @@ Item {
|
||||||
Text {
|
Text {
|
||||||
width: parent.width
|
width: parent.width
|
||||||
text: root.notif?.body ?? ""
|
text: root.notif?.body ?? ""
|
||||||
color: S.Theme.base04
|
color: M.Theme.base04
|
||||||
font.pixelSize: S.Theme.fontSize - 1
|
font.pixelSize: M.Theme.fontSize - 1
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
elide: Text.ElideRight
|
elide: Text.ElideRight
|
||||||
wrapMode: Text.WordWrap
|
wrapMode: Text.WordWrap
|
||||||
maximumLineCount: root.bodyMaxLines
|
maximumLineCount: root.bodyMaxLines
|
||||||
|
|
@ -244,9 +243,9 @@ Item {
|
||||||
required property var modelData
|
required property var modelData
|
||||||
width: _actText.implicitWidth + 12
|
width: _actText.implicitWidth + 12
|
||||||
height: _actText.implicitHeight + 6
|
height: _actText.implicitHeight + 6
|
||||||
radius: S.Theme.radius
|
radius: M.Theme.radius
|
||||||
color: _actHover.hovered ? S.Theme.base03 : "transparent"
|
color: _actHover.hovered ? M.Theme.base03 : "transparent"
|
||||||
border.color: S.Theme.base03
|
border.color: M.Theme.base03
|
||||||
border.width: 1
|
border.width: 1
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
|
|
@ -254,8 +253,8 @@ Item {
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
text: parent.modelData.text
|
text: parent.modelData.text
|
||||||
color: root.accentColor
|
color: root.accentColor
|
||||||
font.pixelSize: S.Theme.fontSize - 2
|
font.pixelSize: M.Theme.fontSize - 2
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
}
|
}
|
||||||
|
|
||||||
HoverHandler {
|
HoverHandler {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
M.HoverPanel {
|
M.HoverPanel {
|
||||||
id: menuWindow
|
id: menuWindow
|
||||||
|
|
@ -19,9 +18,9 @@ M.HoverPanel {
|
||||||
anchors.leftMargin: 12
|
anchors.leftMargin: 12
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
text: "Notifications"
|
text: "Notifications"
|
||||||
color: S.Theme.base05
|
color: M.Theme.base05
|
||||||
font.pixelSize: S.Theme.fontSize + 1
|
font.pixelSize: M.Theme.fontSize + 1
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
font.bold: true
|
font.bold: true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -34,9 +33,9 @@ M.HoverPanel {
|
||||||
// DND toggle
|
// DND toggle
|
||||||
Text {
|
Text {
|
||||||
text: M.NotifService.dnd ? "\uDB82\uDE93" : "\uDB80\uDC9C"
|
text: M.NotifService.dnd ? "\uDB82\uDE93" : "\uDB80\uDC9C"
|
||||||
color: M.NotifService.dnd ? S.Theme.base09 : S.Theme.base04
|
color: M.NotifService.dnd ? M.Theme.base09 : M.Theme.base04
|
||||||
font.pixelSize: S.Theme.fontSize
|
font.pixelSize: M.Theme.fontSize
|
||||||
font.family: S.Theme.iconFontFamily
|
font.family: M.Theme.iconFontFamily
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
|
||||||
MouseArea {
|
MouseArea {
|
||||||
|
|
@ -49,9 +48,9 @@ M.HoverPanel {
|
||||||
// Clear all
|
// Clear all
|
||||||
Text {
|
Text {
|
||||||
text: "\uF1F8"
|
text: "\uF1F8"
|
||||||
color: clearArea.containsMouse ? S.Theme.base08 : S.Theme.base04
|
color: clearArea.containsMouse ? M.Theme.base08 : M.Theme.base04
|
||||||
font.pixelSize: S.Theme.fontSize
|
font.pixelSize: M.Theme.fontSize
|
||||||
font.family: S.Theme.iconFontFamily
|
font.family: M.Theme.iconFontFamily
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
visible: M.NotifService.count > 0
|
visible: M.NotifService.count > 0
|
||||||
|
|
||||||
|
|
@ -220,14 +219,14 @@ M.HoverPanel {
|
||||||
width: menuWindow.contentWidth - 16
|
width: menuWindow.contentWidth - 16
|
||||||
height: 1
|
height: 1
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
color: S.Theme.base03
|
color: M.Theme.base03
|
||||||
}
|
}
|
||||||
|
|
||||||
// Notification list (scrollable)
|
// Notification list (scrollable)
|
||||||
ListView {
|
ListView {
|
||||||
id: notifList
|
id: notifList
|
||||||
width: menuWindow.contentWidth
|
width: menuWindow.contentWidth
|
||||||
height: Math.min(contentHeight, 60 * (S.Modules.notifications.maxVisible || 10))
|
height: Math.min(contentHeight, 60 * (M.Modules.notifications.maxVisible || 10))
|
||||||
clip: true
|
clip: true
|
||||||
boundsBehavior: Flickable.StopAtBounds
|
boundsBehavior: Flickable.StopAtBounds
|
||||||
model: menuWindow._flatModel
|
model: menuWindow._flatModel
|
||||||
|
|
@ -254,7 +253,7 @@ M.HoverPanel {
|
||||||
|
|
||||||
readonly property real _targetHeight: {
|
readonly property real _targetHeight: {
|
||||||
if (_type === "header")
|
if (_type === "header")
|
||||||
return modelData.collapsed ? (28 + modelData.count * (S.Theme.fontSize + 4)) : 28;
|
return modelData.collapsed ? (28 + modelData.count * (M.Theme.fontSize + 4)) : 28;
|
||||||
return _notifCard.implicitHeight;
|
return _notifCard.implicitHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -324,8 +323,8 @@ M.HoverPanel {
|
||||||
anchors.leftMargin: 10
|
anchors.leftMargin: 10
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
anchors.topMargin: (28 - height) / 2
|
anchors.topMargin: (28 - height) / 2
|
||||||
width: S.Theme.fontSize + 2
|
width: M.Theme.fontSize + 2
|
||||||
height: S.Theme.fontSize + 2
|
height: M.Theme.fontSize + 2
|
||||||
source: {
|
source: {
|
||||||
if (notifDelegate._type !== "header")
|
if (notifDelegate._type !== "header")
|
||||||
return "";
|
return "";
|
||||||
|
|
@ -336,7 +335,7 @@ M.HoverPanel {
|
||||||
}
|
}
|
||||||
visible: status === Image.Ready
|
visible: status === Image.Ready
|
||||||
fillMode: Image.PreserveAspectFit
|
fillMode: Image.PreserveAspectFit
|
||||||
sourceSize: Qt.size(S.Theme.fontSize + 2, S.Theme.fontSize + 2)
|
sourceSize: Qt.size(M.Theme.fontSize + 2, M.Theme.fontSize + 2)
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -349,9 +348,9 @@ M.HoverPanel {
|
||||||
height: 28
|
height: 28
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
text: notifDelegate._type === "header" && notifDelegate.modelData.collapsed ? "\u25B8" : "\u25BE"
|
text: notifDelegate._type === "header" && notifDelegate.modelData.collapsed ? "\u25B8" : "\u25BE"
|
||||||
color: S.Theme.base04
|
color: M.Theme.base04
|
||||||
font.pixelSize: S.Theme.fontSize - 2
|
font.pixelSize: M.Theme.fontSize - 2
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
opacity: _headerHover.hovered ? 1 : 0
|
opacity: _headerHover.hovered ? 1 : 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -365,9 +364,9 @@ M.HoverPanel {
|
||||||
height: 28
|
height: 28
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
text: notifDelegate._type === "header" ? (notifDelegate.modelData.appName || "Unknown") : ""
|
text: notifDelegate._type === "header" ? (notifDelegate.modelData.appName || "Unknown") : ""
|
||||||
color: S.Theme.base05
|
color: M.Theme.base05
|
||||||
font.pixelSize: S.Theme.fontSize - 1
|
font.pixelSize: M.Theme.fontSize - 1
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
font.bold: true
|
font.bold: true
|
||||||
elide: Text.ElideRight
|
elide: Text.ElideRight
|
||||||
}
|
}
|
||||||
|
|
@ -381,9 +380,9 @@ M.HoverPanel {
|
||||||
height: 28
|
height: 28
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
text: "\uF1F8"
|
text: "\uF1F8"
|
||||||
color: _groupDismissHover.hovered ? S.Theme.base08 : S.Theme.base04
|
color: _groupDismissHover.hovered ? M.Theme.base08 : M.Theme.base04
|
||||||
font.pixelSize: S.Theme.fontSize - 1
|
font.pixelSize: M.Theme.fontSize - 1
|
||||||
font.family: S.Theme.iconFontFamily
|
font.family: M.Theme.iconFontFamily
|
||||||
opacity: _headerHover.hovered ? 1 : 0
|
opacity: _headerHover.hovered ? 1 : 0
|
||||||
|
|
||||||
HoverHandler {
|
HoverHandler {
|
||||||
|
|
@ -410,14 +409,14 @@ M.HoverPanel {
|
||||||
anchors.leftMargin: 10
|
anchors.leftMargin: 10
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.rightMargin: 10
|
anchors.rightMargin: 10
|
||||||
y: 28 + index * (S.Theme.fontSize + 4)
|
y: 28 + index * (M.Theme.fontSize + 4)
|
||||||
height: S.Theme.fontSize + 4
|
height: M.Theme.fontSize + 4
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
text: modelData
|
text: modelData
|
||||||
elide: Text.ElideRight
|
elide: Text.ElideRight
|
||||||
font.pixelSize: S.Theme.fontSize - 2
|
font.pixelSize: M.Theme.fontSize - 2
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
color: S.Theme.base04
|
color: M.Theme.base04
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -480,8 +479,8 @@ M.HoverPanel {
|
||||||
horizontalAlignment: Text.AlignHCenter
|
horizontalAlignment: Text.AlignHCenter
|
||||||
verticalAlignment: Text.AlignVCenter
|
verticalAlignment: Text.AlignVCenter
|
||||||
text: "No notifications"
|
text: "No notifications"
|
||||||
color: S.Theme.base04
|
color: M.Theme.base04
|
||||||
font.pixelSize: S.Theme.fontSize
|
font.pixelSize: M.Theme.fontSize
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell.Services.Notifications
|
import Quickshell.Services.Notifications
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
QtObject {
|
QtObject {
|
||||||
id: root
|
id: root
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ import Quickshell
|
||||||
import Quickshell.Wayland
|
import Quickshell.Wayland
|
||||||
import Quickshell.Services.Notifications
|
import Quickshell.Services.Notifications
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
PanelWindow {
|
PanelWindow {
|
||||||
id: root
|
id: root
|
||||||
|
|
@ -34,7 +33,7 @@ PanelWindow {
|
||||||
property var _knownIds: ({})
|
property var _knownIds: ({})
|
||||||
|
|
||||||
Repeater {
|
Repeater {
|
||||||
model: M.NotifService.popups.slice(0, S.Modules.notifications.maxPopups || 4)
|
model: M.NotifService.popups.slice(0, M.Modules.notifications.maxPopups || 4)
|
||||||
|
|
||||||
delegate: Item {
|
delegate: Item {
|
||||||
id: popupItem
|
id: popupItem
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Services.Notifications
|
import Quickshell.Services.Notifications
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
QtObject {
|
QtObject {
|
||||||
id: root
|
id: root
|
||||||
|
|
@ -97,7 +96,7 @@ QtObject {
|
||||||
});
|
});
|
||||||
|
|
||||||
// Trim excess popups
|
// Trim excess popups
|
||||||
const max = S.Modules.notifications.maxPopups || 4;
|
const max = M.Modules.notifications.maxPopups || 4;
|
||||||
const currentPopups = root.list.filter(n => n.popup);
|
const currentPopups = root.list.filter(n => n.popup);
|
||||||
if (currentPopups.length > max) {
|
if (currentPopups.length > max) {
|
||||||
for (let i = max; i < currentPopups.length; i++)
|
for (let i = max; i < currentPopups.length; i++)
|
||||||
|
|
@ -107,13 +106,13 @@ QtObject {
|
||||||
|
|
||||||
// Auto-expire popup (skip for critical)
|
// Auto-expire popup (skip for critical)
|
||||||
if (item.popup && !isCritical) {
|
if (item.popup && !isCritical) {
|
||||||
const timeout = notif.expireTimeout > 0 ? notif.expireTimeout : (S.Modules.notifications.timeout || 3000);
|
const timeout = notif.expireTimeout > 0 ? notif.expireTimeout : (M.Modules.notifications.timeout || 3000);
|
||||||
item._expireTimer.interval = timeout;
|
item._expireTimer.interval = timeout;
|
||||||
item._expireTimer.running = true;
|
item._expireTimer.running = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Trim history (-1 = unlimited)
|
// Trim history (-1 = unlimited)
|
||||||
const maxHistory = S.Modules.notifications.maxHistory ?? -1;
|
const maxHistory = M.Modules.notifications.maxHistory ?? -1;
|
||||||
while (maxHistory > 0 && root.list.length > maxHistory) {
|
while (maxHistory > 0 && root.list.length > maxHistory) {
|
||||||
const old = root.list.pop();
|
const old = root.list.pop();
|
||||||
old.finishDismiss();
|
old.finishDismiss();
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,10 @@ import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Services.Notifications
|
import Quickshell.Services.Notifications
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
M.BarSection {
|
M.BarSection {
|
||||||
id: root
|
id: root
|
||||||
spacing: S.Theme.moduleSpacing
|
spacing: M.Theme.moduleSpacing
|
||||||
tooltip: {
|
tooltip: {
|
||||||
const parts = [M.NotifService.count + " notification" + (M.NotifService.count !== 1 ? "s" : "")];
|
const parts = [M.NotifService.count + " notification" + (M.NotifService.count !== 1 ? "s" : "")];
|
||||||
if (M.NotifService.dnd)
|
if (M.NotifService.dnd)
|
||||||
|
|
@ -24,13 +23,13 @@ M.BarSection {
|
||||||
return M.NotifService.count > 0 ? "\uDB80\uDCA0" : "\uDB82\uDE93";
|
return M.NotifService.count > 0 ? "\uDB80\uDCA0" : "\uDB82\uDE93";
|
||||||
return M.NotifService.count > 0 ? "\uDB84\uDD6B" : "\uDB80\uDC9C";
|
return M.NotifService.count > 0 ? "\uDB84\uDD6B" : "\uDB80\uDC9C";
|
||||||
}
|
}
|
||||||
color: M.NotifService.dnd ? S.Theme.base04 : root.accentColor
|
color: M.NotifService.dnd ? M.Theme.base04 : root.accentColor
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
M.BarLabel {
|
M.BarLabel {
|
||||||
id: countLabel
|
id: countLabel
|
||||||
label: M.NotifService.count > 0 ? String(M.NotifService.count) + (root.hasUrgent ? "!" : "") : ""
|
label: M.NotifService.count > 0 ? String(M.NotifService.count) + (root.hasUrgent ? "!" : "") : ""
|
||||||
color: root.hasUrgent ? S.Theme.base08 : root.accentColor
|
color: root.hasUrgent ? M.Theme.base08 : root.accentColor
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
|
||||||
transform: Scale {
|
transform: Scale {
|
||||||
|
|
@ -2,8 +2,7 @@ import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Wayland
|
import Quickshell.Wayland
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
import "content" as C
|
||||||
import "../applets" as C
|
|
||||||
|
|
||||||
PanelWindow {
|
PanelWindow {
|
||||||
id: root
|
id: root
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,12 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
property color accentColor: S.Theme.base05
|
property color accentColor: M.Theme.base05
|
||||||
|
|
||||||
color: S.Theme.base01
|
color: M.Theme.base01
|
||||||
opacity: Math.max(S.Theme.barOpacity, 0.85)
|
opacity: Math.max(M.Theme.barOpacity, 0.85)
|
||||||
radius: S.Theme.radius
|
radius: M.Theme.radius
|
||||||
border.color: accentColor
|
border.color: accentColor
|
||||||
border.width: 1
|
border.width: 1
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Io
|
import Quickshell.Io
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
M.BarIcon {
|
M.BarIcon {
|
||||||
id: root
|
id: root
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
M.HoverPanel {
|
M.HoverPanel {
|
||||||
id: menuWindow
|
id: menuWindow
|
||||||
|
|
@ -24,31 +23,31 @@ M.HoverPanel {
|
||||||
label: "Lock",
|
label: "Lock",
|
||||||
icon: "\uF023",
|
icon: "\uF023",
|
||||||
cmd: ["loginctl", "lock-session"],
|
cmd: ["loginctl", "lock-session"],
|
||||||
color: S.Theme.base0D
|
color: M.Theme.base0D
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Suspend",
|
label: "Suspend",
|
||||||
icon: "\uF186",
|
icon: "\uF186",
|
||||||
cmd: ["systemctl", "suspend"],
|
cmd: ["systemctl", "suspend"],
|
||||||
color: S.Theme.base0E
|
color: M.Theme.base0E
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Logout",
|
label: "Logout",
|
||||||
icon: "\uF2F5",
|
icon: "\uF2F5",
|
||||||
cmd: menuWindow._isNiri ? ["niri", "msg", "action", "quit"] : ["loginctl", "terminate-user", ""],
|
cmd: menuWindow._isNiri ? ["niri", "msg", "action", "quit"] : ["loginctl", "terminate-user", ""],
|
||||||
color: S.Theme.base0A
|
color: M.Theme.base0A
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Reboot",
|
label: "Reboot",
|
||||||
icon: "\uF021",
|
icon: "\uF021",
|
||||||
cmd: ["systemctl", "reboot"],
|
cmd: ["systemctl", "reboot"],
|
||||||
color: S.Theme.base09
|
color: M.Theme.base09
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Shutdown",
|
label: "Shutdown",
|
||||||
icon: "\uF011",
|
icon: "\uF011",
|
||||||
cmd: ["systemctl", "poweroff"],
|
cmd: ["systemctl", "poweroff"],
|
||||||
color: S.Theme.base08
|
color: M.Theme.base08
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -65,8 +64,8 @@ M.HoverPanel {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
anchors.leftMargin: 4
|
anchors.leftMargin: 4
|
||||||
anchors.rightMargin: 4
|
anchors.rightMargin: 4
|
||||||
color: entryArea.containsMouse ? S.Theme.base02 : "transparent"
|
color: entryArea.containsMouse ? M.Theme.base02 : "transparent"
|
||||||
radius: S.Theme.radius
|
radius: M.Theme.radius
|
||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
|
|
@ -76,8 +75,8 @@ M.HoverPanel {
|
||||||
anchors.leftMargin: 12
|
anchors.leftMargin: 12
|
||||||
text: entry.modelData.icon
|
text: entry.modelData.icon
|
||||||
color: entry.modelData.color
|
color: entry.modelData.color
|
||||||
font.pixelSize: S.Theme.fontSize + 1
|
font.pixelSize: M.Theme.fontSize + 1
|
||||||
font.family: S.Theme.iconFontFamily
|
font.family: M.Theme.iconFontFamily
|
||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
|
|
@ -85,9 +84,9 @@ M.HoverPanel {
|
||||||
anchors.left: entryIcon.right
|
anchors.left: entryIcon.right
|
||||||
anchors.leftMargin: 10
|
anchors.leftMargin: 10
|
||||||
text: entry.modelData.label
|
text: entry.modelData.label
|
||||||
color: S.Theme.base05
|
color: M.Theme.base05
|
||||||
font.pixelSize: S.Theme.fontSize
|
font.pixelSize: M.Theme.fontSize
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
}
|
}
|
||||||
|
|
||||||
MouseArea {
|
MouseArea {
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,11 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
M.BarIcon {
|
M.BarIcon {
|
||||||
id: root
|
id: root
|
||||||
tooltip: "Power profile: " + (M.PowerProfileService.profile || "unknown")
|
tooltip: "Power profile: " + (M.PowerProfileService.profile || "unknown")
|
||||||
|
|
||||||
color: M.PowerProfileService.profile === "performance" ? S.Theme.base09 : M.PowerProfileService.profile === "power-saver" ? S.Theme.base0B : root.accentColor
|
color: M.PowerProfileService.profile === "performance" ? M.Theme.base09 : M.PowerProfileService.profile === "power-saver" ? M.Theme.base0B : root.accentColor
|
||||||
|
|
||||||
icon: {
|
icon: {
|
||||||
if (M.PowerProfileService.profile === "performance")
|
if (M.PowerProfileService.profile === "performance")
|
||||||
|
|
@ -3,7 +3,6 @@ pragma Singleton
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell.Io
|
import Quickshell.Io
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
QtObject {
|
QtObject {
|
||||||
id: root
|
id: root
|
||||||
|
|
@ -12,7 +11,7 @@ QtObject {
|
||||||
readonly property bool powerSaver: profile === "power-saver"
|
readonly property bool powerSaver: profile === "power-saver"
|
||||||
|
|
||||||
property var _proc: Process {
|
property var _proc: Process {
|
||||||
running: S.Modules.powerProfile.enable
|
running: M.Modules.powerProfile.enable
|
||||||
command: ["powerprofilesctl", "get"]
|
command: ["powerprofilesctl", "get"]
|
||||||
stdout: StdioCollector {
|
stdout: StdioCollector {
|
||||||
onStreamFinished: root.profile = text.trim()
|
onStreamFinished: root.profile = text.trim()
|
||||||
|
|
@ -20,7 +19,7 @@ QtObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
property var _monitor: Process {
|
property var _monitor: Process {
|
||||||
running: S.Modules.powerProfile.enable
|
running: M.Modules.powerProfile.enable
|
||||||
command: ["sh", "-c", "dbus-monitor --system \"interface='org.freedesktop.DBus.Properties',member='PropertiesChanged',path='/net/hadess/PowerProfiles'\" 2>/dev/null"]
|
command: ["sh", "-c", "dbus-monitor --system \"interface='org.freedesktop.DBus.Properties',member='PropertiesChanged',path='/net/hadess/PowerProfiles'\" 2>/dev/null"]
|
||||||
stdout: SplitParser {
|
stdout: SplitParser {
|
||||||
splitMarker: "\n"
|
splitMarker: "\n"
|
||||||
|
|
@ -35,7 +34,7 @@ QtObject {
|
||||||
|
|
||||||
property var _poll: Timer {
|
property var _poll: Timer {
|
||||||
interval: 60000
|
interval: 60000
|
||||||
running: S.Modules.powerProfile.enable
|
running: M.Modules.powerProfile.enable
|
||||||
repeat: true
|
repeat: true
|
||||||
onTriggered: root._proc.running = true
|
onTriggered: root._proc.running = true
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,10 @@ import QtQuick
|
||||||
import QtQuick.Effects
|
import QtQuick.Effects
|
||||||
import Quickshell.Services.Pipewire
|
import Quickshell.Services.Pipewire
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
Row {
|
Row {
|
||||||
id: root
|
id: root
|
||||||
spacing: S.Theme.moduleSpacing
|
spacing: M.Theme.moduleSpacing
|
||||||
|
|
||||||
// Only detect active client streams, not hardware sources/devices
|
// Only detect active client streams, not hardware sources/devices
|
||||||
readonly property bool _videoCapture: {
|
readonly property bool _videoCapture: {
|
||||||
|
|
@ -35,21 +34,21 @@ Row {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
visible: S.Modules.privacy.enable && (root._videoCapture || root._audioIn)
|
visible: M.Modules.privacy.enable && (root._videoCapture || root._audioIn)
|
||||||
|
|
||||||
// Screenshare indicator
|
// Screenshare indicator
|
||||||
Text {
|
Text {
|
||||||
visible: root._videoCapture
|
visible: root._videoCapture
|
||||||
text: "\uF03D"
|
text: "\uF03D"
|
||||||
color: S.Theme.base08
|
color: M.Theme.base08
|
||||||
font.pixelSize: S.Theme.fontSize + 2
|
font.pixelSize: M.Theme.fontSize + 2
|
||||||
font.family: S.Theme.iconFontFamily
|
font.family: M.Theme.iconFontFamily
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
|
||||||
layer.enabled: true
|
layer.enabled: true
|
||||||
layer.effect: MultiEffect {
|
layer.effect: MultiEffect {
|
||||||
shadowEnabled: true
|
shadowEnabled: true
|
||||||
shadowColor: S.Theme.base08
|
shadowColor: M.Theme.base08
|
||||||
shadowBlur: 0.8
|
shadowBlur: 0.8
|
||||||
shadowVerticalOffset: 0
|
shadowVerticalOffset: 0
|
||||||
shadowHorizontalOffset: 0
|
shadowHorizontalOffset: 0
|
||||||
|
|
@ -75,15 +74,15 @@ Row {
|
||||||
Text {
|
Text {
|
||||||
visible: root._audioIn
|
visible: root._audioIn
|
||||||
text: "\uF130"
|
text: "\uF130"
|
||||||
color: S.Theme.base0B
|
color: M.Theme.base0B
|
||||||
font.pixelSize: S.Theme.fontSize + 2
|
font.pixelSize: M.Theme.fontSize + 2
|
||||||
font.family: S.Theme.iconFontFamily
|
font.family: M.Theme.iconFontFamily
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
|
||||||
layer.enabled: true
|
layer.enabled: true
|
||||||
layer.effect: MultiEffect {
|
layer.effect: MultiEffect {
|
||||||
shadowEnabled: true
|
shadowEnabled: true
|
||||||
shadowColor: S.Theme.base0B
|
shadowColor: M.Theme.base0B
|
||||||
shadowBlur: 0.8
|
shadowBlur: 0.8
|
||||||
shadowVerticalOffset: 0
|
shadowVerticalOffset: 0
|
||||||
shadowHorizontalOffset: 0
|
shadowHorizontalOffset: 0
|
||||||
|
|
@ -2,7 +2,6 @@ import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Wayland
|
import Quickshell.Wayland
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
// Draws rounded black corners at the edges of each screen.
|
// Draws rounded black corners at the edges of each screen.
|
||||||
// Disabled when screenRadius is 0.
|
// Disabled when screenRadius is 0.
|
||||||
|
|
@ -11,7 +10,7 @@ Item {
|
||||||
|
|
||||||
required property var screen
|
required property var screen
|
||||||
|
|
||||||
readonly property int _r: S.Theme.screenRadius
|
readonly property int _r: M.Theme.screenRadius
|
||||||
|
|
||||||
component Corner: PanelWindow {
|
component Corner: PanelWindow {
|
||||||
id: win
|
id: win
|
||||||
|
|
|
||||||
|
|
@ -1,29 +1,28 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
import "content" as C
|
||||||
import "../applets" as C
|
|
||||||
|
|
||||||
M.BarSection {
|
M.BarSection {
|
||||||
id: root
|
id: root
|
||||||
spacing: Math.max(1, S.Theme.moduleSpacing - 2)
|
spacing: Math.max(1, M.Theme.moduleSpacing - 2)
|
||||||
tooltip: ""
|
tooltip: ""
|
||||||
|
|
||||||
readonly property int _warm: S.Modules.temperature.warm || 80
|
readonly property int _warm: M.Modules.temperature.warm || 80
|
||||||
readonly property int _hot: S.Modules.temperature.hot || 90
|
readonly property int _hot: M.Modules.temperature.hot || 90
|
||||||
readonly property string _deviceFilter: S.Modules.temperature.device || ""
|
readonly property string _deviceFilter: M.Modules.temperature.device || ""
|
||||||
|
|
||||||
// If a device filter is set, use that device's temp; otherwise fall back to system max
|
// If a device filter is set, use that device's temp; otherwise fall back to system max
|
||||||
readonly property int _temp: {
|
readonly property int _temp: {
|
||||||
if (_deviceFilter !== "") {
|
if (_deviceFilter !== "") {
|
||||||
const dev = S.SystemStats.tempDevices.find(d => d.name === _deviceFilter);
|
const dev = M.SystemStats.tempDevices.find(d => d.name === _deviceFilter);
|
||||||
if (dev)
|
if (dev)
|
||||||
return dev.celsius;
|
return dev.celsius;
|
||||||
}
|
}
|
||||||
return S.SystemStats.tempCelsius;
|
return M.SystemStats.tempCelsius;
|
||||||
}
|
}
|
||||||
|
|
||||||
property color _stateColor: _temp > _hot ? S.Theme.base08 : _temp > _warm ? S.Theme.base0A : root.accentColor
|
property color _stateColor: _temp > _hot ? M.Theme.base08 : _temp > _warm ? M.Theme.base0A : root.accentColor
|
||||||
Behavior on _stateColor {
|
Behavior on _stateColor {
|
||||||
ColorAnimation {
|
ColorAnimation {
|
||||||
duration: 300
|
duration: 300
|
||||||
|
|
@ -77,13 +76,13 @@ M.BarSection {
|
||||||
panelTitle: "Temperature"
|
panelTitle: "Temperature"
|
||||||
contentWidth: 220
|
contentWidth: 220
|
||||||
|
|
||||||
C.TemperatureApplet {
|
C.TemperatureContent {
|
||||||
width: hoverPanel.contentWidth
|
width: hoverPanel.contentWidth
|
||||||
temp: root._temp
|
temp: root._temp
|
||||||
warm: root._warm
|
warm: root._warm
|
||||||
hot: root._hot
|
hot: root._hot
|
||||||
history: S.SystemStats.tempHistory
|
history: M.SystemStats.tempHistory
|
||||||
devices: S.SystemStats.tempDevices
|
devices: M.SystemStats.tempDevices
|
||||||
accentColor: root.accentColor
|
accentColor: root.accentColor
|
||||||
deviceFilter: root._deviceFilter
|
deviceFilter: root._deviceFilter
|
||||||
active: root._showPanel
|
active: root._showPanel
|
||||||
|
|
@ -5,12 +5,11 @@ import Quickshell
|
||||||
import Quickshell.Services.SystemTray
|
import Quickshell.Services.SystemTray
|
||||||
|
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
RowLayout {
|
RowLayout {
|
||||||
id: root
|
id: root
|
||||||
spacing: S.Theme.moduleSpacing + 2
|
spacing: M.Theme.moduleSpacing + 2
|
||||||
visible: S.Modules.tray.enable && SystemTray.items.length > 0
|
visible: M.Modules.tray.enable && SystemTray.items.length > 0
|
||||||
|
|
||||||
required property var bar
|
required property var bar
|
||||||
property var _activeMenu: null
|
property var _activeMenu: null
|
||||||
|
|
@ -26,8 +25,8 @@ RowLayout {
|
||||||
property bool _hovered: false
|
property bool _hovered: false
|
||||||
property real _pulseOpacity: 1
|
property real _pulseOpacity: 1
|
||||||
|
|
||||||
implicitWidth: S.Theme.fontSize + 4
|
implicitWidth: M.Theme.fontSize + 4
|
||||||
implicitHeight: S.Theme.fontSize + 4
|
implicitHeight: M.Theme.fontSize + 4
|
||||||
|
|
||||||
SequentialAnimation {
|
SequentialAnimation {
|
||||||
running: iconItem._needsAttention
|
running: iconItem._needsAttention
|
||||||
|
|
@ -57,16 +56,16 @@ RowLayout {
|
||||||
layer.enabled: iconItem._needsAttention || iconItem._hovered
|
layer.enabled: iconItem._needsAttention || iconItem._hovered
|
||||||
layer.effect: MultiEffect {
|
layer.effect: MultiEffect {
|
||||||
shadowEnabled: true
|
shadowEnabled: true
|
||||||
shadowColor: iconItem._needsAttention ? S.Theme.base08 : S.Theme.base05
|
shadowColor: iconItem._needsAttention ? M.Theme.base08 : M.Theme.base05
|
||||||
shadowBlur: iconItem._needsAttention ? 0.8 : 0.5
|
shadowBlur: iconItem._needsAttention ? 0.8 : 0.5
|
||||||
shadowVerticalOffset: 0
|
shadowVerticalOffset: 0
|
||||||
shadowHorizontalOffset: 0
|
shadowHorizontalOffset: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
S.ThemedIcon {
|
M.ThemedIcon {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
source: iconItem.modelData.icon
|
source: iconItem.modelData.icon
|
||||||
tint: iconItem._needsAttention ? S.Theme.base08 : (root.parent?.accentColor ?? S.Theme.base05)
|
tint: iconItem._needsAttention ? M.Theme.base08 : (root.parent?.accentColor ?? M.Theme.base05)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -78,7 +77,7 @@ RowLayout {
|
||||||
M.FlyoutState.text = tip;
|
M.FlyoutState.text = tip;
|
||||||
M.FlyoutState.itemX = iconItem.mapToGlobal(iconItem.width / 2, 0).x - (QsWindow.window?.screen?.x ?? 0);
|
M.FlyoutState.itemX = iconItem.mapToGlobal(iconItem.width / 2, 0).x - (QsWindow.window?.screen?.x ?? 0);
|
||||||
M.FlyoutState.screen = QsWindow.window?.screen ?? null;
|
M.FlyoutState.screen = QsWindow.window?.screen ?? null;
|
||||||
M.FlyoutState.accentColor = root.parent?.accentColor ?? S.Theme.base05;
|
M.FlyoutState.accentColor = root.parent?.accentColor ?? M.Theme.base05;
|
||||||
M.FlyoutState.visible = true;
|
M.FlyoutState.visible = true;
|
||||||
} else if (!hovered) {
|
} else if (!hovered) {
|
||||||
M.FlyoutState.visible = false;
|
M.FlyoutState.visible = false;
|
||||||
|
|
@ -111,7 +110,7 @@ RowLayout {
|
||||||
id: menuLoader
|
id: menuLoader
|
||||||
active: false
|
active: false
|
||||||
M.TrayMenu {
|
M.TrayMenu {
|
||||||
accentColor: root.parent?.accentColor ?? S.Theme.base05
|
accentColor: root.parent?.accentColor ?? M.Theme.base05
|
||||||
handle: iconItem.modelData.menu
|
handle: iconItem.modelData.menu
|
||||||
screen: root.bar.screen
|
screen: root.bar.screen
|
||||||
anchorX: iconItem.mapToGlobal(iconItem.width / 2, 0).x - (QsWindow.window?.screen?.x ?? 0)
|
anchorX: iconItem.mapToGlobal(iconItem.width / 2, 0).x - (QsWindow.window?.screen?.x ?? 0)
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
M.HoverPanel {
|
M.HoverPanel {
|
||||||
id: menuWindow
|
id: menuWindow
|
||||||
|
|
@ -27,8 +26,8 @@ M.HoverPanel {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
anchors.leftMargin: 4
|
anchors.leftMargin: 4
|
||||||
anchors.rightMargin: 4
|
anchors.rightMargin: 4
|
||||||
color: backArea.containsMouse ? S.Theme.base02 : "transparent"
|
color: backArea.containsMouse ? M.Theme.base02 : "transparent"
|
||||||
radius: S.Theme.radius
|
radius: M.Theme.radius
|
||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
|
|
@ -36,9 +35,9 @@ M.HoverPanel {
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.leftMargin: 12
|
anchors.leftMargin: 12
|
||||||
text: "\u2039 Back"
|
text: "\u2039 Back"
|
||||||
color: S.Theme.base05
|
color: M.Theme.base05
|
||||||
font.pixelSize: S.Theme.fontSize
|
font.pixelSize: M.Theme.fontSize
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
}
|
}
|
||||||
|
|
||||||
MouseArea {
|
MouseArea {
|
||||||
|
|
@ -72,7 +71,7 @@ M.HoverPanel {
|
||||||
anchors.leftMargin: 8
|
anchors.leftMargin: 8
|
||||||
anchors.rightMargin: 8
|
anchors.rightMargin: 8
|
||||||
height: 1
|
height: 1
|
||||||
color: S.Theme.base03
|
color: M.Theme.base03
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
|
|
@ -80,18 +79,18 @@ M.HoverPanel {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
anchors.leftMargin: 4
|
anchors.leftMargin: 4
|
||||||
anchors.rightMargin: 4
|
anchors.rightMargin: 4
|
||||||
color: rowArea.containsMouse && entryItem.modelData.enabled ? S.Theme.base02 : "transparent"
|
color: rowArea.containsMouse && entryItem.modelData.enabled ? M.Theme.base02 : "transparent"
|
||||||
radius: S.Theme.radius
|
radius: M.Theme.radius
|
||||||
}
|
}
|
||||||
|
|
||||||
S.ThemedIcon {
|
M.ThemedIcon {
|
||||||
id: entryIcon
|
id: entryIcon
|
||||||
visible: !entryItem.modelData.isSeparator && entryItem.modelData.icon !== ""
|
visible: !entryItem.modelData.isSeparator && entryItem.modelData.icon !== ""
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.leftMargin: 12
|
anchors.leftMargin: 12
|
||||||
width: S.Theme.fontSize
|
width: M.Theme.fontSize
|
||||||
height: S.Theme.fontSize
|
height: M.Theme.fontSize
|
||||||
source: entryItem.modelData.icon
|
source: entryItem.modelData.icon
|
||||||
tint: menuWindow.accentColor
|
tint: menuWindow.accentColor
|
||||||
fillMode: Image.PreserveAspectFit
|
fillMode: Image.PreserveAspectFit
|
||||||
|
|
@ -105,9 +104,9 @@ M.HoverPanel {
|
||||||
anchors.right: entryChevron.visible ? entryChevron.left : parent.right
|
anchors.right: entryChevron.visible ? entryChevron.left : parent.right
|
||||||
anchors.rightMargin: entryChevron.visible ? 4 : 12
|
anchors.rightMargin: entryChevron.visible ? 4 : 12
|
||||||
text: entryItem.modelData.text
|
text: entryItem.modelData.text
|
||||||
color: entryItem.modelData.enabled ? S.Theme.base05 : S.Theme.base03
|
color: entryItem.modelData.enabled ? M.Theme.base05 : M.Theme.base03
|
||||||
font.pixelSize: S.Theme.fontSize
|
font.pixelSize: M.Theme.fontSize
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
elide: Text.ElideRight
|
elide: Text.ElideRight
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -118,9 +117,9 @@ M.HoverPanel {
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.rightMargin: 12
|
anchors.rightMargin: 12
|
||||||
text: "\u203A"
|
text: "\u203A"
|
||||||
color: entryItem.modelData.enabled ? S.Theme.base05 : S.Theme.base03
|
color: entryItem.modelData.enabled ? M.Theme.base05 : M.Theme.base03
|
||||||
font.pixelSize: S.Theme.fontSize
|
font.pixelSize: M.Theme.fontSize
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
}
|
}
|
||||||
|
|
||||||
MouseArea {
|
MouseArea {
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,11 @@ import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Services.Pipewire
|
import Quickshell.Services.Pipewire
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
import "content" as C
|
||||||
import "../applets" as C
|
|
||||||
|
|
||||||
M.BarSection {
|
M.BarSection {
|
||||||
id: root
|
id: root
|
||||||
spacing: S.Theme.moduleSpacing
|
spacing: M.Theme.moduleSpacing
|
||||||
tooltip: ""
|
tooltip: ""
|
||||||
|
|
||||||
PwObjectTracker {
|
PwObjectTracker {
|
||||||
|
|
@ -18,7 +17,7 @@ M.BarSection {
|
||||||
readonly property real volume: sink?.audio?.volume ?? 0
|
readonly property real volume: sink?.audio?.volume ?? 0
|
||||||
readonly property bool muted: sink?.audio?.muted ?? false
|
readonly property bool muted: sink?.audio?.muted ?? false
|
||||||
readonly property string _volumeIcon: muted ? "\uF026" : (volume > 0.5 ? "\uF028" : (volume > 0 ? "\uF027" : "\uF026"))
|
readonly property string _volumeIcon: muted ? "\uF026" : (volume > 0.5 ? "\uF028" : (volume > 0 ? "\uF027" : "\uF026"))
|
||||||
readonly property color _volumeColor: muted ? S.Theme.base04 : root.accentColor
|
readonly property color _volumeColor: muted ? M.Theme.base04 : root.accentColor
|
||||||
|
|
||||||
readonly property var _sinkList: {
|
readonly property var _sinkList: {
|
||||||
const sinks = [];
|
const sinks = [];
|
||||||
|
|
@ -115,7 +114,7 @@ M.BarSection {
|
||||||
panelTitle: "Sound"
|
panelTitle: "Sound"
|
||||||
contentWidth: 220
|
contentWidth: 220
|
||||||
|
|
||||||
C.VolumeApplet {
|
C.VolumeContent {
|
||||||
width: hoverPanel.contentWidth
|
width: hoverPanel.contentWidth
|
||||||
sink: root.sink
|
sink: root.sink
|
||||||
sinkList: root._sinkList
|
sinkList: root._sinkList
|
||||||
|
|
@ -1,11 +1,10 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell.Io
|
import Quickshell.Io
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
M.BarSection {
|
M.BarSection {
|
||||||
id: root
|
id: root
|
||||||
spacing: S.Theme.moduleSpacing
|
spacing: M.Theme.moduleSpacing
|
||||||
tooltip: root.weatherTooltip
|
tooltip: root.weatherTooltip
|
||||||
|
|
||||||
property string weatherTooltip: ""
|
property string weatherTooltip: ""
|
||||||
|
|
@ -13,7 +12,7 @@ M.BarSection {
|
||||||
Process {
|
Process {
|
||||||
id: proc
|
id: proc
|
||||||
running: true
|
running: true
|
||||||
command: ["wttrbar"].concat(S.Modules.weather.args)
|
command: ["wttrbar"].concat(M.Modules.weather.args)
|
||||||
stdout: StdioCollector {
|
stdout: StdioCollector {
|
||||||
onStreamFinished: {
|
onStreamFinished: {
|
||||||
try {
|
try {
|
||||||
|
|
@ -28,7 +27,7 @@ M.BarSection {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Timer {
|
Timer {
|
||||||
interval: S.Modules.weather.interval || 3600000
|
interval: M.Modules.weather.interval || 3600000
|
||||||
running: true
|
running: true
|
||||||
repeat: true
|
repeat: true
|
||||||
onTriggered: proc.running = true
|
onTriggered: proc.running = true
|
||||||
|
|
@ -3,11 +3,10 @@ import QtQuick.Effects
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Widgets
|
import Quickshell.Widgets
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
M.BarSection {
|
M.BarSection {
|
||||||
id: root
|
id: root
|
||||||
spacing: S.Theme.moduleSpacing
|
spacing: M.Theme.moduleSpacing
|
||||||
tooltip: M.NiriIpc.focusedAppId ? M.NiriIpc.focusedAppId + "\n" + M.NiriIpc.focusedTitle : M.NiriIpc.focusedTitle
|
tooltip: M.NiriIpc.focusedAppId ? M.NiriIpc.focusedAppId + "\n" + M.NiriIpc.focusedTitle : M.NiriIpc.focusedTitle
|
||||||
|
|
||||||
readonly property string _iconSource: {
|
readonly property string _iconSource: {
|
||||||
|
|
@ -26,7 +25,7 @@ M.BarSection {
|
||||||
id: _icon
|
id: _icon
|
||||||
visible: root._iconSource !== ""
|
visible: root._iconSource !== ""
|
||||||
source: root._iconSource
|
source: root._iconSource
|
||||||
implicitSize: S.Theme.fontSize + 2
|
implicitSize: M.Theme.fontSize + 2
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
layer.enabled: true
|
layer.enabled: true
|
||||||
layer.effect: MultiEffect {
|
layer.effect: MultiEffect {
|
||||||
|
|
@ -2,7 +2,6 @@ import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Io
|
import Quickshell.Io
|
||||||
import "." as M
|
import "." as M
|
||||||
import "../services" as S
|
|
||||||
|
|
||||||
Row {
|
Row {
|
||||||
id: root
|
id: root
|
||||||
|
|
@ -71,7 +70,7 @@ Row {
|
||||||
M.FlyoutState.text = name;
|
M.FlyoutState.text = name;
|
||||||
M.FlyoutState.itemX = pill.mapToGlobal(pill.width / 2, 0).x - (QsWindow.window?.screen?.x ?? 0);
|
M.FlyoutState.itemX = pill.mapToGlobal(pill.width / 2, 0).x - (QsWindow.window?.screen?.x ?? 0);
|
||||||
M.FlyoutState.screen = QsWindow.window?.screen ?? null;
|
M.FlyoutState.screen = QsWindow.window?.screen ?? null;
|
||||||
M.FlyoutState.accentColor = root.parent?.accentColor ?? S.Theme.base05;
|
M.FlyoutState.accentColor = root.parent?.accentColor ?? M.Theme.base05;
|
||||||
M.FlyoutState.visible = true;
|
M.FlyoutState.visible = true;
|
||||||
} else {
|
} else {
|
||||||
M.FlyoutState.visible = false;
|
M.FlyoutState.visible = false;
|
||||||
|
|
@ -79,10 +78,10 @@ Row {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
width: S.Theme.fontSize + 4
|
width: M.Theme.fontSize + 4
|
||||||
height: S.Theme.fontSize + 4
|
height: M.Theme.fontSize + 4
|
||||||
radius: width / 2
|
radius: width / 2
|
||||||
color: pill.active ? (root.parent?.accentColor ?? S.Theme.base0D) : (pill._hovered ? S.Theme.base03 : S.Theme.base02)
|
color: pill.active ? (root.parent?.accentColor ?? M.Theme.base0D) : (pill._hovered ? M.Theme.base03 : M.Theme.base02)
|
||||||
Behavior on color {
|
Behavior on color {
|
||||||
ColorAnimation {
|
ColorAnimation {
|
||||||
duration: 150
|
duration: 150
|
||||||
|
|
@ -92,9 +91,9 @@ Row {
|
||||||
Text {
|
Text {
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
text: pill.modelData.idx
|
text: pill.modelData.idx
|
||||||
color: pill.active ? S.Theme.base00 : (root.parent?.accentColor ?? S.Theme.base05)
|
color: pill.active ? M.Theme.base00 : (root.parent?.accentColor ?? M.Theme.base05)
|
||||||
font.pixelSize: S.Theme.fontSize - 2
|
font.pixelSize: M.Theme.fontSize - 2
|
||||||
font.family: S.Theme.fontFamily
|
font.family: M.Theme.fontFamily
|
||||||
font.bold: pill.active
|
font.bold: pill.active
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import "../services" as M
|
import ".." as M
|
||||||
|
|
||||||
Column {
|
Column {
|
||||||
id: root
|
id: root
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import "../services" as M
|
import ".." as M
|
||||||
|
|
||||||
Column {
|
Column {
|
||||||
id: root
|
id: root
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import "../services" as M
|
import ".." as M
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
id: root
|
id: root
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import "../services" as M
|
import ".." as M
|
||||||
|
|
||||||
Column {
|
Column {
|
||||||
id: root
|
id: root
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell.Services.Mpris
|
import Quickshell.Services.Mpris
|
||||||
import "../services" as M
|
import ".." as M
|
||||||
|
|
||||||
Column {
|
Column {
|
||||||
id: root
|
id: root
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import "../services" as M
|
import ".." as M
|
||||||
|
|
||||||
Column {
|
Column {
|
||||||
id: root
|
id: root
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import Quickshell.Services.Pipewire
|
import Quickshell.Services.Pipewire
|
||||||
import "../services" as M
|
import ".." as M
|
||||||
|
|
||||||
Column {
|
Column {
|
||||||
id: root
|
id: root
|
||||||
8
shell/modules/content/qmldir
Normal file
8
shell/modules/content/qmldir
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
module content
|
||||||
|
HexWaveBackground 1.0 HexWaveBackground.qml
|
||||||
|
VolumeContent 1.0 VolumeContent.qml
|
||||||
|
MprisContent 1.0 MprisContent.qml
|
||||||
|
CpuContent 1.0 CpuContent.qml
|
||||||
|
MemoryContent 1.0 MemoryContent.qml
|
||||||
|
TemperatureContent 1.0 TemperatureContent.qml
|
||||||
|
DiskContent 1.0 DiskContent.qml
|
||||||
|
|
@ -1,47 +1,46 @@
|
||||||
module modules
|
module modules
|
||||||
|
singleton Theme 1.0 Theme.qml
|
||||||
singleton FlyoutState 1.0 FlyoutState.qml
|
singleton FlyoutState 1.0 FlyoutState.qml
|
||||||
|
singleton Modules 1.0 Modules.qml
|
||||||
Bar 1.0 Bar.qml
|
Bar 1.0 Bar.qml
|
||||||
BarGroup 1.0 BarGroup.qml
|
BarGroup 1.0 BarGroup.qml
|
||||||
BarSection 1.0 BarSection.qml
|
BarSection 1.0 BarSection.qml
|
||||||
Flyout 1.0 Flyout.qml
|
Flyout 1.0 Flyout.qml
|
||||||
WorkspacesModule 1.0 WorkspacesModule.qml
|
Workspaces 1.0 Workspaces.qml
|
||||||
WindowTitleModule 1.0 WindowTitleModule.qml
|
WindowTitle 1.0 WindowTitle.qml
|
||||||
ClockModule 1.0 ClockModule.qml
|
Clock 1.0 Clock.qml
|
||||||
VolumeModule 1.0 VolumeModule.qml
|
Volume 1.0 Volume.qml
|
||||||
TrayModule 1.0 TrayModule.qml
|
Tray 1.0 Tray.qml
|
||||||
TrayMenu 1.0 TrayMenu.qml
|
TrayMenu 1.0 TrayMenu.qml
|
||||||
PopupBackground 1.0 PopupBackground.qml
|
PopupBackground 1.0 PopupBackground.qml
|
||||||
HoverPanel 1.0 HoverPanel.qml
|
HoverPanel 1.0 HoverPanel.qml
|
||||||
PowerMenu 1.0 PowerMenu.qml
|
PowerMenu 1.0 PowerMenu.qml
|
||||||
ScreenCorners 1.0 ScreenCorners.qml
|
ScreenCorners 1.0 ScreenCorners.qml
|
||||||
ThemedIcon 1.0 ThemedIcon.qml
|
ThemedIcon 1.0 ThemedIcon.qml
|
||||||
BatteryModule 1.0 BatteryModule.qml
|
Battery 1.0 Battery.qml
|
||||||
MprisModule 1.0 MprisModule.qml
|
Mpris 1.0 Mpris.qml
|
||||||
NetworkModule 1.0 NetworkModule.qml
|
Network 1.0 Network.qml
|
||||||
NetworkMenu 1.0 NetworkMenu.qml
|
NetworkMenu 1.0 NetworkMenu.qml
|
||||||
BluetoothModule 1.0 BluetoothModule.qml
|
Bluetooth 1.0 Bluetooth.qml
|
||||||
BluetoothMenu 1.0 BluetoothMenu.qml
|
BluetoothMenu 1.0 BluetoothMenu.qml
|
||||||
BacklightModule 1.0 BacklightModule.qml
|
Backlight 1.0 Backlight.qml
|
||||||
CpuModule 1.0 CpuModule.qml
|
Cpu 1.0 Cpu.qml
|
||||||
MemoryModule 1.0 MemoryModule.qml
|
Memory 1.0 Memory.qml
|
||||||
DiskModule 1.0 DiskModule.qml
|
Disk 1.0 Disk.qml
|
||||||
TemperatureModule 1.0 TemperatureModule.qml
|
Temperature 1.0 Temperature.qml
|
||||||
WeatherModule 1.0 WeatherModule.qml
|
Weather 1.0 Weather.qml
|
||||||
PowerProfileModule 1.0 PowerProfileModule.qml
|
PowerProfile 1.0 PowerProfile.qml
|
||||||
IdleInhibitorModule 1.0 IdleInhibitorModule.qml
|
IdleInhibitor 1.0 IdleInhibitor.qml
|
||||||
NotificationsModule 1.0 NotificationsModule.qml
|
Notifications 1.0 Notifications.qml
|
||||||
singleton NiriIpc 1.0 NiriIpc.qml
|
singleton NiriIpc 1.0 NiriIpc.qml
|
||||||
singleton PowerProfileService 1.0 PowerProfileService.qml
|
singleton PowerProfileService 1.0 PowerProfileService.qml
|
||||||
|
singleton SystemStats 1.0 SystemStats.qml
|
||||||
ProcessList 1.0 ProcessList.qml
|
ProcessList 1.0 ProcessList.qml
|
||||||
singleton NotifService 1.0 NotifService.qml
|
singleton NotifService 1.0 NotifService.qml
|
||||||
NotifItem 1.0 NotifItem.qml
|
NotifItem 1.0 NotifItem.qml
|
||||||
NotifPopup 1.0 NotifPopup.qml
|
NotifPopup 1.0 NotifPopup.qml
|
||||||
NotifCenter 1.0 NotifCenter.qml
|
NotifCenter 1.0 NotifCenter.qml
|
||||||
NotifCard 1.0 NotifCard.qml
|
Power 1.0 Power.qml
|
||||||
PowerModule 1.0 PowerModule.qml
|
Privacy 1.0 Privacy.qml
|
||||||
PrivacyModule 1.0 PrivacyModule.qml
|
|
||||||
BackgroundOverlay 1.0 BackgroundOverlay.qml
|
BackgroundOverlay 1.0 BackgroundOverlay.qml
|
||||||
OverviewBackdrop 1.0 OverviewBackdrop.qml
|
OverviewBackdrop 1.0 OverviewBackdrop.qml
|
||||||
GpuModule 1.0 GpuModule.qml
|
|
||||||
BarIcon 1.0 BarIcon.qml
|
|
||||||
BarLabel 1.0 BarLabel.qml
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
module services
|
|
||||||
singleton Theme 1.0 Theme.qml
|
|
||||||
singleton SystemStats 1.0 SystemStats.qml
|
|
||||||
singleton Modules 1.0 Modules.qml
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
//@ pragma Env QS_NO_RELOAD_POPUP=1
|
//@ pragma Env QS_NO_RELOAD_POPUP=1
|
||||||
|
|
||||||
import "modules"
|
import "modules"
|
||||||
import "services"
|
|
||||||
import "lock" as Lock
|
import "lock" as Lock
|
||||||
import Quickshell
|
import Quickshell
|
||||||
|
|
||||||
|
|
|
||||||
Reference in a new issue