source: src/UIElements/Views/Qt4/QtInfoBox.cpp@ bd6768

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 bd6768 was 273c8a, checked in by Frederik Heber <heber@…>, 9 years ago

QtObservedAtom only offers direct access to associated const QtObservedMolecule ref.

  • the molecule index is not part of the atom's state, hence cannot be directly observed. The only thing we observe is the association to the molecule. For this a O/O-signal is available and we may actively change the ref when getting this signal without breaking anything as it occurs in the same thread, hence the board can be safely accessed.
  • QtObservedBond now needs to access mol index through the molecule ref.
  • QtInfoBox may now conveniently access atom'smol ref directly.
  • FIX: Removed static QtObservedBond::getMolecule().
  • Property mode set to 100644
File size: 6.8 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 * QtInfoBox.cpp
25 *
26 * Created on: Mar 4, 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/QtInfoBox.hpp"
36
37#include <iostream>
38#include <QAbstractItemView>
39
40#include "CodePatterns/MemDebug.hpp"
41
42#include "UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.hpp"
43
44#include <boost/thread/locks.hpp>
45
46#include "Element/element.hpp"
47#include "Element/periodentafel.hpp"
48#include "World.hpp"
49
50using namespace std;
51
52/***************** Basic structure for tab layout ***********/
53
54QtInfoBox::QtInfoBox(QtObservedInstanceBoard *_board, QWidget *_parent) :
55 QTabWidget(_parent),
56 curAtomId(-1), nextAtomId(-1),
57 curMoleculeId(-1), nextMoleculeId(-1),
58 page_mol(NULL), page_atom(NULL),
59 board(_board),
60 currentPage(0),
61 periode(World::getInstance().getPeriode())
62{
63 timer = new QTimer(this);
64 timer->setSingleShot(true);
65
66 setMinimumWidth(200);
67 setMinimumHeight(220);
68
69 connect(timer, SIGNAL(timeout()), this, SLOT(timerTimeout()));
70}
71
72QtInfoBox::~QtInfoBox()
73{
74 clearAtomTab();
75 clearMoleculeTab();
76}
77
78void QtInfoBox::atomHover(const atomId_t _id)
79{
80 nextAtomId = _id;
81 timer->start(500);
82}
83
84void QtInfoBox::moleculeHover(const moleculeId_t _id)
85{
86 nextMoleculeId = _id;
87 timer->start(500);
88}
89
90void QtInfoBox::timerTimeout()
91{
92 if (nextAtomId != (atomId_t)-1)
93 showAtom(nextAtomId);
94 if (nextMoleculeId != (moleculeId_t)-1)
95 showMolecule(nextMoleculeId);
96}
97
98void QtInfoBox::clearAtomTab()
99{
100 boost::recursive_mutex::scoped_lock lock(tabs_mutex);
101 if (page_atom){
102 disconnect(page_atom->getAtom().get(), SIGNAL(atomRemoved()), this, SLOT(clearAtomTab()));
103 //removeTab(indexOf(page_atom));
104 delete(page_atom);
105 page_atom = NULL;
106 }
107}
108
109void QtInfoBox::clearMoleculeTab()
110{
111 boost::recursive_mutex::scoped_lock lock(tabs_mutex);
112 if (page_mol){
113 disconnect(page_mol->getMolecule().get(), SIGNAL(moleculeRemoved()), this, SLOT(clearMoleculeTab()));
114 //removeTab(indexOf(page_mol));
115 delete(page_mol);
116 page_mol = NULL;
117 }
118}
119
120void QtInfoBox::showAtom(const atomId_t _id)
121{
122 currentPage = currentIndex();
123
124 // Remove old tabs.
125 clearAtomTab();
126 clearMoleculeTab();
127
128 QtObservedAtom::ptr curAtom = board->getObservedAtom(_id);
129
130 // Show new tabs.
131 if (curAtom){
132 curAtomId = curAtom->getAtomIndex();
133 nextAtomId = -1;
134 nextMoleculeId = -1;
135
136 boost::recursive_mutex::scoped_lock lock(tabs_mutex);
137 page_atom = new QtAtomInfoPage(curAtom, periode, this);
138 addTab(page_atom, "Atom");
139 connect(curAtom.get(), SIGNAL(atomRemoved()), this, SLOT(clearAtomTab()));
140
141 if (curAtom->getMoleculeRef() != NULL) {
142 QtObservedMolecule::ptr curMolecule = curAtom->getMoleculeRef()->getRef();
143 if (curMolecule) {
144 page_mol = new QtMoleculeInfoPage(curMolecule, this);
145 addTab(page_mol, "Molecule");
146 connect(curMolecule.get(), SIGNAL(moleculeRemoved()), this, SLOT(clearMoleculeTab()));
147
148 if (currentPage > 0)
149 setCurrentIndex(currentPage);
150 }
151 }
152 }
153}
154
155void QtInfoBox::showMolecule(const moleculeId_t _id)
156{
157 currentPage = currentIndex();
158
159 // Remove old tabs.
160 clearAtomTab();
161 clearMoleculeTab();
162
163 QtObservedMolecule::ptr curMolecule = board->getObservedMolecule(_id);
164 nextAtomId = -1;
165 nextMoleculeId = -1;
166
167 // Show new tabs.
168 if (curMolecule){
169 boost::recursive_mutex::scoped_lock lock(tabs_mutex);
170 page_mol = new QtMoleculeInfoPage(curMolecule, this);
171 addTab(page_mol, "Molecule");
172 connect(curMolecule.get(), SIGNAL(moleculeRemoved()), this, SLOT(clearMoleculeTab()));
173
174 if (currentPage > 0)
175 setCurrentIndex(currentPage);
176 }
177}
178
179/************************ Tab for single Atoms ********************/
180
181static void addInfo(QTreeWidget *info, const QString &key, const QString &value)
182{
183 QTreeWidgetItem *treeItem = new QTreeWidgetItem(info);
184 treeItem->setText(0, key);
185 treeItem->setText(1, value);
186}
187
188QtAtomInfoPage::QtAtomInfoPage(
189 QtObservedAtom::ptr &_atom,
190 periodentafel *_periode,
191 QWidget *parent) :
192 QTreeWidget(parent),
193 atomRef(_atom),
194 periode(_periode)
195{
196 setColumnCount(2);
197 QStringList header;
198 header << "data";
199 header << "value";
200 setHeaderLabels(header);
201
202 updatePage();
203}
204
205void QtAtomInfoPage::updatePage()
206{
207 clear();
208
209 if (atomRef == NULL)
210 return;
211 const element * const _element = periode->FindElement(atomRef->getAtomElement());
212 addInfo(this, "Name", QString(atomRef->getAtomName().c_str()));
213 addInfo(this, "Element", QString(_element->getName().c_str()));
214 addInfo(this, "Mass", QString("%1").arg(_element->getMass()));
215 addInfo(this, "Charge", QString("%1").arg(_element->getCharge()));
216 addInfo(this, "Bonds", QString("%1").arg(atomRef->getAtomBonds().size()));
217 addInfo(this, "Position x", QString(toString(atomRef->getAtomPosition()[0]).c_str()));
218 addInfo(this, "Position y", QString(toString(atomRef->getAtomPosition()[1]).c_str()));
219 addInfo(this, "Position z", QString(toString(atomRef->getAtomPosition()[2]).c_str()));
220}
221
222QtAtomInfoPage::~QtAtomInfoPage()
223{}
224
225/************************ Tab for single Molecules *****************/
226
227QtMoleculeInfoPage::QtMoleculeInfoPage(
228 QtObservedMolecule::ptr &_mol,
229 QWidget *parent) :
230 QTreeWidget(parent),
231 mol(_mol)
232{
233 setColumnCount(2);
234 QStringList header;
235 header << "data";
236 header << "value";
237 setHeaderLabels(header);
238
239 updatePage();
240}
241
242void QtMoleculeInfoPage::updatePage()
243{
244 clear();
245
246 if (mol == NULL)
247 return;
248 addInfo(this, "Name", QString(mol->getMolName().c_str()));
249 addInfo(this, "Formula", QString(mol->getMolFormula().c_str()));
250 addInfo(this, "Atoms", QString("%1").arg(mol->getAtomCount()));
251 addInfo(this, "NonHydrogens", QString("%1").arg(mol->getNonHydrogenCount()));
252 addInfo(this, "Bonds", QString("%1").arg(mol->getBondCount()));
253 const Vector molCenter = mol->getMolCenter();
254 addInfo(this, "Center x", QString("%1").arg(molCenter[0]));
255 addInfo(this, "Center y", QString("%1").arg(molCenter[1]));
256 addInfo(this, "Center z", QString("%1").arg(molCenter[2]));
257}
258
259QtMoleculeInfoPage::~QtMoleculeInfoPage()
260{}
Note: See TracBrowser for help on using the repository browser.