Commit b77c8846 authored by dmMaze's avatar dmMaze
Browse files

fix sync issues for text editing #742 #76 #313 #647 #654

parent d0700f78
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -313,6 +313,7 @@ class TextPanel(Widget):
        layout.setSpacing(7)
        layout.setAlignment(Qt.AlignmentFlag.AlignCenter)


class SceneTextManager(QObject):
    new_textblk = Signal(int)
    def __init__(self, 
@@ -1013,18 +1014,18 @@ class SceneTextManager(QObject):
        blkitem = self.textblk_item_list[edit.idx] if is_trans else None
        self.canvas.push_undo_command(TextEditCommand(edit, num_steps, blkitem), update_pushed_step=not is_trans)

    def on_propagate_textitem_edit(self, pos: int, added_text: str, input_method_used: bool):
    def on_propagate_textitem_edit(self, pos: int, added_text: str, joint_previous: bool):
        blk_item: TextBlkItem = self.sender()
        edit = self.pairwidget_list[blk_item.idx].e_trans
        propagate_user_edit(blk_item, edit, pos, added_text, input_method_used)
        propagate_user_edit(blk_item, edit, pos, added_text, joint_previous)
        self.canvas.push_text_command(command=None, update_pushed_step=True)

    def on_propagate_transwidget_edit(self, pos: int, added_text: str, input_method_used: bool):
    def on_propagate_transwidget_edit(self, pos: int, added_text: str, joint_previous: bool):
        edit: TransTextEdit = self.sender()
        blk_item = self.textblk_item_list[edit.idx]
        if blk_item.isEditing():
            blk_item.setTextInteractionFlags(Qt.TextInteractionFlag.NoTextInteraction)
        propagate_user_edit(edit, blk_item, pos, added_text, input_method_used)
        propagate_user_edit(edit, blk_item, pos, added_text, joint_previous)
        self.canvas.push_text_command(command=None, update_pushed_step=True)

    def apply_fontformat(self, fontformat: FontFormat):
+5 −4
Original line number Diff line number Diff line
@@ -156,7 +156,7 @@ class SourceTextEdit(QTextEdit):
            self.text_content_changed = True
            if self.hasFocus():
                self.change_from = from_
                self.change_added = added - removed
                self.change_added = added

    def adjustSize(self):
        h = self.document().documentLayout().documentSize().toSize().height()
@@ -176,7 +176,6 @@ class SourceTextEdit(QTextEdit):
            
            change_from = self.change_from
            added_text = ''
            input_method_used = False
            
            if self.paste_flag:
                self.paste_flag = False
@@ -189,7 +188,6 @@ class SourceTextEdit(QTextEdit):
                if self.input_method_from != -1:
                    added_text = self.input_method_text
                    change_from = self.input_method_from
                    input_method_used = True
                    self.input_method_from = -1
                elif self.change_added > 0:
                    cursor = self.textCursor()
@@ -197,9 +195,12 @@ class SourceTextEdit(QTextEdit):
                    cursor.setPosition(change_from + self.change_added, QTextCursor.MoveMode.KeepAnchor) 
                    added_text = cursor.selectedText()

            self.propagate_user_edited.emit(change_from, added_text, input_method_used)
            undo_steps = self.document().availableUndoSteps()
            new_steps = undo_steps - self.old_undo_steps
            joint_previous = new_steps == 0
            self.propagate_user_edited.emit(change_from, added_text, joint_previous)
            self.change_added = 0

            if new_steps > 0:
                self.old_undo_steps = undo_steps
                self.push_undo_stack.emit(new_steps)
+14 −32
Original line number Diff line number Diff line
@@ -18,34 +18,21 @@ from .config_proj import ProjImgTrans
from .scene_textlayout import PUNSET_HALF


def propagate_user_edit(src_edit: Union[TransTextEdit, TextBlkItem], target_edit: Union[TransTextEdit, TextBlkItem], pos: int, added_text: str, input_method_used: bool):

def propagate_user_edit(src_edit: Union[TransTextEdit, TextBlkItem], target_edit: Union[TransTextEdit, TextBlkItem], pos: int, added_text: str, joint_previous: bool = False):
    ori_count = target_edit.document().characterCount()
    new_count = src_edit.document().characterCount()
    removed = ori_count + len(added_text) - new_count

    new_editblock = False
    if input_method_used or added_text not in PUNSET_HALF:
        new_editblock = True

    cursor = target_edit.textCursor()
    if len(added_text) > 0:
    cursor.setPosition(pos)
    if joint_previous:
        cursor.joinPreviousEditBlock()
    else:
        cursor.beginEditBlock()
    if removed > 0:
        cursor.setPosition(pos + removed, QTextCursor.MoveMode.KeepAnchor)
        if new_editblock:
            cursor.beginEditBlock()
    cursor.insertText(added_text)
        if new_editblock:
    cursor.endEditBlock()
    elif removed > 0:
        if removed == 1:
            cursor.setPosition(pos + removed - 1)
            cursor.deleteChar()
        else:
            cursor.setPosition(pos)
            cursor.setPosition(pos + removed, QTextCursor.MoveMode.KeepAnchor)
            cursor.removeSelectedText()
    target_edit.old_undo_steps = target_edit.document().availableUndoSteps()


@@ -277,7 +264,6 @@ class TextItemEditCommand(QUndoCommand):
            return
        
        self.blkitem.repaint_on_changed = False
        for _ in range(self.num_steps):
        self.blkitem.redo()
        self.blkitem.repaint_on_changed = True
        if self.num_steps > 0:
@@ -292,7 +278,6 @@ class TextItemEditCommand(QUndoCommand):

    def undo(self):
        self.blkitem.repaint_on_changed = False
        for _ in range(self.num_steps):
        self.blkitem.undo()
        self.blkitem.repaint_on_changed = True
        if self.num_steps > 0:
@@ -319,14 +304,11 @@ class TextEditCommand(QUndoCommand):
        if self.op_counter == 0:
            self.op_counter += 1
            return

        for _ in range(self.num_steps):
        self.edit.redo()
        if self.blkitem is not None:
            self.blkitem.redo()

    def undo(self):
        for _ in range(self.num_steps):
        self.edit.undo()
        if self.blkitem is not None:
            self.blkitem.undo()
+9 −10
Original line number Diff line number Diff line
@@ -91,30 +91,27 @@ class TextBlkItem(QGraphicsTextItem):
        if (self.hasFocus() or self.is_formatting) and not self.pre_editing and not self.block_change_signal:   
            # self.content_changed.emit(self)
            if not self.in_redo_undo:
                undo_steps = self.document().availableUndoSteps()
                new_steps = undo_steps - self.old_undo_steps
                joint_previous = new_steps == 0

                if not self.is_formatting:
                    change_from = self.change_from
                    added_text = ''
                    input_method_used = False
                    if self.input_method_from != -1:
                        added_text = self.input_method_text
                        change_from = self.input_method_from
                        input_method_used = True
            
                        self.input_method_from = -1

                    elif self.change_added > 0:
                        cursor = self.textCursor()
                        cursor.setPosition(change_from)
                        cursor.setPosition(change_from + self.change_added, QTextCursor.MoveMode.KeepAnchor)

                        added_text = cursor.selectedText()

                    # print(change_from, added_text, input_method_used, self.change_from, self.change_added)
                    self.propagate_user_edited.emit(change_from, added_text, input_method_used)
                    self.propagate_user_edited.emit(change_from, added_text, joint_previous)
                    self.change_added = 0

                undo_steps = self.document().availableUndoSteps()
                new_steps = undo_steps - self.old_undo_steps
                if new_steps > 0:
                    self.old_undo_steps = undo_steps
                    self.push_undo_stack.emit(new_steps, self.is_formatting)
@@ -399,7 +396,7 @@ class TextBlkItem(QGraphicsTextItem):
        if not self.pre_editing:
            if self.hasFocus():
                self.change_from = from_
                self.change_added = added - removed
                self.change_added = added

    def keyPressEvent(self, e: QKeyEvent) -> None:

@@ -716,6 +713,7 @@ class TextBlkItem(QGraphicsTextItem):
            cursor = QTextCursor(self.document())
            cursor.select(QTextCursor.SelectionType.Document)

        cursor.beginEditBlock()
        return cursor, dict(cursor_pos=cursor_pos, has_set_all=has_set_all)

    def _after_set_ffmt(self, cursor: QTextCursor, repaint_background: bool, restore_cursor: bool, cursor_pos: Tuple, has_set_all: bool):
@@ -733,6 +731,7 @@ class TextBlkItem(QGraphicsTextItem):
        if repaint_background:
            self.repaint_background()

        cursor.endEditBlock()
        self.is_formatting = False

    def setFontFamily(self, value: str, repaint_background: bool = True, set_selected: bool = False, restore_cursor: bool = False):