/
e-face
/
SuperPuperTerminal
Обзор
Документация
Войти
/
e-face
/
SuperPuperTerminal
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
src/thememanager.cpp
416 строк
8 KB
e-face
First one
14 фев 2026, 19:38
14 фев 2026, 19:38
87f499b
Код
Авторство
О чём код?
#include "thememanager.h" #include <QSettings> //---------------------------------------------- const QString DEFAULT_THEME = "default"; const QString DARK_THEME = "dark"; //---------------------------------------------- static const char* DARK_STYLESHEET = R"( QWidget { background-color: #2b2b2b; color: #e0e0e0; selection-background-color: #3a3a3a; selection-color: #ffffff; } QMainWindow { background-color: #2b2b2b; } QMenuBar { background-color: #323232; color: #e0e0e0; border-bottom: 1px solid #1a1a1a; } QMenuBar::item:selected { background-color: #3a3a3a; } QMenu { background-color: #323232; color: #e0e0e0; border: 1px solid #1a1a1a; } QMenu::item:selected { background-color: #3a3a3a; } QToolBar { background-color: #323232; border: none; spacing: 3px; } QToolButton { background-color: transparent; color: #e0e0e0; border: none; padding: 4px; } QToolButton:hover { background-color: #3a3a3a; } QToolButton:pressed { background-color: #4a4a4a; } QPushButton { background-color: #3a3a3a; color: #e0e0e0; border: 1px solid #555555; border-radius: 3px; padding: 5px 15px; min-width: 60px; } QPushButton:hover { background-color: #4a4a4a; border-color: #666666; } QPushButton:pressed { background-color: #555555; } QPushButton:disabled { background-color: #2b2b2b; color: #666666; border-color: #3a3a3a; } QLineEdit, QTextEdit, QPlainTextEdit { background-color: #1e1e1e; color: #e0e0e0; border: 1px solid #3a3a3a; border-radius: 3px; padding: 3px; selection-background-color: #3a3a3a; } QLineEdit:focus, QTextEdit:focus, QPlainTextEdit:focus { border: 1px solid #5a5a5a; } QComboBox { background-color: #3a3a3a; color: #e0e0e0; border: 1px solid #555555; border-radius: 3px; padding: 3px 10px; } QComboBox:hover { background-color: #4a4a4a; border-color: #666666; } QComboBox::drop-down { border: none; width: 20px; } QComboBox::down-arrow { image: none; border-left: 4px solid transparent; border-right: 4px solid transparent; border-top: 6px solid #e0e0e0; } QSpinBox, QDoubleSpinBox { background-color: #1e1e1e; color: #e0e0e0; border: 1px solid #3a3a3a; border-radius: 3px; padding: 3px; } QSpinBox:focus, QDoubleSpinBox:focus { border: 1px solid #5a5a5a; } QSpinBox::up-button, QDoubleSpinBox::up-button { background-color: #3a3a3a; border-left: 1px solid #3a3a3a; } QSpinBox::down-button, QDoubleSpinBox::down-button { background-color: #3a3a3a; border-left: 1px solid #3a3a3a; } QTableWidget, QTableView { background-color: #1e1e1e; color: #e0e0e0; gridline-color: #3a3a3a; border: 1px solid #3a3a3a; } QTableWidget::item { background-color: #1e1e1e; border: none; } QTableWidget::item:selected { background-color: #3a3a3a; } QHeaderView::section { background-color: #323232; color: #e0e0e0; border: none; border-right: 1px solid #3a3a3a; border-bottom: 1px solid #3a3a3a; padding: 4px; } QScrollBar:vertical { background-color: #2b2b2b; width: 12px; border: none; } QScrollBar::handle:vertical { background-color: #4a4a4a; border-radius: 6px; min-height: 20px; } QScrollBar::handle:vertical:hover { background-color: #5a5a5a; } QScrollBar:horizontal { background-color: #2b2b2b; height: 12px; border: none; } QScrollBar::handle:horizontal { background-color: #4a4a4a; border-radius: 6px; min-width: 20px; } QScrollBar::handle:horizontal:hover { background-color: #5a5a5a; } QScrollBar::add-line, QScrollBar::sub-line { border: none; background: none; } QCheckBox { color: #e0e0e0; } QCheckBox::indicator { background-color: #3a3a3a; border: 1px solid #555555; border-radius: 2px; width: 14px; height: 14px; } QCheckBox::indicator:checked { background-color: #5a5a5a; } QCheckBox::indicator:checked:hover { background-color: #6a6a6a; } QRadioButton { color: #e0e0e0; } QRadioButton::indicator { background-color: #3a3a3a; border: 1px solid #555555; border-radius: 6px; width: 12px; height: 12px; } QRadioButton::indicator:checked { background-color: #5a5a5a; } QGroupBox { color: #e0e0e0; border: 1px solid #3a3a3a; border-radius: 3px; margin-top: 10px; padding-top: 10px; } QGroupBox::title { subcontrol-origin: margin; left: 10px; padding: 0 3px; } QLabel { color: #e0e0e0; } QTabWidget::pane { border: 1px solid #3a3a3a; background-color: #2b2b2b; } QTabBar::tab { background-color: #323232; color: #e0e0e0; border: 1px solid #3a3a3a; border-bottom: none; padding: 5px 15px; } QTabBar::tab:selected { background-color: #2b2b2b; } QTabBar::tab:hover { background-color: #3a3a3a; } QStatusBar { background-color: #323232; color: #e0e0e0; border-top: 1px solid #1a1a1a; } QDialog { background-color: #2b2b2b; } QMdiArea { background-color: #1e1e1e; } QSplitter::handle { background-color: #3a3a3a; } QSplitter::handle:horizontal { width: 2px; } QSplitter::handle:vertical { height: 2px; } )"; //---------------------------------------------- ThemeManager::ThemeManager() : _currentTheme(DEFAULT_THEME) { } //---------------------------------------------- ThemeManager& ThemeManager::instance() { static ThemeManager instance; return instance; } //---------------------------------------------- void ThemeManager::setTheme(const QString& themeName) { if (_currentTheme == themeName) return; _currentTheme = themeName; if (themeName == DARK_THEME) { qApp->setStyleSheet(DARK_STYLESHEET); setWindowsDarkMode(true); qApp->installEventFilter(this); } else { qApp->setStyleSheet(""); setWindowsDarkMode(false); qApp->removeEventFilter(this); } emit themeChanged(themeName); saveThemeToSettings(); } //---------------------------------------------- void ThemeManager::setWindowsDarkMode(bool enable) { #ifdef Q_OS_WIN Q_UNUSED(enable); BOOL useImmersiveDarkMode = TRUE; for (QWidget* widget : qApp->allWidgets()) { if (widget) { WId wid = widget->winId(); if (wid) { HWND hwnd = (HWND)wid; DwmSetWindowAttribute(hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &useImmersiveDarkMode, sizeof(useImmersiveDarkMode)); } } } #else Q_UNUSED(enable); #endif } //---------------------------------------------- QString ThemeManager::currentTheme() const { return _currentTheme; } //---------------------------------------------- void ThemeManager::loadThemeFromSettings() { QSettings s("settings.ini", QSettings::IniFormat); QString theme = s.value("theme", DEFAULT_THEME).toString(); setTheme(theme); } //---------------------------------------------- void ThemeManager::saveThemeToSettings() { QSettings s("settings.ini", QSettings::IniFormat); s.setValue("theme", _currentTheme); } //---------------------------------------------- bool ThemeManager::eventFilter(QObject* obj, QEvent* event) { if (event->type() == QEvent::WinIdChange && _currentTheme == DARK_THEME) { QWidget* widget = qobject_cast<QWidget*>(obj); if (widget) { #ifdef Q_OS_WIN HWND hwnd = (HWND)widget->effectiveWinId(); if (hwnd) { BOOL useImmersiveDarkMode = TRUE; DwmSetWindowAttribute(hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &useImmersiveDarkMode, sizeof(useImmersiveDarkMode)); } #endif } } return QObject::eventFilter(obj, event); } //----------------------------------------------