changeset 293:e6a3b00f997b

Ticks on the levelmenu
author Stefano Rivera <stefano@rivera.za.net>
date Fri, 16 Sep 2011 00:07:11 +0200
parents feca52afc109
children f2ba659e03be
files data/menus/tick.png mamba/habitats/levelmenu.py mamba/widgets/imagebutton.py mamba/widgets/levelbutton.py source/svg/menus/tick.svg
diffstat 5 files changed, 163 insertions(+), 61 deletions(-) [+]
line wrap: on
line diff
Binary file data/menus/tick.png has changed
--- a/mamba/habitats/levelmenu.py	Thu Sep 15 23:55:48 2011 +0200
+++ b/mamba/habitats/levelmenu.py	Fri Sep 16 00:07:11 2011 +0200
@@ -5,36 +5,34 @@
 from mamba.gamestate import levels, unlocked_levels, done_levels
 from mamba.constants import ESCAPE_KEYS
 from mamba.engine import Habitat, NewHabitatEvent
-from mamba.widgets.imagebutton import LockableTextButton
+from mamba.widgets.levelbutton import LevelButton
 
 
 class LevelMenu(Habitat):
 
     def __init__(self):
         super(LevelMenu, self).__init__()
-        self.level_buttons = []
+        self.level_buttons = {}
         for level, name in enumerate(levels):
-            button = LockableTextButton((50 + 75 * level, 100), str(level + 1),
-                                        color='white')
+            button = LevelButton((50 + 75 * level, 100), str(level + 1),
+                                 locked=level not in unlocked_levels,
+                                 done=level in done_levels)
             button.add_callback('clicked', self.level_selected, name)
-            button.locked = level not in unlocked_levels
             self.container.add(button)
-            self.level_buttons.append(button)
+            self.level_buttons[name] = button
         self.container.add_callback(KEYDOWN, self.keydown_event)
-        self.update_button_colors()
+        self.update_buttons()
 
-    def update_button_colors(self):
-        for level, button in enumerate(self.level_buttons):
-            if not button.locked and level not in done_levels:
-                button.color = 'green'
-            else:
-                button.color = 'white'
+    def update_buttons(self):
+        for name, button in self.level_buttons.iteritems():
+            button.locked = name not in unlocked_levels
+            button.done = name in done_levels
 
     def level_selected(self, ev, widget, name):
         # Demo:
         if widget.locked:
-            widget.locked = False
-            self.update_button_colors()
+            unlocked_levels.add(name)
+            self.update_buttons()
             return True
 
         if not widget.locked:
--- a/mamba/widgets/imagebutton.py	Thu Sep 15 23:55:48 2011 +0200
+++ b/mamba/widgets/imagebutton.py	Fri Sep 16 00:07:11 2011 +0200
@@ -2,7 +2,6 @@
 from pygame.locals import SRCALPHA
 
 from mamba.constants import COLOR, FONT_SIZE, FOCUS_COLOR
-from mamba.data import load_image
 from mamba.widgets.base import Button
 from mamba.widgets.text import TextWidget
 
@@ -41,48 +40,3 @@
         if self._focussed != self.focussed:
             self.prepare()
         super(ImageButtonWidget, self).draw(surface)
-
-
-class LockableTextButton(Button):
-
-    def __init__(self, rect, text, locked=False, fontsize=FONT_SIZE,
-                 color=COLOR):
-        super(LockableTextButton, self).__init__(rect)
-        self.text = text
-        self.locked = locked
-        self.fontsize = fontsize
-        self.color = color
-        self.focus_color = pygame.Color(FOCUS_COLOR)
-        self.background = 0
-        self.focussable = True
-        self.border = 3
-        self.rect.width = 50
-        self.rect.height = 50
-        self.prepare()
-
-    def prepare(self):
-        self.surface = pygame.Surface(self.rect.size, SRCALPHA)
-        self.surface.fill(0)
-
-        if not isinstance(self.color, pygame.Color):
-            self.color = pygame.Color(self.color)
-
-        self._text = TextWidget((0, 0), self.text, self.fontsize, self.color)
-        self._text.prepare()
-
-        color = self.focus_color if self.focussed else self.color
-        pygame.draw.rect(self.surface, color, self.surface.get_rect(),
-                         self.border)
-        text_rect = pygame.Rect((0, 0), self.rect.size).inflate(
-                self._text.rect.width - self.rect.width,
-                self._text.rect.height - self.rect.height)
-        self.surface.blit(self._text.surface, text_rect)
-        if self.locked:
-            lock = load_image('menus/lock.png')
-            self.surface.blit(lock, lock.get_rect())
-        self._state = (self.locked, self.focussed)
-
-    def draw(self, surface):
-        if self._state != (self.locked, self.focussed):
-            self.prepare()
-        surface.blit(self.surface, self.rect)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mamba/widgets/levelbutton.py	Fri Sep 16 00:07:11 2011 +0200
@@ -0,0 +1,50 @@
+import pygame
+from pygame.locals import SRCALPHA
+
+from mamba.constants import COLOR, FOCUS_COLOR
+from mamba.data import load_image
+from mamba.widgets.base import Button
+from mamba.widgets.text import TextWidget
+
+
+class LevelButton(Button):
+
+    def __init__(self, rect, text, locked=True, done=False):
+        super(LevelButton, self).__init__(rect)
+        self.text = text
+        self.locked = locked
+        self.done = done
+        self.focussable = True
+        self.border = 3
+        self.rect.width = 50
+        self.rect.height = 50
+        self.prepare()
+
+    def prepare(self):
+        self.surface = pygame.Surface(self.rect.size, SRCALPHA)
+        self.surface.fill(0)
+
+        image = None
+        if self.locked:
+            image = load_image('menus/lock.png')
+        elif self.done:
+            image = load_image('menus/tick.png')
+        if image:
+            self.surface.blit(image, image.get_rect())
+
+        self._text = TextWidget((0, 0), self.text, fontsize=24)
+        self._text.prepare()
+
+        color = pygame.Color(FOCUS_COLOR if self.focussed else COLOR)
+        pygame.draw.rect(self.surface, color, self.surface.get_rect(),
+                         self.border)
+        text_rect = pygame.Rect((0, 0), self.rect.size).inflate(
+                self._text.rect.width - self.rect.width,
+                self._text.rect.height - self.rect.height)
+        self.surface.blit(self._text.surface, text_rect)
+        self._state = (self.locked, self.done, self.focussed)
+
+    def draw(self, surface):
+        if self._state != (self.locked, self.done, self.focussed):
+            self.prepare()
+        surface.blit(self.surface, self.rect)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/source/svg/menus/tick.svg	Fri Sep 16 00:07:11 2011 +0200
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="50"
+   height="50"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.1 r9760"
+   sodipodi:docname="tick.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path3776"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.8) translate(12.5,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.6"
+     inkscape:cx="-21.683944"
+     inkscape:cy="46.325811"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:window-width="1893"
+     inkscape:window-height="1078"
+     inkscape:window-x="25"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0">
+    <sodipodi:guide
+       orientation="1,0"
+       position="5,0"
+       id="guide3761" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="45,0"
+       id="guide3763" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="25,0"
+       id="guide3765" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="0,5"
+       id="guide3781" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="0,45"
+       id="guide3801" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1002.3622)">
+    <path
+       style="fill:#00ff00;stroke:#008600;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:none"
+       d="M 5,31.817254 13.637059,45 17.803938,45 C 25,28.888747 33.914341,18.585871 45,5 32.904188,14.865058 22.323606,24.477578 15.909902,39.14086 L 8.2074894,28.407989 z"
+       id="path3003"
+       inkscape:connector-curvature="0"
+       transform="translate(0,1002.3622)"
+       sodipodi:nodetypes="ccccccc" />
+  </g>
+</svg>