Skip to content

Commit 9863fe2

Browse files
gui: Extend address book filter for nested filtering
Extend AddressBookFilterProxyModel to allow using nested filters to be applied on top of it. If future needs arise for similar filters outside the address book page, the code could be easily refactored and moved in a new subclass of QSortFilterProxyModel, perhaps with limits on nested levels. For safety and performance reasons, the code of the filter proxy model class declaration (in addressbookpage.h) and its instance creation were updated by aligning it with TransactionFilterProxy in overviewpage.h as this addresses situations of unexpected crashes, such as segfault on closing the app, double free or corruption, or stack smashing detection.
1 parent 95d5b3c commit 9863fe2

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

src/qt/addressbookpage.cpp

+24-5
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,31 @@
2828
class AddressBookSortFilterProxyModel final : public QSortFilterProxyModel
2929
{
3030
const QString m_type;
31+
const bool m_nestedFilterEnabled;
3132

3233
public:
33-
AddressBookSortFilterProxyModel(const QString& type, QObject* parent)
34+
AddressBookSortFilterProxyModel(const QString& type, QObject* parent, bool enableNestedFilter)
3435
: QSortFilterProxyModel(parent)
3536
, m_type(type)
37+
, m_nestedFilterEnabled(enableNestedFilter)
3638
{
3739
setDynamicSortFilter(true);
3840
setFilterCaseSensitivity(Qt::CaseInsensitive);
3941
setSortCaseSensitivity(Qt::CaseInsensitive);
42+
43+
if (m_nestedFilterEnabled) {
44+
nextedFilterProxyModel.reset(new AddressBookSortFilterProxyModel(type, this, false));
45+
nextedFilterProxyModel->setSourceModel(this);
46+
}
47+
}
48+
49+
AddressBookSortFilterProxyModel* nestedProxyModel() const noexcept{
50+
if (!m_nestedFilterEnabled) return const_cast<AddressBookSortFilterProxyModel*>(this);
51+
return nextedFilterProxyModel.get();
52+
}
53+
54+
bool isNestedFilterEnabled() const {
55+
return m_nestedFilterEnabled;
4056
}
4157

4258
protected:
@@ -66,6 +82,9 @@ class AddressBookSortFilterProxyModel final : public QSortFilterProxyModel
6682

6783
return filterBy;
6884
}
85+
86+
private:
87+
std::unique_ptr<AddressBookSortFilterProxyModel> nextedFilterProxyModel{nullptr};
6988
};
7089

7190
AddressBookPage::AddressBookPage(const PlatformStyle *platformStyle, Mode _mode, Tabs _tab, QWidget *parent) :
@@ -154,12 +173,12 @@ void AddressBookPage::setModel(AddressTableModel *_model)
154173
return;
155174

156175
auto type = tab == ReceivingTab ? AddressTableModel::Receive : AddressTableModel::Send;
157-
proxyModel = new AddressBookSortFilterProxyModel(type, this);
176+
proxyModel.reset(new AddressBookSortFilterProxyModel(type, this, false));
158177
proxyModel->setSourceModel(_model);
159178

160-
connect(ui->searchLineEdit, &QLineEdit::textChanged, proxyModel, &QSortFilterProxyModel::setFilterWildcard);
179+
connect(ui->searchLineEdit, &QLineEdit::textChanged, proxyModel.get(), &QSortFilterProxyModel::setFilterWildcard);
161180

162-
ui->tableView->setModel(proxyModel);
181+
ui->tableView->setModel(proxyModel->nestedProxyModel());
163182
ui->tableView->sortByColumn(0, Qt::AscendingOrder);
164183

165184
// Set column widths
@@ -308,7 +327,7 @@ void AddressBookPage::on_exportButton_clicked()
308327
CSVModelWriter writer(filename);
309328

310329
// name, column, role
311-
writer.setModel(proxyModel);
330+
writer.setModel(proxyModel.get());
312331
writer.addColumn("Label", AddressTableModel::Label, Qt::EditRole);
313332
writer.addColumn("Address Type", AddressTableModel::Type, Qt::EditRole);
314333
writer.addColumn("Address", AddressTableModel::Address, Qt::EditRole);

src/qt/addressbookpage.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public Q_SLOTS:
5353
Mode mode;
5454
Tabs tab;
5555
QString returnValue;
56-
AddressBookSortFilterProxyModel *proxyModel;
56+
std::unique_ptr<AddressBookSortFilterProxyModel> proxyModel{nullptr};
5757
QMenu *contextMenu;
5858
QString newAddressToSelect;
5959

0 commit comments

Comments
 (0)