From: Robin Dunn Date: Wed, 15 Mar 2006 23:22:53 +0000 (+0000) Subject: Added CheckListCtrlMixin from Bruce Who X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/23a023642cc8975a88ae02953a15234c4f4d1ee5 Added CheckListCtrlMixin from Bruce Who git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38121 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/wxPython/demo/CheckListCtrlMixin.py b/wxPython/demo/CheckListCtrlMixin.py new file mode 100644 index 0000000000..6e7d27dcff --- /dev/null +++ b/wxPython/demo/CheckListCtrlMixin.py @@ -0,0 +1,93 @@ +import sys +import wx +from wx.lib.mixins.listctrl import CheckListCtrlMixin + +from ListCtrl import musicdata + +#---------------------------------------------------------------------- + +class CheckListCtrl(wx.ListCtrl, CheckListCtrlMixin): + def __init__(self, parent, log): + wx.ListCtrl.__init__(self, parent, -1, style=wx.LC_REPORT) + CheckListCtrlMixin.__init__(self) + self.log = log + self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated) + + + def OnItemActivated(self, evt): + self.ToggleItem(evt.m_itemIndex) + + + # this is called by the base class when an item is checked/unchecked + def OnCheckItem(self, index, flag): + data = self.GetItemData(index) + title = musicdata[data][1] + if flag: + what = "checked" + else: + what = "unchecked" + self.log.write('item "%s", at index %d was %s\n' % (title, index, what)) + + + +class TestPanel(wx.Panel): + def __init__(self, parent, log): + self.log = log + wx.Panel.__init__(self, parent, -1) + + self.list = CheckListCtrl(self, log) + sizer = wx.BoxSizer() + sizer.Add(self.list, 1, wx.EXPAND) + self.SetSizer(sizer) + + self.list.InsertColumn(0, "Artist") + self.list.InsertColumn(1, "Title", wx.LIST_FORMAT_RIGHT) + self.list.InsertColumn(2, "Genre") + + for key, data in musicdata.iteritems(): + index = self.list.InsertStringItem(sys.maxint, data[0]) + self.list.SetStringItem(index, 1, data[1]) + self.list.SetStringItem(index, 2, data[2]) + self.list.SetItemData(index, key) + + self.list.SetColumnWidth(0, wx.LIST_AUTOSIZE) + self.list.SetColumnWidth(1, wx.LIST_AUTOSIZE) + self.list.SetColumnWidth(2, 100) + + self.list.CheckItem(4) + self.list.CheckItem(7) + + self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.list) + self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected, self.list) + + + def OnItemSelected(self, evt): + self.log.write('item selected: %s\n' % evt.m_itemIndex) + + def OnItemDeselected(self, evt): + self.log.write('item deselected: %s\n' % evt.m_itemIndex) + + +#---------------------------------------------------------------------- + +def runTest(frame, nb, log): + win = TestPanel(nb, log) + return win + +#---------------------------------------------------------------------- + + + +overview = """ +

Say something nice here

+ + +""" + + + +if __name__ == '__main__': + import sys,os + import run + run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:]) + diff --git a/wxPython/demo/Main.py b/wxPython/demo/Main.py index 19ee3de034..b4cc0ab37e 100644 --- a/wxPython/demo/Main.py +++ b/wxPython/demo/Main.py @@ -47,6 +47,8 @@ import images _treeList = [ # new stuff ('Recent Additions/Updates', [ + 'AnalogClock', + 'CheckListCtrlMixin', 'Treebook', 'Toolbook', ]), @@ -129,7 +131,7 @@ _treeList = [ ]), ('Custom Controls', [ - 'AnalogClockWindow', + 'AnalogClock', 'ColourSelect', 'Editor', 'GenericButtons', @@ -149,6 +151,7 @@ _treeList = [ #'RightTextCtrl', deprecated as we have wxTE_RIGHT now. 'Calendar', 'CalendarCtrl', + 'CheckListCtrlMixin', 'ContextHelp', 'DatePickerCtrl', 'DynamicSashWindow', diff --git a/wxPython/wx/lib/mixins/listctrl.py b/wxPython/wx/lib/mixins/listctrl.py index 2de4d3bbca..71504759da 100644 --- a/wxPython/wx/lib/mixins/listctrl.py +++ b/wxPython/wx/lib/mixins/listctrl.py @@ -290,6 +290,7 @@ class ListCtrlAutoWidthMixin: +#---------------------------------------------------------------------------- #---------------------------------------------------------------------------- SEL_FOC = wx.LIST_STATE_SELECTED | wx.LIST_STATE_FOCUSED @@ -381,6 +382,7 @@ class ListCtrlSelectionManagerMix: self.afterPopupMenu(event.menu) +#---------------------------------------------------------------------------- #---------------------------------------------------------------------------- from bisect import bisect @@ -612,4 +614,156 @@ class TextEditMixin: +#---------------------------------------------------------------------------- +#---------------------------------------------------------------------------- + +""" +FILENAME: CheckListCtrlMixin.py +AUTHOR: Bruce Who (bruce.who.hk at gmail.com) +DATE: 2006-02-09 +$Revision$ +DESCRIPTION: + This script provide a mixin for ListCtrl which add a checkbox in the first + column of each row. It is inspired by limodou's CheckList.py(which can be + got from his NewEdit) and improved: + - You can just use InsertStringItem() to insert new items; + - Once a checkbox is checked/unchecked, the corresponding item is not + selected; + - You can use SetItemData() and GetItemData(); + - Interfaces are changed to OnCheckItem(), IsChecked(), CheckItem(). + + You should not set a imagelist for the ListCtrl once this mixin is used. + +HISTORY: +1.3 - You can check/uncheck a group of sequential items by : + First click(or ) item1 to check/uncheck it, then + Shift-click item2 to check/uncheck it, and you'll find that all + items between item1 and item2 are check/unchecked! +1.2 - Add ToggleItem() +1.1 - Initial version +""" + +from wx import ImageFromStream, BitmapFromImage +import cStringIO, zlib + +def getUncheckData(): + return zlib.decompress( +"x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\ +\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\xbb{\xba8\x86X\xf4\ +&\xa7\xa4$\xa5-`1\x08\\2\xbb\xb1\xb1\x91\xf5\xd8\x84o\xeb\xff\xfaw\x1d[.=[2\ +\x90'\x01\x08v\xec]\xd3\xa3qvU`l\x81\xd9\xd18\t\xd3\x84+\x0cll[\xa6t\xcc9\ +\xd4\xc1\xda\xc3 index: + begin_index = index + end_index = last_index + else: + assert False + while begin_index <= end_index: + self.CheckItem(begin_index, flag_check) + begin_index += 1 + self.__last_check_ = (index, flag_check) + else: + evt.Skip() + + def OnCheckItem(self, index, flag): + pass + + def IsChecked(self, index): + return self.GetItem(index).GetImage() == 1 + + def CheckItem(self, index, check = True): + img_idx = self.GetItem(index).GetImage() + if img_idx == 0 and check is True: + self.SetItemImage(index, 1) + self.OnCheckItem(index, True) + elif img_idx == 1 and check is False: + self.SetItemImage(index, 0) + self.OnCheckItem(index, False) + + def ToggleItem(self, index): + self.CheckItem(index, not self.IsChecked(index)) + + #----------------------------------------------------------------------------