173 lines
6.3 KiB
QML
173 lines
6.3 KiB
QML
// Desktop & Dock.
|
|
//
|
|
// The dock timings used to be shown here as text -- "Instant", "250 ms" -- even
|
|
// though they were already stored, mutable integers. They are controls now.
|
|
// The window-layout card keeps text rows because those really are facts about
|
|
// how Panama tiles rather than settings: the adjustable parts of window
|
|
// appearance live on the Appearance page, next to the preview that explains
|
|
// them.
|
|
|
|
import QtQuick
|
|
import qs.config
|
|
import qs.services
|
|
|
|
SettingsPage {
|
|
id: root
|
|
|
|
title: "Desktop & Dock"
|
|
lede: "Keep the shell instant, spatial, and out of your way."
|
|
|
|
SettingsCard {
|
|
title: "Dock"
|
|
|
|
ToggleRow { setting: "dockAutohide" }
|
|
SliderRow { setting: "dockRevealDelayMs"; zeroLabel: "Instant" }
|
|
SliderRow { setting: "dockHideDelayMs"; zeroLabel: "Instant"; divider: false }
|
|
}
|
|
|
|
SettingsCard {
|
|
title: "Pinned applications"
|
|
subtitle: "What sits in the Dock whether or not it is running. Order here is the order on screen."
|
|
|
|
DockPinsEditor {
|
|
id: pins
|
|
width: parent.width
|
|
}
|
|
}
|
|
|
|
SettingsCard {
|
|
title: "Pin another application"
|
|
|
|
DockAppPicker {
|
|
width: parent.width
|
|
pinned: pins.pinned
|
|
onPicked: id => pins.add(id)
|
|
}
|
|
}
|
|
|
|
SettingsCard {
|
|
title: "Window layout"
|
|
subtitle: "Follows the Forge mental model, with native Hyprland tiling."
|
|
|
|
// These were two read-only rows reporting "Tiling" and "Dynamic", which
|
|
// described settings rather than facts -- both are ordinary Hyprland
|
|
// options that simply had no controls. TextRow's own documentation says
|
|
// a setting the user could reasonably change does not belong in it.
|
|
ChoiceRow { setting: "windowLayout" }
|
|
ToggleRow { setting: "preserveSplit" }
|
|
ChoiceRow { setting: "forceSplit" }
|
|
ToggleRow { setting: "windowSnapping" }
|
|
ActionRow {
|
|
label: "Gaps, corners, and effects"
|
|
detail: "Adjusted on the Appearance page, beside a live preview"
|
|
action: "Open Appearance"
|
|
divider: false
|
|
onTriggered: ShellState.openSettings("appearance")
|
|
}
|
|
}
|
|
|
|
// GNOME's Multitasking panel, in Hyprland's terms.
|
|
// Only meaningful when the layout above is Master and stack. Hidden
|
|
// otherwise, because a card of settings that do nothing under the layout
|
|
// you are actually running is worse than not offering the layout at all.
|
|
SettingsCard {
|
|
visible: DesktopPreferences.get("windowLayout") === "master"
|
|
title: "Master and stack"
|
|
subtitle: "How the master area behaves. These apply only while the tiling layout above is Master and stack."
|
|
|
|
SliderRow { setting: "masterFactor" }
|
|
ChoiceRow { setting: "masterOrientation" }
|
|
ChoiceRow { setting: "masterNewStatus" }
|
|
ToggleRow { setting: "masterNewOnTop"; divider: false }
|
|
}
|
|
|
|
SettingsCard {
|
|
title: "Window edges"
|
|
subtitle: "How the pointer grabs a window's border, and how floating windows behave near each other and the screen edge."
|
|
|
|
ToggleRow { setting: "resizeOnBorder" }
|
|
SliderRow { setting: "borderGrabArea"; zeroLabel: "Border only" }
|
|
ToggleRow { setting: "hoverIconOnBorder" }
|
|
SliderRow { setting: "snapWindowGap"; zeroLabel: "Touching" }
|
|
SliderRow { setting: "snapMonitorGap"; zeroLabel: "Touching" }
|
|
ToggleRow { setting: "snapRespectGaps"; divider: false }
|
|
}
|
|
|
|
// Hyprland's own interruptions. Panama turns all four off, which is a
|
|
// defensible default and was not previously a decision anyone could
|
|
// reverse without editing looks.lua.
|
|
SettingsCard {
|
|
title: "Hyprland notices"
|
|
subtitle: "Panama hides all of these by default. They are the compositor's own, not Panama's."
|
|
|
|
ToggleRow { setting: "hyprlandLogo" }
|
|
ToggleRow { setting: "hyprlandSplash" }
|
|
ToggleRow { setting: "hyprlandUpdateNews" }
|
|
ToggleRow { setting: "hyprlandDonationNag"; divider: false }
|
|
}
|
|
|
|
SettingsCard {
|
|
title: "Workspaces & focus"
|
|
subtitle: "Hyprland's workspaces are created and destroyed as you use them, so there is no fixed count to set."
|
|
|
|
ToggleRow { setting: "workspaceBackAndForth" }
|
|
ToggleRow { setting: "allowWorkspaceCycles" }
|
|
ToggleRow { setting: "focusOnActivate" }
|
|
ToggleRow { setting: "mouseMoveFocusesMonitor"; divider: false }
|
|
}
|
|
|
|
SettingsCard {
|
|
title: "Focus"
|
|
|
|
SliderRow { setting: "focusDurationMinutes"; divider: false }
|
|
}
|
|
|
|
SettingsCard {
|
|
title: "Snapshots"
|
|
subtitle: SettingsBackup.lastError !== ""
|
|
? SettingsBackup.lastError
|
|
: "Your whole desktop configuration is one file, so a snapshot is a copy of it. Restoring also snapshots what it replaces, so it is itself undoable."
|
|
|
|
ActionRow {
|
|
label: "Back up current settings"
|
|
detail: SettingsBackup.snapshots.length === 0
|
|
? "No snapshots yet"
|
|
: SettingsBackup.snapshots.length + (SettingsBackup.snapshots.length === 1 ? " snapshot kept" : " snapshots kept") + ", newest first"
|
|
action: "Back up now"
|
|
enabled: !SettingsBackup.busy
|
|
divider: SettingsBackup.snapshots.length > 0
|
|
onTriggered: SettingsBackup.save()
|
|
}
|
|
|
|
Repeater {
|
|
id: snapshotRows
|
|
model: SettingsBackup.snapshots
|
|
|
|
ActionRow {
|
|
required property var modelData
|
|
required property int index
|
|
|
|
label: modelData.when
|
|
detail: modelData.keys + " settings"
|
|
action: "Restore"
|
|
enabled: !SettingsBackup.busy
|
|
divider: index < snapshotRows.count - 1
|
|
onTriggered: SettingsBackup.restore(modelData.name)
|
|
}
|
|
}
|
|
}
|
|
|
|
SettingsCard {
|
|
title: "Reset"
|
|
subtitle: "Restores the appearance, dock, clock, focus, and display policy, and clears your Home accessory arrangement. Pinned applications, files, and paired devices are not changed."
|
|
|
|
ActionRow {
|
|
label: "Restore defaults"
|
|
detail: "Applies immediately, including to the compositor"
|
|
action: "Restore defaults"
|
|
divider: false
|
|
onTriggered: SystemSettings.restoreDefaults()
|
|
}
|
|
}
|
|
}
|