source: src/UIElements/Views/Qt4/QtMoleculeList.cpp@ 867473

Action_Thermostats Add_AtomRandomPerturbation Add_FitFragmentPartialChargesAction Add_RotateAroundBondAction Add_SelectAtomByNameAction Added_ParseSaveFragmentResults AddingActions_SaveParseParticleParameters Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_ParticleName_to_Atom Adding_StructOpt_integration_tests AtomFragments Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.5.4 Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator CombiningParticlePotentialParsing Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_BoundInBox_CenterInBox_MoleculeActions Fix_ChargeSampling_PBC Fix_ChronosMutex Fix_FitPartialCharges Fix_FitPotential_needs_atomicnumbers Fix_ForceAnnealing Fix_IndependentFragmentGrids Fix_ParseParticles Fix_ParseParticles_split_forward_backward_Actions Fix_PopActions Fix_QtFragmentList_sorted_selection Fix_Restrictedkeyset_FragmentMolecule Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns Fix_fitting_potentials Fixes ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion FragmentAction_writes_AtomFragments FragmentMolecule_checks_bonddegrees GeometryObjects Gui_Fixes Gui_displays_atomic_force_velocity ImplicitCharges IndependentFragmentGrids IndependentFragmentGrids_IndividualZeroInstances IndependentFragmentGrids_IntegrationTest IndependentFragmentGrids_Sole_NN_Calculation JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix MoreRobust_FragmentAutomation ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PdbParser_setsAtomName PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks Rewrite_FitPartialCharges RotateToPrincipalAxisSystem_UndoRedo SaturateAtoms_findBestMatching SaturateAtoms_singleDegree StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_LinearAlgebra Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg Switchable_LogView ThirdParty_MPQC_rebuilt_buildsystem TrajectoryDependenant_MaxOrder TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps TremoloParser_setsAtomName Ubuntu_1604_changes stable
Last change on this file since 867473 was d7cad1, checked in by Frederik Heber <heber@…>, 10 years ago

Extended selection action for Molecule ids to multiple ids.

  • Property mode set to 100644
File size: 10.2 KB
RevLine 
[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"
[26cf17]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
50using 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]56const int QtMoleculeList::COLUMNCOUNT = COLUMNTYPES_MAX;
[739ee9]57const char *QtMoleculeList::COLUMNNAMES[QtMoleculeList::COLUMNCOUNT]={"Name","Visibility", "Atoms","Formula","Occurrence"/*,"Size"*/};
[b47bfc]58
[0eb7bf3]59QtMoleculeList::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
[3eb91c]71 World::getInstance().signOn(this, World::MoleculeInserted);
72 World::getInstance().signOn(this, World::MoleculeRemoved);
[41815a3]73
74
[a39006]75 dirty = true;
[99e8ea]76 clearing = false;
[41815a3]77 selecting = false;
[3eb91c]78 ChangingChildrensVisibility = false;
[a39006]79 refill();
[b47bfc]80
[25e18e7]81 qRegisterMetaType<QItemSelection>("QItemSelection");
[79b59b]82 //connect(this,SIGNAL(cellChanged(int,int)),this,SLOT(moleculeChanged(int,int)));
[41815a3]83 connect(selectionModel(),SIGNAL(selectionChanged(QItemSelection, QItemSelection)),this,SLOT(rowsSelected(QItemSelection, QItemSelection)));
[739ee9]84 connect(this, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(visibilityChanged(QTreeWidgetItem*, int)));
[b47bfc]85}
86
[0eb7bf3]87QtMoleculeList::~QtMoleculeList()
[b47bfc]88{
[3eb91c]89 World::getInstance().signOff(this, World::MoleculeInserted);
90 World::getInstance().signOff(this, World::MoleculeRemoved);
[b47bfc]91}
92
[0eb7bf3]93void QtMoleculeList::update(Observable *publisher) {
[3eb91c]94 ASSERT(0,
95 "QtMoleculeList::update() - we did not sign up for any global updates.");
96}
97
98void QtMoleculeList::recieveNotification(Observable *publisher, Notification_ptr notification) {
[a39006]99
[41815a3]100 if (selecting)
101 return;
102
[a39006]103 dirty = true;
104}
105
[3eb91c]106
[0eb7bf3]107void QtMoleculeList::refill() {
[6cab535]108 clearing = true;
[41815a3]109 const std::vector<molecule*> &molecules = World::getInstance().getAllMolecules();
110
[79b59b]111 clear();
[3eb91c]112 formula.clear();
113 FormulaVisibilityCountMap.clear();
[79b59b]114
[41815a3]115 for (std::vector<molecule*>::const_iterator iter = molecules.begin();
116 iter != molecules.end();
117 iter++) {
[b47bfc]118
[79b59b]119 // find group if already in list
120 QTreeWidgetItem *groupItem = NULL;
[3eb91c]121 const std::string &molecule_formula = (*iter)->getFormula().toString();
122 FormulaTreeItemMap_t::const_iterator formulaiter =
123 formula.find(molecule_formula);
[79b59b]124
125 // new molecule type -> create new group
[3eb91c]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
[79b59b]138 groupItem = new QTreeWidgetItem(this);
[3eb91c]139 formula.insert( std::make_pair(molecule_formula, groupItem) );
140 // fill item
[739ee9]141 groupItem->setText(NAME, QString("default"));
[3eb91c]142 groupItem->setFlags((groupItem->flags() | Qt::ItemIsUserCheckable) ^ Qt::ItemIsSelectable);
143 groupItem->setCheckState(VISIBILITY, Qt::Unchecked);
[739ee9]144 groupItem->setText(ATOMCOUNT, QString::number(0));
145 groupItem->setText(FORMULA, QString(""));
146 groupItem->setText(OCCURRENCE, "0");
[41815a3]147 groupItem->setData(0, Qt::UserRole, QVariant(-1));
[3eb91c]148 } else {
149 groupItem = formulaiter->second;
[79b59b]150 }
151
152 // add molecule
153 QTreeWidgetItem *molItem = new QTreeWidgetItem(groupItem);
[739ee9]154 molItem->setText(NAME, QString((*iter)->getName().c_str()));
[3eb91c]155 molItem->setFlags(molItem->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable);
[739ee9]156 molItem->setCheckState(VISIBILITY, Qt::Unchecked);
157 molItem->setText(ATOMCOUNT, QString::number((*iter)->getAtomCount()));
[3eb91c]158 molItem->setText(FORMULA, QString(molecule_formula.c_str()));
[41815a3]159 const int index = (*iter)->getId();
[79b59b]160 molItem->setData(0, Qt::UserRole, QVariant(index));
[b14efe]161 molItem->setSelected(World::getInstance().isSelected(*iter));
[79b59b]162
163 // increase group occurrence
[3eb91c]164 int count = groupItem->text(OCCURRENCE).toInt() + 1;
[739ee9]165 groupItem->setText(OCCURRENCE, QString::number(count));
[b47bfc]166 }
[a39006]167 dirty = false;
[6cab535]168 clearing = false;
[a39006]169}
170
[0eb7bf3]171void QtMoleculeList::paintEvent(QPaintEvent * event)
[a39006]172{
173 if (dirty)
174 refill();
175 QTreeWidget::paintEvent(event);
[b47bfc]176}
177
[0eb7bf3]178void QtMoleculeList::subjectKilled(Observable *publisher) {
[b47bfc]179}
180
[739ee9]181void QtMoleculeList::visibilityChanged(QTreeWidgetItem* item, int column)
182{
[3eb91c]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 }
[739ee9]246}
247
[0eb7bf3]248void QtMoleculeList::moleculeChanged() {
[79b59b]249 /*int idx = verticalHeaderItem(row)->data(Qt::UserRole).toInt();
[b47bfc]250 molecule *mol = molecules->ReturnIndex(idx);
251 string cellValue = item(row,NAME)->text().toStdString();
252 if(mol->getName() != cellValue && cellValue !="") {
253 mol->setName(cellValue);
254 }
255 else if(cellValue==""){
256 item(row,NAME)->setText(QString(mol->getName().c_str()));
[79b59b]257 }*/
[b47bfc]258}
259
[0eb7bf3]260void QtMoleculeList::rowsSelected(const QItemSelection & selected, const QItemSelection & deselected){
[b14efe]261
[99e8ea]262 if (clearing)
263 return;
[41815a3]264 if (selecting)
265 return;
266 selecting = true;
267
268 // Select all molecules which belong to newly selected rows.
269 QModelIndex index;
[d7cad1]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 }
[99e8ea]284
[41815a3]285 // Unselect all molecules which belong to newly unselected rows.
[d7cad1]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 }
[41815a3]300
301 selecting = false;
[b47bfc]302}
Note: See TracBrowser for help on using the repository browser.