On Sun, Feb 15, 2015 at 6:54 PM, Grace Karanja <[email protected]>
wrote:

> On Sun, Feb 15, 2015 at 3:09 AM, Dirk Hohndel <[email protected]> wrote:
>
>> Hi Grace...
>>
>> Thanks. Some comments below...
>>
>> This new patch enables undoing of renumbered dives.
From 419b58c18de1849f9882f7fe38c9c618b4ad4969 Mon Sep 17 00:00:00 2001
From: Grace Karanja <[email protected]>
Date: Tue, 24 Feb 2015 19:42:33 +0300
Subject: [PATCH] Add ability to undo renumbering of dives

Expand the undo feature by storing a list of renumbered dives' ids
and numbers so that the original numbers can be restored if needed.

Signed-off-by: Grace Karanja <[email protected]>
---
 qt-ui/simplewidgets.cpp | 13 ++++++++++++-
 qt-ui/undocommands.cpp  | 38 ++++++++++++++++++++++++++++++++++++++
 qt-ui/undocommands.h    | 13 +++++++++++++
 3 files changed, 63 insertions(+), 1 deletion(-)

diff --git a/qt-ui/simplewidgets.cpp b/qt-ui/simplewidgets.cpp
index f7944c9..7de067d 100644
--- a/qt-ui/simplewidgets.cpp
+++ b/qt-ui/simplewidgets.cpp
@@ -142,8 +142,19 @@ void RenumberDialog::renumberOnlySelected(bool selected)
 
 void RenumberDialog::buttonClicked(QAbstractButton *button)
 {
-	if (ui.buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole)
+	if (ui.buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole) {
+		QMap<int,int> renumberedDives;
+		int i;
+		struct dive *dive = NULL;
+		for_each_dive (i, dive) {
+			if (dive->selected) {
+				renumberedDives.insert(dive->id, dive->number);
+			}
+		}
+		UndoRenumberDives *undoCommand = new UndoRenumberDives(renumberedDives, ui.spinBox->value());
+		MainWindow::instance()->undoStack->push(undoCommand);
 		renumber_dives(ui.spinBox->value(), selectedOnly);
+	}
 }
 
 RenumberDialog::RenumberDialog(QWidget *parent) : QDialog(parent), selectedOnly(false)
diff --git a/qt-ui/undocommands.cpp b/qt-ui/undocommands.cpp
index 316def4..a075e99 100644
--- a/qt-ui/undocommands.cpp
+++ b/qt-ui/undocommands.cpp
@@ -62,3 +62,41 @@ void UndoShiftTime::redo()
 	mark_divelist_changed(true);
 	MainWindow::instance()->refreshDisplay();
 }
+
+
+UndoRenumberDives::UndoRenumberDives(QMap<int, int> originalNumbers, int startNumber)
+{
+	oldNumbers = originalNumbers;
+	start = startNumber;
+	isFirstRedo = true;
+	setText("renumber dive");
+	if (oldNumbers.count() > 1)
+		setText(QString("renumber %1 dives").arg(QString::number(oldNumbers.count())));
+}
+
+void UndoRenumberDives::undo()
+{
+	foreach (int key, oldNumbers.keys()) {
+		struct dive* d = get_dive_by_uniq_id(key);
+		d->number = oldNumbers.value(key);
+	}
+	mark_divelist_changed(true);
+	MainWindow::instance()->refreshDisplay();
+}
+
+void UndoRenumberDives::redo()
+{
+	if (isFirstRedo) {
+		isFirstRedo = false;
+		return; //Skip the first redo. Qt calls redo() when the QUndoCommand is pushed
+			//to the QUndoStack
+	}
+
+	int i = start;
+	foreach (int key, oldNumbers.keys()) {
+		struct dive* d = get_dive_by_uniq_id(key);
+		d->number = i++;
+	}
+	mark_divelist_changed(true);
+	MainWindow::instance()->refreshDisplay();
+}
diff --git a/qt-ui/undocommands.h b/qt-ui/undocommands.h
index addef81..9014b03 100644
--- a/qt-ui/undocommands.h
+++ b/qt-ui/undocommands.h
@@ -2,6 +2,7 @@
 #define UNDOCOMMANDS_H
 
 #include <QUndoCommand>
+#include <QMap>
 #include "dive.h"
 
 class UndoDeleteDive : public QUndoCommand {
@@ -25,4 +26,16 @@ private:
 	int timeChanged;
 };
 
+class UndoRenumberDives : public QUndoCommand {
+public:
+	UndoRenumberDives(QMap<int,int> originalNumbers, int startNumber);
+	virtual void undo();
+	virtual void redo();
+
+private:
+	QMap<int,int> oldNumbers;
+	int start;
+	bool isFirstRedo;
+};
+
 #endif // UNDOCOMMANDS_H
-- 
2.1.0

_______________________________________________
subsurface mailing list
[email protected]
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to