aboutsummaryrefslogtreecommitdiffstats
path: root/desktop/modules/qtmaildir/AccountsPage.qml
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-10-17 11:08:49 +0200
committerDanilo M. <danix@danix.xyz>2026-10-17 11:08:49 +0200
commitc6fc5bbef45bcfa4f8d5e50ca7401aa1f5b6bc7d (patch)
tree775fa89b284c68d30205c58d83fae55336676f60 /desktop/modules/qtmaildir/AccountsPage.qml
parent8e9d8b9ac1b593032dea9eca312fa1495c0c8858 (diff)
downloadquickshell-c6fc5bbef45bcfa4f8d5e50ca7401aa1f5b6bc7d.tar.gz
quickshell-c6fc5bbef45bcfa4f8d5e50ca7401aa1f5b6bc7d.zip
settings: qtmaildir's config, in four Mail pages
qtmaildir is configured through qtmaildir.conf alone, which it reads at startup and never writes. Four settings pages under a new Mail group edit it: Mail ([general], [sync], [completion]), Compose, Accounts (a card per account, add and remove) and Tags & shortcuts ([tagcolors] and [keys]). Fields save on Enter and unset when emptied, with qtmaildir's defaults as placeholders and numbers range-checked; the pages say when qtmaildir is running and a change waits for its restart. Ini.js edits the file line by line so its comments survive. Headers are only whole [name] lines: a section is never cut at the next "[", since values such as [Gmail]/Bozze hold brackets, the trap AGENTS.md records. The shortcut actions are copied from qtmaildir's KeyMap::knownActions() rather than exported by it, since a CLI flag there would have meant translations and a changelog entry; the field also takes free text, and the copy is marked as a ponytail ceiling. The settings sidebar now clips, which a list long enough to scroll showed it did not: entries drew over the search box. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'desktop/modules/qtmaildir/AccountsPage.qml')
-rw-r--r--desktop/modules/qtmaildir/AccountsPage.qml129
1 files changed, 129 insertions, 0 deletions
diff --git a/desktop/modules/qtmaildir/AccountsPage.qml b/desktop/modules/qtmaildir/AccountsPage.qml
new file mode 100644
index 0000000..2f82154
--- /dev/null
+++ b/desktop/modules/qtmaildir/AccountsPage.qml
@@ -0,0 +1,129 @@
+// 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
+import "../.."
+
+// One card per [account.<key>]: every key qtmaildir reads for an account.
+// Add appends a section with the folders most servers use; Remove asks once
+// and deletes the section. The key itself is the account's identity and is
+// not edited here.
+Column {
+ id: page
+ spacing: 10
+ Note {}
+
+ property string confirming: ""
+ property string newKey: ""
+ readonly property bool keyOk: /^[A-Za-z0-9._-]+$/.test(page.newKey) && !Qtm.accounts.includes(page.newKey)
+
+ Repeater {
+ model: Qtm.accounts
+
+ delegate: Rectangle {
+ id: card
+ required property string modelData
+ readonly property string sec: "account." + modelData
+ objectName: "account:" + modelData
+ width: page.width
+ height: body.implicitHeight + 24
+ radius: 10
+ color: Qt.alpha(Theme.surface, 0.35)
+
+ Column {
+ id: body
+ anchors { left: parent.left; right: parent.right; top: parent.top; margins: 12 }
+ spacing: 6
+
+ Item {
+ width: parent.width
+ height: 32
+ Rectangle {
+ id: swatch
+ anchors { left: parent.left; verticalCenter: parent.verticalCenter }
+ width: 14; height: 14; radius: 4
+ color: Qtm.get(card.sec, "color") || Theme.overlay
+ }
+ Text {
+ anchors { left: swatch.right; leftMargin: 10; verticalCenter: parent.verticalCenter }
+ text: card.modelData
+ color: Theme.text
+ font { family: Theme.fontFamily; pixelSize: Theme.fontSize - 1; bold: true }
+ }
+ Button {
+ anchors { right: parent.right; verticalCenter: parent.verticalCenter }
+ danger: true
+ text: page.confirming === card.modelData ? "Confirm" : "Remove"
+ onClicked: {
+ if (page.confirming === card.modelData) { page.confirming = ""; Qtm.removeAccount(card.modelData); }
+ else page.confirming = card.modelData;
+ }
+ }
+ }
+
+ Setting { section: card.sec; key: "name"; label: "Name" }
+ Setting { section: card.sec; key: "address"; label: "Address" }
+ Setting { section: card.sec; key: "maildir"; label: "Maildir"; hint: "Relative to notmuch's mail root." }
+ Setting { section: card.sec; key: "inbox"; label: "Inbox"; placeholder: "Inbox" }
+ Setting { section: card.sec; key: "sent"; label: "Sent"; placeholder: "unset: no Sent button" }
+ Setting { section: card.sec; key: "drafts"; label: "Drafts"; placeholder: "unset: no Drafts button" }
+ Setting { section: card.sec; key: "trash"; label: "Trash"; placeholder: "required for Delete" }
+ Setting { section: card.sec; key: "spam"; label: "Spam"; placeholder: "required for Mark spam" }
+ Setting { section: card.sec; key: "send_command"; label: "Send command"; placeholder: "unset: receive only"
+ hint: "Run without a shell: an absolute path and plain arguments, e.g. /usr/bin/msmtp -a work -t." }
+ Setting { section: card.sec; key: "label"; label: "Chip label"; placeholder: card.modelData }
+ Setting { section: card.sec; key: "color"; label: "Chip colour"; placeholder: "generated"
+ hint: "#rrggbb" }
+ Setting { section: card.sec; key: "channel"; label: "mbsync channel"; placeholder: card.modelData }
+ }
+ }
+ }
+
+ Heading { text: "Add an account" }
+ Item {
+ width: page.width
+ height: 34
+ Rectangle {
+ anchors { left: parent.left; right: addBtn.left; rightMargin: 8; top: parent.top; bottom: parent.bottom }
+ radius: 8
+ color: Theme.surface
+ TextInput {
+ anchors { fill: parent; leftMargin: 10; rightMargin: 10 }
+ verticalAlignment: TextInput.AlignVCenter
+ clip: true
+ selectByMouse: true
+ color: Theme.text
+ font { family: Theme.fontFamily; pixelSize: Theme.fontSize - 2 }
+ text: page.newKey
+ onTextEdited: page.newKey = text
+ onAccepted: addBtn.clicked(null)
+ Text {
+ anchors.verticalCenter: parent.verticalCenter
+ visible: parent.text === ""
+ text: "account key: letters, digits, dot, dash, underscore"
+ color: Theme.overlay
+ font: parent.font
+ }
+ }
+ }
+ Button {
+ id: addBtn
+ anchors { right: parent.right; verticalCenter: parent.verticalCenter }
+ text: "Add"
+ enabled: page.keyOk
+ onClicked: {
+ if (!page.keyOk) return;
+ Qtm.addAccount(page.newKey, [["maildir", page.newKey], ["trash", "Trash"], ["spam", "Spam"]]);
+ page.newKey = "";
+ }
+ }
+ }
+}