source: src/UIElements/Qt4/InstanceBoard/QtObservedInstanceBoard.cpp@ c44763

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 c44763 was 5c9604, checked in by Frederik Heber <heber@…>, 9 years ago

SignedOn_t in QtObservedInstanceBoard is again just a set.

  • we do not need multiple entries for molecule anymore.
  • Property mode set to 100644
File size: 10.4 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2015 Frederik Heber. 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 * QtObservedInstanceBoard.cpp
25 *
26 * Created on: Oct 17, 2015
27 * Author: heber
28 */
29
30
31// include config.h
32#ifdef HAVE_CONFIG_H
33#include <config.h>
34#endif
35
36#include "QtObservedInstanceBoard.hpp"
37
38#include <QtCore/QMetaType>
39
40#include "UIElements/Qt4/InstanceBoard/QtObservedAtom.hpp"
41#include "UIElements/Qt4/InstanceBoard/QtObservedMolecule.hpp"
42
43#include "CodePatterns/MemDebug.hpp"
44
45#include <boost/bind.hpp>
46
47#include "CodePatterns/Log.hpp"
48
49#include "Atom/atom.hpp"
50#include "Descriptors/AtomIdDescriptor.hpp"
51#include "Descriptors/MoleculeIdDescriptor.hpp"
52#include "molecule.hpp"
53#include "UIElements/Qt4/InstanceBoard/ObservedValuesContainer_impl.hpp"
54#include "World.hpp"
55
56QtObservedInstanceBoard::QtObservedInstanceBoard(QWidget * _parent) :
57 QWidget(_parent),
58 Observer("QtObservedInstanceBoard"),
59 WorldSignedOn(false),
60 atomObservedValues(
61 "atom",
62 *this,
63 boost::bind(&QtObservedInstanceBoard::atomcountsubjectKilled, this, _1)),
64 moleculeObservedValues(
65 "molecule",
66 *this,
67 boost::bind(&QtObservedInstanceBoard::moleculecountsubjectKilled, this, _1))
68{
69 qRegisterMetaType<QtObservedAtom::ptr>("QtObservedAtom::ptr");
70 qRegisterMetaType<QtObservedMolecule::ptr>("QtObservedMolecule::ptr");
71
72 // be first (besides ObservedValues to know about new insertions)
73 World::getInstance().signOn(this, World::AtomInserted, GlobalObservableInfo::PriorityLevel(int(-10)));
74 World::getInstance().signOn(this, World::MoleculeInserted, GlobalObservableInfo::PriorityLevel(int(-10)));
75 WorldSignedOn = true;
76}
77
78QtObservedInstanceBoard::~QtObservedInstanceBoard()
79{
80 if (WorldSignedOn) {
81 World::getInstance().signOff(this, World::AtomInserted);
82 World::getInstance().signOff(this, World::MoleculeInserted);
83 }
84 // sign off from all remaining molecules and atoms
85 for (SignedOn_t::iterator iter = AtomSignedOn.begin(); !AtomSignedOn.empty();
86 iter = AtomSignedOn.begin()) {
87 (*iter)->signOff(this, atom::IndexChanged);
88 AtomSignedOn.erase(iter);
89 }
90
91 for (SignedOn_t::iterator iter = MoleculeSignedOn.begin(); !MoleculeSignedOn.empty();
92 iter = MoleculeSignedOn.begin()) {
93 (*iter)->signOff(this, molecule::IndexChanged);
94 MoleculeSignedOn.erase(iter);
95 }
96}
97
98void QtObservedInstanceBoard::update(Observable *publisher)
99{
100 ASSERT(0,
101 "QtObservedInstanceBoard::update() - we are not signed on to general updates.");
102}
103
104void QtObservedInstanceBoard::subjectKilled(Observable *publisher)
105{
106 SignedOn_t::iterator iter = AtomSignedOn.find(publisher);
107 if ( iter != AtomSignedOn.end()) {
108 LOG(3, "DEBUG: InstanceBoard got subjectKilled() from atom " << publisher);
109 AtomSignedOn.erase(iter);
110 } else {
111 iter = MoleculeSignedOn.find(publisher);
112 if ( iter != MoleculeSignedOn.end()) {
113 LOG(3, "DEBUG: InstanceBoard got subjectKilled() from molecule " << publisher);
114 MoleculeSignedOn.erase(iter);
115 } else {
116 ASSERT(0,
117 "QtObservedInstanceBoard::subjectKilled() - could not find signedOn for atom/molecule "+toString(publisher));
118 }
119 }
120}
121
122void QtObservedInstanceBoard::recieveNotification(Observable *publisher, Notification_ptr notification)
123{
124 if (static_cast<World *>(publisher) == World::getPointer()) {
125 switch (notification->getChannelNo()) {
126 case World::MoleculeInserted:
127 {
128 const moleculeId_t _id = const_cast<const World &>(World::getInstance()).lastChangedMolId();
129 #ifdef LOG_OBSERVER
130 observerLog().addMessage() << "++ Observer " << observerLog().getName(static_cast<Observer *>(this)) << " received notification that molecule "+toString(_id)+" has been inserted.";
131 #endif
132 LOG(3, "DEBUG: InformationBoard got moleculeInserted signal for molecule " << _id);
133 const molecule * const _molecule = const_cast<const World &>(World::getInstance()).
134 getMolecule(MoleculeById(_id));
135 if (_molecule != NULL) {
136 LOG(3, "DEBUG: InformationBoard initializes QtObservedMolecule for " << _id);
137 QtObservedMolecule::ptr observedmolecule(
138 new QtObservedMolecule(
139 _id,
140 _molecule,
141 *this));
142 moleculeObservedValues.insert(_id, observedmolecule);
143 // we need to check for index changes
144 LOG(3, "DEBUG: InformationBoard signOn()s to molecule " << _id);
145 _molecule->signOn(this, molecule::IndexChanged);
146 MoleculeSignedOn.insert( static_cast<Observable *>(const_cast<molecule *>(_molecule)) );
147
148 emit moleculeInserted(observedmolecule);
149 } else {
150 ELOG(1, "QtObservedInstanceBoard got MoleculeInserted for unknown molecule id " << _id);
151 }
152 break;
153 }
154 case World::AtomInserted:
155 {
156 const atomId_t _id = const_cast<const World &>(World::getInstance()).lastChangedAtomId();
157 #ifdef LOG_OBSERVER
158 observerLog().addMessage() << "++ Observer " << observerLog().getName(static_cast<Observer *>(this)) << " received notification that atom "+toString(_id)+" has been inserted.";
159 #endif
160 LOG(3, "DEBUG: InformationBoard got atomInserted signal for atom " << _id);
161 const atom * const _atom = const_cast<const World &>(World::getInstance()).
162 getAtom(AtomById(_id));
163 if (_atom!= NULL) {
164 LOG(3, "DEBUG: InformationBoard initializes QtObservedAtom for " << _id);
165 QtObservedAtom::ptr observedatom(
166 new QtObservedAtom(_id, _atom, *this));
167 atomObservedValues.insert(_id, observedatom);
168 // we need to check for index changes
169 LOG(3, "DEBUG: InformationBoard signOn()s to atom " << _id);
170 _atom->signOn(this, atom::IndexChanged);
171 AtomSignedOn.insert( static_cast<Observable *>(const_cast<atom *>(_atom)) );
172 emit atomInserted(observedatom);
173 } else {
174 ELOG(1, "QtObservedInstanceBoard got AtomInserted for unknown atom id " << _id);
175 }
176 break;
177 }
178 default:
179 ASSERT(0, "QtObservedInstanceBoard::recieveNotification() - we cannot get here for World.");
180 break;
181 }
182 } else if (dynamic_cast<molecule *>(publisher) != NULL) {
183 const moleculeId_t molid = const_cast<const World &>(World::getInstance()).lastChangedMolId();
184 switch (notification->getChannelNo()) {
185 case molecule::IndexChanged:
186 {
187 // molecule has changed its index
188 const moleculeId_t newmoleculeId = dynamic_cast<molecule *>(publisher)->getId();
189 LOG(3, "DEBUG: InformationBoard got IndexChanged from molecule " << molid << " to " << newmoleculeId);
190#ifndef NDEBUG
191 bool status =
192#endif
193 moleculeObservedValues.changeIdentifier(molid, newmoleculeId);
194 ASSERT( status,
195 "QtObservedInstanceBoard::recieveNotification() - cannot change molecule's id "
196 +toString(molid)+" "+toString(newmoleculeId)+" in moleculeObservedValues.");
197 // no need update SignedOn, ref does not change
198 emit moleculeIndexChanged(molid, newmoleculeId);
199 break;
200 }
201 default:
202 ASSERT(0, "QtObservedInstanceBoard::recieveNotification() - we cannot get here.");
203 break;
204 }
205 } else if (dynamic_cast<atom *>(publisher) != NULL) {
206 const atomId_t oldatomId = const_cast<const World &>(World::getInstance()).lastChangedAtomId();
207 switch (notification->getChannelNo()) {
208 case AtomObservable::IndexChanged:
209 {
210 const atomId_t newatomId = dynamic_cast<atom *>(publisher)->getId();
211 LOG(3, "DEBUG: InformationBoard got IndexChanged from atom " << oldatomId << " to " << newatomId);
212#ifndef NDEBUG
213 bool status =
214#endif
215 atomObservedValues.changeIdentifier(oldatomId, newatomId);
216 ASSERT( status,
217 "QtObservedInstanceBoard::recieveNotification() - cannot change atom's id "
218 +toString(oldatomId)+" "+toString(newatomId)+" in atomObservedValues.");
219 // no need update SignedOn, ref does not change
220 emit atomIndexChanged(oldatomId, newatomId);
221 break;
222 }
223 default:
224 ASSERT(0, "QtObservedInstanceBoard::recieveNotification() - we cannot get here.");
225 break;
226 }
227 } else {
228 ASSERT(0, "QtObservedInstanceBoard::recieveNotification() - notification from unknown source.");
229 }
230}
231
232void QtObservedInstanceBoard::atomcountsubjectKilled(const atomId_t _atomid)
233{
234 LOG(3, "DEBUG: InstanceBoard emits atomRemoved for " << _atomid);
235 emit atomRemoved(_atomid);
236}
237
238void QtObservedInstanceBoard::moleculecountsubjectKilled(const moleculeId_t _molid)
239{
240 LOG(3, "DEBUG: InstanceBoard emits moleculeRemoved for " << _molid);
241 emit moleculeRemoved(_molid);
242}
243
244QtObservedAtom::ptr QtObservedInstanceBoard::getObservedAtom(const atomId_t _id)
245{
246 return atomObservedValues.get(_id);
247}
248
249QtObservedMolecule::ptr QtObservedInstanceBoard::getObservedMolecule(const moleculeId_t _id)
250{
251 return moleculeObservedValues.get(_id);
252}
253
254void QtObservedInstanceBoard::markObservedAtomAsConnected(const atomId_t _id)
255{
256 atomObservedValues.markObservedValuesAsConnected(_id);
257}
258
259void QtObservedInstanceBoard::markObservedAtomAsDisconnected(const atomId_t _id)
260{
261 atomObservedValues.markObservedValuesAsDisconnected(_id);
262}
263
264void QtObservedInstanceBoard::markObservedAtomForErase(const atomId_t _id)
265{
266 atomObservedValues.eraseObservedValues(_id);
267}
268
269void QtObservedInstanceBoard::markObservedMoleculeAsConnected(const moleculeId_t _id)
270{
271 moleculeObservedValues.markObservedValuesAsConnected(_id);
272}
273
274void QtObservedInstanceBoard::markObservedMoleculeAsDisconnected(const moleculeId_t _id)
275{
276 moleculeObservedValues.markObservedValuesAsDisconnected(_id);
277}
278
279void QtObservedInstanceBoard::markObservedMoleculeForErase(const moleculeId_t _id)
280{
281 moleculeObservedValues.eraseObservedValues(_id);
282}
Note: See TracBrowser for help on using the repository browser.