mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
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>
This commit is contained in:
parent
5c4d163a41
commit
8dea2ada3b
7 changed files with 122 additions and 128 deletions
|
@ -108,13 +108,8 @@ void TabDiveEquipment::divesChanged(const QVector<dive *> &dives, DiveField fiel
|
|||
if (!current_dive || !dives.contains(current_dive))
|
||||
return;
|
||||
|
||||
switch(field) {
|
||||
case DiveField::SUIT:
|
||||
if (field.suit)
|
||||
ui.suit->setText(QString(current_dive->suit));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void TabDiveEquipment::toggleTriggeredColumn()
|
||||
|
|
|
@ -141,30 +141,18 @@ void TabDiveInformation::divesChanged(const QVector<dive *> &dives, DiveField fi
|
|||
if (!current_dive || !dives.contains(current_dive))
|
||||
return;
|
||||
|
||||
switch(field) {
|
||||
case DiveField::DURATION:
|
||||
case DiveField::DEPTH:
|
||||
case DiveField::MODE:
|
||||
if (field.duration || field.depth || field.mode)
|
||||
updateProfile();
|
||||
break;
|
||||
case DiveField::AIR_TEMP:
|
||||
if (field.air_temp)
|
||||
ui->airTemperatureText->setText(get_temperature_string(current_dive->airtemp, true));
|
||||
break;
|
||||
case DiveField::WATER_TEMP:
|
||||
if (field.water_temp)
|
||||
ui->waterTemperatureText->setText(get_temperature_string(current_dive->watertemp, true));
|
||||
break;
|
||||
case DiveField::ATM_PRESS:
|
||||
if (field.atm_press)
|
||||
ui->atmPressVal->setText(ui->atmPressVal->text().sprintf("%d",current_dive->surface_pressure.mbar));
|
||||
break;
|
||||
case DiveField::DATETIME:
|
||||
if (field.datetime)
|
||||
updateWhen();
|
||||
break;
|
||||
case DiveField::SALINITY:
|
||||
if (field.salinity)
|
||||
updateSalinity();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void TabDiveInformation::on_atmPressType_currentIndexChanged(int index) { updateTextBox(COMBO_CHANGED); }
|
||||
|
|
|
@ -53,17 +53,8 @@ void TabDiveStatistics::divesChanged(const QVector<dive *> &dives, DiveField fie
|
|||
return;
|
||||
|
||||
// TODO: make this more fine grained. Currently, the core can only calculate *all* statistics.
|
||||
switch(field) {
|
||||
case DiveField::DURATION:
|
||||
case DiveField::DEPTH:
|
||||
case DiveField::MODE:
|
||||
case DiveField::AIR_TEMP:
|
||||
case DiveField::WATER_TEMP:
|
||||
if (field.duration || field.depth || field.mode || field.air_temp || field.water_temp)
|
||||
updateData();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void TabDiveStatistics::updateData()
|
||||
|
|
|
@ -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:
|
||||
updateDiveSite(current_dive);
|
||||
break;
|
||||
case DiveField::TAGS:
|
||||
ui.tagWidget->setText(get_taglist_string(current_dive->tag_list));
|
||||
break;
|
||||
case DiveField::BUDDY:
|
||||
ui.buddy->setText(current_dive->buddy);
|
||||
break;
|
||||
case DiveField::DIVEMASTER:
|
||||
ui.divemaster->setText(current_dive->divemaster);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (field.divesite)
|
||||
updateDiveSite(current_dive);
|
||||
if (field.tags)
|
||||
ui.tagWidget->setText(get_taglist_string(current_dive->tag_list));
|
||||
if (field.buddy)
|
||||
ui.buddy->setText(current_dive->buddy);
|
||||
if (field.divemaster)
|
||||
ui.divemaster->setText(current_dive->divemaster);
|
||||
|
||||
// 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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue