summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--profile-widget/profilewidget2.cpp2
-rw-r--r--qt-models/diveplannermodel.cpp37
2 files changed, 35 insertions, 4 deletions
diff --git a/profile-widget/profilewidget2.cpp b/profile-widget/profilewidget2.cpp
index 10e9a7501..f5ed95db0 100644
--- a/profile-widget/profilewidget2.cpp
+++ b/profile-widget/profilewidget2.cpp
@@ -1289,6 +1289,7 @@ void ProfileWidget2::setAddState()
connect(plannerModel, &DivePlannerPointsModel::modelReset, this, &ProfileWidget2::pointsReset);
connect(plannerModel, &DivePlannerPointsModel::rowsInserted, this, &ProfileWidget2::pointInserted);
connect(plannerModel, &DivePlannerPointsModel::rowsRemoved, this, &ProfileWidget2::pointsRemoved);
+ connect(plannerModel, &DivePlannerPointsModel::rowsMoved, this, &ProfileWidget2::pointsMoved);
/* show the same stuff that the profile shows. */
currentState = ADD; /* enable the add state. */
diveCeiling->setVisible(true);
@@ -1321,6 +1322,7 @@ void ProfileWidget2::setPlanState()
connect(plannerModel, &DivePlannerPointsModel::modelReset, this, &ProfileWidget2::pointsReset);
connect(plannerModel, &DivePlannerPointsModel::rowsInserted, this, &ProfileWidget2::pointInserted);
connect(plannerModel, &DivePlannerPointsModel::rowsRemoved, this, &ProfileWidget2::pointsRemoved);
+ connect(plannerModel, &DivePlannerPointsModel::rowsMoved, this, &ProfileWidget2::pointsMoved);
/* show the same stuff that the profile shows. */
currentState = PLAN; /* enable the add state. */
diveCeiling->setVisible(true);
diff --git a/qt-models/diveplannermodel.cpp b/qt-models/diveplannermodel.cpp
index 2f9272415..f22dd931e 100644
--- a/qt-models/diveplannermodel.cpp
+++ b/qt-models/diveplannermodel.cpp
@@ -831,20 +831,49 @@ int DivePlannerPointsModel::addStop(int milimeters, int seconds, int cylinderid_
void DivePlannerPointsModel::editStop(int row, divedatapoint newData)
{
+ if (row < 0 || row >= divepoints.count())
+ return;
+
+ // Refuse to move to 0, since that has special meaning.
+ if (newData.time <= 0)
+ return;
+
/*
* When moving divepoints rigorously, we might end up with index
* out of range, thus returning the last one instead.
*/
int old_first_cylid = divepoints[0].cylinderid;
- if (row >= divepoints.count())
- return;
+
+ // Is it ok to change data first and then move the rows?
divepoints[row] = newData;
- std::sort(divepoints.begin(), divepoints.end(), divePointsLessThan);
+
+ // If the time changed, the item might have to be moved. Oh joy.
+ int newRow = row;
+ while (newRow + 1 < divepoints.count() && divepoints[newRow + 1].time < divepoints[row].time)
+ ++newRow;
+ if (newRow != row) {
+ ++newRow; // Move one past item with smaller time stamp
+ } else {
+ // If we didn't move forward, try moving backwards
+ while (newRow > 0 && divepoints[newRow - 1].time > divepoints[row].time)
+ --newRow;
+ }
+
+ if (newRow != row && newRow != row + 1) {
+ beginMoveRows(QModelIndex(), row, row, QModelIndex(), newRow);
+ moveInVector(divepoints, row, row + 1, newRow);
+ endMoveRows();
+
+ // Account for moving the row backwards in the array.
+ row = newRow > row ? newRow - 1 : newRow;
+ }
+
if (updateMaxDepth())
cylinders.updateBestMixes();
if (divepoints[0].cylinderid != old_first_cylid)
cylinders.moveAtFirst(divepoints[0].cylinderid);
- emitDataChanged();
+
+ emit dataChanged(createIndex(row, 0), createIndex(row, COLUMNS - 1));
}
int DivePlannerPointsModel::size() const