now, Buddy Filtering is done. get it while it's hot. On Fri, Oct 31, 2014 at 4:39 PM, Davide DB <[email protected]> wrote:
> Woowwwww > > davide@mobile > Il 31/ott/2014 19:08 "Tomaz Canabrava" <[email protected]> ha scritto: > >> Dirk, >> >> This is a WIP but it's safe to add. >> What's missing: The other filters. >> >> But the layout, interaction, etc, is the final one, so I think you guys ( >> specially you and deivide ) should take a look. >> >> ctrl + f or menu item toggle the filtering. >> >> >> _______________________________________________ >> subsurface mailing list >> [email protected] >> http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface >> >>
From 046bc9e1e3a8fff01b7a8cb36be4dfde86c77c1f Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <[email protected]> Date: Fri, 31 Oct 2014 16:20:43 -0200 Subject: [PATCH 10/19] Added the skeleton for the BuddyFilter Just the skeleton of the functions, nothing working yet. Signed-off-by: Tomaz Canabrava <[email protected]> --- qt-ui/models.cpp | 36 ++++++++++++++++++++++++++++++++++++ qt-ui/models.h | 19 +++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp index e4df205..2e78f1b 100644 --- a/qt-ui/models.cpp +++ b/qt-ui/models.cpp @@ -2351,6 +2351,42 @@ bool TagFilterModel::filterRow(int source_row, const QModelIndex &source_parent, return false; } +BuddyFilterModel::BuddyFilterModel(QObject *parent) +{ + +} + +BuddyFilterModel *BuddyFilterModel::instance() +{ + +} + +bool BuddyFilterModel::filterRow(int source_row, const QModelIndex &source_parent, QAbstractItemModel *sourceModel) const +{ + +} + +Qt::ItemFlags BuddyFilterModel::flags(const QModelIndex &index) const +{ + return QStringListModel::flags(index); +} + +void BuddyFilterModel::repopulate() +{ + +} + +QVariant BuddyFilterModel::data(const QModelIndex &index, int role) const +{ + return QStringListModel::data(index, role); +} + + +bool BuddyFilterModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + return QStringListModel::setData(index, value, role); +} + MultiFilterSortModel *MultiFilterSortModel::instance() { static MultiFilterSortModel *self = new MultiFilterSortModel(); diff --git a/qt-ui/models.h b/qt-ui/models.h index 032edc5..fb92d27 100644 --- a/qt-ui/models.h +++ b/qt-ui/models.h @@ -443,6 +443,25 @@ private: explicit TagFilterModel(QObject *parent = 0); }; +class BuddyFilterModel : public QStringListModel, public MultiFilterInterface{ + Q_OBJECT +public: + static BuddyFilterModel *instance(); + virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + virtual Qt::ItemFlags flags(const QModelIndex &index) const; + virtual bool filterRow(int source_row, const QModelIndex &source_parent, QAbstractItemModel *sourceModel) const; + bool *checkState; + bool anyChecked; +public +slots: + void repopulate(); + +private: + explicit BuddyFilterModel(QObject *parent = 0); +}; + + class MultiFilterSortModel : public QSortFilterProxyModel { Q_OBJECT public: -- 2.1.3
From 0ab946aaa799d644e7d0169fc82b1f7ef7c1a789 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <[email protected]> Date: Fri, 31 Oct 2014 16:21:33 -0200 Subject: [PATCH 11/19] Implemented the instance method for the BuddyFilter Signed-off-by: Tomaz Canabrava <[email protected]> --- qt-ui/models.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp index 2e78f1b..dca8d74 100644 --- a/qt-ui/models.cpp +++ b/qt-ui/models.cpp @@ -2358,7 +2358,8 @@ BuddyFilterModel::BuddyFilterModel(QObject *parent) BuddyFilterModel *BuddyFilterModel::instance() { - + static BuddyFilterModel *self = new BuddyFilterModel(); + return self; } bool BuddyFilterModel::filterRow(int source_row, const QModelIndex &source_parent, QAbstractItemModel *sourceModel) const -- 2.1.3
From 2a720e3cbadd8ae17c8b2ee1b8b20711f68a91ec Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <[email protected]> Date: Fri, 31 Oct 2014 16:22:30 -0200 Subject: [PATCH 12/19] Implemented the constructor for the BuddyFilter Signed-off-by: Tomaz Canabrava <[email protected]> --- qt-ui/models.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp index dca8d74..4972fbf 100644 --- a/qt-ui/models.cpp +++ b/qt-ui/models.cpp @@ -2351,7 +2351,7 @@ bool TagFilterModel::filterRow(int source_row, const QModelIndex &source_parent, return false; } -BuddyFilterModel::BuddyFilterModel(QObject *parent) +BuddyFilterModel::BuddyFilterModel(QObject *parent) : QStringListModel(parent), checkState(NULL) { } -- 2.1.3
From e5e4f8becf3229348928727163197dc14ab1e0ea Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <[email protected]> Date: Fri, 31 Oct 2014 16:23:20 -0200 Subject: [PATCH 13/19] Impelmented the Data method for BuddyFilter Signed-off-by: Tomaz Canabrava <[email protected]> --- qt-ui/models.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp index 4972fbf..faf22de 100644 --- a/qt-ui/models.cpp +++ b/qt-ui/models.cpp @@ -2379,7 +2379,12 @@ void BuddyFilterModel::repopulate() QVariant BuddyFilterModel::data(const QModelIndex &index, int role) const { - return QStringListModel::data(index, role); + if (role == Qt::CheckStateRole) { + return checkState[index.row()] ? Qt::Checked : Qt::Unchecked; + } else if (role == Qt::DisplayRole) { + return stringList()[index.row()]; + } + return QVariant(); } -- 2.1.3
From 982308c96af78f92e4c7ecc6717ffb4a3b2b7e57 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <[email protected]> Date: Fri, 31 Oct 2014 16:23:57 -0200 Subject: [PATCH 14/19] Implemented the setData method for BuddyFilter Signed-off-by: Tomaz Canabrava <[email protected]> --- qt-ui/models.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp index faf22de..81e17ed 100644 --- a/qt-ui/models.cpp +++ b/qt-ui/models.cpp @@ -2390,7 +2390,19 @@ QVariant BuddyFilterModel::data(const QModelIndex &index, int role) const bool BuddyFilterModel::setData(const QModelIndex &index, const QVariant &value, int role) { - return QStringListModel::setData(index, value, role); + if (role == Qt::CheckStateRole) { + checkState[index.row()] = value.toBool(); + anyChecked = false; + for (int i = 0; i < rowCount(); i++) { + if (checkState[i] == true) { + anyChecked = true; + break; + } + } + dataChanged(index, index); + return true; + } + return false; } MultiFilterSortModel *MultiFilterSortModel::instance() -- 2.1.3
From 3fc3781537d7cc088bc8a9cfb2e3364312c677ba Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <[email protected]> Date: Fri, 31 Oct 2014 16:24:35 -0200 Subject: [PATCH 15/19] Implemented the flags method for BuddyFilter Signed-off-by: Tomaz Canabrava <[email protected]> --- qt-ui/models.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp index 81e17ed..ff92fda 100644 --- a/qt-ui/models.cpp +++ b/qt-ui/models.cpp @@ -2369,7 +2369,7 @@ bool BuddyFilterModel::filterRow(int source_row, const QModelIndex &source_paren Qt::ItemFlags BuddyFilterModel::flags(const QModelIndex &index) const { - return QStringListModel::flags(index); + return QStringListModel::flags(index) | Qt::ItemIsUserCheckable; } void BuddyFilterModel::repopulate() -- 2.1.3
From d936badb300ebdd635791a2aae5d9cc05c704176 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <[email protected]> Date: Fri, 31 Oct 2014 16:28:51 -0200 Subject: [PATCH 16/19] Implemented the 'repopulate method' for BuddyFilter Signed-off-by: Tomaz Canabrava <[email protected]> --- qt-ui/models.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp index ff92fda..4f13d3b 100644 --- a/qt-ui/models.cpp +++ b/qt-ui/models.cpp @@ -2375,6 +2375,24 @@ Qt::ItemFlags BuddyFilterModel::flags(const QModelIndex &index) const void BuddyFilterModel::repopulate() { + QStringList list; + struct dive *dive; + int i = 0; + for_each_dive (i, dive) + { + QString buddy(dive->buddy); + if (!list.contains(buddy)) { + list.append(buddy); + } + } + setStringList(list); + list << tr("No Buddies"); + setStringList(list); + delete[] checkState; + checkState = new bool[list.count()]; + memset(checkState, false, list.count()); + checkState[list.count() - 1] = false; + anyChecked = false; } QVariant BuddyFilterModel::data(const QModelIndex &index, int role) const -- 2.1.3
From 24d9c0bcb19ca8b2d7daba0a3cf3b33432f91cc0 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <[email protected]> Date: Fri, 31 Oct 2014 16:37:26 -0200 Subject: [PATCH 17/19] Implemented the filterRow method for BuddyList. Signed-off-by: Tomaz Canabrava <[email protected]> --- qt-ui/models.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp index 4f13d3b..4108753 100644 --- a/qt-ui/models.cpp +++ b/qt-ui/models.cpp @@ -2364,7 +2364,45 @@ BuddyFilterModel *BuddyFilterModel::instance() bool BuddyFilterModel::filterRow(int source_row, const QModelIndex &source_parent, QAbstractItemModel *sourceModel) const { + // If there's nothing checked, this should show everythin. + if (!anyChecked) { + return true; + } + + QModelIndex index0 = sourceModel->index(source_row, 0, source_parent); + QVariant diveVariant = sourceModel->data(index0, DiveTripModel::DIVE_ROLE); + struct dive *d = (struct dive *)diveVariant.value<void *>(); + if (!d) { // It's a trip, only show the ones that have dives to be shown. + for (int i = 0; i < sourceModel->rowCount(index0); i++) { + if (filterRow(i, index0, sourceModel)) + return true; + } + return false; + } + + // Checked means 'Show', Unchecked means 'Hide'. + QString diveBuddy(d->buddy); + + // only show empty buddie dives if the user checked that. + if (diveBuddy.isEmpty()) { + if (rowCount() > 0) + return checkState[rowCount() - 1]; + else + return true; + } + + // have at least one buddy + QStringList buddyList = stringList(); + if (!buddyList.isEmpty()) { + buddyList.removeLast(); // remove the "Show Empty Tags"; + for(int i = 0; i < rowCount(); i++){ + if(checkState[i] && stringList()[i].indexOf(diveBuddy) != -1){ + return true; + } + } + } + return false; } Qt::ItemFlags BuddyFilterModel::flags(const QModelIndex &index) const -- 2.1.3
From 43f03766c5c9c789d8f0dbdeddca71d7deaf319f Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <[email protected]> Date: Fri, 31 Oct 2014 16:49:52 -0200 Subject: [PATCH 18/19] Implement the Buddy Filter interface. Signed-off-by: Tomaz Canabrava <[email protected]> --- qt-ui/mainwindow.cpp | 1 + qt-ui/models.cpp | 1 - qt-ui/simplewidgets.cpp | 27 +++++++++++++++++++++++++++ qt-ui/simplewidgets.h | 10 ++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp index c052867..1ad8f93 100644 --- a/qt-ui/mainwindow.cpp +++ b/qt-ui/mainwindow.cpp @@ -182,6 +182,7 @@ void MainWindow::recreateDiveList() { ui.ListWidget->reload(DiveTripModel::CURRENT); TagFilterModel::instance()->repopulate(); + BuddyFilterModel::instance()->repopulate(); } void MainWindow::current_dive_changed(int divenr) diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp index 4108753..be3a94a 100644 --- a/qt-ui/models.cpp +++ b/qt-ui/models.cpp @@ -2412,7 +2412,6 @@ Qt::ItemFlags BuddyFilterModel::flags(const QModelIndex &index) const void BuddyFilterModel::repopulate() { - QStringList list; struct dive *dive; int i = 0; diff --git a/qt-ui/simplewidgets.cpp b/qt-ui/simplewidgets.cpp index 40f92c8..d8542f1 100644 --- a/qt-ui/simplewidgets.cpp +++ b/qt-ui/simplewidgets.cpp @@ -481,12 +481,39 @@ void TagFilter::hideEvent(QHideEvent *event) QWidget::hideEvent(event); } +BuddyFilter::BuddyFilter(QWidget *parent) : QWidget(parent) +{ + ui.setupUi(this); + ui.label->setText(tr("Buddies: ")); + #if QT_VERSION >= 0x050000 + ui.label->setClearButtonEnabled(true); + #endif + QSortFilterProxyModel *filter = new QSortFilterProxyModel(); + filter->setSourceModel(BuddyFilterModel::instance()); + connect(ui.filterInternalList, SIGNAL(textChanged(QString)), filter, SLOT(setFilterFixedString(QString))); + ui.filterList->setModel(filter); +} + +void BuddyFilter::showEvent(QShowEvent *event) +{ + MultiFilterSortModel::instance()->addFilterModel(BuddyFilterModel::instance()); + QWidget::showEvent(event); +} + +void BuddyFilter::hideEvent(QHideEvent *event) +{ + MultiFilterSortModel::instance()->removeFilterModel(BuddyFilterModel::instance()); + QWidget::hideEvent(event); +} + MultiFilter::MultiFilter(QWidget *parent): QScrollArea(parent) { QWidget *w = new QWidget(); QHBoxLayout *l = new QHBoxLayout(); l->addWidget(new TagFilter()); + l->addWidget(new BuddyFilter()); + l->setContentsMargins(0,0,0,0); l->setSpacing(1); w->setLayout(l); diff --git a/qt-ui/simplewidgets.h b/qt-ui/simplewidgets.h index f90e547..02467e2 100644 --- a/qt-ui/simplewidgets.h +++ b/qt-ui/simplewidgets.h @@ -140,6 +140,16 @@ private: Ui::FilterWidget ui; }; +class BuddyFilter : public QWidget { + Q_OBJECT +public: + BuddyFilter(QWidget *parent = 0); + virtual void showEvent(QShowEvent *); + virtual void hideEvent(QHideEvent *); +private: + Ui::FilterWidget ui; +}; + class MultiFilter : public QScrollArea { Q_OBJECT public: -- 2.1.3
From 1e4692b4a9e986003f1cab1c604fa9b87e32b57f Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <[email protected]> Date: Fri, 31 Oct 2014 16:54:37 -0200 Subject: [PATCH 19/19] Fixes in the buddy finding algorithm. I was comparing the strings in the opposite direction. Signed-off-by: Tomaz Canabrava <[email protected]> --- qt-ui/models.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp index be3a94a..74d5ec6 100644 --- a/qt-ui/models.cpp +++ b/qt-ui/models.cpp @@ -2397,7 +2397,7 @@ bool BuddyFilterModel::filterRow(int source_row, const QModelIndex &source_paren if (!buddyList.isEmpty()) { buddyList.removeLast(); // remove the "Show Empty Tags"; for(int i = 0; i < rowCount(); i++){ - if(checkState[i] && stringList()[i].indexOf(diveBuddy) != -1){ + if(checkState[i] && diveBuddy.indexOf(stringList()[i]) != -1){ return true; } } @@ -2476,13 +2476,14 @@ bool MultiFilterSortModel::filterAcceptsRow(int source_row, const QModelIndex &s return true; } + bool shouldShow = true; Q_FOREACH (MultiFilterInterface *model, models) { - if (model->filterRow(source_row, source_parent, sourceModel())) { - return true; + if (!model->filterRow(source_row, source_parent, sourceModel())) { + shouldShow = false; } } - return false; + return shouldShow; } void MultiFilterSortModel::myInvalidate() -- 2.1.3
_______________________________________________ subsurface mailing list [email protected] http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface
