mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-09-20 04:42:18 +02:00
77694d76e8
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.
399 lines
10 KiB
C++
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();
|
|
}
|