degal/image.py
author Tero Marttila <terom@fixme.fi>
Sun, 14 Jun 2009 22:52:07 +0300
changeset 118 60b126ff0b74
parent 115 d5aa320697df
child 120 55cb7fc9c8fb
permissions -rw-r--r--
configuration magic - can now load configuration data from ./degal.cfg, --config, folder/degal.cfg
57
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
     1
"""
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
     2
    Per-image gallery state
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
     3
"""
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
     4
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
     5
from __future__ import with_statement
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
     6
85
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
     7
import filesystem, format, thumbnail
76
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 70
diff changeset
     8
from utils import lazy_load
12
c2d8e9a754a1 Major code restructuring. Version is now 0.5, templates use Mako, and the code is split off into several files under lib/
terom
parents:
diff changeset
     9
c2d8e9a754a1 Major code restructuring. Version is now 0.5, templates use Mako, and the code is split off into several files under lib/
terom
parents:
diff changeset
    10
import PIL.Image
57
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    11
from lib import EXIF
33
4943047bfcb5 merged http://pajukanta.fi/temp/degal_exif_r33.tar.bz2 patch from Japsu
terom
parents: 28
diff changeset
    12
57
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    13
class Image (filesystem.File) :
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    14
    """
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    15
        An Image is a filesystem File that represents an image that can be thumbnailed, and handled.
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    16
    """
44
533b7e8b5d3b strip copyright/license boilerplate from modules, except dexif and formatbytes
Tero Marttila <terom@fixme.fi>
parents: 41
diff changeset
    17
76
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 70
diff changeset
    18
    def __init__ (self, *args, **kwargs) :
57
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    19
        """
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    20
            Initialize as an Image based on the given Node, linked with the given previous node
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    21
        """
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    22
77
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    23
        super(Image, self).__init__(*args, **kwargs)
57
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    24
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    25
        # links
76
e22d9f699081 misc. fixes
Tero Marttila <terom@fixme.fi>
parents: 70
diff changeset
    26
        self.prev = None
57
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    27
        self.next = None
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    28
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    29
        # the .html file for this image
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    30
        self.html = self.parent.subfile(self.basename + '.html')
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    31
85
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
    32
        # our preview/thumbnail
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
    33
        self.preview = thumbnail.Thumbnail(self, self.parent.preview_dir, self.config.preview_size)
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
    34
        self.thumb = thumbnail.Thumbnail(self, self.parent.thumb_dir, self.config.thumb_size)
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
    35
57
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    36
        # info
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    37
        self.title = self.name
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    38
        self.description = None
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    39
77
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    40
    @lazy_load
115
d5aa320697df rename Image.pil_image -> Image.img, and shave off ~30ms per image by using Image.resize instead of Image.copy/Image.thumbnail
Tero Marttila <terom@fixme.fi>
parents: 111
diff changeset
    41
    def img (self) :
57
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    42
        """
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    43
            Loads the image as a PIL.Image
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    44
        """
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    45
        
77
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    46
        # open it up
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    47
        return PIL.Image.open(self.path)
115
d5aa320697df rename Image.pil_image -> Image.img, and shave off ~30ms per image by using Image.resize instead of Image.copy/Image.thumbnail
Tero Marttila <terom@fixme.fi>
parents: 111
diff changeset
    48
    
d5aa320697df rename Image.pil_image -> Image.img, and shave off ~30ms per image by using Image.resize instead of Image.copy/Image.thumbnail
Tero Marttila <terom@fixme.fi>
parents: 111
diff changeset
    49
    @property
d5aa320697df rename Image.pil_image -> Image.img, and shave off ~30ms per image by using Image.resize instead of Image.copy/Image.thumbnail
Tero Marttila <terom@fixme.fi>
parents: 111
diff changeset
    50
    def img_size (self) :
d5aa320697df rename Image.pil_image -> Image.img, and shave off ~30ms per image by using Image.resize instead of Image.copy/Image.thumbnail
Tero Marttila <terom@fixme.fi>
parents: 111
diff changeset
    51
        """
d5aa320697df rename Image.pil_image -> Image.img, and shave off ~30ms per image by using Image.resize instead of Image.copy/Image.thumbnail
Tero Marttila <terom@fixme.fi>
parents: 111
diff changeset
    52
            Returns the pixel (width, height) resolution tuple of this image.
d5aa320697df rename Image.pil_image -> Image.img, and shave off ~30ms per image by using Image.resize instead of Image.copy/Image.thumbnail
Tero Marttila <terom@fixme.fi>
parents: 111
diff changeset
    53
        """
d5aa320697df rename Image.pil_image -> Image.img, and shave off ~30ms per image by using Image.resize instead of Image.copy/Image.thumbnail
Tero Marttila <terom@fixme.fi>
parents: 111
diff changeset
    54
d5aa320697df rename Image.pil_image -> Image.img, and shave off ~30ms per image by using Image.resize instead of Image.copy/Image.thumbnail
Tero Marttila <terom@fixme.fi>
parents: 111
diff changeset
    55
        return self.img.size
57
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    56
77
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    57
    @lazy_load
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    58
    def exif (self) :
57
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    59
        """
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    60
            Loads the EXIF data for the image and returns as a dict of EXIF tag names -> values.
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    61
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    62
            Returns None if no exif data was found
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    63
        """
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    64
77
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    65
        # load
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    66
        with self.open('rb') as fh :
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    67
            # XXX: details=False?
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    68
            exif = EXIF.process_file(fh)
57
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    69
            
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    70
        # empty dict -> no exif data
77
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    71
        if exif :
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    72
            return exif
57
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    73
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    74
        else :
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    75
            return None
77
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    76
    
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    77
    @lazy_load
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    78
    def metadata (self) :
57
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    79
        """
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    80
            Load and return the metadata for the image as a dictionary
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    81
        """
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    82
77
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    83
        # load stuff
85
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
    84
        stat = self.stat()
57
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    85
77
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    86
        # XXX: avoid having to open the image?
115
d5aa320697df rename Image.pil_image -> Image.img, and shave off ~30ms per image by using Image.resize instead of Image.copy/Image.thumbnail
Tero Marttila <terom@fixme.fi>
parents: 111
diff changeset
    87
        size = self.img_size
77
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    88
        
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    89
        # build
111
ecceaf23c969 make loading exif metadata optional
Tero Marttila <terom@fixme.fi>
parents: 91
diff changeset
    90
        metadata = dict({
77
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    91
            "File name":        self.name,
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    92
            "Resolution":       "%dx%d" % size,
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    93
            "File size":        format.filesize(stat.st_size),
2a53c5ade434 misc. fixes, it runs now, but HTML output is corrupt (no flattening)
Tero Marttila <terom@fixme.fi>
parents: 76
diff changeset
    94
            "Last modified":    format.filetime(stat.st_mtime),
111
ecceaf23c969 make loading exif metadata optional
Tero Marttila <terom@fixme.fi>
parents: 91
diff changeset
    95
        })
ecceaf23c969 make loading exif metadata optional
Tero Marttila <terom@fixme.fi>
parents: 91
diff changeset
    96
        
ecceaf23c969 make loading exif metadata optional
Tero Marttila <terom@fixme.fi>
parents: 91
diff changeset
    97
        # optionally load Exif metadata
118
60b126ff0b74 configuration magic - can now load configuration data from ./degal.cfg, --config, folder/degal.cfg
Tero Marttila <terom@fixme.fi>
parents: 115
diff changeset
    98
        if self.config.with_exif :
111
ecceaf23c969 make loading exif metadata optional
Tero Marttila <terom@fixme.fi>
parents: 91
diff changeset
    99
            exif = self.exif
ecceaf23c969 make loading exif metadata optional
Tero Marttila <terom@fixme.fi>
parents: 91
diff changeset
   100
ecceaf23c969 make loading exif metadata optional
Tero Marttila <terom@fixme.fi>
parents: 91
diff changeset
   101
            # Get the wanted tags
ecceaf23c969 make loading exif metadata optional
Tero Marttila <terom@fixme.fi>
parents: 91
diff changeset
   102
            metadata.update(dict(
ecceaf23c969 make loading exif metadata optional
Tero Marttila <terom@fixme.fi>
parents: 91
diff changeset
   103
                (name, exif[tag]) for tag, name in self.config.exif_tags if exif and tag in exif
ecceaf23c969 make loading exif metadata optional
Tero Marttila <terom@fixme.fi>
parents: 91
diff changeset
   104
            ))
ecceaf23c969 make loading exif metadata optional
Tero Marttila <terom@fixme.fi>
parents: 91
diff changeset
   105
ecceaf23c969 make loading exif metadata optional
Tero Marttila <terom@fixme.fi>
parents: 91
diff changeset
   106
        return metadata
57
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   107
    
85
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
   108
    def stale (self) :
57
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   109
        """
85
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
   110
            Tests if this Image is stale, based on preview/thumb.
57
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   111
        """
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   112
85
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
   113
        return self.preview.stale() or self.thumb.stale()
70
67dd32adf159 remove old Folder, Image code, wrap up both
Tero Marttila <terom@fixme.fi>
parents: 57
diff changeset
   114
    
85
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
   115
    def update (self) :
70
67dd32adf159 remove old Folder, Image code, wrap up both
Tero Marttila <terom@fixme.fi>
parents: 57
diff changeset
   116
        """
85
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
   117
            Updates this Image's thumb/preview
70
67dd32adf159 remove old Folder, Image code, wrap up both
Tero Marttila <terom@fixme.fi>
parents: 57
diff changeset
   118
        """
85
7da934333469 move thumbnail rendering from render.py to thumbnail.py, and implement staleness checking for Images, plus index_images for Folder
Tero Marttila <terom@fixme.fi>
parents: 77
diff changeset
   119
        
91
17ae33501289 change Image.update to unconditionally update the thumb/preview
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
   120
        self.preview.update()
17ae33501289 change Image.update to unconditionally update the thumb/preview
Tero Marttila <terom@fixme.fi>
parents: 85
diff changeset
   121
        self.thumb.update()
57
8d06e0283b88 start implementing new Image stuff, tie in RenderMachine into the new Image class, assoicated config stuff
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   122