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"