PCM_Viewer/styles.py

355 lines
8.5 KiB
Python

"""
PCM Viewer - 现代化UI样式定义
主题:深色专业主题
"""
# ==================== 颜色定义 ====================
class Colors:
"""颜色常量定义"""
# 主背景色
BG_PRIMARY = "#1e1e2e" # 主背景
BG_SECONDARY = "#252537" # 次级背景(面板)
BG_TERTIARY = "#313244" # 第三级背景(输入框、按钮)
BG_HOVER = "#3a3a52" # 悬停背景
BG_PRESSED = "#45475a" # 按下背景
# 强调色
ACCENT = "#89b4fa" # 主强调色(蓝)
ACCENT_HOVER = "#b4befe" # 强调色悬停
ACCENT_PRESSED = "#74c7ec" # 强调色按下
# 功能色
SUCCESS = "#a6e3a1" # 成功(绿)
WARNING = "#f9e2af" # 警告(黄)
ERROR = "#f38ba8" # 错误(红)
INFO = "#89b4fa" # 信息(蓝)
# 文字颜色
TEXT_PRIMARY = "#cdd6f4" # 主文字
TEXT_SECONDARY = "#a6adc8" # 次级文字
TEXT_MUTED = "#6c7086" # 弱化文字
TEXT_ON_ACCENT = "#1e1e2e" # 强调色上的文字
# 边框
BORDER = "#45475a" # 普通边框
BORDER_FOCUS = "#89b4fa" # 焦点边框
BORDER_SUBTLE = "#313244" # 细微边框
# ==================== 样式表 ====================
MAIN_STYLE = f"""
/* ==================== 全局样式 ==================== */
QMainWindow {{
background-color: {Colors.BG_PRIMARY};
}}
QWidget {{
color: {Colors.TEXT_PRIMARY};
font-family: "Microsoft YaHei", "Segoe UI", "PingFang SC", sans-serif;
font-size: 13px;
}}
/* 特定容器背景 */
QMainWindow > QWidget {{
background-color: {Colors.BG_PRIMARY};
}}
/* ==================== 按钮样式 ==================== */
QPushButton {{
background-color: {Colors.BG_TERTIARY};
color: {Colors.TEXT_PRIMARY};
border: 1px solid {Colors.BORDER};
border-radius: 6px;
padding: 8px 16px;
font-weight: 500;
min-height: 20px;
}}
QPushButton:hover {{
background-color: {Colors.BG_HOVER};
border-color: {Colors.ACCENT};
}}
QPushButton:pressed {{
background-color: {Colors.BG_PRESSED};
}}
QPushButton:disabled {{
background-color: {Colors.BG_SECONDARY};
color: {Colors.TEXT_MUTED};
border-color: {Colors.BORDER_SUBTLE};
}}
/* 主要操作按钮 */
QPushButton#primary {{
background-color: {Colors.ACCENT};
color: {Colors.TEXT_ON_ACCENT};
border: none;
font-weight: 600;
}}
QPushButton#primary:hover {{
background-color: {Colors.ACCENT_HOVER};
}}
QPushButton#primary:pressed {{
background-color: {Colors.ACCENT_PRESSED};
}}
/* 危险操作按钮 */
QPushButton#danger {{
background-color: {Colors.ERROR};
color: {Colors.TEXT_ON_ACCENT};
border: none;
}}
QPushButton#danger:hover {{
background-color: #f5a0b3;
}}
/* ==================== 输入框样式 ==================== */
QLineEdit {{
background-color: {Colors.BG_TERTIARY};
color: {Colors.TEXT_PRIMARY};
border: 1px solid {Colors.BORDER};
border-radius: 6px;
padding: 6px 10px;
selection-background-color: {Colors.ACCENT};
}}
QLineEdit:focus {{
border-color: {Colors.ACCENT};
}}
QLineEdit:disabled {{
background-color: {Colors.BG_SECONDARY};
color: {Colors.TEXT_MUTED};
}}
/* ==================== 数字输入框样式 ==================== */
QSpinBox {{
background-color: {Colors.BG_TERTIARY};
color: {Colors.TEXT_PRIMARY};
border: 1px solid {Colors.BORDER};
border-radius: 6px;
padding-right: 20px;
}}
QSpinBox:focus {{
border-color: {Colors.ACCENT};
}}
/* ==================== 标签样式 ==================== */
QLabel {{
color: {Colors.TEXT_PRIMARY};
background: transparent;
}}
QLabel#title {{
font-size: 16px;
font-weight: 600;
color: {Colors.TEXT_PRIMARY};
padding: 4px 0;
}}
QLabel#subtitle {{
font-size: 12px;
color: {Colors.TEXT_SECONDARY};
}}
/* ==================== 分组框样式 ==================== */
QGroupBox {{
background-color: {Colors.BG_SECONDARY};
border: 1px solid {Colors.BORDER};
border-radius: 8px;
margin-top: 12px;
padding-top: 12px;
padding: 12px;
font-weight: 500;
}}
QGroupBox::title {{
subcontrol-origin: margin;
left: 12px;
padding: 0 8px;
color: {Colors.ACCENT};
}}
/* ==================== 列表样式 ==================== */
QListWidget {{
background-color: {Colors.BG_TERTIARY};
color: {Colors.TEXT_PRIMARY};
border: 1px solid {Colors.BORDER};
border-radius: 6px;
padding: 4px;
outline: none;
}}
QListWidget::item {{
padding: 8px 12px;
border-radius: 4px;
margin: 2px 0;
}}
QListWidget::item:hover {{
background-color: {Colors.BG_HOVER};
}}
QListWidget::item:selected {{
background-color: {Colors.ACCENT};
color: {Colors.TEXT_ON_ACCENT};
}}
/* ==================== 复选框样式 ==================== */
QCheckBox {{
color: {Colors.TEXT_PRIMARY};
spacing: 8px;
}}
QCheckBox::indicator {{
width: 18px;
height: 18px;
border-radius: 4px;
border: 2px solid {Colors.BORDER};
background-color: {Colors.BG_TERTIARY};
}}
QCheckBox::indicator:hover {{
border-color: {Colors.ACCENT};
}}
QCheckBox::indicator:checked {{
background-color: {Colors.ACCENT};
border-color: {Colors.ACCENT};
image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTAgM0w0LjUgOC41TDIgNiIgc3Ryb2tlPSIjMWUxZTJlIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==);
}}
/* ==================== 滚动条样式 ==================== */
QScrollBar:vertical {{
background-color: {Colors.BG_SECONDARY};
width: 12px;
border-radius: 6px;
}}
QScrollBar::handle:vertical {{
background-color: {Colors.BG_TERTIARY};
border-radius: 6px;
min-height: 30px;
}}
QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical {{
height: 0px;
}}
QScrollBar:horizontal {{
background-color: {Colors.BG_SECONDARY};
height: 12px;
border-radius: 6px;
}}
QScrollBar::handle:horizontal {{
background-color: {Colors.BG_TERTIARY};
border-radius: 6px;
min-width: 30px;
}}
QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal {{
width: 0px;
}}
/* ==================== 分割器样式 ==================== */
QSplitter::handle {{
background-color: {Colors.BORDER};
}}
QSplitter::handle:horizontal {{
width: 2px;
}}
QSplitter::handle:vertical {{
height: 2px;
}}
QSplitter::handle:hover {{
background-color: {Colors.ACCENT};
}}
/* ==================== 对话框样式 ==================== */
QDialog {{
background-color: {Colors.BG_PRIMARY};
}}
QDialogButtonBox QPushButton {{
min-width: 80px;
}}
/* ==================== 消息框样式 ==================== */
QMessageBox {{
background-color: {Colors.BG_PRIMARY};
}}
QMessageBox QLabel {{
color: {Colors.TEXT_PRIMARY};
}}
/* ==================== 文件对话框样式 ==================== */
QFileDialog {{
background-color: {Colors.BG_PRIMARY};
}}
/* ==================== 颜色选择对话框样式 ==================== */
QColorDialog {{
background-color: {Colors.BG_PRIMARY};
}}
/* ==================== 纯文本编辑框样式 ==================== */
QPlainTextEdit {{
background-color: {Colors.BG_TERTIARY};
color: {Colors.TEXT_PRIMARY};
border: 1px solid {Colors.BORDER};
border-radius: 6px;
padding: 8px;
font-family: "Consolas", "Monaco", "Courier New", monospace;
selection-background-color: {Colors.ACCENT};
}}
QPlainTextEdit:focus {{
border-color: {Colors.ACCENT};
}}
/* ==================== 表单布局样式 ==================== */
QFormLayout QLabel {{
color: {Colors.TEXT_SECONDARY};
padding-right: 12px;
}}
/* ==================== 工具提示样式 ==================== */
QToolTip {{
background-color: {Colors.BG_SECONDARY};
color: {Colors.TEXT_PRIMARY};
border: 1px solid {Colors.BORDER};
border-radius: 4px;
padding: 6px 10px;
}}
"""
# ==================== 画布样式 ====================
CANVAS_STYLE = {
'background': Colors.BG_SECONDARY,
'grid_color': Colors.BORDER_SUBTLE,
'selection_border': Colors.ACCENT,
'selection_fill': f"{Colors.ACCENT}33", # 20%透明度
'canvas_border': Colors.BORDER,
}
# ==================== 组件默认样式 ====================
ITEM_STYLE = {
'default_border': Colors.BORDER,
'selected_border': Colors.ACCENT,
'hover_border': Colors.ACCENT_HOVER,
'resize_handle': Colors.ACCENT,
'resize_handle_size': 8,
}