Now it works. (I think there's something missing, will keep working here)
From f307a66d742080156fc5b51faa42fe00ffce089a Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <tomaz.canabr...@intel.com> Date: Mon, 13 Jul 2015 15:14:46 -0300 Subject: [PATCH 3/3] Select right divesite on click.
Signed-off-by: Tomaz Canabrava <tomaz.canabr...@intel.com> --- qt-ui/locationinformation.cpp | 10 +++++++-- qt-ui/locationinformation.h | 1 + qt-ui/maintab.cpp | 48 +++++++++++++++++++++++++++++++++++-------- qt-ui/maintab.h | 1 + 4 files changed, 49 insertions(+), 11 deletions(-) diff --git a/qt-ui/locationinformation.cpp b/qt-ui/locationinformation.cpp index 0be4b1e..b9d985b 100644 --- a/qt-ui/locationinformation.cpp +++ b/qt-ui/locationinformation.cpp @@ -332,7 +332,8 @@ bool LocationManagementEditHelper::eventFilter(QObject *obj, QEvent *ev) return false; if(ev->type() == QEvent::Show) { - last_uuid = displayed_dive_site.uuid; + last_uuid = 0; + qDebug() << "EventFilter: " << last_uuid; } if(ev->type() == QEvent::KeyPress) { @@ -356,5 +357,10 @@ void LocationManagementEditHelper::handleActivation(const QModelIndex& activated } void LocationManagementEditHelper::resetDiveSiteUuid() { - last_uuid = displayed_dive_site.uuid; + last_uuid = 0; + qDebug() << "Reset: " << last_uuid; +} + +uint32_t LocationManagementEditHelper::diveSiteUuid() const { + return last_uuid; } diff --git a/qt-ui/locationinformation.h b/qt-ui/locationinformation.h index 7027cd8..b1746f7 100644 --- a/qt-ui/locationinformation.h +++ b/qt-ui/locationinformation.h @@ -71,6 +71,7 @@ public: bool eventFilter(QObject *obj, QEvent *ev); void handleActivation(const QModelIndex& activated); void resetDiveSiteUuid(); + uint32_t diveSiteUuid() const; private: uint32_t last_uuid; diff --git a/qt-ui/maintab.cpp b/qt-ui/maintab.cpp index 88b607d..c68138f 100644 --- a/qt-ui/maintab.cpp +++ b/qt-ui/maintab.cpp @@ -23,6 +23,7 @@ #include "divelocationmodel.h" #include "divesite.h" #include "locationinformation.h" +#include "divesite.h" #if defined(FBSUPPORT) #include "socialnetworks.h" @@ -760,6 +761,7 @@ void MainTab::updateDiveInfo(bool clear) else ui.cylinders->view()->hideColumn(CylindersModel::USE); + qDebug() << "Set the current dive site:" << displayed_dive.dive_site_uuid; emit diveSiteChanged(displayed_dive.dive_site_uuid); } @@ -816,6 +818,36 @@ void MainTab::reload() mydive->what = displayed_dive.what; \ } +void MainTab::updateDisplayedDiveDiveSite() +{ + const QString new_name = ui.location->text(); + const QString orig_name = displayed_dive_site.name; + const uint32_t orig_uuid = displayed_dive_site.uuid; + const uint32_t new_uuid = locationManagementEditHelper->diveSiteUuid(); + + if(orig_uuid) { + if (new_uuid && orig_uuid != new_uuid) { + displayed_dive.dive_site_uuid = new_uuid; + copy_dive_site(get_dive_site_by_uuid(displayed_dive.dive_site_uuid), &displayed_dive_site); + } else if (new_name.count() && orig_name != new_name) { + displayed_dive.dive_site_uuid = find_or_create_dive_site_with_name(qPrintable(new_name)); + copy_dive_site(get_dive_site_by_uuid(displayed_dive.dive_site_uuid), &displayed_dive_site); + } else { + qDebug() << "Current divesite is the same as informed"; + } + } else { + if (new_uuid) { + displayed_dive.dive_site_uuid = new_uuid; + copy_dive_site(get_dive_site_by_uuid(displayed_dive.dive_site_uuid), &displayed_dive_site); + } else if (new_name.count()) { + displayed_dive.dive_site_uuid = find_or_create_dive_site_with_name(qPrintable(new_name)); + copy_dive_site(get_dive_site_by_uuid(displayed_dive.dive_site_uuid), &displayed_dive_site); + } else { + qDebug() << "No divesite will be set"; + } + } +} + void MainTab::acceptChanges() { int i, addedId = -1; @@ -834,12 +866,9 @@ void MainTab::acceptChanges() struct dive *added_dive = clone_dive(&displayed_dive); record_dive(added_dive); addedId = added_dive->id; - if (displayed_dive_site.uuid) - copy_dive_site(&displayed_dive_site, get_dive_site_by_uuid(displayed_dive_site.uuid)); - else if (ui.location->text().count()) { - uint32_t uuid = create_dive_site(qPrintable(ui.location->text())); - added_dive->dive_site_uuid = uuid; - } + updateDisplayedDiveDiveSite(); + get_dive_by_uniq_id(added_dive->id)->dive_site_uuid = displayed_dive_site.uuid; + // unselect everything as far as the UI is concerned and select the new // dive - we'll have to undo/redo this later after we resort the dive_table // but we need the dive selected for the middle part of this function - this @@ -895,6 +924,8 @@ void MainTab::acceptChanges() time_t offset = cd->when - displayed_dive.when; MODIFY_SELECTED_DIVES(mydive->when -= offset;); } + + updateDisplayedDiveDiveSite(); if (displayed_dive.dive_site_uuid != cd->dive_site_uuid) MODIFY_SELECTED_DIVES(EDIT_VALUE(dive_site_uuid)); @@ -903,9 +934,6 @@ void MainTab::acceptChanges() saveTaggedStrings(); saveTags(); - if (displayed_dive_site.uuid) - copy_dive_site(&displayed_dive_site, get_dive_site_by_uuid(displayed_dive_site.uuid)); - if (editMode != ADD && cylindersModel->changed) { mark_divelist_changed(true); MODIFY_SELECTED_DIVES( @@ -962,6 +990,8 @@ void MainTab::acceptChanges() cd->weightsystem[i].description = copy_string(displayed_dive.weightsystem[i].description); } } + + // each dive that was selected might have had the temperatures in its active divecomputer changed // so re-populate the temperatures - easiest way to do this is by calling fixup_dive for_each_dive (i, d) { diff --git a/qt-ui/maintab.h b/qt-ui/maintab.h index 7f0ba1c..6a6b9d1 100644 --- a/qt-ui/maintab.h +++ b/qt-ui/maintab.h @@ -123,6 +123,7 @@ private: dive_trip_t displayedTrip; bool acceptingEdit; LocationManagementEditHelper *locationManagementEditHelper; + void updateDisplayedDiveDiveSite(); }; #endif // MAINTAB_H -- 2.4.5
From ab3b91b889aa36167e093100157e0d0b03a056bc Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <tomaz.canabr...@intel.com> Date: Mon, 13 Jul 2015 15:13:48 -0300 Subject: [PATCH 2/3] Create/Retrieve dive_site by name. When we are working on the location management, we wanna get a new dive_site if the dive_site name changed unless there's no dive_site by that name, then we create it. Signed-off-by: Tomaz Canabrava <tomaz.canabr...@intel.com> --- divesite.c | 16 ++++++++++++++++ divesite.h | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/divesite.c b/divesite.c index 998fe23..800ccc9 100644 --- a/divesite.c +++ b/divesite.c @@ -200,3 +200,19 @@ void clear_dive_site(struct dive_site *ds) ds->taxonomy.nr = 0; free_taxonomy(&ds->taxonomy); } + +uint32_t find_or_create_dive_site_with_name(const char *name) +{ + int i; + struct dive_site *ds; + bool found = false; + for_each_dive_site(i,ds) { + if (same_string(name, ds->name)) { + found = true; + break; + } + } + if (ds) + return ds->uuid; + return create_dive_site(name); +} diff --git a/divesite.h b/divesite.h index 306272e..8801ddc 100644 --- a/divesite.h +++ b/divesite.h @@ -59,7 +59,7 @@ uint32_t get_dive_site_uuid_by_gps_proximity(degrees_t latitude, degrees_t longi bool dive_site_is_empty(struct dive_site *ds); void copy_dive_site(struct dive_site *orig, struct dive_site *copy); void clear_dive_site(struct dive_site *ds); - +uint32_t find_or_create_dive_site_with_name(const char *name); #ifdef __cplusplus } #endif -- 2.4.5
From def34d90ab3330ea6932aa76b45e2ad3f452f122 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava <tomaz.canabr...@intel.com> Date: Wed, 8 Jul 2015 14:27:17 -0300 Subject: [PATCH 1/3] Get the selected dive site from the list Hooked a eventFilter on the QListView that displays our dive sites so it would filter the keys enter and space, storing the current dive_site uuid when that happens. Also it stores the uuid on clicks. Now we need to get that information on the acceptedChanges and check if the uuid stored there == displayed_dive_site.uuid and also if text != displayed_dive_site.name, because if the user didn't clicked on anythign but only wrote stuff on the LineEdit no dive site would be selected and so uuid == displayed_dive_site.uuid ( wich would mean 'no changes') Signed-off-by: Tomaz Canabrava <tomaz.canabr...@intel.com> --- qt-ui/locationinformation.cpp | 34 ++++++++++++++++++++++++++++++++++ qt-ui/locationinformation.h | 11 +++++++++++ qt-ui/maintab.cpp | 6 ++++++ qt-ui/maintab.h | 2 ++ 4 files changed, 53 insertions(+) diff --git a/qt-ui/locationinformation.cpp b/qt-ui/locationinformation.cpp index b3907a8..0be4b1e 100644 --- a/qt-ui/locationinformation.cpp +++ b/qt-ui/locationinformation.cpp @@ -324,3 +324,37 @@ void SimpleDiveSiteEditDialog::diveSiteNotes_editingFinished() displayed_dive_site.notes = copy_string(qPrintable(ui->diveSiteNotes->toPlainText())); changed_dive_site = true; } + +bool LocationManagementEditHelper::eventFilter(QObject *obj, QEvent *ev) +{ + QListView *view = qobject_cast<QListView*>(obj); + if(!view) + return false; + + if(ev->type() == QEvent::Show) { + last_uuid = displayed_dive_site.uuid; + } + + if(ev->type() == QEvent::KeyPress) { + QKeyEvent *keyEv = (QKeyEvent*) ev; + if(keyEv->key() == Qt::Key_Space || keyEv->key() == Qt::Key_Return) { + handleActivation(view->currentIndex()); + } + + } + return false; +} + +void LocationManagementEditHelper::handleActivation(const QModelIndex& activated) +{ + if (!activated.isValid()) + return; + QModelIndex uuidIdx = activated.model()->index( + activated.row(), LocationInformationModel::UUID); + last_uuid = uuidIdx.data().toInt(); + qDebug() << "Selected dive_site: " << last_uuid; +} + +void LocationManagementEditHelper::resetDiveSiteUuid() { + last_uuid = displayed_dive_site.uuid; +} diff --git a/qt-ui/locationinformation.h b/qt-ui/locationinformation.h index 42e4d5a..7027cd8 100644 --- a/qt-ui/locationinformation.h +++ b/qt-ui/locationinformation.h @@ -64,4 +64,15 @@ private: Ui::SimpleDiveSiteEditDialog *ui; }; + +class LocationManagementEditHelper : public QObject { +Q_OBJECT +public: + bool eventFilter(QObject *obj, QEvent *ev); + void handleActivation(const QModelIndex& activated); + void resetDiveSiteUuid(); +private: + uint32_t last_uuid; + +}; #endif diff --git a/qt-ui/maintab.cpp b/qt-ui/maintab.cpp index 043fe0a..88b607d 100644 --- a/qt-ui/maintab.cpp +++ b/qt-ui/maintab.cpp @@ -67,6 +67,11 @@ MainTab::MainTab(QWidget *parent) : QTabWidget(parent), completer->setCaseSensitivity(Qt::CaseInsensitive); completerListview->setItemDelegate(new LocationFilterDelegate()); + locationManagementEditHelper = new LocationManagementEditHelper(); + completerListview->installEventFilter(locationManagementEditHelper); + connect(completerListview, &QAbstractItemView::activated, + locationManagementEditHelper, &LocationManagementEditHelper::handleActivation); + ui.location->setCompleter(completer); connect(ui.addDiveSite, SIGNAL(clicked()), this, SLOT(showDiveSiteSimpleEdit())); connect(ui.geocodeButton, SIGNAL(clicked()), this, SLOT(reverseGeocode())); @@ -386,6 +391,7 @@ void MainTab::enableEdition(EditMode newEditMode) displayMessage(tr("Multiple dives are being edited.")); } else { displayMessage(tr("This dive is being edited.")); + locationManagementEditHelper->resetDiveSiteUuid(); } editMode = newEditMode != NONE ? newEditMode : DIVE; } diff --git a/qt-ui/maintab.h b/qt-ui/maintab.h index 306aee6..7f0ba1c 100644 --- a/qt-ui/maintab.h +++ b/qt-ui/maintab.h @@ -22,6 +22,7 @@ class CylindersModel; class ExtraDataModel; class DivePictureModel; class QCompleter; +class LocationManagementEditHelper; struct Completers { QCompleter *divemaster; @@ -121,6 +122,7 @@ private: dive_trip_t *currentTrip; dive_trip_t displayedTrip; bool acceptingEdit; + LocationManagementEditHelper *locationManagementEditHelper; }; #endif // MAINTAB_H -- 2.4.5
_______________________________________________ subsurface mailing list subsurface@subsurface-divelog.org http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface