X-Git-Url: https://git.ctpug.org.za/?a=blobdiff_plain;f=naja%2Fresources%2Floader.py;fp=naja%2Fresources%2Floader.py;h=28a3c7a3fdf0f39cb85918d3f97f0dbb964b69e0;hb=ea0fea7855b70665b1b155f1d20495e88096b73a;hp=0000000000000000000000000000000000000000;hpb=847d271607652c00e62298a37987aae452719b61;p=naja.git diff --git a/naja/resources/loader.py b/naja/resources/loader.py new file mode 100644 index 0000000..28a3c7a --- /dev/null +++ b/naja/resources/loader.py @@ -0,0 +1,101 @@ +import os +import sys + +try: + from pkg_resources import resource_filename +except ImportError: + # OK, we're most likely running under py2exe, so this is safe + # (for values of safe that are unconcerned about py2exe being involved) + def resource_filename(mod, path): + # There are better ways of doing this, but I've spent too much + # time going down this rabbithole already + return os.path.join(os.path.dirname(__file__), '..', '..', 'data', + path) +import pygame + + +class ResourceNotFound(Exception): + pass + + +class Loader(object): + CONVERT_ALPHA = True + + def __init__(self, resource_module, language=None): + self.resource_module = resource_module + self.lang_dialect = language + self.language = language.split('_', 1)[0] if language else None + self._cache = {} + + def create_resource_path(self, *path_fragments): + return resource_filename(self.resource_module, + os.path.join(*path_fragments)) + + def get_resource_path(self, *path_fragments): + for mod, full_path_fragments in self.lang_locations(path_fragments): + path = resource_filename(mod, os.path.join(*full_path_fragments)) + if os.path.exists(path): + return path + raise ResourceNotFound(os.path.join(*path_fragments)) + + def lang_locations(self, path_fragments): + ''' + For each resource module, yield: + * (, (_, )) + * (, (, )) + * (, (, )) + ''' + for module in (self.resource_module,): + if self.lang_dialect: + yield (module, (self.lang_dialect,) + path_fragments) + if self.language != self.lang_dialect: + yield (module, (self.language,) + path_fragments) + yield (module, path_fragments) + + def get_file(self, *path_fragments, **kw): + mode = kw.get('mode', "rU") + try: + path = self.get_resource_path(*path_fragments) + except ResourceNotFound: + if 'w' in mode: + path = self.create_resource_path(*path_fragments) + else: + raise + return file(path, mode) + + def get_image(self, *name_fragments, **kw): + transforms = kw.get('transforms', ()) + basedir = kw.get('basedir', 'images') + + path = (basedir,) + name_fragments + + if path not in self._cache: + fn = self.get_resource_path(*path) + image = pygame.image.load(fn) + if self.CONVERT_ALPHA: + if not pygame.display.get_init(): + print >> sys.stderr, ("Display not initialized, " + "image '%s' not loaded." + % os.path.join(*path)) + return + image = image.convert_alpha(pygame.display.get_surface()) + self._cache[path] = image + + key = (path, transforms) + if key not in self._cache: + image = self._cache[path] + for mutator in transforms: + image = mutator(image) + self._cache[key] = image + + return self._cache[key] + + def get_font(self, file_name, font_size): + basedir = 'fonts' + key = (basedir, file_name, font_size) + + if key not in self._cache: + fn = self.get_resource_path(basedir, file_name) + self._cache[key] = pygame.font.Font(fn, font_size) + + return self._cache[key]