1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
#------------------------------------------------------------------------------
# Copyright (c) 2005, Enthought, Inc.
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in enthought/LICENSE.txt and may be redistributed only
# under the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
# Thanks for using Enthought open source!
#
# Author: Enthought, Inc.
# Description: <Enthought pyface package component>
#------------------------------------------------------------------------------
""" A cached image list. """
# Major package imports.
import wx
# Local imports
from image_resource import ImageResource
# fixme: rename to 'CachedImageList'?!?
class ImageList(wx.ImageList):
""" A cached image list. """
def __init__(self, width, height):
""" Creates a new cached image list. """
# Base-class constructor.
wx.ImageList.__init__(self, width, height)
self._width = width
self._height = height
# Cache of the indexes of the images in the list!
self._cache = {} # {filename : index}
return
###########################################################################
# 'ImageList' interface.
###########################################################################
def GetIndex(self, filename):
""" Returns the index of the specified image.
The image will be loaded and added to the image list if it is not
already there.
"""
# Were we passed an image resource?
if type(filename) is ImageResource:
# Try the cache first.
index = self._cache.get(filename)
if index is None:
# Create an image.
image = filename.create_image(size=(self._width, self._height))
# We force all images in the cache to be the same size.
self._scale(image)
# We also force them to be bitmaps!
bmp = image.ConvertToBitmap()
# Add the bitmap to the actual list...
index = self.Add(bmp)
# ... and update the cache.
self._cache[filename] = index
# If the icon is a string then it is the filename of some kind of
# image (e.g 'foo.gif', 'image/foo.png' etc).
elif isinstance(filename, basestring):
# Try the cache first.
index = self._cache.get(filename)
if index is None:
# Load the image from the file and add it to the list.
#
# N.B 'wx.BITMAP_TYPE_ANY' tells wxPython to attempt to
# ---- autodetect the image format.
image = wx.Image(filename, wx.BITMAP_TYPE_ANY)
# We force all images in the cache to be the same size.
self._scale(image)
# We also force them to be bitmaps!
bmp = image.ConvertToBitmap()
# Add the bitmap to the actual list...
index = self.Add(bmp)
# ... and update the cache.
self._cache[filename] = index
# Otherwise the icon is *actually* an icon (in our case, probably
# related to a MIME type).
else:
icon = filename
# Create a bitmap from the icon.
bmp = wx.EmptyBitmap(self._width, self._height)
bmp.CopyFromIcon(icon)
# Turn it into an image so that we can scale it.
image = wx.ImageFromBitmap(bmp)
# We force all images in the cache to be the same size.
self._scale(image)
# Turn it back into a bitmap!
bmp = image.ConvertToBitmap()
# Add the bitmap to the actual list...
index = self.Add(bmp)
# ... and update the cache.
self._cache[filename] = index
return index
###########################################################################
# Private interface.
###########################################################################
def _scale(self, image):
""" Scales the specified image (if necessary). """
if image.GetWidth() != self._width or image.GetHeight()!= self._height:
image.Rescale(self._width, self._height)
return image
#### EOF ######################################################################
|