Commit aaba6380 authored by dmMaze's avatar dmMaze
Browse files

better copy/paste scheme

parent 40e62a6a
Loading
Loading
Loading
Loading
+30 −13
Original line number Diff line number Diff line
@@ -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
@@ -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):
@@ -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):
@@ -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()

@@ -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:
@@ -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()
+2 −0
Original line number Diff line number Diff line
@@ -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:
+20 −3
Original line number Diff line number Diff line
@@ -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):
@@ -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))

+7 −2
Original line number Diff line number Diff line
@@ -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)