File: image_list.py

package info (click to toggle)
enthought-traits-ui 2.0.5-1
  • links: PTS, VCS
  • area: main
  • in suites: lenny
  • size: 15,204 kB
  • ctags: 9,623
  • sloc: python: 45,547; sh: 32; makefile: 19
file content (136 lines) | stat: -rw-r--r-- 4,564 bytes parent folder | download
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 ######################################################################