Commit c678b513 authored by dmMaze's avatar dmMaze
Browse files

simplify textitems' events

parent 96e441d4
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -147,7 +147,7 @@ class Canvas(QGraphicsScene):
        self.imgLayer.setParentItem(self.baseLayer)
        self.maskLayer.setParentItem(self.baseLayer)
        self.drawingLayer.setParentItem(self.baseLayer)
        self.addItem(self.txtblkShapeControl)
        self.txtblkShapeControl.setParentItem(self.inpaintLayer)

        self.scalefactor_changed.connect(self.onScaleFactorChanged)
        self.selectionChanged.connect(self.on_selection_changed)     
@@ -210,6 +210,7 @@ class Canvas(QGraphicsScene):
        self.old_size = sbr.size()
        self.scale_factor = s_f
        self.baseLayer.setScale(self.scale_factor)
        self.txtblkShapeControl.updateScale(self.scale_factor)

        self.adjustScrollBar(self.gv.horizontalScrollBar(), factor)
        self.adjustScrollBar(self.gv.verticalScrollBar(), factor)
@@ -258,6 +259,7 @@ class Canvas(QGraphicsScene):
        item.setParentItem(self.drawingLayer)

    def startCreateTextblock(self, pos: QPointF, hide_control: bool = False):
        pos = pos / self.scale_factor
        self.creating_textblock = True
        self.create_block_origin = pos
        self.gv.setCursor(Qt.CursorShape.CrossCursor)
@@ -281,7 +283,7 @@ class Canvas(QGraphicsScene):

    def mouseMoveEvent(self, event: QGraphicsSceneMouseEvent) -> None:
        if self.creating_textblock:
            self.txtblkShapeControl.setRect(QRectF(self.create_block_origin, event.scenePos()).normalized())
            self.txtblkShapeControl.setRect(QRectF(self.create_block_origin, event.scenePos() / self.scale_factor).normalized())
        elif self.stroke_path_item is not None:
            self.stroke_path_item.addNewPoint(self.imgLayer.mapFromScene(event.scenePos()))
        elif self.scale_tool_mode:
+1 −1
Original line number Diff line number Diff line
@@ -653,7 +653,7 @@ class DrawingPanel(Widget):
            im_h, im_w = img.shape[:2]

            xyxy = [rect.x(), rect.y(), rect.x() + rect.width(), rect.y() + rect.height()]
            xyxy = np.array(xyxy) / self.canvas.scale_factor
            xyxy = np.array(xyxy)
            xyxy[[0, 2]] = np.clip(xyxy[[0, 2]], 0, im_w - 1)
            xyxy[[1, 3]] = np.clip(xyxy[[1, 3]], 0, im_h - 1)
            x1, y1, x2, y2 = xyxy.astype(np.int64)
+1 −2
Original line number Diff line number Diff line
@@ -410,8 +410,7 @@ class MainWindow(QMainWindow):
    def save_proj(self):
        if self.leftBar.imgTransChecker.isChecked()\
            and self.imgtrans_proj.directory is not None:
            self.st_manager.updateTextBlkList()
            self.saveCurrentPage()
            self.saveCurrentPage(update_scene_text=True)

    def saveCurrentPage(self, update_scene_text=True, save_proj=True):
        if update_scene_text:
+3 −13
Original line number Diff line number Diff line
@@ -86,7 +86,6 @@ class ReshapeItemCommand(QUndoCommand):
        self.newRect = item.rect()

    def redo(self):
        print("new rect: ", self.newRect)
        self.item.setRect(self.newRect)

    def undo(self):
@@ -267,11 +266,6 @@ class SceneTextManager(QObject):

    def adjustSceneTextRect(self):
        new_size = self.canvas.imgLayer.sceneBoundingRect().size()
        scale_factor = new_size.width() / self.canvas.old_size.width()
        for blk_item in self.textblk_item_list:
            rel_pos = blk_item.scenePos() * scale_factor
            blk_item.setScale(self.canvas.scale_factor)
            blk_item.setPos(blk_item.pos() + rel_pos - blk_item.scenePos())
        self.txtblkShapeControl.updateBoundingRect()

    def clearSceneTextitems(self):
@@ -309,9 +303,6 @@ class SceneTextManager(QObject):
                blk.translation = translation
                self.layout_textblk(blk_item, text=translation)
        self.addTextBlkItem(blk_item)
        rel_pos = blk_item.scenePos() * self.canvas.scale_factor
        blk_item.setScale(self.canvas.scale_factor)
        blk_item.setPos(blk_item.pos() + rel_pos - blk_item.scenePos())

        pair_widget = TransPairWidget(blk, len(self.pairwidget_list))
        self.pairwidget_list.append(pair_widget)
@@ -325,7 +316,7 @@ class SceneTextManager(QObject):

    def addTextBlkItem(self, textblk_item: TextBlkItem) -> TextBlkItem:
        self.textblk_item_list.append(textblk_item)
        self.canvas.addItem(textblk_item)
        textblk_item.setParentItem(self.canvas.inpaintLayer)
        textblk_item.begin_edit.connect(self.onTextBlkItemBeginEdit)
        textblk_item.end_edit.connect(self.onTextBlkItemEndEdit)
        textblk_item.hover_enter.connect(self.onTextBlkItemHoverEnter)
@@ -359,7 +350,7 @@ class SceneTextManager(QObject):
        blkitem.idx = len(self.textblk_item_list)
        p_widget.idx = len(self.pairwidget_list)
        self.textblk_item_list.append(blkitem)
        self.canvas.addItem(blkitem)
        blkitem.setParentItem(self.canvas.inpaintLayer)
        self.pairwidget_list.append(p_widget)
        self.textEditList.addPairWidget(p_widget)

@@ -643,10 +634,9 @@ class SceneTextManager(QObject):


    def onEndCreateTextBlock(self, rect: QRectF):
        scale_f = self.canvas.scale_factor
        if rect.width() > 1 and rect.height() > 1:
            xyxy = np.array([rect.x(), rect.y(), rect.right(), rect.bottom()])        
            xyxy = np.round(xyxy / scale_f).astype(np.int)
            xyxy = np.round(xyxy).astype(np.int)
            block = TextBlock(xyxy)
            xywh = np.copy(xyxy)
            xywh[[2, 3]] -= xywh[[0, 1]]
+66 −48
Original line number Diff line number Diff line
@@ -15,21 +15,23 @@ class ControlBlockItem(QGraphicsRectItem):
    DRAG_RESHAPE = 1
    DRAG_ROTATE = 2
    CURSOR_IDX = -1
    def __init__(self, parent, idx: int, edge_len: float):
    def __init__(self, parent, idx: int):
        super().__init__(parent)
        # self.setParentItem(parent)
        self.idx = idx
        self.ctrl: TextBlkShapeControl = parent
        self.edge_len = edge_len
        self.visible_len = self.edge_len // 2
        self.pen_width = 2
        self.setPen(QPen(QColor(75, 75, 75), self.pen_width, Qt.PenStyle.SolidLine, Qt.SquareCap))
        offset = self.edge_len // 4 + self.pen_width / 2
        self.visible_rect = QRectF(offset, offset, self.visible_len, self.visible_len)
        self.edge_width = 0
        self.drag_mode = self.DRAG_NONE
        self.setAcceptHoverEvents(True)
        self.setFlags(QGraphicsItem.ItemIsMovable | QGraphicsItem.ItemIsSelectable)
        self.setRect(0, 0, self.edge_len, self.edge_len)
        self.setFlags(QGraphicsItem.GraphicsItemFlag.ItemIsMovable | QGraphicsItem.GraphicsItemFlag.ItemIsSelectable)
        self.updateEdgeWidth(CBEDGE_WIDTH)
    
    def updateEdgeWidth(self, edge_width: float):
        self.edge_width = edge_width
        self.visible_len = self.edge_width // 2
        self.pen_width = edge_width / CBEDGE_WIDTH * 2 
        offset = self.edge_width // 4 + self.pen_width / 2
        self.visible_rect = QRectF(offset, offset, self.visible_len, self.visible_len)
        self.setRect(0, 0, self.edge_width, self.edge_width)

    def paint(self, painter: QPainter, option: QStyleOptionGraphicsItem, widget: QWidget) -> None:
        rect = QRectF(self.visible_rect)
@@ -56,21 +58,26 @@ class ControlBlockItem(QGraphicsRectItem):
        self.CURSOR_IDX = idx
        return super().hoverMoveEvent(event)

    def hoverLeaveEvent(self, event: 'QGraphicsSceneHoverEvent') -> None:
        if self.drag_mode == self.DRAG_NONE:
            self.setCursor(Qt.CursorShape.SizeAllCursor)
        return super().hoverLeaveEvent(event)

    def mousePressEvent(self, event: QGraphicsSceneMouseEvent) -> None:
        self.ctrl.ctrlblockPressed()
        if event.button() == Qt.MouseButton.LeftButton:
            self.ctrl.reshaping = True
            if self.visible_rect.contains(event.pos()):
                self.ctrl.reshaping = True
                self.drag_mode = self.DRAG_RESHAPE
                self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsMovable, True)
                self.ctrl.blk_item.startReshape()
            else:
                self.drag_mode = self.DRAG_ROTATE
                self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsMovable, False)
                preview = self.ctrl.previewPixmap
                preview.setPixmap(self.ctrl.blk_item.toPixmap())
                preview.setOpacity(0.7)
                preview.setScale(self.ctrl.blk_item.scale())
                preview.setVisible(True)

                rotate_vec = event.scenePos() - self.ctrl.pos() - self.ctrl.boundingRect().center()
                self.updateAngleLabelPos()
                rotation = np.rad2deg(math.atan2(rotate_vec.y(), rotate_vec.x()))
@@ -91,13 +98,11 @@ class ControlBlockItem(QGraphicsRectItem):
            angleLabel.raise_()

    def mouseMoveEvent(self, event: QGraphicsSceneMouseEvent) -> None:
        super().mouseMoveEvent(event)

        blk_item = self.ctrl.blk_item
        if self.drag_mode == self.DRAG_RESHAPE:    
            
            block_group = self.ctrl.ctrlblock_group
            old_pos = QPointF(block_group[0].scenePos())
            super().mouseMoveEvent(event)
            
            crect = self.ctrl.rect()
            pos_x, pos_y = 0, 0
            opposite_block = block_group[(self.idx + 4) % 8 ]
@@ -138,20 +143,17 @@ class ControlBlockItem(QGraphicsRectItem):
                    crect.setX(pos_x+self.visible_len)
            
            self.ctrl.setRect(crect)
            rect = QRectF()
            rect.setTopLeft(blk_item.pos()+block_group[0].scenePos()-old_pos)
            rect.setBottomRight(crect.bottomRight()-crect.topLeft()+rect.topLeft())
            rect.setHeight(rect.height()/blk_item.scale())
            rect.setWidth(rect.width()/blk_item.scale())
            scale = self.ctrl.current_scale
            new_center = self.ctrl.sceneBoundingRect().center()
            rect.setX(new_center.x()-rect.width()/2)
            rect.setY(new_center.y()-rect.height()/2)
            new_xy = QPointF(new_center.x() / scale - crect.width() / 2, new_center.y() / scale - crect.height() / 2)
            rect = QRectF(new_xy.x(), new_xy.y(), crect.width(), crect.height())
            blk_item.setRect(rect)

        elif self.drag_mode == self.DRAG_ROTATE:   # rotating
            rotate_vec = event.scenePos() - self.ctrl.pos() - self.ctrl.boundingRect().center()
            rotate_vec = event.scenePos() - self.ctrl.sceneBoundingRect().center()
            rotation = np.rad2deg(math.atan2(rotate_vec.y(), rotate_vec.x()))
            self.ctrl.setAngle(rotation+self.rotate_start)
            self.ctrl.setAngle((rotation+self.rotate_start) % 360)
            # angle = self.ctrl.rotation()
            angle = self.ctrl.rotation() + 45 * self.idx
            idx = self.get_angle_idx(angle)
            if self.CURSOR_IDX != idx:
@@ -178,10 +180,10 @@ class ControlBlockItem(QGraphicsRectItem):
            self.ctrl.updateBoundingRect()
            return super().mouseReleaseEvent(event)

CBEDGE_WIDTH = 40

class TextBlkShapeControl(QGraphicsRectItem):
    blk_item : TextBlkItem = None 
    cb_edge_len : float = 40
    ctrl_block: ControlBlockItem = None
    reshaping: bool = False
    
@@ -189,14 +191,14 @@ class TextBlkShapeControl(QGraphicsRectItem):
        super().__init__()
        self.gv = parent
        self.ctrlblock_group = [
            ControlBlockItem(self, 0, self.cb_edge_len),
            ControlBlockItem(self, 1, self.cb_edge_len),
            ControlBlockItem(self, 2, self.cb_edge_len),
            ControlBlockItem(self, 3, self.cb_edge_len),
            ControlBlockItem(self, 4, self.cb_edge_len),
            ControlBlockItem(self, 5, self.cb_edge_len),
            ControlBlockItem(self, 6, self.cb_edge_len),
            ControlBlockItem(self, 7, self.cb_edge_len),
            ControlBlockItem(self, 0),
            ControlBlockItem(self, 1),
            ControlBlockItem(self, 2),
            ControlBlockItem(self, 3),
            ControlBlockItem(self, 4),
            ControlBlockItem(self, 5),
            ControlBlockItem(self, 6),
            ControlBlockItem(self, 7),
        ]
        
        self.previewPixmap = QGraphicsPixmapItem(self)
@@ -205,7 +207,6 @@ class TextBlkShapeControl(QGraphicsRectItem):
        pen.setDashPattern([7, 14])
        self.setPen(pen)
        self.setVisible(False)
        self.setZValue(1)

        self.angleLabel = QLabel(parent)
        self.angleLabel.setText("{:.1f}°".format(self.rotation()))
@@ -213,6 +214,8 @@ class TextBlkShapeControl(QGraphicsRectItem):
        self.angleLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.angleLabel.setHidden(True)

        self.current_scale = 1.
        self.need_rescale = False
        self.setCursor(Qt.CursorShape.SizeAllCursor)

    def setBlkItem(self, blk_item: TextBlkItem):
@@ -237,15 +240,10 @@ class TextBlkShapeControl(QGraphicsRectItem):
        if self.blk_item is None:
            return
        br = self.blk_item.boundingRect()
        center = br.center()
        scale = self.blk_item.scale()
        ds = 1 - scale
        br = [0, 0, br.width()*scale, br.height()*scale]
        self.setRect(br)
        self.blk_item.setCenterTransform()
        self.setTransformOriginPoint(self.blk_item.transformOriginPoint())
        self.setRect(*br)
        pos = self.blk_item.pos()
        self.setPos(pos.x()+ds*center.x(), pos.y()+ds*center.y())
        self.setPos(self.blk_item.pos())
        self.setAngle(self.blk_item.angle)

    def setRect(self, *args): 
@@ -258,11 +256,10 @@ class TextBlkShapeControl(QGraphicsRectItem):
        corner_pnts = xywh2xyxypoly(np.array([b_rect])).reshape(-1, 2)
        edge_pnts = (corner_pnts[[1, 2, 3, 0]] + corner_pnts) / 2
        pnts = [edge_pnts, corner_pnts]
        offset = -0.5 * self.cb_edge_len
        for ii, ctrlblock in enumerate(self.ctrlblock_group):
            is_corner = not ii % 2
            idx = ii // 2
            pos = pnts[is_corner][idx] + offset
            pos = pnts[is_corner][idx] -0.5 * ctrlblock.edge_width
            ctrlblock.setPos(pos[0], pos[1])

    def setAngle(self, angle: int) -> None:
@@ -286,3 +283,24 @@ class TextBlkShapeControl(QGraphicsRectItem):
    def showControls(self):
        for ctrl in self.ctrlblock_group:
            ctrl.show()

    def updateScale(self, scale: float):
        if not self.isVisible():
            if scale != self.current_scale:
                self.need_rescale = True
                self.current_scale = scale
            return

        self.current_scale = scale
        scale = 1 / scale
        pen = self.pen()
        pen.setWidthF(2 * scale)
        self.setPen(pen)
        for ctrl in self.ctrlblock_group:
            ctrl.updateEdgeWidth(CBEDGE_WIDTH * scale)

    def show(self) -> None:
        super().show()
        if self.need_rescale:
            self.updateScale(self.current_scale)
            self.need_rescale = False
Loading