summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/mainwindow.cpp88
-rw-r--r--src/mainwindow.h5
-rw-r--r--src/modelutils.cpp58
-rw-r--r--src/modelutils.h14
-rw-r--r--src/modlistview.cpp51
-rw-r--r--src/modlistviewactions.cpp23
-rw-r--r--src/modlistviewactions.h12
-rw-r--r--src/organizercore.cpp8
-rw-r--r--src/organizercore.h2
-rw-r--r--src/pluginlistview.cpp150
-rw-r--r--src/pluginlistview.h55
12 files changed, 270 insertions, 197 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 4c7bcd46..7773e845 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -227,6 +227,7 @@ add_filter(NAME src/widgets GROUPS
qtgroupingproxy
texteditor
viewmarkingscrollbar
+ modelutils
)
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index b000ba57..60e2a1e0 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -320,14 +320,7 @@ MainWindow::MainWindow(Settings &settings
TaskProgressManager::instance().tryCreateTaskbar();
setupModList();
-
- // set up plugin list
- m_PluginListSortProxy = m_OrganizerCore.createPluginListProxyModel();
-
- ui->espList->setModel(m_PluginListSortProxy);
- ui->espList->sortByColumn(PluginList::COL_PRIORITY, Qt::AscendingOrder);
- ui->espList->setItemDelegateForColumn(PluginList::COL_FLAGS, new GenericIconDelegate(ui->espList));
- ui->espList->installEventFilter(m_OrganizerCore.pluginList());
+ ui->espList->setup(m_OrganizerCore, this, ui);
ui->bsaList->setLocalMoveOnly(true);
ui->bsaList->setHeaderHidden(true);
@@ -400,9 +393,6 @@ MainWindow::MainWindow(Settings &settings
connect(&m_PluginContainer, SIGNAL(diagnosisUpdate()), this, SLOT(scheduleCheckForProblems()));
- connect(ui->espFilterEdit, SIGNAL(textChanged(QString)), m_PluginListSortProxy, SLOT(updateFilter(QString)));
- connect(ui->espFilterEdit, SIGNAL(textChanged(QString)), this, SLOT(espFilterChanged(QString)));
-
connect(m_OrganizerCore.directoryRefresher(), SIGNAL(refreshed()), this, SLOT(directory_refreshed()));
connect(
m_OrganizerCore.directoryRefresher(),
@@ -513,10 +503,10 @@ MainWindow::MainWindow(Settings &settings
refreshExecutablesList();
updatePinnedExecutables();
resetActionIcons();
- updatePluginCount();
processUpdates();
ui->modList->updateModCount();
+ ui->espList->updatePluginCount();
ui->statusBar->updateNormalMessage(m_OrganizerCore);
}
@@ -1129,18 +1119,6 @@ void MainWindow::createHelpMenu()
menu->addAction(tr("About Qt"), qApp, SLOT(aboutQt()));
}
-void MainWindow::espFilterChanged(const QString &filter)
-{
- if (!filter.isEmpty()) {
- ui->espList->setStyleSheet("QTreeView { border: 2px ridge #f00; }");
- ui->activePluginsCounter->setStyleSheet("QLCDNumber { border: 2px ridge #f00; }");
- } else {
- ui->espList->setStyleSheet("");
- ui->activePluginsCounter->setStyleSheet("");
- }
- updatePluginCount();
-}
-
bool MainWindow::addProfile()
{
QComboBox *profileBox = findChild<QComboBox*>("profileBox");
@@ -1544,7 +1522,7 @@ void MainWindow::activateSelectedProfile()
m_SavesTab->refreshSaveList();
m_OrganizerCore.refresh();
ui->modList->updateModCount();
- updatePluginCount();
+ ui->espList->updatePluginCount();
ui->statusBar->updateNormalMessage(m_OrganizerCore);
}
@@ -2238,7 +2216,7 @@ void MainWindow::directory_refreshed()
void MainWindow::esplist_changed()
{
- updatePluginCount();
+ ui->espList->updatePluginCount();
}
void MainWindow::modInstalled(const QString &modName)
@@ -2332,6 +2310,7 @@ void MainWindow::esplistSelectionsChanged(const QItemSelection &selected)
{
m_OrganizerCore.modList()->highlightMods(ui->espList->selectionModel(), *m_OrganizerCore.directoryStructure());
ui->modList->verticalScrollBar()->repaint();
+ ui->modList->repaint();
}
void MainWindow::modRemoved(const QString &fileName)
@@ -2427,57 +2406,6 @@ void MainWindow::refreshProfile_activated()
m_OrganizerCore.profileRefresh();
}
-void MainWindow::updatePluginCount()
-{
- int activeMasterCount = 0;
- int activeLightMasterCount = 0;
- int activeRegularCount = 0;
- int masterCount = 0;
- int lightMasterCount = 0;
- int regularCount = 0;
- int activeVisibleCount = 0;
-
- PluginList *list = m_OrganizerCore.pluginList();
- QString filter = ui->espFilterEdit->text();
-
- for (QString plugin : list->pluginNames()) {
- bool active = list->isEnabled(plugin);
- bool visible = m_PluginListSortProxy->filterMatchesPlugin(plugin);
- if (list->isLight(plugin) || list->isLightFlagged(plugin)) {
- lightMasterCount++;
- activeLightMasterCount += active;
- activeVisibleCount += visible && active;
- } else if (list->isMaster(plugin)) {
- masterCount++;
- activeMasterCount += active;
- activeVisibleCount += visible && active;
- } else {
- regularCount++;
- activeRegularCount += active;
- activeVisibleCount += visible && active;
- }
- }
-
- int activeCount = activeMasterCount + activeLightMasterCount + activeRegularCount;
- int totalCount = masterCount + lightMasterCount + regularCount;
-
- ui->activePluginsCounter->display(activeVisibleCount);
- ui->activePluginsCounter->setToolTip(tr("<table cellspacing=\"6\">"
- "<tr><th>Type</th><th>Active </th><th>Total</th></tr>"
- "<tr><td>All plugins:</td><td align=right>%1 </td><td align=right>%2</td></tr>"
- "<tr><td>ESMs:</td><td align=right>%3 </td><td align=right>%4</td></tr>"
- "<tr><td>ESPs:</td><td align=right>%7 </td><td align=right>%8</td></tr>"
- "<tr><td>ESMs+ESPs:</td><td align=right>%9 </td><td align=right>%10</td></tr>"
- "<tr><td>ESLs:</td><td align=right>%5 </td><td align=right>%6</td></tr>"
- "</table>")
- .arg(activeCount).arg(totalCount)
- .arg(activeMasterCount).arg(masterCount)
- .arg(activeLightMasterCount).arg(lightMasterCount)
- .arg(activeRegularCount).arg(regularCount)
- .arg(activeMasterCount+activeRegularCount).arg(masterCount+regularCount)
- );
-}
-
void MainWindow::openOriginInformation_clicked()
{
try {
@@ -2680,7 +2608,7 @@ QMenu *MainWindow::openFolderMenu()
void MainWindow::addPluginSendToContextMenu(QMenu *menu)
{
- if (m_PluginListSortProxy->sortColumn() != PluginList::COL_PRIORITY)
+ if (ui->espList->sortColumn() != PluginList::COL_PRIORITY)
return;
QMenu *sub_menu = new QMenu(this);
@@ -3623,7 +3551,7 @@ void MainWindow::toolBar_customContextMenuRequested(const QPoint &point)
void MainWindow::on_espList_customContextMenuRequested(const QPoint &pos)
{
- int espIndex = m_PluginListSortProxy->mapToSource(ui->espList->indexAt(pos)).row();
+ int espIndex = ui->espList->indexViewToModel(ui->espList->indexAt(pos)).row();
QMenu menu;
menu.addAction(tr("Enable selected"), [=]() { enableSelectedPlugins_clicked(); });
@@ -3642,7 +3570,7 @@ void MainWindow::on_espList_customContextMenuRequested(const QPoint &pos)
bool hasLocked = false;
bool hasUnlocked = false;
for (const QModelIndex &idx : currentSelection.indexes()) {
- int row = m_PluginListSortProxy->mapToSource(idx).row();
+ int row = ui->espList->indexViewToModel(idx).row();
if (m_OrganizerCore.pluginList()->isEnabled(row)) {
if (m_OrganizerCore.pluginList()->isESPLocked(row)) {
hasLocked = true;
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 75e7124c..71845874 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -148,8 +148,6 @@ public slots:
void directory_refreshed();
- void updatePluginCount();
-
signals:
/**
@@ -262,8 +260,6 @@ private:
QStringList m_DefaultArchives;
- PluginListSortProxy *m_PluginListSortProxy;
-
int m_OldExecutableIndex;
QAction *m_ContextAction;
@@ -406,7 +402,6 @@ private slots:
void modlistChanged(const QModelIndexList &indicies, int role);
void fileMoved(const QString &filePath, const QString &oldOriginName, const QString &newOriginName);
- void espFilterChanged(const QString &filter);
void resizeLists(bool pluginListCustom);
/**
diff --git a/src/modelutils.cpp b/src/modelutils.cpp
new file mode 100644
index 00000000..43aa6b99
--- /dev/null
+++ b/src/modelutils.cpp
@@ -0,0 +1,58 @@
+#include "modelutils.h"
+
+#include <QAbstractProxyModel>
+
+QModelIndex indexModelToView(const QModelIndex& index, const QAbstractItemView* view)
+{
+ // we need to stack the proxy
+ std::vector<QAbstractProxyModel*> proxies;
+ {
+ auto* currentModel = view->model();
+ while (auto* proxy = qobject_cast<QAbstractProxyModel*>(currentModel)) {
+ proxies.push_back(proxy);
+ currentModel = proxy->sourceModel();
+ }
+ }
+
+ if (proxies.empty() || proxies.back()->sourceModel() != index.model()) {
+ return QModelIndex();
+ }
+
+ auto qindex = index;
+ for (auto rit = proxies.rbegin(); rit != proxies.rend(); ++rit) {
+ qindex = (*rit)->mapFromSource(qindex);
+ }
+
+ return qindex;
+}
+
+QModelIndexList indexModelToView(const QModelIndexList& index, const QAbstractItemView* view)
+{
+ QModelIndexList result;
+ for (auto& idx : index) {
+ result.append(indexModelToView(idx, view));
+ }
+ return result;
+}
+
+QModelIndex indexViewToModel(const QModelIndex& index, const QAbstractItemModel* model)
+{
+ if (index.model() == model) {
+ return index;
+ }
+ else if (auto* proxy = qobject_cast<const QAbstractProxyModel*>(index.model())) {
+ return indexViewToModel(proxy->mapToSource(index), model);
+ }
+ else {
+ return QModelIndex();
+ }
+}
+
+QModelIndexList indexViewToModel(const QModelIndexList& index, const QAbstractItemModel* model)
+{
+ QModelIndexList result;
+ for (auto& idx : index) {
+ result.append(indexViewToModel(idx, model));
+ }
+ return result;
+}
diff --git a/src/modelutils.h b/src/modelutils.h
new file mode 100644
index 00000000..f355c0d6
--- /dev/null
+++ b/src/modelutils.h
@@ -0,0 +1,14 @@
+#ifndef MODELUTILS_H
+#define MODELUTILS_H
+
+#include <QAbstractItemView>
+#include <QAbstractItemModel>
+
+// convert back-and-forth through model proxies
+QModelIndex indexModelToView(const QModelIndex& index, const QAbstractItemView* view);
+QModelIndexList indexModelToView(const QModelIndexList& index, const QAbstractItemView* view);
+QModelIndex indexViewToModel(const QModelIndex& index, const QAbstractItemModel* model);
+QModelIndexList indexViewToModel(const QModelIndexList& index, const QAbstractItemModel* model);
+
+
+#endif
diff --git a/src/modlistview.cpp b/src/modlistview.cpp
index 99cc4c4c..082d947e 100644
--- a/src/modlistview.cpp
+++ b/src/modlistview.cpp
@@ -24,6 +24,8 @@
#include "genericicondelegate.h"
#include "shared/directoryentry.h"
#include "shared/filesorigin.h"
+#include "mainwindow.h"
+#include "modelutils.h"
using namespace MOBase;
@@ -197,61 +199,22 @@ bool ModListView::isModVisible(ModInfo::Ptr mod) const
QModelIndex ModListView::indexModelToView(const QModelIndex& index) const
{
- if (index.model() != m_core->modList()) {
- return QModelIndex();
- }
-
- // we need to stack the proxy
- std::vector<QAbstractProxyModel*> proxies;
- {
- auto* currentModel = model();
- while (auto* proxy = qobject_cast<QAbstractProxyModel*>(currentModel)) {
- proxies.push_back(proxy);
- currentModel = proxy->sourceModel();
- }
- }
-
- if (proxies.empty() || proxies.back()->sourceModel() != m_core->modList()) {
- return QModelIndex();
- }
-
- auto qindex = index;
- for (auto rit = proxies.rbegin(); rit != proxies.rend(); ++rit) {
- qindex = (*rit)->mapFromSource(qindex);
- }
-
- return qindex;
+ return ::indexModelToView(index, this);
}
QModelIndexList ModListView::indexModelToView(const QModelIndexList& index) const
{
- QModelIndexList result;
- for (auto& idx : index) {
- result.append(indexModelToView(idx));
- }
- return result;
+ return ::indexModelToView(index, this);
}
QModelIndex ModListView::indexViewToModel(const QModelIndex& index) const
{
- if (index.model() == m_core->modList()) {
- return index;
- }
- else if (auto* proxy = qobject_cast<const QAbstractProxyModel*>(index.model())) {
- return indexViewToModel(proxy->mapToSource(index));
- }
- else {
- return QModelIndex();
- }
+ return ::indexViewToModel(index, m_core->modList());
}
QModelIndexList ModListView::indexViewToModel(const QModelIndexList& index) const
{
- QModelIndexList result;
- for (auto& idx : index) {
- result.append(indexViewToModel(idx));
- }
- return result;
+ return ::indexViewToModel(index, m_core->modList());
}
QModelIndex ModListView::nextIndex(const QModelIndex& index) const
@@ -625,7 +588,7 @@ void ModListView::setup(OrganizerCore& core, CategoryFactory& factory, MainWindo
m_core = &core;
m_filters.reset(new FilterList(mwui, core, factory));
m_categories = &factory;
- m_actions = new ModListViewActions(core, *m_filters, factory, mw, this);
+ m_actions = new ModListViewActions(core, *m_filters, factory, this, mwui->espList, mw, mw);
ui = { mwui->groupCombo, mwui->activeModsCounter, mwui->modFilterEdit, mwui->currentCategoryLabel, mwui->clearFiltersButton };
connect(m_core, &OrganizerCore::modInstalled, this, &ModListView::onModInstalled);
diff --git a/src/modlistviewactions.cpp b/src/modlistviewactions.cpp
index d9841517..f0d4c4c7 100644
--- a/src/modlistviewactions.cpp
+++ b/src/modlistviewactions.cpp
@@ -17,7 +17,6 @@
#include "modinfodialog.h"
#include "modlist.h"
#include "modlistview.h"
-#include "mainwindow.h"
#include "messagedialog.h"
#include "nexusinterface.h"
#include "nxmaccessmanager.h"
@@ -25,6 +24,7 @@
#include "organizercore.h"
#include "overwriteinfodialog.h"
#include "csvbuilder.h"
+#include "pluginlistview.h"
#include "shared/filesorigin.h"
#include "shared/directoryentry.h"
#include "shared/fileregister.h"
@@ -33,15 +33,18 @@
using namespace MOBase;
using namespace MOShared;
+
ModListViewActions::ModListViewActions(
- OrganizerCore& core, FilterList& filters, CategoryFactory& categoryFactory, MainWindow* mainWindow, ModListView* view) :
- QObject(view)
+ OrganizerCore& core, FilterList& filters, CategoryFactory& categoryFactory,
+ ModListView* view, PluginListView* pluginView, QObject* nxmReceiver, QWidget* parent) :
+ QObject(parent)
, m_core(core)
, m_filters(filters)
, m_categories(categoryFactory)
, m_view(view)
- , m_parent(mainWindow)
- , m_main(mainWindow)
+ , m_pluginView(pluginView)
+ , m_parent(parent)
+ , m_receiver(nxmReceiver)
{
}
@@ -157,9 +160,9 @@ void ModListViewActions::checkModsForUpdates() const
{
bool checkingModsForUpdate = false;
if (NexusInterface::instance().getAccessManager()->validated()) {
- checkingModsForUpdate = ModInfo::checkAllForUpdate(&m_core.pluginContainer(), m_main);
- NexusInterface::instance().requestEndorsementInfo(m_main, QVariant(), QString());
- NexusInterface::instance().requestTrackingInfo(m_main, QVariant(), QString());
+ checkingModsForUpdate = ModInfo::checkAllForUpdate(&m_core.pluginContainer(), m_receiver);
+ NexusInterface::instance().requestEndorsementInfo(m_receiver, QVariant(), QString());
+ NexusInterface::instance().requestTrackingInfo(m_receiver, QVariant(), QString());
} else {
QString apiKey;
if (GlobalSettings::nexusApiKey(apiKey)) {
@@ -201,7 +204,7 @@ void ModListViewActions::checkModsForUpdates(std::multimap<QString, int> const&
}
if (NexusInterface::instance().getAccessManager()->validated()) {
- ModInfo::manualUpdateCheck(m_main, IDs);
+ ModInfo::manualUpdateCheck(m_receiver, IDs);
}
else {
QString apiKey;
@@ -596,7 +599,7 @@ void ModListViewActions::removeMods(const QModelIndexList& indices) const
m_core.modList()->removeRow(indices[0].data(ModList::IndexRole).toInt(), QModelIndex());
}
m_view->updateModCount();
- m_main->updatePluginCount();
+ m_pluginView->updatePluginCount();
}
catch (const std::exception& e) {
reportError(tr("failed to remove mod: %1").arg(e.what()));
diff --git a/src/modlistviewactions.h b/src/modlistviewactions.h
index 135b3035..cb7cdbda 100644
--- a/src/modlistviewactions.h
+++ b/src/modlistviewactions.h
@@ -11,6 +11,7 @@ class CategoryFactory;
class FilterList;
class MainWindow;
class ModListView;
+class PluginListView;
class OrganizerCore;
class ModListViewActions : public QObject
@@ -26,8 +27,10 @@ public:
OrganizerCore& core,
FilterList& filters,
CategoryFactory& categoryFactory,
- MainWindow* mainWindow,
- ModListView* view);
+ ModListView* view,
+ PluginListView* pluginView,
+ QObject* nxmReceiver,
+ QWidget* parent);
// install the mod from the given archive
//
@@ -142,10 +145,9 @@ private:
FilterList& m_filters;
CategoryFactory& m_categories;
ModListView* m_view;
+ PluginListView* m_pluginView;
+ QObject* m_receiver;
QWidget* m_parent;
-
- // hope to get rid of this some day
- MainWindow* m_main;
};
#endif
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index 17cd80c2..a8911d4f 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -11,7 +11,6 @@
#include "modrepositoryfileinfo.h"
#include "nexusinterface.h"
#include "plugincontainer.h"
-#include "pluginlistsortproxy.h"
#include "profile.h"
#include "credentialsdialog.h"
#include "filedialogmemory.h"
@@ -1507,13 +1506,6 @@ void OrganizerCore::requestDownload(const QUrl &url, QNetworkReply *reply)
}
}
-PluginListSortProxy *OrganizerCore::createPluginListProxyModel()
-{
- PluginListSortProxy *result = new PluginListSortProxy(this);
- result->setSourceModel(&m_PluginList);
- return result;
-}
-
PluginContainer& OrganizerCore::pluginContainer() const
{
return *m_PluginContainer;
diff --git a/src/organizercore.h b/src/organizercore.h
index e060fbcb..24de26ee 100644
--- a/src/organizercore.h
+++ b/src/organizercore.h
@@ -227,8 +227,6 @@ public:
MOBase::VersionInfo getVersion() const { return m_Updater.getVersion(); }
- PluginListSortProxy *createPluginListProxyModel();
-
// return the plugin container
//
PluginContainer& pluginContainer() const;
diff --git a/src/pluginlistview.cpp b/src/pluginlistview.cpp
index a265d5d4..a401ab06 100644
--- a/src/pluginlistview.cpp
+++ b/src/pluginlistview.cpp
@@ -1,58 +1,136 @@
#include "pluginlistview.h"
-#include <widgetutility.h>
+
#include <QUrl>
#include <QMimeData>
-#include <QProxyStyle>
+#include <widgetutility.h>
-class PluginListViewStyle : public QProxyStyle {
-public:
- PluginListViewStyle(QStyle *style, int indentation);
+#include "mainwindow.h"
+#include "ui_mainwindow.h"
+#include "organizercore.h"
+#include "pluginlistsortproxy.h"
+#include "genericicondelegate.h"
+#include "modelutils.h"
- void drawPrimitive(PrimitiveElement element, const QStyleOption *option,
- QPainter *painter, const QWidget *widget = 0) const;
-private:
- int m_Indentation;
-};
+PluginListView::PluginListView(QWidget *parent)
+ : QTreeView(parent)
+ , m_Scrollbar(new ViewMarkingScrollBar(this->model(), this))
+{
+ setVerticalScrollBar(m_Scrollbar);
+ MOBase::setCustomizableColumns(this);
+}
-PluginListViewStyle::PluginListViewStyle(QStyle *style, int indentation)
- : QProxyStyle(style), m_Indentation(indentation)
+void PluginListView::setModel(QAbstractItemModel *model)
{
+ QTreeView::setModel(model);
+ setVerticalScrollBar(new ViewMarkingScrollBar(model, this));
}
-void PluginListViewStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option,
- QPainter *painter, const QWidget *widget) const
+int PluginListView::sortColumn() const
{
- if (element == QStyle::PE_IndicatorItemViewItemDrop && !option->rect.isNull()) {
- QStyleOption opt(*option);
- opt.rect.setLeft(m_Indentation);
- if (widget) {
- opt.rect.setRight(widget->width() - 5); // 5 is an arbitrary value that seems to work ok
- }
- QProxyStyle::drawPrimitive(element, &opt, painter, widget);
- }
- else {
- QProxyStyle::drawPrimitive(element, option, painter, widget);
- }
+ return m_sortProxy ? m_sortProxy->sortColumn() : -1;
}
-PluginListView::PluginListView(QWidget *parent)
- : QTreeView(parent)
- , m_Scrollbar(new ViewMarkingScrollBar(this->model(), this))
+QModelIndex PluginListView::indexModelToView(const QModelIndex& index) const
{
- setVerticalScrollBar(m_Scrollbar);
- MOBase::setCustomizableColumns(this);
+ return ::indexModelToView(index, this);
}
-void PluginListView::dragEnterEvent(QDragEnterEvent *event)
+QModelIndexList PluginListView::indexModelToView(const QModelIndexList& index) const
{
- emit dropModeUpdate(event->mimeData()->hasUrls());
+ return ::indexModelToView(index, this);
+}
- QTreeView::dragEnterEvent(event);
+QModelIndex PluginListView::indexViewToModel(const QModelIndex& index) const
+{
+ return ::indexViewToModel(index, m_core->pluginList());
}
-void PluginListView::setModel(QAbstractItemModel *model)
+QModelIndexList PluginListView::indexViewToModel(const QModelIndexList& index) const
{
- QTreeView::setModel(model);
- setVerticalScrollBar(new ViewMarkingScrollBar(model, this));
+ return ::indexViewToModel(index, m_core->pluginList());
+}
+
+void PluginListView::updatePluginCount()
+{
+ int activeMasterCount = 0;
+ int activeLightMasterCount = 0;
+ int activeRegularCount = 0;
+ int masterCount = 0;
+ int lightMasterCount = 0;
+ int regularCount = 0;
+ int activeVisibleCount = 0;
+
+ PluginList* list = m_core->pluginList();
+ QString filter = ui.filter->text();
+
+ for (QString plugin : list->pluginNames()) {
+ bool active = list->isEnabled(plugin);
+ bool visible = m_sortProxy->filterMatchesPlugin(plugin);
+ if (list->isLight(plugin) || list->isLightFlagged(plugin)) {
+ lightMasterCount++;
+ activeLightMasterCount += active;
+ activeVisibleCount += visible && active;
+ }
+ else if (list->isMaster(plugin)) {
+ masterCount++;
+ activeMasterCount += active;
+ activeVisibleCount += visible && active;
+ }
+ else {
+ regularCount++;
+ activeRegularCount += active;
+ activeVisibleCount += visible && active;
+ }
+ }
+
+ int activeCount = activeMasterCount + activeLightMasterCount + activeRegularCount;
+ int totalCount = masterCount + lightMasterCount + regularCount;
+
+ ui.counter->display(activeVisibleCount);
+ ui.counter->setToolTip(tr("<table cellspacing=\"6\">"
+ "<tr><th>Type</th><th>Active </th><th>Total</th></tr>"
+ "<tr><td>All plugins:</td><td align=right>%1 </td><td align=right>%2</td></tr>"
+ "<tr><td>ESMs:</td><td align=right>%3 </td><td align=right>%4</td></tr>"
+ "<tr><td>ESPs:</td><td align=right>%7 </td><td align=right>%8</td></tr>"
+ "<tr><td>ESMs+ESPs:</td><td align=right>%9 </td><td align=right>%10</td></tr>"
+ "<tr><td>ESLs:</td><td align=right>%5 </td><td align=right>%6</td></tr>"
+ "</table>")
+ .arg(activeCount).arg(totalCount)
+ .arg(activeMasterCount).arg(masterCount)
+ .arg(activeLightMasterCount).arg(lightMasterCount)
+ .arg(activeRegularCount).arg(regularCount)
+ .arg(activeMasterCount + activeRegularCount).arg(masterCount + regularCount)
+ );
+}
+
+void PluginListView::onFilterChanged(const QString& filter)
+{
+ if (!filter.isEmpty()) {
+ setStyleSheet("QTreeView { border: 2px ridge #f00; }");
+ ui.counter->setStyleSheet("QLCDNumber { border: 2px ridge #f00; }");
+ }
+ else {
+ setStyleSheet("");
+ ui.counter->setStyleSheet("");
+ }
+ updatePluginCount();
+}
+
+void PluginListView::setup(OrganizerCore& core, MainWindow* mw, Ui::MainWindow* mwui)
+{
+ m_core = &core;
+ ui = { mwui->activePluginsCounter, mwui->espFilterEdit };
+
+ m_sortProxy = new PluginListSortProxy(&core);
+ m_sortProxy->setSourceModel(core.pluginList());
+ setModel(m_sortProxy);
+
+ sortByColumn(PluginList::COL_PRIORITY, Qt::AscendingOrder);
+ setItemDelegateForColumn(PluginList::COL_FLAGS, new GenericIconDelegate(this));
+ installEventFilter(core.pluginList());
+
+ connect(ui.filter, &QLineEdit::textChanged, m_sortProxy, &PluginListSortProxy::updateFilter);
+ connect(ui.filter, &QLineEdit::textChanged, this, &PluginListView::onFilterChanged);
+
}
diff --git a/src/pluginlistview.h b/src/pluginlistview.h
index bdd4ee61..95450ffd 100644
--- a/src/pluginlistview.h
+++ b/src/pluginlistview.h
@@ -5,20 +5,61 @@
#include <QDragEnterEvent>
#include "viewmarkingscrollbar.h"
+namespace Ui {
+ class MainWindow;
+}
+
+class OrganizerCore;
+class MainWindow;
+class PluginListSortProxy;
+
class PluginListView : public QTreeView
{
Q_OBJECT
public:
- explicit PluginListView(QWidget *parent = 0);
- virtual void dragEnterEvent(QDragEnterEvent *event);
- virtual void setModel(QAbstractItemModel *model);
-signals:
- void dropModeUpdate(bool dropOnRows);
+ explicit PluginListView(QWidget* parent = nullptr);
+ void setModel(QAbstractItemModel* model) override;
+
+ void setup(OrganizerCore& core, MainWindow* mw, Ui::MainWindow* mwui);
+
+ // the column by which the plugin list is currently sorted
+ //
+ int sortColumn() const;
+
+ // update the plugin counter
+ //
+ void updatePluginCount();
+
+ // TODO: Move these to private when possible.
+ // map from/to the view indexes to the model
+ //
+ QModelIndex indexModelToView(const QModelIndex& index) const;
+ QModelIndexList indexModelToView(const QModelIndexList& index) const;
+ QModelIndex indexViewToModel(const QModelIndex& index) const;
+ QModelIndexList indexViewToModel(const QModelIndexList& index) const;
+
+
+protected slots:
+
+ void onFilterChanged(const QString& filter);
- public slots:
private:
- ViewMarkingScrollBar *m_Scrollbar;
+ struct PluginListViewUi
+ {
+ // the plguin counter
+ QLCDNumber* counter;
+
+ // the filter
+ QLineEdit* filter;
+ };
+
+ OrganizerCore* m_core;
+ PluginListViewUi ui;
+
+ PluginListSortProxy* m_sortProxy;
+
+ ViewMarkingScrollBar* m_Scrollbar;
};
#endif // PLUGINLISTVIEW_H