Document windows 7 permissions workaround
[tabakrolletjie.git] / tabakrolletjie / loader.py
index 7dad79aa6b00659521db851ce866cfd2895791aa..4ad1d585787be3cc944575c723708056db76eb8b 100644 (file)
@@ -3,18 +3,30 @@
 import json
 import os
 
+import pygame.image
+import pygame.font
+import pygame.display
+import pygame.mixer
+
+from .constants import DEBUG
+from .transforms import NullTransform
+
 
 class Loader(object):
     """ Load data files from beneath a prefix. """
 
+    NULL_TRANSFORM = NullTransform()
+
     def __init__(self, prefix):
         self._prefix = prefix
+        self._cache = {}
 
     def full_path(self, *parts):
         path = "/".join(parts)
         rel_path = os.path.join(*path.split("/"))
         abs_path = os.path.join(self._prefix, rel_path)
-        print abs_path
+        if DEBUG:
+            print abs_path
         return abs_path
 
     def open_file(self, *parts):
@@ -24,6 +36,37 @@ class Loader(object):
         with self.open_file("stations", *parts) as f:
             return json.load(f)
 
+    def load_image(self, *parts, **kwargs):
+        """Return a pygame surface of the requested image."""
+        fn = self.full_path("images", *parts)
+        transform = kwargs.pop("transform", self.NULL_TRANSFORM)
+        img = self._cache.get((fn, transform), None)
+        if img is None:
+            img = pygame.image.load(fn)
+            # We assume pygame.display has been initialised
+            # Fix this if that changes
+            img.convert_alpha(pygame.display.get_surface())
+            img = transform.apply(img)
+            self._cache[(fn, transform)] = img
+        return img
+
+    def load_font(self, *parts, **kwargs):
+        """Return a pygame font of the given size"""
+        size = kwargs.get('size', 12)
+        fn = self.full_path("fonts", *parts)
+        font = pygame.font.Font(fn, size)
+        # Do we need to cache this?
+        return font
+
+    def load_sound(self, *parts):
+        """Return a pygame sound"""
+        fn = self.full_path("sounds", *parts)
+        sound = self._cache.get(fn, None)
+        if not sound:
+            sound = pygame.mixer.Sound(fn)
+            self._cache[fn] = sound
+        return sound
+
 
 _DATA_PREFIX = os.path.abspath(
     os.path.join(os.path.dirname(__file__), "..", "data"))