]> git.saurik.com Git - wxWidgets.git/commitdiff
Added mixins subpackage to wxPython.lib
authorRobin Dunn <robin@alldunn.com>
Fri, 18 May 2001 22:26:19 +0000 (22:26 +0000)
committerRobin Dunn <robin@alldunn.com>
Fri, 18 May 2001 22:26:19 +0000 (22:26 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10222 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

wxPython/CHANGES.txt
wxPython/MANIFEST.in
wxPython/distrib/make_installer.py
wxPython/wxPython/lib/mixins/__init__.py [new file with mode: 0644]
wxPython/wxPython/lib/mixins/imagelist.py [new file with mode: 0644]
wxPython/wxPython/lib/mixins/listctrl.py [new file with mode: 0644]

index 3c09d6012988391abe0d58c0dfb9ff2980791997..23a8157999f80ff23c4a5b035896f52d6e10dd92 100644 (file)
@@ -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.
+
 
 
 
index 80052de085d2bc0d58a4a1b699fcbb2a90ad788b..0b95c875da9249af08bd32065f1e3a3cf703d94d 100644 (file)
@@ -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
index b4008ba251eeba457f2c0aac7fa14b7e7a2f1698..379265cecd5859857f4d5ca9f62df42e383fcb43 100644 (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\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 (file)
index 0000000..df73958
--- /dev/null
@@ -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 (file)
index 0000000..e411c1e
--- /dev/null
@@ -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 (file)
index 0000000..e31a871
--- /dev/null
@@ -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
+
+#----------------------------------------------------------------------------
+
+
+
+
+
+