X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/27ed367cb23b71ba64c7176044f4b8dc33e753dd..68fc5c8025e38b9d827383fbfe7ce509ae331c1f:/wxPython/wx/lib/mixins/listctrl.py?ds=sidebyside diff --git a/wxPython/wx/lib/mixins/listctrl.py b/wxPython/wx/lib/mixins/listctrl.py index 7fec34285b..921e250415 100644 --- a/wxPython/wx/lib/mixins/listctrl.py +++ b/wxPython/wx/lib/mixins/listctrl.py @@ -62,7 +62,7 @@ class ColumnSorterMixin: list = self.GetListCtrl() if not list: raise ValueError, "No wx.ListCtrl available" - self.Bind(wx.EVT_LIST_COL_CLICK, self.__OnColClick, list) + list.Bind(wx.EVT_LIST_COL_CLICK, self.__OnColClick, list) def SetColumnCount(self, newNumColumns): @@ -115,9 +115,10 @@ class ColumnSorterMixin: def __OnColClick(self, evt): oldCol = self._col self._col = col = evt.GetColumn() - self._colSortFlag[col] = not self._colSortFlag[col] + self._colSortFlag[col] = int(not self._colSortFlag[col]) self.GetListCtrl().SortItems(self.GetColumnSorter()) - self.__updateImages(oldCol) + if wx.Platform != "__WXMAC__" or wx.SystemOptions.GetOptionInt("mac.listctrl.always_use_generic") == 1: + self.__updateImages(oldCol) evt.Skip() @@ -209,7 +210,7 @@ class ListCtrlAutoWidthMixin: 'minWidth' is the preferred minimum width for the last column. """ - self.resizeCloumn(self, minWidth) + self.resizeColumn(minWidth) def resizeColumn(self, minWidth): @@ -226,7 +227,10 @@ class ListCtrlAutoWidthMixin: We automatically resize the last column in the list. """ - wx.CallAfter(self._doResize) + if 'gtk2' in wx.PlatformInfo: + self._doResize() + else: + wx.CallAfter(self._doResize) event.Skip() @@ -245,6 +249,9 @@ class ListCtrlAutoWidthMixin: if not self: # avoid a PyDeadObject error return + + if self.GetSize().height < 32: + return # avoid an endless update bug when the height is small. numCols = self.GetColumnCount() if numCols == 0: return # Nothing to resize. @@ -287,6 +294,7 @@ class ListCtrlAutoWidthMixin: +#---------------------------------------------------------------------------- #---------------------------------------------------------------------------- SEL_FOC = wx.LIST_STATE_SELECTED | wx.LIST_STATE_FOCUSED @@ -378,13 +386,14 @@ class ListCtrlSelectionManagerMix: self.afterPopupMenu(event.menu) +#---------------------------------------------------------------------------- #---------------------------------------------------------------------------- from bisect import bisect class TextEditMixin: - """ - A mixin class that handles enables any text in any column of a + """ + A mixin class that enables any text in any column of a multi-column listctrl to be edited by clicking on the given row and column. You close the text editor by hitting the ENTER key or clicking somewhere else on the listctrl. You switch to the next @@ -393,15 +402,18 @@ class TextEditMixin: To use the mixin you have to include it in the class definition and call the __init__ function:: - class TestListCtrl(wx.ListCtrl, TextEdit): + class TestListCtrl(wx.ListCtrl, TextEditMixin): def __init__(self, parent, ID, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0): wx.ListCtrl.__init__(self, parent, ID, pos, size, style) - TextEdit.__init__(self) + TextEditMixin.__init__(self) Authors: Steve Zatz, Pim Van Heuven (pim@think-wize.com) """ + + editorBgColour = wx.Colour(255,255,175) # Yellow + editorFgColour = wx.Colour(0,0,0) # black def __init__(self): #editor = wx.TextCtrl(self, -1, pos=(-1,-1), size=(-1,-1), @@ -416,7 +428,6 @@ class TextEditMixin: def make_editor(self, col_style=wx.LIST_FORMAT_LEFT): - editor = wx.PreTextCtrl() style =wx.TE_PROCESS_ENTER|wx.TE_PROCESS_TAB|wx.TE_RICH2 style |= {wx.LIST_FORMAT_LEFT: wx.TE_LEFT, @@ -424,8 +435,9 @@ class TextEditMixin: wx.LIST_FORMAT_CENTRE : wx.TE_CENTRE }[col_style] - editor.Create(self, -1, style=style) - editor.SetBackgroundColour(wx.Colour(red=255,green=255,blue=175)) #Yellow + editor = wx.TextCtrl(self, -1, style=style) + editor.SetBackgroundColour(self.editorBgColour) + editor.SetForegroundColour(self.editorFgColour) font = self.GetFont() editor.SetFont(font) @@ -433,6 +445,8 @@ class TextEditMixin: self.curCol = 0 editor.Hide() + if hasattr(self, 'editor'): + self.editor.Destroy() self.editor = editor self.col_style = col_style @@ -513,6 +527,19 @@ class TextEditMixin: def OpenEditor(self, col, row): ''' Opens an editor at the current position. ''' + # give the derived class a chance to Allow/Veto this edit. + evt = wx.ListEvent(wx.wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT, self.GetId()) + evt.m_itemIndex = row + evt.m_col = col + item = self.GetItem(row, col) + evt.m_item.SetId(item.GetId()) + evt.m_item.SetColumn(item.GetColumn()) + evt.m_item.SetData(item.GetData()) + evt.m_item.SetText(item.GetText()) + ret = self.GetEventHandler().ProcessEvent(evt) + if ret and not evt.IsAllowed(): + return # user code doesn't allow the edit. + if self.GetColumn(col).m_format != self.col_style: self.make_editor(self.GetColumn(col).m_format) @@ -561,16 +588,35 @@ class TextEditMixin: self.curCol = col + # FIXME: this function is usually called twice - second time because + # it is binded to wx.EVT_KILL_FOCUS. Can it be avoided? (MW) def CloseEditor(self, evt=None): ''' Close the editor and save the new value to the ListCtrl. ''' + if not self.editor.IsShown(): + return text = self.editor.GetValue() self.editor.Hide() - if self.IsVirtual(): - # replace by whather you use to populate the virtual ListCtrl - # data source - self.SetVirtualData(self.curRow, self.curCol, text) - else: - self.SetStringItem(self.curRow, self.curCol, text) + self.SetFocus() + + # post wxEVT_COMMAND_LIST_END_LABEL_EDIT + # Event can be vetoed. It doesn't has SetEditCanceled(), what would + # require passing extra argument to CloseEditor() + evt = wx.ListEvent(wx.wxEVT_COMMAND_LIST_END_LABEL_EDIT, self.GetId()) + evt.m_itemIndex = self.curRow + evt.m_col = self.curCol + item = self.GetItem(self.curRow, self.curCol) + evt.m_item.SetId(item.GetId()) + evt.m_item.SetColumn(item.GetColumn()) + evt.m_item.SetData(item.GetData()) + evt.m_item.SetText(text) #should be empty string if editor was canceled + ret = self.GetEventHandler().ProcessEvent(evt) + if not ret or evt.IsAllowed(): + if self.IsVirtual(): + # replace by whather you use to populate the virtual ListCtrl + # data source + self.SetVirtualData(self.curRow, self.curCol, text) + else: + self.SetStringItem(self.curRow, self.curCol, text) self.RefreshItem(self.curRow) def _SelectIndex(self, row): @@ -588,4 +634,161 @@ 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)) + + #----------------------------------------------------------------------------