- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Actions/AtomAction/RemoveAction.cpp
r952f38 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 * RemoveAction.cpp … … 6 13 */ 7 14 15 // include config.h 16 #ifdef HAVE_CONFIG_H 17 #include <config.h> 18 #endif 19 8 20 #include "Helpers/MemDebug.hpp" 9 21 … … 11 23 #include "Actions/ActionRegistry.hpp" 12 24 #include "atom.hpp" 25 #include "AtomicInfo.hpp" 13 26 #include "Descriptors/AtomDescriptor.hpp" 14 27 #include "Helpers/Log.hpp" … … 25 38 #include "UIElements/Dialog.hpp" 26 39 #include "Actions/ValueStorage.hpp" 40 41 // memento to remember the state when undoing 42 43 class AtomRemoveState : public ActionState { 44 public: 45 AtomRemoveState(std::vector<AtomicInfo> _Walkers) : 46 Walkers(_Walkers) 47 {} 48 std::vector<AtomicInfo> Walkers; 49 }; 27 50 28 51 const char AtomRemoveAction::NAME[] = "remove-atom"; … … 50 73 atom *first = NULL; 51 74 52 std::vector<molecule *> molecules = World::getInstance().getAllMolecules(); 75 // create undo state 76 std::vector<AtomicInfo> Walkers; 77 for (World::AtomSelectionIterator iter = World::getInstance().beginAtomSelection(); iter != World::getInstance().endAtomSelection(); ++iter) { 78 Walkers.push_back(AtomicInfo(*(iter->second))); 79 } 80 AtomRemoveState *UndoState = new AtomRemoveState(Walkers); 81 82 // remove all selected atoms 83 // std::vector<molecule *> molecules = World::getInstance().getAllMolecules(); 53 84 for (World::AtomSelectionIterator iter = World::getInstance().beginAtomSelection(); iter != World::getInstance().endAtomSelection(); ++iter) { 54 85 first = iter->second; 55 86 DoLog(1) && (Log() << Verbose(1) << "Removing atom " << first->getId() << "." << endl); 56 // TODO: this is not necessary when atoms and their storing to file are handled by the World57 // simply try to erase in every molecule found58 for (std::vector<molecule *>::iterator iter = molecules.begin();iter != molecules.end(); ++iter) {59 (*iter)->erase(first);60 }87 // // TODO: this is not necessary when atoms and their storing to file are handled by the World 88 // // simply try to erase in every molecule found 89 // for (std::vector<molecule *>::iterator iter = molecules.begin();iter != molecules.end(); ++iter) { 90 // (*iter)->erase(first); 91 // } 61 92 World::getInstance().destroyAtom(first); 62 93 } 63 return Action::s uccess;94 return Action::state_ptr(UndoState); 64 95 } 65 96 66 97 Action::state_ptr AtomRemoveAction::performUndo(Action::state_ptr _state) { 67 // ParserLoadXyzState *state = assert_cast<ParserLoadXyzState*>(_state.get());98 AtomRemoveState *state = assert_cast<AtomRemoveState*>(_state.get()); 68 99 69 return Action::failure; 70 // string newName = state->mol->getName(); 71 // state->mol->setName(state->lastName); 72 // 73 // return Action::state_ptr(new ParserLoadXyzState(state->mol,newName)); 100 size_t i=0; 101 for (; i<state->Walkers.size(); ++i) { 102 // re-create the atom 103 DoLog(1) && (Log() << Verbose(1) << "Re-adding atom " << state->Walkers[i].getId() << "." << endl); 104 atom *Walker = World::getInstance().createAtom(); 105 if (!state->Walkers[i].setAtom(*Walker)) { 106 DoeLog(1) && (eLog() << Verbose(1) << "Failed to set id." << endl); 107 World::getInstance().destroyAtom(Walker); 108 break; 109 } 110 } 111 if (i<state->Walkers.size()) { 112 // remove all previous ones, too 113 for (size_t j=0;j<i;++j) 114 World::getInstance().destroyAtom(state->Walkers[j].getId()); 115 // and announce the failure of the undo 116 return Action::failure; 117 } 118 return Action::state_ptr(_state); 74 119 } 75 120 76 121 Action::state_ptr AtomRemoveAction::performRedo(Action::state_ptr _state){ 77 return Action::failure; 122 AtomRemoveState *state = assert_cast<AtomRemoveState*>(_state.get()); 123 124 // simple remove again all previously added atoms 125 for (size_t i=0; i<state->Walkers.size(); ++i) { 126 DoLog(1) && (Log() << Verbose(1) << "Re-removing atom " << state->Walkers[i].getId() << "." << endl); 127 World::getInstance().destroyAtom(state->Walkers[i].getId()); 128 } 129 130 return Action::state_ptr(_state); 78 131 } 79 132 80 133 bool AtomRemoveAction::canUndo() { 81 return false;134 return true; 82 135 } 83 136 84 137 bool AtomRemoveAction::shouldUndo() { 85 return false;138 return true; 86 139 } 87 140
Note:
See TracChangeset
for help on using the changeset viewer.