Updated wxColumnSorterMixin to also be able to place sort icons on the
column headers, and updated the wxListCtrl demo to show it off by using wxColumnSorterMixin. Other odds and ends... git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11549 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1,3 +1,39 @@
|
||||
*.py
|
||||
*.pyc
|
||||
*.pyd
|
||||
__init__.py
|
||||
__version__.py
|
||||
calendar.py
|
||||
clip_dnd.py
|
||||
cmndlgs.py
|
||||
controls.py
|
||||
controls2.py
|
||||
events.py
|
||||
filesys.py
|
||||
frames.py
|
||||
gdi.py
|
||||
glcanvas.py
|
||||
grid.py
|
||||
help.py
|
||||
html.py
|
||||
htmlhelp.py
|
||||
image.py
|
||||
mdi.py
|
||||
misc.py
|
||||
misc2.py
|
||||
ogl.py
|
||||
oglbasic.py
|
||||
oglcanvas.py
|
||||
oglshapes.py
|
||||
oglshapes2.py
|
||||
printfw.py
|
||||
sizers.py
|
||||
stattool.py
|
||||
stc.py
|
||||
stc_.py
|
||||
streams.py
|
||||
utils.py
|
||||
windows.py
|
||||
windows2.py
|
||||
windows3.py
|
||||
wx.py
|
||||
xrc.py
|
||||
|
@@ -34,53 +34,99 @@ class wxColumnSorterMixin:
|
||||
objects representing the values in each column. These values
|
||||
are compared in the column sorter to determine sort order.
|
||||
|
||||
Interesting methods to override are GetColumnSorter,
|
||||
GetSecondarySortValues, and GetSortImages. See below for details.
|
||||
"""
|
||||
|
||||
def __init__(self, numColumns):
|
||||
self._colSortFlag = [0] * numColumns
|
||||
self._col = 0
|
||||
self._colSortFlag[self._col] = 1
|
||||
self._col = -1
|
||||
|
||||
list = self.GetListCtrl()
|
||||
if not list:
|
||||
raise ValueError, "No wxListCtrl available"
|
||||
EVT_LIST_COL_CLICK(list, list.GetId(), self.OnColClick)
|
||||
EVT_LIST_COL_CLICK(list, list.GetId(), self.__OnColClick)
|
||||
|
||||
|
||||
def SortListItems(self, col=-1, ascending=1):
|
||||
"""Sort the list on demand. Can also be used to set the sort column and order."""
|
||||
oldCol = self._col
|
||||
if col != -1:
|
||||
self._col = col
|
||||
self._colSortFlag[col] = ascending
|
||||
self.GetListCtrl().SortItems(self.ColumnSorter)
|
||||
|
||||
|
||||
def OnColClick(self, evt):
|
||||
self._col = col = evt.m_col
|
||||
self._colSortFlag[col] = not self._colSortFlag[col]
|
||||
self.GetListCtrl().SortItems(self.ColumnSorter)
|
||||
|
||||
|
||||
def ColumnSorter(self, key1, key2):
|
||||
col = self._col
|
||||
sortFlag = self._colSortFlag[col]
|
||||
item1 = self.itemDataMap[key1][col]
|
||||
item2 = self.itemDataMap[key2][col]
|
||||
if item1 == item2: return 0
|
||||
if sortFlag:
|
||||
if item1 < item2: return -1
|
||||
else: return 1
|
||||
else:
|
||||
if item1 > item2: return -1
|
||||
else: return 1
|
||||
self.GetListCtrl().SortItems(self.GetColumnSorter())
|
||||
self.__updateImages(oldCol)
|
||||
|
||||
|
||||
def GetColumnWidths(self):
|
||||
"""
|
||||
Returns a list of column widths. Can be used to help restore the current
|
||||
view later.
|
||||
"""
|
||||
list = self.GetListCtrl()
|
||||
rv = []
|
||||
for x in range(len(self._colSortFlag)):
|
||||
rv.append(list.GetColumnWidth(x))
|
||||
return rv
|
||||
|
||||
|
||||
def GetSortImages(self):
|
||||
"""
|
||||
Returns a tuple of image list indexesthe indexes in the image list for an image to be put on the column
|
||||
header when sorting in descending order.
|
||||
"""
|
||||
return (-1, -1) # (decending, ascending) image IDs
|
||||
|
||||
|
||||
def GetColumnSorter(self):
|
||||
"""Returns a callable object to be used for comparing column values when sorting."""
|
||||
return self.__ColumnSorter
|
||||
|
||||
|
||||
def GetSecondarySortValues(self, col, key1, key2):
|
||||
"""Returns a tuple of 2 values to use for secondary sort values when the
|
||||
items in the selected column match equal. The default just returns the
|
||||
item data values."""
|
||||
return (key1, key2)
|
||||
|
||||
|
||||
def __OnColClick(self, evt):
|
||||
oldCol = self._col
|
||||
self._col = col = evt.GetColumn()
|
||||
self._colSortFlag[col] = not self._colSortFlag[col]
|
||||
self.GetListCtrl().SortItems(self.GetColumnSorter())
|
||||
self.__updateImages(oldCol)
|
||||
evt.Skip()
|
||||
|
||||
|
||||
def __ColumnSorter(self, key1, key2):
|
||||
col = self._col
|
||||
ascending = self._colSortFlag[col]
|
||||
item1 = self.itemDataMap[key1][col]
|
||||
item2 = self.itemDataMap[key2][col]
|
||||
|
||||
cmpVal = cmp(item1, item2)
|
||||
|
||||
# If the items are equal then pick something else to make the sort value unique
|
||||
if cmpVal == 0:
|
||||
cmpVal = apply(cmp, self.GetSecondarySortValues(col, key1, key2))
|
||||
|
||||
if ascending:
|
||||
return cmpVal
|
||||
else:
|
||||
return -cmpVal
|
||||
|
||||
|
||||
def __updateImages(self, oldCol):
|
||||
sortImages = self.GetSortImages()
|
||||
if self._col != -1 and sortImages[0] != -1:
|
||||
img = sortImages[self._colSortFlag[self._col]]
|
||||
list = self.GetListCtrl()
|
||||
if oldCol != -1:
|
||||
list.ClearColumnImage(oldCol)
|
||||
list.SetColumnImage(self._col, img)
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user