From: Robin Dunn Date: Fri, 18 May 2001 22:26:19 +0000 (+0000) Subject: Added mixins subpackage to wxPython.lib X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/30aaddfe894a409879598e2a4077932b2e14aac5 Added mixins subpackage to wxPython.lib git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10222 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/wxPython/CHANGES.txt b/wxPython/CHANGES.txt index 3c09d60129..23a8157999 100644 --- a/wxPython/CHANGES.txt +++ b/wxPython/CHANGES.txt @@ -111,6 +111,13 @@ Fixed the __cmp__ methods for wxPoiunt and others. 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. + diff --git a/wxPython/MANIFEST.in b/wxPython/MANIFEST.in index 80052de085..0b95c875da 100644 --- a/wxPython/MANIFEST.in +++ b/wxPython/MANIFEST.in @@ -46,6 +46,7 @@ include wxPython/lib/*.py include wxPython/lib/*.txt include wxPython/lib/editor/*.py include wxPython/lib/editor/*.txt +include wxPython/lib/mixins/*.py exclude wxPython/* exclude tests diff --git a/wxPython/distrib/make_installer.py b/wxPython/distrib/make_installer.py index b4008ba251..379265cecd 100644 --- a/wxPython/distrib/make_installer.py +++ b/wxPython/distrib/make_installer.py @@ -79,6 +79,7 @@ Source: "wxPython\*.py"; DestDir: "{app}\wxPython"; Component 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 diff --git a/wxPython/wxPython/lib/mixins/__init__.py b/wxPython/wxPython/lib/mixins/__init__.py new file mode 100644 index 0000000000..df739581cb --- /dev/null +++ b/wxPython/wxPython/lib/mixins/__init__.py @@ -0,0 +1,14 @@ +#---------------------------------------------------------------------- +# 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 +#---------------------------------------------------------------------- + + + diff --git a/wxPython/wxPython/lib/mixins/imagelist.py b/wxPython/wxPython/lib/mixins/imagelist.py new file mode 100644 index 0000000000..e411c1e25a --- /dev/null +++ b/wxPython/wxPython/lib/mixins/imagelist.py @@ -0,0 +1,73 @@ +#---------------------------------------------------------------------------- +# 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 + + + diff --git a/wxPython/wxPython/lib/mixins/listctrl.py b/wxPython/wxPython/lib/mixins/listctrl.py new file mode 100644 index 0000000000..e31a871cbc --- /dev/null +++ b/wxPython/wxPython/lib/mixins/listctrl.py @@ -0,0 +1,90 @@ +#---------------------------------------------------------------------------- +# 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 + +#---------------------------------------------------------------------------- + + + + + +