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