# # # delete "src/model/Changeset.cpp" # # delete "src/model/Changeset.h" # # patch "src/model/ChangesetModel.cpp" # from [9db73c376ae513811f07749800ef40c8f31cdb5d] # to [94ab98b2cfb7f6316fc569b9e08c599011e9c237] # # patch "src/model/ChangesetModel.h" # from [ed80a0f9a38c30510b972799582844cfea5cebae] # to [53847dacf2a5118637ce64f2b193bb93744616a0] # ============================================================ --- src/model/ChangesetModel.cpp 9db73c376ae513811f07749800ef40c8f31cdb5d +++ src/model/ChangesetModel.cpp 94ab98b2cfb7f6316fc569b9e08c599011e9c237 @@ -22,10 +22,9 @@ #include -ChangesetModel::ChangesetModel(QObject *parent) : QAbstractItemModel(parent) -{ - currentBranch = ""; -} +ChangesetModel::ChangesetModel(QObject * parent, const QString & db) + : QAbstractItemModel(parent), dbPath(db), currentBranch(""), branchLog(0) +{} ChangesetModel::~ChangesetModel() {} @@ -34,13 +33,18 @@ void ChangesetModel::receiveRevisions(bo int i = branchMap[currentBranch].certsRead; int to = branchMap[currentBranch].revisions.count(); int c = 0; - while(i < to && (c < revPerReceive || all)) + + while (i < to && (c < revPerReceive || all)) { QString revision = branchMap[currentBranch].revisions[i]; - if(changesetMap[revision] == NULL) + if (!changesetMap.contains(revision)) { - ChangesetCerts *certs = new ChangesetCerts(currentBranch, revision, i, this); + ChangesetCerts * certs = new ChangesetCerts(this, dbPath); + connect( + certs, SIGNAL(changesetReady(const Changeset &)), + this, SLOT(changesetReady(const Changeset &)) + ); certs->readCerts(revision); c++; } @@ -51,71 +55,64 @@ void ChangesetModel::setBranch(QString b void ChangesetModel::setBranch(QString branch) { currentBranch = branch; - BranchInfo *branchInfo = &branchMap[currentBranch]; - if(branchInfo->revisions.count() == 0) + + if (branchMap[currentBranch].revisions.count() == 0) { - branchInfo->certsRead = 0; - GetBranchLog *glog = new GetBranchLog(branch, this); - Q_UNUSED(glog); + branchMap[currentBranch].certsRead = 0; + + if (branchLog) + { + disconnect( + branchLog, SIGNAL(commandDone(const QString &, const QStringList &)), + this, SLOT(branchLogRead(const QString &, const QStringList &)) + ); + delete branchLog; + } + + branchLog = new GetBranchLog(this, dbPath, branch); + connect( + branchLog, SIGNAL(commandDone(const QString &, const QStringList &)), + this, SLOT(branchLogRead(const QString &, const QStringList &)) + ); } else + { + // just reset the view if we already have queried data + // for this particular branch reset(); + } } -void ChangesetModel::branchLogRead(GetBranchLog *glog) +void ChangesetModel::branchLogRead(const QString & branch, const QStringList & revisions) { - QString branch = glog->getBranch(); - branchMap[branch].revisions << glog->getRevisions(); - if(branch == currentBranch) + branchMap[branch].revisions += revisions; + + if (branch == currentBranch) { receiveRevisions(false); } - delete glog; } -void ChangesetModel::changesetCertReady(ChangesetCerts *cert) +void ChangesetModel::changesetReady(const Changeset & change) { - QDateTime date; - QString author; - QString changelog; - QString key; - QString value; - int rows = cert->rowCount(QModelIndex()); - for(int i = 0; i < rows; i++) - { - key = cert->data(cert->index(i, 1, QModelIndex()), Qt::DisplayRole).toString(); - value = cert->data(cert->index(i, 2, QModelIndex()), Qt::DisplayRole).toString(); - if(key == "author") - { - author = value; - continue; - } - if(key == "changelog") - { - changelog = value; - continue; - } - if(key == "date") - { - date = QDateTime::fromString(value, "yyyy-MM-ddThh:mm:ss"); - continue; - } - } - Changeset *set = new Changeset(cert->getRevision(), date, author, changelog); - changesetMap[cert->getRevision()] = set; - int idx = cert->getIndex(); - branchMap[currentBranch].certsRead = idx; - beginInsertRows(QModelIndex(), idx, idx); + changesetMap[change.revision] = change; + branchMap[currentBranch].certsRead += 1; + + beginInsertRows( + QModelIndex(), + branchMap[currentBranch].certsRead, + branchMap[currentBranch].certsRead + ); endInsertRows(); - delete cert; } -int ChangesetModel::columnCount(const QModelIndex &parent) const +int ChangesetModel::columnCount(const QModelIndex & parent) const { + Q_UNUSED(parent); return 4; } -QVariant ChangesetModel::data(const QModelIndex &index, int role) const +QVariant ChangesetModel::data(const QModelIndex & index, int role) const { if (!index.isValid()) { @@ -134,21 +131,28 @@ QVariant ChangesetModel::data(const QMod { BranchInfo branchInfo = branchMap[currentBranch]; int row = index.row(); + if (branchInfo.revisions.count() > row) { int col = index.column(); QString rev = branchInfo.revisions[row]; - if(changesetMap[rev] == NULL) return QVariant(); + + if (!changesetMap.contains(rev)) return QVariant(); + switch(col) { - case(0): - return QVariant(changesetMap[rev]->getDate()); - case(1): - return QVariant(changesetMap[rev]->getAuthor()); - case(2): - return QVariant(changesetMap[rev]->getChangelogFlat()); - case(3): - return QVariant(rev); + case(0): + return QVariant(changesetMap[rev].date); + case(1): + return QVariant(changesetMap[rev].author); + case(2): + // FIXME: we should make something snazzy here, i.e. + // expand the complete description if a user selects + // the row or at least display a multi-line tooltip, + // whatever works better + return QVariant(changesetMap[rev].changelog); + case(3): + return QVariant(rev); } } } @@ -184,16 +188,17 @@ QVariant ChangesetModel::headerData(int return QVariant(); } -int ChangesetModel::rowCount(const QModelIndex& parent) const +int ChangesetModel::rowCount(const QModelIndex & parent) const { - int i = branchMap[currentBranch].certsRead; - if (!parent.isValid()) - if(branchMap[currentBranch].revisions.count() != 0) - return i; + Q_UNUSED(parent); + if (branchMap[currentBranch].revisions.count() > 0) + { + return branchMap[currentBranch].certsRead; + } return 0; } -QModelIndex ChangesetModel::index(int row, int column, const QModelIndex& parent) const +QModelIndex ChangesetModel::index(int row, int column, const QModelIndex & parent) const { if (!hasIndex(row, column, parent)) { @@ -203,8 +208,9 @@ QModelIndex ChangesetModel::index(int ro return createIndex(row, column, 0); } -QModelIndex ChangesetModel::parent(const QModelIndex& index) const +QModelIndex ChangesetModel::parent(const QModelIndex & index) const { + Q_UNUSED(index); return QModelIndex(); } ============================================================ --- src/model/ChangesetModel.h ed80a0f9a38c30510b972799582844cfea5cebae +++ src/model/ChangesetModel.h 53847dacf2a5118637ce64f2b193bb93744616a0 @@ -18,103 +18,119 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#ifndef CHANGESETMODE_H -#define CHANGESETMODE_H +#ifndef CHANGESETMODEL_H +#define CHANGESETMODEL_H -#include "Changeset.h" +#include "Certs.h" #include "GetBranchLog.h" -#include "Certs.h" -#include -#include +#include struct BranchInfo { - QStringList revisions; - int certsRead; + QStringList revisions; + int certsRead; }; +struct Changeset +{ + QString revision; + QDateTime date; + QString author; + QString changelog; +}; + + class ChangesetCerts : public Certs { Q_OBJECT public: - ChangesetCerts(QString branch, QString revision, int index, QObject *parent) : Certs(parent) - { - this->revision = revision; - this->idx = index; - this->branch = branch; - connect(this, SIGNAL(certsRead()), - this, SLOT(changesetCertsRead())); - connect(this, SIGNAL(changesetCertReady(ChangesetCerts *)), - parent, SLOT(changesetCertReady(ChangesetCerts *))); - } + ChangesetCerts(QObject * parent, const QString & db) : Certs(parent, db) + { + connect( + this, SIGNAL(certsRead()), + this, SLOT(packIntoChangeset()) + ); + } + void readCerts(const QString & rev) + { + revision = rev; + Certs::readCerts(rev); + } - ~ChangesetCerts() {} +signals: + void changesetReady(const Changeset &); - QString getRevision() - { - return revision; - } +private slots: + void packIntoChangeset() + { + Changeset change; + change.revision = revision; + + // FIXME: there is no support for multiple certs with the same + // key, i.e. accidential clean merges or multiple author certs + for (int i=0, j=certs->size(); iat(i).key == "author") + { + change.author = certs->at(i).value; + continue; + } + if (certs->at(i).key == "changelog") + { + change.changelog = certs->at(i).value; + continue; + } + if (certs->at(i).key == "date") + { + change.date = QDateTime::fromString(certs->at(i).value, "yyyy-MM-ddThh:mm:ss"); + continue; + } + } + emit changesetReady(change); + } - int getIndex() - { - return idx; - } - - QString getBranch() - { - return branch; - } - -signals: - void changesetCertReady(ChangesetCerts *); - private: - QString revision; - int idx; - QString branch; - -private slots: - void changesetCertsRead() - { - emit changesetCertReady(this); - } + QString revision; }; -typedef QMap ChangesetMap; +typedef QMap ChangesetMap; typedef QMap BranchMap; class ChangesetModel : public QAbstractItemModel { - Q_OBJECT + Q_OBJECT public: - ChangesetMap branchModel; - ChangesetModel(QObject *parent = 0); - ~ChangesetModel(); + ChangesetMap branchModel; + ChangesetModel(QObject * parent, const QString &); + ~ChangesetModel(); - void setBranch(QString branch); - void receiveRevisions(bool all); + void setBranch(QString branch); + void receiveRevisions(bool all); - // needed Qt Model methods - QVariant data(const QModelIndex&, int) const; - Qt::ItemFlags flags(const QModelIndex&) const; + // needed Qt Model methods + QVariant data(const QModelIndex &, int) const; + Qt::ItemFlags flags(const QModelIndex &) const; QVariant headerData(int, Qt::Orientation, int) const; - QModelIndex index(int, int, const QModelIndex&) const; - QModelIndex parent(const QModelIndex&) const; - int rowCount(const QModelIndex&) const; - int columnCount(const QModelIndex&) const; + QModelIndex index(int, int, const QModelIndex &) const; + QModelIndex parent(const QModelIndex &) const; + int rowCount(const QModelIndex &) const; + int columnCount(const QModelIndex &) const; private: - QString currentBranch; - static const int revPerReceive = 50; - BranchMap branchMap; - ChangesetMap changesetMap; + static const int revPerReceive = 50; + + QString dbPath; + QString currentBranch; + BranchMap branchMap; + ChangesetMap changesetMap; + GetBranchLog * branchLog; private slots: - void branchLogRead(GetBranchLog *); - void changesetCertReady(ChangesetCerts *); + void branchLogRead(const QString &, const QStringList &); + void changesetReady(const Changeset &); }; -#endif //CHANGESETMODE_H +#endif