File indexing completed on 2024-09-22 04:47:57

0001 /*
0002   SPDX-FileCopyrightText: 2006-2007 Volker Krause <vkrause@kde.org>
0003 
0004   Based on KMail code by:
0005   SPDX-FileCopyrightText: 2001-2003 Marc Mutz <mutz@kde.org>
0006 
0007   SPDX-License-Identifier: LGPL-2.0-or-later
0008 */
0009 
0010 #include "transportmanagementwidget.h"
0011 #include "transport.h"
0012 #include "transportmanager.h"
0013 #include "ui_transportmanagementwidget.h"
0014 
0015 #include <KLocalizedString>
0016 #include <KMessageBox>
0017 
0018 #include <QMenu>
0019 
0020 using namespace MailTransport;
0021 
0022 class MailTransport::TransportManagementWidgetPrivate
0023 {
0024 public:
0025     explicit TransportManagementWidgetPrivate(TransportManagementWidget *parent);
0026 
0027     Ui::TransportManagementWidget ui;
0028     TransportManagementWidget *const q;
0029 
0030     // Slots
0031     void defaultClicked();
0032     void removeClicked();
0033     void renameClicked();
0034     void editClicked();
0035     void addClicked();
0036     void updateButtonState();
0037     void slotCustomContextMenuRequested(const QPoint &);
0038 };
0039 
0040 TransportManagementWidgetPrivate::TransportManagementWidgetPrivate(TransportManagementWidget *parent)
0041     : q(parent)
0042 {
0043 }
0044 
0045 TransportManagementWidget::TransportManagementWidget(QWidget *parent)
0046     : QWidget(parent)
0047     , d(new TransportManagementWidgetPrivate(this))
0048 {
0049     d->ui.setupUi(this);
0050     d->updateButtonState();
0051 
0052     d->ui.transportList->setContextMenuPolicy(Qt::CustomContextMenu);
0053     connect(d->ui.transportList, &QTreeWidget::itemDoubleClicked, this, [this]() {
0054         d->editClicked();
0055     });
0056     connect(d->ui.addButton, &QPushButton::clicked, this, [this]() {
0057         d->addClicked();
0058     });
0059     connect(d->ui.editButton, &QPushButton::clicked, this, [this]() {
0060         d->editClicked();
0061     });
0062     connect(d->ui.renameButton, &QPushButton::clicked, this, [this]() {
0063         d->renameClicked();
0064     });
0065     connect(d->ui.removeButton, &QPushButton::clicked, this, [this]() {
0066         d->removeClicked();
0067     });
0068     connect(d->ui.defaultButton, &QPushButton::clicked, this, [this]() {
0069         d->defaultClicked();
0070     });
0071     connect(d->ui.transportList, &QTreeWidget::customContextMenuRequested, this, [this](QPoint p) {
0072         d->slotCustomContextMenuRequested(p);
0073     });
0074     connect(d->ui.transportList, &QTreeWidget::itemSelectionChanged, this, [this]() {
0075         d->updateButtonState();
0076     });
0077 }
0078 
0079 TransportManagementWidget::~TransportManagementWidget() = default;
0080 
0081 void TransportManagementWidgetPrivate::updateButtonState()
0082 {
0083     const auto nbItems{ui.transportList->selectedItems().count()};
0084     if (nbItems == 0) {
0085         ui.editButton->setEnabled(false);
0086         ui.renameButton->setEnabled(false);
0087         ui.removeButton->setEnabled(false);
0088         ui.defaultButton->setEnabled(false);
0089     } else {
0090         ui.editButton->setEnabled(nbItems == 1);
0091         ui.renameButton->setEnabled(nbItems == 1);
0092         ui.removeButton->setEnabled(nbItems >= 1);
0093         if (nbItems == 1) {
0094             if (ui.transportList->currentItem()->data(0, Qt::UserRole) == TransportManager::self()->defaultTransportId()) {
0095                 ui.defaultButton->setEnabled(false);
0096             } else {
0097                 ui.defaultButton->setEnabled(true);
0098             }
0099         } else {
0100             ui.defaultButton->setEnabled(false);
0101         }
0102     }
0103 }
0104 
0105 void TransportManagementWidgetPrivate::addClicked()
0106 {
0107     TransportManager::self()->showTransportCreationDialog(q);
0108 }
0109 
0110 void TransportManagementWidgetPrivate::editClicked()
0111 {
0112     if (ui.transportList->selectedItems().isEmpty()) {
0113         return;
0114     }
0115 
0116     const int currentId = ui.transportList->selectedItems().at(0)->data(0, Qt::UserRole).toInt();
0117     Transport *transport = TransportManager::self()->transportById(currentId);
0118     TransportManager::self()->configureTransport(transport->identifier(), transport, q);
0119 }
0120 
0121 void TransportManagementWidgetPrivate::renameClicked()
0122 {
0123     if (ui.transportList->selectedItems().isEmpty()) {
0124         return;
0125     }
0126 
0127     ui.transportList->editItem(ui.transportList->selectedItems().at(0), 0);
0128 }
0129 
0130 void TransportManagementWidgetPrivate::removeClicked()
0131 {
0132     const auto selectedItems{ui.transportList->selectedItems()};
0133     if (selectedItems.isEmpty()) {
0134         return;
0135     }
0136     const auto nbAccount{selectedItems.count()};
0137     const QString msg = (selectedItems.count() == 1)
0138         ? i18n("Do you want to remove outgoing account '%1'?", ui.transportList->selectedItems().at(0)->text(0))
0139         : i18np("Do you really want to remove this %1 outgoing account?", "Do you really want to remove these %1 outgoing accounts?", nbAccount);
0140 
0141     const int rc = KMessageBox::questionTwoActions(q, msg, i18n("Remove outgoing account?"), KStandardGuiItem::remove(), KStandardGuiItem::cancel());
0142     if (rc == KMessageBox::ButtonCode::SecondaryAction) {
0143         return;
0144     }
0145 
0146     QList<Transport::Id> lst;
0147     lst.reserve(nbAccount);
0148     for (QTreeWidgetItem *selecteditem : selectedItems) {
0149         lst << selecteditem->data(0, Qt::UserRole).toInt();
0150     }
0151     for (const auto id : std::as_const(lst)) {
0152         TransportManager::self()->removeTransport(id);
0153     }
0154 }
0155 
0156 void TransportManagementWidgetPrivate::defaultClicked()
0157 {
0158     if (ui.transportList->selectedItems().isEmpty()) {
0159         return;
0160     }
0161 
0162     TransportManager::self()->setDefaultTransport(ui.transportList->selectedItems().at(0)->data(0, Qt::UserRole).toInt());
0163 }
0164 
0165 void TransportManagementWidgetPrivate::slotCustomContextMenuRequested(const QPoint &pos)
0166 {
0167     QMenu menu(q);
0168     menu.addAction(QIcon::fromTheme(QStringLiteral("list-add")), i18n("Add..."), q, [this]() {
0169         addClicked();
0170     });
0171     QTreeWidgetItem *item = ui.transportList->itemAt(pos);
0172     if (item) {
0173         menu.addAction(QIcon::fromTheme(QStringLiteral("document-edit")), i18n("Modify..."), q, [this]() {
0174             editClicked();
0175         });
0176         menu.addAction(QIcon::fromTheme(QStringLiteral("edit-rename")), i18n("Rename"), q, [this]() {
0177             renameClicked();
0178         });
0179         menu.addSeparator();
0180         menu.addAction(QIcon::fromTheme(QStringLiteral("list-remove")), i18n("Remove"), q, [this]() {
0181             removeClicked();
0182         });
0183         if (item->data(0, Qt::UserRole) != TransportManager::self()->defaultTransportId()) {
0184             menu.addSeparator();
0185             menu.addAction(i18n("Set as Default"), q, [this]() {
0186                 defaultClicked();
0187             });
0188         }
0189     }
0190     menu.exec(ui.transportList->viewport()->mapToGlobal(pos));
0191 }
0192 
0193 #include "moc_transportmanagementwidget.cpp"