summaryrefslogtreecommitdiff
path: root/src/pluginlistview.cpp
diff options
context:
space:
mode:
authorMikaël Capelle <capelle.mikael@gmail.com>2020-12-31 22:18:11 +0100
committerMikaël Capelle <capelle.mikael@gmail.com>2021-01-02 15:38:18 +0100
commitbd34b532230d92bd6232ceb1ab2b0092cac79d22 (patch)
tree27187c95e57702d66f6df2c61db45c03cb6c762b /src/pluginlistview.cpp
parent25a2123e5ffe66715d0a1ec09297ee91a9fcbe1c (diff)
Move plugin list context menu to its own class and to PluginListView.
Diffstat (limited to 'src/pluginlistview.cpp')
-rw-r--r--src/pluginlistview.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/pluginlistview.cpp b/src/pluginlistview.cpp
index 70b3ebc1..16e3dac0 100644
--- a/src/pluginlistview.cpp
+++ b/src/pluginlistview.cpp
@@ -3,15 +3,21 @@
#include <QUrl>
#include <QMimeData>
+#include <report.h>
#include <widgetutility.h>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "organizercore.h"
#include "pluginlistsortproxy.h"
+#include "pluginlistcontextmenu.h"
+#include "modlistview.h"
+#include "modlistviewactions.h"
#include "genericicondelegate.h"
#include "modelutils.h"
+using namespace MOBase;
+
PluginListView::PluginListView(QWidget *parent)
: QTreeView(parent)
, m_Scrollbar(new ViewMarkingScrollBar(this->model(), this))
@@ -135,6 +141,7 @@ void PluginListView::setup(OrganizerCore& core, MainWindow* mw, Ui::MainWindow*
{
m_core = &core;
ui = { mwui->activePluginsCounter, mwui->espFilterEdit };
+ m_modActions = &mwui->modList->actions();
m_sortProxy = new PluginListSortProxy(&core);
m_sortProxy->setSourceModel(core.pluginList());
@@ -146,6 +153,70 @@ void PluginListView::setup(OrganizerCore& core, MainWindow* mw, Ui::MainWindow*
connect(ui.filter, &QLineEdit::textChanged, m_sortProxy, &PluginListSortProxy::updateFilter);
connect(ui.filter, &QLineEdit::textChanged, this, &PluginListView::onFilterChanged);
+ // using a lambda here to avoid storing the mod list actions
+ connect(this, &QTreeView::customContextMenuRequested, [=](auto&& pos) { onCustomContextMenuRequested(pos); });
+ connect(this, &QTreeView::doubleClicked, [=](auto&& index) { onDoubleClicked(index); });
+}
+
+void PluginListView::onCustomContextMenuRequested(const QPoint& pos)
+{
+ try {
+ PluginListContextMenu menu(indexViewToModel(indexAt(pos)), *m_core, this);
+ connect(&menu, &PluginListContextMenu::openModInformation, [=](auto&& modIndex) {
+ m_modActions->displayModInformation(modIndex); });
+ menu.exec(viewport()->mapToGlobal(pos));
+ }
+ catch (const std::exception& e) {
+ reportError(tr("Exception: ").arg(e.what()));
+ }
+ catch (...) {
+ reportError(tr("Unknown exception"));
+ }
+}
+
+void PluginListView::onDoubleClicked(const QModelIndex& index)
+{
+ if (!index.isValid()) {
+ return;
+ }
+
+ if (m_core->pluginList()->timeElapsedSinceLastChecked() <= QApplication::doubleClickInterval()) {
+ // don't interpret double click if we only just checked a plugin
+ return;
+ }
+
+ try {
+ if (selectionModel()->hasSelection() && selectionModel()->selectedRows().count() == 1) {
+
+ QModelIndex idx = selectionModel()->currentIndex();
+ QString fileName = idx.data().toString();
+
+ if (ModInfo::getIndex(m_core->pluginList()->origin(fileName)) == UINT_MAX) {
+ return;
+ }
+
+ auto modIndex = ModInfo::getIndex(m_core->pluginList()->origin(fileName));
+ ModInfo::Ptr modInfo = ModInfo::getByIndex(modIndex);
+
+ if (modInfo->isRegular() || modInfo->isOverwrite()) {
+
+ Qt::KeyboardModifiers modifiers = QApplication::queryKeyboardModifiers();
+ if (modifiers.testFlag(Qt::ControlModifier)) {
+ m_modActions->openExplorer({ m_core->modList()->index(modIndex, 0) });
+ }
+ else {
+ m_modActions->displayModInformation(ModInfo::getIndex(m_core->pluginList()->origin(fileName)));
+ }
+
+ // workaround to cancel the editor that might have opened because of
+ // selection-click
+ closePersistentEditor(index);
+ }
+ }
+ }
+ catch (const std::exception& e) {
+ reportError(e.what());
+ }
}
bool PluginListView::moveSelection(int key)