Ejemplo n.º 1
0
    def mouseReleaseEvent(self, ev: QMouseEvent):
        '''
        Mouse release event

        Parameters
        ----------
        ev : QMouseEvent
        '''
        # End of tab moving, emit signal
        if self.d.is_dragging_state(DragState.tab) and self.d.dock_area:
            self.moved.emit(ev.globalPos())

        self.d.drag_start_mouse_position = QPoint()
        self.d.drag_state = DragState.inactive
        super().mouseReleaseEvent(ev)
Ejemplo n.º 2
0
    def mouseMoveEvent(self, event: QMouseEvent) -> None:
        """Move mouse.

        + Middle button: Translate canvas view.
        + Left button: Free move mode / Rectangular selection.
        """
        x, y = self.__mouse_pos(event)
        if self.selector.middle_dragged:
            self.ox = event.x() - self.selector.x * self.zoom
            self.oy = event.y() + self.selector.y * self.zoom
            self.update()
        elif self.selector.left_dragged:
            if self.free_move == FreeMode.NO_FREE_MOVE:
                if self.show_target_path:
                    self.set_target_point.emit(x, y)
                else:
                    # Rectangular selection
                    self.selector.picking = True
                    self.selector.sx = self.__snap(x, is_zoom=False)
                    self.selector.sy = self.__snap(y, is_zoom=False)
                    self.__select_func(rect=True)
                    selection = self.selector.current_selection()
                    if selection:
                        self.selected.emit(selection, False)
                    else:
                        self.no_selected.emit()
                    self.selected_tips.emit(
                        event.globalPos(),
                        f"({self.selector.x:.02f}, {self.selector.y:.02f})\n"
                        f"({self.selector.sx:.02f}, {self.selector.sy:.02f})\n"
                        f"{len(selection)} {_selection_unit[self.select_mode]}(s)"
                    )
            elif self.select_mode == SelectMode.JOINT:
                if self.free_move == FreeMode.TRANSLATE:
                    # Free move translate function.
                    mouse_x = self.__snap(x - self.selector.x, is_zoom=False)
                    mouse_y = self.__snap(y - self.selector.y, is_zoom=False)
                    self.selected_tips.emit(
                        event.globalPos(), f"{mouse_x:+.02f}, {mouse_y:+.02f}")
                    for num in self.selections:
                        vpoint = self.vpoints[num]
                        vpoint.move((mouse_x + vpoint.x, mouse_y + vpoint.y))
                elif self.free_move == FreeMode.ROTATE:
                    # Free move rotate function.
                    alpha = atan2(y, x) - atan2(self.selector.y,
                                                self.selector.x)
                    self.selected_tips.emit(event.globalPos(),
                                            f"{degrees(alpha):+.02f}°")
                    for num in self.selections:
                        vpoint = self.vpoints[num]
                        r = hypot(vpoint.x, vpoint.y)
                        beta = atan2(vpoint.y, vpoint.x)
                        vpoint.move(
                            (r * cos(beta + alpha), r * sin(beta + alpha)))
                        if vpoint.type in {VJoint.P, VJoint.RP}:
                            vpoint.rotate(self.vangles[num] +
                                          degrees(beta + alpha))
                elif self.free_move == FreeMode.REFLECT:
                    # Free move reflect function.
                    fx = 1 if x > 0 else -1
                    fy = 1 if y > 0 else -1
                    self.selected_tips.emit(event.globalPos(),
                                            f"{fx:+d}, {fy:+d}")
                    for num in self.selections:
                        vpoint = self.vpoints[num]
                        if vpoint.type == VJoint.R:
                            vpoint.move((vpoint.x * fx, vpoint.y * fy))
                        else:
                            vpoint.move((vpoint.x * fx, vpoint.y * fy))
                            if (x > 0) != (y > 0):
                                vpoint.rotate(180 - self.vangles[num])
                if self.free_move != FreeMode.NO_FREE_MOVE and self.selections:
                    self.update_preview_path()
            self.update()
        self.tracking.emit(x, y)