123 lines
4.3 KiB
Python
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
|
|
) |