Files
Phoenix/etg/treelist.py
Jeremy Drake 31e6c8ed34 WXMSW: use HandleToLong/LongToHandle functions.
On Clang++, casting from a pointer to an integer of a smaller size is
considered an error.  In cases where Windows HANDLEs are converted
to/from longs, use the Windows-provided conversion functions
HandleToLong and LongToHandle.

In a couple of cases, a pointer is being cast to long in a __hash__
function.  These don't seem Windows-specific so it is not safe to assume
the Windows conversion functions are present.  In those cases, fall back
to the (ugly) double-casting that the Windows functions contain.
2021-06-14 11:43:29 -07:00

145 lines
5.8 KiB
Python

#---------------------------------------------------------------------------
# Name: etg/treelist.py
# Author: Robin Dunn
#
# Created: 06-Jun-2012
# Copyright: (c) 2012-2020 by Total Control Software
# License: wxWindows License
#---------------------------------------------------------------------------
import etgtools
import etgtools.tweaker_tools as tools
PACKAGE = "wx"
MODULE = "_dataview"
NAME = "treelist" # 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 = [ "wxTreeListItem",
"wxTreeListItemComparator",
"wxTreeListCtrl",
"wxTreeListEvent",
]
#---------------------------------------------------------------------------
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.
module.addHeaderCode('#include <wx/treelist.h>')
module.find('wxTreeListEventHandler').ignore()
module.find('wxTreeListItems').ignore()
#-----------------------------------------------------------------
c = module.find('wxTreeListItem')
assert isinstance(c, etgtools.ClassDef)
c.addCppMethod('int', '__nonzero__', '()', "return self->IsOk();")
c.addCppMethod('int', '__bool__', '()', "return self->IsOk();")
c.addCppMethod('long', '__hash__', '()', """\
return (long)(intptr_t)self->GetID();
""")
c.addCppMethod('bool', '__eq__', '(wxTreeListItem* other)',
"return other ? (self->GetID() == other->GetID()) : false;")
c.addCppMethod('bool', '__ne__', '(wxTreeListItem* other)',
"return other ? (self->GetID() != other->GetID()) : true;")
#-----------------------------------------------------------------
c = module.find('wxTreeListItemComparator')
c.addPrivateCopyCtor()
#-----------------------------------------------------------------
c = module.find('wxTreeListCtrl')
tools.fixWindowClass(c)
module.addGlobalStr('wxTreeListCtrlNameStr', c)
# Change NO_IMAGE default arg values to just -1, as the pi code has
# problems when using the class name before the class is fully defined.
for item in c.allItems():
if isinstance(item, etgtools.ParamDef) and item.default == 'NO_IMAGE':
item.default = '-1'
# transfer ownership of some parameters
c.find('AssignImageList.imageList').transfer = True
c.find('SetItemData.data').transfer = True
c.find('AppendItem.data').transfer = True
c.find('InsertItem.data').transfer = True
c.find('PrependItem.data').transfer = True
# Replace GetSelections with an implementation that returns a Python list
c.find('GetSelections').ignore()
c.addCppMethod('PyObject*', 'GetSelections', '()',
doc="""\
Returns a list of all selected items. This method can be used in
both single and multi-selection case.""",
body="""\
unsigned count;
wxTreeListItems items;
count = self->GetSelections(items);
wxPyThreadBlocker blocker;
PyObject* list = PyList_New(count);
for (size_t i=0; i<count; i++) {
wxTreeListItem* item = new wxTreeListItem(items[i]);
PyObject* obj = wxPyConstructObject((void*)item, wxT("wxTreeListItem"), true);
PyList_SET_ITEM(list, i, obj); // PyList_SET_ITEM steals a reference
}
return list;
""")
# Set output parameter flags
c.find('GetSortColumn.col').out = True
c.find('GetSortColumn.ascendingOrder').out = True
# Replace NO_IMAGE with wxTreeListCtrl::NO_IMAGE in parameter default values
for item in c.allItems():
if isinstance(item, etgtools.ParamDef) and item.default == 'NO_IMAGE':
item.default = 'wxTreeListCtrl::NO_IMAGE'
#-----------------------------------------------------------------
c = module.find('wxTreeListEvent')
tools.fixEventClass(c)
module.addPyCode("""\
EVT_TREELIST_SELECTION_CHANGED = wx.PyEventBinder( wxEVT_TREELIST_SELECTION_CHANGED )
EVT_TREELIST_ITEM_EXPANDING = wx.PyEventBinder( wxEVT_TREELIST_ITEM_EXPANDING )
EVT_TREELIST_ITEM_EXPANDED = wx.PyEventBinder( wxEVT_TREELIST_ITEM_EXPANDED )
EVT_TREELIST_ITEM_CHECKED = wx.PyEventBinder( wxEVT_TREELIST_ITEM_CHECKED )
EVT_TREELIST_ITEM_ACTIVATED = wx.PyEventBinder( wxEVT_TREELIST_ITEM_ACTIVATED )
EVT_TREELIST_ITEM_CONTEXT_MENU = wx.PyEventBinder( wxEVT_TREELIST_ITEM_CONTEXT_MENU )
EVT_TREELIST_COLUMN_SORTED = wx.PyEventBinder( wxEVT_TREELIST_COLUMN_SORTED )
# deprecated wxEVT aliases
wxEVT_COMMAND_TREELIST_SELECTION_CHANGED = wxEVT_TREELIST_SELECTION_CHANGED
wxEVT_COMMAND_TREELIST_ITEM_EXPANDING = wxEVT_TREELIST_ITEM_EXPANDING
wxEVT_COMMAND_TREELIST_ITEM_EXPANDED = wxEVT_TREELIST_ITEM_EXPANDED
wxEVT_COMMAND_TREELIST_ITEM_CHECKED = wxEVT_TREELIST_ITEM_CHECKED
wxEVT_COMMAND_TREELIST_ITEM_ACTIVATED = wxEVT_TREELIST_ITEM_ACTIVATED
wxEVT_COMMAND_TREELIST_ITEM_CONTEXT_MENU = wxEVT_TREELIST_ITEM_CONTEXT_MENU
wxEVT_COMMAND_TREELIST_COLUMN_SORTED = wxEVT_TREELIST_COLUMN_SORTED
""")
#-----------------------------------------------------------------
tools.doCommonTweaks(module)
tools.runGenerators(module)
#---------------------------------------------------------------------------
if __name__ == '__main__':
run()