otk/widget.hh (raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- #ifndef __widget_hh #define __widget_hh #include "eventhandler.hh" #include "rect.hh" #include "renderstyle.hh" #include <list> #include <algorithm> #include <cassert> namespace otk { class Surface; class RenderTexture; class RenderColor; class EventDispatcher; class Widget : public EventHandler, public StyleNotify { public: enum Direction { Horizontal, Vertical }; 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<Widget*>& 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); int _screen; Widget *_parent; Window _window; Surface *_surface; long _event_mask; RenderStyle::Justify _alignment; Direction _direction; 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; const RenderColor *_bordercolor; int _borderwidth; int _bevel; bool _dirty; std::list<Widget*> _children; EventDispatcher *_dispatcher; int _ignore_config; }; } #endif // __widget_hh |