0
0
mirror of https://github.com/obsproject/obs-studio.git synced 2024-09-20 13:08:50 +02:00
obs-studio/UI/window-basic-settings-a11y.cpp
VodBox 77694d76e8 UI: Add Accessibility menu to settings
This change introduces an accessibility menu to settings, along with
options for overriding the colors used by OBS in the mixer and in the
preview to be more color blind friendly than the options provided by the
current theme.
2022-07-27 21:37:30 -04:00

399 lines
10 KiB
C++

#include "window-basic-settings.hpp"
#include "window-basic-main.hpp"
#include "obs-frontend-api.h"
#include "obs-app.hpp"
#include "qt-wrappers.hpp"
#include <QColorDialog>
#define I18nStr(str) QTStr(str).toStdString().c_str()
enum ColorPreset {
COLOR_PRESET_DEFAULT,
COLOR_PRESET_COLOR_BLIND_1,
COLOR_PRESET_CUSTOM = 99,
};
static inline bool WidgetChanged(QWidget *widget)
{
return widget->property("changed").toBool();
}
static inline QColor color_from_int(long long val)
{
return QColor(val & 0xff, (val >> 8) & 0xff, (val >> 16) & 0xff,
(val >> 24) & 0xff);
}
static inline long long color_to_int(QColor color)
{
auto shift = [&](unsigned val, int shift) {
return ((val & 0xff) << shift);
};
return shift(color.red(), 0) | shift(color.green(), 8) |
shift(color.blue(), 16) | shift(color.alpha(), 24);
}
QColor OBSBasicSettings::GetColor(uint32_t colorVal, QString label)
{
QColorDialog::ColorDialogOptions options;
#ifndef _WIN32
options |= QColorDialog::DontUseNativeDialog;
#endif
QColor color = color_from_int(colorVal);
return QColorDialog::getColor(color, this, label, options);
}
void OBSBasicSettings::LoadA11ySettings(bool presetChange)
{
config_t *config = GetGlobalConfig();
if (!presetChange) {
preset = config_get_int(config, "Accessibility", "ColorPreset");
bool block = ui->colorPreset->blockSignals(true);
ui->colorPreset->setCurrentIndex(std::min(
preset, (uint32_t)ui->colorPreset->count() - 1));
ui->colorPreset->blockSignals(block);
bool checked = config_get_bool(config, "Accessibility",
"OverrideColors");
ui->colorsGroupBox->setChecked(checked);
}
if (preset == COLOR_PRESET_DEFAULT) {
ResetDefaultColors();
SetDefaultColors();
} else if (preset == COLOR_PRESET_COLOR_BLIND_1) {
ResetDefaultColors();
mixerGreenActive = 0x742E94;
mixerGreen = 0x4A1A60;
mixerYellowActive = 0x3349F9;
mixerYellow = 0x1F2C97;
mixerRedActive = 0xBEAC63;
mixerRed = 0x675B28;
selectRed = 0x3349F9;
selectGreen = 0xFF56C9;
selectBlue = 0xB09B44;
SetDefaultColors();
} else if (preset == COLOR_PRESET_CUSTOM) {
SetDefaultColors();
selectRed =
config_get_int(config, "Accessibility", "SelectRed");
selectGreen =
config_get_int(config, "Accessibility", "SelectGreen");
selectBlue =
config_get_int(config, "Accessibility", "SelectBlue");
mixerGreen =
config_get_int(config, "Accessibility", "MixerGreen");
mixerYellow =
config_get_int(config, "Accessibility", "MixerYellow");
mixerRed = config_get_int(config, "Accessibility", "MixerRed");
mixerGreenActive = config_get_int(config, "Accessibility",
"MixerGreenActive");
mixerYellowActive = config_get_int(config, "Accessibility",
"MixerYellowActive");
mixerRedActive = config_get_int(config, "Accessibility",
"MixerRedActive");
}
UpdateA11yColors();
}
void OBSBasicSettings::SaveA11ySettings()
{
config_t *config = GetGlobalConfig();
config_set_bool(config, "Accessibility", "OverrideColors",
ui->colorsGroupBox->isChecked());
config_set_int(config, "Accessibility", "ColorPreset", preset);
config_set_int(config, "Accessibility", "SelectRed", selectRed);
config_set_int(config, "Accessibility", "SelectGreen", selectGreen);
config_set_int(config, "Accessibility", "SelectBlue", selectBlue);
config_set_int(config, "Accessibility", "MixerGreen", mixerGreen);
config_set_int(config, "Accessibility", "MixerYellow", mixerYellow);
config_set_int(config, "Accessibility", "MixerRed", mixerRed);
config_set_int(config, "Accessibility", "MixerGreenActive",
mixerGreenActive);
config_set_int(config, "Accessibility", "MixerYellowActive",
mixerYellowActive);
config_set_int(config, "Accessibility", "MixerRedActive",
mixerRedActive);
main->RefreshVolumeColors();
}
#define SetStyle(label, colorVal) \
color = color_from_int(colorVal); \
color.setAlpha(255); \
palette = QPalette(color); \
label->setFrameStyle(QFrame::Sunken | QFrame::Panel); \
label->setText(color.name(QColor::HexRgb)); \
label->setPalette(palette); \
label->setStyleSheet(QString("background-color: %1; color: %2;") \
.arg(palette.color(QPalette::Window) \
.name(QColor::HexRgb)) \
.arg(palette.color(QPalette::WindowText) \
.name(QColor::HexRgb))); \
label->setAutoFillBackground(true); \
label->setAlignment(Qt::AlignCenter);
void OBSBasicSettings::UpdateA11yColors()
{
QPalette palette;
QColor color;
SetStyle(ui->color1, selectRed);
SetStyle(ui->color2, selectGreen);
SetStyle(ui->color3, selectBlue);
SetStyle(ui->color4, mixerGreen);
SetStyle(ui->color5, mixerYellow);
SetStyle(ui->color6, mixerRed);
SetStyle(ui->color7, mixerGreenActive);
SetStyle(ui->color8, mixerYellowActive);
SetStyle(ui->color9, mixerRedActive);
}
void OBSBasicSettings::SetDefaultColors()
{
config_t *config = GetGlobalConfig();
config_set_default_int(config, "Accessibility", "SelectRed", selectRed);
config_set_default_int(config, "Accessibility", "SelectGreen",
selectGreen);
config_set_default_int(config, "Accessibility", "SelectBlue",
selectBlue);
config_set_default_int(config, "Accessibility", "MixerGreen",
mixerGreen);
config_set_default_int(config, "Accessibility", "MixerYellow",
mixerYellow);
config_set_default_int(config, "Accessibility", "MixerRed", mixerRed);
config_set_default_int(config, "Accessibility", "MixerGreenActive",
mixerGreenActive);
config_set_default_int(config, "Accessibility", "MixerYellowActive",
mixerYellowActive);
config_set_default_int(config, "Accessibility", "MixerRedActive",
mixerRedActive);
}
void OBSBasicSettings::ResetDefaultColors()
{
selectRed = 0x0000FF;
selectGreen = 0x00FF00;
selectBlue = 0xFF7F00;
mixerGreen = 0x267f26;
mixerYellow = 0x267f7f;
mixerRed = 0x26267f;
mixerGreenActive = 0x4cff4c;
mixerYellowActive = 0x4cffff;
mixerRedActive = 0x4c4cff;
}
void OBSBasicSettings::on_colorPreset_currentIndexChanged(int idx)
{
preset = idx == ui->colorPreset->count() - 1 ? COLOR_PRESET_CUSTOM
: idx;
LoadA11ySettings(true);
}
void OBSBasicSettings::on_choose1_clicked()
{
QColor color = GetColor(
selectRed,
QTStr("Basic.Settings.Accessibility.ColorOverrides.SelectRed"));
if (!color.isValid())
return;
selectRed = color_to_int(color);
preset = COLOR_PRESET_CUSTOM;
bool block = ui->colorPreset->blockSignals(true);
ui->colorPreset->setCurrentIndex(ui->colorPreset->count() - 1);
ui->colorPreset->blockSignals(block);
A11yChanged();
UpdateA11yColors();
}
void OBSBasicSettings::on_choose2_clicked()
{
QColor color = GetColor(
selectGreen,
QTStr("Basic.Settings.Accessibility.ColorOverrides.SelectGreen"));
if (!color.isValid())
return;
selectGreen = color_to_int(color);
preset = COLOR_PRESET_CUSTOM;
bool block = ui->colorPreset->blockSignals(true);
ui->colorPreset->setCurrentIndex(ui->colorPreset->count() - 1);
ui->colorPreset->blockSignals(block);
A11yChanged();
UpdateA11yColors();
}
void OBSBasicSettings::on_choose3_clicked()
{
QColor color = GetColor(
selectBlue,
QTStr("Basic.Settings.Accessibility.ColorOverrides.SelectBlue"));
if (!color.isValid())
return;
selectBlue = color_to_int(color);
preset = COLOR_PRESET_CUSTOM;
bool block = ui->colorPreset->blockSignals(true);
ui->colorPreset->setCurrentIndex(ui->colorPreset->count() - 1);
ui->colorPreset->blockSignals(block);
A11yChanged();
UpdateA11yColors();
}
void OBSBasicSettings::on_choose4_clicked()
{
QColor color = GetColor(
mixerGreen,
QTStr("Basic.Settings.Accessibility.ColorOverrides.MixerGreen"));
if (!color.isValid())
return;
mixerGreen = color_to_int(color);
preset = COLOR_PRESET_CUSTOM;
bool block = ui->colorPreset->blockSignals(true);
ui->colorPreset->setCurrentIndex(ui->colorPreset->count() - 1);
ui->colorPreset->blockSignals(block);
A11yChanged();
UpdateA11yColors();
}
void OBSBasicSettings::on_choose5_clicked()
{
QColor color = GetColor(
mixerYellow,
QTStr("Basic.Settings.Accessibility.ColorOverrides.MixerYellow"));
if (!color.isValid())
return;
mixerYellow = color_to_int(color);
preset = COLOR_PRESET_CUSTOM;
bool block = ui->colorPreset->blockSignals(true);
ui->colorPreset->setCurrentIndex(ui->colorPreset->count() - 1);
ui->colorPreset->blockSignals(block);
A11yChanged();
UpdateA11yColors();
}
void OBSBasicSettings::on_choose6_clicked()
{
QColor color = GetColor(
mixerRed,
QTStr("Basic.Settings.Accessibility.ColorOverrides.MixerRed"));
if (!color.isValid())
return;
mixerRed = color_to_int(color);
preset = COLOR_PRESET_CUSTOM;
bool block = ui->colorPreset->blockSignals(true);
ui->colorPreset->setCurrentIndex(ui->colorPreset->count() - 1);
ui->colorPreset->blockSignals(block);
A11yChanged();
UpdateA11yColors();
}
void OBSBasicSettings::on_choose7_clicked()
{
QColor color = GetColor(
mixerGreenActive,
QTStr("Basic.Settings.Accessibility.ColorOverrides.MixerGreenActive"));
if (!color.isValid())
return;
mixerGreenActive = color_to_int(color);
preset = COLOR_PRESET_CUSTOM;
bool block = ui->colorPreset->blockSignals(true);
ui->colorPreset->setCurrentIndex(ui->colorPreset->count() - 1);
ui->colorPreset->blockSignals(block);
A11yChanged();
UpdateA11yColors();
}
void OBSBasicSettings::on_choose8_clicked()
{
QColor color = GetColor(
mixerYellowActive,
QTStr("Basic.Settings.Accessibility.ColorOverrides.MixerYellowActive"));
if (!color.isValid())
return;
mixerYellowActive = color_to_int(color);
preset = COLOR_PRESET_CUSTOM;
bool block = ui->colorPreset->blockSignals(true);
ui->colorPreset->setCurrentIndex(ui->colorPreset->count() - 1);
ui->colorPreset->blockSignals(block);
A11yChanged();
UpdateA11yColors();
}
void OBSBasicSettings::on_choose9_clicked()
{
QColor color = GetColor(
mixerRedActive,
QTStr("Basic.Settings.Accessibility.ColorOverrides.MixerRedActive"));
if (!color.isValid())
return;
mixerRedActive = color_to_int(color);
preset = COLOR_PRESET_CUSTOM;
bool block = ui->colorPreset->blockSignals(true);
ui->colorPreset->setCurrentIndex(ui->colorPreset->count() - 1);
ui->colorPreset->blockSignals(block);
A11yChanged();
UpdateA11yColors();
}