Loading ballontranslator/ui/canvas.py +7 −2 Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ from typing import List, Union, Tuple from qtpy.QtWidgets import QMenu, QGraphicsScene, QGraphicsView, QGraphicsRectItem, QGraphicsItem, QScrollBar, QGraphicsPixmapItem, QGraphicsSceneMouseEvent, QGraphicsSceneContextMenuEvent, QRubberBand from qtpy.QtCore import Qt, QDateTime, QRectF, QPointF, QPoint, Signal, QSizeF, QEvent from qtpy.QtGui import 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 @@ -92,6 +92,7 @@ class Canvas(QGraphicsScene): paste_textblks = Signal(QPointF) format_textblks = Signal() layout_textblks = Signal() reset_angle = Signal() run_blktrans = Signal(int) Loading Loading @@ -540,11 +541,12 @@ class Canvas(QGraphicsScene): menu = QMenu() copy_act = menu.addAction(self.tr("Copy")) paste_act = menu.addAction(self.tr("Paste")) delete_act = menu.addAction(self.tr("Delete")) delete_act = menu.addAction(self.tr("Delete"), ) delete_recover_act = menu.addAction(self.tr("Delete and Recover removed text")) menu.addSeparator() format_act = menu.addAction(self.tr("Apply font formatting")) layout_act = menu.addAction(self.tr("Auto layout")) angle_act = menu.addAction(self.tr("Reset Angle")) menu.addSeparator() translate_act = menu.addAction(self.tr("translate")) ocr_act = menu.addAction(self.tr("OCR")) Loading @@ -565,6 +567,8 @@ class Canvas(QGraphicsScene): self.format_textblks.emit() elif rst == layout_act: self.layout_textblks.emit() elif rst == angle_act: self.reset_angle.emit() elif rst == translate_act: self.run_blktrans.emit(-1) elif rst == ocr_act: Loading @@ -574,6 +578,7 @@ class Canvas(QGraphicsScene): elif rst == ocr_translate_inpaint_act: self.run_blktrans.emit(2) def on_hide_canvas(self): self.clear_states() Loading ballontranslator/ui/scenetext_manager.py +7 −1 Original line number Diff line number Diff line Loading @@ -17,7 +17,7 @@ from .canvas import Canvas from .textedit_area import TextPanel, TransTextEdit, SourceTextEdit, TransPairWidget from .fontformatpanel import set_textblk_fontsize from .misc import FontFormat, ProgramConfig, pt2px from .textedit_commands import propagate_user_edit, TextEditCommand, ReshapeItemCommand, MoveBlkItemsCommand, AutoLayoutCommand, ApplyFontformatCommand, ApplyEffectCommand, RotateItemCommand, TextItemEditCommand, TextEditCommand, PageReplaceOneCommand, PageReplaceAllCommand, MultiPasteCommand from .textedit_commands import propagate_user_edit, TextEditCommand, ReshapeItemCommand, MoveBlkItemsCommand, AutoLayoutCommand, ApplyFontformatCommand, ApplyEffectCommand, RotateItemCommand, TextItemEditCommand, TextEditCommand, PageReplaceOneCommand, PageReplaceAllCommand, MultiPasteCommand, ResetAngleCommand from utils.imgproc_utils import extract_ballon_region, rotate_polygons from utils.text_processing import seg_text, is_cjk from utils.text_layout import layout_text Loading Loading @@ -276,6 +276,7 @@ class SceneTextManager(QObject): self.canvas.paste_textblks.connect(self.onPasteBlkItems) self.canvas.format_textblks.connect(self.onFormatTextblks) self.canvas.layout_textblks.connect(self.onAutoLayoutTextblks) self.canvas.reset_angle.connect(self.onResetAngle) self.txtblkShapeControl = canvas.txtblkShapeControl self.textpanel = textpanel Loading Loading @@ -569,6 +570,11 @@ class SceneTextManager(QObject): self.canvas.push_undo_command(AutoLayoutCommand(selected_blks, old_rect_lst, old_html_lst, trans_widget_lst)) def onResetAngle(self): selected_blks = self.get_selected_blkitems() if len(selected_blks) > 0: self.canvas.push_undo_command(ResetAngleCommand(selected_blks, self.txtblkShapeControl)) def layout_textblk(self, blkitem: TextBlkItem, text: str = None, mask: np.ndarray = None, bounding_rect: List = None, region_rect: List = None): img = self.imgtrans_proj.img_array Loading ballontranslator/ui/textedit_commands.py +26 −0 Original line number Diff line number Diff line Loading @@ -204,6 +204,32 @@ class AutoLayoutCommand(QUndoCommand): item.setLetterSpacing(item.letter_spacing, force=True) class ResetAngleCommand(QUndoCommand): def __init__(self, blkitem_lst: List[TextBlkItem], ctrl: TextBlkShapeControl): super(ResetAngleCommand, self).__init__() self.blkitem_lst = blkitem_lst self.angle_lst = [] self.ctrl = ctrl blkitem_lst = [] for blk in self.blkitem_lst: rotation = blk.rotation() if rotation != 0: self.angle_lst.append(rotation) blkitem_lst.append(blk) self.blkitem_lst = blkitem_lst def redo(self): for blk in self.blkitem_lst: blk.setAngle(0) if self.ctrl.blk_item == blk: self.ctrl.setAngle(0) def undo(self): for blk, angle in zip(self.blkitem_lst, self.angle_lst): blk.setAngle(angle) if self.ctrl.blk_item == blk: self.ctrl.setAngle(angle) class TextItemEditCommand(QUndoCommand): def __init__(self, blkitem: TextBlkItem, trans_edit: TransTextEdit, num_steps: int): super(TextItemEditCommand, self).__init__() Loading Loading
ballontranslator/ui/canvas.py +7 −2 Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ from typing import List, Union, Tuple from qtpy.QtWidgets import QMenu, QGraphicsScene, QGraphicsView, QGraphicsRectItem, QGraphicsItem, QScrollBar, QGraphicsPixmapItem, QGraphicsSceneMouseEvent, QGraphicsSceneContextMenuEvent, QRubberBand from qtpy.QtCore import Qt, QDateTime, QRectF, QPointF, QPoint, Signal, QSizeF, QEvent from qtpy.QtGui import 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 @@ -92,6 +92,7 @@ class Canvas(QGraphicsScene): paste_textblks = Signal(QPointF) format_textblks = Signal() layout_textblks = Signal() reset_angle = Signal() run_blktrans = Signal(int) Loading Loading @@ -540,11 +541,12 @@ class Canvas(QGraphicsScene): menu = QMenu() copy_act = menu.addAction(self.tr("Copy")) paste_act = menu.addAction(self.tr("Paste")) delete_act = menu.addAction(self.tr("Delete")) delete_act = menu.addAction(self.tr("Delete"), ) delete_recover_act = menu.addAction(self.tr("Delete and Recover removed text")) menu.addSeparator() format_act = menu.addAction(self.tr("Apply font formatting")) layout_act = menu.addAction(self.tr("Auto layout")) angle_act = menu.addAction(self.tr("Reset Angle")) menu.addSeparator() translate_act = menu.addAction(self.tr("translate")) ocr_act = menu.addAction(self.tr("OCR")) Loading @@ -565,6 +567,8 @@ class Canvas(QGraphicsScene): self.format_textblks.emit() elif rst == layout_act: self.layout_textblks.emit() elif rst == angle_act: self.reset_angle.emit() elif rst == translate_act: self.run_blktrans.emit(-1) elif rst == ocr_act: Loading @@ -574,6 +578,7 @@ class Canvas(QGraphicsScene): elif rst == ocr_translate_inpaint_act: self.run_blktrans.emit(2) def on_hide_canvas(self): self.clear_states() Loading
ballontranslator/ui/scenetext_manager.py +7 −1 Original line number Diff line number Diff line Loading @@ -17,7 +17,7 @@ from .canvas import Canvas from .textedit_area import TextPanel, TransTextEdit, SourceTextEdit, TransPairWidget from .fontformatpanel import set_textblk_fontsize from .misc import FontFormat, ProgramConfig, pt2px from .textedit_commands import propagate_user_edit, TextEditCommand, ReshapeItemCommand, MoveBlkItemsCommand, AutoLayoutCommand, ApplyFontformatCommand, ApplyEffectCommand, RotateItemCommand, TextItemEditCommand, TextEditCommand, PageReplaceOneCommand, PageReplaceAllCommand, MultiPasteCommand from .textedit_commands import propagate_user_edit, TextEditCommand, ReshapeItemCommand, MoveBlkItemsCommand, AutoLayoutCommand, ApplyFontformatCommand, ApplyEffectCommand, RotateItemCommand, TextItemEditCommand, TextEditCommand, PageReplaceOneCommand, PageReplaceAllCommand, MultiPasteCommand, ResetAngleCommand from utils.imgproc_utils import extract_ballon_region, rotate_polygons from utils.text_processing import seg_text, is_cjk from utils.text_layout import layout_text Loading Loading @@ -276,6 +276,7 @@ class SceneTextManager(QObject): self.canvas.paste_textblks.connect(self.onPasteBlkItems) self.canvas.format_textblks.connect(self.onFormatTextblks) self.canvas.layout_textblks.connect(self.onAutoLayoutTextblks) self.canvas.reset_angle.connect(self.onResetAngle) self.txtblkShapeControl = canvas.txtblkShapeControl self.textpanel = textpanel Loading Loading @@ -569,6 +570,11 @@ class SceneTextManager(QObject): self.canvas.push_undo_command(AutoLayoutCommand(selected_blks, old_rect_lst, old_html_lst, trans_widget_lst)) def onResetAngle(self): selected_blks = self.get_selected_blkitems() if len(selected_blks) > 0: self.canvas.push_undo_command(ResetAngleCommand(selected_blks, self.txtblkShapeControl)) def layout_textblk(self, blkitem: TextBlkItem, text: str = None, mask: np.ndarray = None, bounding_rect: List = None, region_rect: List = None): img = self.imgtrans_proj.img_array Loading
ballontranslator/ui/textedit_commands.py +26 −0 Original line number Diff line number Diff line Loading @@ -204,6 +204,32 @@ class AutoLayoutCommand(QUndoCommand): item.setLetterSpacing(item.letter_spacing, force=True) class ResetAngleCommand(QUndoCommand): def __init__(self, blkitem_lst: List[TextBlkItem], ctrl: TextBlkShapeControl): super(ResetAngleCommand, self).__init__() self.blkitem_lst = blkitem_lst self.angle_lst = [] self.ctrl = ctrl blkitem_lst = [] for blk in self.blkitem_lst: rotation = blk.rotation() if rotation != 0: self.angle_lst.append(rotation) blkitem_lst.append(blk) self.blkitem_lst = blkitem_lst def redo(self): for blk in self.blkitem_lst: blk.setAngle(0) if self.ctrl.blk_item == blk: self.ctrl.setAngle(0) def undo(self): for blk, angle in zip(self.blkitem_lst, self.angle_lst): blk.setAngle(angle) if self.ctrl.blk_item == blk: self.ctrl.setAngle(angle) class TextItemEditCommand(QUndoCommand): def __init__(self, blkitem: TextBlkItem, trans_edit: TransTextEdit, num_steps: int): super(TextItemEditCommand, self).__init__() Loading