Added wrapper for wxListCtrl.SortItems. Added column sorting to the

demo to show how to use it.

Other fixes and updates.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6324 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2000-02-28 04:05:41 +00:00
parent 984ef9dce7
commit dcd386834a
11 changed files with 165 additions and 20 deletions

View File

@@ -14,6 +14,7 @@ GetSelections.
Fixed some problems in OGL. Also wxShape.SetClientData and Fixed some problems in OGL. Also wxShape.SetClientData and
.GetClientData can now deal with Python objects. .GetClientData can now deal with Python objects.
Added wxListCtrl.SortItems and changed the demo to show how to use it.

View File

@@ -21,9 +21,7 @@ _useSplitter = true
_useNestedSplitter = true _useNestedSplitter = true
_treeList = [ _treeList = [
('New since last release', ['wxMVCTree', 'wxVTKRenderWindow', ('New since last release', []),
'FileBrowseButton', 'GenericButtons',
'wxMask', 'wxEditor']),
('Managed Windows', ['wxFrame', 'wxDialog', 'wxMiniFrame']), ('Managed Windows', ['wxFrame', 'wxDialog', 'wxMiniFrame']),
@@ -275,12 +273,8 @@ class wxPythonDemo(wxFrame):
self.window = module.runTest(self, self.nb, self) self.window = module.runTest(self, self.nb, self)
if self.window: if self.window:
self.nb.AddPage(self.window, 'Demo') self.nb.AddPage(self.window, 'Demo')
#self.nb.ResizeChildren() wxYield()
self.nb.SetSelection(2) self.nb.SetSelection(2)
#self.window.Refresh()
#self.nb.ResizeChildren()
#if self.window.GetAutoLayout():
# self.window.Layout()
else: else:
self.ovr.Clear() self.ovr.Clear()

View File

@@ -0,0 +1 @@
new.bmp.test

View File

@@ -15,6 +15,49 @@ from wxPython.wx import *
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
musicdata = {
1 : ("Bad English", "The Price Of Love", "Rock"),
2 : ("DNA featuring Suzanne Vega", "Tom's Diner", "Rock"),
3 : ("George Michael", "Praying For Time", "Rock"),
4 : ("Gloria Estefan", "Here We Are", "Rock"),
5 : ("Linda Ronstadt", "Don't Know Much", "Rock"),
6 : ("Michael Bolton", "How Am I Supposed To Live Without You", "Blues"),
7 : ("Paul Young", "Oh Girl", "Rock"),
8 : ("Paula Abdul", "Opposites Attract", "Rock"),
9 : ("Richard Marx", "Should've Known Better", "Rock"),
10: ("Rod Stewart", "Forever Young", "Rock"),
11: ("Roxette", "Dangerous", "Rock"),
12: ("Sheena Easton", "The Lover In Me", "Rock"),
13: ("Sinead O'Connor", "Nothing Compares 2 U", "Rock"),
14: ("Stevie B.", "Because I Love You", "Rock"),
15: ("Taylor Dayne", "Love Will Lead You Back", "Rock"),
16: ("The Bangles", "Eternal Flame", "Rock"),
17: ("Wilson Phillips", "Release Me", "Rock"),
18: ("Billy Joel", "Blonde Over Blue", "Rock"),
19: ("Billy Joel", "Famous Last Words", "Rock"),
20: ("Billy Joel", "Lullabye (Goodnight, My Angel)", "Rock"),
21: ("Billy Joel", "The River Of Dreams", "Rock"),
22: ("Billy Joel", "Two Thousand Years", "Rock"),
23: ("Janet Jackson", "Alright", "Rock"),
24: ("Janet Jackson", "Black Cat", "Rock"),
25: ("Janet Jackson", "Come Back To Me", "Rock"),
26: ("Janet Jackson", "Escapade", "Rock"),
27: ("Janet Jackson", "Love Will Never Do (Without You)", "Rock"),
28: ("Janet Jackson", "Miss You Much", "Rock"),
29: ("Janet Jackson", "Rhythm Nation", "Rock"),
30: ("Janet Jackson", "State Of The World", "Rock"),
31: ("Janet Jackson", "The Knowledge", "Rock"),
32: ("Spyro Gyra", "End of Romanticism", "Jazz"),
33: ("Spyro Gyra", "Heliopolis", "Jazz"),
34: ("Spyro Gyra", "Jubilee", "Jazz"),
35: ("Spyro Gyra", "Little Linda", "Jazz"),
36: ("Spyro Gyra", "Morning Dance", "Jazz"),
37: ("Spyro Gyra", "Song for Lorraine", "Jazz"),
38: ("Yes", "Owner Of A Lonely Heart", "Rock"),
39: ("Yes", "Rhythm Of Love", "Rock"),
}
class TestListCtrlPanel(wxPanel): class TestListCtrlPanel(wxPanel):
def __init__(self, parent, log): def __init__(self, parent, log):
wxPanel.__init__(self, parent, -1) wxPanel.__init__(self, parent, -1)
@@ -32,24 +75,27 @@ class TestListCtrlPanel(wxPanel):
self.list.SetToolTip(wxToolTip("This is a ToolTip!")) self.list.SetToolTip(wxToolTip("This is a ToolTip!"))
wxToolTip_Enable(true) wxToolTip_Enable(true)
self.list.InsertColumn(0, "Column 0") self.list.InsertColumn(0, "Artist")
self.list.InsertColumn(1, "Column 1") self.list.InsertColumn(1, "Title")
self.list.InsertColumn(2, "One More Column (2)") self.list.InsertColumn(2, "Genre")
for x in range(50): items = musicdata.items()
self.list.InsertImageStringItem(x, "This is item %d" % x, idx1) for x in range(len(items)):
self.list.SetStringItem(x, 1, "Col 1, item %d" % x) key, data = items[x]
self.list.SetStringItem(x, 2, "item %d in column 2" % x) self.list.InsertImageStringItem(x, data[0], idx1)
self.list.SetItemData(x, x*2) self.list.SetStringItem(x, 1, data[1])
self.list.SetStringItem(x, 2, data[2])
self.list.SetItemData(x, key)
self.list.SetColumnWidth(0, wxLIST_AUTOSIZE) self.list.SetColumnWidth(0, wxLIST_AUTOSIZE)
self.list.SetColumnWidth(1, wxLIST_AUTOSIZE) self.list.SetColumnWidth(1, wxLIST_AUTOSIZE)
self.list.SetColumnWidth(2, wxLIST_AUTOSIZE) ##self.list.SetColumnWidth(2, wxLIST_AUTOSIZE)
self.list.SetItemState(5, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED) self.list.SetItemState(5, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED)
self.currentItem = 0 self.currentItem = 0
EVT_LIST_ITEM_SELECTED(self, tID, self.OnItemSelected) EVT_LIST_ITEM_SELECTED(self, tID, self.OnItemSelected)
EVT_LIST_DELETE_ITEM(self, tID, self.OnItemDelete) EVT_LIST_DELETE_ITEM(self, tID, self.OnItemDelete)
EVT_LIST_COL_CLICK(self, tID, self.OnColClick)
EVT_LEFT_DCLICK(self.list, self.OnDoubleClick) EVT_LEFT_DCLICK(self.list, self.OnDoubleClick)
EVT_RIGHT_DOWN(self.list, self.OnRightDown) EVT_RIGHT_DOWN(self.list, self.OnRightDown)
@@ -73,6 +119,18 @@ class TestListCtrlPanel(wxPanel):
def OnItemDelete(self, event): def OnItemDelete(self, event):
self.log.WriteText("OnItemDelete\n") self.log.WriteText("OnItemDelete\n")
def OnColClick(self, event):
self.log.WriteText("OnColClick: %d\n" % event.m_col)
self.col = event.m_col
self.list.SortItems(self.ColumnSorter)
def ColumnSorter(self, key1, key2):
item1 = musicdata[key1][self.col]
item2 = musicdata[key2][self.col]
if item1 == item2: return 0
elif item1 < item2: return -1
else: return 1
def OnDoubleClick(self, event): def OnDoubleClick(self, event):
self.log.WriteText("OnDoubleClick item %s\n" % self.list.GetItemText(self.currentItem)) self.log.WriteText("OnDoubleClick item %s\n" % self.list.GetItemText(self.currentItem))

View File

@@ -800,10 +800,12 @@ class wxMVCTree(wxScrolledWindow):
e = wxMVCTreeEvent(wxEVT_MVCTREE_ADD_ITEM, self.GetId(), node = child, nodes = [parent, child]) e = wxMVCTreeEvent(wxEVT_MVCTREE_ADD_ITEM, self.GetId(), node = child, nodes = [parent, child])
self.GetEventHandler().ProcessEvent(e) self.GetEventHandler().ProcessEvent(e)
self.painter.ClearBuffer() self.painter.ClearBuffer()
def NodeRemoved(self, node): def NodeRemoved(self, node):
e = wxMVCTreeEvent(wxEVT_MVCTREE_DELETE_ITEM, self.GetId(), node = child, nodes = [parent, child]) e = wxMVCTreeEvent(wxEVT_MVCTREE_DELETE_ITEM, self.GetId(), node = child, nodes = [parent, child])
self.GetEventHandler().ProcessEvent(e) self.GetEventHandler().ProcessEvent(e)
self.painter.ClearBuffer() self.painter.ClearBuffer()
def OnKeyDown(self, evt): def OnKeyDown(self, evt):
e = wxMVCTreeEvent(wxEVT_MVCTREE_KEY_DOWN, self.GetId(), keyEvent = evt) e = wxMVCTreeEvent(wxEVT_MVCTREE_KEY_DOWN, self.GetId(), keyEvent = evt)
self.GetEventHandler().ProcessEvent(e) self.GetEventHandler().ProcessEvent(e)
@@ -814,6 +816,7 @@ class wxMVCTree(wxScrolledWindow):
dc.SetFont(font) dc.SetFont(font)
self.layout.SetHeight(dc.GetTextExtent("")[1] + 18) self.layout.SetHeight(dc.GetTextExtent("")[1] + 18)
self.painter.ClearBuffer() self.painter.ClearBuffer()
def GetFont(self): def GetFont(self):
return self.painter.GetFont() return self.painter.GetFont()

View File

@@ -223,10 +223,37 @@ public:
void SetItemText(long item, const wxString& text); void SetItemText(long item, const wxString& text);
void SetSingleStyle(long style, bool add = TRUE); void SetSingleStyle(long style, bool add = TRUE);
void SetWindowStyleFlag(long style); void SetWindowStyleFlag(long style);
// TODO: bool SortItems(wxListCtrlCompare fn, long data);
// bool SortItems(wxListCtrlCompare fn, long data);
%addmethods {
bool SortItems(PyObject* func) {
if (!PyCallable_Check(func))
return FALSE;
return self->SortItems(wxPyTreeCtrl_SortItems, (long)func);
}
}
}; };
%{
int wxCALLBACK wxPyTreeCtrl_SortItems(long item1, long item2, long funcPtr) {
int retval = 0;
PyObject* func = (PyObject*)funcPtr;
bool doSave = wxPyRestoreThread();
PyObject* args = Py_BuildValue("(ii)", item1, item2);
PyObject* result = PyEval_CallObject(func, args);
Py_DECREF(args);
if (result) {
retval = PyInt_AsLong(result);
Py_DECREF(result);
}
wxPySaveThread(doSave);
return retval;
}
%}
//---------------------------------------------------------------------- //----------------------------------------------------------------------

View File

@@ -666,7 +666,7 @@ enum {
class wxImageList { class wxImageList {
public: public:
wxImageList(int width, int height, int mask=FALSE, int initialCount=1); wxImageList(int width, int height, int mask=TRUE, int initialCount=1);
~wxImageList(); ~wxImageList();
#ifdef __WXMSW__ #ifdef __WXMSW__

View File

@@ -111,6 +111,24 @@ static char* wxStringErrorMsg = "string type is required for parameter";
extern wxValidator wxPyDefaultValidator; extern wxValidator wxPyDefaultValidator;
int wxCALLBACK wxPyTreeCtrl_SortItems(long item1, long item2, long funcPtr) {
int retval = 0;
PyObject* func = (PyObject*)funcPtr;
bool doSave = wxPyRestoreThread();
PyObject* args = Py_BuildValue("(ii)", item1, item2);
PyObject* result = PyEval_CallObject(func, args);
Py_DECREF(args);
if (result) {
retval = PyInt_AsLong(result);
Py_DECREF(result);
}
wxPySaveThread(doSave);
return retval;
}
class wxPyTreeItemData : public wxTreeItemData { class wxPyTreeItemData : public wxTreeItemData {
public: public:
wxPyTreeItemData(PyObject* obj = NULL) { wxPyTreeItemData(PyObject* obj = NULL) {
@@ -2986,6 +3004,43 @@ static PyObject *_wrap_wxListCtrl_SetWindowStyleFlag(PyObject *self, PyObject *a
return _resultobj; return _resultobj;
} }
static bool wxListCtrl_SortItems(wxListCtrl *self,PyObject * func) {
if (!PyCallable_Check(func))
return FALSE;
return self->SortItems(wxPyTreeCtrl_SortItems, (long)func);
}
static PyObject *_wrap_wxListCtrl_SortItems(PyObject *self, PyObject *args, PyObject *kwargs) {
PyObject * _resultobj;
bool _result;
wxListCtrl * _arg0;
PyObject * _arg1;
PyObject * _argo0 = 0;
PyObject * _obj1 = 0;
char *_kwnames[] = { "self","func", NULL };
self = self;
if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxListCtrl_SortItems",_kwnames,&_argo0,&_obj1))
return NULL;
if (_argo0) {
if (_argo0 == Py_None) { _arg0 = NULL; }
else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxListCtrl_p")) {
PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxListCtrl_SortItems. Expected _wxListCtrl_p.");
return NULL;
}
}
{
_arg1 = _obj1;
}
{
wxPy_BEGIN_ALLOW_THREADS;
_result = (bool )wxListCtrl_SortItems(_arg0,_arg1);
wxPy_END_ALLOW_THREADS;
} _resultobj = Py_BuildValue("i",_result);
return _resultobj;
}
#define new_wxTreeItemId() (new wxTreeItemId()) #define new_wxTreeItemId() (new wxTreeItemId())
static PyObject *_wrap_new_wxTreeItemId(PyObject *self, PyObject *args, PyObject *kwargs) { static PyObject *_wrap_new_wxTreeItemId(PyObject *self, PyObject *args, PyObject *kwargs) {
PyObject * _resultobj; PyObject * _resultobj;
@@ -6095,6 +6150,7 @@ static PyMethodDef controls2cMethods[] = {
{ "wxTreeItemId_IsOk", (PyCFunction) _wrap_wxTreeItemId_IsOk, METH_VARARGS | METH_KEYWORDS }, { "wxTreeItemId_IsOk", (PyCFunction) _wrap_wxTreeItemId_IsOk, METH_VARARGS | METH_KEYWORDS },
{ "delete_wxTreeItemId", (PyCFunction) _wrap_delete_wxTreeItemId, METH_VARARGS | METH_KEYWORDS }, { "delete_wxTreeItemId", (PyCFunction) _wrap_delete_wxTreeItemId, METH_VARARGS | METH_KEYWORDS },
{ "new_wxTreeItemId", (PyCFunction) _wrap_new_wxTreeItemId, METH_VARARGS | METH_KEYWORDS }, { "new_wxTreeItemId", (PyCFunction) _wrap_new_wxTreeItemId, METH_VARARGS | METH_KEYWORDS },
{ "wxListCtrl_SortItems", (PyCFunction) _wrap_wxListCtrl_SortItems, METH_VARARGS | METH_KEYWORDS },
{ "wxListCtrl_SetWindowStyleFlag", (PyCFunction) _wrap_wxListCtrl_SetWindowStyleFlag, METH_VARARGS | METH_KEYWORDS }, { "wxListCtrl_SetWindowStyleFlag", (PyCFunction) _wrap_wxListCtrl_SetWindowStyleFlag, METH_VARARGS | METH_KEYWORDS },
{ "wxListCtrl_SetSingleStyle", (PyCFunction) _wrap_wxListCtrl_SetSingleStyle, METH_VARARGS | METH_KEYWORDS }, { "wxListCtrl_SetSingleStyle", (PyCFunction) _wrap_wxListCtrl_SetSingleStyle, METH_VARARGS | METH_KEYWORDS },
{ "wxListCtrl_SetItemText", (PyCFunction) _wrap_wxListCtrl_SetItemText, METH_VARARGS | METH_KEYWORDS }, { "wxListCtrl_SetItemText", (PyCFunction) _wrap_wxListCtrl_SetItemText, METH_VARARGS | METH_KEYWORDS },

View File

@@ -300,6 +300,9 @@ class wxListCtrlPtr(wxControlPtr):
def SetWindowStyleFlag(self, *_args, **_kwargs): def SetWindowStyleFlag(self, *_args, **_kwargs):
val = apply(controls2c.wxListCtrl_SetWindowStyleFlag,(self,) + _args, _kwargs) val = apply(controls2c.wxListCtrl_SetWindowStyleFlag,(self,) + _args, _kwargs)
return val return val
def SortItems(self, *_args, **_kwargs):
val = apply(controls2c.wxListCtrl_SortItems,(self,) + _args, _kwargs)
return val
def __repr__(self): def __repr__(self):
return "<C wxListCtrl instance at %s>" % (self.this,) return "<C wxListCtrl instance at %s>" % (self.this,)
class wxListCtrl(wxListCtrlPtr): class wxListCtrl(wxListCtrlPtr):

View File

@@ -7530,7 +7530,7 @@ static PyObject *_wrap_new_wxImageList(PyObject *self, PyObject *args, PyObject
wxImageList * _result; wxImageList * _result;
int _arg0; int _arg0;
int _arg1; int _arg1;
int _arg2 = (int ) FALSE; int _arg2 = (int ) TRUE;
int _arg3 = (int ) 1; int _arg3 = (int ) 1;
char *_kwnames[] = { "width","height","mask","initialCount", NULL }; char *_kwnames[] = { "width","height","mask","initialCount", NULL };
char _ptemp[128]; char _ptemp[128];

View File

@@ -39,6 +39,7 @@
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
#ifndef OLD_GRID
enum { enum {
wxGRID_TEXT_CTRL, wxGRID_TEXT_CTRL,
@@ -235,6 +236,7 @@ enum {
wxEVT_GRID_LABEL_RCLICK, wxEVT_GRID_LABEL_RCLICK,
}; };
#endif
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------