Ignore:
Timestamp:
Sep 15, 2014, 3:05:28 PM (11 years ago)
Author:
Frederik Heber <heber@…>
Branches:
Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
Children:
7e1a88
Parents:
b73545 (diff), 8859b5 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'GUI_Fixes' into stable

Location:
src/UIElements/Views/Qt4
Files:
1 added
13 edited

Legend:

Unmodified
Added
Removed
  • 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
Note: See TracChangeset for help on using the changeset viewer.