source: src/UIElements/Views/Qt4/Qt3D/GLWorldScene.hpp

Candidate_v1.7.1 stable v1.7.1
Last change on this file was 57608e, checked in by Frederik Heber <frederik.heber@…>, 2 weeks ago

Attempt to simplify redraw event in Qt View.

  • Property mode set to 100644
File size: 5.9 KB
Line 
1/*
2 * GLWorldScene.hpp
3 *
4 * This is based on the Qt3D example "teaservice", specifically parts of teaservice.cpp.
5 *
6 * Created on: Aug 17, 2011
7 * Author: heber
8 */
9
10#ifndef GLWORLDSCENE_HPP_
11#define GLWORLDSCENE_HPP_
12
13// include config.h
14#ifdef HAVE_CONFIG_H
15#include <config.h>
16#endif
17
18#include <Qt/qobject.h>
19
20#include <iosfwd>
21
22#include <boost/bimap.hpp>
23#include <boost/thread/recursive_mutex.hpp>
24
25#include "Bond/bond.hpp"
26#include "GLMoleculeObject_bond.hpp"
27#include "GLMoleculeObject_molecule.hpp"
28#include "types.hpp"
29
30#include "UIElements/Qt4/InstanceBoard/QtObservedAtom.hpp"
31#include "UIElements/Qt4/InstanceBoard/QtObservedBond.hpp"
32#include "UIElements/Qt4/InstanceBoard/QtObservedMolecule.hpp"
33
34class Shape;
35
36class QGLPainter;
37class QGLSceneNode;
38class QGLView;
39
40class GLMoleculeObject;
41class GLMoleculeObject_atom;
42class GLMoleculeObject_molecule;
43class GLMoleculeObject_shape;
44
45class QtObservedInstanceBoard;
46
47/** This class contains a list of all molecules in the world.
48 *
49 */
50class GLWorldScene : public QObject
51{
52 Q_OBJECT
53public:
54 GLWorldScene(
55 QtObservedInstanceBoard * _board,
56 QObject *parent=0);
57 virtual ~GLWorldScene();
58
59//#if !defined(QT_OPENGL_ES_1)
60// PerPixelEffect *lighting;
61//#endif
62
63 void changeMaterials(bool perPixel);
64 QGLSceneNode* getAtom(size_t);
65 QGLSceneNode* getMolecule(size_t);
66 QGLSceneNode* getBond(size_t, size_t);
67
68 void initialize(QGLView *view, QGLPainter *painter) const;
69 void draw(QGLPainter *painter, const QVector4D &cameraPlane) const;
70
71 enum SelectionModeType{
72 SelectAtom,
73 SelectMolecule
74 };
75 void setSelectionMode(SelectionModeType mode);
76 SelectionModeType getSelectionMode() const;
77
78signals:
79 void updated();
80 void sceneChanged();
81 void pressed();
82 void released();
83 void clicked();
84 void clicked(atomId_t);
85 void doubleClicked();
86 void hoverChanged(const atomId_t);
87 void hoverChanged(const moleculeId_t, int);
88 void hoverEnd();
89 void atomConnected(QtObservedAtom::ptr);
90 void bondConnected(QtObservedBond::ptr);
91
92private slots:
93
94 void clickAtom(atomId_t no);
95 void connectAtom(QtObservedAtom::ptr);
96 void insertAtom(QtObservedAtom::ptr);
97 void removeAtom(ObservedValue_Index_t _atomid);
98
99 void connectBond(QtObservedBond::ptr);
100 void insertBond(QtObservedBond::ptr);
101 void removeBond(ObservedValue_Index_t _bondid);
102
103 void clickMolecule(moleculeId_t no);
104 void insertMolecule(QtObservedMolecule::ptr);
105 void removeMolecule(ObservedValue_Index_t _molid);
106
107 void setSelectionModeAtom();
108 void setSelectionModeMolecule();
109
110 void addShape(const std::string &_name);
111 void removeShape(const std::string &_name);
112// void update();
113 void moleculesVisibilityChanged(ObservedValue_Index_t _id, bool _visible);
114 void hoverChangedSignalled(GLMoleculeObject *ob);
115
116 void reparentAtom();
117 void reparentBondLeft();
118 void reparentBondRight();
119
120private:
121
122 GLMoleculeObject_molecule *getMoleculeObject(
123 const ObservedValue_Index_t _molid) const;
124
125 void resetParent(
126 GLMoleculeObject *_obj,
127 GLMoleculeObject_molecule *_molobj);
128
129 void reparentBond(
130 const QtObservedBond::ptr _bond,
131 const QtObservedAtom::ptr _atom,
132 const GLMoleculeObject_bond::SideOfBond _side);
133
134 GLMoleculeObject_bond *getBondInScene(
135 const ObservedValue_Index_t _bondid,
136 GLMoleculeObject_bond::SideOfBond _side) const;
137
138 void checkAndRemoveBond(const ObservedValue_Index_t &_bondid);
139
140 void checkAndRemoveAtom(const ObservedValue_Index_t &_atomid);
141
142public:
143 void updateSelectedShapes();
144
145 typedef std::map< QObject*, QtObservedAtom::ptr > ObservedAtoms_t;
146 typedef std::map< QObject*, QtObservedBond::ptr > ObservedBonds_t;
147
148 typedef std::map< ObservedValue_Index_t, QObject* > ObservedValueIndexLookup_t;
149
150 typedef std::map< ObservedValue_Index_t, GLMoleculeObject_molecule* > MoleculeNodeMap;
151 typedef std::map< ObservedValue_Index_t, GLMoleculeObject_atom* > AtomNodeMap;
152 typedef std::multimap< ObservedValue_Index_t, GLMoleculeObject_bond* > BondNodeMap;
153 typedef std::map< std::string , GLMoleculeObject_shape* > ShapeNodeMap;
154
155 //!> typedef for storing the current parent to each atom node in scene, NULL indicates GLWorldScene is parent
156 typedef boost::bimap<
157 boost::bimaps::set_of< ObservedValue_Index_t >,
158 boost::bimaps::multiset_of< ObservedValue_Index_t >
159 > AtomNodeParentMap_t;
160 //!> typedef for storing the current parent to each bond node in scene, NULL indicates GLWorldScene is parent
161 typedef boost::bimap<
162 boost::bimaps::set_of< ObservedValue_Index_t >,
163 boost::bimaps::multiset_of< ObservedValue_Index_t >
164 > BondNodeParentMap_t;
165
166 typedef std::set< ObservedValue_Index_t > ToBeRemovedNodes_t;
167
168private:
169
170 //!> id of atom hovered over
171 atomId_t hoverAtomId;
172
173 //!> mutex to ascertain atomic access to atom-related internal maps
174 boost::recursive_mutex Atom_mutex;
175 //!> mutex to ascertain atomic access to bond-related internal maps
176 boost::recursive_mutex Bond_mutex;
177
178 AtomNodeMap AtomsinSceneMap;
179 BondNodeMap BondsinSceneMap;
180 MoleculeNodeMap MoleculesinSceneMap;
181 ShapeNodeMap ShapesinSceneMap;
182 AtomNodeParentMap_t AtomNodeParentMap;
183 std::vector<BondNodeParentMap_t> BondNodeParentMaps;
184
185 //!> stored observed atom such that its signals may always be safely evaluated
186 ObservedAtoms_t ObservedAtoms;
187 //!> stored observed bond such that its signals may always be safely evaluated
188 ObservedBonds_t ObservedBonds;
189 //!> in moleculeChanged() we only have QObject*, in reparentAtom() we have ObservedValue_Index_t, need lookup
190 ObservedValueIndexLookup_t ObservedAtomIndexLookup;
191 //!> in moleculeChanged() we only have QObject*, in reparentBond..() we have ObservedValue_Index_t, need lookup
192 ObservedValueIndexLookup_t ObservedBondIndexLookup;
193
194 //!> all atoms and bond id where we got the ...Removed signals for
195 ToBeRemovedNodes_t ToBeRemovedNodes;
196
197 SelectionModeType selectionMode;
198
199 QtObservedInstanceBoard * board;
200};
201
202#endif /* GLWORLDSCENE_HPP_ */
Note: See TracBrowser for help on using the repository browser.