From 8d05c71ca2aaffeae46d41ecc7c854d33b0bcc8e Mon Sep 17 00:00:00 2001 From: Dirk Hohndel Date: Sun, 14 Jun 2015 21:49:34 -0700 Subject: Fix renumbering of dives The implementation in commit 182fe790c9e8 ("Add ability to undo renumbering of dives") looks perfectly reasonable, but it depends on an implementation detail: it assumes that the keys of the QMap are returned in the same order in which they were placed there. Which apparently isn't the case for some version of Qt. With this commit we simply remember both the old and the new number for each dive and therefore the order in which they are processed doesn't matter. Signed-off-by: Dirk Hohndel --- qt-ui/simplewidgets.cpp | 8 +++++--- qt-ui/undocommands.cpp | 11 +++++------ qt-ui/undocommands.h | 5 ++--- 3 files changed, 12 insertions(+), 12 deletions(-) (limited to 'qt-ui') diff --git a/qt-ui/simplewidgets.cpp b/qt-ui/simplewidgets.cpp index 430609c7b..d060e3892 100644 --- a/qt-ui/simplewidgets.cpp +++ b/qt-ui/simplewidgets.cpp @@ -143,14 +143,16 @@ void RenumberDialog::renumberOnlySelected(bool selected) void RenumberDialog::buttonClicked(QAbstractButton *button) { if (ui.buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole) { - QMap renumberedDives; + // we remember a map from dive uuid to a pair of old number / new number + QMap > renumberedDives; int i; + int newNr = ui.spinBox->value(); struct dive *dive = NULL; for_each_dive (i, dive) { if (!selectedOnly || dive->selected) - renumberedDives.insert(dive->id, dive->number); + renumberedDives.insert(dive->id, QPair(dive->number, newNr++)); } - UndoRenumberDives *undoCommand = new UndoRenumberDives(renumberedDives, ui.spinBox->value()); + UndoRenumberDives *undoCommand = new UndoRenumberDives(renumberedDives); MainWindow::instance()->undoStack->push(undoCommand); } } diff --git a/qt-ui/undocommands.cpp b/qt-ui/undocommands.cpp index aad264e24..d7bae75a9 100644 --- a/qt-ui/undocommands.cpp +++ b/qt-ui/undocommands.cpp @@ -63,20 +63,20 @@ void UndoShiftTime::redo() } -UndoRenumberDives::UndoRenumberDives(QMap originalNumbers, int startNumber) +UndoRenumberDives::UndoRenumberDives(QMap > originalNumbers) { oldNumbers = originalNumbers; - start = startNumber; - setText("renumber dive"); if (oldNumbers.count() > 1) setText(QString("renumber %1 dives").arg(QString::number(oldNumbers.count()))); + else + setText("renumber dive"); } void UndoRenumberDives::undo() { foreach (int key, oldNumbers.keys()) { struct dive* d = get_dive_by_uniq_id(key); - d->number = oldNumbers.value(key); + d->number = oldNumbers.value(key).first; } mark_divelist_changed(true); MainWindow::instance()->refreshDisplay(); @@ -84,10 +84,9 @@ void UndoRenumberDives::undo() void UndoRenumberDives::redo() { - int i = start; foreach (int key, oldNumbers.keys()) { struct dive* d = get_dive_by_uniq_id(key); - d->number = i++; + d->number = oldNumbers.value(key).second; } mark_divelist_changed(true); MainWindow::instance()->refreshDisplay(); diff --git a/qt-ui/undocommands.h b/qt-ui/undocommands.h index bd8530d77..62fb2d22b 100644 --- a/qt-ui/undocommands.h +++ b/qt-ui/undocommands.h @@ -28,13 +28,12 @@ private: class UndoRenumberDives : public QUndoCommand { public: - UndoRenumberDives(QMap originalNumbers, int startNumber); + UndoRenumberDives(QMap > originalNumbers); virtual void undo(); virtual void redo(); private: - QMap oldNumbers; - int start; + QMap > oldNumbers; }; class UndoRemoveDivesFromTrip : public QUndoCommand { -- cgit v1.2.3-70-g09d2