Plus a lot of other small fixes.
From d24cbcda6c717b455a85c8b469edf08da7258770 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Tue, 26 May 2015 18:03:37 -0300
Subject: [PATCH 8/8] Expand trips that are filtered on dive_site_manage

While filtering we would have trips that were collapsed,
but this doesn't really have much sense while managing
dive_sites.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 qt-ui/filtermodels.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/qt-ui/filtermodels.cpp b/qt-ui/filtermodels.cpp
index 20bb631..f63ec85 100644
--- a/qt-ui/filtermodels.cpp
+++ b/qt-ui/filtermodels.cpp
@@ -375,6 +375,10 @@ void MultiFilterSortModel::myInvalidate()
 	}
 
 	emit filterFinished();
+
+	if (curr_dive_site) {
+		dlv->expandAll();
+	}
 }
 
 void MultiFilterSortModel::addFilterModel(MultiFilterInterface *model)
-- 
2.4.1

From 9f8682b67cdf277297e9b950407a6fc75c7382ec Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Tue, 26 May 2015 17:42:45 -0300
Subject: [PATCH 7/8] Filter out the dives that are not in dive_site.

Untested code to filter out dives that are not
in the active dive_site management.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 qt-ui/filtermodels.cpp        | 22 ++++++++++++++++++----
 qt-ui/filtermodels.h          |  3 ++-
 qt-ui/locationinformation.cpp | 12 ++++++++++++
 qt-ui/locationinformation.h   |  2 +-
 4 files changed, 33 insertions(+), 6 deletions(-)

diff --git a/qt-ui/filtermodels.cpp b/qt-ui/filtermodels.cpp
index aba480d..20bb631 100644
--- a/qt-ui/filtermodels.cpp
+++ b/qt-ui/filtermodels.cpp
@@ -298,14 +298,28 @@ MultiFilterSortModel::MultiFilterSortModel(QObject *parent) : QSortFilterProxyMo
 
 bool MultiFilterSortModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
 {
-	if (justCleared || models.isEmpty())
-		return true;
-
 	bool shouldShow = 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 (curr_dive_site) {
+		if (!d) { // It's a trip, only show the ones that have dives to be shown.
+			bool showTrip = false;
+			for (int i = 0; i < sourceModel()->rowCount(index0); i++) {
+				QModelIndex child = sourceModel()->index(i, 0, index0);
+				d = (struct dive *) sourceModel()->data(child, DiveTripModel::DIVE_ROLE).value<void*>();
+				if ( d->dive_site_uuid == curr_dive_site->uuid )
+					showTrip = true; // do not shortcircuit the loop or the counts will be wrong
+			}
+			return showTrip;
+		}
+		return d->dive_site_uuid == curr_dive_site->uuid;
+	}
+
+	if (justCleared || models.isEmpty())
+		return true;
+
 	if (!d) { // It's a trip, only show the ones that have dives to be shown.
 		bool showTrip = false;
 		for (int i = 0; i < sourceModel()->rowCount(index0); i++) {
@@ -389,7 +403,7 @@ void MultiFilterSortModel::clearFilter()
 	myInvalidate();
 }
 
-void MultiFilterSortModel::startFilterDiveSite(int32_t uuid)
+void MultiFilterSortModel::startFilterDiveSite(uint32_t uuid)
 {
 	curr_dive_site = get_dive_site_by_uuid(uuid);
 	myInvalidate();
diff --git a/qt-ui/filtermodels.h b/qt-ui/filtermodels.h
index f9eb700..3403b30 100644
--- a/qt-ui/filtermodels.h
+++ b/qt-ui/filtermodels.h
@@ -3,6 +3,7 @@
 
 #include <QStringListModel>
 #include <QSortFilterProxyModel>
+#include <stdint.h>
 
 class MultiFilterInterface {
 public:
@@ -93,7 +94,7 @@ public
 slots:
 	void myInvalidate();
 	void clearFilter();
-	void startFilterDiveSite(int32_t uuid);
+	void startFilterDiveSite(uint32_t uuid);
 	void stopFilterDiveSite();
 
 signals:
diff --git a/qt-ui/locationinformation.cpp b/qt-ui/locationinformation.cpp
index 7c7e5e2..6e99695 100644
--- a/qt-ui/locationinformation.cpp
+++ b/qt-ui/locationinformation.cpp
@@ -4,6 +4,7 @@
 #include "divelistview.h"
 #include "qthelper.h"
 #include "globe.h"
+#include "filtermodels.h"
 
 #include <QDebug>
 #include <QShowEvent>
@@ -69,6 +70,8 @@ LocationInformationWidget::LocationInformationWidget(QWidget *parent) : QGroupBo
 
 	ui.currentLocation->setModel(new LocationInformationModel());
 	connect(ui.currentLocation, SIGNAL(currentIndexChanged(int)), this, SLOT(setCurrentDiveSite(int)));
+	connect(this, SIGNAL(startFilterDiveSite(uint32_t)), MultiFilterSortModel::instance(), SLOT(startFilterDiveSite(uint32_t)));
+	connect(this, SIGNAL(stopFilterDiveSite()), MultiFilterSortModel::instance(), SLOT(stopFilterDiveSite()));
 }
 
 void LocationInformationWidget::setCurrentDiveSite(int dive_nr)
@@ -91,7 +94,11 @@ void LocationInformationWidget::setLocationId(uint32_t uuid)
 	if(!currentDs)
 		return;
 
+	if (displayed_dive_site.uuid == currentDs->uuid)
+		return;
+
 	displayed_dive_site = *currentDs;
+
 	if (ui.currentLocation->currentText() != displayed_dive_site.name) {
 		// this will trigger setCurrentDiveSite again, and thus,
 		// will gethere with the correct uuid.
@@ -115,6 +122,8 @@ void LocationInformationWidget::setLocationId(uint32_t uuid)
 		ui.diveSiteCoordinates->setText(printGPSCoords(displayed_dive_site.latitude.udeg, displayed_dive_site.longitude.udeg));
 	else
 		ui.diveSiteCoordinates->clear();
+
+	emit startFilterDiveSite(displayed_dive_site.uuid);
 }
 
 void LocationInformationWidget::updateGpsCoordinates()
@@ -125,6 +134,7 @@ void LocationInformationWidget::updateGpsCoordinates()
 
 void LocationInformationWidget::acceptChanges()
 {
+	emit stopFilterDiveSite();
 	char *uiString;
 	currentDs->latitude = displayed_dive_site.latitude;
 	currentDs->longitude = displayed_dive_site.longitude;
@@ -156,6 +166,7 @@ void LocationInformationWidget::acceptChanges()
 
 void LocationInformationWidget::rejectChanges()
 {
+	emit stopFilterDiveSite();
 	Q_ASSERT(currentDs != NULL);
 	if (dive_site_is_empty(currentDs)) {
 		delete_dive_site(currentDs->uuid);
@@ -169,6 +180,7 @@ void LocationInformationWidget::rejectChanges()
 
 void LocationInformationWidget::showEvent(QShowEvent *ev)
 {
+	emit startFilterDiveSite(displayed_dive_site.uuid);
 	ui.diveSiteMessage->setCloseButtonVisible(false);
 	QGroupBox::showEvent(ev);
 }
diff --git a/qt-ui/locationinformation.h b/qt-ui/locationinformation.h
index 49db2ce..1fb6e8d 100644
--- a/qt-ui/locationinformation.h
+++ b/qt-ui/locationinformation.h
@@ -41,7 +41,7 @@ signals:
 	void informationManagementEnded();
 	void coordinatesChanged();
 	void startFilterDiveSite(uint32_t uuid);
-	void stopFilterFiveSite();
+	void stopFilterDiveSite();
 private:
 	struct dive_site *currentDs;
 	Ui::LocationInformation ui;
-- 
2.4.1

From bd646ad2c5b521ee157764136f2991fa907e4594 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Tue, 26 May 2015 17:36:06 -0300
Subject: [PATCH 6/8] Create signals/slots for filtering the dive_site,

The dive site management requires that we filter all
the dives that are on the current dive_site, this is
the preparatory work for that.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 qt-ui/filtermodels.cpp      | 14 +++++++++++++-
 qt-ui/filtermodels.h        |  4 ++++
 qt-ui/locationinformation.h |  5 +++--
 3 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/qt-ui/filtermodels.cpp b/qt-ui/filtermodels.cpp
index be26a25..aba480d 100644
--- a/qt-ui/filtermodels.cpp
+++ b/qt-ui/filtermodels.cpp
@@ -292,7 +292,7 @@ void LocationFilterModel::repopulate()
 	anyChecked = false;
 }
 
-MultiFilterSortModel::MultiFilterSortModel(QObject *parent) : QSortFilterProxyModel(parent), justCleared(false)
+MultiFilterSortModel::MultiFilterSortModel(QObject *parent) : QSortFilterProxyModel(parent), justCleared(false), curr_dive_site(NULL)
 {
 }
 
@@ -388,3 +388,15 @@ void MultiFilterSortModel::clearFilter()
 	justCleared = false;
 	myInvalidate();
 }
+
+void MultiFilterSortModel::startFilterDiveSite(int32_t uuid)
+{
+	curr_dive_site = get_dive_site_by_uuid(uuid);
+	myInvalidate();
+}
+
+void MultiFilterSortModel::stopFilterDiveSite()
+{
+	curr_dive_site = NULL;
+	myInvalidate();
+}
diff --git a/qt-ui/filtermodels.h b/qt-ui/filtermodels.h
index 9d87241..f9eb700 100644
--- a/qt-ui/filtermodels.h
+++ b/qt-ui/filtermodels.h
@@ -93,12 +93,16 @@ public
 slots:
 	void myInvalidate();
 	void clearFilter();
+	void startFilterDiveSite(int32_t uuid);
+	void stopFilterDiveSite();
+
 signals:
 	void filterFinished();
 private:
 	MultiFilterSortModel(QObject *parent = 0);
 	QList<MultiFilterInterface *> models;
 	bool justCleared;
+	struct dive_site *curr_dive_site;
 };
 
 #endif
diff --git a/qt-ui/locationinformation.h b/qt-ui/locationinformation.h
index 41f626b..49db2ce 100644
--- a/qt-ui/locationinformation.h
+++ b/qt-ui/locationinformation.h
@@ -22,7 +22,7 @@ public:
 	LocationInformationWidget(QWidget *parent = 0);
 protected:
 	void showEvent(QShowEvent *);
-\
+
 public slots:
 	void acceptChanges();
 	void rejectChanges();
@@ -40,7 +40,8 @@ public slots:
 signals:
 	void informationManagementEnded();
 	void coordinatesChanged();
-
+	void startFilterDiveSite(uint32_t uuid);
+	void stopFilterFiveSite();
 private:
 	struct dive_site *currentDs;
 	Ui::LocationInformation ui;
-- 
2.4.1

From 5c8de56babd6166e1690355629ced87ecb8d13fc Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Tue, 26 May 2015 17:34:37 -0300
Subject: [PATCH 5/8] Only repopulate model when needed.

The old way we setted the location and *then* updated
the model, so the very first location that we tried to
show was empty.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 qt-ui/locationinformation.cpp | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/qt-ui/locationinformation.cpp b/qt-ui/locationinformation.cpp
index b433805..7c7e5e2 100644
--- a/qt-ui/locationinformation.cpp
+++ b/qt-ui/locationinformation.cpp
@@ -82,6 +82,11 @@ void LocationInformationWidget::setCurrentDiveSite(int dive_nr)
 
 void LocationInformationWidget::setLocationId(uint32_t uuid)
 {
+	LocationInformationModel *m = (LocationInformationModel*) ui.currentLocation->model();
+	if (m->rowCount() == 0) {
+		m->update();
+	}
+
 	currentDs = get_dive_site_by_uuid(uuid);
 	if(!currentDs)
 		return;
@@ -164,11 +169,8 @@ void LocationInformationWidget::rejectChanges()
 
 void LocationInformationWidget::showEvent(QShowEvent *ev)
 {
-	LocationInformationModel *m = (LocationInformationModel*) ui.currentLocation->model();
 	ui.diveSiteMessage->setCloseButtonVisible(false);
-	m->update();
 	QGroupBox::showEvent(ev);
-
 }
 
 void LocationInformationWidget::markChangedWidget(QWidget *w)
-- 
2.4.1

From 49bd061dbca9a126c3c91f6fb6472e90073ffc89 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Tue, 26 May 2015 17:10:46 -0300
Subject: [PATCH 4/8] Show the correct dive_site on the manage combobox

when triggering a dive_site management, we need to
get the uuid that was send to us and set it as the
current dive_site on the combobox, the dialog can
fill all required info for us.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 qt-ui/locationinformation.cpp | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/qt-ui/locationinformation.cpp b/qt-ui/locationinformation.cpp
index 3ee9dd7..b433805 100644
--- a/qt-ui/locationinformation.cpp
+++ b/qt-ui/locationinformation.cpp
@@ -87,6 +87,13 @@ void LocationInformationWidget::setLocationId(uint32_t uuid)
 		return;
 
 	displayed_dive_site = *currentDs;
+	if (ui.currentLocation->currentText() != displayed_dive_site.name) {
+		// this will trigger setCurrentDiveSite again, and thus,
+		// will gethere with the correct uuid.
+		ui.currentLocation->setCurrentText(displayed_dive_site.name);
+		return;
+	}
+
 	if (displayed_dive_site.name)
 		ui.diveSiteName->setText(displayed_dive_site.name);
 	else
-- 
2.4.1

From 6303190ee8ff7ec701b14b28dcc7b83e5cc9d526 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Tue, 26 May 2015 17:02:50 -0300
Subject: [PATCH 3/8] Do not create a new dive site when curr is invalid

We will however create a new dive site when the user
clicks on the add button - creating it here would led
to strange behavior.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 qt-ui/locationinformation.cpp | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)

diff --git a/qt-ui/locationinformation.cpp b/qt-ui/locationinformation.cpp
index 67fb5d5..3ee9dd7 100644
--- a/qt-ui/locationinformation.cpp
+++ b/qt-ui/locationinformation.cpp
@@ -83,15 +83,9 @@ void LocationInformationWidget::setCurrentDiveSite(int dive_nr)
 void LocationInformationWidget::setLocationId(uint32_t uuid)
 {
 	currentDs = get_dive_site_by_uuid(uuid);
+	if(!currentDs)
+		return;
 
-	if (!currentDs) {
-		currentDs = get_dive_site_by_uuid(create_dive_site(""));
-		displayed_dive.dive_site_uuid = currentDs->uuid;
-		ui.diveSiteName->clear();
-		ui.diveSiteDescription->clear();
-		ui.diveSiteNotes->clear();
-		ui.diveSiteCoordinates->clear();
-	}
 	displayed_dive_site = *currentDs;
 	if (displayed_dive_site.name)
 		ui.diveSiteName->setText(displayed_dive_site.name);
-- 
2.4.1

From be3e2e4cd86b8f93b636af89db52c77928a26ca5 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Tue, 26 May 2015 16:59:06 -0300
Subject: [PATCH 2/8] Dont setLocationId when accept/reject changes

setLocationId will filter the dives, so ignore
the visual changes when accepting / rejecting,
it will only be triggered again when we are
showing this dialog again.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 qt-ui/locationinformation.cpp | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/qt-ui/locationinformation.cpp b/qt-ui/locationinformation.cpp
index de78991..67fb5d5 100644
--- a/qt-ui/locationinformation.cpp
+++ b/qt-ui/locationinformation.cpp
@@ -140,10 +140,8 @@ void LocationInformationWidget::acceptChanges()
 	if (dive_site_is_empty(currentDs)) {
 		delete_dive_site(currentDs->uuid);
 		displayed_dive.dive_site_uuid = 0;
-		setLocationId(0);
-	} else {
-		setLocationId(currentDs->uuid);
 	}
+
 	mark_divelist_changed(true);
 	resetState();
 	emit informationManagementEnded();
@@ -156,10 +154,8 @@ void LocationInformationWidget::rejectChanges()
 	if (dive_site_is_empty(currentDs)) {
 		delete_dive_site(currentDs->uuid);
 		displayed_dive.dive_site_uuid = 0;
-		setLocationId(0);
-	} else {
-		setLocationId(currentDs->uuid);
 	}
+
 	resetState();
 	emit informationManagementEnded();
 	emit coordinatesChanged();
-- 
2.4.1

From fb6a9ea9b4feeb1cc0ad9a86e685d79592b3eea2 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Tue, 26 May 2015 16:48:37 -0300
Subject: [PATCH 1/8] Do not set the dive_site when changing dives

We should only set the dive_site on the dive site management
widget when we are going to use that information, this is
because the dive_site management widget will filter all
dives on the dive list.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 qt-ui/mainwindow.cpp | 1 -
 1 file changed, 1 deletion(-)

diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp
index b2539da..00a6be6 100644
--- a/qt-ui/mainwindow.cpp
+++ b/qt-ui/mainwindow.cpp
@@ -259,7 +259,6 @@ void MainWindow::current_dive_changed(int divenr)
 	}
 	graphics()->plotDive();
 	information()->updateDiveInfo();
-	locationInformationWidget()->setLocationId(displayed_dive.dive_site_uuid);
 }
 
 void MainWindow::on_actionNew_triggered()
-- 
2.4.1

_______________________________________________
subsurface mailing list
[email protected]
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to