Added wxWave.
+Added the wxPython.lib.mixins package to the library, it is where
+useful mix-in classes can be placed. Currently there is one to help
+makeing the columns in a wxListCtrl sortable, and the MagicIMageList
+from Mike Fletcher. If you have any custom code that can be factored
+out of existing classes into a mix-in that would be useful to others
+please send it to me for inclusion in this package.
+
include wxPython/lib/*.txt
include wxPython/lib/editor/*.py
include wxPython/lib/editor/*.txt
+include wxPython/lib/mixins/*.py
exclude wxPython/*
exclude tests
Source: "wxPython\lib\*.py"; DestDir: "{app}\wxPython\lib"; Components: core
Source: "wxPython\lib\editor\*.py"; DestDir: "{app}\wxPython\lib\editor"; Components: core
Source: "wxPython\lib\editor\*.txt"; DestDir: "{app}\wxPython\lib\editor"; Components: core
+Source: "wxPython\lib\mixins\*.py"; DestDir: "{app}\wxPython\lib\mixins"; Components: core
Source: "demo\*.py"; DestDir: "{app}\wxPython\demo"; Components: demo
Source: "demo\*.xml"; DestDir: "{app}\wxPython\demo"; Components: demo
--- /dev/null
+#----------------------------------------------------------------------
+# Name: wxPython.lib.mixins
+# Purpose: A package for helpful wxPython mix-in classes
+#
+# Author: Robin Dunn
+#
+# Created: 15-May-2001
+# RCS-ID: $Id$
+# Copyright: (c) 2001 by Total Control Software
+# Licence: wxWindows license
+#----------------------------------------------------------------------
+
+
+
--- /dev/null
+#----------------------------------------------------------------------------
+# Name: wxPython.lib.mixins.listctrl
+# Purpose: Helpful mix-in classes for using a wxImageList
+#
+# Author: Robin Dunn
+#
+# Created: 15-May-2001
+# RCS-ID: $Id$
+# Copyright: (c) 2001 by Total Control Software
+# Licence: wxWindows license
+#----------------------------------------------------------------------------
+
+from wxPython.wx import *
+
+#----------------------------------------------------------------------------
+
+class MagicImageList:
+ '''
+ Mix-in to provide "magic" growing image lists
+ By Mike Fletcher
+ '''
+
+ ### LAZYTREE and LISTCONTROL Methods
+ DEFAULTICONSIZE = 16
+
+ def SetupIcons(self, images=(), size=None):
+ self.__size = size or self.DEFAULTICONSIZE
+ self.__magicImageList = wxImageList (self.__size,self.__size)
+ self.__magicImageListMapping = {}
+ self.SetImageList (
+ self.__magicImageList, {
+ 16:wxIMAGE_LIST_SMALL,
+ 32:wxIMAGE_LIST_NORMAL,
+ }[self.__size]
+ )
+ for image in images:
+ self.AddIcon (image)
+
+ def GetIcons (self, node):
+ '''Get icon indexes for a given node, or None if no associated icon'''
+ icon = self.GetIcon( node )
+ if icon:
+ index = self.AddIcon (icon)
+ return index, index
+ return None
+
+
+ ### Local methods...
+ def AddIcon(self, icon, mask = wxNullBitmap):
+ '''Add an icon to the image list, or get the index if already there'''
+ index = self.__magicImageListMapping.get (id (icon))
+ if index is None:
+ if isinstance( icon, wxIcon ):
+ index = self.__magicImageList.AddIcon( icon )
+ elif isinstance( icon, wxBitmap ):
+ if isinstance( mask, wxColour ):
+ index = self.__magicImageList.AddWithColourMask( icon, mask )
+ else:
+ index = self.__magicImageList.Add( icon, mask )
+ else:
+ raise ValueError("Unexpected icon object %s, "
+ "expected wxIcon or wxBitmap" % (icon))
+ self.__magicImageListMapping [id (icon)] = index
+ return index
+
+ ### Customisation point...
+ def GetIcon( self, node ):
+ '''Get the actual icon object for a node'''
+ if hasattr (node,"DIAGRAMICON"):
+ return node.DIAGRAMICON
+
+
+
--- /dev/null
+#----------------------------------------------------------------------------
+# Name: wxPython.lib.mixins.listctrl
+# Purpose: Helpful mix-in classes for wxListCtrl
+#
+# Author: Robin Dunn
+#
+# Created: 15-May-2001
+# RCS-ID: $Id$
+# Copyright: (c) 2001 by Total Control Software
+# Licence: wxWindows license
+#----------------------------------------------------------------------------
+
+from wxPython.wx import *
+
+#----------------------------------------------------------------------------
+
+class wxColumnSorterMixin:
+ """
+ A mixin class that handles sorting of a wxListCtrl in REPORT mode when
+ the coilumn header is clicked on.
+
+ There are a few requirments needed in order for this to work genericly:
+
+ 1. The combined class must have a GetListCtrl method that
+ returns the wxListCtrl to be sorted, and the list control
+ must exist at the time the wxColumnSorterMixin.__init__
+ method is called because it uses GetListCtrl.
+
+ 2. Items in the list control must have a unique data value set
+ with list.SetItemData.
+
+ 3. The combined class must have an attribute named itemDataMap
+ that is a dictionary mapping the data values to a sequence of
+ objects representing the values in each column. These values
+ are compared in the column sorter to determine sort order.
+
+ """
+ def __init__(self, numColumns):
+ self._colSortFlag = [0] * numColumns
+ self._col = 0
+ self._colSortFlag[self._col] = 1
+
+ list = self.GetListCtrl()
+ if not list:
+ raise ValueError, "No wxListCtrl available"
+ 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."""
+ 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
+
+
+ def GetColumnWidths(self):
+ list = self.GetListCtrl()
+ rv = []
+ for x in range(len(self._colSortFlag)):
+ rv.append(list.GetColumnWidth(x))
+ return rv
+
+#----------------------------------------------------------------------------
+
+
+
+
+
+