Commit c4dfb9ef authored by dmMaze's avatar dmMaze
Browse files

support fontformat presets

parent 39e9ce3f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -441,6 +441,7 @@ class ConfigPanel(Widget):

    def hideEvent(self, e) -> None:
        self.inpaint_sub_block.layout().removeWidget(self.inpaint_config_panel)
        self.save_config.emit()
        return super().hideEvent(e)
        
    
 No newline at end of file
+12 −10
Original line number Diff line number Diff line
@@ -6,12 +6,12 @@ from qtpy.QtWidgets import QHBoxLayout, QVBoxLayout, QFrame, QFontComboBox, QApp
from qtpy.QtCore import Signal, Qt
from qtpy.QtGui import QColor, QTextCharFormat, QMouseEvent, QFont, QTextCursor

from .stylewidgets import Widget, ColorPicker
from .stylewidgets import Widget, ColorPicker, ClickableLabel
from .misc import FontFormat, set_html_color, pt2px
from .textitem import TextBlkItem
from .canvas import Canvas
from .constants import CONFIG_FONTSIZE_CONTENT, WIDGET_SPACING_CLOSE
from .text_graphical_effect import EffectBtn, TextEffectPanel
from .text_graphical_effect import TextEffectPanel
from .combobox import SizeComboBox
from . import constants as C

@@ -456,14 +456,12 @@ class FontFormatPanel(Widget):
        lettersp_hlayout.setSpacing(WIDGET_SPACING_CLOSE)
        
        self.global_fontfmt_str = self.tr("Global Font Format")
        self.fontfmtLabel = QLabel(self)
        self.fontfmtLabel = ClickableLabel(self.global_fontfmt_str, self)
        font = self.fontfmtLabel.font()
        font.setPointSizeF(CONFIG_FONTSIZE_CONTENT * 0.7)
        self.fontfmtLabel.setText(self.global_fontfmt_str)
        font.setPointSizeF(CONFIG_FONTSIZE_CONTENT * 0.75)
        self.fontfmtLabel.setFont(font)

        self.effectBtn = EffectBtn(self)
        self.effectBtn.setText(self.tr("Effect"))
        self.effectBtn = ClickableLabel(self.tr("Effect"), self)
        self.effectBtn.clicked.connect(self.on_effectbtn_clicked)
        self.effect_panel = TextEffectPanel()
        self.effect_panel.hide()
@@ -660,7 +658,11 @@ class FontFormatPanel(Widget):
        self.effect_panel.updatePanels()
        self.effect_panel.show()

    # def on_apply_effect(self):
    #     if self.textblk_item is not None:
    #         self.textblk_item.update_effect(self.active_format)
    def on_load_preset(self, preset: FontFormat):
        self.global_format = preset
        if self.textblk_item is not None:
            self.set_textblk_item(None)
                
        self.set_active_format(preset)
        self.fontfmtLabel.setText(self.global_fontfmt_str)
        
 No newline at end of file
+20 −2
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@ from utils.io_utils import json_dump_nested_obj
from utils.text_processing import is_cjk, full_len, half_len
from dl.textdetector import TextBlock

from .misc import ProjImgTrans, pt2px, pixmap2ndarray
from .misc import ProjImgTrans, pt2px, FontFormat
from .canvas import Canvas
from .configpanel import ConfigPanel
from .dl_manager import DLManager
@@ -21,6 +21,7 @@ from .scenetext_manager import SceneTextManager
from .mainwindowbars import TitleBar, LeftBar, RightBar, BottomBar
from .io_thread import ImgSaveThread
from .stylewidgets import FrameLessMessageBox
from .preset_widget import PresetPanel, PresetListWidget
from .constants import STYLESHEET_PATH, CONFIG_PATH
from . import constants as C

@@ -110,6 +111,13 @@ class MainWindow(QMainWindow):
        self.textPanel = TextPanel(self.app, self.canvas)
        self.textPanel.formatpanel.effect_panel.setParent(self)
        self.textPanel.formatpanel.effect_panel.setWindowFlags(Qt.WindowType.Window | Qt.WindowType.CustomizeWindowHint)
        self.textPanel.formatpanel.fontfmtLabel.clicked.connect(self.show_presets)
        self.presetPanel = PresetPanel(self)
        self.presetPanel.setParent(self)
        self.presetPanel.setWindowFlags(Qt.WindowType.Window)
        self.presetPanel.hide()
        self.presetPanel.hide_signal.connect(self.save_config)
        self.presetPanel.load_preset.connect(self.textPanel.formatpanel.on_load_preset)
        self.st_manager = SceneTextManager(self.app, self.canvas, self.textPanel)

        # comic trans pannel
@@ -197,6 +205,8 @@ class MainWindow(QMainWindow):
        elif self.config.imgtrans_paintmode:
            self.bottomBar.paintChecker.click()

        self.presetPanel.initPresets(self.config.font_presets)

    def setupImgTransUI(self):
        self.centralStackWidget.setCurrentIndex(0)
        if self.leftBar.showPageListLabel.isChecked():
@@ -619,3 +629,11 @@ class MainWindow(QMainWindow):

    def on_transpanel_changed(self):
        self.canvas.editor_index = self.rightComicTransStackPanel.currentIndex()

    def show_presets(self):
        fmt = self.textPanel.formatpanel.active_format
        fmt_name = self.textPanel.formatpanel.fontfmtLabel.text()
        self.presetPanel.updateCurrentFontFormat(fmt, fmt_name)
        self.presetPanel.show()

+2 −1
Original line number Diff line number Diff line
@@ -483,6 +483,7 @@ class ProgramConfig:
        let_alignment_flag: int = 0,
        let_autolayout_flag: bool = True,
        let_uppercase_flag: bool = True,
        font_presets: dict = None,
        **kwargs) -> None:

        if isinstance(dl, dict):
@@ -517,7 +518,7 @@ class ProgramConfig:
        self.let_alignment_flag = let_alignment_flag
        self.let_autolayout_flag = let_autolayout_flag
        self.let_uppercase_flag = let_uppercase_flag

        self.font_presets = {} if font_presets is None else font_presets

class LruIgnoreArg:

+146 −0
Original line number Diff line number Diff line
from qtpy.QtWidgets import QMenu, QAbstractItemView, QListWidget, QListWidgetItem, QWidget, QGridLayout, QPushButton, QVBoxLayout
from qtpy.QtCore import Qt, Signal
from qtpy.QtGui import QContextMenuEvent, QShowEvent, QHideEvent
from typing import List, Union

from .misc import FontFormat
from .stylewidgets import Widget

def mutate_dict_key(adict: dict, old_key: Union[str, int], new_key: str):
    # https://stackoverflow.com/questions/12150872/change-key-in-ordereddict-without-losing-order
    key_list = list(adict.keys())
    if isinstance(old_key, int):
        old_key = key_list[old_key]
    
    for key in key_list:
        value = adict.pop(key)
        adict[new_key if old_key == key else key] = value


class PresetListWidget(QListWidget):

    load = Signal()

    def __init__(self, parent=None) -> None:
        super().__init__(parent)
        self.presets = {}
        self.current_fmt = {}
        self.default_preset_name = self.tr('preset')
        self.setSelectionMode(QAbstractItemView.SelectionMode.ExtendedSelection)
        self.itemDelegate().commitData.connect(self.on_commit_data)

    def on_commit_data(self, editor: QWidget):
        text = editor.text()
        item = self.findItems(text, Qt.MatchFlag.MatchExactly)

        # remove duplicates
        if len(item) > 1:
            preset = self.presets[text]
            self.removeItems(item[:-1])
            self.presets[text] = preset

        item = item[-1]
        mutate_dict_key(self.presets, self.row(item), text)

    def removeItems(self, items: List[QListWidgetItem]):
        for item in items:
            key = item.text()
            if key in self.presets:
                self.presets.pop(key)
            self.takeItem(self.row(item))

    def contextMenuEvent(self, e: QContextMenuEvent) -> None:
        menu = QMenu()
        delete_act = menu.addAction(self.tr('Delete'))
        new_act = menu.addAction(self.tr('New preset'))
        load_act = menu.addAction(self.tr('Load preset'))
        rst = menu.exec_(e.globalPos())
        if rst == delete_act:
            self.removeItems(self.selectedItems())
        elif rst == new_act:
            self.add_new_preset()
        elif rst == load_act:
            self.load.emit()

        return super().contextMenuEvent(e)

    def add_new_preset(self, preset_name: str = None):
        if preset_name is None:
            preset_name = self.default_preset_name + '_' + str(self.count()).zfill(3)
        item = QListWidgetItem(preset_name)
        item.setFlags(item.flags() | Qt.ItemFlag.ItemIsEditable)
        self.addItem(item)
        self.presets[preset_name] = self.current_fmt.copy()
        self.editItem(item)


class PresetPanel(Widget):

    hide_signal = Signal()
    load_preset = Signal(FontFormat)

    def __init__(self, parent: QWidget = None, *args, **kwargs) -> None:
        super().__init__(parent, *args, **kwargs)
        self.list_widget = PresetListWidget(self)
        
        self.new_btn = QPushButton(self.tr('New'))
        self.new_tip = self.tr('Create new preset: ')
        self.new_btn.clicked.connect(self.on_new_clicked)
        self.delete_btn = QPushButton(self.tr('Delete'), self)
        self.delete_btn.clicked.connect(self.on_delete_clicked)
        self.load_btn = QPushButton(self.tr('Load'), self)
        self.load_btn.setToolTip(self.tr('Load preset as global format'))
        self.load_btn.clicked.connect(self.on_load_clicked)
        self.exit_btn = QPushButton(self.tr('Exit'), self)
        self.exit_btn.clicked.connect(self.on_exit_clicked)

        self.editing_item: QListWidgetItem = None
        
        
        layout = QGridLayout()
        layout.addWidget(self.new_btn, 0, 0)
        layout.addWidget(self.delete_btn, 0, 1)
        layout.addWidget(self.load_btn, 1, 0)
        layout.addWidget(self.exit_btn, 1, 1)

        vlayout = QVBoxLayout(self)
        vlayout.addWidget(self.list_widget)
        vlayout.addLayout(layout)

    def updateCurrentFontFormat(self, fmt: Union[FontFormat, dict], fmtname: str):
        self.new_btn.setToolTip(self.new_tip + fmtname)
        if isinstance(fmt, FontFormat):
            fmt = vars(fmt)
        self.list_widget.current_fmt = fmt

    def on_new_clicked(self):
        self.list_widget.add_new_preset()

    def on_delete_clicked(self):
        self.list_widget.removeItems(self.list_widget.selectedItems())

    def on_load_clicked(self):
        sel = self.list_widget.selectedItems()
        if len(sel) > 0:
            sel = sel[0]
            preset = self.list_widget.presets[sel.text()]
            preset = FontFormat(**preset)
            self.list_widget.current_fmt = vars(preset)
            self.load_preset.emit(preset)

    def on_exit_clicked(self):
        self.hide()

    def initPresets(self, presets: dict):
        self.list_widget.presets = presets
        for key in presets:
            item = QListWidgetItem(key)
            item.setFlags(item.flags() | Qt.ItemFlag.ItemIsEditable)
            self.list_widget.addItem(item)

    def showEvent(self, e: QShowEvent) -> None:
        return super().showEvent(e)

    def hideEvent(self, e: QHideEvent) -> None:
        self.hide_signal.emit()
        return super().hideEvent(e)
 No newline at end of file
Loading