from PyQt6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QTextEdit, QComboBox, QScrollArea, QFrame, QCheckBox) from PyQt6.QtCore import Qt, pyqtSignal from ..styles.style_constants import StyleConstants from ..styles.icons import IconManager, IconType class NegativePromptCategory(QFrame): """Виджет категории негативных промптов""" def __init__(self, title: str, prompts: dict, parent=None): super().__init__(parent) self.title = title self.prompts = prompts self.setup_ui() def setup_ui(self): layout = QVBoxLayout(self) # Заголовок категории title_label = QLabel(self.title) title_label.setStyleSheet(f""" font-size: {StyleConstants.FONTS['size']['lg']}; font-weight: {StyleConstants.FONTS['weight']['bold']}; margin-bottom: {StyleConstants.SPACING['sm']}; """) layout.addWidget(title_label) # Список промптов с чекбоксами for prompt, description in self.prompts.items(): prompt_frame = QFrame() prompt_layout = QVBoxLayout(prompt_frame) checkbox = QCheckBox(prompt) checkbox.setStyleSheet(f""" font-size: {StyleConstants.FONTS['size']['md']}; font-weight: {StyleConstants.FONTS['weight']['medium']}; """) description_label = QLabel(description) description_label.setStyleSheet(f""" color: {StyleConstants.COLORS['light']['text_secondary']}; font-size: {StyleConstants.FONTS['size']['sm']}; """) description_label.setWordWrap(True) prompt_layout.addWidget(checkbox) prompt_layout.addWidget(description_label) layout.addWidget(prompt_frame) self.setStyleSheet(f""" QFrame {{ background-color: {StyleConstants.COLORS['light']['surface']}; border-radius: {StyleConstants.RADIUS['lg']}; padding: {StyleConstants.SPACING['md']}; margin-bottom: {StyleConstants.SPACING['md']}; }} """) class NegativePromptWindow(QWidget): """Окно для работы с негативными промптами""" prompts_selected = pyqtSignal(list) def __init__(self, parent=None): super().__init__(parent) self.icon_manager = IconManager.get_instance() self.setup_ui() def setup_ui(self): self.setWindowTitle("Негативные промпты") self.resize(800, 600) # Основной layout layout = QVBoxLayout(self) layout.setSpacing(StyleConstants.SPACING['md']) layout.setContentsMargins( StyleConstants.SPACING['lg'], StyleConstants.SPACING['lg'], StyleConstants.SPACING['lg'], StyleConstants.SPACING['lg'] ) # Верхняя панель top_panel = QHBoxLayout() # Поиск self.search_box = QComboBox() self.search_box.setEditable(True) self.search_box.setPlaceholderText("Поиск негативных промптов...") self.search_box.setMinimumWidth(300) top_panel.addWidget(self.search_box) # Кнопки select_all_btn = QPushButton("Выбрать все") select_all_btn.setIcon(self.icon_manager.get_icon(IconType.SUCCESS)) top_panel.addWidget(select_all_btn) clear_btn = QPushButton("Очистить") clear_btn.setIcon(self.icon_manager.get_icon(IconType.CLOSE)) top_panel.addWidget(clear_btn) top_panel.addStretch() layout.addLayout(top_panel) # Область прокрутки для категорий scroll_area = QScrollArea() scroll_area.setWidgetResizable(True) scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) # Контейнер для категорий categories_widget = QWidget() self.categories_layout = QVBoxLayout(categories_widget) # Добавляем тестовые категории test_categories = { "Качество": { "Низкое качество": "Удаляет артефакты низкого качества и размытость", "Шум и зернистость": "Убирает нежелательный шум и зернистость", "Искажения": "Предотвращает искажения пропорций и перспективы" }, "Артефакты": { "Двойные элементы": "Убирает дублирование частей изображения", "Размытые лица": "Улучшает четкость и детализацию лиц", "Неправильная анатомия": "Корректирует анатомические ошибки" } } for title, prompts in test_categories.items(): category = NegativePromptCategory(title, prompts) self.categories_layout.addWidget(category) self.categories_layout.addStretch() scroll_area.setWidget(categories_widget) layout.addWidget(scroll_area) # Нижняя панель bottom_panel = QHBoxLayout() apply_btn = QPushButton("Применить") apply_btn.setIcon(self.icon_manager.get_icon(IconType.SUCCESS)) apply_btn.setStyleSheet(f""" background-color: {StyleConstants.COLORS['success']}; """) bottom_panel.addWidget(apply_btn) cancel_btn = QPushButton("Отмена") cancel_btn.setIcon(self.icon_manager.get_icon(IconType.CLOSE)) bottom_panel.addWidget(cancel_btn) bottom_panel.addStretch() layout.addLayout(bottom_panel) # Применяем стили self.setStyleSheet(StyleConstants.get_base_styles('light'))