summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2018-10-13 08:57:46 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2018-10-13 21:41:41 -0400
commit954820aa81cb52cfe4442f2c6e81117827e32ccc (patch)
tree5392d9b44ed57542fb60be46a384bf783ed43c59
parentf0e349cdd68c259f07fd5867d8360cd8d65d50ef (diff)
downloadsubsurface-954820aa81cb52cfe4442f2c6e81117827e32ccc.tar.gz
Dive site: explicitly init displayed_dive_site on show widget
The global object "displayed_dive_site" is used to store the old dive site data for the edit-dive-site widget. The fields of the widget were initialized from this object in the show event. Therefore the object was updated in numerous parts of the code to make sure that it was up-to-date. Instead, move the initialization of the object to the function that also initiatlizes the fields. Call this function explicitly before showing the widget. This makes the data-fow distinctly easier to understand. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r--core/divelist.c1
-rw-r--r--desktop-widgets/locationinformation.cpp8
-rw-r--r--desktop-widgets/locationinformation.h2
-rw-r--r--desktop-widgets/mainwindow.cpp7
-rw-r--r--desktop-widgets/mainwindow.h1
-rw-r--r--desktop-widgets/tab-widgets/maintab.cpp9
6 files changed, 11 insertions, 17 deletions
diff --git a/core/divelist.c b/core/divelist.c
index 0aa77ecac..d67f7935f 100644
--- a/core/divelist.c
+++ b/core/divelist.c
@@ -1677,7 +1677,6 @@ void clear_dive_file_data()
delete_dive_site(get_dive_site(0)->uuid);
clear_dive(&displayed_dive);
- clear_dive_site(&displayed_dive_site);
reset_min_datafile_version();
saved_git_id = "";
diff --git a/desktop-widgets/locationinformation.cpp b/desktop-widgets/locationinformation.cpp
index c7d537374..3f87454da 100644
--- a/desktop-widgets/locationinformation.cpp
+++ b/desktop-widgets/locationinformation.cpp
@@ -200,7 +200,6 @@ void LocationInformationWidget::acceptChanges()
LocationInformationModel::instance()->removeRow(get_divesite_idx(currentDs));
displayed_dive.dive_site_uuid = 0;
}
- copy_dive_site(currentDs, &displayed_dive_site);
mark_divelist_changed(true);
resetState();
}
@@ -210,9 +209,10 @@ void LocationInformationWidget::rejectChanges()
resetState();
}
-void LocationInformationWidget::showEvent(QShowEvent *ev)
+void LocationInformationWidget::initFields(dive_site *ds)
{
- if (displayed_dive_site.uuid) {
+ if (ds) {
+ copy_dive_site(ds, &displayed_dive_site);
filter_model.set(displayed_dive_site.uuid, displayed_dive_site.latitude, displayed_dive_site.longitude);
updateLabels();
enableLocationButtons(dive_site_has_gps_location(&displayed_dive_site));
@@ -221,11 +221,11 @@ void LocationInformationWidget::showEvent(QShowEvent *ev)
if (m)
m->invalidate();
} else {
+ clear_dive_site(&displayed_dive_site);
filter_model.set(0, degrees_t{ 0 }, degrees_t{ 0 });
clearLabels();
}
MapWidget::instance()->prepareForGetDiveCoordinates(displayed_dive_site.uuid);
- QGroupBox::showEvent(ev);
}
void LocationInformationWidget::markChangedWidget(QWidget *w)
diff --git a/desktop-widgets/locationinformation.h b/desktop-widgets/locationinformation.h
index 868ea729e..402c434e1 100644
--- a/desktop-widgets/locationinformation.h
+++ b/desktop-widgets/locationinformation.h
@@ -14,9 +14,9 @@ Q_OBJECT
public:
LocationInformationWidget(QWidget *parent = 0);
bool eventFilter(QObject*, QEvent*) override;
+ void initFields(dive_site *ds);
protected:
- void showEvent(QShowEvent *);
void enableLocationButtons(bool enable);
public slots:
diff --git a/desktop-widgets/mainwindow.cpp b/desktop-widgets/mainwindow.cpp
index 2b4411387..34924e25a 100644
--- a/desktop-widgets/mainwindow.cpp
+++ b/desktop-widgets/mainwindow.cpp
@@ -173,7 +173,7 @@ MainWindow::MainWindow() : QMainWindow(),
profLayout->addWidget(profileWidget);
profileContainer->setLayout(profLayout);
- LocationInformationWidget * diveSiteEdit = new LocationInformationWidget();
+ diveSiteEdit = new LocationInformationWidget(this);
connect(diveSiteEdit, &LocationInformationWidget::endEditDiveSite,
this, &MainWindow::setDefaultState);
connect(diveSiteEdit, SIGNAL(endEditDiveSite()), this, SLOT(refreshDisplay()));
@@ -445,7 +445,9 @@ void MainWindow::setStateProperties(const QByteArray& state, const PropertyList&
stateProperties[state] = PropertiesForQuadrant(tl, tr, bl, br);
}
-void MainWindow::on_actionDiveSiteEdit_triggered() {
+void MainWindow::on_actionDiveSiteEdit_triggered()
+{
+ diveSiteEdit->initFields(get_dive_site_for_dive(&displayed_dive));
setApplicationState("EditDiveSite");
}
@@ -957,7 +959,6 @@ void MainWindow::setupForAddAndPlan(const char *model)
{
// clean out the dive and give it an id and the correct dc model
clear_dive(&displayed_dive);
- clear_dive_site(&displayed_dive_site);
displayed_dive.id = dive_getUniqID();
displayed_dive.when = QDateTime::currentMSecsSinceEpoch() / 1000L + gettimezoneoffset() + 3600;
displayed_dive.dc.model = strdup(model); // don't translate! this is stored in the XML file
diff --git a/desktop-widgets/mainwindow.h b/desktop-widgets/mainwindow.h
index ae3b081a4..6833c5531 100644
--- a/desktop-widgets/mainwindow.h
+++ b/desktop-widgets/mainwindow.h
@@ -214,6 +214,7 @@ private:
void enterState(CurrentState);
bool filesAsArguments;
UpdateManager *updateManager;
+ LocationInformationWidget *diveSiteEdit;
bool plannerStateClean();
void setupForAddAndPlan(const char *model);
diff --git a/desktop-widgets/tab-widgets/maintab.cpp b/desktop-widgets/tab-widgets/maintab.cpp
index 179228ea0..322ec5943 100644
--- a/desktop-widgets/tab-widgets/maintab.cpp
+++ b/desktop-widgets/tab-widgets/maintab.cpp
@@ -419,11 +419,9 @@ void MainTab::updateDiveInfo(bool clear)
if (ds) {
ui.location->setCurrentDiveSiteUuid(ds->uuid);
ui.locationTags->setText(constructLocationTags(ds, true));
- copy_dive_site(ds, &displayed_dive_site);
} else {
ui.location->clear();
ui.locationTags->clear();
- clear_dive_site(&displayed_dive_site);
}
// Subsurface always uses "local time" as in "whatever was the local time at the location"
@@ -657,10 +655,8 @@ MainTab::EditMode MainTab::getEditMode() const
void MainTab::refreshDisplayedDiveSite()
{
struct dive_site *ds = get_dive_site_for_dive(&displayed_dive);
- if (ds) {
- copy_dive_site(ds, &displayed_dive_site);
+ if (ds)
ui.location->setCurrentDiveSiteUuid(ds->uuid);
- }
}
// when this is called we already have updated the current_dive and know that it exists
@@ -906,9 +902,6 @@ void MainTab::acceptChanges()
// so let's make sure here that our data is consistent now that we have handled the
// dive sites
displayed_dive.dive_site_uuid = current_dive->dive_site_uuid;
- struct dive_site *ds = get_dive_site_by_uuid(displayed_dive.dive_site_uuid);
- if (ds)
- copy_dive_site(ds, &displayed_dive_site);
// 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