- Timestamp:
- Feb 12, 2016, 11:15:39 PM (9 years ago)
- Branches:
- 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
- Children:
- deb5ee
- Parents:
- 1b6415a
- git-author:
- Frederik Heber <heber@…> (10/29/15 22:21:30)
- git-committer:
- Frederik Heber <heber@…> (02/12/16 23:15:39)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.cpp
r1b6415a rca1535 35 35 #include "QtMoleculeItem.hpp" 36 36 37 #include <QModelIndex>38 39 37 #include "UIElements/Views/Qt4/MoleculeList/QtMoleculeList.hpp" 40 38 41 39 #include "CodePatterns/MemDebug.hpp" 42 40 43 #include "CodePatterns/Assert.hpp"44 #include "CodePatterns/toString.hpp"45 46 #include "CodePatterns/Observer/Notification.hpp"47 48 #include <algorithm>49 50 #include <boost/thread/locks.hpp>51 52 #include "Descriptors/MoleculeIdDescriptor.hpp"53 #include "molecule.hpp"54 #include "World.hpp"55 56 41 QtMoleculeItem::QtMoleculeItem( 57 const moleculeId_t _molid, 58 const channellist_t &_channellist, 42 QtObservedMolecule::ptr &_ObservedMolecule, 59 43 const enum MoveTypes _movetype, 60 const emitDirtyState_t _emitDirtyState, 61 const emitSubjectKilledState_t _emitSubjectKilledState) : 62 Observer("QtMoleculeItem"), 63 molid(_molid), 44 const emitDirtyState_t _emitDirtyState) : 45 ObservedMolecule(_ObservedMolecule), 64 46 movetype(_movetype), 65 channellist(_channellist),66 owner(NULL),67 47 dirty(true), 68 emitDirtyState(_emitDirtyState), 69 emitSubjectKilledState(_emitSubjectKilledState) 48 emitDirtyState(_emitDirtyState) 70 49 { 71 // BUG: We cannot sign on here as then and again we catch "pure virtual function called"72 // this makes no sense as both the Observer part (which also has a recievedNotification())73 // nor QtMoleculeItem's vtable have been fully created.74 // signOnToMolecule();75 50 setFlags(flags() | Qt::ItemIsSelectable); 76 }77 78 void QtMoleculeItem::signOnToMolecule()79 {80 // count the number of threads entering the function81 std::cout << "QtMoleculeItem::signOnToMolecule() called for " << this << std::endl;82 const molecule * const mol = const_cast<const World &>(World::getInstance()).83 getMolecule(MoleculeById(molid));84 if (mol != NULL) {85 owner_mutex.lock();86 if (owner == NULL) {87 owner_mutex.unlock();88 const Observable *owner_copy = static_cast<const Observable *>(mol);89 for (channellist_t::const_iterator channeliter = channellist.begin();90 channeliter != channellist.end(); ++channeliter)91 owner_copy->signOn(this, *channeliter);92 owner_mutex.lock();93 owner = owner_copy;94 owner_mutex.unlock();95 std::cout << "QtMoleculeItem " << this << " has signed on to " << owner << std::endl;96 } else97 owner_mutex.unlock();98 }99 }100 101 void QtMoleculeItem::signOffFromMolecule()102 {103 // prevent via owner that another thread enters the function again104 // (re-entrancy)105 const Observable *owner_copy;106 {107 boost::recursive_mutex::scoped_lock lock(owner_mutex);108 if (owner != NULL) {109 owner_copy = owner;110 owner = NULL;111 }112 }113 std::cout << "QtMoleculeItem::signOffFromMolecule() called for " << this << std::endl;114 if (owner_copy != NULL) {115 for (channellist_t::const_iterator channeliter = channellist.begin();116 channeliter != channellist.end(); ++channeliter)117 owner_copy->signOff(this, *channeliter);118 std::cout << "QtMoleculeItem " << this << " has signed off from " << owner_copy << std::endl;119 owner_copy = NULL;120 }121 51 } 122 52 123 53 QtMoleculeItem::~QtMoleculeItem() 124 54 { 125 // BUG: We cannot sign off here as then and again we catch "pure virtual function called"126 // this makes no sense as neither the Observer part (which also has a recievedNotification())127 // nor QtMoleculeItem's vtable have yet been destroyed.128 signOffFromMolecule();129 55 } 130 56 … … 136 62 } 137 63 } 138 139 void QtMoleculeItem::update(Observable *publisher)140 {}141 142 void QtMoleculeItem::recieveNotification(Observable *publisher, Notification_ptr notification)143 {144 if (dynamic_cast<molecule *>(publisher) != NULL) {145 if (notification->getChannelNo() == molecule::AboutToBeRemoved) {146 signOffFromMolecule();147 // prevent any remaining updates from accessing the molecule148 //molid = -1;149 dirty = false;150 } else {151 channellist_t::const_iterator iter =152 std::find(channellist.begin(), channellist.end(), notification->getChannelNo());153 if (iter != channellist.end()) {154 dirty = true;155 emitDirtyState(getMoleculeId(), getType(), movetype);156 } else {157 ASSERT(0,158 "QtMoleculeItem::recieveNotification() - received notification to channel "159 +toString(notification->getChannelNo())+" we are not subscribed to.");160 }161 }162 }163 }164 165 void QtMoleculeItem::subjectKilled(Observable *publisher)166 {167 // signOffFromMolecule();168 dirty = false;169 emitSubjectKilledState(getMoleculeId());170 }171 172 const molecule * const QtMoleculeItem::getMolecule() const173 {174 const molecule * const mol = const_cast<const World &>(World::getInstance()).getMolecule(MoleculeById(molid));175 // ASSERT (mol != NULL,176 // "QtMoleculeItem::getMolecule() - mol with "+toString(molid)+" is gone.");177 return mol;178 }
Note:
See TracChangeset
for help on using the changeset viewer.