diff options
Diffstat (limited to 'quickshell/shell.qml.bak')
| -rw-r--r-- | quickshell/shell.qml.bak | 488 |
1 files changed, 488 insertions, 0 deletions
diff --git a/quickshell/shell.qml.bak b/quickshell/shell.qml.bak new file mode 100644 index 0000000..313827c --- /dev/null +++ b/quickshell/shell.qml.bak @@ -0,0 +1,488 @@ +import Quickshell +import Quickshell.Wayland +import Quickshell.Io +import Quickshell.Hyprland +import QtQuick +import QtQuick.Layouts + +ShellRoot { + id: root + + // --- BLACKOUT THEME COLORS --- + property color colBg: "#000000" // True Black to match Ghostty + property color colFg: "#ffffff" // Pure White to match Oh-My-Posh + property color colMuted: "#313244" // Dark Grey (Surface1) + property color colCyan: "#89dceb" // Catppuccin Sky + property color colPurple: "#cba6f7" // Catppuccin Mauve + property color colRed: "#f38ba8" // Catppuccin Red + property color colYellow: "#f9e2af" // Catppuccin Yellow + property color colBlue: "#89b4fa" // Catppuccin Blue + property color colGreen: "#A3BE8C" + // Font + property string fontFamily: "Iosevka Nerd Font Propo" + property int fontSize: 16 + + // System info properties + property string kernelVersion: "Arch" + property string powerProfile: "" + property int cpuUsage: 0 + property string memUsage: "" + property string diskUsage: "" + property int volumeLevel: 0 + property string activeWindow: "Window" + property string currentLayout: "Tile" + property string cpuTemp: "0" + property int cpuTempInt: parseInt(cpuTemp, 10) + property string upTime: "0" + + property color tempColor: { + if (cpuTempInt < 50 ) return "#a6e3a1" // Green + else if (cpuTempInt < 70) return "#f9e2af" // Yellow + else return "#f38ba8" // Red + } + + property int notificationCount: 0 + + property var lastCpuIdle: 0 + property var lastCpuTotal: 0 + + property string weatherIcon: " " + property string weatherTemp: "--°C" + property string weatherPrecip: "--%" + property string weatherWind: "--kph" + property string netConnection: "" + + + Process { + id: connectionProc + command: ["sh", "-c", "sed 's/dormant/ /;s/down/ /;s/up/ /' /sys/class/net/wlp8s0/operstate"] + stdout: SplitParser { + onRead: data => { if (data) netConnection = data.trim() } + } + Component.onCompleted: running = true + } + // System UpTime + Process { + id: upTimeProc + command: ["sh", "-c", "uptime|awk '{gsub(\",\",\"\");print $3}'"] + // command: ["sh", "-c", "uptime"] + stdout: SplitParser { + onRead: data => { if (data) upTime = data.trim() } + } + Component.onCompleted: running = true + } + + + + // CPU usage + Process { + id: cpuProc + command: ["sh", "-c", "head -1 /proc/stat"] + stdout: SplitParser { + onRead: data => { + if (!data) return + var parts = data.trim().split(/\s+/) + var user = parseInt(parts[1]) || 0 + var nice = parseInt(parts[2]) || 0 + var system = parseInt(parts[3]) || 0 + var idle = parseInt(parts[4]) || 0 + var iowait = parseInt(parts[5]) || 0 + var irq = parseInt(parts[6]) || 0 + var softirq = parseInt(parts[7]) || 0 + var total = user + nice + system + idle + iowait + irq + softirq + var idleTime = idle + iowait + if (lastCpuTotal > 0) { + var totalDiff = total - lastCpuTotal + var idleDiff = idleTime - lastCpuIdle + if (totalDiff > 0) cpuUsage = Math.round(100 * (totalDiff - idleDiff) / totalDiff) + } + lastCpuTotal = total + lastCpuIdle = idleTime + } + } + Component.onCompleted: running = true + } + + // Notification monitor + Process { + id: notifListener + command: ["sh", "-c", "dbus-monitor \"interface='org.freedesktop.Notifications',member='Notify'\" \"interface='org.freedesktop.Notifications',member='NotificationClosed'\""] + running: true + stdout: SplitParser { + onRead: data => { + countPoller.running = true + } + } +} + // Notification Updater + Process { + id: countPoller + command: ["sh", "-c", "dunstctl count | awk -F : '/History/ {print $2}'"] + stdout: SplitParser { + onRead: data => { + if (data) notificationCount = parseInt(data.trim()) + } + } +} + // show notification history + Process { + id: showHistoryProc + command: ["sh", "-c", "count=$(dunstctl count history); for i in $(seq 1 $count); do dunstctl history-pop; done"] + } + + // clear notifications + Process { + id: clearAllProc + command: ["dunstctl", "history-clear"] + onExited: { + countPoller.running = true; + } + } + + // Memory usage + Process { + id: memProc + command: ["sh", "-c", "free -h | grep Mem"] + stdout: SplitParser { + onRead: data => { + if (!data) return + var parts = data.trim().split(/\s+/) + var used = parts[2] || "0" + memUsage = used + } + } + Component.onCompleted: running = true + } + + // Weather + Process { + id: weatherProc + // Call your python script directly + command: ["python3", "/opt/scripts/weather.py"] + + stdout: SplitParser { + onRead: data => { + if (!data || data.trim() === "") return + var parts = data.trim().split(/\s+/) + if (parts.length >= 4) { + weatherIcon = parts[0] + weatherTemp = parts[1] + weatherPrecip = parts[2] + " " + parts[3] + weatherWind = parts[4] + " " + parts[5] + } + } + + } + Component.onCompleted: running = true +} + // Disk usage + Process { + id: diskProc + command: ["sh", "-c", "df -h / | tail -1"] + stdout: SplitParser { + onRead: data => { + if (!data) return + var parts = data.trim().split(/\s+/) + var StrInGB = parts[2] || "0G" + diskUsage = StrInGB + } + } + Component.onCompleted: running = true + } + + // Volume level + Process { + id: volProc + command: ["wpctl", "get-volume", "@DEFAULT_AUDIO_SINK@"] + stdout: SplitParser { + onRead: data => { + if (!data) return + var match = data.match(/Volume:\s*([\d.]+)/) + if (match) volumeLevel = Math.round(parseFloat(match[1]) * 100) + } + } + Component.onCompleted: running = true + } + + // Active window title + Process { + id: windowProc + command: ["sh", "-c", "hyprctl activewindow -j | jq -r '.title // empty'"] + stdout: SplitParser { + onRead: data => { if (data && data.trim()) activeWindow = data.trim() } + } + Component.onCompleted: running = true + } + + // Current layout + Process { + id: layoutProc + command: ["sh", "-c", "hyprctl activewindow -j | jq -r 'if .floating then \"Floating\" elif .fullscreen == 1 then \"Fullscreen\" else \"Tiled\" end'"] + stdout: SplitParser { + onRead: data => { if (data && data.trim()) currentLayout = data.trim() } + } + Component.onCompleted: running = true + } + + // CPU Temp + Process { + id: cpuTempProc + command: ["sh", "-c", "sensors | awk '/Tctl:/ {print $2}'"] + stdout: SplitParser { + onRead: data => { if (data && data.length > 0) cpuTemp = data.trim() } + } + } + + // Timers + + Timer { + interval: 5000; running: true; repeat: true + onTriggered: { + connectionProc.running = true + } + } + // UpTime Timer + Timer { + interval: 60000; running: true; repeat: true + onTriggered: { + upTimeProc.running = true + } + } + // SysEssentials Timer + Timer { + interval: 2000; running: true; repeat: true + onTriggered: { + cpuProc.running = true; memProc.running = true; diskProc.running = true + volProc.running = true; cpuTempProc.running = true; powerProfileProc.running = true + } + } + // Weather Timer + Timer { + interval: 3600000; running: true; repeat: true; onTriggered: { + console.log("Weather fetched at: " + new Date().toString()) + weatherProc.running = true + } + } + + Connections { + target: Hyprland + function onRawEvent(event) { windowProc.running = true; layoutProc.running = true } + } + + Timer { + interval: 200; running: true; repeat: true + onTriggered: { windowProc.running = true; layoutProc.running = true } + } + + Variants { + model: Quickshell.screens + PanelWindow { + property var modelData + screen: modelData + anchors { top: true; left: true; right: true } + implicitHeight: 30 + color: root.colBg + + Rectangle { + anchors.fill: parent + color: root.colBg + + RowLayout { + anchors.fill: parent; spacing: 0 + Item { width: 8 } + + // Arch Icon + Rectangle { + Layout.preferredWidth: 24; Layout.preferredHeight: 24; color: "transparent" + Image { + anchors.fill: parent + source: "file:///home/subh/.config/quickshell/icons/arch.png" + fillMode: Image.PreserveAspectFit + } + } + + Item { width: 8 } + + // Workspaces + Repeater { + model: 9 + Rectangle { + Layout.preferredWidth: 20; Layout.preferredHeight: parent.height; color: "transparent" + property var workspace: Hyprland.workspaces.values.find(ws => ws.id === index + 1) ?? null + property bool isActive: Hyprland.focusedWorkspace?.id === (index + 1) + property bool hasWindows: workspace !== null + + Text { + text: index + 1 + color: parent.isActive ? root.colCyan : (parent.hasWindows ? root.colFg : root.colMuted) + font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true + anchors.centerIn: parent + } + Rectangle { + width: 20; height: 3 + color: parent.isActive ? root.colPurple : "transparent" + anchors.horizontalCenter: parent.horizontalCenter; anchors.bottom: parent.bottom + } + MouseArea { + anchors.fill: parent + onClicked: Hyprland.dispatch("workspace " + (index + 1)) + } + } + } + + // Separator + Rectangle { Layout.preferredWidth: 1; Layout.preferredHeight: 16; Layout.leftMargin: 8; Layout.rightMargin: 8; color: root.colMuted } + + // Layout + Text { text: currentLayout; color: root.colFg; font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true } + Rectangle { Layout.preferredWidth: 1; Layout.preferredHeight: 16; Layout.leftMargin: 8; Layout.rightMargin: 8; color: root.colMuted } + Text { text: " " + upTime; color: root.colCyan; font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true } + + Rectangle { Layout.preferredWidth: 1; Layout.preferredHeight: 16; Layout.leftMargin: 8; Layout.rightMargin: 8; color: root.colMuted } + + // Window Title + Text { + text: activeWindow; color: root.colPurple; font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true + Layout.fillWidth: true; Layout.leftMargin: 8; elide: Text.ElideRight; maximumLineCount: 1 + } + RowLayout { + id: weatherRow + spacing: 10 + + Text { + text: weatherIcon + color: root.colYellow + font.pixelSize: 18 + font.family: root.fontFamily + font.bold: true + } + + Text { + text: weatherTemp + font.family: root.fontFamily + font.pixelSize: root.fontSize + color: root.colYellow + font.bold: true + } + + Text { + text: weatherPrecip + font.family: root.fontFamily + font.pixelSize: root.fontSize + color: root.colGreen + font.bold: true + } + + Text { + text: weatherWind + font.family: root.fontFamily + font.pixelSize: root.fontSize + color: root.colBlue + font.bold: true + Layout.rightMargin: 8 + } + + } + + Rectangle { Layout.preferredWidth: 1; Layout.preferredHeight: 16; Layout.rightMargin: 8; color: root.colMuted } + + Text { text: " " + cpuTemp; color: tempColor; font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true; Layout.rightMargin: 8 } + Rectangle { Layout.preferredWidth: 1; Layout.preferredHeight: 16; Layout.rightMargin: 8; color: root.colMuted } + + Text { text: " " + cpuUsage + "%"; color: root.colPurple; font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true; Layout.rightMargin: 8 } + Rectangle { Layout.preferredWidth: 1; Layout.preferredHeight: 16; Layout.rightMargin: 8; color: root.colMuted } + + Text { text: " " + memUsage; color: root.colCyan; font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true; Layout.rightMargin: 8 } + Rectangle { Layout.preferredWidth: 1; Layout.preferredHeight: 16; Layout.rightMargin: 8; color: root.colMuted } + + Text { text: " " + diskUsage; color: root.colBlue; font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true; Layout.rightMargin: 8 } + Rectangle { Layout.preferredWidth: 1; Layout.preferredHeight: 16; Layout.rightMargin: 8; color: root.colMuted } + + Text { text: netConnection; color: root.colBlue; font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true; Layout.rightMargin: 4 } + // netspeed + RowLayout { + id: netSpeedRow + visible: root.netConnection == "" + spacing: 0 + + Rectangle { + Layout.preferredWidth: 1; Layout.preferredHeight: 16 + Layout.leftMargin: 8; Layout.rightMargin: 8 + color: root.colMuted + } + Text { + id: netSpeed + color: root.colRed + font.pixelSize: 15 + font.family: root.fontFamily + font.bold: true + Layout.rightMargin: 8 + + Process { + id: netProc + command: ["bash", "/opt/scripts/netspeed.sh", "wlp8s0"] + running: root.netConnection == "" + stdout: SplitParser { + onRead: data => netSpeed.text = data.trim() + } + } + } + } + + Rectangle { Layout.preferredWidth: 1; Layout.preferredHeight: 16; Layout.rightMargin: 8; color: root.colMuted } + Text { text: " " + volumeLevel + "%"; color: root.colPurple; font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true; Layout.rightMargin: 8 } + Rectangle { Layout.preferredWidth: 1; Layout.preferredHeight: 16; Layout.rightMargin: 8; color: root.colMuted } + + + // Clock + Text { + id: clockText + text: Qt.formatDateTime(new Date(), "ddd, MMM dd - HH:mm") + color: root.colFg + font.pixelSize: root.fontSize; font.family: root.fontFamily; font.bold: true; Layout.rightMargin: 8 + Timer { + interval: 1000; running: true; repeat: true + onTriggered: clockText.text = Qt.formatDateTime(new Date(), "ddd, MMM dd - HH:mm:ss") + } + } + + RowLayout { + id: notifRow + visible: root.notificationCount > 0 + spacing: 0 + + Rectangle { + Layout.preferredWidth: 1; Layout.preferredHeight: 16 + Layout.leftMargin: 8; Layout.rightMargin: 8 + color: root.colMuted + } + + Text { + text: " " + root.notificationCount + color: root.colYellow + font.pixelSize: root.fontSize + font.family: root.fontFamily + font.bold: true + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + + acceptedButtons: Qt.LeftButton | Qt.RightButton + onClicked: (mouse) => { + if (mouse.button === Qt.RightButton) { + clearAllProc.running = true; + } else { + showHistoryProc.running = true; + } + } + } + } + } + + Item { width: 8 } + } + } + } + } +} |
