diff tools/area_editor.py @ 108:dde91f8c4335

Add fonts needed for Albowifying the editor
author Neil Muller <drnlmuller@gmail.com>
date Mon, 02 Sep 2013 13:59:11 +0200
parents 67f8b06a433d
children 817d4a62135c
line wrap: on
line diff
--- a/tools/area_editor.py	Mon Sep 02 14:01:55 2013 +0200
+++ b/tools/area_editor.py	Mon Sep 02 13:59:11 2013 +0200
@@ -17,12 +17,22 @@
 import pygame
 import pygame.locals as pgl
 
+from albow.root import RootWidget
+from albow.widget import Widget
+from albow.controls import Button, Image
+from albow.resource import get_font
+
 sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
 
 from nagslang.constants import SCREEN, FPS
 from nagslang.level import Level, POLY_COLORS
 
 
+# layout constants
+MENU_WIDTH = 200
+MENU_BUTTON_HEIGHT = 35
+
+
 class EditorLevel(Level):
 
     def __init__(self, name, x=800, y=600):
@@ -94,18 +104,24 @@
         surface_area = pygame.rect.Rect(topleft, SCREEN)
         surface.blit(self._surface, (0, 0), surface_area)
 
+class LevelWidget(Widget):
 
-class Editor(object):
-
-    def __init__(self, level, surface):
+    def __init__(self, level):
+        super(LevelWidget, self).__init__(pygame.rect.Rect(0, 0,
+            SCREEN[0], SCREEN[1]))
         self.level = level
-        self.surface = surface
         self.pos = (0, 0)
-        self.cur_poly = None
+        self.filled_mode = False
         self.mouse_pos = None
-        self.filled_mode = False
+        self.cur_poly = None
 
-    def move_view(self, offset):
+    def _level_coordinates(self, pos):
+        # Move positions to level values
+        if not pos:
+            return (0, 0)
+        return pos[0] + self.pos[0], pos[1] + self.pos[1]
+
+    def _move_view(self, offset):
         new_pos = [self.pos[0] + offset[0], self.pos[1] + offset[1]]
         if new_pos[0] < 0:
             new_pos[0] = self.pos[0]
@@ -117,80 +133,87 @@
             new_pos[1] = self.pos[1]
         self.pos = tuple(new_pos)
 
-    def draw(self):
+
+    def draw(self, surface):
         if (self.cur_poly is not None and self.cur_poly in self.level.polygons
                 and len(self.level.polygons[self.cur_poly])):
             # We have an active polygon
             mouse_pos = self._level_coordinates(self.mouse_pos)
         else:
             mouse_pos = None
-        self.level.draw(self.surface, self.pos, mouse_pos,
-                        self.cur_poly, self.filled_mode)
-
-    def _level_coordinates(self, pos):
-        # Move positions to level values
-        if not pos:
-            return (0, 0)
-        return pos[0] + self.pos[0], pos[1] + self.pos[1]
+        level.draw(surface, self.pos, self.mouse_pos, self.cur_poly,
+                self.filled_mode)
 
-    def run(self):
-        pygame.key.set_repeat(100, 50)
-        running = True
-        clock = pygame.time.Clock()
-        while running:
-            for ev in pygame.event.get():
-                if ev.type == pgl.QUIT:
-                    running = False
-                elif ev.type == pgl.KEYDOWN:
-                    if ev.key == pgl.K_ESCAPE:
-                        running = False
-                    elif ev.key == pgl.K_LEFT:
-                        self.move_view((-10, 0))
-                    elif ev.key == pgl.K_RIGHT:
-                        self.move_view((10, 0))
-                    elif ev.key == pgl.K_UP:
-                        self.move_view((0, -10))
-                    elif ev.key == pgl.K_DOWN:
-                        self.move_view((0, 10))
-                    if ev.key == pgl.K_1:
-                        self.cur_poly = 1
-                        self.filled_mode = False
-                    if ev.key == pgl.K_2:
-                        self.cur_poly = 2
-                        self.filled_mode = False
-                    if ev.key == pgl.K_3:
-                        self.cur_poly = 3
-                        self.filled_mode = False
-                    if ev.key == pgl.K_4:
-                        self.cur_poly = 4
-                        self.filled_mode = False
-                    if ev.key == pgl.K_5:
-                        self.cur_poly = 5
-                        self.filled_mode = False
-                    if ev.key == pgl.K_6:
-                        self.cur_poly = 6
-                        self.filled_mode = False
-                    if ev.key == pgl.K_0:
-                        self.cur_poly = None
-                    if ev.key == pgl.K_d and self.cur_poly:
-                        self.level.delete_point(self.cur_poly)
-                    if ev.key == pgl.K_s:
-                        level.save()
-                    if ev.key == pgl.K_f:
-                        if level.all_closed():
-                            self.cur_poly = None
-                            self.filled_mode = True
-                        else:
-                            print 'Not all polygons closed, so not filling'
-                elif ev.type == pgl.MOUSEBUTTONDOWN and self.cur_poly:
-                    # Add a point
-                    self.level.add_point(self.cur_poly,
-                                         self._level_coordinates(ev.pos))
-                elif ev.type == pgl.MOUSEMOTION:
-                    self.mouse_pos = ev.pos
-            self.draw()
-            pygame.display.flip()
-            clock.tick(FPS)
+    def key_down(self, ev):
+        if ev.key == pgl.K_LEFT:
+            self._move_view((-10, 0))
+        elif ev.key == pgl.K_RIGHT:
+            self._move_view((10, 0))
+        elif ev.key == pgl.K_UP:
+            self._move_view((0, -10))
+        elif ev.key == pgl.K_DOWN:
+            self._move_view((0, 10))
+        elif ev.key == pgl.K_1:
+            self.cur_poly = 1
+            self.filled_mode = False
+        elif ev.key == pgl.K_2:
+            self.cur_poly = 2
+            self.filled_mode = False
+        elif ev.key == pgl.K_3:
+            self.cur_poly = 3
+            self.filled_mode = False
+        elif ev.key == pgl.K_4:
+            self.cur_poly = 4
+            self.filled_mode = False
+        elif ev.key == pgl.K_5:
+            self.cur_poly = 5
+            self.filled_mode = False
+        elif ev.key == pgl.K_6:
+            self.cur_poly = 6
+            self.filled_mode = False
+        elif ev.key == pgl.K_0:
+            self.cur_poly = None
+        elif ev.key == pgl.K_d and self.cur_poly:
+            self.level.delete_point(self.cur_poly)
+        elif ev.key == pgl.K_s:
+            level.save()
+        elif ev.key == pgl.K_f:
+            if level.all_closed():
+                self.cur_poly = None
+                self.filled_mode = True
+            else:
+                print 'Not all polygons closed, so not filling'
+
+
+
+class EditorApp(RootWidget):
+
+    def __init__(self, level, surface):
+        super(EditorApp, self).__init__(surface)
+        self.level = level
+        self.level_widget = LevelWidget(self.level)
+        self.add(self.level_widget)
+
+        quit_but = Button('Quit', action=self.quit)
+        quit_but.rect = pygame.rect.Rect(0, 0, MENU_WIDTH, MENU_BUTTON_HEIGHT)
+        quit_but.rect.move_ip(SCREEN[0], 25)
+        self.add(quit_but)
+
+        #        elif ev.type == pgl.MOUSEBUTTONDOWN and self.cur_poly:
+        #            # Add a point
+        #            self.level.add_point(self.cur_poly,
+        #                                 self._level_coordinates(ev.pos))
+        #        elif ev.type == pgl.MOUSEMOTION:
+        #            self.mouse_pos = ev.pos
+        #    self.draw()
+        #    pygame.display.flip()
+        #    clock.tick(FPS)
+
+    def key_down(self, ev):
+        if ev.key == pgl.K_ESCAPE:
+            self.quit()
+        else:
+            self.level_widget.key_down(ev)
 
 
 if __name__ == "__main__":
@@ -204,7 +227,9 @@
         sys.exit()
     pygame.display.init()
     pygame.font.init()
-    pygame.display.set_mode(SCREEN, pgl.SWSURFACE)
+    pygame.display.set_mode((SCREEN[0] + MENU_WIDTH, SCREEN[1]),
+            pgl.SWSURFACE)
     pygame.display.set_caption('Nagslang Area Editor')
-    editor = Editor(level, pygame.display.get_surface())
-    editor.run()
+    pygame.key.set_repeat(200, 100)
+    app = EditorApp(level, pygame.display.get_surface())
+    app.run()