aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/CellBuffer.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/CellBuffer.cxx')
-rw-r--r--src/CellBuffer.cxx12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/CellBuffer.cxx b/src/CellBuffer.cxx
index 1b1320667..4d032f94f 100644
--- a/src/CellBuffer.cxx
+++ b/src/CellBuffer.cxx
@@ -315,12 +315,13 @@ Action::~Action() {
Destroy();
}
-void Action::Create(actionType at_, int position_, char *data_, int lenData_) {
+void Action::Create(actionType at_, int position_, char *data_, int lenData_, bool mayCoalesce_) {
delete []data;
position = position_;
at = at_;
data = data_;
lenData = lenData_;
+ mayCoalesce = mayCoalesce_;
}
void Action::Destroy() {
@@ -335,12 +336,14 @@ void Action::Grab(Action *source) {
at = source->at;
data = source->data;
lenData = source->lenData;
-
+ mayCoalesce = source->mayCoalesce;
+
// Ownership of source data transferred to this
source->position = 0;
source->at = startAction;
source->data = 0;
source->lenData = 0;
+ source->mayCoalesce = true;
}
// The undo history stores a sequence of user operations that represent the user's view of the
@@ -425,7 +428,9 @@ void UndoHistory::AppendAction(actionType at, int position, char *data, int leng
//Platform::DebugPrintf("action coalesced\n");
}
} else {
- currentAction++;
+ // Actions not at top level are always coalesced unless this is after return to top level
+ if (!actions[currentAction].mayCoalesce)
+ currentAction++;
}
} else {
currentAction++;
@@ -457,6 +462,7 @@ void UndoHistory::EndUndoAction() {
actions[currentAction].Create(startAction);
maxAction = currentAction;
}
+ actions[currentAction].mayCoalesce = false;
}
}