Commit 26f6d2e0 authored by dmMaze's avatar dmMaze
Browse files

add context menu to textpanel (#185) and fix delete/restore textblock indexing

parent 5c908e5f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@ class BaseModule:

    def updateParam(self, param_key: str, param_content):
        self_param_content = self.params[param_key]
        if isinstance(self_param_content, str) or isinstance(self_param_content, float) or isinstance(self_param_content, int):
        if isinstance(self_param_content, (str, float, int)):
            self.params[param_key] = param_content
        else:
            param_dict = self.params[param_key]
+5 −4
Original line number Diff line number Diff line
@@ -170,7 +170,7 @@ class Canvas(QGraphicsScene):
    textstack_changed = Signal()
    drop_open_folder = Signal(str)

    context_menu_requested = Signal(QPoint)
    context_menu_requested = Signal(QPoint, bool)

    def __init__(self, parent=None):
        super().__init__(parent)
@@ -194,7 +194,7 @@ class Canvas(QGraphicsScene):
        self.gv.setAcceptDrops(True)

        self.gv.setContextMenuPolicy(Qt.ContextMenuPolicy.NoContextMenu)
        self.context_menu_requested.connect(self.createCustomContextMenu)
        self.context_menu_requested.connect(self.on_create_contextmenu)
        
        if not C.FLAG_QT6:
            # mitigate https://bugreports.qt.io/browse/QTBUG-93417
@@ -576,7 +576,7 @@ class Canvas(QGraphicsScene):
            if self.stroke_img_item is not None:
                self.finish_erasing.emit(self.stroke_img_item)
            if self.textEditMode():
                self.context_menu_requested.emit(event.screenPos())
                self.context_menu_requested.emit(event.screenPos(), False)
        elif btn == Qt.MouseButton.LeftButton:
            if self.stroke_img_item is not None:
                self.finish_painting.emit(self.stroke_img_item)
@@ -651,7 +651,7 @@ class Canvas(QGraphicsScene):
    def setTextBlockMode(self, mode: bool):
        self.textblock_mode = mode

    def createCustomContextMenu(self, pos: QPoint):
    def on_create_contextmenu(self, pos: QPoint, is_textpanel: bool):
        if self.textEditMode() and not self.creating_textblock:
            menu = QMenu(self.gv)
            copy_act = menu.addAction(self.tr("Copy"))
@@ -666,6 +666,7 @@ class Canvas(QGraphicsScene):
            paste_src_act.setShortcut(QKeySequence("Ctrl+Shift+V"))
            delete_recover_act = menu.addAction(self.tr("Delete and Recover removed text"))
            delete_recover_act.setShortcut(QKeySequence("Ctrl+Shift+D"))

            menu.addSeparator()

            format_act = menu.addAction(self.tr("Apply font formatting"))
+15 −5
Original line number Diff line number Diff line
@@ -76,6 +76,8 @@ class DeleteBlkItemsCommand(QUndoCommand):
        self.old_counter_sum = self.sw.counter_sum
        self.sw_changed = False

        blk_list.sort(key=lambda blk: blk.idx)
        
        for blkitem in blk_list:
            if not isinstance(blkitem, TextBlkItem):
                continue
@@ -252,6 +254,7 @@ class PasteBlkItemsCommand(QUndoCommand):
        super().__init__(parent)
        self.op_counter = 0
        self.blk_list = blk_list
        blk_list.sort(key=lambda blk: blk.idx)
        for blkitem in blk_list:
            blkitem.setSelected(True)
        self.pwidget_list = pwidget_list
@@ -354,8 +357,9 @@ class SceneTextManager(QObject):
        self.canvas.reset_angle.connect(self.onResetAngle)
        self.txtblkShapeControl = canvas.txtblkShapeControl
        self.textpanel = textpanel

        self.textEditList = textpanel.textEditList
        self.textEditList.focus_out.connect(self.on_textedit_focusout)
        self.textEditList.textpanel_contextmenu_requested.connect(canvas.on_create_contextmenu)
        self.textEditList.selection_changed.connect(self.on_transwidget_selection_changed)
        self.textEditList.rearrange_blks.connect(self.on_rearrange_blks)
        self.formatpanel = textpanel.formatpanel
@@ -486,17 +490,17 @@ class SceneTextManager(QObject):
        self.txtblkShapeControl.setBlkItem(None)

    def recoverTextblkItem(self, blkitem: TextBlkItem, p_widget: TransPairWidget):
        self.textblk_item_list.append(blkitem)
        self.textblk_item_list.insert(blkitem.idx, blkitem)
        blkitem.setParentItem(self.canvas.textLayer)
        self.pairwidget_list.append(p_widget)
        self.pairwidget_list.insert(p_widget.idx, p_widget)
        self.textEditList.insertPairWidget(p_widget, p_widget.idx)
        self.updateTextBlkItemIdx()

    def recoverTextblkItemList(self, blkitem_list: List[TextBlkItem], p_widget_list: List[TransPairWidget]):
        for blkitem, p_widget in zip(blkitem_list, p_widget_list):
            self.textblk_item_list.append(blkitem)
            self.textblk_item_list.insert(blkitem.idx, blkitem)
            blkitem.setParentItem(self.canvas.textLayer)
            self.pairwidget_list.append(p_widget)
            self.pairwidget_list.insert(p_widget.idx, p_widget)
            self.textEditList.insertPairWidget(p_widget, p_widget.idx)
            if self.txtblkShapeControl.blk_item is not None and blkitem.isSelected():
                blkitem.setSelected(False)
@@ -984,6 +988,12 @@ class SceneTextManager(QObject):
        for idx in selset:
            self.textblk_item_list[idx].setSelected(True)

    def on_textedit_focusout(self):
        fw = self.app.focusWidget()
        if fw == self.canvas.gv or isinstance(fw, (SourceTextEdit, TransTextEdit)):
            self.textEditList.clearDrag()
            self.textEditList.clearAllSelected()

    def on_rearrange_blks(self, mv_map: Tuple[np.ndarray]):
        self.canvas.push_undo_command(RearrangeBlksCommand(mv_map, self))
        pass
+21 −9
Original line number Diff line number Diff line
from typing import List, Union
from PyQt6 import QtGui

from qtpy.QtWidgets import QTextEdit, QScrollArea, QGraphicsDropShadowEffect, QVBoxLayout, QApplication, QHBoxLayout 
from qtpy.QtWidgets import QMenu, QTextEdit, QScrollArea, QGraphicsDropShadowEffect, QVBoxLayout, QApplication, QHBoxLayout
from qtpy.QtCore import Signal, Qt, QMimeData, QEvent, QPoint
from qtpy.QtGui import QColor, QFocusEvent, QInputMethodEvent, QDragEnterEvent, QDragMoveEvent, QDropEvent, QKeyEvent, QTextCursor, QMouseEvent, QDrag, QPixmap
from qtpy.QtGui import QColor, QFocusEvent, QInputMethodEvent, QDragEnterEvent, QDragMoveEvent, QDropEvent, QKeyEvent, QTextCursor, QMouseEvent, QDrag, QPixmap, QKeySequence
import keyboard

from .stylewidgets import Widget, SeparatorWidget, ClickableLabel, IgnoreMouseLabel
@@ -12,6 +11,12 @@ from .config import pcfg
import webbrowser
import numpy as np


STYLE_TRANSPAIR_CHECKED = "background-color: rgba(30, 147, 229, 20%);"
STYLE_TRANSPAIR_BOTTOM = "border-width: 5px; border-bottom-style: solid; border-color: rgb(30, 147, 229);"
STYLE_TRANSPAIR_TOP = "border-width: 5px; border-top-style: solid; border-color: rgb(30, 147, 229);"


class SelectTextMiniMenu(Widget):

    block_current_editor = Signal(bool)
@@ -297,9 +302,6 @@ class SourceTextEdit(QTextEdit):
class TransTextEdit(SourceTextEdit):
    pass

STYLE_TRANSPAIR_CHECKED = "background-color: rgba(30, 147, 229, 20%);"
STYLE_TRANSPAIR_BOTTOM = "border-width: 5px; border-bottom-style: solid; border-color: rgb(30, 147, 229);"
STYLE_TRANSPAIR_TOP = "border-width: 5px; border-top-style: solid; border-color: rgb(30, 147, 229);"



@@ -383,6 +385,7 @@ class TransPairWidget(Widget):
            self.e_source.idx = idx
            self.e_trans.idx = idx


class TextEditListScrollArea(QScrollArea):

    textblock_list: List[TextBlock] = []
@@ -390,6 +393,8 @@ class TextEditListScrollArea(QScrollArea):
    remove_textblock = Signal()
    selection_changed = Signal()   # this signal could only emit in on_widget_checkstate_changed, i.e. via user op
    rearrange_blks = Signal(object)
    textpanel_contextmenu_requested = Signal(QPoint, bool)
    focus_out = Signal()

    def __init__(self, *args, **kwargs) -> None:
        super().__init__(*args, **kwargs)
@@ -413,6 +418,14 @@ class TextEditListScrollArea(QScrollArea):
        self.drag_to_pos: int = -1
        self.setAcceptDrops(True)

        self.setContextMenuPolicy(Qt.ContextMenuPolicy.NoContextMenu)

    def mouseReleaseEvent(self, e: QMouseEvent):
        if e.button() == Qt.MouseButton.RightButton:
            pos = self.mapToGlobal(e.position()).toPoint()
            self.textpanel_contextmenu_requested.emit(pos, True)
        super().mouseReleaseEvent(e)

    def mouseMoveEvent(self, e: QMouseEvent) -> None:
        if self.drag is None and self.sel_anchor_widget is not None:
            w = self.sel_anchor_widget
@@ -589,9 +602,8 @@ class TextEditListScrollArea(QScrollArea):
        self.vlayout.removeWidget(widget)
    
    def focusOutEvent(self, e: QFocusEvent) -> None:
        self.clearDrag()
        self.clearAllSelected()
        return super().focusOutEvent(e)
        self.focus_out.emit()
        super().focusOutEvent(e)
    
    def setFoldTextarea(self, fold: bool):
        for pw in self.pairwidget_list: