window-basic-settings-a11y.cpp 10.0 KB

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