annotate doodle/undo/undo.d @ 40:1f97022e5c6d

Checkpoint. Development continues...
author daveb
date Mon, 12 Apr 2010 14:01:54 +0930
parents
children ad3ba55ae57b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
40
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
1 module doodle.undo.undo;
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
2
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
3 // http://doc.trolltech.com/4.2/qundo.html
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
4 // http://www.codeproject.com/KB/cs/undo_support.aspx
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
5
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
6 // rename Action to Edit?
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
7
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
8 // Related design patterns: Command, Memento
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
9
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
10 // Action represents and encapsulates the information needed
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
11 // Consider command merging and time-stamping of commands
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
12
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
13 abstract class Action {
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
14 void undo();
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
15 void redo();
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
16 //string description() const;
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
17 // bool merge(Action other);
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
18 // time-stamp
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
19 }
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
20
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
21 final class CompoundAction {
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
22 this(in Action[] sub_actions) {
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
23 mSubActions = sub_actions.dup;
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
24 }
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
25
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
26 void undo() {
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
27 foreach_reverse(a; mSubActions) { a.undo(); }
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
28 }
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
29
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
30 void redo() {
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
31 foreach(a; mSubActions) { a.redo(); }
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
32 }
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
33
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
34 private {
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
35 Action[] mSubActions;
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
36 }
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
37 }
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
38
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
39 interface IUndoManagerObserver {
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
40 void canUndo(in bool value, in string description);
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
41 void canRedo(in bool value, in string description);
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
42 }
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
43
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
44 interface IUndoManager {
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
45 void addAction(Action action);
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
46 void undo();
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
47 void redo();
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
48 // bool can_undo() const;
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
49 // bool can_redo() const;
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
50 }
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
51
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
52 class UndoManager : IUndoManager {
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
53 this(int max_undo_level = -1) {
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
54 }
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
55
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
56 void addAction(Action action);
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
57 void undo();
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
58 void redo();
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
59
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
60 // IUndoManager overrides:
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
61
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
62 private {
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
63 Action[] mUndoActions;
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
64 Action[] mRedoActions;
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
65 }
1f97022e5c6d Checkpoint. Development continues...
daveb
parents:
diff changeset
66 }