|
24 | 24 | class AddressBookSortFilterProxyModel final : public QSortFilterProxyModel
|
25 | 25 | {
|
26 | 26 | const QString m_type;
|
| 27 | + const bool m_nestedFilterEnabled; |
27 | 28 |
|
28 | 29 | public:
|
29 |
| - AddressBookSortFilterProxyModel(const QString& type, QObject* parent) |
| 30 | + AddressBookSortFilterProxyModel(const QString& type, QObject* parent, bool enableNestedFilter) |
30 | 31 | : QSortFilterProxyModel(parent)
|
31 | 32 | , m_type(type)
|
| 33 | + , m_nestedFilterEnabled(enableNestedFilter) |
32 | 34 | {
|
33 | 35 | setDynamicSortFilter(true);
|
34 | 36 | setFilterCaseSensitivity(Qt::CaseInsensitive);
|
35 | 37 | setSortCaseSensitivity(Qt::CaseInsensitive);
|
36 | 38 | }
|
37 | 39 |
|
| 40 | + AddressBookSortFilterProxyModel* nestedProxyModel() const noexcept { |
| 41 | + if (!m_nestedFilterEnabled) return const_cast<AddressBookSortFilterProxyModel*>(this); |
| 42 | + |
| 43 | + // Lazily create the nested proxy model |
| 44 | + if (!nextedFilterProxyModel) { |
| 45 | + auto nextedFilterProxyModel = std::make_unique<AddressBookSortFilterProxyModel>( |
| 46 | + m_type, |
| 47 | + const_cast<AddressBookSortFilterProxyModel*>(this), |
| 48 | + false); |
| 49 | + nextedFilterProxyModel->setSourceModel(const_cast<AddressBookSortFilterProxyModel*>(this)); |
| 50 | + } |
| 51 | + return nextedFilterProxyModel.get(); |
| 52 | + } |
| 53 | + |
| 54 | + bool isNestedFilterEnabled() const { |
| 55 | + return m_nestedFilterEnabled; |
| 56 | + } |
| 57 | + |
38 | 58 | protected:
|
39 | 59 | bool filterAcceptsRow(int row, const QModelIndex& parent) const override
|
40 | 60 | {
|
@@ -62,6 +82,9 @@ class AddressBookSortFilterProxyModel final : public QSortFilterProxyModel
|
62 | 82 |
|
63 | 83 | return filterBy;
|
64 | 84 | }
|
| 85 | + |
| 86 | +private: |
| 87 | + std::unique_ptr<AddressBookSortFilterProxyModel> nextedFilterProxyModel{nullptr}; |
65 | 88 | };
|
66 | 89 |
|
67 | 90 | AddressBookPage::AddressBookPage(const PlatformStyle *platformStyle, Mode _mode, Tabs _tab, QWidget *parent) :
|
@@ -140,12 +163,12 @@ void AddressBookPage::setModel(AddressTableModel *_model)
|
140 | 163 | return;
|
141 | 164 |
|
142 | 165 | auto type = tab == ReceivingTab ? AddressTableModel::Receive : AddressTableModel::Send;
|
143 |
| - proxyModel = new AddressBookSortFilterProxyModel(type, this); |
| 166 | + proxyModel.reset(new AddressBookSortFilterProxyModel(type, this, false)); |
144 | 167 | proxyModel->setSourceModel(_model);
|
145 | 168 |
|
146 |
| - connect(ui->searchLineEdit, &QLineEdit::textChanged, proxyModel, &QSortFilterProxyModel::setFilterWildcard); |
| 169 | + connect(ui->searchLineEdit, &QLineEdit::textChanged, proxyModel.get(), &QSortFilterProxyModel::setFilterWildcard); |
147 | 170 |
|
148 |
| - ui->tableView->setModel(proxyModel); |
| 171 | + ui->tableView->setModel(proxyModel->nestedProxyModel()); |
149 | 172 | ui->tableView->sortByColumn(0, Qt::AscendingOrder);
|
150 | 173 |
|
151 | 174 | // Set column widths
|
@@ -295,7 +318,7 @@ void AddressBookPage::on_exportButton_clicked()
|
295 | 318 | CSVModelWriter writer(filename);
|
296 | 319 |
|
297 | 320 | // name, column, role
|
298 |
| - writer.setModel(proxyModel); |
| 321 | + writer.setModel(proxyModel.get()); |
299 | 322 | writer.addColumn("Label", AddressTableModel::Label, Qt::EditRole);
|
300 | 323 | writer.addColumn("Address Type", AddressTableModel::Type, Qt::EditRole);
|
301 | 324 | writer.addColumn("Address", AddressTableModel::Address, Qt::EditRole);
|
|
0 commit comments