source: nagslang/resources.py @ 401:f7ee43c0e5c9

Last change on this file since 401:f7ee43c0e5c9 was 173:197a41520ad1, checked in by Neil Muller <drnlmuller@…>, 7 years ago

Tweak resources.get_file to allow creating non-existant files

File size: 3.1 KB
Line 
1import os
2import sys
3
4from pkg_resources import resource_filename
5import pygame
6
7
8class ResourceNotFound(Exception):
9    pass
10
11
12class Resources(object):
13    CONVERT_ALPHA = True
14
15    def __init__(self, resource_module, language=None):
16        self.resource_module = resource_module
17        self.lang_dialect = language
18        self.language = language.split('_', 1)[0] if language else None
19        self._cache = {}
20
21    def create_resource_path(self, *path_fragments):
22        return resource_filename(self.resource_module,
23                                 os.path.join(*path_fragments))
24
25    def get_resource_path(self, *path_fragments):
26        for mod, full_path_fragments in self.lang_locations(path_fragments):
27            path = resource_filename(mod, os.path.join(*full_path_fragments))
28            if os.path.exists(path):
29                return path
30        raise ResourceNotFound(os.path.join(*path_fragments))
31
32    def lang_locations(self, path_fragments):
33        '''
34        For each resource module, yield:
35        * (<module>, (<lang>_<dialect>, <path>))
36        * (<module>, (<lang>, <path>))
37        * (<module>, (<path>, ))
38        '''
39        for module in (self.resource_module,):
40            if self.lang_dialect:
41                yield (module, (self.lang_dialect,) + path_fragments)
42            if self.language != self.lang_dialect:
43                yield (module, (self.language,) + path_fragments)
44            yield (module, path_fragments)
45
46    def get_file(self, *path_fragments, **kw):
47        mode = kw.get('mode', "rU")
48        try:
49            path = self.get_resource_path(*path_fragments)
50        except ResourceNotFound:
51            if 'w' in mode:
52                path = self.create_resource_path(*path_fragments)
53            else:
54                raise
55        return file(path, mode)
56
57    def get_image(self, *name_fragments, **kw):
58        transforms = kw.get('transforms', ())
59        basedir = kw.get('basedir', 'images')
60
61        path = (basedir,) + name_fragments
62
63        if path not in self._cache:
64            fn = self.get_resource_path(*path)
65            image = pygame.image.load(fn)
66            if self.CONVERT_ALPHA:
67                if not pygame.display.get_init():
68                    print >> sys.stderr, ("Display not initialized, "
69                                          "image '%s' not loaded."
70                                          % os.path.join(*path))
71                    return
72                image = image.convert_alpha(pygame.display.get_surface())
73            self._cache[path] = image
74
75        key = (path, transforms)
76        if key not in self._cache:
77            image = self._cache[path]
78            for mutator in transforms:
79                image = mutator(image)
80            self._cache[key] = image
81
82        return self._cache[key]
83
84    def get_font(self, file_name, font_size):
85        basedir = 'fonts'
86        key = (basedir, file_name, font_size)
87
88        if key not in self._cache:
89            fn = self.get_resource_path(basedir, file_name)
90            self._cache[key] = pygame.font.Font(fn, font_size)
91
92        return self._cache[key]
93
94
95resources = Resources('data')
Note: See TracBrowser for help on using the repository browser.