Loading launch.py +47 −20 Original line number Diff line number Diff line Loading @@ -100,11 +100,31 @@ def load_translators(translators = None): def load_modules(): load_translators() BT = None APP = None def restart(): global BT print('restarting...\n') BT.close() os.execv(sys.executable, ['python'] + sys.argv) def main(): from utils.logger import setup_logging, logger as LOGGER # parser = argparse.ArgumentParser() from utils import appinfo commit = commit_hash() print('py version: ', sys.version) print('py executable: ', sys.executable) print(f'version: {appinfo.version}') print(f'branch: {appinfo.branch}') print(f"Commit hash: {commit}") prepare_environment() from utils.logger import setup_logging, logger as LOGGER if not args.qt_api in QT_APIS: os.environ['QT_API'] = 'pyqt6' Loading @@ -127,6 +147,7 @@ def main(): from qtpy.QtGui import QGuiApplication, QIcon, QFont from ui import constants as C C.DEFAULT_DISPLAY_LANG = QLocale.system().name() if qtpy.API_NAME[-1] == '6': C.FLAG_QT6 = True else: Loading @@ -142,12 +163,24 @@ def main(): load_modules() app = QApplication(sys.argv) from ui.misc import ProgramConfig try: config = ProgramConfig.load(C.CONFIG_PATH) except Exception as e: LOGGER.exception(e) LOGGER.warning("Failed to load config file, using default config") config = ProgramConfig() lang = config.display_lang langp = osp.join(C.TRANSLATE_DIR, lang + '.qm') if osp.exists(langp): translator = QTranslator() translator.load( QLocale.system().name(), osp.dirname(osp.abspath(__file__)) + "/translate", ) translator.load(lang, osp.dirname(osp.abspath(__file__)) + "/translate") app.installTranslator(translator) elif lang != 'English': LOGGER.warning(f'target display language file {langp} doesnt exist.') LOGGER.info(f'set display language to {lang}') ps = QGuiApplication.primaryScreen() C.LDPI = ps.logicalDotsPerInch() Loading @@ -158,7 +191,12 @@ def main(): QGuiApplication.setFont(yahei) from ui.mainwindow import MainWindow ballontrans = MainWindow(app, open_dir=args.proj_dir) ballontrans = MainWindow(app, config, open_dir=args.proj_dir) global BT BT = ballontrans BT.restart_signal.connect(restart) ballontrans.setWindowIcon(QIcon(C.ICON_PATH)) ballontrans.show() ballontrans.resetStyleSheet() Loading Loading @@ -191,15 +229,4 @@ def prepare_environment(): if __name__ == '__main__': from utils import appinfo commit = commit_hash() print('py version: ', sys.version) print('py executable: ', sys.executable) print(f'version: {appinfo.version}') print(f'branch: {appinfo.branch}') print(f"Commit hash: {commit}") prepare_environment() main() No newline at end of file ui/configpanel.py +5 −12 Original line number Diff line number Diff line Loading @@ -13,11 +13,9 @@ if C.FLAG_QT6: else: from PyQt5 import QtCore from utils.logger import logger as LOGGER from .stylewidgets import Widget, ConfigComboBox from .misc import ProgramConfig, ModuleConfig from .constants import CONFIG_PATH, CONFIG_FONTSIZE_CONTENT, CONFIG_FONTSIZE_HEADER, CONFIG_FONTSIZE_TABLE, CONFIG_COMBOBOX_SHORT, CONFIG_COMBOBOX_LONG, CONFIG_COMBOBOX_MIDEAN from .misc import ProgramConfig 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 class ConfigTextLabel(QLabel): Loading Loading @@ -273,15 +271,10 @@ class ConfigPanel(Widget): save_config = Signal() update_source_download_status = Signal(str) def __init__(self, *args, **kwargs) -> None: def __init__(self, config: ProgramConfig, *args, **kwargs) -> None: super().__init__(*args, **kwargs) try: self.config = ProgramConfig.load(CONFIG_PATH) except Exception as e: LOGGER.exception(e) LOGGER.warning("Failed to load config file, using default config") self.config = ProgramConfig() self.config = config self.configTable = ConfigTable() self.configTable.tableitem_pressed.connect(self.onTableItemPressed) Loading ui/constants.py +18 −1 Original line number Diff line number Diff line import os.path as osp import os ICON_PATH = 'icons/[ICONNAME]' Loading Loading @@ -55,3 +56,19 @@ SLIDERHANDLE_COLOR = (85,85,96) FOREGROUND_FONTCOLOR = (93,93,95) MAX_NUM_LOG = 7 TRANSLATE_DIR = osp.join(PROGRAM_PATH, 'translate') DISPLAY_LANGUAGE_MAP = { 'English': 'English', '简体中文': 'zh_CN', 'Русский': 'ru_RU' } VALID_LANG_SET = set(list(DISPLAY_LANGUAGE_MAP.values())) for p in os.listdir(TRANSLATE_DIR): if p.endswith('.qm'): lang = p.replace('.qm', '') if lang not in VALID_LANG_SET: DISPLAY_LANGUAGE_MAP[lang] = lang DEFAULT_DISPLAY_LANG = 'English' No newline at end of file ui/mainwindow.py +29 −6 Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ import os, re, traceback from typing import List from qtpy.QtWidgets import QHBoxLayout, QVBoxLayout, QApplication, QStackedWidget, QSplitter, QListWidget, QShortcut, QListWidgetItem, QMessageBox, QTextEdit, QPlainTextEdit from qtpy.QtCore import Qt, QPoint, QSize, QEvent from qtpy.QtCore import Qt, QPoint, QSize, QEvent, Signal from qtpy.QtGui import QTextCursor, QGuiApplication, QIcon, QCloseEvent, QKeySequence, QImage, QPainter from utils.logger import logger as LOGGER 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 modules.textdetector.textblock import TextBlock from .misc import pt2px, parse_stylesheet from .misc import pt2px, parse_stylesheet, ProgramConfig from .imgtrans_proj import ProjImgTrans from .canvas import Canvas from .configpanel import ConfigPanel Loading Loading @@ -47,10 +47,15 @@ class MainWindow(FramelessWindow): page_changing = False postprocess_mt_toggle = True def __init__(self, app: QApplication, open_dir='', *args, **kwargs) -> None: translator = None restart_signal = Signal() def __init__(self, app: QApplication, config: ProgramConfig, open_dir='', *args, **kwargs) -> None: super().__init__(*args, **kwargs) self.config = config self.setWindowFlags(self.windowFlags() | Qt.WindowType.FramelessWindowHint) self.app = app self.setupThread() Loading Loading @@ -92,7 +97,7 @@ class MainWindow(FramelessWindow): def setupUi(self): screen_size = QGuiApplication.primaryScreen().geometry().size() self.setMinimumWidth(screen_size.width() // 2) self.configPanel = ConfigPanel(self) self.configPanel = ConfigPanel(self.config, self) self.configPanel.trans_config_panel.show_MT_keyword_window.connect(self.show_MT_keyword_window) self.configPanel.ocr_config_panel.show_OCR_keyword_window.connect(self.show_OCR_keyword_window) self.config = self.configPanel.config Loading Loading @@ -126,6 +131,7 @@ class MainWindow(FramelessWindow): self.titleBar = TitleBar(self) self.titleBar.closebtn_clicked.connect(self.on_closebtn_clicked) self.titleBar.display_lang_changed.connect(self.on_display_lang_changed) self.bottomBar = BottomBar(self) self.bottomBar.textedit_checkchanged.connect(self.setTextEditMode) self.bottomBar.paintmode_checkchanged.connect(self.setPaintMode) Loading Loading @@ -262,7 +268,6 @@ class MainWindow(FramelessWindow): self.drawingPanel.set_config(config.drawpanel) self.drawingPanel.initDLModule(module_manager) self.global_search_widget.imgtrans_proj = self.imgtrans_proj self.global_search_widget.setupReplaceThread(self.st_manager.pairwidget_list, self.st_manager.textblk_item_list) self.global_search_widget.replace_thread.finished.connect(self.on_global_replace_finished) Loading Loading @@ -315,6 +320,9 @@ class MainWindow(FramelessWindow): def setupConfigUI(self): self.centralStackWidget.setCurrentIndex(1) def set_display_lang(self, lang: str): self.retranslateUI() def OpenProj(self, proj_path: str): if osp.isdir(proj_path): self.openDir(proj_path) Loading Loading @@ -392,13 +400,23 @@ class MainWindow(FramelessWindow): def changeEvent(self, event: QEvent): if event.type() == QEvent.Type.WindowStateChange: if self.windowState() & Qt.WindowState.WindowMaximized: self.titleBar.maxBtn.setChecked(True) elif event.type() == QEvent.Type.ActivationChange: self.canvas.on_activation_changed() super().changeEvent(event) def retranslateUI(self): # according to https://stackoverflow.com/questions/27635068/how-to-retranslate-dynamically-created-widgets # we got to do it manually ... I'd rather restart the program msg = QMessageBox() msg.setText(self.tr('Restart to apply changes? \n')) msg.setStandardButtons(QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No) ret = msg.exec_() if ret == QMessageBox.StandardButton.Yes: self.restart_signal.emit() def save_config(self): self.config.imgtrans_paintmode = self.bottomBar.paintChecker.isChecked() self.config.imgtrans_textedit = self.bottomBar.texteditChecker.isChecked() Loading Loading @@ -967,6 +985,11 @@ class MainWindow(FramelessWindow): return self.close() def on_display_lang_changed(self, lang: str): if lang != self.config.display_lang: self.config.display_lang = lang self.set_display_lang(lang) def on_run_imgtrans(self): if self.bottomBar.textblockChecker.isChecked(): self.bottomBar.textblockChecker.click() Loading ui/mainwindowbars.py +31 −5 Original line number Diff line number Diff line import os.path as osp from typing import List, Union from .stylewidgets import Widget, PaintQSlider from .constants import TITLEBAR_HEIGHT, WINDOW_BORDER_WIDTH, BOTTOMBAR_HEIGHT, LEFTBAR_WIDTH, LEFTBTN_WIDTH from qtpy.QtWidgets import QMainWindow, QHBoxLayout, QVBoxLayout, QFileDialog, QLabel, QSizePolicy, QToolBar, QMenu, QSpacerItem, QPushButton, QCheckBox, QToolButton from qtpy.QtCore import Qt, Signal, QPoint from qtpy.QtGui import QMouseEvent, QKeySequence from qtpy.QtGui import QMouseEvent, QKeySequence, QActionGroup from .stylewidgets import Widget, PaintQSlider from .constants import TITLEBAR_HEIGHT, WINDOW_BORDER_WIDTH, BOTTOMBAR_HEIGHT, LEFTBAR_WIDTH, LEFTBTN_WIDTH from .framelesswindow import startSystemMove from .misc import ProgramConfig from . import constants as C if C.FLAG_QT6: from qtpy.QtGui import QAction Loading Loading @@ -311,9 +311,15 @@ class LeftBar(Widget): class TitleBar(Widget): closebtn_clicked = Signal() display_lang_changed = Signal(str) def __init__(self, parent, *args, **kwargs) -> None: super().__init__(parent, *args, **kwargs) config: ProgramConfig = parent.config self.mainwindow : QMainWindow = parent self.mPos: QPoint = None self.normalsize = False Loading Loading @@ -353,6 +359,21 @@ class TitleBar(Widget): self.viewToolBtn = TitleBarToolBtn(self) self.viewToolBtn.setText(self.tr('View')) self.displayLanguageMenu = QMenu(self.tr("Display Language"), self) self.lang_ac_group = lang_ac_group = QActionGroup(self) lang_ac_group.setExclusive(True) lang_actions = [] for lang, lang_code in C.DISPLAY_LANGUAGE_MAP.items(): la = QAction(lang, self) if lang_code == config.display_lang: la.setChecked(True) la.triggered.connect(self.on_displaylang_triggered) la.setCheckable(True) lang_ac_group.addAction(la) lang_actions.append(la) self.displayLanguageMenu.addActions(lang_actions) drawBoardAction = QAction(self.tr('Drawing Board'), self) drawBoardAction.setShortcut(QKeySequence('P')) texteditAction = QAction(self.tr('Text Editor'), self) Loading @@ -362,6 +383,7 @@ class TitleBar(Widget): darkModeAction.setCheckable(True) viewMenu = QMenu(self.viewToolBtn) viewMenu.addMenu(self.displayLanguageMenu) viewMenu.addActions([drawBoardAction, texteditAction]) viewMenu.addSeparator() viewMenu.addAction(fontStylePresetAction) Loading Loading @@ -441,6 +463,10 @@ class TitleBar(Widget): def onMinBtnClicked(self): self.mainwindow.showMinimized() def on_displaylang_triggered(self): ac = self.lang_ac_group.checkedAction() self.display_lang_changed.emit(C.DISPLAY_LANGUAGE_MAP[ac.text()]) def mousePressEvent(self, event: QMouseEvent) -> None: if C.FLAG_QT6: Loading Loading
launch.py +47 −20 Original line number Diff line number Diff line Loading @@ -100,11 +100,31 @@ def load_translators(translators = None): def load_modules(): load_translators() BT = None APP = None def restart(): global BT print('restarting...\n') BT.close() os.execv(sys.executable, ['python'] + sys.argv) def main(): from utils.logger import setup_logging, logger as LOGGER # parser = argparse.ArgumentParser() from utils import appinfo commit = commit_hash() print('py version: ', sys.version) print('py executable: ', sys.executable) print(f'version: {appinfo.version}') print(f'branch: {appinfo.branch}') print(f"Commit hash: {commit}") prepare_environment() from utils.logger import setup_logging, logger as LOGGER if not args.qt_api in QT_APIS: os.environ['QT_API'] = 'pyqt6' Loading @@ -127,6 +147,7 @@ def main(): from qtpy.QtGui import QGuiApplication, QIcon, QFont from ui import constants as C C.DEFAULT_DISPLAY_LANG = QLocale.system().name() if qtpy.API_NAME[-1] == '6': C.FLAG_QT6 = True else: Loading @@ -142,12 +163,24 @@ def main(): load_modules() app = QApplication(sys.argv) from ui.misc import ProgramConfig try: config = ProgramConfig.load(C.CONFIG_PATH) except Exception as e: LOGGER.exception(e) LOGGER.warning("Failed to load config file, using default config") config = ProgramConfig() lang = config.display_lang langp = osp.join(C.TRANSLATE_DIR, lang + '.qm') if osp.exists(langp): translator = QTranslator() translator.load( QLocale.system().name(), osp.dirname(osp.abspath(__file__)) + "/translate", ) translator.load(lang, osp.dirname(osp.abspath(__file__)) + "/translate") app.installTranslator(translator) elif lang != 'English': LOGGER.warning(f'target display language file {langp} doesnt exist.') LOGGER.info(f'set display language to {lang}') ps = QGuiApplication.primaryScreen() C.LDPI = ps.logicalDotsPerInch() Loading @@ -158,7 +191,12 @@ def main(): QGuiApplication.setFont(yahei) from ui.mainwindow import MainWindow ballontrans = MainWindow(app, open_dir=args.proj_dir) ballontrans = MainWindow(app, config, open_dir=args.proj_dir) global BT BT = ballontrans BT.restart_signal.connect(restart) ballontrans.setWindowIcon(QIcon(C.ICON_PATH)) ballontrans.show() ballontrans.resetStyleSheet() Loading Loading @@ -191,15 +229,4 @@ def prepare_environment(): if __name__ == '__main__': from utils import appinfo commit = commit_hash() print('py version: ', sys.version) print('py executable: ', sys.executable) print(f'version: {appinfo.version}') print(f'branch: {appinfo.branch}') print(f"Commit hash: {commit}") prepare_environment() main() No newline at end of file
ui/configpanel.py +5 −12 Original line number Diff line number Diff line Loading @@ -13,11 +13,9 @@ if C.FLAG_QT6: else: from PyQt5 import QtCore from utils.logger import logger as LOGGER from .stylewidgets import Widget, ConfigComboBox from .misc import ProgramConfig, ModuleConfig from .constants import CONFIG_PATH, CONFIG_FONTSIZE_CONTENT, CONFIG_FONTSIZE_HEADER, CONFIG_FONTSIZE_TABLE, CONFIG_COMBOBOX_SHORT, CONFIG_COMBOBOX_LONG, CONFIG_COMBOBOX_MIDEAN from .misc import ProgramConfig 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 class ConfigTextLabel(QLabel): Loading Loading @@ -273,15 +271,10 @@ class ConfigPanel(Widget): save_config = Signal() update_source_download_status = Signal(str) def __init__(self, *args, **kwargs) -> None: def __init__(self, config: ProgramConfig, *args, **kwargs) -> None: super().__init__(*args, **kwargs) try: self.config = ProgramConfig.load(CONFIG_PATH) except Exception as e: LOGGER.exception(e) LOGGER.warning("Failed to load config file, using default config") self.config = ProgramConfig() self.config = config self.configTable = ConfigTable() self.configTable.tableitem_pressed.connect(self.onTableItemPressed) Loading
ui/constants.py +18 −1 Original line number Diff line number Diff line import os.path as osp import os ICON_PATH = 'icons/[ICONNAME]' Loading Loading @@ -55,3 +56,19 @@ SLIDERHANDLE_COLOR = (85,85,96) FOREGROUND_FONTCOLOR = (93,93,95) MAX_NUM_LOG = 7 TRANSLATE_DIR = osp.join(PROGRAM_PATH, 'translate') DISPLAY_LANGUAGE_MAP = { 'English': 'English', '简体中文': 'zh_CN', 'Русский': 'ru_RU' } VALID_LANG_SET = set(list(DISPLAY_LANGUAGE_MAP.values())) for p in os.listdir(TRANSLATE_DIR): if p.endswith('.qm'): lang = p.replace('.qm', '') if lang not in VALID_LANG_SET: DISPLAY_LANGUAGE_MAP[lang] = lang DEFAULT_DISPLAY_LANG = 'English' No newline at end of file
ui/mainwindow.py +29 −6 Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ import os, re, traceback from typing import List from qtpy.QtWidgets import QHBoxLayout, QVBoxLayout, QApplication, QStackedWidget, QSplitter, QListWidget, QShortcut, QListWidgetItem, QMessageBox, QTextEdit, QPlainTextEdit from qtpy.QtCore import Qt, QPoint, QSize, QEvent from qtpy.QtCore import Qt, QPoint, QSize, QEvent, Signal from qtpy.QtGui import QTextCursor, QGuiApplication, QIcon, QCloseEvent, QKeySequence, QImage, QPainter from utils.logger import logger as LOGGER 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 modules.textdetector.textblock import TextBlock from .misc import pt2px, parse_stylesheet from .misc import pt2px, parse_stylesheet, ProgramConfig from .imgtrans_proj import ProjImgTrans from .canvas import Canvas from .configpanel import ConfigPanel Loading Loading @@ -47,10 +47,15 @@ class MainWindow(FramelessWindow): page_changing = False postprocess_mt_toggle = True def __init__(self, app: QApplication, open_dir='', *args, **kwargs) -> None: translator = None restart_signal = Signal() def __init__(self, app: QApplication, config: ProgramConfig, open_dir='', *args, **kwargs) -> None: super().__init__(*args, **kwargs) self.config = config self.setWindowFlags(self.windowFlags() | Qt.WindowType.FramelessWindowHint) self.app = app self.setupThread() Loading Loading @@ -92,7 +97,7 @@ class MainWindow(FramelessWindow): def setupUi(self): screen_size = QGuiApplication.primaryScreen().geometry().size() self.setMinimumWidth(screen_size.width() // 2) self.configPanel = ConfigPanel(self) self.configPanel = ConfigPanel(self.config, self) self.configPanel.trans_config_panel.show_MT_keyword_window.connect(self.show_MT_keyword_window) self.configPanel.ocr_config_panel.show_OCR_keyword_window.connect(self.show_OCR_keyword_window) self.config = self.configPanel.config Loading Loading @@ -126,6 +131,7 @@ class MainWindow(FramelessWindow): self.titleBar = TitleBar(self) self.titleBar.closebtn_clicked.connect(self.on_closebtn_clicked) self.titleBar.display_lang_changed.connect(self.on_display_lang_changed) self.bottomBar = BottomBar(self) self.bottomBar.textedit_checkchanged.connect(self.setTextEditMode) self.bottomBar.paintmode_checkchanged.connect(self.setPaintMode) Loading Loading @@ -262,7 +268,6 @@ class MainWindow(FramelessWindow): self.drawingPanel.set_config(config.drawpanel) self.drawingPanel.initDLModule(module_manager) self.global_search_widget.imgtrans_proj = self.imgtrans_proj self.global_search_widget.setupReplaceThread(self.st_manager.pairwidget_list, self.st_manager.textblk_item_list) self.global_search_widget.replace_thread.finished.connect(self.on_global_replace_finished) Loading Loading @@ -315,6 +320,9 @@ class MainWindow(FramelessWindow): def setupConfigUI(self): self.centralStackWidget.setCurrentIndex(1) def set_display_lang(self, lang: str): self.retranslateUI() def OpenProj(self, proj_path: str): if osp.isdir(proj_path): self.openDir(proj_path) Loading Loading @@ -392,13 +400,23 @@ class MainWindow(FramelessWindow): def changeEvent(self, event: QEvent): if event.type() == QEvent.Type.WindowStateChange: if self.windowState() & Qt.WindowState.WindowMaximized: self.titleBar.maxBtn.setChecked(True) elif event.type() == QEvent.Type.ActivationChange: self.canvas.on_activation_changed() super().changeEvent(event) def retranslateUI(self): # according to https://stackoverflow.com/questions/27635068/how-to-retranslate-dynamically-created-widgets # we got to do it manually ... I'd rather restart the program msg = QMessageBox() msg.setText(self.tr('Restart to apply changes? \n')) msg.setStandardButtons(QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No) ret = msg.exec_() if ret == QMessageBox.StandardButton.Yes: self.restart_signal.emit() def save_config(self): self.config.imgtrans_paintmode = self.bottomBar.paintChecker.isChecked() self.config.imgtrans_textedit = self.bottomBar.texteditChecker.isChecked() Loading Loading @@ -967,6 +985,11 @@ class MainWindow(FramelessWindow): return self.close() def on_display_lang_changed(self, lang: str): if lang != self.config.display_lang: self.config.display_lang = lang self.set_display_lang(lang) def on_run_imgtrans(self): if self.bottomBar.textblockChecker.isChecked(): self.bottomBar.textblockChecker.click() Loading
ui/mainwindowbars.py +31 −5 Original line number Diff line number Diff line import os.path as osp from typing import List, Union from .stylewidgets import Widget, PaintQSlider from .constants import TITLEBAR_HEIGHT, WINDOW_BORDER_WIDTH, BOTTOMBAR_HEIGHT, LEFTBAR_WIDTH, LEFTBTN_WIDTH from qtpy.QtWidgets import QMainWindow, QHBoxLayout, QVBoxLayout, QFileDialog, QLabel, QSizePolicy, QToolBar, QMenu, QSpacerItem, QPushButton, QCheckBox, QToolButton from qtpy.QtCore import Qt, Signal, QPoint from qtpy.QtGui import QMouseEvent, QKeySequence from qtpy.QtGui import QMouseEvent, QKeySequence, QActionGroup from .stylewidgets import Widget, PaintQSlider from .constants import TITLEBAR_HEIGHT, WINDOW_BORDER_WIDTH, BOTTOMBAR_HEIGHT, LEFTBAR_WIDTH, LEFTBTN_WIDTH from .framelesswindow import startSystemMove from .misc import ProgramConfig from . import constants as C if C.FLAG_QT6: from qtpy.QtGui import QAction Loading Loading @@ -311,9 +311,15 @@ class LeftBar(Widget): class TitleBar(Widget): closebtn_clicked = Signal() display_lang_changed = Signal(str) def __init__(self, parent, *args, **kwargs) -> None: super().__init__(parent, *args, **kwargs) config: ProgramConfig = parent.config self.mainwindow : QMainWindow = parent self.mPos: QPoint = None self.normalsize = False Loading Loading @@ -353,6 +359,21 @@ class TitleBar(Widget): self.viewToolBtn = TitleBarToolBtn(self) self.viewToolBtn.setText(self.tr('View')) self.displayLanguageMenu = QMenu(self.tr("Display Language"), self) self.lang_ac_group = lang_ac_group = QActionGroup(self) lang_ac_group.setExclusive(True) lang_actions = [] for lang, lang_code in C.DISPLAY_LANGUAGE_MAP.items(): la = QAction(lang, self) if lang_code == config.display_lang: la.setChecked(True) la.triggered.connect(self.on_displaylang_triggered) la.setCheckable(True) lang_ac_group.addAction(la) lang_actions.append(la) self.displayLanguageMenu.addActions(lang_actions) drawBoardAction = QAction(self.tr('Drawing Board'), self) drawBoardAction.setShortcut(QKeySequence('P')) texteditAction = QAction(self.tr('Text Editor'), self) Loading @@ -362,6 +383,7 @@ class TitleBar(Widget): darkModeAction.setCheckable(True) viewMenu = QMenu(self.viewToolBtn) viewMenu.addMenu(self.displayLanguageMenu) viewMenu.addActions([drawBoardAction, texteditAction]) viewMenu.addSeparator() viewMenu.addAction(fontStylePresetAction) Loading Loading @@ -441,6 +463,10 @@ class TitleBar(Widget): def onMinBtnClicked(self): self.mainwindow.showMinimized() def on_displaylang_triggered(self): ac = self.lang_ac_group.checkedAction() self.display_lang_changed.emit(C.DISPLAY_LANGUAGE_MAP[ac.text()]) def mousePressEvent(self, event: QMouseEvent) -> None: if C.FLAG_QT6: Loading