|
|
@ -1,11 +1,12 @@
|
|
|
|
from PySide6.QtWidgets import (
|
|
|
|
from PySide6.QtWidgets import (
|
|
|
|
QDialog, QVBoxLayout, QHBoxLayout, QTabWidget,
|
|
|
|
QDialog, QVBoxLayout, QHBoxLayout, QTabWidget,
|
|
|
|
QPushButton, QLabel, QComboBox, QCheckBox,
|
|
|
|
QPushButton, QLabel, QComboBox, QCheckBox,
|
|
|
|
QGroupBox, QSpinBox, QRadioButton
|
|
|
|
QGroupBox, QSpinBox, QRadioButton, QMessageBox
|
|
|
|
)
|
|
|
|
)
|
|
|
|
from PySide6.QtCore import Qt
|
|
|
|
from PySide6.QtCore import Qt
|
|
|
|
|
|
|
|
|
|
|
|
from src.core.config import Config
|
|
|
|
from src.core.config import Config
|
|
|
|
|
|
|
|
from src.core.ocr_engine import OCREngine
|
|
|
|
|
|
|
|
|
|
|
|
class SettingsDialog(QDialog):
|
|
|
|
class SettingsDialog(QDialog):
|
|
|
|
"""设置对话框"""
|
|
|
|
"""设置对话框"""
|
|
|
@ -103,6 +104,62 @@ class SettingsDialog(QDialog):
|
|
|
|
"""设置OCR选项卡"""
|
|
|
|
"""设置OCR选项卡"""
|
|
|
|
layout = QVBoxLayout(tab)
|
|
|
|
layout = QVBoxLayout(tab)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 默认语言
|
|
|
|
|
|
|
|
language_group = QGroupBox("默认OCR语言")
|
|
|
|
|
|
|
|
language_layout = QVBoxLayout(language_group)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.language_combo = QComboBox()
|
|
|
|
|
|
|
|
self.language_combo.setToolTip("选择默认的OCR识别语言")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 添加可用的语言
|
|
|
|
|
|
|
|
ocr_engine = OCREngine()
|
|
|
|
|
|
|
|
# 常用语言列表
|
|
|
|
|
|
|
|
common_langs = ['eng', 'chi_sim', 'chi_tra', 'jpn', 'kor']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 首先添加常用语言
|
|
|
|
|
|
|
|
if ocr_engine.available_languages:
|
|
|
|
|
|
|
|
# 添加常用语言组
|
|
|
|
|
|
|
|
common_available = [lang for lang in common_langs if lang in ocr_engine.available_languages]
|
|
|
|
|
|
|
|
if common_available:
|
|
|
|
|
|
|
|
self.language_combo.addItem("--- 常用语言 ---", None)
|
|
|
|
|
|
|
|
for lang_code in common_available:
|
|
|
|
|
|
|
|
lang_name = ocr_engine.get_language_name(lang_code)
|
|
|
|
|
|
|
|
self.language_combo.addItem(lang_name, lang_code)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 添加其他语言组
|
|
|
|
|
|
|
|
other_available = [lang for lang in ocr_engine.available_languages
|
|
|
|
|
|
|
|
if lang not in common_langs]
|
|
|
|
|
|
|
|
if other_available:
|
|
|
|
|
|
|
|
self.language_combo.addItem("--- 其他语言 ---", None)
|
|
|
|
|
|
|
|
# 按名称排序
|
|
|
|
|
|
|
|
other_langs_sorted = sorted(
|
|
|
|
|
|
|
|
other_available,
|
|
|
|
|
|
|
|
key=lambda x: ocr_engine.get_language_name(x)
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
for lang_code in other_langs_sorted:
|
|
|
|
|
|
|
|
lang_name = ocr_engine.get_language_name(lang_code)
|
|
|
|
|
|
|
|
self.language_combo.addItem(lang_name, lang_code)
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
# 如果没有常用语言,直接添加所有语言
|
|
|
|
|
|
|
|
for lang_code in ocr_engine.available_languages:
|
|
|
|
|
|
|
|
lang_name = ocr_engine.get_language_name(lang_code)
|
|
|
|
|
|
|
|
self.language_combo.addItem(lang_name, lang_code)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 设置当前默认语言
|
|
|
|
|
|
|
|
default_lang = self.config.get('default_options.language', 'eng')
|
|
|
|
|
|
|
|
index = self.language_combo.findData(default_lang)
|
|
|
|
|
|
|
|
if index >= 0:
|
|
|
|
|
|
|
|
self.language_combo.setCurrentIndex(index)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 添加刷新语言列表按钮
|
|
|
|
|
|
|
|
lang_buttons_layout = QHBoxLayout()
|
|
|
|
|
|
|
|
self.refresh_langs_btn = QPushButton("刷新语言列表")
|
|
|
|
|
|
|
|
self.refresh_langs_btn.clicked.connect(self.refresh_languages)
|
|
|
|
|
|
|
|
lang_buttons_layout.addWidget(self.refresh_langs_btn)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
language_layout.addWidget(self.language_combo)
|
|
|
|
|
|
|
|
language_layout.addLayout(lang_buttons_layout)
|
|
|
|
|
|
|
|
|
|
|
|
# 默认选项
|
|
|
|
# 默认选项
|
|
|
|
options_group = QGroupBox("默认处理选项")
|
|
|
|
options_group = QGroupBox("默认处理选项")
|
|
|
|
options_layout = QVBoxLayout(options_group)
|
|
|
|
options_layout = QVBoxLayout(options_group)
|
|
|
@ -191,6 +248,23 @@ class SettingsDialog(QDialog):
|
|
|
|
self.config.set('general.max_recent_files', self.recent_files_spin.value())
|
|
|
|
self.config.set('general.max_recent_files', self.recent_files_spin.value())
|
|
|
|
|
|
|
|
|
|
|
|
# 保存OCR设置
|
|
|
|
# 保存OCR设置
|
|
|
|
|
|
|
|
# 获取选中的语言代码
|
|
|
|
|
|
|
|
lang_index = self.language_combo.currentIndex()
|
|
|
|
|
|
|
|
lang_data = self.language_combo.itemData(lang_index)
|
|
|
|
|
|
|
|
if lang_data: # 确保不是分隔符
|
|
|
|
|
|
|
|
self.config.set('default_options.language', lang_data)
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
# 如果选中了分隔符,尝试找到下一个有效选项
|
|
|
|
|
|
|
|
for i in range(lang_index + 1, self.language_combo.count()):
|
|
|
|
|
|
|
|
next_data = self.language_combo.itemData(i)
|
|
|
|
|
|
|
|
if next_data:
|
|
|
|
|
|
|
|
self.language_combo.setCurrentIndex(i)
|
|
|
|
|
|
|
|
self.config.set('default_options.language', next_data)
|
|
|
|
|
|
|
|
break
|
|
|
|
|
|
|
|
# 如果没有找到,使用默认语言
|
|
|
|
|
|
|
|
if not self.language_combo.currentData():
|
|
|
|
|
|
|
|
self.config.set('default_options.language', 'eng')
|
|
|
|
|
|
|
|
|
|
|
|
self.config.set('default_options.deskew', self.deskew_cb.isChecked())
|
|
|
|
self.config.set('default_options.deskew', self.deskew_cb.isChecked())
|
|
|
|
self.config.set('default_options.rotate_pages', self.rotate_cb.isChecked())
|
|
|
|
self.config.set('default_options.rotate_pages', self.rotate_cb.isChecked())
|
|
|
|
self.config.set('default_options.clean', self.clean_cb.isChecked())
|
|
|
|
self.config.set('default_options.clean', self.clean_cb.isChecked())
|
|
|
@ -209,3 +283,58 @@ class SettingsDialog(QDialog):
|
|
|
|
self.config.set('ui.theme', 'system')
|
|
|
|
self.config.set('ui.theme', 'system')
|
|
|
|
|
|
|
|
|
|
|
|
super().accept()
|
|
|
|
super().accept()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def refresh_languages(self):
|
|
|
|
|
|
|
|
"""刷新可用语言列表"""
|
|
|
|
|
|
|
|
ocr_engine = OCREngine()
|
|
|
|
|
|
|
|
# 重新获取可用语言
|
|
|
|
|
|
|
|
ocr_engine.available_languages = ocr_engine.get_available_languages()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 保存当前选择的语言
|
|
|
|
|
|
|
|
current_lang = self.language_combo.currentData()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 清空并重新填充语言列表
|
|
|
|
|
|
|
|
self.language_combo.clear()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 常用语言列表
|
|
|
|
|
|
|
|
common_langs = ['eng', 'chi_sim', 'chi_tra', 'jpn', 'kor']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 首先添加常用语言
|
|
|
|
|
|
|
|
if ocr_engine.available_languages:
|
|
|
|
|
|
|
|
# 添加常用语言组
|
|
|
|
|
|
|
|
common_available = [lang for lang in common_langs if lang in ocr_engine.available_languages]
|
|
|
|
|
|
|
|
if common_available:
|
|
|
|
|
|
|
|
self.language_combo.addItem("--- 常用语言 ---", None)
|
|
|
|
|
|
|
|
for lang_code in common_available:
|
|
|
|
|
|
|
|
lang_name = ocr_engine.get_language_name(lang_code)
|
|
|
|
|
|
|
|
self.language_combo.addItem(lang_name, lang_code)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 添加其他语言组
|
|
|
|
|
|
|
|
other_available = [lang for lang in ocr_engine.available_languages
|
|
|
|
|
|
|
|
if lang not in common_langs]
|
|
|
|
|
|
|
|
if other_available:
|
|
|
|
|
|
|
|
self.language_combo.addItem("--- 其他语言 ---", None)
|
|
|
|
|
|
|
|
# 按名称排序
|
|
|
|
|
|
|
|
other_langs_sorted = sorted(
|
|
|
|
|
|
|
|
other_available,
|
|
|
|
|
|
|
|
key=lambda x: ocr_engine.get_language_name(x)
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
for lang_code in other_langs_sorted:
|
|
|
|
|
|
|
|
lang_name = ocr_engine.get_language_name(lang_code)
|
|
|
|
|
|
|
|
self.language_combo.addItem(lang_name, lang_code)
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
# 如果没有常用语言,直接添加所有语言
|
|
|
|
|
|
|
|
for lang_code in ocr_engine.available_languages:
|
|
|
|
|
|
|
|
lang_name = ocr_engine.get_language_name(lang_code)
|
|
|
|
|
|
|
|
self.language_combo.addItem(lang_name, lang_code)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 尝试恢复之前选择的语言
|
|
|
|
|
|
|
|
index = self.language_combo.findData(current_lang)
|
|
|
|
|
|
|
|
if index >= 0:
|
|
|
|
|
|
|
|
self.language_combo.setCurrentIndex(index)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QMessageBox.information(self, "刷新完成", f"已刷新语言列表,共找到 {len(ocr_engine.available_languages)} 种语言。")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def download_language_pack(self):
|
|
|
|
|
|
|
|
"""下载Tesseract语言包 - 已移除"""
|
|
|
|
|
|
|
|
pass
|