Files
Phoenix/etg/config.py
Samuel Dunn f1bc13a841 Ensure wx.Config related enums are present for SIP
Also adds unittests to ensure they remain present in Phoenix.
2017-06-26 17:28:50 -07:00

240 lines
8.8 KiB
Python

#---------------------------------------------------------------------------
# Name: etg/config.py
# Author: Kevin Ollivier
# Robin Dunn
#
# Created: 10-Sept-2011
# Copyright: (c) 2011 by Kevin Ollivier
# Copyright: (c) 2011-2017 by Total Control Software
# License: wxWindows License
#---------------------------------------------------------------------------
import etgtools
import etgtools.tweaker_tools as tools
PACKAGE = "wx"
MODULE = "_core"
NAME = "config" # 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 = [ 'wxConfigBase',
'wxFileConfig',
'wxConfigPathChanger',
'interface_2wx_2config_8h.xml'
]
#---------------------------------------------------------------------------
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('wxConfigBase')
assert isinstance(c, etgtools.ClassDef)
c.mustHaveApp()
c.find('Get').mustHaveApp()
c.find('Create').mustHaveApp()
c.abstract = True
ctor = c.find('wxConfigBase')
ctor.items.remove(ctor.find('conv'))
c.find('ReadObject').ignore()
c.find('Set').transferBack = True # Python takes ownership of the return value
c.find('Set.pConfig').transfer = True # C++ takes ownership of the arg
for func in c.findAll('Read'):
if not 'wxString' in func.type:
func.ignore()
else:
func.find('defaultVal').default = 'wxEmptyString'
c.addCppMethod('long', 'ReadInt', '(const wxString& key, long defaultVal=0)', """\
long rv;
self->Read(*key, &rv, defaultVal);
return rv;
""")
c.addCppMethod('double', 'ReadFloat', '(const wxString& key, double defaultVal=0.0)', """\
double rv;
self->Read(*key, &rv, defaultVal);
return rv;
""")
c.find('ReadBool').ignore()
c.addCppMethod('bool', 'ReadBool', '(const wxString& key, bool defaultVal=false)', """\
bool rv;
self->Read(*key, &rv, defaultVal);
return rv;
""")
c.find('Write').overloads = []
c.addCppMethod('bool', 'WriteInt', '(const wxString& key, long value)', """\
return self->Write(*key, value);
""")
c.addCppMethod('bool', 'WriteFloat', '(const wxString& key, double value)', """\
return self->Write(*key, value);
""")
c.addCppMethod('bool', 'WriteBool', '(const wxString& key, bool value)', """\
return self->Write(*key, value);
""")
c.find('GetFirstGroup').ignore()
c.find('GetNextGroup').ignore()
c.find('GetFirstEntry').ignore()
c.find('GetNextEntry').ignore()
c.addCppCode("""\
static PyObject* _Config_EnumerationHelper(bool flag, wxString& str, long index) {
wxPyThreadBlocker blocker;
PyObject* ret = PyTuple_New(3);
if (ret) {
PyTuple_SET_ITEM(ret, 0, PyBool_FromLong(flag));
PyTuple_SET_ITEM(ret, 1, wx2PyString(str));
PyTuple_SET_ITEM(ret, 2, wxPyInt_FromLong(index));
}
return ret;
}
""")
c.addCppMethod('PyObject*', 'GetFirstGroup', '()',
doc="""\
GetFirstGroup() -> (more, value, index)\n
Allows enumerating the subgroups in a config object. Returns a tuple
containing a flag indicating if there are more items, the name of the
current item, and an index to pass to GetNextGroup to fetch the next
item.""",
body="""\
bool more;
long index = 0;
wxString value;
more = self->GetFirstGroup(value, index);
return _Config_EnumerationHelper(more, value, index);
""")
c.addCppMethod('PyObject*', 'GetNextGroup', '(long index)',
doc="""\
GetNextGroup(long index) -> (more, value, index)\n
Allows enumerating the subgroups in a config object. Returns a tuple
containing a flag indicating if there are more items, the name of the
current item, and an index to pass to GetNextGroup to fetch the next
item.""",
body="""\
bool more;
wxString value;
more = self->GetNextGroup(value, index);
return _Config_EnumerationHelper(more, value, index);
""")
c.addCppMethod('PyObject*', 'GetFirstEntry', '()',
doc="""\
GetFirstEntry() -> (more, value, index)\n
Allows enumerating the entries in the current group in a config
object. Returns a tuple containing a flag indicating if there are more
items, the name of the current item, and an index to pass to
GetNextEntry to fetch the next item.""",
body="""\
bool more;
long index = 0;
wxString value;
more = self->GetFirstEntry(value, index);
return _Config_EnumerationHelper(more, value, index);
""")
c.addCppMethod('PyObject*', 'GetNextEntry', '(long index)',
doc="""\
GetNextEntry() -> (more, value, index)\n
Allows enumerating the entries in the current group in a config
object. Returns a tuple containing a flag indicating if there are more
items, the name of the current item, and an index to pass to
GetNextEntry to fetch the next item.""",
body="""\
bool more;
wxString value;
more = self->GetNextEntry(value, index);
return _Config_EnumerationHelper(more, value, index);
""")
#-----------------------------------------------------------------
c = module.find('wxFileConfig')
c.mustHaveApp()
c.addPrivateCopyCtor()
c.find('wxFileConfig').findOverload('wxInputStream').find('conv').ignore()
ctor = c.find('wxFileConfig').findOverload('wxString').find('conv').ignore()
#ctor.items.remove(ctor.find('conv'))
ctor = c.find('Save').find('conv').ignore()
c.find('GetGlobalFile').ignore()
c.find('GetLocalFile').ignore()
c.find('GetFirstGroup').ignore()
c.find('GetNextGroup').ignore()
c.find('GetFirstEntry').ignore()
c.find('GetNextEntry').ignore()
#-----------------------------------------------------------------
# In C++ wxConfig is a #define to some other config class. We'll let our
# backend generator believe that it's a real class with that name. It will
# end up using the wxConfig #defined in the C++ code, and will actually be
# whatever is the default config class for the platform.
wc = etgtools.WigCode("""\
class wxConfig : wxConfigBase
{
public:
wxConfig(const wxString& appName = wxEmptyString,
const wxString& vendorName = wxEmptyString,
const wxString& localFilename = wxEmptyString,
const wxString& globalFilename = wxEmptyString,
long style = wxCONFIG_USE_LOCAL_FILE | wxCONFIG_USE_GLOBAL_FILE);
~wxConfig();
// pure virtuals with implementations here
const wxString & GetPath() const;
void SetPath(const wxString & strPath);
size_t GetNumberOfEntries(bool bRecursive = false) const;
size_t GetNumberOfGroups(bool bRecursive = false) const;
bool HasEntry(const wxString & strName) const;
bool HasGroup(const wxString & strName) const;
bool Flush(bool bCurrentOnly = false);
bool RenameEntry(const wxString & oldName, const wxString & newName);
bool RenameGroup(const wxString & oldName, const wxString & newName);
bool DeleteAll();
bool DeleteEntry(const wxString & key, bool bDeleteGroupIfEmpty = true);
bool DeleteGroup(const wxString & key);
private:
wxConfig(const wxConfig&);
};
""")
module.addItem(wc)
#-----------------------------------------------------------------
c = module.find('wxConfigPathChanger')
assert isinstance(c, etgtools.ClassDef)
c.addPrivateCopyCtor()
# context manager methods
c.addPyMethod('__enter__', '(self)', 'return self')
c.addPyMethod('__exit__', '(self, exc_type, exc_val, exc_tb)', 'return False')
#-----------------------------------------------------------------
tools.doCommonTweaks(module)
tools.runGenerators(module)
#---------------------------------------------------------------------------
if __name__ == '__main__':
run()