Support a merged results mode.

wilder-5.17
Eike Hein 11 years ago
parent 705ff1a47c
commit e338b5e51d
  1. 2
      runnermatchesmodel.cpp
  2. 63
      runnermodel.cpp
  3. 6
      runnermodel.h

@ -57,7 +57,7 @@ QVariant RunnerMatchesModel::data(const QModelIndex &index, int role) const
} else if (role == Kicker::DescriptionRole) { } else if (role == Kicker::DescriptionRole) {
return match.subtext(); return match.subtext();
} else if (role == Kicker::FavoriteIdRole) { } else if (role == Kicker::FavoriteIdRole) {
if (m_runnerId == "services") { if (match.runner()->id() == "services") {
return match.data().toString(); return match.data().toString();
} }
} else if (role == Kicker::HasActionListRole) { } else if (role == Kicker::HasActionListRole) {

@ -23,12 +23,14 @@
#include <QSet> #include <QSet>
#include <KLocalizedString>
#include <KRunner/AbstractRunner> #include <KRunner/AbstractRunner>
#include <KRunner/RunnerManager> #include <KRunner/RunnerManager>
RunnerModel::RunnerModel(QObject *parent) : QAbstractListModel(parent) RunnerModel::RunnerModel(QObject *parent) : QAbstractListModel(parent)
, m_favoritesModel(0) , m_favoritesModel(0)
, m_runnerManager(0) , m_runnerManager(0)
, m_mergeResults(false)
, m_deleteWhenEmpty(false) , m_deleteWhenEmpty(false)
{ {
QHash<int, QByteArray> roles; QHash<int, QByteArray> roles;
@ -75,10 +77,36 @@ void RunnerModel::setDeleteWhenEmpty(bool deleteWhenEmpty)
if (m_deleteWhenEmpty != deleteWhenEmpty) { if (m_deleteWhenEmpty != deleteWhenEmpty) {
m_deleteWhenEmpty = deleteWhenEmpty; m_deleteWhenEmpty = deleteWhenEmpty;
clear();
if (!m_query.isEmpty()) {
m_queryTimer.start();
}
emit deleteWhenEmptyChanged(); 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 QVariant RunnerModel::data(const QModelIndex &index, int role) const
{ {
if (!index.isValid() || index.row() >= m_models.count()) { if (!index.isValid() || index.row() >= m_models.count()) {
@ -167,16 +195,41 @@ void RunnerModel::matchesChanged(const QList<Plasma::QueryMatch> &matches)
QHash<QString, QList<Plasma::QueryMatch> > matchesForRunner; QHash<QString, QList<Plasma::QueryMatch> > matchesForRunner;
foreach (const Plasma::QueryMatch &match, matches) { foreach (const Plasma::QueryMatch &match, matches) {
QString runnerId = match.runner()->id(); auto it = matchesForRunner.find(match.runner()->id());
auto it = matchesForRunner.find(runnerId);
if (it == matchesForRunner.end()) { if (it == matchesForRunner.end()) {
it = matchesForRunner.insert(runnerId, QList<Plasma::QueryMatch>()); it = matchesForRunner.insert(match.runner()->id(), QList<Plasma::QueryMatch>());
} }
it.value().append(match); 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<Plasma::QueryMatch> 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. // 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) { for (int row = m_models.count() - 1; row >= 0; --row) {
RunnerMatchesModel *matchesModel = m_models.at(row); RunnerMatchesModel *matchesModel = m_models.at(row);
@ -202,8 +255,8 @@ void RunnerModel::matchesChanged(const QList<Plasma::QueryMatch> &matches)
for (; it != end; ++it) { for (; it != end; ++it) {
QList<Plasma::QueryMatch> matches = it.value(); QList<Plasma::QueryMatch> matches = it.value();
Q_ASSERT(!matches.isEmpty()); Q_ASSERT(!matches.isEmpty());
QString name = matches.first().runner()->name(); RunnerMatchesModel *matchesModel = new RunnerMatchesModel(it.key(),
RunnerMatchesModel *matchesModel = new RunnerMatchesModel(it.key(), name, m_runnerManager, this); matches.first().runner()->name(), m_runnerManager, this);
matchesModel->setMatches(matches); matchesModel->setMatches(matches);
if (it.key() == "services") { if (it.key() == "services") {

@ -43,6 +43,7 @@ class RunnerModel : public QAbstractListModel
Q_PROPERTY(AbstractModel* favoritesModel READ favoritesModel WRITE setFavoritesModel NOTIFY favoritesModelChanged) Q_PROPERTY(AbstractModel* favoritesModel READ favoritesModel WRITE setFavoritesModel NOTIFY favoritesModelChanged)
Q_PROPERTY(QStringList runners READ runners WRITE setRunners NOTIFY runnersChanged); Q_PROPERTY(QStringList runners READ runners WRITE setRunners NOTIFY runnersChanged);
Q_PROPERTY(QString query READ query WRITE setQuery NOTIFY queryChanged); 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) Q_PROPERTY(bool deleteWhenEmpty READ deleteWhenEmpty WRITE setDeleteWhenEmpty NOTIFY deleteWhenEmptyChanged)
public: public:
@ -65,6 +66,9 @@ class RunnerModel : public QAbstractListModel
AbstractModel *favoritesModel() const; AbstractModel *favoritesModel() const;
void setFavoritesModel(AbstractModel *model); void setFavoritesModel(AbstractModel *model);
bool mergeResults() const;
void setMergeResults(bool merge);
bool deleteWhenEmpty() const; bool deleteWhenEmpty() const;
void setDeleteWhenEmpty(bool deleteWhenEmpty); void setDeleteWhenEmpty(bool deleteWhenEmpty);
@ -73,6 +77,7 @@ class RunnerModel : public QAbstractListModel
void favoritesModelChanged() const; void favoritesModelChanged() const;
void runnersChanged() const; void runnersChanged() const;
void queryChanged() const; void queryChanged() const;
void mergeResultsChanged() const;
void deleteWhenEmptyChanged(); void deleteWhenEmptyChanged();
private Q_SLOTS: private Q_SLOTS:
@ -89,6 +94,7 @@ class RunnerModel : public QAbstractListModel
QList<RunnerMatchesModel *> m_models; QList<RunnerMatchesModel *> m_models;
QString m_query; QString m_query;
QTimer m_queryTimer; QTimer m_queryTimer;
bool m_mergeResults;
bool m_deleteWhenEmpty; bool m_deleteWhenEmpty;
}; };

Loading…
Cancel
Save