File indexing completed on 2024-06-23 05:49:16

0001 /*
0002     This file is part of the Kasten Framework, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2008 Friedrich W. H. Kossebau <kossebau@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #include "versiontablemodel.hpp"
0010 
0011 // Kasten core
0012 #include <Kasten/Versionable>
0013 #include <Kasten/AbstractModel>
0014 // KF
0015 #include <KLocalizedString>
0016 
0017 #include <QIcon>
0018 
0019 namespace Kasten {
0020 
0021 VersionTableModel::VersionTableModel(AbstractModel* model, If::Versionable* versionControl, QObject* parent)
0022     : QAbstractTableModel(parent)
0023     , mModel(model)
0024     , mVersionControl(versionControl)
0025     , mVersionIndex(versionControl ? versionControl->versionIndex() : 0)
0026 {
0027     if (mModel) {
0028         connect(mModel, SIGNAL(revertedToVersionIndex(int)), SLOT(onRevertedToVersionIndex(int)));
0029         connect(mModel, SIGNAL(headVersionChanged(int)), SLOT(onHeadVersionChanged(int)));
0030         connect(mModel, SIGNAL(headVersionDataChanged(Kasten::DocumentVersionData)),
0031                 SLOT(onHeadVersionDataChanged(Kasten::DocumentVersionData)));
0032     }
0033 }
0034 
0035 VersionTableModel::~VersionTableModel() = default;
0036 
0037 void VersionTableModel::setModel(AbstractModel* model, If::Versionable* versionControl)
0038 {
0039     if (mModel) {
0040         mModel->disconnect(this);
0041     }
0042 
0043     mModel = model;
0044     mVersionControl = versionControl;
0045 
0046     if (mModel) {
0047         connect(mModel, SIGNAL(revertedToVersionIndex(int)), SLOT(onRevertedToVersionIndex(int)));
0048         connect(mModel, SIGNAL(headVersionChanged(int)), SLOT(onHeadVersionChanged(int)));
0049         connect(mModel, SIGNAL(headVersionDataChanged(Kasten::DocumentVersionData)),
0050                 SLOT(onHeadVersionDataChanged(Kasten::DocumentVersionData)));
0051     }
0052     mVersionIndex = versionControl ? versionControl->versionIndex() : 0;
0053 
0054     beginResetModel();
0055     endResetModel();
0056 }
0057 
0058 int VersionTableModel::rowCount(const QModelIndex& parent) const
0059 {
0060     return (!parent.isValid() && mVersionControl) ? mVersionControl->versionCount() : 0;
0061 }
0062 
0063 int VersionTableModel::columnCount(const QModelIndex& parent) const
0064 {
0065     return (!parent.isValid()) ? NoOfColumnIds : 0;
0066 }
0067 
0068 QVariant VersionTableModel::data(const QModelIndex& index, int role) const
0069 {
0070     QVariant result;
0071     if (role == Qt::DisplayRole) {
0072         const int versionIndex = index.row();
0073         const DocumentVersionData version = mVersionControl->versionData(versionIndex);
0074 
0075         const int tableColumn = index.column();
0076         switch (tableColumn)
0077         {
0078         case IdColumnId:
0079         {
0080             result = version.id();
0081             break;
0082         }
0083         case ChangeDescriptionColumnId:
0084             result = version.changeComment();
0085             break;
0086         default:
0087             ;
0088         }
0089     } else if (role == Qt::DecorationRole) {
0090         const int tableColumn = index.column();
0091         if (tableColumn == CurrentColumnId) {
0092             const int versionIndex = index.row();
0093             if (mVersionControl->versionIndex() == versionIndex) {
0094                 result = QIcon::fromTheme(QStringLiteral("arrow-right"));
0095             }
0096         }
0097     }
0098 
0099     return result;
0100 }
0101 
0102 QVariant VersionTableModel::headerData(int section, Qt::Orientation orientation, int role) const
0103 {
0104     QVariant result;
0105 
0106     if (role == Qt::DisplayRole) {
0107         const QString titel =
0108             section == IdColumnId ?                i18nc("@title:column Id of the version",         "Id") :
0109             section == ChangeDescriptionColumnId ? i18nc("@title:column description of the change", "Changes") :
0110             QString();
0111         result = titel;
0112     } else if (role == Qt::ToolTipRole) {
0113         const QString titel =
0114             section == IdColumnId ?                i18nc("@info:tooltip", "Id of the version") :
0115             section == ChangeDescriptionColumnId ? i18nc("@info:tooltip", "Description of what changed") :
0116             QString();
0117         result = titel;
0118     } else {
0119         result = QAbstractTableModel::headerData(section, orientation, role);
0120     }
0121 
0122     return result;
0123 }
0124 
0125 void VersionTableModel::onRevertedToVersionIndex(int versionIndex)
0126 {
0127     if (mVersionIndex == versionIndex) {
0128         return;
0129     }
0130 
0131     const int oldVersionIndex = mVersionIndex;
0132     mVersionIndex = versionIndex;
0133 
0134     Q_EMIT dataChanged(index(versionIndex, CurrentColumnId), index(versionIndex, CurrentColumnId));
0135     Q_EMIT dataChanged(index(oldVersionIndex, CurrentColumnId), index(oldVersionIndex, CurrentColumnId));
0136 }
0137 
0138 void VersionTableModel::onHeadVersionChanged(int newHeadVersionIndex)
0139 {
0140     mVersionIndex = newHeadVersionIndex;
0141     // TODO: try to understand how this would be done with {begin,end}{Insert,Remove}Columns
0142     beginResetModel();
0143     endResetModel();
0144 }
0145 
0146 void VersionTableModel::onHeadVersionDataChanged(const DocumentVersionData& versionData)
0147 {
0148     Q_UNUSED(versionData)
0149     const int headVersionIndex = mVersionControl->versionCount() - 1;
0150     Q_EMIT dataChanged(index(headVersionIndex, CurrentColumnId), index(headVersionIndex, ChangeDescriptionColumnId));
0151 }
0152 
0153 }
0154 
0155 #include "moc_versiontablemodel.cpp"