1
0

OBSBasicSettings_A11y.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. #include "OBSBasicSettings.hpp"
  2. #include <widgets/OBSBasic.hpp>
  3. #include <QColorDialog>
  4. enum ColorPreset {
  5. COLOR_PRESET_DEFAULT,
  6. COLOR_PRESET_COLOR_BLIND_1,
  7. COLOR_PRESET_CUSTOM = 99,
  8. };
  9. static inline QColor color_from_int(long long val)
  10. {
  11. return QColor(val & 0xff, (val >> 8) & 0xff, (val >> 16) & 0xff, (val >> 24) & 0xff);
  12. }
  13. static inline long long color_to_int(QColor color)
  14. {
  15. auto shift = [&](unsigned val, int shift) {
  16. return ((val & 0xff) << shift);
  17. };
  18. return shift(color.red(), 0) | shift(color.green(), 8) | shift(color.blue(), 16) | shift(color.alpha(), 24);
  19. }
  20. QColor OBSBasicSettings::GetColor(uint32_t colorVal, QString label)
  21. {
  22. QColorDialog::ColorDialogOptions options;
  23. #ifdef __linux__
  24. // TODO: Revisit hang on Ubuntu with native dialog
  25. options |= QColorDialog::DontUseNativeDialog;
  26. #endif
  27. QColor color = color_from_int(colorVal);
  28. return QColorDialog::getColor(color, this, label, options);
  29. }
  30. void OBSBasicSettings::LoadA11ySettings(bool presetChange)
  31. {
  32. config_t *config = App()->GetUserConfig();
  33. loading = true;
  34. if (!presetChange) {
  35. preset = config_get_int(config, "Accessibility", "ColorPreset");
  36. bool block = ui->colorPreset->blockSignals(true);
  37. ui->colorPreset->setCurrentIndex(std::min(preset, (uint32_t)ui->colorPreset->count() - 1));
  38. ui->colorPreset->blockSignals(block);
  39. bool checked = config_get_bool(config, "Accessibility", "OverrideColors");
  40. ui->colorsGroupBox->setChecked(checked);
  41. }
  42. if (preset == COLOR_PRESET_DEFAULT) {
  43. ResetDefaultColors();
  44. SetDefaultColors();
  45. } else if (preset == COLOR_PRESET_COLOR_BLIND_1) {
  46. ResetDefaultColors();
  47. mixerGreenActive = 0x742E94;
  48. mixerGreen = 0x4A1A60;
  49. mixerYellowActive = 0x3349F9;
  50. mixerYellow = 0x1F2C97;
  51. mixerRedActive = 0xBEAC63;
  52. mixerRed = 0x675B28;
  53. selectRed = 0x3349F9;
  54. selectGreen = 0xFF56C9;
  55. selectBlue = 0xB09B44;
  56. SetDefaultColors();
  57. } else if (preset == COLOR_PRESET_CUSTOM) {
  58. SetDefaultColors();
  59. selectRed = config_get_int(config, "Accessibility", "SelectRed");
  60. selectGreen = config_get_int(config, "Accessibility", "SelectGreen");
  61. selectBlue = config_get_int(config, "Accessibility", "SelectBlue");
  62. mixerGreen = config_get_int(config, "Accessibility", "MixerGreen");
  63. mixerYellow = config_get_int(config, "Accessibility", "MixerYellow");
  64. mixerRed = config_get_int(config, "Accessibility", "MixerRed");
  65. mixerGreenActive = config_get_int(config, "Accessibility", "MixerGreenActive");
  66. mixerYellowActive = config_get_int(config, "Accessibility", "MixerYellowActive");
  67. mixerRedActive = config_get_int(config, "Accessibility", "MixerRedActive");
  68. }
  69. UpdateA11yColors();
  70. loading = false;
  71. }
  72. void OBSBasicSettings::SaveA11ySettings()
  73. {
  74. config_t *config = App()->GetUserConfig();
  75. config_set_bool(config, "Accessibility", "OverrideColors", ui->colorsGroupBox->isChecked());
  76. config_set_int(config, "Accessibility", "ColorPreset", preset);
  77. config_set_int(config, "Accessibility", "SelectRed", selectRed);
  78. config_set_int(config, "Accessibility", "SelectGreen", selectGreen);
  79. config_set_int(config, "Accessibility", "SelectBlue", selectBlue);
  80. config_set_int(config, "Accessibility", "MixerGreen", mixerGreen);
  81. config_set_int(config, "Accessibility", "MixerYellow", mixerYellow);
  82. config_set_int(config, "Accessibility", "MixerRed", mixerRed);
  83. config_set_int(config, "Accessibility", "MixerGreenActive", mixerGreenActive);
  84. config_set_int(config, "Accessibility", "MixerYellowActive", mixerYellowActive);
  85. config_set_int(config, "Accessibility", "MixerRedActive", mixerRedActive);
  86. main->RefreshVolumeColors();
  87. }
  88. static void SetStyle(QLabel *label, uint32_t colorVal)
  89. {
  90. QColor color = color_from_int(colorVal);
  91. color.setAlpha(255);
  92. QPalette palette = QPalette(color);
  93. label->setFrameStyle(QFrame::Sunken | QFrame::Panel);
  94. label->setText(color.name(QColor::HexRgb));
  95. label->setPalette(palette);
  96. label->setStyleSheet(QString("background-color: %1; color: %2;")
  97. .arg(palette.color(QPalette::Window).name(QColor::HexRgb))
  98. .arg(palette.color(QPalette::WindowText).name(QColor::HexRgb)));
  99. label->setAutoFillBackground(true);
  100. label->setAlignment(Qt::AlignCenter);
  101. }
  102. void OBSBasicSettings::UpdateA11yColors()
  103. {
  104. SetStyle(ui->color1, selectRed);
  105. SetStyle(ui->color2, selectGreen);
  106. SetStyle(ui->color3, selectBlue);
  107. SetStyle(ui->color4, mixerGreen);
  108. SetStyle(ui->color5, mixerYellow);
  109. SetStyle(ui->color6, mixerRed);
  110. SetStyle(ui->color7, mixerGreenActive);
  111. SetStyle(ui->color8, mixerYellowActive);
  112. SetStyle(ui->color9, mixerRedActive);
  113. }
  114. void OBSBasicSettings::SetDefaultColors()
  115. {
  116. config_t *config = App()->GetUserConfig();
  117. config_set_default_int(config, "Accessibility", "SelectRed", selectRed);
  118. config_set_default_int(config, "Accessibility", "SelectGreen", selectGreen);
  119. config_set_default_int(config, "Accessibility", "SelectBlue", selectBlue);
  120. config_set_default_int(config, "Accessibility", "MixerGreen", mixerGreen);
  121. config_set_default_int(config, "Accessibility", "MixerYellow", mixerYellow);
  122. config_set_default_int(config, "Accessibility", "MixerRed", mixerRed);
  123. config_set_default_int(config, "Accessibility", "MixerGreenActive", mixerGreenActive);
  124. config_set_default_int(config, "Accessibility", "MixerYellowActive", mixerYellowActive);
  125. config_set_default_int(config, "Accessibility", "MixerRedActive", mixerRedActive);
  126. }
  127. void OBSBasicSettings::ResetDefaultColors()
  128. {
  129. selectRed = 0x0000FF;
  130. selectGreen = 0x00FF00;
  131. selectBlue = 0xFF7F00;
  132. mixerGreen = 0x267f26;
  133. mixerYellow = 0x267f7f;
  134. mixerRed = 0x26267f;
  135. mixerGreenActive = 0x4cff4c;
  136. mixerYellowActive = 0x4cffff;
  137. mixerRedActive = 0x4c4cff;
  138. }
  139. void OBSBasicSettings::on_colorPreset_currentIndexChanged(int idx)
  140. {
  141. preset = idx == ui->colorPreset->count() - 1 ? COLOR_PRESET_CUSTOM : idx;
  142. LoadA11ySettings(true);
  143. }
  144. void OBSBasicSettings::on_choose1_clicked()
  145. {
  146. QColor color = GetColor(selectRed, QTStr("Basic.Settings.Accessibility.ColorOverrides.SelectRed"));
  147. if (!color.isValid())
  148. return;
  149. selectRed = color_to_int(color);
  150. preset = COLOR_PRESET_CUSTOM;
  151. bool block = ui->colorPreset->blockSignals(true);
  152. ui->colorPreset->setCurrentIndex(ui->colorPreset->count() - 1);
  153. ui->colorPreset->blockSignals(block);
  154. A11yChanged();
  155. UpdateA11yColors();
  156. }
  157. void OBSBasicSettings::on_choose2_clicked()
  158. {
  159. QColor color = GetColor(selectGreen, QTStr("Basic.Settings.Accessibility.ColorOverrides.SelectGreen"));
  160. if (!color.isValid())
  161. return;
  162. selectGreen = color_to_int(color);
  163. preset = COLOR_PRESET_CUSTOM;
  164. bool block = ui->colorPreset->blockSignals(true);
  165. ui->colorPreset->setCurrentIndex(ui->colorPreset->count() - 1);
  166. ui->colorPreset->blockSignals(block);
  167. A11yChanged();
  168. UpdateA11yColors();
  169. }
  170. void OBSBasicSettings::on_choose3_clicked()
  171. {
  172. QColor color = GetColor(selectBlue, QTStr("Basic.Settings.Accessibility.ColorOverrides.SelectBlue"));
  173. if (!color.isValid())
  174. return;
  175. selectBlue = color_to_int(color);
  176. preset = COLOR_PRESET_CUSTOM;
  177. bool block = ui->colorPreset->blockSignals(true);
  178. ui->colorPreset->setCurrentIndex(ui->colorPreset->count() - 1);
  179. ui->colorPreset->blockSignals(block);
  180. A11yChanged();
  181. UpdateA11yColors();
  182. }
  183. void OBSBasicSettings::on_choose4_clicked()
  184. {
  185. QColor color = GetColor(mixerGreen, QTStr("Basic.Settings.Accessibility.ColorOverrides.MixerGreen"));
  186. if (!color.isValid())
  187. return;
  188. mixerGreen = color_to_int(color);
  189. preset = COLOR_PRESET_CUSTOM;
  190. bool block = ui->colorPreset->blockSignals(true);
  191. ui->colorPreset->setCurrentIndex(ui->colorPreset->count() - 1);
  192. ui->colorPreset->blockSignals(block);
  193. A11yChanged();
  194. UpdateA11yColors();
  195. }
  196. void OBSBasicSettings::on_choose5_clicked()
  197. {
  198. QColor color = GetColor(mixerYellow, QTStr("Basic.Settings.Accessibility.ColorOverrides.MixerYellow"));
  199. if (!color.isValid())
  200. return;
  201. mixerYellow = color_to_int(color);
  202. preset = COLOR_PRESET_CUSTOM;
  203. bool block = ui->colorPreset->blockSignals(true);
  204. ui->colorPreset->setCurrentIndex(ui->colorPreset->count() - 1);
  205. ui->colorPreset->blockSignals(block);
  206. A11yChanged();
  207. UpdateA11yColors();
  208. }
  209. void OBSBasicSettings::on_choose6_clicked()
  210. {
  211. QColor color = GetColor(mixerRed, QTStr("Basic.Settings.Accessibility.ColorOverrides.MixerRed"));
  212. if (!color.isValid())
  213. return;
  214. mixerRed = color_to_int(color);
  215. preset = COLOR_PRESET_CUSTOM;
  216. bool block = ui->colorPreset->blockSignals(true);
  217. ui->colorPreset->setCurrentIndex(ui->colorPreset->count() - 1);
  218. ui->colorPreset->blockSignals(block);
  219. A11yChanged();
  220. UpdateA11yColors();
  221. }
  222. void OBSBasicSettings::on_choose7_clicked()
  223. {
  224. QColor color =
  225. GetColor(mixerGreenActive, QTStr("Basic.Settings.Accessibility.ColorOverrides.MixerGreenActive"));
  226. if (!color.isValid())
  227. return;
  228. mixerGreenActive = color_to_int(color);
  229. preset = COLOR_PRESET_CUSTOM;
  230. bool block = ui->colorPreset->blockSignals(true);
  231. ui->colorPreset->setCurrentIndex(ui->colorPreset->count() - 1);
  232. ui->colorPreset->blockSignals(block);
  233. A11yChanged();
  234. UpdateA11yColors();
  235. }
  236. void OBSBasicSettings::on_choose8_clicked()
  237. {
  238. QColor color =
  239. GetColor(mixerYellowActive, QTStr("Basic.Settings.Accessibility.ColorOverrides.MixerYellowActive"));
  240. if (!color.isValid())
  241. return;
  242. mixerYellowActive = color_to_int(color);
  243. preset = COLOR_PRESET_CUSTOM;
  244. bool block = ui->colorPreset->blockSignals(true);
  245. ui->colorPreset->setCurrentIndex(ui->colorPreset->count() - 1);
  246. ui->colorPreset->blockSignals(block);
  247. A11yChanged();
  248. UpdateA11yColors();
  249. }
  250. void OBSBasicSettings::on_choose9_clicked()
  251. {
  252. QColor color = GetColor(mixerRedActive, QTStr("Basic.Settings.Accessibility.ColorOverrides.MixerRedActive"));
  253. if (!color.isValid())
  254. return;
  255. mixerRedActive = color_to_int(color);
  256. preset = COLOR_PRESET_CUSTOM;
  257. bool block = ui->colorPreset->blockSignals(true);
  258. ui->colorPreset->setCurrentIndex(ui->colorPreset->count() - 1);
  259. ui->colorPreset->blockSignals(block);
  260. A11yChanged();
  261. UpdateA11yColors();
  262. }