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
