Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 50 additions & 44 deletions ui/canvas.py
Original file line number Diff line number Diff line change
Expand Up @@ -342,51 +342,57 @@ def _set_scene_scale(self, scale: float):
self.baseLayer.setScale(scale)
self.setSceneRect(0, 0, self.baseLayer.sceneBoundingRect().width(), self.baseLayer.sceneBoundingRect().height())

def render_result_img(self):

self.inpaintLayer.hide()
tlayer_opacity_before = self.textLayer.opacity()
tlayer_visible = self.textLayer.isVisible()
if tlayer_opacity_before != 1:
self.textLayer.setOpacity(1)
if not tlayer_visible:
self.textLayer.show()
scale_before = self.scale_factor
if scale_before != 1:
hb_pos = self.hscroll_bar.value()
vb_pos = self.vscroll_bar.value()
self._set_scene_scale(1)

self.clearSelection()
if self.textEditMode() and self.txtblkShapeControl.blk_item is not None:
blk_item = self.txtblkShapeControl.blk_item
if blk_item.is_editting():
blk_item.endEdit(keep_focus=False)
if blk_item.isSelected():
blk_item.setSelected(False)

result = ndarray2pixmap(self.imgtrans_proj.inpainted_array, return_qimg=True)
canvas_sz = self.img_window_size()
painter = QPainter(result)
painter.setRenderHint(QPainter.RenderHint.Antialiasing)

rect = QRectF(0, 0, canvas_sz.width(), canvas_sz.height())
self.render(painter, rect, rect) # produce blurred result if target/source rect not specified #320
painter.end()

if tlayer_opacity_before != 1:
self.textLayer.setOpacity(tlayer_opacity_before)
if not tlayer_visible:
self.textLayer.hide()
if scale_before != 1:
self._set_scene_scale(scale_before)
if self.hscroll_bar.value() != hb_pos:
self.hscroll_bar.setValue(hb_pos)
if self.vscroll_bar.value() != vb_pos:
self.vscroll_bar.setValue(vb_pos)
self.inpaintLayer.show()

return result
def render_result_img(self):
# 设置渲染标志位
TextBlkItem.is_rendering_output = True
try:
self.inpaintLayer.hide()
tlayer_opacity_before = self.textLayer.opacity()
tlayer_visible = self.textLayer.isVisible()
if tlayer_opacity_before != 1:
self.textLayer.setOpacity(1)
if not tlayer_visible:
self.textLayer.show()
scale_before = self.scale_factor
if scale_before != 1:
hb_pos = self.hscroll_bar.value()
vb_pos = self.vscroll_bar.value()
self._set_scene_scale(1)

self.clearSelection()
if self.textEditMode() and self.txtblkShapeControl.blk_item is not None:
blk_item = self.txtblkShapeControl.blk_item
if blk_item.is_editting():
blk_item.endEdit(keep_focus=False)
if blk_item.isSelected():
blk_item.setSelected(False)

result = ndarray2pixmap(self.imgtrans_proj.inpainted_array, return_qimg=True)
canvas_sz = self.img_window_size()
painter = QPainter(result)
painter.setRenderHint(QPainter.RenderHint.Antialiasing)

rect = QRectF(0, 0, canvas_sz.width(), canvas_sz.height())
self.render(painter, rect, rect)
painter.end()

if tlayer_opacity_before != 1:
self.textLayer.setOpacity(tlayer_opacity_before)
if not tlayer_visible:
self.textLayer.hide()
if scale_before != 1:
self._set_scene_scale(scale_before)
if self.hscroll_bar.value() != hb_pos:
self.hscroll_bar.setValue(hb_pos)
if self.vscroll_bar.value() != vb_pos:
self.vscroll_bar.setValue(vb_pos)
self.inpaintLayer.show()

return result
finally:
# 确保在函数结束时恢复标志位
TextBlkItem.is_rendering_output = False

def updateLayers(self):

Expand Down
64 changes: 63 additions & 1 deletion ui/configpanel.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@

from qtpy.QtWidgets import QPushButton, QKeySequenceEdit, QLayout, QGridLayout, QHBoxLayout, QVBoxLayout, QTreeView, QWidget, QLabel, QSizePolicy, QSpacerItem, QCheckBox, QSplitter, QScrollArea, QLineEdit
from qtpy.QtCore import Qt, Signal, QSize, QEvent, QItemSelection
from qtpy.QtGui import QStandardItem, QStandardItemModel, QMouseEvent, QFont, QIntValidator, QValidator, QFocusEvent
from qtpy.QtGui import QStandardItem, QStandardItemModel, QMouseEvent, QFont, QIntValidator, QValidator, QFocusEvent, QDoubleValidator

from .custom_widget import ConfigComboBox, Widget
from utils.config import pcfg
from utils import shared as C
from . import shared_widget as shared
from utils.shared import CONFIG_FONTSIZE_CONTENT, CONFIG_FONTSIZE_HEADER, CONFIG_FONTSIZE_TABLE, CONFIG_COMBOBOX_SHORT, CONFIG_COMBOBOX_LONG, CONFIG_COMBOBOX_MIDEAN
from .module_parse_widgets import InpaintConfigPanel, TextDetectConfigPanel, TranslatorConfigPanel, OCRConfigPanel

Expand Down Expand Up @@ -453,6 +454,35 @@ def __init__(self, *args, **kwargs) -> None:
discription=self.tr('Split translation into multi-lines according to the extracted balloon region.'))

self.let_autolayout_checker.stateChanged.connect(self.on_autolayout_changed)
# <--- 在这里添加新的显示ID控件 --->

# 1. 创建一个水平布局来容纳ID相关的控件
id_display_layout = QHBoxLayout()

# 2. 添加“显示文本框ID”的复选框
self.show_text_id_checker, sublock_id = generalConfigPanel.addCheckBox(self.tr('Show Textblock ID'))
self.show_text_id_checker.stateChanged.connect(self.on_show_text_id_changed)

# 3. 添加“ID字体大小”的输入框
id_size_label = QLabel(self.tr("ID Font Size:"))
self.text_id_size_edit = QLineEdit()
self.text_id_size_edit.setValidator(QDoubleValidator(5.0, 30.0, 1)) # 限制大小范围为 5.0 - 30.0,1位小数
self.text_id_size_edit.setFixedWidth(60)
self.text_id_size_edit.editingFinished.connect(self.on_text_id_size_changed)

# 4. 将控件添加到水平布局中
id_display_layout.addWidget(id_size_label)
id_display_layout.addWidget(self.text_id_size_edit)
id_display_layout.addStretch()

# 5. 将这个水平布局添加到复选框所在的 sublock 中
sublock_id.layout().addLayout(id_display_layout)

# 6. 初始时,根据复选框状态决定大小输入框是否可用
self.text_id_size_edit.setEnabled(self.show_text_id_checker.isChecked())

# <--- 添加显示ID控件代码结束 --->

self.let_uppercase_checker, _ = generalConfigPanel.addCheckBox(self.tr('To uppercase'))
self.let_uppercase_checker.stateChanged.connect(self.on_uppercase_changed)

Expand Down Expand Up @@ -510,6 +540,33 @@ def __init__(self, *args, **kwargs) -> None:

self.configTable.expandAll()

# <--- 新增ID显示控件函数 --->
def _force_redraw_text_items(self):
"""遍历并强制重绘所有文本框"""
if shared.canvas and shared.st_manager:
for item in shared.st_manager.textblk_item_list:
item.update()

def on_show_text_id_changed(self):
is_checked = self.show_text_id_checker.isChecked()
pcfg.show_text_id = is_checked
self.text_id_size_edit.setEnabled(is_checked)
# 使用新的强制刷新方法
self._force_redraw_text_items()

def on_text_id_size_changed(self):
try:
size = float(self.text_id_size_edit.text())
# 只有当值确实改变时才更新和重绘
if pcfg.text_id_font_size != size:
pcfg.text_id_font_size = size
# 使用新的强制刷新方法
self._force_redraw_text_items()
except ValueError:
# 如果输入无效,可以恢复默认值
self.text_id_size_edit.setText(str(pcfg.text_id_font_size))
# <--- 新增ID显示控件函数结束 --->

def on_load_model_changed(self):
pcfg.module.load_model_on_demand = self.load_model_checker.isChecked()

Expand Down Expand Up @@ -649,4 +706,9 @@ def setupConfig(self):
self.empty_runcache_checker.setChecked(pcfg.module.empty_runcache)
self.let_show_only_custom_fonts.setChecked(pcfg.let_show_only_custom_fonts_flag)

# <--- 在 setupConfig 方法的末尾( blockSignals(False) 之前)添加以下代码 --->
self.show_text_id_checker.setChecked(pcfg.show_text_id)
self.text_id_size_edit.setText(str(pcfg.text_id_font_size))
self.text_id_size_edit.setEnabled(pcfg.show_text_id)

self.blockSignals(False)
18 changes: 16 additions & 2 deletions ui/keywordsubwidget.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,20 @@ def loadCfgSublist(self, sublist: List):
for sub in sublist:
self.add_subpair(**sub, save2sublist=False)

# --- 2026.02.13 新增代码开始 ---
def appendCfgSublist(self, sublist_to_append: List):
"""在现有列表后追加新的替换规则"""
for sub in sublist_to_append:
self.add_subpair(**sub, save2sublist=True)
# --- 2026.02.13 新增代码结束 ---

def clearSublist(self):
"""清空替换列表和模型"""
self.changing_rows = True
self.sublist.clear()
self.submodel.removeRows(0, self.submodel.rowCount())
self.changing_rows = False

def on_new_subpair(self):
self.add_subpair()

Expand Down Expand Up @@ -115,7 +129,7 @@ def sub_text(self, text: str) -> str:
k = subpair['keyword']
if k == '':
continue

regexr = k
flag = re.DOTALL
if not subpair['case_sens']:
Expand All @@ -129,4 +143,4 @@ def sub_text(self, text: str) -> str:
LOGGER.error(traceback.format_exc())
continue

return text
return text
Loading