BibleTime
btbookshelffiltermodel.cpp
Go to the documentation of this file.
1/*********
2*
3* In the name of the Father, and of the Son, and of the Holy Spirit.
4*
5* This file is part of BibleTime's source code, https://bibletime.info/
6*
7* Copyright 1999-2025 by the BibleTime developers.
8* The BibleTime source code is licensed under the GNU General Public License
9* version 2.0.
10*
11**********/
12
14
15#include <QAbstractItemModel>
16#include <QVariant>
17#include "../../util/btassert.h"
18#include "btbookshelfmodel.h"
19
20
22 : QSortFilterProxyModel(parent)
23 , m_enabled(true)
24 , m_nameFilterRole(BtBookshelfModel::ModuleNameRole)
25 , m_nameFilterColumn(0)
26 , m_nameFilterCase(Qt::CaseInsensitive)
27 , m_hiddenFilterRole(BtBookshelfModel::ModuleHiddenRole)
28 , m_hiddenFilterColumn(0)
29 , m_showHidden(false)
30 , m_showShown(true)
31{ setDynamicSortFilter(true); }
32
33void BtBookshelfFilterModel::setEnabled(bool const enable) {
34 if (enable == m_enabled)
35 return;
36 m_enabled = enable;
37 invalidateFilter();
38}
39
40// Name filter:
41
43 if (m_nameFilterRole == role)
44 return;
45 m_nameFilterRole = role;
46 invalidateFilter();
47}
48
50 if (m_nameFilterColumn == column)
51 return;
52 m_nameFilterColumn = column;
53 invalidateFilter();
54}
55
57 if (m_nameFilter == filter)
58 return;
59 m_nameFilter = filter;
60 invalidateFilter();
61}
62
63void BtBookshelfFilterModel::setNameFilterCase(Qt::CaseSensitivity const value){
64 if (m_nameFilterCase == value)
65 return;
66 m_nameFilterCase = value;
67 invalidateFilter();
68}
69
70// Hidden filter:
71
73 if (m_hiddenFilterRole == role)
74 return;
75 m_hiddenFilterRole = role;
76 invalidateFilter();
77}
78
80 if (m_hiddenFilterColumn == column)
81 return;
82 m_hiddenFilterColumn = column;
83 invalidateFilter();
84}
85
87 if (m_showHidden == show)
88 return;
89 m_showHidden = show;
90 invalidateFilter();
91}
92
94 if (m_showShown == show)
95 return;
96 m_showShown = show;
97 invalidateFilter();
98}
99
100// Filtering:
101
103 QModelIndex const & parent) const
104{
105 if (!m_enabled)
106 return true;
107
108 if (!hiddenFilterAcceptsRow(row, parent))
109 return false;
110 if (!nameFilterAcceptsRow(row, parent))
111 return false;
112 return true;
113}
114
116 int const row,
117 QModelIndex const & parent) const
118{
119 if (m_nameFilter.isEmpty())
120 return true;
121
122 auto const * const m = sourceModel();
123 BT_ASSERT(m);
124
125 auto const itemIndex = m->index(row, m_nameFilterColumn, parent);
126 auto const numChildren = m->rowCount(itemIndex);
127 if (numChildren == 0) {
128 auto const data = m->data(itemIndex, m_nameFilterRole);
129 return data.toString().contains(m_nameFilter, m_nameFilterCase);
130 }
131
132 for (int i = 0; i < numChildren; ++i)
133 if (filterAcceptsRow(i, itemIndex))
134 return true;
135 return false;
136}
137
139 int const row,
140 QModelIndex const & parent) const
141{
143 return true;
144
145 auto const * const m = sourceModel();
146 BT_ASSERT(m);
147
148 auto const itemIndex = m->index(row, m_hiddenFilterColumn, parent);
149 auto const numChildren = m->rowCount(itemIndex);
150 if (numChildren == 0) {
151 if (static_cast<Qt::CheckState>(m->data(itemIndex,
152 m_hiddenFilterRole).toBool()))
153 return m_showHidden;
154 return m_showShown;
155 }
156
157 for (int i = 0; i < numChildren; ++i)
158 if (filterAcceptsRow(i, itemIndex))
159 return true;
160 return false;
161}
#define BT_ASSERT(...)
Definition btassert.h:17
void setNameFilterKeyColumn(int column)
bool nameFilterAcceptsRow(int row, QModelIndex const &parent) const
void setHiddenFilterKeyColumn(int column)
BtBookshelfFilterModel(QObject *parent=nullptr)
bool filterAcceptsRow(int row, QModelIndex const &parent) const override
bool hiddenFilterAcceptsRow(int row, QModelIndex const &parent) const
void setNameFilterCase(Qt::CaseSensitivity value)
Qt::CaseSensitivity m_nameFilterCase
void setNameFilterFixedString(QString const &nameFilter)