Loading ballontranslator/ui/canvas.py +8 −6 Original line number Diff line number Diff line import numpy as np from PyQt5.QtWidgets import QMenu, QGraphicsPathItem, QGraphicsScene, QGraphicsView, QGraphicsRectItem, QGraphicsItem, QWidget, QGraphicsSceneHoverEvent, QLabel, QSizePolicy, QScrollBar, QListView, QGraphicsSceneWheelEvent, QGraphicsTextItem, QGraphicsPixmapItem, QStyle, QGraphicsSceneMouseEvent, QGraphicsSceneContextMenuEvent, QUndoGroup, QUndoStack, QUndoView from PyQt5.QtWidgets import QMenu, QGraphicsScene, QGraphicsView, QGraphicsRectItem, QGraphicsItem, QScrollBar, QGraphicsPixmapItem, QGraphicsSceneMouseEvent, QGraphicsSceneContextMenuEvent, QUndoStack from PyQt5.QtCore import Qt, QRect, QRectF, QPointF, QPoint, pyqtSignal, QSizeF, QObject, QEvent from PyQt5.QtGui import QPixmap, QHideEvent, QMouseEvent, QKeyEvent, QWheelEvent, QResizeEvent, QKeySequence, QPainter, QTextFrame, QTransform, QTextBlock, QAbstractTextDocumentLayout, QTextLayout, QFont, QFontMetrics, QTextOption, QFocusEvent, QPen, QColor, QTextFormat, QPainterPath from PyQt5.QtGui import QPixmap, QHideEvent, QKeyEvent, QWheelEvent, QResizeEvent, QKeySequence, QPainter, QPen from typing import List, Union, Tuple from .misc import ndarray2pixmap, pixmap2ndarray, qrgb2bgr, ProjImgTrans Loading Loading @@ -69,9 +68,10 @@ class Canvas(QGraphicsScene): scalefactor_changed = pyqtSignal() end_create_textblock = pyqtSignal(QRectF) end_create_rect = pyqtSignal(QRectF, int) delete_textblks = pyqtSignal() finish_painting = pyqtSignal(StrokeItem) finish_erasing = pyqtSignal(StrokeItem) delete_textblks = pyqtSignal() format_textblks = pyqtSignal() begin_scale_tool = pyqtSignal(QPointF) scale_tool = pyqtSignal(QPointF) Loading Loading @@ -133,7 +133,6 @@ class Canvas(QGraphicsScene): self.drawingLayer = QGraphicsPixmapItem() self.drawingLayer.setTransformationMode(Qt.TransformationMode.SmoothTransformation) # self.addItem(self.imgLayer) self.addItem(self.baseLayer) self.inpaintLayer.setParentItem(self.baseLayer) self.imgLayer.setParentItem(self.baseLayer) Loading Loading @@ -198,7 +197,6 @@ class Canvas(QGraphicsScene): sbr = self.imgLayer.sceneBoundingRect() self.old_size = sbr.size() self.scale_factor = s_f # self.imgLayer.setScale(self.scale_factor) self.baseLayer.setScale(self.scale_factor) self.adjustScrollBar(self.gv.horizontalScrollBar(), factor) Loading Loading @@ -328,6 +326,7 @@ class Canvas(QGraphicsScene): return super().mouseReleaseEvent(event) def updateCanvas(self): self.clearSelection() self.setProjSaveState(False) self.editing_textblkitem = None self.hovering_textblkitem = None Loading Loading @@ -384,9 +383,12 @@ class Canvas(QGraphicsScene): if self.hovering_textblkitem or self.editing_textblkitem: menu = QMenu() delete_act = menu.addAction(self.tr("Delete")) format_act = menu.addAction(self.tr("Apply font formatting")) rst = menu.exec_(event.screenPos()) if rst == delete_act: self.delete_textblks.emit() elif rst == format_act: self.format_textblks.emit() def on_hide_canvas(self): self.alt_pressed = False Loading ballontranslator/ui/fontformatpanel.py +14 −10 Original line number Diff line number Diff line Loading @@ -47,7 +47,6 @@ def set_textblk_color(blkitem: TextBlkItem, cursor: QTextCursor, rgb: List): fmt.setForeground(QColor(*rgb)) cursor.setCharFormat(fmt) @restore_textcursor def set_textblk_fontsize(blkitem: TextBlkItem, cursor: QTextCursor, fontsize): format = QTextCharFormat() Loading Loading @@ -161,7 +160,6 @@ class AlignmentBtnGroup(QFrame): self.alignLeftChecker.setChecked(False) self.alignRightChecker.setChecked(False) self.set_alignment.emit(1) # btn.setChecked(True) def setAlignment(self, alignment: int): if alignment == 0: Loading Loading @@ -273,11 +271,15 @@ class FontSizeBox(QFrame): return active class FontFormatPanel(Widget): textblk_item: TextBlkItem = None text_cursor: QTextCursor = None active_format: FontFormat = None global_format: FontFormat = None restoring_textblk: bool = False global_format_changed = pyqtSignal() def __init__(self, app: QApplication, *args, **kwargs) -> None: super().__init__(*args, **kwargs) self.app = app Loading Loading @@ -358,6 +360,9 @@ class FontFormatPanel(Widget): self.active_format = self.global_format def restoreTextBlkItem(self): if self.active_format == self.global_format: self.global_format_changed.emit() else: blkitem = self.textblk_item self.restoring_textblk = True if blkitem: Loading @@ -365,7 +370,6 @@ class FontFormatPanel(Widget): blkitem.setTextCursor(self.text_cursor) blkitem.scene().gv.setFocus(True) self.restoring_textblk = False return blkitem def changingColor(self): self.focusOnColorDialog = True Loading ballontranslator/ui/scenetext_manager.py +52 −12 Original line number Diff line number Diff line Loading @@ -9,7 +9,7 @@ from .imgtranspanel import TransPairWidget from .textitem import TextBlkItem, TextBlock, xywh2xyxypoly, rotate_polygons from .canvas import Canvas from .imgtranspanel import TextPanel, TextEditListScrollArea, SourceTextEdit, TransTextEdit from .texteditshapecontrol import TextBlkShapeControl from .misc import FontFormat class MoveBlkItemsCommand(QUndoCommand): Loading Loading @@ -37,6 +37,32 @@ class MoveBlkItemsCommand(QUndoCommand): return False class ApplyFontformatCommand(QUndoCommand): def __init__(self, items: List[TextBlkItem], fontformat: FontFormat): super(ApplyFontformatCommand, self).__init__() self.items = items self.old_html_lst = [] self.old_fmt_lst = [] self.new_fmt = fontformat for item in items: self.old_html_lst.append(item.toHtml()) self.old_fmt_lst.append(item.get_fontformat()) def redo(self): for item in self.items: item.set_fontformat(self.new_fmt, set_char_format=True) def undo(self): for item, html, fmt in zip(self.items, self.old_html_lst, self.old_fmt_lst): item.setHtml(html) item.set_fontformat(fmt) def mergeWith(self, command: QUndoCommand): if command.new_fmt == self.new_fmt: return True return False class ReshapeItemCommand(QUndoCommand): def __init__(self, item: TextBlkItem, parent=None): super(ReshapeItemCommand, self).__init__(parent) Loading Loading @@ -163,12 +189,14 @@ class SceneTextManager(QObject): self.canvas.scalefactor_changed.connect(self.adjustSceneTextRect) self.canvas.end_create_textblock.connect(self.onEndCreateTextBlock) self.canvas.delete_textblks.connect(self.onDeleteBlkItems) self.canvas.format_textblks.connect(self.onFormatTextblks) self.canvasUndoStack = self.canvas.undoStack self.txtblkShapeControl = canvas.txtblkShapeControl self.textpanel = textpanel self.textEditList = textpanel.textEditList self.formatpanel = textpanel.formatpanel self.formatpanel.global_format_changed.connect(self.onGlobalFormatChanged) self.imgtrans_proj = self.canvas.imgtrans_proj self.textblk_item_list: List[TextBlkItem] = [] Loading Loading @@ -344,11 +372,7 @@ class SceneTextManager(QObject): self.txtblkShapeControl.updateBoundingRect() def onTextBlkItemMoved(self): selections = self.canvas.selectedItems() selected_blks = [] for selection in selections: if isinstance(selection, TextBlkItem): selected_blks.append(selection) selected_blks = self.get_selected_blkitems() if len(selected_blks) > 0: self.canvasUndoStack.push(MoveBlkItemsCommand(selected_blks, self)) Loading @@ -361,14 +385,13 @@ class SceneTextManager(QObject): self.canvasUndoStack.push(RotateItemCommand(blk_item, new_angle)) def onDeleteBlkItems(self): selections = self.canvas.selectedItems() selected_blks = [] for selection in selections: if isinstance(selection, TextBlkItem): selected_blks.append(selection) selected_blks = self.get_selected_blkitems() if len(selected_blks) > 0: self.canvasUndoStack.push(DeleteBlkItemsCommand(selected_blks, self)) def onFormatTextblks(self): self.apply_fontformat(self.formatpanel.global_format) def onEndCreateTextBlock(self, rect: QRectF): scale_f = self.canvas.scale_factor if rect.width() > 1 and rect.height() > 1: Loading Loading @@ -398,9 +421,24 @@ class SceneTextManager(QObject): blk_item.setPlainText(text) self.canvas.setProjSaveState(True) def onGlobalFormatChanged(self): self.apply_fontformat(self.formatpanel.global_format) def apply_fontformat(self, fontformat: FontFormat): selected_blks = self.get_selected_blkitems() if len(selected_blks) > 0: self.canvasUndoStack.push(ApplyFontformatCommand(selected_blks, fontformat)) def get_selected_blkitems(self) -> List[TextBlkItem]: selections = self.canvas.selectedItems() selected_blks = [] for selection in selections: if isinstance(selection, TextBlkItem): selected_blks.append(selection) return selected_blks def on_srcwidget_edited(self): self.canvas.setProjSaveState(True) pass def updateTextBlkItemIdx(self): for ii, blk_item in enumerate(self.textblk_item_list): Loading Loading @@ -439,3 +477,5 @@ class SceneTextManager(QObject): for blk_item in self.textblk_item_list: blk_item.draw_rect = draw_rect blk_item.update() ballontranslator/ui/textitem.py +2 −1 Original line number Diff line number Diff line Loading @@ -482,6 +482,7 @@ class TextBlkItem(QGraphicsTextItem): def set_fontformat(self, ffmat: FontFormat, set_char_format=False): if self.is_vertical != ffmat.vertical: self.setVertical(ffmat.vertical) cursor = self.textCursor() cursor.movePosition(QTextCursor.Start) Loading Loading
ballontranslator/ui/canvas.py +8 −6 Original line number Diff line number Diff line import numpy as np from PyQt5.QtWidgets import QMenu, QGraphicsPathItem, QGraphicsScene, QGraphicsView, QGraphicsRectItem, QGraphicsItem, QWidget, QGraphicsSceneHoverEvent, QLabel, QSizePolicy, QScrollBar, QListView, QGraphicsSceneWheelEvent, QGraphicsTextItem, QGraphicsPixmapItem, QStyle, QGraphicsSceneMouseEvent, QGraphicsSceneContextMenuEvent, QUndoGroup, QUndoStack, QUndoView from PyQt5.QtWidgets import QMenu, QGraphicsScene, QGraphicsView, QGraphicsRectItem, QGraphicsItem, QScrollBar, QGraphicsPixmapItem, QGraphicsSceneMouseEvent, QGraphicsSceneContextMenuEvent, QUndoStack from PyQt5.QtCore import Qt, QRect, QRectF, QPointF, QPoint, pyqtSignal, QSizeF, QObject, QEvent from PyQt5.QtGui import QPixmap, QHideEvent, QMouseEvent, QKeyEvent, QWheelEvent, QResizeEvent, QKeySequence, QPainter, QTextFrame, QTransform, QTextBlock, QAbstractTextDocumentLayout, QTextLayout, QFont, QFontMetrics, QTextOption, QFocusEvent, QPen, QColor, QTextFormat, QPainterPath from PyQt5.QtGui import QPixmap, QHideEvent, QKeyEvent, QWheelEvent, QResizeEvent, QKeySequence, QPainter, QPen from typing import List, Union, Tuple from .misc import ndarray2pixmap, pixmap2ndarray, qrgb2bgr, ProjImgTrans Loading Loading @@ -69,9 +68,10 @@ class Canvas(QGraphicsScene): scalefactor_changed = pyqtSignal() end_create_textblock = pyqtSignal(QRectF) end_create_rect = pyqtSignal(QRectF, int) delete_textblks = pyqtSignal() finish_painting = pyqtSignal(StrokeItem) finish_erasing = pyqtSignal(StrokeItem) delete_textblks = pyqtSignal() format_textblks = pyqtSignal() begin_scale_tool = pyqtSignal(QPointF) scale_tool = pyqtSignal(QPointF) Loading Loading @@ -133,7 +133,6 @@ class Canvas(QGraphicsScene): self.drawingLayer = QGraphicsPixmapItem() self.drawingLayer.setTransformationMode(Qt.TransformationMode.SmoothTransformation) # self.addItem(self.imgLayer) self.addItem(self.baseLayer) self.inpaintLayer.setParentItem(self.baseLayer) self.imgLayer.setParentItem(self.baseLayer) Loading Loading @@ -198,7 +197,6 @@ class Canvas(QGraphicsScene): sbr = self.imgLayer.sceneBoundingRect() self.old_size = sbr.size() self.scale_factor = s_f # self.imgLayer.setScale(self.scale_factor) self.baseLayer.setScale(self.scale_factor) self.adjustScrollBar(self.gv.horizontalScrollBar(), factor) Loading Loading @@ -328,6 +326,7 @@ class Canvas(QGraphicsScene): return super().mouseReleaseEvent(event) def updateCanvas(self): self.clearSelection() self.setProjSaveState(False) self.editing_textblkitem = None self.hovering_textblkitem = None Loading Loading @@ -384,9 +383,12 @@ class Canvas(QGraphicsScene): if self.hovering_textblkitem or self.editing_textblkitem: menu = QMenu() delete_act = menu.addAction(self.tr("Delete")) format_act = menu.addAction(self.tr("Apply font formatting")) rst = menu.exec_(event.screenPos()) if rst == delete_act: self.delete_textblks.emit() elif rst == format_act: self.format_textblks.emit() def on_hide_canvas(self): self.alt_pressed = False Loading
ballontranslator/ui/fontformatpanel.py +14 −10 Original line number Diff line number Diff line Loading @@ -47,7 +47,6 @@ def set_textblk_color(blkitem: TextBlkItem, cursor: QTextCursor, rgb: List): fmt.setForeground(QColor(*rgb)) cursor.setCharFormat(fmt) @restore_textcursor def set_textblk_fontsize(blkitem: TextBlkItem, cursor: QTextCursor, fontsize): format = QTextCharFormat() Loading Loading @@ -161,7 +160,6 @@ class AlignmentBtnGroup(QFrame): self.alignLeftChecker.setChecked(False) self.alignRightChecker.setChecked(False) self.set_alignment.emit(1) # btn.setChecked(True) def setAlignment(self, alignment: int): if alignment == 0: Loading Loading @@ -273,11 +271,15 @@ class FontSizeBox(QFrame): return active class FontFormatPanel(Widget): textblk_item: TextBlkItem = None text_cursor: QTextCursor = None active_format: FontFormat = None global_format: FontFormat = None restoring_textblk: bool = False global_format_changed = pyqtSignal() def __init__(self, app: QApplication, *args, **kwargs) -> None: super().__init__(*args, **kwargs) self.app = app Loading Loading @@ -358,6 +360,9 @@ class FontFormatPanel(Widget): self.active_format = self.global_format def restoreTextBlkItem(self): if self.active_format == self.global_format: self.global_format_changed.emit() else: blkitem = self.textblk_item self.restoring_textblk = True if blkitem: Loading @@ -365,7 +370,6 @@ class FontFormatPanel(Widget): blkitem.setTextCursor(self.text_cursor) blkitem.scene().gv.setFocus(True) self.restoring_textblk = False return blkitem def changingColor(self): self.focusOnColorDialog = True Loading
ballontranslator/ui/scenetext_manager.py +52 −12 Original line number Diff line number Diff line Loading @@ -9,7 +9,7 @@ from .imgtranspanel import TransPairWidget from .textitem import TextBlkItem, TextBlock, xywh2xyxypoly, rotate_polygons from .canvas import Canvas from .imgtranspanel import TextPanel, TextEditListScrollArea, SourceTextEdit, TransTextEdit from .texteditshapecontrol import TextBlkShapeControl from .misc import FontFormat class MoveBlkItemsCommand(QUndoCommand): Loading Loading @@ -37,6 +37,32 @@ class MoveBlkItemsCommand(QUndoCommand): return False class ApplyFontformatCommand(QUndoCommand): def __init__(self, items: List[TextBlkItem], fontformat: FontFormat): super(ApplyFontformatCommand, self).__init__() self.items = items self.old_html_lst = [] self.old_fmt_lst = [] self.new_fmt = fontformat for item in items: self.old_html_lst.append(item.toHtml()) self.old_fmt_lst.append(item.get_fontformat()) def redo(self): for item in self.items: item.set_fontformat(self.new_fmt, set_char_format=True) def undo(self): for item, html, fmt in zip(self.items, self.old_html_lst, self.old_fmt_lst): item.setHtml(html) item.set_fontformat(fmt) def mergeWith(self, command: QUndoCommand): if command.new_fmt == self.new_fmt: return True return False class ReshapeItemCommand(QUndoCommand): def __init__(self, item: TextBlkItem, parent=None): super(ReshapeItemCommand, self).__init__(parent) Loading Loading @@ -163,12 +189,14 @@ class SceneTextManager(QObject): self.canvas.scalefactor_changed.connect(self.adjustSceneTextRect) self.canvas.end_create_textblock.connect(self.onEndCreateTextBlock) self.canvas.delete_textblks.connect(self.onDeleteBlkItems) self.canvas.format_textblks.connect(self.onFormatTextblks) self.canvasUndoStack = self.canvas.undoStack self.txtblkShapeControl = canvas.txtblkShapeControl self.textpanel = textpanel self.textEditList = textpanel.textEditList self.formatpanel = textpanel.formatpanel self.formatpanel.global_format_changed.connect(self.onGlobalFormatChanged) self.imgtrans_proj = self.canvas.imgtrans_proj self.textblk_item_list: List[TextBlkItem] = [] Loading Loading @@ -344,11 +372,7 @@ class SceneTextManager(QObject): self.txtblkShapeControl.updateBoundingRect() def onTextBlkItemMoved(self): selections = self.canvas.selectedItems() selected_blks = [] for selection in selections: if isinstance(selection, TextBlkItem): selected_blks.append(selection) selected_blks = self.get_selected_blkitems() if len(selected_blks) > 0: self.canvasUndoStack.push(MoveBlkItemsCommand(selected_blks, self)) Loading @@ -361,14 +385,13 @@ class SceneTextManager(QObject): self.canvasUndoStack.push(RotateItemCommand(blk_item, new_angle)) def onDeleteBlkItems(self): selections = self.canvas.selectedItems() selected_blks = [] for selection in selections: if isinstance(selection, TextBlkItem): selected_blks.append(selection) selected_blks = self.get_selected_blkitems() if len(selected_blks) > 0: self.canvasUndoStack.push(DeleteBlkItemsCommand(selected_blks, self)) def onFormatTextblks(self): self.apply_fontformat(self.formatpanel.global_format) def onEndCreateTextBlock(self, rect: QRectF): scale_f = self.canvas.scale_factor if rect.width() > 1 and rect.height() > 1: Loading Loading @@ -398,9 +421,24 @@ class SceneTextManager(QObject): blk_item.setPlainText(text) self.canvas.setProjSaveState(True) def onGlobalFormatChanged(self): self.apply_fontformat(self.formatpanel.global_format) def apply_fontformat(self, fontformat: FontFormat): selected_blks = self.get_selected_blkitems() if len(selected_blks) > 0: self.canvasUndoStack.push(ApplyFontformatCommand(selected_blks, fontformat)) def get_selected_blkitems(self) -> List[TextBlkItem]: selections = self.canvas.selectedItems() selected_blks = [] for selection in selections: if isinstance(selection, TextBlkItem): selected_blks.append(selection) return selected_blks def on_srcwidget_edited(self): self.canvas.setProjSaveState(True) pass def updateTextBlkItemIdx(self): for ii, blk_item in enumerate(self.textblk_item_list): Loading Loading @@ -439,3 +477,5 @@ class SceneTextManager(QObject): for blk_item in self.textblk_item_list: blk_item.draw_rect = draw_rect blk_item.update()
ballontranslator/ui/textitem.py +2 −1 Original line number Diff line number Diff line Loading @@ -482,6 +482,7 @@ class TextBlkItem(QGraphicsTextItem): def set_fontformat(self, ffmat: FontFormat, set_char_format=False): if self.is_vertical != ffmat.vertical: self.setVertical(ffmat.vertical) cursor = self.textCursor() cursor.movePosition(QTextCursor.Start) Loading