mpris stuff

This commit is contained in:
kossLAN 2025-06-15 22:52:00 -04:00
parent 233e12e094
commit f0673a66a2
Signed by: kossLAN
SSH key fingerprint: SHA256:bdV0x+wdQHGJ6LgmstH3KV8OpWY+OOFmJcPcB0wQPV8
10 changed files with 192 additions and 104 deletions

View file

@ -1,11 +1,11 @@
import QtQuick
import QtQuick.Layouts
import Quickshell
import Quickshell.Widgets
import "battery"
import "control" as Control
import "systray" as SysTray
import "notifications" as Notifications
import "popups" as Popup
import "mpris" as Mpris
import "../widgets" as Widgets
import ".."
@ -27,21 +27,27 @@ PanelWindow {
bar: root
}
// Left
RowLayout {
spacing: 10
spacing: 0
anchors {
top: parent.top
left: parent.left
bottom: parent.bottom
leftMargin: 4
fill: parent
leftMargin: 5
rightMargin: 5
}
// Left side of bar
Item {
Layout.fillWidth: true
Layout.fillHeight: true
RowLayout {
spacing: 10
anchors.fill: parent
HyprWorkspaces {
screen: root.screen
Layout.fillWidth: false
Layout.preferredHeight: parent.height
Layout.fillHeight: true
Layout.leftMargin: 4
}
@ -55,45 +61,48 @@ PanelWindow {
id: activeWindow
Layout.preferredWidth: 400
}
Item {
Layout.fillWidth: true
Layout.fillHeight: true
}
}
}
// Right
RowLayout {
spacing: 10
// Center of bar
WrapperItem {
topMargin: 2
bottomMargin: 2
Layout.fillHeight: true
anchors {
top: parent.top
bottom: parent.bottom
right: parent.right
rightMargin: 4
Mpris.Button {
bar: root
}
}
// Right side of bar
Item {
Layout.fillWidth: true
Layout.fillHeight: true
RowLayout {
anchors.fill: parent
Item {
Layout.fillWidth: true
Layout.fillHeight: true
}
SysTray.SysTray {
id: sysTray
popup: root.popup
Layout.fillHeight: true
}
// Notifications.NotificationButton {
// implicitSize: 16
// bar: root
// }
// Text {
// text: "home"
// color: "white"
// font.family: "Material Symbols Rounded"
// renderType: Text.NativeRendering
// textFormat: Text.PlainText
// font.pointSize: 14
//
// font.variableAxes: {
// "FILL": 0
// }
// }
BatteryIndicator {
id: batteryIndicator
popup: root.popup
Layout.fillHeight: true
}
Widgets.Separator {
@ -106,4 +115,6 @@ PanelWindow {
color: ShellSettings.colors["inverse_surface"]
}
}
}
}
}

10
bar/Controller.qml Normal file
View file

@ -0,0 +1,10 @@
import Quickshell
Variants {
model: Quickshell.screens
Bar {
required property var modelData
screen: modelData
}
}

View file

@ -11,12 +11,12 @@ RowLayout {
required property var screen
Repeater {
id: workspaceButtons
model: ScriptModel {
values: Hyprland.workspaces.values.slice().filter(
workspace => workspace.monitor === Hyprland.monitorFor(screen)
).sort((a,b) => {
return a.id - b.id;
});
)
}
Rectangle {
@ -26,7 +26,7 @@ RowLayout {
Layout.alignment: Qt.AlignVCenter
Layout.preferredHeight: 12
Layout.preferredWidth: {
if (Hyprland.focusedMonitor.activeWorkspace.id == modelData.id)
if (Hyprland.focusedMonitor?.activeWorkspace?.id === modelData?.id)
return 25;
return 12;
@ -40,7 +40,7 @@ RowLayout {
if (workspaceButton.containsMouse) {
value = ShellSettings.colors["on_primary"];
} else if (Hyprland.focusedMonitor.activeWorkspace.id == modelData.id) {
} else if (Hyprland.focusedMonitor.activeWorkspace.id === modelData.id) {
value = ShellSettings.colors["primary"];
}
@ -55,6 +55,13 @@ RowLayout {
}
}
Behavior on color {
ColorAnimation {
duration: 100
easing.type: Easing.OutQuad
}
}
MouseArea {
id: workspaceButton
anchors.fill: parent

View file

@ -10,8 +10,7 @@ import "../.."
Item {
id: root
implicitWidth: parent.height + 8
implicitHeight: parent.height
implicitWidth: height + 8 // for margin
visible: UPower.displayDevice.isLaptopBattery
required property var popup

63
bar/mpris/Button.qml Normal file
View file

@ -0,0 +1,63 @@
import Quickshell.Widgets
import QtQuick
import "../../mpris" as Mpris
import "../.."
WrapperRectangle {
id: root
color: button.containsMouse ? ShellSettings.colors["primary"] : "transparent"
radius: 6
leftMargin: 5
rightMargin: 5
required property var bar
property var player: Mpris.Controller.trackedPlayer
Text {
id: mediaInfo
text: root.player?.trackTitle ?? ""
color: button.containsMouse ? ShellSettings.colors["inverse_primary"] : ShellSettings.colors["inverse_surface"]
elide: Text.ElideRight
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
font.pointSize: 11
anchors.verticalCenter: parent.verticalCenter
MouseArea {
id: button
anchors.fill: parent
hoverEnabled: true
onClicked: {
popup.visible = !popup.visible;
}
}
WidgetWindow {
id: popup
visible: false
parentWindow: root.bar
// anchor.window: root.bar
}
// Item {
// id: menu
// visible: false
// implicitWidth: 250
// implicitHeight: 80
// }
Behavior on color {
ColorAnimation {
duration: 100
}
}
}
Behavior on color {
ColorAnimation {
duration: 100
}
}
}

View file

@ -0,0 +1,9 @@
import Quickshell
PopupWindow {
id: root
color: "red"
implicitWidth: 500
implicitHeight: 500
}

View file

@ -30,7 +30,6 @@ PopupWindow {
property var content
function set(item, content) {
// isOpen = false;
root.item = item;
root.content = content;
popupContent.data = content;

View file

@ -11,7 +11,6 @@ RowLayout {
id: root
spacing: 10
visible: SystemTray.items.values.length > 0
implicitHeight: parent.height
required property var popup
@ -20,8 +19,8 @@ RowLayout {
delegate: Item {
id: trayField
implicitHeight: parent.height
implicitWidth: trayContainer.width
Layout.preferredWidth: parent.height
Layout.fillHeight: true
required property SystemTrayItem modelData
MouseArea {
@ -79,14 +78,20 @@ RowLayout {
id: trayContainer
color: trayButton.containsMouse ? ShellSettings.colors["primary"] : "transparent"
radius: width / 2
implicitHeight: parent.height - 2
implicitWidth: parent.height - 2
anchors.centerIn: parent
implicitHeight: parent.height
implicitWidth: parent.height
anchors {
fill: parent
margins: 1
}
IconImage {
id: trayIcon
source: {
// console.log(trayField.modelData.id);
switch (trayField.modelData.id) {
case "obs":
return "image://icon/obs-tray";

View file

@ -1,10 +1,11 @@
pragma Singleton
pragma ComponentBehavior: Bound
import Quickshell
import Quickshell.Io
import Quickshell.Wayland
Scope {
Singleton {
id: root
PersistentProperties {
@ -38,4 +39,6 @@ Scope {
}
}
}
function init() {}
}

View file

@ -14,35 +14,17 @@ import "wallpaper" as Wallpaper
import "screencapture" as ScreenCapture
ShellRoot {
// Singleton's that need to be loaded in some way
Bar.Controller {}
Wallpaper.Controller {}
Notifications.Controller {}
VolumeOSD.Controller {}
Component.onCompleted: {
Launcher.Controller.init();
Settings.Controller.init();
ScreenCapture.Controller.init();
Mpris.Controller.init();
Notifications.NotificationCenter.init();
LockScreen.Controller.init();
}
// Elements that need context from all screens
Variants {
model: Quickshell.screens
Scope {
id: scope
property var modelData
Bar.Bar {
screen: scope.modelData
}
LockScreen.Controller {}
}
}
// On activation components
Notifications.Controller {}
VolumeOSD.Controller {}
// this is an exception...
Wallpaper.Controller {}
}