summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-12-02 10:41:52 -0500
committerisanae <14251494+isanae@users.noreply.github.com>2019-12-02 10:41:52 -0500
commit3c25117fe163f7fab7afa22ba171ea2d41112f23 (patch)
treea2a48759382677373bb1d23c5473e85c6ec0dd0e
parentd2073ef2bd62527034864fd0cacd5537aff33218 (diff)
three modes for separators, save state
renamed enumerators
-rw-r--r--src/filterlist.cpp28
-rw-r--r--src/filterlist.h7
-rw-r--r--src/mainwindow.cpp16
-rw-r--r--src/mainwindow.h3
-rw-r--r--src/mainwindow.ui21
-rw-r--r--src/modlistsortproxy.cpp65
-rw-r--r--src/modlistsortproxy.h25
7 files changed, 112 insertions, 53 deletions
diff --git a/src/filterlist.cpp b/src/filterlist.cpp
index b65f0f4a..05bff2dd 100644
--- a/src/filterlist.cpp
+++ b/src/filterlist.cpp
@@ -2,6 +2,7 @@
#include "ui_mainwindow.h"
#include "categories.h"
#include "categoriesdialog.h"
+#include "settings.h"
#include <utility.h>
using namespace MOBase;
@@ -157,7 +158,7 @@ FilterList::FilterList(Ui::MainWindow* ui, CategoryFactory& factory)
[&]{ onOptionsChanged(); });
connect(
- ui->filtersSeparators, &QCheckBox::toggled,
+ ui->filtersSeparators, qOverload<int>(&QComboBox::currentIndexChanged),
[&]{ onOptionsChanged(); });
ui->filters->header()->setMinimumSectionSize(0);
@@ -165,6 +166,20 @@ FilterList::FilterList(Ui::MainWindow* ui, CategoryFactory& factory)
ui->filters->header()->resizeSection(0, 30);
ui->categoriesSplitter->setCollapsible(0, false);
ui->categoriesSplitter->setCollapsible(1, false);
+
+ ui->filtersSeparators->addItem(tr("Filter separators"), ModListSortProxy::SeparatorFilter);
+ ui->filtersSeparators->addItem(tr("Show separators"), ModListSortProxy::SeparatorShow);
+ ui->filtersSeparators->addItem(tr("Hide separators"), ModListSortProxy::SeparatorHide);
+}
+
+void FilterList::restoreState(const Settings& s)
+{
+ s.widgets().restoreIndex(ui->filtersSeparators);
+}
+
+void FilterList::saveState(Settings& s) const
+{
+ s.widgets().saveIndex(ui->filtersSeparators);
}
QTreeWidgetItem* FilterList::addCriteriaItem(
@@ -189,7 +204,7 @@ void FilterList::addContentCriteria()
for (unsigned i = 0; i < ModInfo::NUM_CONTENT_TYPES; ++i) {
addCriteriaItem(
nullptr, tr("<Contains %1>").arg(ModInfo::getContentTypeName(i)),
- i, ModListSortProxy::TYPE_CONTENT);
+ i, ModListSortProxy::TypeContent);
}
}
@@ -202,7 +217,7 @@ void FilterList::addCategoryCriteria(QTreeWidgetItem *root, const std::set<int>
if (categoriesUsed.find(categoryID) != categoriesUsed.end()) {
QTreeWidgetItem *item =
addCriteriaItem(root, m_factory.getCategoryName(i),
- categoryID, ModListSortProxy::TYPE_CATEGORY);
+ categoryID, ModListSortProxy::TypeCategory);
if (m_factory.hasChildren(i)) {
addCategoryCriteria(item, categoriesUsed, categoryID);
}
@@ -217,7 +232,7 @@ void FilterList::addSpecialCriteria(int type)
addCriteriaItem(
nullptr, m_factory.getSpecialCategoryName(sc),
- type, ModListSortProxy::TYPE_SPECIAL);
+ type, ModListSortProxy::TypeSpecial);
}
void FilterList::refresh()
@@ -361,9 +376,10 @@ void FilterList::editCategories()
void FilterList::onOptionsChanged()
{
const auto mode = ui->filtersAnd->isChecked() ?
- ModListSortProxy::FILTER_AND : ModListSortProxy::FILTER_OR;
+ ModListSortProxy::FilterAnd: ModListSortProxy::FilterOr;
- const bool separators = ui->filtersSeparators->isChecked();
+ const auto separators = static_cast<ModListSortProxy::SeparatorsMode>(
+ ui->filtersSeparators->currentData().toInt());
emit optionsChanged(mode, separators);
}
diff --git a/src/filterlist.h b/src/filterlist.h
index fac1d683..671462d4 100644
--- a/src/filterlist.h
+++ b/src/filterlist.h
@@ -6,6 +6,7 @@
namespace Ui { class MainWindow; };
class CategoryFactory;
+class Settings;
class FilterList : public QObject
{
@@ -14,13 +15,17 @@ class FilterList : public QObject
public:
FilterList(Ui::MainWindow* ui, CategoryFactory& factory);
+ void restoreState(const Settings& s);
+ void saveState(Settings& s) const;
+
void setSelection(const std::vector<ModListSortProxy::Criteria>& criteria);
void clearSelection();
void refresh();
signals:
void criteriaChanged(std::vector<ModListSortProxy::Criteria> criteria);
- void optionsChanged(ModListSortProxy::FilterMode mode, bool separators);
+ void optionsChanged(
+ ModListSortProxy::FilterMode mode, ModListSortProxy::SeparatorsMode sep);
private:
class CriteriaItem;
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 096ea076..b5af9aa5 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -269,7 +269,7 @@ MainWindow::MainWindow(Settings &settings
connect(
m_Filters.get(), &FilterList::optionsChanged,
- [&](auto mode, bool sep) { onFiltersOptions(mode, sep); });
+ [&](auto&& mode, auto&& sep) { onFiltersOptions(mode, sep); });
ui->logList->setCore(m_OrganizerCore);
@@ -2205,6 +2205,7 @@ void MainWindow::readSettings()
}
s.widgets().restoreIndex(ui->groupCombo);
+ m_Filters->restoreState(s);
{
s.geometry().restoreVisibility(ui->categoriesGroup, false);
@@ -2283,6 +2284,8 @@ void MainWindow::storeSettings()
s.widgets().saveIndex(ui->groupCombo);
s.widgets().saveIndex(ui->executablesListBox);
+
+ m_Filters->saveState(s);
}
QWidget* MainWindow::qtWidget()
@@ -4125,13 +4128,13 @@ void MainWindow::checkModsForUpdates()
if (updatesAvailable || checkingModsForUpdate) {
m_ModListSortProxy->setCriteria({{
- ModListSortProxy::TYPE_SPECIAL,
+ ModListSortProxy::TypeSpecial,
CategoryFactory::UpdateAvailable,
false}
});
m_Filters->setSelection({{
- ModListSortProxy::TYPE_SPECIAL,
+ ModListSortProxy::TypeSpecial,
CategoryFactory::UpdateAvailable,
false
}});
@@ -6131,7 +6134,7 @@ void MainWindow::onFiltersCriteria(const std::vector<ModListSortProxy::Criteria>
} else if (criteria.size() == 1) {
const auto& c = criteria[0];
- if (c.type == ModListSortProxy::TYPE_CONTENT) {
+ if (c.type == ModListSortProxy::TypeContent) {
label = ModInfo::getContentTypeName(c.id);
} else {
label = m_CategoryFactory.getCategoryNameByID(c.id);
@@ -6148,9 +6151,10 @@ void MainWindow::onFiltersCriteria(const std::vector<ModListSortProxy::Criteria>
ui->modList->reset();
}
-void MainWindow::onFiltersOptions(ModListSortProxy::FilterMode mode, bool separators)
+void MainWindow::onFiltersOptions(
+ ModListSortProxy::FilterMode mode, ModListSortProxy::SeparatorsMode sep)
{
- m_ModListSortProxy->setOptions(mode, separators);
+ m_ModListSortProxy->setOptions(mode, sep);
}
void MainWindow::updateESPLock(bool locked)
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 0b559300..69aee073 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -515,7 +515,8 @@ private slots:
void deselectFilters();
void refreshFilters();
void onFiltersCriteria(const std::vector<ModListSortProxy::Criteria>& filters);
- void onFiltersOptions(ModListSortProxy::FilterMode mode, bool separators);
+ void onFiltersOptions(
+ ModListSortProxy::FilterMode mode, ModListSortProxy::SeparatorsMode sep);
void displayModInformation(const QString &modName, ModInfoTabIDs tabID);
diff --git a/src/mainwindow.ui b/src/mainwindow.ui
index 92a41c67..85be22b3 100644
--- a/src/mainwindow.ui
+++ b/src/mainwindow.ui
@@ -153,6 +153,18 @@
</sizepolicy>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_11">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>2</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
<item>
<widget class="QRadioButton" name="filtersAnd">
<property name="toolTip">
@@ -177,12 +189,11 @@
</widget>
</item>
<item>
- <widget class="QCheckBox" name="filtersSeparators">
+ <widget class="QComboBox" name="filtersSeparators">
<property name="toolTip">
- <string>Include separators</string>
- </property>
- <property name="text">
- <string>Separators</string>
+ <string>Filter: only show the separators that match the current filters
+Show: always show separators
+Hide: never show separators</string>
</property>
</widget>
</item>
diff --git a/src/modlistsortproxy.cpp b/src/modlistsortproxy.cpp
index fd3dbc9e..7ac98f66 100644
--- a/src/modlistsortproxy.cpp
+++ b/src/modlistsortproxy.cpp
@@ -37,8 +37,8 @@ ModListSortProxy::ModListSortProxy(Profile* profile, QObject *parent)
: QSortFilterProxyModel(parent)
, m_Profile(profile)
, m_FilterActive(false)
- , m_FilterMode(FILTER_AND)
- , m_FilterSeparators(false)
+ , m_FilterMode(FilterAnd)
+ , m_FilterSeparators(SeparatorFilter)
{
setDynamicSortFilter(true); // this seems to work without dynamicsortfilter
// but I don't know why. This should be necessary
@@ -269,10 +269,6 @@ bool ModListSortProxy::hasConflictFlag(const std::vector<ModInfo::EFlag> &flags)
bool ModListSortProxy::filterMatchesModAnd(ModInfo::Ptr info, bool enabled) const
{
- if (!optionsMatchMod(info, enabled)) {
- return false;
- }
-
for (auto&& c : m_Criteria) {
if (!criteriaMatchMod(info, enabled, c)) {
return false;
@@ -284,10 +280,6 @@ bool ModListSortProxy::filterMatchesModAnd(ModInfo::Ptr info, bool enabled) cons
bool ModListSortProxy::filterMatchesModOr(ModInfo::Ptr info, bool enabled) const
{
- if (!optionsMatchMod(info, enabled)) {
- return false;
- }
-
for (auto&& c : m_Criteria) {
if (criteriaMatchMod(info, enabled, c)) {
return true;
@@ -304,16 +296,6 @@ bool ModListSortProxy::filterMatchesModOr(ModInfo::Ptr info, bool enabled) const
bool ModListSortProxy::optionsMatchMod(ModInfo::Ptr info, bool) const
{
- // don't check options if there are no filters selected
- if (!m_FilterActive) {
- return true;
- }
-
- if (!m_FilterSeparators) {
- if (info->hasFlag(ModInfo::FLAG_SEPARATOR)) {
- return false;
- }
- }
return true;
}
@@ -325,14 +307,14 @@ bool ModListSortProxy::criteriaMatchMod(
switch (c.type)
{
- case TYPE_SPECIAL: // fall-through
- case TYPE_CATEGORY:
+ case TypeSpecial: // fall-through
+ case TypeCategory:
{
b = categoryMatchesMod(info, enabled, c.id);
break;
}
- case TYPE_CONTENT:
+ case TypeContent:
{
b = contentMatchesMod(info, enabled, c.id);
break;
@@ -439,6 +421,37 @@ bool ModListSortProxy::contentMatchesMod(ModInfo::Ptr info, bool enabled, int co
bool ModListSortProxy::filterMatchesMod(ModInfo::Ptr info, bool enabled) const
{
+ // don't check if there are no filters selected
+ if (!m_FilterActive) {
+ return true;
+ }
+
+
+ // special case for separators
+ if (info->hasFlag(ModInfo::FLAG_SEPARATOR)) {
+ switch (m_FilterSeparators)
+ {
+ case SeparatorFilter:
+ {
+ // filter normally
+ break;
+ }
+
+ case SeparatorShow:
+ {
+ // force visible
+ return true;
+ }
+
+ case SeparatorHide:
+ {
+ // force hide
+ return false;
+ }
+ }
+ }
+
+
if (!m_Filter.isEmpty()) {
bool display = false;
QString filterCopy = QString(m_Filter);
@@ -519,7 +532,8 @@ bool ModListSortProxy::filterMatchesMod(ModInfo::Ptr info, bool enabled) const
}
}//if (!m_CurrentFilter.isEmpty())
- if (m_FilterMode == FILTER_AND) {
+
+ if (m_FilterMode == FilterAnd) {
return filterMatchesModAnd(info, enabled);
}
else {
@@ -532,7 +546,8 @@ void ModListSortProxy::setColumnVisible(int column, bool visible)
m_EnabledColumns[column] = visible;
}
-void ModListSortProxy::setOptions(ModListSortProxy::FilterMode mode, bool separators)
+void ModListSortProxy::setOptions(
+ ModListSortProxy::FilterMode mode, SeparatorsMode separators)
{
if (m_FilterMode != mode || separators != m_FilterSeparators) {
m_FilterMode = mode;
diff --git a/src/modlistsortproxy.h b/src/modlistsortproxy.h
index 9b533492..46356fe9 100644
--- a/src/modlistsortproxy.h
+++ b/src/modlistsortproxy.h
@@ -31,16 +31,23 @@ class ModListSortProxy : public QSortFilterProxyModel
Q_OBJECT
public:
-
- enum FilterMode {
- FILTER_AND,
- FILTER_OR
+ enum FilterMode
+ {
+ FilterAnd,
+ FilterOr
};
enum CriteriaType {
- TYPE_SPECIAL,
- TYPE_CATEGORY,
- TYPE_CONTENT
+ TypeSpecial,
+ TypeCategory,
+ TypeContent
+ };
+
+ enum SeparatorsMode
+ {
+ SeparatorFilter,
+ SeparatorShow,
+ SeparatorHide
};
struct Criteria
@@ -101,7 +108,7 @@ public:
bool isFilterActive() const { return m_FilterActive; }
void setCriteria(const std::vector<Criteria>& criteria);
- void setOptions(FilterMode mode, bool separators);
+ void setOptions(FilterMode mode, SeparatorsMode separators);
/**
* @brief tests if the specified index has child nodes
@@ -153,7 +160,7 @@ private:
bool m_FilterActive;
FilterMode m_FilterMode;
- bool m_FilterSeparators;
+ SeparatorsMode m_FilterSeparators;
std::vector<Criteria> m_PreChangeCriteria;