Ignore:
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
    18/*
    29 * ChangeElementAction.cpp
     
    1522#include "Actions/AtomAction/ChangeElementAction.hpp"
    1623#include "Actions/ActionRegistry.hpp"
     24#include "Descriptors/AtomIdDescriptor.hpp"
    1725#include "atom.hpp"
    1826#include "element.hpp"
     
    2432
    2533#include <iostream>
     34#include <map>
    2635#include <string>
    2736
     
    3140#include "UIElements/Dialog.hpp"
    3241#include "Actions/ValueStorage.hpp"
     42
     43typedef std::map<int, const element *> ElementMap;
     44
     45// memento to remember the state when undoing
     46
     47class AtomChangeElementState : public ActionState {
     48public:
     49  AtomChangeElementState(ElementMap _Elements, const element *_elemental) :
     50    Elements(_Elements),
     51    elemental(_elemental)
     52  {}
     53  ElementMap Elements;
     54  const element *elemental;
     55};
    3356
    3457const char AtomChangeElementAction::NAME[] = "change-element";
     
    6184  ValueStorage::getInstance().queryCurrentValue(NAME, elemental);
    6285
     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
    6393  for (World::AtomSelectionIterator iter = World::getInstance().beginAtomSelection(); iter != World::getInstance().endAtomSelection(); ++iter) {
    6494    first = iter->second;
     
    6999    mol->AddAtom(first);  // add atom to ensure correctness of formula
    70100  }
    71   return Action::success;
     101  return Action::state_ptr(UndoState);
    72102}
    73103
    74104Action::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;
    76108
    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);
    82118}
    83119
    84120Action::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);
    86134}
    87135
    88136bool AtomChangeElementAction::canUndo() {
    89   return false;
     137  return true;
    90138}
    91139
    92140bool AtomChangeElementAction::shouldUndo() {
    93   return false;
     141  return true;
    94142}
    95143
Note: See TracChangeset for help on using the changeset viewer.