# HG changeset patch # User Simon Cross # Date 1378561189 -7200 # Node ID 0f8945232e54ecf4bd623c55eb775e50b1317b9c # Parent 79ba44e04b576aacae0d3ae3d93e5c52e8f013ad Move whole polygons. diff -r 79ba44e04b57 -r 0f8945232e54 tools/area_editor.py --- 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':