profile: move adding of ceiling-violation-event

The profile item that shows the ceilings adds a warning event
if the ceiling is violated. This is very unfortunate.

Improve this situation by adding the event up to the function
that calculates the ceiling. This is still not how it should
be - the display layer should not modify the dive that it
displays.

To make this clear, add a comment that details that this
is a contract between planner and display layer: The planner
uses a dive that can be trampled upon by the profile.
Still, this should be solved differently.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2021-01-09 17:28:23 +01:00 committed by Dirk Hohndel
parent 9bfc6d2520
commit 09287809eb
3 changed files with 20 additions and 35 deletions

View file

@ -85,49 +85,17 @@ void DiveProfileItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *o
painter->restore();
}
int DiveProfileItem::maxCeiling(int row)
{
int max = -1;
plot_data *entry = dataModel.data().entry + row;
for (int tissue = 0; tissue < 16; tissue++) {
if (max < entry->ceilings[tissue])
max = entry->ceilings[tissue];
}
return max;
}
void DiveProfileItem::replot()
{
bool eventAdded = false;
AbstractProfilePolygonItem::replot();
if (polygon().isEmpty())
return;
show_reported_ceiling = prefs.dcceiling;
reported_ceiling_in_red = prefs.redceiling;
profileColor = getColor(DEPTH_BOTTOM);
profileColor = dataModel.data().waypoint_above_ceiling ? QColor(Qt::red)
: getColor(DEPTH_BOTTOM);
#ifdef SUBSURFACE_MOBILE
Q_UNUSED(eventAdded);
#else
int currState = qobject_cast<ProfileWidget2 *>(scene()->views().first())->currentState;
if (currState == ProfileWidget2::PLAN) {
plot_data *entry = dataModel.data().entry;
for (int i = 0; i < dataModel.rowCount(); i++, entry++) {
int max = maxCeiling(i);
// Don't scream if we violate the ceiling by a few cm
if (entry->depth < max - 100 && entry->sec > 0) {
profileColor = QColor(Qt::red);
if (!eventAdded) {
add_event(&displayed_dive.dc, entry->sec, SAMPLE_EVENT_CEILING, -1, max / 1000,
QT_TRANSLATE_NOOP("gettextFromC", "planned waypoint above ceiling"));
eventAdded = true;
}
}
}
}
#endif
/* Show any ceiling we may have encountered */
if (prefs.dcceiling && !prefs.redceiling) {
QPolygonF p = polygon();