X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/89064717333f33c6ec477cf25e5692e3f4d6a1dd..105b2ca747a5a405262d9be7028bc082400f6898:/include/wx/sizer.h diff --git a/include/wx/sizer.h b/include/wx/sizer.h index cb1bf05439..7e01ff8ad9 100644 --- a/include/wx/sizer.h +++ b/include/wx/sizer.h @@ -20,10 +20,10 @@ // classes //--------------------------------------------------------------------------- -class WXDLLEXPORT wxButton; -class WXDLLEXPORT wxBoxSizer; -class WXDLLEXPORT wxSizerItem; -class WXDLLEXPORT wxSizer; +class WXDLLIMPEXP_FWD_CORE wxButton; +class WXDLLIMPEXP_FWD_CORE wxBoxSizer; +class WXDLLIMPEXP_FWD_CORE wxSizerItem; +class WXDLLIMPEXP_FWD_CORE wxSizer; #ifndef wxUSE_BORDER_BY_DEFAULT #ifdef __SMARTPHONE__ @@ -38,7 +38,7 @@ class WXDLLEXPORT wxSizer; // wxSizerFlags: flags used for an item in the sizer // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxSizerFlags +class WXDLLIMPEXP_CORE wxSizerFlags { public: // construct the flags object initialized with the given proportion (0 by @@ -58,6 +58,15 @@ public: return *this; } + wxSizerFlags& Expand() + { + m_flags |= wxEXPAND; + return *this; + } + + // notice that Align() replaces the current alignment flags, use specific + // methods below such as Top(), Left() &c if you want to set just the + // vertical or horizontal alignment wxSizerFlags& Align(int alignment) // combination of wxAlignment values { m_flags &= ~wxALIGN_MASK; @@ -66,27 +75,48 @@ public: return *this; } - wxSizerFlags& Expand() + // some shortcuts for Align() + wxSizerFlags& Centre() { return Align(wxALIGN_CENTRE); } + wxSizerFlags& Center() { return Centre(); } + + wxSizerFlags& Top() { - m_flags |= wxEXPAND; + m_flags &= ~(wxALIGN_BOTTOM | wxALIGN_CENTRE_VERTICAL); + return *this; + } + + wxSizerFlags& Left() + { + m_flags &= ~(wxALIGN_RIGHT | wxALIGN_CENTRE_HORIZONTAL); + return *this; + } + + wxSizerFlags& Right() + { + m_flags = (m_flags & ~wxALIGN_CENTRE_HORIZONTAL) | wxALIGN_RIGHT; + return *this; + } + + wxSizerFlags& Bottom() + { + m_flags = (m_flags & ~wxALIGN_CENTRE_VERTICAL) | wxALIGN_BOTTOM; return *this; } - // some shortcuts for Align() - wxSizerFlags& Centre() { return Align(wxALIGN_CENTRE); } - wxSizerFlags& Center() { return Centre(); } - wxSizerFlags& Top() { return Align(wxALIGN_TOP); } - wxSizerFlags& Left() { return Align(wxALIGN_LEFT); } - wxSizerFlags& Right() { return Align(wxALIGN_RIGHT); } - wxSizerFlags& Bottom() { return Align(wxALIGN_BOTTOM); } // default border size used by Border() below static int GetDefaultBorder() { #if wxUSE_BORDER_BY_DEFAULT + #ifdef __WXGTK20__ + // GNOME HIG says to use 6px as the base unit: + // http://library.gnome.org/devel/hig-book/stable/design-window.html.en + return 6; + #else // FIXME: default border size shouldn't be hardcoded and at the very // least they should depend on the current font size return 5; + #endif #else return 0; #endif @@ -95,6 +125,10 @@ public: wxSizerFlags& Border(int direction, int borderInPixels) { + wxCHECK_MSG( !(direction & ~wxALL), *this, + wxS("direction must be a combination of wxDirection ") + wxS("enum values.") ); + m_flags &= ~wxALL; m_flags |= direction; @@ -170,6 +204,13 @@ public: return *this; } + // makes the item ignore window's visibility status + wxSizerFlags& ReserveSpaceEvenIfHidden() + { + m_flags |= wxRESERVE_SPACE_EVEN_IF_HIDDEN; + return *this; + } + // accessors for wxSizer only int GetProportion() const { return m_proportion; } int GetFlags() const { return m_flags; } @@ -186,7 +227,7 @@ private: // wxSizerSpacer: used by wxSizerItem to represent a spacer // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxSizerSpacer +class WXDLLIMPEXP_CORE wxSizerSpacer { public: wxSizerSpacer(const wxSize& size) : m_size(size), m_isShown(true) { } @@ -209,15 +250,15 @@ private: // wxSizerItem // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxSizerItem : public wxObject +class WXDLLIMPEXP_CORE wxSizerItem : public wxObject { public: // window wxSizerItem( wxWindow *window, - int proportion, - int flag, - int border, - wxObject* userData ); + int proportion=0, + int flag=0, + int border=0, + wxObject* userData=NULL ); // window with flags wxSizerItem(wxWindow *window, const wxSizerFlags& flags) @@ -229,10 +270,10 @@ public: // subsizer wxSizerItem( wxSizer *sizer, - int proportion, - int flag, - int border, - wxObject* userData ); + int proportion=0, + int flag=0, + int border=0, + wxObject* userData=NULL ); // sizer with flags wxSizerItem(wxSizer *sizer, const wxSizerFlags& flags) @@ -245,10 +286,10 @@ public: // spacer wxSizerItem( int width, int height, - int proportion, - int flag, - int border, - wxObject* userData); + int proportion=0, + int flag=0, + int border=0, + wxObject* userData=NULL); // spacer with flags wxSizerItem(int width, int height, const wxSizerFlags& flags) @@ -274,6 +315,10 @@ public: { return m_minSize; } wxSize GetMinSizeWithBorder() const; + wxSize GetMaxSize() const + { return IsWindow() ? m_window->GetMaxSize() : wxDefaultSize; } + wxSize GetMaxSizeWithBorder() const; + void SetMinSize(const wxSize& size) { if ( IsWindow() ) @@ -298,6 +343,11 @@ public: virtual wxRect GetRect() { return m_rect; } + // set a sizer item id (different from a window id, all sizer items, + // including spacers, can have an associated id) + void SetId(int id) { m_id = id; } + int GetId() const { return m_id; } + bool IsWindow() const { return m_kind == Item_Window; } bool IsSizer() const { return m_kind == Item_Sizer; } bool IsSpacer() const { return m_kind == Item_Spacer; } @@ -327,10 +377,12 @@ public: { return m_kind == Item_Sizer ? m_sizer : NULL; } wxSize GetSpacer() const; - // this function behaves obviously for the windows and spacers but for the + // This function behaves obviously for the windows and spacers but for the // sizers it returns true if any sizer element is shown and only returns - // false if all of them are hidden + // false if all of them are hidden. Also, it always returns true if + // wxRESERVE_SPACE_EVEN_IF_HIDDEN flag was used. bool IsShown() const; + void Show(bool show); void SetUserData(wxObject* userData) @@ -340,6 +392,12 @@ public: wxPoint GetPosition() const { return m_pos; } + // Called once the first component of an item has been decided. This is + // used in algorithms that depend on knowing the size in one direction + // before the min size in the other direction can be known. + // Returns true if it made use of the information (and min size was changed). + bool InformFirstDirection( int direction, int size, int availableOtherDir=-1 ); + // these functions delete the current contents of the item if it's a sizer // or a spacer but not if it is a window void AssignWindow(wxWindow *window) @@ -386,6 +444,10 @@ protected: void DoSetSizer(wxSizer *sizer); void DoSetSpacer(const wxSize& size); + // Add the border specified for this item to the given size + // if it's != wxDefaultSize, just return wxDefaultSize otherwise. + wxSize AddBorderToSize(const wxSize& size) const; + // discriminated union: depending on m_kind one of the fields is valid enum { @@ -407,6 +469,7 @@ protected: int m_proportion; int m_border; int m_flag; + int m_id; // on screen rectangle of this item (not including borders) wxRect m_rect; @@ -420,7 +483,7 @@ protected: private: DECLARE_CLASS(wxSizerItem) - DECLARE_NO_COPY_CLASS(wxSizerItem) + wxDECLARE_NO_COPY_CLASS(wxSizerItem); }; WX_DECLARE_EXPORTED_LIST( wxSizerItem, wxSizerItemList ); @@ -430,7 +493,7 @@ WX_DECLARE_EXPORTED_LIST( wxSizerItem, wxSizerItemList ); // wxSizer //--------------------------------------------------------------------------- -class WXDLLEXPORT wxSizer: public wxObject, public wxClientDataContainer +class WXDLLIMPEXP_CORE wxSizer: public wxObject, public wxClientDataContainer { public: wxSizer() { m_containingWindow = NULL; } @@ -456,9 +519,10 @@ public: wxObject* userData = NULL); wxSizerItem* Add( wxWindow *window, const wxSizerFlags& flags); wxSizerItem* Add( wxSizer *sizer, const wxSizerFlags& flags); + wxSizerItem* Add( int width, int height, const wxSizerFlags& flags); wxSizerItem* Add( wxSizerItem *item); - wxSizerItem* AddSpacer(int size); + virtual wxSizerItem *AddSpacer(int size); wxSizerItem* AddStretchSpacer(int prop = 1); wxSizerItem* Insert(size_t index, @@ -486,7 +550,15 @@ public: wxSizerItem* Insert(size_t index, wxSizer *sizer, const wxSizerFlags& flags); - virtual wxSizerItem* Insert( size_t index, wxSizerItem *item); + wxSizerItem* Insert(size_t index, + int width, + int height, + const wxSizerFlags& flags); + + // NB: do _not_ override this function in the derived classes, this one is + // virtual for compatibility reasons only to allow old code overriding + // it to continue to work, override DoInsert() instead in the new code + virtual wxSizerItem* Insert(size_t index, wxSizerItem *item); wxSizerItem* InsertSpacer(size_t index, int size); wxSizerItem* InsertStretchSpacer(size_t index, int prop = 1); @@ -509,6 +581,7 @@ public: wxObject* userData = NULL); wxSizerItem* Prepend(wxWindow *window, const wxSizerFlags& flags); wxSizerItem* Prepend(wxSizer *sizer, const wxSizerFlags& flags); + wxSizerItem* Prepend(int width, int height, const wxSizerFlags& flags); wxSizerItem* Prepend(wxSizerItem *item); wxSizerItem* PrependSpacer(int size); @@ -539,6 +612,11 @@ public: virtual void Clear( bool delete_windows = false ); virtual void DeleteWindows(); + // Inform sizer about the first direction that has been decided (by parent item) + // Returns true if it made use of the information (and recalculated min size) + virtual bool InformFirstDirection( int WXUNUSED(direction), int WXUNUSED(size), int WXUNUSED(availableOtherDir) ) + { return false; } + void SetMinSize( int width, int height ) { DoSetMinSize( width, height ); } void SetMinSize( const wxSize& size ) @@ -578,21 +656,42 @@ public: virtual void Layout(); + wxSize ComputeFittingClientSize(wxWindow *window); + wxSize ComputeFittingWindowSize(wxWindow *window); + wxSize Fit( wxWindow *window ); void FitInside( wxWindow *window ); void SetSizeHints( wxWindow *window ); - void SetVirtualSizeHints( wxWindow *window ); +#if WXWIN_COMPATIBILITY_2_8 + // This only calls FitInside() since 2.9 + wxDEPRECATED( void SetVirtualSizeHints( wxWindow *window ) ); +#endif wxSizerItemList& GetChildren() { return m_children; } const wxSizerItemList& GetChildren() const { return m_children; } - void SetDimension( int x, int y, int width, int height ); + void SetDimension(const wxPoint& pos, const wxSize& size) + { + m_position = pos; + m_size = size; + Layout(); + + // This call is required for wxWrapSizer to be able to calculate its + // minimal size correctly. + InformFirstDirection(wxHORIZONTAL, size.x, size.y); + } + void SetDimension(int x, int y, int width, int height) + { SetDimension(wxPoint(x, y), wxSize(width, height)); } + + size_t GetItemCount() const { return m_children.GetCount(); } + bool IsEmpty() const { return m_children.IsEmpty(); } wxSizerItem* GetItem( wxWindow *window, bool recursive = false ); wxSizerItem* GetItem( wxSizer *sizer, bool recursive = false ); wxSizerItem* GetItem( size_t index ); + wxSizerItem* GetItemById( int id, bool recursive = false ); // Manage whether individual scene items are considered // in the layout calculations or not. @@ -625,8 +724,6 @@ protected: // the window this sizer is used in, can be NULL wxWindow *m_containingWindow; - wxSize GetMaxWindowSize( wxWindow *window ) const; - wxSize GetMinWindowSize( wxWindow *window ); wxSize GetMaxClientSize( wxWindow *window ) const; wxSize GetMinClientSize( wxWindow *window ); wxSize VirtualFitSize( wxWindow *window ); @@ -636,6 +733,10 @@ protected: virtual bool DoSetItemMinSize( wxSizer *sizer, int width, int height ); virtual bool DoSetItemMinSize( size_t index, int width, int height ); + // insert a new item into m_children at given index and return the item + // itself + virtual wxSizerItem* DoInsert(size_t index, wxSizerItem *item); + private: DECLARE_CLASS(wxSizer) }; @@ -644,17 +745,33 @@ private: // wxGridSizer //--------------------------------------------------------------------------- -class WXDLLEXPORT wxGridSizer: public wxSizer +class WXDLLIMPEXP_CORE wxGridSizer: public wxSizer { public: + // ctors specifying the number of columns only: number of rows will be + // deduced automatically depending on the number of sizer elements + wxGridSizer( int cols, int vgap, int hgap ); + wxGridSizer( int cols, const wxSize& gap = wxSize(0, 0) ); + + // ctors specifying the number of rows and columns wxGridSizer( int rows, int cols, int vgap, int hgap ); - wxGridSizer( int cols, int vgap = 0, int hgap = 0 ); + wxGridSizer( int rows, int cols, const wxSize& gap ); virtual void RecalcSizes(); virtual wxSize CalcMin(); - void SetCols( int cols ) { m_cols = cols; } - void SetRows( int rows ) { m_rows = rows; } + void SetCols( int cols ) + { + wxASSERT_MSG( cols >= 0, "Number of columns must be non-negative"); + m_cols = cols; + } + + void SetRows( int rows ) + { + wxASSERT_MSG( rows >= 0, "Number of rows must be non-negative"); + m_rows = rows; + } + void SetVGap( int gap ) { m_vgap = gap; } void SetHGap( int gap ) { m_hgap = gap; } int GetCols() const { return m_cols; } @@ -662,17 +779,51 @@ public: int GetVGap() const { return m_vgap; } int GetHGap() const { return m_hgap; } + int GetEffectiveColsCount() const { return m_cols ? m_cols : CalcCols(); } + int GetEffectiveRowsCount() const { return m_rows ? m_rows : CalcRows(); } + + // return the number of total items and the number of columns and rows + // (for internal use only) + int CalcRowsCols(int& rows, int& cols) const; + protected: + // the number of rows/columns in the sizer, if 0 then it is determined + // dynamically depending on the total number of items int m_rows; int m_cols; + + // gaps between rows and columns int m_vgap; int m_hgap; - // return the number of total items and the number of columns and rows - int CalcRowsCols(int& rows, int& cols) const; + virtual wxSizerItem *DoInsert(size_t index, wxSizerItem *item); void SetItemBounds( wxSizerItem *item, int x, int y, int w, int h ); + // returns the number of columns/rows needed for the current total number + // of children (and the fixed number of rows/columns) + int CalcCols() const + { + wxCHECK_MSG + ( + m_rows, 0, + "Can't calculate number of cols if number of rows is not specified" + ); + + return (m_children.GetCount() + m_rows - 1) / m_rows; + } + + int CalcRows() const + { + wxCHECK_MSG + ( + m_cols, 0, + "Can't calculate number of cols if number of rows is not specified" + ); + + return (m_children.GetCount() + m_cols - 1) / m_cols; + } + private: DECLARE_CLASS(wxGridSizer) }; @@ -681,8 +832,8 @@ private: // wxFlexGridSizer //--------------------------------------------------------------------------- -// the bevaiour for resizing wxFlexGridSizer cells in the "non-flexible" -// direction +// values which define the behaviour for resizing wxFlexGridSizer cells in the +// "non-flexible" direction enum wxFlexSizerGrowMode { // don't resize the cells in non-flexible direction at all @@ -695,14 +846,20 @@ enum wxFlexSizerGrowMode wxFLEX_GROWMODE_ALL }; -class WXDLLEXPORT wxFlexGridSizer: public wxGridSizer +class WXDLLIMPEXP_CORE wxFlexGridSizer: public wxGridSizer { public: - // ctors/dtor + // ctors specifying the number of columns only: number of rows will be + // deduced automatically depending on the number of sizer elements + wxFlexGridSizer( int cols, int vgap, int hgap ); + wxFlexGridSizer( int cols, const wxSize& gap = wxSize(0, 0) ); + + // ctors specifying the number of rows and columns wxFlexGridSizer( int rows, int cols, int vgap, int hgap ); - wxFlexGridSizer( int cols, int vgap = 0, int hgap = 0 ); - virtual ~wxFlexGridSizer(); + wxFlexGridSizer( int rows, int cols, const wxSize& gap ); + // dtor + virtual ~wxFlexGridSizer(); // set the rows/columns which will grow (the others will remain of the // constant initial size) @@ -711,6 +868,8 @@ public: void AddGrowableCol( size_t idx, int proportion = 0 ); void RemoveGrowableCol( size_t idx ); + bool IsRowGrowable( size_t idx ); + bool IsColGrowable( size_t idx ); // the sizer cells may grow in both directions, not grow at all or only // grow in one direction but not the other @@ -734,8 +893,8 @@ public: protected: void AdjustForFlexDirection(); - void AdjustForGrowables(const wxSize& sz, const wxSize& minsz, - int nrows, int ncols); + void AdjustForGrowables(const wxSize& sz); + void FindWidthsAndHeights(int nrows, int ncols); // the heights/widths of all rows/columns wxArrayInt m_rowHeights, @@ -759,24 +918,27 @@ protected: private: DECLARE_CLASS(wxFlexGridSizer) - DECLARE_NO_COPY_CLASS(wxFlexGridSizer) + wxDECLARE_NO_COPY_CLASS(wxFlexGridSizer); }; //--------------------------------------------------------------------------- // wxBoxSizer //--------------------------------------------------------------------------- -class WXDLLEXPORT wxBoxSizer: public wxSizer +class WXDLLIMPEXP_CORE wxBoxSizer: public wxSizer { public: wxBoxSizer(int orient) { m_orient = orient; + m_totalProportion = 0; wxASSERT_MSG( m_orient == wxHORIZONTAL || m_orient == wxVERTICAL, - _T("invalid value for wxBoxSizer orientation") ); + wxT("invalid value for wxBoxSizer orientation") ); } + virtual wxSizerItem *AddSpacer(int size); + int GetOrientation() const { return m_orient; } bool IsVertical() const { return m_orient == wxVERTICAL; } @@ -790,7 +952,7 @@ public: protected: // helpers for our code: this returns the component of the given wxSize in // the direction of the sizer and in the other direction, respectively - int SizeInMajorDir(const wxSize& sz) const + int GetSizeInMajorDir(const wxSize& sz) const { return m_orient == wxHORIZONTAL ? sz.x : sz.y; } @@ -805,7 +967,7 @@ protected: return m_orient == wxHORIZONTAL ? pt.x : pt.y; } - int SizeInMinorDir(const wxSize& sz) const + int GetSizeInMinorDir(const wxSize& sz) const { return m_orient == wxHORIZONTAL ? sz.y : sz.x; } @@ -854,9 +1016,9 @@ private: #if wxUSE_STATBOX -class WXDLLEXPORT wxStaticBox; +class WXDLLIMPEXP_FWD_CORE wxStaticBox; -class WXDLLEXPORT wxStaticBoxSizer: public wxBoxSizer +class WXDLLIMPEXP_CORE wxStaticBoxSizer: public wxBoxSizer { public: wxStaticBoxSizer(wxStaticBox *box, int orient); @@ -881,14 +1043,18 @@ protected: private: DECLARE_CLASS(wxStaticBoxSizer) - DECLARE_NO_COPY_CLASS(wxStaticBoxSizer) + wxDECLARE_NO_COPY_CLASS(wxStaticBoxSizer); }; #endif // wxUSE_STATBOX +//--------------------------------------------------------------------------- +// wxStdDialogButtonSizer +//--------------------------------------------------------------------------- + #if wxUSE_BUTTON -class WXDLLEXPORT wxStdDialogButtonSizer: public wxBoxSizer +class WXDLLIMPEXP_CORE wxStdDialogButtonSizer: public wxBoxSizer { public: // Constructor just creates a new wxBoxSizer, not much else. @@ -929,7 +1095,7 @@ protected: private: DECLARE_CLASS(wxStdDialogButtonSizer) - DECLARE_NO_COPY_CLASS(wxStdDialogButtonSizer) + wxDECLARE_NO_COPY_CLASS(wxStdDialogButtonSizer); }; #endif // wxUSE_BUTTON @@ -957,12 +1123,18 @@ inline void wxSizerItem::SetSpacer(const wxSize& size) } inline void wxSizerItem::SetSpacer(int width, int height) -{ - DoSetSpacer(wxSize(width, height)); -} +{ + DoSetSpacer(wxSize(width, height)); +} #endif // WXWIN_COMPATIBILITY_2_8 +inline wxSizerItem* +wxSizer::Insert(size_t index, wxSizerItem *item) +{ + return DoInsert(index, item); +} + inline wxSizerItem* wxSizer::Add( wxSizerItem *item ) @@ -1000,6 +1172,12 @@ wxSizer::Add( wxSizer *sizer, const wxSizerFlags& flags ) return Add( new wxSizerItem(sizer, flags) ); } +inline wxSizerItem* +wxSizer::Add( int width, int height, const wxSizerFlags& flags ) +{ + return Add( new wxSizerItem(width, height, flags) ); +} + inline wxSizerItem* wxSizer::AddSpacer(int size) { @@ -1060,6 +1238,12 @@ wxSizer::Prepend( wxSizer *sizer, const wxSizerFlags& flags ) return Prepend( new wxSizerItem(sizer, flags) ); } +inline wxSizerItem* +wxSizer::Prepend( int width, int height, const wxSizerFlags& flags ) +{ + return Prepend( new wxSizerItem(width, height, flags) ); +} + inline wxSizerItem* wxSizer::Insert( size_t index, wxWindow *window, @@ -1106,6 +1290,12 @@ wxSizer::Insert( size_t index, wxSizer *sizer, const wxSizerFlags& flags ) return Insert( index, new wxSizerItem(sizer, flags) ); } +inline wxSizerItem* +wxSizer::Insert( size_t index, int width, int height, const wxSizerFlags& flags ) +{ + return Insert( index, new wxSizerItem(width, height, flags) ); +} + inline wxSizerItem* wxSizer::InsertSpacer(size_t index, int size) {