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