Added mixins subpackage to wxPython.lib

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10222 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2001-05-18 22:26:19 +00:00
parent 8bc25b29f1
commit 30aaddfe89
6 changed files with 186 additions and 0 deletions

View File

@@ -111,6 +111,13 @@ Fixed the __cmp__ methods for wxPoiunt and others.
Added wxWave. 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.

View File

@@ -46,6 +46,7 @@ include wxPython/lib/*.py
include wxPython/lib/*.txt include wxPython/lib/*.txt
include wxPython/lib/editor/*.py include wxPython/lib/editor/*.py
include wxPython/lib/editor/*.txt include wxPython/lib/editor/*.txt
include wxPython/lib/mixins/*.py
exclude wxPython/* exclude wxPython/*
exclude tests exclude tests

View File

@@ -79,6 +79,7 @@ Source: "wxPython\*.py"; DestDir: "{app}\wxPython"; Component
Source: "wxPython\lib\*.py"; DestDir: "{app}\wxPython\lib"; Components: core 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\*.py"; DestDir: "{app}\wxPython\lib\editor"; Components: core
Source: "wxPython\lib\editor\*.txt"; 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\*.py"; DestDir: "{app}\wxPython\demo"; Components: demo
Source: "demo\*.xml"; DestDir: "{app}\wxPython\demo"; Components: demo Source: "demo\*.xml"; DestDir: "{app}\wxPython\demo"; Components: demo

View File

@@ -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
#----------------------------------------------------------------------

View File

@@ -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

View File

@@ -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
#----------------------------------------------------------------------------