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

Reply via email to