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:
dinlo
2026-07-02 14:09:57 +08:00
commit 34a40ae759
29 changed files with 3109 additions and 0 deletions
@@ -0,0 +1,82 @@
"""
QTextEdit / QLineEdit с пунктами «Перевести на …» в контекстном меню.
Пункты появляются при наличии выделенного текста; список языков
настраивается глобально через set_translate_languages() (из настроек).
"""
from typing import List
from PyQt6.QtWidgets import QTextEdit, QLineEdit
from comfy_studio.core.i18n import tr
from comfy_studio.services.translator import LANG_NAMES
from comfy_studio.ui.widgets.translate_dialog import TranslateDialog
# Глобальный список языков перевода (обновляется из настроек)
_translate_languages: List[str] = ["ru", "en"]
def set_translate_languages(langs: List[str]) -> None:
global _translate_languages
_translate_languages = [l for l in langs if l in LANG_NAMES] or ["ru", "en"]
def get_translate_languages() -> List[str]:
return list(_translate_languages)
class TranslatableTextEdit(QTextEdit):
"""QTextEdit с переводом выделенного текста через контекстное меню."""
def contextMenuEvent(self, event):
menu = self.createStandardContextMenu()
cursor = self.textCursor()
selected = cursor.selectedText()
if selected.strip() and not self.isReadOnly():
menu.addSeparator()
for lang in _translate_languages:
lang_name = LANG_NAMES.get(lang, lang)
action = menu.addAction(tr("translate_to", lang=lang_name))
action.setData(lang)
chosen = menu.exec(event.globalPos())
if chosen and chosen.data() in _translate_languages:
self._translate_selection(chosen.data())
def _translate_selection(self, target_lang: str):
cursor = self.textCursor()
# QTextCursor.selectedText() заменяет переводы строк на U+2029
selected = cursor.selectedText().replace("", "\n")
if not selected.strip():
return
dialog = TranslateDialog(selected, target_lang, self)
if dialog.exec() == TranslateDialog.DialogCode.Accepted:
cursor.insertText(dialog.translated_text())
class TranslatableLineEdit(QLineEdit):
"""QLineEdit с переводом выделенного текста через контекстное меню."""
def contextMenuEvent(self, event):
menu = self.createStandardContextMenu()
selected = self.selectedText()
if selected.strip() and not self.isReadOnly():
menu.addSeparator()
for lang in _translate_languages:
lang_name = LANG_NAMES.get(lang, lang)
action = menu.addAction(tr("translate_to", lang=lang_name))
action.setData(lang)
chosen = menu.exec(event.globalPos())
if chosen and chosen.data() in _translate_languages:
self._translate_selection(chosen.data())
def _translate_selection(self, target_lang: str):
selected = self.selectedText()
if not selected.strip():
return
dialog = TranslateDialog(selected, target_lang, self)
if dialog.exec() == TranslateDialog.DialogCode.Accepted:
self.insert(dialog.translated_text()) # заменяет выделение