- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/UIElements/Views/Qt4/QtMoleculeList.cpp
rd7cad1 r0741f4d 55 55 // these attributes are skipped so far 56 56 const int QtMoleculeList::COLUMNCOUNT = COLUMNTYPES_MAX; 57 const char *QtMoleculeList::COLUMNNAMES[QtMoleculeList::COLUMNCOUNT]={"Name"," Visibility", "Atoms","Formula","Occurrence"/*,"Size"*/};57 const char *QtMoleculeList::COLUMNNAMES[QtMoleculeList::COLUMNCOUNT]={"Name","Atoms","Formula","Occurrence"/*,"Size"*/}; 58 58 59 59 QtMoleculeList::QtMoleculeList(QWidget * _parent) : … … 69 69 setHeaderLabels(header); 70 70 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); 73 73 74 74 … … 76 76 clearing = false; 77 77 selecting = false; 78 ChangingChildrensVisibility = false;79 78 refill(); 80 79 … … 82 81 //connect(this,SIGNAL(cellChanged(int,int)),this,SLOT(moleculeChanged(int,int))); 83 82 connect(selectionModel(),SIGNAL(selectionChanged(QItemSelection, QItemSelection)),this,SLOT(rowsSelected(QItemSelection, QItemSelection))); 84 connect(this, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(visibilityChanged(QTreeWidgetItem*, int))); 83 85 84 } 86 85 87 86 QtMoleculeList::~QtMoleculeList() 88 87 { 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); 91 90 } 92 91 93 92 void 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) {99 93 100 94 if (selecting) … … 102 96 103 97 dirty = true; 104 } 105 98 99 // force an update from Qt... 100 clearing = true; 101 clear(); 102 clearing = false; 103 } 106 104 107 105 void QtMoleculeList::refill() { … … 110 108 111 109 clear(); 112 formula.clear(); 113 FormulaVisibilityCountMap.clear(); 110 111 // list of (unique) formulas in the world 112 std::vector<Formula> formula; 114 113 115 114 for (std::vector<molecule*>::const_iterator iter = molecules.begin(); … … 119 118 // find group if already in list 120 119 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 } 124 125 125 126 // 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()); 138 129 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"); 147 134 groupItem->setData(0, Qt::UserRole, QVariant(-1)); 148 } else {149 groupItem = formulaiter->second;150 135 } 151 136 152 137 // add molecule 153 138 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())); 159 142 const int index = (*iter)->getId(); 160 143 molItem->setData(0, Qt::UserRole, QVariant(index)); 161 144 molItem->setSelected(World::getInstance().isSelected(*iter)); 162 145 146 163 147 // 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)); 166 150 } 167 151 dirty = false; … … 177 161 178 162 void 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 item188 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_formula196 +" is not present in FormulaVisibilityCountMap.");197 198 // get parent199 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 item204 205 ChangingChildrensVisibility = true;206 if (visible) {207 ++(FormulaVisibilityCountMap[molecule_formula]);208 // compare with occurence/total number of molecules209 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 item223 224 // go through all children, but don't enter for groupItem once more225 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 signal235 emit moleculesVisibilityChanged(molid, visible);236 }237 // set current number of visible children238 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 }246 163 } 247 164 … … 268 185 // Select all molecules which belong to newly selected rows. 269 186 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 } 284 196 285 197 // 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 } 300 207 301 208 selecting = false;
Note:
See TracChangeset
for help on using the changeset viewer.