OBSBasicSettings_Appearance.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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. loading = true;
  67. LoadThemeList(reload);
  68. if (reload) {
  69. QString themeId = ui->theme->currentData().toString();
  70. if (ui->themeVariant->currentIndex() != -1)
  71. themeId = ui->themeVariant->currentData().toString();
  72. App()->SetTheme(themeId);
  73. }
  74. int fontScale = config_get_int(App()->GetUserConfig(), "Appearance", "FontScale");
  75. ui->appearanceFontScale->setValue(fontScale);
  76. int densityId = config_get_int(App()->GetUserConfig(), "Appearance", "Density");
  77. QAbstractButton *densityButton = ui->appearanceDensityButtonGroup->button(densityId);
  78. if (densityButton) {
  79. densityButton->setChecked(true);
  80. }
  81. updateAppearanceControls();
  82. loading = false;
  83. }
  84. void OBSBasicSettings::SaveAppearanceSettings()
  85. {
  86. config_t *config = App()->GetUserConfig();
  87. OBSTheme *currentTheme = App()->GetTheme();
  88. if (savedTheme != currentTheme) {
  89. config_set_string(config, "Appearance", "Theme", QT_TO_UTF8(currentTheme->id));
  90. }
  91. config_set_int(config, "Appearance", "FontScale", ui->appearanceFontScale->value());
  92. int densityId = ui->appearanceDensityButtonGroup->checkedId();
  93. config_set_int(config, "Appearance", "Density", densityId);
  94. App()->SetTheme(currentTheme->id);
  95. }
  96. void OBSBasicSettings::on_theme_activated(int)
  97. {
  98. LoadAppearanceSettings(true);
  99. }
  100. void OBSBasicSettings::on_themeVariant_activated(int)
  101. {
  102. LoadAppearanceSettings(true);
  103. }
  104. void OBSBasicSettings::updateAppearanceControls()
  105. {
  106. OBSTheme *theme = App()->GetTheme();
  107. enableAppearanceFontControls(theme->usesFontScale);
  108. enableAppearanceDensityControls(theme->usesDensity);
  109. if (!theme->usesFontScale || !theme->usesDensity) {
  110. ui->appearanceOptionsWarning->setVisible(true);
  111. } else {
  112. ui->appearanceOptionsWarning->setVisible(false);
  113. }
  114. style()->polish(ui->appearanceOptionsWarningLabel);
  115. }
  116. void OBSBasicSettings::enableAppearanceFontControls(bool enable)
  117. {
  118. ui->appearanceFontScale->setEnabled(enable);
  119. ui->appearanceFontScaleText->setEnabled(enable);
  120. }
  121. void OBSBasicSettings::enableAppearanceDensityControls(bool enable)
  122. {
  123. const QList<QAbstractButton *> buttons = ui->appearanceDensityButtonGroup->buttons();
  124. for (QAbstractButton *button : buttons) {
  125. button->setEnabled(enable);
  126. }
  127. }