changeset 413:c5a3ed165df9

Partial zoom support
author Neil Muller <drnlmuller@gmail.com>
date Sat, 07 Sep 2013 12:43:31 +0200
parents 23e751f26f81
children 060420389033
files tools/area_editor.py
diffstat 1 files changed, 37 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/tools/area_editor.py	Sat Sep 07 12:41:16 2013 +0200
+++ b/tools/area_editor.py	Sat Sep 07 12:43:31 2013 +0200
@@ -455,12 +455,15 @@
         self._parent = parent
         self._move_point_mode = False
         self._move_point = False
+        self._zoom_factor = 1.0
 
     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]
+        # Apply zoom_factor
+        zoomed = (pos[0] * self._zoom_factor, pos[1] * self._zoom_factor)
+        return zoomed[0] + self.pos[0], zoomed[1] + self.pos[1]
 
     def _move_view(self, offset):
         new_pos = [self.pos[0] + offset[0], self.pos[1] + offset[1]]
@@ -484,6 +487,16 @@
             self._draw_enemies = value
             self.invalidate()
 
+    def zoom_out(self):
+        self._zoom_factor = self._zoom_factor * 2.0
+        if self._zoom_factor > 8:
+            self._zoom_factor = 8
+
+    def zoom_in(self):
+        self._zoom_factor = self._zoom_factor // 2.0
+        if self._zoom_factor < 1:
+            self._zoom_factor = 1
+
     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])):
@@ -508,7 +521,12 @@
                 if isinstance(thing, ne.Enemy):
                     thing.render(level_surface)
         surface_area = pygame.rect.Rect(self.pos, SCREEN)
-        surface.blit(level_surface, (0, 0), surface_area)
+        zoomed_surface = level_surface.copy()
+        zoomed_surface = pygame.transform.scale(
+            level_surface,
+            (int(level_surface.get_width() / self._zoom_factor),
+             int(level_surface.get_height() / self._zoom_factor)))
+        surface.blit(zoomed_surface, (0, 0), surface_area)
 
     def change_poly(self, new_poly):
         self.cur_poly = new_poly
@@ -594,10 +612,6 @@
             else:
                 # find the current point
                 self._move_point = self.level.find_vertex(corrected_pos)
-        elif self.cur_poly and ev.button == 1:
-            # Add a point
-            self.level.add_point(self.cur_poly,
-                                 self._level_coordinates(corrected_pos))
         elif ev.button == 1:
             if self._draw_lines:
                 if self._start_pos is None:
@@ -617,6 +631,10 @@
             self._move_view((-10, 0))
         elif ev.button == 7:  # Scroll right
             self._move_view((10, 0))
+        elif self.cur_poly and ev.button == 1:
+            # Add a point
+            self.level.add_point(self.cur_poly,
+                                 self._level_coordinates(ev.pos))
         elif ev.button == 3:
             self._mouse_drag = True
 
@@ -833,6 +851,8 @@
         self._menu_mode = 'drawing'
         self._populate_menu()
 
+        self._zoom = 1
+
     def _make_draw_menu(self):
         widgets = []
 
@@ -918,6 +938,17 @@
         widgets.append(save_but)
         y += MENU_BUTTON_HEIGHT + MENU_PAD
 
+        zoom_out = Button('Zoom out', action=self.level_widget.zoom_out)
+        zoom_out.rect = BUTTON_RECT.copy()
+        zoom_out.rect.move_ip(MENU_LEFT, y)
+        widgets.append(zoom_out)
+        y += MENU_BUTTON_HEIGHT + MENU_PAD
+
+        zoom_in = Button('Zoom in', action=self.level_widget.zoom_in)
+        zoom_in.rect = BUTTON_RECT.copy()
+        zoom_in.rect.move_ip(MENU_LEFT, y)
+        widgets.append(zoom_in)
+
         y = SCREEN[1] - MENU_BUTTON_HEIGHT - MENU_PAD
         quit_but = Button('Quit', action=self.quit)
         quit_but.rect = BUTTON_RECT.copy()