""" Диалог настроек: 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()