aboutsummaryrefslogtreecommitdiffstats
path: root/desktop/modules/qtmaildir/AccountsPage.qml
blob: 8a40333094e813f77c64919a26b271dc0b8e18d8 (plain)
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 = "";
            }
        }
    }
}