diff --git a/TODO.txt b/TODO.txt index 0d754bba..af9fc370 100644 --- a/TODO.txt +++ b/TODO.txt @@ -164,7 +164,6 @@ other dev stuff files for the following: * filesys, fs_mem, fs_inet, fs_arch (with wxZipFSHandler typedef) - * vscroll * taskbar * all missing common dialogs * print (as in print framework classes) diff --git a/etg/_core.py b/etg/_core.py index df69905e..74241048 100644 --- a/etg/_core.py +++ b/etg/_core.py @@ -47,6 +47,7 @@ INCLUDES = [ 'defs', 'object', 'gdicmn', 'geometry', + 'position', 'stream', @@ -150,6 +151,7 @@ INCLUDES = [ 'defs', 'spinctrl', 'tglbtn', 'statusbar', + 'vscroll', ] diff --git a/etg/position.py b/etg/position.py new file mode 100644 index 00000000..4d93abe6 --- /dev/null +++ b/etg/position.py @@ -0,0 +1,69 @@ +#--------------------------------------------------------------------------- +# Name: etg/position.py +# Author: Robin Dunn +# +# Created: 20-Dec-2011 +# Copyright: (c) 2011 by Total Control Software +# License: wxWindows License +#--------------------------------------------------------------------------- + +import etgtools +import etgtools.tweaker_tools as tools + +PACKAGE = "wx" +MODULE = "_core" +NAME = "position" # Base name of the file to generate to for this script +DOCSTRING = "" + +# The classes and/or the basename of the Doxygen XML files to be processed by +# this script. +ITEMS = [ "wxPosition", ] + +#--------------------------------------------------------------------------- + +def run(): + # Parse the XML file(s) building a collection of Extractor objects + module = etgtools.ModuleDef(PACKAGE, MODULE, NAME, DOCSTRING) + etgtools.parseDoxyXML(module, ITEMS) + + #----------------------------------------------------------------- + # Tweak the parsed meta objects in the module object as needed for + # customizing the generated code and docstrings. + + c = module.find('wxPosition') + assert isinstance(c, etgtools.ClassDef) + + # (r,c) --> wxPosition typemap + c.convertFromPyObject = tools.convertTwoIntegersTemplate('wxPosition') + + c.addCppMethod('PyObject*', 'Get', '()', """\ + return sipBuildResult(0, "(ii)", self->GetRow(), self->GetCol()); + """, + pyArgsString="() -> (row,col)", + briefDoc="Return the row and col properties as a tuple.") + + # Add sequence protocol methods and other goodies + c.addPyMethod('__str__', '(self)', 'return str(self.Get())') + c.addPyMethod('__repr__', '(self)', 'return "wx.Position"+str(self.Get())') + c.addPyMethod('__len__', '(self)', 'return len(self.Get())') + c.addPyMethod('__nonzero__', '(self)', 'return self.Get() != (0,0)') + c.addPyMethod('__reduce__', '(self)', 'return (Position, self.Get())') + c.addPyMethod('__getitem__', '(self, idx)', 'return self.Get()[idx]') + c.addPyMethod('__setitem__', '(self, idx, val)', + """\ + if idx == 0: self.Row = val + elif idx == 1: self.Col = val + else: raise IndexError + """) + c.addPyCode('Position.__safe_for_unpickling__ = True') + + + #----------------------------------------------------------------- + tools.doCommonTweaks(module) + tools.runGenerators(module) + + +#--------------------------------------------------------------------------- +if __name__ == '__main__': + run() + diff --git a/etg/vscroll.py b/etg/vscroll.py new file mode 100644 index 00000000..febf91c4 --- /dev/null +++ b/etg/vscroll.py @@ -0,0 +1,101 @@ +#--------------------------------------------------------------------------- +# Name: etg/vscrol.py +# Author: Robin Dunn +# +# Created: 20-Dec-2011 +# Copyright: (c) 2011 by Total Control Software +# License: wxWindows License +#--------------------------------------------------------------------------- + +import etgtools +import etgtools.tweaker_tools as tools + +PACKAGE = "wx" +MODULE = "_core" +NAME = "vscroll" # Base name of the file to generate to for this script +DOCSTRING = "" + +# The classes and/or the basename of the Doxygen XML files to be processed by +# this script. +ITEMS = [ "wxVarScrollHelperBase", + "wxVarVScrollHelper", + "wxVarHScrollHelper", + "wxVarHVScrollHelper", + "wxVScrolledWindow", + "wxHScrolledWindow", + "wxHVScrolledWindow", + ] + +#--------------------------------------------------------------------------- + +def run(): + # Parse the XML file(s) building a collection of Extractor objects + module = etgtools.ModuleDef(PACKAGE, MODULE, NAME, DOCSTRING) + etgtools.parseDoxyXML(module, ITEMS) + + #----------------------------------------------------------------- + # Tweak the parsed meta objects in the module object as needed for + # customizing the generated code and docstrings. + + + c = module.find('wxVarScrollHelperBase') + assert isinstance(c, etgtools.ClassDef) + c.find('OnGetUnitsSizeHint').ignore(False) + c.find('EstimateTotalSize').ignore(False) + c.find('OnGetUnitSize').ignore(False) + + + # SIP apparently has some issues when generating code for calling + # virtuals in the base class when there is diamond inheritance going on, + # it seems to confuse the compiler. By telling SIP that the methods are + # reimplemented in the branches of the diamond (which they are in this + # case) then that version of the generated code works better. We'll add + # this block of declarations to each of the two helper classes below. + baseVirtuals = """\ + virtual void OnGetUnitsSizeHint(size_t unitMin, size_t unitMax) const; + virtual wxCoord EstimateTotalSize() const; + virtual int GetNonOrientationTargetSize() const; + virtual wxOrientation GetOrientation() const; + virtual int GetOrientationTargetSize() const; + virtual wxCoord OnGetUnitSize(size_t unit) const; + """ + + c = module.find('wxVarVScrollHelper') + c.find('EstimateTotalHeight').ignore(False) + c.find('OnGetRowsHeightHint').ignore(False) + c.find('OnGetRowHeight').ignore(False) + c.addItem(etgtools.WigCode(baseVirtuals, protection='protected')) + c.find('RefreshRows.from').name = 'from_' + c.find('RefreshRows.to').name = 'to_' + + c = module.find('wxVarHScrollHelper') + c.find('EstimateTotalWidth').ignore(False) + c.find('OnGetColumnsWidthHint').ignore(False) + c.find('OnGetColumnWidth').ignore(False) + c.addItem(etgtools.WigCode(baseVirtuals, protection='protected')) + c.find('RefreshColumns.from').name = 'from_' + c.find('RefreshColumns.to').name = 'to_' + + + + c = module.find('wxVarHVScrollHelper') + + c = module.find('wxVScrolledWindow') + tools.fixWindowClass(c) + + c = module.find('wxHScrolledWindow') + tools.fixWindowClass(c) + + c = module.find('wxHVScrolledWindow') + tools.fixWindowClass(c) + + + #----------------------------------------------------------------- + tools.doCommonTweaks(module) + tools.runGenerators(module) + + +#--------------------------------------------------------------------------- +if __name__ == '__main__': + run() + diff --git a/unittests/test_position.py b/unittests/test_position.py new file mode 100644 index 00000000..5f2c8d0c --- /dev/null +++ b/unittests/test_position.py @@ -0,0 +1,55 @@ +import imp_unittest, unittest +import wtc +import wx + +#--------------------------------------------------------------------------- + +class position_Tests(wtc.WidgetTestCase): + + def test_positionCtors(self): + p = wx.Position() + self.assertTrue(p == (0,0)) + self.assertTrue(p != (9,9)) + p2 = wx.Position(2, 3) + self.assertTrue(p2.Get() == (2,3)) + + def test_positionCopyCtor(self): + p1 = wx.Position(3,4) + p2 = wx.Position(p1) + self.assertTrue(p1 is not p2) + self.assertTrue(p1 == p2) + + def test_positionProperties1(self): + p = wx.Position() + p.Row + p.Col + + def test_positionProperties2(self): + p = wx.Position() + p.Row = 11 + p.Col = 12 + self.assertTrue(p.Get() == (11, 12)) + + def test_positionMath1(self): + p1 = wx.Position(3,4) + p2 = wx.Position(1,1) + p1 -= p2 + self.assertTrue(p1 == (2,3)) + p1 += p2 + self.assertTrue(p1 == (3,4)) + + def test_positionMath2(self): + p1 = wx.Position(3,4) + p2 = wx.Position(1,1) + p3 = p1 + p2 + self.assertTrue(p3 == (4,5)) + p4 = p3 - p2 + self.assertTrue(p4 == (3,4)) + self.assertTrue(p4 == p1) + + +#--------------------------------------------------------------------------- + + +if __name__ == '__main__': + unittest.main() diff --git a/unittests/test_vscroll.py b/unittests/test_vscroll.py new file mode 100644 index 00000000..bce1e79a --- /dev/null +++ b/unittests/test_vscroll.py @@ -0,0 +1,54 @@ +import imp_unittest, unittest +import wtc +import wx + +#--------------------------------------------------------------------------- + +class vscroll_Tests(wtc.WidgetTestCase): + + def test_vscroll_VScrolledWindow1(self): + with self.assertRaises(TypeError): + w = wx.VScrolledWindow(self.frame) + + def test_vscroll_VScrolledWindow2(self): + class MyScrolledWindow(wx.VScrolledWindow): + def OnGetRowHeight(self, row): + return 25 + + w = MyScrolledWindow(self.frame) + w.SetRowCount(100) + + + def test_vscroll_HScrolledWindow1(self): + with self.assertRaises(TypeError): + w = wx.HScrolledWindow(self.frame) + + def test_vscroll_HScrolledWindow2(self): + class MyScrolledWindow(wx.HScrolledWindow): + def OnGetColumnWidth(self, row): + return 80 + + w = MyScrolledWindow(self.frame) + w.SetColumnCount(100) + + + def test_vscroll_HVScrolledWindow1(self): + with self.assertRaises(TypeError): + w = wx.HVScrolledWindow(self.frame) + + def test_vscroll_HVScrolledWindow2(self): + class MyScrolledWindow(wx.HVScrolledWindow): + def OnGetRowHeight(self, row): + return 25 + def OnGetColumnWidth(self, row): + return 80 + + w = MyScrolledWindow(self.frame) + w.SetRowCount(100) + w.SetColumnCount(100) + +#--------------------------------------------------------------------------- + + +if __name__ == '__main__': + unittest.main()