1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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, 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 {
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 = "";
}
}
}
}
|