Loading ui/canvas.py +30 −13 Original line number Diff line number Diff line Loading @@ -4,7 +4,7 @@ import os from qtpy.QtWidgets import QShortcut, QMenu, QGraphicsScene, QGraphicsView, QGraphicsSceneDragDropEvent, QGraphicsRectItem, QGraphicsItem, QScrollBar, QGraphicsPixmapItem, QGraphicsSceneMouseEvent, QGraphicsSceneContextMenuEvent, QRubberBand from qtpy.QtCore import Qt, QDateTime, QRectF, QPointF, QPoint, Signal, QSizeF, QEvent from qtpy.QtGui import QDropEvent, QPixmap, QHideEvent, QKeyEvent, QWheelEvent, QResizeEvent, QPainter, QPen, QPainterPath, QCursor from qtpy.QtGui import QKeySequence, QPixmap, QHideEvent, QKeyEvent, QWheelEvent, QResizeEvent, QPainter, QPen, QPainterPath, QCursor try: from qtpy.QtWidgets import QUndoStack, QUndoCommand Loading Loading @@ -500,12 +500,7 @@ class Canvas(QGraphicsScene): return False if self.editing_textblkitem is not None and self.editing_textblkitem.isEditing(): return False if len(self.selected_text_items()) > 0: self.paste2selected_textitems.emit() else: self.paste_textblks.emit(self.scene_cursor_pos()) self.on_paste() return True def handle_ctrlc(self): Loading @@ -513,10 +508,7 @@ class Canvas(QGraphicsScene): return False if self.editing_textblkitem is not None and self.editing_textblkitem.isEditing(): return False if len(self.selected_text_items()) > 0: self.copy_textblks.emit(self.scene_cursor_pos()) self.on_copy() return True def scene_cursor_pos(self): Loading Loading @@ -657,10 +649,15 @@ class Canvas(QGraphicsScene): if self.textEditMode() and not self.creating_textblock: menu = QMenu(self.gv) copy_act = menu.addAction(self.tr("Copy")) copy_act.setShortcut(QKeySequence.StandardKey.Copy) paste_act = menu.addAction(self.tr("Paste")) paste_act.setShortcut(QKeySequence.StandardKey.Paste) delete_act = menu.addAction(self.tr("Delete")) delete_act.setShortcut(QKeySequence("Ctrl+D")) copy_src_act = menu.addAction(self.tr("Copy source text")) copy_src_act.setShortcut(QKeySequence("Ctrl+Shift+C")) paste_src_act = menu.addAction(self.tr("Paste source text")) paste_src_act.setShortcut(QKeySequence("Ctrl+Shift+V")) delete_recover_act = menu.addAction(self.tr("Delete and Recover removed text")) menu.addSeparator() Loading @@ -680,9 +677,9 @@ class Canvas(QGraphicsScene): elif rst == delete_recover_act: self.delete_textblks.emit(1) elif rst == copy_act: self.copy_textblks.emit(pos.toPointF()) self.on_copy(pos.toPointF()) elif rst == paste_act: self.paste_textblks.emit(pos.toPointF()) self.on_paste(pos.toPointF()) elif rst == copy_src_act: self.copy_src_signal.emit() elif rst == paste_src_act: Loading @@ -702,6 +699,26 @@ class Canvas(QGraphicsScene): elif rst == ocr_translate_inpaint_act: self.run_blktrans.emit(2) @property def have_selected_blkitem(self): return len(self.selected_text_items()) > 0 def on_paste(self, p: QPointF = None): if self.textEditMode(): if p is None: p = self.scene_cursor_pos() if self.have_selected_blkitem: self.paste2selected_textitems.emit() else: self.paste_textblks.emit(p) def on_copy(self, p: QPointF = None): if self.textEditMode(): if self.have_selected_blkitem: if p is None: p = self.scene_cursor_pos() self.copy_textblks.emit(p) def hide_rubber_band(self): if self.rubber_band.isVisible(): self.rubber_band.hide() Loading ui/mainwindow.py +2 −0 Original line number Diff line number Diff line Loading @@ -534,6 +534,8 @@ class MainWindow(FramelessWindow): if self.drawingPanel.isVisible(): if self.drawingPanel.currentTool == self.drawingPanel.rectTool: self.drawingPanel.rectPanel.delete_btn.click() elif self.canvas.textEditMode(): self.canvas.delete_textblks.emit(0) def shortcutSelectAll(self): if self.centralStackWidget.currentIndex() == 0: Loading ui/scenetext_manager.py +20 −3 Original line number Diff line number Diff line Loading @@ -564,10 +564,14 @@ class SceneTextManager(QObject): pos_x = int(pos_x / self.canvas.scale_factor) pos_y = int(pos_y / self.canvas.scale_factor) for blkitems in selected_blks: blk = copy.deepcopy(blkitems.blk) textlist = [] for blkitem in selected_blks: blk = copy.deepcopy(blkitem.blk) blk.adjust_pos(-pos_x, -pos_y) self.canvas.clipboard_blks.append(blk) textlist.append(blkitem.toPlainText().strip()) textlist = '\n'.join(textlist) self.app_clipborad.setText(textlist, QClipboard.Mode.Clipboard) def onPasteBlkItems(self, pos: QPointF): Loading Loading @@ -837,8 +841,21 @@ class SceneTextManager(QObject): def on_paste2selected_textitems(self): blkitems = self.canvas.selected_text_items() text = self.app_clipborad.text() if len(blkitems) < 1: num_blk = len(blkitems) if num_blk < 1: return if num_blk > 1: text_list = text.rstrip().split('\n') num_text = len(text_list) if num_text > 1: if num_text > num_blk: text_list = text_list[:num_blk] elif num_text < num_blk: text_list = text_list + [text_list[-1]] * (num_blk - num_text) text = text_list etrans = [self.pairwidget_list[blkitem.idx].e_trans for blkitem in blkitems] self.canvas.push_undo_command(MultiPasteCommand(text, blkitems, etrans)) Loading ui/textedit_commands.py +7 −2 Original line number Diff line number Diff line Loading @@ -477,12 +477,17 @@ class GlobalRepalceAllCommand(QUndoCommand): class MultiPasteCommand(QUndoCommand): def __init__(self, text: str, blkitems: List[TextBlkItem], etrans: List[TransTextEdit]) -> None: def __init__(self, text_list: Union[str, List], blkitems: List[TextBlkItem], etrans: List[TransTextEdit]) -> None: super().__init__() self.op_counter = -1 self.blkitems = blkitems self.etrans = etrans for blkitem, etran in zip(self.blkitems, self.etrans): if len(blkitems) > 0: if isinstance(text_list, str): text_list = [text_list] * len(blkitems) for blkitem, etran, text in zip(self.blkitems, self.etrans, text_list): etran.setPlainTextAndKeepUndoStack(text) blkitem.setPlainTextAndKeepUndoStack(text) Loading Loading
ui/canvas.py +30 −13 Original line number Diff line number Diff line Loading @@ -4,7 +4,7 @@ import os from qtpy.QtWidgets import QShortcut, QMenu, QGraphicsScene, QGraphicsView, QGraphicsSceneDragDropEvent, QGraphicsRectItem, QGraphicsItem, QScrollBar, QGraphicsPixmapItem, QGraphicsSceneMouseEvent, QGraphicsSceneContextMenuEvent, QRubberBand from qtpy.QtCore import Qt, QDateTime, QRectF, QPointF, QPoint, Signal, QSizeF, QEvent from qtpy.QtGui import QDropEvent, QPixmap, QHideEvent, QKeyEvent, QWheelEvent, QResizeEvent, QPainter, QPen, QPainterPath, QCursor from qtpy.QtGui import QKeySequence, QPixmap, QHideEvent, QKeyEvent, QWheelEvent, QResizeEvent, QPainter, QPen, QPainterPath, QCursor try: from qtpy.QtWidgets import QUndoStack, QUndoCommand Loading Loading @@ -500,12 +500,7 @@ class Canvas(QGraphicsScene): return False if self.editing_textblkitem is not None and self.editing_textblkitem.isEditing(): return False if len(self.selected_text_items()) > 0: self.paste2selected_textitems.emit() else: self.paste_textblks.emit(self.scene_cursor_pos()) self.on_paste() return True def handle_ctrlc(self): Loading @@ -513,10 +508,7 @@ class Canvas(QGraphicsScene): return False if self.editing_textblkitem is not None and self.editing_textblkitem.isEditing(): return False if len(self.selected_text_items()) > 0: self.copy_textblks.emit(self.scene_cursor_pos()) self.on_copy() return True def scene_cursor_pos(self): Loading Loading @@ -657,10 +649,15 @@ class Canvas(QGraphicsScene): if self.textEditMode() and not self.creating_textblock: menu = QMenu(self.gv) copy_act = menu.addAction(self.tr("Copy")) copy_act.setShortcut(QKeySequence.StandardKey.Copy) paste_act = menu.addAction(self.tr("Paste")) paste_act.setShortcut(QKeySequence.StandardKey.Paste) delete_act = menu.addAction(self.tr("Delete")) delete_act.setShortcut(QKeySequence("Ctrl+D")) copy_src_act = menu.addAction(self.tr("Copy source text")) copy_src_act.setShortcut(QKeySequence("Ctrl+Shift+C")) paste_src_act = menu.addAction(self.tr("Paste source text")) paste_src_act.setShortcut(QKeySequence("Ctrl+Shift+V")) delete_recover_act = menu.addAction(self.tr("Delete and Recover removed text")) menu.addSeparator() Loading @@ -680,9 +677,9 @@ class Canvas(QGraphicsScene): elif rst == delete_recover_act: self.delete_textblks.emit(1) elif rst == copy_act: self.copy_textblks.emit(pos.toPointF()) self.on_copy(pos.toPointF()) elif rst == paste_act: self.paste_textblks.emit(pos.toPointF()) self.on_paste(pos.toPointF()) elif rst == copy_src_act: self.copy_src_signal.emit() elif rst == paste_src_act: Loading @@ -702,6 +699,26 @@ class Canvas(QGraphicsScene): elif rst == ocr_translate_inpaint_act: self.run_blktrans.emit(2) @property def have_selected_blkitem(self): return len(self.selected_text_items()) > 0 def on_paste(self, p: QPointF = None): if self.textEditMode(): if p is None: p = self.scene_cursor_pos() if self.have_selected_blkitem: self.paste2selected_textitems.emit() else: self.paste_textblks.emit(p) def on_copy(self, p: QPointF = None): if self.textEditMode(): if self.have_selected_blkitem: if p is None: p = self.scene_cursor_pos() self.copy_textblks.emit(p) def hide_rubber_band(self): if self.rubber_band.isVisible(): self.rubber_band.hide() Loading
ui/mainwindow.py +2 −0 Original line number Diff line number Diff line Loading @@ -534,6 +534,8 @@ class MainWindow(FramelessWindow): if self.drawingPanel.isVisible(): if self.drawingPanel.currentTool == self.drawingPanel.rectTool: self.drawingPanel.rectPanel.delete_btn.click() elif self.canvas.textEditMode(): self.canvas.delete_textblks.emit(0) def shortcutSelectAll(self): if self.centralStackWidget.currentIndex() == 0: Loading
ui/scenetext_manager.py +20 −3 Original line number Diff line number Diff line Loading @@ -564,10 +564,14 @@ class SceneTextManager(QObject): pos_x = int(pos_x / self.canvas.scale_factor) pos_y = int(pos_y / self.canvas.scale_factor) for blkitems in selected_blks: blk = copy.deepcopy(blkitems.blk) textlist = [] for blkitem in selected_blks: blk = copy.deepcopy(blkitem.blk) blk.adjust_pos(-pos_x, -pos_y) self.canvas.clipboard_blks.append(blk) textlist.append(blkitem.toPlainText().strip()) textlist = '\n'.join(textlist) self.app_clipborad.setText(textlist, QClipboard.Mode.Clipboard) def onPasteBlkItems(self, pos: QPointF): Loading Loading @@ -837,8 +841,21 @@ class SceneTextManager(QObject): def on_paste2selected_textitems(self): blkitems = self.canvas.selected_text_items() text = self.app_clipborad.text() if len(blkitems) < 1: num_blk = len(blkitems) if num_blk < 1: return if num_blk > 1: text_list = text.rstrip().split('\n') num_text = len(text_list) if num_text > 1: if num_text > num_blk: text_list = text_list[:num_blk] elif num_text < num_blk: text_list = text_list + [text_list[-1]] * (num_blk - num_text) text = text_list etrans = [self.pairwidget_list[blkitem.idx].e_trans for blkitem in blkitems] self.canvas.push_undo_command(MultiPasteCommand(text, blkitems, etrans)) Loading
ui/textedit_commands.py +7 −2 Original line number Diff line number Diff line Loading @@ -477,12 +477,17 @@ class GlobalRepalceAllCommand(QUndoCommand): class MultiPasteCommand(QUndoCommand): def __init__(self, text: str, blkitems: List[TextBlkItem], etrans: List[TransTextEdit]) -> None: def __init__(self, text_list: Union[str, List], blkitems: List[TextBlkItem], etrans: List[TransTextEdit]) -> None: super().__init__() self.op_counter = -1 self.blkitems = blkitems self.etrans = etrans for blkitem, etran in zip(self.blkitems, self.etrans): if len(blkitems) > 0: if isinstance(text_list, str): text_list = [text_list] * len(blkitems) for blkitem, etran, text in zip(self.blkitems, self.etrans, text_list): etran.setPlainTextAndKeepUndoStack(text) blkitem.setPlainTextAndKeepUndoStack(text) Loading