Files
Any2MIF/ui/theme_controller.py
2025-03-07 15:32:58 +08:00

245 lines
6.9 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2025 Any2MIF Project
# All rights reserved.
"""
Any2MIF - 主题控制器
负责应用程序的主题设置,锁定为深色模式
"""
import os
from PyQt6.QtWidgets import QWidget
from PyQt6.QtCore import QSettings, pyqtSignal
class ThemeController(QWidget):
"""主题控制器,锁定为深色模式"""
# 自定义信号
theme_changed = pyqtSignal(str) # 主题变更时发出的信号
def __init__(self, settings: QSettings, parent=None):
"""初始化主题控制器"""
super().__init__(parent)
self.settings = settings
# 直接设置为深色模式
self.settings.setValue("theme", "dark")
self.apply_theme("dark")
self.theme_changed.emit("dark")
def apply_theme(self, theme):
"""应用主题"""
# 加载样式表
style_file = os.path.join("resources", "styles", f"{theme}.qss")
if os.path.exists(style_file):
with open(style_file, "r", encoding="utf-8") as f:
style_sheet = f.read()
# 应用样式表到应用程序
app = self.window().parent()
if app:
app.setStyleSheet(style_sheet)
else:
# 如果样式文件不存在,使用默认样式
self._apply_default_style(theme)
def _apply_default_style(self, theme):
"""应用默认样式"""
if theme == "light":
style_sheet = """
QMainWindow, QDialog {
background-color: #f5f5f5;
color: #333333;
}
QWidget {
background-color: #f5f5f5;
color: #333333;
}
QLabel {
color: #333333;
}
QPushButton {
background-color: #e0e0e0;
border: 1px solid #b0b0b0;
border-radius: 4px;
padding: 5px 10px;
color: #333333;
}
QPushButton:hover {
background-color: #d0d0d0;
}
QPushButton:pressed {
background-color: #c0c0c0;
}
QLineEdit, QSpinBox, QComboBox {
background-color: #ffffff;
border: 1px solid #b0b0b0;
border-radius: 4px;
padding: 3px;
color: #333333;
}
QGroupBox {
border: 1px solid #b0b0b0;
border-radius: 4px;
margin-top: 10px;
padding-top: 10px;
}
QGroupBox::title {
subcontrol-origin: margin;
subcontrol-position: top center;
padding: 0 5px;
color: #333333;
}
QListWidget {
background-color: #ffffff;
border: 1px solid #b0b0b0;
border-radius: 4px;
color: #333333;
}
QListWidget::item:selected {
background-color: #b0b0b0;
color: #333333;
}
QSlider::groove:horizontal {
border: 1px solid #b0b0b0;
height: 8px;
background: #ffffff;
margin: 2px 0;
border-radius: 4px;
}
QSlider::handle:horizontal {
background: #e0e0e0;
border: 1px solid #b0b0b0;
width: 18px;
margin: -2px 0;
border-radius: 9px;
}
QSlider::handle:horizontal:hover {
background: #d0d0d0;
}
QStatusBar {
background-color: #e0e0e0;
color: #333333;
}
QToolBar {
background-color: #e0e0e0;
border-bottom: 1px solid #b0b0b0;
}
"""
else: # dark
style_sheet = """
QMainWindow, QDialog {
background-color: #2d2d2d;
color: #f0f0f0;
}
QWidget {
background-color: #2d2d2d;
color: #f0f0f0;
}
QLabel {
color: #f0f0f0;
}
QPushButton {
background-color: #3d3d3d;
border: 1px solid #5d5d5d;
border-radius: 4px;
padding: 5px 10px;
color: #f0f0f0;
}
QPushButton:hover {
background-color: #4d4d4d;
}
QPushButton:pressed {
background-color: #5d5d5d;
}
QLineEdit, QSpinBox, QComboBox {
background-color: #3d3d3d;
border: 1px solid #5d5d5d;
border-radius: 4px;
padding: 3px;
color: #f0f0f0;
}
QGroupBox {
border: 1px solid #5d5d5d;
border-radius: 4px;
margin-top: 10px;
padding-top: 10px;
}
QGroupBox::title {
subcontrol-origin: margin;
subcontrol-position: top center;
padding: 0 5px;
color: #f0f0f0;
}
QListWidget {
background-color: #3d3d3d;
border: 1px solid #5d5d5d;
border-radius: 4px;
color: #f0f0f0;
}
QListWidget::item:selected {
background-color: #5d5d5d;
color: #f0f0f0;
}
QSlider::groove:horizontal {
border: 1px solid #5d5d5d;
height: 8px;
background: #3d3d3d;
margin: 2px 0;
border-radius: 4px;
}
QSlider::handle:horizontal {
background: #5d5d5d;
border: 1px solid #7d7d7d;
width: 18px;
margin: -2px 0;
border-radius: 9px;
}
QSlider::handle:horizontal:hover {
background: #6d6d6d;
}
QStatusBar {
background-color: #3d3d3d;
color: #f0f0f0;
}
QToolBar {
background-color: #3d3d3d;
border-bottom: 1px solid #5d5d5d;
}
"""
# 应用样式表到应用程序
app = self.window().parent()
if app:
app.setStyleSheet(style_sheet)