diff --git a/src/plugins/phabricator/CMakeLists.txt b/src/plugins/phabricator/CMakeLists.txt --- a/src/plugins/phabricator/CMakeLists.txt +++ b/src/plugins/phabricator/CMakeLists.txt @@ -31,7 +31,7 @@ install(TARGETS PhabricatorHelpers ${KF5_INSTALL_TARGETS_DEFAULT_ARGS} LIBRARY NAMELINK_SKIP) add_library(phabricatorquickplugin quick/phabricatorquickplugin.cpp quick/difflistmodel.cpp quick/phabricatorrc.cpp) -target_link_libraries(phabricatorquickplugin Qt5::Qml PhabricatorHelpers) +target_link_libraries(phabricatorquickplugin Qt5::Qml Qt5::Gui PhabricatorHelpers) install(TARGETS phabricatorquickplugin DESTINATION ${QML_INSTALL_DIR}/org/kde/purpose/phabricator) install(FILES quick/qmldir DESTINATION ${QML_INSTALL_DIR}/org/kde/purpose/phabricator) diff --git a/src/plugins/phabricator/phabricatorjobs.h b/src/plugins/phabricator/phabricatorjobs.h --- a/src/plugins/phabricator/phabricatorjobs.h +++ b/src/plugins/phabricator/phabricatorjobs.h @@ -113,6 +113,9 @@ { Q_OBJECT public: + enum Status { Accepted, NeedsReview, NeedsRevision }; + Q_ENUM(Status) + DiffRevList(const QString& projectDir, QObject* parent = nullptr); // return the open diff. revisions as a list of pairs QList > reviews() const @@ -124,6 +127,11 @@ { return m_revMap; } + // return the open diff. revision statuses as a map of diffDescription->Status entries + QHash statusMap() const + { + return m_statusMap; + } private Q_SLOTS: void done(int exitCode, QProcess::ExitStatus exitStatus) override; @@ -133,6 +141,7 @@ private: QList > m_reviews; QHash m_revMap; + QHash m_statusMap; QString m_projectDir; }; } diff --git a/src/plugins/phabricator/phabricatorjobs.cpp b/src/plugins/phabricator/phabricatorjobs.cpp --- a/src/plugins/phabricator/phabricatorjobs.cpp +++ b/src/plugins/phabricator/phabricatorjobs.cpp @@ -251,10 +251,14 @@ if (rev.startsWith(QStringLiteral("* Accepted "))) { // append a Unicode "Heavy Check Mark" to signal accepted revisions revTitle += QStringLiteral(" ") + QString(QChar(0x2714)); + m_statusMap[revTitle] = Accepted; } else if (rev.startsWith(QStringLiteral("* Needs Revision "))) { // append a Unicode "Heavy Ballot X" for lack of a Unicode glyph // resembling the icon used on the Phab site. revTitle += QStringLiteral(" ") + QString(QChar(0x2718)); + m_statusMap[revTitle] = NeedsRevision; + } else if (rev.startsWith(QStringLiteral("* Needs Review "))) { + m_statusMap[revTitle] = NeedsReview; } m_reviews << qMakePair(revID, revTitle); m_revMap[revTitle] = revID; diff --git a/src/plugins/phabricator/quick/difflistmodel.h b/src/plugins/phabricator/quick/difflistmodel.h --- a/src/plugins/phabricator/quick/difflistmodel.h +++ b/src/plugins/phabricator/quick/difflistmodel.h @@ -23,6 +23,7 @@ #include #include #include +#include #include class KJob; @@ -37,6 +38,7 @@ void refresh(); + QHash roleNames() const override; QVariant data(const QModelIndex &idx, int role) const override; int rowCount(const QModelIndex & parent) const override; @@ -51,15 +53,16 @@ struct Value { QVariant summary; QVariant id; + QVariant status; inline bool operator<(const DiffListModel::Value &b) const { return summary.toString().localeAwareCompare(b.summary.toString()); } #ifndef QT_NO_DEBUG_STREAM operator QString() const { - QString ret = QStringLiteral("DiffListModel::Value{summary=\"%1\" id=\"%2\"}"); - return ret.arg(this->summary.toString()).arg(this->id.toString()); + QString ret = QStringLiteral("DiffListModel::Value{summary=\"%1\" id=\"%2\" status=\"%3\"}"); + return ret.arg(this->summary.toString()).arg(this->id.toString()).arg(this->status.toInt()); } #endif }; diff --git a/src/plugins/phabricator/quick/difflistmodel.cpp b/src/plugins/phabricator/quick/difflistmodel.cpp --- a/src/plugins/phabricator/quick/difflistmodel.cpp +++ b/src/plugins/phabricator/quick/difflistmodel.cpp @@ -21,6 +21,7 @@ #include "phabricatorjobs.h" #include +#include #include #include @@ -90,10 +91,12 @@ return; } - const auto revs = dynamic_cast(job)->reviews(); + const auto diffRevList = dynamic_cast(job); + const auto revs = diffRevList->reviews(); QVector tmpValues; foreach (const auto review, revs) { - tmpValues += Value { review.second, review.first }; + auto status = diffRevList->statusMap()[review.second]; + tmpValues += Value { review.second, review.first, status }; } qSort(tmpValues.begin(), tmpValues.end()); @@ -116,6 +119,15 @@ } } +QHash DiffListModel::roleNames() const +{ + const QHash roles = { + {Qt::DisplayRole, QByteArrayLiteral("display")}, + {Qt::ToolTipRole, QByteArrayLiteral("toolTip")}, + {Qt::TextColorRole, QByteArrayLiteral("textColor")} }; + return roles; +} + QVariant DiffListModel::data(const QModelIndex &idx, int role) const { if (!idx.isValid() || idx.column() != 0 || idx.row() >= m_values.size()) { @@ -127,6 +139,21 @@ return m_values[idx.row()].summary; case Qt::ToolTipRole: return m_values[idx.row()].id; + case Qt::TextColorRole: + // Use the colours arc also uses + QVariant ret; + switch (m_values[idx.row()].status.value()) { + case Phabricator::DiffRevList::Accepted: + // alternative: KColorScheme::ForegroundRole::PositiveText + ret = QBrush(Qt::green); + case Phabricator::DiffRevList::NeedsReview: + // alternative: KColorScheme::ForegroundRole::NeutralText + ret = QBrush(Qt::magenta); + case Phabricator::DiffRevList::NeedsRevision: + // alternative: KColorScheme::ForegroundRole::NegativeText + ret = QBrush(Qt::red); + } + return ret; } return QVariant(); }