Files
dotfiles/.config/quickshell/nucleus-shell/modules/interface/settings/BarConfig.qml

301 lines
11 KiB
QML

import QtQuick
import QtQuick.Layouts
import Quickshell
import Quickshell.Io
import QtQuick.Controls
import Quickshell.Widgets
import qs.config
import qs.modules.components
import qs.services
ContentMenu {
property string barKey: "bar"
title: "Bar"
description: "Adjust the bar's look."
ContentCard {
id: monitorSelectorCard
StyledText {
text: "Monitor Bar Configuration"
font.pixelSize: Metrics.fontSize(20)
font.bold: true
}
StyledText {
text: (Config.runtime.monitors?.[monitorSelector.model[monitorSelector.currentIndex]]?.bar)
? "This monitor has its own bar configuration."
: "This monitor currently uses the global bar."
wrapMode: Text.WordWrap
}
RowLayout {
spacing: Metrics.spacing("normal")
StyledDropDown {
id: monitorSelector
Layout.preferredWidth: 220
model: Xrandr.monitors.map(m => m.name)
currentIndex: 0
onCurrentIndexChanged: monitorSelectorCard.updateMonitorProperties()
}
Item { Layout.fillWidth: true }
StyledButton {
id: createButton
icon: "add"
text: "Override Bar: (" + monitorSelector.model[monitorSelector.currentIndex] + ")"
Layout.preferredWidth: 280
onClicked: {
const monitorName = monitorSelector.model[monitorSelector.currentIndex]
if (!monitorName) return
if (!Config.runtime.monitors) Config.runtime.monitors = {}
if (!Config.runtime.monitors[monitorName])
Config.runtime.monitors[monitorName] = {}
const defaultBar = {
density: 50,
enabled: true,
floating: false,
gothCorners: true,
margins: 16,
merged: false,
modules: {
height: 34,
paddingColor: "#1f1f1f",
radius: 17,
statusIcons: {
bluetoothStatusEnabled: true,
enabled: true,
networkStatusEnabled: true
},
systemUsage: {
cpuStatsEnabled: true,
enabled: true,
memoryStatsEnabled: true,
tempStatsEnabled: true
},
workspaces: {
enabled: true,
showAppIcons: true,
showJapaneseNumbers: false,
workspaceIndicators: 8
}
},
position: "top",
radius: 23
}
Config.updateKey("monitors." + monitorName + ".bar", defaultBar)
monitorSelectorCard.updateMonitorProperties()
}
}
StyledButton {
id: deleteButton
icon: "delete"
text: "Use Global Bar: (" + monitorSelector.model[monitorSelector.currentIndex] + ")"
secondary: true
Layout.preferredWidth: 280
onClicked: {
const monitorName = monitorSelector.model[monitorSelector.currentIndex]
if (!monitorName) return
Config.updateKey("monitors." + monitorName + ".bar", undefined)
monitorSelectorCard.updateMonitorProperties()
}
}
}
function updateMonitorProperties() {
const monitorName = monitorSelector.model[monitorSelector.currentIndex]
const monitorBar = Config.runtime.monitors?.[monitorName]?.bar
barKey = monitorBar ? "monitors." + monitorName + ".bar" : "bar"
createButton.enabled = !monitorBar
deleteButton.enabled = !!monitorBar
monitorSelector.model = Xrandr.monitors.map(m => m.name)
monitorSelector.currentIndex = Xrandr.monitors.findIndex(m => m.name === monitorName)
}
}
ContentCard {
StyledText {
text: "Bar"
font.pixelSize: Metrics.fontSize(20)
font.bold: true
}
ColumnLayout {
StyledText {
text: "Position"
font.pixelSize: Metrics.fontSize(16)
}
RowLayout {
spacing: Metrics.spacing(8)
Repeater {
model: ["Top", "Bottom", "Left", "Right"]
delegate: StyledButton {
property string pos: modelData.toLowerCase()
text: modelData
Layout.fillWidth: true
checked: ConfigResolver.bar(monitorSelector.model[monitorSelector.currentIndex]).position === pos
topLeftRadius: Metrics.radius("normal")
topRightRadius: Metrics.radius("normal")
bottomLeftRadius: Metrics.radius("normal")
bottomRightRadius: Metrics.radius("normal")
onClicked: Config.updateKey(barKey + ".position", pos)
}
}
}
}
StyledSwitchOption {
title: "Enabled"
description: "Toggle the bar visibility on/off"
prefField: barKey + ".enabled"
}
StyledSwitchOption {
title: "Floating Bar"
description: "Make the bar float above other windows instead of being part of the desktop"
prefField: barKey + ".floating"
}
StyledSwitchOption {
title: "Goth Corners"
description: "Apply gothic-style corner cutouts to the bar"
prefField: barKey + ".gothCorners"
}
StyledSwitchOption {
title: "Merged Layout"
description: "Merge all modules into a single continuous layout"
prefField: barKey + ".merged"
}
}
ContentCard {
StyledText {
text: "Bar Rounding & Size"
font.pixelSize: Metrics.fontSize(20)
font.bold: true
}
NumberStepper {
label: "Bar Density"
prefField: barKey + ".density"
description: "Modify the bar's density"
minimum: 40
maximum: 128
}
NumberStepper {
label: "Bar Radius"
prefField: barKey + ".radius"
description: "Modify the bar's radius"
minimum: 10
maximum: 128
}
NumberStepper {
label: "Module Container Radius"
prefField: barKey + ".modules.radius"
description: "Modify the bar's module.radius"
minimum: 10
maximum: 128
}
NumberStepper {
label: "Module Height"
prefField: barKey + ".modules.height"
description: "Modify the bar's module.height"
minimum: 10
maximum: 128
}
NumberStepper {
label: "Workspace Indicators"
prefField: barKey + ".modules.workspaces.workspaceIndicators"
description: "Adjust how many workspace indicators to show."
minimum: 1
maximum: 10
}
}
ContentCard {
StyledText {
text: "Bar Modules"
font.pixelSize: Metrics.fontSize(20)
font.bold: true
}
StyledText {
text: "Workspaces"
font.pixelSize: Metrics.fontSize(18)
font.bold: true
}
StyledSwitchOption {
title: "Enabled"
description: "Show workspace indicator module"
prefField: barKey + ".modules.workspaces.enabled"
}
StyledSwitchOption {
title: "Show App Icons"
description: "Display application icons in workspace indicators"
prefField: barKey + ".modules.workspaces.showAppIcons"
enabled: !barKey.modules.workspaces.showJapaneseNumbers && Compositor.require("hyprland")
opacity: !barKey.modules.workspaces.showJapaneseNumbers && Compositor.require("hyprland") ? 1 : 0.8
}
StyledSwitchOption {
title: "Show Japanese Numbers"
description: "Use Japanese-style numbers instead of standard numerals"
prefField: barKey + ".modules.workspaces.showJapaneseNumbers"
enabled: !barKey.modules.workspaces.showAppIcons
opacity: !barKey.modules.workspaces.showAppIcons ? 1 : 0.8
}
StyledText {
text: "Status Icons"
font.pixelSize: Metrics.fontSize(18)
font.bold: true
}
StyledSwitchOption {
title: "Enabled"
description: "Show status icons module (wifi, bluetooth)"
prefField: barKey + ".modules.statusIcons.enabled"
}
StyledSwitchOption {
title: "Show Wifi Status"
description: "Display wifi connection status and signal strength"
prefField: barKey + ".modules.statusIcons.networkStatusEnabled"
}
StyledSwitchOption {
title: "Show Bluetooth Status"
description: "Display bluetooth connection status"
prefField: barKey + ".modules.statusIcons.bluetoothStatusEnabled"
}
StyledText {
text: "System Stats"
font.pixelSize: Metrics.fontSize(18)
font.bold: true
}
StyledSwitchOption {
title: "Enabled"
description: "Show system resource monitoring module"
prefField: barKey + ".modules.systemUsage.enabled"
}
StyledSwitchOption {
title: "Show Cpu Usage Stats"
description: "Display CPU usage percentage and load"
prefField: barKey + ".modules.systemUsage.cpuStatsEnabled"
}
StyledSwitchOption {
title: "Show Memory Usage Stats"
description: "Display RAM usage and available memory"
prefField: barKey + ".modules.systemUsage.memoryStatsEnabled"
}
StyledSwitchOption {
title: "Show Cpu Temperature Stats"
description: "Display CPU temperature readings"
prefField: barKey + ".modules.systemUsage.tempStatsEnabled"
}
}
}