Changes in / [b73545:7f1b51]


Ignore:
Files:
11 added
2 deleted
75 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/Action.cpp

    rb73545 r7f1b51  
    127127
    128128Dialog * Action::createDialog(){
    129   Dialog *dialog = UIFactory::getInstance().makeDialog();
     129  Dialog *dialog = UIFactory::getInstance().makeDialog(Traits.getName());
    130130  return fillDialog(dialog);
    131131}
  • src/Actions/ActionQueue.cpp

    rb73545 r7f1b51  
    5555using namespace MoleCuilder;
    5656
     57const Action* ActionQueue::_lastchangedaction = NULL;
     58
    5759ActionQueue::ActionQueue() :
     60    Observable("ActionQueue"),
    5861    AR(new ActionRegistry()),
    5962    history(new ActionHistory),
     
    6669    run_thread_isIdle(true)
    6770#endif
    68 {}
     71{
     72  // channels of observable
     73  Channels *OurChannel = new Channels;
     74  NotificationChannels.insert( std::make_pair(static_cast<Observable *>(this), OurChannel) );
     75  // add instance for each notification type
     76  for (size_t type = 0; type < NotificationType_MAX; ++type)
     77    OurChannel->addChannel(type);
     78}
    6979
    7080ActionQueue::~ActionQueue()
     
    8898void ActionQueue::queueAction(const Action * const _action, enum Action::QueryOptions state)
    8999{
     100  OBSERVE;
     101  NOTIFY(ActionQueued);
    90102  Action *newaction = _action->clone(state);
    91103  newaction->prepare(state);
     
    118130  mtx_queue.unlock();
    119131#endif
     132  _lastchangedaction = newaction;
    120133}
    121134
  • src/Actions/ActionQueue.hpp

    rb73545 r7f1b51  
    1616#include "CodePatterns/Singleton.hpp"
    1717
     18#include "CodePatterns/Observer/Channels.hpp"
     19#include "CodePatterns/Observer/Observable.hpp"
    1820
    1921#ifdef HAVE_ACTION_THREAD
     
    3840class ActionRegistry;
    3941class ActionTrait;
     42
     43namespace Queuedetail {
     44  template <class T> const T* lastChanged()
     45  {
     46    ASSERT(0, "Queuedetail::lastChanged() - only specializations may be used.");
     47    return NULL;
     48  }
     49}
    4050
    4151/** This class combines the whole handling of Actions into a single class.
     
    4454 * automatically queued and placed into a History after execution.
    4555 */
    46 class ActionQueue : public Singleton<ActionQueue>
     56class ActionQueue : public Singleton<ActionQueue>, public Observable
    4757{
    4858  friend class Singleton<ActionQueue>;
     
    5161  typedef std::vector< Action * > ActionQueue_t;
    5262
     63  //!> channels for this observable
     64  enum NotificationType {
     65    ActionQueued,  // new action was queued
     66    NotificationType_MAX  // denotes the maximum of available notification types
     67  };
     68
     69  //>! access to last changed element (atom or molecule)
     70  template <class T> const T* lastChanged() const
     71  { return Queuedetail::lastChanged<T>(); }
     72
    5373  /** Queues the Action with \a name to be called.
    5474   *
     
    222242  ~ActionQueue();
    223243
     244private:
     245  friend const Action *Queuedetail::lastChanged<Action>();
     246  static const Action *_lastchangedaction;
     247
    224248  //!> ActionRegistry to spawn new actions
    225249  ActionRegistry *AR;
     
    260284  ActionStatusList StatusList;
    261285};
     286namespace Queuedetail {
     287  template <>       inline  const Action* lastChanged<Action>() { return ActionQueue::_lastchangedaction; }
     288}
    262289
    263290};
  • src/Actions/Action_impl_pre.hpp

    rb73545 r7f1b51  
    111111)
    112112#endif
     113#ifdef paramdescriptions
     114BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXPARAMTYPES, BOOST_PP_SEQ_SIZE(paramdescriptions)),\
     115  ERROR: There are not the same number of "paramtokens" and "paramdescriptions" in: __FILE__ \
     116)
     117#endif
    113118
    114119#ifdef statetypes
     
    143148  ,\
    144149  BOOST_PP_SEQ_ELEM(n, paramtokens)\
    145   , Traits.getDescription()\
     150  ,\
     151  BOOST_PP_SEQ_ELEM(n, paramdescriptions)\
    146152  );
    147153
  • src/Actions/CommandAction/BondLengthTableAction.def

    rb73545 r7f1b51  
    1010#include "Graph/BondGraph.hpp"
    1111
     12#include "Parameters/Validators/Ops_Validator.hpp"
    1213#include "Parameters/Validators/Specific/FilePresentValidator.hpp"
     14#include "Parameters/Validators/Specific/FileSuffixValidator.hpp"
    1315
    1416// i.e. there is an integer with variable name Z that can be found in
     
    2123#define paramreferences (BondGraphFileName)
    2224#define paramvalids \
    23 (FilePresentValidator())
     25(FilePresentValidator() && (FileSuffixValidator("dat") || FileSuffixValidator("db")))
    2426
    2527#define statetypes (std::string)
  • src/Actions/CommandAction/ElementDbAction.def

    rb73545 r7f1b51  
    99#include <sstream>
    1010
     11#include "Parameters/Validators/Ops_Validator.hpp"
    1112#include "Parameters/Validators/Specific/FilePresentValidator.hpp"
    1213
  • src/Actions/CommandAction/LoadSessionAction.def

    rb73545 r7f1b51  
    99#include <boost/filesystem/path.hpp>
    1010
     11#include "Parameters/Validators/Ops_Validator.hpp"
    1112#include "Parameters/Validators/Specific/FilePresentValidator.hpp"
     13#include "Parameters/Validators/Specific/FileSuffixValidator.hpp"
    1214
    1315// i.e. there is an integer with variable name Z that can be found in
     
    2022#define paramreferences (filename)
    2123#define paramvalids \
    22 (FilePresentValidator())
     24(FilePresentValidator() && FileSuffixValidator("py"))
    2325
    2426#undef statetypes
  • src/Actions/CommandAction/StoreSessionAction.def

    rb73545 r7f1b51  
    1111
    1212#include "Parameters/Validators/DummyValidator.hpp"
     13#include "Parameters/Validators/Ops_Validator.hpp"
     14#include "Parameters/Validators/Specific/FileSuffixValidator.hpp"
    1315#include "Parameters/Validators/Specific/SessionTypeValidator.hpp"
    1416
     
    2224#define paramreferences (filename)(sessiontype)
    2325#define paramvalids \
    24 (DummyValidator< boost::filesystem::path >()) \
     26(FileSuffixValidator("py") || FileSuffixValidator("sh") || FileSuffixValidator("bat")) \
    2527(SessionTypeValidator())
    2628
  • src/Actions/FragmentationAction/ClearFragmentationResultsAction.def

    rb73545 r7f1b51  
    77
    88// all includes and forward declarations necessary for non-integral types below
    9 #include <boost/filesystem/path.hpp>
    10 #include <vector>
    11 
    12 #include "Parameters/Validators/RangeValidator.hpp"
    13 #include "Parameters/Validators/Ops_Validator.hpp"
    14 #include "Parameters/Validators/STLVectorValidator.hpp"
    15 #include "Parameters/Validators/Specific/ParserFileValidator.hpp"
    16 #include "Parameters/Validators/Specific/FilePresentValidator.hpp"
    179
    1810// i.e. there is an integer with variable name Z that can be found in
  • src/Actions/FragmentationAction/MolecularDynamicsAction.cpp

    rb73545 r7f1b51  
    6565  actions.addAction(AR.getActionByName(std::string("output")));
    6666  actions.addAction(AR.getActionByName(std::string("clear-fragment-results")));
     67  actions.addAction(AR.getActionByName(std::string("destroy-adjacency")));
     68  actions.addAction(AR.getActionByName(std::string("create-adjacency")));
     69  actions.addAction(AR.getActionByName(std::string("update-molecules")));
    6770  actions.addAction(AR.getActionByName(std::string("fragment-molecule")));
    6871  actions.addAction(AR.getActionByName(std::string("fragment-automation")));
     
    9194        "FragmentationMolecularDynamicsAction::performCall() - output not found in ActionSequence.");
    9295  }
     96  // don't recreate bond graph if not desired
     97  if (params.DontCreateGraphEachStep.get()) {
     98#ifndef NDEBUG
     99    bool status = true;
     100    status &=
     101#endif
     102        removeAction(std::string("destroy-adjacency"));
     103
     104#ifndef NDEBUG
     105    status &=
     106#endif
     107        removeAction(std::string("create-adjacency"));
     108
     109#ifndef NDEBUG
     110    status &=
     111#endif
     112        removeAction(std::string("update-molecules"));
     113    ASSERT( status,
     114        "FragmentationStructuralOptimizationAction::performCall() - at least one graph action not found in ActionSequence.");
     115  }
    93116  // and call
    94117  ActionState::ptr state(MakroAction::performCall());
  • src/Actions/FragmentationAction/MolecularDynamicsAction.def

    rb73545 r7f1b51  
    1212// ValueStorage by the token "Z" -> first column: int, Z, "Z"
    1313// "undefine" if no parameters are required, use (NOPARAM_DEFAULT) for each (undefined) default value
    14 #define paramtypes (unsigned int)(bool)
    15 #define paramtokens ("steps")("output-every-step")
    16 #define paramdescriptions ("numer of MD steps to perform")("whether World should be written after every step, useful if integration might hang")
    17 #define paramdefaults (NOPARAM_DEFAULT)(PARAM_DEFAULT("0"))
    18 #define paramreferences (steps)(DoOutput)
     14#define paramtypes (unsigned int)(bool)(bool)
     15#define paramtokens ("steps")("output-every-step")("keep-bondgraph")
     16#define paramdescriptions ("numer of MD steps to perform")("whether World should be written after every step, useful if integration might hang")("whether the bond graph should be kept the same during each step and not updated")
     17#define paramdefaults (NOPARAM_DEFAULT)(PARAM_DEFAULT("0"))(PARAM_DEFAULT("0"))
     18#define paramreferences (steps)(DoOutput)(DontCreateGraphEachStep)
    1919#define paramvalids \
    2020(NotZeroValidator< unsigned int >()) \
     21(DummyValidator<bool>()) \
    2122(DummyValidator<bool>())
    2223
  • src/Actions/FragmentationAction/StructuralOptimizationAction.cpp

    rb73545 r7f1b51  
    6262  // present. If not, we still copy the position cleanly into a new step where then
    6363  // forces are set according to summed fragmentary contributions. This is much cleaner.
     64  actions.addAction(AR.getActionByName(std::string("destroy-adjacency")));
     65  actions.addAction(AR.getActionByName(std::string("create-adjacency")));
     66  actions.addAction(AR.getActionByName(std::string("update-molecules")));
    6467  actions.addAction(AR.getActionByName(std::string("fragment-molecule")));
    6568  actions.addAction(AR.getActionByName(std::string("fragment-automation")));
     
    9194        "FragmentationStructuralOptimizationAction::performCall() - output not found in ActionSequence.");
    9295  }
     96  // don't recreate bond graph if not desired
     97  if (params.DontCreateGraphEachStep.get()) {
     98#ifndef NDEBUG
     99    bool status = true;
     100    status &=
     101#endif
     102        removeAction(std::string("destroy-adjacency"));
     103
     104#ifndef NDEBUG
     105    status &=
     106#endif
     107        removeAction(std::string("create-adjacency"));
     108
     109#ifndef NDEBUG
     110    status &=
     111#endif
     112        removeAction(std::string("update-molecules"));
     113    ASSERT( status,
     114        "FragmentationStructuralOptimizationAction::performCall() - at least one graph action not found in ActionSequence.");
     115  }
    93116  // and call
    94117  ActionState::ptr state(MakroAction::performCall());
  • src/Actions/FragmentationAction/StructuralOptimizationAction.def

    rb73545 r7f1b51  
    1212// ValueStorage by the token "Z" -> first column: int, Z, "Z"
    1313// "undefine" if no parameters are required, use (NOPARAM_DEFAULT) for each (undefined) default value
    14 #define paramtypes (unsigned int)(bool)
    15 #define paramtokens ("steps")("output-every-step")
    16 #define paramdescriptions ("numer of MD steps to perform")("whether we should update the timestep in each descent step sp as to visualize the minimisation")
    17 #define paramdefaults (NOPARAM_DEFAULT)(PARAM_DEFAULT("0"))
    18 #define paramreferences (steps)(DoOutput)
     14#define paramtypes (unsigned int)(bool)(bool)
     15#define paramtokens ("steps")("output-every-step")("keep-bondgraph")
     16#define paramdescriptions ("numer of MD steps to perform")("whether we should update the timestep in each descent step sp as to visualize the minimisation")("whether the bond graph should be kept the same during each step and not updated")
     17#define paramdefaults (NOPARAM_DEFAULT)(PARAM_DEFAULT("0"))(PARAM_DEFAULT("0"))
     18#define paramreferences (steps)(DoOutput)(DontCreateGraphEachStep)
    1919#define paramvalids \
    2020(NotZeroValidator< unsigned int >()) \
     21(DummyValidator<bool>()) \
    2122(DummyValidator<bool>())
    2223
  • src/Actions/GraphAction/CorrectBondDegreeAction.cpp

    rb73545 r7f1b51  
    106106  BG->CorrectBondDegree(Set);
    107107
    108   // give info
    109   size_t BondCount = 0;
    110   std::vector<molecule *> molecules = World::getInstance().getAllMolecules();
    111   for (std::vector<molecule *>::const_iterator iter = molecules.begin();
    112       iter != molecules.end(); ++iter)
    113     BondCount += (*iter)->getBondCount();
    114   LOG(0, "STATUS: Recognized " << BondCount << " bonds.");
    115 
    116108  return ActionState::ptr(UndoState);
    117109}
  • src/Actions/MoleculeAction/ForceAnnealingAction.def

    rb73545 r7f1b51  
    77
    88// all includes and forward declarations necessary for non-integral types below
     9#include <boost/filesystem/path.hpp>
     10
    911#include "Parameters/Validators/DummyValidator.hpp"
    1012#include "Parameters/Validators/GenericValidators.hpp"
    1113#include "Parameters/Validators/Ops_Validator.hpp"
    12 #include "Parameters/Validators/Specific/FilePresentValidator.hpp"
    1314
    1415// i.e. there is an integer with variable name Z that can be found in
  • src/Actions/MoleculeAction/VerletIntegrationAction.def

    rb73545 r7f1b51  
    88// all includes and forward declarations necessary for non-integral types below
    99#include "LinearAlgebra/Vector.hpp"
     10#include <boost/filesystem/path.hpp>
    1011#include <vector>
    1112typedef std::vector<Vector> Vectors_t;
     
    1415#include "Parameters/Validators/GenericValidators.hpp"
    1516#include "Parameters/Validators/Ops_Validator.hpp"
    16 #include "Parameters/Validators/Specific/FilePresentValidator.hpp"
    1717
    1818// i.e. there is an integer with variable name Z that can be found in
  • src/Actions/PotentialAction/FitPotentialAction.def

    rb73545 r7f1b51  
    1818#include "Parameters/Validators/Specific/ElementValidator.hpp"
    1919#include "Parameters/Validators/Specific/EmptyStringValidator.hpp"
     20#include "Parameters/Validators/Specific/FileSuffixValidator.hpp"
    2021#include "Parameters/Validators/Specific/FilePresentValidator.hpp"
    2122#include "Parameters/Validators/Specific/PotentialTypeValidator.hpp"
     
    2627#define paramtypes (boost::filesystem::path)(std::string)(boost::filesystem::path)(std::vector<const element *>)(std::vector<const element *>)(unsigned int)(double)
    2728#define paramtokens ("training-file")("potential-type")("potential-file")("potential-charges")("fragment-charges")("take-best-of")("set-threshold")
    28 #define paramdescriptions ("optional file to write training data to")("potential type to fit")("potential file specifying multiple potentials to fit")("charges specifying the potential")("charges specifying the fragment")("take the best among this many approximations")("Require L2 error to be smaller than threshold, overrides number of attempts")
     29#define paramdescriptions ("optional file to write training data to")("potential type to fit")("optional potential file specifying multiple potentials to fit")("charges specifying the potential")("charges specifying the fragment")("take the best among this many approximations")("Require L2 error to be smaller than threshold, overrides number of attempts")
    2930#define paramdefaults (PARAM_DEFAULT(""))(NOPARAM_DEFAULT)(NOPARAM_DEFAULT)(NOPARAM_DEFAULT)(NOPARAM_DEFAULT)(PARAM_DEFAULT(3))(PARAM_DEFAULT(1.))
    3031#define paramreferences (training_file)(potentialtype)(potential_file)(charges)(fragment)(best_of_howmany)(threshold)
     
    3233(DummyValidator<boost::filesystem::path>()) \
    3334(EmptyStringValidator() || PotentialTypeValidator()) \
    34 (DummyValidator<boost::filesystem::path>()) \
     35(!FilePresentValidator() || FileSuffixValidator("potentials")) \
    3536(STLVectorValidator< std::vector<const element *> >(0,99, ElementValidator())) \
    3637(STLVectorValidator< std::vector<const element *> >(1,99, ElementValidator())) \
  • src/Actions/unittests/stubs/DummyUI.hpp

    rb73545 r7f1b51  
    2121{
    2222public:
    23   DummyDialog(){}
     23  DummyDialog(const std::string &_title) :
     24    Dialog(_title)
     25  {}
    2426  virtual ~DummyDialog(){}
    2527
     
    5355  virtual ~DummyUIFactory(){}
    5456
    55   virtual Dialog* makeDialog(){return new DummyDialog;}
     57  virtual Dialog* makeDialog(const std::string &_title){return new DummyDialog(_title);}
    5658  virtual MainWindow* makeMainWindow(){return 0;}
    5759
  • src/Graph/BondGraph.hpp

    rb73545 r7f1b51  
    355355    // remove every bond from the list
    356356    for(iterator_type AtomRunner = Set.begin(); AtomRunner != Set.end(); ++AtomRunner) {
    357       (*AtomRunner)->removeAllBonds();
    358 //      BondList& ListOfBonds = (*AtomRunner)->getListOfBonds();
    359 //      for(BondList::iterator BondRunner = ListOfBonds.begin();
    360 //          !ListOfBonds.empty();
    361 //          BondRunner = ListOfBonds.begin()) {
    362 //        ASSERT((*BondRunner)->Contains(*AtomRunner),
    363 //            "BondGraph::cleanAdjacencyList() - "+
    364 //            toString(*BondRunner)+" does not contain "+
    365 //            toString(*AtomRunner)+".");
    366 //        delete((*BondRunner));
    367 //      }
     357      (*AtomRunner)->removeAllBonds(WorldTime::getTime());
    368358    }
    369359  }
  • src/Parameters/Makefile.am

    rb73545 r7f1b51  
    44
    55PARAMETERSOURCE = \
     6        Parameters/Specifics/Value_atom.cpp \
     7        Parameters/Specifics/Value_element.cpp \
     8        Parameters/Specifics/Value_molecule.cpp \
     9        Parameters/Specifics/Value_string.cpp \
    610        Parameters/Validators/Specific/ActionNameValidator.cpp \
    711        Parameters/Validators/Specific/AtomDataValidator.cpp \
     
    2630        Parameters/Validators/Specific/VectorNotZeroValidator.cpp \
    2731        Parameters/Validators/Specific/VectorPositiveComponentsValidator.cpp \
    28         Parameters/Validators/Specific/VectorZeroOneComponentsValidator.cpp \
    29         Parameters/Value_string.cpp
     32        Parameters/Validators/Specific/VectorZeroOneComponentsValidator.cpp
    3033
    3134PARAMETERHEADER = \
     
    3437        Parameters/ParameterInterface.hpp \
    3538        Parameters/StreamOperators.hpp \
     39        Parameters/ContinuousValue.hpp \
     40        Parameters/ContinuousValue_impl.hpp \
     41        Parameters/Value.hpp \
     42        Parameters/Value_impl.hpp \
     43        Parameters/ValueAsString.hpp \
     44        Parameters/ValueInterface.hpp \
     45        Parameters/Specifics/Value_atom.hpp \
     46        Parameters/Specifics/Value_element.hpp \
     47        Parameters/Specifics/Value_molecule.hpp \
     48        Parameters/Specifics/Value_string.hpp \
    3649        Parameters/Validators/DiscreteValidator.hpp \
    3750        Parameters/Validators/DiscreteValidator_impl.hpp \
     
    3952        Parameters/Validators/GenericValidators.hpp \
    4053        Parameters/Validators/GenericValidators_impl.hpp \
     54        Parameters/Validators/getFlatListFromHierarchyOfValidators.hpp \
    4155        Parameters/Validators/Ops_Validator.hpp \
    4256        Parameters/Validators/Ops_Validator_impl.hpp \
     
    7286        Parameters/Validators/Specific/VectorNotZeroValidator.hpp \
    7387        Parameters/Validators/Specific/VectorPositiveComponentsValidator.hpp \
    74         Parameters/Validators/Specific/VectorZeroOneComponentsValidator.hpp \
    75         Parameters/ContinuousValue.hpp \
    76         Parameters/ContinuousValue_impl.hpp \
    77         Parameters/Value.hpp \
    78         Parameters/Value_impl.hpp \
    79         Parameters/Value_string.hpp \
    80         Parameters/ValueAsString.hpp \
    81         Parameters/ValueInterface.hpp
     88        Parameters/Validators/Specific/VectorZeroOneComponentsValidator.hpp
    8289
    8390if CONDLEVMAR
  • src/Parameters/Validators/Ops_Validator_impl.hpp

    rb73545 r7f1b51  
    5252  Validator<T> *getA(){ return a; }
    5353  Validator<T> *getB(){ return b; }
     54  const Validator<T> *getA() const { return a; }
     55  const Validator<T> *getB() const { return b; }
    5456
    5557private:
     
    9092  }
    9193
     94  Validator<T> *getA(){ return a; }
     95  Validator<T> *getB(){ return b; }
     96  const Validator<T> *getA() const { return a; }
     97  const Validator<T> *getB() const { return b; }
     98
    9299private:
    93100  Validator<T> *a;
     
    126133  }
    127134
     135  Validator<T> *getA(){ return a; }
     136  const Validator<T> *getA() const { return a; }
     137
    128138private:
    129139  Validator<T> *a;
  • src/Parameters/Validators/Specific/FileSuffixValidator.hpp

    rb73545 r7f1b51  
    3333  Validator< boost::filesystem::path >* clone() const;
    3434
     35  const std::string & getSuffix() const
     36  { return suffix; }
     37
    3538private:
    3639  std::string suffix;
  • src/Parameters/Validators/Specific/ParserFileValidator.cpp

    rb73545 r7f1b51  
    7272}
    7373
     74std::vector<std::string> ParserFileValidator::getSuffixes() const
     75{
     76  std::vector<std::string> suffixes;
     77  for (ParserTypes t = ParserTypes_begin; t < ParserTypes_end; ++ t){
     78    suffixes.push_back(
     79        FormatParserStorage::getInstance().getSuffixFromType(t));
     80  }
     81  return suffixes;
     82}
    7483
    7584
    76 
  • src/Parameters/Validators/Specific/ParserFileValidator.hpp

    rb73545 r7f1b51  
    2727  bool operator==(const Validator<boost::filesystem::path> &_instance) const;
    2828  Validator< boost::filesystem::path >* clone() const;
     29
     30public:
     31  std::vector<std::string> getSuffixes() const;
    2932};
    3033
  • src/Parameters/Validators/Validator.hpp

    rb73545 r7f1b51  
    3535};
    3636
    37 
    3837#endif /* VALIDATOR_HPP_ */
  • src/Parameters/Value.hpp

    rb73545 r7f1b51  
    119119#include "Value_impl.hpp"
    120120
    121 #include "Value_string.hpp"
     121#include "Specifics/Value_atom.hpp"
     122#include "Specifics/Value_element.hpp"
     123#include "Specifics/Value_molecule.hpp"
     124#include "Specifics/Value_string.hpp"
    122125
    123126#endif /* VALUE_HPP_ */
  • src/Tesselation/tesselation.cpp

    rb73545 r7f1b51  
    115115        LinkedCell_deprecated *LinkedList = new LinkedCell_deprecated(cloud, 2.*SPHERERADIUS);
    116116
     117        // check for at least three points
     118        {
     119          bool ThreePointsFound = true;
     120          cloud.GoToFirst();
     121    for (size_t i=0;i<3;++i, cloud.GoToNext())
     122      ThreePointsFound &= (!cloud.IsEnd());
     123    cloud.GoToFirst();
     124    if (ThreePointsFound == false) {
     125      ELOG(2, "Less than 3 points in cloud, not enough for tesselation.");
     126      return;
     127    }
     128        }
     129
     130        // find a starting triangle
    117131  FindStartingTriangle(SPHERERADIUS, LinkedList);
    118132
  • src/UIElements/CommandLineUI/CommandLineDialog.cpp

    rb73545 r7f1b51  
    4242
    4343
    44 CommandLineDialog::CommandLineDialog()
     44CommandLineDialog::CommandLineDialog(const std::string &_title) :
     45    Dialog(_title)
    4546{
    4647}
  • src/UIElements/CommandLineUI/CommandLineDialog.hpp

    rb73545 r7f1b51  
    3030{
    3131public:
    32   CommandLineDialog();
     32  CommandLineDialog(const std::string &_title);
    3333  virtual ~CommandLineDialog();
    3434
  • src/UIElements/CommandLineUI/CommandLineUIFactory.cpp

    rb73545 r7f1b51  
    5252
    5353
    54 Dialog* CommandLineUIFactory::makeDialog() {
    55   return new CommandLineDialog();
     54Dialog* CommandLineUIFactory::makeDialog(const std::string &_title) {
     55  return new CommandLineDialog(_title);
    5656}
    5757
  • src/UIElements/CommandLineUI/CommandLineUIFactory.hpp

    rb73545 r7f1b51  
    4848  virtual ~CommandLineUIFactory();
    4949
    50   virtual Dialog* makeDialog();
     50  virtual Dialog* makeDialog(const std::string &_title);
    5151  virtual MainWindow* makeMainWindow();
    5252
  • src/UIElements/Dialog.cpp

    rb73545 r7f1b51  
    5050using namespace std;
    5151
    52 Dialog::Dialog()
     52Dialog::Dialog(const std::string &_title)
    5353{
    5454}
     
    120120
    121121bool Dialog::hasQueries(){
    122   return queries.size();
     122  list<Query*>::iterator iter;
     123  size_t nonemptyQueries = 0;
     124  for(iter=queries.begin(); iter!=queries.end(); iter++) {
     125    // count all queries that not EmptyQuery
     126    if (dynamic_cast<Dialog::EmptyQuery *>(*iter) == NULL)
     127      ++nonemptyQueries;
     128  }
     129  return nonemptyQueries != 0;
    123130}
    124131
  • src/UIElements/Dialog.hpp

    rb73545 r7f1b51  
    153153{
    154154public:
    155   Dialog();
     155  Dialog(const std::string &_title);
    156156  virtual ~Dialog();
    157157
  • src/UIElements/Makefile.am

    rb73545 r7f1b51  
    179179  UIElements/Views/Qt4/QtTimeLine.cpp \
    180180  UIElements/Views/Qt4/QtToolBar.cpp \
     181  UIElements/Views/Qt4/QtToolBar_QtFavoriteActions.cpp \
    181182  UIElements/Views/Qt4/Qt3D/GLWorldView.cpp \
    182183  UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp \
     
    192193  UIElements/Qt4/QtMainWindow.hpp \
    193194  UIElements/Qt4/Query/QtQuery.hpp \
     195  UIElements/Menu/Qt4/QMenu_tooltip.hpp \
    194196  UIElements/Menu/Qt4/QtMenuPipe.hpp \
    195197  UIElements/Views/Qt4/QDebugStream.hpp \
  • src/UIElements/Menu/Menu.cpp

    rb73545 r7f1b51  
    130130    if (MenuName == name) {
    131131      const std::string &ActionName = *iter;
    132       Menu::addAction(ActionName);
     132      const std::string &ActionDescription = CurrentTrait.getDescription();
     133      Menu::addAction(ActionName, ActionDescription);
    133134    }
    134135  }
    135136}
    136137
    137 void Menu::addAction(const std::string &ActionName)
     138void Menu::addAction(const std::string &ActionName, const std::string &ActionDescription)
    138139{
    139140  LastItem = ActionItem;
    140   addActionItem(ActionName, ActionName);
     141  addActionItem(ActionName, ActionDescription);
    141142}
    142143
  • src/UIElements/Menu/Menu.hpp

    rb73545 r7f1b51  
    6161
    6262protected:
    63   // Unique name of the menu for identification.
     63  //!> Unique name of the menu for identification.
    6464  const std::string name;
    6565
    66   // populater function that adds all menu items
     66  /** populater function that adds all menu items.
     67   *
     68   */
    6769  void populate();
     70
     71  /** Populater function for all Actions in this menu.
     72   *
     73   */
    6874  void populateActions();
    6975
    7076private:
    71   void addAction(const std::string &ActionName);
     77  /** Adds an action to this menu.
     78   *
     79   * @param ActionName name of action
     80   * @param ActionDescription of the action (e.g. for tooltips)
     81   */
     82  void addAction(const std::string &ActionName, const std::string &ActionDescription);
     83
     84  /** Adds a separator (e.g. horizontal line) to menu.
     85   *
     86   */
    7287  void addSeparator();
     88
     89  /** Adds a submenu to this menu.
     90   *
     91   * @param MenuName name of submenu
     92   * @param MenuPosition position in sequence of items of submenu
     93   */
    7394  void addSubmenu(const std::string &MenuName, const int MenuPosition);
     95
     96  /** Checks whether an item named \a token exists in this menu.
     97   *
     98   * @param token name of action of submenu
     99   * @return true - item exists, false - item does not exist in this menu
     100   */
    74101  bool isPresent(const std::string &token);
    75102
     103  //!> enumeration of all valid item types
    76104  enum ItemType {ActionItem, MenuItem, SeparatorItem, NoItem};
    77105
    78   int TopPosition;  // current position to add
    79   enum ItemType LastItem;  // check whether separator followed separator
    80   std::set <std::string> DuplicatesList;  // is used to check for duplicates
     106  //!> current position to add
     107  int TopPosition;
     108  //!> check whether separator followed separator
     109  enum ItemType LastItem;
     110  //!> is used to check for duplicates
     111  std::set <std::string> DuplicatesList;
    81112};
    82113
  • src/UIElements/Menu/Qt4/QtMenu.hpp

    rb73545 r7f1b51  
    1616
    1717#include <Qt/qaction.h>
     18
     19#include "Menu/Qt4/QMenu_tooltip.hpp"
    1820
    1921#include <iostream>
     
    103105  virtual void addActionItem(const std::string &token, const std::string &description)
    104106  {
    105     QAction *action = MenuInstance->addAction(QString(getNameWithAccelerator(description).c_str()));
     107    QAction *action = MenuInstance->addAction(QString(getNameWithAccelerator(token).c_str()));
     108    action->setToolTip(QString(description.c_str()));
     109    action->setWhatsThis(QString(description.c_str()));
    106110    QtMenuPipe *pipe = new QtMenuPipe(token,action);
    107111    QObject::connect(action, SIGNAL(triggered()),pipe,SLOT(called()));
     
    116120  virtual void addSubmenuItem(const std::string &token, const std::string &description)
    117121  {
    118     QMenu *Menu = MenuInstance->addMenu(QString(token.c_str()));
    119     QtMenu<QMenu> *NewMenu = new QtMenu<QMenu>(Menu, token);
     122    QMenu_tooltip *Menu = new QMenu_tooltip(QString(token.c_str()));
     123    MenuInstance->addMenu(Menu);
     124    QtMenu<QMenu_tooltip> *NewMenu = new QtMenu<QMenu_tooltip>(Menu, token);
    120125    NewMenu->init();
    121126  }
  • src/UIElements/Qt4/QtDialog.cpp

    rb73545 r7f1b51  
    4545using namespace std;
    4646
    47 QtDialog::QtDialog() :
    48     QDialog(0)
    49 {
     47QtDialog::QtDialog(const std::string &_title) :
     48    QDialog(0),
     49    Dialog(_title)
     50{
     51  setWindowTitle(QString(_title.c_str()));
    5052  // creating and filling of the Dialog window
    5153  mainLayout = new QVBoxLayout();
  • src/UIElements/Qt4/QtDialog.hpp

    rb73545 r7f1b51  
    3030  Q_OBJECT
    3131public:
    32   QtDialog();
     32  QtDialog(const std::string &_title);
    3333  virtual ~QtDialog();
    3434
  • src/UIElements/Qt4/QtMainWindow.cpp

    rb73545 r7f1b51  
    116116  toolbar = new QtToolBar(this);
    117117  glWorldView->addToolBarActions(toolbar);
     118  toolbar->addFavoriteActionItems(20);
    118119  addToolBar(toolbar);
    119120
  • src/UIElements/Qt4/QtUIFactory.cpp

    rb73545 r7f1b51  
    6767}
    6868
    69 Dialog* QtUIFactory::makeDialog() {
    70   return new QtDialog();
     69Dialog* QtUIFactory::makeDialog(const std::string &_title) {
     70  return new QtDialog(_title);
    7171}
    7272
  • src/UIElements/Qt4/QtUIFactory.hpp

    rb73545 r7f1b51  
    2626  virtual ~QtUIFactory();
    2727
    28   virtual Dialog* makeDialog();
     28  virtual Dialog* makeDialog(const std::string &_title);
    2929  virtual MainWindow* makeMainWindow();
    3030
  • src/UIElements/Qt4/Query/AtomsQtQuery.cpp

    rb73545 r7f1b51  
    4747    QtQueryList<const atom *>(_param, _parent, _dialog, temp)
    4848{
    49   ListQuerySubDialog *subDialog = new ListQuerySubDialog(this);
     49  ListQuerySubDialog *subDialog = new ListQuerySubDialog(this, _title);
    5050  subQuery = new AtomQtQuery(*subParam, _title, _description, thisVLayout, subDialog);
    5151  subDialog->setSubQuery(subQuery);
  • src/UIElements/Qt4/Query/DoublesQtQuery.cpp

    rb73545 r7f1b51  
    4747    QtQueryList<double>(_param, _parent, _dialog, temp)
    4848{
    49   ListQuerySubDialog *subDialog = new ListQuerySubDialog(this);
     49  ListQuerySubDialog *subDialog = new ListQuerySubDialog(this, _title);
    5050  subQuery = new DoubleQtQuery(*subParam, _title, _description, thisVLayout, subDialog);
    5151  subDialog->setSubQuery(subQuery);
  • src/UIElements/Qt4/Query/ElementsQtQuery.cpp

    rb73545 r7f1b51  
    4848    QtQueryList<const element *>(_param, _parent, _dialog, temp)
    4949{
    50   ListQuerySubDialog *subDialog = new ListQuerySubDialog(this);
     50  ListQuerySubDialog *subDialog = new ListQuerySubDialog(this, _title);
    5151  subQuery = new ElementQtQuery(*subParam, _title, _description, thisVLayout, subDialog);
    5252  subDialog->setSubQuery(subQuery);
  • src/UIElements/Qt4/Query/FileQtQuery.cpp

    rb73545 r7f1b51  
    4545#include "UIElements/Qt4/Query/QtQuery.hpp"
    4646
     47#include <algorithm>
     48#include <boost/filesystem.hpp>
     49
     50#include "Parameters/Validators/getFlatListFromHierarchyOfValidators.hpp"
     51#include "Parameters/Validators/Validator.hpp"
     52#include "Parameters/Validators/Specific/FilePresentValidator.hpp"
     53#include "Parameters/Validators/Specific/FileSuffixValidator.hpp"
     54#include "Parameters/Validators/Specific/ParserFileValidator.hpp"
    4755#include "Parser/ParserTypes.hpp"
    4856#include "Parser/FormatParserStorage.hpp"
     
    5159    QtQuery<boost::filesystem::path>(_param, _title, _description),
    5260    parent(_parent),
    53     dialog(_dialog)
     61    dialog(_dialog),
     62    mustBePresent(false)
    5463{
    5564  filenameLineEdit = new QLineEdit();
     
    5766  filenameLineEdit->setReadOnly(true);
    5867
    59   filenameLabel = new QLabel(QString("Input file:"));
     68  filenameLabel = new QLabel(QString(_title.c_str()));
    6069  filenameLabel->setBuddy(filenameLineEdit);
    6170  filenameLabel->setToolTip(QString(getDescription().c_str()));
     
    7180
    7281  QObject::connect(filedialogButton,SIGNAL(clicked()),this,SLOT(showFileDialog()));
     82
     83  // fill list of suffixes
     84  const Validator<boost::filesystem::path> &validator =
     85      _param.getValidator();
     86  typedef std::vector<std::pair<const Validator<boost::filesystem::path> *, bool> > validators_t;
     87  const validators_t validators =
     88      getFlatListFromHierarchyOfValidators<boost::filesystem::path>(validator);
     89  for (validators_t::const_iterator iter = validators.begin();
     90      iter != validators.end(); ++iter) {
     91    const Validator< boost::filesystem::path > &currentvalidator = *iter->first;
     92    if (dynamic_cast<const FileSuffixValidator * const>(&currentvalidator) != NULL)
     93      suffixes.push_back(dynamic_cast<const FileSuffixValidator &>(currentvalidator).getSuffix());
     94    if (dynamic_cast<const ParserFileValidator * const>(&currentvalidator) != NULL) {
     95      const std::vector<std::string> moresuffixes =
     96          dynamic_cast<const ParserFileValidator &>(currentvalidator).getSuffixes();
     97      suffixes.insert(suffixes.end(), moresuffixes.begin(), moresuffixes.end());
     98    }
     99    if (dynamic_cast<const FilePresentValidator * const>(&currentvalidator) != NULL)
     100      mustBePresent = iter->second;
     101  }
     102  std::sort(suffixes.begin(), suffixes.end());
    73103}
    74104
     
    93123    // gather all possible suffixes
    94124    QStringList filters;
    95     std::stringstream parsersuffixes;
    96     parsersuffixes << std::string("Config files (");
    97     for (ParserTypes t = ParserTypes_begin; t < ParserTypes_end; ++t){
    98       if (t != ParserTypes_begin)
    99         parsersuffixes << std::string(" ");
    100       parsersuffixes << std::string("*.") <<
    101           FormatParserStorage::getInstance().getSuffixFromType(t);
     125    std::stringstream filter_string;
     126    if (!suffixes.empty()) {
     127      filter_string << "Valid files (";
     128      for (std::vector<std::string>::const_iterator iter = suffixes.begin();
     129          iter != suffixes.end(); ++iter)
     130        filter_string << (iter == suffixes.begin() ? "*." : " *.") << *iter << " ";
     131      filter_string << ")";
     132      filters << tr(filter_string.str().c_str());
    102133    }
    103     parsersuffixes << std::string(")");
    104     filters << tr(parsersuffixes.str().c_str());
    105     filters << tr("Data files (*.dat)");
    106134    filters << tr("Any files (*)");
    107135    theFileDialog->setNameFilters(filters);
  • src/UIElements/Qt4/Query/FilesQtQuery.cpp

    rb73545 r7f1b51  
    4848    QtQueryList<boost::filesystem::path>(_param, _parent, _dialog, temp)
    4949{
    50   ListQuerySubDialog *subDialog = new ListQuerySubDialog(this);
     50  ListQuerySubDialog *subDialog = new ListQuerySubDialog(this, _title);
    5151  subQuery = new FileQtQuery(*subParam, _title, _description, thisVLayout, subDialog);
    5252  subDialog->setSubQuery(subQuery);
  • src/UIElements/Qt4/Query/IntsQtQuery.cpp

    rb73545 r7f1b51  
    4747    QtQueryList<int>(_param, _parent, _dialog, temp)
    4848{
    49   ListQuerySubDialog *subDialog = new ListQuerySubDialog(this);
     49  ListQuerySubDialog *subDialog = new ListQuerySubDialog(this, _title);
    5050  subQuery = new IntQtQuery(*subParam, _title, _description, thisVLayout, subDialog);
    5151  subDialog->setSubQuery(subQuery);
  • src/UIElements/Qt4/Query/MoleculesQtQuery.cpp

    rb73545 r7f1b51  
    4747    QtQueryList<const molecule *>(_param, _parent, _dialog, temp)
    4848{
    49   ListQuerySubDialog *subDialog = new ListQuerySubDialog(this);
     49  ListQuerySubDialog *subDialog = new ListQuerySubDialog(this, _title);
    5050  subQuery = new MoleculeQtQuery(*subParam, _title, _description, thisVLayout, subDialog);
    5151  subDialog->setSubQuery(subQuery);
  • src/UIElements/Qt4/Query/QtQuery.hpp

    rb73545 r7f1b51  
    211211  QFileDialog *theFileDialog;
    212212  Dialog *dialog;
     213  std::vector<std::string> suffixes;
     214  bool mustBePresent;
    213215};
    214216
  • src/UIElements/Qt4/Query/QtQueryList.hpp

    rb73545 r7f1b51  
    107107{
    108108public:
    109   ListQuerySubDialog(QtQueryListUntyped *_parent) : parent(_parent), sub(NULL){}
     109  ListQuerySubDialog(QtQueryListUntyped *_parent, const std::string &_title) :
     110    Dialog(_title),
     111    parent(_parent),
     112    sub(NULL)
     113  {}
    110114  virtual void update()
    111115  {
  • src/UIElements/Qt4/Query/StringsQtQuery.cpp

    rb73545 r7f1b51  
    4747    QtQueryList<std::string>(_param, _parent, _dialog, temp)
    4848{
    49   ListQuerySubDialog *subDialog = new ListQuerySubDialog(this);
     49  ListQuerySubDialog *subDialog = new ListQuerySubDialog(this, _title);
    5050  subQuery = new StringQtQuery(*subParam, _title, _description, thisVLayout, subDialog);
    5151  subDialog->setSubQuery(subQuery);
  • src/UIElements/Qt4/Query/UnsignedIntsQtQuery.cpp

    rb73545 r7f1b51  
    4747    QtQueryList<unsigned int>(_param, _parent, _dialog, temp)
    4848{
    49   ListQuerySubDialog *subDialog = new ListQuerySubDialog(this);
     49  ListQuerySubDialog *subDialog = new ListQuerySubDialog(this, _title);
    5050  subQuery = new UnsignedIntQtQuery(*subParam, _title, _description, thisVLayout, subDialog);
    5151  subDialog->setSubQuery(subQuery);
  • src/UIElements/Qt4/Query/VectorsQtQuery.cpp

    rb73545 r7f1b51  
    4848    QtQueryList<Vector>(_param, _parent, _dialog, temp)
    4949{
    50   ListQuerySubDialog *subDialog = new ListQuerySubDialog(this);
     50  ListQuerySubDialog *subDialog = new ListQuerySubDialog(this, _title);
    5151  subQuery = new VectorQtQuery(*subParam, _title, _description, thisVLayout, subDialog);
    5252  subDialog->setSubQuery(subQuery);
  • src/UIElements/TextUI/TextDialog.cpp

    rb73545 r7f1b51  
    4141
    4242
    43 TextDialog::TextDialog()
     43TextDialog::TextDialog(const std::string &_title) :
     44        Dialog(_title)
    4445{
    4546}
  • src/UIElements/TextUI/TextDialog.hpp

    rb73545 r7f1b51  
    2828{
    2929public:
    30   TextDialog();
     30  TextDialog(const std::string &_title);
    3131  virtual ~TextDialog();
    3232
  • src/UIElements/TextUI/TextUIFactory.cpp

    rb73545 r7f1b51  
    4646
    4747
    48 Dialog* TextUIFactory::makeDialog() {
    49   return new TextDialog();
     48Dialog* TextUIFactory::makeDialog(const std::string &_title) {
     49  return new TextDialog(_title);
    5050}
    5151
  • src/UIElements/TextUI/TextUIFactory.hpp

    rb73545 r7f1b51  
    2424  virtual ~TextUIFactory();
    2525
    26   virtual Dialog* makeDialog();
     26  virtual Dialog* makeDialog(const std::string &_title);
    2727  virtual MainWindow* makeMainWindow();
    2828
  • src/UIElements/UIFactory.hpp

    rb73545 r7f1b51  
    5656   * Again the type is determined upon factory creation.
    5757   */
    58   virtual Dialog* makeDialog()=0;
     58  virtual Dialog* makeDialog(const std::string &_title)=0;
    5959
    6060protected:
  • src/UIElements/Views/Qt4/Plotting/QSeisPlot.cpp

    rb73545 r7f1b51  
    4343    ASSERT(m_plottype != NULL,
    4444        "QSeisPlot::QSeisPlot() - could not find desired plottype by name "+type.toStdString()+".");
    45     std::cout << "Type is " << type.toStdString() << ", " << m_plottype << std::endl;
     45//    std::cout << "Type is " << type.toStdString() << ", " << m_plottype << std::endl;
    4646
    4747    //label axes
  • src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.cpp

    rb73545 r7f1b51  
    6969  }
    7070  World::getInstance().signOn(this, World::SelectionChanged);
    71   WorldTime::getInstance().signOn(this, WorldTime::TimeChanged);
    7271
    7372  // set the object's id
     
    8988  }
    9089  World::getInstance().signOff(this, World::SelectionChanged);
    91   WorldTime::getInstance().signOff(this, WorldTime::TimeChanged);
    9290}
    9391
     
    230228        break;
    231229    }
    232   } else {
    233     // notification from world
    234 #ifdef LOG_OBSERVER
    235     observerLog().addMessage() << "++ Update of Observer "<< observerLog().getName(static_cast<Observer *>(this))
    236           << " received notification from Worldtime for channel "
    237           << notification->getChannelNo() << ".";
    238 #endif
    239     switch (notification->getChannelNo()) {
    240       case WorldTime::TimeChanged:
    241         resetPosition();
    242         emit changed();
    243         break;
    244       default:
    245         break;
    246     }
    247230  }
    248231}
  • src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_atom.hpp

    rb73545 r7f1b51  
    2222#include "types.hpp"
    2323
     24class GLWorldScene;
     25
    2426class GLMoleculeObject_atom : public GLMoleculeObject, public Observer
    2527{
     
    4244  void indexChanged(GLMoleculeObject_atom *ob, int oldId, int newId);
    4345
    44 public:
     46private:
     47  //!> grant GLWorldScene acess to reset functions
     48  friend class GLWorldScene;
     49
    4550  void resetPosition();
    4651
  • src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_bond.hpp

    rb73545 r7f1b51  
    2323class atom;
    2424
     25class GLWorldScene;
     26
    2527class GLMoleculeObject_bond : public GLMoleculeObject, public Observer
    2628{
     
    4143
    4244private:
     45  //!> grant WorldScene access to reset functions
     46  friend class GLWorldScene;
     47
    4348  /** Recalculates the position of the cylinder representing the bond.
    4449   *
  • src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_shape.cpp

    rb73545 r7f1b51  
    8080  std::vector<Vector> points = shape.getHomogeneousPointsOnSurface(NumPointsonSurface);
    8181
    82   // Fill the points into a tesselate-able container.
    83   TesselPointSTLList Corners;
    84   for (size_t i=0;i<points.size();++i){
    85     TesselPoint *Walker = new TesselPoint;
    86     Walker->setPosition(points[i]);
    87     Walker->setName(toString(i));
    88     Walker->setNr(i);
    89     Corners.push_back(Walker);
    90   }
    91 
    92   // Tesselate the points.
    93   Tesselation *T = new Tesselation;
    94   PointCloudAdaptor<TesselPointSTLList> cloud(&Corners, "TesselPointSTLList");
    95   (*T)(cloud, minradius);
    96 
    97   // Fill the points into a Qt geometry.
    9882  QGeometryData geo;
    99   LinkedCell_deprecated LinkedList(cloud, minradius);
    100   std::vector<Vector> normals;
    101   normals.resize(points.size(), zeroVec);
    102   for(size_t i=0;i<points.size();++i){
    103     // add data to the primitive
    104     geo.appendVertex(QVector3D(points[i][0], points[i][1], points[i][2]));
    105     if (ShapeFactory::getInstance().isSimpleShape(shape.getType()))
    106       normals[i] = shape.getNormal(points[i]);
    107     else
    108       normals[i] = T->getNormal(points[i], &LinkedList);
    109     geo.appendNormal(QVector3D(normals[i][0], normals[i][1], normals[i][2]));
    110     geo.appendColor(QColor(1, 1, 1, 1));
    111     geo.appendTexCoord(QVector2D(0, 0));
    112   }
    113 
    114   // Fill the tesselated triangles into the geometry.
    115   for (TriangleMap::const_iterator runner = T->TrianglesOnBoundary.begin(); runner != T->TrianglesOnBoundary.end(); runner++) {
    116     int v[3];
    117     for (size_t i=0; i<3; ++i)
    118       v[i] = runner->second->endpoints[i]->node->getNr();
    119 
    120     // Sort the vertices so the triangle is clockwise (relative to the normal vector).
    121     Vector cross = points[v[1]] - points[v[0]];
    122     cross.VectorProduct(points[v[2]] - points[v[0]]);
    123     if (cross.ScalarProduct(normals[v[0]] + normals[v[1]] + normals[v[2]]) > 0)
    124       geo.appendIndices(v[0], v[1], v[2]);
    125     else
    126       geo.appendIndices(v[0], v[2], v[1]);
     83  // we need at least three points for tesselation
     84  if (points.size() >= 3) {
     85    // Fill the points into a tesselate-able container.
     86    TesselPointSTLList Corners;
     87    for (size_t i=0;i<points.size();++i){
     88      TesselPoint *Walker = new TesselPoint;
     89      Walker->setPosition(points[i]);
     90      Walker->setName(toString(i));
     91      Walker->setNr(i);
     92      Corners.push_back(Walker);
     93    }
     94 
     95    // Tesselate the points.
     96    Tesselation T;
     97    PointCloudAdaptor<TesselPointSTLList> cloud(&Corners, "TesselPointSTLList");
     98    T(cloud, minradius);
     99 
     100    // Fill the points into a Qt geometry.
     101    LinkedCell_deprecated LinkedList(cloud, minradius);
     102    std::vector<Vector> normals;
     103    normals.resize(points.size(), zeroVec);
     104    for(size_t i=0;i<points.size();++i){
     105      // add data to the primitive
     106      geo.appendVertex(QVector3D(points[i][0], points[i][1], points[i][2]));
     107      if (ShapeFactory::getInstance().isSimpleShape(shape.getType()))
     108        normals[i] = shape.getNormal(points[i]);
     109      else
     110        normals[i] = T.getNormal(points[i], &LinkedList);
     111      geo.appendNormal(QVector3D(normals[i][0], normals[i][1], normals[i][2]));
     112      geo.appendColor(QColor(1, 1, 1, 1));
     113      geo.appendTexCoord(QVector2D(0, 0));
     114    }
     115 
     116    // Fill the tesselated triangles into the geometry.
     117    for (TriangleMap::const_iterator runner = T.TrianglesOnBoundary.begin(); runner != T.TrianglesOnBoundary.end(); runner++) {
     118      int v[3];
     119      for (size_t i=0; i<3; ++i)
     120        v[i] = runner->second->endpoints[i]->node->getNr();
     121 
     122      // Sort the vertices so the triangle is clockwise (relative to the normal vector).
     123      Vector cross = points[v[1]] - points[v[0]];
     124      cross.VectorProduct(points[v[2]] - points[v[0]]);
     125      if (cross.ScalarProduct(normals[v[0]] + normals[v[1]] + normals[v[2]]) > 0)
     126        geo.appendIndices(v[0], v[1], v[2]);
     127      else
     128        geo.appendIndices(v[0], v[2], v[1]);
     129    }
    127130  }
    128131
  • src/UIElements/Views/Qt4/Qt3D/GLWorldScene.cpp

    rb73545 r7f1b51  
    9494  }
    9595
     96  connect(this, SIGNAL(updated()), this, SLOT(update()));
     97
    9698  setSelectionMode(SelectAtom);
    9799
     
    110112void GLWorldScene::init()
    111113{
    112   const std::vector<molecule*> &molecules = World::getInstance().getAllMolecules();
    113 
    114   if (molecules.size() > 0) {
    115     for (std::vector<molecule*>::const_iterator Runner = molecules.begin();
    116         Runner != molecules.end();
    117         Runner++) {
    118 
    119       for (molecule::const_iterator atomiter = (*Runner)->begin();
    120           atomiter != (*Runner)->end();
    121           ++atomiter) {
    122         // create atom objects in scene
     114  const std::vector<atom*> &atoms = World::getInstance().getAllAtoms();
     115
     116  if (atoms.size() > 0) {
     117    for (std::vector<atom*>::const_iterator atomiter = atoms.begin();
     118        atomiter != atoms.end();
     119        atomiter++) {
     120      // create atom objects in scene
     121      atomInserted((*atomiter)->getId());
     122
     123      // create bond objects in scene
     124      const BondList &bondlist = (*atomiter)->getListOfBonds();
     125      for (BondList::const_iterator bonditer = bondlist.begin();
     126          bonditer != bondlist.end();
     127          ++bonditer) {
     128        const bond::ptr _bond = *bonditer;
     129        const GLMoleculeObject_bond::SideOfBond side = (_bond->leftatom == *atomiter) ?
     130            GLMoleculeObject_bond::left : GLMoleculeObject_bond::right;
     131        bondInserted(_bond, side);
     132      }
     133    }
     134  }
     135}
     136
     137/** Update the WorldScene with molecules and atoms from World.
     138 *
     139 * This function should be called after e.g. WorldTime::TimeChanged was
     140 * received or after another molecule has been loaded.
     141 *
     142 */
     143void GLWorldScene::update()
     144{
     145  const std::vector<atom*> &atoms = World::getInstance().getAllAtoms();
     146
     147  if (atoms.size() > 0) {
     148    for (std::vector<atom*>::const_iterator atomiter = atoms.begin();
     149        atomiter != atoms.end();
     150        atomiter++) {
     151      // check whether atom already exists
     152      const atomId_t atomid = (*atomiter)->getId();
     153      const bool atom_present = AtomsinSceneMap.count(atomid);
     154      if (!atom_present)
    123155        atomInserted((*atomiter)->getId());
    124 
    125         // create bond objects in scene
    126         const BondList &bondlist = (*atomiter)->getListOfBonds();
    127         for (BondList::const_iterator bonditer = bondlist.begin();
    128             bonditer != bondlist.end();
    129             ++bonditer) {
    130           const bond::ptr _bond = *bonditer;
    131           const GLMoleculeObject_bond::SideOfBond side = (_bond->leftatom == *atomiter) ?
    132               GLMoleculeObject_bond::left : GLMoleculeObject_bond::right;
     156      else
     157        AtomsinSceneMap[atomid]->resetPosition();
     158
     159
     160      // create bond objects in scene
     161      const BondList &bondlist = (*atomiter)->getListOfBonds();
     162      for (BondList::const_iterator bonditer = bondlist.begin();
     163          bonditer != bondlist.end();
     164          ++bonditer) {
     165        const bond::ptr _bond = *bonditer;
     166        const GLMoleculeObject_bond::SideOfBond side = (_bond->leftatom == *atomiter) ?
     167            GLMoleculeObject_bond::left : GLMoleculeObject_bond::right;
     168        bool bond_present = false;
     169        const BondIds ids = getBondIds(_bond,side);
     170        if (atom_present) {
     171          // check whether bond is not present already
     172          bond_present = BondsinSceneMap.count(ids);
     173        }
     174        if (!bond_present)
    133175          bondInserted(_bond, side);
     176        else {
     177          BondsinSceneMap[ids]->resetPosition();
     178          BondsinSceneMap[ids]->resetWidth();
    134179        }
    135180      }
     
    246291}
    247292
    248 /** Adds a bond to the scene.
    249  *
    250  * @param _bond bond to add
    251  * @param side which side of the bond (left or right)
    252  */
    253 void GLWorldScene::bondInserted(const bond::ptr _bond, const enum GLMoleculeObject_bond::SideOfBond side)
    254 {
    255   LOG(3, "INFO: GLWorldScene::bondInserted() - Adding bond "+toString(*_bond)+".");
    256   //LOG(4, "INFO: Currently present bonds " << BondsinSceneMap << ".");
    257 
     293/** Helper function to get bond ids in the correct order for BondNodeMap.
     294 *
     295 * \return pair of ids in correct order.
     296 */
     297GLWorldScene::BondIds GLWorldScene::getBondIds(
     298    const bond::ptr _bond,
     299    const enum GLMoleculeObject_bond::SideOfBond _side) const
     300{
    258301  BondIds ids;
    259   switch (side) {
     302  switch (_side) {
    260303    case GLMoleculeObject_bond::left:
    261304      ids = std::make_pair(_bond->leftatom->getId(), _bond->rightatom->getId());
     
    265308      break;
    266309  }
    267 #ifndef NDEBUG
     310  return ids;
     311}
     312
     313/** Adds a bond to the scene.
     314 *
     315 * @param _bond bond to add
     316 * @param side which side of the bond (left or right)
     317 */
     318void GLWorldScene::bondInserted(const bond::ptr _bond, const enum GLMoleculeObject_bond::SideOfBond _side)
     319{
     320  LOG(3, "INFO: GLWorldScene::bondInserted() - Adding bond "+toString(*_bond)+".");
     321  //LOG(4, "INFO: Currently present bonds " << BondsinSceneMap << ".");
     322
     323  const BondIds ids = getBondIds(_bond, _side);
    268324  BondNodeMap::iterator iter = BondsinSceneMap.find(ids);
    269   ASSERT(iter == BondsinSceneMap.end(),
    270       "GLWorldScene::bondAdded() - same left-sided bond "+toString(*_bond)+" added again.");
    271 #endif
    272   GLMoleculeObject_bond * bondObject =
    273       new GLMoleculeObject_bond(meshCylinder, this, _bond, side);
    274   connect (
    275       bondObject, SIGNAL(BondRemoved(const atomId_t, const atomId_t)),
    276       this, SLOT(bondRemoved(const atomId_t, const atomId_t)));
    277   connect (bondObject, SIGNAL(changed()), this, SIGNAL(changed()));
    278   BondsinSceneMap.insert( make_pair(ids, bondObject) );
    279 //    BondIdsinSceneMap.insert( Leftids );
     325  if (iter == BondsinSceneMap.end()) {
     326    GLMoleculeObject_bond * bondObject =
     327        new GLMoleculeObject_bond(meshCylinder, this, _bond, _side);
     328    connect (
     329        bondObject, SIGNAL(BondRemoved(const atomId_t, const atomId_t)),
     330        this, SLOT(bondRemoved(const atomId_t, const atomId_t)));
     331    connect (bondObject, SIGNAL(changed()), this, SIGNAL(changed()));
     332    BondsinSceneMap.insert( make_pair(ids, bondObject) );
     333  //    BondIdsinSceneMap.insert( Leftids );
     334  } else {
     335    iter->second->resetPosition();
     336    iter->second->resetWidth();
     337  }
    280338  emit changeOccured();
    281339}
  • src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp

    rb73545 r7f1b51  
    6868signals:
    6969  void changed();
     70  void updated();
    7071  void changeOccured();
    7172  void pressed();
     
    9091  void addShape();
    9192  void removeShape();
     93  void update();
    9294
    9395public:
     
    100102  typedef std::pair< atomId_t, atomId_t> BondIds;
    101103  friend std::ostream &operator<<(std::ostream &ost, const BondIds &t);
     104
     105  BondIds getBondIds(
     106      const bond::ptr _bond,
     107      const enum GLMoleculeObject_bond::SideOfBond side) const;
    102108
    103109  typedef std::map< atomId_t, GLMoleculeObject_atom* > AtomNodeMap;
  • src/UIElements/Views/Qt4/Qt3D/GLWorldView.cpp

    rb73545 r7f1b51  
    8282  connect(this, SIGNAL(ShapeAdded()), worldscene, SLOT(addShape()));
    8383  connect(this, SIGNAL(ShapeRemoved()), worldscene, SLOT(removeShape()));
     84  connect(this, SIGNAL(TimeChanged()), worldscene, SIGNAL(updated()));
    8485  connect(worldscene, SIGNAL(changeOccured()), this, SLOT(changeSignalled()));
    8586  connect(worldscene, SIGNAL(changed()), this, SIGNAL(changed()));
     
    393394#endif
    394395        emit changed();
     396        emit TimeChanged();
    395397        break;
    396398      }
  • src/UIElements/Views/Qt4/Qt3D/GLWorldView.hpp

    rb73545 r7f1b51  
    5757signals:
    5858  void changed();
     59  void TimeChanged();
    5960  void atomInserted(const atomicNumber_t _id);
    6061  void atomRemoved(const atomicNumber_t _id);
  • src/UIElements/Views/Qt4/QtHomologyList.cpp

    rb73545 r7f1b51  
    4141#include <QtGui/QTreeWidget>
    4242#include <QtGui/QTabWidget>
    43 #include<Qt/qsplitter.h>
     43#include <Qt/qsplitter.h>
     44#include <Qt/qboxlayout.h>
    4445
    4546#include "CodePatterns/MemDebug.hpp"
     
    7374    potentialregistry_enabled(false)
    7475{
     76  QVBoxLayout* layout = new QVBoxLayout(this);
    7577  QSplitter *splitter = new QSplitter (Qt::Horizontal, this );
     78  layout->addWidget(splitter);
     79
     80  // tree widget
    7681  treewidget = new QTreeWidget (splitter);
     82  treewidget->setSelectionMode( QTreeWidget::SingleSelection );
     83  treewidget->setColumnCount(COLUMNCOUNT);
     84  QStringList header;
     85  for(int i=0; i<COLUMNCOUNT;++i)
     86    header << COLUMNNAMES[i];
     87  treewidget->setHeaderLabels(header);
    7788  splitter->addWidget(treewidget);
    7889
     90  // plot widget
    7991#ifdef HAVE_QWT
    8092  widget = new QSeisPlotPage ("energy", splitter);
     
    8496#endif
    8597  splitter->addWidget(widget);
    86 //  splitter->setStretchFactor(10, 1);
    87 
    88   treewidget->setSelectionMode( QTreeWidget::SingleSelection );
    89 
    90   treewidget->setColumnCount(COLUMNCOUNT);
    91   QStringList header;
    92         for(int i=0; i<COLUMNCOUNT;++i)
    93           header << COLUMNNAMES[i];
    94         treewidget->setHeaderLabels(header);
    9598
    9699        dirty = true;
     
    198201        const EmpiricalPotential &potential = dynamic_cast<const EmpiricalPotential &>(**potiter);
    199202        const std::string potentialname = potential.getName();
     203        const FunctionModel::filter_t filter = potential.getSpecificFilter();
    200204        Coordinator::ptr coordinator = potential.getCoordinator();
    201205        // then we need to sample the potential
    202206        xvalues.clear();
    203207        for (TrainingData::InputVector_t::const_iterator inputiter = inputs.begin();
    204             inputiter != inputs.end(); ++inputiter)
    205           xvalues.push_back((*coordinator)(*inputiter));
    206 
    207         // We need to sort the xvalues (and yvalues also)
     208            inputiter != inputs.end(); ++inputiter) {
     209          const FunctionModel::list_of_arguments_t specificargs = filter(*inputiter);
     210          double average = 0.;
     211          for (FunctionModel::list_of_arguments_t::const_iterator argiter = specificargs.begin();
     212              argiter != specificargs.end(); ++argiter) {
     213            const FunctionModel::arguments_t args = *argiter;
     214            average += (*coordinator)(args);
     215          }
     216          if (specificargs.size() > 1) {
     217            const size_t index =  xvalues.size();
     218            xvalues.push_back(average/(double)specificargs.size());
     219            yvalues[index] *= 1./(double)specificargs.size();
     220          }
     221        }
     222
     223        // We need to sort the xvalues (and associated yvalues also)
    208224        std::vector<double>::const_iterator xiter = xvalues.begin();
    209225        std::vector<double>::const_iterator yiter = yvalues.begin();
  • src/UIElements/Views/Qt4/QtMoleculeList.cpp

    rb73545 r7f1b51  
    128128      formula.push_back((*iter)->getFormula());
    129129      groupItem = new QTreeWidgetItem(this);
    130       groupItem->setText(0, QString((*iter)->getName().c_str()));
    131       groupItem->setText(1, QString::number((*iter)->getAtomCount()));
    132       groupItem->setText(2, QString((*iter)->getFormula().toString().c_str()));
     130      groupItem->setText(0, QString("default"));
     131      groupItem->setText(1, QString::number(0));
     132      groupItem->setText(2, QString(""));
    133133      groupItem->setText(3, "0");
    134134      groupItem->setData(0, Qt::UserRole, QVariant(-1));
  • src/UIElements/Views/Qt4/QtToolBar.cpp

    rb73545 r7f1b51  
    4444  QToolBar(_parent)
    4545{
    46   addActionItem("undo", "undo", "edit-undo");
    47   addActionItem("redo", "redo", "edit-redo");
     46  addActionItem("undo", "undo the last Action", "edit-undo");
     47  addActionItem("redo", "redo the last Action", "edit-redo");
    4848}
    4949
     
    5757{
    5858  QAction *action = addAction(QString(description.c_str()));
    59   action->setIcon(QIcon::fromTheme(QString(icon_name.c_str())));
     59  action->setIcon(FavActions.getIcon(token, icon_name));
     60  action->setToolTip(QString(description.c_str()));
    6061  QtMenuPipe *pipe = new QtMenuPipe(token,action);
    6162  QObject::connect(action, SIGNAL(triggered()),pipe,SLOT(called()));
    6263  plumbing.push_back(pipe);
     64  present_actions.insert( token );
    6365}
     66
     67void QtToolBar::addFavoriteActionItems(const unsigned int _max)
     68{
     69  // separate favorite actions
     70  addSeparator();
     71  FavActions.addToolBarActions(*this, _max);
     72}
     73
  • src/UIElements/Views/Qt4/QtToolBar.hpp

    rb73545 r7f1b51  
    2020#include "Menu/Qt4/QtMenuPipe.hpp"
    2121
     22#include <map>
     23#include <set>
     24#include <string>
     25
     26#include "CodePatterns/Observer/Observer.hpp"
     27
    2228
    2329class QtToolBar : public QToolBar
     
    2834  virtual ~QtToolBar();
    2935
     36  /** Adds an action named \a token to the toolbar.
     37   *
     38   * @param token token of Action
     39   * @param description description to appear as tooltip
     40   * @param icon_name name of icon
     41   */
     42  void addActionItem(const std::string &token, const std::string &description, const std::string &icon_name);
     43
     44  /** Function to add a set of favorite actions.
     45   *
     46   * @param _max maximum number of actions to add
     47   */
     48  void addFavoriteActionItems(const unsigned int _max);
     49
     50  //!> typedef for a set of action tokens
     51  typedef std::set<std::string> present_actions_t;
     52
     53  /** Getter for current set of present action on this toolbar.
     54   *
     55   * @return set of action tokens
     56   */
     57  const present_actions_t & getPresentActions() const
     58  { return present_actions; }
     59
    3060private:
    3161  std::list<QtMenuPipe*> plumbing;
    3262
    33   void addActionItem(const std::string &token, const std::string &description, const std::string &icon_name);
     63  /** This class knows about all Actions being called and stores their frequency.
     64   *
     65   * This is used to know about the topmost used Actions and creating placeholder
     66   * toolbar icons for these on program launch.
     67   *
     68   */
     69  class QtFavoriteActions : public Observer
     70  {
     71  public:
     72    QtFavoriteActions();
     73    ~QtFavoriteActions();
    3474
     75    void addToolBarActions(
     76        QtToolBar &_toolbar,
     77        const unsigned int _max) const;
     78
     79    void update(Observable *publisher);
     80    void subjectKilled(Observable *publisher);
     81    void recieveNotification(Observable *publisher, Notification_ptr notification);
     82
     83    QIcon getIcon(
     84        const std::string &_token,
     85        const std::string &_icon_name
     86        ) const;
     87
     88  private:
     89    QIcon createIconPlaceholder(
     90        const std::string &_token
     91        ) const;
     92
     93  private:
     94    //!> typedef for the action counts
     95    typedef std::map<std::string, unsigned int> ActionCounts_t;
     96    //!> map counts how often each action has been called
     97    ActionCounts_t ActionCounts;
     98    //!> sign in to ActionQueue?
     99    bool ActionQueue_observing;
     100  };
     101
     102  //!> instance dealing with favorite action icons
     103  QtFavoriteActions FavActions;
     104
     105  //!> set of already present action icons
     106  present_actions_t present_actions;
    35107};
    36108
  • src/World.cpp

    rb73545 r7f1b51  
    194194}
    195195
     196bool areBondsPresent(const unsigned int _step)
     197{
     198  bool status = false;
     199
     200  for (World::AtomConstIterator iter = const_cast<const World &>(World::getInstance()).getAtomIter();
     201      (!status) && (iter != const_cast<const World &>(World::getInstance()).atomEnd()); ++iter) {
     202    const atom * const Walker = *iter;
     203    status |= !Walker->getListOfBondsAtStep(_step).empty();
     204  }
     205
     206  return status;
     207}
     208
     209void copyBondgraph(const unsigned int _srcstep, const unsigned int _deststep)
     210{
     211  // gather all bonds from _srcstep
     212  std::set<bond *> SetOfBonds;
     213  for (World::AtomConstIterator iter = const_cast<const World &>(World::getInstance()).getAtomIter();
     214      iter != const_cast<const World &>(World::getInstance()).atomEnd(); ++iter) {
     215    const atom * const Walker = *iter;
     216    const BondList bonds = Walker->getListOfBondsAtStep(_srcstep);
     217    BOOST_FOREACH( bond::ptr bondptr, bonds) {
     218      SetOfBonds.insert(bondptr.get());
     219    }
     220  }
     221  LOG(4, "DEBUG: We gathered " << SetOfBonds.size() << " bonds in total.");
     222
     223  // copy bond to new time step
     224  for (std::set<bond *>::const_iterator bonditer = SetOfBonds.begin();
     225      bonditer != SetOfBonds.end(); ++bonditer) {
     226    const atom * const Walker = (*bonditer)->leftatom;
     227    const atom * const OtherWalker = (*bonditer)->rightatom;
     228    const_cast<atom *>(Walker)->addBond(_deststep, const_cast<atom *>(OtherWalker));
     229  }
     230}
     231
    196232void World::setTime(const unsigned int _step)
    197233{
    198234  if (_step != WorldTime::getTime()) {
     235    const unsigned int oldstep = WorldTime::getTime();
    199236    // set new time
    200237    WorldTime::getInstance().setTime(_step);
     
    207244      destroyMolecule(*iter);
    208245    }
    209     // 2. (re-)create bondgraph
    210     AtomComposite Set = getAllAtoms();
    211     BG->CreateAdjacency(Set);
     246    // 2. copy bond graph
     247    if (!areBondsPresent(_step)) {
     248//      AtomComposite Set = getAllAtoms();
     249//      BG->cleanAdjacencyList(Set);
     250      copyBondgraph(oldstep, _step);
     251    }
    212252
    213253    // 3. scan for connected subgraphs => molecules
  • tests/Python/AllActions/options.dat

    rb73545 r7f1b51  
    9191interpolation-degree    "5"
    9292interpolation-steps     "9"
     93keep-bondgraph  "1"
    9394keep-fixed-CenterOfMass "0"
    9495load    "test.data"
  • tests/regression/Options/Warranty/testsuite-options-warranty.at

    rb73545 r7f1b51  
    2121AT_KEYWORDS([options warranty])
    2222AT_CHECK([../../molecuilder --warranty], 0, [stdout], [ignore])
    23 AT_CHECK([fgrep "statement concerning warranty" stdout], 0, [ignore], [ignore])
    2423AT_CHECK([fgrep "WITHOUT ANY WARRANTY" stdout], 0, [ignore], [ignore])
    2524AT_CLEANUP
Note: See TracChangeset for help on using the changeset viewer.