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:
@@ -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.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
14
wxPython/wxPython/lib/mixins/__init__.py
Normal file
14
wxPython/wxPython/lib/mixins/__init__.py
Normal 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
|
||||||
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
73
wxPython/wxPython/lib/mixins/imagelist.py
Normal file
73
wxPython/wxPython/lib/mixins/imagelist.py
Normal 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
|
||||||
|
|
||||||
|
|
||||||
|
|
90
wxPython/wxPython/lib/mixins/listctrl.py
Normal file
90
wxPython/wxPython/lib/mixins/listctrl.py
Normal 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
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Reference in New Issue
Block a user