X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/94d33c49d11788ae1939e9fffb0b28fe04693f47..ef8e4bf082ce8ac5339e296748441408501c55ed:/wxPython/src/_gbsizer.i diff --git a/wxPython/src/_gbsizer.i b/wxPython/src/_gbsizer.i index ce24f8df9d..19a31686ea 100644 --- a/wxPython/src/_gbsizer.i +++ b/wxPython/src/_gbsizer.i @@ -40,11 +40,19 @@ %{ bool wxGBPosition_helper(PyObject* source, wxGBPosition** obj) { + if (source == Py_None) { + **obj = wxGBPosition(-1,-1); + return true; + } return wxPyTwoIntItem_helper(source, obj, wxT("wxGBPosition")); } bool wxGBSpan_helper(PyObject* source, wxGBSpan** obj) { + if (source == Py_None) { + **obj = wxGBSpan(-1,-1); + return true; + } return wxPyTwoIntItem_helper(source, obj, wxT("wxGBSpan")); } @@ -54,43 +62,81 @@ bool wxGBSpan_helper(PyObject* source, wxGBSpan** obj) //--------------------------------------------------------------------------- %newgroup; +DocStr(wxGBPosition, +"This class represents the position of an item in a virtual grid of +rows and columns managed by a `wx.GridBagSizer`. wxPython has +typemaps that will automatically convert from a 2-element sequence of +integers to a wx.GBPosition, so you can use the more pythonic +representation of the position nearly transparently in Python code.", ""); class wxGBPosition { public: wxGBPosition(int row=0, int col=0); - + ~wxGBPosition(); + int GetRow() const; int GetCol() const; void SetRow(int row); void SetCol(int col); - - bool operator==(const wxGBPosition& p) const; - bool operator!=(const wxGBPosition& p) const; + + %extend { + KeepGIL(__eq__); + DocStr(__eq__, "Compare GBPosition for equality.", ""); + bool __eq__(PyObject* other) { + wxGBPosition temp, *obj = &temp; + if ( other == Py_None ) return false; + if ( ! wxGBPosition_helper(other, &obj) ) { + PyErr_Clear(); + return false; + } + return self->operator==(*obj); + } + + + KeepGIL(__ne__); + DocStr(__ne__, "Compare GBPosition for inequality.", ""); + bool __ne__(PyObject* other) { + wxGBPosition temp, *obj = &temp; + if ( other == Py_None ) return true; + if ( ! wxGBPosition_helper(other, &obj)) { + PyErr_Clear(); + return true; + } + return self->operator!=(*obj); + } + } + + %extend { - PyObject* asTuple() { - wxPyBeginBlockThreads(); + void Set(int row=0, int col=0) { + self->SetRow(row); + self->SetCol(col); + } + + PyObject* Get() { + wxPyBlock_t blocked = wxPyBeginBlockThreads(); PyObject* tup = PyTuple_New(2); PyTuple_SET_ITEM(tup, 0, PyInt_FromLong(self->GetRow())); PyTuple_SET_ITEM(tup, 1, PyInt_FromLong(self->GetCol())); - wxPyEndBlockThreads(); + wxPyEndBlockThreads(blocked); return tup; } } %pythoncode { - def __str__(self): return str(self.asTuple()) - def __repr__(self): return 'wxGBPosition'+str(self.asTuple()) - def __len__(self): return len(self.asTuple()) - def __getitem__(self, index): return self.asTuple()[index] + asTuple = wx._deprecated(Get, "asTuple is deprecated, use `Get` instead") + def __str__(self): return str(self.Get()) + def __repr__(self): return 'wx.GBPosition'+str(self.Get()) + def __len__(self): return len(self.Get()) + def __getitem__(self, index): return self.Get()[index] def __setitem__(self, index, val): if index == 0: self.SetRow(val) elif index == 1: self.SetCol(val) else: raise IndexError - def __nonzero__(self): return self.asTuple() != (0,0) - def __getinitargs__(self): return () - def __getstate__(self): return self.asTuple() - def __setstate__(self, state): self.Set(*state) + def __nonzero__(self): return self.Get() != (0,0) + __safe_for_unpickling__ = True + def __reduce__(self): return (wx.GBPosition, self.Get()) } %pythoncode { @@ -102,42 +148,87 @@ public: +DocStr(wxGBSpan, +"This class is used to hold the row and column spanning attributes of +items in a `wx.GridBagSizer`. wxPython has typemaps that will +automatically convert from a 2-element sequence of integers to a +wx.GBSpan, so you can use the more pythonic representation of the span +nearly transparently in Python code. +", ""); + class wxGBSpan { public: - wxGBSpan(int rowspan=1, int colspan=1); + DocCtorStr( + wxGBSpan(int rowspan=1, int colspan=1), + "Construct a new wxGBSpan, optionally setting the rowspan and +colspan. The default is (1,1). (Meaning that the item occupies one +cell in each direction.", ""); + + ~wxGBSpan(); int GetRowspan() const; int GetColspan() const; void SetRowspan(int rowspan); void SetColspan(int colspan); + - bool operator==(const wxGBSpan& o) const; - bool operator!=(const wxGBSpan& o) const; + %extend { + KeepGIL(__eq__); + DocStr(__eq__, "Compare wxGBSpan for equality.", ""); + bool __eq__(PyObject* other) { + wxGBSpan temp, *obj = &temp; + if ( other == Py_None ) return false; + if ( ! wxGBSpan_helper(other, &obj) ) { + PyErr_Clear(); + return false; + } + return self->operator==(*obj); + } + + + KeepGIL(__ne__); + DocStr(__ne__, "Compare GBSpan for inequality.", ""); + bool __ne__(PyObject* other) { + wxGBSpan temp, *obj = &temp; + if ( other == Py_None ) return true; + if ( ! wxGBSpan_helper(other, &obj)) { + PyErr_Clear(); + return true; + } + return self->operator!=(*obj); + } + } + %extend { - PyObject* asTuple() { - wxPyBeginBlockThreads(); + void Set(int rowspan=1, int colspan=1) { + self->SetRowspan(rowspan); + self->SetColspan(colspan); + } + + PyObject* Get() { + wxPyBlock_t blocked = wxPyBeginBlockThreads(); PyObject* tup = PyTuple_New(2); PyTuple_SET_ITEM(tup, 0, PyInt_FromLong(self->GetRowspan())); PyTuple_SET_ITEM(tup, 1, PyInt_FromLong(self->GetColspan())); - wxPyEndBlockThreads(); + wxPyEndBlockThreads(blocked); return tup; } } %pythoncode { - def __str__(self): return str(self.asTuple()) - def __repr__(self): return 'wxGBSpan'+str(self.asTuple()) - def __len__(self): return len(self.asTuple()) - def __getitem__(self, index): return self.asTuple()[index] + asTuple = wx._deprecated(Get, "asTuple is deprecated, use `Get` instead") + def __str__(self): return str(self.Get()) + def __repr__(self): return 'wx.GBSpan'+str(self.Get()) + def __len__(self): return len(self.Get()) + def __getitem__(self, index): return self.Get()[index] def __setitem__(self, index, val): if index == 0: self.SetRowspan(val) elif index == 1: self.SetColspan(val) else: raise IndexError - def __nonzero__(self): return self.asTuple() != (0,0) - def __getinitargs__(self): return () - def __getstate__(self): return self.asTuple() - def __setstate__(self, state): self.Set(*state) + def __nonzero__(self): return self.Get() != (0,0) + __safe_for_unpickling__ = True + def __reduce__(self): return (wx.GBSpan, self.Get()) } %pythoncode { @@ -155,175 +246,363 @@ const wxGBSpan wxDefaultSpan; //--------------------------------------------------------------------------- +DocStr(wxGBSizerItem, +"The wx.GBSizerItem class is used to track the additional data about +items in a `wx.GridBagSizer` such as the item's position in the grid +and how many rows or columns it spans. +", ""); class wxGBSizerItem : public wxSizerItem { public: - wxGBSizerItem(); - - %name(GBSizerItemWindow) wxGBSizerItem( wxWindow *window, - const wxGBPosition& pos, - const wxGBSpan& span, - int flag, - int border, - wxObject* userData ); + DocCtorStr( + wxGBSizerItem(), + "Constructs an empty wx.GBSizerItem. Either a window, sizer or spacer +size will need to be set, as well as a position and span before this +item can be used in a Sizer. - %name(GBSizerItemSizer) wxGBSizerItem( wxSizer *sizer, - const wxGBPosition& pos, - const wxGBSpan& span, - int flag, - int border, - wxObject* userData ); +You will probably never need to create a wx.GBSizerItem directly as they +are created automatically when the sizer's Add method is called.", ""); - %name(GBSizerItemSpacer) wxGBSizerItem( int width, - int height, - const wxGBPosition& pos, - const wxGBSpan& span, - int flag, - int border, - wxObject* userData); + ~wxGBSizerItem(); + + %extend { + DocStr(wxGBSizerItem( wxWindow *window, const wxGBPosition& pos,const wxGBSpan& span,int flag,int border,PyObject* userData=NULL ), + "Construct a `wx.GBSizerItem` for a window.", ""); + + %RenameCtor(GBSizerItemWindow, wxGBSizerItem( wxWindow *window, + const wxGBPosition& pos, + const wxGBSpan& span, + int flag, + int border, + PyObject* userData=NULL )) + { + wxPyUserData* data = NULL; + if ( userData ) { + wxPyBlock_t blocked = wxPyBeginBlockThreads(); + data = new wxPyUserData(userData); + wxPyEndBlockThreads(blocked); + } + return new wxGBSizerItem(window, pos, span, flag, border, data); + } + + + DocStr(wxGBSizerItem( wxSizer *sizer,const wxGBPosition& pos,const wxGBSpan& span,int flag,int border,PyObject* userData=NULL ), + "Construct a `wx.GBSizerItem` for a sizer", ""); + %disownarg( wxSizer *sizer ); + %RenameCtor(GBSizerItemSizer, wxGBSizerItem( wxSizer *sizer, + const wxGBPosition& pos, + const wxGBSpan& span, + int flag, + int border, + PyObject* userData=NULL )) + { + wxPyUserData* data = NULL; + if ( userData ) { + wxPyBlock_t blocked = wxPyBeginBlockThreads(); + data = new wxPyUserData(userData); + wxPyEndBlockThreads(blocked); + } + return new wxGBSizerItem(sizer, pos, span, flag, border, data); + } + %cleardisown( wxSizer *sizer ); + + + DocStr(wxGBSizerItem( int width,int height,const wxGBPosition& pos,const wxGBSpan& span,int flag,int border,PyObject* userData=NULL), + "Construct a `wx.GBSizerItem` for a spacer.", ""); + %RenameCtor(GBSizerItemSpacer, wxGBSizerItem( int width, + int height, + const wxGBPosition& pos, + const wxGBSpan& span, + int flag, + int border, + PyObject* userData=NULL)) + { + wxPyUserData* data = NULL; + if ( userData ) { + wxPyBlock_t blocked = wxPyBeginBlockThreads(); + data = new wxPyUserData(userData); + wxPyEndBlockThreads(blocked); + } + return new wxGBSizerItem(width, height, pos, span, flag, border, data); + } + } - // Get the grid position of the item - wxGBPosition GetPos() const; - %pythoncode { def GetPosTuple(self): return self.GetPos().asTuple() } - - // Get the row and column spanning of the item - wxGBSpan GetSpan() const; - %pythoncode { def GetSpanTuple(self): return self.GetSpan().asTuple() } + + DocDeclStr( + wxGBPosition , GetPos() const, + "Get the grid position of the item", ""); + + %pythoncode { def GetPosTuple(self): return self.GetPos().Get() } - // If the item is already a member of a sizer then first ensure that there - // is no other item that would intersect with this one at the new - // position, then set the new position. Returns true if the change is - // successful and after the next Layout the item will be moved. - bool SetPos( const wxGBPosition& pos ); + + + DocDeclStr( + wxGBSpan , GetSpan() const, + "Get the row and column spanning of the item", ""); + + %pythoncode { def GetSpanTuple(self): return self.GetSpan().Get() } - // If the item is already a member of a sizer then first ensure that there - // is no other item that would intersect with this one with its new - // spanning size, then set the new spanning. Returns true if the change - // is successful and after the next Layout the item will be resized. - bool SetSpan( const wxGBSpan& span ); + + + DocDeclStr( + bool , SetPos( const wxGBPosition& pos ), + "If the item is already a member of a sizer then first ensure that +there is no other item that would intersect with this one at the new +position, then set the new position. Returns True if the change is +successful and after the next Layout() the item will be moved.", ""); + - %nokwargs Intersects; + DocDeclStr( + bool , SetSpan( const wxGBSpan& span ), + "If the item is already a member of a sizer then first ensure that +there is no other item that would intersect with this one with its new +spanning size, then set the new spanning. Returns True if the change +is successful and after the next Layout() the item will be resized. +", ""); - // Returns true if this item and the other item instersect - bool Intersects(const wxGBSizerItem& other); - // Returns true if the given pos/span would intersect with this item. - bool Intersects(const wxGBPosition& pos, const wxGBSpan& span); + + DocDeclStr( + bool , Intersects(const wxGBSizerItem& other), + "Returns True if this item and the other item instersect.", ""); + - // Get the row and column of the endpoint of this item - void GetEndPos(int& row, int& col); + DocDeclStrName( + bool , Intersects(const wxGBPosition& pos, const wxGBSpan& span), + "Returns True if the given pos/span would intersect with this item.", "", + IntersectsPos); + + %extend { + DocStr(GetEndPos, + "Get the row and column of the endpoint of this item.", ""); + wxGBPosition GetEndPos() { + int row, col; + self->GetEndPos(row, col); + return wxGBPosition(row, col); + } + } + - wxGridBagSizer* GetGBSizer() const; - void SetGBSizer(wxGridBagSizer* sizer); + DocDeclStr( + wxGridBagSizer* , GetGBSizer() const, + "Get the sizer this item is a member of.", ""); + DocDeclStr( + void , SetGBSizer(wxGridBagSizer* sizer), + "Set the sizer this item is a member of.", ""); + + %property(EndPos, GetEndPos, doc="See `GetEndPos`"); + %property(GBSizer, GetGBSizer, SetGBSizer, doc="See `GetGBSizer` and `SetGBSizer`"); + %property(Pos, GetPos, SetPos, doc="See `GetPos` and `SetPos`"); + %property(Span, GetSpan, SetSpan, doc="See `GetSpan` and `SetSpan`"); }; //--------------------------------------------------------------------------- +DocStr(wxGridBagSizer, +"A `wx.Sizer` that can lay out items in a virtual grid like a +`wx.FlexGridSizer` but in this case explicit positioning of the items +is allowed using `wx.GBPosition`, and items can optionally span more +than one row and/or column using `wx.GBSpan`. The total size of the +virtual grid is determined by the largest row and column that items are +positioned at, adjusted for spanning. +", ""); class wxGridBagSizer : public wxFlexGridSizer { public: - wxGridBagSizer(int vgap = 0, int hgap = 0 ); + %pythonAppend wxGridBagSizer "self._setOORInfo(self)" + + DocCtorStr( + wxGridBagSizer(int vgap = 0, int hgap = 0 ), + "Constructor, with optional parameters to specify the gap between the +rows and columns.", ""); - // The Add method returns true if the item was successfully placed at the - // given cell position, false if something was already there. + %extend { - bool Add( PyObject* item, - const wxGBPosition& pos, - const wxGBSpan& span = wxDefaultSpan, - int flag = 0, - int border = 0, - PyObject* userData = NULL ) { + DocAStr(Add, + "Add(self, item, GBPosition pos, GBSpan span=DefaultSpan, int flag=0, +int border=0, userData=None) -> wx.GBSizerItem", + + "Adds an item to the sizer at the grid cell *pos*, optionally spanning +more than one row or column as specified with *span*. The remaining +args behave similarly to `wx.Sizer.Add`. + +Returns True if the item was successfully placed at the given cell +position, False if something was already there. +", ""); + wxGBSizerItem* Add( PyObject* item, + const wxGBPosition& pos, + const wxGBSpan& span = wxDefaultSpan, + int flag = 0, + int border = 0, + PyObject* userData = NULL ) { wxPyUserData* data = NULL; - wxPyBeginBlockThreads(); + wxPyBlock_t blocked = wxPyBeginBlockThreads(); wxPySizerItemInfo info = wxPySizerItemTypeHelper(item, true, false); if ( userData && (info.window || info.sizer || info.gotSize) ) data = new wxPyUserData(userData); - wxPyEndBlockThreads(); + if ( info.sizer ) + PyObject_SetAttrString(item,"thisown",Py_False); + wxPyEndBlockThreads(blocked); // Now call the real Add method if a valid item type was found if ( info.window ) - return self->Add(info.window, pos, span, flag, border, data); + return (wxGBSizerItem*)self->Add(info.window, pos, span, flag, border, data); else if ( info.sizer ) - return self->Add(info.sizer, pos, span, flag, border, data); + return (wxGBSizerItem*)self->Add(info.sizer, pos, span, flag, border, data); else if (info.gotSize) - return self->Add(info.size.GetWidth(), info.size.GetHeight(), - pos, span, flag, border, data); - return false; + return (wxGBSizerItem*)self->Add(info.size.GetWidth(), info.size.GetHeight(), + pos, span, flag, border, data); + return NULL; } } - - %name(AddItem) bool Add( wxGBSizerItem *item ); + %disownarg( wxGBSizerItem *item ); + DocDeclAStrName( + wxGBSizerItem* , Add( wxGBSizerItem *item ), + "Add(self, GBSizerItem item) -> wx.GBSizerItem", + "Add an item to the sizer using a `wx.GBSizerItem`. Returns True if +the item was successfully placed at its given cell position, False if +something was already there.", "", + AddItem); + %cleardisown( wxGBSizerItem *item ); + + DocDeclStr( + wxSize , GetCellSize(int row, int col) const, + "Get the size of the specified cell, including hgap and +vgap. Only valid after a Layout.", ""); + + DocDeclStr( + wxSize , GetEmptyCellSize() const, + "Get the size used for cells in the grid with no item.", ""); + + DocDeclStr( + void , SetEmptyCellSize(const wxSize& sz), + "Set the size used for cells in the grid with no item.", ""); + - // Get/Set the size used for cells in the grid with no item. - wxSize GetEmptyCellSize() const; - void SetEmptyCellSize(const wxSize& sz); - - // Get the grid position of the specified item + %nokwargs GetItemPosition; + %noautodoc GetItemPosition; + DocStr(GetItemPosition, + "GetItemPosition(self, item) -> GBPosition + +Get the grid position of the specified *item* where *item* is either a +window or subsizer that is a member of this sizer, or a zero-based +index of an item.", ""); wxGBPosition GetItemPosition(wxWindow *window); wxGBPosition GetItemPosition(wxSizer *sizer); wxGBPosition GetItemPosition(size_t index); - // Set the grid position of the specified item. Returns true on success. - // If the move is not allowed (because an item is already there) then - // false is returned. + %nokwargs SetItemPosition; + %noautodoc SetItemPosition; + DocStr(SetItemPosition, + "SetItemPosition(self, item, GBPosition pos) -> bool + +Set the grid position of the specified *item* where *item* is either a +window or subsizer that is a member of this sizer, or a zero-based +index of an item. Returns True on success. If the move is not +allowed (because an item is already there) then False is returned. +", ""); bool SetItemPosition(wxWindow *window, const wxGBPosition& pos); bool SetItemPosition(wxSizer *sizer, const wxGBPosition& pos); bool SetItemPosition(size_t index, const wxGBPosition& pos); - // Get the row/col spanning of the specified item + + %nokwargs GetItemSpan; + %noautodoc GetItemSpan; + DocStr(GetItemSpan, + "GetItemSpan(self, item) -> GBSpan + +Get the row/col spanning of the specified *item* where *item* is +either a window or subsizer that is a member of this sizer, or a +zero-based index of an item.", ""); wxGBSpan GetItemSpan(wxWindow *window); wxGBSpan GetItemSpan(wxSizer *sizer); wxGBSpan GetItemSpan(size_t index); - // Set the row/col spanning of the specified item. Returns true on - // success. If the move is not allowed (because an item is already there) - // then false is returned. + + %nokwargs SetItemSpan; + %noautodoc SetItemSpan; + DocStr(SetItemSpan, + "SetItemSpan(self, item, GBSpan span) -> bool + +Set the row/col spanning of the specified *item* where *item* is +either a window or subsizer that is a member of this sizer, or a +zero-based index of an item. Returns True on success. If the move is +not allowed (because an item is already there) then False is returned.", ""); bool SetItemSpan(wxWindow *window, const wxGBSpan& span); bool SetItemSpan(wxSizer *sizer, const wxGBSpan& span); bool SetItemSpan(size_t index, const wxGBSpan& span); + - // Find the sizer item for the given window or subsizer, returns NULL if - // not found. (non-recursive) %nokwargs FindItem; + %noautodoc FindItem; + DocStr(FindItem, + "FindItem(self, item) -> GBSizerItem + +Find the sizer item for the given window or subsizer, returns None if +not found. (non-recursive)", ""); wxGBSizerItem* FindItem(wxWindow* window); wxGBSizerItem* FindItem(wxSizer* sizer); - // Return the sizer item for the given grid cell, or NULL if there is no - // item at that position. (non-recursive) - wxGBSizerItem* FindItemAtPosition(const wxGBPosition& pos); - + DocDeclStr( + wxGBSizerItem* , FindItemAtPosition(const wxGBPosition& pos), + "Return the sizer item for the given grid cell, or None if there is no +item at that position. (non-recursive)", ""); - // Return the sizer item that has a matching user data (it only compares - // pointer values) or NULL if not found. (non-recursive) - wxGBSizerItem* FindItemWithData(const wxObject* userData); - // These are what make the sizer do size calculations and layout - virtual void RecalcSizes(); - virtual wxSize CalcMin(); + DocDeclStr( + wxGBSizerItem* , FindItemAtPoint(const wxPoint& pt), + "Return the sizer item located at the point given in *pt*, or None if +there is no item at that point. The (x,y) coordinates in pt correspond +to the client coordinates of the window using the sizer for +layout. (non-recursive)", ""); + + +// DocDeclStr( +// wxGBSizerItem* , FindItemWithData(const wxObject* userData), +// "Return the sizer item that has a matching user data (it only compares +// pointer values) or None if not found. (non-recursive)", ""); + + // Look at all items and see if any intersect (or would overlap) the given - // item. Returns true if so, false if there would be no overlap. If an + // item. Returns True if so, False if there would be no overlap. If an // excludeItem is given then it will not be checked for intersection, for // example it may be the item we are checking the position of. - %nokwargs CheckForIntersection; - bool CheckForIntersection(wxGBSizerItem* item, wxGBSizerItem* excludeItem = NULL); - bool CheckForIntersection(const wxGBPosition& pos, const wxGBSpan& span, wxGBSizerItem* excludeItem = NULL); + + DocDeclStr( + bool , CheckForIntersection(wxGBSizerItem* item, wxGBSizerItem* excludeItem = NULL), + "Look at all items and see if any intersect (or would overlap) the +given *item*. Returns True if so, False if there would be no overlap. +If an *excludeItem* is given then it will not be checked for +intersection, for example it may be the item we are checking the +position of. +", ""); + + DocDeclStrName( + bool , CheckForIntersection(const wxGBPosition& pos, const wxGBSpan& span, wxGBSizerItem* excludeItem = NULL), + "Look at all items and see if any intersect (or would overlap) the +given position and span. Returns True if so, False if there would be +no overlap. If an *excludeItem* is given then it will not be checked +for intersection, for example it may be the item we are checking the +position of.", "", + CheckForIntersectionPos); + };