File indexing completed on 2024-06-02 05:31:05

0001 /*
0002  * SPDX-FileCopyrightText: 2010 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
0003  * SPDX-FileCopyrightText: 2010 Tobias Koenig <tokoe@kdab.com>
0004  *
0005  * SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 
0008 #include "aclentrydialog_p.h"
0009 #include "aclutils_p.h"
0010 
0011 #include <PimCommonAkonadi/AddresseeLineEdit>
0012 
0013 #include <Akonadi/EmailAddressSelectionDialog>
0014 
0015 #include <KLocalizedString>
0016 
0017 #include <QButtonGroup>
0018 #include <QDialogButtonBox>
0019 #include <QGridLayout>
0020 #include <QGroupBox>
0021 #include <QLabel>
0022 #include <QPushButton>
0023 #include <QRadioButton>
0024 #include <QVBoxLayout>
0025 
0026 using namespace PimCommon;
0027 
0028 class AclEntryDialog::AclEntryDialogPrivate
0029 {
0030 public:
0031     AclEntryDialogPrivate(AclEntryDialog *qq)
0032         : q(qq)
0033     {
0034     }
0035 
0036     void slotChanged();
0037     void slotSelectAddresses();
0038 
0039     AclEntryDialog *const q;
0040     QButtonGroup *mButtonGroup = nullptr;
0041     PimCommon::AddresseeLineEdit *mUserIdLineEdit = nullptr;
0042     QVBoxLayout *mButtonLayout = nullptr;
0043     KIMAP::Acl::Rights mCustomPermissions;
0044     QPushButton *mOkButton = nullptr;
0045 };
0046 
0047 void AclEntryDialog::AclEntryDialogPrivate::slotChanged()
0048 {
0049     mOkButton->setEnabled(!mUserIdLineEdit->text().trimmed().isEmpty() && mButtonGroup->checkedButton() != nullptr);
0050 }
0051 
0052 void AclEntryDialog::AclEntryDialogPrivate::slotSelectAddresses()
0053 {
0054     Akonadi::EmailAddressSelectionDialog dlg;
0055 
0056     if (!dlg.exec()) {
0057         return;
0058     }
0059 
0060     const QString text = !dlg.selectedAddresses().isEmpty() ? dlg.selectedAddresses().at(0).quotedEmail() : QString();
0061 
0062     mUserIdLineEdit->setText(text);
0063 }
0064 
0065 AclEntryDialog::AclEntryDialog(QWidget *parent)
0066     : QDialog(parent)
0067     , d(new AclEntryDialogPrivate(this))
0068 {
0069     auto mainLayout = new QVBoxLayout(this);
0070     auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
0071     d->mOkButton = buttonBox->button(QDialogButtonBox::Ok);
0072     d->mOkButton->setDefault(true);
0073     d->mOkButton->setShortcut(Qt::CTRL | Qt::Key_Return);
0074     connect(buttonBox, &QDialogButtonBox::accepted, this, &AclEntryDialog::accept);
0075     connect(buttonBox, &QDialogButtonBox::rejected, this, &AclEntryDialog::reject);
0076 
0077     auto page = new QWidget(this);
0078     mainLayout->addWidget(page);
0079     mainLayout->addWidget(buttonBox);
0080 
0081     auto layout = new QGridLayout(page);
0082     layout->setContentsMargins({});
0083 
0084     auto label = new QLabel(i18n("&User identifier:"), page);
0085     layout->addWidget(label, 0, 0);
0086 
0087     d->mUserIdLineEdit = new PimCommon::AddresseeLineEdit(page);
0088     layout->addWidget(d->mUserIdLineEdit, 0, 1);
0089     label->setBuddy(d->mUserIdLineEdit);
0090     d->mUserIdLineEdit->setWhatsThis(i18nc("@info:whatsthis",
0091                                            "The User Identifier is the login of the user on the IMAP server. "
0092                                            "This can be a simple user name or the full email address of the user; "
0093                                            "the login for your own account on the server will tell you which one it is."));
0094 
0095     auto button = new QPushButton(i18nc("select an email address", "Se&lect..."), page);
0096     layout->addWidget(button, 0, 2);
0097 
0098     auto groupBox = new QGroupBox(i18n("Permissions"), page);
0099     d->mButtonLayout = new QVBoxLayout(groupBox);
0100 
0101     d->mButtonGroup = new QButtonGroup(groupBox);
0102 
0103     for (unsigned int i = 0; i < AclUtils::standardPermissionsCount(); ++i) {
0104         const KIMAP::Acl::Rights aclRightPermissions = AclUtils::permissionsForIndex(i);
0105 
0106         auto radioButton = new QRadioButton(AclUtils::permissionsToUserString(aclRightPermissions), groupBox);
0107         d->mButtonLayout->addWidget(radioButton);
0108         d->mButtonGroup->addButton(radioButton, aclRightPermissions);
0109     }
0110 
0111     d->mButtonLayout->addStretch(1);
0112     layout->addWidget(groupBox, 1, 0, 1, 3);
0113 
0114     label = new QLabel(i18n("<b>Note: </b>Renaming requires write permissions on the parent folder."), page);
0115     layout->addWidget(label, 2, 0, 1, 3);
0116     layout->setRowStretch(2, 10);
0117 
0118     connect(d->mUserIdLineEdit, &AddresseeLineEdit::textChanged, this, [this]() {
0119         d->slotChanged();
0120     });
0121     connect(button, &QPushButton::clicked, this, [this]() {
0122         d->slotSelectAddresses();
0123     });
0124     connect(d->mButtonGroup, &QButtonGroup::buttonClicked, this, [this]() {
0125         d->slotChanged();
0126     });
0127 
0128     d->mOkButton->setEnabled(false);
0129 
0130     d->mUserIdLineEdit->setFocus();
0131 }
0132 
0133 AclEntryDialog::~AclEntryDialog() = default;
0134 
0135 void AclEntryDialog::setUserId(const QString &userId)
0136 {
0137     d->mUserIdLineEdit->setText(userId);
0138 
0139     d->mOkButton->setEnabled(!userId.isEmpty());
0140 }
0141 
0142 QString AclEntryDialog::userId() const
0143 {
0144     return d->mUserIdLineEdit->text();
0145 }
0146 
0147 void AclEntryDialog::setPermissions(KIMAP::Acl::Rights permissions)
0148 {
0149     QAbstractButton *button = d->mButtonGroup->button(KIMAP::Acl::normalizedRights(permissions));
0150 
0151     if (button) {
0152         button->setChecked(true);
0153     } else {
0154         auto radioButton = new QRadioButton(AclUtils::permissionsToUserString(permissions));
0155 
0156         d->mButtonLayout->addWidget(radioButton);
0157         d->mButtonGroup->addButton(radioButton, permissions);
0158     }
0159 
0160     d->mCustomPermissions = permissions;
0161 }
0162 
0163 KIMAP::Acl::Rights AclEntryDialog::permissions() const
0164 {
0165     QAbstractButton *button = d->mButtonGroup->checkedButton();
0166 
0167     if (!button) {
0168         return d->mCustomPermissions;
0169     }
0170 
0171     return KIMAP::Acl::denormalizedRights(static_cast<KIMAP::Acl::Rights>(d->mButtonGroup->id(button)));
0172 }
0173 
0174 #include "moc_aclentrydialog_p.cpp"