Ignore:
Timestamp:
Feb 12, 2016, 11:15:39 PM (9 years ago)
Author:
Frederik Heber <heber@…>
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)
Message:

All QtMoleculeItem now heed QtObservedMolecule and QtMoleculeList takes InstanceBoard.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/UIElements/Views/Qt4/MoleculeList/QtMoleculeItem.cpp

    r1b6415a rca1535  
    3535#include "QtMoleculeItem.hpp"
    3636
    37 #include <QModelIndex>
    38 
    3937#include "UIElements/Views/Qt4/MoleculeList/QtMoleculeList.hpp"
    4038
    4139#include "CodePatterns/MemDebug.hpp"
    4240
    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 
    5641QtMoleculeItem::QtMoleculeItem(
    57      const moleculeId_t _molid,
    58      const channellist_t &_channellist,
     42    QtObservedMolecule::ptr &_ObservedMolecule,
    5943     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),
    6446  movetype(_movetype),
    65   channellist(_channellist),
    66   owner(NULL),
    6747  dirty(true),
    68   emitDirtyState(_emitDirtyState),
    69   emitSubjectKilledState(_emitSubjectKilledState)
     48  emitDirtyState(_emitDirtyState)
    7049{
    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();
    7550  setFlags(flags() | Qt::ItemIsSelectable);
    76 }
    77 
    78 void QtMoleculeItem::signOnToMolecule()
    79 {
    80   // count the number of threads entering the function
    81   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     } else
    97       owner_mutex.unlock();
    98   }
    99 }
    100 
    101 void QtMoleculeItem::signOffFromMolecule()
    102 {
    103   // prevent via owner that another thread enters the function again
    104   // (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   }
    12151}
    12252
    12353QtMoleculeItem::~QtMoleculeItem()
    12454{
    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();
    12955}
    13056
     
    13662  }
    13763}
    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 molecule
    148       //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() const
    173 {
    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.