aboutsummaryrefslogtreecommitdiffstats
path: root/desktop/SaveBar.qml
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-10-17 11:34:07 +0200
committerDanilo M. <danix@danix.xyz>2026-10-17 11:34:07 +0200
commit080d3d9aaffa8848d6de8546511f096d8e7c30f5 (patch)
tree2663bd5c774d8db7fa024e82546f6cfa04c07e29 /desktop/SaveBar.qml
parentb8c0f01f058c87db5924067dbb475aa241c71b46 (diff)
downloadquickshell-080d3d9aaffa8848d6de8546511f096d8e7c30f5.tar.gz
quickshell-080d3d9aaffa8848d6de8546511f096d8e7c30f5.zip
settings: pages edit a draft, and Save writes it
The qtmaildir, Assistant and Ask presets pages wrote a field on Enter, and a switch or chip the moment it was clicked, so a half-finished change reached the file and a slip could not be taken back. They now edit a draft as fields are typed, and a Save and Discard pair in the page header (SaveBar, through Page.actions) writes or drops it. Save waits while a field holds a value that cannot be written, and a draft over a file that changed on disk meanwhile is refused at Save rather than written over it. A dot in the sidebar marks a page with unsaved edits; drafts survive moving between pages. The four Mail pages share one draft, since they are one file. Tool switches are staged too and renamed on Save; model Load, Prefer and Restart stay immediate, being actions rather than settings. Live editing needed two rules. A field is no longer bound to its value, which would reset the cursor and eat a typed trailing space; it follows the value only when the draft moves under it. And a Repeater's model is now the set of row keys (or a count), assigned only when that set changes: an array rebuilt from the draft on each keystroke recreates every row, including the one being typed in, which loses its focus. Git, autostart's rows, HyprSunset, HyprIdle and User keep their own buttons. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'desktop/SaveBar.qml')
-rw-r--r--desktop/SaveBar.qml43
1 files changed, 43 insertions, 0 deletions
diff --git a/desktop/SaveBar.qml b/desktop/SaveBar.qml
new file mode 100644
index 0000000..aa64868
--- /dev/null
+++ b/desktop/SaveBar.qml
@@ -0,0 +1,43 @@
+// Copyright (C) 2026 Danilo M. <danix@danix.xyz>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2 as
+// published by the Free Software Foundation.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+import QtQuick
+
+// Save and Discard for a settings page that edits a draft: its fields change
+// the draft, and nothing reaches the file until Save. Sits in the Page header
+// through Page.actions. note says what is wrong when Save is held back.
+Row {
+ id: bar
+ property bool dirty: false
+ property bool valid: true
+ property string note: ""
+ signal save
+ signal discard
+ spacing: 8
+
+ Text {
+ anchors.verticalCenter: parent.verticalCenter
+ visible: bar.dirty
+ text: !bar.valid ? (bar.note || "fix the fields marked red") : "unsaved changes"
+ color: bar.valid ? Theme.yellow : Theme.red
+ font { family: Theme.fontFamily; pixelSize: Theme.fontSize - 4 }
+ }
+ Button {
+ text: "Discard"
+ enabled: bar.dirty
+ onClicked: bar.discard()
+ }
+ Button {
+ text: "Save"
+ enabled: bar.dirty && bar.valid
+ onClicked: bar.save()
+ }
+}