From: Robin Dunn Date: Mon, 28 Feb 2000 04:05:41 +0000 (+0000) Subject: Added wrapper for wxListCtrl.SortItems. Added column sorting to the X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/dcd386834a7f6b7cff27165826d2fdacc27592fa 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 --- diff --git a/utils/wxPython/CHANGES.txt b/utils/wxPython/CHANGES.txt index 74d50b59bc..c249a26efe 100644 --- a/utils/wxPython/CHANGES.txt +++ b/utils/wxPython/CHANGES.txt @@ -14,6 +14,7 @@ GetSelections. Fixed some problems in OGL. Also wxShape.SetClientData and .GetClientData can now deal with Python objects. +Added wxListCtrl.SortItems and changed the demo to show how to use it. diff --git a/utils/wxPython/demo/Main.py b/utils/wxPython/demo/Main.py index 6b52617234..b94fd77952 100644 --- a/utils/wxPython/demo/Main.py +++ b/utils/wxPython/demo/Main.py @@ -21,9 +21,7 @@ _useSplitter = true _useNestedSplitter = true _treeList = [ - ('New since last release', ['wxMVCTree', 'wxVTKRenderWindow', - 'FileBrowseButton', 'GenericButtons', - 'wxMask', 'wxEditor']), + ('New since last release', []), ('Managed Windows', ['wxFrame', 'wxDialog', 'wxMiniFrame']), @@ -275,12 +273,8 @@ class wxPythonDemo(wxFrame): self.window = module.runTest(self, self.nb, self) if self.window: self.nb.AddPage(self.window, 'Demo') - #self.nb.ResizeChildren() + wxYield() self.nb.SetSelection(2) - #self.window.Refresh() - #self.nb.ResizeChildren() - #if self.window.GetAutoLayout(): - # self.window.Layout() else: self.ovr.Clear() diff --git a/utils/wxPython/demo/bitmaps/.cvsignore b/utils/wxPython/demo/bitmaps/.cvsignore new file mode 100644 index 0000000000..e107acaeeb --- /dev/null +++ b/utils/wxPython/demo/bitmaps/.cvsignore @@ -0,0 +1 @@ +new.bmp.test diff --git a/utils/wxPython/demo/wxListCtrl.py b/utils/wxPython/demo/wxListCtrl.py index bd8487818c..fd521a8bb5 100644 --- a/utils/wxPython/demo/wxListCtrl.py +++ b/utils/wxPython/demo/wxListCtrl.py @@ -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): def __init__(self, parent, log): wxPanel.__init__(self, parent, -1) @@ -32,24 +75,27 @@ class TestListCtrlPanel(wxPanel): self.list.SetToolTip(wxToolTip("This is a ToolTip!")) wxToolTip_Enable(true) - self.list.InsertColumn(0, "Column 0") - self.list.InsertColumn(1, "Column 1") - self.list.InsertColumn(2, "One More Column (2)") - for x in range(50): - self.list.InsertImageStringItem(x, "This is item %d" % x, idx1) - self.list.SetStringItem(x, 1, "Col 1, item %d" % x) - self.list.SetStringItem(x, 2, "item %d in column 2" % x) - self.list.SetItemData(x, x*2) + self.list.InsertColumn(0, "Artist") + self.list.InsertColumn(1, "Title") + self.list.InsertColumn(2, "Genre") + items = musicdata.items() + for x in range(len(items)): + key, data = items[x] + self.list.InsertImageStringItem(x, data[0], idx1) + 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(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.currentItem = 0 EVT_LIST_ITEM_SELECTED(self, tID, self.OnItemSelected) EVT_LIST_DELETE_ITEM(self, tID, self.OnItemDelete) + EVT_LIST_COL_CLICK(self, tID, self.OnColClick) EVT_LEFT_DCLICK(self.list, self.OnDoubleClick) EVT_RIGHT_DOWN(self.list, self.OnRightDown) @@ -73,6 +119,18 @@ class TestListCtrlPanel(wxPanel): def OnItemDelete(self, event): 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): self.log.WriteText("OnDoubleClick item %s\n" % self.list.GetItemText(self.currentItem)) diff --git a/utils/wxPython/lib/mvctree.py b/utils/wxPython/lib/mvctree.py index f268d9eb41..699b1b9566 100644 --- a/utils/wxPython/lib/mvctree.py +++ b/utils/wxPython/lib/mvctree.py @@ -800,10 +800,12 @@ class wxMVCTree(wxScrolledWindow): e = wxMVCTreeEvent(wxEVT_MVCTREE_ADD_ITEM, self.GetId(), node = child, nodes = [parent, child]) self.GetEventHandler().ProcessEvent(e) self.painter.ClearBuffer() + def NodeRemoved(self, node): e = wxMVCTreeEvent(wxEVT_MVCTREE_DELETE_ITEM, self.GetId(), node = child, nodes = [parent, child]) self.GetEventHandler().ProcessEvent(e) self.painter.ClearBuffer() + def OnKeyDown(self, evt): e = wxMVCTreeEvent(wxEVT_MVCTREE_KEY_DOWN, self.GetId(), keyEvent = evt) self.GetEventHandler().ProcessEvent(e) @@ -814,6 +816,7 @@ class wxMVCTree(wxScrolledWindow): dc.SetFont(font) self.layout.SetHeight(dc.GetTextExtent("")[1] + 18) self.painter.ClearBuffer() + def GetFont(self): return self.painter.GetFont() diff --git a/utils/wxPython/src/controls2.i b/utils/wxPython/src/controls2.i index d6c263814c..f2cfc6430f 100644 --- a/utils/wxPython/src/controls2.i +++ b/utils/wxPython/src/controls2.i @@ -223,10 +223,37 @@ public: void SetItemText(long item, const wxString& text); void SetSingleStyle(long style, bool add = TRUE); 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; + } + +%} //---------------------------------------------------------------------- diff --git a/utils/wxPython/src/gdi.i b/utils/wxPython/src/gdi.i index 78bbb9e946..cb566c3853 100644 --- a/utils/wxPython/src/gdi.i +++ b/utils/wxPython/src/gdi.i @@ -666,7 +666,7 @@ enum { class wxImageList { public: - wxImageList(int width, int height, int mask=FALSE, int initialCount=1); + wxImageList(int width, int height, int mask=TRUE, int initialCount=1); ~wxImageList(); #ifdef __WXMSW__ diff --git a/utils/wxPython/src/msw/controls2.cpp b/utils/wxPython/src/msw/controls2.cpp index 254d7ad97a..6eaa46dc17 100644 --- a/utils/wxPython/src/msw/controls2.cpp +++ b/utils/wxPython/src/msw/controls2.cpp @@ -111,6 +111,24 @@ static char* wxStringErrorMsg = "string type is required for parameter"; 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 { public: wxPyTreeItemData(PyObject* obj = NULL) { @@ -2986,6 +3004,43 @@ static PyObject *_wrap_wxListCtrl_SetWindowStyleFlag(PyObject *self, PyObject *a 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()) static PyObject *_wrap_new_wxTreeItemId(PyObject *self, PyObject *args, PyObject *kwargs) { PyObject * _resultobj; @@ -6095,6 +6150,7 @@ static PyMethodDef controls2cMethods[] = { { "wxTreeItemId_IsOk", (PyCFunction) _wrap_wxTreeItemId_IsOk, METH_VARARGS | METH_KEYWORDS }, { "delete_wxTreeItemId", (PyCFunction) _wrap_delete_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_SetSingleStyle", (PyCFunction) _wrap_wxListCtrl_SetSingleStyle, METH_VARARGS | METH_KEYWORDS }, { "wxListCtrl_SetItemText", (PyCFunction) _wrap_wxListCtrl_SetItemText, METH_VARARGS | METH_KEYWORDS }, diff --git a/utils/wxPython/src/msw/controls2.py b/utils/wxPython/src/msw/controls2.py index 5cadc4898d..a8669d0550 100644 --- a/utils/wxPython/src/msw/controls2.py +++ b/utils/wxPython/src/msw/controls2.py @@ -300,6 +300,9 @@ class wxListCtrlPtr(wxControlPtr): def SetWindowStyleFlag(self, *_args, **_kwargs): val = apply(controls2c.wxListCtrl_SetWindowStyleFlag,(self,) + _args, _kwargs) return val + def SortItems(self, *_args, **_kwargs): + val = apply(controls2c.wxListCtrl_SortItems,(self,) + _args, _kwargs) + return val def __repr__(self): return "" % (self.this,) class wxListCtrl(wxListCtrlPtr): diff --git a/utils/wxPython/src/msw/gdi.cpp b/utils/wxPython/src/msw/gdi.cpp index 00391d32a2..8ef5126cd0 100644 --- a/utils/wxPython/src/msw/gdi.cpp +++ b/utils/wxPython/src/msw/gdi.cpp @@ -7530,7 +7530,7 @@ static PyObject *_wrap_new_wxImageList(PyObject *self, PyObject *args, PyObject wxImageList * _result; int _arg0; int _arg1; - int _arg2 = (int ) FALSE; + int _arg2 = (int ) TRUE; int _arg3 = (int ) 1; char *_kwnames[] = { "width","height","mask","initialCount", NULL }; char _ptemp[128]; diff --git a/utils/wxPython/src/windows2.i b/utils/wxPython/src/windows2.i index 0e8d7a7200..6cf660bf3f 100644 --- a/utils/wxPython/src/windows2.i +++ b/utils/wxPython/src/windows2.i @@ -39,6 +39,7 @@ //--------------------------------------------------------------------------- +#ifndef OLD_GRID enum { wxGRID_TEXT_CTRL, @@ -235,6 +236,7 @@ enum { wxEVT_GRID_LABEL_RCLICK, }; +#endif //---------------------------------------------------------------------------