355 lines
8.5 KiB
Python
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,
|
|||
|
|
}
|