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
134 lines
5.0 KiB
QML
134 lines
5.0 KiB
QML
// Appearance — the page the rest of the settings vocabulary was built for.
|
|
//
|
|
// Before Stage 3 this page adjusted a clock format and three vitals toggles,
|
|
// and its "Theme" card was two rows of text pretending to be controls. It now
|
|
// drives the compositor directly: every row here is applied through
|
|
// `hyprctl eval` and confirmed by reading the value back before it is stored.
|
|
//
|
|
// The preview is pinned above the controls rather than sitting inline, because
|
|
// the numbers are meaningless on their own -- "outer gaps 24" only means
|
|
// something once you have watched the windows move apart by that much, at the
|
|
// scale of the display you actually use.
|
|
|
|
import QtQuick
|
|
import qs.config
|
|
import qs.services
|
|
|
|
SettingsPage {
|
|
id: root
|
|
|
|
title: "Appearance"
|
|
lede: "Drag anything below. The preview above is your real geometry, to scale."
|
|
|
|
header: Component {
|
|
Column {
|
|
spacing: 9
|
|
|
|
DesktopPreview {
|
|
width: parent.width
|
|
}
|
|
|
|
Text {
|
|
width: parent.width
|
|
horizontalAlignment: Text.AlignHCenter
|
|
text: SystemSettings.lastError !== ""
|
|
? SystemSettings.lastError
|
|
: "Live preview — the focused window wears the prism border"
|
|
color: SystemSettings.lastError !== "" ? Theme.warn : Theme.fgMuted
|
|
font.family: Theme.fontFamily
|
|
font.pixelSize: Theme.fontSizeSmall
|
|
elide: Text.ElideRight
|
|
}
|
|
}
|
|
}
|
|
|
|
SettingsCard {
|
|
title: "Background"
|
|
subtitle: Wallpaper.lastError !== ""
|
|
? Wallpaper.lastError
|
|
: "Applied to every display. Panama looks in ~/Pictures/Wallpapers, ~/Pictures/Backgrounds, ~/.local/share/backgrounds, and /usr/share/backgrounds."
|
|
|
|
WallpaperPicker {
|
|
width: parent.width
|
|
}
|
|
|
|
ActionRow {
|
|
label: "Look for new images"
|
|
detail: Wallpaper.scanning
|
|
? "Scanning…"
|
|
: Wallpaper.available.length + " image" + (Wallpaper.available.length === 1 ? "" : "s") + " found"
|
|
action: "Rescan"
|
|
divider: false
|
|
enabled: !Wallpaper.scanning
|
|
onTriggered: Wallpaper.rescan()
|
|
}
|
|
}
|
|
|
|
SettingsCard {
|
|
title: "Windows"
|
|
subtitle: "Spacing and shape of tiled windows. Each change is applied to the compositor and confirmed before it is saved."
|
|
|
|
SliderRow { setting: "windowRounding" }
|
|
SliderRow { setting: "gapsIn" }
|
|
SliderRow { setting: "gapsOut" }
|
|
SliderRow { setting: "borderSize"; zeroLabel: "None" }
|
|
SliderRow { setting: "inactiveOpacity"; divider: false }
|
|
}
|
|
|
|
SettingsCard {
|
|
title: "Effects"
|
|
subtitle: "Each of these costs frame time. Turning one off is a legitimate way to buy it back while gaming."
|
|
|
|
ToggleRow { setting: "blurEnabled" }
|
|
SliderRow { setting: "blurSize" }
|
|
SliderRow { setting: "blurPasses" }
|
|
ToggleRow { setting: "shadowEnabled" }
|
|
SliderRow { setting: "shadowRange"; zeroLabel: "None" }
|
|
ToggleRow { setting: "glowEnabled" }
|
|
SliderRow { setting: "glowRange"; zeroLabel: "None" }
|
|
ToggleRow { setting: "animationsEnabled"; divider: false }
|
|
}
|
|
|
|
SettingsCard {
|
|
title: "Clock"
|
|
|
|
ToggleRow { setting: "use24Hour" }
|
|
ToggleRow { setting: "showSeconds" }
|
|
ToggleRow { setting: "showWeekday"; divider: false }
|
|
}
|
|
|
|
SettingsCard {
|
|
title: "System vitals"
|
|
subtitle: "Choose what appears beside the workspace indicator."
|
|
|
|
ToggleRow { setting: "showCpu" }
|
|
ToggleRow { setting: "showMemory" }
|
|
ToggleRow { setting: "showGpu"; divider: GraphicsDevices.devices.length > 1 || GraphicsDevices.selectionMissing }
|
|
|
|
// Only worth asking when there is a choice to make.
|
|
ChoiceGrid {
|
|
visible: GraphicsDevices.devices.length > 1 || GraphicsDevices.selectionMissing
|
|
width: parent.width
|
|
label: "Graphics device"
|
|
detail: GraphicsDevices.selectionMissing
|
|
? "The stored device is not present on this machine, so the graphics readout is hidden. Choose one below."
|
|
: "Which GPU the graphics readout measures."
|
|
options: GraphicsDevices.devices.map(device => ({
|
|
value: device.path,
|
|
label: GraphicsDevices.shortName(device.name)
|
|
}))
|
|
current: GraphicsDevices.selectedPath
|
|
divider: false
|
|
onPicked: value => GraphicsDevices.select(value)
|
|
}
|
|
}
|
|
|
|
SettingsCard {
|
|
title: "Theme"
|
|
subtitle: "Panama has one curated visual identity rather than a matrix of partially compatible themes. The controls above adjust its parameters — how much space, how soft, how much motion — without replacing it."
|
|
|
|
TextRow { label: "Color palette"; detail: "Tokyo Night Moon"; value: "Prism" }
|
|
TextRow { label: "Interface type"; detail: "Adwaita Sans"; value: "System"; divider: false }
|
|
}
|
|
}
|