X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=otk%2Fwidget.hh;h=07b6c0845ba1d38039bfa6acab9d6641eb6e0466;hb=1f63f7b331887a192ddf927670471c3f00f307f5;hp=dd12de7c14cf5c5645a2c62226979d387360a835;hpb=f0e2abf573760ab075b4683d7724f72f2d00f914;p=chaz%2Fopenbox diff --git a/otk/widget.hh b/otk/widget.hh index dd12de7c..07b6c084 100644 --- a/otk/widget.hh +++ b/otk/widget.hh @@ -1,110 +1,141 @@ -#include -#include +// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- +#ifndef __widget_hh +#define __widget_hh +#include "eventhandler.hh" #include "rect.hh" -#include "point.hh" -#include "texture.hh" -#include "style.hh" +#include "renderstyle.hh" + +#include +#include +#include namespace otk { -class OtkWidget { +class Surface; +class RenderTexture; +class RenderColor; +class EventDispatcher; +class Widget : public EventHandler, public StyleNotify { public: - enum Direction { Horizontal, Vertical }; - typedef std::list OtkWidgetList; - - OtkWidget(OtkWidget *parent, Direction = Horizontal); - OtkWidget(Style *style, Direction direction = Horizontal, - Cursor cursor = 0, int bevel_width = 1); - - virtual ~OtkWidget(); - - inline Window getWindow(void) const { return _window; } - inline const OtkWidget *getParent(void) const { return _parent; } - inline const OtkWidgetList &getChildren(void) const { return _children; } - inline unsigned int getScreen(void) const { return _screen; } - inline const Rect &getRect(void) const { return _rect; } - - void move(const Point &to); - void move(int x, int y); - - virtual void resize(const Point &to); - virtual void resize(int x, int y); - - virtual void setGeometry(const Rect &new_geom); - virtual void setGeometry(const Point &topleft, int width, int height); - virtual void setGeometry(int x, int y, int width, int height); - - inline bool isVisible(void) const { return _visible; }; - virtual void show(void); - virtual void hide(void); - - inline bool isFocused(void) const { return _focused; }; - virtual void focus(void); - - inline bool hasGrabbedMouse(void) const { return _grabbed_mouse; } - bool grabMouse(void); - void ungrabMouse(void); - - inline bool hasGrabbedKeyboard(void) const { return _grabbed_keyboard; } - bool grabKeyboard(void); - void ungrabKeyboard(void); - - inline const BTexture *getTexture(void) const { return _texture; } - virtual void setTexture(BTexture *texture = 0); - - virtual void addChild(OtkWidget *child, bool front = false); - virtual void removeChild(OtkWidget *child); - - inline bool getStretchableHorz(void) const { return _stretchable_horz; } - void setStretchableHorz(bool s_horz) { _stretchable_horz = s_horz; } - - inline bool getStretchableVert(void) const { return _stretchable_vert; } - void setStretchableVert(bool s_vert) { _stretchable_vert = s_vert; } - - inline Cursor getCursor(void) const { return _cursor; } - - inline int getBevelWidth(void) const { return _bevel_width; } - void setBevelWidth(int bevel_width) - { assert(bevel_width > 0); _bevel_width = bevel_width; } - - inline Direction getDirection(void) const { return _direction; } - void setDirection(Direction dir) { _direction = dir; } - - inline Style *getStyle(void) const { return _style; } - void setStyle(Style *style) { _style = style; } - + Widget(int screen, EventDispatcher *ed, Direction direction = Horizontal, + int bevel = 3, bool overrideredir = false); + Widget(Widget *parent, Direction direction = Horizontal, int bevel = 3); + virtual ~Widget(); + + inline int screen() const { return _screen; } + inline Window window() const { return _window; } + inline Widget *parent() const { return _parent; } + inline Direction direction() const { return _direction; } + + inline RenderStyle::Justify alignment() const { return _alignment; } + void setAlignment(RenderStyle::Justify a); + + inline long eventMask() const { return _event_mask; } + virtual void setEventMask(long e); + + inline const Rect& area() const { return _area; } + inline Rect usableArea() const { return Rect(_area.position(), + Size(_area.width() - + _borderwidth * 2, + _area.height() - + _borderwidth * 2));} + inline const Size& minSize() const { return _min_size; } + inline const Size& maxSize() const { return _max_size; } + virtual void setMaxSize(const Size &s); + + virtual void show(bool children = false); + virtual void hide(); + inline bool visible() const { return _visible; } + + virtual void update(); + virtual void refresh() { if (_visible) { _dirty = true; render(); } } + + virtual void setBevel(int b); + inline int bevel() const { return _bevel; } + + void move(const Point &p) + { moveresize(Rect(p, _area.size())); } + void resize(const Size &s) + { moveresize(Rect(_area.position(), s)); } + /*! + When a widget has a parent, this won't change the widget directly, but will + just cause the parent to re-layout all its children. + */ + virtual void moveresize(const Rect &r); + + inline const RenderColor *borderColor() const { return _bordercolor; } + virtual void setBorderColor(const RenderColor *c); + + inline int borderWidth() const { return _borderwidth; } + virtual void setBorderWidth(int w); + + const std::list& children() const { return _children; } + + virtual void exposeHandler(const XExposeEvent &e); + virtual void configureHandler(const XConfigureEvent &e); + virtual void styleChanged(const RenderStyle &style); + +protected: + virtual void addChild(Widget *w) { assert(w); _children.push_back(w); } + virtual void removeChild(Widget *w) { assert(w); _children.remove(w); } + + //! Find the default min/max sizes for the widget. Useful after the in-use + //! style has changed. + virtual void calcDefaultSizes(); + + virtual void setMinSize(const Size &s); + + //! Arrange the widget's children + virtual void layout(); + virtual void layoutHorz(); + virtual void layoutVert(); + virtual void render(); + virtual void renderForeground(Surface&) {}; + virtual void renderChildren(); + + void createWindow(bool overrideredir); + + RenderTexture *_texture; + + EventDispatcher *dispatcher() const { return _dispatcher; } + private: + void internal_moveresize(int x, int y, int w, int h); - void create(void); - + int _screen; + Widget *_parent; Window _window; - - OtkWidget *_parent; - OtkWidgetList _children; - - Style *_style; + Surface *_surface; + long _event_mask; + + RenderStyle::Justify _alignment; Direction _direction; - Cursor _cursor; - int _bevel_width; + Rect _area; + //! This size is the size *inside* the border, so they won't match the + //! actual size of the widget + Size _min_size; + //! This size is the size *inside* the border, so they won't match the + //! actual size of the widget + Size _max_size; bool _visible; - bool _focused; - - bool _grabbed_mouse; - bool _grabbed_keyboard; + + const RenderColor *_bordercolor; + int _borderwidth; + int _bevel; + bool _dirty; - bool _stretchable_vert; - bool _stretchable_horz; + std::list _children; - BTexture *_texture; - Pixmap _bg_pixmap; + EventDispatcher *_dispatcher; - Rect _rect; - unsigned int _screen; + int _ignore_config; }; } + +#endif // __widget_hh