Ignore:
File:
1 edited

Legend:

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

    rd7cad1 r0741f4d  
    5555// these attributes are skipped so far
    5656const int QtMoleculeList::COLUMNCOUNT = COLUMNTYPES_MAX;
    57 const char *QtMoleculeList::COLUMNNAMES[QtMoleculeList::COLUMNCOUNT]={"Name","Visibility", "Atoms","Formula","Occurrence"/*,"Size"*/};
     57const char *QtMoleculeList::COLUMNNAMES[QtMoleculeList::COLUMNCOUNT]={"Name","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;
    7978  refill();
    8079
     
    8281  //connect(this,SIGNAL(cellChanged(int,int)),this,SLOT(moleculeChanged(int,int)));
    8382  connect(selectionModel(),SIGNAL(selectionChanged(QItemSelection, QItemSelection)),this,SLOT(rowsSelected(QItemSelection, QItemSelection)));
    84   connect(this, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(visibilityChanged(QTreeWidgetItem*, int)));
     83
    8584}
    8685
    8786QtMoleculeList::~QtMoleculeList()
    8887{
    89   World::getInstance().signOff(this, World::MoleculeInserted);
    90   World::getInstance().signOff(this, World::MoleculeRemoved);
     88  World::getInstance().signOff(this);//, World::MoleculeInserted);
     89  //World::getInstance().signOff(this, World::MoleculeRemoved);
    9190}
    9291
    9392void QtMoleculeList::update(Observable *publisher) {
    94   ASSERT(0,
    95       "QtMoleculeList::update() - we did not sign up for any global updates.");
    96 }
    97 
    98 void QtMoleculeList::recieveNotification(Observable *publisher, Notification_ptr notification) {
    9993
    10094  if (selecting)
     
    10296
    10397  dirty = true;
    104 }
    105 
     98
     99  // force an update from Qt...
     100  clearing = true;
     101  clear();
     102  clearing = false;
     103}
    106104
    107105void QtMoleculeList::refill() {
     
    110108
    111109  clear();
    112   formula.clear();
    113   FormulaVisibilityCountMap.clear();
     110
     111  // list of (unique) formulas in the world
     112  std::vector<Formula> formula;
    114113
    115114  for (std::vector<molecule*>::const_iterator iter = molecules.begin();
     
    119118    // find group if already in list
    120119    QTreeWidgetItem *groupItem = NULL;
    121     const std::string &molecule_formula = (*iter)->getFormula().toString();
    122     FormulaTreeItemMap_t::const_iterator formulaiter =
    123         formula.find(molecule_formula);
     120    for (unsigned int j=0;j<formula.size();j++)
     121      if ((*iter)->getFormula() == formula[j]){
     122        groupItem = topLevelItem(j);
     123        break;
     124      }
    124125
    125126    // new molecule type -> create new group
    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
     127    if (!groupItem){
     128      formula.push_back((*iter)->getFormula());
    138129      groupItem = new QTreeWidgetItem(this);
    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");
     130      groupItem->setText(0, QString("default"));
     131      groupItem->setText(1, QString::number(0));
     132      groupItem->setText(2, QString(""));
     133      groupItem->setText(3, "0");
    147134      groupItem->setData(0, Qt::UserRole, QVariant(-1));
    148     } else {
    149       groupItem = formulaiter->second;
    150135    }
    151136
    152137    // add molecule
    153138    QTreeWidgetItem *molItem = new QTreeWidgetItem(groupItem);
    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()));
     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()));
    159142    const int index = (*iter)->getId();
    160143    molItem->setData(0, Qt::UserRole, QVariant(index));
    161144    molItem->setSelected(World::getInstance().isSelected(*iter));
    162145
     146
    163147    // increase group occurrence
    164     int count = groupItem->text(OCCURRENCE).toInt() + 1;
    165     groupItem->setText(OCCURRENCE, QString::number(count));
     148    int count = groupItem->text(3).toInt() + 1;
     149    groupItem->setText(3, QString::number(count));
    166150  }
    167151  dirty = false;
     
    177161
    178162void QtMoleculeList::subjectKilled(Observable *publisher) {
    179 }
    180 
    181 void 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     }
    246163}
    247164
     
    268185  // Select all molecules which belong to newly selected rows.
    269186  QModelIndex index;
    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   }
     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    }
    284196
    285197  // Unselect all molecules which belong to newly unselected rows.
    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   }
     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    }
    300207
    301208  selecting = false;
Note: See TracChangeset for help on using the changeset viewer.