aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Kalinichev <kalinichev.so.0@gmail.com>2017-01-19 15:54:29 (GMT)
committerSergey Kalinichev <kalinichev.so.0@gmail.com>2017-01-26 07:11:21 (GMT)
commitb0d95189c5a418cbb56f5df063ed719c488a1b2c (patch)
tree55a80b4f51a20e166c97b7e3a586bcb1267a94da
parentf344386aa702aceb997d39433501d43866f39724 (diff)
Added VcsBasicEventModel
It can be used to add custom events to the model using other means then IBasicVersionControl::log Differential Revision: https://phabricator.kde.org/D4221
-rw-r--r--vcs/models/vcseventmodel.cpp68
-rw-r--r--vcs/models/vcseventmodel.h46
-rw-r--r--vcs/widgets/vcseventwidget.cpp4
3 files changed, 76 insertions, 42 deletions
diff --git a/vcs/models/vcseventmodel.cpp b/vcs/models/vcseventmodel.cpp
index 56d5f36..d4623ad 100644
--- a/vcs/models/vcseventmodel.cpp
+++ b/vcs/models/vcseventmodel.cpp
@@ -38,43 +38,30 @@
namespace KDevelop
{
-class VcsEventModelPrivate
+class VcsBasicEventModelPrivate
{
public:
QList<KDevelop::VcsEvent> m_events;
- KDevelop::IBasicVersionControl* m_iface;
- VcsRevision m_rev;
- QUrl m_url;
- bool done;
- bool fetching;
};
-VcsEventModel::VcsEventModel( KDevelop::IBasicVersionControl* iface, const VcsRevision& rev, const QUrl& url, QObject* parent )
- : QAbstractTableModel( parent ), d(new VcsEventModelPrivate)
+VcsBasicEventModel::VcsBasicEventModel(QObject* parent)
+ : QAbstractTableModel(parent), d(new VcsBasicEventModelPrivate)
{
- d->m_iface = iface;
- d->m_rev = rev;
- d->m_url = url;
- d->done = false;
- d->fetching = false;
}
-VcsEventModel::~VcsEventModel()
-{
- delete d;
-}
+VcsBasicEventModel::~VcsBasicEventModel() = default;
-int VcsEventModel::rowCount( const QModelIndex& parent) const
+int VcsBasicEventModel::rowCount(const QModelIndex& parent) const
{
return parent.isValid() ? 0 : d->m_events.count();
}
-int VcsEventModel::columnCount( const QModelIndex& parent) const
+int VcsBasicEventModel::columnCount(const QModelIndex& parent) const
{
return parent.isValid() ? 0 : ColumnCount;
}
-QVariant VcsEventModel::data( const QModelIndex& idx, int role ) const
+QVariant VcsBasicEventModel::data(const QModelIndex& idx, int role) const
{
if( !idx.isValid() || role != Qt::DisplayRole )
return QVariant();
@@ -100,7 +87,7 @@ QVariant VcsEventModel::data( const QModelIndex& idx, int role ) const
return QVariant();
}
-QVariant VcsEventModel::headerData( int section, Qt::Orientation orientation, int role ) const
+QVariant VcsBasicEventModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if( section < 0 || section >= columnCount() || orientation != Qt::Horizontal || role != Qt::DisplayRole )
return QVariant();
@@ -120,7 +107,7 @@ QVariant VcsEventModel::headerData( int section, Qt::Orientation orientation, in
return QVariant();
}
-void VcsEventModel::addEvents( const QList<KDevelop::VcsEvent>& list )
+void VcsBasicEventModel::addEvents(const QList<KDevelop::VcsEvent>& list)
{
if( list.isEmpty() )
return;
@@ -130,7 +117,7 @@ void VcsEventModel::addEvents( const QList<KDevelop::VcsEvent>& list )
endInsertRows();
}
-KDevelop::VcsEvent VcsEventModel::eventForIndex( const QModelIndex& idx ) const
+KDevelop::VcsEvent VcsBasicEventModel::eventForIndex(const QModelIndex& idx) const
{
if( !idx.isValid() || idx.row() < 0 || idx.row() >= rowCount() )
{
@@ -139,23 +126,45 @@ KDevelop::VcsEvent VcsEventModel::eventForIndex( const QModelIndex& idx ) const
return d->m_events.at( idx.row() );
}
-bool VcsEventModel::canFetchMore(const QModelIndex& parent) const
+class VcsEventLogModelPrivate
+{
+public:
+ KDevelop::IBasicVersionControl* m_iface;
+ VcsRevision m_rev;
+ QUrl m_url;
+ bool done;
+ bool fetching;
+};
+
+VcsEventLogModel::VcsEventLogModel(KDevelop::IBasicVersionControl* iface, const VcsRevision& rev, const QUrl& url, QObject* parent)
+ : KDevelop::VcsBasicEventModel(parent), d(new VcsEventLogModelPrivate)
+{
+ d->m_iface = iface;
+ d->m_rev = rev;
+ d->m_url = url;
+ d->done = false;
+ d->fetching = false;
+}
+
+VcsEventLogModel::~VcsEventLogModel() = default;
+
+bool VcsEventLogModel::canFetchMore(const QModelIndex& parent) const
{
return !d->done && !d->fetching && !parent.isValid();
}
-void VcsEventModel::fetchMore(const QModelIndex& parent)
+void VcsEventLogModel::fetchMore(const QModelIndex& parent)
{
d->fetching = true;
Q_ASSERT(!parent.isValid());
Q_UNUSED(parent);
VcsJob* job = d->m_iface->log(d->m_url, d->m_rev, qMax(rowCount(), 100));
- connect(this, &VcsEventModel::destroyed, job, [job] { job->kill(); });
- connect(job, &VcsJob::finished, this, &VcsEventModel::jobReceivedResults);
+ connect(this, &VcsEventLogModel::destroyed, job, [job] { job->kill(); });
+ connect(job, &VcsJob::finished, this, &VcsEventLogModel::jobReceivedResults);
ICore::self()->runController()->registerJob( job );
}
-void VcsEventModel::jobReceivedResults(KJob* job)
+void VcsEventLogModel::jobReceivedResults(KJob* job)
{
QList<QVariant> l = qobject_cast<KDevelop::VcsJob *>(job)->fetchResults().toList();
if(l.isEmpty() || job->error()!=0) {
@@ -171,7 +180,7 @@ void VcsEventModel::jobReceivedResults(KJob* job)
}
}
d->m_rev = newevents.last().revision();
- if(!d->m_events.isEmpty()) {
+ if (rowCount()) {
newevents.removeFirst();
}
d->done = newevents.isEmpty();
@@ -180,4 +189,3 @@ void VcsEventModel::jobReceivedResults(KJob* job)
}
}
-
diff --git a/vcs/models/vcseventmodel.h b/vcs/models/vcseventmodel.h
index 035eb08..dc2dc5f 100644
--- a/vcs/models/vcseventmodel.h
+++ b/vcs/models/vcseventmodel.h
@@ -22,6 +22,7 @@
#define KDEVPLATFORM_VCSEVENTMODEL_H
#include <QtCore/QAbstractTableModel>
+#include <QScopedPointer>
#include <vcs/vcsexport.h>
@@ -34,7 +35,12 @@ class VcsRevision;
class IBasicVersionControl;
class VcsEvent;
-class KDEVPLATFORMVCS_EXPORT VcsEventModel : public QAbstractTableModel
+/**
+ * This is a generic model to store a list of VcsEvents.
+ *
+ * To add events use @c addEvents
+ */
+class KDEVPLATFORMVCS_EXPORT VcsBasicEventModel : public QAbstractTableModel
{
Q_OBJECT
public:
@@ -46,14 +52,35 @@ public:
ColumnCount,
};
- VcsEventModel( KDevelop::IBasicVersionControl* iface, const KDevelop::VcsRevision& rev, const QUrl& url, QObject* parent );
- ~VcsEventModel() override;
- int rowCount( const QModelIndex& = QModelIndex() ) const override;
- int columnCount( const QModelIndex& parent = QModelIndex() ) const override;
- QVariant data( const QModelIndex&, int role = Qt::DisplayRole ) const override;
- QVariant headerData( int, Qt::Orientation, int role = Qt::DisplayRole ) const override;
- KDevelop::VcsEvent eventForIndex( const QModelIndex& ) const;
+ VcsBasicEventModel(QObject* parent);
+ ~VcsBasicEventModel() override;
+ int rowCount(const QModelIndex& = QModelIndex()) const override;
+ int columnCount(const QModelIndex& parent = QModelIndex()) const override;
+ QVariant data(const QModelIndex&, int role = Qt::DisplayRole) const override;
+ QVariant headerData(int, Qt::Orientation, int role = Qt::DisplayRole) const override;
+ KDevelop::VcsEvent eventForIndex(const QModelIndex&) const;
+protected:
+ void addEvents(const QList<KDevelop::VcsEvent>&);
+
+private:
+ QScopedPointer<class VcsBasicEventModelPrivate> d;
+};
+
+/**
+ * This model stores a list of VcsEvents corresponding to the log obtained
+ * via IBasicVersionControl::log for a given revision. The model is populated
+ * lazily via @c fetchMore.
+ */
+class KDEVPLATFORMVCS_EXPORT VcsEventLogModel : public VcsBasicEventModel
+{
+Q_OBJECT
+public:
+
+ VcsEventLogModel(KDevelop::IBasicVersionControl* iface, const KDevelop::VcsRevision& rev, const QUrl& url, QObject* parent);
+ ~VcsEventLogModel() override;
+
+ /// Adds events to the model via @sa IBasicVersionControl::log
void fetchMore(const QModelIndex& parent) override;
bool canFetchMore(const QModelIndex& parent) const override;
@@ -61,8 +88,7 @@ private slots:
void jobReceivedResults( KJob* job );
private:
- void addEvents( const QList<KDevelop::VcsEvent>& );
- class VcsEventModelPrivate* const d;
+ QScopedPointer<class VcsEventLogModelPrivate> d;
};
}
diff --git a/vcs/widgets/vcseventwidget.cpp b/vcs/widgets/vcseventwidget.cpp
index 60199aa..5199e6c 100644
--- a/vcs/widgets/vcseventwidget.cpp
+++ b/vcs/widgets/vcseventwidget.cpp
@@ -65,7 +65,7 @@ public:
Ui::VcsEventWidget* m_ui;
VcsItemEventModel* m_detailModel;
- VcsEventModel *m_logModel;
+ VcsEventLogModel *m_logModel;
QUrl m_url;
QModelIndex m_contextIndex;
VcsEventWidget* q;
@@ -197,7 +197,7 @@ VcsEventWidget::VcsEventWidget( const QUrl& url, const VcsRevision& rev, KDevelo
d->m_ui = new Ui::VcsEventWidget();
d->m_ui->setupUi(this);
- d->m_logModel = new VcsEventModel(iface, rev, url, this);
+ d->m_logModel = new VcsEventLogModel(iface, rev, url, this);
d->m_ui->eventView->setModel( d->m_logModel );
d->m_ui->eventView->sortByColumn(0, Qt::DescendingOrder);
d->m_ui->eventView->setContextMenuPolicy( Qt::CustomContextMenu );