source: src/UIElements/Views/Qt4/QtMoleculeList.cpp@ 3eb91c

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 3eb91c was 3eb91c, checked in by Frederik Heber <heber@…>, 10 years ago

Molecule's Visibility can be changed "group-wise".

  • FIX: Removed this funny clear() on update() signal. Also using notifications now, which appear less often.
  • Property mode set to 100644
File size: 10.0 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2010-2012 University of Bonn. All rights reserved.
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/>.
21 */
22
23/*
24 * QtMoleculeList.cpp
25 *
26 * Created on: Jan 21, 2010
27 * Author: crueger
28 */
29
30// include config.h
31#ifdef HAVE_CONFIG_H
32#include <config.h>
33#endif
34
35#include "Views/Qt4/QtMoleculeList.hpp"
36
37#include <QMetaMethod>
38
39#include <iostream>
40
41#include "CodePatterns/MemDebug.hpp"
42
43#include "Atom/atom.hpp"
44#include "Formula.hpp"
45#include "molecule.hpp"
46#include "MoleculeListClass.hpp"
47#include "Actions/SelectionAction/Molecules/MoleculeByIdAction.hpp"
48#include "Actions/SelectionAction/Molecules/NotMoleculeByIdAction.hpp"
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
55// these attributes are skipped so far
56const int QtMoleculeList::COLUMNCOUNT = COLUMNTYPES_MAX;
57const char *QtMoleculeList::COLUMNNAMES[QtMoleculeList::COLUMNCOUNT]={"Name","Visibility", "Atoms","Formula","Occurrence"/*,"Size"*/};
58
59QtMoleculeList::QtMoleculeList(QWidget * _parent) :
60 QTreeWidget (_parent),
61 Observer("QtMoleculeList")
62{
63 setColumnCount(COLUMNCOUNT);
64 setSelectionMode(QAbstractItemView::MultiSelection);
65
66 QStringList header;
67 for(int i=0; i<COLUMNCOUNT;++i)
68 header << COLUMNNAMES[i];
69 setHeaderLabels(header);
70
71 World::getInstance().signOn(this, World::MoleculeInserted);
72 World::getInstance().signOn(this, World::MoleculeRemoved);
73
74
75 dirty = true;
76 clearing = false;
77 selecting = false;
78 ChangingChildrensVisibility = false;
79 refill();
80
81 qRegisterMetaType<QItemSelection>("QItemSelection");
82 //connect(this,SIGNAL(cellChanged(int,int)),this,SLOT(moleculeChanged(int,int)));
83 connect(selectionModel(),SIGNAL(selectionChanged(QItemSelection, QItemSelection)),this,SLOT(rowsSelected(QItemSelection, QItemSelection)));
84 connect(this, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(visibilityChanged(QTreeWidgetItem*, int)));
85}
86
87QtMoleculeList::~QtMoleculeList()
88{
89 World::getInstance().signOff(this, World::MoleculeInserted);
90 World::getInstance().signOff(this, World::MoleculeRemoved);
91}
92
93void QtMoleculeList::update(Observable *publisher) {
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) {
99
100 if (selecting)
101 return;
102
103 dirty = true;
104}
105
106
107void QtMoleculeList::refill() {
108 clearing = true;
109 const std::vector<molecule*> &molecules = World::getInstance().getAllMolecules();
110
111 clear();
112 formula.clear();
113 FormulaVisibilityCountMap.clear();
114
115 for (std::vector<molecule*>::const_iterator iter = molecules.begin();
116 iter != molecules.end();
117 iter++) {
118
119 // find group if already in list
120 QTreeWidgetItem *groupItem = NULL;
121 const std::string &molecule_formula = (*iter)->getFormula().toString();
122 FormulaTreeItemMap_t::const_iterator formulaiter =
123 formula.find(molecule_formula);
124
125 // 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
138 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");
147 groupItem->setData(0, Qt::UserRole, QVariant(-1));
148 } else {
149 groupItem = formulaiter->second;
150 }
151
152 // add molecule
153 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()));
159 const int index = (*iter)->getId();
160 molItem->setData(0, Qt::UserRole, QVariant(index));
161 molItem->setSelected(World::getInstance().isSelected(*iter));
162
163 // increase group occurrence
164 int count = groupItem->text(OCCURRENCE).toInt() + 1;
165 groupItem->setText(OCCURRENCE, QString::number(count));
166 }
167 dirty = false;
168 clearing = false;
169}
170
171void QtMoleculeList::paintEvent(QPaintEvent * event)
172{
173 if (dirty)
174 refill();
175 QTreeWidget::paintEvent(event);
176}
177
178void QtMoleculeList::subjectKilled(Observable *publisher) {
179}
180
181void 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 }
246}
247
248void QtMoleculeList::moleculeChanged() {
249 /*int idx = verticalHeaderItem(row)->data(Qt::UserRole).toInt();
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()));
257 }*/
258}
259
260void QtMoleculeList::rowsSelected(const QItemSelection & selected, const QItemSelection & deselected){
261
262 if (clearing)
263 return;
264 if (selecting)
265 return;
266 selecting = true;
267
268 // Select all molecules which belong to newly selected rows.
269 QModelIndex index;
270 QModelIndexList items = selected.indexes();
271 foreach (index, items)
272 if (index.column() == 0){
273 int mol_id = model()->data(index, Qt::UserRole).toInt();
274 if (mol_id < 0)
275 continue;
276 //std::cout << "select molecule" << std::endl;
277 MoleCuilder::SelectionMoleculeById(mol_id);
278 }
279
280 // Unselect all molecules which belong to newly unselected rows.
281 items = deselected.indexes();
282 foreach (index, items)
283 if (index.column() == 0){
284 int mol_id = model()->data(index, Qt::UserRole).toInt();
285 if (mol_id < 0)
286 continue;
287 //std::cout << "unselect molecule" << std::endl;
288 MoleCuilder::SelectionNotMoleculeById(mol_id);
289 }
290
291 selecting = false;
292}
Note: See TracBrowser for help on using the repository browser.