window-basic-settings-a11y.cpp 10 KB

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