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

0001 /*
0002   SPDX-FileCopyrightText: 2009 Constantin Berzan <exit3219@gmail.com>
0003 
0004   Based on KMail code by:
0005   SPDX-FileCopyrightText: 2002 Marc Mutz <mutz@kde.org>
0006   SPDX-FileCopyrightText: 2007 Mathias Soeken <msoeken@tzi.de>
0007 
0008   SPDX-License-Identifier: LGPL-2.0-or-later
0009 */
0010 
0011 #include "transportlistview.h"
0012 #include "transport.h"
0013 #include "transportmanager.h"
0014 #include "transporttype.h"
0015 
0016 #include <QHeaderView>
0017 #include <QLineEdit>
0018 
0019 #include "mailtransport_debug.h"
0020 #include <KLocalizedString>
0021 
0022 using namespace MailTransport;
0023 
0024 TransportListView::TransportListView(QWidget *parent)
0025     : QTreeWidget(parent)
0026 {
0027     setHeaderLabels(QStringList() << i18nc("@title:column email transport name", "Name") << i18nc("@title:column email transport type", "Type"));
0028     setRootIsDecorated(false);
0029     header()->setSectionsMovable(false);
0030     header()->setSectionResizeMode(QHeaderView::ResizeToContents);
0031     setAllColumnsShowFocus(true);
0032     setAlternatingRowColors(true);
0033     setSortingEnabled(true);
0034     sortByColumn(0, Qt::AscendingOrder);
0035     setSelectionMode(SingleSelection);
0036 
0037     fillTransportList();
0038     connect(TransportManager::self(), &TransportManager::transportsChanged, this, &TransportListView::fillTransportList);
0039 }
0040 
0041 void TransportListView::editItem(QTreeWidgetItem *item, int column)
0042 {
0043     // TODO: is there a nicer way to make only the 'name' column editable?
0044     if (column == 0 && item) {
0045         Qt::ItemFlags oldFlags = item->flags();
0046         item->setFlags(oldFlags | Qt::ItemIsEditable);
0047         QTreeWidget::editItem(item, 0);
0048         item->setFlags(oldFlags);
0049         const int id = item->data(0, Qt::UserRole).toInt();
0050         Transport *t = TransportManager::self()->transportById(id);
0051         if (!t) {
0052             qCWarning(MAILTRANSPORT_LOG) << "Transport" << id << "not known by manager.";
0053             return;
0054         }
0055         if (TransportManager::self()->defaultTransportId() == t->id()) {
0056             item->setText(0, t->name());
0057         }
0058     }
0059 }
0060 
0061 void TransportListView::commitData(QWidget *editor)
0062 {
0063     if (selectedItems().isEmpty()) {
0064         // transport was deleted by someone else???
0065         qCDebug(MAILTRANSPORT_LOG) << "No selected item.";
0066         return;
0067     }
0068     QTreeWidgetItem *item = selectedItems().first();
0069     auto edit = dynamic_cast<QLineEdit *>(editor); // krazy:exclude=qclasses
0070     Q_ASSERT(edit); // original code had if
0071 
0072     const int id = item->data(0, Qt::UserRole).toInt();
0073     Transport *t = TransportManager::self()->transportById(id);
0074     if (!t) {
0075         qCWarning(MAILTRANSPORT_LOG) << "Transport" << id << "not known by manager.";
0076         return;
0077     }
0078     qCDebug(MAILTRANSPORT_LOG) << "Renaming transport" << id << "to" << edit->text();
0079     t->setName(edit->text());
0080     t->forceUniqueName();
0081     t->save();
0082 }
0083 
0084 void TransportListView::fillTransportList()
0085 {
0086     // try to preserve the selection
0087     int selected = -1;
0088     if (currentItem()) {
0089         selected = currentItem()->data(0, Qt::UserRole).toInt();
0090     }
0091 
0092     clear();
0093     const auto lstTransports = TransportManager::self()->transports();
0094     for (Transport *t : lstTransports) {
0095         auto item = new QTreeWidgetItem(this);
0096         item->setData(0, Qt::UserRole, t->id());
0097         QString name = t->name();
0098         if (TransportManager::self()->defaultTransportId() == t->id()) {
0099             name += i18nc("@label the default mail transport", " (Default)");
0100             QFont font(item->font(0));
0101             font.setBold(true);
0102             item->setFont(0, font);
0103         }
0104         item->setText(0, name);
0105         item->setText(1, t->transportType().name());
0106         if (t->id() == selected) {
0107             setCurrentItem(item);
0108         }
0109     }
0110 }
0111 
0112 #include "moc_transportlistview.cpp"