1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: SWIG interface defs for the Sizers
7 // Created: 18-Sept-1999
9 // Copyright: (c) 2003 by Total Control Software
10 // Licence: wxWindows license
11 /////////////////////////////////////////////////////////////////////////////
16 //---------------------------------------------------------------------------
21 //---------------------------------------------------------------------------
25 "The wx.SizerItem class is used to track the position, size and other
26 attributes of each item managed by a `wx.Sizer`. It is not usually
27 necessary to use this class because the sizer elements can also be
28 identified by their positions or window or sizer references but
29 sometimes it may be more convenient to use wx.SizerItem directly.
30 Also, custom classes derived from `wx.PySizer` will probably need to
31 use the collection of wx.SizerItems held by wx.Sizer when calculating
34 :see: `wx.Sizer`, `wx.GBSizerItem`", "");
36 class wxSizerItem : public wxObject {
40 "Constructs an empty wx.SizerItem. Either a window, sizer or spacer
41 size will need to be set before this item can be used in a Sizer.
43 You will probably never need to create a wx.SizerItem directly as they
44 are created automatically when the sizer's Add, Insert or Prepend
47 :see: `wx.SizerItemSpacer`, `wx.SizerItemWindow`, `wx.SizerItemSizer`", "");
55 wxSizerItem( wxWindow *window, int proportion, int flag,
56 int border, PyObject* userData=NULL ),
57 "Constructs a `wx.SizerItem` for tracking a window.", "");
59 %RenameCtor(SizerItemWindow, wxSizerItem( wxWindow *window, int proportion, int flag,
60 int border, PyObject* userData=NULL ))
62 wxPyUserData* data = NULL;
64 wxPyBlock_t blocked = wxPyBeginBlockThreads();
65 data = new wxPyUserData(userData);
66 wxPyEndBlockThreads(blocked);
68 return new wxSizerItem(window, proportion, flag, border, data);
73 wxSizerItem( int width, int height, int proportion, int flag,
74 int border, PyObject* userData=NULL),
75 "Constructs a `wx.SizerItem` for tracking a spacer.", "");
77 %RenameCtor(SizerItemSpacer, wxSizerItem( int width, int height, int proportion, int flag,
78 int border, PyObject* userData=NULL))
80 wxPyUserData* data = NULL;
82 wxPyBlock_t blocked = wxPyBeginBlockThreads();
83 data = new wxPyUserData(userData);
84 wxPyEndBlockThreads(blocked);
86 return new wxSizerItem(width, height, proportion, flag, border, data);
90 wxSizerItem( wxSizer *sizer, int proportion, int flag,
91 int border, PyObject* userData=NULL ),
92 "Constructs a `wx.SizerItem` for tracking a subsizer", "");
94 %disownarg( wxSizer *sizer );
95 %RenameCtor(SizerItemSizer, wxSizerItem( wxSizer *sizer, int proportion, int flag,
96 int border, PyObject* userData=NULL ))
98 wxPyUserData* data = NULL;
100 wxPyBlock_t blocked = wxPyBeginBlockThreads();
101 data = new wxPyUserData(userData);
102 wxPyEndBlockThreads(blocked);
104 return new wxSizerItem(sizer, proportion, flag, border, data);
106 %cleardisown( wxSizer *sizer );
112 void , DeleteWindows(),
113 "Destroy the window or the windows in a subsizer, depending on the type
117 void , DetachSizer(),
118 "Enable deleting the SizerItem without destroying the contained sizer.", "");
123 "Get the current size of the item, as set in the last Layout.", "");
127 "Calculates the minimum desired size for the item, including any space
128 needed by borders.", "");
131 void , SetDimension( const wxPoint& pos, const wxSize& size ),
132 "Set the position and size of the space allocated for this item by the
133 sizer, and adjust the position and size of the item (window or
134 subsizer) to be within that space taking alignment and borders into
139 wxSize , GetMinSize(),
140 "Get the minimum size needed for the item.", "");
143 wxSize , GetMinSizeWithBorder() const,
144 "Get the minimum size needed for the item with space for the borders
145 added, if needed.", "");
148 void , SetInitSize( int x, int y ),
153 "Set the ratio item attribute.", "");
154 %Rename(SetRatioWH, void, SetRatio( int width, int height ));
155 %Rename(SetRatioSize, void, SetRatio( const wxSize& size ));
156 void SetRatio( float ratio );
160 "Set the ratio item attribute.", "");
164 "Returns the rectangle that the sizer item should occupy", "");
169 "Is this sizer item a window?", "");
173 "Is this sizer item a subsizer?", "");
177 "Is this sizer item a spacer?", "");
181 void , SetProportion( int proportion ),
182 "Set the proportion value for this item.", "");
185 int , GetProportion(),
186 "Get the proportion value for this item.", "");
188 %pythoncode { SetOption = wx._deprecated(SetProportion, "Please use `SetProportion` instead.") }
189 %pythoncode { GetOption = wx._deprecated(GetProportion, "Please use `GetProportion` instead.") }
193 void , SetFlag( int flag ),
194 "Set the flag value for this item.", "");
198 "Get the flag value for this item.", "");
202 void , SetBorder( int border ),
203 "Set the border value for this item.", "");
207 "Get the border value for this item.", "");
212 wxWindow *, GetWindow(),
213 "Get the window (if any) that is managed by this sizer item.", "");
216 void , SetWindow( wxWindow *window ),
217 "Set the window to be managed by this sizer item.", "");
221 wxSizer *, GetSizer(),
222 "Get the subsizer (if any) that is managed by this sizer item.", "");
224 %disownarg( wxSizer *sizer );
226 void , SetSizer( wxSizer *sizer ),
227 "Set the subsizer to be managed by this sizer item.", "");
228 %cleardisown( wxSizer *sizer );
232 const wxSize& , GetSpacer(),
233 "Get the size of the spacer managed by this sizer item.", "");
236 void , SetSpacer( const wxSize &size ),
237 "Set the size of the spacer to be managed by this sizer item.", "");
241 void , Show( bool show ),
242 "Set the show item attribute, which sizers use to determine if the item
243 is to be made part of the layout or not. If the item is tracking a
244 window then it is shown or hidden as needed.", "");
248 "Is the item to be shown in the layout?", "");
252 wxPoint , GetPosition(),
253 "Returns the current position of the item, as set in the last Layout.", "");
256 // wxObject* GetUserData();
258 // Assume that the user data is a wxPyUserData object and return the contents
261 "Returns the userData associated with this sizer item, or None if there
263 PyObject* GetUserData() {
264 wxPyUserData* data = (wxPyUserData*)self->GetUserData();
266 Py_INCREF(data->m_obj);
275 "Associate a Python object with this sizer item.", "");
276 void SetUserData(PyObject* userData) {
277 wxPyUserData* data = NULL;
279 wxPyBlock_t blocked = wxPyBeginBlockThreads();
280 data = new wxPyUserData(userData);
281 wxPyEndBlockThreads(blocked);
283 self->SetUserData(data);
289 //---------------------------------------------------------------------------
292 // Figure out the type of the sizer item
294 struct wxPySizerItemInfo {
296 : window(NULL), sizer(NULL), gotSize(false),
297 size(wxDefaultSize), gotPos(false), pos(-1)
308 static wxPySizerItemInfo wxPySizerItemTypeHelper(PyObject* item, bool checkSize, bool checkIdx ) {
310 wxPySizerItemInfo info;
312 wxSize* sizePtr = &size;
314 // Find out what the type of the item is
316 if ( ! wxPyConvertSwigPtr(item, (void**)&info.window, wxT("wxWindow")) ) {
321 if ( ! wxPyConvertSwigPtr(item, (void**)&info.sizer, wxT("wxSizer")) ) {
325 // try wxSize or (w,h)
326 if ( checkSize && wxSize_helper(item, &sizePtr)) {
327 info.size = *sizePtr;
332 if (checkIdx && PyInt_Check(item)) {
333 info.pos = PyInt_AsLong(item);
339 if ( !(info.window || info.sizer || (checkSize && info.gotSize) || (checkIdx && info.gotPos)) ) {
340 // no expected type, figure out what kind of error message to generate
341 if ( !checkSize && !checkIdx )
342 PyErr_SetString(PyExc_TypeError, "wx.Window or wx.Sizer expected for item");
343 else if ( checkSize && !checkIdx )
344 PyErr_SetString(PyExc_TypeError, "wx.Window, wx.Sizer, wx.Size, or (w,h) expected for item");
345 else if ( !checkSize && checkIdx)
346 PyErr_SetString(PyExc_TypeError, "wx.Window, wx.Sizer or int (position) expected for item");
348 // can this one happen?
349 PyErr_SetString(PyExc_TypeError, "wx.Window, wx.Sizer, wx.Size, or (w,h) or int (position) expected for item");
360 "wx.Sizer is the abstract base class used for laying out subwindows in
361 a window. You cannot use wx.Sizer directly; instead, you will have to
362 use one of the sizer classes derived from it such as `wx.BoxSizer`,
363 `wx.StaticBoxSizer`, `wx.GridSizer`, `wx.FlexGridSizer` and
366 The concept implemented by sizers in wxWidgets is closely related to
367 layout tools in other GUI toolkits, such as Java's AWT, the GTK
368 toolkit or the Qt toolkit. It is based upon the idea of the individual
369 subwindows reporting their minimal required size and their ability to
370 get stretched if the size of the parent window has changed. This will
371 most often mean that the programmer does not set the original size of
372 a dialog in the beginning, rather the dialog will assigned a sizer and
373 this sizer will be queried about the recommended size. The sizer in
374 turn will query its children, which can be normal windows or contorls,
375 empty space or other sizers, so that a hierarchy of sizers can be
376 constructed. Note that wxSizer does not derive from wxWindow and thus
377 do not interfere with tab ordering and requires very little resources
378 compared to a real window on screen.
380 What makes sizers so well fitted for use in wxWidgets is the fact that
381 every control reports its own minimal size and the algorithm can
382 handle differences in font sizes or different window (dialog item)
383 sizes on different platforms without problems. If for example the
384 standard font as well as the overall design of Mac widgets requires
385 more space than on Windows, then the initial size of a dialog using a
386 sizer will automatically be bigger on Mac than on Windows.", "
388 Sizers may also be used to control the layout of custom drawn items on
389 the window. The `Add`, `Insert`, and `Prepend` functions return a
390 pointer to the newly added `wx.SizerItem`. Just add empty space of the
391 desired size and attributes, and then use the `wx.SizerItem.GetRect`
392 method to determine where the drawing operations should take place.
394 :note: If you wish to create a custom sizer class in wxPython you
395 should derive the class from `wx.PySizer` in order to get
396 Python-aware capabilities for the various virtual methods.
400 :todo: More dscriptive text here along with some pictures...
404 class wxSizer : public wxObject {
406 // wxSizer(); **** abstract, can't instantiate
411 void _setOORInfo(PyObject* _self) {
412 if (!self->GetClientObject())
413 self->SetClientObject(new wxPyOORClientData(_self));
417 "Add(self, item, int proportion=0, int flag=0, int border=0,
418 PyObject userData=None) -> wx.SizerItem",
420 "Appends a child item to the sizer.", "
422 :param item: The item can be one of three kinds of objects:
424 - **window**: A `wx.Window` to be managed by the sizer. Its
425 minimal size (either set explicitly by the user or
426 calculated internally when constructed with wx.DefaultSize)
427 is interpreted as the minimal size to use when laying out
428 item in the sizer. This is particularly useful in
429 connection with `wx.Window.SetSizeHints`.
431 - **sizer**: The (child-)sizer to be added to the sizer. This
432 allows placing a child sizer in a sizer and thus to create
433 hierarchies of sizers (typically a vertical box as the top
434 sizer and several horizontal boxes on the level beneath).
436 - **size**: A `wx.Size` or a 2-element sequence of integers
437 that represents the width and height of a spacer to be added
438 to the sizer. Adding spacers to sizers gives more
439 flexibility in the design of dialogs; imagine for example a
440 horizontal box with two buttons at the bottom of a dialog:
441 you might want to insert a space between the two buttons and
442 make that space stretchable using the *proportion* value and
443 the result will be that the left button will be aligned with
444 the left side of the dialog and the right button with the
445 right side - the space in between will shrink and grow with
448 :param proportion: Although the meaning of this parameter is
449 undefined in wx.Sizer, it is used in `wx.BoxSizer` to indicate
450 if a child of a sizer can change its size in the main
451 orientation of the wx.BoxSizer - where 0 stands for not
452 changeable and a value of more than zero is interpreted
453 relative (a proportion of the total) to the value of other
454 children of the same wx.BoxSizer. For example, you might have
455 a horizontal wx.BoxSizer with three children, two of which are
456 supposed to change their size with the sizer. Then the two
457 stretchable windows should each be given *proportion* value of
458 1 to make them grow and shrink equally with the sizer's
459 horizontal dimension. But if one of them had a *proportion*
460 value of 2 then it would get a double share of the space
461 available after the fixed size items are positioned.
463 :param flag: This parameter can be used to set a number of flags
464 which can be combined using the binary OR operator ``|``. Two
465 main behaviours are defined using these flags. One is the
466 border around a window: the *border* parameter determines the
467 border width whereas the flags given here determine which
468 side(s) of the item that the border will be added. The other
469 flags determine how the sizer item behaves when the space
470 allotted to the sizer changes, and is somewhat dependent on
471 the specific kind of sizer used.
473 +----------------------------+------------------------------------------+
474 |- wx.TOP |These flags are used to specify |
475 |- wx.BOTTOM |which side(s) of the sizer item that |
476 |- wx.LEFT |the *border* width will apply to. |
480 +----------------------------+------------------------------------------+
481 |- wx.EXPAND |The item will be expanded to fill |
482 | |the space allotted to the item. |
483 +----------------------------+------------------------------------------+
484 |- wx.SHAPED |The item will be expanded as much as |
485 | |possible while also maintaining its |
487 +----------------------------+------------------------------------------+
488 |- wx.FIXED_MINSIZE |Normally wx.Sizers will use |
489 | |`wx.Window.GetMinSize` or |
490 | |`wx.Window.GetBestSize` to determine what |
491 | |the minimal size of window items should |
492 | |be, and will use that size to calculate |
493 | |the layout. This allows layouts to adjust |
494 | |when an item changes and it's best size |
495 | |becomes different. If you would rather |
496 | |have a window item stay the size it |
497 | |started with then use wx.FIXED_MINSIZE. |
498 +----------------------------+------------------------------------------+
499 |- wx.ALIGN_CENTER |The wx.ALIGN flags allow you to specify |
500 |- wx.ALIGN_LEFT |the alignment of the item within the space|
501 |- wx.ALIGN_RIGHT |allotted to it by the sizer, ajusted for |
502 |- wx.ALIGN_TOP |the border if any. |
503 |- wx.ALIGN_BOTTOM | |
504 |- wx.ALIGN_CENTER_VERTICAL | |
505 |- wx.ALIGN_CENTER_HORIZONTAL| |
506 +----------------------------+------------------------------------------+
509 :param border: Determines the border width, if the *flag*
510 parameter is set to include any border flag.
512 :param userData: Allows an extra object to be attached to the
513 sizer item, for use in derived classes when sizing information
514 is more complex than the *proportion* and *flag* will allow for.
517 wxSizerItem* Add(PyObject* item, int proportion=0, int flag=0, int border=0,
518 PyObject* userData=NULL) {
520 wxPyUserData* data = NULL;
521 wxPyBlock_t blocked = wxPyBeginBlockThreads();
522 wxPySizerItemInfo info = wxPySizerItemTypeHelper(item, true, false);
523 if ( userData && (info.window || info.sizer || info.gotSize) )
524 data = new wxPyUserData(userData);
526 PyObject_SetAttrString(item,"thisown",Py_False);
527 wxPyEndBlockThreads(blocked);
529 // Now call the real Add method if a valid item type was found
531 return self->Add(info.window, proportion, flag, border, data);
532 else if ( info.sizer )
533 return self->Add(info.sizer, proportion, flag, border, data);
534 else if (info.gotSize)
535 return self->Add(info.size.GetWidth(), info.size.GetHeight(),
536 proportion, flag, border, data);
541 // virtual wxSizerItem* AddSpacer(int size);
542 // virtual wxSizerItem* AddStretchSpacer(int prop = 1);
545 "Insert(self, int before, item, int proportion=0, int flag=0, int border=0,
546 PyObject userData=None) -> wx.SizerItem",
548 "Inserts a new item into the list of items managed by this sizer before
549 the item at index *before*. See `Add` for a description of the parameters.", "");
550 wxSizerItem* Insert(int before, PyObject* item, int proportion=0, int flag=0,
551 int border=0, PyObject* userData=NULL) {
553 wxPyUserData* data = NULL;
554 wxPyBlock_t blocked = wxPyBeginBlockThreads();
555 wxPySizerItemInfo info = wxPySizerItemTypeHelper(item, true, false);
556 if ( userData && (info.window || info.sizer || info.gotSize) )
557 data = new wxPyUserData(userData);
559 PyObject_SetAttrString(item,"thisown",Py_False);
560 wxPyEndBlockThreads(blocked);
562 // Now call the real Insert method if a valid item type was found
564 return self->Insert(before, info.window, proportion, flag, border, data);
565 else if ( info.sizer )
566 return self->Insert(before, info.sizer, proportion, flag, border, data);
567 else if (info.gotSize)
568 return self->Insert(before, info.size.GetWidth(), info.size.GetHeight(),
569 proportion, flag, border, data);
575 // virtual wxSizerItem* InsertSpacer(size_t index, int size);
576 // virtual wxSizerItem* InsertStretchSpacer(size_t index, int prop = 1);
579 "Prepend(self, item, int proportion=0, int flag=0, int border=0,
580 PyObject userData=None) -> wx.SizerItem",
582 "Adds a new item to the begining of the list of sizer items managed by
583 this sizer. See `Add` for a description of the parameters.", "");
584 wxSizerItem* Prepend(PyObject* item, int proportion=0, int flag=0, int border=0,
585 PyObject* userData=NULL) {
587 wxPyUserData* data = NULL;
588 wxPyBlock_t blocked = wxPyBeginBlockThreads();
589 wxPySizerItemInfo info = wxPySizerItemTypeHelper(item, true, false);
590 if ( userData && (info.window || info.sizer || info.gotSize) )
591 data = new wxPyUserData(userData);
593 PyObject_SetAttrString(item,"thisown",Py_False);
594 wxPyEndBlockThreads(blocked);
596 // Now call the real Prepend method if a valid item type was found
598 return self->Prepend(info.window, proportion, flag, border, data);
599 else if ( info.sizer )
600 return self->Prepend(info.sizer, proportion, flag, border, data);
601 else if (info.gotSize)
602 return self->Prepend(info.size.GetWidth(), info.size.GetHeight(),
603 proportion, flag, border, data);
608 // virtual wxSizerItem* PrependSpacer(int size);
609 // virtual wxSizerItem* PrependStretchSpacer(int prop = 1);
613 "Remove(self, item) -> bool",
614 "Removes an item from the sizer and destroys it. This method does not
615 cause any layout or resizing to take place, call `Layout` to update
616 the layout on screen after removing a child from the sizer. The
617 *item* parameter can be either a window, a sizer, or the zero-based
618 index of an item to remove. Returns True if the child item was found
621 :note: For historical reasons calling this method with a `wx.Window`
622 parameter is depreacted, as it will not be able to destroy the
623 window since it is owned by its parent. You should use `Detach`
626 bool Remove(PyObject* item) {
627 wxPyBlock_t blocked = wxPyBeginBlockThreads();
628 wxPySizerItemInfo info = wxPySizerItemTypeHelper(item, false, true);
629 wxPyEndBlockThreads(blocked);
631 return self->Remove(info.window);
632 else if ( info.sizer )
633 return self->Remove(info.sizer);
634 else if ( info.gotPos )
635 return self->Remove(info.pos);
642 "Detach(self, item) -> bool",
643 "Detaches an item from the sizer without destroying it. This method
644 does not cause any layout or resizing to take place, call `Layout` to
645 do so. The *item* parameter can be either a window, a sizer, or the
646 zero-based index of the item to be detached. Returns True if the child item
647 was found and detached.", "");
648 bool Detach(PyObject* item) {
649 wxPyBlock_t blocked = wxPyBeginBlockThreads();
650 wxPySizerItemInfo info = wxPySizerItemTypeHelper(item, false, true);
651 wxPyEndBlockThreads(blocked);
653 return self->Detach(info.window);
654 else if ( info.sizer )
655 return self->Detach(info.sizer);
656 else if ( info.gotPos )
657 return self->Detach(info.pos);
664 "GetItem(self, item) -> wx.SizerItem",
665 "Returns the `wx.SizerItem` which holds the *item* given. The *item*
666 parameter can be either a window, a sizer, or the zero-based index of
667 the item to be found.", "");
668 wxSizerItem* GetItem(PyObject* item) {
669 wxPyBlock_t blocked = wxPyBeginBlockThreads();
670 wxPySizerItemInfo info = wxPySizerItemTypeHelper(item, false, true);
671 wxPyEndBlockThreads(blocked);
673 return self->GetItem(info.window);
674 else if ( info.sizer )
675 return self->GetItem(info.sizer);
676 else if ( info.gotPos )
677 return self->GetItem(info.pos);
683 void _SetItemMinSize(PyObject* item, const wxSize& size) {
684 wxPyBlock_t blocked = wxPyBeginBlockThreads();
685 wxPySizerItemInfo info = wxPySizerItemTypeHelper(item, false, true);
686 wxPyEndBlockThreads(blocked);
688 self->SetItemMinSize(info.window, size);
689 else if ( info.sizer )
690 self->SetItemMinSize(info.sizer, size);
691 else if ( info.gotPos )
692 self->SetItemMinSize(info.pos, size);
698 bool, Replace( wxWindow *oldwin, wxWindow *newwin, bool recursive = false ));
699 %Rename(_ReplaceSizer,
700 bool, Replace( wxSizer *oldsz, wxSizer *newsz, bool recursive = false ));
701 %Rename(_ReplaceItem,
702 bool, Replace( size_t index, wxSizerItem *newitem ));
704 def Replace(self, olditem, item, recursive=False):
706 Detaches the given ``olditem`` from the sizer and replaces it with
707 ``item`` which can be a window, sizer, or `wx.SizerItem`. The
708 detached child is destroyed only if it is not a window, (because
709 windows are owned by their parent, not the sizer.) The
710 ``recursive`` parameter can be used to search for the given
711 element recursivly in subsizers.
713 This method does not cause any layout or resizing to take place,
714 call `Layout` to do so.
716 Returns ``True`` if the child item was found and removed.
718 if isinstance(olditem, wx.Window):
719 return self._ReplaceWin(olditem, item, recursive)
720 elif isinstnace(olditem, wx.Sizer):
721 return self._ReplaceSizer(olditem, item, recursive)
722 elif isinstnace(olditem, int):
723 return self._ReplaceItem(olditem, item)
725 raise TypeError("Expected Window, Sizer, or integer for first parameter.")
730 void , SetContainingWindow(wxWindow *window),
731 "Set (or unset) the window this sizer is used in.", "");
734 wxWindow *, GetContainingWindow() const,
735 "Get the window this sizer is used in.", "");
739 def SetItemMinSize(self, item, *args):
741 SetItemMinSize(self, item, Size size)
743 Sets the minimum size that will be allocated for an item in the sizer.
744 The *item* parameter can be either a window, a sizer, or the
745 zero-based index of the item. If a window or sizer is given then it
746 will be searched for recursivly in subsizers if neccessary.
749 %# for backward compatibility accept separate width,height args too
750 return self._SetItemMinSize(item, args)
752 return self._SetItemMinSize(item, args[0])
756 %disownarg( wxSizerItem *item );
759 wxSizerItem* , Add( wxSizerItem *item ),
760 "AddItem(self, SizerItem item)",
761 "Adds a `wx.SizerItem` to the sizer.", "",
765 wxSizerItem* , Insert( size_t index, wxSizerItem *item ),
766 "InsertItem(self, int index, SizerItem item)",
767 "Inserts a `wx.SizerItem` to the sizer at the position given by *index*.", "",
771 wxSizerItem* , Prepend( wxSizerItem *item ),
772 "PrependItem(self, SizerItem item)",
773 "Prepends a `wx.SizerItem` to the sizer.", "",
776 %cleardisown( wxSizerItem *item );
780 def AddMany(self, items):
782 AddMany is a convenience method for adding several items
783 to a sizer at one time. Simply pass it a list of tuples,
784 where each tuple consists of the parameters that you
785 would normally pass to the `Add` method.
788 if type(item) != type(()) or (len(item) == 2 and type(item[0]) == type(1)):
792 def AddSpacer(self, *args, **kw):
793 """AddSpacer(int size) --> SizerItem
795 Add a spacer that is (size,size) pixels.
797 if args and type(args[0]) == int:
798 return self.Add( (args[0],args[0] ), 0)
799 else: %# otherwise stay compatible with old AddSpacer
800 return self.Add(*args, **kw)
801 def PrependSpacer(self, *args, **kw):
802 """PrependSpacer(int size) --> SizerItem
804 Prepend a spacer that is (size, size) pixels."""
805 if args and type(args[0]) == int:
806 return self.Prepend( (args[0],args[0] ), 0)
807 else: %# otherwise stay compatible with old PrependSpacer
808 return self.Prepend(*args, **kw)
809 def InsertSpacer(self, index, *args, **kw):
810 """InsertSpacer(int index, int size) --> SizerItem
812 Insert a spacer at position index that is (size, size) pixels."""
813 if args and type(args[0]) == int:
814 return self.Insert( index, (args[0],args[0] ), 0)
815 else: %# otherwise stay compatible with old InsertSpacer
816 return self.Insert(index, *args, **kw)
819 def AddStretchSpacer(self, prop=1):
820 """AddStretchSpacer(int prop=1) --> SizerItem
822 Add a stretchable spacer."""
823 return self.Add((0,0), prop)
824 def PrependStretchSpacer(self, prop=1):
825 """PrependStretchSpacer(int prop=1) --> SizerItem
827 Prepend a stretchable spacer."""
828 return self.Prepend((0,0), prop)
829 def InsertStretchSpacer(self, index, prop=1):
830 """InsertStretchSpacer(int index, int prop=1) --> SizerItem
832 Insert a stretchable spacer."""
833 return self.Insert(index, (0,0), prop)
836 %# for backwards compatibility only, please do not use in new code
837 def AddWindow(self, *args, **kw):
838 """Compatibility alias for `Add`."""
839 return self.Add(*args, **kw)
840 def AddSizer(self, *args, **kw):
841 """Compatibility alias for `Add`."""
842 return self.Add(*args, **kw)
844 def PrependWindow(self, *args, **kw):
845 """Compatibility alias for `Prepend`."""
846 return self.Prepend(*args, **kw)
847 def PrependSizer(self, *args, **kw):
848 """Compatibility alias for `Prepend`."""
849 return self.Prepend(*args, **kw)
851 def InsertWindow(self, *args, **kw):
852 """Compatibility alias for `Insert`."""
853 return self.Insert(*args, **kw)
854 def InsertSizer(self, *args, **kw):
855 """Compatibility alias for `Insert`."""
856 return self.Insert(*args, **kw)
858 def RemoveWindow(self, *args, **kw):
859 """Compatibility alias for `Remove`."""
860 return self.Remove(*args, **kw)
861 def RemoveSizer(self, *args, **kw):
862 """Compatibility alias for `Remove`."""
863 return self.Remove(*args, **kw)
864 def RemovePos(self, *args, **kw):
865 """Compatibility alias for `Remove`."""
866 return self.Remove(*args, **kw)
872 void , SetDimension( int x, int y, int width, int height ),
873 "Call this to force the sizer to take the given dimension and thus
874 force the items owned by the sizer to resize themselves according to
875 the rules defined by the parameter in the `Add`, `Insert` or `Prepend`
879 void , SetMinSize( const wxSize &size ),
880 "Call this to give the sizer a minimal size. Normally, the sizer will
881 calculate its minimal size based purely on how much space its children
882 need. After calling this method `GetMinSize` will return either the
883 minimal size as requested by its children or the minimal size set
884 here, depending on which is bigger.", "");
889 "Returns the current size of the space managed by the sizer.", "");
892 wxPoint , GetPosition(),
893 "Returns the current position of the sizer's managed space.", "");
896 wxSize , GetMinSize(),
897 "Returns the minimal size of the sizer. This is either the combined
898 minimal size of all the children and their borders or the minimal size
899 set by SetMinSize, depending on which is bigger.", "");
903 def GetSizeTuple(self):
904 return self.GetSize().Get()
905 def GetPositionTuple(self):
906 return self.GetPosition().Get()
907 def GetMinSizeTuple(self):
908 return self.GetMinSize().Get()
912 virtual void , RecalcSizes(),
913 "Using the sizes calculated by `CalcMin` reposition and resize all the
914 items managed by this sizer. You should not need to call this directly as
915 it is called by `Layout`.", "");
918 virtual wxSize , CalcMin(),
919 "This method is where the sizer will do the actual calculation of its
920 children's minimal sizes. You should not need to call this directly as
921 it is called by `Layout`.", "");
926 "This method will force the recalculation and layout of the items
927 controlled by the sizer using the current space allocated to the
928 sizer. Normally this is called automatically from the owning window's
929 EVT_SIZE handler, but it is also useful to call it from user code when
930 one of the items in a sizer change size, or items are added or
935 wxSize , Fit( wxWindow *window ),
936 "Tell the sizer to resize the *window* to match the sizer's minimal
937 size. This is commonly done in the constructor of the window itself in
938 order to set its initial size to match the needs of the children as
939 determined by the sizer. Returns the new size.
941 For a top level window this is the total window size, not the client size.", "");
944 void , FitInside( wxWindow *window ),
945 "Tell the sizer to resize the *virtual size* of the *window* to match the
946 sizer's minimal size. This will not alter the on screen size of the
947 window, but may cause the addition/removal/alteration of scrollbars
948 required to view the virtual area in windows which manage it.
950 :see: `wx.ScrolledWindow.SetScrollbars`, `SetVirtualSizeHints`
955 void , SetSizeHints( wxWindow *window ),
956 "Tell the sizer to set (and `Fit`) the minimal size of the *window* to
957 match the sizer's minimal size. This is commonly done in the
958 constructor of the window itself if the window is resizable (as are
959 many dialogs under Unix and frames on probably all platforms) in order
960 to prevent the window from being sized smaller than the minimal size
961 required by the sizer.", "");
964 void , SetVirtualSizeHints( wxWindow *window ),
965 "Tell the sizer to set the minimal size of the window virtual area to
966 match the sizer's minimal size. For windows with managed scrollbars
967 this will set them appropriately.
969 :see: `wx.ScrolledWindow.SetScrollbars`
974 void , Clear( bool deleteWindows=false ),
975 "Clear all items from the sizer, optionally destroying the window items
979 void , DeleteWindows(),
980 "Destroy all windows managed by the sizer.", "");
984 // wxList& GetChildren();
987 "GetChildren(self) -> list",
988 "Returns a list of all the `wx.SizerItem` objects managed by the sizer.", "");
989 PyObject* GetChildren() {
990 wxSizerItemList& list = self->GetChildren();
991 return wxPy_ConvertList(&list);
996 // Manage whether individual windows or subsizers are considered
997 // in the layout calculations or not.
1001 "Show(self, item, bool show=True, bool recursive=false) -> bool",
1002 "Shows or hides an item managed by the sizer. To make a sizer item
1003 disappear or reappear, use Show followed by `Layout`. The *item*
1004 parameter can be either a window, a sizer, or the zero-based index of
1005 the item. Use the recursive parameter to show or hide an item in a
1006 subsizer. Returns True if the item was found.", "");
1007 bool Show(PyObject* item, bool show = true, bool recursive=false) {
1008 wxPyBlock_t blocked = wxPyBeginBlockThreads();
1009 wxPySizerItemInfo info = wxPySizerItemTypeHelper(item, false, true);
1010 wxPyEndBlockThreads(blocked);
1012 return self->Show(info.window, show, recursive);
1013 else if ( info.sizer )
1014 return self->Show(info.sizer, show, recursive);
1015 else if ( info.gotPos )
1016 return self->Show(info.pos, show);
1022 "IsShown(self, item)",
1023 "Determines if the item is currently shown. To make a sizer
1024 item disappear or reappear, use Show followed by `Layout`. The *item*
1025 parameter can be either a window, a sizer, or the zero-based index of
1027 bool IsShown(PyObject* item) {
1028 wxPyBlock_t blocked = wxPyBeginBlockThreads();
1029 wxPySizerItemInfo info = wxPySizerItemTypeHelper(item, false, false);
1030 wxPyEndBlockThreads(blocked);
1032 return self->IsShown(info.window);
1033 else if ( info.sizer )
1034 return self->IsShown(info.sizer);
1035 else if ( info.gotPos )
1036 return self->IsShown(info.pos);
1043 def Hide(self, item, recursive=False):
1045 A convenience method for `Show` (item, False, recursive).
1047 return self.Show(item, False, recursive)
1052 void , ShowItems(bool show),
1053 "Recursively call `wx.SizerItem.Show` on all sizer items.", "");
1058 //---------------------------------------------------------------------------
1059 // Use this one for deriving Python classes from
1062 IMP_PYCALLBACK___pure(wxPySizer, wxSizer, RecalcSizes);
1063 IMP_PYCALLBACK_wxSize__pure(wxPySizer, wxSizer, CalcMin);
1064 IMPLEMENT_DYNAMIC_CLASS(wxPySizer, wxSizer);
1069 "wx.PySizer is a special version of `wx.Sizer` that has been
1070 instrumented to allow the C++ virtual methods to be overloaded in
1071 Python derived classes. You would derive from this class if you are
1072 wanting to implement a custom sizer in Python code. Simply implement
1073 `CalcMin` and `RecalcSizes` in the derived class and you're all set.
1076 class MySizer(wx.PySizer):
1078 wx.PySizer.__init__(self)
1081 for item in self.GetChildren():
1082 # calculate the total minimum width and height needed
1083 # by all items in the sizer according to this sizer's
1086 return wx.Size(width, height)
1088 def RecalcSizes(self):
1089 # find the space allotted to this sizer
1090 pos = self.GetPosition()
1091 size = self.GetSize()
1092 for item in self.GetChildren():
1093 # Recalculate (if necessary) the position and size of
1094 # each item and then call item.SetDimension to do the
1095 # actual positioning and sizing of the items within the
1096 # space alloted to this sizer.
1098 item.SetDimension(itemPos, itemSize)
1101 When `Layout` is called it first calls `CalcMin` followed by
1102 `RecalcSizes` so you can optimize a bit by saving the results of
1103 `CalcMin` and reusing them in `RecalcSizes`.
1105 :see: `wx.SizerItem`, `wx.Sizer.GetChildren`
1108 class wxPySizer : public wxSizer {
1110 %pythonAppend wxPySizer "self._setCallbackInfo(self, PySizer);self._setOORInfo(self)"
1114 "Creates a wx.PySizer. Must be called from the __init__ in the derived
1117 void _setCallbackInfo(PyObject* self, PyObject* _class);
1121 //---------------------------------------------------------------------------
1126 "The basic idea behind a box sizer is that windows will most often be
1127 laid out in rather simple basic geometry, typically in a row or a
1128 column or nested hierarchies of either. A wx.BoxSizer will lay out
1129 its items in a simple row or column, depending on the orientation
1130 parameter passed to the constructor.", "
1132 It is the unique feature of a box sizer, that it can grow in both
1133 directions (height and width) but can distribute its growth in the
1134 main direction (horizontal for a row) *unevenly* among its children.
1135 This is determined by the proportion parameter give to items when they
1136 are added to the sizer. It is interpreted as a weight factor, i.e. it
1137 can be zero, indicating that the window may not be resized at all, or
1138 above zero. If several windows have a value above zero, the value is
1139 interpreted relative to the sum of all weight factors of the sizer, so
1140 when adding two windows with a value of 1, they will both get resized
1141 equally and each will receive half of the available space after the
1142 fixed size items have been sized. If the items have unequal
1143 proportion settings then they will receive a coresondingly unequal
1144 allotment of the free space.
1146 :see: `wx.StaticBoxSizer`
1149 class wxBoxSizer : public wxSizer {
1151 %pythonAppend wxBoxSizer "self._setOORInfo(self)"
1154 wxBoxSizer(int orient = wxHORIZONTAL),
1155 "Constructor for a wx.BoxSizer. *orient* may be one of ``wx.VERTICAL``
1156 or ``wx.HORIZONTAL`` for creating either a column sizer or a row
1161 int , GetOrientation(),
1162 "Returns the current orientation of the sizer.", "");
1165 void , SetOrientation(int orient),
1166 "Resets the orientation of the sizer.", "");
1168 %property(Orientation, GetOrientation, SetOrientation, doc="See `GetOrientation` and `SetOrientation`");
1171 //---------------------------------------------------------------------------
1175 DocStr(wxStaticBoxSizer,
1176 "wx.StaticBoxSizer derives from and functions identically to the
1177 `wx.BoxSizer` and adds a `wx.StaticBox` around the items that the sizer
1178 manages. Note that this static box must be created separately and
1179 passed to the sizer constructor.", "");
1181 class wxStaticBoxSizer : public wxBoxSizer {
1183 %pythonAppend wxStaticBoxSizer "self._setOORInfo(self)"
1186 wxStaticBoxSizer(wxStaticBox *box, int orient = wxHORIZONTAL),
1187 "Constructor. It takes an associated static box and the orientation
1188 *orient* as parameters - orient can be either of ``wx.VERTICAL`` or
1189 ``wx.HORIZONTAL``.", "");
1191 // TODO: wxStaticBoxSizer(int orient, wxWindow *win, const wxString& label = wxEmptyString);
1194 wxStaticBox *, GetStaticBox(),
1195 "Returns the static box associated with this sizer.", "");
1199 //---------------------------------------------------------------------------
1204 "A grid sizer is a sizer which lays out its children in a
1205 two-dimensional table with all cells having the same size. In other
1206 words, the width of each cell within the grid is the width of the
1207 widest item added to the sizer and the height of each grid cell is the
1208 height of the tallest item. An optional vertical and/or horizontal
1209 gap between items can also be specified (in pixels.)
1211 Items are placed in the cells of the grid in the order they are added,
1212 in row-major order. In other words, the first row is filled first,
1213 then the second, and so on until all items have been added. (If
1214 neccessary, additional rows will be added as items are added.) If you
1215 need to have greater control over the cells that items are placed in
1216 then use the `wx.GridBagSizer`.
1219 class wxGridSizer: public wxSizer
1222 %pythonAppend wxGridSizer "self._setOORInfo(self)"
1225 wxGridSizer( int rows=1, int cols=0, int vgap=0, int hgap=0 ),
1226 "Constructor for a wx.GridSizer. *rows* and *cols* determine the number
1227 of columns and rows in the sizer - if either of the parameters is
1228 zero, it will be calculated to from the total number of children in
1229 the sizer, thus making the sizer grow dynamically. *vgap* and *hgap*
1230 define extra space between all children.", "");
1233 void , SetCols( int cols ),
1234 "Sets the number of columns in the sizer.", "");
1237 void , SetRows( int rows ),
1238 "Sets the number of rows in the sizer.", "");
1241 void , SetVGap( int gap ),
1242 "Sets the vertical gap (in pixels) between the cells in the sizer.", "");
1245 void , SetHGap( int gap ),
1246 "Sets the horizontal gap (in pixels) between cells in the sizer", "");
1250 "Returns the number of columns in the sizer.", "");
1254 "Returns the number of rows in the sizer.", "");
1258 "Returns the vertical gap (in pixels) between the cells in the sizer.", "");
1262 "Returns the horizontal gap (in pixels) between cells in the sizer.", "");
1265 def CalcRowsCols(self):
1267 CalcRowsCols() -> (rows, cols)
1269 Calculates how many rows and columns will be in the sizer based
1270 on the current number of items and also the rows, cols specified
1273 nitems = len(self.GetChildren())
1274 rows = self.GetRows()
1275 cols = self.GetCols()
1276 assert rows != 0 or cols != 0, "Grid sizer must have either rows or columns fixed"
1278 rows = (nitems + cols - 1) / cols
1280 cols = (nitems + rows - 1) / rows
1284 %property(Cols, GetCols, SetCols, doc="See `GetCols` and `SetCols`");
1285 %property(HGap, GetHGap, SetHGap, doc="See `GetHGap` and `SetHGap`");
1286 %property(Rows, GetRows, SetRows, doc="See `GetRows` and `SetRows`");
1287 %property(VGap, GetVGap, SetVGap, doc="See `GetVGap` and `SetVGap`");
1290 //---------------------------------------------------------------------------
1293 enum wxFlexSizerGrowMode
1295 // don't resize the cells in non-flexible direction at all
1296 wxFLEX_GROWMODE_NONE,
1298 // uniformly resize only the specified ones (default)
1299 wxFLEX_GROWMODE_SPECIFIED,
1301 // uniformly resize all cells
1309 DocStr(wxFlexGridSizer,
1310 "A flex grid sizer is a sizer which lays out its children in a
1311 two-dimensional table with all table cells in one row having the same
1312 height and all cells in one column having the same width, but all
1313 rows or all columns are not necessarily the same height or width as in
1316 wx.FlexGridSizer can also size items equally in one direction but
1317 unequally (\"flexibly\") in the other. If the sizer is only flexible
1318 in one direction (this can be changed using `SetFlexibleDirection`), it
1319 needs to be decided how the sizer should grow in the other (\"non
1320 flexible\") direction in order to fill the available space. The
1321 `SetNonFlexibleGrowMode` method serves this purpose.
1325 class wxFlexGridSizer: public wxGridSizer
1328 %pythonAppend wxFlexGridSizer "self._setOORInfo(self)"
1331 wxFlexGridSizer( int rows=1, int cols=0, int vgap=0, int hgap=0 ),
1332 "Constructor for a wx.FlexGridSizer. *rows* and *cols* determine the
1333 number of columns and rows in the sizer - if either of the parameters
1334 is zero, it will be calculated to from the total number of children in
1335 the sizer, thus making the sizer grow dynamically. *vgap* and *hgap*
1336 define extra space between all children.", "");
1340 void , AddGrowableRow( size_t idx, int proportion = 0 ),
1341 "Specifies that row *idx* (starting from zero) should be grown if there
1342 is extra space available to the sizer.
1344 The *proportion* parameter has the same meaning as the stretch factor
1345 for the box sizers except that if all proportions are 0, then all
1346 columns are resized equally (instead of not being resized at all).", "");
1349 void , RemoveGrowableRow( size_t idx ),
1350 "Specifies that row *idx* is no longer growable.", "");
1353 void , AddGrowableCol( size_t idx, int proportion = 0 ),
1354 "Specifies that column *idx* (starting from zero) should be grown if
1355 there is extra space available to the sizer.
1357 The *proportion* parameter has the same meaning as the stretch factor
1358 for the box sizers except that if all proportions are 0, then all
1359 columns are resized equally (instead of not being resized at all).", "");
1362 void , RemoveGrowableCol( size_t idx ),
1363 "Specifies that column *idx* is no longer growable.", "");
1367 void , SetFlexibleDirection(int direction),
1368 "Specifies whether the sizer should flexibly resize its columns, rows,
1369 or both. Argument *direction* can be one of the following values. Any
1370 other value is ignored.
1372 ============== =======================================
1373 wx.VERTICAL Rows are flexibly sized.
1374 wx.HORIZONTAL Columns are flexibly sized.
1375 wx.BOTH Both rows and columns are flexibly sized
1376 (this is the default value).
1377 ============== =======================================
1379 Note that this method does not trigger relayout.
1383 int , GetFlexibleDirection(),
1384 "Returns a value that specifies whether the sizer
1385 flexibly resizes its columns, rows, or both (default).
1387 :see: `SetFlexibleDirection`", "");
1392 void , SetNonFlexibleGrowMode(wxFlexSizerGrowMode mode),
1393 "Specifies how the sizer should grow in the non-flexible direction if
1394 there is one (so `SetFlexibleDirection` must have been called
1395 previously). Argument *mode* can be one of the following values:
1397 ========================== =================================================
1398 wx.FLEX_GROWMODE_NONE Sizer doesn't grow in the non flexible direction.
1399 wx.FLEX_GROWMODE_SPECIFIED Sizer honors growable columns/rows set with
1400 `AddGrowableCol` and `AddGrowableRow`. In this
1401 case equal sizing applies to minimum sizes of
1402 columns or rows (this is the default value).
1403 wx.FLEX_GROWMODE_ALL Sizer equally stretches all columns or rows in
1404 the non flexible direction, whether they are
1405 growable or not in the flexbile direction.
1406 ========================== =================================================
1408 Note that this method does not trigger relayout.", "");
1411 wxFlexSizerGrowMode , GetNonFlexibleGrowMode(),
1412 "Returns the value that specifies how the sizer grows in the
1413 non-flexible direction if there is one.
1415 :see: `SetNonFlexibleGrowMode`", "");
1418 // Read-only access to the row heights and col widths arrays
1420 const wxArrayInt& , GetRowHeights() const,
1421 "GetRowHeights(self) -> list",
1422 "Returns a list of integers representing the heights of each of the
1423 rows in the sizer.", "");
1426 const wxArrayInt& , GetColWidths() const,
1427 "GetColWidths(self) -> list",
1428 "Returns a list of integers representing the widths of each of the
1429 columns in the sizer.", "");
1432 %property(ColWidths, GetColWidths, doc="See `GetColWidths`");
1433 %property(FlexibleDirection, GetFlexibleDirection, SetFlexibleDirection, doc="See `GetFlexibleDirection` and `SetFlexibleDirection`");
1434 %property(NonFlexibleGrowMode, GetNonFlexibleGrowMode, SetNonFlexibleGrowMode, doc="See `GetNonFlexibleGrowMode` and `SetNonFlexibleGrowMode`");
1435 %property(RowHeights, GetRowHeights, doc="See `GetRowHeights`");
1439 //---------------------------------------------------------------------------
1441 DocStr(wxStdDialogButtonSizer,
1442 "A special sizer that knows how to order and position standard buttons
1443 in order to conform to the current platform's standards. You simply
1444 need to add each `wx.Button` to the sizer, and be sure to create the
1445 buttons using the standard ID's. Then call `Realize` and the sizer
1446 will take care of the rest.
1449 class wxStdDialogButtonSizer: public wxBoxSizer
1453 wxStdDialogButtonSizer(),
1457 void , AddButton(wxButton *button),
1458 "Use this to add the buttons to this sizer. Do not use the `Add`
1459 method in the base class.", "");
1463 "This funciton needs to be called after all the buttons have been added
1464 to the sizer. It will reorder them and position them in a platform
1465 specifc manner.", "");
1467 void SetAffirmativeButton( wxButton *button );
1468 void SetNegativeButton( wxButton *button );
1469 void SetCancelButton( wxButton *button );
1471 wxButton* GetAffirmativeButton() const;
1472 wxButton* GetApplyButton() const;
1473 wxButton* GetNegativeButton() const;
1474 wxButton* GetCancelButton() const;
1475 wxButton* GetHelpButton() const;
1479 //---------------------------------------------------------------------------