mirror of
https://github.com/wxWidgets/Phoenix.git
synced 2025-12-16 01:30:07 +01:00
171 lines
6.9 KiB
Python
171 lines
6.9 KiB
Python
#---------------------------------------------------------------------------
|
|
# Name: etg/pyevent.py
|
|
# Author: Robin Dunn
|
|
#
|
|
# Created: 02-Nov-2012
|
|
# Copyright: (c) 2012-2020 by Total Control Software
|
|
# License: wxWindows License
|
|
#---------------------------------------------------------------------------
|
|
|
|
import etgtools
|
|
import etgtools.tweaker_tools as tools
|
|
from etgtools.extractors import ClassDef, MethodDef, ParamDef
|
|
|
|
import copy
|
|
|
|
PACKAGE = "wx"
|
|
MODULE = "_core"
|
|
NAME = "pyevent" # 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 = [ ]
|
|
|
|
#---------------------------------------------------------------------------
|
|
|
|
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.
|
|
|
|
cls = ClassDef(name='wxPyEvent', bases=['wxEvent'],
|
|
briefDoc="""\
|
|
:class:`PyEvent` can be used as a base class for implementing custom
|
|
event types in Python. You should derive from this class instead
|
|
of :class:`Event` because this class is Python-aware and is able to
|
|
transport its Python bits safely through the wxWidgets event
|
|
system and have them still be there when the event handler is
|
|
invoked. Note that since :class:`PyEvent` is taking care of preserving
|
|
the extra attributes that have been set then you do not need to
|
|
override the Clone method in your derived classes.
|
|
|
|
:see: :class:`PyCommandEvent`""",
|
|
items=[
|
|
MethodDef(name='wxPyEvent', isCtor=True, items=[
|
|
ParamDef(type='int', name='id', default='0'),
|
|
ParamDef(type='wxEventType', name='eventType', default='wxEVT_NULL'),
|
|
]),
|
|
|
|
MethodDef(name='__getattr__', type='PyObject*', items=[
|
|
ParamDef(type='PyObject*', name='name'),],
|
|
cppCode=("sipRes = sipCpp->__getattr__(name);", "sip")),
|
|
|
|
MethodDef(name='__delattr__', type='void', items=[
|
|
ParamDef(type='PyObject*', name='name'),],
|
|
cppCode=("sipCpp->__delattr__(name);", "sip")),
|
|
|
|
MethodDef(name='__setattr__', type='void', items=[
|
|
ParamDef(type='PyObject*', name='name'),
|
|
ParamDef(type='PyObject*', name='value'),],
|
|
cppCode=("sipCpp->__setattr__(name, value);", "sip")),
|
|
|
|
MethodDef(name='Clone', type='wxEvent*', isVirtual=True, isConst=True,
|
|
factory=True, docsIgnored=True),
|
|
MethodDef(name='_getAttrDict', type='PyObject*',
|
|
briefDoc="Gives access to the internal object that is tracking the event's python attributes."),
|
|
])
|
|
|
|
cls.addPyMethod('Clone', '(self)',
|
|
doc="""\
|
|
Make a new instance of the event that is a copy of self.
|
|
|
|
Through the magic of Python this implementation should work for
|
|
this and all derived classes.""",
|
|
body="""\
|
|
# Create a new instance of the same type as this instance and
|
|
# then invoke the C++ copy constructor to copy the C++ parts and
|
|
# any custom attributes.
|
|
clone = wx.PyEvent.__new__(self.__class__)
|
|
wx.PyEvent.__init__(clone, self)
|
|
return clone
|
|
""")
|
|
|
|
|
|
module.addItem(cls)
|
|
cls.addCppCode("IMPLEMENT_DYNAMIC_CLASS(wxPyEvent, wxEvent);")
|
|
cls.addHeaderCode('#include "pyevent.h"')
|
|
|
|
|
|
|
|
cls = ClassDef(name='wxPyCommandEvent', bases=['wxCommandEvent'],
|
|
briefDoc="""\
|
|
:class:`PyCommandEvent` can be used as a base class for implementing
|
|
custom event types in Python. You should derive from this class
|
|
instead of :class:`CommandEvent` because this class is Python-aware
|
|
and is able to transport its Python bits safely through the
|
|
wxWidgets event system and have them still be there when the
|
|
event handler is invoked. Note that since :class:`PyCommandEvent` is
|
|
taking care of preserving the extra attributes that have been set
|
|
then you do not need to override the Clone method in your
|
|
derived classes.
|
|
|
|
:see: :class:`PyEvent`""",
|
|
items=[
|
|
MethodDef(name='wxPyCommandEvent', isCtor=True, items=[
|
|
ParamDef(type='wxEventType', name='eventType', default='wxEVT_NULL'),
|
|
ParamDef(type='int', name='id', default='0'),
|
|
]),
|
|
|
|
MethodDef(name='__getattr__', type='PyObject*', items=[
|
|
ParamDef(type='PyObject*', name='name'),],
|
|
cppCode=("sipRes = sipCpp->__getattr__(name);", "sip")),
|
|
|
|
MethodDef(name='__delattr__', type='void', items=[
|
|
ParamDef(type='PyObject*', name='name'),],
|
|
cppCode=("sipCpp->__delattr__(name);", "sip")),
|
|
|
|
MethodDef(name='__setattr__', type='void', items=[
|
|
ParamDef(type='PyObject*', name='name'),
|
|
ParamDef(type='PyObject*', name='value'),],
|
|
cppCode=("sipCpp->__setattr__(name, value);", "sip")),
|
|
|
|
MethodDef(name='Clone', type='wxEvent*', isVirtual=True, isConst=True,
|
|
factory=True, docsIgnored=True),
|
|
MethodDef(name='_getAttrDict', type='PyObject*',
|
|
briefDoc="Gives access to the internal object that is tracking the event's python attributes."),
|
|
])
|
|
|
|
cls.addPyMethod('Clone', '(self)',
|
|
doc="""\
|
|
Make a new instance of the event that is a copy of self.
|
|
|
|
Through the magic of Python this implementation should work for
|
|
this and all derived classes.""",
|
|
body="""\
|
|
# Create a new instance of the same type as this instance and
|
|
# then invoke the C++ copy constructor to copy the C++ parts and
|
|
# any custom attributes.
|
|
clone = wx.PyCommandEvent.__new__(self.__class__)
|
|
wx.PyCommandEvent.__init__(clone, self)
|
|
return clone
|
|
""")
|
|
|
|
|
|
module.addItem(cls)
|
|
cls.addCppCode("IMPLEMENT_DYNAMIC_CLASS(wxPyCommandEvent, wxCommandEvent);")
|
|
cls.addHeaderCode('#include "pyevent.h"')
|
|
|
|
|
|
|
|
# TODO: Temporary testing code, get rid of this later
|
|
module.addCppCode("""\
|
|
wxEvent* testCppClone(wxEvent& evt) {
|
|
return evt.Clone();
|
|
}""")
|
|
module.addItem(etgtools.WigCode("wxEvent* testCppClone(wxEvent& evt);"))
|
|
|
|
|
|
#-----------------------------------------------------------------
|
|
tools.doCommonTweaks(module)
|
|
tools.runGenerators(module)
|
|
|
|
|
|
#---------------------------------------------------------------------------
|
|
if __name__ == '__main__':
|
|
run()
|