obs-studio/UI/window-basic-settings-a11y.cpp

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();
}