Ignore:
File:
1 edited

Legend:

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

    r0741f4d rd7cad1  
    5555// these attributes are skipped so far
    5656const int QtMoleculeList::COLUMNCOUNT = COLUMNTYPES_MAX;
    57 const char *QtMoleculeList::COLUMNNAMES[QtMoleculeList::COLUMNCOUNT]={"Name","Atoms","Formula","Occurrence"/*,"Size"*/};
     57const char *QtMoleculeList::COLUMNNAMES[QtMoleculeList::COLUMNCOUNT]={"Name","Visibility", "Atoms","Formula","Occurrence"/*,"Size"*/};
    5858
    5959QtMoleculeList::QtMoleculeList(QWidget * _parent) :
     
    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
     
    8182  //connect(this,SIGNAL(cellChanged(int,int)),this,SLOT(moleculeChanged(int,int)));
    8283  connect(selectionModel(),SIGNAL(selectionChanged(QItemSelection, QItemSelection)),this,SLOT(rowsSelected(QItemSelection, QItemSelection)));
    83 
     84  connect(this, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(visibilityChanged(QTreeWidgetItem*, int)));
    8485}
    8586
    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);
    130       groupItem->setText(0, QString("default"));
    131       groupItem->setText(1, QString::number(0));
    132       groupItem->setText(2, QString(""));
    133       groupItem->setText(3, "0");
     139      formula.insert( std::make_pair(molecule_formula, groupItem) );
     140      // fill item
     141      groupItem->setText(NAME, QString("default"));
     142      groupItem->setFlags((groupItem->flags() | Qt::ItemIsUserCheckable) ^ Qt::ItemIsSelectable);
     143      groupItem->setCheckState(VISIBILITY, Qt::Unchecked);
     144      groupItem->setText(ATOMCOUNT, QString::number(0));
     145      groupItem->setText(FORMULA, QString(""));
     146      groupItem->setText(OCCURRENCE, "0");
    134147      groupItem->setData(0, Qt::UserRole, QVariant(-1));
     148    } else {
     149      groupItem = formulaiter->second;
    135150    }
    136151
    137152    // add molecule
    138153    QTreeWidgetItem *molItem = new QTreeWidgetItem(groupItem);
    139     molItem->setText(0, QString((*iter)->getName().c_str()));
    140     molItem->setText(1, QString::number((*iter)->getAtomCount()));
    141     molItem->setText(2, QString((*iter)->getFormula().toString().c_str()));
     154    molItem->setText(NAME, QString((*iter)->getName().c_str()));
     155    molItem->setFlags(molItem->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable);
     156    molItem->setCheckState(VISIBILITY, Qt::Unchecked);
     157    molItem->setText(ATOMCOUNT, QString::number((*iter)->getAtomCount()));
     158    molItem->setText(FORMULA, QString(molecule_formula.c_str()));
    142159    const int index = (*iter)->getId();
    143160    molItem->setData(0, Qt::UserRole, QVariant(index));
    144161    molItem->setSelected(World::getInstance().isSelected(*iter));
    145162
    146 
    147163    // increase group occurrence
    148     int count = groupItem->text(3).toInt() + 1;
    149     groupItem->setText(3, QString::number(count));
     164    int count = groupItem->text(OCCURRENCE).toInt() + 1;
     165    groupItem->setText(OCCURRENCE, QString::number(count));
    150166  }
    151167  dirty = false;
     
    161177
    162178void QtMoleculeList::subjectKilled(Observable *publisher) {
     179}
     180
     181void QtMoleculeList::visibilityChanged(QTreeWidgetItem* item, int column)
     182{
     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    }
    163246}
    164247
     
    185268  // Select all molecules which belong to newly selected rows.
    186269  QModelIndex index;
    187   QModelIndexList items = selected.indexes();
    188   foreach (index, items)
    189     if (index.column() == 0){
    190       int mol_id = model()->data(index, Qt::UserRole).toInt();
    191       if (mol_id < 0)
    192         continue;
    193       //std::cout << "select molecule" << std::endl;
    194       MoleCuilder::SelectionMoleculeById(mol_id);
    195     }
     270  {
     271    QModelIndexList items = selected.indexes();
     272    molids_t ids;
     273    ids.reserve(items.size());
     274    foreach (index, items)
     275      if (index.column() == 0){
     276        int mol_id = model()->data(index, Qt::UserRole).toInt();
     277        if (mol_id < 0)
     278          continue;
     279        ids.push_back(mol_id);
     280        //std::cout << "select molecule" << std::endl;
     281      }
     282    MoleCuilder::SelectionMoleculeById(ids);
     283  }
    196284
    197285  // Unselect all molecules which belong to newly unselected rows.
    198   items = deselected.indexes();
    199   foreach (index, items)
    200     if (index.column() == 0){
    201       int mol_id = model()->data(index, Qt::UserRole).toInt();
    202       if (mol_id < 0)
    203         continue;
    204       //std::cout << "unselect molecule" << std::endl;
    205       MoleCuilder::SelectionNotMoleculeById(mol_id);
    206     }
     286  {
     287    QModelIndexList items = deselected.indexes();
     288    molids_t ids;
     289    ids.reserve(items.size());
     290    foreach (index, items)
     291      if (index.column() == 0){
     292        int mol_id = model()->data(index, Qt::UserRole).toInt();
     293        if (mol_id < 0)
     294          continue;
     295        //std::cout << "unselect molecule" << std::endl;
     296        ids.push_back(mol_id);
     297      }
     298    MoleCuilder::SelectionNotMoleculeById(ids);
     299  }
    207300
    208301  selecting = false;
Note: See TracChangeset for help on using the changeset viewer.