- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/UIElements/Views/Qt4/QtWorldView.cpp
r0aa122 ra39006 28 28 #include "molecule.hpp" 29 29 #include "MoleculeListClass.hpp" 30 #include "Actions/SelectionAction/Molecules/MoleculeByIdAction.hpp" 31 #include "Actions/SelectionAction/Molecules/NotMoleculeByIdAction.hpp" 30 32 31 33 using namespace std; … … 36 38 // these attributes are skiped so far 37 39 const int QtWorldView::COLUMNCOUNT = COLUMNTYPES_MAX; 38 const char *QtWorldView::COLUMNNAMES[QtWorldView::COLUMNCOUNT]={"Name","Atoms","Formula" /*,"Size"*/};40 const char *QtWorldView::COLUMNNAMES[QtWorldView::COLUMNCOUNT]={"Name","Atoms","Formula","Occurrence"/*,"Size"*/}; 39 41 40 42 QtWorldView::QtWorldView(QWidget * _parent) : 41 QT ableWidget (_parent),43 QTreeWidget (_parent), 42 44 Observer("QtWorldView") 43 45 { 44 setRowCount(0);45 46 setColumnCount(COLUMNCOUNT); 47 setSelectionMode(QAbstractItemView::MultiSelection); 46 48 47 for(int i=0; i<COLUMNCOUNT;++i) { 48 QTableWidgetItem *heading = new QTableWidgetItem(); 49 std::cout << "Creating heading item " << heading << "." << std::endl; 50 heading->setText(QString(COLUMNNAMES[i])); 51 setHorizontalHeaderItem(i,heading); 52 } 49 QStringList header; 50 for(int i=0; i<COLUMNCOUNT;++i) 51 header << COLUMNNAMES[i]; 52 setHeaderLabels(header); 53 53 54 54 molecules = World::getInstance().getMolecules(); 55 55 molecules->signOn(this); 56 update(molecules);57 56 58 connect(this,SIGNAL(cellChanged(int,int)),this,SLOT(moleculeChanged(int,int))); 59 connect(this,SIGNAL(cellClicked(int,int)),this,SLOT(cellSelected(int,int))); 57 dirty = true; 58 refill(); 59 60 //connect(this,SIGNAL(cellChanged(int,int)),this,SLOT(moleculeChanged(int,int))); 61 connect(this,SIGNAL(itemSelectionChanged()),this,SLOT(rowSelected())); 60 62 61 63 } … … 67 69 68 70 void QtWorldView::update(Observable *publisher) { 71 72 dirty = true; 73 74 // force an update from Qt... 75 clear(); 76 } 77 78 void QtWorldView::refill() { 69 79 int numMolecules = molecules->ListOfMolecules.size(); 70 setRowCount(numMolecules);80 clear(); 71 81 molSelection.resize(numMolecules); 82 83 // list of (unique) formulas in the world 84 std::vector<Formula> formula; 85 72 86 int i; 73 87 MoleculeList::iterator iter; … … 76 90 ++i,++iter) { 77 91 92 // find group if already in list 93 QTreeWidgetItem *groupItem = NULL; 94 for (unsigned int j=0;j<formula.size();j++) 95 if ((*iter)->getFormula() == formula[j]){ 96 groupItem = topLevelItem(j); 97 break; 98 } 99 100 // new molecule type -> create new group 101 if (!groupItem){ 102 formula.push_back((*iter)->getFormula()); 103 groupItem = new QTreeWidgetItem(this); 104 groupItem->setText(0, QString((*iter)->getName().c_str())); 105 groupItem->setText(1, QString::number((*iter)->getAtomCount())); 106 groupItem->setText(2, QString((*iter)->getFormula().toString().c_str())); 107 groupItem->setText(3, "0"); 108 } 109 110 // add molecule 111 QTreeWidgetItem *molItem = new QTreeWidgetItem(groupItem); 112 molItem->setText(0, QString((*iter)->getName().c_str())); 113 molItem->setText(1, QString::number((*iter)->getAtomCount())); 114 molItem->setText(2, QString((*iter)->getFormula().toString().c_str())); 78 115 const int index = (*iter)->IndexNr; 79 QTableWidgetItem *indexWidget = new QTableWidgetItem(); 80 //std::cout << "Creating index item " << indexWidget << "." << std::endl; 81 indexWidget->setText(QString::number(index)); 82 indexWidget->setData(Qt::UserRole,QVariant(index)); 83 setVerticalHeaderItem(i,indexWidget); 116 molItem->setData(0, Qt::UserRole, QVariant(index)); 117 molItem->setSelected(World::getInstance().isSelected(*iter)); 84 118 85 const string name = (*iter)->getName();86 QTableWidgetItem *nameWidget = new QTableWidgetItem();87 //std::cout << "Creating name item " << nameWidget << " at " << i << "," << NAME << "." << std::endl;88 nameWidget->setText(QString(name.c_str()));89 setItem(i,NAME,nameWidget);90 119 91 const int atomCount = (*iter)->getAtomCount(); 92 QTableWidgetItem *countWidget= new QTableWidgetItem(); 93 //std::cout << "Creating count item " << countWidget << " at " << i << "," << ATOMCOUNT << "." << std::endl; 94 countWidget->setText(QString::number(atomCount)); 95 countWidget->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); 96 setItem(i,ATOMCOUNT,countWidget); 120 // increase group occurrence 121 int count = groupItem->text(3).toInt() + 1; 122 groupItem->setText(3, QString::number(count)); 97 123 98 const Formula formula = (*iter)->getFormula(); 99 QTableWidgetItem *formulaWidget= new QTableWidgetItem(); 100 //std::cout << "Creating formula item " << formulaWidget << " at " << i << "," << FORMULA << "." << std::endl; 101 formulaWidget->setText(QString(formula.toString().c_str())); 102 formulaWidget->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); 103 setItem(i,FORMULA,formulaWidget); 124 //molSelection[i]=nameWidget->isSelected(); 125 } 126 dirty = false; 127 } 104 128 105 molSelection[i]=nameWidget->isSelected(); 106 } 129 void QtWorldView::paintEvent(QPaintEvent * event) 130 { 131 if (dirty) 132 refill(); 133 QTreeWidget::paintEvent(event); 107 134 } 108 135 … … 110 137 } 111 138 112 void QtWorldView::moleculeChanged( int row, int column) {113 int idx = verticalHeaderItem(row)->data(Qt::UserRole).toInt();139 void QtWorldView::moleculeChanged() { 140 /*int idx = verticalHeaderItem(row)->data(Qt::UserRole).toInt(); 114 141 molecule *mol = molecules->ReturnIndex(idx); 115 142 string cellValue = item(row,NAME)->text().toStdString(); … … 119 146 else if(cellValue==""){ 120 147 item(row,NAME)->setText(QString(mol->getName().c_str())); 121 } 148 }*/ 122 149 } 123 150 124 151 125 void QtWorldView::cellSelected(int row, int column){ 126 //std::cout << "Selection in (" << row << "," << column << "): " << item(row,column) << std::endl; 127 bool state = item(row,column)->isSelected(); 128 for(int i = 0; i<COLUMNCOUNT; i++){ 129 //std::cout << "Setting " << i << "-th item " << item(row,i) << " in row " << row << " to state selected." << std::endl; 130 item(row,i)->setSelected(state); 131 } 132 // figure out which rows have changed 133 for(int i=0; i<rowCount();++i){ 134 state = item(i,0)->isSelected(); 135 if(molSelection[i]!=state){ 136 int idx = verticalHeaderItem(i)->data(Qt::UserRole).toInt(); 137 molecule *mol = molecules->ReturnIndex(idx); 138 if(state){ 139 emit moleculeSelected(mol); 152 void QtWorldView::rowSelected(){ 153 154 // lookup all molecules in the treeWidget 155 for (int i=0;i<topLevelItemCount();i++){ 156 QTreeWidgetItem *top = topLevelItem(i); 157 for (int j=0;j<top->childCount();j++){ 158 159 // molecules are 1 level below the top 160 QTreeWidgetItem *molItem = top->child(j); 161 162 // molecule index stored as user data 163 int index = molItem->data(0, Qt::UserRole).toInt(); 164 molecule *mol = molecules->ReturnIndex(index); 165 ASSERT(mol, "QtWorldView::rowSelected()"); 166 167 // selection changed by user? 168 bool molSelectedWorld = World::getInstance().isSelected(mol); 169 bool molSelectedList = molItem->isSelected(); 170 //std::cout << molSelectedWorld << " " << molSelectedList << std::endl; 171 172 if (molSelectedWorld != molSelectedList){ 173 174 // apply new selection state 175 if (molSelectedList){ 176 //std::cout << "select molecule" << std::endl; 177 MoleCuilder::SelectionMoleculeById(mol->getId()); 178 }else{ 179 //std::cout << "unselect molecule" << std::endl; 180 MoleCuilder::SelectionNotMoleculeById(mol->getId()); 181 } 140 182 } 141 else{142 emit moleculeUnSelected(mol);143 }144 molSelection[i]=state;145 183 } 146 184 }
Note:
See TracChangeset
for help on using the changeset viewer.