from PyQt6.QtWidgets import (QLabel, QPushButton, QHBoxLayout, QVBoxLayout, QLineEdit, QListWidget, QListWidgetItem, QFrame) from PyQt6.QtCore import Qt from modules.styles.page import BasePage from modules.styles.theme import Colors from modules.styles.theme_manager import ThemeManager class ModelItem(QFrame): def __init__(self, model_name: str, parent=None): super().__init__(parent) self.model_name = model_name self.theme_manager = ThemeManager.get_instance() self.setup_ui() def setup_ui(self): """Настройка UI элемента модели""" colors = self.theme_manager.current_theme.get_colors() spacing = self.theme_manager.current_theme.get_spacing() layout = QHBoxLayout(self) layout.setContentsMargins(8, 8, 8, 8) # Название модели name_label = QLabel(self.model_name) name_label.setStyleSheet(f"color: {colors['text']};") layout.addWidget(name_label) # Растягиваем пространство layout.addStretch() # Кнопки управления select_btn = QPushButton("Выбрать") select_btn.setMinimumWidth(100) select_btn.setStyleSheet(f""" QPushButton {{ background-color: {colors['primary']}; color: white; border: none; border-radius: {spacing.TINY}px; padding: {spacing.SMALL}px {spacing.MEDIUM}px; }} QPushButton:hover {{ background-color: {colors['hover']}; }} QPushButton:pressed {{ background-color: {colors['active']}; }} """) layout.addWidget(select_btn) delete_btn = QPushButton("Удалить") delete_btn.setMinimumWidth(100) delete_btn.setStyleSheet(f""" QPushButton {{ background-color: {colors['error']}; color: white; border: none; border-radius: {spacing.TINY}px; padding: {spacing.SMALL}px {spacing.MEDIUM}px; }} QPushButton:hover {{ background-color: {colors['hover']}; }} QPushButton:pressed {{ background-color: {colors['active']}; }} """) layout.addWidget(delete_btn) # Стили self.setStyleSheet(f""" QFrame {{ background-color: {colors['surface']}; border: 1px solid {colors['border']}; border-radius: {spacing.TINY}px; }} """) class ModelsPage(BasePage): def __init__(self, parent=None): super().__init__(parent) self.theme_manager = ThemeManager.get_instance() self.setup_content() def setup_content(self): """Настройка содержимого страницы""" colors = self.theme_manager.current_theme.get_colors() spacing = self.theme_manager.current_theme.get_spacing() # Заголовок header = QLabel("Модели") header.setStyleSheet(f""" QLabel {{ color: {colors['text']}; font-size: 24px; font-weight: bold; }} """) self.layout.addWidget(header) # Поиск и добавление search_layout = QHBoxLayout() self.search_input = QLineEdit() self.search_input.setPlaceholderText("Поиск моделей...") self.search_input.setStyleSheet(f""" QLineEdit {{ background-color: {colors['surface']}; color: {colors['text']}; border: 1px solid {colors['border']}; border-radius: {spacing.TINY}px; padding: {spacing.SMALL}px; }} QLineEdit:focus {{ border: 1px solid {colors['primary']}; }} """) search_layout.addWidget(self.search_input) self.add_btn = QPushButton("Добавить модель") self.add_btn.setMinimumWidth(150) self.add_btn.setStyleSheet(f""" QPushButton {{ background-color: {colors['primary']}; color: white; border: none; border-radius: {spacing.TINY}px; padding: {spacing.SMALL}px {spacing.MEDIUM}px; }} QPushButton:hover {{ background-color: {colors['hover']}; }} QPushButton:pressed {{ background-color: {colors['active']}; }} """) search_layout.addWidget(self.add_btn) self.layout.addLayout(search_layout) # Список моделей self.models_list = QListWidget() self.models_list.setSpacing(8) self.models_list.setStyleSheet(f""" QListWidget {{ background-color: transparent; border: none; }} QListWidget::item {{ padding: 0; background-color: transparent; }} """) # Добавляем тестовые модели test_models = [ "stable-diffusion-v1-5", "stable-diffusion-v2-1", "stable-diffusion-xl-base-1.0" ] for model in test_models: item = QListWidgetItem(self.models_list) model_widget = ModelItem(model) item.setSizeHint(model_widget.sizeHint()) self.models_list.addItem(item) self.models_list.setItemWidget(item, model_widget) self.layout.addWidget(self.models_list)