// Copyright (C) 2026 Danilo M. // // 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.]: 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, or pick one with the swatch"; colour: true } 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 { activeFocusOnTab: true 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 = ""; } } } }