Panda3D

pgItem.h
Go to the documentation of this file.
1 /**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file pgItem.h
10 * @author drose
11 * @date 2002-03-13
12 */
13
14 #ifndef PGITEM_H
15 #define PGITEM_H
16
17 #include "pandabase.h"
18
19 #include "pgMouseWatcherRegion.h"
20 #include "pgFrameStyle.h"
21 #include "pgItemNotify.h"
22
23 #include "pandaNode.h"
24 #include "nodePath.h"
25 #include "luse.h"
26 #include "pointerTo.h"
27 #include "textNode.h"
28 #include "plane.h"
29 #include "pmap.h"
30 #include "lightReMutex.h"
31 #include "lightReMutexHolder.h"
32
33 #ifdef HAVE_AUDIO
34 #include "audioSound.h"
35 #endif
36
37 class PGTop;
38 class MouseWatcherParameter;
39 class AudioSound;
40 class ClipPlaneAttrib;
41 class ScissorAttrib;
42
43 /**
44 * This is the base class for all the various kinds of gui widget objects.
45 *
46 * It is a Node which corresponds to a rectangular region on the screen, and
47 * it may have any number of "state" subgraphs, one of which is rendered at
48 * any given time according to its current state.
49 *
50 * The PGItem node must be parented to the scene graph somewhere beneath a
51 * PGTop node in order for this behavior to work.
52 */
53 class EXPCL_PANDA_PGUI PGItem : public PandaNode {
54 PUBLISHED:
55 explicit PGItem(const std::string &name);
56 virtual ~PGItem();
57
58 INLINE void set_name(const std::string &name);
59
60 protected:
61 PGItem(const PGItem &copy);
62
63 virtual PandaNode *make_copy() const;
64 virtual void transform_changed();
65 virtual void draw_mask_changed();
66
67 virtual bool cull_callback(CullTraverser *trav, CullTraverserData &data);
68 virtual bool is_renderable() const;
69
70 virtual void compute_internal_bounds(CPT(BoundingVolume) &internal_bounds,
71 int &internal_vertices,
72 int pipeline_stage,
73 Thread *current_thread) const;
74
75 virtual void r_prepare_scene(GraphicsStateGuardianBase *gsg,
76 const RenderState *node_state,
77 GeomTransformer &transformer,
78 Thread *current_thread);
79
80 virtual void xform(const LMatrix4 &mat);
81 bool activate_region(const LMatrix4 &transform, int sort,
82 const ClipPlaneAttrib *cpa,
83 const ScissorAttrib *sa);
84
85 public:
86 INLINE PGMouseWatcherRegion *get_region() const;
87
88 virtual void enter_region(const MouseWatcherParameter &param);
89 virtual void exit_region(const MouseWatcherParameter &param);
90 virtual void within_region(const MouseWatcherParameter &param);
91 virtual void without_region(const MouseWatcherParameter &param);
92 virtual void focus_in();
93 virtual void focus_out();
94 virtual void press(const MouseWatcherParameter &param, bool background);
95 virtual void release(const MouseWatcherParameter &param, bool background);
96 virtual void keystroke(const MouseWatcherParameter &param, bool background);
97 virtual void candidate(const MouseWatcherParameter &param, bool background);
98 virtual void move(const MouseWatcherParameter &param);
99
100 static void background_press(const MouseWatcherParameter &param);
101 static void background_release(const MouseWatcherParameter &param);
102 static void background_keystroke(const MouseWatcherParameter &param);
103 static void background_candidate(const MouseWatcherParameter &param);
104
105 INLINE void set_notify(PGItemNotify *notify);
106 INLINE bool has_notify() const;
107 INLINE PGItemNotify *get_notify() const;
108
109 PUBLISHED:
110 INLINE void set_frame(PN_stdfloat left, PN_stdfloat right, PN_stdfloat bottom, PN_stdfloat top);
111 INLINE void set_frame(const LVecBase4 &frame);
112 INLINE const LVecBase4 &get_frame() const;
113 INLINE bool has_frame() const;
114 INLINE void clear_frame();
115
116 INLINE void set_state(int state);
117 INLINE int get_state() const;
118
119 virtual void set_active(bool active);
120 INLINE bool get_active() const;
121
122 virtual void set_focus(bool focus);
123 INLINE bool get_focus() const;
124
125 void set_background_focus(bool focus);
126 INLINE bool get_background_focus() const;
127
128 INLINE void set_suppress_flags(int suppress_flags);
129 INLINE int get_suppress_flags() const;
130
131 int get_num_state_defs() const;
132 void clear_state_def(int state);
133 bool has_state_def(int state) const;
134 INLINE NodePath &get_state_def(int state);
135 MAKE_SEQ(get_state_defs, get_num_state_defs, get_state_def);
136 NodePath instance_to_state_def(int state, const NodePath &path);
137
138 PGFrameStyle get_frame_style(int state);
139 void set_frame_style(int state, const PGFrameStyle &style);
140
141 INLINE const std::string &get_id() const;
142 INLINE void set_id(const std::string &id);
143
144 INLINE static std::string get_enter_prefix();
145 INLINE static std::string get_exit_prefix();
146 INLINE static std::string get_within_prefix();
147 INLINE static std::string get_without_prefix();
148 INLINE static std::string get_focus_in_prefix();
149 INLINE static std::string get_focus_out_prefix();
150 INLINE static std::string get_press_prefix();
151 INLINE static std::string get_repeat_prefix();
152 INLINE static std::string get_release_prefix();
153 INLINE static std::string get_keystroke_prefix();
154
155 INLINE std::string get_enter_event() const;
156 INLINE std::string get_exit_event() const;
157 INLINE std::string get_within_event() const;
158 INLINE std::string get_without_event() const;
159 INLINE std::string get_focus_in_event() const;
160 INLINE std::string get_focus_out_event() const;
161 INLINE std::string get_press_event(const ButtonHandle &button) const;
162 INLINE std::string get_repeat_event(const ButtonHandle &button) const;
163 INLINE std::string get_release_event(const ButtonHandle &button) const;
164 INLINE std::string get_keystroke_event() const;
165
166 INLINE LMatrix4 get_frame_inv_xform() const;
167
168 #ifdef HAVE_AUDIO
169 void set_sound(const std::string &event, AudioSound *sound);
170 void clear_sound(const std::string &event);
171 AudioSound *get_sound(const std::string &event) const;
172 bool has_sound(const std::string &event) const;
173 #endif
174
175 static TextNode *get_text_node();
176 INLINE static void set_text_node(TextNode *node);
177
178 INLINE static PGItem *get_focus_item();
179
180 protected:
181 void play_sound(const std::string &event);
182
183 void reduce_region(LVecBase4 &clip, PGItem *obscurer) const;
184 void reduce_region(LVecBase4 &frame, PN_stdfloat px, PN_stdfloat py) const;
185 LVecBase4 get_relative_frame(PGItem *item) const;
186 LPoint3 mouse_to_local(const LPoint2 &mouse_point) const;
187
188 virtual void frame_changed();
189
190 private:
191 NodePath &do_get_state_def(int state);
192 void slot_state_def(int state);
193 void update_frame(int state);
194 void mark_frames_stale();
195
196 INLINE static PN_stdfloat compute_area(const LVecBase4 &frame);
197 INLINE static void compare_largest(const LVecBase4 *&largest,
198 PN_stdfloat &largest_area,
199 const LVecBase4 *new_frame);
200
201 typedef pvector<LVecBase2> ClipPoints;
202 bool clip_frame(ClipPoints &source_points, const LPlane &plane) const;
203
204 protected:
205 LightReMutex _lock;
206
207 private:
208 PGItemNotify *_notify;
209
210 bool _has_frame;
211 LVecBase4 _frame;
212 int _state;
213 enum Flags {
214 F_active = 0x01,
215 F_focus = 0x02,
216 F_background_focus = 0x04,
217 };
218 int _flags;
219
220 PT(PGMouseWatcherRegion) const _region;
221
222 LMatrix4 _frame_inv_xform;
223
224 class StateDef {
225 public:
226 INLINE StateDef();
227 NodePath _root;
228 PGFrameStyle _frame_style;
229 NodePath _frame;
230 bool _frame_stale;
231 };
232 typedef pvector<StateDef> StateDefs;
233 StateDefs _state_defs;
234
235 #ifdef HAVE_AUDIO
236 typedef pmap<std::string, PT(AudioSound) > Sounds;
237 Sounds _sounds;
238 #endif
239
240 static PT(TextNode) _text_node;
241 static PGItem *_focus_item;
242
243 typedef pset<PGItem *> BackgroundFocus;
244 static BackgroundFocus _background_focus;
245
246 public:
247 static TypeHandle get_class_type() {
248 return _type_handle;
249 }
250 static void init_type() {
251 PandaNode::init_type();
252 register_type(_type_handle, "PGItem",
253 PandaNode::get_class_type());
254 }
255 virtual TypeHandle get_type() const {
256 return get_class_type();
257 }
258 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
259
260 private:
261 static TypeHandle _type_handle;
262 };
263
264 #include "pgItem.I"
265
266 #endif
audioSound.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
AudioSound
Definition: audioSound.h:25
BoundingVolume
This is an abstract class for any volume in any sense which can be said to define the locality of ref...
Definition: boundingVolume.h:41
ButtonHandle
A ButtonHandle represents a single button from any device, including keyboard buttons and mouse butto...
Definition: buttonHandle.h:26
ClipPlaneAttrib
This functions similarly to a LightAttrib.
Definition: clipPlaneAttrib.h:31
CullTraverserData
This collects together the pieces of data that are accumulated for each node while walking the scene ...
Definition: cullTraverserData.h:40
CullTraverser
This object performs a depth-first traversal of the scene graph, with optional view-frustum culling,...
Definition: cullTraverser.h:45
GeomTransformer
An object specifically designed to transform the vertices of a Geom without disturbing indexing or af...
Definition: geomTransformer.h:42
GraphicsStateGuardianBase
This is a base class for the GraphicsStateGuardian class, which is itself a base class for the variou...
Definition: graphicsStateGuardianBase.h:110
LightReMutex
A lightweight reentrant mutex.
Definition: lightReMutex.h:32
MouseWatcherParameter
This is sent along as a parameter to most events generated for a region to indicate the mouse and but...
Definition: mouseWatcherParameter.h:28
NodePath
NodePath is the fundamental system for disambiguating instances, and also provides a higher-level int...
Definition: nodePath.h:159
PGFrameStyle
Definition: pgFrameStyle.h:29
PGItemNotify
Objects that inherit from this class can receive specialized messages when PGItems change in certain ...
Definition: pgItemNotify.h:27
PGItem
This is the base class for all the various kinds of gui widget objects.
Definition: pgItem.h:53
PGMouseWatcherRegion
This is a specialization on MouseWatcherRegion, to add a bit more fields that are relevant to the PG ...
Definition: pgMouseWatcherRegion.h:28
PGTop
The "top" node of the new Panda GUI system.
Definition: pgTop.h:38
PandaNode
A basic node of the scene graph or data graph.
Definition: pandaNode.h:65
PandaNode::is_renderable
virtual bool is_renderable() const
Returns true if there is some value to visiting this particular node during the cull traversal for an...
Definition: pandaNode.cxx:462
PandaNode::r_prepare_scene
virtual void r_prepare_scene(GraphicsStateGuardianBase *gsg, const RenderState *node_state, GeomTransformer &transformer, Thread *current_thread)
The recursive implementation of prepare_scene().
Definition: pandaNode.cxx:2436
PandaNode::xform
virtual void xform(const LMatrix4 &mat)
Transforms the contents of this PandaNode by the indicated matrix, if it means anything to do so.
Definition: pandaNode.cxx:304
PandaNode::set_state
set_state
Sets the complete RenderState that will be applied to all nodes at this level and below.
Definition: pandaNode.h:173
PandaNode::make_copy
virtual PandaNode * make_copy() const
Returns a newly-allocated PandaNode that is a shallow copy of this one.
Definition: pandaNode.cxx:481
RenderState
This represents a unique collection of RenderAttrib objects that correspond to a particular renderabl...
Definition: renderState.h:47
ScissorAttrib
This restricts rendering to within a rectangular region of the scene, without otherwise affecting the...
Definition: scissorAttrib.h:36
TextNode
The primary interface to this module.
Definition: textNode.h:48
Thread
A thread; that is, a lightweight process.
Definition: thread.h:46
TypeHandle
TypeHandle is the identifier used to differentiate C++ class types.
Definition: typeHandle.h:81
pmap
This is our own Panda specialization on the default STL map.
Definition: pmap.h:49
pset< PGItem * >
pvector
This is our own Panda specialization on the default STL vector.
Definition: pvector.h:42
lightReMutexHolder.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
lightReMutex.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
luse.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
nodePath.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pandaNode.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pandabase.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pgFrameStyle.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pgItemNotify.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pgItem.I
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pgMouseWatcherRegion.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
plane.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pmap.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pointerTo.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
register_type
void register_type(TypeHandle &type_handle, const std::string &name)
This inline function is just a convenient way to call TypeRegistry::register_type(),...
Definition: register_type.I:22
textNode.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.