| [bcf653] | 1 | /* | 
|---|
|  | 2 | * Project: MoleCuilder | 
|---|
|  | 3 | * Description: creates and alters molecular systems | 
|---|
| [0aa122] | 4 | * Copyright (C)  2010-2012 University of Bonn. All rights reserved. | 
|---|
| [94d5ac6] | 5 | * | 
|---|
|  | 6 | * | 
|---|
|  | 7 | *   This file is part of MoleCuilder. | 
|---|
|  | 8 | * | 
|---|
|  | 9 | *    MoleCuilder is free software: you can redistribute it and/or modify | 
|---|
|  | 10 | *    it under the terms of the GNU General Public License as published by | 
|---|
|  | 11 | *    the Free Software Foundation, either version 2 of the License, or | 
|---|
|  | 12 | *    (at your option) any later version. | 
|---|
|  | 13 | * | 
|---|
|  | 14 | *    MoleCuilder is distributed in the hope that it will be useful, | 
|---|
|  | 15 | *    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
|  | 16 | *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|---|
|  | 17 | *    GNU General Public License for more details. | 
|---|
|  | 18 | * | 
|---|
|  | 19 | *    You should have received a copy of the GNU General Public License | 
|---|
|  | 20 | *    along with MoleCuilder.  If not, see <http://www.gnu.org/licenses/>. | 
|---|
| [bcf653] | 21 | */ | 
|---|
|  | 22 |  | 
|---|
| [b47bfc] | 23 | /* | 
|---|
| [0eb7bf3] | 24 | * QtMoleculeList.cpp | 
|---|
| [b47bfc] | 25 | * | 
|---|
|  | 26 | *  Created on: Jan 21, 2010 | 
|---|
|  | 27 | *      Author: crueger | 
|---|
|  | 28 | */ | 
|---|
|  | 29 |  | 
|---|
| [bf3817] | 30 | // include config.h | 
|---|
|  | 31 | #ifdef HAVE_CONFIG_H | 
|---|
|  | 32 | #include <config.h> | 
|---|
|  | 33 | #endif | 
|---|
| [bbbad5] | 34 |  | 
|---|
| [0eb7bf3] | 35 | #include "Views/Qt4/QtMoleculeList.hpp" | 
|---|
| [b47bfc] | 36 |  | 
|---|
| [41815a3] | 37 | #include <QMetaMethod> | 
|---|
|  | 38 |  | 
|---|
| [b47bfc] | 39 | #include <iostream> | 
|---|
|  | 40 |  | 
|---|
| [ad011c] | 41 | #include "CodePatterns/MemDebug.hpp" | 
|---|
| [bbbad5] | 42 |  | 
|---|
| [6f0841] | 43 | #include "Atom/atom.hpp" | 
|---|
| [26cf178] | 44 | #include "Formula.hpp" | 
|---|
| [b47bfc] | 45 | #include "molecule.hpp" | 
|---|
| [42127c] | 46 | #include "MoleculeListClass.hpp" | 
|---|
| [b14efe] | 47 | #include "Actions/SelectionAction/Molecules/MoleculeByIdAction.hpp" | 
|---|
|  | 48 | #include "Actions/SelectionAction/Molecules/NotMoleculeByIdAction.hpp" | 
|---|
| [b47bfc] | 49 |  | 
|---|
|  | 50 | using namespace std; | 
|---|
|  | 51 |  | 
|---|
|  | 52 | // maybe this should go with the definition of molecules | 
|---|
|  | 53 |  | 
|---|
|  | 54 | // some attributes need to be easier to find for molecules | 
|---|
| [6cab535] | 55 | // these attributes are skipped so far | 
|---|
| [0eb7bf3] | 56 | const int QtMoleculeList::COLUMNCOUNT = COLUMNTYPES_MAX; | 
|---|
|  | 57 | const char *QtMoleculeList::COLUMNNAMES[QtMoleculeList::COLUMNCOUNT]={"Name","Atoms","Formula","Occurrence"/*,"Size"*/}; | 
|---|
| [b47bfc] | 58 |  | 
|---|
| [0eb7bf3] | 59 | QtMoleculeList::QtMoleculeList(QWidget * _parent) : | 
|---|
| [79b59b] | 60 | QTreeWidget (_parent), | 
|---|
| [0eb7bf3] | 61 | Observer("QtMoleculeList") | 
|---|
| [b47bfc] | 62 | { | 
|---|
|  | 63 | setColumnCount(COLUMNCOUNT); | 
|---|
| [79b59b] | 64 | setSelectionMode(QAbstractItemView::MultiSelection); | 
|---|
| [b47bfc] | 65 |  | 
|---|
| [79b59b] | 66 | QStringList header; | 
|---|
|  | 67 | for(int i=0; i<COLUMNCOUNT;++i) | 
|---|
|  | 68 | header << COLUMNNAMES[i]; | 
|---|
|  | 69 | setHeaderLabels(header); | 
|---|
| [b47bfc] | 70 |  | 
|---|
| [41815a3] | 71 | World::getInstance().signOn(this);//, World::MoleculeInserted); | 
|---|
|  | 72 | //World::getInstance().signOn(this, World::MoleculeRemoved); | 
|---|
|  | 73 |  | 
|---|
|  | 74 |  | 
|---|
| [a39006] | 75 | dirty = true; | 
|---|
| [99e8ea] | 76 | clearing = false; | 
|---|
| [41815a3] | 77 | selecting = false; | 
|---|
| [a39006] | 78 | refill(); | 
|---|
| [b47bfc] | 79 |  | 
|---|
| [79b59b] | 80 | //connect(this,SIGNAL(cellChanged(int,int)),this,SLOT(moleculeChanged(int,int))); | 
|---|
| [41815a3] | 81 | connect(selectionModel(),SIGNAL(selectionChanged(QItemSelection, QItemSelection)),this,SLOT(rowsSelected(QItemSelection, QItemSelection))); | 
|---|
| [b47bfc] | 82 |  | 
|---|
|  | 83 | } | 
|---|
|  | 84 |  | 
|---|
| [0eb7bf3] | 85 | QtMoleculeList::~QtMoleculeList() | 
|---|
| [b47bfc] | 86 | { | 
|---|
| [41815a3] | 87 | World::getInstance().signOff(this);//, World::MoleculeInserted); | 
|---|
|  | 88 | //World::getInstance().signOff(this, World::MoleculeRemoved); | 
|---|
| [b47bfc] | 89 | } | 
|---|
|  | 90 |  | 
|---|
| [0eb7bf3] | 91 | void QtMoleculeList::update(Observable *publisher) { | 
|---|
| [a39006] | 92 |  | 
|---|
| [41815a3] | 93 | if (selecting) | 
|---|
|  | 94 | return; | 
|---|
|  | 95 |  | 
|---|
| [a39006] | 96 | dirty = true; | 
|---|
|  | 97 |  | 
|---|
|  | 98 | // force an update from Qt... | 
|---|
| [99e8ea] | 99 | clearing = true; | 
|---|
| [a39006] | 100 | clear(); | 
|---|
| [99e8ea] | 101 | clearing = false; | 
|---|
| [a39006] | 102 | } | 
|---|
|  | 103 |  | 
|---|
| [0eb7bf3] | 104 | void QtMoleculeList::refill() { | 
|---|
| [6cab535] | 105 | clearing = true; | 
|---|
| [41815a3] | 106 | const std::vector<molecule*> &molecules = World::getInstance().getAllMolecules(); | 
|---|
|  | 107 |  | 
|---|
| [79b59b] | 108 | clear(); | 
|---|
|  | 109 |  | 
|---|
|  | 110 | // list of (unique) formulas in the world | 
|---|
|  | 111 | std::vector<Formula> formula; | 
|---|
|  | 112 |  | 
|---|
| [41815a3] | 113 | for (std::vector<molecule*>::const_iterator iter = molecules.begin(); | 
|---|
|  | 114 | iter != molecules.end(); | 
|---|
|  | 115 | iter++) { | 
|---|
| [b47bfc] | 116 |  | 
|---|
| [79b59b] | 117 | // find group if already in list | 
|---|
|  | 118 | QTreeWidgetItem *groupItem = NULL; | 
|---|
|  | 119 | for (unsigned int j=0;j<formula.size();j++) | 
|---|
|  | 120 | if ((*iter)->getFormula() == formula[j]){ | 
|---|
|  | 121 | groupItem = topLevelItem(j); | 
|---|
|  | 122 | break; | 
|---|
|  | 123 | } | 
|---|
|  | 124 |  | 
|---|
|  | 125 | // new molecule type -> create new group | 
|---|
|  | 126 | if (!groupItem){ | 
|---|
|  | 127 | formula.push_back((*iter)->getFormula()); | 
|---|
|  | 128 | groupItem = new QTreeWidgetItem(this); | 
|---|
|  | 129 | groupItem->setText(0, QString((*iter)->getName().c_str())); | 
|---|
|  | 130 | groupItem->setText(1, QString::number((*iter)->getAtomCount())); | 
|---|
|  | 131 | groupItem->setText(2, QString((*iter)->getFormula().toString().c_str())); | 
|---|
|  | 132 | groupItem->setText(3, "0"); | 
|---|
| [41815a3] | 133 | groupItem->setData(0, Qt::UserRole, QVariant(-1)); | 
|---|
| [79b59b] | 134 | } | 
|---|
|  | 135 |  | 
|---|
|  | 136 | // add molecule | 
|---|
|  | 137 | QTreeWidgetItem *molItem = new QTreeWidgetItem(groupItem); | 
|---|
|  | 138 | molItem->setText(0, QString((*iter)->getName().c_str())); | 
|---|
|  | 139 | molItem->setText(1, QString::number((*iter)->getAtomCount())); | 
|---|
|  | 140 | molItem->setText(2, QString((*iter)->getFormula().toString().c_str())); | 
|---|
| [41815a3] | 141 | const int index = (*iter)->getId(); | 
|---|
| [79b59b] | 142 | molItem->setData(0, Qt::UserRole, QVariant(index)); | 
|---|
| [b14efe] | 143 | molItem->setSelected(World::getInstance().isSelected(*iter)); | 
|---|
| [79b59b] | 144 |  | 
|---|
|  | 145 |  | 
|---|
|  | 146 | // increase group occurrence | 
|---|
|  | 147 | int count = groupItem->text(3).toInt() + 1; | 
|---|
|  | 148 | groupItem->setText(3, QString::number(count)); | 
|---|
| [b47bfc] | 149 | } | 
|---|
| [a39006] | 150 | dirty = false; | 
|---|
| [6cab535] | 151 | clearing = false; | 
|---|
| [a39006] | 152 | } | 
|---|
|  | 153 |  | 
|---|
| [0eb7bf3] | 154 | void QtMoleculeList::paintEvent(QPaintEvent * event) | 
|---|
| [a39006] | 155 | { | 
|---|
|  | 156 | if (dirty) | 
|---|
|  | 157 | refill(); | 
|---|
|  | 158 | QTreeWidget::paintEvent(event); | 
|---|
| [b47bfc] | 159 | } | 
|---|
|  | 160 |  | 
|---|
| [0eb7bf3] | 161 | void QtMoleculeList::subjectKilled(Observable *publisher) { | 
|---|
| [b47bfc] | 162 | } | 
|---|
|  | 163 |  | 
|---|
| [0eb7bf3] | 164 | void QtMoleculeList::moleculeChanged() { | 
|---|
| [79b59b] | 165 | /*int idx = verticalHeaderItem(row)->data(Qt::UserRole).toInt(); | 
|---|
| [b47bfc] | 166 | molecule *mol = molecules->ReturnIndex(idx); | 
|---|
|  | 167 | string cellValue = item(row,NAME)->text().toStdString(); | 
|---|
|  | 168 | if(mol->getName() != cellValue && cellValue !="") { | 
|---|
|  | 169 | mol->setName(cellValue); | 
|---|
|  | 170 | } | 
|---|
|  | 171 | else if(cellValue==""){ | 
|---|
|  | 172 | item(row,NAME)->setText(QString(mol->getName().c_str())); | 
|---|
| [79b59b] | 173 | }*/ | 
|---|
| [b47bfc] | 174 | } | 
|---|
|  | 175 |  | 
|---|
| [0eb7bf3] | 176 | void QtMoleculeList::rowsSelected(const QItemSelection & selected, const QItemSelection & deselected){ | 
|---|
| [b14efe] | 177 |  | 
|---|
| [99e8ea] | 178 | if (clearing) | 
|---|
|  | 179 | return; | 
|---|
| [41815a3] | 180 | if (selecting) | 
|---|
|  | 181 | return; | 
|---|
|  | 182 | selecting = true; | 
|---|
|  | 183 |  | 
|---|
|  | 184 | // Select all molecules which belong to newly selected rows. | 
|---|
|  | 185 | QModelIndex index; | 
|---|
|  | 186 | QModelIndexList items = selected.indexes(); | 
|---|
|  | 187 | foreach (index, items) | 
|---|
|  | 188 | if (index.column() == 0){ | 
|---|
|  | 189 | int mol_id = model()->data(index, Qt::UserRole).toInt(); | 
|---|
|  | 190 | if (mol_id < 0) | 
|---|
|  | 191 | continue; | 
|---|
|  | 192 | //std::cout << "select molecule" << std::endl; | 
|---|
|  | 193 | MoleCuilder::SelectionMoleculeById(mol_id); | 
|---|
|  | 194 | } | 
|---|
| [99e8ea] | 195 |  | 
|---|
| [41815a3] | 196 | // Unselect all molecules which belong to newly unselected rows. | 
|---|
|  | 197 | items = deselected.indexes(); | 
|---|
|  | 198 | foreach (index, items) | 
|---|
|  | 199 | if (index.column() == 0){ | 
|---|
|  | 200 | int mol_id = model()->data(index, Qt::UserRole).toInt(); | 
|---|
|  | 201 | if (mol_id < 0) | 
|---|
|  | 202 | continue; | 
|---|
|  | 203 | //std::cout << "unselect molecule" << std::endl; | 
|---|
|  | 204 | MoleCuilder::SelectionNotMoleculeById(mol_id); | 
|---|
| [b47bfc] | 205 | } | 
|---|
| [41815a3] | 206 |  | 
|---|
|  | 207 | selecting = false; | 
|---|
| [b47bfc] | 208 | } | 
|---|