annotate nagslang/resources.py @ 670:87c6ede3b10b

Beware py2exe's rabbitholes, for they are windy and full of teeth (no-pyflakes for good measure)
author Neil Muller <drnlmuller@gmail.com>
date Sun, 08 Sep 2013 17:53:46 +0200
parents 197a41520ad1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
33
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
1 import os
161
500c5a68607c Skip loading images before the display is initialized (so the level editor can start again)
Stefano Rivera <stefano@rivera.za.net>
parents: 54
diff changeset
2 import sys
33
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
3
670
87c6ede3b10b Beware py2exe's rabbitholes, for they are windy and full of teeth (no-pyflakes for good measure)
Neil Muller <drnlmuller@gmail.com>
parents: 173
diff changeset
4 try:
87c6ede3b10b Beware py2exe's rabbitholes, for they are windy and full of teeth (no-pyflakes for good measure)
Neil Muller <drnlmuller@gmail.com>
parents: 173
diff changeset
5 from pkg_resources import resource_filename
87c6ede3b10b Beware py2exe's rabbitholes, for they are windy and full of teeth (no-pyflakes for good measure)
Neil Muller <drnlmuller@gmail.com>
parents: 173
diff changeset
6 except ImportError:
87c6ede3b10b Beware py2exe's rabbitholes, for they are windy and full of teeth (no-pyflakes for good measure)
Neil Muller <drnlmuller@gmail.com>
parents: 173
diff changeset
7 # OK, we're most likely running under py2exe, so this is safe
87c6ede3b10b Beware py2exe's rabbitholes, for they are windy and full of teeth (no-pyflakes for good measure)
Neil Muller <drnlmuller@gmail.com>
parents: 173
diff changeset
8 # (for values of safe that are unconcerned about py2exe being involved)
87c6ede3b10b Beware py2exe's rabbitholes, for they are windy and full of teeth (no-pyflakes for good measure)
Neil Muller <drnlmuller@gmail.com>
parents: 173
diff changeset
9 def resource_filename(mod, path):
87c6ede3b10b Beware py2exe's rabbitholes, for they are windy and full of teeth (no-pyflakes for good measure)
Neil Muller <drnlmuller@gmail.com>
parents: 173
diff changeset
10 # There are better ways of doing this, but I've spent too much
87c6ede3b10b Beware py2exe's rabbitholes, for they are windy and full of teeth (no-pyflakes for good measure)
Neil Muller <drnlmuller@gmail.com>
parents: 173
diff changeset
11 # time going down this rabbithole already
87c6ede3b10b Beware py2exe's rabbitholes, for they are windy and full of teeth (no-pyflakes for good measure)
Neil Muller <drnlmuller@gmail.com>
parents: 173
diff changeset
12 return os.path.join(os.path.dirname(__file__), '..', 'data', path)
33
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
13 import pygame
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
14
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
15
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
16 class ResourceNotFound(Exception):
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
17 pass
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
18
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
19
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
20 class Resources(object):
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
21 CONVERT_ALPHA = True
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
22
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
23 def __init__(self, resource_module, language=None):
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
24 self.resource_module = resource_module
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
25 self.lang_dialect = language
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
26 self.language = language.split('_', 1)[0] if language else None
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
27 self._cache = {}
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
28
173
197a41520ad1 Tweak resources.get_file to allow creating non-existant files
Neil Muller <drnlmuller@gmail.com>
parents: 161
diff changeset
29 def create_resource_path(self, *path_fragments):
197a41520ad1 Tweak resources.get_file to allow creating non-existant files
Neil Muller <drnlmuller@gmail.com>
parents: 161
diff changeset
30 return resource_filename(self.resource_module,
197a41520ad1 Tweak resources.get_file to allow creating non-existant files
Neil Muller <drnlmuller@gmail.com>
parents: 161
diff changeset
31 os.path.join(*path_fragments))
197a41520ad1 Tweak resources.get_file to allow creating non-existant files
Neil Muller <drnlmuller@gmail.com>
parents: 161
diff changeset
32
33
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
33 def get_resource_path(self, *path_fragments):
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
34 for mod, full_path_fragments in self.lang_locations(path_fragments):
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
35 path = resource_filename(mod, os.path.join(*full_path_fragments))
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
36 if os.path.exists(path):
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
37 return path
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
38 raise ResourceNotFound(os.path.join(*path_fragments))
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
39
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
40 def lang_locations(self, path_fragments):
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
41 '''
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
42 For each resource module, yield:
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
43 * (<module>, (<lang>_<dialect>, <path>))
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
44 * (<module>, (<lang>, <path>))
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
45 * (<module>, (<path>, ))
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
46 '''
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
47 for module in (self.resource_module,):
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
48 if self.lang_dialect:
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
49 yield (module, (self.lang_dialect,) + path_fragments)
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
50 if self.language != self.lang_dialect:
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
51 yield (module, (self.language,) + path_fragments)
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
52 yield (module, path_fragments)
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
53
54
2c1b85b6f457 Add .get_file() to resources.
Simon Cross <hodgestar@gmail.com>
parents: 39
diff changeset
54 def get_file(self, *path_fragments, **kw):
2c1b85b6f457 Add .get_file() to resources.
Simon Cross <hodgestar@gmail.com>
parents: 39
diff changeset
55 mode = kw.get('mode', "rU")
173
197a41520ad1 Tweak resources.get_file to allow creating non-existant files
Neil Muller <drnlmuller@gmail.com>
parents: 161
diff changeset
56 try:
197a41520ad1 Tweak resources.get_file to allow creating non-existant files
Neil Muller <drnlmuller@gmail.com>
parents: 161
diff changeset
57 path = self.get_resource_path(*path_fragments)
197a41520ad1 Tweak resources.get_file to allow creating non-existant files
Neil Muller <drnlmuller@gmail.com>
parents: 161
diff changeset
58 except ResourceNotFound:
197a41520ad1 Tweak resources.get_file to allow creating non-existant files
Neil Muller <drnlmuller@gmail.com>
parents: 161
diff changeset
59 if 'w' in mode:
197a41520ad1 Tweak resources.get_file to allow creating non-existant files
Neil Muller <drnlmuller@gmail.com>
parents: 161
diff changeset
60 path = self.create_resource_path(*path_fragments)
197a41520ad1 Tweak resources.get_file to allow creating non-existant files
Neil Muller <drnlmuller@gmail.com>
parents: 161
diff changeset
61 else:
197a41520ad1 Tweak resources.get_file to allow creating non-existant files
Neil Muller <drnlmuller@gmail.com>
parents: 161
diff changeset
62 raise
54
2c1b85b6f457 Add .get_file() to resources.
Simon Cross <hodgestar@gmail.com>
parents: 39
diff changeset
63 return file(path, mode)
2c1b85b6f457 Add .get_file() to resources.
Simon Cross <hodgestar@gmail.com>
parents: 39
diff changeset
64
33
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
65 def get_image(self, *name_fragments, **kw):
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
66 transforms = kw.get('transforms', ())
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
67 basedir = kw.get('basedir', 'images')
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
68
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
69 path = (basedir,) + name_fragments
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
70
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
71 if path not in self._cache:
39
0e7bb6eb7c0a Don't prefix the basedir twice
Stefano Rivera <stefano@rivera.za.net>
parents: 33
diff changeset
72 fn = self.get_resource_path(*path)
33
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
73 image = pygame.image.load(fn)
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
74 if self.CONVERT_ALPHA:
161
500c5a68607c Skip loading images before the display is initialized (so the level editor can start again)
Stefano Rivera <stefano@rivera.za.net>
parents: 54
diff changeset
75 if not pygame.display.get_init():
500c5a68607c Skip loading images before the display is initialized (so the level editor can start again)
Stefano Rivera <stefano@rivera.za.net>
parents: 54
diff changeset
76 print >> sys.stderr, ("Display not initialized, "
500c5a68607c Skip loading images before the display is initialized (so the level editor can start again)
Stefano Rivera <stefano@rivera.za.net>
parents: 54
diff changeset
77 "image '%s' not loaded."
500c5a68607c Skip loading images before the display is initialized (so the level editor can start again)
Stefano Rivera <stefano@rivera.za.net>
parents: 54
diff changeset
78 % os.path.join(*path))
500c5a68607c Skip loading images before the display is initialized (so the level editor can start again)
Stefano Rivera <stefano@rivera.za.net>
parents: 54
diff changeset
79 return
33
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
80 image = image.convert_alpha(pygame.display.get_surface())
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
81 self._cache[path] = image
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
82
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
83 key = (path, transforms)
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
84 if key not in self._cache:
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
85 image = self._cache[path]
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
86 for mutator in transforms:
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
87 image = mutator(image)
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
88 self._cache[key] = image
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
89
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
90 return self._cache[key]
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
91
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
92 def get_font(self, file_name, font_size):
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
93 basedir = 'fonts'
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
94 key = (basedir, file_name, font_size)
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
95
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
96 if key not in self._cache:
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
97 fn = self.get_resource_path(basedir, file_name)
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
98 self._cache[key] = pygame.font.Font(fn, font_size)
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
99
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
100 return self._cache[key]
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
101
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
102
d9b65cf72db4 Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
103 resources = Resources('data')