Loading ballontranslator/data/config/stylesheet.css +43 −33 Original line number Diff line number Diff line QWidget { /* border-style: none; */ color: #5d5d5f; color: @qwidgetForegroundColor; background-color: @qwidgetBackgroundColor; } SeparatorWidget { border-color: #b3b6bf; border-color: @borderColor; } Widget { background-color: #ebeef5; background-color: @widgetBackgroundColor; } CustomGV { background-color: #e6e9f0; border-color: #b3b6bf; background-color: @emptyContentBackgroundColor; border-color: @borderColor; border-style: solid; border-width: 1px; } ConfigTable { border-color: #b3b6bf; border-color: @borderColor; border-style: solid; border-width: 1px; background-color: #e1e4eb background-color: @emptyContentBackgroundColor } ConfigBlock { background-color: #e1e4eb background-color: @emptyContentBackgroundColor } ConfigSubBlock { background-color: #e1e4eb background-color: @emptyContentBackgroundColor } SearchResultTree { border-style: none; background-color: #ebeef5; background-color: @widgetBackgroundColor; } QSplitter:handle { background: #ebeef5; background: @widgetBackgroundColor; } QSplitter::handle:pressed { Loading @@ -48,20 +48,18 @@ QSplitter::handle:pressed { } ConfigSubBlock::hover { /* background-color: rgba(200, 215, 255, 50%); */ background-color: rgba(30, 147, 229, 20%); } SourceTextEdit { font-size: 17px; background-color: #e1e4eb; background-color: @emptyContentBackgroundColor; border-radius: 7px; border-style: none; } TransTextEdit { font-size: 17px; /* background-color: #e1e4eb; */ border-radius: 7px; background-color: whitesmoke; } Loading @@ -70,7 +68,19 @@ QComboBox { height: 27px; font-size: 14px; padding-left: 8px; border: 1px solid whitesmoke; border: 1px solid @borderColor; } QLineEdit { border: 1px solid @borderColor; } QPlainTextEdit { border: 1px solid @borderColor; } QPlainTextEdit:focus { border: 1px solid rgb(30, 147, 229); } QComboBox::drop-down { Loading @@ -78,7 +88,6 @@ QComboBox::drop-down { } QComboBox::hover { /* background-color: red; */ border: 1px solid rgb(30, 147, 229); } Loading @@ -95,7 +104,7 @@ QFontComboBox#FontFamilyBox { font-size: 14px; padding-right: 14px; padding-left: 6px; border-color: #b3b6bf; border-color: @borderColor; } QFontComboBox#FontFamilyBox::hover { Loading @@ -108,7 +117,7 @@ SizeComboBox { font-size: 13px; min-width: 43px; max-width: 43px; border-color: #b3b6bf; border-color: @borderColor; } SizeComboBox::hover { Loading Loading @@ -144,7 +153,7 @@ ColorPicker { min-height: 25px; min-width: 25px; max-width: 25px; border: 2px solid #b3b6bf; border: 2px solid @borderColor; } ColorPicker::hover { Loading @@ -158,7 +167,7 @@ AlignmentChecker { AlignmentChecker::indicator { height: 28px; width: 28px; border: 2px solid #b3b6bf; border: 2px solid @borderColor; } AlignmentChecker::indicator:checked { Loading Loading @@ -259,8 +268,8 @@ TextEditListScrollArea { } QListWidget { background-color: #e1e4eb; border-color: #b3b6bf; background-color: @emptyContentBackgroundColor; border-color: @borderColor; border-style: solid; border-width: 1px; } Loading @@ -270,7 +279,7 @@ QAction { } QMenu { background-color: #e1e4eb; background-color: @emptyContentBackgroundColor; margin: 0px; /* some spacing around the menu */ } Loading @@ -278,7 +287,7 @@ QMenu::item { height: 28px; width: 342px; margin: 0px; background-color: #e1e4eb; background-color: @emptyContentBackgroundColor; padding-left: 32px; padding-right: 32px; } Loading @@ -291,7 +300,7 @@ QMenu::separator { } /* QMenu::item { background-color: #e1e4eb; background-color: @emptyContentBackgroundColor; min-height: 100px; }*/ Loading @@ -301,11 +310,11 @@ QMenu::item:selected { QDialog { font-size: 7px; background-color: #ebeef5; background-color: @widgetBackgroundColor; } QGroupBox { background-color: #e1e4eb; background-color: @emptyContentBackgroundColor; } QPushButton { Loading Loading @@ -494,7 +503,7 @@ OpenBtn::pressed { } QProgressBar { background-color: #e1e4eb; background-color: @emptyContentBackgroundColor; width: 450px; height: 45px; max-width: 450px; Loading Loading @@ -545,6 +554,7 @@ StateChecker#ImgTransChecker::indicator:hover StateChecker#ImgTransChecker::indicator:checked { image: url(data/icons/leftbar_imgtrans_activate.svg); color: red; } StateChecker#ConfigChecker::indicator{ Loading Loading @@ -689,7 +699,7 @@ QScrollBar::add-line { QLabel#TitleLabel { font-size: 13px; color: #5d5d5f; color: @qwidgetForegroundColor; } QLabel#angleLabel { Loading Loading @@ -770,13 +780,13 @@ DrawToolCheckBox#DrawRectTool::indicator:checked { } GlobalSearchWidget { border-color: #b3b6bf; border-color: @borderColor; border-style: solid; border-width: 1px; } QScrollArea { border-color: #b3b6bf; border-color: @borderColor; border-style: solid; border-width: 1px; } Loading Loading @@ -871,7 +881,7 @@ TitleBarToolBtn { padding-right: 4px; border-style: none; font-size: 15px; color: #6d6d6f; color: @titleBarColor; } TitleBarToolBtn::hover { Loading ballontranslator/ui/constants.py +1 −0 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ PROGRAM_PATH = osp.dirname(UI_PATH) LIBS_PATH = osp.join(PROGRAM_PATH, 'data/libs') STYLESHEET_PATH = osp.join(PROGRAM_PATH, 'data/config/stylesheet.css') THEME_PATH = osp.join(PROGRAM_PATH, 'data/config/themes.json') CONFIG_PATH = osp.join(PROGRAM_PATH, 'data/config/config.json') CONFIG_FONTSIZE_HEADER = 18 Loading ballontranslator/ui/mainwindow.py +15 −5 Original line number Diff line number Diff line Loading @@ -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 pt2px from .misc import pt2px, parse_stylesheet from .imgtrans_proj import ProjImgTrans from .canvas import Canvas from .configpanel import ConfigPanel Loading @@ -27,7 +27,6 @@ from .constants import STYLESHEET_PATH, CONFIG_PATH from .global_search_widget import GlobalSearchWidget from . import constants as C from .textedit_commands import GlobalRepalceAllCommand from .framelesswindow import FramelessWindow class PageListView(QListWidget): Loading Loading @@ -171,8 +170,8 @@ class MainWindow(FramelessWindow): self.comicTransSplitter.setStretchFactor(1, 10) def setupConfig(self): with open(STYLESHEET_PATH, "r", encoding='utf-8') as f: self.setStyleSheet(f.read()) theme = 'eva-dark' if self.config.darkmode else 'eva-light' self.setStyleSheet(parse_stylesheet(theme)) self.bottomBar.originalSlider.setValue(self.config.original_transparency * 100) self.drawingPanel.maskTransperancySlider.setValue(self.config.mask_transparency * 100) Loading Loading @@ -204,6 +203,8 @@ class MainWindow(FramelessWindow): self.bottomBar.translatorStatusbtn.clicked.connect(self.translatorStatusBtnPressed) self.bottomBar.transTranspageBtn.run_target.connect(self.on_transpagebtn_pressed) self.titleBar.darkModeAction.setChecked(self.config.darkmode) self.drawingPanel.set_config(self.config.drawpanel) self.drawingPanel.initDLModule(dl_manager) Loading Loading @@ -370,6 +371,7 @@ class MainWindow(FramelessWindow): self.titleBar.run_trigger.connect(self.leftBar.runImgtransBtn.click) self.titleBar.translate_page_trigger.connect(self.bottomBar.transTranspageBtn.click) self.titleBar.fontstyle_trigger.connect(self.show_fontstyle_presets) self.titleBar.darkmode_trigger.connect(self.on_darkmode_triggered) shortcutTextblock = QShortcut(QKeySequence("W"), self) shortcutTextblock.activated.connect(self.shortcutTextblock) Loading Loading @@ -581,6 +583,8 @@ class MainWindow(FramelessWindow): self.saveCurrentPage(update_scene_text=True, restore_interface=True) def saveCurrentPage(self, update_scene_text=True, save_proj=True, restore_interface=False, save_rst_only=False): if not self.imgtrans_proj.img_valid: return if update_scene_text: self.st_manager.updateTextBlkList() Loading Loading @@ -820,3 +824,9 @@ class MainWindow(FramelessWindow): ) rt.sceneitem_list = None rt.background_list = None def on_darkmode_triggered(self): self.config.darkmode = self.titleBar.darkModeAction.isChecked() theme = 'eva-dark' if self.config.darkmode else 'eva-light' css = parse_stylesheet(theme=theme) self.setStyleSheet(css) No newline at end of file ballontranslator/ui/mainwindowbars.py +6 −0 Original line number Diff line number Diff line Loading @@ -338,15 +338,21 @@ class TitleBar(Widget): texteditAction = QAction(self.tr('Text Editor'), self) texteditAction.setShortcut(QKeySequence('T')) fontStylePresetAction = QAction(self.tr('Text Style Presets'), self) self.darkModeAction = darkModeAction = QAction(self.tr('Dark Mode'), self) darkModeAction.setCheckable(True) viewMenu = QMenu(self.viewToolBtn) viewMenu.addActions([drawBoardAction, texteditAction]) viewMenu.addSeparator() viewMenu.addAction(fontStylePresetAction) viewMenu.addSeparator() viewMenu.addAction(darkModeAction) self.viewToolBtn.setMenu(viewMenu) self.viewToolBtn.setPopupMode(QToolButton.InstantPopup) self.textedit_trigger = texteditAction.triggered self.drawboard_trigger = drawBoardAction.triggered self.fontstyle_trigger = fontStylePresetAction.triggered self.darkmode_trigger = darkModeAction.triggered self.goToolBtn = TitleBarToolBtn(self) self.goToolBtn.setText(self.tr('Go')) Loading ballontranslator/ui/misc.py +18 −3 Original line number Diff line number Diff line import cv2, re import cv2, re, json import numpy as np import os.path as osp from typing import Tuple, Union, List, Dict from qtpy.QtGui import QPixmap, QColor, QImage, QTextDocument, QTextCursor from . import constants from .constants import DEFAULT_FONT_FAMILY from .constants import DEFAULT_FONT_FAMILY, STYLESHEET_PATH, THEME_PATH from utils.io_utils import find_all_imgs, NumpyEncoder, imread, imwrite from dl.textdetector.textblock import TextBlock Loading Loading @@ -262,6 +262,7 @@ class ProgramConfig: gsearch_whole_word: bool = False, gsearch_regex: bool = False, gsearch_range: int = 0, darkmode: bool = False, **kwargs) -> None: if isinstance(dl, dict): Loading Loading @@ -305,6 +306,7 @@ class ProgramConfig: self.gsearch_whole_word = gsearch_whole_word self.gsearch_regex = gsearch_regex self.gsearch_range = gsearch_range self.darkmode = darkmode class LruIgnoreArg: Loading Loading @@ -386,3 +388,16 @@ def doc_replace_no_shift(doc: QTextDocument, span_list: List, target: str): cursor.setPosition(span[1], QTextCursor.MoveMode.KeepAnchor) cursor.insertText(target) cursor.endEditBlock() def parse_stylesheet(theme: str = '') -> str: with open(STYLESHEET_PATH, "r", encoding='utf-8') as f: stylesheet = f.read() with open(THEME_PATH, 'r', encoding='utf8') as f: theme_dict: Dict = json.loads(f.read()) if not theme or theme not in theme_dict: tgt_theme: Dict = theme_dict[list(theme_dict.keys())[0]] else: tgt_theme: Dict = theme_dict[theme] for key, val in tgt_theme.items(): stylesheet = stylesheet.replace(key, val) return stylesheet No newline at end of file Loading
ballontranslator/data/config/stylesheet.css +43 −33 Original line number Diff line number Diff line QWidget { /* border-style: none; */ color: #5d5d5f; color: @qwidgetForegroundColor; background-color: @qwidgetBackgroundColor; } SeparatorWidget { border-color: #b3b6bf; border-color: @borderColor; } Widget { background-color: #ebeef5; background-color: @widgetBackgroundColor; } CustomGV { background-color: #e6e9f0; border-color: #b3b6bf; background-color: @emptyContentBackgroundColor; border-color: @borderColor; border-style: solid; border-width: 1px; } ConfigTable { border-color: #b3b6bf; border-color: @borderColor; border-style: solid; border-width: 1px; background-color: #e1e4eb background-color: @emptyContentBackgroundColor } ConfigBlock { background-color: #e1e4eb background-color: @emptyContentBackgroundColor } ConfigSubBlock { background-color: #e1e4eb background-color: @emptyContentBackgroundColor } SearchResultTree { border-style: none; background-color: #ebeef5; background-color: @widgetBackgroundColor; } QSplitter:handle { background: #ebeef5; background: @widgetBackgroundColor; } QSplitter::handle:pressed { Loading @@ -48,20 +48,18 @@ QSplitter::handle:pressed { } ConfigSubBlock::hover { /* background-color: rgba(200, 215, 255, 50%); */ background-color: rgba(30, 147, 229, 20%); } SourceTextEdit { font-size: 17px; background-color: #e1e4eb; background-color: @emptyContentBackgroundColor; border-radius: 7px; border-style: none; } TransTextEdit { font-size: 17px; /* background-color: #e1e4eb; */ border-radius: 7px; background-color: whitesmoke; } Loading @@ -70,7 +68,19 @@ QComboBox { height: 27px; font-size: 14px; padding-left: 8px; border: 1px solid whitesmoke; border: 1px solid @borderColor; } QLineEdit { border: 1px solid @borderColor; } QPlainTextEdit { border: 1px solid @borderColor; } QPlainTextEdit:focus { border: 1px solid rgb(30, 147, 229); } QComboBox::drop-down { Loading @@ -78,7 +88,6 @@ QComboBox::drop-down { } QComboBox::hover { /* background-color: red; */ border: 1px solid rgb(30, 147, 229); } Loading @@ -95,7 +104,7 @@ QFontComboBox#FontFamilyBox { font-size: 14px; padding-right: 14px; padding-left: 6px; border-color: #b3b6bf; border-color: @borderColor; } QFontComboBox#FontFamilyBox::hover { Loading @@ -108,7 +117,7 @@ SizeComboBox { font-size: 13px; min-width: 43px; max-width: 43px; border-color: #b3b6bf; border-color: @borderColor; } SizeComboBox::hover { Loading Loading @@ -144,7 +153,7 @@ ColorPicker { min-height: 25px; min-width: 25px; max-width: 25px; border: 2px solid #b3b6bf; border: 2px solid @borderColor; } ColorPicker::hover { Loading @@ -158,7 +167,7 @@ AlignmentChecker { AlignmentChecker::indicator { height: 28px; width: 28px; border: 2px solid #b3b6bf; border: 2px solid @borderColor; } AlignmentChecker::indicator:checked { Loading Loading @@ -259,8 +268,8 @@ TextEditListScrollArea { } QListWidget { background-color: #e1e4eb; border-color: #b3b6bf; background-color: @emptyContentBackgroundColor; border-color: @borderColor; border-style: solid; border-width: 1px; } Loading @@ -270,7 +279,7 @@ QAction { } QMenu { background-color: #e1e4eb; background-color: @emptyContentBackgroundColor; margin: 0px; /* some spacing around the menu */ } Loading @@ -278,7 +287,7 @@ QMenu::item { height: 28px; width: 342px; margin: 0px; background-color: #e1e4eb; background-color: @emptyContentBackgroundColor; padding-left: 32px; padding-right: 32px; } Loading @@ -291,7 +300,7 @@ QMenu::separator { } /* QMenu::item { background-color: #e1e4eb; background-color: @emptyContentBackgroundColor; min-height: 100px; }*/ Loading @@ -301,11 +310,11 @@ QMenu::item:selected { QDialog { font-size: 7px; background-color: #ebeef5; background-color: @widgetBackgroundColor; } QGroupBox { background-color: #e1e4eb; background-color: @emptyContentBackgroundColor; } QPushButton { Loading Loading @@ -494,7 +503,7 @@ OpenBtn::pressed { } QProgressBar { background-color: #e1e4eb; background-color: @emptyContentBackgroundColor; width: 450px; height: 45px; max-width: 450px; Loading Loading @@ -545,6 +554,7 @@ StateChecker#ImgTransChecker::indicator:hover StateChecker#ImgTransChecker::indicator:checked { image: url(data/icons/leftbar_imgtrans_activate.svg); color: red; } StateChecker#ConfigChecker::indicator{ Loading Loading @@ -689,7 +699,7 @@ QScrollBar::add-line { QLabel#TitleLabel { font-size: 13px; color: #5d5d5f; color: @qwidgetForegroundColor; } QLabel#angleLabel { Loading Loading @@ -770,13 +780,13 @@ DrawToolCheckBox#DrawRectTool::indicator:checked { } GlobalSearchWidget { border-color: #b3b6bf; border-color: @borderColor; border-style: solid; border-width: 1px; } QScrollArea { border-color: #b3b6bf; border-color: @borderColor; border-style: solid; border-width: 1px; } Loading Loading @@ -871,7 +881,7 @@ TitleBarToolBtn { padding-right: 4px; border-style: none; font-size: 15px; color: #6d6d6f; color: @titleBarColor; } TitleBarToolBtn::hover { Loading
ballontranslator/ui/constants.py +1 −0 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ PROGRAM_PATH = osp.dirname(UI_PATH) LIBS_PATH = osp.join(PROGRAM_PATH, 'data/libs') STYLESHEET_PATH = osp.join(PROGRAM_PATH, 'data/config/stylesheet.css') THEME_PATH = osp.join(PROGRAM_PATH, 'data/config/themes.json') CONFIG_PATH = osp.join(PROGRAM_PATH, 'data/config/config.json') CONFIG_FONTSIZE_HEADER = 18 Loading
ballontranslator/ui/mainwindow.py +15 −5 Original line number Diff line number Diff line Loading @@ -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 pt2px from .misc import pt2px, parse_stylesheet from .imgtrans_proj import ProjImgTrans from .canvas import Canvas from .configpanel import ConfigPanel Loading @@ -27,7 +27,6 @@ from .constants import STYLESHEET_PATH, CONFIG_PATH from .global_search_widget import GlobalSearchWidget from . import constants as C from .textedit_commands import GlobalRepalceAllCommand from .framelesswindow import FramelessWindow class PageListView(QListWidget): Loading Loading @@ -171,8 +170,8 @@ class MainWindow(FramelessWindow): self.comicTransSplitter.setStretchFactor(1, 10) def setupConfig(self): with open(STYLESHEET_PATH, "r", encoding='utf-8') as f: self.setStyleSheet(f.read()) theme = 'eva-dark' if self.config.darkmode else 'eva-light' self.setStyleSheet(parse_stylesheet(theme)) self.bottomBar.originalSlider.setValue(self.config.original_transparency * 100) self.drawingPanel.maskTransperancySlider.setValue(self.config.mask_transparency * 100) Loading Loading @@ -204,6 +203,8 @@ class MainWindow(FramelessWindow): self.bottomBar.translatorStatusbtn.clicked.connect(self.translatorStatusBtnPressed) self.bottomBar.transTranspageBtn.run_target.connect(self.on_transpagebtn_pressed) self.titleBar.darkModeAction.setChecked(self.config.darkmode) self.drawingPanel.set_config(self.config.drawpanel) self.drawingPanel.initDLModule(dl_manager) Loading Loading @@ -370,6 +371,7 @@ class MainWindow(FramelessWindow): self.titleBar.run_trigger.connect(self.leftBar.runImgtransBtn.click) self.titleBar.translate_page_trigger.connect(self.bottomBar.transTranspageBtn.click) self.titleBar.fontstyle_trigger.connect(self.show_fontstyle_presets) self.titleBar.darkmode_trigger.connect(self.on_darkmode_triggered) shortcutTextblock = QShortcut(QKeySequence("W"), self) shortcutTextblock.activated.connect(self.shortcutTextblock) Loading Loading @@ -581,6 +583,8 @@ class MainWindow(FramelessWindow): self.saveCurrentPage(update_scene_text=True, restore_interface=True) def saveCurrentPage(self, update_scene_text=True, save_proj=True, restore_interface=False, save_rst_only=False): if not self.imgtrans_proj.img_valid: return if update_scene_text: self.st_manager.updateTextBlkList() Loading Loading @@ -820,3 +824,9 @@ class MainWindow(FramelessWindow): ) rt.sceneitem_list = None rt.background_list = None def on_darkmode_triggered(self): self.config.darkmode = self.titleBar.darkModeAction.isChecked() theme = 'eva-dark' if self.config.darkmode else 'eva-light' css = parse_stylesheet(theme=theme) self.setStyleSheet(css) No newline at end of file
ballontranslator/ui/mainwindowbars.py +6 −0 Original line number Diff line number Diff line Loading @@ -338,15 +338,21 @@ class TitleBar(Widget): texteditAction = QAction(self.tr('Text Editor'), self) texteditAction.setShortcut(QKeySequence('T')) fontStylePresetAction = QAction(self.tr('Text Style Presets'), self) self.darkModeAction = darkModeAction = QAction(self.tr('Dark Mode'), self) darkModeAction.setCheckable(True) viewMenu = QMenu(self.viewToolBtn) viewMenu.addActions([drawBoardAction, texteditAction]) viewMenu.addSeparator() viewMenu.addAction(fontStylePresetAction) viewMenu.addSeparator() viewMenu.addAction(darkModeAction) self.viewToolBtn.setMenu(viewMenu) self.viewToolBtn.setPopupMode(QToolButton.InstantPopup) self.textedit_trigger = texteditAction.triggered self.drawboard_trigger = drawBoardAction.triggered self.fontstyle_trigger = fontStylePresetAction.triggered self.darkmode_trigger = darkModeAction.triggered self.goToolBtn = TitleBarToolBtn(self) self.goToolBtn.setText(self.tr('Go')) Loading
ballontranslator/ui/misc.py +18 −3 Original line number Diff line number Diff line import cv2, re import cv2, re, json import numpy as np import os.path as osp from typing import Tuple, Union, List, Dict from qtpy.QtGui import QPixmap, QColor, QImage, QTextDocument, QTextCursor from . import constants from .constants import DEFAULT_FONT_FAMILY from .constants import DEFAULT_FONT_FAMILY, STYLESHEET_PATH, THEME_PATH from utils.io_utils import find_all_imgs, NumpyEncoder, imread, imwrite from dl.textdetector.textblock import TextBlock Loading Loading @@ -262,6 +262,7 @@ class ProgramConfig: gsearch_whole_word: bool = False, gsearch_regex: bool = False, gsearch_range: int = 0, darkmode: bool = False, **kwargs) -> None: if isinstance(dl, dict): Loading Loading @@ -305,6 +306,7 @@ class ProgramConfig: self.gsearch_whole_word = gsearch_whole_word self.gsearch_regex = gsearch_regex self.gsearch_range = gsearch_range self.darkmode = darkmode class LruIgnoreArg: Loading Loading @@ -386,3 +388,16 @@ def doc_replace_no_shift(doc: QTextDocument, span_list: List, target: str): cursor.setPosition(span[1], QTextCursor.MoveMode.KeepAnchor) cursor.insertText(target) cursor.endEditBlock() def parse_stylesheet(theme: str = '') -> str: with open(STYLESHEET_PATH, "r", encoding='utf-8') as f: stylesheet = f.read() with open(THEME_PATH, 'r', encoding='utf8') as f: theme_dict: Dict = json.loads(f.read()) if not theme or theme not in theme_dict: tgt_theme: Dict = theme_dict[list(theme_dict.keys())[0]] else: tgt_theme: Dict = theme_dict[theme] for key, val in tgt_theme.items(): stylesheet = stylesheet.replace(key, val) return stylesheet No newline at end of file