from PyQt6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QFrame from PyQt6.QtCore import Qt, pyqtSignal from .size_presets import SIZE_PRESETS from dataclasses import dataclass from typing import List, Dict @dataclass class SizePreset: name: str width: int height: int class SizePresetManager(QWidget): size_changed = pyqtSignal(int, int) # Сигнал для изменения размера def __init__(self, parent=None): super().__init__(parent) self.setup_ui() self.presets = [ SizePreset("512x512", 512, 512), SizePreset("768x768", 768, 768), SizePreset("1024x1024", 1024, 1024), SizePreset("512x768", 512, 768), SizePreset("768x512", 768, 512), SizePreset("512x1024", 512, 1024), SizePreset("1024x512", 1024, 512), SizePreset("768x1024", 768, 1024), SizePreset("1024x768", 1024, 768), ] def setup_ui(self): layout = QVBoxLayout(self) layout.setSpacing(2) # Заголовок title = QLabel("Размеры:") title.setStyleSheet(""" QLabel { color: #ffffff; font-size: 12px; font-weight: bold; padding: 4px; background-color: #3b3b3b; border-radius: 4px; } """) layout.addWidget(title) # Создаем фрейм для кнопок buttons_frame = QFrame() buttons_frame.setStyleSheet(""" QFrame { background-color: #2b2b2b; border: 1px solid #3b3b3b; border-radius: 4px; padding: 2px; } """) buttons_layout = QVBoxLayout(buttons_frame) buttons_layout.setSpacing(2) # Создаем две строки кнопок row1_layout = QHBoxLayout() row2_layout = QHBoxLayout() # Разделяем пресеты на две группы presets = list(SIZE_PRESETS.items()) half = len(presets) // 2 # Добавляем кнопки в первую строку for name, (width, height) in presets[:half]: button = self.create_preset_button(name, width, height) row1_layout.addWidget(button) # Добавляем кнопки во вторую строку for name, (width, height) in presets[half:]: button = self.create_preset_button(name, width, height) row2_layout.addWidget(button) buttons_layout.addLayout(row1_layout) buttons_layout.addLayout(row2_layout) layout.addWidget(buttons_frame) def create_preset_button(self, name, width, height): """Создание кнопки пресета с улучшенным дизайном""" button = QPushButton(name) button.setStyleSheet(f""" QPushButton {{ background-color: #3b3b3b; color: white; border: 1px solid #555555; border-radius: 4px; padding: 4px; font-size: 11px; min-width: 80px; text-align: center; }} QPushButton:hover {{ background-color: #4a4a4a; border-color: #666666; }} QPushButton:pressed {{ background-color: #0d6efd; border-color: #0b5ed7; }} """) button.clicked.connect(lambda checked, w=width, h=height: self.on_preset_clicked(w, h)) return button def on_preset_clicked(self, width, height): """Обработчик нажатия на кнопку пресета""" self.size_changed.emit(width, height) def get_preset_names(self) -> List[str]: """Возвращает список имен пресетов""" return [preset.name for preset in self.presets] def get_preset(self, name: str) -> SizePreset: """Возвращает пресет по имени""" return next( (preset for preset in self.presets if preset.name == name), None )