Loading ballontranslator/ui/configpanel.py +11 −2 Original line number Diff line number Diff line Loading @@ -258,6 +258,9 @@ class GeneralPanel(QWidget): class ConfigPanel(Widget): save_config = Signal() def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) Loading Loading @@ -329,15 +332,18 @@ class ConfigPanel(Widget): generalConfigPanel.addTextLabel(label_lettering) dec_program_str = self.tr('decide by program') use_global_str = self.tr('use global setting') to_uppercase_str = self.tr('To uppercase') self.let_fntsize_combox = generalConfigPanel.addCombobox([dec_program_str, use_global_str], self.tr('font size')) self.let_fntsize_combox.currentIndexChanged.connect(self.on_fntsize_flag_changed) self.let_fntstroke_combox = generalConfigPanel.addCombobox([dec_program_str, use_global_str], self.tr('stroke')) self.let_fntstroke_combox.currentIndexChanged.connect(self.on_fntstroke_flag_changed) self.let_fntcolor_combox = generalConfigPanel.addCombobox([dec_program_str, use_global_str], self.tr('font & stroke color')) self.let_fntcolor_combox.currentIndexChanged.connect(self.on_fontcolor_flag_changed) self.let_uppercase_checker = generalConfigPanel.addCheckBox(to_uppercase_str) self.let_autolayout_checker = generalConfigPanel.addCheckBox(self.tr('Auto layout')) self.let_autolayout_checker.stateChanged.connect(self.on_autolayout_changed) self.let_uppercase_checker = generalConfigPanel.addCheckBox(self.tr('To uppercase')) self.let_uppercase_checker.stateChanged.connect(self.on_uppercase_changed) splitter = QSplitter(Qt.Orientation.Horizontal) splitter.addWidget(self.configTable) splitter.addWidget(self.configContent) Loading Loading @@ -375,6 +381,9 @@ class ConfigPanel(Widget): def on_fntstroke_flag_changed(self): self.config.let_fntstroke_flag = self.let_fntstroke_combox.currentIndex() def on_autolayout_changed(self): self.config.let_autolayout_flag = self.let_autolayout_checker.isChecked() def on_uppercase_changed(self): self.config.let_uppercase_flag = self.let_uppercase_checker.isChecked() Loading ballontranslator/ui/dl_manager.py +4 −3 Original line number Diff line number Diff line Loading @@ -17,7 +17,7 @@ dl.translators.SYSTEM_LANG = QLocale.system().name() from .stylewidgets import ProgressMessageBox from .configpanel import ConfigPanel from .misc import ProjImgTrans, DLModuleConfig from .misc import ProjImgTrans, DLModuleConfig, ProgramConfig class ModuleThread(QThread): Loading Loading @@ -390,12 +390,13 @@ class DLManager(QObject): run_canvas_inpaint = False def __init__(self, dl_config: DLModuleConfig, config: ProgramConfig, imgtrans_proj: ProjImgTrans, config_panel: ConfigPanel, *args, **kwargs) -> None: super().__init__(*args, **kwargs) self.dl_config = dl_config self.config = config self.dl_config = dl_config = config.dl self.imgtrans_proj = imgtrans_proj self.textdetect_thread = TextDetectThread(self.dl_config) Loading ballontranslator/ui/mainwindow.py +28 −12 Original line number Diff line number Diff line import os.path as osp import os import json from qtpy.QtWidgets import QMainWindow, QHBoxLayout, QVBoxLayout, QApplication, QStackedWidget, QWidget, QSplitter, QListWidget, QShortcut, QListWidgetItem from qtpy.QtCore import Qt, QPoint, QSize Loading Loading @@ -33,6 +32,7 @@ class MainWindow(QMainWindow): proj_directory = None imgtrans_proj: ProjImgTrans = ProjImgTrans() save_on_page_changed = True opening_dir = False def __init__(self, app: QApplication, open_dir='', *args, **kwargs) -> None: super().__init__(*args, **kwargs) Loading Loading @@ -134,8 +134,8 @@ class MainWindow(QMainWindow): self.bottomBar.originalSlider.setValue(self.config.original_transparency * 100) self.drawingPanel.maskTransperancySlider.setValue(self.config.mask_transparency * 100) self.leftBar.updateRecentProjList(self.config.recent_proj_list) self.leftBar.recent_proj_list = self.config.recent_proj_list self.leftBar.initRecentProjMenu(self.config.recent_proj_list) self.leftBar.save_config.connect(self.save_config) self.leftBar.imgTransChecker.setChecked(True) self.st_manager.formatpanel.global_format = self.config.global_fontformat self.st_manager.formatpanel.set_active_format(self.config.global_fontformat) Loading @@ -147,7 +147,7 @@ class MainWindow(QMainWindow): self.bottomBar.ocrChecker.setCheckState(self.config.dl.enable_ocr) self.bottomBar.transChecker.setChecked(self.config.dl.enable_translate) self.dl_manager = dl_manager = DLManager(self.config.dl, self.imgtrans_proj, self.configPanel) self.dl_manager = dl_manager = DLManager(self.config, self.imgtrans_proj, self.configPanel) dl_manager.update_translator_status.connect(self.updateTranslatorStatus) dl_manager.update_inpainter_status.connect(self.updateInpainterStatus) dl_manager.finish_translate_page.connect(self.finishTranslatePage) Loading @@ -164,14 +164,18 @@ class MainWindow(QMainWindow): self.drawingPanel.set_config(self.config.drawpanel) self.drawingPanel.initDLModule(dl_manager) self.st_manager.dl_config = self.dl_manager.dl_config self.st_manager.config = self.config self.configPanel.blockSignals(True) if self.config.open_recent_on_startup: self.configPanel.open_on_startup_checker.setChecked(True) self.configPanel.let_fntsize_combox.setCurrentIndex(self.config.let_fntsize_flag) self.configPanel.let_fntstroke_combox.setCurrentIndex(self.config.let_fntstroke_flag) self.configPanel.let_fntcolor_combox.setCurrentIndex(self.config.let_fntcolor_flag) self.configPanel.let_autolayout_checker.setChecked(self.config.let_autolayout_flag) self.configPanel.let_uppercase_checker.setChecked(self.config.let_uppercase_flag) self.configPanel.save_config.connect(self.save_config) self.configPanel.blockSignals(False) textblock_mode = self.config.imgtrans_textblock if self.config.imgtrans_textedit: Loading @@ -190,9 +194,12 @@ class MainWindow(QMainWindow): self.centralStackWidget.setCurrentIndex(1) def openDir(self, directory: str): self.opening_dir = True try: self.st_manager.clearSceneTextitems() self.imgtrans_proj.load(directory) except Exception as e: self.opening_dir = False LOGGER.exception(e) LOGGER.warning("Failed to load project from " + directory) self.dl_manager.handleRunTimeException(self.tr('Failed to load project ') + directory, '') Loading @@ -200,6 +207,7 @@ class MainWindow(QMainWindow): self.proj_directory = directory self.titleBar.setTitleContent(osp.basename(directory)) self.updatePageList() self.opening_dir = False def updatePageList(self): if self.pageList.count() != 0: Loading @@ -225,6 +233,12 @@ class MainWindow(QMainWindow): def closeEvent(self, event: QCloseEvent) -> None: self.canvas.disconnect() self.canvas.undoStack.disconnect() self.save_config() if not self.imgtrans_proj.is_empty: self.imgtrans_proj.save() return super().closeEvent(event) def save_config(self): self.config.imgtrans_paintmode = self.bottomBar.paintChecker.isChecked() self.config.imgtrans_textedit = self.bottomBar.texteditChecker.isChecked() self.config.mask_transparency = self.canvas.mask_transparency Loading @@ -232,9 +246,6 @@ class MainWindow(QMainWindow): self.config.drawpanel = self.drawingPanel.get_config() with open(CONFIG_PATH, 'w', encoding='utf8') as f: f.write(json_dump_nested_obj(self.config)) if not self.imgtrans_proj.is_empty: self.imgtrans_proj.save() return super().closeEvent(event) def onHideCanvas(self): self.pageList.hide() Loading @@ -245,12 +256,12 @@ class MainWindow(QMainWindow): item = self.pageList.currentItem() if item is not None: if self.save_on_page_changed: if self.canvas.projstate_unsaved: if self.canvas.projstate_unsaved and not self.opening_dir: self.saveCurrentPage() self.st_manager.canvasUndoStack.clear() self.imgtrans_proj.set_current_img(item.text()) self.canvas.updateCanvas() self.st_manager.updateTextList() self.st_manager.updateSceneTextitems() self.titleBar.setTitleContent(page_name=self.imgtrans_proj.current_img) if self.dl_manager.run_canvas_inpaint: self.dl_manager.inpaint_thread.terminate() Loading Loading @@ -477,13 +488,18 @@ class MainWindow(QMainWindow): if self.config.dl.translate_target not in LANG_SUPPORT_VERTICAL: for blk in self.imgtrans_proj.get_blklist_byidx(page_index): blk.vertical = False self.st_manager.auto_textlayout_flag = self.config.let_autolayout_flag if page_index != 0: self.pageList.setCurrentRow(page_index) else: self.imgtrans_proj.set_current_img_byidx(0) self.canvas.updateCanvas() self.st_manager.updateTextList() self.st_manager.updateSceneTextitems() self.saveCurrentPage(False, False) if page_index + 1 == self.imgtrans_proj.num_pages: self.st_manager.auto_textlayout_flag = False def on_savestate_changed(self, unsaved: bool): save_state = self.tr('unsaved') if unsaved else self.tr('saved') Loading ballontranslator/ui/mainwindowbars.py +12 −1 Original line number Diff line number Diff line Loading @@ -122,6 +122,7 @@ class LeftBar(Widget): configChecked = Signal() open_dir = Signal(str) save_proj = Signal() save_config = Signal() run_imgtrans = Signal() def __init__(self, mainwindow, *args, **kwargs) -> None: super().__init__(mainwindow, *args, **kwargs) Loading Loading @@ -200,11 +201,20 @@ class LeftBar(Widget): self.setGeometry(0, 0, 300, 500) self.setMouseTracking(True) def initRecentProjMenu(self, proj_list: List[str]): self.recent_proj_list = proj_list for proj in proj_list: action = QAction(proj, self) self.recentMenu.addAction(action) action.triggered.connect(self.recentActionTriggered) def updateRecentProjList(self, proj_list: List[str]): if len(proj_list) == 0: return if isinstance(proj_list, str): proj_list = [proj_list] if self.recent_proj_list == proj_list: return proj_list = list(OrderedDict.fromkeys(proj_list)) actionlist = self.recentMenu.actions() Loading Loading @@ -244,6 +254,7 @@ class LeftBar(Widget): self.recentMenu.removeAction(action) self.recent_proj_list.pop() self.save_config.emit() def recentActionTriggered(self): path = self.sender().text() Loading @@ -260,8 +271,8 @@ class LeftBar(Widget): dialog.setDefaultSuffix('.jpg') folder_path = str(dialog.getExistingDirectory(self, "Select Directory")) if osp.exists(folder_path): self.open_dir.emit(folder_path) self.updateRecentProjList(folder_path) self.open_dir.emit(folder_path) # self.open_dir.emit(folder_path) def onOpenProj(self): Loading ballontranslator/ui/misc.py +18 −15 Original line number Diff line number Diff line Loading @@ -442,8 +442,8 @@ class DrawPanelConfig: class ProgramConfig: def __init__(self, dl: Union[Dict, DLModuleConfig] = None, def __init__( self, dl: Union[Dict, DLModuleConfig] = None, drawpanel: Union[Dict, DrawPanelConfig] = None, global_fontformat: Union[Dict, FontFormat] = None, recent_proj_list: List[str] = list(), Loading @@ -456,7 +456,9 @@ class ProgramConfig: let_fntsize_flag: int = 0, let_fntstroke_flag: int = 0, let_fntcolor_flag: int = 0, let_autolayout_flag: bool = True, let_uppercase_flag: bool = True) -> None: if isinstance(dl, dict): self.dl = DLModuleConfig(**dl) elif dl is None: Loading Loading @@ -485,6 +487,7 @@ class ProgramConfig: self.let_fntsize_flag = let_fntsize_flag self.let_fntstroke_flag = let_fntstroke_flag self.let_fntcolor_flag = let_fntcolor_flag self.let_autolayout_flag = let_autolayout_flag self.let_uppercase_flag = let_uppercase_flag Loading Loading
ballontranslator/ui/configpanel.py +11 −2 Original line number Diff line number Diff line Loading @@ -258,6 +258,9 @@ class GeneralPanel(QWidget): class ConfigPanel(Widget): save_config = Signal() def __init__(self, *args, **kwargs) -> None: super().__init__(*args, **kwargs) Loading Loading @@ -329,15 +332,18 @@ class ConfigPanel(Widget): generalConfigPanel.addTextLabel(label_lettering) dec_program_str = self.tr('decide by program') use_global_str = self.tr('use global setting') to_uppercase_str = self.tr('To uppercase') self.let_fntsize_combox = generalConfigPanel.addCombobox([dec_program_str, use_global_str], self.tr('font size')) self.let_fntsize_combox.currentIndexChanged.connect(self.on_fntsize_flag_changed) self.let_fntstroke_combox = generalConfigPanel.addCombobox([dec_program_str, use_global_str], self.tr('stroke')) self.let_fntstroke_combox.currentIndexChanged.connect(self.on_fntstroke_flag_changed) self.let_fntcolor_combox = generalConfigPanel.addCombobox([dec_program_str, use_global_str], self.tr('font & stroke color')) self.let_fntcolor_combox.currentIndexChanged.connect(self.on_fontcolor_flag_changed) self.let_uppercase_checker = generalConfigPanel.addCheckBox(to_uppercase_str) self.let_autolayout_checker = generalConfigPanel.addCheckBox(self.tr('Auto layout')) self.let_autolayout_checker.stateChanged.connect(self.on_autolayout_changed) self.let_uppercase_checker = generalConfigPanel.addCheckBox(self.tr('To uppercase')) self.let_uppercase_checker.stateChanged.connect(self.on_uppercase_changed) splitter = QSplitter(Qt.Orientation.Horizontal) splitter.addWidget(self.configTable) splitter.addWidget(self.configContent) Loading Loading @@ -375,6 +381,9 @@ class ConfigPanel(Widget): def on_fntstroke_flag_changed(self): self.config.let_fntstroke_flag = self.let_fntstroke_combox.currentIndex() def on_autolayout_changed(self): self.config.let_autolayout_flag = self.let_autolayout_checker.isChecked() def on_uppercase_changed(self): self.config.let_uppercase_flag = self.let_uppercase_checker.isChecked() Loading
ballontranslator/ui/dl_manager.py +4 −3 Original line number Diff line number Diff line Loading @@ -17,7 +17,7 @@ dl.translators.SYSTEM_LANG = QLocale.system().name() from .stylewidgets import ProgressMessageBox from .configpanel import ConfigPanel from .misc import ProjImgTrans, DLModuleConfig from .misc import ProjImgTrans, DLModuleConfig, ProgramConfig class ModuleThread(QThread): Loading Loading @@ -390,12 +390,13 @@ class DLManager(QObject): run_canvas_inpaint = False def __init__(self, dl_config: DLModuleConfig, config: ProgramConfig, imgtrans_proj: ProjImgTrans, config_panel: ConfigPanel, *args, **kwargs) -> None: super().__init__(*args, **kwargs) self.dl_config = dl_config self.config = config self.dl_config = dl_config = config.dl self.imgtrans_proj = imgtrans_proj self.textdetect_thread = TextDetectThread(self.dl_config) Loading
ballontranslator/ui/mainwindow.py +28 −12 Original line number Diff line number Diff line import os.path as osp import os import json from qtpy.QtWidgets import QMainWindow, QHBoxLayout, QVBoxLayout, QApplication, QStackedWidget, QWidget, QSplitter, QListWidget, QShortcut, QListWidgetItem from qtpy.QtCore import Qt, QPoint, QSize Loading Loading @@ -33,6 +32,7 @@ class MainWindow(QMainWindow): proj_directory = None imgtrans_proj: ProjImgTrans = ProjImgTrans() save_on_page_changed = True opening_dir = False def __init__(self, app: QApplication, open_dir='', *args, **kwargs) -> None: super().__init__(*args, **kwargs) Loading Loading @@ -134,8 +134,8 @@ class MainWindow(QMainWindow): self.bottomBar.originalSlider.setValue(self.config.original_transparency * 100) self.drawingPanel.maskTransperancySlider.setValue(self.config.mask_transparency * 100) self.leftBar.updateRecentProjList(self.config.recent_proj_list) self.leftBar.recent_proj_list = self.config.recent_proj_list self.leftBar.initRecentProjMenu(self.config.recent_proj_list) self.leftBar.save_config.connect(self.save_config) self.leftBar.imgTransChecker.setChecked(True) self.st_manager.formatpanel.global_format = self.config.global_fontformat self.st_manager.formatpanel.set_active_format(self.config.global_fontformat) Loading @@ -147,7 +147,7 @@ class MainWindow(QMainWindow): self.bottomBar.ocrChecker.setCheckState(self.config.dl.enable_ocr) self.bottomBar.transChecker.setChecked(self.config.dl.enable_translate) self.dl_manager = dl_manager = DLManager(self.config.dl, self.imgtrans_proj, self.configPanel) self.dl_manager = dl_manager = DLManager(self.config, self.imgtrans_proj, self.configPanel) dl_manager.update_translator_status.connect(self.updateTranslatorStatus) dl_manager.update_inpainter_status.connect(self.updateInpainterStatus) dl_manager.finish_translate_page.connect(self.finishTranslatePage) Loading @@ -164,14 +164,18 @@ class MainWindow(QMainWindow): self.drawingPanel.set_config(self.config.drawpanel) self.drawingPanel.initDLModule(dl_manager) self.st_manager.dl_config = self.dl_manager.dl_config self.st_manager.config = self.config self.configPanel.blockSignals(True) if self.config.open_recent_on_startup: self.configPanel.open_on_startup_checker.setChecked(True) self.configPanel.let_fntsize_combox.setCurrentIndex(self.config.let_fntsize_flag) self.configPanel.let_fntstroke_combox.setCurrentIndex(self.config.let_fntstroke_flag) self.configPanel.let_fntcolor_combox.setCurrentIndex(self.config.let_fntcolor_flag) self.configPanel.let_autolayout_checker.setChecked(self.config.let_autolayout_flag) self.configPanel.let_uppercase_checker.setChecked(self.config.let_uppercase_flag) self.configPanel.save_config.connect(self.save_config) self.configPanel.blockSignals(False) textblock_mode = self.config.imgtrans_textblock if self.config.imgtrans_textedit: Loading @@ -190,9 +194,12 @@ class MainWindow(QMainWindow): self.centralStackWidget.setCurrentIndex(1) def openDir(self, directory: str): self.opening_dir = True try: self.st_manager.clearSceneTextitems() self.imgtrans_proj.load(directory) except Exception as e: self.opening_dir = False LOGGER.exception(e) LOGGER.warning("Failed to load project from " + directory) self.dl_manager.handleRunTimeException(self.tr('Failed to load project ') + directory, '') Loading @@ -200,6 +207,7 @@ class MainWindow(QMainWindow): self.proj_directory = directory self.titleBar.setTitleContent(osp.basename(directory)) self.updatePageList() self.opening_dir = False def updatePageList(self): if self.pageList.count() != 0: Loading @@ -225,6 +233,12 @@ class MainWindow(QMainWindow): def closeEvent(self, event: QCloseEvent) -> None: self.canvas.disconnect() self.canvas.undoStack.disconnect() self.save_config() if not self.imgtrans_proj.is_empty: self.imgtrans_proj.save() return super().closeEvent(event) def save_config(self): self.config.imgtrans_paintmode = self.bottomBar.paintChecker.isChecked() self.config.imgtrans_textedit = self.bottomBar.texteditChecker.isChecked() self.config.mask_transparency = self.canvas.mask_transparency Loading @@ -232,9 +246,6 @@ class MainWindow(QMainWindow): self.config.drawpanel = self.drawingPanel.get_config() with open(CONFIG_PATH, 'w', encoding='utf8') as f: f.write(json_dump_nested_obj(self.config)) if not self.imgtrans_proj.is_empty: self.imgtrans_proj.save() return super().closeEvent(event) def onHideCanvas(self): self.pageList.hide() Loading @@ -245,12 +256,12 @@ class MainWindow(QMainWindow): item = self.pageList.currentItem() if item is not None: if self.save_on_page_changed: if self.canvas.projstate_unsaved: if self.canvas.projstate_unsaved and not self.opening_dir: self.saveCurrentPage() self.st_manager.canvasUndoStack.clear() self.imgtrans_proj.set_current_img(item.text()) self.canvas.updateCanvas() self.st_manager.updateTextList() self.st_manager.updateSceneTextitems() self.titleBar.setTitleContent(page_name=self.imgtrans_proj.current_img) if self.dl_manager.run_canvas_inpaint: self.dl_manager.inpaint_thread.terminate() Loading Loading @@ -477,13 +488,18 @@ class MainWindow(QMainWindow): if self.config.dl.translate_target not in LANG_SUPPORT_VERTICAL: for blk in self.imgtrans_proj.get_blklist_byidx(page_index): blk.vertical = False self.st_manager.auto_textlayout_flag = self.config.let_autolayout_flag if page_index != 0: self.pageList.setCurrentRow(page_index) else: self.imgtrans_proj.set_current_img_byidx(0) self.canvas.updateCanvas() self.st_manager.updateTextList() self.st_manager.updateSceneTextitems() self.saveCurrentPage(False, False) if page_index + 1 == self.imgtrans_proj.num_pages: self.st_manager.auto_textlayout_flag = False def on_savestate_changed(self, unsaved: bool): save_state = self.tr('unsaved') if unsaved else self.tr('saved') Loading
ballontranslator/ui/mainwindowbars.py +12 −1 Original line number Diff line number Diff line Loading @@ -122,6 +122,7 @@ class LeftBar(Widget): configChecked = Signal() open_dir = Signal(str) save_proj = Signal() save_config = Signal() run_imgtrans = Signal() def __init__(self, mainwindow, *args, **kwargs) -> None: super().__init__(mainwindow, *args, **kwargs) Loading Loading @@ -200,11 +201,20 @@ class LeftBar(Widget): self.setGeometry(0, 0, 300, 500) self.setMouseTracking(True) def initRecentProjMenu(self, proj_list: List[str]): self.recent_proj_list = proj_list for proj in proj_list: action = QAction(proj, self) self.recentMenu.addAction(action) action.triggered.connect(self.recentActionTriggered) def updateRecentProjList(self, proj_list: List[str]): if len(proj_list) == 0: return if isinstance(proj_list, str): proj_list = [proj_list] if self.recent_proj_list == proj_list: return proj_list = list(OrderedDict.fromkeys(proj_list)) actionlist = self.recentMenu.actions() Loading Loading @@ -244,6 +254,7 @@ class LeftBar(Widget): self.recentMenu.removeAction(action) self.recent_proj_list.pop() self.save_config.emit() def recentActionTriggered(self): path = self.sender().text() Loading @@ -260,8 +271,8 @@ class LeftBar(Widget): dialog.setDefaultSuffix('.jpg') folder_path = str(dialog.getExistingDirectory(self, "Select Directory")) if osp.exists(folder_path): self.open_dir.emit(folder_path) self.updateRecentProjList(folder_path) self.open_dir.emit(folder_path) # self.open_dir.emit(folder_path) def onOpenProj(self): Loading
ballontranslator/ui/misc.py +18 −15 Original line number Diff line number Diff line Loading @@ -442,8 +442,8 @@ class DrawPanelConfig: class ProgramConfig: def __init__(self, dl: Union[Dict, DLModuleConfig] = None, def __init__( self, dl: Union[Dict, DLModuleConfig] = None, drawpanel: Union[Dict, DrawPanelConfig] = None, global_fontformat: Union[Dict, FontFormat] = None, recent_proj_list: List[str] = list(), Loading @@ -456,7 +456,9 @@ class ProgramConfig: let_fntsize_flag: int = 0, let_fntstroke_flag: int = 0, let_fntcolor_flag: int = 0, let_autolayout_flag: bool = True, let_uppercase_flag: bool = True) -> None: if isinstance(dl, dict): self.dl = DLModuleConfig(**dl) elif dl is None: Loading Loading @@ -485,6 +487,7 @@ class ProgramConfig: self.let_fntsize_flag = let_fntsize_flag self.let_fntstroke_flag = let_fntstroke_flag self.let_fntcolor_flag = let_fntcolor_flag self.let_autolayout_flag = let_autolayout_flag self.let_uppercase_flag = let_uppercase_flag Loading