source: src/UIElements/Views/Qt4/QtSelectionChangedAgent.cpp@ d1831e

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

Added QtSelectionChangedAgent to transform O/O to S/S system.

  • also this will be far more effective, as e.g. not all GLMoleculeOBject_molecule will receive SelectionChanged from World if just a single molecule has been selected.
  • Atom might not yet have a molecule, i.e. it is not drawn yet. We do nothing then.
  • recieveNotification allows for vanished atom (due to removal). We do nothing then.
  • Property mode set to 100644
File size: 6.2 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 * QtSelectionChangedAgent.cpp
25 *
26 * Created on: Jul 17, 2015
27 * Author: heber
28 */
29
30// include config.h
31#ifdef HAVE_CONFIG_H
32#include <config.h>
33#endif
34
35#include "QtSelectionChangedAgent.hpp"
36
37#include "CodePatterns/MemDebug.hpp"
38
39#include "CodePatterns/Assert.hpp"
40#include "CodePatterns/Log.hpp"
41#include "CodePatterns/Observer/Notification.hpp"
42
43#include <algorithm>
44
45#include <boost/thread/locks.hpp>
46
47#include "Atom/atom.hpp"
48#include "Descriptors/AtomIdDescriptor.hpp"
49#include "molecule.hpp"
50#include "World.hpp"
51
52QtSelectionChangedAgent::QtSelectionChangedAgent(QObject *_parent) :
53 QObject(_parent),
54 Observable("QtSelectionChangedAgent")
55{
56 World::getInstance().signOn(this, World::SelectionChanged);
57}
58
59QtSelectionChangedAgent::~QtSelectionChangedAgent()
60{
61 World::getInstance().signOff(this, World::SelectionChanged);
62}
63
64void QtSelectionChangedAgent::update(Observable *publisher)
65{
66 ASSERT(0,
67 "QtSelectionChangedAgent::update() - we are not signed on for general updates.");
68}
69
70template <typename T>
71std::pair<typename std::vector<T>, typename std::vector<T> > getSelectedUnselectedDifference(
72 typename std::vector<T> &_oldselecteditems,
73 typename std::vector<T> &_newselecteditems)
74{
75 std::pair<typename std::vector<T>, typename std::vector<T> > SelectedUnselected;
76 std::sort(_oldselecteditems.begin(), _oldselecteditems.end());
77 std::sort(_newselecteditems.begin(), _newselecteditems.end());
78 // first but not in second: all newly selected
79 std::set_difference(
80 _newselecteditems.begin(), _newselecteditems.end(),
81 _oldselecteditems.begin(), _oldselecteditems.end(),
82 std::back_inserter(SelectedUnselected.first));
83 // first but not in second: all before selected but now no longer
84 std::set_difference(
85 _oldselecteditems.begin(), _oldselecteditems.end(),
86 _newselecteditems.begin(), _newselecteditems.end(),
87 std::back_inserter(SelectedUnselected.second));
88
89 return SelectedUnselected;
90}
91
92void QtSelectionChangedAgent::recieveNotification(Observable *publisher, Notification_ptr notification)
93{
94 if (dynamic_cast<World *>(publisher) != NULL) {
95 switch (notification->getChannelNo()) {
96 case World::SelectionChanged:
97 {
98 boost::recursive_mutex::scoped_lock lock(mutex);
99 // check what changed and propagated changes specifically
100 selectedAtoms_t newlyselectedatoms =
101 const_cast<const World &>(World::getInstance()).getSelectedAtomIds();
102 std::pair< selectedAtoms_t, selectedAtoms_t> AtomSelectionDifference =
103 getSelectedUnselectedDifference<atomId_t>(selectedAtoms, newlyselectedatoms);
104 for (selectedAtoms_t::const_iterator selectediter = AtomSelectionDifference.first.begin();
105 selectediter != AtomSelectionDifference.first.end(); ++selectediter) {
106 const atom * const _atom =
107 const_cast<const World &>(World::getInstance()).getAtom(AtomById(*selectediter));
108 if (_atom != NULL) {
109 const molecule * const _mol = _atom->getMolecule();
110 if (_mol != NULL)
111 emit atomSelected(_mol->getId(), *selectediter);
112 else
113 ELOG(2, "QtSelectionChangedAgent::recieveNotification() - selected atom "
114 << *selectediter << " has no molecule.");
115 } else
116 ELOG(2, "QtSelectionChangedAgent::recieveNotification() - selected atom "
117 << *selectediter << " has disappeared.");
118 }
119 for (selectedAtoms_t::const_iterator unselectediter = AtomSelectionDifference.second.begin();
120 unselectediter != AtomSelectionDifference.second.end(); ++unselectediter) {
121 const atom * const _atom =
122 const_cast<const World &>(World::getInstance()).getAtom(AtomById(*unselectediter));
123 if (_atom != NULL) {
124 const molecule * const _mol = _atom->getMolecule();
125 if (_mol != NULL)
126 emit atomUnselected(_mol->getId(), *unselectediter);
127 else
128 ELOG(2, "QtSelectionChangedAgent::recieveNotification() - unselected atom "
129 << *unselectediter << " has no molecule .");
130 } else
131 ELOG(2, "QtSelectionChangedAgent::recieveNotification() - unselected atom "
132 << *unselectediter << " has disappeared.");
133 }
134 selectedAtoms = newlyselectedatoms;
135
136 selectedMolecules_t newlyselectedmolecules =
137 const_cast<const World &>(World::getInstance()).getSelectedMoleculeIds();
138 std::pair< selectedMolecules_t, selectedMolecules_t> MoleculeSelectionDifference =
139 getSelectedUnselectedDifference<moleculeId_t>(selectedMolecules, newlyselectedmolecules);
140 for (selectedMolecules_t::const_iterator selectediter = MoleculeSelectionDifference.first.begin();
141 selectediter != MoleculeSelectionDifference.first.end(); ++selectediter)
142 emit moleculeSelected(*selectediter);
143 for (selectedMolecules_t::const_iterator unselectediter = MoleculeSelectionDifference.second.begin();
144 unselectediter != MoleculeSelectionDifference.second.end(); ++unselectediter)
145 emit moleculeUnselected(*unselectediter);
146 selectedMolecules = newlyselectedmolecules;
147 break;
148 }
149 default:
150 ASSERT(0, "QtSelectionChangedAgent::recieveNotification() - received notification from unexpected channel.");
151 }
152 }
153}
154
155void QtSelectionChangedAgent::subjectKilled(Observable *publisher)
156{
157 // World is killed last anyway
158}
Note: See TracBrowser for help on using the repository browser.