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:
Jaakko Salli
2009-05-30 11:20:35 +00:00
parent b512ed9320
commit 14bac4b5b9
6 changed files with 24 additions and 305 deletions

View File

@@ -65,9 +65,7 @@ class WXDLLIMPEXP_PROPGRID wxPropertyGridPage : public wxEvtHandler,
public wxPropertyGridPageState
{
friend class wxPropertyGridManager;
#ifndef SWIG
DECLARE_CLASS(wxPropertyGridPage)
#endif
public:
wxPropertyGridPage();
@@ -212,39 +210,18 @@ private:
class WXDLLIMPEXP_PROPGRID
wxPropertyGridManager : public wxPanel, public wxPropertyGridInterface
{
#ifndef SWIG
DECLARE_CLASS(wxPropertyGridManager)
#endif
friend class wxPropertyGridPage;
public:
#ifdef SWIG
%pythonAppend wxPropertyGridManager {
self._setOORInfo(self)
self.DoDefaultTypeMappings()
self.edited_objects = {}
self.DoDefaultValueTypeMappings()
if not hasattr(self.__class__,'_vt2setter'):
self.__class__._vt2setter = {}
}
%pythonAppend wxPropertyGridManager() ""
wxPropertyGridManager( wxWindow *parent, wxWindowID id = wxID_ANY,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = wxPGMAN_DEFAULT_STYLE,
const wxChar* name =
wxPyPropertyGridManagerNameStr );
%RenameCtor(PrePropertyGridManager, wxPropertyGridManager());
#else
#ifndef SWIG
/**
Two step constructor.
Call Create when this constructor is called to build up the
wxPropertyGridManager.
*/
wxPropertyGridManager();
#endif
/** The default constructor. The styles to be used are styles valid for
the wxWindow.
@@ -259,8 +236,6 @@ public:
/** Destructor */
virtual ~wxPropertyGridManager();
#endif
/** Creates new property page. Note that the first page is not created
automatically.
@param label
@@ -588,19 +563,6 @@ public:
*/
void SetSplitterPosition( int pos, int column = 0 );
#ifdef SWIG
%pythoncode {
def GetValuesFromPage(self,
page,
dict_=None,
as_strings=False,
inc_attributes=False):
"Same as GetValues, but returns values from specific page only."
"For argument descriptions, see GetValues."
return page.GetPropertyValues(dict_, as_strings, inc_attributes)
}
#endif
protected:
//

View File

@@ -1058,9 +1058,8 @@ class WXDLLIMPEXP_PROPGRID wxPGProperty : public wxObject
friend class wxPropertyGridPageState;
friend class wxPropertyGridPopulator;
friend class wxStringProperty; // Proper "<composed>" support requires this
#ifndef SWIG
DECLARE_ABSTRACT_CLASS(wxPGProperty)
#endif
public:
typedef wxUint32 FlagType;
@@ -2148,9 +2147,15 @@ public:
wxPropertyGridPageState* GetParentState() const { return m_parentState; }
#endif
#ifndef SWIG
wxPGProperty* GetItemAtY( unsigned int y,
unsigned int lh,
unsigned int* nextItemY ) const;
#endif
/** Returns property at given virtual y coordinate.
*/
wxPGProperty* GetItemAtY( unsigned int y ) const;
/** Returns (direct) child property with given name (or NULL if not found).
*/

View File

@@ -583,30 +583,10 @@ class WXDLLIMPEXP_PROPGRID
friend class wxPropertyGridManager;
friend class wxPGCanvas;
#ifndef SWIG
DECLARE_DYNAMIC_CLASS(wxPropertyGrid)
#endif
public:
#ifdef SWIG
%pythonAppend wxPropertyGrid {
self._setOORInfo(self)
self.DoDefaultTypeMappings()
self.edited_objects = {}
self.DoDefaultValueTypeMappings()
if not hasattr(self.__class__,'_vt2setter'):
self.__class__._vt2setter = {}
}
%pythonAppend wxPropertyGrid() ""
wxPropertyGrid( wxWindow *parent, wxWindowID id = wxID_ANY,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = wxPG_DEFAULT_STYLE,
const wxChar* name = wxPyPropertyGridNameStr );
%RenameCtor(PrePropertyGrid, wxPropertyGrid());
#else
#ifndef SWIG
/**
Two step constructor.
@@ -614,6 +594,7 @@ public:
wxPropertyGrid
*/
wxPropertyGrid();
#endif
/** The default constructor. The styles to be used are styles valid for
the wxWindow and wxScrolledWindow.
@@ -628,7 +609,6 @@ public:
/** Destructor */
virtual ~wxPropertyGrid();
#endif
/** Adds given key combination to trigger given action.

View File

@@ -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;

View File

@@ -1580,6 +1580,10 @@ public:
wxArrayInt GetIndicesForStrings( const wxArrayString& strings,
wxArrayString* unmatched = NULL ) const;
/** Returns property at given virtual y coordinate.
*/
wxPGProperty* GetItemAtY( unsigned int y ) const;
/**
Returns @true if item at given index has a valid value;
*/

View File

@@ -2274,7 +2274,9 @@ int wxPGProperty::GetChildrenHeight( int lh, int iMax_ ) const
return h;
}
wxPGProperty* wxPGProperty::GetItemAtY( unsigned int y, unsigned int lh, unsigned int* nextItemY ) const
wxPGProperty* wxPGProperty::GetItemAtY( unsigned int y,
unsigned int lh,
unsigned int* nextItemY ) const
{
wxASSERT( nextItemY );
@@ -2346,6 +2348,12 @@ void wxPGProperty::Empty()
m_children.clear();
}
wxPGProperty* wxPGProperty::GetItemAtY( unsigned int y ) const
{
unsigned int nextItem;
return GetItemAtY( y, GetGrid()->GetRowHeight(), &nextItem);
}
void wxPGProperty::DeleteChildren()
{
wxPropertyGridPageState* state = m_parentState;