File indexing completed on 2024-04-21 05:50:38

0001 /*
0002     SPDX-FileCopyrightText: 2014-2022 Rolf Eike Beer <kde@opensource.sf-tec.de>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include "gpgservermodel.h"
0008 
0009 #include <KLocalizedString>
0010 #include <QStringList>
0011 
0012 GpgServerModel::GpgServerModel(QObject *parent)
0013     : QStringListModel(parent),
0014     m_defaultRow(-1)
0015 {
0016     connect(this, &GpgServerModel::rowsRemoved, this, &GpgServerModel::slotRowsRemoved);
0017 }
0018 
0019 void
0020 GpgServerModel::setDefault(const int row)
0021 {
0022     Q_ASSERT(row < stringList().count());
0023 
0024     if (m_defaultRow == row)
0025         return;
0026 
0027     const int oldRow = m_defaultRow;
0028     m_defaultRow = row;
0029     if (oldRow >= 0)
0030         Q_EMIT dataChanged(index(oldRow, 0), index(oldRow, 0));
0031     if (row >= 0)
0032         Q_EMIT dataChanged(index(row, 0), index(row, 0));
0033 }
0034 
0035 void
0036 GpgServerModel::setDefault(const QString &server)
0037 {
0038     if (server.isEmpty()) {
0039         setDefault(-1);
0040     } else {
0041         const int row = stringList().indexOf(server);
0042         Q_ASSERT(row >= 0);
0043         setDefault(row);
0044     }
0045 }
0046 
0047 int
0048 GpgServerModel::defaultRow() const
0049 {
0050     // only in case there is not set any default yet promote the first entry of the list
0051     if ((m_defaultRow >= 0) || stringList().empty())
0052         return m_defaultRow;
0053     else
0054         return 0;
0055 }
0056 
0057 QString
0058 GpgServerModel::defaultServer() const
0059 {
0060     const QStringList &servers = stringList();
0061 
0062     if (servers.isEmpty())
0063         return QString();
0064     return servers.at(qMax<int>(0, m_defaultRow));
0065 }
0066 
0067 QVariant
0068 GpgServerModel::data(const QModelIndex &index, int role) const
0069 {
0070     QVariant res = QStringListModel::data(index, role);
0071 
0072     if ((role == Qt::DisplayRole) && (index.row() == m_defaultRow))
0073         res = i18nc("Mark default keyserver in GUI", "%1 (Default)", res.toString());
0074 
0075     return res;
0076 }
0077 
0078 void
0079 GpgServerModel::slotRowsRemoved(const QModelIndex &, int start, int end)
0080 {
0081     if (end < m_defaultRow) {
0082         // removed before default, i.e. default is moved up
0083         setDefault(m_defaultRow - (end - start) - 1);
0084     } else if ((start <= m_defaultRow) && (end >= m_defaultRow)) {
0085         // the default was deleted
0086         if (m_defaultRow >= rowCount())
0087             m_defaultRow = -1; // avoid sending dataChanged() for the already deleted row
0088         if (rowCount() > 0)
0089             setDefault(0);
0090     }
0091 }