#include "settingssubpanel.h" #include "../managers/thememanager.h" #include #include #include #include #include #include SettingsSubPanel::SettingsSubPanel(const QString &iconPath, QWidget *parent) : QFrame(parent), m_iconPath(iconPath) { setObjectName("SettingsSubPanel"); setMaximumHeight(0); setMinimumHeight(0); setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); m_outerLayout = new QHBoxLayout(this); m_outerLayout->setContentsMargins(16, 8, 16, 8); m_outerLayout->setSpacing(12); m_iconLabel = new QLabel(this); m_iconLabel->setFixedSize(16, 16); m_iconLabel->setAlignment(Qt::AlignCenter); m_iconLabel->setObjectName("SettingsCardIcon"); updateIcon(); m_outerLayout->addWidget(m_iconLabel, 0, Qt::AlignVCenter); m_contentLayout = new QHBoxLayout(); m_contentLayout->setContentsMargins(0, 0, 0, 0); m_contentLayout->setSpacing(12); m_contentLayout->setAlignment(Qt::AlignVCenter); m_outerLayout->addLayout(m_contentLayout, 1); m_animation = new QPropertyAnimation(this, "panelHeight", this); m_animation->setDuration(250); m_animation->setEasingCurve(QEasingCurve::OutCubic); connect(m_animation, &QPropertyAnimation::finished, this, [this]() { if (!m_expanded) { hide(); } }); connect(ThemeManager::instance(), &ThemeManager::themeChanged, this, [this]() { updateStyleSheet(); updateIcon(); }); updateStyleSheet(); hide(); } void SettingsSubPanel::updateIcon() { if (m_iconPath.isEmpty()) return; QIcon icon = ThemeManager::getAdaptiveIcon(m_iconPath); m_iconLabel->setPixmap(icon.pixmap(16, 16)); } void SettingsSubPanel::updateStyleSheet() { bool isDark = ThemeManager::instance()->isDarkMode(); QString accent = isDark ? "#3B82F6" : "#4A90D9"; if (isDark) { setStyleSheet(QString( "#SettingsSubPanel {" " background: rgba(255,255,255,0.025);" " border: 1px solid rgba(255,255,255,0.06);" " border-left: 3px solid %1;" " border-radius: 12px;" " margin-left: 20px;" "}" "#SettingsSubPanel ModernComboBox {" " background-color: rgba(255,255,255,0.07);" " border: 1px solid rgba(255,255,255,0.10);" " border-radius: 8px;" " color: #E2E8F0;" " font-size: 13px; font-weight: 500;" " font-family: 'Segoe UI','Microsoft YaHei',sans-serif;" " padding: 5px 32px 5px 16px;" " min-width: 120px;" " selection-background-color: transparent;" "}" "#SettingsSubPanel ModernComboBox:hover {" " background-color: rgba(255,255,255,0.10);" " border-color: rgba(255,255,255,0.18);" "}" "#SettingsSubPanel ModernComboBox:focus {" " border-color: #3B82F6;" " background-color: rgba(59,130,246,0.08);" " outline: none;" "}" "#SettingsSubPanel ModernComboBox::drop-down {" " subcontrol-origin: padding; subcontrol-position: center right;" " width: 32px; border: none; background: transparent;" "}" "#SettingsSubPanel ModernComboBox::down-arrow {" " image: url(':/svg/dark/chevron-down.svg'); width: 14px; height: 14px;" "}" "#SettingsSubPanel ModernComboBox QAbstractItemView {" " background-color: #1E293B;" " border: 1px solid rgba(255,255,255,0.10);" " border-radius: 8px; color: #E2E8F0; font-size: 13px;" " outline: none; padding: 4px;" " selection-background-color: rgba(59,130,246,0.20);" " selection-color: #93C5FD;" "}" "#SettingsSubPanel ModernComboBox QAbstractItemView::item {" " padding: 5px 12px; border-radius: 6px;" "}" "#SettingsSubPanel ModernComboBox QAbstractItemView::item:hover {" " background-color: rgba(255,255,255,0.07); color: #F8FAFC;" "}" "#SettingsSubPanel ModernComboBox QAbstractItemView::item:selected {" " background-color: rgba(59,130,246,0.20); color: #93C5FD;" "}" "#SettingsSubPanel ModernComboBox QAbstractItemView::item:selected:hover {" " background-color: rgba(59,130,246,0.20); color: #93C5FD;" "}" "#SettingsSubPanel #SettingsCardDesc {" " color: #64748B;" " font-size: 12px;" " font-family: 'Segoe UI','Microsoft YaHei',sans-serif;" "}" "#SettingsSubPanel QLineEdit {" " background-color: rgba(255,255,255,0.07);" " border: 1px solid rgba(255,255,255,0.10);" " border-radius: 8px;" " color: #E2E8F0;" " font-size: 13px; font-weight: 500;" " font-family: 'Segoe UI','Microsoft YaHei',sans-serif;" " padding: 5px 12px;" " max-width: 280px;" "}" "#SettingsSubPanel QLineEdit:hover {" " border-color: rgba(255,255,255,0.18);" "}" "#SettingsSubPanel QLineEdit:focus {" " border-color: #3B82F6;" " background-color: rgba(59,130,246,0.08);" "}" "#SettingsSubPanel QLineEdit#DanmakuOptionSliderValue," "#SettingsSubPanel QLineEdit#DanmakuOptionSliderValue:hover," "#SettingsSubPanel QLineEdit#DanmakuOptionSliderValue:focus," "#SettingsSubPanel QLineEdit#SubtitleOptionSliderValue," "#SettingsSubPanel QLineEdit#SubtitleOptionSliderValue:hover," "#SettingsSubPanel QLineEdit#SubtitleOptionSliderValue:focus {" " background: transparent;" " border: none;" " border-radius: 0px;" " color: #BFDBFE;" " font-size: 13px;" " font-weight: 700;" " font-family: 'Segoe UI','Microsoft YaHei',sans-serif;" " padding: 0px;" " min-width: 0px;" " max-width: 16777215px;" " selection-background-color: rgba(96,165,250,0.22);" " selection-color: #F8FAFC;" "}" "#SettingsSubPanel QFrame#TagInputContainer {" " background-color: rgba(255,255,255,0.07);" " border: 1px solid rgba(255,255,255,0.10);" " border-radius: 8px;" "}" "#SettingsSubPanel QFrame#TagInputContainer:hover {" " border-color: rgba(255,255,255,0.18);" "}" "#SettingsSubPanel QFrame#TagInputContainer:focus-within {" " border-color: #3B82F6;" " background-color: rgba(255,255,255,0.07);" "}" "#SettingsSubPanel QLineEdit#TagInputInlineEdit," "#SettingsSubPanel QLineEdit#TagInputInlineEdit:hover," "#SettingsSubPanel QLineEdit#TagInputInlineEdit:focus {" " background: transparent;" " border: none;" " border-radius: 0px;" " color: #E2E8F0;" " font-size: 13px;" " font-weight: 500;" " font-family: 'Segoe UI','Microsoft YaHei',sans-serif;" " padding: 0px 4px;" " min-width: 0px;" " max-width: 16777215px;" " selection-background-color: rgba(59,130,246,0.25);" " selection-color: #FFFFFF;" "}" ).arg(accent)); } else { setStyleSheet(QString( "#SettingsSubPanel {" " background: rgba(0,0,0,0.018);" " border: 1px solid rgba(0,0,0,0.06);" " border-left: 3px solid %1;" " border-radius: 12px;" " margin-left: 20px;" "}" "#SettingsSubPanel ModernComboBox {" " background-color: #FFFFFF;" " border: 1px solid #CBD5E1;" " border-radius: 8px;" " color: #1E293B;" " font-size: 13px; font-weight: 500;" " font-family: 'Segoe UI','Microsoft YaHei',sans-serif;" " padding: 5px 32px 5px 16px;" " min-width: 120px;" " selection-background-color: transparent;" "}" "#SettingsSubPanel ModernComboBox:hover {" " background-color: #F8FAFC; border-color: #94A3B8;" "}" "#SettingsSubPanel ModernComboBox:focus {" " border-color: #3B82F6; background-color: #EFF6FF; outline: none;" "}" "#SettingsSubPanel ModernComboBox::drop-down {" " subcontrol-origin: padding; subcontrol-position: center right;" " width: 32px; border: none; background: transparent;" "}" "#SettingsSubPanel ModernComboBox::down-arrow {" " image: url(':/svg/light/chevron-down.svg'); width: 14px; height: 14px;" "}" "#SettingsSubPanel ModernComboBox QAbstractItemView {" " background-color: #FFFFFF;" " border: 1px solid #E2E8F0;" " border-radius: 8px; color: #1E293B; font-size: 13px;" " outline: none; padding: 4px;" " selection-background-color: rgba(59,130,246,0.10);" " selection-color: #2563EB;" "}" "#SettingsSubPanel ModernComboBox QAbstractItemView::item {" " padding: 5px 12px; border-radius: 6px;" "}" "#SettingsSubPanel ModernComboBox QAbstractItemView::item:hover {" " background-color: #F1F5F9; color: #0F172A;" "}" "#SettingsSubPanel ModernComboBox QAbstractItemView::item:selected {" " background-color: rgba(59,130,246,0.10); color: #2563EB;" "}" "#SettingsSubPanel ModernComboBox QAbstractItemView::item:selected:hover {" " background-color: rgba(59,130,246,0.10); color: #2563EB;" "}" "#SettingsSubPanel #SettingsCardDesc {" " color: #94A3B8;" " font-size: 12px;" " font-family: 'Segoe UI','Microsoft YaHei',sans-serif;" "}" "#SettingsSubPanel QLineEdit {" " background-color: #FFFFFF;" " border: 1px solid #CBD5E1;" " border-radius: 8px;" " color: #1E293B;" " font-size: 13px; font-weight: 500;" " font-family: 'Segoe UI','Microsoft YaHei',sans-serif;" " padding: 5px 12px;" " max-width: 280px;" "}" "#SettingsSubPanel QLineEdit:hover {" " border-color: #94A3B8;" "}" "#SettingsSubPanel QLineEdit:focus {" " border-color: #3B82F6; background-color: #EFF6FF;" "}" "#SettingsSubPanel QLineEdit#DanmakuOptionSliderValue," "#SettingsSubPanel QLineEdit#DanmakuOptionSliderValue:hover," "#SettingsSubPanel QLineEdit#DanmakuOptionSliderValue:focus," "#SettingsSubPanel QLineEdit#SubtitleOptionSliderValue," "#SettingsSubPanel QLineEdit#SubtitleOptionSliderValue:hover," "#SettingsSubPanel QLineEdit#SubtitleOptionSliderValue:focus {" " background: transparent;" " border: none;" " border-radius: 0px;" " color: #2563EB;" " font-size: 13px;" " font-weight: 700;" " font-family: 'Segoe UI','Microsoft YaHei',sans-serif;" " padding: 0px;" " min-width: 0px;" " max-width: 16777215px;" " selection-background-color: rgba(59,130,246,0.16);" " selection-color: #0F172A;" "}" "#SettingsSubPanel QFrame#TagInputContainer {" " background-color: #FFFFFF;" " border: 1px solid #CBD5E1;" " border-radius: 8px;" "}" "#SettingsSubPanel QFrame#TagInputContainer:hover {" " border-color: #94A3B8;" "}" "#SettingsSubPanel QFrame#TagInputContainer:focus-within {" " border-color: #3B82F6;" " background-color: #FFFFFF;" "}" "#SettingsSubPanel QLineEdit#TagInputInlineEdit," "#SettingsSubPanel QLineEdit#TagInputInlineEdit:hover," "#SettingsSubPanel QLineEdit#TagInputInlineEdit:focus {" " background: transparent;" " border: none;" " border-radius: 0px;" " color: #1E293B;" " font-size: 13px;" " font-weight: 500;" " font-family: 'Segoe UI','Microsoft YaHei',sans-serif;" " padding: 0px 4px;" " min-width: 0px;" " max-width: 16777215px;" " selection-background-color: rgba(59,130,246,0.25);" " selection-color: #1E293B;" "}" ).arg(accent)); } } void SettingsSubPanel::expand() { if (m_expanded) return; m_expanded = true; show(); auto scrollToSelf = [this]() { QWidget *p = parentWidget(); while (p) { if (auto *scrollArea = qobject_cast(p)) { scrollArea->ensureWidgetVisible(this, 0, 60); break; } p = p->parentWidget(); } }; int targetH = contentHeight(); bool reduceAnimations = ConfigStore::instance()->get(ConfigKeys::UiAnimations, false); if (reduceAnimations) { setPanelHeight(targetH); QTimer::singleShot(0, this, scrollToSelf); } else { m_animation->stop(); m_animation->setStartValue(0); m_animation->setEndValue(targetH); m_animation->start(); connect(m_animation, &QPropertyAnimation::finished, this, scrollToSelf, Qt::SingleShotConnection); } emit expandedChanged(true); } void SettingsSubPanel::collapse() { if (!m_expanded) return; m_expanded = false; bool reduceAnimations = ConfigStore::instance()->get(ConfigKeys::UiAnimations, false); if (reduceAnimations) { setPanelHeight(0); hide(); } else { m_animation->stop(); m_animation->setStartValue(maximumHeight()); m_animation->setEndValue(0); m_animation->start(); } emit expandedChanged(false); } void SettingsSubPanel::setExpanded(bool expanded) { if (expanded) expand(); else collapse(); } void SettingsSubPanel::setExpandedImmediately(bool expanded) { m_animation->stop(); m_expanded = expanded; if (expanded) { setPanelHeight(contentHeight()); show(); } else { setPanelHeight(0); hide(); } emit expandedChanged(expanded); } void SettingsSubPanel::initExpanded() { setExpandedImmediately(true); } int SettingsSubPanel::panelHeight() const { return maximumHeight(); } void SettingsSubPanel::setPanelHeight(int h) { setMaximumHeight(h); setMinimumHeight(h); } int SettingsSubPanel::contentHeight() const { if (!m_outerLayout) { return 48; } m_outerLayout->invalidate(); return qMax(48, m_outerLayout->sizeHint().height()); }