34a40ae759
Десктопная галерея и менеджер изображений ComfyUI (PyQt6 + SQLite): - мультипапочный мониторинг (watchdog), грид миниатюр, drag-and-drop - теги, избранное, рейтинг, поиск по промтам - парсер метаданных ComfyUI (PNG/WebP/JPEG), редактор workflow/prompt JSON - перевод выделенного текста через контекстное меню (настраиваемые языки) - отправка промта в очередь ComfyUI с внедрением правок и нового seed - полноэкранный просмотр, локализация ru/en, тёмная тема Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
119 lines
4.7 KiB
Python
119 lines
4.7 KiB
Python
"""
|
|
Диалог настроек: 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()
|