Initial commit

This commit is contained in:
Teo
2025-11-26 16:16:42 +01:00
commit 7a9756e0e1
9 changed files with 396 additions and 0 deletions
+69
View File
@@ -0,0 +1,69 @@
import QtQuick
import Quickshell
import Quickshell.Hyprland
import "./widgets"
PanelWindow {
id: panel
anchors.top: true
anchors.left: true
anchors.right: true
implicitHeight: 40
exclusiveZone: height // this is so context menus don't clip into the bar
property HyprlandMonitor barThisMonitor: Hyprland.monitorFor(screen)
margins {
top: 0
left: 0
right: 0
}
Rectangle { // Bar
id: bar
anchors.fill: parent
color: "#1a1a1a"
radius: 0
Row { // bar widgets left
id: widgetsLeft
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 16
spacing: 8
MenuButton {}
Workspaces {
thisMonitor: barThisMonitor
anchors.verticalCenter: parent.verticalCenter
}
}
Row { // bar widgets center
id: widgetsCenter
anchors.centerIn: parent
Clock {}
}
Row { // bar widgets right
id: widgetsRight
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: 16
spacing: 8
}
}
}
+14
View File
@@ -0,0 +1,14 @@
import QtQuick
import Quickshell
Item {
id: root
Repeater { // Bars
model: Quickshell.screens
delegate: Loader {
active: true // loads object
sourceComponent: Bar {screen: modelData} // creates instance of bar component
}
}
}
+25
View File
@@ -0,0 +1,25 @@
import QtQuick
import Quickshell
import Quickshell.Hyprland
Text {
id: timeDisplay
property string currentTime: ""
text: currentTime
color: "#ffffff"
font.pixelSize: 14
font.family: "Inter, sans-serif"
//Update time every second
Timer {
interval: 1000
running: true
repeat: true
onTriggered: {
var now = new Date()
timeDisplay.currentTime = Qt.formatTime(now, "hh:mm:ss")
}
}
}
+25
View File
@@ -0,0 +1,25 @@
import QtQuick
import Quickshell
import Quickshell.Hyprland
MouseArea {
id: archButton
width: 30
height: 28
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
Rectangle {
anchors.fill: parent
color: archButton.containsMouse ? "#2a2a2a" : "transparent"
radius: 6
Text {
anchors.centerIn: parent
text: "󰣇"
font.pixelSize: 26
font.family: "Nerd Font"
color: "#ffffff"
}
}
}
+47
View File
@@ -0,0 +1,47 @@
import QtQuick
import Quickshell
import Quickshell.Hyprland
Row { // Workspace Row
id: workspacesRow
required property HyprlandMonitor thisMonitor
spacing: 8
Repeater { // repeats workspaces
model: Hyprland.workspaces
Rectangle { //workspace
visible: modelData.monitor === thisMonitor
width: 32
height: 24
radius: 4
color: modelData.active ? "#4a93ff": "#333333"
border.color: "#555555"
border.width: 2
MouseArea {
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
onClicked: Hyprland.dispatch("workspace " + modelData.id)
}
Text {
text: modelData.id
anchors.centerIn: parent
color: modelData.active ? "#ffffff" : "#cccccc"
font.pixelSize: 12
font.family: "Inter, sans-serif"
}
}
}
Text {
visible: Hyprland.workspaces.length === 0
text: "No Workspaces"
color: "#ffffff"
font.pixelSize: 12
}
}
+145
View File
@@ -0,0 +1,145 @@
import QtQuick
import Quickshell
import QtQuick.Controls
import Quickshell.Hyprland
import Quickshell.Io
import Qt.labs.folderlistmodel
PanelWindow {
id: picker
implicitWidth: screen.width * 0.75
implicitHeight: screen.height * 0.5
color: "transparent"
visible: true
Rectangle {
anchors.fill: parent
radius: 10
color: "black"
border.width: 2
border.color: "white"
//Wallpaper space
Rectangle {
id: wallpaperContainer
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom
anchors.bottomMargin: 20
width: parent.width - 35
height: parent.height - 100
color: "black"
radius: 10
clip: true
// get folder url
FolderListModel {
id: imagesModel
folder: "file://" + Quickshell.workingDirectory + "/Pictures/Wallpapers"
nameFilters: ["*.png", "*.jpg", "*.jpeg"]
showDirs: false
}
// grid
Item {
anchors.fill: parent
anchors.margins: 15
GridView {
id: grid
anchors.fill: parent
cellWidth: parent.width/6
cellHeight: parent.height/2 + 15
model: imagesModel
boundsBehavior: Flickable.StopAtBounds
// pictures + text
delegate: Item {
width: grid.cellWidth
height: grid.cellHeight
Column {
spacing: 20
Image { // Image
source: filePath
fillMode: Image.PreserveAspectCrop
width: grid.cellWidth -10
height: grid.cellHeight * 0.7
asynchronous: true
cache: true
}
Rectangle { // highlight of text
id: textHighlight
width: parent.width - 10
height: 24
color: mouseArea.containsMouse ? "#4a90e2" : "transparent"
anchors.horizontalCenter: parent.horizontalCenter
Text {
text: fileName
elide: Text.ElideRight
width: parent.width
horizontalAlignment: Text.AlignHCenter
font.pixelSize: 15
font.family: "Fira Sans"
color: "white"
}
}
}
Item {
anchors.fill: parent
Process {
id: wallpaperProcess
command: ["sh", "-c", Quickshell.workingDirectory + "/.config/quickshell/modules/wp/set-wallpaper.sh" + " " + model.filePath + " &"]
stdout: StdioCollector {
onStreamFinished: console.log(`line read: ${this.text}`)
}
}
MouseArea {
id: mouseArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: {
console.log("Setting wallpaper to:", model.fileName)
wallpaperProcess.startDetached()
wLoader.closeWallpaperPicker()
}
}
}
}
ScrollBar.vertical: ScrollBar {
policy: ScrollBar.AlwaysOn
}
}
}
Rectangle { // border of wallpaper container
id: borderOverlay
anchors.fill: parent
radius: 10
color: "transparent"
border.color: "white"
border.width: 1
z: 999
}
}
}
}
+26
View File
@@ -0,0 +1,26 @@
import QtQuick
import Quickshell
import Quickshell.Hyprland
Item { // container, invisible
id: wLoader
Loader {
id: wallpaperLoader
active: false
sourceComponent: WallpaperPicker { id: wPicker }
}
GlobalShortcut {
name: "Wallpaper"
description: "Open wallpaper picker"
onPressed: {
wallpaperLoader.active = !wallpaperLoader.active
console.log("Pressed Meta+Shift+W (Hyprland global shortcut)")
}
}
function closeWallpaperPicker() {
wallpaperLoader.active = false
}
}
+27
View File
@@ -0,0 +1,27 @@
#!/bin/bash
# Path to the image is the first argument
IMAGE="$1"
echo "start"
# Check if an image was provided
if [[ -z "$IMAGE" ]]; then
echo "Usage: $0 /path/to/image"
exit 1
fi
# Check if swww daemon is running
if ! pgrep -x "swww-daemon" > /dev/null; then
echo "Starting swww daemon..."
swww-daemon &
# Give the daemon a moment to start
sleep 0.2
echo "daemon started"
fi
# Set the wallpaper
echo "running"
swww img "$IMAGE" -t grow --transition-duration 1