Commit a441bfb7 authored by dmMaze's avatar dmMaze
Browse files

optimize text blocks selection and fix #273

parent 8e4c551a
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -292,6 +292,7 @@ class Canvas(QGraphicsScene):
        self.clipboard_blks: List[TextBlock] = []

        self.drop_folder: str = None
        self.block_selection_signal = False
        
        im_rect = QRectF(0, 0, C.SCREEN_W, C.SCREEN_H)
        self.baseLayer.setRect(im_rect)
@@ -422,7 +423,7 @@ class Canvas(QGraphicsScene):
            blk_item = self.txtblkShapeControl.blk_item
            if blk_item is not None and blk_item.isEditing():
                blk_item.endEdit()
        if self.hasFocus():
        if self.hasFocus() and not self.block_selection_signal:
            self.incanvas_selection_changed.emit()

    def keyPressEvent(self, event: QKeyEvent) -> None:
@@ -793,11 +794,13 @@ class Canvas(QGraphicsScene):
            self.proj_savestate_changed.emit(un_saved)

    def removeItem(self, item: QGraphicsItem) -> None:
        self.block_selection_signal = True
        super().removeItem(item)
        if isinstance(item, StrokeImgItem):
            item.setParentItem(None)
            self.stroke_img_item = None
            self.erase_img_key = None
        self.block_selection_signal = False

    def get_active_undostack(self) -> QUndoStack:
        if self.textEditMode():
+18 −28
Original line number Diff line number Diff line
@@ -40,10 +40,10 @@ class CreateItemCommand(QUndoCommand):
            self.op_count += 1
            self.blk_item.setSelected(True)
            return
        self.ctrl.recoverTextblkItem(self.blk_item, self.pairw)
        self.ctrl.recoverTextblkItemList([self.blk_item], [self.pairw])

    def undo(self):
        self.ctrl.deleteTextblkItem(self.blk_item)
        self.ctrl.deleteTextblkItemList([self.blk_item], [self.pairw])


class EmptyCommand(QUndoCommand):
@@ -208,11 +208,16 @@ class PasteBlkItemsCommand(QUndoCommand):
        super().__init__(parent)
        self.op_counter = 0
        self.blk_list = blk_list
        self.ctrl:SceneTextManager = ctrl
        blk_list.sort(key=lambda blk: blk.idx)

        self.ctrl.canvas.block_selection_signal = True
        for blkitem in blk_list:
            blkitem.setSelected(True)
        self.ctrl.on_incanvas_selection_changed()
        self.ctrl.canvas.block_selection_signal = False
        self.pwidget_list = pwidget_list
        self.ctrl:SceneTextManager = ctrl
        

    def redo(self):
        if self.op_counter == 0:
@@ -426,31 +431,23 @@ class SceneTextManager(QObject):
        textblk_item.pasted.connect(self.onBlkitemPaste)
        return textblk_item

    def deleteTextblkItem(self, blkitem: TextBlkItem):
        self.canvas.removeItem(blkitem)
        self.textblk_item_list.remove(blkitem)
        pwidget = self.pairwidget_list.pop(blkitem.idx)
        self.textEditList.removeWidget(pwidget)
        self.updateTextBlkItemIdx()
        self.txtblkShapeControl.setBlkItem(None)

    def deleteTextblkItemList(self, blkitem_list: List[TextBlkItem], p_widget_list: List[TransPairWidget]):
        selection_changed = False
        for blkitem, p_widget in zip(blkitem_list, p_widget_list):
            self.canvas.removeItem(blkitem)
            if blkitem.isSelected():
                selection_changed = True
            self.canvas.removeItem(blkitem) # removeItem itself will block incanvas_selection_changed
            self.textblk_item_list.remove(blkitem)
            self.pairwidget_list.remove(p_widget)
            self.textEditList.removeWidget(p_widget)
        self.updateTextBlkItemIdx()
        self.txtblkShapeControl.setBlkItem(None)

    def recoverTextblkItem(self, blkitem: TextBlkItem, p_widget: TransPairWidget):
        self.textblk_item_list.insert(blkitem.idx, blkitem)
        blkitem.setParentItem(self.canvas.textLayer)
        self.pairwidget_list.insert(p_widget.idx, p_widget)
        self.textEditList.insertPairWidget(p_widget, p_widget.idx)
        self.updateTextBlkItemIdx()
        if selection_changed:
            # it must be called after updateTextBlkItemIdx if blk.idx changed
            self.on_incanvas_selection_changed()

    def recoverTextblkItemList(self, blkitem_list: List[TextBlkItem], p_widget_list: List[TransPairWidget]):
        self.canvas.block_selection_signal = True
        for blkitem, p_widget in zip(blkitem_list, p_widget_list):
            self.textblk_item_list.insert(blkitem.idx, blkitem)
            blkitem.setParentItem(self.canvas.textLayer)
@@ -459,6 +456,8 @@ class SceneTextManager(QObject):
            if self.txtblkShapeControl.blk_item is not None and blkitem.isSelected():
                blkitem.setSelected(False)
        self.updateTextBlkItemIdx()
        self.on_incanvas_selection_changed()
        self.canvas.block_selection_signal = False
        
    def onTextBlkItemSizeChanged(self, idx: int):
        blk_item = self.textblk_item_list[idx]
@@ -553,13 +552,6 @@ class SceneTextManager(QObject):
        if len(selected_blks) == 0 and self.txtblkShapeControl.blk_item is not None:
            selected_blks.append(self.txtblkShapeControl.blk_item)
        if len(selected_blks) > 0:
            # img, mask = self.imgtrans_proj.img_array, self.imgtrans_proj.mask_array
            # for blk in selected_blks:
            #     x, y, w, h = blk.absBoundingRect()
            #     x2, y2 = x+w, y+h
            #     imname = str(blk.idx).zfill(2) + '.png'
            #     cv2.imwrite(imname, img[y: y2, x: x2])
            #     cv2.imwrite('mask_' + imname, mask[y: y2, x: x2])
            self.canvas.push_undo_command(DeleteBlkItemsCommand(selected_blks, mode, self))

    def onCopyBlkItems(self, pos: QPointF):
@@ -634,8 +626,6 @@ class SceneTextManager(QObject):

    def on_incanvas_selection_changed(self):
        if self.canvas.textEditMode():
            self.textEditList.clearDrag()
            self.textEditList.clearAllSelected(emit_signal=False)
            textitems = self.canvas.selected_text_items()
            self.textEditList.set_selected_list([t.idx for t in textitems])

+12 −2
Original line number Diff line number Diff line
@@ -587,9 +587,19 @@ class TextEditListScrollArea(QScrollArea):
                pwc.e_trans.focus_in.emit(pwc.idx)

    def set_selected_list(self, selection_indices: List):
        self.clearAllSelected(emit_signal=False)
        self.clearDrag()
        for idx in selection_indices:

        old_sel_set, new_sel_set = set([pw.idx for pw in self.checked_list]), set(selection_indices)
        to_remove = old_sel_set.difference(new_sel_set)
        to_add = new_sel_set.difference(old_sel_set)
        self.sel_anchor_widget = None

        for idx in to_remove:
            pw = self.pairwidget_list[idx]
            pw._set_checked_state(False)
            self.checked_list.remove(pw)

        for idx in to_add:
            pw = self.pairwidget_list[idx]
            pw._set_checked_state(True)
            self.checked_list.append(pw)