diff --git a/src/qtquick/quickitemsmodel.cpp b/src/qtquick/quickitemsmodel.cpp --- a/src/qtquick/quickitemsmodel.cpp +++ b/src/qtquick/quickitemsmodel.cpp @@ -46,7 +46,7 @@ } ItemsModel *q; KNSCore::ItemsModel *model; - Engine *engine; + QObject *engine; KNSCore::Engine *coreEngine; QHash commentsModels; @@ -122,6 +122,7 @@ {InstalledFilesRole, "installedFiles"}, {UnInstalledFilesRole, "uninstalledFiles"}, {RatingRole, "rating"}, + {UserCanVoteRole, "userCanVote"}, ///<@ While it seems strange to hold this here when core has it on Engine, this information is conceptually per-Entry {NumberOfCommentsRole, "numberOfComments"}, {DownloadCountRole, "downloadCount"}, {NumberFansRole, "numberFans"}, @@ -243,6 +244,9 @@ case RatingRole: data.setValue(entry.rating()); break; + case UserCanVoteRole: + data.setValue(d->coreEngine->userCanVote(entry)); + break; case NumberOfCommentsRole: data.setValue(entry.numberOfComments()); break; @@ -373,20 +377,25 @@ { if (d->engine != newEngine) { beginResetModel(); - d->engine = qobject_cast(newEngine); + d->engine = newEngine; d->model->deleteLater(); d->model = nullptr; d->coreEngine = nullptr; - if (d->engine) { - d->coreEngine = qobject_cast(d->engine->engine()); + Engine *test = qobject_cast(newEngine); + if (test) { + d->coreEngine = qobject_cast(test->engine()); + connect(test, &Engine::engineChanged, this, [this, test](){ + beginResetModel(); + d->model->deleteLater(); + d->model = nullptr; + d->coreEngine = qobject_cast(test->engine()); + endResetModel(); + }); + } else { + // Don't really need any testing here, if it's not a KNSCore + // engine, then it'll become the null we expected anyway + d->coreEngine = qobject_cast(newEngine); } - connect(d->engine, &Engine::engineChanged, this, [this](){ - beginResetModel(); - d->model->deleteLater(); - d->model = nullptr; - d->coreEngine = qobject_cast(d->engine->engine()); - endResetModel(); - }); emit engineChanged(); endResetModel(); } @@ -425,7 +434,19 @@ QStringList args = KShell::splitArgs(d->coreEngine->adoptionCommand(entry)); qCDebug(KNEWSTUFFQUICK) << "executing AdoptionCommand" << args; QProcess::startDetached(args.takeFirst(), args); - d->engine->idleMessage(i18n("Using %1", entry.name())); + if (Engine *test = qobject_cast(d->engine)) { + test->idleMessage(i18n("Using %1", entry.name())); + } + } + } +} + +void ItemsModel::voteForItem(int index, int rating) +{ + if (d->coreEngine) { + KNSCore::EntryInternal entry = d->model->data(d->model->index(index), Qt::UserRole).value(); + if (d->coreEngine->userCanVote(entry)) { + d->coreEngine->vote(entry, rating); } } }