00001 #ifndef FAITH__LAYOUT_H
00002 #define FAITH__LAYOUT_H
00003
00004 #include <faith/rect.h>
00005 #include <faith/core.h>
00006
00007 namespace Faith
00008 {
00009
00010 class Widget;
00011 class SizePolicy;
00012
00017 class FAITH_CORE_EXPORT Layout
00018 {
00019 Faith::Widget *mWidget;
00020 int mMargin, mSpacing;
00021 Faith::Rect mGeometry;
00022
00023 friend class Faith::Widget;
00024
00025 Layout(const Layout&) { }
00026
00027 protected:
00028 class FAITH_CORE_EXPORT LayoutItem
00029 {
00030 public:
00031 LayoutItem();
00032 virtual ~LayoutItem();
00033
00034 virtual Widget *widget() { return 0; }
00035 virtual Layout *layout() { return 0; }
00036
00037 virtual Size minimumSize() const=0;
00038 virtual Size maximumSize() const=0;
00039 virtual Size sizeHint() const=0;
00040
00041 virtual SizePolicy sizePolicy() const=0;
00042
00043 virtual void setGeometry(const Rect &rect)=0;
00044 };
00045
00046 class FAITH_CORE_EXPORT LayoutWidgetItem : public LayoutItem
00047 {
00048 Widget *mWidget;
00049 public:
00050 LayoutWidgetItem(Widget *widget)
00051 : mWidget(widget)
00052 { }
00053
00054 Widget *widget() { return mWidget; }
00055
00056 virtual Size minimumSize() const;
00057 virtual Size maximumSize() const;
00058 virtual Size sizeHint() const;
00059
00060 virtual SizePolicy sizePolicy() const;
00061 virtual void setGeometry(const Rect &rect);
00062 };
00063
00064 class FAITH_CORE_EXPORT LayoutLayoutItem : public LayoutItem
00065 {
00066 Layout *mLayout;
00067 public:
00068 LayoutLayoutItem(Layout *layout)
00069 : mLayout(layout)
00070 { }
00071
00072 Layout *layout() { return mLayout; }
00073
00074 virtual Size minimumSize() const;
00075 virtual Size maximumSize() const;
00076 virtual Size sizeHint() const;
00077
00078 virtual SizePolicy sizePolicy() const;
00079 virtual void setGeometry(const Rect &rect);
00080 };
00081
00082 public:
00083 Layout(Faith::Widget *widget, int margin=0, int spacing=-1);
00084 virtual ~Layout();
00085
00086 Faith::Widget *widget() { return mWidget; }
00087 const Faith::Widget *widget() const { return mWidget; }
00088
00092 int spacing() const;
00093
00098 int margin() const;
00099
00103 Faith::Rect geometry() const { return mGeometry; }
00104
00108 Faith::Size size() const { return mGeometry.size(); }
00109
00110 protected:
00116 virtual void layout()=0;
00117
00118 void invalidate();
00119
00127 virtual void childAdded(Faith::Widget *w)=0;
00128
00136 virtual void childRemoved(Faith::Widget *w)=0;
00137
00138 virtual Faith::Size minimumSize() const=0;
00139 virtual Faith::Size maximumSize() const=0;
00140 Faith::Size sizeHint() const;
00141
00148 void resizeChild(LayoutItem *child, const Faith::Rect &rect);
00149
00150 private:
00151 void setLayoutGeometryInLayout(const Faith::Rect &rect);
00152 };
00153
00154
00155 }
00156
00157 #endif