gui.ui.main_window 源代码

"""
主窗口 UI 设计
使用代码方式创建 UI,便于维护和修改
"""
from PySide6.QtWidgets import (
    QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,
    QTabWidget, QLabel, QLineEdit, QPushButton,
    QComboBox, QCheckBox, QTextEdit, QProgressBar,
    QGroupBox, QFileDialog, QMessageBox
)
from PySide6.QtCore import Qt
from gui.utils.drag_drop_widgets import DragDropLineEdit


[文档] class MainWindowUI: """主窗口 UI 类"""
[文档] def setup_ui(self, main_window: QMainWindow): """设置 UI""" main_window.setWindowTitle("Scenario Tool - 视觉小说脚本工具") main_window.resize(900, 700) # 中央部件 central_widget = QWidget() main_window.setCentralWidget(central_widget) # 主布局 main_layout = QVBoxLayout(central_widget) # 创建标签页 self.tab_widget = QTabWidget() main_layout.addWidget(self.tab_widget) # 添加各个标签页 self._create_scenario_tab() self._create_param_tab() self._create_resource_tab() self._create_config_tab() # 状态栏 self.status_bar = main_window.statusBar() self.status_bar.showMessage("就绪")
def _create_scenario_tab(self): """创建脚本生成标签页""" tab = QWidget() layout = QVBoxLayout(tab) # 配置组 config_group = QGroupBox("脚本生成配置") config_layout = QVBoxLayout() # 引擎类型 engine_layout = QHBoxLayout() engine_layout.addWidget(QLabel("引擎类型:")) self.scenario_engine_combo = QComboBox() self.scenario_engine_combo.addItems(["Ren'Py", "Naninovel"]) engine_layout.addWidget(self.scenario_engine_combo) engine_layout.addStretch() config_layout.addLayout(engine_layout) # 输入目录 input_layout = QHBoxLayout() input_layout.addWidget(QLabel("输入目录:")) self.scenario_input_edit = DragDropLineEdit("input/") input_layout.addWidget(self.scenario_input_edit) self.scenario_input_btn = QPushButton("浏览...") input_layout.addWidget(self.scenario_input_btn) config_layout.addLayout(input_layout) # 输出目录 output_layout = QHBoxLayout() output_layout.addWidget(QLabel("输出目录:")) self.scenario_output_edit = DragDropLineEdit("output/") output_layout.addWidget(self.scenario_output_edit) self.scenario_output_btn = QPushButton("浏览...") output_layout.addWidget(self.scenario_output_btn) config_layout.addLayout(output_layout) # 忽略模式 ignore_layout = QHBoxLayout() self.scenario_ignore_check = QCheckBox("启用忽略模式") ignore_layout.addWidget(self.scenario_ignore_check) ignore_layout.addWidget(QLabel("忽略词:")) self.scenario_ignore_edit = QLineEdit("忽略,") self.scenario_ignore_edit.setEnabled(False) ignore_layout.addWidget(self.scenario_ignore_edit) config_layout.addLayout(ignore_layout) config_group.setLayout(config_layout) layout.addWidget(config_group) # 操作按钮 btn_layout = QHBoxLayout() self.scenario_generate_btn = QPushButton("生成脚本") self.scenario_generate_btn.setMinimumHeight(40) btn_layout.addWidget(self.scenario_generate_btn) layout.addLayout(btn_layout) # 进度条 progress_layout = QHBoxLayout() progress_layout.addWidget(QLabel("进度:")) self.scenario_progress = QProgressBar() self.scenario_progress.setValue(0) progress_layout.addWidget(self.scenario_progress) layout.addLayout(progress_layout) # 日志输出 log_group = QGroupBox("日志输出") log_layout = QVBoxLayout() self.scenario_log = QTextEdit() self.scenario_log.setReadOnly(True) log_layout.addWidget(self.scenario_log) log_group.setLayout(log_layout) layout.addWidget(log_group) # 恢复按钮(放在日志下方靠右) reset_layout = QHBoxLayout() reset_layout.addStretch() self.scenario_reset_btn = QPushButton("恢复默认") self.scenario_reset_btn.setMaximumWidth(80) reset_layout.addWidget(self.scenario_reset_btn) layout.addLayout(reset_layout) self.tab_widget.addTab(tab, "脚本生成") def _create_param_tab(self): """创建参数映射标签页""" tab = QWidget() layout = QVBoxLayout(tab) # 配置组 config_group = QGroupBox("参数映射配置") config_layout = QVBoxLayout() # 引擎类型 engine_layout = QHBoxLayout() engine_layout.addWidget(QLabel("引擎类型:")) self.param_engine_combo = QComboBox() engine_layout.addWidget(self.param_engine_combo) engine_layout.addStretch() config_layout.addLayout(engine_layout) # 参数配置目录 param_dir_layout = QHBoxLayout() param_dir_layout.addWidget(QLabel("参数配置目录:")) self.param_config_dir_edit = DragDropLineEdit() param_dir_layout.addWidget(self.param_config_dir_edit) self.param_config_dir_btn = QPushButton("浏览...") param_dir_layout.addWidget(self.param_config_dir_btn) config_layout.addLayout(param_dir_layout) # 参数文件路径(只读提示) param_layout = QHBoxLayout() param_layout.addWidget(QLabel("参数文件:")) self.param_file_label = QLabel("param_config/param_data_renpy.xlsx") param_layout.addWidget(self.param_file_label) param_layout.addStretch() config_layout.addLayout(param_layout) # 差分参数文件(只读提示) varient_layout = QHBoxLayout() varient_layout.addWidget(QLabel("差分文件:")) self.param_varient_label = QLabel("param_config/varient_data.xlsx") varient_layout.addWidget(self.param_varient_label) varient_layout.addStretch() config_layout.addLayout(varient_layout) config_group.setLayout(config_layout) layout.addWidget(config_group) # 操作按钮 btn_layout = QHBoxLayout() self.param_update_btn = QPushButton("更新参数映射") self.param_update_btn.setMinimumHeight(40) btn_layout.addWidget(self.param_update_btn) layout.addLayout(btn_layout) # 进度条 progress_layout = QHBoxLayout() progress_layout.addWidget(QLabel("进度:")) self.param_progress = QProgressBar() self.param_progress.setValue(0) progress_layout.addWidget(self.param_progress) layout.addLayout(progress_layout) # 日志输出 log_group = QGroupBox("日志输出") log_layout = QVBoxLayout() self.param_log = QTextEdit() self.param_log.setReadOnly(True) log_layout.addWidget(self.param_log) log_group.setLayout(log_layout) layout.addWidget(log_group) # 恢复按钮(放在日志下方靠右) reset_layout = QHBoxLayout() reset_layout.addStretch() self.param_reset_btn = QPushButton("恢复默认") self.param_reset_btn.setMaximumWidth(80) reset_layout.addWidget(self.param_reset_btn) layout.addLayout(reset_layout) self.tab_widget.addTab(tab, "参数映射") def _create_resource_tab(self): """创建资源管理标签页""" tab = QWidget() layout = QVBoxLayout(tab) # 配置组 config_group = QGroupBox("资源管理配置") config_layout = QVBoxLayout() # 项目目录(输入目录) project_layout = QHBoxLayout() project_label = QLabel("项目目录:") project_label.setMinimumWidth(60) project_layout.addWidget(project_label) self.resource_project_edit = DragDropLineEdit() project_layout.addWidget(self.resource_project_edit) self.resource_project_btn = QPushButton("浏览...") project_layout.addWidget(self.resource_project_btn) config_layout.addLayout(project_layout) # 资源库目录 library_layout = QHBoxLayout() library_label = QLabel("资源库:") library_label.setMinimumWidth(60) library_layout.addWidget(library_label) self.resource_library_edit = DragDropLineEdit() library_layout.addWidget(self.resource_library_edit) self.resource_library_btn = QPushButton("浏览...") library_layout.addWidget(self.resource_library_btn) config_layout.addLayout(library_layout) config_group.setLayout(config_layout) layout.addWidget(config_group) # 干跑模式选项 dry_run_layout = QHBoxLayout() self.resource_dry_run_check = QCheckBox("干跑模式(仅预览,不实际复制)") dry_run_layout.addWidget(self.resource_dry_run_check) dry_run_layout.addStretch() layout.addLayout(dry_run_layout) # 操作按钮 btn_layout = QHBoxLayout() self.resource_validate_btn = QPushButton("验证资源") self.resource_validate_btn.setMinimumHeight(40) btn_layout.addWidget(self.resource_validate_btn) self.resource_sync_btn = QPushButton("同步资源") self.resource_sync_btn.setMinimumHeight(40) self.resource_sync_btn.setEnabled(False) btn_layout.addWidget(self.resource_sync_btn) layout.addLayout(btn_layout) # 进度条 progress_layout = QHBoxLayout() progress_layout.addWidget(QLabel("进度:")) self.resource_progress = QProgressBar() self.resource_progress.setValue(0) progress_layout.addWidget(self.resource_progress) layout.addLayout(progress_layout) # 日志输出 log_group = QGroupBox("日志输出") log_layout = QVBoxLayout() self.resource_log = QTextEdit() self.resource_log.setReadOnly(True) log_layout.addWidget(self.resource_log) log_group.setLayout(log_layout) layout.addWidget(log_group) # 恢复按钮(放在日志下方靠右) reset_layout = QHBoxLayout() reset_layout.addStretch() self.resource_reset_btn = QPushButton("恢复默认") self.resource_reset_btn.setMaximumWidth(80) reset_layout.addWidget(self.resource_reset_btn) layout.addLayout(reset_layout) self.tab_widget.addTab(tab, "资源管理") def _create_config_tab(self): """创建配置标签页""" tab = QWidget() layout = QVBoxLayout(tab) # 路径配置组 path_group = QGroupBox("路径配置") path_layout = QVBoxLayout() # 输入目录 input_layout = QHBoxLayout() input_layout.addWidget(QLabel("输入目录:")) self.config_input_edit = DragDropLineEdit() input_layout.addWidget(self.config_input_edit) self.config_input_btn = QPushButton("浏览...") input_layout.addWidget(self.config_input_btn) path_layout.addLayout(input_layout) # 输出目录 output_layout = QHBoxLayout() output_layout.addWidget(QLabel("输出目录:")) self.config_output_edit = DragDropLineEdit() output_layout.addWidget(self.config_output_edit) self.config_output_btn = QPushButton("浏览...") output_layout.addWidget(self.config_output_btn) path_layout.addLayout(output_layout) # 参数配置目录 param_layout = QHBoxLayout() param_layout.addWidget(QLabel("参数配置目录:")) self.config_param_edit = DragDropLineEdit() param_layout.addWidget(self.config_param_edit) self.config_param_btn = QPushButton("浏览...") param_layout.addWidget(self.config_param_btn) path_layout.addLayout(param_layout) # 日志目录 log_layout = QHBoxLayout() log_layout.addWidget(QLabel("日志目录:")) self.config_log_edit = DragDropLineEdit() log_layout.addWidget(self.config_log_edit) self.config_log_btn = QPushButton("浏览...") log_layout.addWidget(self.config_log_btn) path_layout.addLayout(log_layout) path_group.setLayout(path_layout) layout.addWidget(path_group) # 处理配置组 process_group = QGroupBox("处理配置") process_layout = QVBoxLayout() # 忽略模式 ignore_layout = QHBoxLayout() self.config_ignore_check = QCheckBox("启用忽略模式") ignore_layout.addWidget(self.config_ignore_check) ignore_layout.addWidget(QLabel("忽略词:")) self.config_ignore_edit = QLineEdit() ignore_layout.addWidget(self.config_ignore_edit) process_layout.addLayout(ignore_layout) process_group.setLayout(process_layout) layout.addWidget(process_group) # 引擎配置组 engine_group = QGroupBox("引擎配置") engine_layout = QHBoxLayout() engine_layout.addWidget(QLabel("引擎类型:")) self.config_engine_combo = QComboBox() self.config_engine_combo.addItems(["Ren'Py", "Naninovel"]) engine_layout.addWidget(self.config_engine_combo) engine_layout.addStretch() engine_group.setLayout(engine_layout) layout.addWidget(engine_group) # 操作按钮 btn_layout = QHBoxLayout() btn_layout.addStretch() self.config_save_btn = QPushButton("保存配置") self.config_save_btn.setMinimumHeight(40) btn_layout.addWidget(self.config_save_btn) layout.addLayout(btn_layout) layout.addStretch() self.tab_widget.addTab(tab, "默认配置")