diff --git a/src/service/updates.cpp b/src/service/updates.cpp index bcbd144..af0ed60 100644 --- a/src/service/updates.cpp +++ b/src/service/updates.cpp @@ -1,15 +1,19 @@ #include "updates.h" #include "debug.h" +#include #include #include #include #include #include #include +#include #include +#include #include #include +#include #include @@ -280,6 +284,46 @@ Model::Model(QObject *parent) { } +void Model::initView(QTreeView *view) +{ + view->setSelectionMode(QAbstractItemView::ExtendedSelection); + auto proxy = new QSortFilterProxyModel(view); + proxy->setSourceModel(this); + view->setModel(proxy); + view->setItemDelegate(new update::UpdateDelegate(view)); +#ifndef DEVELOP + view->hideColumn(int(update::Model::Column::Files)); +#endif + + auto menu = new QMenu(view); + menu->addAction(toString(Action::NoAction)); + menu->addAction(toString(Action::Remove)); + menu->addAction(toString(Action::Install)); + + view->setContextMenuPolicy(Qt::CustomContextMenu); + connect(view, &QAbstractItemView::customContextMenuRequested, // + menu, [this, menu, view, proxy] { + const auto selection = view->selectionModel(); + SOFT_ASSERT(selection, return ); + const auto indexes = selection->selectedRows(int(Column::Action)); + if (indexes.isEmpty()) + return; + + const auto menuItem = menu->exec(QCursor::pos()); + if (!menuItem) + return; + + const auto action = menu->actions().indexOf(menuItem); + + for (const auto &proxyIndex : indexes) { + auto modelIndex = proxy->mapToSource(proxyIndex); + if (!modelIndex.isValid() || rowCount(modelIndex) > 0) + continue; + setData(modelIndex, action, Qt::EditRole); + } + }); +} + void Model::parse(const QByteArray &data) { QJsonParseError error; diff --git a/src/service/updates.h b/src/service/updates.h index cffd56d..781c276 100644 --- a/src/service/updates.h +++ b/src/service/updates.h @@ -6,6 +6,7 @@ class QNetworkAccessManager; class QNetworkReply; +class QTreeView; namespace update { @@ -55,6 +56,8 @@ public: explicit Model(QObject* parent = nullptr); + void initView(QTreeView* view); + void parse(const QByteArray& data); void setExpansions(const std::map& expansions); UserActions userActions() const; diff --git a/src/settingseditor.cpp b/src/settingseditor.cpp index 2a6bdbc..ce52f6f 100644 --- a/src/settingseditor.cpp +++ b/src/settingseditor.cpp @@ -2,16 +2,12 @@ #include "languagecodes.h" #include "manager.h" #include "runatsystemstart.h" -#include "tesseract.h" #include "translator.h" #include "ui_settingseditor.h" #include "updates.h" #include "widgetstate.h" #include -#include -#include -#include SettingsEditor::SettingsEditor(Manager &manager, update::Loader &updater) : ui(new Ui::SettingsEditor) @@ -84,13 +80,7 @@ SettingsEditor::SettingsEditor(Manager &manager, update::Loader &updater) this, [this] { pickColor(ColorContext::Bagkround); }); // updates - auto updatesProxy = new QSortFilterProxyModel(this); - updatesProxy->setSourceModel(updater_.model()); - ui->updatesView->setModel(updatesProxy); - ui->updatesView->setItemDelegate(new update::UpdateDelegate(this)); -#ifndef DEVELOP - ui->updatesView->hideColumn(int(update::Model::Column::Files)); -#endif + updater.model()->initView(ui->updatesView); adjustUpdatesView(); connect(updater_.model(), &QAbstractItemModel::modelReset, // this, &SettingsEditor::adjustUpdatesView);