aboutsummaryrefslogtreecommitdiffstats
path: root/desktop/modules/qtmaildir/Setting.qml
diff options
context:
space:
mode:
Diffstat (limited to 'desktop/modules/qtmaildir/Setting.qml')
-rw-r--r--desktop/modules/qtmaildir/Setting.qml50
1 files changed, 29 insertions, 21 deletions
diff --git a/desktop/modules/qtmaildir/Setting.qml b/desktop/modules/qtmaildir/Setting.qml
index 66d0a46..78103bf 100644
--- a/desktop/modules/qtmaildir/Setting.qml
+++ b/desktop/modules/qtmaildir/Setting.qml
@@ -12,10 +12,11 @@
import QtQuick
import "../.."
-// One labelled key of qtmaildir.conf: a text field that saves on Enter.
-// Emptied, the key is unset and qtmaildir uses its default, which the
-// placeholder names. kind "int" or "float" checks the number and its range
-// before writing; a refused value shows why under the row.
+// One labelled key of qtmaildir.conf: a text field that edits the draft as
+// it is typed; the page's Save writes it. Emptied, the key is unset and
+// qtmaildir uses its default, which the placeholder names. kind "int" or
+// "float" checks the number and its range: a refused value stays out of the
+// draft, shows why under the row, and holds Save back until it is fixed.
Column {
id: s
property string section
@@ -36,20 +37,31 @@ Column {
readonly property string value: Qtm.get(s.section, s.key) ?? ""
property string problem: ""
- function commit(t) {
+ function apply(t) {
t = t.trim();
- if (t === "") { s.problem = ""; Qtm.set(s.section, s.key, null); return; }
- if (s.kind !== "text") {
+ let bad = "";
+ if (t !== "" && s.kind !== "text") {
const n = Number(t);
- if (isNaN(n) || (s.kind === "int" && !Number.isInteger(n)) || n < s.min || n > s.max) {
- s.problem = s.kind === "int" ? `a whole number from ${s.min} to ${s.max}`
- : `a number from ${s.min} to ${s.max}`;
- return;
- }
+ if (isNaN(n) || (s.kind === "int" && !Number.isInteger(n)) || n < s.min || n > s.max)
+ bad = s.kind === "int" ? `a whole number from ${s.min} to ${s.max}`
+ : `a number from ${s.min} to ${s.max}`;
}
- s.problem = "";
- Qtm.set(s.section, s.key, t);
+ s.problem = bad;
+ Qtm.markInvalid(s.objectName, bad !== "");
+ if (bad === "") Qtm.set(s.section, s.key, t === "" ? null : t);
+ }
+
+ // The field is not bound to the value, which would reset the cursor and
+ // eat a typed trailing space; it follows the value only when the draft
+ // moves under it (Discard, a colour picked, a save of another page).
+ onValueChanged: if (ti.text.trim() !== s.value && s.problem === "") ti.text = s.value
+ Connections {
+ target: Qtm
+ function onInvalidChanged() { if (s.problem !== "" && !Qtm.invalid[s.objectName]) { s.problem = ""; ti.text = s.value; } }
}
+ // A field that goes away cannot hold Save back; the draft keeps its last
+ // good value.
+ Component.onDestruction: Qtm.markInvalid(s.objectName, false)
Item {
width: s.width
@@ -69,7 +81,7 @@ Column {
visible: s.colour
width: s.colour ? 34 : 0
colour: s.value
- onPicked: hex => s.commit(hex)
+ onPicked: hex => s.apply(hex)
}
Rectangle {
anchors { left: lbl.right; leftMargin: 8; right: pick.left; rightMargin: s.colour ? 8 : 0
@@ -84,12 +96,8 @@ Column {
selectByMouse: true
color: Theme.text
font { family: Theme.fontFamily; pixelSize: Theme.fontSize - 2 }
- text: s.value
- onAccepted: if (text !== s.value) s.commit(text)
- Keys.onEscapePressed: event => {
- if (text !== s.value) text = s.value;
- else event.accepted = false;
- }
+ Component.onCompleted: text = s.value
+ onTextEdited: s.apply(text)
Text {
anchors.verticalCenter: parent.verticalCenter
width: parent.width