181 lines
5.5 KiB
Python
181 lines
5.5 KiB
Python
from typing import Dict
|
|
|
|
class StyleConstants:
|
|
# Цветовая схема
|
|
COLORS = {
|
|
'primary': '#7E57C2', # Основной цвет
|
|
'secondary': '#B39DDB', # Вторичный цвет
|
|
'accent': '#536DFE', # Акцентный цвет
|
|
'success': '#66BB6A', # Цвет успеха
|
|
'warning': '#FFA726', # Цвет предупреждения
|
|
'error': '#EF5350', # Цвет ошибки
|
|
|
|
# Светлая тема
|
|
'light': {
|
|
'background': 'qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #FFFFFF, stop:1 #F5F5F5)',
|
|
'surface': '#FFFFFF',
|
|
'text': '#212121',
|
|
'text_secondary': '#757575',
|
|
'border': '#E0E0E0',
|
|
'hover': '#F5F5F5',
|
|
'pressed': '#EEEEEE'
|
|
},
|
|
|
|
# Темная тема
|
|
'dark': {
|
|
'background': 'qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #1A1A1A, stop:1 #2D2D2D)',
|
|
'surface': '#2D2D2D',
|
|
'text': '#FFFFFF',
|
|
'text_secondary': '#B0B0B0',
|
|
'border': '#404040',
|
|
'hover': '#353535',
|
|
'pressed': '#404040'
|
|
}
|
|
}
|
|
|
|
# Размеры и отступы (в пикселях)
|
|
SPACING = {
|
|
'xxs': 4,
|
|
'xs': 8,
|
|
'sm': 12,
|
|
'md': 16,
|
|
'lg': 24,
|
|
'xl': 32,
|
|
'xxl': 48
|
|
}
|
|
|
|
# Радиусы скругления (в пикселях)
|
|
RADIUS = {
|
|
'sm': 4,
|
|
'md': 8,
|
|
'lg': 12,
|
|
'xl': 16,
|
|
'pill': 9999
|
|
}
|
|
|
|
# Тени
|
|
SHADOWS = {
|
|
'sm': '0 2px 4px rgba(0,0,0,0.1)',
|
|
'md': '0 4px 8px rgba(0,0,0,0.1)',
|
|
'lg': '0 8px 16px rgba(0,0,0,0.1)'
|
|
}
|
|
|
|
# Анимации
|
|
ANIMATIONS = {
|
|
'duration': {
|
|
'fast': 150,
|
|
'normal': 250,
|
|
'slow': 350
|
|
},
|
|
'easing': 'cubic-bezier(0.4, 0, 0.2, 1)'
|
|
}
|
|
|
|
# Шрифты
|
|
FONTS = {
|
|
'family': {
|
|
'primary': 'Inter',
|
|
'secondary': 'Roboto'
|
|
},
|
|
'size': {
|
|
'xs': '12px',
|
|
'sm': '14px',
|
|
'md': '16px',
|
|
'lg': '18px',
|
|
'xl': '24px',
|
|
'xxl': '32px'
|
|
},
|
|
'weight': {
|
|
'regular': '400',
|
|
'medium': '500',
|
|
'semibold': '600',
|
|
'bold': '700'
|
|
}
|
|
}
|
|
|
|
@classmethod
|
|
def get_base_styles(cls, theme: str = 'light') -> str:
|
|
"""Возвращает базовые стили для приложения"""
|
|
colors = cls.COLORS[theme]
|
|
|
|
return f"""
|
|
/* Основные стили */
|
|
QMainWindow {{
|
|
background: {colors['background']};
|
|
}}
|
|
|
|
QWidget {{
|
|
color: {colors['text']};
|
|
font-family: {cls.FONTS['family']['primary']};
|
|
font-size: {cls.FONTS['size']['md']};
|
|
}}
|
|
|
|
/* Кнопки */
|
|
QPushButton {{
|
|
background-color: {cls.COLORS['primary']};
|
|
color: white;
|
|
border: none;
|
|
border-radius: {cls.RADIUS['md']}px;
|
|
padding: {cls.SPACING['sm']}px {cls.SPACING['md']}px;
|
|
font-weight: {cls.FONTS['weight']['medium']};
|
|
}}
|
|
|
|
QPushButton:hover {{
|
|
background-color: {cls.COLORS['secondary']};
|
|
}}
|
|
|
|
QPushButton:pressed {{
|
|
background-color: {cls.COLORS['accent']};
|
|
}}
|
|
|
|
/* Поля ввода */
|
|
QLineEdit, QTextEdit {{
|
|
background-color: {colors['surface']};
|
|
color: {colors['text']};
|
|
border: 1px solid {colors['border']};
|
|
border-radius: {cls.RADIUS['md']}px;
|
|
padding: {cls.SPACING['sm']}px;
|
|
selection-background-color: {cls.COLORS['secondary']};
|
|
}}
|
|
|
|
QLineEdit:focus, QTextEdit:focus {{
|
|
border-color: {cls.COLORS['primary']};
|
|
}}
|
|
|
|
/* Выпадающие списки */
|
|
QComboBox {{
|
|
background-color: {colors['surface']};
|
|
color: {colors['text']};
|
|
border: 1px solid {colors['border']};
|
|
border-radius: {cls.RADIUS['md']}px;
|
|
padding: {cls.SPACING['sm']}px;
|
|
}}
|
|
|
|
QComboBox:hover {{
|
|
border-color: {cls.COLORS['primary']};
|
|
}}
|
|
|
|
/* Полосы прокрутки */
|
|
QScrollBar:vertical {{
|
|
background-color: {colors['surface']};
|
|
width: 12px;
|
|
margin: 0;
|
|
}}
|
|
|
|
QScrollBar::handle:vertical {{
|
|
background-color: {cls.COLORS['secondary']};
|
|
min-height: 20px;
|
|
border-radius: {cls.RADIUS['sm']}px;
|
|
}}
|
|
|
|
QScrollBar:horizontal {{
|
|
background-color: {colors['surface']};
|
|
height: 12px;
|
|
margin: 0;
|
|
}}
|
|
|
|
QScrollBar::handle:horizontal {{
|
|
background-color: {cls.COLORS['secondary']};
|
|
min-width: 20px;
|
|
border-radius: {cls.RADIUS['sm']}px;
|
|
}}
|
|
""" |