Very workable top bar. Start of something cool
This commit is contained in:
commit
489f09377c
6
Makefile
Normal file
6
Makefile
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
dev:
|
||||||
|
ln -s $(PWD) $(HOME)/.config/quickshell
|
||||||
|
quickshell -c default
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
unlink $(HOME)/.config/quickshell
|
46
default/bars/TopBar.qml
Normal file
46
default/bars/TopBar.qml
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
import "../widgets"
|
||||||
|
import "./modules"
|
||||||
|
import QtQuick
|
||||||
|
import Quickshell
|
||||||
|
import Quickshell.Io
|
||||||
|
|
||||||
|
PanelWindow {
|
||||||
|
property int defaultMargin: 0
|
||||||
|
|
||||||
|
implicitHeight: 40
|
||||||
|
margins.top: defaultMargin
|
||||||
|
margins.left: defaultMargin
|
||||||
|
margins.right: defaultMargin
|
||||||
|
margins.bottom: defaultMargin
|
||||||
|
aboveWindows: true
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
top: true
|
||||||
|
left: true
|
||||||
|
right: true
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: parent
|
||||||
|
color: "#000000"
|
||||||
|
}
|
||||||
|
|
||||||
|
Clock {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
}
|
||||||
|
|
||||||
|
// Workspaces
|
||||||
|
HyprlandWorkspaces {
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
// Right side - Volume button
|
||||||
|
VolumeMixer {
|
||||||
|
anchors {
|
||||||
|
right: parent.right
|
||||||
|
verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
18
default/bars/modules/Clock.qml
Normal file
18
default/bars/modules/Clock.qml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import QtQuick
|
||||||
|
import Quickshell
|
||||||
|
import Quickshell.Io
|
||||||
|
|
||||||
|
Item {
|
||||||
|
SystemClock {
|
||||||
|
id: clock
|
||||||
|
|
||||||
|
precision: SystemClock.Seconds
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
color: "#ffffff"
|
||||||
|
text: Qt.formatDateTime(clock.date, "ddd MMM d h:m ap")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
29
default/shell.qml
Normal file
29
default/shell.qml
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import "./bars"
|
||||||
|
import QtQuick
|
||||||
|
import Quickshell
|
||||||
|
import Quickshell.Io
|
||||||
|
|
||||||
|
ShellRoot {
|
||||||
|
// PanelWindow {
|
||||||
|
// exclusiveZone: 0
|
||||||
|
// implicitWidth: 600
|
||||||
|
// implicitHeight: 300
|
||||||
|
// anchors.top: true
|
||||||
|
// Rectangle {
|
||||||
|
// anchors.fill: parent
|
||||||
|
// color: "black"
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
Variants {
|
||||||
|
model: Quickshell.screens
|
||||||
|
|
||||||
|
delegate: Component {
|
||||||
|
TopBar {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
36
default/widgets/HyprlandWorkspaces.qml
Normal file
36
default/widgets/HyprlandWorkspaces.qml
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import QtQuick
|
||||||
|
import Quickshell
|
||||||
|
import Quickshell.Hyprland
|
||||||
|
import Quickshell.Io
|
||||||
|
|
||||||
|
Row {
|
||||||
|
spacing: 1
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: 10
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
model: Hyprland.workspaces
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
visible: modelData.id > 0 // "Magic" workspaces have IDs < 0
|
||||||
|
width: 30
|
||||||
|
height: 30
|
||||||
|
color: modelData.focused ? "#ffffff" : "transparent"
|
||||||
|
|
||||||
|
Text {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
text: modelData.id.toString()
|
||||||
|
color: modelData.focused ? "#000000" : "#ffffff"
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
onClicked: modelData.activate()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
101
default/widgets/VolumeMixer.qml
Normal file
101
default/widgets/VolumeMixer.qml
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import Quickshell
|
||||||
|
import Quickshell.Services.Pipewire
|
||||||
|
import Quickshell.Widgets
|
||||||
|
|
||||||
|
Item {
|
||||||
|
property bool showPopup: true
|
||||||
|
// Get the default audio sink
|
||||||
|
property var audioSink: Pipewire.defaultAudioSink
|
||||||
|
|
||||||
|
implicitWidth: volumeButton.width + 20
|
||||||
|
|
||||||
|
PwObjectTracker {
|
||||||
|
objects: [audioSink]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Volume icon button
|
||||||
|
Rectangle {
|
||||||
|
// text height + 10px padding
|
||||||
|
|
||||||
|
id: volumeButton
|
||||||
|
|
||||||
|
color: Pipewire.ready ? "transparent" : "red"
|
||||||
|
width: volumeText.implicitWidth + 20
|
||||||
|
height: volumeText.implicitHeight + 10
|
||||||
|
anchors.centerIn: parent
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: volumeText
|
||||||
|
|
||||||
|
anchors.centerIn: parent
|
||||||
|
text: `Vol: ${Math.floor(audioSink.audio.volume * 100)}%`
|
||||||
|
color: "white"
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
onClicked: {
|
||||||
|
showPopup = !showPopup;
|
||||||
|
console.log("Volume clicked, showPopup:", showPopup);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Floating volume popup window
|
||||||
|
PanelWindow {
|
||||||
|
id: volumePopup
|
||||||
|
|
||||||
|
visible: showPopup
|
||||||
|
exclusiveZone: 0
|
||||||
|
implicitWidth: 500
|
||||||
|
implicitHeight: 100
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: parent.top
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: parent
|
||||||
|
color: "black"
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.margins: 30
|
||||||
|
spacing: 10
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
Label {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
text: `${audioSink.description}`
|
||||||
|
color: "white"
|
||||||
|
font.pixelSize: 16
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
spacing: 10
|
||||||
|
|
||||||
|
Label {
|
||||||
|
text: `${Math.floor(audioSink.audio.volume * 100)}%`
|
||||||
|
color: "white"
|
||||||
|
font.pixelSize: 16
|
||||||
|
}
|
||||||
|
|
||||||
|
Slider {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
value: audioSink.audio.volume
|
||||||
|
onValueChanged: audioSink.audio.volume = value
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user