1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
#---------------------------------------------------------------------------
# Name: etg/pen.py
# Author: Robin Dunn
#
# Created: 31-Aug-2011
# Copyright: (c) 2011-2020 by Total Control Software
# License: wxWindows License
#---------------------------------------------------------------------------
import etgtools
import etgtools.tweaker_tools as tools
PACKAGE = "wx"
MODULE = "_core"
NAME = "pen" # 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 = [ 'wxPenInfo',
'wxPen',
'wxPenList', ]
#---------------------------------------------------------------------------
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('wxPen')
assert isinstance(c, etgtools.ClassDef)
tools.removeVirtuals(c)
# Set mustHaveApp on all ctors except the default ctor
for ctor in c.find('wxPen').all():
if ctor.isCtor and ctor.argsString != '()':
ctor.mustHaveApp()
# The stipple bitmap ctor is not implemented on wxGTK
c.find('wxPen').findOverload('wxBitmap').ignore()
m = c.find('GetDashes')
assert isinstance(m, etgtools.MethodDef)
m.find('dashes').ignore()
m.type = 'wxArrayInt*'
m.factory = True
m.setCppCode("""\
wxArrayInt* arr = new wxArrayInt;
wxDash* dashes;
int num = self->GetDashes(&dashes);
for (int i=0; i<num; i++)
arr->Add(dashes[i]);
return arr;
""")
# SetDashes does not take ownership of the array passed to it, yet that
# array must be kept alive as long as the pen lives, so we'll create an
# array holder object that will be associated with the pen, and that will
# delete the dashes array when it is deleted.
#c.find('SetDashes').ignore()
c.addHeaderCode('#include "arrayholder.h"')
m = c.find('SetDashes')
# ignore the existing parameters
m.find('n').ignore()
m.find('dash').ignore()
# add a new one
m.items.append(etgtools.ParamDef(type='const wxArrayInt&', name='dashes'))
m.setCppCode_sip("""\
size_t len = dashes->GetCount();
wxDashCArrayHolder* holder = new wxDashCArrayHolder;
holder->m_array = new wxDash[len];
for (int idx=0; idx<len; idx+=1) {
holder->m_array[idx] = (*dashes)[idx];
}
// Make a PyObject for the holder, and transfer its ownership to self.
PyObject* pyHolder = sipConvertFromNewType(
(void*)holder, sipType_wxDashCArrayHolder, (PyObject*)sipSelf);
Py_DECREF(pyHolder);
sipCpp->SetDashes(len, holder->m_array);
""")
c.addAutoProperties()
# The stock Pen items are documented as simple pointers, but in reality
# they are macros that evaluate to a function call that returns a pen
# pointer, and that is only valid *after* the wx.App object has been
# created. That messes up the code that SIP generates for them, so we need
# to come up with another solution. So instead we will just create
# uninitialized pens in a block of Python code, that will then be
# initialized later when the wx.App is created.
c.addCppMethod('void', '_copyFrom', '(const wxPen* other)',
"*self = *other;",
briefDoc="For internal use only.") # ??
pycode = '# These stock pens will be initialized when the wx.App object is created.\n'
for item in module:
if '_PEN' in item.name:
item.ignore()
pycode += '%s = Pen()\n' % tools.removeWxPrefix(item.name)
module.addPyCode(pycode)
c = module.find('wxPenInfo')
# Ignore Dashes for now
# TODO: we need to do something like SetDashes above, but since PenInfo is
# transitory we can't save the reference in it to the holder, and the pen
# will not have been created yet...
c.find('Dashes').ignore()
c.find('GetDashes').ignore()
c.find('GetDashCount').ignore()
c.find('GetDash').ignore()
# it is delay-initialized, see stockgdi.sip
module.find('wxThePenList').ignore()
# Some aliases that should be phased out eventually, (sooner rather than
# later.) They are already gone (or wrapped by an #if) in the C++ code,
# and so are not found in the documentation...
module.addPyCode("""\
wx.SOLID = int(wx.PENSTYLE_SOLID)
wx.DOT = int(wx.PENSTYLE_DOT)
wx.LONG_DASH = int(wx.PENSTYLE_LONG_DASH)
wx.SHORT_DASH = int(wx.PENSTYLE_SHORT_DASH)
wx.DOT_DASH = int(wx.PENSTYLE_DOT_DASH)
wx.USER_DASH = int(wx.PENSTYLE_USER_DASH)
wx.TRANSPARENT = int(wx.PENSTYLE_TRANSPARENT)
""")
#-----------------------------------------------------------------
tools.doCommonTweaks(module)
tools.runGenerators(module)
#---------------------------------------------------------------------------
if __name__ == '__main__':
run()
|