The last two values that could only be changed by editing a file. Weather was pinned to hardcoded coordinates, so the card could not be pointed anywhere else. It is a location search now, not latitude and longitude fields: nobody knows their own coordinates, and a control that demands them is one nobody uses. Open-Meteo's geocoding endpoint needs no key, the same reason the forecast already uses them. Only the search term leaves the machine -- the stored place name is a label -- and coordinates are rounded to four decimals, far finer than a weather reading resolves and coarse enough to keep a precise home location out of the settings file. The graphics readout was hardcoded to card1. This machine has two amdgpu cards, discrete and integrated, so that was right only by luck, and the path is meaningless on any other machine. GPUs are enumerated with a readable name from lspci, since sysfs exposes only numeric ids, and the picker appears only when there is more than one to choose between. A stored path the machine does not have is refused and reported rather than silently measuring nothing. Also merges the per-application notification rules UI. Its three commits were believed integrated but the page half was not actually in the tree: main had the service side in Notifs.qml and zero references to setAppRule in NotificationsPage. Ancestry is not content. Claude-Session: https://claude.ai/code/session_01BRvzt4H8XXLPVH5MyYdk9L
171 lines
6.3 KiB
QML
171 lines
6.3 KiB
QML
import QtQuick
|
||
import qs.config
|
||
import qs.services
|
||
|
||
SettingsPage {
|
||
id: root
|
||
|
||
readonly property int openedHour: new Date().getHours()
|
||
readonly property string greeting: openedHour < 12 ? "Good morning" : (openedHour < 18 ? "Good afternoon" : "Good evening")
|
||
|
||
title: `${root.greeting}, Gabriel`
|
||
lede: "Your Panama desktop is configured and ready."
|
||
|
||
SettingsCard {
|
||
title: SystemSettings.monitorDescription || "Active display"
|
||
subtitle: SystemSettings.monitorName || "Detecting your display…"
|
||
|
||
Grid {
|
||
id: monitorLayout
|
||
|
||
width: parent.width
|
||
columns: width >= 620 ? 2 : 1
|
||
columnSpacing: 28
|
||
rowSpacing: 16
|
||
|
||
Item {
|
||
width: monitorLayout.columns === 2
|
||
? (monitorLayout.width - monitorLayout.columnSpacing) * 0.47
|
||
: monitorLayout.width
|
||
height: 164
|
||
|
||
Rectangle {
|
||
width: Math.min(parent.width - 24, 260)
|
||
height: width * 0.64
|
||
anchors.horizontalCenter: parent.horizontalCenter
|
||
anchors.top: parent.top
|
||
anchors.topMargin: 5
|
||
radius: 12
|
||
color: Theme.alpha(Theme.bgDark, 0.94)
|
||
border.width: 1
|
||
border.color: Theme.alpha(Theme.accent, 0.34)
|
||
|
||
Rectangle {
|
||
anchors.fill: parent
|
||
anchors.margins: 10
|
||
radius: 7
|
||
gradient: Gradient {
|
||
orientation: Gradient.Horizontal
|
||
GradientStop { position: 0; color: Theme.mix(Theme.bg, Theme.accent, 0.08) }
|
||
GradientStop { position: 1; color: Theme.mix(Theme.bg, Theme.accentSecondary, 0.08) }
|
||
}
|
||
|
||
Text {
|
||
anchors.centerIn: parent
|
||
text: SystemSettings.monitorName || "DISPLAY"
|
||
color: Theme.fgMuted
|
||
font.family: Theme.fontFamily
|
||
font.pixelSize: Theme.fontSizeSmall
|
||
font.letterSpacing: 1.5
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
Column {
|
||
width: monitorLayout.columns === 2
|
||
? (monitorLayout.width - monitorLayout.columnSpacing) * 0.47
|
||
: monitorLayout.width
|
||
height: monitorLayout.columns === 2 ? 164 : implicitHeight
|
||
spacing: 13
|
||
|
||
Text {
|
||
text: `${SystemSettings.monitorWidth} × ${SystemSettings.monitorHeight}`
|
||
color: Theme.fg
|
||
font.family: Theme.fontFamily
|
||
font.features: Theme.tabularFigures
|
||
font.pixelSize: Theme.fontSizeLarge
|
||
font.weight: Font.DemiBold
|
||
}
|
||
Text {
|
||
text: `${SystemSettings.monitorRefreshRate.toFixed(0)} Hz · ${SystemSettings.monitorScale.toFixed(1)}× scale`
|
||
color: Theme.fgDim
|
||
font.family: Theme.fontFamily
|
||
font.features: Theme.tabularFigures
|
||
font.pixelSize: Theme.fontSize
|
||
}
|
||
Text {
|
||
text: `${SystemSettings.monitorFormat || "Detecting format"} · ${SystemSettings.colorPreset || "standard color"}`
|
||
color: Theme.fgDim
|
||
font.family: Theme.fontFamily
|
||
font.pixelSize: Theme.fontSize
|
||
}
|
||
Text {
|
||
text: SystemSettings.autoHdr ? "Game-aware HDR is ready" : "Game-aware HDR is off"
|
||
color: SystemSettings.autoHdr ? Theme.ok : Theme.warn
|
||
font.family: Theme.fontFamily
|
||
font.pixelSize: Theme.fontSize
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
SettingsCard {
|
||
title: "Weather"
|
||
subtitle: "Local conditions in the date menu"
|
||
TextRow {
|
||
label: "Location"
|
||
detail: "Only the search term is sent; the name below is a label kept on this machine"
|
||
value: Settings.weatherLocation
|
||
}
|
||
|
||
LocationPicker {
|
||
width: parent.width
|
||
}
|
||
|
||
ChoiceRow { setting: "temperatureUnit" }
|
||
SliderRow { setting: "weatherRefreshMinutes"; divider: false }
|
||
}
|
||
|
||
SettingsCard {
|
||
title: "System vitals"
|
||
subtitle: "Processor, memory, and graphics activity in the bar"
|
||
SliderRow { setting: "vitalsIntervalMs"; divider: false }
|
||
}
|
||
|
||
Grid {
|
||
id: summaryCards
|
||
|
||
width: parent.width
|
||
columns: width >= 720 ? 2 : 1
|
||
columnSpacing: 16
|
||
rowSpacing: 16
|
||
|
||
SettingsCard {
|
||
width: summaryCards.columns === 2
|
||
? (summaryCards.width - summaryCards.columnSpacing) / 2
|
||
: summaryCards.width
|
||
title: "Quiet focus"
|
||
subtitle: "Notifications and focused work"
|
||
|
||
SettingRow {
|
||
label: "Do Not Disturb"
|
||
detail: Notifs.doNotDisturb ? "Banners are currently quiet" : "Notification banners are visible"
|
||
divider: false
|
||
controlWidth: 48
|
||
SettingsToggle {
|
||
anchors.right: parent.right
|
||
anchors.verticalCenter: parent.verticalCenter
|
||
checked: Notifs.doNotDisturb
|
||
onToggled: value => Notifs.doNotDisturb = value
|
||
}
|
||
}
|
||
}
|
||
|
||
SettingsCard {
|
||
width: summaryCards.columns === 2
|
||
? (summaryCards.width - summaryCards.columnSpacing) / 2
|
||
: summaryCards.width
|
||
title: "Desktop services"
|
||
subtitle: "The essentials are running"
|
||
|
||
TextRow {
|
||
label: "Sync & remote access"
|
||
detail: `${SystemSettings.nextcloudActive ? "Nextcloud ready" : "Nextcloud stopped"} · ${SystemSettings.rustdeskActive ? "RustDesk ready" : "RustDesk stopped"}`
|
||
divider: false
|
||
value: SystemSettings.nextcloudActive && SystemSettings.rustdeskActive ? "Healthy" : "Review"
|
||
}
|
||
}
|
||
}
|
||
}
|