from PyQt6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QLineEdit, QSpinBox, QComboBox, QProgressBar) from PyQt6.QtCore import Qt, pyqtSignal from PyQt6.QtGui import QPixmap import requests from ..styles.style_constants import StyleConstants from ..styles.icons import IconManager, IconType from ..styles.page import BasePage class HomePage(BasePage): def __init__(self, model_manager, sampler_manager, size_preset_manager, parent=None): super().__init__(parent) self.model_manager = model_manager self.sampler_manager = sampler_manager self.size_preset_manager = size_preset_manager self.icon_manager = IconManager.get_instance() self.setup_ui() def setup_ui(self): # Верхняя панель с настройками settings_panel = QHBoxLayout() settings_panel.setContentsMargins( StyleConstants.SPACING['lg'], StyleConstants.SPACING['lg'], StyleConstants.SPACING['lg'], StyleConstants.SPACING['lg'] ) settings_panel.setSpacing(StyleConstants.SPACING['md']) # Выбор модели model_label = QLabel("Модель:") settings_panel.addWidget(model_label) self.model_combo = QComboBox() self.model_combo.currentTextChanged.connect(self.on_model_changed) settings_panel.addWidget(self.model_combo) # Выбор сэмплера sampler_label = QLabel("Сэмплер:") settings_panel.addWidget(sampler_label) self.sampler_combo = QComboBox() self.sampler_combo.currentTextChanged.connect(self.on_sampler_changed) settings_panel.addWidget(self.sampler_combo) # Настройки размера size_label = QLabel("Размер:") settings_panel.addWidget(size_label) self.width_spin = QSpinBox() self.width_spin.setRange(64, 2048) self.width_spin.setSingleStep(64) self.width_spin.setValue(512) settings_panel.addWidget(self.width_spin) self.height_spin = QSpinBox() self.height_spin.setRange(64, 2048) self.height_spin.setSingleStep(64) self.height_spin.setValue(512) settings_panel.addWidget(self.height_spin) settings_panel.addStretch() self.layout.addLayout(settings_panel) # Панель промптов prompts_panel = QVBoxLayout() prompts_panel.setContentsMargins( StyleConstants.SPACING['lg'], 0, StyleConstants.SPACING['lg'], StyleConstants.SPACING['lg'] ) prompts_panel.setSpacing(StyleConstants.SPACING['md']) # Позитивный промпт prompt_label = QLabel("Промпт:") prompts_panel.addWidget(prompt_label) self.prompt_edit = QLineEdit() self.prompt_edit.setPlaceholderText("Опишите желаемое изображение...") prompts_panel.addWidget(self.prompt_edit) # Негативный промпт negative_prompt_label = QLabel("Негативный промпт:") prompts_panel.addWidget(negative_prompt_label) self.negative_prompt_edit = QLineEdit() self.negative_prompt_edit.setPlaceholderText("Опишите нежелательные элементы...") prompts_panel.addWidget(self.negative_prompt_edit) self.layout.addLayout(prompts_panel) # Панель генерации generate_panel = QHBoxLayout() generate_panel.setContentsMargins( StyleConstants.SPACING['lg'], 0, StyleConstants.SPACING['lg'], StyleConstants.SPACING['lg'] ) generate_panel.setSpacing(StyleConstants.SPACING['md']) self.steps_spin = QSpinBox() self.steps_spin.setRange(1, 150) self.steps_spin.setValue(20) self.steps_spin.setPrefix("Шаги: ") generate_panel.addWidget(self.steps_spin) self.cfg_spin = QSpinBox() self.cfg_spin.setRange(1, 30) self.cfg_spin.setValue(7) self.cfg_spin.setPrefix("CFG: ") generate_panel.addWidget(self.cfg_spin) self.batch_size_spin = QSpinBox() self.batch_size_spin.setRange(1, 4) self.batch_size_spin.setValue(1) self.batch_size_spin.setPrefix("Количество: ") generate_panel.addWidget(self.batch_size_spin) self.generate_btn = QPushButton("Сгенерировать") self.generate_btn.setIcon(self.icon_manager.get_icon(IconType.GENERATE)) self.generate_btn.clicked.connect(self.generate_images) generate_panel.addWidget(self.generate_btn) generate_panel.addStretch() self.layout.addLayout(generate_panel) # Прогресс-бар progress_layout = QHBoxLayout() progress_layout.setContentsMargins( StyleConstants.SPACING['lg'], 0, StyleConstants.SPACING['lg'], StyleConstants.SPACING['lg'] ) self.progress_bar = QProgressBar() self.progress_bar.setTextVisible(True) self.progress_bar.setFormat("%p% - %v/%m шагов") progress_layout.addWidget(self.progress_bar) self.layout.addLayout(progress_layout) # Область для результатов result_layout = QVBoxLayout() result_layout.setContentsMargins( StyleConstants.SPACING['lg'], 0, StyleConstants.SPACING['lg'], StyleConstants.SPACING['lg'] ) self.result_label = QLabel() self.result_label.setAlignment(Qt.AlignmentFlag.AlignCenter) result_layout.addWidget(self.result_label) self.layout.addLayout(result_layout) self.layout.addStretch() # Обновляем UI self.update_ui() def update_ui(self): """Обновление UI после загрузки данных""" # Обновляем список моделей self.model_combo.clear() for model in self.model_manager.get_models(): self.model_combo.addItem(model.title, model.name) # Устанавливаем текущую модель current_model = self.model_manager.get_current_model() if current_model: index = self.model_combo.findData(current_model.name) if index >= 0: self.model_combo.setCurrentIndex(index) # Обновляем список сэмплеров self.sampler_combo.clear() for sampler in self.sampler_manager.get_samplers(): self.sampler_combo.addItem(sampler.title, sampler.name) # Устанавливаем текущий сэмплер current_sampler = self.sampler_manager.get_current_sampler() if current_sampler: index = self.sampler_combo.findData(current_sampler.name) if index >= 0: self.sampler_combo.setCurrentIndex(index) def on_model_changed(self, model_title): """Обработка изменения модели""" model_name = self.model_combo.currentData() if model_name: self.model_manager.switch_model(model_name) def on_sampler_changed(self, sampler_title): """Обработка изменения сэмплера""" sampler_name = self.sampler_combo.currentData() if sampler_name: self.sampler_manager.set_current_sampler(sampler_name) def set_resolution(self, width: int, height: int): """Установка разрешения""" self.width_spin.setValue(width) self.height_spin.setValue(height) def generate_images(self): """Генерация изображений""" try: # Получаем параметры params = { "prompt": self.prompt_edit.text(), "negative_prompt": self.negative_prompt_edit.text(), "steps": self.steps_spin.value(), "cfg_scale": self.cfg_spin.value(), "batch_size": self.batch_size_spin.value(), "width": self.width_spin.value(), "height": self.height_spin.value(), "sampler_name": self.sampler_combo.currentData(), } # Отправляем запрос response = requests.post( f"{self.model_manager.api_url}/sdapi/v1/txt2img", json=params ) if response.status_code == 200: result = response.json() # TODO: Отобразить сгенерированные изображения print("Изображения успешно сгенерированы") else: print(f"Ошибка генерации: {response.status_code}") except Exception as e: print(f"Ошибка при генерации: {str(e)}")