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"