More forward-ported wxPython-bindings related cleanup from 2.9.0 branch, also documented wxPGProperty::GetItemAtY()
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60817 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1260,246 +1260,6 @@ public:
|
||||
m_pState->DoSortChildren(p, flags);
|
||||
}
|
||||
|
||||
#ifdef SWIG
|
||||
%pythoncode {
|
||||
def MapType(class_,factory):
|
||||
"Registers Python type/class to property mapping.\n\nfactory: Property builder function/class."
|
||||
global _type2property
|
||||
try:
|
||||
mappings = _type2property
|
||||
except NameError:
|
||||
raise AssertionError("call only after a propertygrid or manager instance constructed")
|
||||
|
||||
mappings[class_] = factory
|
||||
|
||||
|
||||
def DoDefaultTypeMappings(self):
|
||||
"Map built-in properties."
|
||||
global _type2property
|
||||
try:
|
||||
mappings = _type2property
|
||||
|
||||
return
|
||||
except NameError:
|
||||
mappings = {}
|
||||
_type2property = mappings
|
||||
|
||||
mappings[str] = StringProperty
|
||||
mappings[unicode] = StringProperty
|
||||
mappings[int] = IntProperty
|
||||
mappings[float] = FloatProperty
|
||||
mappings[bool] = BoolProperty
|
||||
mappings[list] = ArrayStringProperty
|
||||
mappings[tuple] = ArrayStringProperty
|
||||
mappings[wx.Font] = FontProperty
|
||||
mappings[wx.Colour] = ColourProperty
|
||||
"mappings[wx.Size] = SizeProperty"
|
||||
"mappings[wx.Point] = PointProperty"
|
||||
"mappings[wx.FontData] = FontDataProperty"
|
||||
|
||||
def DoDefaultValueTypeMappings(self):
|
||||
"Map pg value type ids to getter methods."
|
||||
global _vt2getter
|
||||
try:
|
||||
vt2getter = _vt2getter
|
||||
|
||||
return
|
||||
except NameError:
|
||||
vt2getter = {}
|
||||
_vt2getter = vt2getter
|
||||
|
||||
def GetPropertyValues(self,dict_=None, as_strings=False, inc_attributes=False):
|
||||
"Returns values in the grid."
|
||||
""
|
||||
"dict_: if not given, then a new one is created. dict_ can be"
|
||||
" object as well, in which case it's __dict__ is used."
|
||||
"as_strings: if True, then string representations of values"
|
||||
" are fetched instead of native types. Useful for config and such."
|
||||
"inc_attributes: if True, then property attributes are added"
|
||||
" as @<propname>@<attr>."
|
||||
""
|
||||
"Return value: dictionary with values. It is always a dictionary,"
|
||||
"so if dict_ was object with __dict__ attribute, then that attribute"
|
||||
"is returned."
|
||||
|
||||
if dict_ is None:
|
||||
dict_ = {}
|
||||
elif hasattr(dict_,'__dict__'):
|
||||
dict_ = dict_.__dict__
|
||||
|
||||
if not as_strings:
|
||||
getter = self.GetPropertyValue
|
||||
else:
|
||||
getter = self.GetPropertyValueAsString
|
||||
|
||||
it = self.GetVIterator(PG_ITERATE_PROPERTIES)
|
||||
while not it.AtEnd():
|
||||
p = it.GetProperty()
|
||||
name = p.GetName()
|
||||
|
||||
dict_[name] = getter(p)
|
||||
|
||||
if inc_attributes:
|
||||
attrs = p.GetAttributes()
|
||||
if attrs and len(attrs):
|
||||
dict_['@%s@attr'%name] = attrs
|
||||
|
||||
it.Next()
|
||||
|
||||
return dict_
|
||||
|
||||
GetValues = GetPropertyValues
|
||||
|
||||
|
||||
def SetPropertyValues(self,dict_):
|
||||
"Sets property values from dict_, which can be either\ndictionary or an object with __dict__ attribute."
|
||||
""
|
||||
"autofill: If true, keys with not relevant properties"
|
||||
" are auto-created. For more info, see AutoFill."
|
||||
""
|
||||
"Notes:"
|
||||
" * Keys starting with underscore are ignored."
|
||||
" * Attributes can be set with entries named @<propname>@<attr>."
|
||||
""
|
||||
|
||||
autofill = False
|
||||
|
||||
if dict_ is None:
|
||||
dict_ = {}
|
||||
elif hasattr(dict_,'__dict__'):
|
||||
dict_ = dict_.__dict__
|
||||
|
||||
attr_dicts = []
|
||||
|
||||
def set_sub_obj(k0,dict_):
|
||||
for k,v in dict_.iteritems():
|
||||
if k[0] != '_':
|
||||
if k.endswith('@attr'):
|
||||
attr_dicts.append((k[1:-5],v))
|
||||
else:
|
||||
try:
|
||||
self.SetPropertyValue(k,v)
|
||||
except:
|
||||
try:
|
||||
if autofill:
|
||||
self._AutoFillOne(k0,k,v)
|
||||
continue
|
||||
except:
|
||||
if isinstance(v,dict):
|
||||
set_sub_obj(k,v)
|
||||
elif hasattr(v,'__dict__'):
|
||||
set_sub_obj(k,v.__dict__)
|
||||
|
||||
|
||||
for k,v in attr_dicts:
|
||||
p = GetPropertyByName(k)
|
||||
if not p:
|
||||
raise AssertionError("No such property: '%s'"%k)
|
||||
for an,av in v.iteritems():
|
||||
p.SetAttribute(an, av)
|
||||
|
||||
|
||||
cur_page = False
|
||||
is_manager = isinstance(self,PropertyGridManager)
|
||||
|
||||
try:
|
||||
set_sub_obj(self.GetGrid().GetRoot(),dict_)
|
||||
except:
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
|
||||
self.Refresh()
|
||||
|
||||
SetValues = SetPropertyValues
|
||||
|
||||
def _AutoFillMany(self,cat,dict_):
|
||||
for k,v in dict_.iteritems():
|
||||
self._AutoFillOne(cat,k,v)
|
||||
|
||||
|
||||
def _AutoFillOne(self,cat,k,v):
|
||||
global _type2property
|
||||
|
||||
factory = _type2property.get(v.__class__,None)
|
||||
|
||||
if factory:
|
||||
self.AppendIn( cat, factory(k,k,v) )
|
||||
elif hasattr(v,'__dict__'):
|
||||
cat2 = self.AppendIn( cat, PropertyCategory(k) )
|
||||
self._AutoFillMany(cat2,v.__dict__)
|
||||
elif isinstance(v,dict):
|
||||
cat2 = self.AppendIn( cat, PropertyCategory(k) )
|
||||
self._AutoFillMany(cat2,v)
|
||||
elif not k.startswith('_'):
|
||||
raise AssertionError("member '%s' is of unregisted type/class '%s'"%(k,v.__class__))
|
||||
|
||||
|
||||
def AutoFill(self,obj,parent=None):
|
||||
"Clears properties and re-fills to match members and\nvalues of given object or dictionary obj."
|
||||
|
||||
self.edited_objects[parent] = obj
|
||||
|
||||
cur_page = False
|
||||
is_manager = isinstance(self,PropertyGridManager)
|
||||
|
||||
if not parent:
|
||||
if is_manager:
|
||||
page = self.GetCurrentPage()
|
||||
page.Clear()
|
||||
parent = page.GetRoot()
|
||||
else:
|
||||
self.Clear()
|
||||
parent = self.GetGrid().GetRoot()
|
||||
else:
|
||||
it = self.GetIterator(PG_ITERATE_PROPERTIES, parent)
|
||||
it.Next() # Skip the parent
|
||||
while not it.AtEnd():
|
||||
p = it.GetProperty()
|
||||
if not p.IsSomeParent(parent):
|
||||
break
|
||||
|
||||
self.DeleteProperty(p)
|
||||
|
||||
name = p.GetName()
|
||||
it.Next()
|
||||
|
||||
if not is_manager or page == self.GetCurrentPage():
|
||||
self.Freeze()
|
||||
cur_page = True
|
||||
|
||||
try:
|
||||
self._AutoFillMany(parent,obj.__dict__)
|
||||
except:
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
|
||||
if cur_page:
|
||||
self.Thaw()
|
||||
|
||||
def RegisterEditor(self, editor, editorName=None):
|
||||
"Transform class into instance, if necessary."
|
||||
if not isinstance(editor, PGEditor):
|
||||
editor = editor()
|
||||
if not editorName:
|
||||
editorName = editor.__class__.__name__
|
||||
try:
|
||||
self._editor_instances.append(editor)
|
||||
except:
|
||||
self._editor_instances = [editor]
|
||||
RegisterEditor(editor, editorName)
|
||||
|
||||
def GetPropertyClientData(self, p):
|
||||
if isinstance(p, basestring):
|
||||
p = self.GetPropertyByName(p)
|
||||
return p.GetClientData()
|
||||
|
||||
def SetPropertyClientData(self, p, data):
|
||||
if isinstance(p, basestring):
|
||||
p = self.GetPropertyByName(p)
|
||||
return p.SetClientData(data)
|
||||
}
|
||||
#endif
|
||||
|
||||
// GetPropertyByName With nice assertion error message.
|
||||
wxPGProperty* GetPropertyByNameA( const wxString& name ) const;
|
||||
|
||||
|
Reference in New Issue
Block a user