Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/lib/gui/gl/glgui_widget.h @ 10536

Last change on this file since 10536 was 10374, checked in by patrick, 18 years ago

merged branche gui

File size: 14.1 KB
RevLine 
[4838]1/*!
[5391]2 * @file glgui_widget.h
3 * The gl_widget of the openglGUI
4 */
[1853]5
[5362]6#ifndef _GLGUI_WIDGET_H
7#define _GLGUI_WIDGET_H
[1853]8
[5362]9#include "element_2d.h"
[7919]10
[8619]11#include "glgui_defs.h"
12
[6295]13#include "material.h"
[8769]14#include "font.h"
15
[8448]16#include "rect2D.h"
[6295]17
[7919]18#include "event.h"
[9406]19#include "sigslot/signal.h"
[5690]20
[7779]21namespace OrxGui
[5391]22{
[7919]23  class GLGuiCursor;
24
[5387]25
[7779]26  //! This is widget part of the openglGUI class
27  /**
28   * A widget is the main class of all the elements of th GUI.
29   */
30  class GLGuiWidget : public Element2D
[8448]31  {
[9869]32    ObjectListDeclaration(GLGuiWidget);
[5366]33  public:
[8035]34    GLGuiWidget(GLGuiWidget* parent = NULL);
[5366]35    virtual ~GLGuiWidget();
[2036]36
[5366]37    void show();
[6431]38    void hide();
[5364]39
[8035]40    void setParentWidget(GLGuiWidget* parent);
41    GLGuiWidget* parent() const { return this->_parent; }
[7868]42
[7919]43    /// FOCUS
[8717]44    /** @brief gives mouse - focus to this widget */
45    void giveMouseFocus();
46    void breakMouseFocus();
47
[7919]48    /** @returns true if the widget is focusable */
49    bool focusable() const { return this->_focusable; };
50    /** @returns true if the position is inside of the Widget. @param position the position to check */
51    bool focusOverWidget(const Vector2D& position) const;
52    /** @brief overloaded function, that returns true if the cursor is on top of the Widget */
53    bool focusOverWidget(const OrxGui::GLGuiCursor* const cursor) const;
54
[8717]55    /** @returns the currently mouse - focused Widget (NULL if none is focused). */
56    static GLGuiWidget* mouseFocused() { return GLGuiWidget::_mouseFocused; };
[7919]57
[8717]58    /// SELECT
59    void select();
60    void unselect();
61    /** @returns true if the Widget is selectable */
62    bool selectable() const { return this->_selectable; }
[7919]63
[8717]64    /** @returns the currently Selected Widget (NULL if none is selected). */
65    static GLGuiWidget* selected() { return GLGuiWidget::_selected; };
66
[7919]67    /// CLICK
[8717]68    bool pushed() { return _pushed; };
[8035]69    void click(const Vector2D& pos);
70    void release(const Vector2D& pos);
[7919]71    bool clickable() const { return this->_clickable; };
72
[8619]73    OrxGui::State state() const { return this->_state; };
[8035]74
75    Rect2D& backRect() { return this->_backRect; };
76    const Rect2D& backRect() const { return this->_backRect; };
[7868]77
[8448]78    void setFrontColor(const Color& frontColor, bool instantaniously = false);
[7868]79
[8619]80    void setWidgetSize(const Vector2D& size);
81    void setWidgetSize(float x, float y);
[8035]82
[8619]83    void animateBack();
[8115]84
[8717]85    ///////////////////////////////////////////////////////////////////////////////////
86    /// STYLE /////////////////////////////////////////////////////////////////////////
[8619]87    ////////////////////////////////
88    /// Retrieve Current Values. ///
89    ////////////////////////////////
90    /** @returns current left borderWidth */
91    inline float borderLeft() const { return _currentStyle._borderLeft; }
92    /** @returns current right borderWidth */
93    inline float borderRight() const { return _currentStyle._borderRight; }
94    /** @returns current top borderWidth */
95    inline float borderTop() const { return _currentStyle._borderTop; }
96    /** @returns burrent bottom borderWidth */
97    inline float borderBottom() const { return _currentStyle._borderBottom; }
[8115]98
[8035]99
[8619]100    /** @returns current textSize */
101    inline float textSize() const { return _currentStyle._textSize; }
102    /** @returns the Background Color */
103    inline const Color& backgroundColor() const { return _currentStyle._background.diffuseColor(); }
104    /** @returns the current Background Material. */
105    inline const Material& background() const { return _currentStyle._background; }
106    /** @returns the current background Texture. */
107    inline const Texture& backgroundTexture() const { return _currentStyle._background.diffuseTexture(); }
108    /** @returns the current foreground Color */
109    inline const Color& foregroundColor() const { return _currentStyle._foreground.diffuseColor(); }
110    /** @returns the current ForeGroung Material. */
111    inline const Material& foreground() const { return _currentStyle._foreground; }
[8035]112
113
[8619]114    /** @returns FeaturePosition */
115    inline FeaturePosition featurePosition() const { return _featurePosition; }
[8983]116    /** @returns the constant font */
117    inline const Font& font() const { return _font; }
[8619]118    /** @returns the font */
[8983]119    inline Font& font() { return _font; }
[8619]120    /** @returns true if the Element is Animated */
121    inline bool animating() const { return _animating; }
122    /** @returns true if State-Changes are animated */
123    inline bool animatedStateChanges() const { return _animatedStateChanges; }
124
125
126    ///////////////////////////////////////////////////////////////
127    /// Retrieve Values for the Saved Values inside the States. ///
128    ///////////////////////////////////////////////////////////////
129    /** @returns left borderWidth @param state the State to retrieve from */
130    inline float borderLeft(OrxGui::State state) const { return _style[state]._borderLeft; }
131    /** @returns right borderWidth @param state the State to retrieve from */
132    inline float borderRight(OrxGui::State state) const { return _style[state]._borderRight; }
133    /** @returns top borderWidth @param state the State to retrieve from */
134    inline float borderTop(OrxGui::State state) const { return _style[state]._borderTop; }
135    /** @returns bottom borderWidth @param state the State to retrieve from */
136    inline float borderBottom(OrxGui::State state) const { return _style[state]._borderBottom; }
137
138    /** @returns textSize @param state the State to retrieve from */
139    inline float textSize(OrxGui::State state) const { return _style[state]._textSize; }
140    /** @returns the Background Color @param state the State to retrieve from */
141    inline const Color& backgroundColor(OrxGui::State state) const { return _style[state]._background.diffuseColor(); }
142    /** @returns the Background Material. @param state the state to retrieve from */
143    inline const Material& background(OrxGui::State state) const { return _style[state]._background; }
144    /** @returns background Texture. @param state the State to retrieve from */
145    inline const Texture& backgroundTexture(OrxGui::State state) const { return _style[state]._background.diffuseTexture(); }
146    /** @returns the foreground Color @param state the State to retrieve from */
147    inline const Color& foregroundColor(OrxGui::State state) const { return _style[state]._foreground.diffuseColor(); }
148    /** @returns the ForeGroung Material. @param state the state to retrieve from */
149    inline const Material& foreground(OrxGui::State state) const { return _style[state]._foreground; }
150
151
152    /// SETUP
153    void resetStyle();
154    void loadParams(const TiXmlElement* root);
155
156    void setBorderLeft(float value);
157    void setBorderLeft(float value, OrxGui::State state);
158    void setBorderLeftS(float value, const std::string& stateName);
159
160    void setBorderRight(float value);
161    void setBorderRight(float value, OrxGui::State state);
162    void setBorderRightS(float value, const std::string& stateName);
163
164    void setBorderTop(float value);
165    void setBorderTop(float value, OrxGui::State state);
166    void setBorderTopS(float value, const std::string& stateName);
167
168    void setBorderBottom(float value);
169    void setBorderBottom(float value, OrxGui::State state);
170    void setBorderBottomS(float value, const std::string& stateName);
171
172    void setTextSize(float value);
173    void setTextSize(float value, OrxGui::State state);
174    void setTextSizeS(float value, const std::string& stateName);
175
176    void setBackgroundColor(const Color& color);
177    void setBackgroundColor(const Color& color, OrxGui::State state);
178    void setBackgroundColorS(float r, float g, float b, float a, const std::string& stateName);
179
180    void setBackgroundTexture(const Texture& texture);
181    void setBackgroundTexture(const std::string& textureName);
182    void setBackgroundTexture(const Texture& texture, OrxGui::State state);
[10374]183    void setBackgroundTexture(const std::string& textureName, OrxGui::State state);
[8619]184    void setBackgroundTexture(const std::string& textureName, const std::string& stateName);
185
186    void setForegroundColor(const Color& color);
187    void setForegroundColor(const Color& color, OrxGui::State state);
188    void setForegroundColorS(float r, float g, float b, float a, const std::string& stateName);
189
[8990]190    void setForegroundTexture(const Texture& texture);
191    void setForegroundTexture(const std::string& textureName);
192    void setForegroundTexture(const Texture& texture, OrxGui::State state);
193    void setForegroundTexture(const std::string& textureName, const std::string& stateName);
194
[8619]195    void loadBackgroundMaterial(const Material& material);
196    void loadBackgroundMaterial(const Material& material, OrxGui::State state);
197    void loadBackgroundMaterial(const TiXmlElement* element);
198    void loadBackgroundMaterial(const TiXmlElement* element, OrxGui::State state);
199    void loadBackgroundMaterialS(const TiXmlElement* element, const std::string& stateName);
200
201    void loadForegroundMaterial(const Material& material);
202    void loadForegroundMaterial(const Material& material, OrxGui::State state);
203    void loadForegroundMaterial(const TiXmlElement* element, OrxGui::State state);
204    void loadForegroundMaterialS(const TiXmlElement* element, const std::string& stateName);
205
206    void setFeaturePosition(FeaturePosition featurePosition);
207    void setFeaturePositionS(const std::string& featurePosition);
208
[9656]209    virtual void setFont(const Font& font);
210    void setFont(const std::string& fontName, unsigned int renderSize = FONT_DEFAULT_RENDER_SIZE);
[8619]211
212    void setAnimatedStateChanges(bool animated);
213    void switchState(OrxGui::State state);
[8717]214    ///////////////////////////////////////////////////////////////////////////////////
[8619]215
216
[8448]217    inline void drawRect(const Rect2D& rect) const
218    {
[8035]219      glBegin(GL_QUADS);
220      glTexCoord2i(0,0); glVertex2d(rect.left(), rect.top());
221      glTexCoord2i(0,1); glVertex2d(rect.left(), rect.bottom());
222      glTexCoord2i(1,1); glVertex2d(rect.right(), rect.bottom());
223      glTexCoord2i(1,0); glVertex2d(rect.right(), rect.top());
224      glEnd();
225    }
226
227
228    virtual void update() {};
[8448]229    virtual void tick(float dt);
[8035]230    virtual void draw() const;
231
[7919]232    /** @param the Event to process. @returns true if the Event has been consumed*/
[8148]233    virtual bool processEvent(const Event& event) { return false; };
[7919]234
[8619]235    bool getState(const std::string& stateName, OrxGui::State* state);
[8448]236
[8035]237  protected:
[8717]238    /** @param focusable sets if the Widget should be focusable */
239    void setFocusable(bool focusable = true) { this->_focusable = focusable; };
240    /** @param selectable true if the widget should be selectable */
241    void setSelectable(bool selectable) { this->_selectable = selectable; }
242    /** @param focusable true if the widget should be focusable */
243    void setClickable(bool clickable = true) { this->_clickable = clickable; };
244
245
246    /// RENDERING
[10368]247    void beginDraw() const;
[8717]248    inline void endDraw() const { glPopMatrix(); };
249
250
[8035]251    /// LOOKS
252    virtual void resize();
[7919]253
[8115]254    virtual void hiding() {};
255    virtual void showing() {};
[8717]256
[8448]257    virtual void updateFrontColor() {};
258
259
260    /// EVENTS
[8717]261    // mouse clicking
[8035]262    virtual void clicking(const Vector2D& pos);
[8717]263    virtual void releasing(const Vector2D& pos, bool focused);
264    // mouse focusing
[7919]265    virtual void receivedFocus();
266    virtual void removedFocus();
[8717]267    // selecting either with the mouse by clicking, or by the keybord traversing to it.
268    virtual void selecting();
269    virtual void unselecting();
270    // destroying the Widget.
271    virtual void destroying();
[5391]272
[9656]273    // unparent the widget and from this widget seen as parent
274    virtual void removeChildWidget(GLGuiWidget* widget) {};
[5391]275
[9656]276
[8717]277    virtual void debug(unsigned int level) const;
[8619]278
[7779]279  private:
280    void init();
281
[7919]282  private:
[8619]283    static GLGuiWidget*            _selected;         //!< The currently selected Widget.
[8717]284    static GLGuiWidget*            _mouseFocused;     //!< The currently Focused Widget (mouse-focus).
285    static GLGuiWidget*            _inputGrabber;     //!< The Widget that grabs input (keyboard-focus).
[8619]286
287
288    /// WIDGET
[8035]289    GLGuiWidget*                   _parent;           //!< The parent of this Widget.
290
[7919]291    /// LOOKS
[8035]292    Rect2D                         _backRect;
[8140]293    Vector2D                       _minSize;
294
[8448]295
[7919]296    /// EVENTS
[8619]297    OrxGui::State                  _state;
[8717]298    bool                           _pushed;
[8619]299
[7919]300    bool                           _focusable;        //!< If this widget can receive focus.
301    bool                           _clickable;        //!< if this widget can be clicked upon.
[8717]302    bool                           _selectable;       //!< If this widget can be selected.
[5391]303
[7919]304
[8035]305
306
[8619]307    /// STYLE - Variables.
308    typedef struct
309    {
[8717]310      float                        _borderLeft;           //!< The Distance to the left Border of the widget, before any internal Element starts.
311      float                        _borderRight;          //!< The Distance to the right Border of the widget, before any internal Element starts.
312      float                        _borderTop;            //!< The Distance to the top Border of the widget, before any internal Element starts
313      float                        _borderBottom;         //!< The Distance to the bottom Border of the widget, before any internal Element starts
[8619]314
[8717]315      float                        _textSize;             //!< The TextSize of the Widget.
[8619]316
[8717]317      Material                     _background;           //!< The Background Material of the Widget.
[8619]318
[8717]319      Material                     _foreground;           //!< The foreground Material of the Widget.
[8619]320    }
321    StatedStyle;
322
323
[8717]324    StatedStyle                    _style[GLGUI_STATE_COUNT]; //!< Styles configured for different States
[8619]325
[8717]326    FeaturePosition                _featurePosition;      //!< The Position a Feature will be layed at (checkbox(box), slider(text),...)
[8769]327    Font                           _font;                 //!< The Font used in the current Widget.
[8619]328
[9656]329    static Font*                   _defaultFont;          //!< The default Font.
[8619]330
331    /// ANIMATION STUFF:
[8717]332    bool                           _animatedStateChanges; //!< If the Transitions between States are Animated automatically.
[8619]333
[8717]334    bool                           _animating;            //!< If the Widget is animated at the moment (Texture might be an AnimatedTexture.)
335    float                          _animationCycle;
336    float                          _animationDuration;
337    StatedStyle                    _currentStyle;
[8619]338
[7779]339  };
340}
[5362]341#endif /* _GLGUI_WIDGET_H */
Note: See TracBrowser for help on using the repository browser.