mirror of
https://github.com/wxWidgets/Phoenix.git
synced 2026-01-08 04:50:07 +01:00
so IDs pointing to the same item will compare as equal and have the same hash values. This enables TreeItemIDs to be dictionary keys in Py3.
218 lines
9.5 KiB
Python
218 lines
9.5 KiB
Python
#---------------------------------------------------------------------------
|
|
# Name: etg/treectrl.py
|
|
# Author: Robin Dunn
|
|
#
|
|
# Created: 26-Mar-2012
|
|
# Copyright: (c) 2012-2017 by Total Control Software
|
|
# License: wxWindows License
|
|
#---------------------------------------------------------------------------
|
|
|
|
import etgtools
|
|
import etgtools.tweaker_tools as tools
|
|
|
|
PACKAGE = "wx"
|
|
MODULE = "_core"
|
|
NAME = "treectrl" # 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 = [ "wxTreeItemId",
|
|
##"wxTreeItemData", We're using a MappedType instead
|
|
"wxTreeCtrl",
|
|
"wxTreeEvent",
|
|
]
|
|
|
|
#---------------------------------------------------------------------------
|
|
|
|
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('wxTreeItemId')
|
|
assert isinstance(c, etgtools.ClassDef)
|
|
c.addCppMethod('int', '__nonzero__', '()', """\
|
|
return self->IsOk();
|
|
""")
|
|
|
|
c.addCppMethod('bool', '__eq__', '(const wxTreeItemId* other)', """\
|
|
return *self == *other;
|
|
""")
|
|
c.addCppMethod('bool', '__neq__', '(const wxTreeItemId* other)', """\
|
|
return *self != *other;
|
|
""")
|
|
|
|
c.addPyMethod('__hash__', '(self)', """\
|
|
return hash(int(self.GetID()))
|
|
""")
|
|
|
|
|
|
td = etgtools.TypedefDef(name='wxTreeItemIdValue', type='void*')
|
|
module.insertItemBefore(c, td)
|
|
|
|
#-------------------------------------------------------
|
|
module.addPyCode("""\
|
|
def TreeItemData(data):
|
|
return data
|
|
TreeItemData = deprecated(TreeItemData, "The TreeItemData class no longer exists, just pass your object directly to the tree instead.")
|
|
""")
|
|
|
|
#-------------------------------------------------------
|
|
c = module.find('wxTreeCtrl')
|
|
tools.fixWindowClass(c)
|
|
module.addGlobalStr('wxTreeCtrlNameStr', before=c)
|
|
|
|
|
|
# Set all wxTreeItemData parameters to transfer ownership. Is this still needed with MappedTypes?
|
|
for item in c.allItems():
|
|
if hasattr(item, 'type') and item.type == 'wxTreeItemData *' and \
|
|
isinstance(item, etgtools.ParamDef):
|
|
item.transfer = True
|
|
|
|
c.addPyCode("""\
|
|
TreeCtrl.GetItemPyData = wx.deprecated(TreeCtrl.GetItemData, 'Use GetItemData instead.')
|
|
TreeCtrl.SetItemPyData = wx.deprecated(TreeCtrl.SetItemData, 'Use SetItemData instead.')
|
|
TreeCtrl.GetPyData = wx.deprecated(TreeCtrl.GetItemData, 'Use GetItemData instead.')
|
|
TreeCtrl.SetPyData = wx.deprecated(TreeCtrl.SetItemData, 'Use SetItemData instead.')
|
|
""")
|
|
|
|
|
|
# We can't use wxClassInfo
|
|
c.find('EditLabel.textCtrlClass').ignore()
|
|
|
|
# Replace GetSelections with a method that returns a Python list
|
|
# size_t GetSelections(wxArrayTreeItemIds& selection) const;
|
|
c.find('GetSelections').ignore()
|
|
c.addCppMethod('PyObject*', 'GetSelections', '()',
|
|
doc='Returns a list of currently selected items in the tree. This function '
|
|
'can be called only if the control has the wx.TR_MULTIPLE style.',
|
|
body="""\
|
|
wxPyThreadBlocker blocker;
|
|
PyObject* rval = PyList_New(0);
|
|
wxArrayTreeItemIds array;
|
|
size_t num, x;
|
|
num = self->GetSelections(array);
|
|
for (x=0; x < num; x++) {
|
|
wxTreeItemId *tii = new wxTreeItemId(array.Item(x));
|
|
PyObject* item = wxPyConstructObject((void*)tii, wxT("wxTreeItemId"), true);
|
|
PyList_Append(rval, item);
|
|
Py_DECREF(item);
|
|
}
|
|
return rval;
|
|
""")
|
|
|
|
# Change GetBoundingRect to return the rectangle instead of modifying the parameter.
|
|
#bool GetBoundingRect(const wxTreeItemId& item, wxRect& rect, bool textOnly = false) const;
|
|
c.find('GetBoundingRect').ignore()
|
|
c.addCppMethod('PyObject*', 'GetBoundingRect', '(const wxTreeItemId& item, bool textOnly=false)',
|
|
doc="""\
|
|
Returns the rectangle bounding the item. If textOnly is true,
|
|
only the rectangle around the item's label will be returned, otherwise
|
|
the item's image is also taken into account. The return value may be None
|
|
if the rectangle was not successfully retrieved, such as if the item is
|
|
currently not visible.
|
|
""",
|
|
isFactory=True,
|
|
body="""\
|
|
wxRect rect;
|
|
if (self->GetBoundingRect(*item, rect, textOnly)) {
|
|
wxPyThreadBlocker blocker;
|
|
wxRect* r = new wxRect(rect);
|
|
PyObject* val = wxPyConstructObject((void*)r, wxT("wxRect"), true);
|
|
return val;
|
|
}
|
|
else
|
|
RETURN_NONE();
|
|
""")
|
|
|
|
|
|
# switch the virtualness back on for those methods that need to have it.
|
|
c.find('OnCompareItems').isVirtual = True
|
|
|
|
|
|
# transfer imagelist ownership
|
|
c.find('AssignImageList.imageList').transfer = True
|
|
c.find('AssignStateImageList.imageList').transfer = True
|
|
c.find('AssignButtonsImageList.imageList').transfer = True
|
|
|
|
|
|
# Make the cookie values be returned, instead of setting it through the parameter
|
|
c.find('GetFirstChild.cookie').out = True
|
|
c.find('GetNextChild.cookie').inOut = True
|
|
|
|
|
|
# TODO: These don't exist on MSW, Are they important enough that we
|
|
# should provide them for the other platforms anyway?
|
|
c.find('AssignButtonsImageList').ignore()
|
|
c.find('GetButtonsImageList').ignore()
|
|
c.find('SetButtonsImageList').ignore()
|
|
|
|
|
|
#-------------------------------------------------------
|
|
c = module.find('wxTreeEvent')
|
|
tools.fixEventClass(c)
|
|
|
|
c.addPyCode("""\
|
|
EVT_TREE_BEGIN_DRAG = PyEventBinder(wxEVT_TREE_BEGIN_DRAG , 1)
|
|
EVT_TREE_BEGIN_RDRAG = PyEventBinder(wxEVT_TREE_BEGIN_RDRAG , 1)
|
|
EVT_TREE_BEGIN_LABEL_EDIT = PyEventBinder(wxEVT_TREE_BEGIN_LABEL_EDIT , 1)
|
|
EVT_TREE_END_LABEL_EDIT = PyEventBinder(wxEVT_TREE_END_LABEL_EDIT , 1)
|
|
EVT_TREE_DELETE_ITEM = PyEventBinder(wxEVT_TREE_DELETE_ITEM , 1)
|
|
EVT_TREE_GET_INFO = PyEventBinder(wxEVT_TREE_GET_INFO , 1)
|
|
EVT_TREE_SET_INFO = PyEventBinder(wxEVT_TREE_SET_INFO , 1)
|
|
EVT_TREE_ITEM_EXPANDED = PyEventBinder(wxEVT_TREE_ITEM_EXPANDED , 1)
|
|
EVT_TREE_ITEM_EXPANDING = PyEventBinder(wxEVT_TREE_ITEM_EXPANDING , 1)
|
|
EVT_TREE_ITEM_COLLAPSED = PyEventBinder(wxEVT_TREE_ITEM_COLLAPSED , 1)
|
|
EVT_TREE_ITEM_COLLAPSING = PyEventBinder(wxEVT_TREE_ITEM_COLLAPSING , 1)
|
|
EVT_TREE_SEL_CHANGED = PyEventBinder(wxEVT_TREE_SEL_CHANGED , 1)
|
|
EVT_TREE_SEL_CHANGING = PyEventBinder(wxEVT_TREE_SEL_CHANGING , 1)
|
|
EVT_TREE_KEY_DOWN = PyEventBinder(wxEVT_TREE_KEY_DOWN , 1)
|
|
EVT_TREE_ITEM_ACTIVATED = PyEventBinder(wxEVT_TREE_ITEM_ACTIVATED , 1)
|
|
EVT_TREE_ITEM_RIGHT_CLICK = PyEventBinder(wxEVT_TREE_ITEM_RIGHT_CLICK , 1)
|
|
EVT_TREE_ITEM_MIDDLE_CLICK = PyEventBinder(wxEVT_TREE_ITEM_MIDDLE_CLICK, 1)
|
|
EVT_TREE_END_DRAG = PyEventBinder(wxEVT_TREE_END_DRAG , 1)
|
|
EVT_TREE_STATE_IMAGE_CLICK = PyEventBinder(wxEVT_TREE_STATE_IMAGE_CLICK, 1)
|
|
EVT_TREE_ITEM_GETTOOLTIP = PyEventBinder(wxEVT_TREE_ITEM_GETTOOLTIP, 1)
|
|
EVT_TREE_ITEM_MENU = PyEventBinder(wxEVT_TREE_ITEM_MENU, 1)
|
|
|
|
# deprecated wxEVT aliases
|
|
wxEVT_COMMAND_TREE_BEGIN_DRAG = wxEVT_TREE_BEGIN_DRAG
|
|
wxEVT_COMMAND_TREE_BEGIN_RDRAG = wxEVT_TREE_BEGIN_RDRAG
|
|
wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT = wxEVT_TREE_BEGIN_LABEL_EDIT
|
|
wxEVT_COMMAND_TREE_END_LABEL_EDIT = wxEVT_TREE_END_LABEL_EDIT
|
|
wxEVT_COMMAND_TREE_DELETE_ITEM = wxEVT_TREE_DELETE_ITEM
|
|
wxEVT_COMMAND_TREE_GET_INFO = wxEVT_TREE_GET_INFO
|
|
wxEVT_COMMAND_TREE_SET_INFO = wxEVT_TREE_SET_INFO
|
|
wxEVT_COMMAND_TREE_ITEM_EXPANDED = wxEVT_TREE_ITEM_EXPANDED
|
|
wxEVT_COMMAND_TREE_ITEM_EXPANDING = wxEVT_TREE_ITEM_EXPANDING
|
|
wxEVT_COMMAND_TREE_ITEM_COLLAPSED = wxEVT_TREE_ITEM_COLLAPSED
|
|
wxEVT_COMMAND_TREE_ITEM_COLLAPSING = wxEVT_TREE_ITEM_COLLAPSING
|
|
wxEVT_COMMAND_TREE_SEL_CHANGED = wxEVT_TREE_SEL_CHANGED
|
|
wxEVT_COMMAND_TREE_SEL_CHANGING = wxEVT_TREE_SEL_CHANGING
|
|
wxEVT_COMMAND_TREE_KEY_DOWN = wxEVT_TREE_KEY_DOWN
|
|
wxEVT_COMMAND_TREE_ITEM_ACTIVATED = wxEVT_TREE_ITEM_ACTIVATED
|
|
wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK = wxEVT_TREE_ITEM_RIGHT_CLICK
|
|
wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK = wxEVT_TREE_ITEM_MIDDLE_CLICK
|
|
wxEVT_COMMAND_TREE_END_DRAG = wxEVT_TREE_END_DRAG
|
|
wxEVT_COMMAND_TREE_STATE_IMAGE_CLICK = wxEVT_TREE_STATE_IMAGE_CLICK
|
|
wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP = wxEVT_TREE_ITEM_GETTOOLTIP
|
|
wxEVT_COMMAND_TREE_ITEM_MENU = wxEVT_TREE_ITEM_MENU
|
|
""")
|
|
|
|
#-----------------------------------------------------------------
|
|
tools.doCommonTweaks(module)
|
|
tools.runGenerators(module)
|
|
|
|
|
|
#---------------------------------------------------------------------------
|
|
if __name__ == '__main__':
|
|
run()
|
|
|