Files
art/modules/pages/home_page.py
2025-03-15 09:36:28 +07:00

237 lines
9.3 KiB
Python

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)}")