15 Commits
Author SHA1 Message Date
zach 78a9577209 Merge branch 'main' into feat/device-pixel-alignment
C++ / fmt (pull_request) Failing after 6s
C++ / build (pull_request) Failing after 10s
C++ / clang-tidy (pull_request) Failing after 10s
JS/TS / fmt (pull_request) Successful in 7s
JS/TS / lint (pull_request) Successful in 9s
Python / static (pull_request) Successful in 26s
Rust / build (pull_request) Successful in 54s
Python / verify (pull_request) Failing after 1m29s
Rust / fmt (pull_request) Successful in 36s
Rust / clippy (pull_request) Successful in 50s
2026-10-29 20:11:33 +01:00
zach 067291f478 fix: lockscreen notifdock
C++ / fmt (pull_request) Failing after 5s
C++ / build (pull_request) Failing after 9s
C++ / clang-tidy (pull_request) Failing after 10s
JS/TS / fmt (pull_request) Successful in 7s
JS/TS / lint (pull_request) Successful in 14s
Python / static (pull_request) Failing after 27s
Rust / build (pull_request) Successful in 47s
Python / verify (pull_request) Failing after 1m23s
Rust / fmt (pull_request) Successful in 35s
Rust / clippy (pull_request) Successful in 53s
2026-10-29 18:43:50 +01:00
zach 395d1dad3d fix: remove duped property 2026-10-29 17:51:20 +01:00
zach fe0ce991da feat: initial commit for pixel-snapping components and helpers 2026-10-29 17:47:19 +01:00
zach 858e4e5b12 rebase to feat/video-wallpapers 2026-10-29 17:46:27 +01:00
zach ed7e977eb5 fix: remove more uses of cliprect and finally fix workspace's layer texture 2026-10-29 17:44:19 +01:00
zach 4252812e82 fix: don't link eglDestroyImageKHR 2026-10-29 17:44:19 +01:00
zach a893e6cbe6 feat: add vaapi path for video wallpapers on generic gpus 2026-10-29 17:44:19 +01:00
zach 3792e9d73f feat: add wallpaper transitions, store crop in database per-wallpaper, move CUDA context creation to async thread 2026-10-29 17:44:19 +01:00
zach 906b15b092 fix: don't store dbPath as const 2026-10-29 17:44:19 +01:00
zach 811ad6b7f4 fix: restore code removed by incorrect replacement command 2026-10-29 17:44:19 +01:00
zach 76f5a23c2a feat: skip two-way copy for cuda devices when decoding video wallpapers + cache wallpapers as blobs in new database 2026-10-29 17:44:19 +01:00
zach c0744b29b6 chore: suppress more warnings 2026-10-29 17:44:19 +01:00
zach 5896256372 feat: initial video wallpaper implementation 2026-10-29 17:44:19 +01:00
zach 9cbb90f9e1 feat: initial commit for pixel-snapping components and helpers 2026-10-29 17:34:57 +01:00
163 changed files with 2668 additions and 956 deletions
+3 -4
View File
@@ -99,6 +99,7 @@ ProgressBar {
}
Line {
id: dot
property real implicitSize
anchors.right: parent.right
@@ -124,8 +125,7 @@ ProgressBar {
anchors.left: parent.left
Behavior on implicitWidth {
Anim {
}
Anim {}
}
Component.onCompleted: implicitWidth = Qt.binding(() => parent.width * root.visualPosition)
@@ -222,8 +222,7 @@ ProgressBar {
}
}
Behavior on color {
CAnim {
}
CAnim {}
}
Anim on waveProgress {
duration: root.waveDuration
+6 -6
View File
@@ -2,10 +2,10 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Templates
import ZShell.Components
import ZShell
import qs.Components
import ZShell.Components
import ZShell.Config
import qs.Components
import qs.Services
Slider {
@@ -28,7 +28,7 @@ Slider {
signal interaction(v: real)
implicitHeight: 12
implicitHeight: ZUtils.snap(12, root)
implicitWidth: 200
contentItem: Item {
@@ -123,7 +123,7 @@ Slider {
bottomRightRadius: Tokens.rounding.extraSmall / 2
color: root.fgColor
implicitHeight: root.height
implicitWidth: root.filledWidth
implicitWidth: ZUtils.snap(root.filledWidth, root)
radius: root.radius
topRightRadius: Tokens.rounding.extraSmall / 2
}
@@ -137,8 +137,8 @@ Slider {
frequency: root.waveFrequency
fullLength: root.width - handle.implicitWidth - handle.anchors.leftMargin
implicitHeight: lineWidth * amplitudeMultiplier * 2 + lineWidth
implicitWidth: root.filledWidth
lineWidth: root.height * 0.7
implicitWidth: ZUtils.snap(root.filledWidth, root)
lineWidth: ZUtils.snap(root.height * 0.7, root)
startX: x
Behavior on color {
+3 -2
View File
@@ -1,4 +1,5 @@
import QtQuick
import ZShell
import ZShell.Config
import qs.Services
@@ -15,9 +16,9 @@ ButtonBase {
const h = label.implicitHeight + padding * 2;
if (h % 2 !== 0)
return h + 1;
return h;
return ZUtils.snap(h, root);
}
implicitWidth: implicitHeight
implicitWidth: ZUtils.snap(implicitHeight, root)
inactiveColor: {
if (!isToggle && type === IconButton.Filled)
return Colors.palette.m3primary;
+3 -1
View File
@@ -1,5 +1,6 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import qs.Services
@@ -34,10 +35,11 @@ ButtonBase {
}
verticalPadding: Tokens.padding.extraSmall
RowLayout {
SnapLayout {
id: row
anchors.centerIn: parent
spacing: Tokens.spacing.small
MaterialIcon {
+89 -66
View File
@@ -1,6 +1,8 @@
pragma ComponentBehavior: Bound
import QtQuick
import QtCanvas2D
import ZShell
Item {
id: root
@@ -36,54 +38,62 @@ Item {
property real fillAlpha: 0.15
property real lineWidth: 2
property real markerDotRadius: 4
property real labelFontSize: 10
property real labelFontSize: 8
Canvas {
Canvas2D {
id: canvas
anchors.fill: parent
renderStrategy: Canvas.Immediate
alphaBlending: true
fillColor: "transparent"
onWidthChanged: requestPaint()
onHeightChanged: requestPaint()
function snapV(v) {
return ZUtils.snap(v, canvas);
}
function strokeCurve(ctx, pts) {
ctx.beginPath();
ctx.moveTo(pts[0].x, pts[0].y);
if (root.curveSmoothing && pts.length > 2) {
const k = 1 / 6;
const n = pts.length;
const dpr = ZUtils.dprFor(canvas);
for (let i = 0; i < pts.length - 1; i++) {
const p1 = pts[i];
const p2 = pts[i + 1];
const [c1x, c1y, c2x, c2y] = segmentControls(pts, i);
for (let i = 0; i < n - 1; i++) {
const p0 = pts[Math.max(i - 1, 0)];
const p1 = pts[i];
const p2 = pts[i + 1];
const p3 = pts[Math.min(i + 2, n - 1)];
let c1x = p1.x + (p2.x - p0.x) * k;
let c1y = p1.y + (p2.y - p0.y) * k;
let c2x = p2.x - (p3.x - p1.x) * k;
let c2y = p2.y - (p3.y - p1.y) * k;
const minY = Math.min(p1.y, p2.y);
const maxY = Math.max(p1.y, p2.y);
c1y = Math.max(minY, Math.min(maxY, c1y));
c2y = Math.max(minY, Math.min(maxY, c2y));
ctx.bezierCurveTo(c1x, c1y, c2x, c2y, p2.x, p2.y);
}
} else {
for (let i = 0; i < pts.length - 1; i++) {
const p0 = pts[i];
const p1 = pts[i + 1];
const cx = (p0.x + p1.x) * 0.5;
ctx.bezierCurveTo(cx, p0.y, cx, p1.y, p1.x, p1.y);
const firstCol = Math.ceil(p1.x * dpr) + 1;
const lastCol = Math.floor(p2.x * dpr) - 1;
for (let col = firstCol; col <= lastCol; ++col) {
const x = col / dpr;
ctx.lineTo(x, bezierY(p1, c1x, c1y, c2x, c2y, p2, x));
}
ctx.lineTo(p2.x, p2.y);
}
}
// Control points for segment i (pts[i] -> pts[i+1]), matching strokeCurve
function bezierY(p1, c1x, c1y, c2x, c2y, p2, targetX) {
let tlo = 0;
let thi = 1;
for (let it = 0; it < 16; it++) {
const tm = (tlo + thi) / 2;
const u = 1 - tm;
const x = u * u * u * p1.x + 3 * u * u * tm * c1x + 3 * u * tm * tm * c2x + tm * tm * tm * p2.x;
if (x < targetX)
tlo = tm;
else
thi = tm;
}
const t = (tlo + thi) / 2;
const u = 1 - t;
return u * u * u * p1.y + 3 * u * u * t * c1y + 3 * u * t * t * c2y + t * t * t * p2.y;
}
function segmentControls(pts, i) {
const p0 = pts[Math.max(i - 1, 0)];
const p1 = pts[i];
@@ -109,7 +119,6 @@ Item {
return [cx, p1.y, cx, p2.y];
}
// Point on the curve at a given x (x is monotonic per segment)
function pointAtX(pts, targetX) {
let j = pts.length - 2;
for (let i = 0; i < pts.length - 1; i++) {
@@ -138,10 +147,16 @@ Item {
const t = (tlo + thi) / 2;
const u = 1 - t;
const y = u * u * u * p1.y + 3 * u * u * t * c1y + 3 * u * t * t * c2y + t * t * t * p2.y;
return { x: targetX, y };
return {
x: targetX,
y
};
}
function cutPoint(pts, targetX) {
return pointAtX(pts, targetX);
}
// Part of the curve left/right of a cut x, including the cut point
function cutLeft(pts, targetX) {
if (targetX <= pts[0].x)
return [];
@@ -158,7 +173,7 @@ Item {
const left = pts.slice(0, j + 1);
if (targetX > pts[j].x)
left.push(pointAtX(pts, targetX));
left.push(cutPoint(pts, targetX));
return left;
}
@@ -184,17 +199,20 @@ Item {
onPaint: {
const ctx = getContext("2d");
if (!ctx)
return;
ctx.reset();
ctx.clearRect(0, 0, width, height);
const W = width;
const H = height;
if (W < 2 || H < 2)
return;
const padLeft = root.labelFontSize * 3.4;
const padRight = 2;
const padTop = 2;
const padBottom = root.labelFontSize + 8;
const padLeft = root.labelFontSize * 5;
const padRight = 0;
const padTop = 0;
const padBottom = root.labelFontSize + 14;
const plot = {
x: padLeft,
y: padTop,
@@ -204,8 +222,6 @@ Item {
if (plot.w < 2 || plot.h < 2)
return;
// Auto-fit: NaN yMin/yMax derive from the data, snapped to the
// horizontal step grid, honoring minHorizontalLines
let lo = root.yMin;
let hi = root.yMax;
const loAuto = Number.isNaN(lo);
@@ -279,11 +295,17 @@ Item {
const xAt = i => plot.x + (i / root.xSteps) * plot.w;
const yAt = v => plot.y + (1 - (v - scaleBottom) / range) * plot.h;
const crisp = v => Math.floor(v) + 0.5;
// 1. Grid lines
const dpr = ZUtils.dprFor(canvas);
const devW = w => Math.max(1, Math.round(w * dpr));
const snapLine = (v, w) => {
const dw = devW(w);
return (Math.round(v * dpr - dw / 2) + dw / 2) / dpr;
};
const gridW = devW(1) / dpr;
ctx.strokeStyle = Qt.alpha(root.gridColor, root.gridAlpha);
ctx.lineWidth = 1;
ctx.lineWidth = gridW;
if (root.verticalLineStep > 0) {
for (let i = 0; i <= root.xSteps; i += root.verticalLineStep) {
@@ -292,7 +314,7 @@ Item {
if (i === root.xSteps && !root.lastXLine)
continue;
const x = crisp(xAt(i));
const x = snapLine(xAt(i), 1);
ctx.beginPath();
ctx.moveTo(x, plot.y);
ctx.lineTo(x, H);
@@ -300,12 +322,11 @@ Item {
}
}
// Lines extend down into yPaddingBottom, snapped to the grid
const vStart = lo - (root.yPaddingBottom > 0 ? Math.floor(root.yPaddingBottom / root.horizontalLineStep) * root.horizontalLineStep : 0);
if (root.horizontalLineStep > 0) {
for (let v = vStart; v <= hi + 0.001; v += root.horizontalLineStep) {
const y = crisp(yAt(v));
const y = snapLine(yAt(v), 1);
ctx.beginPath();
ctx.moveTo(0, y);
ctx.lineTo(plot.x + plot.w, y);
@@ -313,9 +334,8 @@ Item {
}
}
// 2. Labels
ctx.fillStyle = Qt.alpha(root.labelColor, root.labelAlpha);
ctx.font = root.labelFontSize + "px sans-serif";
ctx.font = root.labelFontSize + "pt 'sans-serif'";
ctx.textAlign = "left";
ctx.textBaseline = "top";
@@ -328,7 +348,7 @@ Item {
const text = root.xLabel(i);
if (text)
ctx.fillText(text, xAt(i) + 4, plot.y + plot.h + 4);
ctx.fillText(text, xAt(i) + 4, plot.y + plot.h + 8);
}
}
@@ -341,7 +361,6 @@ Item {
}
}
// 3. Curve, split into segments at null gaps
const segments = [];
let current = null;
for (let i = 0; i < series.length; i++) {
@@ -352,7 +371,7 @@ Item {
continue;
}
const pt = {
x: xAt(i),
x: snapV(xAt(i)),
y: yAt(series[i])
};
if (!current)
@@ -369,8 +388,6 @@ Item {
const markerPx = hasMarker ? xAt(root.markerX) : 0;
let gapPx = 0;
if (hasMarker) {
// markerGap is measured from the dot edge, perpendicular to the
// curve; project onto x via the local curve slope
let slope = 0;
const seg = segments.find(s => s[0].x <= markerPx && markerPx <= s[s.length - 1].x);
if (seg && seg.length > 2 && markerPx - 1 >= seg[0].x && markerPx + 1 <= seg[seg.length - 1].x)
@@ -382,7 +399,6 @@ Item {
if (seg.length < 2)
continue;
// Fill stays continuous under the marker
ctx.fillStyle = Qt.alpha(root.lineColor, root.fillAlpha);
strokeCurve(ctx, seg);
ctx.lineTo(seg[seg.length - 1].x, plot.y + plot.h);
@@ -390,7 +406,6 @@ Item {
ctx.closePath();
ctx.fill();
// Stroke has a gap around the marker
const pieces = hasMarker ? [cutLeft(seg, markerPx - gapPx), cutRight(seg, markerPx + gapPx)] : [seg];
for (const pts of pieces) {
@@ -398,24 +413,32 @@ Item {
continue;
ctx.strokeStyle = root.lineColor;
ctx.lineWidth = root.lineWidth;
ctx.lineWidth = ZUtils.snap(root.lineWidth, root);
strokeCurve(ctx, pts);
ctx.stroke();
}
}
// 4. Marker: dashed vertical + dot
if (root.markerX >= 0 && root.markerX <= root.xSteps) {
const x = markerPx;
ctx.setLineDash([4, 4]);
ctx.strokeStyle = Qt.alpha(root.markerColor, 0.6);
ctx.lineWidth = 1;
ctx.beginPath();
ctx.moveTo(crisp(x), plot.y);
ctx.lineTo(crisp(x), H);
ctx.stroke();
ctx.setLineDash([]);
ctx.lineWidth = gridW;
const lineX = snapLine(x, 1);
let dashY = plot.y;
let dashOn = true;
while (dashY < H) {
const dashEnd = Math.min(dashY + 4, H);
if (dashOn) {
ctx.beginPath();
ctx.moveTo(lineX, snapV(dashY));
ctx.lineTo(lineX, snapV(dashEnd));
ctx.stroke();
}
dashY = dashEnd;
dashOn = !dashOn;
}
const i0 = Math.floor(root.markerX);
const v0 = series[i0];
@@ -430,7 +453,7 @@ Item {
if (y != null) {
ctx.fillStyle = root.markerColor;
ctx.beginPath();
ctx.arc(x, y, root.markerDotRadius, 0, Math.PI * 2);
ctx.circle(snapV(x), y, root.markerDotRadius);
ctx.fill();
}
}
+6 -2
View File
@@ -4,6 +4,7 @@ import QtQuick
import QtQuick.Layouts
import Quickshell
import ZShell.Config
import ZShell.Components
import qs.Drawers
import qs.Services
@@ -110,12 +111,14 @@ MouseArea {
color: Colors.palette.m3surfaceContainerLow
radius: parent.radius
ColumnLayout {
SnapLayout {
id: column
anchors.fill: parent
anchors.margins: Tokens.padding.extraSmall
spacing: Tokens.spacing.extraSmall
orientation: Qt.Vertical
Repeater {
id: repeater
@@ -151,11 +154,12 @@ MouseArea {
}
}
RowLayout {
SnapLayout {
id: menuOptionRow
anchors.fill: parent
anchors.margins: Tokens.padding.medium
spacing: Tokens.spacing.small
MaterialIcon {
+2 -1
View File
@@ -1,5 +1,6 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import qs.Services
@@ -53,7 +54,7 @@ Row {
onClicked: root.active?.clicked()
}
RowLayout {
SnapLayout {
id: textRow
anchors.centerIn: parent
+5 -2
View File
@@ -1,4 +1,5 @@
import ZShell
import ZShell.Components
import QtQuick
import QtQuick.Layouts
import qs.Components
@@ -47,7 +48,7 @@ CustomRect {
z: -1
}
RowLayout {
SnapLayout {
id: layout
anchors.fill: parent
@@ -88,9 +89,11 @@ CustomRect {
}
}
ColumnLayout {
SnapLayout {
Layout.fillWidth: true
spacing: 0
orientation: Qt.Vertical
CustomText {
id: title
+9 -5
View File
@@ -1,5 +1,7 @@
import Quickshell
import QtQuick
import ZShell.Config
import ZShell
import qs.Components
import qs.Modules.Bar.Popouts as Popouts
import qs.Modules.Notifications as Notifications
@@ -14,7 +16,6 @@ import qs.Modules.Settings as Settings
import qs.Modules.Drawing as Drawing
import qs.Modules.Dock as Dock
import qs.Modules.Clipboard as Clipboard
import ZShell.Config
Item {
id: root
@@ -74,7 +75,10 @@ Item {
anchors.right: parent.right
anchors.rightMargin: sidebar.width * (1 - sidebar.offsetScale)
anchors.verticalCenter: parent.verticalCenter
y: ZUtils.snap((parent.height - implicitHeight) / 2, root)
// anchors.verticalCenter: parent.verticalCenter
clip: sidebar.visible
implicitHeight: osd.implicitHeight
implicitWidth: osd.implicitWidth * (1 - osd.offsetScale)
@@ -82,8 +86,7 @@ Item {
Osd.Wrapper {
id: osd
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
anchors.fill: parent
screen: root.screen
screenState: root.screenState
sidebarOrSessionVisible: sidebar.visible
@@ -129,8 +132,9 @@ Item {
Launcher.Wrapper {
id: launcher
x: ZUtils.snap((parent.width - implicitWidth) / 2, root)
anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
panels: root
screen: root.screen
screenState: root.screenState
+6 -3
View File
@@ -3,11 +3,12 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Config
import ZShell.Components
import qs.Components
import qs.Helpers
import qs.Services
ColumnLayout {
SnapLayout {
id: root
readonly property real centerScale: Math.min(1, screenHeight / 1440)
@@ -18,9 +19,11 @@ ColumnLayout {
Layout.fillHeight: true
Layout.fillWidth: false
Layout.preferredWidth: centerWidth
orientation: Qt.Vertical
spacing: Tokens.spacing.largeIncreased * 2
RowLayout {
SnapLayout {
Layout.alignment: Qt.AlignHCenter
spacing: Tokens.spacing.small
@@ -116,7 +119,7 @@ ColumnLayout {
}
}
RowLayout {
SnapLayout {
id: input
anchors.fill: parent
+3 -2
View File
@@ -1,11 +1,12 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Config
import ZShell.Components
import qs.Components
import qs.Helpers
import ZShell.Config
import qs.Services
RowLayout {
SnapLayout {
id: root
required property var greeter
+1
View File
@@ -3,6 +3,7 @@ pragma ComponentBehavior: Bound
import Quickshell
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import qs.Components
import qs.Services
+10 -4
View File
@@ -3,17 +3,20 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Config
import ZShell.Components
import qs.Components
import qs.Services
ColumnLayout {
SnapLayout {
id: root
required property var greeter
anchors.fill: parent
anchors.margins: Tokens.padding.large
spacing: Tokens.spacing.large
orientation: Qt.Vertical
CustomText {
Layout.fillWidth: true
@@ -37,8 +40,9 @@ ColumnLayout {
duration: Tokens.anim.durations.extraLarge
}
}
sourceComponent: ColumnLayout {
sourceComponent: SnapLayout {
spacing: Tokens.spacing.largeIncreased
orientation: Qt.Vertical
MaterialIcon {
Layout.alignment: Qt.AlignHCenter
@@ -84,7 +88,7 @@ ColumnLayout {
}
}
RowLayout {
SnapLayout {
id: row
anchors.fill: parent
@@ -97,9 +101,11 @@ ColumnLayout {
text: modelData.kind === "x11" ? "tv" : "desktop_windows"
}
ColumnLayout {
SnapLayout {
Layout.fillWidth: true
spacing: Tokens.spacing.small / 2
orientation: Qt.Vertical
CustomText {
Layout.fillWidth: true
+10 -4
View File
@@ -3,18 +3,21 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Config
import ZShell.Components
import qs.Components
import qs.Helpers
import qs.Services
ColumnLayout {
SnapLayout {
id: root
required property var greeter
anchors.fill: parent
anchors.margins: Tokens.padding.large
spacing: Tokens.spacing.large
orientation: Qt.Vertical
CustomText {
Layout.fillWidth: true
@@ -38,8 +41,9 @@ ColumnLayout {
duration: Tokens.anim.durations.extraLarge
}
}
sourceComponent: ColumnLayout {
sourceComponent: SnapLayout {
spacing: Tokens.spacing.largeIncreased
orientation: Qt.Vertical
MaterialIcon {
Layout.alignment: Qt.AlignHCenter
@@ -86,7 +90,7 @@ ColumnLayout {
}
}
RowLayout {
SnapLayout {
id: row
anchors.fill: parent
@@ -112,9 +116,11 @@ ColumnLayout {
}
}
ColumnLayout {
SnapLayout {
Layout.fillWidth: true
spacing: Tokens.spacing.small / 2
orientation: Qt.Vertical
CustomText {
Layout.fillWidth: true
+1 -1
View File
@@ -53,7 +53,7 @@ CustomRect {
radius: Tokens.rounding.full
width: row.implicitWidth + Tokens.padding.small * 2
RowLayout {
SnapLayout {
id: row
anchors.centerIn: parent
+56 -7
View File
@@ -4,11 +4,12 @@ import Quickshell
import QtQuick
import QtQuick.Layouts
import ZShell.Config
import ZShell.Components
import qs.Components
import qs.Modules.Bar.Components
import qs.Modules.Bar.Popouts
GridLayout {
SnapLayout {
id: root
required property bool fullscreen
@@ -74,9 +75,47 @@ GridLayout {
return ch?.entryId ?? "";
}
columnSpacing: Tokens.spacing.small
columns: horizontal ? -1 : 1
rowSpacing: Tokens.spacing.small
readonly property var sectionRects: {
const count = repeater.count; // dependency: re-run when items are added/removed
const names = ["start", "middle", "end"]; // constant ids by position
const bounds = [null];
let spacers = 0;
for (let i = 0; i < count; i++) {
const it = repeater.itemAt(i) as EntryWrapper;
if (!it)
continue;
if (it.entryId === "spacer") {
bounds.push(null);
spacers++;
continue;
}
const l = it.x, t = it.y, r = it.x + it.width, b = it.y + it.height;
const cur = bounds[spacers];
bounds[spacers] = cur ? {
l: Math.min(cur.l, l),
t: Math.min(cur.t, t),
r: Math.max(cur.r, r),
b: Math.max(cur.b, b)
} : {
l,
t,
r,
b
};
}
return bounds.map((c, n) => ({
id: names[n] ?? `section${n}`,
rect: c ? Qt.rect(c.l, c.t, c.r - c.l, c.b - c.t) : Qt.rect(0, 0, 0, 0)
}));
}
spacing: Tokens.spacing.small
orientation: horizontal ? Qt.Horizontal : Qt.Vertical
Repeater {
id: repeater
@@ -228,16 +267,26 @@ GridLayout {
}
component EntryWrapper: Item {
readonly property int section: {
let n = 0;
for (let i = 0; i < index; i++) {
if (repeater.model.values[i].id === "spacer")
n++;
}
return n;
}
readonly property string entryId: modelData.id
required property int index
default property Item item
required property var modelData
default property Item item
Layout.alignment: root.horizontal ? Qt.AlignVCenter : Qt.AlignHCenter
Layout.bottomMargin: !root.horizontal && index === repeater.count - 1 ? root.vPadding : 0
Layout.leftMargin: root.horizontal && index === 0 ? root.vPadding : (entryId === "statusIcons" && root.horizontal) ? -root.rowSpacing + Tokens.spacing.extraSmall : 0
Layout.leftMargin: root.horizontal && index === 0 ? root.vPadding : (entryId === "statusIcons" && root.horizontal) ? -root.spacing + Tokens.spacing.extraSmall : 0
Layout.rightMargin: root.horizontal && index === repeater.count - 1 ? root.vPadding : 0
Layout.topMargin: !root.horizontal && index === 0 ? root.vPadding : (entryId === "statusIcons" && !root.horizontal) ? -root.columnSpacing + Tokens.spacing.extraSmall : 0
Layout.topMargin: !root.horizontal && index === 0 ? root.vPadding : (entryId === "statusIcons" && !root.horizontal) ? -root.spacing + Tokens.spacing.extraSmall : 0
children: item
implicitHeight: item?.implicitHeight ?? 0
implicitWidth: item?.implicitWidth ?? 0
+1
View File
@@ -9,6 +9,7 @@ import qs.Components
Item {
id: root
readonly property var sections: (content.item as Bar)?.sectionRects ?? []
readonly property int clampedExtent: Math.max(Config.bar.border, extent)
readonly property int contentThickness: Math.floor(Math.max(Config.bar.height, Tokens.sizes.bar.innerSize * (horizontal ? 1 : 1.5))) + padding * 2
readonly property int exclusiveZone: Config.bar.autoHide ? Config.bar.border : contentThickness
+4 -2
View File
@@ -4,6 +4,7 @@ import Quickshell
import QtQuick
import QtQuick.Layouts
import ZShell.Config
import ZShell.Components
import qs.Modules.Bar.Popouts
import qs.Modules.Bar.Components.Common
import qs.Helpers
@@ -43,7 +44,7 @@ WidgetBase {
timeTokens: timeTokens
};
}
required property GridLayout loader
required property SnapLayout loader
required property Wrapper popouts
readonly property int roundedWidth: Math.round(timeText.implicitWidth)
readonly property int evenWidth: roundedWidth % 2 === 0 ? roundedWidth : roundedWidth + 1
@@ -69,7 +70,8 @@ WidgetBase {
}
}
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
id: verticalColumn
anchors.centerIn: parent
+1
View File
@@ -1,5 +1,6 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import qs.Components
import qs.Modules.Bar.Components.Common
+2 -1
View File
@@ -1,6 +1,7 @@
import Quickshell
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import qs.Components
import qs.Modules
@@ -11,7 +12,7 @@ Item {
anchors.top: parent.top
implicitWidth: layout.implicitWidth
RowLayout {
SnapLayout {
id: layout
anchors.bottom: parent.bottom
+1
View File
@@ -1,5 +1,6 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import Quickshell
import qs.Components
import ZShell.Config
+1
View File
@@ -3,6 +3,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import Quickshell
import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import ZShell.Services
import qs.Services
+4 -4
View File
@@ -4,6 +4,7 @@ import Quickshell
import QtQuick
import QtQuick.Layouts
import ZShell.Config
import ZShell.Components
import qs.Helpers
import qs.Modules.Bar.Components.StatusIcons
import qs.Modules.Bar.Components.Common
@@ -59,7 +60,7 @@ WidgetBase {
Anim {}
}
GridLayout {
SnapLayout {
id: grid
anchors.bottomMargin: root.horizontal ? 0 : Tokens.padding.medium
@@ -67,9 +68,8 @@ WidgetBase {
anchors.leftMargin: root.horizontal ? Tokens.padding.extraSmall : 0
anchors.rightMargin: root.horizontal ? Tokens.padding.extraSmall : 0
anchors.topMargin: root.horizontal ? 0 : Tokens.padding.extraSmall
columns: root.horizontal ? -1 : 1
columnSpacing: root.spacing
rowSpacing: root.spacing
orientation: root.horizontal ? Qt.Horizontal : Qt.Vertical
spacing: root.horizontal ? Tokens.spacing.extraSmall : -2
Repeater {
model: ScriptModel {
@@ -1,5 +1,6 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import qs.Daemons
import qs.Components
@@ -1,5 +1,6 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import qs.Daemons
import qs.Components
@@ -1,6 +1,7 @@
import Quickshell.Services.UPower
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import qs.Modules.Bar.Components.Common
import qs.Components
+3 -2
View File
@@ -2,10 +2,11 @@ import QtQuick.Layouts
import QtQuick
import Quickshell
import Quickshell.Services.SystemTray
import ZShell.Config
import ZShell.Components
import qs.Helpers
import qs.Modules.Bar.Popouts
import qs.Components
import ZShell.Config
import qs.Services
Item {
@@ -15,7 +16,7 @@ Item {
readonly property real dpr: Hypr.monitorFor(loader?.screen).scale
required property int ind
required property SystemTrayItem item
required property GridLayout loader
required property SnapLayout loader
required property Wrapper popouts
function resolveIcon(app: string, icon: string): string {
+5 -5
View File
@@ -4,6 +4,7 @@ import QtQuick
import QtQuick.Layouts
import Quickshell.Services.SystemTray
import ZShell.Config
import ZShell.Components
import qs.Components
import qs.Modules.Bar.Components.Common
import qs.Modules.Bar.Components.Tray
@@ -15,7 +16,7 @@ WidgetBase {
readonly property alias items: repeater
readonly property alias layout: sysGrid
required property GridLayout loader
required property SnapLayout loader
readonly property int padding: Tokens.padding.extraSmall
required property Wrapper popouts
readonly property real size: horizontal ? sysGrid.implicitWidth + sysGrid.anchors.leftMargin + sysGrid.anchors.rightMargin : sysGrid.implicitHeight + sysGrid.anchors.topMargin + sysGrid.anchors.bottomMargin
@@ -28,7 +29,7 @@ WidgetBase {
radius: Tokens.rounding.full
topRightRadius: horizontal ? Tokens.rounding.small / 2 : Tokens.rounding.full
GridLayout {
SnapLayout {
id: sysGrid
anchors.bottomMargin: root.horizontal ? 0 : Tokens.padding.extraSmall
@@ -36,9 +37,8 @@ WidgetBase {
anchors.leftMargin: root.horizontal ? Tokens.padding.extraSmall : 0
anchors.rightMargin: root.horizontal ? Tokens.padding.extraSmall : 0
anchors.topMargin: root.horizontal ? 0 : Tokens.padding.extraSmall
columns: root.horizontal ? -1 : 1
rowSpacing: -2
columnSpacing: Tokens.spacing.extraSmall
orientation: root.horizontal ? Qt.Horizontal : Qt.Vertical
spacing: root.horizontal ? Tokens.spacing.extraSmall : -2
Repeater {
id: repeater
+1
View File
@@ -1,5 +1,6 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import qs.Components
import qs.Modules.Bar.Components.Common
+1 -1
View File
@@ -17,7 +17,7 @@ Item {
readonly property int maxSize: {
const otherModules = bar.children.filter(c => c.enabled && c.entryId && c.item !== this && c.entryId !== "spacer");
const otherSize = otherModules.reduce((acc, curr) => acc + (horizontal ? (curr.item?.nonAnimWidth ?? curr.width ?? 0) : (curr.item.nonAnimHeight ?? curr.height ?? 0)), 0);
return horizontal ? (bar.width - otherSize - bar.columnSpacing * (bar.children.length - 1) - bar.vPadding * 2) : (bar.height - otherSize - bar.rowSpacing * (bar.children.length - 1) - bar.vPadding * 4);
return horizontal ? (bar.width - otherSize - bar.spacing * (bar.children.length - 1) - bar.vPadding * 2) : (bar.height - otherSize - bar.spacing * (bar.children.length - 1) - bar.vPadding * 4);
}
clip: true
+15 -10
View File
@@ -5,6 +5,7 @@ import Quickshell.Services.Pipewire
import Quickshell.Widgets
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import QtQuick.Controls
import ZShell.Config
import qs.Components
@@ -46,7 +47,8 @@ Item {
anchors.verticalCenter: parent.verticalCenter
}
component VolumesTab: ColumnLayout {
component VolumesTab: SnapLayout {
orientation: Qt.Vertical
spacing: 12
CustomRect {
@@ -56,14 +58,15 @@ Item {
color: Colors.tPalette.m3surfaceContainer
radius: root.rounding - vol.anchors.margins
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
anchors.bottomMargin: Tokens.padding.small
anchors.fill: parent
anchors.leftMargin: Tokens.padding.small
anchors.rightMargin: Tokens.padding.small
anchors.topMargin: Tokens.padding.small
RowLayout {
SnapLayout {
Layout.fillHeight: true
Layout.fillWidth: true
@@ -81,7 +84,7 @@ Item {
}
}
RowLayout {
SnapLayout {
spacing: Tokens.spacing.largeIncreased
CustomMouseArea {
@@ -153,14 +156,15 @@ Item {
}
}
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
anchors.bottomMargin: Tokens.padding.small
anchors.fill: parent
anchors.leftMargin: Tokens.padding.small
anchors.rightMargin: Tokens.padding.small
anchors.topMargin: Tokens.padding.small
RowLayout {
SnapLayout {
Layout.fillHeight: true
Layout.fillWidth: true
@@ -178,7 +182,7 @@ Item {
}
}
RowLayout {
SnapLayout {
spacing: Tokens.spacing.largeIncreased
CustomMouseArea {
@@ -276,14 +280,15 @@ Item {
text: Audio.getStreamName(appBox.modelData)
}
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
anchors.bottomMargin: Tokens.padding.small
anchors.fill: parent
anchors.leftMargin: Tokens.padding.small
anchors.rightMargin: Tokens.padding.small
anchors.topMargin: Tokens.padding.small
RowLayout {
SnapLayout {
Layout.fillHeight: true
Layout.fillWidth: true
@@ -302,7 +307,7 @@ Item {
}
}
RowLayout {
SnapLayout {
spacing: Tokens.spacing.largeIncreased
CustomMouseArea {
+3 -1
View File
@@ -4,6 +4,7 @@ import Quickshell
import Quickshell.Networking
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import qs.Components
import ZShell.Config
import qs.Modules
@@ -14,7 +15,8 @@ Item {
required property var wrapper
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
id: layout
spacing: 8
+3 -1
View File
@@ -4,6 +4,7 @@ import Quickshell
import Quickshell.Widgets
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import QtQuick.Controls
import QtQuick.Effects
import qs.Components
@@ -47,7 +48,8 @@ StackView {
duration: 0
}
}
component SubMenu: ColumnLayout {
component SubMenu: SnapLayout {
orientation: Qt.Vertical
id: menu
required property QsMenuHandle handle
+2 -1
View File
@@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import Quickshell.Services.UPower
import ZShell.Config
import qs.Modules.Bar.Components.Common
@@ -35,7 +36,7 @@ Column {
Repeater {
model: Battery.allPeripherals
RowLayout {
SnapLayout {
id: layout
required property var modelData
+5 -3
View File
@@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import Quickshell
import ZShell.Config
import qs.Components
@@ -86,7 +87,7 @@ CustomRect {
implicitWidth: 600
radius: root.radius - Tokens.padding.extraSmall
RowLayout {
SnapLayout {
anchors.fill: parent
anchors.leftMargin: Tokens.padding.small
anchors.rightMargin: Tokens.padding.small
@@ -96,7 +97,8 @@ CustomRect {
text: "package_2"
}
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
Layout.fillWidth: true
CustomText {
@@ -114,7 +116,7 @@ CustomRect {
}
}
RowLayout {
SnapLayout {
Layout.fillHeight: true
Layout.preferredWidth: 300
+3 -2
View File
@@ -4,6 +4,7 @@ import Quickshell
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import ZShell.Components
import qs.Components
import qs.Helpers
import ZShell.Config
@@ -111,7 +112,7 @@ Item {
Repeater {
model: lineRow.modelData.text.split("\t").slice(1)
RowLayout {
SnapLayout {
height: lineText.height
width: lineText.height + Tokens.spacing.extraSmall
@@ -225,7 +226,7 @@ Item {
}
}
RowLayout {
SnapLayout {
anchors.fill: parent
spacing: Tokens.spacing.small
+5 -4
View File
@@ -3,6 +3,7 @@ pragma ComponentBehavior: Bound
import Quickshell
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import ZShell
import qs.Components
@@ -39,8 +40,8 @@ Item {
];
return allTabs.filter(tab => tab.enabled);
}
readonly property real nonAnimHeight: tabs.implicitHeight + tabs.anchors.topMargin + view.implicitHeight + viewWrapper.anchors.margins + viewWrapper.anchors.topMargin
readonly property real nonAnimWidth: view.implicitWidth + viewWrapper.anchors.margins * 2
readonly property real nonAnimHeight: ZUtils.snap(tabs.implicitHeight + tabs.anchors.topMargin + view.implicitHeight + viewWrapper.anchors.margins + viewWrapper.anchors.topMargin, root)
readonly property real nonAnimWidth: ZUtils.snap(view.implicitWidth + viewWrapper.anchors.margins * 2, root)
required property ScreenState screenState
implicitHeight: nonAnimHeight
@@ -93,8 +94,8 @@ Item {
}
anchors.fill: parent
implicitHeight: currentItem?.implicitHeight ?? 0
implicitWidth: currentItem?.implicitWidth ?? 0
implicitHeight: currentItem?.height ?? currentItem?.implicitHeight ?? 0
implicitWidth: currentItem?.width ?? currentItem?.implicitWidth ?? 0
Repeater {
id: repeater
+55 -77
View File
@@ -1,104 +1,82 @@
import Quickshell
import QtQuick
import QtQuick.Layouts
import ZShell
import ZShell.Config
import ZShell.Components
import qs.Helpers
import qs.Components
import qs.Modules
import ZShell.Config
import qs.Modules.Dashboard.Dash
import qs.Services
GridLayout {
SnapLayout {
orientation: Qt.Vertical
id: root
readonly property bool dashboardVisible: screenState.dashboard
required property int radius
required property ScreenState screenState
columnSpacing: Tokens.spacing.small
rowSpacing: Tokens.spacing.small
spacing: ZUtils.snap(Tokens.spacing.small, root)
ParallelAnimation {
id: openAnim
height: ZUtils.snap(implicitHeight, root)
width: ZUtils.snap(implicitWidth, root)
Anim {
property: "opacity"
target: root
to: 1
}
Anim {
property: "scale"
target: root
to: 1
}
}
ParallelAnimation {
id: closeAnim
Anim {
property: "opacity"
target: root
to: 0
}
Anim {
property: "scale"
target: root
to: 0.9
}
}
Rect {
Layout.column: 2
Layout.columnSpan: 3
Layout.preferredHeight: user.implicitHeight
Layout.preferredWidth: user.implicitWidth
radius: root.radius
User {
id: user
screenState: root.screenState
}
}
Rect {
Layout.columnSpan: 2
Layout.fillHeight: true
Layout.preferredWidth: Tokens.sizes.dashboard.weatherWidth
Layout.row: 0
radius: root.radius
Weather {}
}
Rect {
Layout.column: 0
Layout.columnSpan: 3
SnapLayout {
Layout.fillWidth: true
Layout.preferredHeight: calendar.implicitHeight
Layout.row: 1
radius: root.radius
spacing: parent.spacing
Calendar {
id: calendar
Rect {
id: weatherRect
Layout.fillHeight: true
Layout.preferredWidth: ZUtils.snap(Tokens.sizes.dashboard.weatherWidth, root)
radius: root.radius
screenState: root.screenState
Weather {}
}
Rect {
id: userRect
Layout.preferredHeight: ZUtils.snap(user.implicitHeight, root)
Layout.preferredWidth: ZUtils.snap(user.implicitWidth, root)
radius: root.radius
User {
id: user
screenState: root.screenState
}
}
}
Rect {
Layout.column: 3
Layout.columnSpan: 2
Layout.fillHeight: true
Layout.preferredWidth: resources.implicitWidth
Layout.row: 1
radius: root.radius
SnapLayout {
Layout.fillWidth: true
spacing: parent.spacing
Resources {
id: resources
Rect {
id: calendarRect
Layout.fillWidth: true
Layout.fillHeight: true
implicitHeight: ZUtils.snap(calendar.implicitHeight, root)
radius: root.radius
Calendar {
id: calendar
screenState: root.screenState
}
}
Rect {
id: resourcesRect
Layout.fillHeight: true
implicitWidth: ZUtils.snap(resources.implicitWidth, root)
radius: root.radius
Resources {
id: resources
}
}
}
+4 -2
View File
@@ -4,6 +4,7 @@ import Quickshell
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import ZShell.Components
import qs.Components
import ZShell.Config
import qs.Services
@@ -117,14 +118,15 @@ CustomMouseArea {
}
}
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
id: inner
anchors.fill: parent
anchors.margins: Tokens.padding.large
spacing: Tokens.spacing.extraSmall
RowLayout {
SnapLayout {
id: monthNavigationRow
Layout.fillWidth: true
+11 -9
View File
@@ -1,5 +1,7 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import ZShell
import ZShell.Services
import ZShell.Config
import qs.Components
@@ -8,9 +10,8 @@ import qs.Services
Item {
id: root
anchors.bottom: parent.bottom
anchors.top: parent.top
implicitWidth: layout.implicitWidth + layout.anchors.margins * 4
anchors.fill: parent
implicitWidth: ZUtils.snap(layout.implicitWidth + layout.anchors.margins * 2, root)
ServiceRef {
service: Storage
@@ -28,13 +29,16 @@ Item {
service: Gpu
}
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
id: layout
anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
anchors.margins: Tokens.padding.large
anchors.top: parent.top
x: ZUtils.snap((root.width - implicitWidth) / 2, root)
spacing: Tokens.spacing.medium
Resource {
@@ -73,12 +77,10 @@ Item {
required property string icon
Layout.fillHeight: true
implicitSize: height
implicitSize: ZUtils.snap((root.height - layout.anchors.margins * 2 - layout.spacing * 4) / 5, root)
Behavior on clampedVal {
Anim {
}
Anim {}
}
MaterialIcon {
+9 -5
View File
@@ -1,6 +1,8 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import M3Shapes
import ZShell
import ZShell.Config
import qs.Modules.Dashboard.Media
import qs.Components
@@ -13,8 +15,8 @@ Item {
property ScreenState screenState
required property int radius
implicitWidth: 1000
implicitHeight: 320
implicitWidth: ZUtils.snap(1000, root)
implicitHeight: ZUtils.snap(320, root)
ClipRect {
anchors.fill: parent
@@ -25,7 +27,7 @@ Item {
}
}
RowLayout {
SnapLayout {
anchors.fill: parent
anchors.margins: Tokens.padding.large
spacing: Tokens.spacing.extraLarge
@@ -94,7 +96,8 @@ Item {
active: opacity > 0
opacity: 0
sourceComponent: ColumnLayout {
sourceComponent: SnapLayout {
orientation: Qt.Vertical
spacing: Tokens.spacing.small
MaterialShape {
@@ -140,11 +143,12 @@ Item {
asynchronous: true
active: opacity > 0
sourceComponent: RowLayout {
sourceComponent: SnapLayout {
spacing: Tokens.spacing.extraLarge
Details {
Layout.fillWidth: true
Layout.fillHeight: true
}
LyricsAndSelector {
+178 -154
View File
@@ -1,13 +1,14 @@
import QtQuick
import QtQuick.Layouts
import Quickshell.Services.Mpris
import ZShell
import ZShell.Components
import ZShell.Config
import qs.Components
import qs.Services
import qs.Helpers
ColumnLayout {
Item {
id: root
readonly property bool hasUnknownLength: (Players.active?.length ?? 0) > 2147483647
@@ -25,46 +26,187 @@ ColumnLayout {
return `${mins}:${secs}`;
}
spacing: Tokens.spacing.extraSmall
implicitHeight: ZUtils.snap(layout.implicitHeight, root)
implicitWidth: layout.implicitWidth
Timer {
running: Players.active?.isPlaying ?? false
interval: Config.dashboard.mediaUpdateInterval
triggeredOnStart: true
repeat: true
onTriggered: Players.active?.positionChanged()
}
SnapLayout {
orientation: Qt.Vertical
id: layout
anchors.left: parent.left
anchors.right: parent.right
y: ZUtils.snap((parent.height - implicitHeight) / 2, root)
CustomText {
Layout.fillWidth: true
text: Players.active?.trackTitle ?? ""
font: Tokens.font.title.large
elide: Text.ElideRight
animate: true
}
spacing: ZUtils.snap(Tokens.spacing.extraSmall, root)
CustomText {
Layout.fillWidth: true
text: Players.active?.trackArtist || qsTr("Unknown artist")
color: Colors.palette.m3onSurfaceVariant
font: Tokens.font.title.medium
elide: Text.ElideRight
animate: true
}
Timer {
running: Players.active?.isPlaying ?? false
interval: Config.dashboard.mediaUpdateInterval
triggeredOnStart: true
repeat: true
onTriggered: Players.active?.positionChanged()
}
CustomText {
Layout.fillWidth: true
text: Players.active?.trackAlbum || qsTr("Unknown album")
color: Colors.palette.m3secondary
font: Tokens.font.title.medium
elide: Text.ElideRight
animate: true
}
CustomText {
id: title
Layout.fillWidth: true
Layout.preferredHeight: ZUtils.snapCeil(implicitHeight, root)
text: Players.active?.trackTitle ?? ""
font: Tokens.font.title.large
elide: Text.ElideRight
animate: true
}
RowLayout {
Layout.topMargin: Tokens.spacing.extraLargeIncreased
Layout.fillWidth: true
spacing: Tokens.spacing.small
CustomText {
id: artist
Layout.fillWidth: true
Layout.preferredHeight: ZUtils.snapCeil(implicitHeight, root)
text: Players.active?.trackArtist || qsTr("Unknown artist")
color: Colors.palette.m3onSurfaceVariant
font: Tokens.font.title.medium
elide: Text.ElideRight
animate: true
}
CustomText {
id: album
Layout.fillWidth: true
Layout.preferredHeight: ZUtils.snapCeil(implicitHeight, root)
text: Players.active?.trackAlbum || qsTr("Unknown album")
color: Colors.palette.m3secondary
font: Tokens.font.title.medium
elide: Text.ElideRight
animate: true
}
SnapLayout {
id: sliderLayout
Layout.topMargin: Tokens.spacing.extraLargeIncreased
Layout.fillWidth: true
spacing: ZUtils.snap(Tokens.spacing.small, root)
CustomText {
id: positionLabel
Layout.preferredWidth: ZUtils.snapCeil(timeMetrics.width, root)
Layout.preferredHeight: positionSlider.implicitHeight
text: root.lengthStr(Players.active?.position ?? -1)
color: Colors.palette.m3onSurfaceVariant
font: timeMetrics.font
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
}
CustomSlider {
id: positionSlider
Layout.fillWidth: true
Layout.preferredHeight: ZUtils.snap(implicitHeight, root)
value: Players.active ? Players.active.position / (Players.active.length || 1) : 0
enabled: (Players.active?.canSeek ?? false) && !root.hasUnknownLength
wavy: true
animateWave: Players.active?.isPlaying ?? false
waveFrequency: 5
waveDuration: 2000
interactionOnMove: false
onInteraction: value => {
const active = Players.active;
if (active?.canSeek && active?.positionSupported)
active.position = value * active.length;
}
Binding {
target: positionLabel
property: "text"
value: root.lengthStr(positionSlider.pos * (Players.active?.length ?? 0))
when: positionSlider.dragging
}
}
CustomText {
Layout.preferredWidth: ZUtils.snapCeil(timeMetrics.width, root)
Layout.preferredHeight: positionSlider.implicitHeight
text: root.hasUnknownLength ? "--:--" : root.lengthStr(Players.active?.length ?? -1)
color: Colors.palette.m3onSurfaceVariant
font: timeMetrics.font
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
}
}
ButtonRow {
Layout.topMargin: Tokens.spacing.largeIncreased
Layout.fillWidth: true
spacing: Tokens.spacing.extraSmall
IconButton {
type: IconButton.Tonal
icon: "shuffle"
isRound: true
shapeMorph: true
checked: Players.active?.shuffle ?? false
font: Tokens.font.icon.builders.medium.weight(Font.Medium).build()
enabled: Players.active?.shuffleSupported
onClicked: Players.active.shuffle = !Players.active?.shuffle
implicitWidth: Math.round(implicitHeight * 0.9)
}
IconButton {
id: previousBtn
type: IconButton.Tonal
icon: "skip_previous"
isRound: true
shapeMorph: true
font: Tokens.font.icon.large
enabled: Players.active?.canGoPrevious
onClicked: Players.active?.previous()
}
IconButton {
id: playPauseBtn
icon: Players.active?.isPlaying ? "pause" : "play_arrow"
isRound: true
shapeMorph: true
fillWidth: true
checked: Players.active?.isPlaying ?? false
font: Tokens.font.icon.large
enabled: Players.active?.canTogglePlaying
onClicked: Players.active?.togglePlaying()
}
IconButton {
id: nextBtn
type: IconButton.Tonal
icon: "skip_next"
isRound: true
shapeMorph: true
font: Tokens.font.icon.large
enabled: Players.active?.canGoNext
onClicked: Players.active?.next()
}
IconButton {
type: IconButton.Tonal
icon: Players.active?.loopState === MprisLoopState.Track ? "repeat_one" : "repeat"
isRound: true
shapeMorph: true
checked: Players.active?.loopState === MprisLoopState.Track || Players.active?.loopState === MprisLoopState.Playlist
font: Tokens.font.icon.builders.medium.weight(Font.Medium).build()
enabled: Players.active?.loopSupported
onClicked: {
const state = Players.active.loopState;
if (state === MprisLoopState.None)
Players.active.loopState = MprisLoopState.Track;
else if (state === MprisLoopState.Track)
Players.active.loopState = MprisLoopState.Playlist;
else
Players.active.loopState = MprisLoopState.None;
}
implicitWidth: Math.round(implicitHeight * 0.9)
}
}
TextMetrics {
id: timeMetrics
@@ -72,123 +214,5 @@ ColumnLayout {
text: Players.active ? root.lengthStr(Math.max(Players.active.position, root.hasUnknownLength ? 0 : Players.active.length)).replace(/[1-9]/g, "0") : "00:00"
font: Tokens.font.label.medium
}
CustomText {
id: positionLabel
Layout.preferredWidth: timeMetrics.width
text: root.lengthStr(Players.active?.position ?? -1)
color: Colors.palette.m3onSurfaceVariant
font: timeMetrics.font
horizontalAlignment: Text.AlignHCenter
}
CustomSlider {
id: positionSlider
Layout.fillWidth: true
value: Players.active ? Players.active.position / (Players.active.length || 1) : 0
enabled: (Players.active?.canSeek ?? false) && !root.hasUnknownLength
wavy: true
animateWave: Players.active?.isPlaying ?? false
waveFrequency: 5
waveDuration: 2000
interactionOnMove: false
onInteraction: value => {
const active = Players.active;
if (active?.canSeek && active?.positionSupported)
active.position = value * active.length;
}
Binding {
target: positionLabel
property: "text"
value: root.lengthStr(positionSlider.pos * (Players.active?.length ?? 0))
when: positionSlider.dragging
}
}
CustomText {
Layout.preferredWidth: timeMetrics.width
text: root.hasUnknownLength ? "--:--" : root.lengthStr(Players.active?.length ?? -1)
color: Colors.palette.m3onSurfaceVariant
font: timeMetrics.font
horizontalAlignment: Text.AlignHCenter
}
}
ButtonRow {
Layout.topMargin: Tokens.spacing.largeIncreased
Layout.fillWidth: true
spacing: Tokens.spacing.extraSmall
IconButton {
type: IconButton.Tonal
icon: "shuffle"
isRound: true
shapeMorph: true
checked: Players.active?.shuffle ?? false
font: Tokens.font.icon.builders.medium.weight(Font.Medium).build()
enabled: Players.active?.shuffleSupported
onClicked: Players.active.shuffle = !Players.active?.shuffle
implicitWidth: Math.round(implicitHeight * 0.9)
}
IconButton {
id: previousBtn
type: IconButton.Tonal
icon: "skip_previous"
isRound: true
shapeMorph: true
font: Tokens.font.icon.large
enabled: Players.active?.canGoPrevious
onClicked: Players.active?.previous()
}
IconButton {
id: playPauseBtn
icon: Players.active?.isPlaying ? "pause" : "play_arrow"
isRound: true
shapeMorph: true
fillWidth: true
checked: Players.active?.isPlaying ?? false
font: Tokens.font.icon.large
enabled: Players.active?.canTogglePlaying
onClicked: Players.active?.togglePlaying()
}
IconButton {
id: nextBtn
type: IconButton.Tonal
icon: "skip_next"
isRound: true
shapeMorph: true
font: Tokens.font.icon.large
enabled: Players.active?.canGoNext
onClicked: Players.active?.next()
}
IconButton {
type: IconButton.Tonal
icon: Players.active?.loopState === MprisLoopState.Track ? "repeat_one" : "repeat"
isRound: true
shapeMorph: true
checked: Players.active?.loopState === MprisLoopState.Track || Players.active?.loopState === MprisLoopState.Playlist
font: Tokens.font.icon.builders.medium.weight(Font.Medium).build()
enabled: Players.active?.loopSupported
onClicked: {
const state = Players.active.loopState;
if (state === MprisLoopState.None)
Players.active.loopState = MprisLoopState.Track;
else if (state === MprisLoopState.Track)
Players.active.loopState = MprisLoopState.Playlist;
else
Players.active.loopState = MprisLoopState.None;
}
implicitWidth: Math.round(implicitHeight * 0.9)
}
}
}
+5 -2
View File
@@ -3,6 +3,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Effects
import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import ZShell.Services
import qs.Components
@@ -157,7 +158,8 @@ Item {
active: opacity > 0
opacity: 0
sourceComponent: ColumnLayout {
sourceComponent: SnapLayout {
orientation: Qt.Vertical
spacing: Tokens.spacing.large
CustomRect {
@@ -198,7 +200,8 @@ Item {
active: opacity > 0
opacity: 0
sourceComponent: ColumnLayout {
sourceComponent: SnapLayout {
orientation: Qt.Vertical
spacing: Tokens.spacing.small
MaterialIcon {
@@ -1,5 +1,6 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import Quickshell
import Quickshell.Services.Mpris
import ZShell.Config
@@ -8,14 +9,15 @@ import qs.Helpers
import qs.Services
Item {
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
id: layout
anchors.fill: parent
anchors.leftMargin: Tokens.padding.medium
spacing: Tokens.spacing.medium
RowLayout {
SnapLayout {
Layout.bottomMargin: -Tokens.spacing.medium
spacing: Tokens.spacing.medium
z: 1
+3 -1
View File
@@ -1,5 +1,6 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import ZShell
import ZShell.Blobs
import ZShell.Config
@@ -141,7 +142,8 @@ Item {
}
]
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
id: layout
anchors.centerIn: parent
@@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import Quickshell
import ZShell.Config
import ZShell.Internal
@@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import Quickshell
import Quickshell.Widgets
import ZShell.Config
@@ -38,7 +39,7 @@ CustomListView {
id: rowHover
}
RowLayout {
SnapLayout {
id: rowLayout
anchors.left: parent.left
+6 -4
View File
@@ -23,7 +23,7 @@ Item {
service: Memory
}
RowLayout {
SnapLayout {
id: layout
anchors.fill: parent
spacing: Tokens.spacing.medium
@@ -60,13 +60,14 @@ Item {
Layout.fillHeight: true
implicitHeight: mainLayout.implicitHeight + mainLayout.anchors.margins * 2
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
id: mainLayout
anchors.fill: parent
anchors.margins: Tokens.padding.large
spacing: 0
RowLayout {
SnapLayout {
spacing: Tokens.spacing.small
MaterialIcon {
@@ -131,7 +132,8 @@ Item {
}
}
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
id: infoColumn
anchors.right: parent.right
anchors.bottom: parent.bottom
+57 -32
View File
@@ -4,6 +4,8 @@ import QtQuick
import QtQuick.Layouts
import QtQuick.Templates
import Quickshell
import ZShell
import ZShell.Components
import ZShell.Config
import qs.Components
import qs.Services
@@ -16,9 +18,17 @@ Item {
required property var tabs
readonly property alias count: bar.count
readonly property int tabIndicatorSpacing: Tokens.spacing.small
readonly property int tabIndicatorSpacing: ZUtils.snap(Tokens.spacing.small, root)
implicitHeight: bar.implicitHeight + bar.anchors.topMargin + indicator.implicitHeight + indicator.anchors.topMargin + separator.implicitHeight
function snapLayoutHeight(v) {
const dpr = ZUtils.dprFor(root);
let h = Math.ceil(v);
while (Math.abs(h * dpr - Math.round(h * dpr)) > 1e-6)
++h;
return h;
}
implicitHeight: ZUtils.snap(bar.implicitHeight + bar.anchors.topMargin + indicator.implicitHeight + indicator.anchors.topMargin + separator.implicitHeight, root)
TabBar {
id: bar
@@ -31,9 +41,11 @@ Item {
currentIndex: root.screenState.dashboardTab
onCurrentIndexChanged: root.screenState.dashboardTab = currentIndex
implicitHeight: contentHeight
topPadding: 0
bottomPadding: 0
implicitHeight: implicitContentHeight
background: null
contentItem: RowLayout {
contentItem: SnapLayout {
spacing: 0
Repeater {
@@ -116,10 +128,13 @@ Item {
readonly property bool current: TabBar.tabBar.currentItem === this
Layout.fillWidth: true
Layout.preferredWidth: 1 // Uniform width across all tabs
Layout.fillHeight: true
Layout.preferredWidth: 1
implicitWidth: implicitContentWidth
implicitHeight: implicitContentHeight
background: null
topPadding: 0
bottomPadding: 0
contentItem: CustomMouseArea {
id: mouse
@@ -131,8 +146,8 @@ Item {
root.screenState.dashboardTab = Math.max(root.screenState.dashboardTab - 1, 0);
}
implicitWidth: Math.max(icon.width, label.width)
implicitHeight: icon.height + label.height
implicitWidth: Math.max(icon.implicitWidth, label.implicitWidth)
implicitHeight: snapLayout.implicitHeight
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
@@ -146,39 +161,49 @@ Item {
anchors.left: parent.left
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
implicitHeight: parent.height + root.tabIndicatorSpacing * 2
anchors.alignWhenCentered: false
implicitHeight: ZUtils.snap(parent.height + Tokens.sizes.dashboard.tabIndicatorSpacing * 2, stateLayer)
radius: Tokens.rounding.medium
color: tab.current ? Colors.palette.m3primary : Colors.palette.m3onSurface
onClicked: root.screenState.dashboardTab = tab.TabBar.index
}
MaterialIcon {
id: icon
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: label.top
text: tab.iconName
color: tab.current ? Colors.palette.m3primary : Colors.palette.m3onSurfaceVariant
fill: tab.current ? 1 : 0
fontStyle: Tokens.font.icon.medium
Behavior on fill {
Anim {
type: Anim.DefaultEffects
}
onClicked: {
root.screenState.dashboardTab = tab.TabBar.index;
}
}
CustomText {
id: label
SnapLayout {
id: snapLayout
anchors.fill: parent
spacing: 0
orientation: Qt.Vertical
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom
MaterialIcon {
id: icon
text: tab.text
color: tab.current ? Colors.palette.m3primary : Colors.palette.m3onSurfaceVariant
text: tab.iconName
color: tab.current ? Colors.palette.m3primary : Colors.palette.m3onSurfaceVariant
fill: tab.current ? 1 : 0
fontStyle: Tokens.font.icon.medium
Layout.fillHeight: true
Layout.alignment: Qt.AlignHCenter
Behavior on fill {
Anim {
type: Anim.DefaultEffects
}
}
}
CustomText {
id: label
text: tab.text
color: tab.current ? Colors.palette.m3primary : Colors.palette.m3onSurfaceVariant
Layout.fillHeight: true
Layout.alignment: Qt.AlignHCenter
}
}
}
}
+12 -6
View File
@@ -1,11 +1,13 @@
import QtQuick
import QtQuick.Layouts
import ZShell
import ZShell.Components
import ZShell.Config
import qs.Components
import qs.Services
import qs.Helpers
RowLayout {
SnapLayout {
id: root
spacing: Tokens.spacing.largeIncreased
@@ -20,7 +22,7 @@ RowLayout {
readonly property real markerX: {
const d = root.now;
return d.getHours() + d.getMinutes() / 60;
return ZUtils.snap(d.getHours() + d.getMinutes() / 60, root);
}
function formatHour(h) {
@@ -39,11 +41,13 @@ RowLayout {
onTriggered: root.now = new Date()
}
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
Layout.fillWidth: true
Layout.fillHeight: true
Layout.preferredWidth: root.width / 2
RowLayout {
SnapLayout {
Layout.fillWidth: true
MaterialIcon {
@@ -90,11 +94,13 @@ RowLayout {
}
}
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
Layout.fillWidth: true
Layout.fillHeight: true
Layout.preferredWidth: root.width / 2
RowLayout {
SnapLayout {
Layout.fillWidth: true
MaterialIcon {
+14 -7
View File
@@ -3,6 +3,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Config
import ZShell.Components
import qs.Components
import qs.Modules.Dashboard.Weather
import qs.Services
@@ -18,13 +19,14 @@ Item {
implicitHeight: layout.implicitHeight
Component.onCompleted: Weather.reload()
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
id: layout
anchors.fill: parent
spacing: Tokens.spacing.medium
RowLayout {
SnapLayout {
Layout.leftMargin: Tokens.padding.large
Layout.rightMargin: Tokens.padding.large
Layout.fillWidth: true
@@ -82,7 +84,7 @@ Item {
}
}
RowLayout {
SnapLayout {
Layout.fillWidth: true
spacing: Tokens.spacing.medium
@@ -121,7 +123,9 @@ Item {
color: Colors.palette.m3onSurface
}
RowLayout {
SnapLayout {
id: forecastLayout
Layout.fillWidth: true
spacing: Tokens.spacing.medium
@@ -137,12 +141,14 @@ Item {
required property var modelData
Layout.fillWidth: true
Layout.fillHeight: true
implicitHeight: forecastItemColumn.implicitHeight + Tokens.padding.medium * 2
radius: root.radius
color: Colors.tPalette.m3surfaceContainer
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
id: forecastItemColumn
anchors.centerIn: parent
@@ -196,7 +202,8 @@ Item {
property color colour
Layout.fillWidth: true
Layout.preferredHeight: 60
Layout.fillHeight: true
implicitHeight: 60
radius: Tokens.rounding.medium
color: Colors.tPalette.m3surfaceContainer
@@ -230,7 +237,7 @@ Item {
}
}
component WeatherStat: RowLayout {
component WeatherStat: SnapLayout {
id: weatherStat
property string icon
@@ -1,5 +1,6 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import Quickshell
import Quickshell.Widgets
import Quickshell.Hyprland
@@ -43,7 +44,8 @@ Item {
}
opacity: root.visible ? 1 : 0
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
id: menuLayout
anchors.centerIn: parent
spacing: 0
@@ -53,7 +55,7 @@ Item {
radius: popupBackground.radius - popupBackground.padding
implicitHeight: openTerminalRow.implicitHeight + Tokens.padding.extraSmall * 2
RowLayout {
SnapLayout {
id: openTerminalRow
spacing: 8
anchors.fill: parent
@@ -92,7 +94,7 @@ Item {
radius: popupBackground.radius - popupBackground.padding
implicitHeight: settingsRow.implicitHeight + Tokens.padding.extraSmall * 2
RowLayout {
SnapLayout {
id: settingsRow
spacing: 8
anchors.fill: parent
@@ -132,7 +134,7 @@ Item {
radius: popupBackground.radius - popupBackground.padding
implicitHeight: logoutRow.implicitHeight + Tokens.padding.extraSmall * 2
RowLayout {
SnapLayout {
id: logoutRow
spacing: 8
anchors.fill: parent
@@ -171,7 +173,7 @@ Item {
// radius: popupBackground.radius - popupBackground.padding
// implicitHeight: desktopIconsRow.implicitHeight + Tokens.padding.extraSmall * 2
//
// RowLayout {
// SnapLayout {
// id: desktopIconsRow
// spacing: 8
// anchors.fill: parent
@@ -3,6 +3,7 @@ import QtQuick.Layouts
import Quickshell
import Quickshell.Widgets
import qs.Components
import ZShell.Components
import ZShell.Config
import qs.Services
@@ -57,22 +58,25 @@ Item {
Anim {}
}
ColumnLayout {
SnapLayout {
id: menuLayout
anchors.centerIn: parent
spacing: 0
orientation: Qt.Vertical
CustomRect {
Layout.preferredWidth: 160
implicitHeight: openRow.implicitHeight + Tokens.padding.extraSmall * 2
radius: popupBackground.radius - popupBackground.padding
RowLayout {
SnapLayout {
id: openRow
anchors.fill: parent
anchors.leftMargin: Tokens.padding.small
spacing: 8
MaterialIcon {
@@ -111,11 +115,12 @@ Item {
implicitHeight: openWithRow.implicitHeight + Tokens.padding.extraSmall * 2
radius: popupBackground.radius - popupBackground.padding
RowLayout {
SnapLayout {
id: openWithRow
anchors.fill: parent
anchors.leftMargin: Tokens.padding.small
spacing: 8
MaterialIcon {
@@ -156,11 +161,12 @@ Item {
implicitHeight: copyPathRow.implicitHeight + Tokens.padding.extraSmall * 2
radius: popupBackground.radius - popupBackground.padding
RowLayout {
SnapLayout {
id: copyPathRow
anchors.fill: parent
anchors.leftMargin: Tokens.padding.small
spacing: 8
MaterialIcon {
@@ -190,11 +196,12 @@ Item {
radius: popupBackground.radius - popupBackground.padding
visible: contextMenu.targetPaths.length === 1
RowLayout {
SnapLayout {
id: renameRow
anchors.fill: parent
anchors.leftMargin: Tokens.padding.small
spacing: 8
MaterialIcon {
@@ -231,11 +238,12 @@ Item {
implicitHeight: deleteRow.implicitHeight + Tokens.padding.extraSmall * 2
radius: popupBackground.radius - popupBackground.padding
RowLayout {
SnapLayout {
id: deleteRow
anchors.fill: parent
anchors.leftMargin: Tokens.padding.small
spacing: 8
MaterialIcon {
+7 -2
View File
@@ -4,6 +4,7 @@ import Quickshell
import Quickshell.Widgets
import qs.Components
import qs.Helpers
import ZShell.Components
import ZShell.Config
import qs.Services
@@ -29,7 +30,10 @@ CustomRect {
active: !isSeparator
anchors.centerIn: parent
sourceComponent: ColumnLayout {
sourceComponent: SnapLayout {
spacing: Tokens.spacing.extraSmall
orientation: Qt.Vertical
IconImage {
id: icon
@@ -38,8 +42,9 @@ CustomRect {
source: Quickshell.iconPath(AppSearch.guessIcon(appToplevel?.appId), "image-missing")
}
RowLayout {
SnapLayout {
Layout.alignment: Qt.AlignHCenter
spacing: 3
Repeater {
+1
View File
@@ -1,5 +1,6 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import qs.Components
import ZShell.Config
import qs.Services
+3 -1
View File
@@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import Quickshell
import ZShell
import ZShell.Config
import qs.Components
import qs.Services
@@ -52,7 +53,7 @@ CustomListView {
highlightFollowsCurrentItem: false
highlightRangeMode: ListView.ApplyRange
implicitHeight: (Config.launcher.sizes.itemHeight + spacing) * Math.min(Config.launcher.maxAppsShown, count) - spacing
implicitHeight: (Tokens.sizes.launcher.itemHeight + spacing) * Math.min(Config.launcher.maxAppsShown, count) - spacing
orientation: Qt.Vertical
preferredHighlightBegin: 0
preferredHighlightEnd: height
@@ -97,6 +98,7 @@ CustomListView {
}
}
highlight: CustomRect {
id: hl
color: Colors.palette.m3onSurface
implicitHeight: root.currentItem?.implicitHeight ?? 0
implicitWidth: root.width
+2 -3
View File
@@ -22,7 +22,7 @@ CarouselView {
delegateProperties: ({
screenState: root.screenState
})
focalWidth: Config.launcher.sizes.wallpaperWidth
focalWidth: Tokens.sizes.launcher.wallpaperWidth
glideDuration: 250
glideEasingType: Easing.OutCubic
implicitHeight: tileHeight + Tokens.spacing.small / 2 + Tokens.padding.large + Tokens.padding.small
@@ -41,8 +41,7 @@ CarouselView {
tileHeight: focalWidth / 16 * 9
delegate: Component {
WallpaperTile {
}
WallpaperTile {}
}
Component.onDestruction: Wallpapers.stopPreview()
+3 -2
View File
@@ -2,17 +2,18 @@ pragma ComponentBehavior: Bound
import Quickshell
import QtQuick
import ZShell
import ZShell.Config
import qs.Modules.Launcher.Services
import qs.Components
import qs.Helpers
import ZShell.Config
import qs.Services
Item {
id: root
required property real maxHeight
readonly property int padding: Tokens.padding.largeIncreased / 4
readonly property int padding: ZUtils.snap(Tokens.padding.medium / 2, root)
required property var panels
readonly property int rounding: Tokens.rounding.largeIncreased
required property ScreenState screenState
+5 -4
View File
@@ -2,11 +2,12 @@ pragma ComponentBehavior: Bound
import Quickshell
import QtQuick
import ZShell
import ZShell.Config
import qs.Paths
import qs.Modules
import qs.Components
import qs.Helpers
import ZShell.Config
import qs.Services
Item {
@@ -71,7 +72,7 @@ Item {
PropertyChanges {
appList.active: true
root.implicitHeight: Math.min(root.maxHeight, appList.implicitHeight > 0 ? appList.implicitHeight : empty.implicitHeight)
root.implicitWidth: Config.launcher.sizes.itemWidth
root.implicitWidth: Tokens.sizes.launcher.itemWidth
}
AnchorChanges {
@@ -83,8 +84,8 @@ Item {
name: "wallpapers"
PropertyChanges {
root.implicitHeight: Config.launcher.sizes.wallpaperHeight
root.implicitWidth: Math.max(Config.launcher.sizes.itemWidth * 1.2, wallpaperList.implicitWidth)
root.implicitHeight: Tokens.sizes.launcher.wallpaperHeight
root.implicitWidth: Math.max(Tokens.sizes.launcher.itemWidth * 1.2, wallpaperList.implicitWidth)
wallpaperList.active: true
}
}
+1 -1
View File
@@ -13,7 +13,7 @@ Item {
anchors.left: parent?.left
anchors.right: parent?.right
implicitHeight: Config.launcher.sizes.itemHeight
implicitHeight: Tokens.sizes.launcher.itemHeight
StateLayer {
radius: Tokens.rounding.medium
+42 -18
View File
@@ -1,10 +1,13 @@
import Quickshell
import Quickshell.Widgets
import QtQuick
import QtQuick.Layouts
import ZShell.Config
import ZShell.Components
import ZShell
import qs.Modules.Launcher.Services
import qs.Components
import qs.Helpers
import ZShell.Config
import qs.Modules
import qs.Services
@@ -16,53 +19,72 @@ Item {
anchors.left: parent?.left
anchors.right: parent?.right
implicitHeight: Config.launcher.sizes.itemHeight
implicitHeight: ZUtils.snap(Tokens.sizes.launcher.itemHeight, root)
StateLayer {
radius: Tokens.rounding.medium
onClicked: {
Apps.launch(root.modelData);
root.screenState.launcher = false;
// Apps.launch(root.modelData);
// root.screenState.launcher = false;
ZUtils.logPlacement(icon, "icon");
ZUtils.logPlacement(name, "name");
ZUtils.logPlacement(favoriteIcon, "favoriteIcon");
ZUtils.logPlacement(comment, "comment");
ZUtils.logPlacement(text, "text");
ZUtils.logPlacement(mainLayout, "main");
}
}
Item {
SnapLayout {
id: mainLayout
anchors.fill: parent
anchors.leftMargin: Tokens.padding.medium
anchors.margins: Tokens.padding.small
anchors.rightMargin: Tokens.padding.medium
spacing: Tokens.spacing.medium
IconImage {
id: icon
anchors.verticalCenter: parent.verticalCenter
implicitSize: parent.height
implicitSize: parent.height - Tokens.padding.small * 2
source: Quickshell.iconPath(root.modelData?.icon, "image-missing")
}
Item {
anchors.left: icon.right
anchors.leftMargin: Tokens.spacing.medium
anchors.verticalCenter: icon.verticalCenter
implicitHeight: name.implicitHeight + comment.implicitHeight
implicitWidth: parent.width - icon.width
SnapLayout {
id: text
Layout.fillHeight: true
Layout.fillWidth: true
Layout.topMargin: Tokens.padding.extraSmall
Layout.bottomMargin: Tokens.padding.extraSmall
orientation: Qt.Vertical
spacing: 0
CustomText {
id: name
Layout.fillHeight: true
Layout.fillWidth: true
text: root.modelData?.name ?? ""
verticalAlignment: CustomText.AlignVCenter
horizontalAlignment: CustomText.AlignLeft
}
CustomText {
id: comment
anchors.top: name.bottom
Layout.fillHeight: true
Layout.fillWidth: true
color: Colors.palette.m3outline
elide: Text.ElideRight
font: Tokens.font.body.small
text: (root.modelData?.comment || root.modelData?.genericName || root.modelData?.name) ?? ""
width: root.width - icon.width - Tokens.rounding.medium - Tokens.padding.medium * 2
verticalAlignment: CustomText.AlignVCenter
horizontalAlignment: CustomText.AlignLeft
}
}
@@ -70,14 +92,16 @@ Item {
id: favoriteIcon
active: root.modelData && Strings.testRegexList(Config.launcher.favoriteApps, root.modelData.id)
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
Layout.fillHeight: true
asynchronous: true
sourceComponent: MaterialIcon {
color: Colors.palette.m3primary
fill: 1
text: "favorite"
verticalAlignment: MaterialIcon.AlignVCenter
}
}
}
+2 -1
View File
@@ -2,6 +2,7 @@ import ZShell
import Quickshell
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import qs.Components
import qs.Modules
import qs.Helpers
@@ -31,7 +32,7 @@ Item {
}
}
RowLayout {
SnapLayout {
anchors.left: parent.left
anchors.margins: Tokens.padding.small
anchors.right: parent.right
+9 -4
View File
@@ -2,14 +2,15 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Config
import ZShell.Components
import qs.Paths
import qs.Components
import qs.Helpers
import ZShell.Config
import qs.Modules
import qs.Services
ColumnLayout {
SnapLayout {
id: root
readonly property real centerScale: Math.min(1, (lock.screen?.height ?? 1440) / 1440)
@@ -19,10 +20,13 @@ ColumnLayout {
Layout.fillHeight: true
Layout.fillWidth: false
Layout.preferredWidth: centerWidth
orientation: Qt.Vertical
spacing: Tokens.spacing.largeIncreased * 2
RowLayout {
SnapLayout {
Layout.alignment: Qt.AlignHCenter
spacing: Tokens.spacing.small
CustomText {
@@ -109,11 +113,12 @@ ColumnLayout {
}
}
RowLayout {
SnapLayout {
id: input
anchors.fill: parent
anchors.margins: Tokens.padding.extraSmall
spacing: Tokens.spacing.medium
Item {
+8 -4
View File
@@ -1,8 +1,9 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import qs.Components
import qs.Helpers
import ZShell.Config
import qs.Services
Item {
@@ -13,15 +14,18 @@ Item {
implicitHeight: layout.implicitHeight
implicitWidth: layout.implicitWidth
RowLayout {
SnapLayout {
id: layout
anchors.fill: parent
spacing: Tokens.spacing.largeIncreased * 2
ColumnLayout {
SnapLayout {
Layout.fillWidth: true
spacing: Tokens.spacing.medium
orientation: Qt.Vertical
WeatherInfo {
id: weather
@@ -50,8 +54,8 @@ Item {
}
NotifDock {
Layout.fillHeight: true
Layout.fillWidth: true
Layout.fillHeight: true
lock: root.lock
}
}
+1
View File
@@ -3,6 +3,7 @@ pragma ComponentBehavior: Bound
import Quickshell
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import qs.Modules
import qs.Components
import qs.Helpers
+3 -1
View File
@@ -48,14 +48,16 @@ Item {
}
}
ColumnLayout {
SnapLayout {
id: layout
anchors.left: parent.left
anchors.margins: Tokens.padding.extraLarge
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
spacing: Tokens.spacing.extraSmall
orientation: Qt.Vertical
CustomText {
Layout.fillWidth: true
+9 -11
View File
@@ -4,10 +4,11 @@ import Quickshell
import Quickshell.Widgets
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import qs.Modules
import qs.Components
import qs.Helpers
import ZShell.Config
import qs.Daemons
import qs.Services
@@ -21,9 +22,11 @@ CustomRect {
radius: Tokens.rounding.small
topRightRadius: Tokens.rounding.largeIncreased
ColumnLayout {
SnapLayout {
anchors.fill: parent
anchors.margins: Tokens.padding.large
orientation: Qt.Vertical
spacing: Tokens.spacing.small
CustomText {
@@ -48,15 +51,10 @@ CustomRect {
duration: Tokens.anim.durations.extraLarge
}
}
sourceComponent: ColumnLayout {
spacing: Tokens.spacing.largeIncreased
CustomText {
Layout.alignment: Qt.AlignHCenter
color: Colors.palette.m3outlineVariant
font: Tokens.font.headline.builders.small.width(90).build()
text: qsTr("No Notifications")
}
sourceComponent: CustomText {
color: Colors.palette.m3outlineVariant
font: Tokens.font.headline.builders.small.width(90).build()
text: qsTr("No Notifications")
}
}
+16 -7
View File
@@ -5,10 +5,11 @@ import Quickshell.Widgets
import Quickshell.Services.Notifications
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import qs.Modules
import qs.Components
import qs.Helpers
import ZShell.Config
import qs.Daemons
import qs.Services
@@ -36,13 +37,14 @@ CustomRect {
}
}
RowLayout {
SnapLayout {
id: content
anchors.left: parent.left
anchors.margins: Tokens.padding.small
anchors.right: parent.right
anchors.top: parent.top
spacing: Tokens.spacing.medium
Item {
@@ -118,15 +120,18 @@ CustomRect {
}
}
ColumnLayout {
SnapLayout {
Layout.bottomMargin: -Tokens.padding.extraSmall / 2 - (root.expanded ? 0 : spacing)
Layout.fillWidth: true
Layout.topMargin: -Tokens.padding.extraSmall
spacing: Math.round(Tokens.spacing.small / 2)
RowLayout {
spacing: Math.round(Tokens.spacing.small / 2)
orientation: Qt.Vertical
SnapLayout {
Layout.bottomMargin: -parent.spacing
Layout.fillWidth: true
spacing: Tokens.spacing.small
CustomText {
@@ -167,10 +172,11 @@ CustomRect {
}
}
RowLayout {
SnapLayout {
id: expandBtn
anchors.centerIn: parent
spacing: Tokens.spacing.small / 2
CustomText {
@@ -261,7 +267,10 @@ CustomRect {
Behavior on opacity {
Anim {}
}
sourceComponent: ColumnLayout {
sourceComponent: SnapLayout {
orientation: Qt.Vertical
spacing: Tokens.spacing.extraSmall
Repeater {
model: ScriptModel {
values: root.notifs.slice(Config.notifs.groupPreviewNum)
+3 -1
View File
@@ -5,6 +5,7 @@ import QtQuick.Layouts
import M3Shapes
import ZShell.Services
import ZShell.Config
import ZShell.Components
import qs.Components
import qs.Effects
import qs.Services
@@ -33,11 +34,12 @@ CustomRect {
service: Storage
}
RowLayout {
SnapLayout {
id: layout
anchors.fill: parent
anchors.margins: Tokens.padding.large
spacing: Tokens.spacing.largeIncreased
Resource {
+4 -2
View File
@@ -1,11 +1,13 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import qs.Components
import ZShell.Config
import qs.Helpers
import qs.Services
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
id: root
required property int rootHeight
@@ -20,7 +22,7 @@ ColumnLayout {
text: Weather.description
}
RowLayout {
SnapLayout {
Layout.alignment: Qt.AlignHCenter
spacing: Tokens.spacing.small
+4 -2
View File
@@ -1,5 +1,6 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import M3Shapes
import ZShell
import qs.Components
@@ -14,7 +15,7 @@ CustomRect {
implicitHeight: header.anchors.margins + header.implicitHeight + Tokens.spacing.small + layout.implicitHeight + layout.anchors.bottomMargin
radius: Tokens.rounding.small
RowLayout {
SnapLayout {
id: header
anchors.left: parent.left
@@ -55,7 +56,8 @@ CustomRect {
orientation: VerticalFadeListView.Horizontal
spacing: Tokens.spacing.medium
delegate: ColumnLayout {
delegate: SnapLayout {
orientation: Qt.Vertical
id: hour
readonly property bool current: ListView.view.currentItem === this
+17 -13
View File
@@ -2,9 +2,11 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell
import ZShell.Config
import ZShell.Components
import qs.Components
import qs.Helpers
import ZShell.Config
import qs.Daemons
import qs.Services
@@ -19,14 +21,17 @@ Item {
required property ScreenState screenState
required property real volume
implicitHeight: layout.implicitHeight + Tokens.padding.smaller * 2
implicitWidth: layout.implicitWidth + Tokens.padding.smaller * 2
implicitHeight: layout.implicitHeight + layout.anchors.margins * 2
implicitWidth: layout.implicitWidth + layout.anchors.margins * 2
ColumnLayout {
SnapLayout {
id: layout
anchors.centerIn: parent
anchors.fill: parent
anchors.margins: Tokens.padding.extraSmall
spacing: Tokens.spacing.medium
orientation: Qt.Vertical
// Speaker volume
CustomMouseArea {
@@ -37,8 +42,8 @@ Item {
Audio.decrementVolume();
}
implicitHeight: Config.osd.sizes.sliderHeight
implicitWidth: Config.osd.sizes.sliderWidth
implicitHeight: ZUtils.snap(Config.osd.sizes.sliderHeight, root)
implicitWidth: ZUtils.snap(Config.osd.sizes.sliderWidth, root)
FilledSlider {
anchors.fill: parent
@@ -63,8 +68,8 @@ Item {
Audio.decrementSourceVolume();
}
implicitHeight: Config.osd.sizes.sliderHeight
implicitWidth: Config.osd.sizes.sliderWidth
implicitHeight: ZUtils.snap(Config.osd.sizes.sliderHeight, root)
implicitWidth: ZUtils.snap(Config.osd.sizes.sliderWidth, root)
FilledSlider {
anchors.fill: parent
@@ -93,8 +98,8 @@ Item {
monitor.setBrightness(monitor.brightness - Config.services.brightnessIncrement);
}
implicitHeight: Config.osd.sizes.sliderHeight
implicitWidth: Config.osd.sizes.sliderWidth
implicitHeight: ZUtils.snap(Config.osd.sizes.sliderHeight, root)
implicitWidth: ZUtils.snap(Config.osd.sizes.sliderWidth, root)
FilledSlider {
anchors.fill: parent
@@ -131,8 +136,7 @@ Item {
}
}
Behavior on opacity {
Anim {
}
Anim {}
}
}
}
+5 -5
View File
@@ -2,9 +2,10 @@ pragma ComponentBehavior: Bound
import Quickshell
import QtQuick
import ZShell
import ZShell.Config
import qs.Components
import qs.Helpers
import ZShell.Config
import qs.Daemons
Item {
@@ -30,8 +31,8 @@ Item {
}
anchors.rightMargin: (-implicitWidth - 5 - sidebarOffset) * offsetScale
implicitHeight: content.implicitHeight
implicitWidth: content.implicitWidth
implicitHeight: ZUtils.snap(content.implicitHeight, root)
implicitWidth: ZUtils.snap(content.implicitWidth, root)
opacity: 1 - offsetScale
visible: offsetScale < 1
@@ -98,8 +99,7 @@ Item {
id: content
active: root.shouldBeActive || root.visible
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
anchors.fill: parent
sourceComponent: Content {
brightness: root.brightness
+14 -5
View File
@@ -83,13 +83,16 @@ Scope {
opacity: 0
radius: Tokens.rounding.small * 2
ColumnLayout {
SnapLayout {
id: layout
anchors.fill: parent
anchors.margins: Tokens.padding.medium
RowLayout {
spacing: Tokens.spacing.extraSmall
orientation: Qt.Vertical
SnapLayout {
id: contentRow
spacing: 24
@@ -120,12 +123,15 @@ Scope {
}
}
ColumnLayout {
SnapLayout {
id: contentColumn
Layout.fillHeight: true
Layout.fillWidth: true
spacing: Tokens.spacing.extraSmall
orientation: Qt.Vertical
CustomText {
Layout.alignment: Qt.AlignLeft
Layout.preferredWidth: Math.min(600, contentWidth)
@@ -210,13 +216,15 @@ Scope {
}
}
ColumnLayout {
SnapLayout {
id: textDetailsColumn
anchors.fill: parent
anchors.margins: Tokens.padding.small
opacity: 0
spacing: Tokens.spacing.small
orientation: Qt.Vertical
CustomText {
text: `actionId: ${polkitAgent.flow?.actionId}`
@@ -230,8 +238,9 @@ Scope {
}
}
RowLayout {
SnapLayout {
Layout.preferredWidth: contentRow.implicitWidth
spacing: 8
IconButton {
+4 -2
View File
@@ -1,5 +1,6 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import Quickshell.Services.UPower
import ZShell.Config
import qs.Components
@@ -50,7 +51,8 @@ ClipRect {
}
}
component Contents: ColumnLayout {
component Contents: SnapLayout {
orientation: Qt.Vertical
id: contents
required property color accentColor
@@ -100,7 +102,7 @@ ClipRect {
}
}
RowLayout {
SnapLayout {
Layout.alignment: Qt.AlignRight
Layout.bottomMargin: -Tokens.padding.extraSmall
Layout.rightMargin: -Tokens.padding.extraSmall
+20 -12
View File
@@ -1,5 +1,7 @@
import QtQuick
import QtQuick.Layouts
import ZShell
import ZShell.Components
import ZShell.Config
import qs.Components
import qs.Services
@@ -15,8 +17,8 @@ CustomRect {
required property real usage
color: Colors.tPalette.m3surfaceContainer
implicitHeight: Math.max(tempProg.implicitHeight + detailsRow.implicitHeight + Tokens.spacing.largeIncreased, usageColumn.implicitHeight + usageLabel.implicitHeight) + Tokens.padding.large * 2
implicitWidth: 450
implicitHeight: ZUtils.snap(Math.max(tempProg.implicitHeight + detailsRow.implicitHeight + Tokens.spacing.largeIncreased, usageColumn.implicitHeight + usageLabel.implicitHeight) + Tokens.padding.large * 2, root)
implicitWidth: ZUtils.snapCeil(450, root)
radius: Tokens.rounding.largeIncreased
ClipRect {
@@ -43,7 +45,7 @@ CustomRect {
anchors.margins: Tokens.padding.large
anchors.top: parent.top
fgColor: root.accent
implicitSize: Math.max(icon.implicitWidth, icon.implicitHeight) + Tokens.padding.small * 2
implicitSize: ZUtils.snap(Math.max(icon.implicitWidth, icon.implicitHeight) + Tokens.padding.small * 2, root)
spacing: Tokens.spacing.extraSmall
strokeWidth: Tokens.padding.extraSmall
value: root.usage
@@ -62,12 +64,14 @@ CustomRect {
}
}
ColumnLayout {
SnapLayout {
anchors.left: tempProg.right
anchors.margins: Tokens.spacing.largeIncreased
anchors.right: usageColumn.left
anchors.verticalCenter: tempProg.verticalCenter
spacing: Tokens.spacing.extraSmall
orientation: Qt.Vertical
CustomText {
color: root.accent
@@ -82,15 +86,17 @@ CustomRect {
}
}
ColumnLayout {
SnapLayout {
id: detailsRow
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.margins: Tokens.padding.largeIncreased
spacing: Tokens.spacing.extraSmall
RowLayout {
spacing: Tokens.spacing.extraSmall
orientation: Qt.Vertical
SnapLayout {
Layout.leftMargin: -Tokens.padding.extraSmall
spacing: Tokens.spacing.extraSmall
@@ -108,32 +114,34 @@ CustomRect {
CustomProgressBar {
fgColor: root.accent
implicitHeight: Tokens.padding.extraSmall
implicitHeight: Tokens.padding.small
indeterminate: isNaN(root.usage) || isNaN(root.temperature)
value: root.temperature / 100
}
}
Column {
SnapLayout {
id: usageColumn
anchors.margins: Tokens.padding.large
anchors.right: parent.right
anchors.rightMargin: 32
anchors.rightMargin: Tokens.padding.extraLarge
anchors.verticalCenter: parent.verticalCenter
spacing: 0
orientation: Qt.Vertical
CustomText {
id: usageLabel
anchors.right: parent.right
Layout.alignment: Qt.AlignRight
color: Colors.palette.m3onSurfaceVariant
font: Tokens.font.body.medium
text: qsTr("Usage")
}
CustomText {
anchors.right: parent.right
Layout.alignment: Qt.AlignRight
color: root.accent
font: Tokens.font.headline.builders.small.width(50).build()
text: isNaN(root.usage) ? "...%" : Math.round(root.usage * 100) + "%"
+24 -17
View File
@@ -1,5 +1,7 @@
import QtQuick
import QtQuick.Layouts
import ZShell
import ZShell.Components
import ZShell.Services
import ZShell.Config
import qs.Components
@@ -10,34 +12,39 @@ CustomRect {
readonly property color accent: Colors.palette.m3tertiary
required property real perc
required property int used
required property int total
required property string label
required property string icon
Layout.fillWidth: true
color: Colors.tPalette.m3surfaceContainer
implicitHeight: layout.implicitHeight + Tokens.padding.large * 2
implicitWidth: layout.implicitWidth + Tokens.padding.extraLargeIncreased * 2
radius: Tokens.rounding.largeIncreased
ServiceRef {
service: Memory
}
ColumnLayout {
SnapLayout {
id: layout
anchors.centerIn: parent
anchors.left: parent.left
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
orientation: Qt.Vertical
spacing: Tokens.spacing.extraSmall
RowLayout {
Layout.leftMargin: -Tokens.padding.extraSmall
SnapLayout {
Layout.alignment: Qt.AlignHCenter
spacing: Tokens.spacing.small
MaterialIcon {
color: root.accent
fill: 1
text: "memory_alt"
text: root.icon
}
CustomText {
text: qsTr("Memory")
text: root.label
}
}
@@ -45,17 +52,17 @@ CustomRect {
Layout.alignment: Qt.AlignHCenter
Layout.topMargin: Tokens.spacing.largeIncreased
fgColor: root.accent
implicitSize: usageColumn.implicitHeight + thickness + Tokens.padding.largeIncreased * 2
implicitSize: ZUtils.snap(usageColumn.implicitHeight + thickness + Tokens.padding.largeIncreased * 2, root)
startAngle: -225
sweepAngle: 270
value: Memory.percentage
value: root.perc
Behavior on clampedVal {
Anim {
}
Anim {}
}
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
id: usageColumn
anchors.centerIn: parent
@@ -66,7 +73,7 @@ CustomRect {
Layout.alignment: Qt.AlignHCenter
color: root.accent
font: Tokens.font.body.large
text: Math.round(Memory.percentage * 100) + "%"
text: Math.round(root.perc * 100) + "%"
}
CustomText {
@@ -80,7 +87,7 @@ CustomRect {
CustomText {
Layout.alignment: Qt.AlignHCenter
text: {
const fmt = UsageFmt.formatKib(Memory.used, Memory.total);
const fmt = UsageFmt.formatKib(root.used, root.total);
return `${fmt.value.toFixed(1)} / ${Math.floor(fmt.total)} ${fmt.unit}`;
}
}
+17 -6
View File
@@ -18,15 +18,17 @@ CustomRect {
service: NetworkUsage
}
ColumnLayout {
SnapLayout {
id: layout
anchors.bottomMargin: Tokens.padding.small
anchors.fill: parent
anchors.margins: Tokens.padding.large
spacing: 0
RowLayout {
spacing: 0
orientation: Qt.Vertical
SnapLayout {
spacing: Tokens.spacing.small
MaterialIcon {
@@ -108,8 +110,11 @@ CustomRect {
}
// Download row
RowLayout {
SnapLayout {
Layout.fillWidth: true
Layout.maximumWidth: root.width > root.implicitWidth * 2 ? root.width / 2 : -1
Layout.alignment: Qt.AlignRight
spacing: Tokens.spacing.small
MaterialIcon {
@@ -136,8 +141,11 @@ CustomRect {
}
// Upload row
RowLayout {
SnapLayout {
Layout.fillWidth: true
Layout.maximumWidth: root.width > root.implicitWidth * 2 ? root.width / 2 : -1
Layout.alignment: Qt.AlignRight
spacing: Tokens.spacing.small
MaterialIcon {
@@ -164,8 +172,11 @@ CustomRect {
}
// Session totals
RowLayout {
SnapLayout {
Layout.fillWidth: true
Layout.maximumWidth: root.width > root.implicitWidth * 2 ? root.width / 2 : -1
Layout.alignment: Qt.AlignRight
spacing: Tokens.spacing.small
MaterialIcon {
+13 -6
View File
@@ -1,6 +1,8 @@
import QtQuick
import QtQuick.Layouts
import Quickshell
import ZShell
import ZShell.Components
import ZShell.Services
import ZShell.Config
import qs.Components
@@ -21,23 +23,26 @@ CustomRect {
service: Storage
}
ColumnLayout {
SnapLayout {
id: layout
anchors.left: parent.left
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
spacing: 0
RowLayout {
spacing: 0
orientation: Qt.Vertical
SnapLayout {
id: row
Layout.alignment: Qt.AlignHCenter
spacing: Tokens.spacing.largeIncreased
CircularProgress {
fgColor: root.accent
implicitSize: usageColumn.implicitHeight + thickness + Tokens.padding.large * 2
implicitSize: ZUtils.snap(usageColumn.implicitHeight + thickness + Tokens.padding.large * 2, root)
startAngle: -225
sweepAngle: 270
value: root.percentage
@@ -46,7 +51,8 @@ CustomRect {
Anim {}
}
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
id: usageColumn
anchors.centerIn: parent
@@ -74,8 +80,9 @@ CustomRect {
}
}
ColumnLayout {
SnapLayout {
spacing: Tokens.spacing.extraSmall
orientation: Qt.Vertical
CustomText {
text: qsTr("Storage")
-89
View File
@@ -1,89 +0,0 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Services
import ZShell.Config
import qs.Components
import qs.Services
CustomRect {
id: root
readonly property color accent: Colors.palette.m3tertiary
Layout.fillWidth: true
color: Colors.tPalette.m3surfaceContainer
implicitHeight: layout.implicitHeight + Tokens.padding.large * 2
implicitWidth: layout.implicitWidth + Tokens.padding.extraLargeIncreased
radius: Tokens.rounding.largeIncreased
ServiceRef {
service: Gpu
}
ColumnLayout {
id: layout
anchors.centerIn: parent
spacing: Tokens.spacing.extraSmall
RowLayout {
Layout.leftMargin: -Tokens.padding.extraSmall
spacing: Tokens.spacing.small
MaterialIcon {
color: root.accent
fill: 1
text: "memory_alt"
}
CustomText {
text: qsTr("Video memory")
}
}
CircularProgress {
id: circularIndicator
Layout.alignment: Qt.AlignHCenter
Layout.topMargin: Tokens.spacing.largeIncreased
fgColor: root.accent
implicitSize: usageColumn.implicitHeight + thickness + Tokens.padding.largeIncreased * 2
startAngle: -225
sweepAngle: 270
value: Gpu.memoryUsed / Gpu.memoryTotal
Behavior on clampedVal {
Anim {}
}
ColumnLayout {
id: usageColumn
anchors.centerIn: parent
anchors.verticalCenterOffset: Tokens.padding.extraSmall
spacing: 0
CustomText {
Layout.alignment: Qt.AlignHCenter
color: root.accent
font: Tokens.font.body.large
text: Math.round(circularIndicator.value * 100) + "%"
}
CustomText {
Layout.alignment: Qt.AlignHCenter
color: Colors.palette.m3onSurfaceVariant
text: qsTr("Used")
}
}
}
CustomText {
Layout.alignment: Qt.AlignHCenter
text: {
const fmt = UsageFmt.formatKib(Gpu.memoryUsed, Gpu.memoryTotal);
return `${fmt.value.toFixed(1)} / ${Math.floor(fmt.total)} ${fmt.unit}`;
}
}
}
}
+34 -18
View File
@@ -1,7 +1,10 @@
import QtQuick
import QtQuick.Layouts
import ZShell
import ZShell.Components
import ZShell.Services
import ZShell.Config
import qs.Components
import qs.Modules.Resources.Cards
import qs.Helpers
import qs.Services
@@ -11,25 +14,25 @@ Item {
required property Wrapper wrapper
implicitHeight: content.implicitHeight + Tokens.padding.small * 2
implicitWidth: content.implicitWidth
implicitHeight: ZUtils.snap(content.implicitHeight + Tokens.padding.small * 2, root)
implicitWidth: ZUtils.snap(content.implicitWidth, root)
RowLayout {
SnapLayout {
id: content
anchors.left: parent.left
anchors.fill: parent
anchors.margins: Tokens.padding.small
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
spacing: Tokens.spacing.large
ColumnLayout {
SnapLayout {
id: mainColumn
Layout.fillWidth: true
spacing: Tokens.spacing.medium
orientation: Qt.Vertical
RowLayout {
SnapLayout {
id: hero
spacing: Tokens.spacing.medium
visible: cpuCard.active || gpuCard.active
@@ -72,7 +75,10 @@ Item {
}
}
RowLayout {
SnapLayout {
id: card
Layout.fillWidth: true
spacing: Tokens.spacing.medium
visible: storageCard.active || memoryCard.active || vramCard.active || networkCard1.active
@@ -81,8 +87,7 @@ Item {
active: Config.dashboard.performance.showStorage
sourceComponent: StorageCard {
}
sourceComponent: StorageCard {}
}
WrappedLoader {
@@ -91,6 +96,15 @@ Item {
active: Config.dashboard.performance.showMemory
sourceComponent: MemoryCard {
used: Memory.used
total: Memory.total
perc: Memory.percentage
label: qsTr("Memory")
icon: "memory_alt"
ServiceRef {
service: Memory
}
}
}
@@ -99,7 +113,12 @@ Item {
active: Config.dashboard.performance.showVram
sourceComponent: VramCard {
sourceComponent: MemoryCard {
used: Gpu.memoryUsed
total: Gpu.memoryTotal
perc: Gpu.memoryUsed / Gpu.memoryTotal
label: qsTr("Video memory")
icon: "memory_alt"
}
}
@@ -108,8 +127,7 @@ Item {
active: Config.dashboard.performance.showNetwork && !vramCard.active
sourceComponent: NetworkCard {
}
sourceComponent: NetworkCard {}
}
}
@@ -118,8 +136,7 @@ Item {
active: Config.dashboard.performance.showNetwork && vramCard.active
sourceComponent: NetworkCard {
}
sourceComponent: NetworkCard {}
}
}
@@ -127,8 +144,7 @@ Item {
Layout.fillWidth: false
active: Battery.isLaptop && Config.dashboard.performance.showBattery
sourceComponent: BatteryTank {
}
sourceComponent: BatteryTank {}
}
}
+2 -1
View File
@@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import Quickshell
import Quickshell.Services.Pipewire
import qs.Components
@@ -39,7 +40,7 @@ ItemList {
onClicked: root.selected(device.modelData)
}
RowLayout {
SnapLayout {
id: deviceLayout
anchors.fill: parent
+4 -2
View File
@@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import ZShell.Blobs
import qs.Components
import ZShell.Config
@@ -181,7 +182,8 @@ Item {
onWheel: event => event.accepted = true
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
anchors.bottomMargin: Tokens.padding.largeIncreased
anchors.fill: parent
anchors.margins: Tokens.padding.extraLarge
@@ -222,7 +224,7 @@ Item {
}
}
RowLayout {
SnapLayout {
Layout.alignment: Qt.AlignRight
spacing: Tokens.spacing.extraSmall
+4 -2
View File
@@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import qs.Components
import ZShell.Config
import qs.Services
@@ -29,7 +30,7 @@ ConnectedRect {
}
}
RowLayout {
SnapLayout {
id: rowLayout
anchors.fill: parent
@@ -44,7 +45,8 @@ ConnectedRect {
visible: root.leadingComponent
}
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
Layout.fillWidth: true
spacing: 0
+3 -1
View File
@@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import qs.Components
import ZShell.Config
import qs.Services
@@ -38,7 +39,8 @@ ConnectedRect {
type: Anim.DefaultEffects
}
}
sourceComponent: ColumnLayout {
sourceComponent: SnapLayout {
orientation: Qt.Vertical
spacing: Tokens.spacing.extraSmall
MaterialIcon {
+2 -1
View File
@@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import Quickshell
import ZShell.Config
import qs.Components
@@ -265,7 +266,7 @@ ListView {
}
}
RowLayout {
SnapLayout {
id: row
anchors.fill: parent
+4 -2
View File
@@ -2,12 +2,14 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import qs.Modules.Settings
import qs.Components
import ZShell.Config
import qs.Services
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
id: root
property bool animateScroll: false
@@ -118,7 +120,7 @@ ColumnLayout {
onClicked: focus = true
RowLayout {
SnapLayout {
id: header
spacing: Tokens.spacing.largeIncreased
+4 -2
View File
@@ -1,5 +1,6 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import Quickshell
import qs.Components
import ZShell.Config
@@ -27,7 +28,7 @@ ConnectedRect {
onClicked: popup.open = true
}
RowLayout {
SnapLayout {
id: navLayout
anchors.fill: parent
@@ -43,7 +44,8 @@ ConnectedRect {
fontStyle: Tokens.font.icon.medium
}
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
Layout.fillWidth: true
spacing: 0
+2 -1
View File
@@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import qs.Components
import qs.Services
@@ -30,7 +31,7 @@ ConnectedRect {
onClicked: e => root.clicked(e)
}
RowLayout {
SnapLayout {
id: row
anchors.left: parent.left
+3 -1
View File
@@ -3,6 +3,7 @@ pragma ComponentBehavior: Bound
import Quickshell
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import qs.Components
import qs.Services
@@ -19,7 +20,8 @@ DialogRowButton {
separateContent: true
content: Component {
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
VerticalFadeListView {
bottomMargin: Tokens.padding.large
Layout.fillHeight: true
+1 -1
View File
@@ -1,7 +1,7 @@
import QtQuick
import QtQuick.Layouts
import qs.Components
import ZShell.Config
import qs.Components
import qs.Services
CustomText {
+4 -2
View File
@@ -1,5 +1,6 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import qs.Components
import ZShell.Config
import qs.Services
@@ -22,7 +23,7 @@ ConnectedRect {
implicitHeight: rowLayout.implicitHeight + rowLayout.anchors.margins * 2
z: splitButton.expanded ? 1 : 0
RowLayout {
SnapLayout {
id: rowLayout
anchors.fill: parent
@@ -31,7 +32,8 @@ ConnectedRect {
anchors.rightMargin: Tokens.padding.largeIncreased
spacing: Tokens.spacing.small
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
Layout.fillWidth: true
spacing: 0
+5 -3
View File
@@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import qs.Components
import ZShell.Config
import qs.Services
@@ -19,7 +20,7 @@ ConnectedRect {
Layout.fillWidth: true
implicitHeight: rowLayout.implicitHeight + rowLayout.anchors.margins + rowLayout.anchors.topMargin
RowLayout {
SnapLayout {
id: rowLayout
anchors.fill: parent
@@ -27,11 +28,12 @@ ConnectedRect {
anchors.topMargin: Tokens.padding.large
spacing: Tokens.spacing.small
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
Layout.fillWidth: true
spacing: Tokens.spacing.small
RowLayout {
SnapLayout {
Layout.fillWidth: true
spacing: Tokens.spacing.small
+4 -2
View File
@@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import qs.Components
import ZShell.Config
import qs.Services
@@ -21,7 +22,7 @@ ConnectedRect {
Layout.fillWidth: true
implicitHeight: rowLayout.implicitHeight + rowLayout.anchors.margins * 2
RowLayout {
SnapLayout {
id: rowLayout
anchors.fill: parent
@@ -30,7 +31,8 @@ ConnectedRect {
anchors.rightMargin: Tokens.padding.largeIncreased
spacing: Tokens.spacing.small
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
Layout.fillWidth: true
spacing: 0
+4 -2
View File
@@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import qs.Components
import qs.Services
@@ -35,7 +36,7 @@ ConnectedRect {
Layout.fillWidth: true
implicitHeight: rowLayout.implicitHeight + Tokens.padding.medium + Math.max(0, Tokens.padding.large - input.verticalPadding) * 2
RowLayout {
SnapLayout {
id: rowLayout
anchors.left: parent.left
@@ -45,7 +46,8 @@ ConnectedRect {
anchors.rightMargin: Tokens.padding.largeIncreased
spacing: Tokens.spacing.medium
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
Layout.fillWidth: true
spacing: 0
+4 -2
View File
@@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import ZShell.Blobs
import qs.Components
import ZShell.Config
@@ -185,7 +186,8 @@ Item {
implicitWidth: innerLayout.implicitWidth + innerLayout.anchors.margins * 2
implicitHeight: innerLayout.implicitHeight + innerLayout.anchors.margins + innerLayout.anchors.bottomMargin
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
id: innerLayout
anchors.bottomMargin: Tokens.padding.largeIncreased
anchors.fill: parent
@@ -206,7 +208,7 @@ Item {
sourceComponent: root.content
}
RowLayout {
SnapLayout {
Layout.alignment: Qt.AlignRight
spacing: Tokens.spacing.extraSmall
@@ -1,5 +1,6 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import qs.Components
import qs.Modules.Settings
+4 -3
View File
@@ -6,7 +6,8 @@ import qs.Components
import qs.Helpers
import qs.Services
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
id: root
required property int start
@@ -28,7 +29,7 @@ ColumnLayout {
spacing: Tokens.spacing.medium
RowLayout {
SnapLayout {
CustomRect {
id: startHourRect
@@ -470,7 +471,7 @@ ColumnLayout {
}
}
RowLayout {
SnapLayout {
CustomText {
Layout.preferredWidth: spacer.x + spacer.width
text: qsTr("Start")
+1
View File
@@ -1,5 +1,6 @@
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import qs.Components
import ZShell.Config
import qs.Services
+3 -1
View File
@@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import ZShell.Components
import Quickshell
import qs.Components
import ZShell.Config
@@ -19,7 +20,8 @@ Item {
Layout.fillWidth: true
implicitHeight: layout.implicitHeight
ColumnLayout {
SnapLayout {
orientation: Qt.Vertical
id: layout
anchors.fill: parent

Some files were not shown because too many files have changed in this diff Show More