summaryrefslogtreecommitdiffstats
path: root/desktop-widgets/tab-widgets/maintab.cpp
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2019-10-13 12:44:39 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2019-10-26 11:36:23 -0700
commit8dea2ada3bc9d0fcfbe1bb101ea079480dfdbe57 (patch)
tree12611a44e6f9efef1fa3ed8ce510d78b6841e63c /desktop-widgets/tab-widgets/maintab.cpp
parent5c4d163a41c69538c8a658db82dde1a7486b6759 (diff)
downloadsubsurface-8dea2ada3bc9d0fcfbe1bb101ea079480dfdbe57.tar.gz
Undo: turn dive- and trip-fields into flags
The divesEdited signal sends the changed field as a parameter. Since some undo-commands change multiple fields, this led to numerous signals for a single command. This in turn would lead to multiple profile-reloads and statistic recalculations. Therefore, turn the enum into a bitfield. For simplicity, provide a constructor that takes classical flags and turns them into the bitfield. This is necessary because C-style named initialization is only supported on C++20 onward! Is this somewhat overengineered? Yes, maybe. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'desktop-widgets/tab-widgets/maintab.cpp')
-rw-r--r--desktop-widgets/tab-widgets/maintab.cpp60
1 files changed, 20 insertions, 40 deletions
diff --git a/desktop-widgets/tab-widgets/maintab.cpp b/desktop-widgets/tab-widgets/maintab.cpp
index 5c6e5104c..9fe647a71 100644
--- a/desktop-widgets/tab-widgets/maintab.cpp
+++ b/desktop-widgets/tab-widgets/maintab.cpp
@@ -284,53 +284,39 @@ void MainTab::divesChanged(const QVector<dive *> &dives, DiveField field)
if (!current_dive || !dives.contains(current_dive))
return;
- switch(field) {
- case DiveField::DURATION:
+ if (field.duration)
ui.duration->setText(render_seconds_to_string(current_dive->duration.seconds));
- profileFromDive(current_dive);
- break;
- case DiveField::DEPTH:
+ if (field.depth)
ui.depth->setText(get_depth_string(current_dive->maxdepth, true));
- profileFromDive(current_dive);
- break;
- case DiveField::AIR_TEMP:
+ if (field.air_temp)
ui.airtemp->setText(get_temperature_string(current_dive->airtemp, true));
- break;
- case DiveField::WATER_TEMP:
+ if (field.water_temp)
ui.watertemp->setText(get_temperature_string(current_dive->watertemp, true));
- break;
- case DiveField::RATING:
+ if (field.rating)
ui.rating->setCurrentStars(current_dive->rating);
- break;
- case DiveField::VISIBILITY:
+ if (field.visibility)
ui.visibility->setCurrentStars(current_dive->visibility);
- break;
- case DiveField::NOTES:
+ if (field.notes)
updateNotes(current_dive);
- break;
- case DiveField::MODE:
+ if (field.mode)
updateMode(current_dive);
- break;
- case DiveField::DATETIME:
+ if (field.datetime) {
updateDateTime(current_dive);
MainWindow::instance()->graphics->dateTimeChanged();
DivePlannerPointsModel::instance()->getDiveplan().when = current_dive->when;
- break;
- case DiveField::DIVESITE:
+ }
+ if (field.divesite)
updateDiveSite(current_dive);
- break;
- case DiveField::TAGS:
+ if (field.tags)
ui.tagWidget->setText(get_taglist_string(current_dive->tag_list));
- break;
- case DiveField::BUDDY:
+ if (field.buddy)
ui.buddy->setText(current_dive->buddy);
- break;
- case DiveField::DIVEMASTER:
+ if (field.divemaster)
ui.divemaster->setText(current_dive->divemaster);
- break;
- default:
- break;
- }
+
+ // If duration or depth changed, the profile needs to be replotted
+ if (field.duration || field.depth)
+ profileFromDive(current_dive);
}
void MainTab::diveSiteEdited(dive_site *ds, int)
@@ -347,16 +333,10 @@ void MainTab::tripChanged(dive_trip *trip, TripField field)
if (currentTrip != trip)
return;
- switch(field) {
- case TripField::NOTES:
+ if (field.notes)
ui.notes->setText(currentTrip->notes);
- break;
- case TripField::LOCATION:
+ if (field.location)
ui.diveTripLocation->setText(currentTrip->location);
- break;
- default:
- break;
- }
}
void MainTab::nextInputField(QKeyEvent *event)