diff --git a/UI/properties-view.cpp b/UI/properties-view.cpp index 7dab866b0..35d433388 100644 --- a/UI/properties-view.cpp +++ b/UI/properties-view.cpp @@ -635,14 +635,16 @@ QWidget *OBSPropertiesView::AddButton(obs_property_t *prop) return NewWidget(prop, button, SIGNAL(clicked())); } -void OBSPropertiesView::AddColor(obs_property_t *prop, QFormLayout *layout, - QLabel *&label) +void OBSPropertiesView::AddColorInternal(obs_property_t *prop, + QFormLayout *layout, QLabel *&label, + bool supportAlpha) { QPushButton *button = new QPushButton; QLabel *colorLabel = new QLabel; const char *name = obs_property_name(prop); long long val = obs_data_get_int(settings, name); QColor color = color_from_int(val); + QColor::NameFormat format; if (!obs_property_enabled(prop)) { button->setEnabled(false); @@ -653,19 +655,21 @@ void OBSPropertiesView::AddColor(obs_property_t *prop, QFormLayout *layout, button->setText(QTStr("Basic.PropertiesWindow.SelectColor")); button->setToolTip(QT_UTF8(obs_property_long_description(prop))); - color.setAlpha(255); + if (supportAlpha) { + format = QColor::HexArgb; + } else { + format = QColor::HexRgb; + color.setAlpha(255); + } QPalette palette = QPalette(color); colorLabel->setFrameStyle(QFrame::Sunken | QFrame::Panel); - // The picker doesn't have an alpha option, show only RGB - colorLabel->setText(color.name(QColor::HexRgb)); + colorLabel->setText(color.name(format)); colorLabel->setPalette(palette); colorLabel->setStyleSheet( QString("background-color :%1; color: %2;") - .arg(palette.color(QPalette::Window) - .name(QColor::HexRgb)) - .arg(palette.color(QPalette::WindowText) - .name(QColor::HexRgb))); + .arg(palette.color(QPalette::Window).name(format)) + .arg(palette.color(QPalette::WindowText).name(format))); colorLabel->setAutoFillBackground(true); colorLabel->setAlignment(Qt::AlignCenter); colorLabel->setToolTip(QT_UTF8(obs_property_long_description(prop))); @@ -684,6 +688,18 @@ void OBSPropertiesView::AddColor(obs_property_t *prop, QFormLayout *layout, layout->addRow(label, subLayout); } +void OBSPropertiesView::AddColor(obs_property_t *prop, QFormLayout *layout, + QLabel *&label) +{ + AddColorInternal(prop, layout, label, false); +} + +void OBSPropertiesView::AddColorAlpha(obs_property_t *prop, QFormLayout *layout, + QLabel *&label) +{ + AddColorInternal(prop, layout, label, true); +} + void MakeQFont(obs_data_t *font_obj, QFont &font, bool limit = false) { const char *face = obs_data_get_string(font_obj, "face"); @@ -1419,6 +1435,9 @@ void OBSPropertiesView::AddProperty(obs_property_t *property, break; case OBS_PROPERTY_GROUP: AddGroup(property, layout); + break; + case OBS_PROPERTY_COLOR_ALPHA: + AddColorAlpha(property, layout, label); } if (widget && !obs_property_enabled(property)) @@ -1698,14 +1717,19 @@ void WidgetInfo::ListChanged(const char *setting) } } -bool WidgetInfo::ColorChanged(const char *setting) +bool WidgetInfo::ColorChangedInternal(const char *setting, bool supportAlpha) { const char *desc = obs_property_description(property); long long val = obs_data_get_int(view->settings, setting); QColor color = color_from_int(val); + QColor::NameFormat format; QColorDialog::ColorDialogOptions options; + if (supportAlpha) { + options |= QColorDialog::ShowAlphaChannel; + } + /* The native dialog on OSX has all kinds of problems, like closing * other open QDialogs on exit, and * https://bugreports.qt-project.org/browse/QTBUG-34532 @@ -1715,26 +1739,40 @@ bool WidgetInfo::ColorChanged(const char *setting) #endif color = QColorDialog::getColor(color, view, QT_UTF8(desc), options); - color.setAlpha(255); - if (!color.isValid()) return false; + if (supportAlpha) { + format = QColor::HexArgb; + } else { + color.setAlpha(255); + format = QColor::HexRgb; + } + QLabel *label = static_cast(widget); - label->setText(color.name(QColor::HexRgb)); + label->setText(color.name(format)); QPalette palette = QPalette(color); 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->setStyleSheet( + QString("background-color :%1; color: %2;") + .arg(palette.color(QPalette::Window).name(format)) + .arg(palette.color(QPalette::WindowText).name(format))); obs_data_set_int(view->settings, setting, color_to_int(color)); return true; } +bool WidgetInfo::ColorChanged(const char *setting) +{ + return ColorChangedInternal(setting, false); +} + +bool WidgetInfo::ColorAlphaChanged(const char *setting) +{ + return ColorChangedInternal(setting, true); +} + bool WidgetInfo::FontChanged(const char *setting) { obs_data_t *font_obj = obs_data_get_obj(view->settings, setting); @@ -1889,6 +1927,10 @@ void WidgetInfo::ControlChanged() case OBS_PROPERTY_GROUP: GroupChanged(setting); break; + case OBS_PROPERTY_COLOR_ALPHA: + if (!ColorAlphaChanged(setting)) + return; + break; } if (view->callback && !view->deferUpdate) diff --git a/UI/properties-view.hpp b/UI/properties-view.hpp index 169c9377e..143e37100 100644 --- a/UI/properties-view.hpp +++ b/UI/properties-view.hpp @@ -30,7 +30,9 @@ private: void TextChanged(const char *setting); bool PathChanged(const char *setting); void ListChanged(const char *setting); + bool ColorChangedInternal(const char *setting, bool supportAlpha); bool ColorChanged(const char *setting); + bool ColorAlphaChanged(const char *setting); bool FontChanged(const char *setting); void GroupChanged(const char *setting); void EditableListChanged(); @@ -101,8 +103,12 @@ private: void AddEditableList(obs_property_t *prop, QFormLayout *layout, QLabel *&label); QWidget *AddButton(obs_property_t *prop); + void AddColorInternal(obs_property_t *prop, QFormLayout *layout, + QLabel *&label, bool supportAlpha); void AddColor(obs_property_t *prop, QFormLayout *layout, QLabel *&label); + void AddColorAlpha(obs_property_t *prop, QFormLayout *layout, + QLabel *&label); void AddFont(obs_property_t *prop, QFormLayout *layout, QLabel *&label); void AddFrameRate(obs_property_t *prop, bool &warning, QFormLayout *layout, QLabel *&label);