Commit f3b4bdd2 authored by dmMaze's avatar dmMaze
Browse files

support rearrange textblocks (#145, #185)

parent 2cce2d69
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -54,13 +54,13 @@ ConfigSubBlock::hover {
SourceTextEdit {
    font-size: 17px;
    background-color: @emptyContentBackgroundColor;
    border-radius: 7px;
    border-radius: 5px;
    border-style: none;
}

TransTextEdit {
    font-size: 17px;
    border-radius: 7px;
    border-radius: 5px;
    background-color: @transtexteditBackgroundColor;
}

@@ -597,17 +597,17 @@ QScrollBar:vertical {
    /* background: transparent; 背景透明 */
    width: 10px; /*宽度*/
    margin: 0px 0px 0px 0px; /**/
    padding-top: 12px; /*距离上面12px*/
    padding-bottom: 12px; /*距离底部12px*/
    padding-top: 0px; /*距离上面12px*/
    padding-bottom: 0px; /*距离底部12px*/
    background: @scrollBarBackground
}
/*横向滚动条*/
QScrollBar:horizontal {
    background: @scrollBarBackground;
    height: 10px; /*高度*/
    height: 7px; /*高度*/
    margin: 0px 0px 0px 0px;
    padding-left: 12px; /*距离左边12px*/
    padding-right: 12px; /*距离右边12px*/
    padding-left: 0px; /*距离左边12px*/
    padding-right: 0px; /*距离右边12px*/
}

/*当鼠标放到纵向或者横向滚动条上面时*/
@@ -717,6 +717,10 @@ QLabel#angleLabel {
    background-color: rgba(30, 147, 229, 20%);
}

.CheckableLabel::hover {
    background-color: rgba(30, 147, 229, 20%);
}

DrawToolCheckBox::indicator {
    height: 34px;
    width: 34px;
+3 −1
Original line number Diff line number Diff line
@@ -147,6 +147,7 @@ def main():
    from qtpy.QtGui import  QGuiApplication, QIcon, QFont

    from ui import constants as C
    from ui import config as program_config
    C.DEFAULT_DISPLAY_LANG = QLocale.system().name()
    if qtpy.API_NAME[-1] == '6':
        C.FLAG_QT6 = True
@@ -163,7 +164,7 @@ def main():
    load_modules()

    app = QApplication(sys.argv)
    from ui.misc import ProgramConfig
    from ui.config import ProgramConfig

    try:
        config = ProgramConfig.load(C.CONFIG_PATH)
@@ -171,6 +172,7 @@ def main():
        LOGGER.exception(e)
        LOGGER.warning("Failed to load config file, using default config")
        config = ProgramConfig()
    program_config.pcfg = config

    lang = config.display_lang
    langp = osp.join(C.TRANSLATE_DIR, lang + '.qm')
+4 −4
Original line number Diff line number Diff line
@@ -121,10 +121,10 @@ class CustomGV(QGraphicsView):
        self.hide_canvas.emit()
        return super().hideEvent(event)

    def enterEvent(self, event: QEvent) -> None:
        self.setFocus()
        return super().enterEvent(event)
    
    # def enterEvent(self, event: QEvent) -> None:
    #   # not sure why i add it
        # self.setFocus()
    #     return super().enterEvent(event)

class Canvas(QGraphicsScene):

ui/config.py

0 → 100644
+120 −0
Original line number Diff line number Diff line
import json

from . import constants as C
from .misc import FontFormat
from utils.structures import Tuple, Union, List, Dict, Config, field, nested_dataclass


@nested_dataclass
class ModuleConfig(Config):
    textdetector: str = 'ctd'
    ocr: str = "mit48px_ctc"
    inpainter: str = 'lama_mpe'
    translator: str = "google"
    enable_ocr: bool = True
    enable_translate: bool = True
    enable_inpaint: bool = True
    textdetector_params: Dict = field(default_factory=lambda: dict())
    ocr_params: Dict = field(default_factory=lambda: dict())
    translator_params: Dict = field(default_factory=lambda: dict())
    inpainter_params: Dict = field(default_factory=lambda: dict())
    translate_source: str = '日本語'
    translate_target: str = '简体中文'
    check_need_inpaint: bool = True

    def get_params(self, module_key: str) -> dict:
        return self[module_key + '_params']

@nested_dataclass
class DrawPanelConfig(Config):
    pentool_color: List = field(default_factory=lambda: [0, 0, 0])
    pentool_width: float = 30.
    pentool_shape: int = 0
    inpainter_width: float = 30.
    inpainter_shape: int = 0
    current_tool: int = 0
    rectool_auto: bool = False
    rectool_method: int = 0
    recttool_dilate_ksize: int = 0

@nested_dataclass
class ProgramConfig(Config):

    module: ModuleConfig = field(default_factory=lambda: ModuleConfig())
    drawpanel: DrawPanelConfig = field(default_factory=lambda: DrawPanelConfig())
    global_fontformat: FontFormat = field(default_factory=lambda: FontFormat())
    recent_proj_list: List = field(default_factory=lambda: [])
    imgtrans_paintmode: bool = False
    imgtrans_textedit: bool = True
    imgtrans_textblock: bool = True
    mask_transparency: float = 0.
    original_transparency: float = 0.
    open_recent_on_startup: bool = True 
    let_fntsize_flag: int = 0
    let_fntstroke_flag: int = 0
    let_fntcolor_flag: int = 0
    let_fnt_scolor_flag: int = 0
    let_fnteffect_flag: int = 1
    let_alignment_flag: int = 0
    let_autolayout_flag: bool = True
    let_uppercase_flag: bool = True
    font_presets: dict = field(default_factory=lambda: dict())
    fsearch_case: bool = False
    fsearch_whole_word: bool = False
    fsearch_regex: bool = False
    fsearch_range: int = 0
    gsearch_case: bool = False
    gsearch_whole_word: bool = False
    gsearch_regex: bool = False
    gsearch_range: int = 0
    darkmode: bool = False
    src_link_flag: str = ''
    textselect_mini_menu: bool = True
    fold_textarea: bool = False
    show_source_text: bool = True
    show_trans_text: bool = True
    saladict_shortcut: str = "Alt+S"
    search_url: str = "https://www.google.com/search?q="
    ocr_sublist: dict = field(default_factory=lambda: [])
    mt_sublist: dict = field(default_factory=lambda: [])
    display_lang: str = C.DEFAULT_DISPLAY_LANG

    @staticmethod
    def load(cfg_path: str):
        
        with open(cfg_path, 'r', encoding='utf8') as f:
            config_dict = json.loads(f.read())

        # for backward compatibility
        if 'dl' in config_dict:
            dl = config_dict.pop('dl')
            if not 'module' in config_dict:
                if 'textdetector_setup_params' in dl:
                    textdetector_params = dl.pop('textdetector_setup_params')
                    dl['textdetector_params'] = textdetector_params
                if 'inpainter_setup_params' in dl:
                    inpainter_params = dl.pop('inpainter_setup_params')
                    dl['inpainter_params'] = inpainter_params
                if 'ocr_setup_params' in dl:
                    ocr_params = dl.pop('ocr_setup_params')
                    dl['ocr_params'] = ocr_params
                if 'translator_setup_params' in dl:
                    translator_params = dl.pop('translator_setup_params')
                    dl['translator_params'] = translator_params
                config_dict['module'] = dl

        if 'module' in config_dict:
            module_cfg = config_dict['module']
            trans_params = module_cfg['translator_params']
            repl_pairs = {'baidu': 'Baidu', 'caiyun': 'Caiyun', 'chatgpt': 'ChatGPT', 'Deepl': 'DeepL', 'papago': 'Papago'}
            for k, i in repl_pairs.items():
                if k in trans_params:
                    trans_params[i] = trans_params.pop(k)
            if module_cfg['translator'] in repl_pairs:
                module_cfg['translator'] = repl_pairs[module_cfg['translator']]
            

        return ProgramConfig(**config_dict)
    

pcfg: ProgramConfig = None
 No newline at end of file
+29 −35
Original line number Diff line number Diff line
@@ -6,7 +6,6 @@ from qtpy.QtGui import QStandardItem, QStandardItemModel, QMouseEvent, QFont, QC

from . import constants as C


# nuitka seems to require import QtCore explicitly 
if C.FLAG_QT6:
    from PyQt6 import QtCore
@@ -14,7 +13,7 @@ else:
    from PyQt5 import QtCore

from .stylewidgets import Widget, ConfigComboBox
from .misc import ProgramConfig
from .config import pcfg
from .constants import CONFIG_FONTSIZE_CONTENT, CONFIG_FONTSIZE_HEADER, CONFIG_FONTSIZE_TABLE, CONFIG_COMBOBOX_SHORT, CONFIG_COMBOBOX_LONG, CONFIG_COMBOBOX_MIDEAN
from .dlconfig_parse_widgets import InpaintConfigPanel, TextDetectConfigPanel, TranslatorConfigPanel, OCRConfigPanel

@@ -271,11 +270,9 @@ class ConfigPanel(Widget):
    save_config = Signal()
    update_source_download_status = Signal(str)

    def __init__(self, config: ProgramConfig, *args, **kwargs) -> None:
    def __init__(self, *args, **kwargs) -> None:
        super().__init__(*args, **kwargs)
        
        self.config = config
        
        self.configTable = ConfigTable()
        self.configTable.tableitem_pressed.connect(self.onTableItemPressed)
        self.configContent = ConfigContent()
@@ -400,52 +397,50 @@ class ConfigPanel(Widget):

    def onTableItemPressed(self, idx0, idx1):
        self.configContent.setActiveLabel(idx0, idx1)
        # cb: ConfigBlock = self.configContent.config_block_list[idx0]
        # self.configContent.ensureWidgetVisible(self.activel)

    def on_open_onstartup_changed(self):
        self.config.open_recent_on_startup = self.open_on_startup_checker.isChecked()
        pcfg.open_recent_on_startup = self.open_on_startup_checker.isChecked()

    def on_fntsize_flag_changed(self):
        self.config.let_fntsize_flag = self.let_fntsize_combox.currentIndex()
        pcfg.let_fntsize_flag = self.let_fntsize_combox.currentIndex()

    def on_fntstroke_flag_changed(self):
        self.config.let_fntstroke_flag = self.let_fntstroke_combox.currentIndex()
        pcfg.let_fntstroke_flag = self.let_fntstroke_combox.currentIndex()

    def on_autolayout_changed(self):
        self.config.let_autolayout_flag = self.let_autolayout_checker.isChecked()
        pcfg.let_autolayout_flag = self.let_autolayout_checker.isChecked()

    def on_uppercase_changed(self):
        self.config.let_uppercase_flag = self.let_uppercase_checker.isChecked()
        pcfg.let_uppercase_flag = self.let_uppercase_checker.isChecked()

    def on_selectext_minimenu_changed(self):
        self.config.textselect_mini_menu = self.selectext_minimenu_checker.isChecked()
        pcfg.textselect_mini_menu = self.selectext_minimenu_checker.isChecked()

    def on_saladict_shortcut_changed(self):
        kstr = self.saladict_shortcut.keySequence().toString()
        if kstr:
            self.config.saladict_shortcut = self.saladict_shortcut.keySequence().toString()
            pcfg.saladict_shortcut = self.saladict_shortcut.keySequence().toString()

    def on_searchurl_changed(self):
        url = self.searchurl_combobox.currentText()
        self.config.search_url = url
        pcfg.search_url = url

    def on_fontcolor_flag_changed(self):
        self.config.let_fntcolor_flag = self.let_fntcolor_combox.currentIndex()
        pcfg.let_fntcolor_flag = self.let_fntcolor_combox.currentIndex()

    def on_font_scolor_flag_changed(self):
        self.config.let_fnt_scolor_flag = self.let_fnt_scolor_combox.currentIndex()
        pcfg.let_fnt_scolor_flag = self.let_fnt_scolor_combox.currentIndex()

    def on_alignment_flag_changed(self):
        self.config.let_alignment_flag = self.let_alignment_combox.currentIndex()
        pcfg.let_alignment_flag = self.let_alignment_combox.currentIndex()

    def on_effect_flag_changed(self):
        self.config.let_fnteffect_flag = self.let_effect_combox.currentIndex()
        pcfg.let_fnteffect_flag = self.let_effect_combox.currentIndex()


    def on_source_link_changed(self):
        self.config.src_link_flag = self.src_link_textbox.text()
        self.update_source_download_status.emit(self.config.src_link_flag)
        pcfg.src_link_flag = self.src_link_textbox.text()
        self.update_source_download_status.emit(pcfg.src_link_flag)

    def focusOnTranslator(self):
        idx0, idx1 = self.trans_sub_block.idx0, self.trans_sub_block.idx1
@@ -474,21 +469,20 @@ class ConfigPanel(Widget):
    def setupConfig(self):
        self.blockSignals(True)

        config = self.config
        if config.open_recent_on_startup:
        if pcfg.open_recent_on_startup:
            self.open_on_startup_checker.setChecked(True)

        self.let_effect_combox.setCurrentIndex(config.let_fnteffect_flag)
        self.let_fntsize_combox.setCurrentIndex(config.let_fntsize_flag)
        self.let_fntstroke_combox.setCurrentIndex(config.let_fntstroke_flag)
        self.let_fntcolor_combox.setCurrentIndex(config.let_fntcolor_flag)
        self.let_fnt_scolor_combox.setCurrentIndex(config.let_fnt_scolor_flag)
        self.let_alignment_combox.setCurrentIndex(config.let_alignment_flag)
        self.let_autolayout_checker.setChecked(config.let_autolayout_flag)
        self.selectext_minimenu_checker.setChecked(config.textselect_mini_menu)
        self.let_uppercase_checker.setChecked(config.let_uppercase_flag)
        self.saladict_shortcut.setKeySequence(config.saladict_shortcut)
        self.searchurl_combobox.setCurrentText(config.search_url)
        self.src_link_textbox.setText(config.src_link_flag)
        self.let_effect_combox.setCurrentIndex(pcfg.let_fnteffect_flag)
        self.let_fntsize_combox.setCurrentIndex(pcfg.let_fntsize_flag)
        self.let_fntstroke_combox.setCurrentIndex(pcfg.let_fntstroke_flag)
        self.let_fntcolor_combox.setCurrentIndex(pcfg.let_fntcolor_flag)
        self.let_fnt_scolor_combox.setCurrentIndex(pcfg.let_fnt_scolor_flag)
        self.let_alignment_combox.setCurrentIndex(pcfg.let_alignment_flag)
        self.let_autolayout_checker.setChecked(pcfg.let_autolayout_flag)
        self.selectext_minimenu_checker.setChecked(pcfg.textselect_mini_menu)
        self.let_uppercase_checker.setChecked(pcfg.let_uppercase_flag)
        self.saladict_shortcut.setKeySequence(pcfg.saladict_shortcut)
        self.searchurl_combobox.setCurrentText(pcfg.search_url)
        self.src_link_textbox.setText(pcfg.src_link_flag)

        self.blockSignals(False)
 No newline at end of file
Loading