Добавлен новый интерфейс с навигационной панелью и страницами для управления моделями, настройками и генерацией изображений. Реализованы стили для новых компонентов и добавлены функции для загрузки шрифтов и иконок. Обновлен основной класс окна для поддержки новых страниц.
This commit is contained in:
1 parent
df447a1ecf
commit
ac32c55ab9
25 files changed
+1496
-476
No files matched your search
@@ -0,0 +1,217 @@
|
||||
from enum import Enum, auto
|
||||
from typing import Dict
|
||||
|
||||
class Colors:
|
||||
DARK = {
|
||||
'background': '#1E1E1E',
|
||||
'surface': '#252526',
|
||||
'primary': '#007ACC',
|
||||
'secondary': '#3C3C3C',
|
||||
'text': '#FFFFFF',
|
||||
'text_secondary': '#CCCCCC',
|
||||
'border': '#3C3C3C',
|
||||
'hover': '#2A2D2E',
|
||||
'active': '#37373D',
|
||||
'error': '#F44336',
|
||||
'success': '#4CAF50',
|
||||
'warning': '#FFC107'
|
||||
}
|
||||
|
||||
LIGHT = {
|
||||
'background': '#FFFFFF',
|
||||
'surface': '#F3F3F3',
|
||||
'primary': '#007ACC',
|
||||
'secondary': '#E0E0E0',
|
||||
'text': '#000000',
|
||||
'text_secondary': '#666666',
|
||||
'border': '#CCCCCC',
|
||||
'hover': '#E8E8E8',
|
||||
'active': '#DADADA',
|
||||
'error': '#F44336',
|
||||
'success': '#4CAF50',
|
||||
'warning': '#FFC107'
|
||||
}
|
||||
|
||||
class Fonts:
|
||||
FAMILY = "Inter"
|
||||
SIZES = {
|
||||
"xs": "11px",
|
||||
"sm": "13px",
|
||||
"md": "14px",
|
||||
"lg": "16px",
|
||||
"xl": "18px"
|
||||
}
|
||||
WEIGHTS = {
|
||||
"normal": "400",
|
||||
"medium": "500",
|
||||
"semibold": "600",
|
||||
"bold": "700"
|
||||
}
|
||||
|
||||
class Spacing:
|
||||
TINY = 4
|
||||
SMALL = 8
|
||||
MEDIUM = 16
|
||||
LARGE = 24
|
||||
XLARGE = 32
|
||||
XXLARGE = 48
|
||||
|
||||
class Shadows:
|
||||
SMALL = {
|
||||
"dark": "0 2px 4px rgba(0, 0, 0, 0.3)",
|
||||
"light": "0 2px 4px rgba(0, 0, 0, 0.1)"
|
||||
}
|
||||
MEDIUM = {
|
||||
"dark": "0 4px 8px rgba(0, 0, 0, 0.4)",
|
||||
"light": "0 4px 8px rgba(0, 0, 0, 0.15)"
|
||||
}
|
||||
LARGE = {
|
||||
"dark": "0 8px 16px rgba(0, 0, 0, 0.5)",
|
||||
"light": "0 8px 16px rgba(0, 0, 0, 0.2)"
|
||||
}
|
||||
|
||||
class Theme(Enum):
|
||||
DARK = auto()
|
||||
LIGHT = auto()
|
||||
|
||||
def get_colors(self):
|
||||
if self == Theme.DARK:
|
||||
return Colors.DARK
|
||||
return Colors.LIGHT
|
||||
|
||||
def get_spacing(self):
|
||||
return Spacing
|
||||
|
||||
def get_fonts(self):
|
||||
return Fonts
|
||||
|
||||
def get_shadows(self):
|
||||
if self == Theme.DARK:
|
||||
return {k: v["dark"] for k, v in Shadows.__dict__.items() if isinstance(v, dict)}
|
||||
return {k: v["light"] for k, v in Shadows.__dict__.items() if isinstance(v, dict)}
|
||||
|
||||
class StyleSheet:
|
||||
@staticmethod
|
||||
def get_base_styles(theme: Theme) -> str:
|
||||
colors = theme.get_colors()
|
||||
spacing = theme.get_spacing()
|
||||
|
||||
return f"""
|
||||
QMainWindow {{
|
||||
background-color: {colors['background']};
|
||||
}}
|
||||
|
||||
QWidget {{
|
||||
color: {colors['text']};
|
||||
font-family: 'Inter';
|
||||
}}
|
||||
|
||||
QPushButton {{
|
||||
background-color: {colors['primary']};
|
||||
border: none;
|
||||
border-radius: {spacing.TINY}px;
|
||||
padding: {spacing.SMALL}px {spacing.MEDIUM}px;
|
||||
color: white;
|
||||
}}
|
||||
|
||||
QPushButton:hover {{
|
||||
background-color: {colors['hover']};
|
||||
}}
|
||||
|
||||
QPushButton:pressed {{
|
||||
background-color: {colors['active']};
|
||||
}}
|
||||
|
||||
QLineEdit, QTextEdit {{
|
||||
background-color: {colors['surface']};
|
||||
border: 1px solid {colors['border']};
|
||||
border-radius: {spacing.TINY}px;
|
||||
padding: {spacing.SMALL}px;
|
||||
color: {colors['text']};
|
||||
}}
|
||||
|
||||
QLineEdit:focus, QTextEdit:focus {{
|
||||
border: 1px solid {colors['primary']};
|
||||
}}
|
||||
|
||||
QComboBox {{
|
||||
background-color: {colors['surface']};
|
||||
border: 1px solid {colors['border']};
|
||||
border-radius: {spacing.TINY}px;
|
||||
padding: {spacing.SMALL}px;
|
||||
color: {colors['text']};
|
||||
}}
|
||||
|
||||
QComboBox:hover {{
|
||||
border: 1px solid {colors['primary']};
|
||||
}}
|
||||
|
||||
QLabel {{
|
||||
color: {colors['text']};
|
||||
}}
|
||||
|
||||
QScrollBar:vertical {{
|
||||
border: none;
|
||||
background-color: {colors['surface']};
|
||||
width: 10px;
|
||||
margin: 0px;
|
||||
}}
|
||||
|
||||
QScrollBar::handle:vertical {{
|
||||
background-color: {colors['secondary']};
|
||||
min-height: 20px;
|
||||
border-radius: 5px;
|
||||
}}
|
||||
|
||||
QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical {{
|
||||
height: 0px;
|
||||
}}
|
||||
|
||||
QScrollBar:horizontal {{
|
||||
border: none;
|
||||
background-color: {colors['surface']};
|
||||
height: 10px;
|
||||
margin: 0px;
|
||||
}}
|
||||
|
||||
QScrollBar::handle:horizontal {{
|
||||
background-color: {colors['secondary']};
|
||||
min-width: 20px;
|
||||
border-radius: 5px;
|
||||
}}
|
||||
|
||||
QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal {{
|
||||
width: 0px;
|
||||
}}
|
||||
"""
|
||||
|
||||
@staticmethod
|
||||
def get_custom_styles(theme: Theme) -> Dict[str, str]:
|
||||
colors = theme.get_colors()
|
||||
return {
|
||||
"primary_button": f"""
|
||||
QPushButton {{
|
||||
background-color: {colors['primary']};
|
||||
color: white;
|
||||
}}
|
||||
""",
|
||||
"secondary_button": f"""
|
||||
QPushButton {{
|
||||
background-color: transparent;
|
||||
color: {colors['primary']};
|
||||
border: 1px solid {colors['primary']};
|
||||
}}
|
||||
""",
|
||||
"danger_button": f"""
|
||||
QPushButton {{
|
||||
background-color: {colors['error']};
|
||||
color: white;
|
||||
}}
|
||||
""",
|
||||
"success_button": f"""
|
||||
QPushButton {{
|
||||
background-color: {colors['success']};
|
||||
color: white;
|
||||
}}
|
||||
"""
|
||||
}
|
||||
Reference in new issue
Block a user