From e2fee8a707e28aacab93e7524f5ca965d6012f27 Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Wed, 13 Mar 2024 01:21:32 -0400 Subject: Implement filtering. --- mapman/src/groupview.cpp | 28 +++++++++++++++++++--------- mapman/src/groupview.hpp | 4 ++++ mapman/src/sliceview.cpp | 19 ++++++++++++++++--- mapman/src/sliceview.hpp | 4 ++++ 4 files changed, 43 insertions(+), 12 deletions(-) (limited to 'mapman') diff --git a/mapman/src/groupview.cpp b/mapman/src/groupview.cpp index 32917d4..721917f 100644 --- a/mapman/src/groupview.cpp +++ b/mapman/src/groupview.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -17,7 +18,6 @@ #include #include #include -#include group_view::group_view() : QMdiSubWindow() { @@ -27,8 +27,11 @@ group_view::group_view() : QMdiSubWindow() auto l1 = new QVBoxLayout(); leftpane->setLayout(l1); tv = new QTableView(); - m = new QStandardItemModel(); - tv->setModel(m); + m = new QStandardItemModel(this); + mf = new QSortFilterProxyModel(this); + mf->setSourceModel(m); + mf->setFilterCaseSensitivity(Qt::CaseSensitivity::CaseInsensitive); + tv->setModel(mf); tv->setColumnHidden(3, true); tv->setSelectionMode(QAbstractItemView::SelectionMode::SingleSelection); tv->setSelectionBehavior(QAbstractItemView::SelectionBehavior::SelectRows); @@ -38,7 +41,7 @@ group_view::group_view() : QMdiSubWindow() bool dirty = oldidx.isValid() && this->dirty; if (oldidx.isValid()) { - int64_t oldgid = m->item(oldidx.row(), 3)->data(Qt::ItemDataRole::DisplayRole).toLongLong(); + int64_t oldgid = mf->data(oldidx.siblingAtColumn(3), Qt::ItemDataRole::DisplayRole).toLongLong(); auto oldgroup = l->get_group(oldgid); dirty |= tetitle->text() != QString::fromStdString(oldgroup.title); dirty |= teauthor->text() != QString::fromStdString(oldgroup.author); @@ -63,8 +66,11 @@ group_view::group_view() : QMdiSubWindow() auto l2 = new QHBoxLayout(); pbadd = new QPushButton("+"); pbrem = new QPushButton("-"); + tefilter = new QLineEdit(); + tefilter->setPlaceholderText("Filter"); connect(pbadd, &QPushButton::pressed, this, &group_view::add_group); connect(pbrem, &QPushButton::pressed, this, &group_view::rem_group); + l2->addWidget(tefilter); l2->addWidget(pbadd); l2->addWidget(pbrem); l1->addLayout(l2); @@ -110,6 +116,7 @@ group_view::group_view() : QMdiSubWindow() sp->setCollapsible(1, false); l = nullptr; dirty = false; + connect(tefilter, &QLineEdit::textChanged, mf, &QSortFilterProxyModel::setFilterFixedString); this->setWindowTitle("Map art listings"); this->setAttribute(Qt::WA_DeleteOnClose, false); } @@ -143,7 +150,7 @@ void group_view::rem_group() { if (!tv->currentIndex().isValid()) return; - int64_t curgid = m->item(tv->currentIndex().row(), 3)->data(Qt::ItemDataRole::DisplayRole).toLongLong(); + int64_t curgid = mf->data(tv->currentIndex().siblingAtColumn(3), Qt::ItemDataRole::DisplayRole).toLongLong(); l->remove_group(curgid); refresh_list(); } @@ -152,7 +159,7 @@ void group_view::update_fields() { if (!tv->currentIndex().isValid()) return; - int64_t curgid = m->item(tv->currentIndex().row(), 3)->data(Qt::ItemDataRole::DisplayRole).toLongLong(); + int64_t curgid = mf->data(tv->currentIndex().siblingAtColumn(3), Qt::ItemDataRole::DisplayRole).toLongLong(); current_group = l->get_group(curgid); auto &g = current_group; tetitle->setText(QString::fromStdString(g.title)); @@ -179,7 +186,7 @@ void group_view::update_library() { if (!tv->currentIndex().isValid()) return; - int64_t curgid = m->item(tv->currentIndex().row(), 3)->data(Qt::ItemDataRole::DisplayRole).toLongLong(); + int64_t curgid = mf->data(tv->currentIndex().siblingAtColumn(3), Qt::ItemDataRole::DisplayRole).toLongLong(); auto &g = current_group; g.title = tetitle->text().toStdString(); g.author = teauthor->text().toStdString(); @@ -193,8 +200,11 @@ void group_view::update_library() void group_view::refresh_list() { int64_t curgid = -1; - if (tv->currentIndex().isValid()) - curgid = m->item(tv->currentIndex().row(), 3)->data(Qt::ItemDataRole::DisplayRole).toLongLong(); + if (tv->currentIndex().isValid() && tv->currentIndex().siblingAtColumn(3).isValid()) + { + auto idx = tv->currentIndex().siblingAtColumn(3); + curgid = mf->data(idx, Qt::ItemDataRole::DisplayRole).toLongLong(); + } m->clear(); m->setHorizontalHeaderLabels({"Title", "Author(s)", "Dimension", "id"}); tv->setColumnHidden(3, true); diff --git a/mapman/src/groupview.hpp b/mapman/src/groupview.hpp index ca4cf30..52c1bd0 100644 --- a/mapman/src/groupview.hpp +++ b/mapman/src/groupview.hpp @@ -2,6 +2,7 @@ #define GROUPVIEW_HPP #include +#include #include "mapdump.hpp" class QTableView; @@ -10,6 +11,7 @@ class QLineEdit; class QSpinBox; class QLabel; class QStandardItemModel; +class QSortFilterProxyModel; class map_library; class map_painter; @@ -32,10 +34,12 @@ public slots: private: QTableView *tv; QStandardItemModel *m; + QSortFilterProxyModel *mf; QPushButton *pbadd; QPushButton *pbrem; QLineEdit *tetitle; QLineEdit *teauthor; + QLineEdit *tefilter; QSpinBox *sbh; QSpinBox *sbv; QPushButton *pbapply; diff --git a/mapman/src/sliceview.cpp b/mapman/src/sliceview.cpp index c0dc3a7..db24a26 100644 --- a/mapman/src/sliceview.cpp +++ b/mapman/src/sliceview.cpp @@ -6,27 +6,39 @@ #include #include #include +#include #include +#include #include #include #include #include +#include #include -#include slice_view::slice_view() : l(nullptr) { lv = new QListView(this); m = new QStandardItemModel(this); - lv->setModel(m); + mf = new QSortFilterProxyModel(this); + mf->setSourceModel(m); + mf->setFilterCaseSensitivity(Qt::CaseSensitivity::CaseInsensitive); + tefilter = new QLineEdit(this); + tefilter->setPlaceholderText("Filter"); + lv->setModel(mf); lv->setSelectionMode(QAbstractItemView::SelectionMode::SingleSelection); lv->setDragDropMode(QAbstractItemView::DragDropMode::NoDragDrop); lv->viewport()->installEventFilter(this); p = new map_painter(); p->set_dimension(1, 1); + auto leftcontainer = new QWidget(); + auto leftlayout = new QVBoxLayout(); + leftcontainer->setLayout(leftlayout); + leftlayout->addWidget(lv); + leftlayout->addWidget(tefilter); auto layout = new QSplitter(Qt::Orientation::Horizontal, this); layout->setContentsMargins(6, 6, 6, 6); - layout->addWidget(lv); + layout->addWidget(leftcontainer); layout->addWidget(p->view()); layout->setStretchFactor(0, 1); layout->setStretchFactor(1, 3); @@ -42,6 +54,7 @@ slice_view::slice_view() : l(nullptr) [this](const QModelIndex &idx) { dragidx = idx; }); + connect(tefilter, &QLineEdit::textChanged, mf, &QSortFilterProxyModel::setFilterFixedString); this->setWindowTitle("Map listings"); this->setAttribute(Qt::WA_DeleteOnClose, false); } diff --git a/mapman/src/sliceview.hpp b/mapman/src/sliceview.hpp index 3f7ee79..0773040 100644 --- a/mapman/src/sliceview.hpp +++ b/mapman/src/sliceview.hpp @@ -8,6 +8,8 @@ class map_library; class map_painter; class QListView; class QStandardItemModel; +class QSortFilterProxyModel; +class QLineEdit; class slice_view : public QMdiSubWindow { @@ -23,6 +25,8 @@ protected: private: QListView *lv; QStandardItemModel *m; + QSortFilterProxyModel *mf; + QLineEdit *tefilter; map_painter *p; map_library *l; QModelIndex dragidx; -- cgit v1.2.3