void CUndoRedoStack::redo() { QUndoCommand* topCmd = d->redoStack.count() ? d->redoStack.pop() : 0; if(!topCmd) return; QString cmdText = topCmd->text(); topCmd->redo(); d->undoStack.push(topCmd); qWarning("Redo: %s", qPrintable(cmdText)); // emit change notifications. emit redone(cmdText); emit canUndoChanged(d->undoStack.count()); emit canRedoChanged(d->redoStack.count()); }
bool UndoCommand::internalRedo(const vector<UndoCommand*>& childCommands, bool executeThis, bool isAborting) { m_bAborted = false; vector<UndoCommand*> executed; switch(m_eRedoChildExecutionPolicy) { case e_ChildExecutionPolicy_BackwardAfterParent: { if(executeThis) redo(); if(m_bAborted) { o_error(!isAborting, "Failed on aborting"); return false; } size_t i = childCommands.size(); while(i--) { if(!childCommands[i]->internalRedo(isAborting)) { o_error(!isAborting, "Failed on aborting"); std::reverse(executed.begin(), executed.end()); internalUndo(executed, true, true); return false; } executed.push_back(childCommands[i]); } } break; case e_ChildExecutionPolicy_BackwardBeforeParent: { size_t i = childCommands.size(); while(i--) { if(!childCommands[i]->internalRedo(isAborting)) { o_error(!isAborting, "Failed on aborting"); std::reverse(executed.begin(), executed.end()); internalUndo(executed, false, true); return false; } executed.push_back(childCommands[i]); } if(executeThis) redo(); if(m_bAborted) { o_error(!isAborting, "Failed on aborting"); std::reverse(executed.begin(), executed.end()); internalUndo(executed, false, true); return false; } } break; case e_ChildExecutionPolicy_ForwardAfterParent: { if(executeThis) redo(); if(m_bAborted) { o_error(!isAborting, "Failed on aborting"); return false; } for(size_t i = 0; i<childCommands.size(); ++i) { if(!childCommands[i]->internalRedo(isAborting)) { o_error(!isAborting, "Failed on aborting"); internalUndo(executed, true, true); return false; } executed.push_back(childCommands[i]); } } break; case e_ChildExecutionPolicy_ForwardBeforeParent: { for(size_t i = 0; i<childCommands.size(); ++i) { if(!childCommands[i]->internalRedo(isAborting)) { o_error(!isAborting, "Failed on aborting"); internalUndo(executed, false, true); return false; } executed.push_back(childCommands[i]); } if(executeThis) redo(); if(m_bAborted) { o_error(!isAborting, "Failed on aborting"); internalUndo(executed, false, true); return false; } } break; } o_emit redone(); return true; }