// Workspaces. // // Where windows go, how long a focus session runs, and the layouts you saved. // Projects are saved from the launcher rather than created here: a layout is // worth recording at the moment you have it right, not from a settings page // where you would have to describe it. import QtQuick import qs.config import qs.services SettingsPage { id: root // Which project is one click from being forgotten. Same in-place confirm the // SSH Keys and Snapshots pages use. property string confirmingProject: "" title: "Workspaces" lede: "Workspaces, focus, and the projects that restore them." 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" } ToggleRow { setting: "windowSwallow"; divider: false } } // Saved here, not created here. A layout is worth recording at the moment // you have it right, so saving is a launcher command; this is where the // ones you kept are reviewed and the ones you did not are removed. SettingsCard { title: "Projects" subtitle: Projects.projects.length > 0 ? "Saved window layouts. Opening one claims free workspaces, so it never lands on top of what you are doing." : "No saved layouts yet. Arrange your windows, then run \"Save Layout as Project\" from the launcher." Repeater { model: Projects.projects delegate: SettingRow { id: projectRow required property var modelData required property int index readonly property string projectName: String(projectRow.modelData.name ?? "") readonly property bool confirming: root.confirmingProject === projectRow.projectName label: projectRow.projectName detail: projectRow.confirming ? "Forgetting this only removes the layout. Nothing that is open closes." : projectRow.modelData.windows + " windows across " + projectRow.modelData.workspaces + " workspaces — " + (projectRow.modelData.applications ?? []).join(", ") divider: projectRow.index < Projects.projects.length - 1 controlWidth: 210 Row { anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter spacing: 8 SettingsButton { anchors.verticalCenter: parent.verticalCenter visible: !projectRow.confirming text: "Open" enabled: !Projects.busy onClicked: Projects.open(projectRow.projectName) } SettingsButton { anchors.verticalCenter: parent.verticalCenter visible: projectRow.confirming text: "Forget it" tone: "danger" enabled: !Projects.busy onClicked: { root.confirmingProject = ""; Projects.remove(projectRow.projectName); } } SettingsButton { anchors.verticalCenter: parent.verticalCenter text: projectRow.confirming ? "Keep" : "Forget" enabled: !Projects.busy onClicked: root.confirmingProject = projectRow.confirming ? "" : projectRow.projectName } } } } TextRow { visible: Projects.lastError !== "" label: "Problem" detail: Projects.lastError divider: false } } }