Author SHA1 Message Date
AramJonghu 82c307de11 fix(Dockerfile): adds mpv dep
C++ / fmt (pull_request) Failing after 5s
JS/TS / fmt & lint (pull_request) Successful in 13s
C++ / build & lint (pull_request) Failing after 20s
Python / test & nuitka build (pull_request) Canceled after 24s
Python / fmt & lint (pull_request) Canceled after 26s
Rust / clippy & fmt (pull_request) Failing after 3s
2026-10-30 02:51:22 +01:00
AramJonghu 388482c620 ci(rust): fixes and optimizations
C++ / fmt (pull_request) Failing after 5s
C++ / build & lint (pull_request) Failing after 13s
JS/TS / fmt & lint (pull_request) Successful in 11s
Python / fmt & lint (pull_request) Successful in 26s
Rust / clippy & fmt (pull_request) Failing after 50s
Python / test & nuitka build (pull_request) Failing after 1m23s
- removes cargo check since the clippy step builds already
- image switched to rust:alpine
- less correctness during build for speedier compilation
2026-10-30 02:49:22 +01:00
AramJonghu ab4a662013 ci(cpp): introduce caching cmake and build + format optimization 2026-10-30 02:46:17 +01:00
AramJonghu fda39fc4c0 feat(makefile): adds a make formatter as task runner
C++ / fmt (pull_request) Failing after 6s
C++ / build & lint (pull_request) Failing after 10s
JS/TS / fmt & lint (pull_request) Successful in 14s
Python / fmt & lint (pull_request) Successful in 29s
Python / test & nuitka build (pull_request) Failing after 1m25s
Rust / build, clippy & fmt (pull_request) Failing after 4m49s
2026-10-30 02:22:57 +01:00
AramJonghu 9e97569467 fix(ci): cpp clang-tidy now properly reads non-build files only 2026-10-30 02:22:57 +01:00
AramJonghu 630b05ff2c feat(makefile): added no nuitka option for cpp-compile task 2026-10-30 02:22:57 +01:00
AramJonghu b86f865396 chore(gitignore): ordering known files and directories 2026-10-30 02:22:57 +01:00
AramJonghu 34585a639b chore(gitignore): nuitka compile files ignored and categorized 2026-10-30 02:22:57 +01:00
AramJonghu 163370354a fix(clang-tidy): make cpp-lint has proper clang-tidy check 2026-10-30 02:22:57 +01:00
AramJonghu 012d2777c2 chore(Dockerfile): add future dependencies 2026-10-30 02:22:57 +01:00
zachandAramJonghu 9c0b74ff66 Merge branch 'main' into feat/task-runner-ci 2026-10-30 02:22:57 +01:00
AramJonghu 24825250bb feat(makefile): added qmlformat + install -> compile in cpp step 2026-10-30 02:22:57 +01:00
AramJonghu 1364b5ed1a feat(makefile): C++, Python, and Rust checks included (incomplete) 2026-10-30 02:22:57 +01:00
AramJonghu ef4d849b4b feat(makefile): makefile build & install + progress on cpp and py 2026-10-30 02:22:57 +01:00
AramJonghu e12a047da2 format(clang): make cpp-fmt result 2026-10-30 02:22:57 +01:00
AramJonghu 5db2718b04 ci: rework Dockerfile image + buildx dep added 2026-10-30 02:22:57 +01:00
AramJonghu e50a28b877 refactor(workflows): combined steps where it makes sense 2026-10-30 02:22:57 +01:00
AramJonghu 0e23b18f72 fix(ci): missing dependency wayland-scanner 2026-10-30 02:22:57 +01:00
193 changed files with 1521 additions and 3595 deletions
+1 -1
View File
@@ -18,7 +18,7 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Install Docker CLI - name: Install Docker CLI
run: apk add --no-cache docker-cli run: apk add --no-cache docker-cli docker-cli-buildx
- name: Login to registry - name: Login to registry
run: echo "${{ secrets.REGISTRY_TOKEN }}" | docker login git.aramjonghu.dev --username aramjonghu --password-stdin run: echo "${{ secrets.REGISTRY_TOKEN }}" | docker login git.aramjonghu.dev --username aramjonghu --password-stdin
+22 -21
View File
@@ -17,46 +17,47 @@ jobs:
run: | run: |
find . \( -name '*.cpp' -o -name '*.h' -o -name '*.hpp' \) \ find . \( -name '*.cpp' -o -name '*.h' -o -name '*.hpp' \) \
-not -path './build/*' \ -not -path './build/*' \
-exec clang-format -i --style=file {} + -exec clang-format --dry-run -Werror --style=file {} +
git diff --exit-code && echo "clang-format: passed"
build: build & lint:
runs-on: alpine runs-on: alpine
container: container:
image: git.aramjonghu.dev/aramjonghu/zshell-ci:latest image: git.aramjonghu.dev/aramjonghu/zshell-ci:latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Configure - name: Cache CMake build
run: cmake -B build -G Ninja -DENABLE_MODULES=plugin -DCMAKE_BUILD_TYPE=Release uses: actions/cache@v4
- name: Build
run: ninja -C build
clang-tidy:
runs-on: alpine
container:
image: git.aramjonghu.dev/aramjonghu/zshell-ci:latest
steps:
- name: Checkout
uses: actions/checkout@v4
with: with:
fetch-depth: 0 path: build
key: cpp-build-${{ hashFiles('CMakeLists.txt', '**/CMakeLists.txt') }}
restore-keys: |
cpp-build-
- name: Cache ccache
uses: actions/cache@v4
with:
path: ~/.ccache
key: ccache-${{ runner.os }}-${{ github.sha }}
restore-keys: |
ccache-${{ runner.os }}-
- name: Configure - name: Configure
run: cmake -B build -G Ninja -DENABLE_MODULES=plugin -DCMAKE_BUILD_TYPE=Release run: cmake -B build -G Ninja -DENABLE_MODULES=plugin -DCMAKE_BUILD_TYPE=Release
- name: Build - name: Build
run: ninja -C build run: ninja -C build
env:
CMAKE_CXX_COMPILER_LAUNCHER: ccache
- name: clang-tidy - name: clang-tidy
run: | run: |
sed -i 's/-mno-direct-extern-access //g' build/compile_commands.json sed -i 's/-mno-direct-extern-access //g' build/compile_commands.json
set -o pipefail set -o pipefail
run-clang-tidy -p build -j $(nproc) -header-filter="Plugins/.*" 2>&1 | \ run-clang-tidy -p build -j "$(nproc)" \
grep -v 'Suppressed\|non-user\|non-system\|unknown argument.*mno-direct\|Found compiler error\|warnings generated\.\|^Use -header-filter' -source-filter="^$(pwd)/Plugins/" \
-header-filter=".*Plugins/.*" \
-removed-arg=-mno-direct-extern-access
+1 -15
View File
@@ -4,7 +4,7 @@ on:
pull_request: pull_request:
jobs: jobs:
fmt: fmt & lint:
runs-on: alpine runs-on: alpine
container: node:26-alpine container: node:26-alpine
@@ -24,20 +24,6 @@ jobs:
else else
echo "No JS/TS files found" echo "No JS/TS files found"
fi fi
lint:
runs-on: alpine
container: node:26-alpine
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install tools
run: |
apk add --no-cache \
git
- name: ESLint - name: ESLint
run: | run: |
if [ -n "$(find . \( -iname "*.js" -o -iname "*.jsx" -o -iname "*.ts" -o -iname "*.tsx" -o -iname "*.mjs" -o -iname "*.cjs" \) -print -quit)" ]; then if [ -n "$(find . \( -iname "*.js" -o -iname "*.jsx" -o -iname "*.ts" -o -iname "*.tsx" -o -iname "*.mjs" -o -iname "*.cjs" \) -print -quit)" ]; then
+3 -3
View File
@@ -7,7 +7,7 @@ on:
pull_request: pull_request:
jobs: jobs:
static: fmt & lint:
runs-on: debian runs-on: debian
container: node:26-trixie-slim container: node:26-trixie-slim
@@ -33,7 +33,7 @@ jobs:
. .venv/bin/activate . .venv/bin/activate
ruff check . ruff check .
verify: test & nuitka build:
if: always() if: always()
runs-on: debian runs-on: debian
container: node:26-trixie-slim container: node:26-trixie-slim
@@ -64,4 +64,4 @@ jobs:
- name: Nuitka module check - name: Nuitka module check
run: | run: |
. .venv/bin/activate . .venv/bin/activate
nuitka --module --include-package=zshell cli/src/zshell/ nuitka --module --include-package=zshell cli/src/zshell/
+12 -99
View File
@@ -4,9 +4,9 @@ on:
pull_request: pull_request:
jobs: jobs:
build: clippy & fmt:
runs-on: alpine runs-on: alpine
container: node:26-alpine container: rust:alpine
env: env:
CARGO_HOME: ${{ github.workspace }}/.cargo CARGO_HOME: ${{ github.workspace }}/.cargo
@@ -16,34 +16,30 @@ jobs:
- name: Cache cargo packages - name: Cache cargo packages
uses: actions/cache@v4 uses: actions/cache@v4
env:
cache-name: cache-cargo-packages
with: with:
path: | path: |
.cargo/registry .cargo/registry
.cargo/git .cargo/git
target target
key: rust-build-${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/Cargo.lock') }} key: rust-build-${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: | restore-keys: |
rust-${{ runner.os }}-build-${{ env.cache-name }}- rust-${{ runner.os }}-cargo-
rust-${{ runner.os }}-build-
rust-
- name: Install tools - name: Install tools
run: | run: |
apk add --no-cache \ apk add --no-cache git
git \ rustup component add clippy rustfmt
cargo \
rust
- name: Cargo check - name: Clippy (with compile check)
run: | run: |
if [ -n "$(find . -name "Cargo.toml" -print -quit)" ]; then if [ -n "$(find . -name "Cargo.toml" -print -quit)" ]; then
status=0
for manifest in $(find . -name "Cargo.toml"); do for manifest in $(find . -name "Cargo.toml"); do
cargo check --manifest-path "$manifest" && \ cargo clippy --manifest-path "$manifest" -- -D warnings && \
echo "$manifest: check passed" || \ echo "$manifest: Clippy passed" || \
{ echo "$manifest: check failed"; exit 1; } { echo "$manifest: Clippy failed"; status=1; }
done done
exit $status
elif [ -n "$(find . -name "*.rs" -print -quit)" ]; then elif [ -n "$(find . -name "*.rs" -print -quit)" ]; then
echo "Rust files found but no Cargo.toml" echo "Rust files found but no Cargo.toml"
exit 1 exit 1
@@ -51,39 +47,6 @@ jobs:
echo "No Rust project found" echo "No Rust project found"
fi fi
fmt:
runs-on: alpine
container: node:26-alpine
env:
CARGO_HOME: ${{ github.workspace }}/.cargo
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Cache cargo packages
uses: actions/cache@v4
env:
cache-name: cache-cargo-packages
with:
path: |
.cargo/registry
.cargo/git
target
key: rust-fmt-${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
rust-${{ runner.os }}-build-${{ env.cache-name }}-
rust-${{ runner.os }}-build-
rust-
- name: Install tools
run: |
apk add --no-cache \
git \
cargo \
rust \
rustfmt
- name: Format check - name: Format check
run: | run: |
if [ -n "$(find . -name "Cargo.toml" -print -quit)" ]; then if [ -n "$(find . -name "Cargo.toml" -print -quit)" ]; then
@@ -100,53 +63,3 @@ jobs:
else else
echo "No Rust project found" echo "No Rust project found"
fi fi
clippy:
runs-on: alpine
container: node:26-alpine
env:
CARGO_HOME: ${{ github.workspace }}/.cargo
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Cache cargo packages
uses: actions/cache@v4
env:
cache-name: cache-cargo-packages
with:
path: |
.cargo/registry
.cargo/git
target
key: rust-clippy-${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
rust-${{ runner.os }}-build-${{ env.cache-name }}-
rust-${{ runner.os }}-build-
rust-
- name: Install tools
run: |
apk add --no-cache \
git \
cargo \
rust \
rust-clippy
- name: Clippy
run: |
if [ -n "$(find . -name "Cargo.toml" -print -quit)" ]; then
status=0
for manifest in $(find . -name "Cargo.toml"); do
cargo clippy --manifest-path "$manifest" --all-targets --all-features -- -D warnings && \
echo "$manifest: Clippy passed" || \
{ echo "$manifest: Clippy failed"; status=1; }
done
exit $status
elif [ -n "$(find . -name "*.rs" -print -quit)" ]; then
echo "Rust files found but no Cargo.toml"
exit 1
else
echo "No Rust project found"
fi
+22 -10
View File
@@ -1,23 +1,35 @@
**/__pycache__/
./result/ ./result/
.pyre/ .pyre/
.cache/
.venv/
.qmlls.ini
build/
compile_commands.json
testpython
pkg/ pkg/
*.tar.* *.tar.*
uv.lock
.qtcreator/
dist/ dist/
**/target/ **/target/
**/test-plugins/ **/test-plugins/
**/Charts/ **/Charts/
network-dev/ network-dev/
**/zshell.build/
**/zshell.dist/ **/zshell.dist/
# Qml
.qtcreator/
.qmlls.ini
# CMake compile artifacts
.cache/
compile_commands.json
build/
# Python
uv.lock
testpython
.venv/
**/__pycache__/
# Nuitka compile
**/zshell.pyi
**/zshell.cpython-*
**/zshell.build/
# Agents stuff
.opencode/ .opencode/
run-agent.sh run-agent.sh
AGENTS.md AGENTS.md
+4 -3
View File
@@ -99,7 +99,6 @@ ProgressBar {
} }
Line { Line {
id: dot
property real implicitSize property real implicitSize
anchors.right: parent.right anchors.right: parent.right
@@ -125,7 +124,8 @@ ProgressBar {
anchors.left: parent.left anchors.left: parent.left
Behavior on implicitWidth { Behavior on implicitWidth {
Anim {} Anim {
}
} }
Component.onCompleted: implicitWidth = Qt.binding(() => parent.width * root.visualPosition) Component.onCompleted: implicitWidth = Qt.binding(() => parent.width * root.visualPosition)
@@ -222,7 +222,8 @@ ProgressBar {
} }
} }
Behavior on color { Behavior on color {
CAnim {} CAnim {
}
} }
Anim on waveProgress { Anim on waveProgress {
duration: root.waveDuration duration: root.waveDuration
+6 -6
View File
@@ -2,10 +2,10 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Templates import QtQuick.Templates
import ZShell
import ZShell.Components import ZShell.Components
import ZShell.Config import ZShell
import qs.Components import qs.Components
import ZShell.Config
import qs.Services import qs.Services
Slider { Slider {
@@ -28,7 +28,7 @@ Slider {
signal interaction(v: real) signal interaction(v: real)
implicitHeight: ZUtils.snap(12, root) implicitHeight: 12
implicitWidth: 200 implicitWidth: 200
contentItem: Item { contentItem: Item {
@@ -123,7 +123,7 @@ Slider {
bottomRightRadius: Tokens.rounding.extraSmall / 2 bottomRightRadius: Tokens.rounding.extraSmall / 2
color: root.fgColor color: root.fgColor
implicitHeight: root.height implicitHeight: root.height
implicitWidth: ZUtils.snap(root.filledWidth, root) implicitWidth: root.filledWidth
radius: root.radius radius: root.radius
topRightRadius: Tokens.rounding.extraSmall / 2 topRightRadius: Tokens.rounding.extraSmall / 2
} }
@@ -137,8 +137,8 @@ Slider {
frequency: root.waveFrequency frequency: root.waveFrequency
fullLength: root.width - handle.implicitWidth - handle.anchors.leftMargin fullLength: root.width - handle.implicitWidth - handle.anchors.leftMargin
implicitHeight: lineWidth * amplitudeMultiplier * 2 + lineWidth implicitHeight: lineWidth * amplitudeMultiplier * 2 + lineWidth
implicitWidth: ZUtils.snap(root.filledWidth, root) implicitWidth: root.filledWidth
lineWidth: ZUtils.snap(root.height * 0.7, root) lineWidth: root.height * 0.7
startX: x startX: x
Behavior on color { Behavior on color {
+2 -3
View File
@@ -1,5 +1,4 @@
import QtQuick import QtQuick
import ZShell
import ZShell.Config import ZShell.Config
import qs.Services import qs.Services
@@ -16,9 +15,9 @@ ButtonBase {
const h = label.implicitHeight + padding * 2; const h = label.implicitHeight + padding * 2;
if (h % 2 !== 0) if (h % 2 !== 0)
return h + 1; return h + 1;
return ZUtils.snap(h, root); return h;
} }
implicitWidth: ZUtils.snap(implicitHeight, root) implicitWidth: implicitHeight
inactiveColor: { inactiveColor: {
if (!isToggle && type === IconButton.Filled) if (!isToggle && type === IconButton.Filled)
return Colors.palette.m3primary; return Colors.palette.m3primary;
+1 -3
View File
@@ -1,6 +1,5 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import ZShell.Config import ZShell.Config
import qs.Services import qs.Services
@@ -35,11 +34,10 @@ ButtonBase {
} }
verticalPadding: Tokens.padding.extraSmall verticalPadding: Tokens.padding.extraSmall
SnapLayout { RowLayout {
id: row id: row
anchors.centerIn: parent anchors.centerIn: parent
spacing: Tokens.spacing.small spacing: Tokens.spacing.small
MaterialIcon { MaterialIcon {
+66 -89
View File
@@ -1,8 +1,6 @@
pragma ComponentBehavior: Bound pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtCanvas2D
import ZShell
Item { Item {
id: root id: root
@@ -38,62 +36,54 @@ Item {
property real fillAlpha: 0.15 property real fillAlpha: 0.15
property real lineWidth: 2 property real lineWidth: 2
property real markerDotRadius: 4 property real markerDotRadius: 4
property real labelFontSize: 8 property real labelFontSize: 10
Canvas2D { Canvas {
id: canvas id: canvas
anchors.fill: parent anchors.fill: parent
renderStrategy: Canvas.Immediate
alphaBlending: true
fillColor: "transparent"
onWidthChanged: requestPaint() onWidthChanged: requestPaint()
onHeightChanged: requestPaint() onHeightChanged: requestPaint()
function snapV(v) {
return ZUtils.snap(v, canvas);
}
function strokeCurve(ctx, pts) { function strokeCurve(ctx, pts) {
ctx.beginPath(); ctx.beginPath();
ctx.moveTo(pts[0].x, pts[0].y); ctx.moveTo(pts[0].x, pts[0].y);
const dpr = ZUtils.dprFor(canvas); if (root.curveSmoothing && pts.length > 2) {
for (let i = 0; i < pts.length - 1; i++) { const k = 1 / 6;
const p1 = pts[i]; const n = pts.length;
const p2 = pts[i + 1];
const [c1x, c1y, c2x, c2y] = segmentControls(pts, i);
const firstCol = Math.ceil(p1.x * dpr) + 1; for (let i = 0; i < n - 1; i++) {
const lastCol = Math.floor(p2.x * dpr) - 1; const p0 = pts[Math.max(i - 1, 0)];
for (let col = firstCol; col <= lastCol; ++col) { const p1 = pts[i];
const x = col / dpr; const p2 = pts[i + 1];
ctx.lineTo(x, bezierY(p1, c1x, c1y, c2x, c2y, p2, x)); 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);
} }
ctx.lineTo(p2.x, p2.y);
} }
} }
function bezierY(p1, c1x, c1y, c2x, c2y, p2, targetX) { // Control points for segment i (pts[i] -> pts[i+1]), matching strokeCurve
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) { function segmentControls(pts, i) {
const p0 = pts[Math.max(i - 1, 0)]; const p0 = pts[Math.max(i - 1, 0)];
const p1 = pts[i]; const p1 = pts[i];
@@ -119,6 +109,7 @@ Item {
return [cx, p1.y, cx, p2.y]; return [cx, p1.y, cx, p2.y];
} }
// Point on the curve at a given x (x is monotonic per segment)
function pointAtX(pts, targetX) { function pointAtX(pts, targetX) {
let j = pts.length - 2; let j = pts.length - 2;
for (let i = 0; i < pts.length - 1; i++) { for (let i = 0; i < pts.length - 1; i++) {
@@ -147,16 +138,10 @@ Item {
const t = (tlo + thi) / 2; const t = (tlo + thi) / 2;
const u = 1 - t; 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; const y = u * u * u * p1.y + 3 * u * u * t * c1y + 3 * u * t * t * c2y + t * t * t * p2.y;
return { return { x: targetX, y };
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) { function cutLeft(pts, targetX) {
if (targetX <= pts[0].x) if (targetX <= pts[0].x)
return []; return [];
@@ -173,7 +158,7 @@ Item {
const left = pts.slice(0, j + 1); const left = pts.slice(0, j + 1);
if (targetX > pts[j].x) if (targetX > pts[j].x)
left.push(cutPoint(pts, targetX)); left.push(pointAtX(pts, targetX));
return left; return left;
} }
@@ -199,20 +184,17 @@ Item {
onPaint: { onPaint: {
const ctx = getContext("2d"); const ctx = getContext("2d");
if (!ctx)
return;
ctx.reset(); ctx.reset();
ctx.clearRect(0, 0, width, height);
const W = width; const W = width;
const H = height; const H = height;
if (W < 2 || H < 2) if (W < 2 || H < 2)
return; return;
const padLeft = root.labelFontSize * 5; const padLeft = root.labelFontSize * 3.4;
const padRight = 0; const padRight = 2;
const padTop = 0; const padTop = 2;
const padBottom = root.labelFontSize + 14; const padBottom = root.labelFontSize + 8;
const plot = { const plot = {
x: padLeft, x: padLeft,
y: padTop, y: padTop,
@@ -222,6 +204,8 @@ Item {
if (plot.w < 2 || plot.h < 2) if (plot.w < 2 || plot.h < 2)
return; return;
// Auto-fit: NaN yMin/yMax derive from the data, snapped to the
// horizontal step grid, honoring minHorizontalLines
let lo = root.yMin; let lo = root.yMin;
let hi = root.yMax; let hi = root.yMax;
const loAuto = Number.isNaN(lo); const loAuto = Number.isNaN(lo);
@@ -295,17 +279,11 @@ Item {
const xAt = i => plot.x + (i / root.xSteps) * plot.w; const xAt = i => plot.x + (i / root.xSteps) * plot.w;
const yAt = v => plot.y + (1 - (v - scaleBottom) / range) * plot.h; const yAt = v => plot.y + (1 - (v - scaleBottom) / range) * plot.h;
const crisp = v => Math.floor(v) + 0.5;
const dpr = ZUtils.dprFor(canvas); // 1. Grid lines
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.strokeStyle = Qt.alpha(root.gridColor, root.gridAlpha);
ctx.lineWidth = gridW; ctx.lineWidth = 1;
if (root.verticalLineStep > 0) { if (root.verticalLineStep > 0) {
for (let i = 0; i <= root.xSteps; i += root.verticalLineStep) { for (let i = 0; i <= root.xSteps; i += root.verticalLineStep) {
@@ -314,7 +292,7 @@ Item {
if (i === root.xSteps && !root.lastXLine) if (i === root.xSteps && !root.lastXLine)
continue; continue;
const x = snapLine(xAt(i), 1); const x = crisp(xAt(i));
ctx.beginPath(); ctx.beginPath();
ctx.moveTo(x, plot.y); ctx.moveTo(x, plot.y);
ctx.lineTo(x, H); ctx.lineTo(x, H);
@@ -322,11 +300,12 @@ 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); const vStart = lo - (root.yPaddingBottom > 0 ? Math.floor(root.yPaddingBottom / root.horizontalLineStep) * root.horizontalLineStep : 0);
if (root.horizontalLineStep > 0) { if (root.horizontalLineStep > 0) {
for (let v = vStart; v <= hi + 0.001; v += root.horizontalLineStep) { for (let v = vStart; v <= hi + 0.001; v += root.horizontalLineStep) {
const y = snapLine(yAt(v), 1); const y = crisp(yAt(v));
ctx.beginPath(); ctx.beginPath();
ctx.moveTo(0, y); ctx.moveTo(0, y);
ctx.lineTo(plot.x + plot.w, y); ctx.lineTo(plot.x + plot.w, y);
@@ -334,8 +313,9 @@ Item {
} }
} }
// 2. Labels
ctx.fillStyle = Qt.alpha(root.labelColor, root.labelAlpha); ctx.fillStyle = Qt.alpha(root.labelColor, root.labelAlpha);
ctx.font = root.labelFontSize + "pt 'sans-serif'"; ctx.font = root.labelFontSize + "px sans-serif";
ctx.textAlign = "left"; ctx.textAlign = "left";
ctx.textBaseline = "top"; ctx.textBaseline = "top";
@@ -348,7 +328,7 @@ Item {
const text = root.xLabel(i); const text = root.xLabel(i);
if (text) if (text)
ctx.fillText(text, xAt(i) + 4, plot.y + plot.h + 8); ctx.fillText(text, xAt(i) + 4, plot.y + plot.h + 4);
} }
} }
@@ -361,6 +341,7 @@ Item {
} }
} }
// 3. Curve, split into segments at null gaps
const segments = []; const segments = [];
let current = null; let current = null;
for (let i = 0; i < series.length; i++) { for (let i = 0; i < series.length; i++) {
@@ -371,7 +352,7 @@ Item {
continue; continue;
} }
const pt = { const pt = {
x: snapV(xAt(i)), x: xAt(i),
y: yAt(series[i]) y: yAt(series[i])
}; };
if (!current) if (!current)
@@ -388,6 +369,8 @@ Item {
const markerPx = hasMarker ? xAt(root.markerX) : 0; const markerPx = hasMarker ? xAt(root.markerX) : 0;
let gapPx = 0; let gapPx = 0;
if (hasMarker) { if (hasMarker) {
// markerGap is measured from the dot edge, perpendicular to the
// curve; project onto x via the local curve slope
let slope = 0; let slope = 0;
const seg = segments.find(s => s[0].x <= markerPx && markerPx <= s[s.length - 1].x); 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) if (seg && seg.length > 2 && markerPx - 1 >= seg[0].x && markerPx + 1 <= seg[seg.length - 1].x)
@@ -399,6 +382,7 @@ Item {
if (seg.length < 2) if (seg.length < 2)
continue; continue;
// Fill stays continuous under the marker
ctx.fillStyle = Qt.alpha(root.lineColor, root.fillAlpha); ctx.fillStyle = Qt.alpha(root.lineColor, root.fillAlpha);
strokeCurve(ctx, seg); strokeCurve(ctx, seg);
ctx.lineTo(seg[seg.length - 1].x, plot.y + plot.h); ctx.lineTo(seg[seg.length - 1].x, plot.y + plot.h);
@@ -406,6 +390,7 @@ Item {
ctx.closePath(); ctx.closePath();
ctx.fill(); ctx.fill();
// Stroke has a gap around the marker
const pieces = hasMarker ? [cutLeft(seg, markerPx - gapPx), cutRight(seg, markerPx + gapPx)] : [seg]; const pieces = hasMarker ? [cutLeft(seg, markerPx - gapPx), cutRight(seg, markerPx + gapPx)] : [seg];
for (const pts of pieces) { for (const pts of pieces) {
@@ -413,32 +398,24 @@ Item {
continue; continue;
ctx.strokeStyle = root.lineColor; ctx.strokeStyle = root.lineColor;
ctx.lineWidth = ZUtils.snap(root.lineWidth, root); ctx.lineWidth = root.lineWidth;
strokeCurve(ctx, pts); strokeCurve(ctx, pts);
ctx.stroke(); ctx.stroke();
} }
} }
// 4. Marker: dashed vertical + dot
if (root.markerX >= 0 && root.markerX <= root.xSteps) { if (root.markerX >= 0 && root.markerX <= root.xSteps) {
const x = markerPx; const x = markerPx;
ctx.setLineDash([4, 4]);
ctx.strokeStyle = Qt.alpha(root.markerColor, 0.6); ctx.strokeStyle = Qt.alpha(root.markerColor, 0.6);
ctx.lineWidth = gridW; ctx.lineWidth = 1;
const lineX = snapLine(x, 1); ctx.beginPath();
let dashY = plot.y; ctx.moveTo(crisp(x), plot.y);
let dashOn = true; ctx.lineTo(crisp(x), H);
ctx.stroke();
while (dashY < H) { ctx.setLineDash([]);
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 i0 = Math.floor(root.markerX);
const v0 = series[i0]; const v0 = series[i0];
@@ -453,7 +430,7 @@ Item {
if (y != null) { if (y != null) {
ctx.fillStyle = root.markerColor; ctx.fillStyle = root.markerColor;
ctx.beginPath(); ctx.beginPath();
ctx.circle(snapV(x), y, root.markerDotRadius); ctx.arc(x, y, root.markerDotRadius, 0, Math.PI * 2);
ctx.fill(); ctx.fill();
} }
} }
+2 -6
View File
@@ -4,7 +4,6 @@ import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import Quickshell import Quickshell
import ZShell.Config import ZShell.Config
import ZShell.Components
import qs.Drawers import qs.Drawers
import qs.Services import qs.Services
@@ -111,14 +110,12 @@ MouseArea {
color: Colors.palette.m3surfaceContainerLow color: Colors.palette.m3surfaceContainerLow
radius: parent.radius radius: parent.radius
SnapLayout { ColumnLayout {
id: column id: column
anchors.fill: parent anchors.fill: parent
anchors.margins: Tokens.padding.extraSmall anchors.margins: Tokens.padding.extraSmall
spacing: Tokens.spacing.extraSmall spacing: Tokens.spacing.extraSmall
orientation: Qt.Vertical
Repeater { Repeater {
id: repeater id: repeater
@@ -154,12 +151,11 @@ MouseArea {
} }
} }
SnapLayout { RowLayout {
id: menuOptionRow id: menuOptionRow
anchors.fill: parent anchors.fill: parent
anchors.margins: Tokens.padding.medium anchors.margins: Tokens.padding.medium
spacing: Tokens.spacing.small spacing: Tokens.spacing.small
MaterialIcon { MaterialIcon {
+1 -2
View File
@@ -1,6 +1,5 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import ZShell.Config import ZShell.Config
import qs.Services import qs.Services
@@ -54,7 +53,7 @@ Row {
onClicked: root.active?.clicked() onClicked: root.active?.clicked()
} }
SnapLayout { RowLayout {
id: textRow id: textRow
anchors.centerIn: parent anchors.centerIn: parent
+2 -5
View File
@@ -1,5 +1,4 @@
import ZShell import ZShell
import ZShell.Components
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import qs.Components import qs.Components
@@ -48,7 +47,7 @@ CustomRect {
z: -1 z: -1
} }
SnapLayout { RowLayout {
id: layout id: layout
anchors.fill: parent anchors.fill: parent
@@ -89,11 +88,9 @@ CustomRect {
} }
} }
SnapLayout { ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
spacing: 0 spacing: 0
orientation: Qt.Vertical
CustomText { CustomText {
id: title id: title
+8 -17
View File
@@ -1,7 +1,5 @@
import Quickshell import Quickshell
import QtQuick import QtQuick
import ZShell.Config
import ZShell
import qs.Components import qs.Components
import qs.Modules.Bar.Popouts as Popouts import qs.Modules.Bar.Popouts as Popouts
import qs.Modules.Notifications as Notifications import qs.Modules.Notifications as Notifications
@@ -16,6 +14,7 @@ import qs.Modules.Settings as Settings
import qs.Modules.Drawing as Drawing import qs.Modules.Drawing as Drawing
import qs.Modules.Dock as Dock import qs.Modules.Dock as Dock
import qs.Modules.Clipboard as Clipboard import qs.Modules.Clipboard as Clipboard
import ZShell.Config
Item { Item {
id: root id: root
@@ -75,10 +74,7 @@ Item {
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: sidebar.width * (1 - sidebar.offsetScale) 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 clip: sidebar.visible
implicitHeight: osd.implicitHeight implicitHeight: osd.implicitHeight
implicitWidth: osd.implicitWidth * (1 - osd.offsetScale) implicitWidth: osd.implicitWidth * (1 - osd.offsetScale)
@@ -86,7 +82,8 @@ Item {
Osd.Wrapper { Osd.Wrapper {
id: osd id: osd
anchors.fill: parent anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
screen: root.screen screen: root.screen
screenState: root.screenState screenState: root.screenState
sidebarOrSessionVisible: sidebar.visible sidebarOrSessionVisible: sidebar.visible
@@ -132,9 +129,8 @@ Item {
Launcher.Wrapper { Launcher.Wrapper {
id: launcher id: launcher
x: ZUtils.snap((parent.width - implicitWidth) / 2, root)
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
panels: root panels: root
screen: root.screen screen: root.screen
screenState: root.screenState screenState: root.screenState
@@ -154,10 +150,8 @@ Item {
property real offsetScale: dashboard.shouldBeActive ? 0 : 1 property real offsetScale: dashboard.shouldBeActive ? 0 : 1
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.top anchors.top: parent.top
x: ZUtils.snap((parent.width - implicitWidth) / 2, dashboardWrapper)
clip: offsetScale > 0 clip: offsetScale > 0
implicitHeight: dashboard.implicitHeight * (1 - offsetScale) implicitHeight: dashboard.implicitHeight * (1 - offsetScale)
implicitWidth: dashboard.implicitWidth implicitWidth: dashboard.implicitWidth
@@ -196,11 +190,8 @@ Item {
Settings.Wrapper { Settings.Wrapper {
id: settings id: settings
x: ZUtils.snap((parent.width - implicitWidth) / 2, settings) anchors.centerIn: parent
y: ZUtils.snap((parent.height - implicitHeight) / 2 - (implicitHeight + 5 + (parent.height - implicitHeight) / 2) * offsetScale, settings) anchors.verticalCenterOffset: (-implicitHeight - 5 - ((root.height - implicitHeight) / 2)) * offsetScale
// anchors.centerIn: parent
// anchors.verticalCenterOffset: (-implicitHeight - 5 - ((root.height - implicitHeight) / 2)) * offsetScale
panels: root panels: root
screen: root.screen screen: root.screen
screenState: root.screenState screenState: root.screenState
+3 -6
View File
@@ -3,12 +3,11 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Config import ZShell.Config
import ZShell.Components
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
import qs.Services import qs.Services
SnapLayout { ColumnLayout {
id: root id: root
readonly property real centerScale: Math.min(1, screenHeight / 1440) readonly property real centerScale: Math.min(1, screenHeight / 1440)
@@ -19,11 +18,9 @@ SnapLayout {
Layout.fillHeight: true Layout.fillHeight: true
Layout.fillWidth: false Layout.fillWidth: false
Layout.preferredWidth: centerWidth Layout.preferredWidth: centerWidth
orientation: Qt.Vertical
spacing: Tokens.spacing.largeIncreased * 2 spacing: Tokens.spacing.largeIncreased * 2
SnapLayout { RowLayout {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
spacing: Tokens.spacing.small spacing: Tokens.spacing.small
@@ -119,7 +116,7 @@ SnapLayout {
} }
} }
SnapLayout { RowLayout {
id: input id: input
anchors.fill: parent anchors.fill: parent
+2 -3
View File
@@ -1,12 +1,11 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Config
import ZShell.Components
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
import ZShell.Config
import qs.Services import qs.Services
SnapLayout { RowLayout {
id: root id: root
required property var greeter required property var greeter
-1
View File
@@ -3,7 +3,6 @@ pragma ComponentBehavior: Bound
import Quickshell import Quickshell
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import ZShell.Config import ZShell.Config
import qs.Components import qs.Components
import qs.Services import qs.Services
+4 -10
View File
@@ -3,20 +3,17 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Config import ZShell.Config
import ZShell.Components
import qs.Components import qs.Components
import qs.Services import qs.Services
SnapLayout { ColumnLayout {
id: root id: root
required property var greeter required property var greeter
anchors.fill: parent anchors.fill: parent
anchors.margins: Tokens.padding.large anchors.margins: Tokens.padding.large
spacing: Tokens.spacing.large spacing: Tokens.spacing.large
orientation: Qt.Vertical
CustomText { CustomText {
Layout.fillWidth: true Layout.fillWidth: true
@@ -40,9 +37,8 @@ SnapLayout {
duration: Tokens.anim.durations.extraLarge duration: Tokens.anim.durations.extraLarge
} }
} }
sourceComponent: SnapLayout { sourceComponent: ColumnLayout {
spacing: Tokens.spacing.largeIncreased spacing: Tokens.spacing.largeIncreased
orientation: Qt.Vertical
MaterialIcon { MaterialIcon {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
@@ -88,7 +84,7 @@ SnapLayout {
} }
} }
SnapLayout { RowLayout {
id: row id: row
anchors.fill: parent anchors.fill: parent
@@ -101,11 +97,9 @@ SnapLayout {
text: modelData.kind === "x11" ? "tv" : "desktop_windows" text: modelData.kind === "x11" ? "tv" : "desktop_windows"
} }
SnapLayout { ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
spacing: Tokens.spacing.small / 2 spacing: Tokens.spacing.small / 2
orientation: Qt.Vertical
CustomText { CustomText {
Layout.fillWidth: true Layout.fillWidth: true
+4 -10
View File
@@ -3,21 +3,18 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Config import ZShell.Config
import ZShell.Components
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
import qs.Services import qs.Services
SnapLayout { ColumnLayout {
id: root id: root
required property var greeter required property var greeter
anchors.fill: parent anchors.fill: parent
anchors.margins: Tokens.padding.large anchors.margins: Tokens.padding.large
spacing: Tokens.spacing.large spacing: Tokens.spacing.large
orientation: Qt.Vertical
CustomText { CustomText {
Layout.fillWidth: true Layout.fillWidth: true
@@ -41,9 +38,8 @@ SnapLayout {
duration: Tokens.anim.durations.extraLarge duration: Tokens.anim.durations.extraLarge
} }
} }
sourceComponent: SnapLayout { sourceComponent: ColumnLayout {
spacing: Tokens.spacing.largeIncreased spacing: Tokens.spacing.largeIncreased
orientation: Qt.Vertical
MaterialIcon { MaterialIcon {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
@@ -90,7 +86,7 @@ SnapLayout {
} }
} }
SnapLayout { RowLayout {
id: row id: row
anchors.fill: parent anchors.fill: parent
@@ -116,11 +112,9 @@ SnapLayout {
} }
} }
SnapLayout { ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
spacing: Tokens.spacing.small / 2 spacing: Tokens.spacing.small / 2
orientation: Qt.Vertical
CustomText { CustomText {
Layout.fillWidth: true Layout.fillWidth: true
+1 -1
View File
@@ -53,7 +53,7 @@ CustomRect {
radius: Tokens.rounding.full radius: Tokens.rounding.full
width: row.implicitWidth + Tokens.padding.small * 2 width: row.implicitWidth + Tokens.padding.small * 2
SnapLayout { RowLayout {
id: row id: row
anchors.centerIn: parent anchors.centerIn: parent
+8 -58
View File
@@ -4,13 +4,11 @@ import Quickshell
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Config import ZShell.Config
import ZShell.Components
import qs.Components import qs.Components
import qs.Modules.Bar.Components import qs.Modules.Bar.Components
import qs.Modules.Bar.Popouts import qs.Modules.Bar.Popouts
import ZShell
SnapLayout { GridLayout {
id: root id: root
required property bool fullscreen required property bool fullscreen
@@ -24,7 +22,7 @@ SnapLayout {
function axisCenterOf(item: Item): real { function axisCenterOf(item: Item): real {
const c = item.mapToItem(root, item.implicitWidth / 2, item.implicitHeight / 2); const c = item.mapToItem(root, item.implicitWidth / 2, item.implicitHeight / 2);
return horizontal ? ZUtils.snap(c.x, item) : ZUtils.snap(c.y, item); return horizontal ? Math.floor(c.x) : Math.floor(c.y);
} }
function checkPopout(pos: real): void { function checkPopout(pos: real): void {
@@ -76,47 +74,9 @@ SnapLayout {
return ch?.entryId ?? ""; return ch?.entryId ?? "";
} }
readonly property var sectionRects: { columnSpacing: Tokens.spacing.small
const count = repeater.count; // dependency: re-run when items are added/removed columns: horizontal ? -1 : 1
const names = ["start", "middle", "end"]; // constant ids by position rowSpacing: Tokens.spacing.small
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 { Repeater {
id: repeater id: repeater
@@ -268,26 +228,16 @@ SnapLayout {
} }
component EntryWrapper: Item { 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 readonly property string entryId: modelData.id
required property int index required property int index
required property var modelData
default property Item item default property Item item
required property var modelData
Layout.alignment: root.horizontal ? Qt.AlignVCenter : Qt.AlignHCenter Layout.alignment: root.horizontal ? Qt.AlignVCenter : Qt.AlignHCenter
Layout.bottomMargin: !root.horizontal && index === repeater.count - 1 ? root.vPadding : 0 Layout.bottomMargin: !root.horizontal && index === repeater.count - 1 ? root.vPadding : 0
Layout.leftMargin: root.horizontal && index === 0 ? root.vPadding : (entryId === "statusIcons" && root.horizontal) ? -root.spacing + Tokens.spacing.extraSmall : 0 Layout.leftMargin: root.horizontal && index === 0 ? root.vPadding : (entryId === "statusIcons" && root.horizontal) ? -root.rowSpacing + Tokens.spacing.extraSmall : 0
Layout.rightMargin: root.horizontal && index === repeater.count - 1 ? root.vPadding : 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.spacing + Tokens.spacing.extraSmall : 0 Layout.topMargin: !root.horizontal && index === 0 ? root.vPadding : (entryId === "statusIcons" && !root.horizontal) ? -root.columnSpacing + Tokens.spacing.extraSmall : 0
children: item children: item
implicitHeight: item?.implicitHeight ?? 0 implicitHeight: item?.implicitHeight ?? 0
implicitWidth: item?.implicitWidth ?? 0 implicitWidth: item?.implicitWidth ?? 0
-1
View File
@@ -9,7 +9,6 @@ import qs.Components
Item { Item {
id: root id: root
readonly property var sections: (content.item as Bar)?.sectionRects ?? []
readonly property int clampedExtent: Math.max(Config.bar.border, extent) 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 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 readonly property int exclusiveZone: Config.bar.autoHide ? Config.bar.border : contentThickness
+2 -4
View File
@@ -4,7 +4,6 @@ import Quickshell
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Config import ZShell.Config
import ZShell.Components
import qs.Modules.Bar.Popouts import qs.Modules.Bar.Popouts
import qs.Modules.Bar.Components.Common import qs.Modules.Bar.Components.Common
import qs.Helpers import qs.Helpers
@@ -44,7 +43,7 @@ WidgetBase {
timeTokens: timeTokens timeTokens: timeTokens
}; };
} }
required property SnapLayout loader required property GridLayout loader
required property Wrapper popouts required property Wrapper popouts
readonly property int roundedWidth: Math.round(timeText.implicitWidth) readonly property int roundedWidth: Math.round(timeText.implicitWidth)
readonly property int evenWidth: roundedWidth % 2 === 0 ? roundedWidth : roundedWidth + 1 readonly property int evenWidth: roundedWidth % 2 === 0 ? roundedWidth : roundedWidth + 1
@@ -70,8 +69,7 @@ WidgetBase {
} }
} }
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
id: verticalColumn id: verticalColumn
anchors.centerIn: parent anchors.centerIn: parent
-1
View File
@@ -1,6 +1,5 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import ZShell.Config import ZShell.Config
import qs.Components import qs.Components
import qs.Modules.Bar.Components.Common import qs.Modules.Bar.Components.Common
+1 -2
View File
@@ -1,7 +1,6 @@
import Quickshell import Quickshell
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import qs.Components import qs.Components
import qs.Modules import qs.Modules
@@ -12,7 +11,7 @@ Item {
anchors.top: parent.top anchors.top: parent.top
implicitWidth: layout.implicitWidth implicitWidth: layout.implicitWidth
SnapLayout { RowLayout {
id: layout id: layout
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
-1
View File
@@ -1,6 +1,5 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import Quickshell import Quickshell
import qs.Components import qs.Components
import ZShell.Config import ZShell.Config
-1
View File
@@ -3,7 +3,6 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import Quickshell import Quickshell
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import ZShell.Config import ZShell.Config
import ZShell.Services import ZShell.Services
import qs.Services import qs.Services
+4 -4
View File
@@ -4,7 +4,6 @@ import Quickshell
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Config import ZShell.Config
import ZShell.Components
import qs.Helpers import qs.Helpers
import qs.Modules.Bar.Components.StatusIcons import qs.Modules.Bar.Components.StatusIcons
import qs.Modules.Bar.Components.Common import qs.Modules.Bar.Components.Common
@@ -60,7 +59,7 @@ WidgetBase {
Anim {} Anim {}
} }
SnapLayout { GridLayout {
id: grid id: grid
anchors.bottomMargin: root.horizontal ? 0 : Tokens.padding.medium anchors.bottomMargin: root.horizontal ? 0 : Tokens.padding.medium
@@ -68,8 +67,9 @@ WidgetBase {
anchors.leftMargin: root.horizontal ? Tokens.padding.extraSmall : 0 anchors.leftMargin: root.horizontal ? Tokens.padding.extraSmall : 0
anchors.rightMargin: root.horizontal ? Tokens.padding.extraSmall : 0 anchors.rightMargin: root.horizontal ? Tokens.padding.extraSmall : 0
anchors.topMargin: root.horizontal ? 0 : Tokens.padding.extraSmall anchors.topMargin: root.horizontal ? 0 : Tokens.padding.extraSmall
orientation: root.horizontal ? Qt.Horizontal : Qt.Vertical columns: root.horizontal ? -1 : 1
spacing: root.horizontal ? Tokens.spacing.extraSmall : -2 columnSpacing: root.spacing
rowSpacing: root.spacing
Repeater { Repeater {
model: ScriptModel { model: ScriptModel {
@@ -1,6 +1,5 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import ZShell.Config import ZShell.Config
import qs.Daemons import qs.Daemons
import qs.Components import qs.Components
@@ -1,6 +1,5 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import ZShell.Config import ZShell.Config
import qs.Daemons import qs.Daemons
import qs.Components import qs.Components
@@ -1,7 +1,6 @@
import Quickshell.Services.UPower import Quickshell.Services.UPower
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import ZShell.Config import ZShell.Config
import qs.Modules.Bar.Components.Common import qs.Modules.Bar.Components.Common
import qs.Components import qs.Components
+2 -3
View File
@@ -2,11 +2,10 @@ import QtQuick.Layouts
import QtQuick import QtQuick
import Quickshell import Quickshell
import Quickshell.Services.SystemTray import Quickshell.Services.SystemTray
import ZShell.Config
import ZShell.Components
import qs.Helpers import qs.Helpers
import qs.Modules.Bar.Popouts import qs.Modules.Bar.Popouts
import qs.Components import qs.Components
import ZShell.Config
import qs.Services import qs.Services
Item { Item {
@@ -16,7 +15,7 @@ Item {
readonly property real dpr: Hypr.monitorFor(loader?.screen).scale readonly property real dpr: Hypr.monitorFor(loader?.screen).scale
required property int ind required property int ind
required property SystemTrayItem item required property SystemTrayItem item
required property SnapLayout loader required property GridLayout loader
required property Wrapper popouts required property Wrapper popouts
function resolveIcon(app: string, icon: string): string { function resolveIcon(app: string, icon: string): string {
+5 -5
View File
@@ -4,7 +4,6 @@ import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import Quickshell.Services.SystemTray import Quickshell.Services.SystemTray
import ZShell.Config import ZShell.Config
import ZShell.Components
import qs.Components import qs.Components
import qs.Modules.Bar.Components.Common import qs.Modules.Bar.Components.Common
import qs.Modules.Bar.Components.Tray import qs.Modules.Bar.Components.Tray
@@ -16,7 +15,7 @@ WidgetBase {
readonly property alias items: repeater readonly property alias items: repeater
readonly property alias layout: sysGrid readonly property alias layout: sysGrid
required property SnapLayout loader required property GridLayout loader
readonly property int padding: Tokens.padding.extraSmall readonly property int padding: Tokens.padding.extraSmall
required property Wrapper popouts 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 readonly property real size: horizontal ? sysGrid.implicitWidth + sysGrid.anchors.leftMargin + sysGrid.anchors.rightMargin : sysGrid.implicitHeight + sysGrid.anchors.topMargin + sysGrid.anchors.bottomMargin
@@ -29,7 +28,7 @@ WidgetBase {
radius: Tokens.rounding.full radius: Tokens.rounding.full
topRightRadius: horizontal ? Tokens.rounding.small / 2 : Tokens.rounding.full topRightRadius: horizontal ? Tokens.rounding.small / 2 : Tokens.rounding.full
SnapLayout { GridLayout {
id: sysGrid id: sysGrid
anchors.bottomMargin: root.horizontal ? 0 : Tokens.padding.extraSmall anchors.bottomMargin: root.horizontal ? 0 : Tokens.padding.extraSmall
@@ -37,8 +36,9 @@ WidgetBase {
anchors.leftMargin: root.horizontal ? Tokens.padding.extraSmall : 0 anchors.leftMargin: root.horizontal ? Tokens.padding.extraSmall : 0
anchors.rightMargin: root.horizontal ? Tokens.padding.extraSmall : 0 anchors.rightMargin: root.horizontal ? Tokens.padding.extraSmall : 0
anchors.topMargin: root.horizontal ? 0 : Tokens.padding.extraSmall anchors.topMargin: root.horizontal ? 0 : Tokens.padding.extraSmall
orientation: root.horizontal ? Qt.Horizontal : Qt.Vertical columns: root.horizontal ? -1 : 1
spacing: root.horizontal ? Tokens.spacing.extraSmall : -2 rowSpacing: -2
columnSpacing: Tokens.spacing.extraSmall
Repeater { Repeater {
id: repeater id: repeater
-1
View File
@@ -1,6 +1,5 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import ZShell.Config import ZShell.Config
import qs.Components import qs.Components
import qs.Modules.Bar.Components.Common import qs.Modules.Bar.Components.Common
+1 -1
View File
@@ -17,7 +17,7 @@ Item {
readonly property int maxSize: { readonly property int maxSize: {
const otherModules = bar.children.filter(c => c.enabled && c.entryId && c.item !== this && c.entryId !== "spacer"); 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); 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.spacing * (bar.children.length - 1) - bar.vPadding * 2) : (bar.height - otherSize - bar.spacing * (bar.children.length - 1) - bar.vPadding * 4); 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);
} }
clip: true clip: true
+10 -15
View File
@@ -5,7 +5,6 @@ import Quickshell.Services.Pipewire
import Quickshell.Widgets import Quickshell.Widgets
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import QtQuick.Controls import QtQuick.Controls
import ZShell.Config import ZShell.Config
import qs.Components import qs.Components
@@ -47,8 +46,7 @@ Item {
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
} }
component VolumesTab: SnapLayout { component VolumesTab: ColumnLayout {
orientation: Qt.Vertical
spacing: 12 spacing: 12
CustomRect { CustomRect {
@@ -58,15 +56,14 @@ orientation: Qt.Vertical
color: Colors.tPalette.m3surfaceContainer color: Colors.tPalette.m3surfaceContainer
radius: root.rounding - vol.anchors.margins radius: root.rounding - vol.anchors.margins
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
anchors.bottomMargin: Tokens.padding.small anchors.bottomMargin: Tokens.padding.small
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.small anchors.leftMargin: Tokens.padding.small
anchors.rightMargin: Tokens.padding.small anchors.rightMargin: Tokens.padding.small
anchors.topMargin: Tokens.padding.small anchors.topMargin: Tokens.padding.small
SnapLayout { RowLayout {
Layout.fillHeight: true Layout.fillHeight: true
Layout.fillWidth: true Layout.fillWidth: true
@@ -84,7 +81,7 @@ orientation: Qt.Vertical
} }
} }
SnapLayout { RowLayout {
spacing: Tokens.spacing.largeIncreased spacing: Tokens.spacing.largeIncreased
CustomMouseArea { CustomMouseArea {
@@ -156,15 +153,14 @@ orientation: Qt.Vertical
} }
} }
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
anchors.bottomMargin: Tokens.padding.small anchors.bottomMargin: Tokens.padding.small
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.small anchors.leftMargin: Tokens.padding.small
anchors.rightMargin: Tokens.padding.small anchors.rightMargin: Tokens.padding.small
anchors.topMargin: Tokens.padding.small anchors.topMargin: Tokens.padding.small
SnapLayout { RowLayout {
Layout.fillHeight: true Layout.fillHeight: true
Layout.fillWidth: true Layout.fillWidth: true
@@ -182,7 +178,7 @@ orientation: Qt.Vertical
} }
} }
SnapLayout { RowLayout {
spacing: Tokens.spacing.largeIncreased spacing: Tokens.spacing.largeIncreased
CustomMouseArea { CustomMouseArea {
@@ -280,15 +276,14 @@ orientation: Qt.Vertical
text: Audio.getStreamName(appBox.modelData) text: Audio.getStreamName(appBox.modelData)
} }
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
anchors.bottomMargin: Tokens.padding.small anchors.bottomMargin: Tokens.padding.small
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.small anchors.leftMargin: Tokens.padding.small
anchors.rightMargin: Tokens.padding.small anchors.rightMargin: Tokens.padding.small
anchors.topMargin: Tokens.padding.small anchors.topMargin: Tokens.padding.small
SnapLayout { RowLayout {
Layout.fillHeight: true Layout.fillHeight: true
Layout.fillWidth: true Layout.fillWidth: true
@@ -307,7 +302,7 @@ orientation: Qt.Vertical
} }
} }
SnapLayout { RowLayout {
spacing: Tokens.spacing.largeIncreased spacing: Tokens.spacing.largeIncreased
CustomMouseArea { CustomMouseArea {
+4 -4
View File
@@ -4,7 +4,6 @@ import QtQuick
import Quickshell import Quickshell
import qs.Components import qs.Components
import ZShell.Config import ZShell.Config
import ZShell
Item { Item {
id: root id: root
@@ -37,7 +36,7 @@ Item {
const diff = parent.width - Math.floor(off + content.nonAnimWidth); const diff = parent.width - Math.floor(off + content.nonAnimWidth);
if (diff < 0) if (diff < 0)
return off + diff; return off + diff;
return ZUtils.snap(Math.max(off, 0), root); return Math.floor(Math.max(off, 0));
} }
y: { y: {
if (horizontal) if (horizontal)
@@ -47,11 +46,12 @@ Item {
const diff = parent.height - Math.floor(off + content.nonAnimHeight); const diff = parent.height - Math.floor(off + content.nonAnimHeight);
if (diff < 0) if (diff < 0)
return off + diff; return off + diff;
return ZUtils.snap(Math.max(off, 0), root); return Math.max(off, 0);
} }
Behavior on offsetScale { Behavior on offsetScale {
Anim {} Anim {
}
} }
Behavior on x { Behavior on x {
enabled: !root.horizontal || root.offsetScale < 1 enabled: !root.horizontal || root.offsetScale < 1
+1 -3
View File
@@ -4,7 +4,6 @@ import Quickshell
import Quickshell.Networking import Quickshell.Networking
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import qs.Components import qs.Components
import ZShell.Config import ZShell.Config
import qs.Modules import qs.Modules
@@ -15,8 +14,7 @@ Item {
required property var wrapper required property var wrapper
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
id: layout id: layout
spacing: 8 spacing: 8
+1 -3
View File
@@ -4,7 +4,6 @@ import Quickshell
import Quickshell.Widgets import Quickshell.Widgets
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Effects import QtQuick.Effects
import qs.Components import qs.Components
@@ -48,8 +47,7 @@ StackView {
duration: 0 duration: 0
} }
} }
component SubMenu: SnapLayout { component SubMenu: ColumnLayout {
orientation: Qt.Vertical
id: menu id: menu
required property QsMenuHandle handle required property QsMenuHandle handle
+1 -2
View File
@@ -2,7 +2,6 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import Quickshell.Services.UPower import Quickshell.Services.UPower
import ZShell.Config import ZShell.Config
import qs.Modules.Bar.Components.Common import qs.Modules.Bar.Components.Common
@@ -36,7 +35,7 @@ Column {
Repeater { Repeater {
model: Battery.allPeripherals model: Battery.allPeripherals
SnapLayout { RowLayout {
id: layout id: layout
required property var modelData required property var modelData
+3 -5
View File
@@ -2,7 +2,6 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import Quickshell import Quickshell
import ZShell.Config import ZShell.Config
import qs.Components import qs.Components
@@ -87,7 +86,7 @@ CustomRect {
implicitWidth: 600 implicitWidth: 600
radius: root.radius - Tokens.padding.extraSmall radius: root.radius - Tokens.padding.extraSmall
SnapLayout { RowLayout {
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.small anchors.leftMargin: Tokens.padding.small
anchors.rightMargin: Tokens.padding.small anchors.rightMargin: Tokens.padding.small
@@ -97,8 +96,7 @@ CustomRect {
text: "package_2" text: "package_2"
} }
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
Layout.fillWidth: true Layout.fillWidth: true
CustomText { CustomText {
@@ -116,7 +114,7 @@ orientation: Qt.Vertical
} }
} }
SnapLayout { RowLayout {
Layout.fillHeight: true Layout.fillHeight: true
Layout.preferredWidth: 300 Layout.preferredWidth: 300
+2 -3
View File
@@ -2,7 +2,6 @@ import Quickshell
import QtQuick import QtQuick
import qs.Components import qs.Components
import ZShell.Config import ZShell.Config
import ZShell
Item { Item {
id: root id: root
@@ -27,8 +26,8 @@ Item {
detachedMode = ""; detachedMode = "";
} }
implicitHeight: ZUtils.snap(nonAnimHeight, root) implicitHeight: nonAnimHeight
implicitWidth: ZUtils.snap(nonAnimWidth, root) implicitWidth: nonAnimWidth
Behavior on implicitHeight { Behavior on implicitHeight {
enabled: root.offsetScale < 1 enabled: root.offsetScale < 1
+2 -3
View File
@@ -4,7 +4,6 @@ import Quickshell
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
import ZShell.Config import ZShell.Config
@@ -112,7 +111,7 @@ Item {
Repeater { Repeater {
model: lineRow.modelData.text.split("\t").slice(1) model: lineRow.modelData.text.split("\t").slice(1)
SnapLayout { RowLayout {
height: lineText.height height: lineText.height
width: lineText.height + Tokens.spacing.extraSmall width: lineText.height + Tokens.spacing.extraSmall
@@ -226,7 +225,7 @@ Item {
} }
} }
SnapLayout { RowLayout {
anchors.fill: parent anchors.fill: parent
spacing: Tokens.spacing.small spacing: Tokens.spacing.small
+4 -5
View File
@@ -3,7 +3,6 @@ pragma ComponentBehavior: Bound
import Quickshell import Quickshell
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import ZShell.Config import ZShell.Config
import ZShell import ZShell
import qs.Components import qs.Components
@@ -40,8 +39,8 @@ Item {
]; ];
return allTabs.filter(tab => tab.enabled); return allTabs.filter(tab => tab.enabled);
} }
readonly property real nonAnimHeight: ZUtils.snap(tabs.implicitHeight + tabs.anchors.topMargin + view.implicitHeight + viewWrapper.anchors.margins + viewWrapper.anchors.topMargin, root) readonly property real nonAnimHeight: tabs.implicitHeight + tabs.anchors.topMargin + view.implicitHeight + viewWrapper.anchors.margins + viewWrapper.anchors.topMargin
readonly property real nonAnimWidth: ZUtils.snap(view.implicitWidth + viewWrapper.anchors.margins * 2, root) readonly property real nonAnimWidth: view.implicitWidth + viewWrapper.anchors.margins * 2
required property ScreenState screenState required property ScreenState screenState
implicitHeight: nonAnimHeight implicitHeight: nonAnimHeight
@@ -94,8 +93,8 @@ Item {
} }
anchors.fill: parent anchors.fill: parent
implicitHeight: currentItem?.height ?? currentItem?.implicitHeight ?? 0 implicitHeight: currentItem?.implicitHeight ?? 0
implicitWidth: currentItem?.width ?? currentItem?.implicitWidth ?? 0 implicitWidth: currentItem?.implicitWidth ?? 0
Repeater { Repeater {
id: repeater id: repeater
+75 -53
View File
@@ -1,82 +1,104 @@
import Quickshell import Quickshell
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell
import ZShell.Config
import ZShell.Components
import qs.Helpers import qs.Helpers
import qs.Components import qs.Components
import qs.Modules import qs.Modules
import ZShell.Config
import qs.Modules.Dashboard.Dash import qs.Modules.Dashboard.Dash
import qs.Services import qs.Services
SnapLayout { GridLayout {
orientation: Qt.Vertical
id: root id: root
readonly property bool dashboardVisible: screenState.dashboard readonly property bool dashboardVisible: screenState.dashboard
required property int radius required property int radius
required property ScreenState screenState required property ScreenState screenState
spacing: ZUtils.snap(Tokens.spacing.small, root) columnSpacing: Tokens.spacing.small
rowSpacing: Tokens.spacing.small
height: ZUtils.snap(implicitHeight, root) ParallelAnimation {
width: ZUtils.snap(implicitWidth, root) id: openAnim
SnapLayout { Anim {
Layout.fillWidth: true property: "opacity"
spacing: parent.spacing target: root
to: 1
Rect {
id: weatherRect
Layout.fillHeight: true
Layout.preferredWidth: ZUtils.snap(Tokens.sizes.dashboard.weatherWidth, root)
radius: root.radius
Weather {}
} }
Rect { Anim {
id: userRect property: "scale"
Layout.preferredHeight: ZUtils.snap(user.implicitHeight, root) target: root
Layout.preferredWidth: ZUtils.snap(user.implicitWidth, root) to: 1
radius: root.radius
User {
id: user
screenState: root.screenState
}
} }
} }
SnapLayout { ParallelAnimation {
Layout.fillWidth: true id: closeAnim
spacing: parent.spacing
Rect { Anim {
id: calendarRect property: "opacity"
Layout.fillWidth: true target: root
Layout.fillHeight: true to: 0
implicitHeight: ZUtils.snap(calendar.implicitHeight, root)
radius: root.radius
Calendar {
id: calendar
screenState: root.screenState
}
} }
Rect { Anim {
id: resourcesRect property: "scale"
Layout.fillHeight: true target: root
implicitWidth: ZUtils.snap(resources.implicitWidth, root) to: 0.9
radius: root.radius }
}
Resources { Rect {
id: resources 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
Layout.fillWidth: true
Layout.preferredHeight: calendar.implicitHeight
Layout.row: 1
radius: root.radius
Calendar {
id: calendar
screenState: root.screenState
}
}
Rect {
Layout.column: 3
Layout.columnSpan: 2
Layout.fillHeight: true
Layout.preferredWidth: resources.implicitWidth
Layout.row: 1
radius: root.radius
Resources {
id: resources
} }
} }
+2 -4
View File
@@ -4,7 +4,6 @@ import Quickshell
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import qs.Components import qs.Components
import ZShell.Config import ZShell.Config
import qs.Services import qs.Services
@@ -118,15 +117,14 @@ CustomMouseArea {
} }
} }
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
id: inner id: inner
anchors.fill: parent anchors.fill: parent
anchors.margins: Tokens.padding.large anchors.margins: Tokens.padding.large
spacing: Tokens.spacing.extraSmall spacing: Tokens.spacing.extraSmall
SnapLayout { RowLayout {
id: monthNavigationRow id: monthNavigationRow
Layout.fillWidth: true Layout.fillWidth: true
+9 -11
View File
@@ -1,7 +1,5 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import ZShell
import ZShell.Services import ZShell.Services
import ZShell.Config import ZShell.Config
import qs.Components import qs.Components
@@ -10,8 +8,9 @@ import qs.Services
Item { Item {
id: root id: root
anchors.fill: parent anchors.bottom: parent.bottom
implicitWidth: ZUtils.snap(layout.implicitWidth + layout.anchors.margins * 2, root) anchors.top: parent.top
implicitWidth: layout.implicitWidth + layout.anchors.margins * 4
ServiceRef { ServiceRef {
service: Storage service: Storage
@@ -29,16 +28,13 @@ Item {
service: Gpu service: Gpu
} }
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
id: layout id: layout
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
anchors.margins: Tokens.padding.large anchors.margins: Tokens.padding.large
anchors.top: parent.top anchors.top: parent.top
x: ZUtils.snap((root.width - implicitWidth) / 2, root)
spacing: Tokens.spacing.medium spacing: Tokens.spacing.medium
Resource { Resource {
@@ -77,10 +73,12 @@ orientation: Qt.Vertical
required property string icon required property string icon
implicitSize: ZUtils.snap((root.height - layout.anchors.margins * 2 - layout.spacing * 4) / 5, root) Layout.fillHeight: true
implicitSize: height
Behavior on clampedVal { Behavior on clampedVal {
Anim {} Anim {
}
} }
MaterialIcon { MaterialIcon {
+5 -9
View File
@@ -1,8 +1,6 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import M3Shapes import M3Shapes
import ZShell
import ZShell.Config import ZShell.Config
import qs.Modules.Dashboard.Media import qs.Modules.Dashboard.Media
import qs.Components import qs.Components
@@ -15,8 +13,8 @@ Item {
property ScreenState screenState property ScreenState screenState
required property int radius required property int radius
implicitWidth: ZUtils.snap(1000, root) implicitWidth: 1000
implicitHeight: ZUtils.snap(320, root) implicitHeight: 320
ClipRect { ClipRect {
anchors.fill: parent anchors.fill: parent
@@ -27,7 +25,7 @@ Item {
} }
} }
SnapLayout { RowLayout {
anchors.fill: parent anchors.fill: parent
anchors.margins: Tokens.padding.large anchors.margins: Tokens.padding.large
spacing: Tokens.spacing.extraLarge spacing: Tokens.spacing.extraLarge
@@ -96,8 +94,7 @@ Item {
active: opacity > 0 active: opacity > 0
opacity: 0 opacity: 0
sourceComponent: SnapLayout { sourceComponent: ColumnLayout {
orientation: Qt.Vertical
spacing: Tokens.spacing.small spacing: Tokens.spacing.small
MaterialShape { MaterialShape {
@@ -143,12 +140,11 @@ orientation: Qt.Vertical
asynchronous: true asynchronous: true
active: opacity > 0 active: opacity > 0
sourceComponent: SnapLayout { sourceComponent: RowLayout {
spacing: Tokens.spacing.extraLarge spacing: Tokens.spacing.extraLarge
Details { Details {
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true
} }
LyricsAndSelector { LyricsAndSelector {
+154 -178
View File
@@ -1,14 +1,13 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import Quickshell.Services.Mpris import Quickshell.Services.Mpris
import ZShell
import ZShell.Components import ZShell.Components
import ZShell.Config import ZShell.Config
import qs.Components import qs.Components
import qs.Services import qs.Services
import qs.Helpers import qs.Helpers
Item { ColumnLayout {
id: root id: root
readonly property bool hasUnknownLength: (Players.active?.length ?? 0) > 2147483647 readonly property bool hasUnknownLength: (Players.active?.length ?? 0) > 2147483647
@@ -26,187 +25,46 @@ Item {
return `${mins}:${secs}`; return `${mins}:${secs}`;
} }
implicitHeight: ZUtils.snap(layout.implicitHeight, root) spacing: Tokens.spacing.extraSmall
implicitWidth: layout.implicitWidth
SnapLayout { Timer {
orientation: Qt.Vertical running: Players.active?.isPlaying ?? false
id: layout interval: Config.dashboard.mediaUpdateInterval
anchors.left: parent.left triggeredOnStart: true
anchors.right: parent.right repeat: true
y: ZUtils.snap((parent.height - implicitHeight) / 2, root) onTriggered: Players.active?.positionChanged()
}
spacing: ZUtils.snap(Tokens.spacing.extraSmall, root) CustomText {
Layout.fillWidth: true
text: Players.active?.trackTitle ?? ""
font: Tokens.font.title.large
elide: Text.ElideRight
animate: true
}
Timer { CustomText {
running: Players.active?.isPlaying ?? false Layout.fillWidth: true
interval: Config.dashboard.mediaUpdateInterval text: Players.active?.trackArtist || qsTr("Unknown artist")
triggeredOnStart: true color: Colors.palette.m3onSurfaceVariant
repeat: true font: Tokens.font.title.medium
onTriggered: Players.active?.positionChanged() elide: Text.ElideRight
} animate: true
}
CustomText { CustomText {
id: title Layout.fillWidth: true
Layout.fillWidth: true text: Players.active?.trackAlbum || qsTr("Unknown album")
Layout.preferredHeight: ZUtils.snapCeil(implicitHeight, root) color: Colors.palette.m3secondary
text: Players.active?.trackTitle ?? "" font: Tokens.font.title.medium
font: Tokens.font.title.large elide: Text.ElideRight
elide: Text.ElideRight animate: true
animate: true }
}
CustomText { RowLayout {
id: artist Layout.topMargin: Tokens.spacing.extraLargeIncreased
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: ZUtils.snapCeil(implicitHeight, root) spacing: Tokens.spacing.small
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 { TextMetrics {
id: timeMetrics id: timeMetrics
@@ -214,5 +72,123 @@ orientation: Qt.Vertical
text: Players.active ? root.lengthStr(Math.max(Players.active.position, root.hasUnknownLength ? 0 : Players.active.length)).replace(/[1-9]/g, "0") : "00:00" 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 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)
}
} }
} }
+2 -5
View File
@@ -3,7 +3,6 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Effects import QtQuick.Effects
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import ZShell.Config import ZShell.Config
import ZShell.Services import ZShell.Services
import qs.Components import qs.Components
@@ -158,8 +157,7 @@ Item {
active: opacity > 0 active: opacity > 0
opacity: 0 opacity: 0
sourceComponent: SnapLayout { sourceComponent: ColumnLayout {
orientation: Qt.Vertical
spacing: Tokens.spacing.large spacing: Tokens.spacing.large
CustomRect { CustomRect {
@@ -200,8 +198,7 @@ orientation: Qt.Vertical
active: opacity > 0 active: opacity > 0
opacity: 0 opacity: 0
sourceComponent: SnapLayout { sourceComponent: ColumnLayout {
orientation: Qt.Vertical
spacing: Tokens.spacing.small spacing: Tokens.spacing.small
MaterialIcon { MaterialIcon {
@@ -1,6 +1,5 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import Quickshell import Quickshell
import Quickshell.Services.Mpris import Quickshell.Services.Mpris
import ZShell.Config import ZShell.Config
@@ -9,15 +8,14 @@ import qs.Helpers
import qs.Services import qs.Services
Item { Item {
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
id: layout id: layout
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.medium anchors.leftMargin: Tokens.padding.medium
spacing: Tokens.spacing.medium spacing: Tokens.spacing.medium
SnapLayout { RowLayout {
Layout.bottomMargin: -Tokens.spacing.medium Layout.bottomMargin: -Tokens.spacing.medium
spacing: Tokens.spacing.medium spacing: Tokens.spacing.medium
z: 1 z: 1
+4 -6
View File
@@ -1,6 +1,5 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import ZShell import ZShell
import ZShell.Blobs import ZShell.Blobs
import ZShell.Config import ZShell.Config
@@ -17,7 +16,7 @@ Item {
implicitWidth: btn.implicitWidth * 0.9 implicitWidth: btn.implicitWidth * 0.9
implicitHeight: btn.implicitHeight * 0.9 implicitHeight: btn.implicitHeight * 0.9
BlobGroup2 { BlobGroup {
id: blobGroup id: blobGroup
color: Colors.palette.m3surfaceContainerHighest color: Colors.palette.m3surfaceContainerHighest
@@ -29,7 +28,7 @@ Item {
} }
} }
BlobRect2 { BlobRect {
id: btnRect id: btnRect
anchors.fill: parent anchors.fill: parent
@@ -42,7 +41,7 @@ Item {
} }
} }
BlobRect2 { BlobRect {
id: rect id: rect
anchors.right: parent.right anchors.right: parent.right
@@ -142,9 +141,8 @@ Item {
} }
] ]
SnapLayout { ColumnLayout {
id: layout id: layout
orientation: Qt.Vertical
anchors.centerIn: parent anchors.centerIn: parent
spacing: Tokens.spacing.extraSmall spacing: Tokens.spacing.extraSmall
@@ -2,7 +2,6 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import Quickshell import Quickshell
import ZShell.Config import ZShell.Config
import ZShell.Internal import ZShell.Internal
@@ -2,7 +2,6 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import Quickshell import Quickshell
import Quickshell.Widgets import Quickshell.Widgets
import ZShell.Config import ZShell.Config
@@ -39,7 +38,7 @@ CustomListView {
id: rowHover id: rowHover
} }
SnapLayout { RowLayout {
id: rowLayout id: rowLayout
anchors.left: parent.left anchors.left: parent.left
+4 -6
View File
@@ -23,7 +23,7 @@ Item {
service: Memory service: Memory
} }
SnapLayout { RowLayout {
id: layout id: layout
anchors.fill: parent anchors.fill: parent
spacing: Tokens.spacing.medium spacing: Tokens.spacing.medium
@@ -60,14 +60,13 @@ Item {
Layout.fillHeight: true Layout.fillHeight: true
implicitHeight: mainLayout.implicitHeight + mainLayout.anchors.margins * 2 implicitHeight: mainLayout.implicitHeight + mainLayout.anchors.margins * 2
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
id: mainLayout id: mainLayout
anchors.fill: parent anchors.fill: parent
anchors.margins: Tokens.padding.large anchors.margins: Tokens.padding.large
spacing: 0 spacing: 0
SnapLayout { RowLayout {
spacing: Tokens.spacing.small spacing: Tokens.spacing.small
MaterialIcon { MaterialIcon {
@@ -132,8 +131,7 @@ orientation: Qt.Vertical
} }
} }
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
id: infoColumn id: infoColumn
anchors.right: parent.right anchors.right: parent.right
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
+32 -57
View File
@@ -4,8 +4,6 @@ import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import QtQuick.Templates import QtQuick.Templates
import Quickshell import Quickshell
import ZShell
import ZShell.Components
import ZShell.Config import ZShell.Config
import qs.Components import qs.Components
import qs.Services import qs.Services
@@ -18,17 +16,9 @@ Item {
required property var tabs required property var tabs
readonly property alias count: bar.count readonly property alias count: bar.count
readonly property int tabIndicatorSpacing: ZUtils.snap(Tokens.spacing.small, root) readonly property int tabIndicatorSpacing: Tokens.spacing.small
function snapLayoutHeight(v) { implicitHeight: bar.implicitHeight + bar.anchors.topMargin + indicator.implicitHeight + indicator.anchors.topMargin + separator.implicitHeight
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 { TabBar {
id: bar id: bar
@@ -41,11 +31,9 @@ Item {
currentIndex: root.screenState.dashboardTab currentIndex: root.screenState.dashboardTab
onCurrentIndexChanged: root.screenState.dashboardTab = currentIndex onCurrentIndexChanged: root.screenState.dashboardTab = currentIndex
topPadding: 0 implicitHeight: contentHeight
bottomPadding: 0
implicitHeight: implicitContentHeight
background: null background: null
contentItem: SnapLayout { contentItem: RowLayout {
spacing: 0 spacing: 0
Repeater { Repeater {
@@ -128,13 +116,10 @@ Item {
readonly property bool current: TabBar.tabBar.currentItem === this readonly property bool current: TabBar.tabBar.currentItem === this
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true Layout.preferredWidth: 1 // Uniform width across all tabs
Layout.preferredWidth: 1
implicitWidth: implicitContentWidth implicitWidth: implicitContentWidth
implicitHeight: implicitContentHeight implicitHeight: implicitContentHeight
background: null background: null
topPadding: 0
bottomPadding: 0
contentItem: CustomMouseArea { contentItem: CustomMouseArea {
id: mouse id: mouse
@@ -146,8 +131,8 @@ Item {
root.screenState.dashboardTab = Math.max(root.screenState.dashboardTab - 1, 0); root.screenState.dashboardTab = Math.max(root.screenState.dashboardTab - 1, 0);
} }
implicitWidth: Math.max(icon.implicitWidth, label.implicitWidth) implicitWidth: Math.max(icon.width, label.width)
implicitHeight: snapLayout.implicitHeight implicitHeight: icon.height + label.height
hoverEnabled: true hoverEnabled: true
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
@@ -161,49 +146,39 @@ Item {
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.alignWhenCentered: false implicitHeight: parent.height + root.tabIndicatorSpacing * 2
implicitHeight: ZUtils.snap(parent.height + Tokens.sizes.dashboard.tabIndicatorSpacing * 2, stateLayer)
radius: Tokens.rounding.medium radius: Tokens.rounding.medium
color: tab.current ? Colors.palette.m3primary : Colors.palette.m3onSurface color: tab.current ? Colors.palette.m3primary : Colors.palette.m3onSurface
onClicked: { onClicked: root.screenState.dashboardTab = tab.TabBar.index
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
}
} }
} }
SnapLayout { CustomText {
id: snapLayout id: label
anchors.fill: parent
spacing: 0
orientation: Qt.Vertical
MaterialIcon { anchors.horizontalCenter: parent.horizontalCenter
id: icon anchors.bottom: parent.bottom
text: tab.iconName text: tab.text
color: tab.current ? Colors.palette.m3primary : Colors.palette.m3onSurfaceVariant 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
}
} }
} }
} }
+6 -12
View File
@@ -1,13 +1,11 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell
import ZShell.Components
import ZShell.Config import ZShell.Config
import qs.Components import qs.Components
import qs.Services import qs.Services
import qs.Helpers import qs.Helpers
SnapLayout { RowLayout {
id: root id: root
spacing: Tokens.spacing.largeIncreased spacing: Tokens.spacing.largeIncreased
@@ -22,7 +20,7 @@ SnapLayout {
readonly property real markerX: { readonly property real markerX: {
const d = root.now; const d = root.now;
return ZUtils.snap(d.getHours() + d.getMinutes() / 60, root); return d.getHours() + d.getMinutes() / 60;
} }
function formatHour(h) { function formatHour(h) {
@@ -41,13 +39,11 @@ SnapLayout {
onTriggered: root.now = new Date() onTriggered: root.now = new Date()
} }
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true
Layout.preferredWidth: root.width / 2 Layout.preferredWidth: root.width / 2
SnapLayout { RowLayout {
Layout.fillWidth: true Layout.fillWidth: true
MaterialIcon { MaterialIcon {
@@ -94,13 +90,11 @@ orientation: Qt.Vertical
} }
} }
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true
Layout.preferredWidth: root.width / 2 Layout.preferredWidth: root.width / 2
SnapLayout { RowLayout {
Layout.fillWidth: true Layout.fillWidth: true
MaterialIcon { MaterialIcon {
+7 -14
View File
@@ -3,7 +3,6 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Config import ZShell.Config
import ZShell.Components
import qs.Components import qs.Components
import qs.Modules.Dashboard.Weather import qs.Modules.Dashboard.Weather
import qs.Services import qs.Services
@@ -19,14 +18,13 @@ Item {
implicitHeight: layout.implicitHeight implicitHeight: layout.implicitHeight
Component.onCompleted: Weather.reload() Component.onCompleted: Weather.reload()
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
id: layout id: layout
anchors.fill: parent anchors.fill: parent
spacing: Tokens.spacing.medium spacing: Tokens.spacing.medium
SnapLayout { RowLayout {
Layout.leftMargin: Tokens.padding.large Layout.leftMargin: Tokens.padding.large
Layout.rightMargin: Tokens.padding.large Layout.rightMargin: Tokens.padding.large
Layout.fillWidth: true Layout.fillWidth: true
@@ -84,7 +82,7 @@ orientation: Qt.Vertical
} }
} }
SnapLayout { RowLayout {
Layout.fillWidth: true Layout.fillWidth: true
spacing: Tokens.spacing.medium spacing: Tokens.spacing.medium
@@ -123,9 +121,7 @@ orientation: Qt.Vertical
color: Colors.palette.m3onSurface color: Colors.palette.m3onSurface
} }
SnapLayout { RowLayout {
id: forecastLayout
Layout.fillWidth: true Layout.fillWidth: true
spacing: Tokens.spacing.medium spacing: Tokens.spacing.medium
@@ -141,14 +137,12 @@ orientation: Qt.Vertical
required property var modelData required property var modelData
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true
implicitHeight: forecastItemColumn.implicitHeight + Tokens.padding.medium * 2 implicitHeight: forecastItemColumn.implicitHeight + Tokens.padding.medium * 2
radius: root.radius radius: root.radius
color: Colors.tPalette.m3surfaceContainer color: Colors.tPalette.m3surfaceContainer
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
id: forecastItemColumn id: forecastItemColumn
anchors.centerIn: parent anchors.centerIn: parent
@@ -202,8 +196,7 @@ orientation: Qt.Vertical
property color colour property color colour
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true Layout.preferredHeight: 60
implicitHeight: 60
radius: Tokens.rounding.medium radius: Tokens.rounding.medium
color: Colors.tPalette.m3surfaceContainer color: Colors.tPalette.m3surfaceContainer
@@ -237,7 +230,7 @@ orientation: Qt.Vertical
} }
} }
component WeatherStat: SnapLayout { component WeatherStat: RowLayout {
id: weatherStat id: weatherStat
property string icon property string icon
@@ -1,6 +1,5 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import Quickshell import Quickshell
import Quickshell.Widgets import Quickshell.Widgets
import Quickshell.Hyprland import Quickshell.Hyprland
@@ -44,8 +43,7 @@ Item {
} }
opacity: root.visible ? 1 : 0 opacity: root.visible ? 1 : 0
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
id: menuLayout id: menuLayout
anchors.centerIn: parent anchors.centerIn: parent
spacing: 0 spacing: 0
@@ -55,7 +53,7 @@ orientation: Qt.Vertical
radius: popupBackground.radius - popupBackground.padding radius: popupBackground.radius - popupBackground.padding
implicitHeight: openTerminalRow.implicitHeight + Tokens.padding.extraSmall * 2 implicitHeight: openTerminalRow.implicitHeight + Tokens.padding.extraSmall * 2
SnapLayout { RowLayout {
id: openTerminalRow id: openTerminalRow
spacing: 8 spacing: 8
anchors.fill: parent anchors.fill: parent
@@ -94,7 +92,7 @@ orientation: Qt.Vertical
radius: popupBackground.radius - popupBackground.padding radius: popupBackground.radius - popupBackground.padding
implicitHeight: settingsRow.implicitHeight + Tokens.padding.extraSmall * 2 implicitHeight: settingsRow.implicitHeight + Tokens.padding.extraSmall * 2
SnapLayout { RowLayout {
id: settingsRow id: settingsRow
spacing: 8 spacing: 8
anchors.fill: parent anchors.fill: parent
@@ -134,7 +132,7 @@ orientation: Qt.Vertical
radius: popupBackground.radius - popupBackground.padding radius: popupBackground.radius - popupBackground.padding
implicitHeight: logoutRow.implicitHeight + Tokens.padding.extraSmall * 2 implicitHeight: logoutRow.implicitHeight + Tokens.padding.extraSmall * 2
SnapLayout { RowLayout {
id: logoutRow id: logoutRow
spacing: 8 spacing: 8
anchors.fill: parent anchors.fill: parent
@@ -173,7 +171,7 @@ orientation: Qt.Vertical
// radius: popupBackground.radius - popupBackground.padding // radius: popupBackground.radius - popupBackground.padding
// implicitHeight: desktopIconsRow.implicitHeight + Tokens.padding.extraSmall * 2 // implicitHeight: desktopIconsRow.implicitHeight + Tokens.padding.extraSmall * 2
// //
// SnapLayout { // RowLayout {
// id: desktopIconsRow // id: desktopIconsRow
// spacing: 8 // spacing: 8
// anchors.fill: parent // anchors.fill: parent
@@ -3,7 +3,6 @@ import QtQuick.Layouts
import Quickshell import Quickshell
import Quickshell.Widgets import Quickshell.Widgets
import qs.Components import qs.Components
import ZShell.Components
import ZShell.Config import ZShell.Config
import qs.Services import qs.Services
@@ -58,25 +57,22 @@ Item {
Anim {} Anim {}
} }
SnapLayout { ColumnLayout {
id: menuLayout id: menuLayout
anchors.centerIn: parent anchors.centerIn: parent
spacing: 0 spacing: 0
orientation: Qt.Vertical
CustomRect { CustomRect {
Layout.preferredWidth: 160 Layout.preferredWidth: 160
implicitHeight: openRow.implicitHeight + Tokens.padding.extraSmall * 2 implicitHeight: openRow.implicitHeight + Tokens.padding.extraSmall * 2
radius: popupBackground.radius - popupBackground.padding radius: popupBackground.radius - popupBackground.padding
SnapLayout { RowLayout {
id: openRow id: openRow
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.small anchors.leftMargin: Tokens.padding.small
spacing: 8 spacing: 8
MaterialIcon { MaterialIcon {
@@ -115,12 +111,11 @@ Item {
implicitHeight: openWithRow.implicitHeight + Tokens.padding.extraSmall * 2 implicitHeight: openWithRow.implicitHeight + Tokens.padding.extraSmall * 2
radius: popupBackground.radius - popupBackground.padding radius: popupBackground.radius - popupBackground.padding
SnapLayout { RowLayout {
id: openWithRow id: openWithRow
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.small anchors.leftMargin: Tokens.padding.small
spacing: 8 spacing: 8
MaterialIcon { MaterialIcon {
@@ -161,12 +156,11 @@ Item {
implicitHeight: copyPathRow.implicitHeight + Tokens.padding.extraSmall * 2 implicitHeight: copyPathRow.implicitHeight + Tokens.padding.extraSmall * 2
radius: popupBackground.radius - popupBackground.padding radius: popupBackground.radius - popupBackground.padding
SnapLayout { RowLayout {
id: copyPathRow id: copyPathRow
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.small anchors.leftMargin: Tokens.padding.small
spacing: 8 spacing: 8
MaterialIcon { MaterialIcon {
@@ -196,12 +190,11 @@ Item {
radius: popupBackground.radius - popupBackground.padding radius: popupBackground.radius - popupBackground.padding
visible: contextMenu.targetPaths.length === 1 visible: contextMenu.targetPaths.length === 1
SnapLayout { RowLayout {
id: renameRow id: renameRow
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.small anchors.leftMargin: Tokens.padding.small
spacing: 8 spacing: 8
MaterialIcon { MaterialIcon {
@@ -238,12 +231,11 @@ Item {
implicitHeight: deleteRow.implicitHeight + Tokens.padding.extraSmall * 2 implicitHeight: deleteRow.implicitHeight + Tokens.padding.extraSmall * 2
radius: popupBackground.radius - popupBackground.padding radius: popupBackground.radius - popupBackground.padding
SnapLayout { RowLayout {
id: deleteRow id: deleteRow
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.small anchors.leftMargin: Tokens.padding.small
spacing: 8 spacing: 8
MaterialIcon { MaterialIcon {
+2 -7
View File
@@ -4,7 +4,6 @@ import Quickshell
import Quickshell.Widgets import Quickshell.Widgets
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
import ZShell.Components
import ZShell.Config import ZShell.Config
import qs.Services import qs.Services
@@ -30,10 +29,7 @@ CustomRect {
active: !isSeparator active: !isSeparator
anchors.centerIn: parent anchors.centerIn: parent
sourceComponent: SnapLayout { sourceComponent: ColumnLayout {
spacing: Tokens.spacing.extraSmall
orientation: Qt.Vertical
IconImage { IconImage {
id: icon id: icon
@@ -42,9 +38,8 @@ CustomRect {
source: Quickshell.iconPath(AppSearch.guessIcon(appToplevel?.appId), "image-missing") source: Quickshell.iconPath(AppSearch.guessIcon(appToplevel?.appId), "image-missing")
} }
SnapLayout { RowLayout {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
spacing: 3 spacing: 3
Repeater { Repeater {
-1
View File
@@ -1,6 +1,5 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import qs.Components import qs.Components
import ZShell.Config import ZShell.Config
import qs.Services import qs.Services
+1 -3
View File
@@ -2,7 +2,6 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import Quickshell import Quickshell
import ZShell
import ZShell.Config import ZShell.Config
import qs.Components import qs.Components
import qs.Services import qs.Services
@@ -53,7 +52,7 @@ CustomListView {
highlightFollowsCurrentItem: false highlightFollowsCurrentItem: false
highlightRangeMode: ListView.ApplyRange highlightRangeMode: ListView.ApplyRange
implicitHeight: (Tokens.sizes.launcher.itemHeight + spacing) * Math.min(Config.launcher.maxAppsShown, count) - spacing implicitHeight: (Config.launcher.sizes.itemHeight + spacing) * Math.min(Config.launcher.maxAppsShown, count) - spacing
orientation: Qt.Vertical orientation: Qt.Vertical
preferredHighlightBegin: 0 preferredHighlightBegin: 0
preferredHighlightEnd: height preferredHighlightEnd: height
@@ -98,7 +97,6 @@ CustomListView {
} }
} }
highlight: CustomRect { highlight: CustomRect {
id: hl
color: Colors.palette.m3onSurface color: Colors.palette.m3onSurface
implicitHeight: root.currentItem?.implicitHeight ?? 0 implicitHeight: root.currentItem?.implicitHeight ?? 0
implicitWidth: root.width implicitWidth: root.width
+3 -2
View File
@@ -22,7 +22,7 @@ CarouselView {
delegateProperties: ({ delegateProperties: ({
screenState: root.screenState screenState: root.screenState
}) })
focalWidth: Tokens.sizes.launcher.wallpaperWidth focalWidth: Config.launcher.sizes.wallpaperWidth
glideDuration: 250 glideDuration: 250
glideEasingType: Easing.OutCubic glideEasingType: Easing.OutCubic
implicitHeight: tileHeight + Tokens.spacing.small / 2 + Tokens.padding.large + Tokens.padding.small implicitHeight: tileHeight + Tokens.spacing.small / 2 + Tokens.padding.large + Tokens.padding.small
@@ -41,7 +41,8 @@ CarouselView {
tileHeight: focalWidth / 16 * 9 tileHeight: focalWidth / 16 * 9
delegate: Component { delegate: Component {
WallpaperTile {} WallpaperTile {
}
} }
Component.onDestruction: Wallpapers.stopPreview() Component.onDestruction: Wallpapers.stopPreview()
+2 -3
View File
@@ -2,18 +2,17 @@ pragma ComponentBehavior: Bound
import Quickshell import Quickshell
import QtQuick import QtQuick
import ZShell
import ZShell.Config
import qs.Modules.Launcher.Services import qs.Modules.Launcher.Services
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
import ZShell.Config
import qs.Services import qs.Services
Item { Item {
id: root id: root
required property real maxHeight required property real maxHeight
readonly property int padding: ZUtils.snap(Tokens.padding.medium / 2, root) readonly property int padding: Tokens.padding.largeIncreased / 4
required property var panels required property var panels
readonly property int rounding: Tokens.rounding.largeIncreased readonly property int rounding: Tokens.rounding.largeIncreased
required property ScreenState screenState required property ScreenState screenState
+4 -5
View File
@@ -2,12 +2,11 @@ pragma ComponentBehavior: Bound
import Quickshell import Quickshell
import QtQuick import QtQuick
import ZShell
import ZShell.Config
import qs.Paths import qs.Paths
import qs.Modules import qs.Modules
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
import ZShell.Config
import qs.Services import qs.Services
Item { Item {
@@ -72,7 +71,7 @@ Item {
PropertyChanges { PropertyChanges {
appList.active: true appList.active: true
root.implicitHeight: Math.min(root.maxHeight, appList.implicitHeight > 0 ? appList.implicitHeight : empty.implicitHeight) root.implicitHeight: Math.min(root.maxHeight, appList.implicitHeight > 0 ? appList.implicitHeight : empty.implicitHeight)
root.implicitWidth: Tokens.sizes.launcher.itemWidth root.implicitWidth: Config.launcher.sizes.itemWidth
} }
AnchorChanges { AnchorChanges {
@@ -84,8 +83,8 @@ Item {
name: "wallpapers" name: "wallpapers"
PropertyChanges { PropertyChanges {
root.implicitHeight: Tokens.sizes.launcher.wallpaperHeight root.implicitHeight: Config.launcher.sizes.wallpaperHeight
root.implicitWidth: Math.max(Tokens.sizes.launcher.itemWidth * 1.2, wallpaperList.implicitWidth) root.implicitWidth: Math.max(Config.launcher.sizes.itemWidth * 1.2, wallpaperList.implicitWidth)
wallpaperList.active: true wallpaperList.active: true
} }
} }
+1 -1
View File
@@ -13,7 +13,7 @@ Item {
anchors.left: parent?.left anchors.left: parent?.left
anchors.right: parent?.right anchors.right: parent?.right
implicitHeight: Tokens.sizes.launcher.itemHeight implicitHeight: Config.launcher.sizes.itemHeight
StateLayer { StateLayer {
radius: Tokens.rounding.medium radius: Tokens.rounding.medium
+18 -42
View File
@@ -1,13 +1,10 @@
import Quickshell import Quickshell
import Quickshell.Widgets import Quickshell.Widgets
import QtQuick import QtQuick
import QtQuick.Layouts
import ZShell.Config
import ZShell.Components
import ZShell
import qs.Modules.Launcher.Services import qs.Modules.Launcher.Services
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
import ZShell.Config
import qs.Modules import qs.Modules
import qs.Services import qs.Services
@@ -19,72 +16,53 @@ Item {
anchors.left: parent?.left anchors.left: parent?.left
anchors.right: parent?.right anchors.right: parent?.right
implicitHeight: ZUtils.snap(Tokens.sizes.launcher.itemHeight, root) implicitHeight: Config.launcher.sizes.itemHeight
StateLayer { StateLayer {
radius: Tokens.rounding.medium radius: Tokens.rounding.medium
onClicked: { onClicked: {
// Apps.launch(root.modelData); Apps.launch(root.modelData);
// root.screenState.launcher = false; 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");
} }
} }
SnapLayout { Item {
id: mainLayout
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: Tokens.padding.medium anchors.leftMargin: Tokens.padding.medium
anchors.margins: Tokens.padding.small
anchors.rightMargin: Tokens.padding.medium anchors.rightMargin: Tokens.padding.medium
spacing: Tokens.spacing.medium
IconImage { IconImage {
id: icon id: icon
implicitSize: parent.height - Tokens.padding.small * 2 anchors.verticalCenter: parent.verticalCenter
implicitSize: parent.height
source: Quickshell.iconPath(root.modelData?.icon, "image-missing") source: Quickshell.iconPath(root.modelData?.icon, "image-missing")
} }
SnapLayout { Item {
id: text anchors.left: icon.right
anchors.leftMargin: Tokens.spacing.medium
Layout.fillHeight: true anchors.verticalCenter: icon.verticalCenter
Layout.fillWidth: true implicitHeight: name.implicitHeight + comment.implicitHeight
Layout.topMargin: Tokens.padding.extraSmall implicitWidth: parent.width - icon.width
Layout.bottomMargin: Tokens.padding.extraSmall
orientation: Qt.Vertical
spacing: 0
CustomText { CustomText {
id: name id: name
Layout.fillHeight: true
Layout.fillWidth: true
text: root.modelData?.name ?? "" text: root.modelData?.name ?? ""
verticalAlignment: CustomText.AlignVCenter
horizontalAlignment: CustomText.AlignLeft
} }
CustomText { CustomText {
id: comment id: comment
Layout.fillHeight: true anchors.top: name.bottom
Layout.fillWidth: true
color: Colors.palette.m3outline color: Colors.palette.m3outline
elide: Text.ElideRight elide: Text.ElideRight
font: Tokens.font.body.small font: Tokens.font.body.small
text: (root.modelData?.comment || root.modelData?.genericName || root.modelData?.name) ?? "" text: (root.modelData?.comment || root.modelData?.genericName || root.modelData?.name) ?? ""
verticalAlignment: CustomText.AlignVCenter width: root.width - icon.width - Tokens.rounding.medium - Tokens.padding.medium * 2
horizontalAlignment: CustomText.AlignLeft
} }
} }
@@ -92,16 +70,14 @@ Item {
id: favoriteIcon id: favoriteIcon
active: root.modelData && Strings.testRegexList(Config.launcher.favoriteApps, root.modelData.id) active: root.modelData && Strings.testRegexList(Config.launcher.favoriteApps, root.modelData.id)
Layout.fillHeight: true anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
asynchronous: true asynchronous: true
sourceComponent: MaterialIcon { sourceComponent: MaterialIcon {
color: Colors.palette.m3primary color: Colors.palette.m3primary
fill: 1 fill: 1
text: "favorite" text: "favorite"
verticalAlignment: MaterialIcon.AlignVCenter
} }
} }
} }
+1 -2
View File
@@ -2,7 +2,6 @@ import ZShell
import Quickshell import Quickshell
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import qs.Components import qs.Components
import qs.Modules import qs.Modules
import qs.Helpers import qs.Helpers
@@ -32,7 +31,7 @@ Item {
} }
} }
SnapLayout { RowLayout {
anchors.left: parent.left anchors.left: parent.left
anchors.margins: Tokens.padding.small anchors.margins: Tokens.padding.small
anchors.right: parent.right anchors.right: parent.right
+4 -9
View File
@@ -2,15 +2,14 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Config
import ZShell.Components
import qs.Paths import qs.Paths
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
import ZShell.Config
import qs.Modules import qs.Modules
import qs.Services import qs.Services
SnapLayout { ColumnLayout {
id: root id: root
readonly property real centerScale: Math.min(1, (lock.screen?.height ?? 1440) / 1440) readonly property real centerScale: Math.min(1, (lock.screen?.height ?? 1440) / 1440)
@@ -20,13 +19,10 @@ SnapLayout {
Layout.fillHeight: true Layout.fillHeight: true
Layout.fillWidth: false Layout.fillWidth: false
Layout.preferredWidth: centerWidth Layout.preferredWidth: centerWidth
orientation: Qt.Vertical
spacing: Tokens.spacing.largeIncreased * 2 spacing: Tokens.spacing.largeIncreased * 2
SnapLayout { RowLayout {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
spacing: Tokens.spacing.small spacing: Tokens.spacing.small
CustomText { CustomText {
@@ -113,12 +109,11 @@ SnapLayout {
} }
} }
SnapLayout { RowLayout {
id: input id: input
anchors.fill: parent anchors.fill: parent
anchors.margins: Tokens.padding.extraSmall anchors.margins: Tokens.padding.extraSmall
spacing: Tokens.spacing.medium spacing: Tokens.spacing.medium
Item { Item {
+4 -8
View File
@@ -1,9 +1,8 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
import ZShell.Config
import qs.Services import qs.Services
Item { Item {
@@ -14,18 +13,15 @@ Item {
implicitHeight: layout.implicitHeight implicitHeight: layout.implicitHeight
implicitWidth: layout.implicitWidth implicitWidth: layout.implicitWidth
SnapLayout { RowLayout {
id: layout id: layout
anchors.fill: parent anchors.fill: parent
spacing: Tokens.spacing.largeIncreased * 2 spacing: Tokens.spacing.largeIncreased * 2
SnapLayout { ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
spacing: Tokens.spacing.medium spacing: Tokens.spacing.medium
orientation: Qt.Vertical
WeatherInfo { WeatherInfo {
id: weather id: weather
@@ -54,8 +50,8 @@ Item {
} }
NotifDock { NotifDock {
Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true
Layout.fillWidth: true
lock: root.lock lock: root.lock
} }
} }
-1
View File
@@ -3,7 +3,6 @@ pragma ComponentBehavior: Bound
import Quickshell import Quickshell
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import qs.Modules import qs.Modules
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
+1 -3
View File
@@ -48,16 +48,14 @@ Item {
} }
} }
SnapLayout { ColumnLayout {
id: layout id: layout
anchors.left: parent.left anchors.left: parent.left
anchors.margins: Tokens.padding.extraLarge anchors.margins: Tokens.padding.extraLarge
anchors.right: parent.right anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
spacing: Tokens.spacing.extraSmall spacing: Tokens.spacing.extraSmall
orientation: Qt.Vertical
CustomText { CustomText {
Layout.fillWidth: true Layout.fillWidth: true
+11 -9
View File
@@ -4,11 +4,10 @@ import Quickshell
import Quickshell.Widgets import Quickshell.Widgets
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import qs.Modules import qs.Modules
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
import ZShell.Config
import qs.Daemons import qs.Daemons
import qs.Services import qs.Services
@@ -22,11 +21,9 @@ CustomRect {
radius: Tokens.rounding.small radius: Tokens.rounding.small
topRightRadius: Tokens.rounding.largeIncreased topRightRadius: Tokens.rounding.largeIncreased
SnapLayout { ColumnLayout {
anchors.fill: parent anchors.fill: parent
anchors.margins: Tokens.padding.large anchors.margins: Tokens.padding.large
orientation: Qt.Vertical
spacing: Tokens.spacing.small spacing: Tokens.spacing.small
CustomText { CustomText {
@@ -51,10 +48,15 @@ CustomRect {
duration: Tokens.anim.durations.extraLarge duration: Tokens.anim.durations.extraLarge
} }
} }
sourceComponent: CustomText { sourceComponent: ColumnLayout {
color: Colors.palette.m3outlineVariant spacing: Tokens.spacing.largeIncreased
font: Tokens.font.headline.builders.small.width(90).build()
text: qsTr("No Notifications") CustomText {
Layout.alignment: Qt.AlignHCenter
color: Colors.palette.m3outlineVariant
font: Tokens.font.headline.builders.small.width(90).build()
text: qsTr("No Notifications")
}
} }
} }
+6 -15
View File
@@ -5,11 +5,10 @@ import Quickshell.Widgets
import Quickshell.Services.Notifications import Quickshell.Services.Notifications
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import qs.Modules import qs.Modules
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
import ZShell.Config
import qs.Daemons import qs.Daemons
import qs.Services import qs.Services
@@ -37,14 +36,13 @@ CustomRect {
} }
} }
SnapLayout { RowLayout {
id: content id: content
anchors.left: parent.left anchors.left: parent.left
anchors.margins: Tokens.padding.small anchors.margins: Tokens.padding.small
anchors.right: parent.right anchors.right: parent.right
anchors.top: parent.top anchors.top: parent.top
spacing: Tokens.spacing.medium spacing: Tokens.spacing.medium
Item { Item {
@@ -120,18 +118,15 @@ CustomRect {
} }
} }
SnapLayout { ColumnLayout {
Layout.bottomMargin: -Tokens.padding.extraSmall / 2 - (root.expanded ? 0 : spacing) Layout.bottomMargin: -Tokens.padding.extraSmall / 2 - (root.expanded ? 0 : spacing)
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: -Tokens.padding.extraSmall Layout.topMargin: -Tokens.padding.extraSmall
spacing: Math.round(Tokens.spacing.small / 2) spacing: Math.round(Tokens.spacing.small / 2)
orientation: Qt.Vertical
SnapLayout { RowLayout {
Layout.bottomMargin: -parent.spacing Layout.bottomMargin: -parent.spacing
Layout.fillWidth: true Layout.fillWidth: true
spacing: Tokens.spacing.small spacing: Tokens.spacing.small
CustomText { CustomText {
@@ -172,11 +167,10 @@ CustomRect {
} }
} }
SnapLayout { RowLayout {
id: expandBtn id: expandBtn
anchors.centerIn: parent anchors.centerIn: parent
spacing: Tokens.spacing.small / 2 spacing: Tokens.spacing.small / 2
CustomText { CustomText {
@@ -267,10 +261,7 @@ CustomRect {
Behavior on opacity { Behavior on opacity {
Anim {} Anim {}
} }
sourceComponent: SnapLayout { sourceComponent: ColumnLayout {
orientation: Qt.Vertical
spacing: Tokens.spacing.extraSmall
Repeater { Repeater {
model: ScriptModel { model: ScriptModel {
values: root.notifs.slice(Config.notifs.groupPreviewNum) values: root.notifs.slice(Config.notifs.groupPreviewNum)
+1 -3
View File
@@ -5,7 +5,6 @@ import QtQuick.Layouts
import M3Shapes import M3Shapes
import ZShell.Services import ZShell.Services
import ZShell.Config import ZShell.Config
import ZShell.Components
import qs.Components import qs.Components
import qs.Effects import qs.Effects
import qs.Services import qs.Services
@@ -34,12 +33,11 @@ CustomRect {
service: Storage service: Storage
} }
SnapLayout { RowLayout {
id: layout id: layout
anchors.fill: parent anchors.fill: parent
anchors.margins: Tokens.padding.large anchors.margins: Tokens.padding.large
spacing: Tokens.spacing.largeIncreased spacing: Tokens.spacing.largeIncreased
Resource { Resource {
+2 -4
View File
@@ -1,13 +1,11 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import qs.Components import qs.Components
import ZShell.Config import ZShell.Config
import qs.Helpers import qs.Helpers
import qs.Services import qs.Services
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
id: root id: root
required property int rootHeight required property int rootHeight
@@ -22,7 +20,7 @@ orientation: Qt.Vertical
text: Weather.description text: Weather.description
} }
SnapLayout { RowLayout {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
spacing: Tokens.spacing.small spacing: Tokens.spacing.small
+2 -4
View File
@@ -1,6 +1,5 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import M3Shapes import M3Shapes
import ZShell import ZShell
import qs.Components import qs.Components
@@ -15,7 +14,7 @@ CustomRect {
implicitHeight: header.anchors.margins + header.implicitHeight + Tokens.spacing.small + layout.implicitHeight + layout.anchors.bottomMargin implicitHeight: header.anchors.margins + header.implicitHeight + Tokens.spacing.small + layout.implicitHeight + layout.anchors.bottomMargin
radius: Tokens.rounding.small radius: Tokens.rounding.small
SnapLayout { RowLayout {
id: header id: header
anchors.left: parent.left anchors.left: parent.left
@@ -56,8 +55,7 @@ CustomRect {
orientation: VerticalFadeListView.Horizontal orientation: VerticalFadeListView.Horizontal
spacing: Tokens.spacing.medium spacing: Tokens.spacing.medium
delegate: SnapLayout { delegate: ColumnLayout {
orientation: Qt.Vertical
id: hour id: hour
readonly property bool current: ListView.view.currentItem === this readonly property bool current: ListView.view.currentItem === this
+13 -17
View File
@@ -2,11 +2,9 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell
import ZShell.Config
import ZShell.Components
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
import ZShell.Config
import qs.Daemons import qs.Daemons
import qs.Services import qs.Services
@@ -21,17 +19,14 @@ Item {
required property ScreenState screenState required property ScreenState screenState
required property real volume required property real volume
implicitHeight: layout.implicitHeight + layout.anchors.margins * 2 implicitHeight: layout.implicitHeight + Tokens.padding.smaller * 2
implicitWidth: layout.implicitWidth + layout.anchors.margins * 2 implicitWidth: layout.implicitWidth + Tokens.padding.smaller * 2
SnapLayout { ColumnLayout {
id: layout id: layout
anchors.fill: parent anchors.centerIn: parent
anchors.margins: Tokens.padding.extraSmall
spacing: Tokens.spacing.medium spacing: Tokens.spacing.medium
orientation: Qt.Vertical
// Speaker volume // Speaker volume
CustomMouseArea { CustomMouseArea {
@@ -42,8 +37,8 @@ Item {
Audio.decrementVolume(); Audio.decrementVolume();
} }
implicitHeight: ZUtils.snap(Config.osd.sizes.sliderHeight, root) implicitHeight: Config.osd.sizes.sliderHeight
implicitWidth: ZUtils.snap(Config.osd.sizes.sliderWidth, root) implicitWidth: Config.osd.sizes.sliderWidth
FilledSlider { FilledSlider {
anchors.fill: parent anchors.fill: parent
@@ -68,8 +63,8 @@ Item {
Audio.decrementSourceVolume(); Audio.decrementSourceVolume();
} }
implicitHeight: ZUtils.snap(Config.osd.sizes.sliderHeight, root) implicitHeight: Config.osd.sizes.sliderHeight
implicitWidth: ZUtils.snap(Config.osd.sizes.sliderWidth, root) implicitWidth: Config.osd.sizes.sliderWidth
FilledSlider { FilledSlider {
anchors.fill: parent anchors.fill: parent
@@ -98,8 +93,8 @@ Item {
monitor.setBrightness(monitor.brightness - Config.services.brightnessIncrement); monitor.setBrightness(monitor.brightness - Config.services.brightnessIncrement);
} }
implicitHeight: ZUtils.snap(Config.osd.sizes.sliderHeight, root) implicitHeight: Config.osd.sizes.sliderHeight
implicitWidth: ZUtils.snap(Config.osd.sizes.sliderWidth, root) implicitWidth: Config.osd.sizes.sliderWidth
FilledSlider { FilledSlider {
anchors.fill: parent anchors.fill: parent
@@ -136,7 +131,8 @@ Item {
} }
} }
Behavior on opacity { Behavior on opacity {
Anim {} Anim {
}
} }
} }
} }
+5 -5
View File
@@ -2,10 +2,9 @@ pragma ComponentBehavior: Bound
import Quickshell import Quickshell
import QtQuick import QtQuick
import ZShell
import ZShell.Config
import qs.Components import qs.Components
import qs.Helpers import qs.Helpers
import ZShell.Config
import qs.Daemons import qs.Daemons
Item { Item {
@@ -31,8 +30,8 @@ Item {
} }
anchors.rightMargin: (-implicitWidth - 5 - sidebarOffset) * offsetScale anchors.rightMargin: (-implicitWidth - 5 - sidebarOffset) * offsetScale
implicitHeight: ZUtils.snap(content.implicitHeight, root) implicitHeight: content.implicitHeight
implicitWidth: ZUtils.snap(content.implicitWidth, root) implicitWidth: content.implicitWidth
opacity: 1 - offsetScale opacity: 1 - offsetScale
visible: offsetScale < 1 visible: offsetScale < 1
@@ -99,7 +98,8 @@ Item {
id: content id: content
active: root.shouldBeActive || root.visible active: root.shouldBeActive || root.visible
anchors.fill: parent anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
sourceComponent: Content { sourceComponent: Content {
brightness: root.brightness brightness: root.brightness
+5 -14
View File
@@ -83,16 +83,13 @@ Scope {
opacity: 0 opacity: 0
radius: Tokens.rounding.small * 2 radius: Tokens.rounding.small * 2
SnapLayout { ColumnLayout {
id: layout id: layout
anchors.fill: parent anchors.fill: parent
anchors.margins: Tokens.padding.medium anchors.margins: Tokens.padding.medium
spacing: Tokens.spacing.extraSmall RowLayout {
orientation: Qt.Vertical
SnapLayout {
id: contentRow id: contentRow
spacing: 24 spacing: 24
@@ -123,15 +120,12 @@ Scope {
} }
} }
SnapLayout { ColumnLayout {
id: contentColumn id: contentColumn
Layout.fillHeight: true Layout.fillHeight: true
Layout.fillWidth: true Layout.fillWidth: true
spacing: Tokens.spacing.extraSmall
orientation: Qt.Vertical
CustomText { CustomText {
Layout.alignment: Qt.AlignLeft Layout.alignment: Qt.AlignLeft
Layout.preferredWidth: Math.min(600, contentWidth) Layout.preferredWidth: Math.min(600, contentWidth)
@@ -216,15 +210,13 @@ Scope {
} }
} }
SnapLayout { ColumnLayout {
id: textDetailsColumn id: textDetailsColumn
anchors.fill: parent anchors.fill: parent
anchors.margins: Tokens.padding.small anchors.margins: Tokens.padding.small
opacity: 0 opacity: 0
spacing: Tokens.spacing.small spacing: Tokens.spacing.small
orientation: Qt.Vertical
CustomText { CustomText {
text: `actionId: ${polkitAgent.flow?.actionId}` text: `actionId: ${polkitAgent.flow?.actionId}`
@@ -238,9 +230,8 @@ Scope {
} }
} }
SnapLayout { RowLayout {
Layout.preferredWidth: contentRow.implicitWidth Layout.preferredWidth: contentRow.implicitWidth
spacing: 8 spacing: 8
IconButton { IconButton {
+2 -4
View File
@@ -1,6 +1,5 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import Quickshell.Services.UPower import Quickshell.Services.UPower
import ZShell.Config import ZShell.Config
import qs.Components import qs.Components
@@ -51,8 +50,7 @@ ClipRect {
} }
} }
component Contents: SnapLayout { component Contents: ColumnLayout {
orientation: Qt.Vertical
id: contents id: contents
required property color accentColor required property color accentColor
@@ -102,7 +100,7 @@ orientation: Qt.Vertical
} }
} }
SnapLayout { RowLayout {
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
Layout.bottomMargin: -Tokens.padding.extraSmall Layout.bottomMargin: -Tokens.padding.extraSmall
Layout.rightMargin: -Tokens.padding.extraSmall Layout.rightMargin: -Tokens.padding.extraSmall
+11 -19
View File
@@ -1,7 +1,5 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell
import ZShell.Components
import ZShell.Config import ZShell.Config
import qs.Components import qs.Components
import qs.Services import qs.Services
@@ -17,8 +15,8 @@ CustomRect {
required property real usage required property real usage
color: Colors.tPalette.m3surfaceContainer color: Colors.tPalette.m3surfaceContainer
implicitHeight: ZUtils.snap(Math.max(tempProg.implicitHeight + detailsRow.implicitHeight + Tokens.spacing.largeIncreased, usageColumn.implicitHeight + usageLabel.implicitHeight) + Tokens.padding.large * 2, root) implicitHeight: Math.max(tempProg.implicitHeight + detailsRow.implicitHeight + Tokens.spacing.largeIncreased, usageColumn.implicitHeight + usageLabel.implicitHeight) + Tokens.padding.large * 2
implicitWidth: ZUtils.snapCeil(450, root) implicitWidth: 450
radius: Tokens.rounding.largeIncreased radius: Tokens.rounding.largeIncreased
ClipRect { ClipRect {
@@ -45,7 +43,7 @@ CustomRect {
anchors.margins: Tokens.padding.large anchors.margins: Tokens.padding.large
anchors.top: parent.top anchors.top: parent.top
fgColor: root.accent fgColor: root.accent
implicitSize: ZUtils.snap(Math.max(icon.implicitWidth, icon.implicitHeight) + Tokens.padding.small * 2, root) implicitSize: Math.max(icon.implicitWidth, icon.implicitHeight) + Tokens.padding.small * 2
spacing: Tokens.spacing.extraSmall spacing: Tokens.spacing.extraSmall
strokeWidth: Tokens.padding.extraSmall strokeWidth: Tokens.padding.extraSmall
value: root.usage value: root.usage
@@ -64,14 +62,12 @@ CustomRect {
} }
} }
SnapLayout { ColumnLayout {
anchors.left: tempProg.right anchors.left: tempProg.right
anchors.margins: Tokens.spacing.largeIncreased anchors.margins: Tokens.spacing.largeIncreased
anchors.right: usageColumn.left anchors.right: usageColumn.left
anchors.verticalCenter: tempProg.verticalCenter anchors.verticalCenter: tempProg.verticalCenter
spacing: Tokens.spacing.extraSmall spacing: Tokens.spacing.extraSmall
orientation: Qt.Vertical
CustomText { CustomText {
color: root.accent color: root.accent
@@ -86,17 +82,15 @@ CustomRect {
} }
} }
SnapLayout { ColumnLayout {
id: detailsRow id: detailsRow
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.left: parent.left anchors.left: parent.left
anchors.margins: Tokens.padding.largeIncreased anchors.margins: Tokens.padding.largeIncreased
spacing: Tokens.spacing.extraSmall spacing: Tokens.spacing.extraSmall
orientation: Qt.Vertical
SnapLayout { RowLayout {
Layout.leftMargin: -Tokens.padding.extraSmall Layout.leftMargin: -Tokens.padding.extraSmall
spacing: Tokens.spacing.extraSmall spacing: Tokens.spacing.extraSmall
@@ -114,34 +108,32 @@ CustomRect {
CustomProgressBar { CustomProgressBar {
fgColor: root.accent fgColor: root.accent
implicitHeight: Tokens.padding.small implicitHeight: Tokens.padding.extraSmall
indeterminate: isNaN(root.usage) || isNaN(root.temperature) indeterminate: isNaN(root.usage) || isNaN(root.temperature)
value: root.temperature / 100 value: root.temperature / 100
} }
} }
SnapLayout { Column {
id: usageColumn id: usageColumn
anchors.margins: Tokens.padding.large anchors.margins: Tokens.padding.large
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: Tokens.padding.extraLarge anchors.rightMargin: 32
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
spacing: 0 spacing: 0
orientation: Qt.Vertical
CustomText { CustomText {
id: usageLabel id: usageLabel
Layout.alignment: Qt.AlignRight anchors.right: parent.right
color: Colors.palette.m3onSurfaceVariant color: Colors.palette.m3onSurfaceVariant
font: Tokens.font.body.medium font: Tokens.font.body.medium
text: qsTr("Usage") text: qsTr("Usage")
} }
CustomText { CustomText {
Layout.alignment: Qt.AlignRight anchors.right: parent.right
color: root.accent color: root.accent
font: Tokens.font.headline.builders.small.width(50).build() font: Tokens.font.headline.builders.small.width(50).build()
text: isNaN(root.usage) ? "...%" : Math.round(root.usage * 100) + "%" text: isNaN(root.usage) ? "...%" : Math.round(root.usage * 100) + "%"
+17 -24
View File
@@ -1,7 +1,5 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell
import ZShell.Components
import ZShell.Services import ZShell.Services
import ZShell.Config import ZShell.Config
import qs.Components import qs.Components
@@ -12,39 +10,34 @@ CustomRect {
readonly property color accent: Colors.palette.m3tertiary 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 Layout.fillWidth: true
color: Colors.tPalette.m3surfaceContainer color: Colors.tPalette.m3surfaceContainer
implicitHeight: layout.implicitHeight + Tokens.padding.large * 2 implicitHeight: layout.implicitHeight + Tokens.padding.large * 2
implicitWidth: layout.implicitWidth + Tokens.padding.extraLargeIncreased * 2 implicitWidth: layout.implicitWidth + Tokens.padding.extraLargeIncreased * 2
radius: Tokens.rounding.largeIncreased radius: Tokens.rounding.largeIncreased
SnapLayout { ServiceRef {
service: Memory
}
ColumnLayout {
id: layout id: layout
anchors.left: parent.left anchors.centerIn: parent
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
orientation: Qt.Vertical
spacing: Tokens.spacing.extraSmall spacing: Tokens.spacing.extraSmall
SnapLayout { RowLayout {
Layout.alignment: Qt.AlignHCenter Layout.leftMargin: -Tokens.padding.extraSmall
spacing: Tokens.spacing.small spacing: Tokens.spacing.small
MaterialIcon { MaterialIcon {
color: root.accent color: root.accent
fill: 1 fill: 1
text: root.icon text: "memory_alt"
} }
CustomText { CustomText {
text: root.label text: qsTr("Memory")
} }
} }
@@ -52,17 +45,17 @@ CustomRect {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
Layout.topMargin: Tokens.spacing.largeIncreased Layout.topMargin: Tokens.spacing.largeIncreased
fgColor: root.accent fgColor: root.accent
implicitSize: ZUtils.snap(usageColumn.implicitHeight + thickness + Tokens.padding.largeIncreased * 2, root) implicitSize: usageColumn.implicitHeight + thickness + Tokens.padding.largeIncreased * 2
startAngle: -225 startAngle: -225
sweepAngle: 270 sweepAngle: 270
value: root.perc value: Memory.percentage
Behavior on clampedVal { Behavior on clampedVal {
Anim {} Anim {
}
} }
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
id: usageColumn id: usageColumn
anchors.centerIn: parent anchors.centerIn: parent
@@ -73,7 +66,7 @@ orientation: Qt.Vertical
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
color: root.accent color: root.accent
font: Tokens.font.body.large font: Tokens.font.body.large
text: Math.round(root.perc * 100) + "%" text: Math.round(Memory.percentage * 100) + "%"
} }
CustomText { CustomText {
@@ -87,7 +80,7 @@ orientation: Qt.Vertical
CustomText { CustomText {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
text: { text: {
const fmt = UsageFmt.formatKib(root.used, root.total); const fmt = UsageFmt.formatKib(Memory.used, Memory.total);
return `${fmt.value.toFixed(1)} / ${Math.floor(fmt.total)} ${fmt.unit}`; return `${fmt.value.toFixed(1)} / ${Math.floor(fmt.total)} ${fmt.unit}`;
} }
} }
+5 -16
View File
@@ -18,17 +18,15 @@ CustomRect {
service: NetworkUsage service: NetworkUsage
} }
SnapLayout { ColumnLayout {
id: layout id: layout
anchors.bottomMargin: Tokens.padding.small anchors.bottomMargin: Tokens.padding.small
anchors.fill: parent anchors.fill: parent
anchors.margins: Tokens.padding.large anchors.margins: Tokens.padding.large
spacing: 0 spacing: 0
orientation: Qt.Vertical
SnapLayout { RowLayout {
spacing: Tokens.spacing.small spacing: Tokens.spacing.small
MaterialIcon { MaterialIcon {
@@ -110,11 +108,8 @@ CustomRect {
} }
// Download row // Download row
SnapLayout { RowLayout {
Layout.fillWidth: true Layout.fillWidth: true
Layout.maximumWidth: root.width > root.implicitWidth * 2 ? root.width / 2 : -1
Layout.alignment: Qt.AlignRight
spacing: Tokens.spacing.small spacing: Tokens.spacing.small
MaterialIcon { MaterialIcon {
@@ -141,11 +136,8 @@ CustomRect {
} }
// Upload row // Upload row
SnapLayout { RowLayout {
Layout.fillWidth: true Layout.fillWidth: true
Layout.maximumWidth: root.width > root.implicitWidth * 2 ? root.width / 2 : -1
Layout.alignment: Qt.AlignRight
spacing: Tokens.spacing.small spacing: Tokens.spacing.small
MaterialIcon { MaterialIcon {
@@ -172,11 +164,8 @@ CustomRect {
} }
// Session totals // Session totals
SnapLayout { RowLayout {
Layout.fillWidth: true Layout.fillWidth: true
Layout.maximumWidth: root.width > root.implicitWidth * 2 ? root.width / 2 : -1
Layout.alignment: Qt.AlignRight
spacing: Tokens.spacing.small spacing: Tokens.spacing.small
MaterialIcon { MaterialIcon {
+5 -12
View File
@@ -1,8 +1,6 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import Quickshell import Quickshell
import ZShell
import ZShell.Components
import ZShell.Services import ZShell.Services
import ZShell.Config import ZShell.Config
import qs.Components import qs.Components
@@ -23,26 +21,23 @@ CustomRect {
service: Storage service: Storage
} }
SnapLayout { ColumnLayout {
id: layout id: layout
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
spacing: 0 spacing: 0
orientation: Qt.Vertical
SnapLayout { RowLayout {
id: row id: row
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
spacing: Tokens.spacing.largeIncreased spacing: Tokens.spacing.largeIncreased
CircularProgress { CircularProgress {
fgColor: root.accent fgColor: root.accent
implicitSize: ZUtils.snap(usageColumn.implicitHeight + thickness + Tokens.padding.large * 2, root) implicitSize: usageColumn.implicitHeight + thickness + Tokens.padding.large * 2
startAngle: -225 startAngle: -225
sweepAngle: 270 sweepAngle: 270
value: root.percentage value: root.percentage
@@ -51,8 +46,7 @@ CustomRect {
Anim {} Anim {}
} }
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
id: usageColumn id: usageColumn
anchors.centerIn: parent anchors.centerIn: parent
@@ -80,9 +74,8 @@ orientation: Qt.Vertical
} }
} }
SnapLayout { ColumnLayout {
spacing: Tokens.spacing.extraSmall spacing: Tokens.spacing.extraSmall
orientation: Qt.Vertical
CustomText { CustomText {
text: qsTr("Storage") text: qsTr("Storage")
+89
View File
@@ -0,0 +1,89 @@
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}`;
}
}
}
}
+18 -34
View File
@@ -1,10 +1,7 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell
import ZShell.Components
import ZShell.Services import ZShell.Services
import ZShell.Config import ZShell.Config
import qs.Components
import qs.Modules.Resources.Cards import qs.Modules.Resources.Cards
import qs.Helpers import qs.Helpers
import qs.Services import qs.Services
@@ -14,25 +11,25 @@ Item {
required property Wrapper wrapper required property Wrapper wrapper
implicitHeight: ZUtils.snap(content.implicitHeight + Tokens.padding.small * 2, root) implicitHeight: content.implicitHeight + Tokens.padding.small * 2
implicitWidth: ZUtils.snap(content.implicitWidth, root) implicitWidth: content.implicitWidth
SnapLayout { RowLayout {
id: content id: content
anchors.fill: parent anchors.left: parent.left
anchors.margins: Tokens.padding.small anchors.margins: Tokens.padding.small
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
spacing: Tokens.spacing.large spacing: Tokens.spacing.large
SnapLayout { ColumnLayout {
id: mainColumn id: mainColumn
Layout.fillWidth: true Layout.fillWidth: true
spacing: Tokens.spacing.medium spacing: Tokens.spacing.medium
orientation: Qt.Vertical
SnapLayout { RowLayout {
id: hero
spacing: Tokens.spacing.medium spacing: Tokens.spacing.medium
visible: cpuCard.active || gpuCard.active visible: cpuCard.active || gpuCard.active
@@ -75,10 +72,7 @@ Item {
} }
} }
SnapLayout { RowLayout {
id: card
Layout.fillWidth: true
spacing: Tokens.spacing.medium spacing: Tokens.spacing.medium
visible: storageCard.active || memoryCard.active || vramCard.active || networkCard1.active visible: storageCard.active || memoryCard.active || vramCard.active || networkCard1.active
@@ -87,7 +81,8 @@ Item {
active: Config.dashboard.performance.showStorage active: Config.dashboard.performance.showStorage
sourceComponent: StorageCard {} sourceComponent: StorageCard {
}
} }
WrappedLoader { WrappedLoader {
@@ -96,15 +91,6 @@ Item {
active: Config.dashboard.performance.showMemory active: Config.dashboard.performance.showMemory
sourceComponent: MemoryCard { sourceComponent: MemoryCard {
used: Memory.used
total: Memory.total
perc: Memory.percentage
label: qsTr("Memory")
icon: "memory_alt"
ServiceRef {
service: Memory
}
} }
} }
@@ -113,12 +99,7 @@ Item {
active: Config.dashboard.performance.showVram active: Config.dashboard.performance.showVram
sourceComponent: MemoryCard { sourceComponent: VramCard {
used: Gpu.memoryUsed
total: Gpu.memoryTotal
perc: Gpu.memoryUsed / Gpu.memoryTotal
label: qsTr("Video memory")
icon: "memory_alt"
} }
} }
@@ -127,7 +108,8 @@ Item {
active: Config.dashboard.performance.showNetwork && !vramCard.active active: Config.dashboard.performance.showNetwork && !vramCard.active
sourceComponent: NetworkCard {} sourceComponent: NetworkCard {
}
} }
} }
@@ -136,7 +118,8 @@ Item {
active: Config.dashboard.performance.showNetwork && vramCard.active active: Config.dashboard.performance.showNetwork && vramCard.active
sourceComponent: NetworkCard {} sourceComponent: NetworkCard {
}
} }
} }
@@ -144,7 +127,8 @@ Item {
Layout.fillWidth: false Layout.fillWidth: false
active: Battery.isLaptop && Config.dashboard.performance.showBattery active: Battery.isLaptop && Config.dashboard.performance.showBattery
sourceComponent: BatteryTank {} sourceComponent: BatteryTank {
}
} }
} }
+1 -2
View File
@@ -2,7 +2,6 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import Quickshell import Quickshell
import Quickshell.Services.Pipewire import Quickshell.Services.Pipewire
import qs.Components import qs.Components
@@ -40,7 +39,7 @@ ItemList {
onClicked: root.selected(device.modelData) onClicked: root.selected(device.modelData)
} }
SnapLayout { RowLayout {
id: deviceLayout id: deviceLayout
anchors.fill: parent anchors.fill: parent
+2 -4
View File
@@ -2,7 +2,6 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import ZShell.Blobs import ZShell.Blobs
import qs.Components import qs.Components
import ZShell.Config import ZShell.Config
@@ -182,8 +181,7 @@ Item {
onWheel: event => event.accepted = true onWheel: event => event.accepted = true
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
anchors.bottomMargin: Tokens.padding.largeIncreased anchors.bottomMargin: Tokens.padding.largeIncreased
anchors.fill: parent anchors.fill: parent
anchors.margins: Tokens.padding.extraLarge anchors.margins: Tokens.padding.extraLarge
@@ -224,7 +222,7 @@ orientation: Qt.Vertical
} }
} }
SnapLayout { RowLayout {
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
spacing: Tokens.spacing.extraSmall spacing: Tokens.spacing.extraSmall
+2 -4
View File
@@ -2,7 +2,6 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import qs.Components import qs.Components
import ZShell.Config import ZShell.Config
import qs.Services import qs.Services
@@ -30,7 +29,7 @@ ConnectedRect {
} }
} }
SnapLayout { RowLayout {
id: rowLayout id: rowLayout
anchors.fill: parent anchors.fill: parent
@@ -45,8 +44,7 @@ ConnectedRect {
visible: root.leadingComponent visible: root.leadingComponent
} }
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
Layout.fillWidth: true Layout.fillWidth: true
spacing: 0 spacing: 0
+1 -3
View File
@@ -2,7 +2,6 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import qs.Components import qs.Components
import ZShell.Config import ZShell.Config
import qs.Services import qs.Services
@@ -39,8 +38,7 @@ ConnectedRect {
type: Anim.DefaultEffects type: Anim.DefaultEffects
} }
} }
sourceComponent: SnapLayout { sourceComponent: ColumnLayout {
orientation: Qt.Vertical
spacing: Tokens.spacing.extraSmall spacing: Tokens.spacing.extraSmall
MaterialIcon { MaterialIcon {
+1 -2
View File
@@ -2,7 +2,6 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import Quickshell import Quickshell
import ZShell.Config import ZShell.Config
import qs.Components import qs.Components
@@ -266,7 +265,7 @@ ListView {
} }
} }
SnapLayout { RowLayout {
id: row id: row
anchors.fill: parent anchors.fill: parent
+2 -4
View File
@@ -2,13 +2,12 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import qs.Modules.Settings import qs.Modules.Settings
import qs.Components import qs.Components
import ZShell.Config import ZShell.Config
import qs.Services import qs.Services
SnapLayout { ColumnLayout {
id: root id: root
property bool animateScroll: false property bool animateScroll: false
@@ -68,7 +67,6 @@ SnapLayout {
} }
spacing: Tokens.spacing.largeIncreased spacing: Tokens.spacing.largeIncreased
orientation: Qt.Vertical
Component.onCompleted: applySearchAnchor() Component.onCompleted: applySearchAnchor()
@@ -120,7 +118,7 @@ SnapLayout {
onClicked: focus = true onClicked: focus = true
SnapLayout { RowLayout {
id: header id: header
spacing: Tokens.spacing.largeIncreased spacing: Tokens.spacing.largeIncreased
+2 -4
View File
@@ -1,6 +1,5 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import Quickshell import Quickshell
import qs.Components import qs.Components
import ZShell.Config import ZShell.Config
@@ -28,7 +27,7 @@ ConnectedRect {
onClicked: popup.open = true onClicked: popup.open = true
} }
SnapLayout { RowLayout {
id: navLayout id: navLayout
anchors.fill: parent anchors.fill: parent
@@ -44,8 +43,7 @@ ConnectedRect {
fontStyle: Tokens.font.icon.medium fontStyle: Tokens.font.icon.medium
} }
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
Layout.fillWidth: true Layout.fillWidth: true
spacing: 0 spacing: 0
+1 -2
View File
@@ -2,7 +2,6 @@ pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import ZShell.Config import ZShell.Config
import qs.Components import qs.Components
import qs.Services import qs.Services
@@ -31,7 +30,7 @@ ConnectedRect {
onClicked: e => root.clicked(e) onClicked: e => root.clicked(e)
} }
SnapLayout { RowLayout {
id: row id: row
anchors.left: parent.left anchors.left: parent.left
+1 -3
View File
@@ -3,7 +3,6 @@ pragma ComponentBehavior: Bound
import Quickshell import Quickshell
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import ZShell.Config import ZShell.Config
import qs.Components import qs.Components
import qs.Services import qs.Services
@@ -20,8 +19,7 @@ DialogRowButton {
separateContent: true separateContent: true
content: Component { content: Component {
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
VerticalFadeListView { VerticalFadeListView {
bottomMargin: Tokens.padding.large bottomMargin: Tokens.padding.large
Layout.fillHeight: true Layout.fillHeight: true
+2 -3
View File
@@ -1,8 +1,7 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import ZShell.Config
import qs.Components import qs.Components
import ZShell.Config
import qs.Services import qs.Services
CustomText { CustomText {
@@ -11,7 +10,7 @@ CustomText {
Layout.bottomMargin: Tokens.spacing.extraSmall Layout.bottomMargin: Tokens.spacing.extraSmall
Layout.fillWidth: true Layout.fillWidth: true
Layout.leftMargin: Tokens.padding.extraSmall Layout.leftMargin: Tokens.padding.extraSmall
Layout.topMargin: first ? 0 : Tokens.spacing.largeIncreased - ((parent as SnapLayout).spacing ?? 0) Layout.topMargin: first ? 0 : Tokens.spacing.largeIncreased - ((parent as ColumnLayout).spacing ?? 0)
color: Colors.palette.m3onSurfaceVariant color: Colors.palette.m3onSurfaceVariant
elide: Text.ElideRight elide: Text.ElideRight
font: Tokens.font.label.medium font: Tokens.font.label.medium
+2 -4
View File
@@ -1,6 +1,5 @@
import QtQuick import QtQuick
import QtQuick.Layouts import QtQuick.Layouts
import ZShell.Components
import qs.Components import qs.Components
import ZShell.Config import ZShell.Config
import qs.Services import qs.Services
@@ -23,7 +22,7 @@ ConnectedRect {
implicitHeight: rowLayout.implicitHeight + rowLayout.anchors.margins * 2 implicitHeight: rowLayout.implicitHeight + rowLayout.anchors.margins * 2
z: splitButton.expanded ? 1 : 0 z: splitButton.expanded ? 1 : 0
SnapLayout { RowLayout {
id: rowLayout id: rowLayout
anchors.fill: parent anchors.fill: parent
@@ -32,8 +31,7 @@ ConnectedRect {
anchors.rightMargin: Tokens.padding.largeIncreased anchors.rightMargin: Tokens.padding.largeIncreased
spacing: Tokens.spacing.small spacing: Tokens.spacing.small
SnapLayout { ColumnLayout {
orientation: Qt.Vertical
Layout.fillWidth: true Layout.fillWidth: true
spacing: 0 spacing: 0

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