- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Actions/AtomAction/ChangeElementAction.cpp
rbf3817 rbcf653 1 /* 2 * Project: MoleCuilder 3 * Description: creates and alters molecular systems 4 * Copyright (C) 2010 University of Bonn. All rights reserved. 5 * Please see the LICENSE file or "Copyright notice" in builder.cpp for details. 6 */ 7 1 8 /* 2 9 * ChangeElementAction.cpp … … 15 22 #include "Actions/AtomAction/ChangeElementAction.hpp" 16 23 #include "Actions/ActionRegistry.hpp" 24 #include "Descriptors/AtomIdDescriptor.hpp" 17 25 #include "atom.hpp" 18 26 #include "element.hpp" … … 24 32 25 33 #include <iostream> 34 #include <map> 26 35 #include <string> 27 36 … … 31 40 #include "UIElements/Dialog.hpp" 32 41 #include "Actions/ValueStorage.hpp" 42 43 typedef std::map<int, const element *> ElementMap; 44 45 // memento to remember the state when undoing 46 47 class AtomChangeElementState : public ActionState { 48 public: 49 AtomChangeElementState(ElementMap _Elements, const element *_elemental) : 50 Elements(_Elements), 51 elemental(_elemental) 52 {} 53 ElementMap Elements; 54 const element *elemental; 55 }; 33 56 34 57 const char AtomChangeElementAction::NAME[] = "change-element"; … … 61 84 ValueStorage::getInstance().queryCurrentValue(NAME, elemental); 62 85 86 // create undo state 87 ElementMap Elements; 88 for (World::AtomSelectionIterator iter = World::getInstance().beginAtomSelection(); iter != World::getInstance().endAtomSelection(); ++iter) { 89 Elements.insert(std::pair<int, const element *> (iter->second->getId(), iter->second->getType())); 90 } 91 AtomChangeElementState *UndoState = new AtomChangeElementState(Elements, elemental); 92 63 93 for (World::AtomSelectionIterator iter = World::getInstance().beginAtomSelection(); iter != World::getInstance().endAtomSelection(); ++iter) { 64 94 first = iter->second; … … 69 99 mol->AddAtom(first); // add atom to ensure correctness of formula 70 100 } 71 return Action::s uccess;101 return Action::state_ptr(UndoState); 72 102 } 73 103 74 104 Action::state_ptr AtomChangeElementAction::performUndo(Action::state_ptr _state) { 75 // ParserLoadXyzState *state = assert_cast<ParserLoadXyzState*>(_state.get()); 105 AtomChangeElementState *state = assert_cast<AtomChangeElementState*>(_state.get()); 106 atom *first = NULL; 107 molecule *mol = NULL; 76 108 77 return Action::failure; 78 // string newName = state->mol->getName(); 79 // state->mol->setName(state->lastName); 80 // 81 // return Action::state_ptr(new ParserLoadXyzState(state->mol,newName)); 109 for(ElementMap::const_iterator iter = state->Elements.begin(); iter != state->Elements.end(); ++iter) { 110 first = World::getInstance().getAtom(AtomById(iter->first)); 111 mol = first->getMolecule(); 112 first->removeFromMolecule(); // remove atom 113 first->setType(iter->second); 114 mol->AddAtom(first); // add atom to ensure correctness of formula 115 } 116 117 return Action::state_ptr(_state); 82 118 } 83 119 84 120 Action::state_ptr AtomChangeElementAction::performRedo(Action::state_ptr _state){ 85 return Action::failure; 121 AtomChangeElementState *state = assert_cast<AtomChangeElementState*>(_state.get()); 122 atom *first = NULL; 123 molecule *mol = NULL; 124 125 for(ElementMap::const_iterator iter = state->Elements.begin(); iter != state->Elements.end(); ++iter) { 126 first = World::getInstance().getAtom(AtomById(iter->first)); 127 mol = first->getMolecule(); 128 first->removeFromMolecule(); // remove atom 129 first->setType(state->elemental); 130 mol->AddAtom(first); // add atom to ensure correctness of formula 131 } 132 133 return Action::state_ptr(_state); 86 134 } 87 135 88 136 bool AtomChangeElementAction::canUndo() { 89 return false;137 return true; 90 138 } 91 139 92 140 bool AtomChangeElementAction::shouldUndo() { 93 return false;141 return true; 94 142 } 95 143
Note:
See TracChangeset
for help on using the changeset viewer.