OBSBasicSettings_Appearance.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. #include "OBSBasicSettings.hpp"
  2. #include <OBSApp.hpp>
  3. #include <utility/platform.hpp>
  4. #include <qt-wrappers.hpp>
  5. void OBSBasicSettings::InitAppearancePage()
  6. {
  7. savedTheme = App()->GetTheme();
  8. const QString currentBaseTheme = savedTheme->isBaseTheme ? savedTheme->id : savedTheme->parent;
  9. for (const OBSTheme &theme : App()->GetThemes()) {
  10. if (theme.isBaseTheme && (HighContrastEnabled() || theme.isVisible || theme.id == currentBaseTheme)) {
  11. ui->theme->addItem(theme.name, theme.id);
  12. }
  13. }
  14. int idx = ui->theme->findData(currentBaseTheme);
  15. if (idx != -1)
  16. ui->theme->setCurrentIndex(idx);
  17. ui->themeVariant->setPlaceholderText(QTStr("Basic.Settings.Appearance.General.NoVariant"));
  18. ui->appearanceFontScale->setDisplayTicks(true);
  19. connect(ui->appearanceFontScale, &QSlider::valueChanged, ui->appearanceFontScaleText,
  20. [this](int value) { ui->appearanceFontScaleText->setText(QString::number(value)); });
  21. ui->appearanceFontScaleText->setText(QString::number(ui->appearanceFontScale->value()));
  22. connect(App(), &OBSApp::StyleChanged, this, &OBSBasicSettings::updateAppearanceControls);
  23. updateAppearanceControls();
  24. }
  25. void OBSBasicSettings::LoadThemeList(bool reload)
  26. {
  27. ProfileScope("OBSBasicSettings::LoadThemeList");
  28. const OBSTheme *currentTheme = App()->GetTheme();
  29. const QString currentBaseTheme = currentTheme->isBaseTheme ? currentTheme->id : currentTheme->parent;
  30. /* Nothing to do if current and last base theme were the same */
  31. const QString baseThemeId = ui->theme->currentData().toString();
  32. if (reload && baseThemeId == currentBaseTheme)
  33. return;
  34. ui->themeVariant->blockSignals(true);
  35. ui->themeVariant->clear();
  36. auto themes = App()->GetThemes();
  37. std::sort(themes.begin(), themes.end(), [](const OBSTheme &a, const OBSTheme &b) -> bool {
  38. return QString::compare(a.name, b.name, Qt::CaseInsensitive) < 0;
  39. });
  40. QString defaultVariant;
  41. const OBSTheme *baseTheme = App()->GetTheme(baseThemeId);
  42. for (const OBSTheme &theme : themes) {
  43. /* Skip non-visible themes */
  44. if (!theme.isVisible || theme.isHighContrast)
  45. continue;
  46. /* Skip non-child themes */
  47. if (theme.isBaseTheme || theme.parent != baseThemeId)
  48. continue;
  49. ui->themeVariant->addItem(theme.name, theme.id);
  50. if (baseTheme && theme.filename == baseTheme->filename)
  51. defaultVariant = theme.id;
  52. }
  53. int idx = ui->themeVariant->findData(currentTheme->id);
  54. if (idx != -1)
  55. ui->themeVariant->setCurrentIndex(idx);
  56. ui->themeVariant->setEnabled(ui->themeVariant->count() > 0);
  57. ui->themeVariant->blockSignals(false);
  58. /* If no variant is selected but variants are available set the first one. */
  59. if (idx == -1 && ui->themeVariant->count() > 0) {
  60. idx = ui->themeVariant->findData(defaultVariant);
  61. ui->themeVariant->setCurrentIndex(idx != -1 ? idx : 0);
  62. }
  63. }
  64. void OBSBasicSettings::LoadAppearanceSettings(bool reload)
  65. {
  66. LoadThemeList(reload);
  67. if (reload) {
  68. QString themeId = ui->theme->currentData().toString();
  69. if (ui->themeVariant->currentIndex() != -1)
  70. themeId = ui->themeVariant->currentData().toString();
  71. App()->SetTheme(themeId);
  72. }
  73. int fontScale = config_get_int(App()->GetUserConfig(), "Appearance", "FontScale");
  74. ui->appearanceFontScale->setValue(fontScale);
  75. int densityId = config_get_int(App()->GetUserConfig(), "Appearance", "Density");
  76. QAbstractButton *densityButton = ui->appearanceDensityButtonGroup->button(densityId);
  77. if (densityButton) {
  78. densityButton->setChecked(true);
  79. }
  80. updateAppearanceControls();
  81. }
  82. void OBSBasicSettings::SaveAppearanceSettings()
  83. {
  84. config_t *config = App()->GetUserConfig();
  85. OBSTheme *currentTheme = App()->GetTheme();
  86. if (savedTheme != currentTheme) {
  87. config_set_string(config, "Appearance", "Theme", QT_TO_UTF8(currentTheme->id));
  88. }
  89. config_set_int(config, "Appearance", "FontScale", ui->appearanceFontScale->value());
  90. int densityId = ui->appearanceDensityButtonGroup->checkedId();
  91. config_set_int(config, "Appearance", "Density", densityId);
  92. App()->SetTheme(currentTheme->id);
  93. }
  94. void OBSBasicSettings::on_theme_activated(int)
  95. {
  96. LoadAppearanceSettings(true);
  97. }
  98. void OBSBasicSettings::on_themeVariant_activated(int)
  99. {
  100. LoadAppearanceSettings(true);
  101. }
  102. void OBSBasicSettings::updateAppearanceControls()
  103. {
  104. OBSTheme *theme = App()->GetTheme();
  105. enableAppearanceFontControls(theme->usesFontScale);
  106. enableAppearanceDensityControls(theme->usesDensity);
  107. if (!theme->usesFontScale || !theme->usesDensity) {
  108. ui->appearanceOptionsWarning->setVisible(true);
  109. } else {
  110. ui->appearanceOptionsWarning->setVisible(false);
  111. }
  112. style()->polish(ui->appearanceOptionsWarningLabel);
  113. }
  114. void OBSBasicSettings::enableAppearanceFontControls(bool enable)
  115. {
  116. ui->appearanceFontScale->setEnabled(enable);
  117. ui->appearanceFontScaleText->setEnabled(enable);
  118. }
  119. void OBSBasicSettings::enableAppearanceDensityControls(bool enable)
  120. {
  121. const QList<QAbstractButton *> buttons = ui->appearanceDensityButtonGroup->buttons();
  122. for (QAbstractButton *button : buttons) {
  123. button->setEnabled(enable);
  124. }
  125. }