Files
quickshell/modules/bar/widgets/Workspaces.qml
T
2026-07-05 19:00:10 +02:00

125 lines
5.5 KiB
QML

import QtQuick
import Quickshell
import Quickshell.Hyprland
import "../../../config"
import "../states/Apps"
Rectangle {
id: workspacesContainer
required property HyprlandMonitor thisMonitor
height: bar.height - (Config.spacing_fun(bar.height) * 1.5)
width: workspacesRow.width + (Config.spacing_fun(bar.height) * 2)
radius: height / 2
color: Colors.surfaceVariant
border.color: Colors.surfaceVariant_fg
border.width: Config.border_width
Row {
id: workspacesRow
anchors.centerIn: parent
spacing: Config.spacing_fun(bar.height) / 2
Repeater {
model: Hyprland.workspaces
Loader {
active: modelData.monitor === thisMonitor
sourceComponent: Item {
id: wsItem
property var workspaceData: modelData
width: Math.max(40, wsIconsRow.width==0 ? wsNum.width + 2*Config.spacing_fun(bar.height) : wsNum.width + wsIconsRow.width + 3*Config.spacing_fun(bar.height)+Config.spacing_fun(bar.height))
// width: {
// var spacing = Config.spacing_fun(bar.height)
// var cw = wsNum.width
// if (wsIconsRow.children.length > 0) {
// cw += spacing + wsIconsRow.width + spacing
// } else {
// cw += spacing * 2
// }
// Math.max(cw, wsNum.height + spacing * 2)
// }
height: workspacesContainer.height
// highlight
Rectangle {
anchors.centerIn: parent
width: parent.width
height: parent.height - (Config.spacing_fun(bar.height) * 1.5)
radius: height / 2
color: wsArea.containsMouse ? Colors.tertiaryContainer
: workspaceData.active ? Colors.primaryContainer
: "transparent"
border.color: wsArea.containsMouse ? Colors.tertiaryContainer_fg
: workspaceData.active ? Colors.primaryContainer_fg
: "transparent"
border.width: (wsArea.containsMouse || workspaceData.active) ? Config.border_width : 0
// hyprland workspace api + color
MouseArea {
id: wsArea
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
onClicked: {
console.log("[Workspaces] Switch to workspace: " + workspaceData.id)
Hyprland.dispatch("workspace " + workspaceData.id)
Hyprland.dispatch("hl.dsp.focus({ workspace = "+workspaceData.id+" })")
}
Row {
anchors.left: parent.left
anchors.leftMargin: wsIconsRow.width==0 ? (wsItem.width-wsNum.width)/2 : (wsItem.width-wsNum.width-wsIconsRow.width-Config.spacing_fun(bar.height))/2
anchors.verticalCenter: parent.verticalCenter
spacing: Config.spacing_fun(bar.height)
Text {
id: wsNum
text: workspaceData.id
anchors.verticalCenter: parent.verticalCenter
color: wsArea.containsMouse ? Colors.tertiary
: workspaceData.active ? Colors.primary
: Colors.secondary
font.pixelSize: Config.iconSize(bar.height)
font.family: Config.font
font.bold: true
}
Row {
id: wsIconsRow
spacing: Config.spacing_fun(workspacesContainer.height)
anchors.verticalCenter: parent.verticalCenter
Repeater {
model: AppsState.iconsForWorkspace(workspaceData.id)
delegate: Text {
text: modelData
color: wsArea.containsMouse ? Colors.tertiary
: Colors.secondary
font.pixelSize: Config.labelSize(bar.height)
font.family: Config.font
}
}
}
}
}
}
}
}
}
}
Text {
visible: Hyprland.workspaces.length === 0
text: "No Workspaces"
color: Colors.error
font.pixelSize: Config.iconSize(bar.height)
anchors.centerIn: parent
}
}