Ignore:
Timestamp:
Jan 10, 2015, 5:14:32 PM (10 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:
7b93f9
Parents:
9a7ef9
git-author:
Frederik Heber <heber@…> (11/16/14 16:31:35)
git-committer:
Frederik Heber <heber@…> (01/10/15 17:14:32)
Message:

Molecule's Visibility can be changed "group-wise".

  • FIX: Removed this funny clear() on update() signal. Also using notifications now, which appear less often.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/UIElements/Views/Qt4/QtMoleculeList.cpp

    r9a7ef9 r3eb91c  
    6969  setHeaderLabels(header);
    7070
    71   World::getInstance().signOn(this);//, World::MoleculeInserted);
    72   //World::getInstance().signOn(this, World::MoleculeRemoved);
     71  World::getInstance().signOn(this, World::MoleculeInserted);
     72  World::getInstance().signOn(this, World::MoleculeRemoved);
    7373
    7474
     
    7676  clearing = false;
    7777  selecting = false;
     78  ChangingChildrensVisibility = false;
    7879  refill();
    7980
     
    8687QtMoleculeList::~QtMoleculeList()
    8788{
    88   World::getInstance().signOff(this);//, World::MoleculeInserted);
    89   //World::getInstance().signOff(this, World::MoleculeRemoved);
     89  World::getInstance().signOff(this, World::MoleculeInserted);
     90  World::getInstance().signOff(this, World::MoleculeRemoved);
    9091}
    9192
    9293void QtMoleculeList::update(Observable *publisher) {
     94  ASSERT(0,
     95      "QtMoleculeList::update() - we did not sign up for any global updates.");
     96}
     97
     98void QtMoleculeList::recieveNotification(Observable *publisher, Notification_ptr notification) {
    9399
    94100  if (selecting)
     
    96102
    97103  dirty = true;
    98 
    99   // force an update from Qt...
    100   clearing = true;
    101   clear();
    102   clearing = false;
    103 }
     104}
     105
    104106
    105107void QtMoleculeList::refill() {
     
    108110
    109111  clear();
    110 
    111   // list of (unique) formulas in the world
    112   std::vector<Formula> formula;
     112  formula.clear();
     113  FormulaVisibilityCountMap.clear();
    113114
    114115  for (std::vector<molecule*>::const_iterator iter = molecules.begin();
     
    118119    // find group if already in list
    119120    QTreeWidgetItem *groupItem = NULL;
    120     for (unsigned int j=0;j<formula.size();j++)
    121       if ((*iter)->getFormula() == formula[j]){
    122         groupItem = topLevelItem(j);
    123         break;
    124       }
     121    const std::string &molecule_formula = (*iter)->getFormula().toString();
     122    FormulaTreeItemMap_t::const_iterator formulaiter =
     123        formula.find(molecule_formula);
    125124
    126125    // new molecule type -> create new group
    127     if (!groupItem){
    128       formula.push_back((*iter)->getFormula());
     126    if (formulaiter == formula.end()){
     127      // insert new formula entry into visibility
     128#ifndef NDEBUG
     129      std::pair< FormulaVisibilityCountMap_t::iterator, bool> visibilityinserter =
     130#endif
     131          FormulaVisibilityCountMap.insert(
     132              std::make_pair( molecule_formula, (unsigned int)0) );
     133      ASSERT( visibilityinserter.second,
     134          "QtMoleculeList::refill() - molecule with formula "
     135          +molecule_formula+" already in FormulaVisibilityCountMap.");
     136
     137      // create item and place into Map with formula as key
    129138      groupItem = new QTreeWidgetItem(this);
     139      formula.insert( std::make_pair(molecule_formula, groupItem) );
     140      // fill item
    130141      groupItem->setText(NAME, QString("default"));
    131 //      groupItem->setFlags(groupItem->flags() | Qt::ItemIsUserCheckable);
    132 //      groupItem->setCheckState(VISIBILITY, Qt::Checked);
     142      groupItem->setFlags((groupItem->flags() | Qt::ItemIsUserCheckable) ^ Qt::ItemIsSelectable);
     143      groupItem->setCheckState(VISIBILITY, Qt::Unchecked);
    133144      groupItem->setText(ATOMCOUNT, QString::number(0));
    134145      groupItem->setText(FORMULA, QString(""));
    135146      groupItem->setText(OCCURRENCE, "0");
    136147      groupItem->setData(0, Qt::UserRole, QVariant(-1));
     148    } else {
     149      groupItem = formulaiter->second;
    137150    }
    138151
     
    140153    QTreeWidgetItem *molItem = new QTreeWidgetItem(groupItem);
    141154    molItem->setText(NAME, QString((*iter)->getName().c_str()));
    142     molItem->setFlags(groupItem->flags() | Qt::ItemIsUserCheckable);
     155    molItem->setFlags(molItem->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable);
    143156    molItem->setCheckState(VISIBILITY, Qt::Unchecked);
    144157    molItem->setText(ATOMCOUNT, QString::number((*iter)->getAtomCount()));
    145     molItem->setText(FORMULA, QString((*iter)->getFormula().toString().c_str()));
     158    molItem->setText(FORMULA, QString(molecule_formula.c_str()));
    146159    const int index = (*iter)->getId();
    147160    molItem->setData(0, Qt::UserRole, QVariant(index));
     
    149162
    150163    // increase group occurrence
    151     int count = groupItem->text(4).toInt() + 1;
     164    int count = groupItem->text(OCCURRENCE).toInt() + 1;
    152165    groupItem->setText(OCCURRENCE, QString::number(count));
    153166  }
     
    168181void QtMoleculeList::visibilityChanged(QTreeWidgetItem* item, int column)
    169182{
    170   if (column == VISIBILITY) {
    171     const moleculeId_t molid = item->data(0, Qt::UserRole).toInt();
    172     const bool visible = item->checkState(VISIBILITY);
    173     emit moleculesVisibilityChanged(molid, visible);
    174   }
     183  if ((!clearing) && (!ChangingChildrensVisibility))
     184    if (column == VISIBILITY) {
     185      const moleculeId_t molid = item->data(0, Qt::UserRole).toInt();
     186      const bool visible = item->checkState(VISIBILITY);
     187      if (molid != (unsigned int)-1) { // molecule item
     188        const molecule * const _molecule =
     189            World::getInstance().getMolecule(MoleculeById(molid));
     190        ASSERT( _molecule != NULL,
     191            "QtMoleculeList::visibilityChanged() - molecule with id "
     192            +toString(molid)+" is not known to World.");
     193        const std::string &molecule_formula = _molecule->getFormula().toString();
     194        ASSERT( FormulaVisibilityCountMap.count(molecule_formula) != 0,
     195            "QtMoleculeList::visibilityChanged() - molecule with formula " +molecule_formula
     196            +" is not present in FormulaVisibilityCountMap.");
     197
     198        // get parent
     199        QTreeWidgetItem *groupItem = item->parent();
     200        ASSERT( groupItem != NULL,
     201            "QtMoleculeList::visibilityChanged() - item with id "+toString(molid)
     202            +" has not parent?");
     203        // check whether we have to set the group item
     204
     205        ChangingChildrensVisibility = true;
     206        if (visible) {
     207          ++(FormulaVisibilityCountMap[molecule_formula]);
     208          // compare with occurence/total number of molecules
     209          if (FormulaVisibilityCountMap[molecule_formula] ==
     210              (unsigned int)(groupItem->text(OCCURRENCE).toInt()))
     211            groupItem->setCheckState(VISIBILITY, Qt::Checked);
     212        } else {
     213          --(FormulaVisibilityCountMap[molecule_formula]);
     214          // none selected anymore?
     215          if (FormulaVisibilityCountMap[molecule_formula] == 0)
     216            groupItem->setCheckState(VISIBILITY, Qt::Unchecked);
     217        }
     218        ChangingChildrensVisibility = false;
     219
     220        emit moleculesVisibilityChanged(molid, visible);
     221
     222      } else { // group item
     223
     224        // go through all children, but don't enter for groupItem once more
     225        ChangingChildrensVisibility = true;
     226        for (int i=0;i<item->childCount();++i) {
     227          QTreeWidgetItem *molItem = item->child(i);
     228          const moleculeId_t molid = molItem->data(0, Qt::UserRole).toInt();
     229          ASSERT( molid != (unsigned int)-1,
     230              "QtMoleculeList::visibilityChanged() - to child with index"
     231              +toString(i)+" there is no molecule?");
     232          molItem->setCheckState(VISIBILITY, visible ? Qt::Checked : Qt::Unchecked);
     233
     234          // emit signal
     235          emit moleculesVisibilityChanged(molid, visible);
     236        }
     237        // set current number of visible children
     238        const std::string molecule_formula =
     239            item->text(FORMULA).toStdString();
     240        FormulaVisibilityCountMap[molecule_formula] =
     241            visible ? item->text(OCCURRENCE).toInt() : 0;
     242
     243        ChangingChildrensVisibility = false;
     244      }
     245    }
    175246}
    176247
Note: See TracChangeset for help on using the changeset viewer.