diff --git a/etg/sizer.py b/etg/sizer.py index 62bdfb2f..84d85c76 100644 --- a/etg/sizer.py +++ b/etg/sizer.py @@ -1,6 +1,7 @@ #--------------------------------------------------------------------------- # Name: etg/sizer.py # Author: Kevin Ollivier +# Robin Dunn # # Created: 26-Aug-2011 # Copyright: (c) 2011 by Wide Open Technologies @@ -17,12 +18,15 @@ DOCSTRING = "" # The classes and/or the basename of the Doxygen XML files to be processed by # this script. -ITEMS = [ 'wxBoxSizer', - 'wxFlexGridSizer', - 'wxGridSizer', - 'wxSizer', - 'wxSizerFlags', +ITEMS = [ 'wxSizerItem', + 'wxSizerFlags', + + 'wxSizer', + 'wxBoxSizer', + 'wxStaticBoxSizer', + 'wxGridSizer', + 'wxFlexGridSizer', 'wxStdDialogButtonSizer', ] @@ -36,40 +40,124 @@ def run(): #----------------------------------------------------------------- # Tweak the parsed meta objects in the module object as needed for # customizing the generated code and docstrings. + + + c = module.find('wxSizerItem') + assert isinstance(c, etgtools.ClassDef) + tools.removeVirtuals(c) + # ctors taking a sizer transfer ownership + for m in c.find('wxSizerItem').all(): + if m.findItem('sizer'): + m.find('sizer').transfer = True + + c.find('AssignSizer.sizer').transfer = True + + # userData args transfer ownership too, and we'll use wxPyUserData + # instead of any wxObject + for m in c.allItems(): + if isinstance(m, etgtools.MethodDef) and m.findItem('userData'): + m.find('userData').transfer = True + m.find('userData').type = 'wxPyUserData*' + + gud = c.find('GetUserData') + gud.type = 'wxPyUserData*' + gud.setCppCode('return dynamic_cast(self->GetUserData());') + + # these have been deprecated for a while so go ahead and get rid of them + c.find('SetWindow').ignore() + c.find('SetSizer').ignore() + c.find('SetSpacer').ignore() + + c.addPrivateCopyCtor() + + #--------------------------------------------- c = module.find('wxSizer') + assert isinstance(c, etgtools.ClassDef) + tools.fixSizerClass(c) + c.addPrivateCopyCtor() + c.addPrivateAssignOp() + for func in c.findAll('Add') + c.findAll('Insert') + c.findAll('Prepend'): - sizer = func.findItem('sizer') - if sizer: - sizer.transfer = True + if func.findItem('sizer'): + func.find('sizer').transfer = True + if func.findItem('userData'): + func.find('userData').transfer = True + func.find('userData').type = 'wxPyUserData*' + c.find('GetChildren').overloads = [] # Needs wxWin 2.6 compatibility to run c.find('Remove').findOverload('(wxWindow *window)').ignore() + c.addPyMethod('AddMany', '(self, items)', + doc="""\ + AddMany is a convenience method for adding several items to a sizer + at one time. Simply pass it a list of tuples, where each tuple + consists of the parameters that you would normally pass to the `Add` + method. + """, + body="""\ + for item in items: + if not isinstance(item, (tuple, list)): + item = (item, ) + self.Add(*item) + """) + + c.addPyMethod('Hide', '(self, item, recursive=False)', + doc="""\ + A convenience method for `Show`(item, False, recursive). + """, + body="""\ + return self.Show(item, False, recursive) + """) + + #--------------------------------------------- c = module.find('wxBoxSizer') - c.addPrivateCopyCtor() - c.addPrivateAssignOp() + tools.fixSizerClass(c) c.find('wxBoxSizer.orient').default = 'wxHORIZONTAL' - c = module.find('wxSizerItem') + + #--------------------------------------------- + c = module.find('wxStaticBoxSizer') + tools.fixSizerClass(c) + c.find('wxStaticBoxSizer.orient').default = 'wxHORIZONTAL' + + + #--------------------------------------------- + c = module.find('wxGridSizer') + tools.fixSizerClass(c) + + c.addPyMethod('CalcRowsCols', '(self)', + doc="""\ + CalcRowsCols() -> (rows, cols) + + Calculates how many rows and columns will be in the sizer based + on the current number of items and also the rows, cols specified + in the constructor. + """, + body="""\ + nitems = len(self.GetChildren()) + rows = self.GetRows() + cols = self.GetCols() + assert rows != 0 or cols != 0, "Grid sizer must have either rows or columns fixed" + if cols != 0: + rows = (nitems + cols - 1) / cols + elif rows != 0: + cols = (nitems + rows - 1) / rows + return (rows, cols) + """) - gud = c.find('GetUserData') - gud.type = 'wxPyUserData*' - gud.setCppCode('return dynamic_cast(self->GetUserData());') - sud = c.find('SetUserData') - sud.find('userData').transfer = True - sud.find('userData').type = 'wxPyUserData*' - sud.setCppCode('self->SetUserData(dynamic_cast(userData));') - - c.addPrivateCopyCtor() - + #--------------------------------------------- c = module.find('wxFlexGridSizer') - c.addPrivateCopyCtor() + tools.fixSizerClass(c) + + #--------------------------------------------- c = module.find('wxStdDialogButtonSizer') - c.addPrivateCopyCtor() - c.addPrivateAssignOp() + tools.fixSizerClass(c) + + module.addPyCode("PySizer = wx.deprecated(Sizer)") diff --git a/unittests/test_sizer.py b/unittests/test_sizer.py new file mode 100644 index 00000000..155d0ef7 --- /dev/null +++ b/unittests/test_sizer.py @@ -0,0 +1,59 @@ +import imp_unittest, unittest +import wtc +import wx + +#--------------------------------------------------------------------------- + +class sizer_Tests(wtc.WidgetTestCase): + + def test_sizerBox(self): + bs = wx.BoxSizer() + + def test_sizerStatBox(self): + sbs1 = wx.StaticBoxSizer(wx.StaticBox(self.frame, label='label'), wx.VERTICAL) + sbs2 = wx.StaticBoxSizer(wx.HORIZONTAL, self.frame, 'label') + + def test_sizerGrid(self): + gs1 = wx.GridSizer(4, 5, 6) + gs2 = wx.GridSizer(4, (5,6)) + gs3 = wx.GridSizer(cols=4, hgap=5, vgap=6) + + def test_sizerFlexGrid(self): + fgs1 = wx.FlexGridSizer(4, 5, 6) + fgs2 = wx.FlexGridSizer(4, (5,6)) + fgs3 = wx.FlexGridSizer(cols=4, hgap=5, vgap=6) + + def test_sizer2(self): + s = wx.BoxSizer(wx.VERTICAL) + s.Add(wx.Panel(self.frame)) + s2 = wx.BoxSizer() + s.Add(s2) + self.frame.SetSizer(s) + + def test_sizerUserData(self): + bs = wx.BoxSizer() + si = bs.Add(wx.Panel(self.frame), userData="MyData") + self.assertTrue(si.GetUserData() == "MyData") + + def test_sizerFlags(self): + bs = wx.BoxSizer() + bs.Add(wx.Panel(self.frame), + wx.SizerFlags(2).Border(wx.ALL, 5).Align(wx.ALIGN_RIGHT)) + + def test_sizerAddMany(self): + bs = wx.BoxSizer() + bs.AddMany([ wx.Panel(self.frame), # item w/o tuple + (5,10), # spacer + (wx.Panel(self.frame), 1, wx.ALL, 5), # item in tuple w/ other args + ]) + items = bs.GetChildren() + self.assertTrue(len(items) == 3) + self.assertTrue(items[0].IsWindow()) + self.assertTrue(items[1].IsSpacer()) + self.assertTrue(items[2].Border == 5) + +#--------------------------------------------------------------------------- + + +if __name__ == '__main__': + unittest.main()