X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=otk%2Fwidget.hh;h=c56b4a5621c82231853875d17b9cbb67f7180c31;hb=0ebf6a17547f75c1fa961acbf3fdd59c0e494d22;hp=207de86c790e794046c41c8496761c3010aac039;hpb=c187fbdf60956f3bf6392bfd132ba960e43ef4ec;p=chaz%2Fopenbox diff --git a/otk/widget.hh b/otk/widget.hh index 207de86c..c56b4a56 100644 --- a/otk/widget.hh +++ b/otk/widget.hh @@ -1,55 +1,137 @@ +// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- #ifndef __widget_hh #define __widget_hh -#include "basewidget.hh" +#include "eventhandler.hh" +#include "rect.hh" +#include "renderstyle.hh" -extern "C" { -#include -} +#include +#include +#include namespace otk { -class OtkWidget : public OtkBaseWidget { +class Surface; +class RenderTexture; +class RenderColor; +class EventDispatcher; +class Widget : public EventHandler, public StyleNotify { public: - enum Direction { Horizontal, Vertical }; - OtkWidget(OtkWidget *parent, Direction = Horizontal); - OtkWidget(OtkEventDispatcher *event_dispatcher, Style *style, - Direction direction = Horizontal, Cursor cursor = 0, - int bevel_width = 1); - - virtual ~OtkWidget(); - - virtual void update(void); - - inline bool isStretchableHorz(void) const { return _stretchable_horz; } - void setStretchableHorz(bool s_horz = true) { _stretchable_horz = s_horz; } - - inline bool isStretchableVert(void) const { return _stretchable_vert; } - void setStretchableVert(bool s_vert = true) { _stretchable_vert = s_vert; } - - inline Direction getDirection(void) const { return _direction; } - void setDirection(Direction dir) { _direction = dir; } - - inline OtkEventDispatcher *getEventDispatcher(void) - { return _event_dispatcher; } - void setEventDispatcher(OtkEventDispatcher *disp); - + 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() { _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; + private: - - void adjust(void); - void adjustHorz(void); - void adjustVert(void); - void internalResize(int width, int height); - + 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; - - bool _stretchable_vert; - bool _stretchable_horz; - - OtkEventDispatcher *_event_dispatcher; + 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 _children; + + EventDispatcher *_dispatcher; + + int _ignore_config; }; }