Add __index__ to wx.WindowID, and __bool__ to wx.Region

(cherry picked from commit 9096426603)
This commit is contained in:
Robin Dunn
2020-02-26 11:10:27 -08:00
committed by Scott Talbert
parent 7c43dd1ab6
commit d453e92a73
3 changed files with 41 additions and 19 deletions

View File

@@ -88,11 +88,12 @@ def run():
c.mustHaveApp()
c.find('operator++').ignore()
# SIP maps operator bool() to __int__, but Classic used __nonzero__. Does
# it make any difference either way?
c.find('operator bool').ignore()
c.addCppMethod('int', '__nonzero__', '()', 'return (int)self->operator bool();',
'Returns true while there are still rectangles available in the iteration.')
c.addCppMethod('int', '__bool__', '()', 'return (int)self->operator bool();',
'Returns true while there are still rectangles available in the iteration.')
c.addCppMethod('void', 'Next', '()', 'self->operator++();',
'Move the iterator to the next rectangle in the region.')

View File

@@ -53,12 +53,12 @@ def run():
MethodDef(name='wxWindowIDRef', className='wxWindowIDRef', isCtor=True,
briefDoc='Create reference from an ID',
items=[ ParamDef(type='int', name='id') ]),
MethodDef(name='wxWindowIDRef', className='wxWindowIDRef', isCtor=True,
briefDoc='Copy an ID reference',
items=[ ParamDef(type='const wxWindowIDRef&', name='idref') ]),
]),
MethodDef(name='~wxWindowIDRef', className='wxWindowIDRef', isDtor=True),
MethodDef(type='int', name='GetValue',
@@ -73,11 +73,13 @@ def run():
""")
klass.addCppMethod('int', '__int__', '()',
doc="Alias for GetValue allowing the IDRef to be passed as the WindowID parameter when creating widgets or etc.",
body="""\
return self->GetValue();
""")
doc="Alias for GetValue allowing the IDRef to be passed as the WindowID parameter when creating widgets or other places an integer type is needed.",
body="return self->GetValue();")
klass.addCppMethod('int', '__index__', '()',
doc="See :meth:`__int__`",
body="return self->GetValue();")
klass.addCppMethod('bool', '__eq__', '(wxWindowID id)', "return self->GetValue() == id;")
klass.addCppMethod('bool', '__ne__', '(wxWindowID id)', "return self->GetValue() != id;")
klass.addCppMethod('bool', '__lt__', '(wxWindowID id)', "return self->GetValue() < id;")
@@ -92,17 +94,17 @@ def run():
# and finish it up by adding it to the module
module.addItem(klass)
# Now, let's add a new Python function to the global scope that reserves an
# ID (or range) and returns a ref object for it.
module.addPyFunction('NewIdRef', '(count=1)',
# Now, let's add a new Python function to the global scope that reserves an
# ID (or range) and returns a ref object for it.
module.addPyFunction('NewIdRef', '(count=1)',
doc="""\
Reserves a new Window ID (or range of WindowIDs) and returns a
:class:`wx.WindowIDRef` object (or list of them) that will help
Reserves a new Window ID (or range of WindowIDs) and returns a
:class:`wx.WindowIDRef` object (or list of them) that will help
manage the reservation of that ID.
This function is intended to be a drop-in replacement of the old
and deprecated :func:`wx.NewId` function, with the added benefit
that the ID should never conflict with an in-use ID or other IDs
This function is intended to be a drop-in replacement of the old
and deprecated :func:`wx.NewId` function, with the added benefit
that the ID should never conflict with an in-use ID or other IDs
generated by this function.
""",
body="""\

View File

@@ -31,9 +31,9 @@ class IdManagerTest(wtc.WidgetTestCase):
def test_newIdRef03(self):
"""Check that Auto ID Management is enabled (--enable-autoidman)"""
# This test is expected to fail if autoID mangagement is turned on
# because a reference to the ID is not being saved, so it will be
# because a reference to the ID is not being saved, so it will be
# unreserved when the first widget is destroyed.
id = wx.Window.NewControlId()
b = wx.Button(self.frame, id, 'button')
b.Destroy()
@@ -75,6 +75,7 @@ class IdManagerTest(wtc.WidgetTestCase):
val = ref1 <= ref2
assert type(val) == bool
def test_WindowIDRef02(self):
d = {wx.NewIdRef(): 'one',
wx.NewIdRef(): 'two'}
@@ -82,6 +83,24 @@ class IdManagerTest(wtc.WidgetTestCase):
for k in keys:
val = d[k]
def test_WindowIDRef03(self):
# Ensure wx.WindowIDRef can be converted to int without warning when
# making a call to warrped method. In Py3.8+ this means there needs to
# be an __index__ method.
# Turn warnings into exceptions so this test will fail if there is
# a warning
import warnings
warnings.simplefilter('error')
wid = wx.NewIdRef()
assert isinstance(wid, wx.WindowIDRef)
b = wx.Button(self.frame, wid, 'button')
assert b.GetId() == wid.GetId()
#---------------------------------------------------------------------------