Mercurial > nagslang
annotate nagslang/resources.py @ 173:197a41520ad1
Tweak resources.get_file to allow creating non-existant files
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Tue, 03 Sep 2013 16:07:56 +0200 |
parents | 500c5a68607c |
children | 87c6ede3b10b |
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 |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
4 from pkg_resources import resource_filename |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
5 import pygame |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
6 |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
7 |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
8 class ResourceNotFound(Exception): |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
9 pass |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
10 |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
11 |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
12 class Resources(object): |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
13 CONVERT_ALPHA = True |
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 def __init__(self, resource_module, language=None): |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
16 self.resource_module = resource_module |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
17 self.lang_dialect = language |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
18 self.language = language.split('_', 1)[0] if language else None |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
19 self._cache = {} |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
20 |
173
197a41520ad1
Tweak resources.get_file to allow creating non-existant files
Neil Muller <drnlmuller@gmail.com>
parents:
161
diff
changeset
|
21 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
|
22 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
|
23 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
|
24 |
33
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
25 def get_resource_path(self, *path_fragments): |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
26 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
|
27 path = resource_filename(mod, os.path.join(*full_path_fragments)) |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
28 if os.path.exists(path): |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
29 return path |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
30 raise ResourceNotFound(os.path.join(*path_fragments)) |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
31 |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
32 def lang_locations(self, path_fragments): |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
33 ''' |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
34 For each resource module, yield: |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
35 * (<module>, (<lang>_<dialect>, <path>)) |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
36 * (<module>, (<lang>, <path>)) |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
37 * (<module>, (<path>, )) |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
38 ''' |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
39 for module in (self.resource_module,): |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
40 if self.lang_dialect: |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
41 yield (module, (self.lang_dialect,) + path_fragments) |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
42 if self.language != self.lang_dialect: |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
43 yield (module, (self.language,) + path_fragments) |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
44 yield (module, path_fragments) |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
45 |
54
2c1b85b6f457
Add .get_file() to resources.
Simon Cross <hodgestar@gmail.com>
parents:
39
diff
changeset
|
46 def get_file(self, *path_fragments, **kw): |
2c1b85b6f457
Add .get_file() to resources.
Simon Cross <hodgestar@gmail.com>
parents:
39
diff
changeset
|
47 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
|
48 try: |
197a41520ad1
Tweak resources.get_file to allow creating non-existant files
Neil Muller <drnlmuller@gmail.com>
parents:
161
diff
changeset
|
49 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
|
50 except ResourceNotFound: |
197a41520ad1
Tweak resources.get_file to allow creating non-existant files
Neil Muller <drnlmuller@gmail.com>
parents:
161
diff
changeset
|
51 if 'w' in mode: |
197a41520ad1
Tweak resources.get_file to allow creating non-existant files
Neil Muller <drnlmuller@gmail.com>
parents:
161
diff
changeset
|
52 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
|
53 else: |
197a41520ad1
Tweak resources.get_file to allow creating non-existant files
Neil Muller <drnlmuller@gmail.com>
parents:
161
diff
changeset
|
54 raise |
54
2c1b85b6f457
Add .get_file() to resources.
Simon Cross <hodgestar@gmail.com>
parents:
39
diff
changeset
|
55 return file(path, mode) |
2c1b85b6f457
Add .get_file() to resources.
Simon Cross <hodgestar@gmail.com>
parents:
39
diff
changeset
|
56 |
33
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
57 def get_image(self, *name_fragments, **kw): |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
58 transforms = kw.get('transforms', ()) |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
59 basedir = kw.get('basedir', 'images') |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
60 |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
61 path = (basedir,) + name_fragments |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
62 |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
63 if path not in self._cache: |
39
0e7bb6eb7c0a
Don't prefix the basedir twice
Stefano Rivera <stefano@rivera.za.net>
parents:
33
diff
changeset
|
64 fn = self.get_resource_path(*path) |
33
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
65 image = pygame.image.load(fn) |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
66 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
|
67 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
|
68 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
|
69 "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
|
70 % 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
|
71 return |
33
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
72 image = image.convert_alpha(pygame.display.get_surface()) |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
73 self._cache[path] = image |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
74 |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
75 key = (path, transforms) |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
76 if key not in self._cache: |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
77 image = self._cache[path] |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
78 for mutator in transforms: |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
79 image = mutator(image) |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
80 self._cache[key] = image |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
81 |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
82 return self._cache[key] |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
83 |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
84 def get_font(self, file_name, font_size): |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
85 basedir = 'fonts' |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
86 key = (basedir, file_name, font_size) |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
87 |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
88 if key not in self._cache: |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
89 fn = self.get_resource_path(basedir, file_name) |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
90 self._cache[key] = pygame.font.Font(fn, font_size) |
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 return self._cache[key] |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
93 |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
94 |
d9b65cf72db4
Prettier resource loading module
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
95 resources = Resources('data') |