void InteractionProcessor::run() { std::stack<Interaction> undoStack; std::stack<Interaction> redoStack; view.refresh(); while (true) { Interaction interaction = interactionReader.nextInteraction(); if (interaction.type() == InteractionType::quit) { break; } else if (interaction.type() == InteractionType::undo) { if (!undoStack.empty()) { Interaction undoInteraction = undoStack.top(); Command* command = undoInteraction.command(); try { undoStack.pop(); redoStack.push(undoInteraction); command->undo(model); model.clearErrorMessage(); } catch(EditorException& e) { model.setErrorMessage(e.getReason()); delete command; } view.refresh(); } } else if (interaction.type() == InteractionType::redo) { if(!redoStack.empty()) { Interaction redoInteraction = redoStack.top(); Command* command = redoInteraction.command(); try { redoStack.pop(); undoStack.push(redoInteraction); command->execute(model); model.clearErrorMessage(); } catch(EditorException& e) { model.setErrorMessage(e.getReason()); delete command; } view.refresh(); } } else if (interaction.type() == InteractionType::command) { Command* command = interaction.command(); try { command->execute(model); undoStack.push(interaction); model.clearErrorMessage(); } catch (EditorException& e) { model.setErrorMessage(e.getReason()); delete command; } view.refresh(); // Note that you'll want to be more careful about when you delete // commands once you implement undo and redo. For now, since // neither is implemented, I've just deleted it immediately // after executing it. You'll need to wait to delete it until // you don't need it anymore. //delete command; } } while(!undoStack.empty()) { Interaction undoInteraction = undoStack.top(); delete undoInteraction.command(); undoStack.pop(); } while(!redoStack.empty()) { Interaction redoInteraction = redoStack.top(); delete redoInteraction.command(); redoStack.pop(); } }
void InteractionProcessor::run() { view.refresh(); std::vector<Command*> undo; std::vector<Command*> redo; while (true) { Interaction interaction = interactionReader.nextInteraction(); Command* command = interaction.command(); Command* undoCommand = nullptr; Command* redoCommand = nullptr; if (interaction.type() == InteractionType::quit) { for (auto i = undo.begin(); i < undo.end(); i++) { delete *i; } for (auto j = redo.begin(); j < redo.end(); j++) { delete *j; } delete undoCommand; delete redoCommand; delete command; break; } else if (interaction.type() == InteractionType::undo) { if (undo.size() > 0) { undoCommand = undo.back(); try { undoCommand->undo(model); } catch (EditorException& e) { model.setErrorMessage(e.getReason()); } redo.push_back(undoCommand); undo.pop_back(); } view.refresh(); } else if (interaction.type() == InteractionType::redo) { if (redo.size() > 0) { redoCommand = redo.back(); try { redoCommand->execute(model); } catch (EditorException& e) { model.setErrorMessage(e.getReason()); } undo.push_back(redoCommand); redo.pop_back(); } view.refresh(); } else if (interaction.type() == InteractionType::command) { // Command* command = interaction.command(); undo.push_back(command); try { command->execute(model); model.clearErrorMessage(); } catch (EditorException& e) { model.setErrorMessage(e.getReason()); } view.refresh(); // Note that you'll want to be more careful about when you delete // commands once you implement undo and redo. For now, since // neither is implemented, I've just deleted it immediately // after executing it. You'll need to wait to delete it until // you don't need it anymore. } } }