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"