double-arrow selector
[naja.git] / naja / widgets / selector.py
index c0c91b96e8ec584fbc76e437c5605d70dd11a568..06e63e5f24ae73f2f169335d403bb4282621f728 100644 (file)
@@ -1,35 +1,52 @@
 import pygame.locals as pgl
 
+from naja.constants import KEYS
 from naja.widgets.base import Container
 from naja.resources import resources
-from naja.resources.mutators import R270
+from naja.resources.mutators import EIGHT_BIT, R270, R90
+from naja.sound import sound
 
 
 class SelectorWidget(Container):
     def __init__(self, *args, **kwargs):
         super(SelectorWidget, self).__init__(*args, **kwargs)
         self.position = 0
-        self.selector = resources.get_image('bits', 'arrow_on.png',
-                                            transforms=(R270,))
+        self.left_selector = resources.get_image('bits', 'arrow_on.png',
+                                                 transforms=(R270, EIGHT_BIT))
+        self.right_selector = resources.get_image('bits', 'arrow_on.png',
+                                                  transforms=(R90, EIGHT_BIT))
 
     def render(self, surface):
         super(SelectorWidget, self).render(surface)
-        pos = self.selector.get_rect()
+        pos = self.left_selector.get_rect()
         selected = self.widgets[self.position]
+        if not selected.is_selectable():
+            selected = self.change_pos(1)
+
         pos = pos.move(selected.pos)
-        pos = pos.move(-pos.width * 1.5, (selected.size[1] - pos.height) / 2)
-        surface.blit(self.selector, pos)
+        left_pos = pos.move(-pos.width * 1.5,
+                            (selected.size[1] - pos.height) / 2)
+        right_pos = pos.move(selected.size[0] + pos.width * 0.5,
+                            (selected.size[1] - pos.height) / 2)
+        surface.blit(self.left_selector, left_pos)
+        surface.blit(self.right_selector, right_pos)
+
+    def change_pos(self, change):
+        self.position = (self.position + change) % len(self.widgets)
+        while not self.widgets[self.position].is_selectable():
+            self.position = (self.position + change) % len(self.widgets)
+        return self.widgets[self.position]
 
     def handle_event(self, ev):
         if ev.type == pgl.KEYDOWN:
-            if ev.key in (pgl.K_DOWN, pgl.K_UP):
-                if ev.key == pgl.K_DOWN:
-                    self.position += 1
+            if ev.key in KEYS.UP + KEYS.DOWN:
+                if ev.key in KEYS.DOWN:
+                    self.change_pos(1)
                 else:
-                    self.position -= 1
-                self.position %= len(self.widgets)
+                    self.change_pos(-1)
+                sound.play_sound('zoop.ogg', volume=0.05)
                 return True
-            elif ev.key == pgl.K_RETURN:
+            elif ev.key in KEYS.SELECT:
                 return self.widgets[self.position].callback('click')
 
         return super(SelectorWidget, self).handle_event(ev)