themesettingswidget.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #include "themesettingswidget.h"
  2. #include <QApplication>
  3. #include <QButtonGroup>
  4. #include <QCheckBox>
  5. #include <QColorDialog>
  6. #include <QGroupBox>
  7. #include <QHBoxLayout>
  8. #include <QLineEdit>
  9. #include <QPainter>
  10. #include <QPushButton>
  11. #include <QRadioButton>
  12. #include <QSlider>
  13. #include <QStyle>
  14. #include <QVBoxLayout>
  15. #include "thememanager.h"
  16. #include "themesettingswidget.h"
  17. #include "widgets/colorlistwidget.h"
  18. ThemeSettingsWidget::ThemeSettingsWidget(QWidget *parent)
  19. : TWidget(parent)
  20. {
  21. setupUI();
  22. }
  23. void ThemeSettingsWidget::setupUI()
  24. {
  25. QVBoxLayout *mainLayout = new QVBoxLayout(this);
  26. mainLayout->setContentsMargins(20, 20, 20, 20);
  27. mainLayout->setSpacing(25);
  28. // 主题切换按钮
  29. m_themeToggle = new QPushButton(this);
  30. m_themeToggle->setCheckable(true);
  31. m_themeToggle->setFixedSize(80, 40);
  32. connect(m_themeToggle, &QPushButton::toggled, this, &ThemeSettingsWidget::toggleThemeMode);
  33. mainLayout->addWidget(m_themeToggle, 0, Qt::AlignHCenter);
  34. // 颜色选择按钮
  35. m_colorPicker = new QPushButton(tr("选择主题色"), this);
  36. m_colorPicker->setFixedHeight(40);
  37. connect(m_colorPicker, &QPushButton::clicked, this, &ThemeSettingsWidget::updatePrimaryColor);
  38. mainLayout->addWidget(m_colorPicker);
  39. // 尺寸选项
  40. mainLayout->addWidget(createSizeGroup());
  41. // 预览区域
  42. mainLayout->addWidget(createPreviewGroup());
  43. this->mainLayout()->addLayout(mainLayout);
  44. // 初始化状态
  45. updateColorButton();
  46. refreshPreview();
  47. }
  48. QGroupBox *ThemeSettingsWidget::createSizeGroup()
  49. {
  50. QGroupBox *group = new QGroupBox(tr("控件尺寸"), this);
  51. QHBoxLayout *layout = new QHBoxLayout(group);
  52. m_sizeGroup = new QButtonGroup(this);
  53. const QList<QPair<QString, int>> sizes = {{tr("紧凑"), ThemeManager::Small},
  54. {tr("标准"), ThemeManager::Medium},
  55. {tr("宽松"), ThemeManager::Large}};
  56. for (const auto &[text, mode] : sizes) {
  57. QRadioButton *rb = new QRadioButton(text, group);
  58. rb->setProperty("sizeMode", mode);
  59. m_sizeGroup->addButton(rb, mode);
  60. layout->addWidget(rb);
  61. }
  62. connect(m_sizeGroup,
  63. QOverload<int>::of(&QButtonGroup::idClicked),
  64. this,
  65. &ThemeSettingsWidget::changeSizeMode);
  66. m_sizeGroup->button(ThemeManager::Medium)->setChecked(true);
  67. return group;
  68. }
  69. QWidget *ThemeSettingsWidget::createPreviewGroup()
  70. {
  71. QWidget *preview = new QWidget(this);
  72. QHBoxLayout *hbox = new QHBoxLayout(preview);
  73. QVBoxLayout *layout = new QVBoxLayout();
  74. layout->setContentsMargins(15, 15, 15, 15);
  75. layout->setSpacing(12);
  76. // 示例控件
  77. m_sampleButton = new QPushButton(tr("示例按钮"), preview);
  78. m_sampleInput = new QLineEdit(preview);
  79. m_sampleCheck = new QCheckBox(tr("示例复选框"), preview);
  80. m_sampleSlider = new QSlider(Qt::Horizontal, preview);
  81. m_sampleInput->setPlaceholderText(tr("输入内容..."));
  82. m_sampleSlider->setRange(0, 100);
  83. m_sampleSlider->setValue(50);
  84. layout->addWidget(m_sampleButton);
  85. layout->addWidget(m_sampleInput);
  86. layout->addWidget(m_sampleCheck);
  87. layout->addWidget(m_sampleSlider);
  88. colorList = new ColorListWidget;
  89. colorList->setColors(ThemeManager::instance().colors());
  90. hbox->addLayout(layout);
  91. hbox->addWidget(colorList);
  92. return preview;
  93. }
  94. void ThemeSettingsWidget::toggleThemeMode()
  95. {
  96. ThemeManager::instance().toggleThemeMode();
  97. updateColorButton();
  98. refreshPreview();
  99. emit themeChanged();
  100. }
  101. void ThemeSettingsWidget::updatePrimaryColor()
  102. {
  103. QColor color = QColorDialog::getColor(ThemeManager::instance().primaryColor(),
  104. this,
  105. tr("选择主题颜色"),
  106. QColorDialog::DontUseNativeDialog
  107. | QColorDialog::ShowAlphaChannel);
  108. if (color.isValid()) {
  109. ThemeManager::instance().setPrimaryColor(color);
  110. updateColorButton();
  111. refreshPreview();
  112. emit themeChanged();
  113. }
  114. }
  115. void ThemeSettingsWidget::changeSizeMode(int mode)
  116. {
  117. ThemeManager::instance().setSizeMode(static_cast<ThemeManager::SizeMode>(mode));
  118. refreshPreview();
  119. emit themeChanged();
  120. }
  121. void ThemeSettingsWidget::updateColorButton()
  122. {
  123. const QColor primary = ThemeManager::instance().primaryColor();
  124. const QColor text = ThemeManager::instance().color("colorText");
  125. QString style = QString(R"(
  126. QPushButton {
  127. background: %1;
  128. border: 2px solid %2;
  129. border-radius: 6px;
  130. color: %3;
  131. font-weight: 500;
  132. }
  133. QPushButton:hover {
  134. background: %4;
  135. border-color: %5;
  136. }
  137. )")
  138. .arg(primary.name(),
  139. primary.darker(115).name(),
  140. text.name(),
  141. primary.lighter(110).name(),
  142. primary.darker(125).name());
  143. m_colorPicker->setStyleSheet(style);
  144. }
  145. void ThemeSettingsWidget::refreshPreview()
  146. {
  147. // 更新切换按钮样式
  148. QString themeStyle = ThemeManager::instance().themeMode() == ThemeManager::Light
  149. ? "background: qradialgradient(cx:0.5, cy:0.5, radius: 0.5, fx:0.7, "
  150. "fy:0.3, stop:0 #FFD700, stop:1 #FFA500);"
  151. : "background: qradialgradient(cx:0.5, cy:0.5, radius: 0.5, fx:0.3, "
  152. "fy:0.7, stop:0 #5A5A5A, stop:1 #2D2D2D);";
  153. m_themeToggle->setStyleSheet(QString(R"(
  154. QPushButton {
  155. border-radius: 20px;
  156. border: 2px solid palette(shadow);
  157. %1
  158. }
  159. QPushButton:hover {
  160. border-color: palette(highlight);
  161. }
  162. )")
  163. .arg(themeStyle));
  164. m_themeToggle->setText(ThemeManager::instance().themeMode() == ThemeManager::Dark ? "Dark"
  165. : "Light");
  166. colorList->setColors(ThemeManager::instance().colors());
  167. // 强制刷新样式
  168. qApp->setStyleSheet(qApp->styleSheet());
  169. }