Loading ui/fontformat_commands.py +7 −2 Original line number Diff line number Diff line Loading @@ -138,9 +138,14 @@ def ffmt_change_stroke_width(param_name: str, values: float, act_ffmt: FontForma def ffmt_change_font_size(param_name: str, values: float, act_ffmt: FontFormat, is_global: bool, blkitems: List[TextBlkItem], clip_size=False, **kwargs): set_kwargs = global_default_set_kwargs if is_global else local_default_set_kwargs for blkitem, value in zip(blkitems, values): if value < 0: if value < 0 and param_name == "font_size": continue blkitem.setFontSize(px2pt(value), clip_size=clip_size, **set_kwargs) if param_name == "font_size": setFontSize = blkitem.setFontSize value = px2pt(value) else: setFontSize = blkitem.setRelFontSize setFontSize(value, clip_size=clip_size, **set_kwargs) @font_formating(push_undostack=True) def ffmt_change_alignment(param_name: str, values: float, act_ffmt: FontFormat, is_global: bool, blkitems: List[TextBlkItem], **kwargs): Loading ui/scene_textlayout.py +3 −0 Original line number Diff line number Diff line Loading @@ -269,6 +269,9 @@ class SceneTextLayout(QAbstractTextDocumentLayout): def documentChanged(self, position: int, charsRemoved: int, charsAdded: int) -> None: if not self.relayout_on_changed: return self.reLayoutEverything() def reLayoutEverything(self): self._doc_text = self.document().toPlainText() self._max_font_size = -1 block = self.document().firstBlock() Loading ui/scenetext_manager.py +11 −2 Original line number Diff line number Diff line Loading @@ -592,7 +592,7 @@ class SceneTextManager(QObject): def onTextBlkItemEndEdit(self, blk_id: int): self.canvas.editing_textblkitem = None self.formatpanel.set_textblk_item(None) self.textblk_item_list[blk_id].setSelected(True) self.txtblkShapeControl.endEditing() def editingTextItem(self) -> TextBlkItem: Loading Loading @@ -682,6 +682,10 @@ class SceneTextManager(QObject): if len(blkitem_list) > 0: self.canvas.clearSelection() self.canvas.push_undo_command(PasteBlkItemsCommand(blkitem_list, pair_widget_list, self)) if len(blkitem_list) == 1: self.formatpanel.set_textblk_item(blkitem_list[0]) else: self.formatpanel.set_textblk_item(multi_select=True) def onFormatTextblks(self, fmt: FontFormat = None): if fmt is None: Loading Loading @@ -715,6 +719,10 @@ class SceneTextManager(QObject): if self.canvas.textEditMode(): textitems = self.canvas.selected_text_items() self.textEditList.set_selected_list([t.idx for t in textitems]) if len(textitems) == 1: self.formatpanel.set_textblk_item(textitems[-1]) else: self.formatpanel.set_textblk_item(multi_select=bool(textitems)) def layout_textblk(self, blkitem: TextBlkItem, text: str = None, mask: np.ndarray = None, bounding_rect: List = None, region_rect: List = None): Loading Loading @@ -997,7 +1005,7 @@ class SceneTextManager(QObject): def on_push_textitem_undostack(self, num_steps: int, is_formatting: bool): blkitem: TextBlkItem = self.sender() e_trans = self.pairwidget_list[blkitem.idx].e_trans if not is_formatting else None self.canvas.push_undo_command(TextItemEditCommand(blkitem, e_trans, num_steps), update_pushed_step=is_formatting) self.canvas.push_undo_command(TextItemEditCommand(blkitem, e_trans, num_steps, self.textpanel.formatpanel), update_pushed_step=is_formatting) def on_push_edit_stack(self, num_steps: int): edit: Union[TransTextEdit, SourceTextEdit] = self.sender() Loading Loading @@ -1026,6 +1034,7 @@ class SceneTextManager(QObject): trans_widget_list.append(self.pairwidget_list[blk.idx].e_trans) if len(selected_blks) > 0: self.canvas.push_undo_command(ApplyFontformatCommand(selected_blks, trans_widget_list, fontformat)) self.formatpanel.set_active_format(fontformat) def on_transwidget_selection_changed(self): selitems = self.canvas.selected_text_items() Loading ui/text_panel.py +48 −21 Original line number Diff line number Diff line Loading @@ -149,7 +149,7 @@ class FontSizeBox(QFrame): self.fcombobox.addItems([ "5", "5.5", "6.5", "7.5", "8", "9", "10", "10.5", "11", "12", "14", "16", "18", "20", '22', "26", "28", "36", "48", "56", "72" "36", "48", "56", "72", "93", "123", "163" ]) self.fcombobox.param_changed.connect(self.param_changed) Loading @@ -164,28 +164,48 @@ class FontSizeBox(QFrame): hlayout.setSpacing(3) hlayout.setContentsMargins(0, 0, 0, 0) def getFontSize(self) -> float: return self.fcombobox.value() def getFontSize(self) -> str: return self.fcombobox.currentText() def onUpBtnClicked(self): raito = 1.25 size = self.getFontSize() newsize = int(round(size * 1.25)) multi_size=False if "+" in size: size = size.strip("+") multi_size=True size = float(size) newsize = int(round(size * raito)) if newsize == size: newsize += 1 newsize = min(1000, newsize) if newsize != size: if not multi_size: self.param_changed.emit('font_size', newsize) self.fcombobox.setCurrentText(str(newsize)) else: self.param_changed.emit('rel_font_size', raito) self.fcombobox.setCurrentText(str(newsize)+"+") def onDownBtnClicked(self): raito = 0.75 size = self.getFontSize() newsize = int(round(size * 0.75)) multi_size=False if "+" in size: size = size.strip("+") multi_size=True size = float(size) newsize = int(round(size * raito)) if newsize == size: newsize -= 1 newsize = max(1, newsize) if newsize != size: if not multi_size: self.param_changed.emit('font_size', newsize) self.fcombobox.setCurrentText(str(newsize)) else: self.param_changed.emit('rel_font_size', raito) self.fcombobox.setCurrentText(str(newsize)+"+") class SizeControlLabel(QLabel): Loading Loading @@ -459,7 +479,7 @@ class FontFormatPanel(Widget): return self.textstyle_panel.active_text_style_label def on_param_changed(self, param_name: str, value): func = FM.handle_ffmt_change.get(param_name) func = FM.handle_ffmt_change.get(param_name if not param_name == "rel_font_size" else "font_size") func_kwargs = {} if param_name == 'font_size': func_kwargs['clip_size'] = True Loading Loading @@ -507,7 +527,7 @@ class FontFormatPanel(Widget): mul = 0.01 self.lineSpacingBox.setValue(self.lineSpacingBox.value() + delta * mul) def set_active_format(self, font_format: FontFormat): def set_active_format(self, font_format: FontFormat, multi_size=False): C.active_format = font_format self.familybox.blockSignals(True) font_size = round(font_format.font_size, 1) Loading @@ -515,6 +535,8 @@ class FontFormatPanel(Widget): font_size = str(int(font_size)) else: font_size = f'{font_size:.1f}' if multi_size: font_size += "+" self.fontsizebox.fcombobox.setCurrentText(font_size) self.familybox.setCurrentText(font_format.font_family) self.colorPicker.setPickerColor(font_format.foreground_color()) Loading Loading @@ -555,7 +577,7 @@ class FontFormatPanel(Widget): if self.global_mode(): self.set_globalfmt_title() def set_textblk_item(self, textblk_item: TextBlkItem = None): def set_textblk_item(self, textblk_item: TextBlkItem = None, multi_select:bool=False): if textblk_item is None: focus_w = self.app.focusWidget() focus_p = None if focus_w is None else focus_w.parentWidget() Loading @@ -567,13 +589,18 @@ class FontFormatPanel(Widget): focus_on_fmtoptions = True if not focus_on_fmtoptions: self.textblk_item = None self.set_active_format(self.global_format) self.set_active_format(self.global_format, multi_select) if multi_select: self.textstyle_panel.setTitle('Group') else: self.set_globalfmt_title() else: if not self.restoring_textblk: blk_fmt = textblk_item.get_fontformat() self.textblk_item = textblk_item self.set_active_format(blk_fmt) multi_size = not textblk_item.isEditing() and textblk_item.isMultiFontSize() self.set_active_format(blk_fmt, multi_size) self.textstyle_panel.setTitle(f'TextBlock #{textblk_item.idx}') def on_effectbtn_clicked(self): Loading ui/textedit_commands.py +22 −1 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ except: from .textitem import TextBlkItem, TextBlock from .textedit_area import TransTextEdit, SourceTextEdit from utils.fontformat import FontFormat import utils.config as C from .misc import doc_replace, doc_replace_no_shift from .texteditshapecontrol import TextBlkShapeControl from .page_search_widget import PageSearchWidget, Matched Loading Loading @@ -261,26 +262,46 @@ class ResetAngleCommand(QUndoCommand): self.ctrl.setAngle(angle) class TextItemEditCommand(QUndoCommand): def __init__(self, blkitem: TextBlkItem, trans_edit: TransTextEdit, num_steps: int): def __init__(self, blkitem: TextBlkItem, trans_edit: TransTextEdit, num_steps: int, formatpanel=None): super(TextItemEditCommand, self).__init__() self.op_counter = 0 self.edit = trans_edit self.blkitem = blkitem self.num_steps = num_steps self.is_formatting = blkitem.is_formatting self.formatpanel = formatpanel def redo(self): if self.op_counter == 0: self.op_counter += 1 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: self.blkitem.repaint_background() if self.is_formatting and self.blkitem == self.formatpanel.textblk_item: multi_size = not self.blkitem.isEditing() and self.blkitem.isMultiFontSize() self.formatpanel.set_active_format(self.blkitem.get_fontformat(), multi_size) if self.edit is not None and not self.is_formatting: self.edit.redo() 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: self.blkitem.repaint_background() if self.is_formatting and self.blkitem == self.formatpanel.textblk_item: multi_size = not self.blkitem.isEditing() and self.blkitem.isMultiFontSize() self.formatpanel.set_active_format(self.blkitem.get_fontformat(), multi_size) if self.edit is not None: self.edit.undo() Loading Loading
ui/fontformat_commands.py +7 −2 Original line number Diff line number Diff line Loading @@ -138,9 +138,14 @@ def ffmt_change_stroke_width(param_name: str, values: float, act_ffmt: FontForma def ffmt_change_font_size(param_name: str, values: float, act_ffmt: FontFormat, is_global: bool, blkitems: List[TextBlkItem], clip_size=False, **kwargs): set_kwargs = global_default_set_kwargs if is_global else local_default_set_kwargs for blkitem, value in zip(blkitems, values): if value < 0: if value < 0 and param_name == "font_size": continue blkitem.setFontSize(px2pt(value), clip_size=clip_size, **set_kwargs) if param_name == "font_size": setFontSize = blkitem.setFontSize value = px2pt(value) else: setFontSize = blkitem.setRelFontSize setFontSize(value, clip_size=clip_size, **set_kwargs) @font_formating(push_undostack=True) def ffmt_change_alignment(param_name: str, values: float, act_ffmt: FontFormat, is_global: bool, blkitems: List[TextBlkItem], **kwargs): Loading
ui/scene_textlayout.py +3 −0 Original line number Diff line number Diff line Loading @@ -269,6 +269,9 @@ class SceneTextLayout(QAbstractTextDocumentLayout): def documentChanged(self, position: int, charsRemoved: int, charsAdded: int) -> None: if not self.relayout_on_changed: return self.reLayoutEverything() def reLayoutEverything(self): self._doc_text = self.document().toPlainText() self._max_font_size = -1 block = self.document().firstBlock() Loading
ui/scenetext_manager.py +11 −2 Original line number Diff line number Diff line Loading @@ -592,7 +592,7 @@ class SceneTextManager(QObject): def onTextBlkItemEndEdit(self, blk_id: int): self.canvas.editing_textblkitem = None self.formatpanel.set_textblk_item(None) self.textblk_item_list[blk_id].setSelected(True) self.txtblkShapeControl.endEditing() def editingTextItem(self) -> TextBlkItem: Loading Loading @@ -682,6 +682,10 @@ class SceneTextManager(QObject): if len(blkitem_list) > 0: self.canvas.clearSelection() self.canvas.push_undo_command(PasteBlkItemsCommand(blkitem_list, pair_widget_list, self)) if len(blkitem_list) == 1: self.formatpanel.set_textblk_item(blkitem_list[0]) else: self.formatpanel.set_textblk_item(multi_select=True) def onFormatTextblks(self, fmt: FontFormat = None): if fmt is None: Loading Loading @@ -715,6 +719,10 @@ class SceneTextManager(QObject): if self.canvas.textEditMode(): textitems = self.canvas.selected_text_items() self.textEditList.set_selected_list([t.idx for t in textitems]) if len(textitems) == 1: self.formatpanel.set_textblk_item(textitems[-1]) else: self.formatpanel.set_textblk_item(multi_select=bool(textitems)) def layout_textblk(self, blkitem: TextBlkItem, text: str = None, mask: np.ndarray = None, bounding_rect: List = None, region_rect: List = None): Loading Loading @@ -997,7 +1005,7 @@ class SceneTextManager(QObject): def on_push_textitem_undostack(self, num_steps: int, is_formatting: bool): blkitem: TextBlkItem = self.sender() e_trans = self.pairwidget_list[blkitem.idx].e_trans if not is_formatting else None self.canvas.push_undo_command(TextItemEditCommand(blkitem, e_trans, num_steps), update_pushed_step=is_formatting) self.canvas.push_undo_command(TextItemEditCommand(blkitem, e_trans, num_steps, self.textpanel.formatpanel), update_pushed_step=is_formatting) def on_push_edit_stack(self, num_steps: int): edit: Union[TransTextEdit, SourceTextEdit] = self.sender() Loading Loading @@ -1026,6 +1034,7 @@ class SceneTextManager(QObject): trans_widget_list.append(self.pairwidget_list[blk.idx].e_trans) if len(selected_blks) > 0: self.canvas.push_undo_command(ApplyFontformatCommand(selected_blks, trans_widget_list, fontformat)) self.formatpanel.set_active_format(fontformat) def on_transwidget_selection_changed(self): selitems = self.canvas.selected_text_items() Loading
ui/text_panel.py +48 −21 Original line number Diff line number Diff line Loading @@ -149,7 +149,7 @@ class FontSizeBox(QFrame): self.fcombobox.addItems([ "5", "5.5", "6.5", "7.5", "8", "9", "10", "10.5", "11", "12", "14", "16", "18", "20", '22', "26", "28", "36", "48", "56", "72" "36", "48", "56", "72", "93", "123", "163" ]) self.fcombobox.param_changed.connect(self.param_changed) Loading @@ -164,28 +164,48 @@ class FontSizeBox(QFrame): hlayout.setSpacing(3) hlayout.setContentsMargins(0, 0, 0, 0) def getFontSize(self) -> float: return self.fcombobox.value() def getFontSize(self) -> str: return self.fcombobox.currentText() def onUpBtnClicked(self): raito = 1.25 size = self.getFontSize() newsize = int(round(size * 1.25)) multi_size=False if "+" in size: size = size.strip("+") multi_size=True size = float(size) newsize = int(round(size * raito)) if newsize == size: newsize += 1 newsize = min(1000, newsize) if newsize != size: if not multi_size: self.param_changed.emit('font_size', newsize) self.fcombobox.setCurrentText(str(newsize)) else: self.param_changed.emit('rel_font_size', raito) self.fcombobox.setCurrentText(str(newsize)+"+") def onDownBtnClicked(self): raito = 0.75 size = self.getFontSize() newsize = int(round(size * 0.75)) multi_size=False if "+" in size: size = size.strip("+") multi_size=True size = float(size) newsize = int(round(size * raito)) if newsize == size: newsize -= 1 newsize = max(1, newsize) if newsize != size: if not multi_size: self.param_changed.emit('font_size', newsize) self.fcombobox.setCurrentText(str(newsize)) else: self.param_changed.emit('rel_font_size', raito) self.fcombobox.setCurrentText(str(newsize)+"+") class SizeControlLabel(QLabel): Loading Loading @@ -459,7 +479,7 @@ class FontFormatPanel(Widget): return self.textstyle_panel.active_text_style_label def on_param_changed(self, param_name: str, value): func = FM.handle_ffmt_change.get(param_name) func = FM.handle_ffmt_change.get(param_name if not param_name == "rel_font_size" else "font_size") func_kwargs = {} if param_name == 'font_size': func_kwargs['clip_size'] = True Loading Loading @@ -507,7 +527,7 @@ class FontFormatPanel(Widget): mul = 0.01 self.lineSpacingBox.setValue(self.lineSpacingBox.value() + delta * mul) def set_active_format(self, font_format: FontFormat): def set_active_format(self, font_format: FontFormat, multi_size=False): C.active_format = font_format self.familybox.blockSignals(True) font_size = round(font_format.font_size, 1) Loading @@ -515,6 +535,8 @@ class FontFormatPanel(Widget): font_size = str(int(font_size)) else: font_size = f'{font_size:.1f}' if multi_size: font_size += "+" self.fontsizebox.fcombobox.setCurrentText(font_size) self.familybox.setCurrentText(font_format.font_family) self.colorPicker.setPickerColor(font_format.foreground_color()) Loading Loading @@ -555,7 +577,7 @@ class FontFormatPanel(Widget): if self.global_mode(): self.set_globalfmt_title() def set_textblk_item(self, textblk_item: TextBlkItem = None): def set_textblk_item(self, textblk_item: TextBlkItem = None, multi_select:bool=False): if textblk_item is None: focus_w = self.app.focusWidget() focus_p = None if focus_w is None else focus_w.parentWidget() Loading @@ -567,13 +589,18 @@ class FontFormatPanel(Widget): focus_on_fmtoptions = True if not focus_on_fmtoptions: self.textblk_item = None self.set_active_format(self.global_format) self.set_active_format(self.global_format, multi_select) if multi_select: self.textstyle_panel.setTitle('Group') else: self.set_globalfmt_title() else: if not self.restoring_textblk: blk_fmt = textblk_item.get_fontformat() self.textblk_item = textblk_item self.set_active_format(blk_fmt) multi_size = not textblk_item.isEditing() and textblk_item.isMultiFontSize() self.set_active_format(blk_fmt, multi_size) self.textstyle_panel.setTitle(f'TextBlock #{textblk_item.idx}') def on_effectbtn_clicked(self): Loading
ui/textedit_commands.py +22 −1 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ except: from .textitem import TextBlkItem, TextBlock from .textedit_area import TransTextEdit, SourceTextEdit from utils.fontformat import FontFormat import utils.config as C from .misc import doc_replace, doc_replace_no_shift from .texteditshapecontrol import TextBlkShapeControl from .page_search_widget import PageSearchWidget, Matched Loading Loading @@ -261,26 +262,46 @@ class ResetAngleCommand(QUndoCommand): self.ctrl.setAngle(angle) class TextItemEditCommand(QUndoCommand): def __init__(self, blkitem: TextBlkItem, trans_edit: TransTextEdit, num_steps: int): def __init__(self, blkitem: TextBlkItem, trans_edit: TransTextEdit, num_steps: int, formatpanel=None): super(TextItemEditCommand, self).__init__() self.op_counter = 0 self.edit = trans_edit self.blkitem = blkitem self.num_steps = num_steps self.is_formatting = blkitem.is_formatting self.formatpanel = formatpanel def redo(self): if self.op_counter == 0: self.op_counter += 1 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: self.blkitem.repaint_background() if self.is_formatting and self.blkitem == self.formatpanel.textblk_item: multi_size = not self.blkitem.isEditing() and self.blkitem.isMultiFontSize() self.formatpanel.set_active_format(self.blkitem.get_fontformat(), multi_size) if self.edit is not None and not self.is_formatting: self.edit.redo() 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: self.blkitem.repaint_background() if self.is_formatting and self.blkitem == self.formatpanel.textblk_item: multi_size = not self.blkitem.isEditing() and self.blkitem.isMultiFontSize() self.formatpanel.set_active_format(self.blkitem.get_fontformat(), multi_size) if self.edit is not None: self.edit.undo() Loading