Loading ui/canvas.py +4 −1 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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: Loading Loading @@ -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(): Loading ui/scenetext_manager.py +18 −28 Original line number Diff line number Diff line Loading @@ -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): Loading Loading @@ -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: Loading Loading @@ -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) Loading @@ -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] Loading Loading @@ -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): Loading Loading @@ -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]) Loading ui/textedit_area.py +12 −2 Original line number Diff line number Diff line Loading @@ -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) Loading Loading
ui/canvas.py +4 −1 Original line number Diff line number Diff line Loading @@ -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) Loading Loading @@ -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: Loading Loading @@ -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(): Loading
ui/scenetext_manager.py +18 −28 Original line number Diff line number Diff line Loading @@ -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): Loading Loading @@ -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: Loading Loading @@ -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) Loading @@ -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] Loading Loading @@ -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): Loading Loading @@ -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]) Loading
ui/textedit_area.py +12 −2 Original line number Diff line number Diff line Loading @@ -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) Loading