#include <WidgetBase.h>
Inheritance diagram for WidgetItem:
We are using the Renderable interface for mouse events, so the name & cast for gl style picking is: RENDERABLE_NAME and "(unsigned int)(Renderable*)this", respectively. See: Renderable.h.
The widget framework is divided into 2 layers.
The Behavior layer defines how widgets interact and are constrained to one another. This level describes how the widgets move, but now how they look.
The Appearance layer defines how they look. For instance, we are most likely using minimal OpenGL widget geometry, like GLU quadric objects. These are balls, tubes, cones, etc... We might also like to use widgets in 2D without opengl, or maybe develop a custom "skin" to make our widgets look different than everyone else's. Whatever the reason, we can easly customize the appearance of the widgets by creating new concrete basic widgets that simply draw the geometry we want, with any shader, colors etc. This only requires the implementation of a few functions, for instance:
float draw( const gutz::RenderEvent &re ); WidgetItem *clone(); // and possibly these if applicable: void _invalidate(); void _update();
The actions described by widgets are very general, for the most part they contain information about spatial position or some parameter that they represent. There is realy no need to create a new widget everytime you need some new action, nearly all widgets contain signals, see gutz::Signal. These signals are called whenever the parameter of interest changes, which can be captured by your class that implements the action associated with that parameter. For instance, you may want some kind of clipping plane for opengl. Your instinct might say, subclass FrameWiget and have it handle the clipping action. That would lead to a mas-proliferation of "special" widgets that differ from their base class only in how they implement the symantics of the widget. It is far better to create a "ClipObject" that gets "connected", see gutz::connect(), to the FrameWidget::planeChanged signal. Whenever the user modifies the position/orientation of the FrameWidget, the ClipObject will recieve the planeChanged signal and update the clipping plane. This kind of sepparation is important since it could become difficult to maintain and improve the widget framework if there are many classes that "know" about how the widget is implemented.
Of course you will want to build custom widgets with a slider here, another bar there, whatever. You should. But remember to keep the behavior implentation higher in the hierarchy, the appearance lower (most derived), and little or no built in symantics, just signals to communicate parameter changes.
TODO: need more examples here...
The divison between NodeWidget and GLUNodeWidget illustrates the sepparation between behavior and appearance: NodeWidget handles the behavior, and GLUNodeWidget handles the specific appearance for GLU spheres. Behavior implementation should always reside above any and all apperance implementation in the class hierarchy.
All parameters, such as position and orientation should be delivered in "WORLD" space; see gutz::BaseManip for a definition of this. By delivered, I mean when you call getPoint, getPos, getOrient, etc... or recieve a signal such as pointChanged etc.. these positions and orientations should always be in "WORLD" space, not the local frame that the widget may live in. It is very likely that widgets store these parameters in a Manip, so as you might expect, this means that we are using gutz::BaseManip::getWorldPos() when you ask for a widget's position. This also means that any setPos functions should use positions/orientations that are defined in "WORLD" space. The widget is responsible for transforming these parameters into their local frame.
See also WidgetFactory, gutz::Signal, gutz::connect, gutz::disconnect.
Definition at line 119 of file WidgetBase.h.
Event & constraint mapper. | |
All widgets have the default event of: gutz::GUTZ_LEFT_MOUSE -> MOVE you may want to nuke this event if it isn't applicable: delEvent(gutz::GUTZ_LEFT_MOUSE); event keys are defined in: gutzKeyMouse.h | |
enum | WIGET_BEHAVIORS { NO_EVENT = 0, MOVE, ROTATE, WB_LAST } |
void | addEvent (const unsigned int key, const unsigned int event, const ConstraintSP cnst=new Constraint()) |
addEvent. constraint defaults to "Free Move" constraint | |
unsigned int | getEvent (const gutz::MouseEvent &me) const |
getEvent, returns the event if one is defined, returns NO_EVENT if the mouse is up works for both: gutz::MouseEvent and gutz::MouseMoveEvent This function is usefull in implementation, externally use getEvent(unsigned int). | |
unsigned int | getEvent (unsigned int key) const |
what is the event assigned to a key | |
void | delEvent (const unsigned int key) |
delete an event from the event map | |
void | nukeEvents () |
delete all events from the event map | |
gutz::EventKeyMap | getEvents () const |
void | setEvents (const gutz::EventKeyMap &eventMap) |
ConstraintMap | getConstraints () const |
void | setConstraints (const ConstraintMap &cnstMap) |
clone/factory function. | |
Should only be implemented by concrete widget class. It is also nice if you have a clone{subWidgetType}() function. so that we can use this for generic WidgetFactory objects. If you have a specific clone function, you can define the WidgetItem::clone function to call the specific one, to eliminate potentially redundant code at the "appearance level" of the hierarchy. for instance WidgetItem *clone() const { return cloneNode(); } virtual NodeWidget *cloneNode() const =0; This is a very important function, it replaces the copy constructor since it is protected at this level of the hierarchy. This is nessesary since we are sepparating behavior and appearance, and therefore can't copy at the behavior (this) level of the hierarchy. Any widget that can be publically constructed MUST implement a clone function, but it should be left virtual. Here is an example of a clone definition in SomeWidget, a concrete (appearance) widget class. virtual WidgetItem *SomeWidget::clone() const { return new SomeWidget(*this); } | |
virtual WidgetItem * | clone () const=0 |
Modified | |
When this is called the widget knows it has been changed and will emmit update events. This is used mostly for composite widgets that handle some events using their own manipulator; when this happens they have to notify their child widgets that they changed, so that they can update their children and anybody recieving attached signals.
As a user of widgets, you can IGNORE this function, doesn't apply to you. When you are building new widgets, however, this function comes in handy. Composite widgets should always forward this "event" onto children and emmit any relevant signals. | |
virtual void | setChanged ()=0 |
Events duplicated from <Renderable>. | |
These are duplicated to insure/ease framework issues, notice that mouse and move handle the "check with parent" and mouseDef(), moveDef() are what actually implement the behavior. | |
void | draw (const gutz::RenderEvent &r) |
main draw event... | |
virtual void | drawDef (const gutz::RenderEvent &r)=0 |
PURE VIRTUAL draw defintion, must be implemented by concrete base class, be sure to apply the matrix associated with this widget (_mat). | |
bool | mouse (const gutz::MouseEvent &me) |
a mouse event... | |
virtual bool | mouseDef (const gutz::MouseEvent &me) |
override this one to implement mouse behavior | |
virtual bool | mouseChild (WidgetItem *child, const gutz::MouseEvent &me) |
a child was moused, called before their mouseDef. | |
bool | move (const gutz::MouseMoveEvent &mme) |
a move event, checks with parent, then calls moveDef(). | |
virtual bool | moveDef (const gutz::MouseMoveEvent &mme) |
override this one to implement move behavior | |
virtual bool | moveChild (WidgetItem *child, const gutz::MouseMoveEvent &mme) |
a child wants to be moved. | |
Parent/Child management | |
virtual void | addChild (WidgetItem *child) |
a child was added | |
virtual void | delChild (WidgetItem *child) |
a child was deleted/ changed parent | |
virtual void | setParent (WidgetItem *parent) |
a (new?) parent now owns you :) | |
Some appearance management | |
ColorWStateSP | getColor () const |
void | setColor (ColorWState *const color) |
Draw on/off. | |
bool | isOn () const |
void | setOn (bool yes) |
Delete. | |
Does this object need to be removed from a render list? This means that the object is finished and anyone with a smart pointer to it needs to delete the smart pointer and stop using the renderable. | |
bool | needsDelete () const |
void | setDelete (bool yes) |
Interaction Functions | |
Return true if the event was for you.
By default interaction is forwarded to your protected manipulator (_manip). To use it just apply it in your draw function. However, if you don't add any events or call setManipEventsDefault(), you won't have any interaction. Override these functions in your base class to implement custom behaviors. | |
virtual bool | key (unsigned char k, int x, int y) |
Selected | |
Is this object currently selected? | |
virtual void | setSelected (bool yes) |
bool | isSelected () const |
Manipulator Interface | |
gutz::Manip * | getManip () const |
void | setManip (gutz::Manip *const m) |
void | setManipEventsDefault () |
you have to call this to enable default interaction, OR customize the manipulators events yourself. | |
Public Types | |
typedef gutz::SmartPtr< WidgetItem > | WidgetItemSP |
typedef gutz::vec2f | Point2 |
2D point | |
typedef gutz::arrayOwn1< Point2 > | Point2Array |
2D point array | |
typedef gutz::vec3f | Point3 |
3D point | |
typedef gutz::arrayOwn1< Point3 > | Point3Array |
3D point array | |
Public Member Functions | |
virtual | ~WidgetItem () |
virtual void | applyXform (gutz::mat4f xf)=0 |
apply a 4x4 transformation matrix, must be defined by a sub-class. | |
virtual Point2Array | getValidArea () const |
get the "tightest 2D bounding polygon" in screen space | |
Protected Member Functions | |
virtual void | _invalidate () |
called before widget changes, see also _update() some window systems need these calls before and after something changes, respectively, you'll have to specify them in your concrete class, if you need them. | |
virtual void | _update () |
called after widget is changed | |
virtual void | appearanceChanged () |
called if something about how it looks changes, does not include changes to the transform, just things like radius and color. | |
WidgetItem (WidgetItem *parent=0) | |
protected constructor, object cannot be publically created | |
virtual void | _incCount () |
gutz::Counted interface, increment reference count by one. | |
virtual void | _decCount () |
gutz::Counted interface, decrement reference count by one. | |
virtual int | _getCount () const |
gutz::Counted interface, get the current reference count. | |
Protected Attributes | |
bool | _on |
is this renderable currently "render-able"? | |
bool | _selected |
is this renderable selected? | |
bool | _deleteMe |
does this object need to be deleted? | |
gutz::ManipSP | _manip |
You get a manipulator free, no charge. | |
Friends | |
class | SmartPtr |
class | SmartPtrRef |
|
2D point
Definition at line 124 of file WidgetBase.h. Referenced by getValidArea(), NodeWidget::getValidArea(), and EdgeWidget::getValidArea(). |
|
2D point array
Definition at line 125 of file WidgetBase.h. Referenced by getValidArea(), NodeWidget::getValidArea(), and EdgeWidget::getValidArea(). |
|
3D point
Definition at line 127 of file WidgetBase.h. Referenced by FrameWidget::setDims(), FrameWidget::setHeight(), and FrameWidget::setWidth(). |
|
3D point array
Definition at line 128 of file WidgetBase.h. |
|
Definition at line 122 of file WidgetBase.h. |
|
Definition at line 313 of file WidgetBase.h. |
|
Definition at line 130 of file WidgetBase.h. References _constraintMap, _eventMap, and ConstraintMap. |
|
protected constructor, object cannot be publically created
Definition at line 391 of file WidgetBase.h. References _color, addEvent(), and MOVE. |
|
gutz::Counted interface, decrement reference count by one. Not generaly used by subclasses, mostly for collaboration with gutz::SmartPtr. Sometimes you need to call this though, see the documentation for gutz::SmartPtr Definition at line 54 of file smartptr.h. Referenced by TFImage::clear(), NrroImage::fBlendOverRGBA(), and Nrro::updateMinMax(). |
|
gutz::Counted interface, get the current reference count. Not generaly used by subclasses, mostly for collaboration with gutz::SmartPtr. Definition at line 58 of file smartptr.h. |
|
gutz::Counted interface, increment reference count by one. Not generaly used by subclasses, mostly for collaboration with gutz::SmartPtr. Sometimes you need to call this though, see the documentation for gutz::SmartPtr Definition at line 48 of file smartptr.h. Referenced by TFImage::clear(), NrroImage::fBlendOverRGBA(), and Nrro::updateMinMax(). |
|
called before widget changes, see also _update() some window systems need these calls before and after something changes, respectively, you'll have to specify them in your concrete class, if you need them. They are quite usefull, if you need to update when a widget changes, but you don't (nescessarily) care what changed Definition at line 380 of file WidgetBase.h. Referenced by FrameWidget::setCenter(), FrameWidget::setDims(), EdgeWidget::setEndPoint(), FrameWidget::setHeight(), SurfaceWidget::setPoint(), NodeWidget::setPointLocal(), EdgeWidget::setStartPoint(), and FrameWidget::setWidth(). |
|
called after widget is changed
Definition at line 383 of file WidgetBase.h. Referenced by FrameWidget::setCenter(), FrameWidget::setDims(), EdgeWidget::setEndPoint(), FrameWidget::setHeight(), SurfaceWidget::setPoint(), NodeWidget::setPointLocal(), EdgeWidget::setStartPoint(), and FrameWidget::setWidth(). |
|
a child was added
Definition at line 278 of file WidgetBase.h. |
|
addEvent. constraint defaults to "Free Move" constraint
Definition at line 321 of file WidgetBase.h. References _constraintMap, and _eventMap. Referenced by SurfaceWidget::SurfaceWidget(), and WidgetItem(). |
|
called if something about how it looks changes, does not include changes to the transform, just things like radius and color.
Reimplemented in GLUNodeWidget, and GLUEdgeWidget. Definition at line 387 of file WidgetBase.h. Referenced by EdgeWidget::setEndPoint(), NodeWidget::setRad(), EdgeWidget::setRad(), and EdgeWidget::setStartPoint(). |
|
apply a 4x4 transformation matrix, must be defined by a sub-class.
Implemented in EdgeWidget, NodeWidget, PolygonWidget, and SurfaceWidget. |
|
Implemented in EdgeWidget, FrameWidget, NodeWidget, and SurfaceWidget. |
|
a child was deleted/ changed parent
Reimplemented in FrameWidget. Definition at line 280 of file WidgetBase.h. |
|
delete an event from the event map
Definition at line 344 of file WidgetBase.h. References _constraintMap, and _eventMap. |
|
main draw event...
Framework only, do not override, Might need to add functionality here later. Implements Renderable. Definition at line 209 of file WidgetBase.h. |
|
PURE VIRTUAL draw defintion, must be implemented by concrete base class, be sure to apply the matrix associated with this widget (_mat).
Implemented in GLTFSurfaceWidget, TFViewWidget, GLSurfaceWidget, GLUNodeWidget, GLUEdgeWidget, FrameWidget, PolygonWidget, and SurfaceContentWidget. Referenced by draw(). |
|
Definition at line 366 of file WidgetBase.h. References _color. |
|
Definition at line 357 of file WidgetBase.h. References _constraintMap, and ConstraintMap. |
|
what is the event assigned to a key
Definition at line 338 of file WidgetBase.h. References _eventMap. |
|
getEvent, returns the event if one is defined, returns NO_EVENT if the mouse is up works for both: gutz::MouseEvent and gutz::MouseMoveEvent This function is usefull in implementation, externally use getEvent(unsigned int).
Definition at line 331 of file WidgetBase.h. References _eventMap, gutz::MouseEvent::getButton(), gutz::MouseEvent::isButtonDown(), and NO_EVENT. Referenced by mouseDef(), SurfaceWidget::mouseDef(), and SurfaceWidget::moveDef(). |
|
Definition at line 353 of file WidgetBase.h. References _eventMap. |
|
Definition at line 184 of file Renderable.h. References Renderable::_manip. |
|
get the "tightest 2D bounding polygon" in screen space
Reimplemented in EdgeWidget, and NodeWidget. Definition at line 302 of file WidgetBase.h. References Point2, and Point2Array. |
|
Definition at line 141 of file Renderable.h. References Renderable::_on. |
|
Definition at line 177 of file Renderable.h. References Renderable::_selected. |
|
Definition at line 166 of file Renderable.h. |
|
a mouse event...
checks with parent, then calls mouseDef() Reimplemented from Renderable. Definition at line 220 of file WidgetBase.h. References mouseDef(). |
|
a child was moused, called before their mouseDef.
return true if & only if parent will be handling the mouse event Reimplemented in TFViewWidget, FrameWidget, and SurfaceContentWidget. Definition at line 238 of file WidgetBase.h. |
|
override this one to implement mouse behavior
Reimplemented in SurfaceWidget. Definition at line 227 of file WidgetBase.h. References Renderable::_manip, getEvent(), and NO_EVENT. Referenced by mouse(), and FrameWidget::mouseChild(). |
|
a move event, checks with parent, then calls moveDef(). Framework only, do not override. Reimplemented from Renderable. Definition at line 245 of file WidgetBase.h. References moveDef(). |
|
a child wants to be moved. if true, child does nothing (parent moves them) if false, child moves self Reimplemented in TFViewWidget, FrameWidget, and SurfaceContentWidget. Definition at line 267 of file WidgetBase.h. |
|
override this one to implement move behavior
Reimplemented in SurfaceWidget. Definition at line 253 of file WidgetBase.h. References Renderable::_manip, and setChanged(). Referenced by move(), and FrameWidget::moveChild(). |
|
Definition at line 152 of file Renderable.h. References Renderable::_deleteMe. |
|
delete all events from the event map
Definition at line 347 of file WidgetBase.h. References _constraintMap, _eventMap, and ConstraintMap. |
|
Implemented in EdgeWidget, FrameWidget, NodeWidget, PolygonWidget, SurfaceContentWidget, and SurfaceWidget. Referenced by moveDef(). |
|
Definition at line 367 of file WidgetBase.h. References _color. Referenced by GLUEdgeWidget::GLUEdgeWidget(), and GLUNodeWidget::GLUNodeWidget(). |
|
Definition at line 358 of file WidgetBase.h. References _constraintMap. |
|
Definition at line 153 of file Renderable.h. References Renderable::_deleteMe, and Renderable::setOn(). |
|
Definition at line 354 of file WidgetBase.h. References _eventMap. |
|
Definition at line 185 of file Renderable.h. References Renderable::_manip. |
|
you have to call this to enable default interaction, OR customize the manipulators events yourself.
Definition at line 188 of file Renderable.h. References Renderable::_manip. |
|
Definition at line 142 of file Renderable.h. References Renderable::_on. Referenced by Renderable::setDelete(). |
|
a (new?) parent now owns you :)
Definition at line 283 of file WidgetBase.h. References Renderable::_manip. Referenced by SurfaceContentWidget::addContent(), SurfaceContentWidget::delContent(), and PolygonWidget::setPoints(). |
|
Definition at line 176 of file Renderable.h. References Renderable::_selected. |
|
Definition at line 40 of file smartptr.h. Referenced by Nrro::NrroIter< T >::NrroIter(). |
|
Definition at line 41 of file smartptr.h. |
|
does this object need to be deleted?
Definition at line 237 of file Renderable.h. Referenced by Renderable::needsDelete(), Renderable::Renderable(), and Renderable::setDelete(). |
|
|
is this renderable currently "render-able"?
Definition at line 235 of file Renderable.h. Referenced by Renderable::isOn(), Renderable::operator=(), Renderable::Renderable(), and Renderable::setOn(). |
|
is this renderable selected?
Definition at line 236 of file Renderable.h. Referenced by Renderable::isSelected(), Renderable::Renderable(), and Renderable::setSelected(). |