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

123 lines
4.3 KiB
Python

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
)