First commit

This commit is contained in:
2026-03-06 08:06:15 -06:00
commit 93c1b00adc
42 changed files with 2839 additions and 0 deletions

30
config/aurora/default.nix Normal file
View File

@@ -0,0 +1,30 @@
{ ... }: {
perSystem = { self', pkgs, system, ... }: {
packages = {
aurora = pkgs.writeShellScriptBin "aurora" ''
${pkgs.quickshell}/bin/quickshell --path ${self'.packages.aurora-dots}/share "''$@"
'';
aurora-dots = pkgs.stdenv.mkDerivation {
name = "aurora-dots";
src = ./.;
buildInputs = [];
buildPhase = ''
'';
installPhase = ''
mkdir -p $out/share
cp -r $src/* $out/share
'';
};
default = self'.packages.aurora;
};
};
}

View File

@@ -0,0 +1,283 @@
import Quickshell // for PanelWindow
import QtQuick // for Text
import QtQuick.Shapes
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell.Io
import Quickshell.Widgets
import Quickshell.Wayland
import Quickshell.Hyprland
PanelWindow {
property real radius: 20
onClosed: {
Hyprland.dispatch("exec hyprctl keyword monitor eDP-1,addreserved,0,100,0,0")
}
anchors {
top: true
left: true
right: true
bottom: true
}
Component.onCompleted: {
//Hyprland.dispatch("exec hyprctl keyword monitor eDP-1,addreserved," + topRect.height + "," + botRect.height + "," + leftRect.width + "," + rightRect.width)
Hyprland.dispatch("exec hyprctl keyword monitor eDP-1,addreserved," + topEx + "," + botEx + "," + leftEx + "," + rightEx)
}
property int topEx: topRect.height
property int botEx: botRect.height
property int leftEx: leftRect.width
property int rightEx: rightRect.width
id: root
exclusionMode: ExclusionMode.Ignore
WlrLayershell.layer: WlrLayer.Top
//color: Pywal.special.background
color: "transparent"
mask: Region {
Region {
item: topRect
}
Region {
item: leftRect
}
Region {
item: midFO.visible ? midFO : topRect
//item: midFO
}
}
WrapperMouseArea {
id: topRectArea
Rectangle {
id: topRect
color: Pywal.special.background
anchors.fill: parent
}
implicitHeight: 10
implicitWidth: parent.width
hoverEnabled: true
onEntered: {
midFO.set = !midFO.set
midFO.visible = Qt.binding(() => midFO.set)
}
//onEntered: midFO.visible = true
}
Rectangle {
id: botRect
y: parent.height - height
color: Pywal.special.background
implicitHeight: 10
implicitWidth: parent.width
}
Rectangle {
id: leftRect
implicitHeight: parent.height
implicitWidth: 40
color: Pywal.special.background
Launcher {
id: launcher
x: parent.width / 2 - implicitWidth / 2
y: implicitWidth / 3
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
}
Workspaces {
id: workspaces
x: parent.width / 2 - implicitWidth / 2
y: 20 + launcher.y + launcher.height
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
}
IdleInhibitor {
id: idleInhibitor
x: parent.width / 2 - implicitWidth / 2
y: 20 + workspaces.y + workspaces.height
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
visible: false
}
}
Rectangle {
id: rightRect
x: parent.width - width
color: Pywal.special.background
implicitWidth: 10
implicitHeight: parent.height
}
Shape {
x: leftRect.x + leftRect.width - 1
y: topRect.y + topRect.height - 1
ShapePath {
strokeWidth: 4
strokeColor: Pywal.special.background
fillColor: Pywal.special.background
startX: 0; startY: 0
onFillColorChanged: {
console.log(Pywal.special.background)
fillColor = Qt.binding(() => Pywal.special.background)
strokeColor = Qt.binding(() => Pywal.special.background)
}
PathLine { relativeX: 0; relativeY: radius }
PathArc {
radiusX: radius
radiusY: -radius
relativeX: radius
relativeY: -radius
}
PathLine { relativeX: -radius; relativeY: 0 }
}
}
Shape {
x: rightRect.x + 1
y: topRect.y + topRect.height - 1
ShapePath {
strokeWidth: 4
strokeColor: Pywal.special.background
fillColor: Pywal.special.background
startX: 0; startY: 0
PathLine { relativeX: 0; relativeY: radius }
PathArc {
direction: PathArc.Counterclockwise
radiusX: radius
radiusY: radius
relativeX: -radius
relativeY: -radius
}
PathLine { relativeX: radius; relativeY: 0 }
}
}
Shape {
x: leftRect.x + leftRect.width - 1
y: botRect.y + 1
ShapePath {
strokeWidth: 4
strokeColor: Pywal.special.background
fillColor: Pywal.special.background
startX: 0; startY: 0
PathLine { relativeX: 0; relativeY: -radius }
PathArc {
direction: PathArc.Counterclockwise
radiusX: radius
radiusY: radius
relativeX: radius
relativeY: radius
}
PathLine { relativeX: -radius; relativeY: 0 }
}
}
Shape {
x: rightRect.x + 1
y: botRect.y + 1
ShapePath {
strokeWidth: 4
strokeColor: Pywal.special.background
fillColor: Pywal.special.background
startX: 0; startY: 0
PathLine { relativeX: 0; relativeY: -radius }
PathArc {
radiusX: radius
radiusY: -radius
relativeX: -radius
relativeY: radius
}
PathLine { relativeX: radius; relativeY: 0 }
}
}
VFlyout {
id: midFO
x: root.screen.width / 2 - width / 2
y: topRect.y + topRect.height - 1
color: Pywal.special.background
visible: set
property bool set: true
item: mid
RowLayout {
id: mid
Notifications {
id: notifications
window: root
}
Battery {
window: root
popupOffset: x + midFO.x
}
Tray {
window: root
popupOffset: x + midFO.x
}
Clock {
id: clock
}
Bluetooth {
window: root
popupOffset: x + midFO.x
}
Volume {
window: root
popupOffset: x + midFO.x
}
Power {
id: power
window: root
popupOffset: x + midFO.x
}
}
radius: radius
}
}

View File

@@ -0,0 +1,95 @@
import Quickshell // for PanelWindow
import QtQuick // for Text
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell.Io
import Quickshell.Widgets
import Quickshell.Hyprland
import Quickshell.Services.UPower
ClippingWrapperRectangle {
radius: 5
width: 100; height: 30
color: "red"
Button {
id: button
text: if(UPower.onBattery) {
"󰁹 " + Math.floor(UPower.displayDevice.percentage * 100) + "%"
} else {
"󰂄 " + Math.floor(UPower.displayDevice.percentage * 100) + "%"
}
font.pointSize: 12
implicitHeight: parent.height
//icon.color: "red"
//icon.source: "/nix/store/c4dcn4vl0v5njv4d587sazrad1xgyd9h-rose-pine-icon-theme-unstable-2022-09-01/share/icons/rose-pine/symbolic/devices/battery-symbolic.svg"
onClicked: {
menu.visible = true
grab.active = true
}
}
required property var window
required property real popupOffset
id: root
PopupWindow {
id: menu
anchor.window: window
anchor.rect.x: popupOffset
anchor.rect.y: 50
implicitWidth: 250
implicitHeight: 150
visible: false
color: "transparent"
ClippingWrapperRectangle {
radius: 5
implicitHeight: parent.height - 20
implicitWidth: parent.width
ColumnLayout {
spacing: 0
Button {
Layout.topMargin: 5
x: (parent.width - width) / 2
implicitWidth: parent.width - 10
implicitHeight: parent.height / 5 - parent.spacing
text: 'performance'
onClicked: PowerProfiles.profile = PowerProfile.Performance
visible: PowerProfiles.hasPerformanceProfile
}
Button {
Layout.topMargin: 5
x: (parent.width - width) / 2
implicitWidth: parent.width - 10
implicitHeight: parent.height / 5 - parent.spacing
text: 'balanced'
onClicked: PowerProfiles.profile = PowerProfile.Balanced
}
Button {
Layout.topMargin: 5
x: (parent.width - width) / 2
implicitWidth: parent.width - 10
implicitHeight: parent.height / 5 - parent.spacing
text: 'power saver'
onClicked: PowerProfiles.profile = PowerProfile.PowerSaver
}
}
}
HyprlandFocusGrab {
id: grab
windows: [ menu ]
onCleared: menu.visible = false
}
}
}

View File

@@ -0,0 +1,141 @@
import Quickshell // for PanelWindow
import QtQuick // for Text
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell.Io
import Quickshell.Widgets
import Quickshell.Hyprland
import Quickshell.Bluetooth
ClippingWrapperRectangle {
radius: 5
implicitWidth: 30; implicitHeight: 30
Button {
id: button
text: ""
font.pointSize: 16
onClicked: {
menu.visible = true
grab.active = true
}
implicitHeight: parent.height
}
required property PanelWindow window
required property real popupOffset
id: root
PopupWindow {
id: menu
anchor.window: window
anchor.rect.x: popupOffset - width
anchor.rect.y: 50
implicitWidth: 250
implicitHeight: 150
visible: false
color: "transparent"
ClippingWrapperRectangle {
radius: 5
implicitHeight: parent.height - 20
implicitWidth: parent.width
ColumnLayout {
spacing: 0
ClippingWrapperRectangle {
radius: 5
implicitWidth: parent.width - 2 * Layout.margins
implicitHeight: 30
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
Layout.margins: 5
color: "#ff3333aa"
RowLayout {
Text {
text: 'Bluetooth'
Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
Layout.margins: 5
}
Switch {
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
//Layout.margins: 5
checked: Bluetooth.defaultAdapter.enabled
onClicked: Bluetooth.defaultAdapter.enabled = checked
}
}
}
ScrollView {
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
Layout.margins: 5
implicitWidth: parent.width - 4 * Layout.margins
implicitHeight: menu.height / 2
id: scroll
ColumnLayout {
spacing: 0
Repeater {
id: rep
model: Bluetooth.devices.values
ClippingWrapperRectangle {
radius: 5
color: "#ff3333aa"
implicitWidth: menu.width - 3 * scroll.x
implicitHeight: 40
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
Layout.margins: 5
RowLayout {
Text {
Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
Layout.margins: 5
text: rep.model[index].name
}
Button {
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
Layout.rightMargin: 5
text: 'Connect'
onClicked: rep.model[index].connected = !rep.model[index].connected
}
}
}
}
}
}
}
}
HyprlandFocusGrab {
id: grab
windows: [ menu ]
onCleared: menu.visible = false
}
}
}

View File

@@ -0,0 +1,29 @@
import QtQuick // for Text
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell.Widgets
import Quickshell
WrapperMouseArea {
implicitWidth: t.contentWidth + 10
implicitHeight: 30
ClippingWrapperRectangle {
id: rect
color: Pywal.colors.color12
radius: 5
anchors.fill: parent
Text {
id: t
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
text: Qt.formatDateTime(clock.date, "dddd HH:mm:ss MM/dd/yyyy")
font.pointSize: 11
SystemClock {
id: clock
precision: SystemClock.Seconds
}
}
}
}

View File

View File

@@ -0,0 +1,34 @@
import Quickshell // for PanelWindow
import QtQuick // for Text
import QtQuick.Controls
import Quickshell.Io
import Quickshell.Widgets
ClippingWrapperRectangle {
property real interval: 100
id: root
radius: 5
implicitWidth: 30; height: 30
Button {
id: button
text: "󰒳 "
font.pointSize: 16
Process {
id: idlent
running: true
command: ["systemd-inhibit", "--what=idle", "sleep", root.interval.toString()]
onExited: {
running = button.text == "󰒲 " ? false : true
}
}
onClicked: {
idlent.running = button.text == "󰒲 " ? true : false
button.text = button.text == "󰒲 " ? "󰒳 " : "󰒲 "
}
implicitHeight: parent.height
}
}

View File

@@ -0,0 +1,36 @@
import Quickshell // for PanelWindow
import QtQuick // for Text
import QtQuick.Controls
import Quickshell.Io
import Quickshell.Widgets
WrapperMouseArea {
ClippingWrapperRectangle {
radius: 5
implicitWidth: 30; implicitHeight: 30
Text {
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
anchors.fill: parent
text: " "
font.pointSize: 16
color: Pywal.special.foreground
}
color: {
containsMouse
? Pywal.colors.color12
: Pywal.colors.color1
}
}
hoverEnabled: true
Process {
id: launcher
running: false
command: ["rofi", "-show", "drun"]
}
onClicked: launcher.running = true
}

View File

@@ -0,0 +1,71 @@
import Quickshell
import QtQuick // for Text
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell.Services.Notifications
import Quickshell.Io
import Quickshell.Widgets
import Quickshell.Hyprland
ClippingWrapperRectangle {
id: notif
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
Layout.margins: 5
radius: 10
implicitWidth: parent.width - 2 * Layout.margins
implicitHeight: 100
color: Pywal.colors.color2
required property Notification src
MouseArea {
anchors.fill: parent
RowLayout {
Image {
//anchors.fill: parent
source: {
console.log(notif.src)
let icon = notif.src.image
if (icon.includes("?path=")) {
const [name, path] = icon.split("?path=");
icon = Qt.resolvedUrl(`${path}/${name.slice(name.lastIndexOf("/") + 1)}`);
}
return icon
}
Layout.maximumWidth: 100
Layout.maximumHeight: 100
}
ColumnLayout {
Layout.topMargin: 10
Layout.alignment: Qt.AlignLeft | Qt.AlignTop
Text {
color: Pywal.special.background
Layout.alignment: Qt.AlignLeft | Qt.AlignTop
text: notif.src.summary
Layout.leftMargin: 10
font.pointSize: 14
}
Text {
color: Pywal.special.background
Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
text: notif.src.body
Layout.leftMargin: 10
font.pointSize: 12
}
}
}
acceptedButtons: Qt.LeftButton | Qt.RightButton
onClicked: mouse => {
if(mouse.button == Qt.LeftButton) {
notif.src.dismiss()
} else if(mouse.button == Qt.RightButton) {
}
}
}
}

View File

@@ -0,0 +1,143 @@
import Quickshell
import QtQuick // for Text
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell.Services.Notifications
import Quickshell.Io
import Quickshell.Widgets
import Quickshell.Hyprland
Item {
width: 50
height: 30
ClippingWrapperRectangle {
id: barbutton
radius: 5
anchors.fill: parent
Button {
id: button
text: "󰂚"
font.pointSize: 16
onClicked: {
menu.visible = true
grab.active = true
}
implicitHeight: parent.height
}
}
NotificationServer {
id: server
persistenceSupported: true
imageSupported: true
actionsSupported: true
bodyImagesSupported: true
bodySupported: true
bodyHyperlinksSupported: true
inlineReplySupported: true
actionIconsSupported: true
onNotification: (n) => {
n.tracked = !n.transient
}
}
required property PanelWindow window
id: root
PopupWindow {
id: menu
anchor.window: window
anchor.rect.x: window.width - width
anchor.rect.y: 50
implicitWidth: 400
implicitHeight: 1080 - anchor.rect.y
visible: false
color: "transparent"
ClippingWrapperRectangle {
radius: 5
color: Pywal.special.background
implicitHeight: parent.height - 20
implicitWidth: parent.width
ColumnLayout {
id: lay
spacing: 10
ClippingWrapperRectangle {
color: Pywal.colors.color2
radius: 5
Layout.margins: 5
Layout.alignment: Qt.AlignVCenter | Qt.AlignTop
implicitWidth: menu.width - 2 * Layout.margins
RowLayout {
width: parent.width
Text {
color: Pywal.colors.color0
Layout.margins: 5
Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
text: 'Notifications'
}
Button {
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
Layout.margins: 5
implicitWidth: 20
implicitHeight: 20
text: 'x'
onClicked: {
while(server.trackedNotifications.values.length > 0) {
server.trackedNotifications.values[0].dismiss()
}
}
}
}
}
ColumnLayout {
Layout.alignment: Qt.AlignVCenter | Qt.AlignTop
Repeater {
id: rep
model: server.trackedNotifications.values
Notif {
required property int index
src: rep.model[index]
}
onItemAdded: (idx, it) => {
button.text = '󱅫 ' + rep.count
}
onItemRemoved: (idx, it) => {
button.text = (rep.count - 1) <= 0 ? "󰂚" : '󱅫 ' + (rep.count - 1)
}
}
}
}
}
HyprlandFocusGrab {
id: grab
windows: [ menu ]
onCleared: menu.visible = false
}
}
}

View File

@@ -0,0 +1,120 @@
import Quickshell
import QtQuick // for Text
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell.Hyprland
import Quickshell.Io
import Quickshell.Widgets
Item {
width: 30
height: 30
id: root
required property PanelWindow window
required property real popupOffset
ClippingWrapperRectangle {
radius: 5
width: 30; height: 30
Button {
id: button
text: " "
font.pointSize: 16
onClicked: {
menu.visible = true
grab.active = true
}
implicitHeight: parent.height
}
}
PopupWindow {
id: menu
anchor.window: window
anchor.rect.x: popupOffset
anchor.rect.y: 50
implicitWidth: 150
implicitHeight: 250
visible: false
color: "transparent"
ClippingWrapperRectangle {
radius: 5
implicitHeight: parent.height - 20
implicitWidth: parent.width
ColumnLayout {
spacing: 0
Button {
Layout.topMargin: 5
x: (parent.width - width) / 2
implicitWidth: parent.width - 10
implicitHeight: parent.height / 5 - parent.spacing
text: 'shutdown'
onClicked: shutdown.running = true
Process {
id: shutdown
running: false
command: ["systemctl", "poweroff"]
}
}
Button {
x: (parent.width - width) / 2
implicitWidth: parent.width - 10
implicitHeight: parent.height / 5 - parent.spacing
text: 'reboot'
onClicked: reboot.running = true
Process {
id: reboot
running: false
command: ["systemctl", "reboot"]
}
}
Button {
x: (parent.width - width) / 2
implicitWidth: parent.width - 10
implicitHeight: parent.height / 5 - parent.spacing
text: 'logout'
onClicked: logout.running = true
Process {
id: logout
running: false
command: ["loginctl", "kill-session", "self" ]
}
}
Button {
Layout.bottomMargin: 10
x: (parent.width - width) / 2
implicitWidth: parent.width - 10
implicitHeight: parent.height / 5 - parent.spacing
text: 'sleep'
onClicked: sleep.running = true
Process {
id: sleep
running: false
command: ["systemctl", "sleep"]
}
}
}
}
HyprlandFocusGrab {
id: grab
windows: [ menu ]
onCleared: menu.visible = false
}
}
}

View File

@@ -0,0 +1,58 @@
pragma Singleton
import Quickshell
import Quickshell.Io
Singleton {
property string wallpaper: json.wallpaper
property string alpha: json.alpha
property JsonObject special: json.special
property JsonObject colors: json.colors
FileView {
path: "/home/nathan/.cache/wal/colors.json"
watchChanges: true
onFileChanged: reload()
JsonAdapter {
id: json
property string wallpaper: "/home/nathan/Pictures/Wallpaper/bluescape.jpg"
property string alpha: "100"
property JsonObject special: JsonObject {
property string background: "white"
property string foreground: "white"
property string cursor: "white"
}
property JsonObject colors: JsonObject {
property string color0: "white"
property string color1: "white"
property string color2: "white"
property string color3: "white"
property string color4: "white"
property string color5: "white"
property string color6: "white"
property string color7: "white"
property string color8: "white"
property string color9: "white"
property string color10: "white"
property string color11: "white"
property string color12: "white"
property string color13: "white"
property string color14: "white"
property string color15: "white"
}
}
}
}

View File

View File

@@ -0,0 +1,62 @@
import QtQuick // for Text
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell.Services.SystemTray
import Quickshell.Widgets
Item {
implicitWidth: 10 + rep.count * (2 * lay.spacing + 20)
height: 30
visible: SystemTray.items.values.length != 0
id: root
required property var window
required property real popupOffset
ClippingWrapperRectangle {
radius: 5
anchors.fill: parent
RowLayout {
id: lay
spacing: 4
Repeater {
id: rep
model: SystemTray.items
ClippingWrapperRectangle {
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
radius: 10
implicitWidth: 20
implicitHeight: 20
MouseArea {
anchors.fill: parent
Image {
anchors.fill: parent
source: {
let icon = SystemTray.items.values[index].icon
if (icon.includes("?path=")) {
const [name, path] = icon.split("?path=");
icon = Qt.resolvedUrl(`${path}/${name.slice(name.lastIndexOf("/") + 1)}`);
}
return icon
}
}
acceptedButtons: Qt.LeftButton | Qt.RightButton
onClicked: (mouse) => {
if(mouse.button == Qt.LeftButton) {
SystemTray.items.values[index].activate()
} else if(mouse.button == Qt.RightButton) {
SystemTray.items.values[index].display(root.window, popupOffset, 40)
}
}
}
}
}
}
}
}

View File

@@ -0,0 +1,85 @@
import QtQuick
import QtQuick.Shapes
import Quickshell
import Quickshell.Widgets
MouseArea {
id: root
property real radius: 15
property real pad: 10
property color color
property Item item
hoverEnabled: true
Component.onCompleted: {
item.y = pad
}
width: shape.width
height: shape.height
Shape {
id: shape
//anchors.centerIn: parent
ShapePath {
id: path
strokeWidth: 4
strokeColor: root.color
fillColor: root.color
startX: -radius - pad; startY: 0
PathArc {
radiusX: radius
radiusY: radius
relativeX: radius
relativeY: radius
}
PathLine { relativeX: 0; relativeY: 2 * pad + item.height - 2 * radius }
PathArc {
radiusX: radius
radiusY: radius
direction: PathArc.Counterclockwise
relativeX: radius
relativeY: radius
}
PathLine { x: item.width + pad - radius; relativeY: 0 }
PathArc {
radiusX: radius
radiusY: radius
direction: PathArc.Counterclockwise
relativeX: radius
relativeY: -radius
}
PathLine { relativeX: 0; relativeY: -item.height + 2 * radius - 2 * pad }
PathArc {
radiusX: radius
radiusY: radius
relativeX: radius
relativeY: -radius
}
PathLine { x: -radius - pad; y: 0 }
}
}
}

View File

@@ -0,0 +1,107 @@
import Quickshell // for PanelWindow
import QtQuick // for Text
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell.Io
import Quickshell.Widgets
import Quickshell.Hyprland
import Quickshell.Services.Pipewire
ClippingWrapperRectangle {
radius: 5
width: 100; height: 30
Button {
id: button
text: (Pipewire.defaultAudioSink?.audio?.muted ? " " : " ") + Math.floor(Pipewire.defaultAudioSink?.audio?.volume * 100) + "%"
font.pointSize: 12
implicitHeight: parent.height
PwObjectTracker {
objects: [ Pipewire.defaultAudioSink ]
}
onClicked: {
menu.visible = true
grab.active = true
}
}
required property var window
required property real popupOffset
id: root
PopupWindow {
id: menu
anchor.window: window
anchor.rect.x: popupOffset
anchor.rect.y: 50
implicitWidth: 250
implicitHeight: 150
visible: false
color: "transparent"
ClippingWrapperRectangle {
radius: 5
implicitHeight: parent.height - 20
implicitWidth: parent.width
ScrollView {
ColumnLayout {
spacing: 0
Text {
text: 'Output Devices'
}
ColumnLayout {
Repeater {
id: outputs
model: {
Pipewire.nodes.values.filter(n => n.isSink && n.audio && n.nickname != "")
}
Button {
text: outputs.model[index].nickname
onClicked: Pipewire.preferredDefaultAudioSink = outputs.model[index]
}
}
}
Text {
text: 'Input Devices'
}
ColumnLayout {
Repeater {
id: inputs
model: {
Pipewire.nodes.values.filter(n => !n.isSink && n.audio && n.nickname != "")
}
Button {
text: inputs.model[index].nickname
onClicked: Pipewire.preferredDefaultAudioSource = inputs.model[index]
}
}
}
}
}
}
HyprlandFocusGrab {
id: grab
windows: [ menu ]
onCleared: menu.visible = false
}
}
}

View File

@@ -0,0 +1,67 @@
import QtQuick // for Text
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell.Hyprland
import Quickshell.Widgets
Item {
implicitHeight: 10 + rep.count * (2 * lay.spacing + 25)
implicitWidth: 30
Component.onCompleted: Hyprland.refreshWorkspaces()
ClippingWrapperRectangle {
color: Pywal.colors.color1
radius: 3
anchors.fill: parent
ColumnLayout {
id: lay
Repeater {
id: rep
property var ws: {
let arr = [];
Hyprland.workspaces.values.forEach((w) => { if(w.id > 0) arr.push(w) })
return arr;
}
model: ws
WrapperMouseArea {
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
ClippingWrapperRectangle {
id: rect
radius: 3
implicitWidth: 24
implicitHeight: 24
color: {
Hyprland.focusedWorkspace.id == rep.model[index].id
? Pywal.colors.color13
: containsMouse
? Pywal.colors.color12
: Pywal.colors.color4
}
Text {
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
text: rep.model[index].id
color: {
Hyprland.focusedWorkspace.id == rep.model[index].id
? Pywal.colors.color1
: Pywal.special.foreground
}
}
}
hoverEnabled: true
onClicked: {
rep.model[index].activate()
}
}
}
}
}
}

18
config/aurora/shell.qml Normal file
View File

@@ -0,0 +1,18 @@
//@ pragma Env QS_NO_RELOAD_POPUP=1
//@ pragma Env QSG_RENDER_LOOP=threaded
//@ pragma Env QT_QUICK_FLICKABLE_WHEEL_DECELERATION=10000
//@ pragma UseQApplication
import QtQuick
import Quickshell // for ShellRoot
import Quickshell.Hyprland
import qs.modules
ShellRoot {
Bar {
id: bar
}
}