Mercurial > nagslang
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 |
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') |