Files
Comfy-Studio/comfy_studio/ui/widgets/settings_dialog.py
T

119 lines
4.7 KiB
Python
Raw Normal View History

2026-07-02 14:09:57 +08:00
"""
Диалог настроек: URL ComfyUI, отслеживаемые папки, язык интерфейса,
языки перевода в контекстном меню.
"""
from PyQt6.QtWidgets import (
QDialog, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit,
QPushButton, QListWidget, QListWidgetItem, QFileDialog,
QMessageBox, QComboBox
)
from PyQt6.QtCore import Qt
from comfy_studio.core.i18n import tr
from comfy_studio.services.translator import LANG_NAMES
class SettingsDialog(QDialog):
def __init__(self, current_settings: dict, parent=None):
super().__init__(parent)
self.settings = current_settings
self.setWindowTitle(tr("settings_title"))
self.resize(520, 420)
self.init_ui()
def init_ui(self):
layout = QVBoxLayout(self)
layout.addWidget(QLabel(tr("comfy_api_url")))
self.url_input = QLineEdit()
self.url_input.setText(self.settings.get("comfyui_url", "http://127.0.0.1:8188"))
layout.addWidget(self.url_input)
# Язык интерфейса
layout.addWidget(QLabel(tr("language")))
self.lang_combo = QComboBox()
self.lang_combo.addItem("Русский", "ru")
self.lang_combo.addItem("English", "en")
current_lang = self.settings.get("language", "ru")
self.lang_combo.setCurrentIndex(0 if current_lang == "ru" else 1)
layout.addWidget(self.lang_combo)
note = QLabel(tr("language_restart_note"))
note.setStyleSheet("color: #9e9e9e; font-size: 11px;")
layout.addWidget(note)
# Языки перевода (мультивыбор чекбоксами)
layout.addWidget(QLabel(tr("translation_languages")))
self.translate_langs_list = QListWidget()
self.translate_langs_list.setMaximumHeight(120)
selected_langs = self.settings.get("translate_languages", ["ru", "en"])
for code, name in LANG_NAMES.items():
item = QListWidgetItem(f"{name} ({code})")
item.setData(Qt.ItemDataRole.UserRole, code)
item.setFlags(item.flags() | Qt.ItemFlag.ItemIsUserCheckable)
item.setCheckState(
Qt.CheckState.Checked if code in selected_langs
else Qt.CheckState.Unchecked)
self.translate_langs_list.addItem(item)
layout.addWidget(self.translate_langs_list)
layout.addWidget(QLabel(tr("tracked_folders")))
self.paths_list = QListWidget()
for p in self.settings.get("tracked_paths", []):
self.paths_list.addItem(p)
layout.addWidget(self.paths_list)
paths_btn_layout = QHBoxLayout()
self.add_path_btn = QPushButton(tr("add_folder"))
self.add_path_btn.clicked.connect(self._add_path)
self.remove_path_btn = QPushButton(tr("remove_selected"))
self.remove_path_btn.clicked.connect(self._remove_path)
paths_btn_layout.addWidget(self.add_path_btn)
paths_btn_layout.addWidget(self.remove_path_btn)
layout.addLayout(paths_btn_layout)
btn_layout = QHBoxLayout()
self.save_btn = QPushButton(tr("save"))
self.save_btn.clicked.connect(self._save)
self.cancel_btn = QPushButton(tr("cancel"))
self.cancel_btn.clicked.connect(self.reject)
btn_layout.addStretch()
btn_layout.addWidget(self.save_btn)
btn_layout.addWidget(self.cancel_btn)
layout.addLayout(btn_layout)
def _add_path(self):
dir_path = QFileDialog.getExistingDirectory(self, tr("choose_tracked_folder"))
if dir_path:
items = [self.paths_list.item(i).text() for i in range(self.paths_list.count())]
if dir_path not in items:
self.paths_list.addItem(dir_path)
def _remove_path(self):
for s in self.paths_list.selectedItems():
self.paths_list.takeItem(self.paths_list.row(s))
def _save(self):
url = self.url_input.text().strip()
if not url:
QMessageBox.warning(self, tr("error"), tr("url_empty_error"))
return
paths = [self.paths_list.item(i).text() for i in range(self.paths_list.count())]
if not paths:
QMessageBox.warning(self, tr("error"), tr("paths_empty_error"))
return
translate_langs = []
for i in range(self.translate_langs_list.count()):
item = self.translate_langs_list.item(i)
if item.checkState() == Qt.CheckState.Checked:
translate_langs.append(item.data(Qt.ItemDataRole.UserRole))
self.settings["comfyui_url"] = url
self.settings["tracked_paths"] = paths
self.settings["language"] = self.lang_combo.currentData()
self.settings["translate_languages"] = translate_langs or ["ru", "en"]
self.accept()