@@ -27,6 +27,33 @@ const |
| 27 |
NUM_ROWS = 64; |
27 |
NUM_ROWS = 64; |
| 28 |
|
28 |
|
| 29 |
type |
29 |
type |
|
|
30 |
|
|
|
31 |
{ TUndoState } |
|
|
32 |
|
|
|
33 |
TOrderGroup = array[0..3] of Integer; |
|
|
34 |
TPatternGroup = array[0..3] of Integer; |
|
|
35 |
PUndoState = ^TUndoState; |
|
|
36 |
TUndoState = record |
|
|
37 |
Next, Prev: PUndoState; |
|
|
38 |
Orders: TOrderGroup; |
|
|
39 |
Patterns: TPatternGroup; |
|
|
40 |
Pattern: TPattern; |
|
|
41 |
end; |
|
|
42 |
|
|
|
43 |
|
|
|
44 |
{ TUndoStack } |
|
|
45 |
|
|
|
46 |
TUndoStack = class(TObject) |
|
|
47 |
Current: PUndoState; |
|
|
48 |
public |
|
|
49 |
constructor Create; |
|
|
50 |
procedure PushState( |
|
|
51 |
Patterns: TPatternGroup; |
|
|
52 |
Orders: TOrderGroup); |
|
|
53 |
function Rewind: PUndoState; |
|
|
54 |
function StepForward: PUndoState; |
|
|
55 |
end; |
|
|
56 |
|
| 30 |
{ TTrackerGrid } |
57 |
{ TTrackerGrid } |
| 31 |
|
58 |
|
| 32 |
TTrackerGrid = class(TCustomControl) |
59 |
TTrackerGrid = class(TCustomControl) |
@@ -97,6 +124,59 @@ type |
| 97 |
|
124 |
|
| 98 |
implementation |
125 |
implementation |
| 99 |
|
126 |
|
|
|
127 |
{ TUndoStack } |
|
|
128 |
|
|
|
129 |
constructor TUndoStack.Create; |
|
|
130 |
begin |
|
|
131 |
Current := Nil; |
|
|
132 |
end; |
|
|
133 |
|
|
|
134 |
procedure TUndoStack.PushState( |
|
|
135 |
Patterns: TPatternGroup; |
|
|
136 |
Orders: TOrderGroup); |
|
|
137 |
var |
|
|
138 |
NewState, Temp: PUndoState; |
|
|
139 |
begin |
|
|
140 |
New(NewState); |
|
|
141 |
NewState.Prev := Current; |
|
|
142 |
NewState.Next := nil; |
|
|
143 |
NewState.Patterns := Patterns; |
|
|
144 |
NewState.Orders := Orders; |
|
|
145 |
|
|
|
146 |
if Current = nil then |
|
|
147 |
Current := NewState |
|
|
148 |
else begin |
|
|
149 |
while Current.Next <> nil do begin |
|
|
150 |
Temp := Current^.Next; |
|
|
151 |
Current^.Next := Current^.Next^.Next; |
|
|
152 |
Dispose(Temp); |
|
|
153 |
end; |
|
|
154 |
|
|
|
155 |
Current^.Next := NewState; |
|
|
156 |
Current := NewState; |
|
|
157 |
end; |
|
|
158 |
end; |
|
|
159 |
|
|
|
160 |
function TUndoStack.Rewind: PUndoState; |
|
|
161 |
begin |
|
|
162 |
if (Current = nil) or (Current.Prev = nil) then |
|
|
163 |
Result := nil |
|
|
164 |
else begin |
|
|
165 |
Current := Current^.Prev; |
|
|
166 |
Result := Current; |
|
|
167 |
end; |
|
|
168 |
end; |
|
|
169 |
|
|
|
170 |
function TUndoStack.StepForward: PUndoState; |
|
|
171 |
begin |
|
|
172 |
if (Current = nil) or (Current.Next = nil) then |
|
|
173 |
Result := nil |
|
|
174 |
else begin |
|
|
175 |
Current := Current^.Next; |
|
|
176 |
Result := Current; |
|
|
177 |
end; |
|
|
178 |
end; |
|
|
179 |
|
| 100 |
{ TTrackerGrid } |
180 |
{ TTrackerGrid } |
| 101 |
|
181 |
|
| 102 |
constructor TTrackerGrid.Create( |
182 |
constructor TTrackerGrid.Create( |