summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMikaël Capelle <capelle.mikael@gmail.com>2021-01-02 17:14:09 +0100
committerMikaël Capelle <capelle.mikael@gmail.com>2021-01-02 17:18:31 +0100
commit071974c243d97a19e5a73f368ce25f8decd00183 (patch)
tree9e504608ddd05a2aeae5c654ad5817bc7cbc4528 /src
parent22810ccbba530a9dfa679437c703fc860a891060 (diff)
Save/restore filter list state between run.
Diffstat (limited to 'src')
-rw-r--r--src/filterlist.cpp50
-rw-r--r--src/mainwindow.cpp2
-rw-r--r--src/modlistview.cpp4
-rw-r--r--src/settings.cpp27
-rw-r--r--src/settings.h10
5 files changed, 74 insertions, 19 deletions
diff --git a/src/filterlist.cpp b/src/filterlist.cpp
index c3f169a6..14813312 100644
--- a/src/filterlist.cpp
+++ b/src/filterlist.cpp
@@ -12,7 +12,14 @@ using Criteria = ModListSortProxy::Criteria;
class FilterList::CriteriaItem : public QTreeWidgetItem
{
+
+ static constexpr int IDRole = Qt::UserRole;
+ static constexpr int TypeRole = Qt::UserRole + 1;
+
public:
+
+ static constexpr int StateRole = Qt::UserRole + 2;
+
enum States
{
FirstState = 0,
@@ -58,27 +65,41 @@ public:
void nextState()
{
- m_state = static_cast<States>(m_state + 1);
- if (m_state > LastState) {
- m_state = FirstState;
+ auto s = static_cast<States>(m_state + 1);
+ if (s > LastState) {
+ s = FirstState;
}
-
- updateState();
+ setState(s);
}
void previousState()
{
- m_state = static_cast<States>(m_state - 1);
- if (m_state < FirstState) {
- m_state = LastState;
+ auto s = static_cast<States>(m_state - 1);
+ if (s < FirstState) {
+ s = LastState;
}
+ setState(s);
+ }
- updateState();
+ QVariant data(int column, int role) const
+ {
+ if (role == StateRole) {
+ return m_state;
+ }
+ return QTreeWidgetItem::data(column, role);
+ }
+
+ void setData(int column, int role, const QVariant& value) {
+ if (role == StateRole) {
+ MOBase::log::debug("setData: {}, {}, {}", column, role, value.toInt());
+ setState(static_cast<States>(value.toInt()));
+ }
+ else {
+ QTreeWidgetItem::setData(column, role, value);
+ }
}
private:
- const int IDRole = Qt::UserRole;
- const int TypeRole = Qt::UserRole + 1;
FilterList* m_list;
States m_state;
@@ -212,10 +233,17 @@ FilterList::FilterList(Ui::MainWindow* ui, OrganizerCore& core, CategoryFactory&
void FilterList::restoreState(const Settings& s)
{
s.widgets().restoreIndex(ui->filtersSeparators);
+ s.widgets().restoreChecked(ui->filtersAnd);
+ s.widgets().restoreChecked(ui->filtersOr);
+ s.widgets().restoreTreeCheckState(ui->filters, CriteriaItem::StateRole);
+ checkCriteria();
}
void FilterList::saveState(Settings& s) const
{
+ s.widgets().saveTreeCheckState(ui->filters, CriteriaItem::StateRole);
+ s.widgets().saveChecked(ui->filtersAnd);
+ s.widgets().saveChecked(ui->filtersOr);
s.widgets().saveIndex(ui->filtersSeparators);
}
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 6929a009..2b2685c4 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -1170,8 +1170,8 @@ void MainWindow::showEvent(QShowEvent *event)
QMainWindow::showEvent(event);
if (!m_WasVisible) {
- readSettings();
ui->modList->refreshFilters();
+ readSettings();
// this needs to be connected here instead of in the constructor because the
// actual changing of the stylesheet is done by MOApplication, which
diff --git a/src/modlistview.cpp b/src/modlistview.cpp
index 0898fe3c..a460e4a4 100644
--- a/src/modlistview.cpp
+++ b/src/modlistview.cpp
@@ -804,7 +804,7 @@ void ModListView::restoreState(const Settings& s)
s.geometry().restoreState(header());
s.widgets().restoreIndex(ui.groupBy);
- s.widgets().restoreTreeState(this);
+ s.widgets().restoreTreeExpandState(this);
m_filters->restoreState(s);
}
@@ -814,7 +814,7 @@ void ModListView::saveState(Settings& s) const
s.geometry().saveState(header());
s.widgets().saveIndex(ui.groupBy);
- s.widgets().saveTreeState(this);
+ s.widgets().saveTreeExpandState(this);
m_filters->saveState(s);
}
diff --git a/src/settings.cpp b/src/settings.cpp
index e379a819..3cc026cf 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -1065,7 +1065,30 @@ WidgetSettings::WidgetSettings(QSettings& s, bool globalInstance)
}
}
-void WidgetSettings::saveTreeState(const QTreeView* tv, int role)
+void WidgetSettings::saveTreeCheckState(const QTreeView* tv, int role)
+{
+ QVariantList data;
+ for (auto index : flatIndex(tv->model())) {
+ data.append(index.data(role));
+ }
+ set(m_Settings, "Widgets", indexSettingName(tv), data);
+}
+
+void WidgetSettings::restoreTreeCheckState(QTreeView* tv, int role) const
+{
+ if (auto states = getOptional<QVariantList>(m_Settings, "Widgets", indexSettingName(tv))) {
+ auto allIndex = flatIndex(tv->model());
+ MOBase::log::debug("restoreTreeCheckState: {}, {}", states->size(), allIndex.size());
+ if (states->size() != allIndex.size()) {
+ return;
+ }
+ for (int i = 0; i < states->size(); ++i) {
+ tv->model()->setData(allIndex[i], states->at(i), role);
+ }
+ }
+}
+
+void WidgetSettings::saveTreeExpandState(const QTreeView* tv, int role)
{
QVariantList expanded;
for (auto index : flatIndex(tv->model())) {
@@ -1076,7 +1099,7 @@ void WidgetSettings::saveTreeState(const QTreeView* tv, int role)
set(m_Settings, "Widgets", indexSettingName(tv), expanded);
}
-void WidgetSettings::restoreTreeState(QTreeView* tv, int role) const
+void WidgetSettings::restoreTreeExpandState(QTreeView* tv, int role) const
{
if (auto expanded = getOptional<QVariantList>(m_Settings, "Widgets", indexSettingName(tv))) {
tv->collapseAll();
diff --git a/src/settings.h b/src/settings.h
index 5506bbf8..9c3765c2 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -202,11 +202,15 @@ public:
//
WidgetSettings(QSettings& s, bool globalInstance);
+ // tree item check - this saves the list of expanded items based on the given role
+ //
+ void saveTreeCheckState(const QTreeView* tv, int role = Qt::CheckStateRole);
+ void restoreTreeCheckState(QTreeView* tv, int role = Qt::CheckStateRole) const;
+
// tree state - this saves the list of expanded items based on the given role
//
- std::vector<QModelIndex> allIndex(const QAbstractItemModel* model, int column = 0, const QModelIndex& parent = QModelIndex()) const;
- void saveTreeState(const QTreeView* tv, int role = Qt::DisplayRole);
- void restoreTreeState(QTreeView* tv, int role = Qt::DisplayRole) const;
+ void saveTreeExpandState(const QTreeView* tv, int role = Qt::DisplayRole);
+ void restoreTreeExpandState(QTreeView* tv, int role = Qt::DisplayRole) const;
// selected index for a combobox
//