Use loaders for all optional components e.g. workspace windows and occupied background Fix bar preset loader usage Fix occupied group Change text on active ws colour Tray no extension for paths (use qt auto resolution)
108 lines
3.1 KiB
QML
108 lines
3.1 KiB
QML
pragma ComponentBehavior: Bound
|
|
|
|
import "root:/widgets"
|
|
import "root:/config"
|
|
import Quickshell
|
|
import QtQuick
|
|
|
|
Item {
|
|
id: root
|
|
|
|
required property bool vertical
|
|
required property list<Workspace> workspaces
|
|
required property var occupied
|
|
required property int groupOffset
|
|
|
|
property list<var> pills: []
|
|
|
|
onOccupiedChanged: {
|
|
let count = 0;
|
|
const start = groupOffset;
|
|
const end = start + BarConfig.workspaces.shown;
|
|
for (const [ws, occ] of Object.entries(occupied)) {
|
|
if (ws > start && ws <= end && occ) {
|
|
if (!occupied[ws - 1]) {
|
|
if (pills[count])
|
|
pills[count].start = ws;
|
|
else
|
|
pills.push(pillComp.createObject(root, {
|
|
start: ws
|
|
}));
|
|
count++;
|
|
}
|
|
if (!occupied[ws + 1])
|
|
pills[count - 1].end = ws;
|
|
}
|
|
}
|
|
if (pills.length > count)
|
|
pills.splice(count, pills.length - count);
|
|
}
|
|
|
|
Repeater {
|
|
model: ScriptModel {
|
|
values: root.pills.filter(p => p)
|
|
}
|
|
|
|
Rectangle {
|
|
id: rect
|
|
|
|
required property var modelData
|
|
|
|
readonly property Workspace start: root.workspaces[modelData.start - 1 - root.groupOffset] ?? null
|
|
readonly property Workspace end: root.workspaces[modelData.end - 1 - root.groupOffset] ?? null
|
|
|
|
color: Appearance.alpha(Appearance.colours.m3surfaceContainerHigh, true)
|
|
radius: BarConfig.workspaces.rounded ? Appearance.rounding.full : 0
|
|
|
|
x: start?.x ?? 0
|
|
y: start?.y ?? 0
|
|
width: root.vertical ? BarConfig.sizes.innerHeight : end?.x + end?.width - start?.x
|
|
height: root.vertical ? end?.y + end?.height - start?.y : BarConfig.sizes.innerHeight
|
|
|
|
anchors.horizontalCenter: root.vertical ? parent.horizontalCenter : undefined
|
|
anchors.verticalCenter: root.vertical ? undefined : parent.verticalCenter
|
|
|
|
scale: 0
|
|
Component.onCompleted: scale = 1
|
|
|
|
Behavior on color {
|
|
ColorAnimation {
|
|
duration: Appearance.anim.durations.normal
|
|
easing.type: Easing.BezierSpline
|
|
easing.bezierCurve: Appearance.anim.curves.standard
|
|
}
|
|
}
|
|
|
|
Behavior on scale {
|
|
Anim {
|
|
easing.bezierCurve: Appearance.anim.curves.standardDecel
|
|
}
|
|
}
|
|
|
|
Behavior on x {
|
|
Anim {}
|
|
}
|
|
|
|
Behavior on y {
|
|
Anim {}
|
|
}
|
|
}
|
|
}
|
|
|
|
component Anim: NumberAnimation {
|
|
duration: Appearance.anim.durations.normal
|
|
easing.type: Easing.BezierSpline
|
|
easing.bezierCurve: Appearance.anim.curves.standard
|
|
}
|
|
|
|
component Pill: QtObject {
|
|
property int start
|
|
property int end
|
|
}
|
|
|
|
Component {
|
|
id: pillComp
|
|
|
|
Pill {}
|
|
}
|
|
}
|