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