// 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: "Panama 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. 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" } ChoiceRow { setting: "followMouse"; 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 Panama's 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 Panama defaults" detail: "Applies immediately, including to the compositor" action: "Restore defaults" divider: false onTriggered: SystemSettings.restoreDefaults() } } }