From e338b5e51d3dc8563eaaba2e43d20e31df5a8ca1 Mon Sep 17 00:00:00 2001 From: Eike Hein Date: Wed, 11 Nov 2015 13:07:59 +0100 Subject: [PATCH] Support a merged results mode. --- runnermatchesmodel.cpp | 2 +- runnermodel.cpp | 63 ++++++++++++++++++++++++++++++++++++++---- runnermodel.h | 6 ++++ 3 files changed, 65 insertions(+), 6 deletions(-) diff --git a/runnermatchesmodel.cpp b/runnermatchesmodel.cpp index 6f625a5cc..b6b1b0fe6 100644 --- a/runnermatchesmodel.cpp +++ b/runnermatchesmodel.cpp @@ -57,7 +57,7 @@ QVariant RunnerMatchesModel::data(const QModelIndex &index, int role) const } else if (role == Kicker::DescriptionRole) { return match.subtext(); } else if (role == Kicker::FavoriteIdRole) { - if (m_runnerId == "services") { + if (match.runner()->id() == "services") { return match.data().toString(); } } else if (role == Kicker::HasActionListRole) { diff --git a/runnermodel.cpp b/runnermodel.cpp index 4eb6ccc9f..649681682 100644 --- a/runnermodel.cpp +++ b/runnermodel.cpp @@ -23,12 +23,14 @@ #include +#include #include #include RunnerModel::RunnerModel(QObject *parent) : QAbstractListModel(parent) , m_favoritesModel(0) , m_runnerManager(0) +, m_mergeResults(false) , m_deleteWhenEmpty(false) { QHash roles; @@ -75,10 +77,36 @@ void RunnerModel::setDeleteWhenEmpty(bool deleteWhenEmpty) if (m_deleteWhenEmpty != deleteWhenEmpty) { m_deleteWhenEmpty = deleteWhenEmpty; + clear(); + + if (!m_query.isEmpty()) { + m_queryTimer.start(); + } + emit deleteWhenEmptyChanged(); } } +bool RunnerModel::mergeResults() const +{ + return m_mergeResults; +} + +void RunnerModel::setMergeResults(bool merge) +{ + if (m_mergeResults != merge) { + m_mergeResults = merge; + + clear(); + + if (!m_query.isEmpty()) { + m_queryTimer.start(); + } + + emit mergeResultsChanged(); + } +} + QVariant RunnerModel::data(const QModelIndex &index, int role) const { if (!index.isValid() || index.row() >= m_models.count()) { @@ -167,16 +195,41 @@ void RunnerModel::matchesChanged(const QList &matches) QHash > matchesForRunner; foreach (const Plasma::QueryMatch &match, matches) { - QString runnerId = match.runner()->id(); - auto it = matchesForRunner.find(runnerId); + auto it = matchesForRunner.find(match.runner()->id()); if (it == matchesForRunner.end()) { - it = matchesForRunner.insert(runnerId, QList()); + it = matchesForRunner.insert(match.runner()->id(), QList()); } it.value().append(match); } + if (m_mergeResults) { + RunnerMatchesModel *matchesModel = nullptr; + + if (m_models.isEmpty()) { + matchesModel = new RunnerMatchesModel(QString(), i18n("Search results"), + m_runnerManager, this); + + beginInsertRows(QModelIndex(), 0, 0); + m_models.append(matchesModel); + endInsertRows(); + emit countChanged(); + } else { + matchesModel = m_models.at(0); + } + + QList matches; + + foreach (const QString &runnerId, m_runners) { + matches.append(matchesForRunner.take(runnerId)); + } + + matchesModel->setMatches(matches); + + return; + } + // Assign matches to existing models. If there is no match for a model, delete it. for (int row = m_models.count() - 1; row >= 0; --row) { RunnerMatchesModel *matchesModel = m_models.at(row); @@ -202,8 +255,8 @@ void RunnerModel::matchesChanged(const QList &matches) for (; it != end; ++it) { QList matches = it.value(); Q_ASSERT(!matches.isEmpty()); - QString name = matches.first().runner()->name(); - RunnerMatchesModel *matchesModel = new RunnerMatchesModel(it.key(), name, m_runnerManager, this); + RunnerMatchesModel *matchesModel = new RunnerMatchesModel(it.key(), + matches.first().runner()->name(), m_runnerManager, this); matchesModel->setMatches(matches); if (it.key() == "services") { diff --git a/runnermodel.h b/runnermodel.h index d827e6d8a..4c3f21237 100644 --- a/runnermodel.h +++ b/runnermodel.h @@ -43,6 +43,7 @@ class RunnerModel : public QAbstractListModel Q_PROPERTY(AbstractModel* favoritesModel READ favoritesModel WRITE setFavoritesModel NOTIFY favoritesModelChanged) Q_PROPERTY(QStringList runners READ runners WRITE setRunners NOTIFY runnersChanged); Q_PROPERTY(QString query READ query WRITE setQuery NOTIFY queryChanged); + Q_PROPERTY(bool mergeResults READ mergeResults WRITE setMergeResults NOTIFY mergeResultsChanged) Q_PROPERTY(bool deleteWhenEmpty READ deleteWhenEmpty WRITE setDeleteWhenEmpty NOTIFY deleteWhenEmptyChanged) public: @@ -65,6 +66,9 @@ class RunnerModel : public QAbstractListModel AbstractModel *favoritesModel() const; void setFavoritesModel(AbstractModel *model); + bool mergeResults() const; + void setMergeResults(bool merge); + bool deleteWhenEmpty() const; void setDeleteWhenEmpty(bool deleteWhenEmpty); @@ -73,6 +77,7 @@ class RunnerModel : public QAbstractListModel void favoritesModelChanged() const; void runnersChanged() const; void queryChanged() const; + void mergeResultsChanged() const; void deleteWhenEmptyChanged(); private Q_SLOTS: @@ -89,6 +94,7 @@ class RunnerModel : public QAbstractListModel QList m_models; QString m_query; QTimer m_queryTimer; + bool m_mergeResults; bool m_deleteWhenEmpty; };