Commit cbd22b5a authored by dmMaze's avatar dmMaze
Browse files

support multiple textitems formatting

parent bf261d3e
Loading
Loading
Loading
Loading
+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
@@ -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)
@@ -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)
@@ -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)
@@ -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
@@ -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
+14 −10
Original line number Diff line number Diff line
@@ -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()
@@ -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:
@@ -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
@@ -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:
@@ -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
+52 −12
Original line number Diff line number Diff line
@@ -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):
@@ -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)
@@ -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] = []
@@ -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))
        
@@ -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:
@@ -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):
@@ -439,3 +477,5 @@ class SceneTextManager(QObject):
        for blk_item in self.textblk_item_list:
            blk_item.draw_rect = draw_rect
            blk_item.update()

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