changeset 458:0f8945232e54

Move whole polygons.
author Simon Cross <hodgestar@gmail.com>
date Sat, 07 Sep 2013 15:39:49 +0200
parents 79ba44e04b57
children 41ebc538109c
files tools/area_editor.py
diffstat 1 files changed, 64 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/tools/area_editor.py	Sat Sep 07 14:48:53 2013 +0200
+++ b/tools/area_editor.py	Sat Sep 07 15:39:49 2013 +0200
@@ -126,7 +126,7 @@
         self.lines.append([startpoint, endpoint])
 
     def draw(self, mouse_pos, mouse_poly, filled, draw_cand_line, start_pos,
-             move_point_mode, move_point, zoom_factor):
+             move_point_mode, move_poly_mode, move_point, zoom_factor):
         self._draw_background(True)
         # Draw polygons as needed for the editor
         line_width = int(2 * zoom_factor)
@@ -134,13 +134,19 @@
             self._draw_exterior(True)
         for index, polygon in self.polygons.items():
             color = POLY_COLORS.get(index, pygame.color.THECOLORS['black'])
-            if move_point_mode and index == self._move_poly:
+            if move_point_mode and index == self._move_poly and move_point:
                 pointlist = [p for p in polygon]
                 pointlist = [self.point_to_pygame(p) if p != move_point else
                              mouse_pos for p in pointlist]
                 pygame.draw.lines(self._surface, color, False, pointlist,
                                   line_width)
                 break
+            if move_poly_mode and index == self._move_poly and move_point:
+                pointlist = [p for p in self.translate_poly(
+                             polygon, move_point, mouse_pos)]
+                pygame.draw.lines(self._surface, color, False, pointlist,
+                                  line_width)
+                break
             if len(polygon) > 1:
                 pointlist = [self.point_to_pygame(p) for p in polygon]
                 pygame.draw.lines(self._surface, color, False, pointlist,
@@ -239,6 +245,20 @@
                     self._move_poly = None
         return move_point
 
+    def translate_poly(self, poly, move_point, mouse_point):
+        print "Translate!"
+        dx = mouse_point[0] - move_point[0]
+        dy = mouse_point[1] - move_point[1]
+        new_poly = [(p[0] + dx, p[1] + dy) for p in poly]
+        return new_poly
+
+    def replace_poly(self, old_point, new_point):
+        print "Replace!", self._move_poly
+        new_point = self.point_to_pymunk(new_point)
+        if self._move_poly:
+            self.polygons[self._move_poly] = self.translate_poly(
+                self.polygons[self._move_poly], old_point, new_point)
+
     def replace_vertex(self, old_point, new_point):
         new_point = self.point_to_pymunk(new_point)
         if self._move_poly:
@@ -417,6 +437,7 @@
         self._start_pos = None
         self._parent = parent
         self._move_point_mode = False
+        self._move_poly_mode = False
         self._move_point = False
         self._zoom_factor = 1.0
 
@@ -480,14 +501,15 @@
             # Interior wall mode
             mouse_pos = self._level_coordinates(self.mouse_pos)
             mouse_pos = self.snap_to_grid(mouse_pos)
-        elif self._move_point_mode:
+        elif self._move_point_mode or self._move_poly_mode:
             mouse_pos = self._level_coordinates(self.mouse_pos)
             mouse_pos = self.snap_to_grid(mouse_pos)
         else:
             mouse_pos = None
         level_surface = level.draw(mouse_pos, self.cur_poly, self.filled_mode,
                                    self._draw_lines, self._start_pos,
-                                   self._move_point_mode, self._move_point,
+                                   self._move_point_mode, self._move_poly_mode,
+                                   self._move_point,
                                    self._zoom_factor)
         if self._draw_objects:
             for thing in self.level.drawables:
@@ -520,6 +542,7 @@
         self.filled_mode = False
         self._start_pos = None
         self._move_point_mode = False
+        self._move_poly_mode = False
 
     def key_down(self, ev):
         if ev.key == pgl.K_LEFT:
@@ -541,9 +564,18 @@
         elif ev.key == pgl.K_c:
             self.close_poly()
 
+    def set_move_poly_mode(self):
+        self._draw_lines = False
+        self._move_point_mode = False
+        self._move_poly_mode = True
+        self.filled_mode = False
+        self._parent.reset_lit_buttons()
+        self._move_point = None
+
     def set_move_mode(self):
         self._draw_lines = False
         self._move_point_mode = True
+        self._move_poly_mode = False
         self.filled_mode = False
         self._parent.reset_lit_buttons()
         self._move_point = None
@@ -556,6 +588,7 @@
             self.filled_mode = True
             self._draw_lines = False
             self._move_point_mode = False
+            self._move_poly_mode = False
         else:
             alert('Not all polygons closed, so not filling')
 
@@ -563,7 +596,8 @@
         old_pos = self.mouse_pos
         self.mouse_pos = ev.pos
         if old_pos != self.mouse_pos and (self.cur_poly or self._draw_lines
-                                          or self._move_point_mode):
+                                          or self._move_point_mode
+                                          or self._move_poly_mode):
             self.invalidate()
 
     def mouse_drag(self, ev):
@@ -578,10 +612,21 @@
     def mouse_down(self, ev):
         corrected_pos = self._level_coordinates(ev.pos)
         snapped_pos = self.snap_to_grid(corrected_pos)
+        print self._move_poly_mode, ev.button, self._move_point
         if self.sel_mode and ev.button == 1:
             obj = self.level.find_obj_at_pos(corrected_pos)
             if obj is not None:
                 self._edit_selected(obj)
+        elif self._move_poly_mode and ev.button == 1:
+            if self._move_point:
+                # Place the current point
+                self.level.replace_poly(self._move_point, snapped_pos)
+                self._move_point = None
+                self.invalidate()
+            else:
+                # find the current point
+                self._move_point = self.level.find_vertex(snapped_pos)
+                print "NEW MOV:", self._move_point
         elif self._move_point_mode and ev.button == 1:
             if self._move_point:
                 # Place the current point
@@ -888,12 +933,20 @@
         widgets.append(end_poly_but)
         y += MENU_BUTTON_HEIGHT + MENU_PAD
 
-        self.move_point_but = HighLightButton("Move Point", self,
+        self.move_point_but = HighLightButton("Mv Point", self,
                                               action=self.move_point)
-        self.move_point_but.rect = BUTTON_RECT.copy()
+        self.move_point_but.rect = HALF_BUTTON_RECT.copy()
         self.move_point_but.rect.move_ip(MENU_LEFT, y)
         widgets.append(self.move_point_but)
         self._light_buttons.append(self.move_point_but)
+
+        self.move_poly_but = HighLightButton("Mv Poly", self,
+                                             action=self.move_poly)
+        self.move_poly_but.rect = HALF_BUTTON_RECT.copy()
+        self.move_poly_but.rect.move_ip(MENU_LEFT + MENU_HALF_WIDTH, y)
+        widgets.append(self.move_poly_but)
+        self._light_buttons.append(self.move_poly_but)
+
         y += MENU_BUTTON_HEIGHT + MENU_PAD
 
         # grid size widgets
@@ -1133,6 +1186,10 @@
         self.level_widget.set_move_mode()
         self.move_point_but.highlight()
 
+    def move_poly(self):
+        self.level_widget.set_move_poly_mode()
+        self.move_poly_but.highlight()
+
     def draw(self, surface):
         # Update checkbox state
         if self._menu_mode == 'drawing':