Initial release: Comfy-Studio v1.0.0
Десктопная галерея и менеджер изображений 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>
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
"""
|
||||
Диалог перевода выделенного текста:
|
||||
показывает оригинал и редактируемый перевод; «Применить» / «Отменить».
|
||||
"""
|
||||
|
||||
from PyQt6.QtWidgets import (
|
||||
QDialog, QVBoxLayout, QHBoxLayout, QLabel, QTextEdit, QPushButton
|
||||
)
|
||||
|
||||
from comfy_studio.core.i18n import tr
|
||||
from comfy_studio.services.translator import TranslateWorker, LANG_NAMES
|
||||
|
||||
|
||||
class TranslateDialog(QDialog):
|
||||
"""
|
||||
Запускает фоновый перевод текста и позволяет отредактировать результат.
|
||||
После exec() == Accepted переведённый текст доступен через translated_text().
|
||||
"""
|
||||
|
||||
def __init__(self, source_text: str, target_lang: str, parent=None):
|
||||
super().__init__(parent)
|
||||
self.source_text = source_text
|
||||
self.target_lang = target_lang
|
||||
self.worker = None
|
||||
|
||||
lang_name = LANG_NAMES.get(target_lang, target_lang)
|
||||
self.setWindowTitle(f"{tr('translation_title')} → {lang_name}")
|
||||
self.resize(560, 440)
|
||||
self.init_ui()
|
||||
self._start_translation()
|
||||
|
||||
def init_ui(self):
|
||||
layout = QVBoxLayout(self)
|
||||
|
||||
layout.addWidget(QLabel(tr("original_text")))
|
||||
self.original_edit = QTextEdit()
|
||||
self.original_edit.setPlainText(self.source_text)
|
||||
self.original_edit.setReadOnly(True)
|
||||
self.original_edit.setMaximumHeight(140)
|
||||
layout.addWidget(self.original_edit)
|
||||
|
||||
layout.addWidget(QLabel(tr("translated_text")))
|
||||
self.translated_edit = QTextEdit()
|
||||
self.translated_edit.setPlainText(tr("translating"))
|
||||
self.translated_edit.setEnabled(False)
|
||||
layout.addWidget(self.translated_edit)
|
||||
|
||||
btn_layout = QHBoxLayout()
|
||||
btn_layout.addStretch()
|
||||
self.apply_btn = QPushButton(tr("apply"))
|
||||
self.apply_btn.setEnabled(False)
|
||||
self.apply_btn.clicked.connect(self.accept)
|
||||
self.cancel_btn = QPushButton(tr("cancel"))
|
||||
self.cancel_btn.clicked.connect(self.reject)
|
||||
btn_layout.addWidget(self.apply_btn)
|
||||
btn_layout.addWidget(self.cancel_btn)
|
||||
layout.addLayout(btn_layout)
|
||||
|
||||
def _start_translation(self):
|
||||
self.worker = TranslateWorker(self.source_text, self.target_lang, self)
|
||||
self.worker.finished.connect(self._on_translation_finished)
|
||||
self.worker.start()
|
||||
|
||||
def _on_translation_finished(self, success: bool, result: str):
|
||||
if success:
|
||||
self.translated_edit.setPlainText(result)
|
||||
self.translated_edit.setEnabled(True)
|
||||
self.apply_btn.setEnabled(True)
|
||||
self.translated_edit.setFocus()
|
||||
else:
|
||||
self.translated_edit.setPlainText(f"{tr('translation_failed')}:\n{result}")
|
||||
|
||||
def translated_text(self) -> str:
|
||||
return self.translated_edit.toPlainText()
|
||||
|
||||
def closeEvent(self, event):
|
||||
if self.worker and self.worker.isRunning():
|
||||
self.worker.finished.disconnect()
|
||||
self.worker.quit()
|
||||
super().closeEvent(event)
|
||||
Reference in New Issue
Block a user