Loading ballontranslator/ui/configpanel.py +1 −0 Original line number Diff line number Diff line Loading @@ -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 ballontranslator/ui/fontformatpanel.py +12 −10 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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() Loading Loading @@ -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 ballontranslator/ui/mainwindow.py +20 −2 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 ProjImgTrans, pt2px, pixmap2ndarray from .misc import ProjImgTrans, pt2px, FontFormat from .canvas import Canvas from .configpanel import ConfigPanel from .dl_manager import DLManager Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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(): Loading Loading @@ -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() ballontranslator/ui/misc.py +2 −1 Original line number Diff line number Diff line Loading @@ -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): Loading Loading @@ -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: Loading ballontranslator/ui/preset_widget.py 0 → 100644 +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
ballontranslator/ui/configpanel.py +1 −0 Original line number Diff line number Diff line Loading @@ -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
ballontranslator/ui/fontformatpanel.py +12 −10 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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() Loading Loading @@ -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
ballontranslator/ui/mainwindow.py +20 −2 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 ProjImgTrans, pt2px, pixmap2ndarray from .misc import ProjImgTrans, pt2px, FontFormat from .canvas import Canvas from .configpanel import ConfigPanel from .dl_manager import DLManager Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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(): Loading Loading @@ -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()
ballontranslator/ui/misc.py +2 −1 Original line number Diff line number Diff line Loading @@ -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): Loading Loading @@ -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: Loading
ballontranslator/ui/preset_widget.py 0 → 100644 +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