diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 180f9194..8104a32f 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -468,12 +468,12 @@ AdvSceneSwitcher.condition.video.layout.minNeighbor="Minimum neighbors:{{minNeig AdvSceneSwitcher.condition.video.layout.throttle="{{throttleEnable}}Reduce CPU load by performing check only every{{throttleCount}}milliseconds" AdvSceneSwitcher.condition.video.layout.checkAreaEnable="Perform check only in area" AdvSceneSwitcher.condition.video.layout.checkArea="{{checkAreaEnable}}{{checkArea}}{{selectArea}}" -AdvSceneSwitcher.condition.video.layout.ocrColorPick="Check for text color:{{textColor}}{{selectColor}}" +AdvSceneSwitcher.condition.video.layout.ocrColorPick="Check for text color:{{color}}" AdvSceneSwitcher.condition.video.layout.ocrTextType="Check for text type:{{textType}}" AdvSceneSwitcher.condition.video.layout.ocrBaseDir="Tesseract base directory:{{tesseractBaseDir}}" AdvSceneSwitcher.condition.video.layout.ocrLanguage="Check for language:{{languageCode}}" AdvSceneSwitcher.condition.video.layout.ocrConfig="Config file:{{configFile}}{{openConfigFile}}{{reloadConfig}}{{configFileHint}}" -AdvSceneSwitcher.condition.video.layout.color="Check for color:{{color}}{{selectColor}}" +AdvSceneSwitcher.condition.video.layout.color="Check for color:{{color}}" AdvSceneSwitcher.condition.video.minSize="Minimum size:" AdvSceneSwitcher.condition.video.maxSize="Maximum size:" AdvSceneSwitcher.condition.video.selectArea="Select area" diff --git a/data/locale/fr-FR.ini b/data/locale/fr-FR.ini index 9973533b..7c53f311 100644 --- a/data/locale/fr-FR.ini +++ b/data/locale/fr-FR.ini @@ -257,10 +257,10 @@ AdvSceneSwitcher.condition.video.layout.modelPath="Données du modèle (classifi AdvSceneSwitcher.condition.video.layout.minNeighbor="Nombre minimum de voisins :{{minNeighbors}}" AdvSceneSwitcher.condition.video.layout.throttle="{{throttleEnable}}Réduire la charge CPU en effectuant la vérification uniquement toutes les{{throttleCount}}millisecondes" AdvSceneSwitcher.condition.video.layout.checkAreaEnable="Effectuer la vérification uniquement dans la zone" -AdvSceneSwitcher.condition.video.layout.ocrColorPick="Vérifier la couleur du texte :{{textColor}}{{selectColor}}" +AdvSceneSwitcher.condition.video.layout.ocrColorPick="Vérifier la couleur du texte :{{color}}" AdvSceneSwitcher.condition.video.layout.ocrTextType="Vérifier le type de texte :{{textType}}" AdvSceneSwitcher.condition.video.layout.ocrLanguage="Vérifier la langue :{{languageCode}}" -AdvSceneSwitcher.condition.video.layout.color="Vérifier la couleur :{{color}}{{selectColor}}" +AdvSceneSwitcher.condition.video.layout.color="Vérifier la couleur :{{color}}" AdvSceneSwitcher.condition.video.minSize="Taille minimale :" AdvSceneSwitcher.condition.video.maxSize="Taille maximale :" AdvSceneSwitcher.condition.video.selectArea="Sélectionner la zone" diff --git a/data/locale/ja-JP.ini b/data/locale/ja-JP.ini index f8fa24c0..1aa60f09 100644 --- a/data/locale/ja-JP.ini +++ b/data/locale/ja-JP.ini @@ -414,12 +414,12 @@ AdvSceneSwitcher.condition.video.layout.minNeighbor="最小近傍数:{{minNeighb AdvSceneSwitcher.condition.video.layout.throttle="{{throttleEnable}}:{{throttleCount}}ミリ秒ごとにのみパフォーマンスチェックを実行することでCPU負荷を軽減します" AdvSceneSwitcher.condition.video.layout.checkAreaEnable="エリア内のみチェックを実施" ; AdvSceneSwitcher.condition.video.layout.checkArea="{{checkAreaEnable}}{{checkArea}}{{selectArea}}" -AdvSceneSwitcher.condition.video.layout.ocrColorPick="テキストカラーの確認:{{textColor}}{{selectColor}}" +AdvSceneSwitcher.condition.video.layout.ocrColorPick="テキストカラーの確認:{{color}}" AdvSceneSwitcher.condition.video.layout.ocrTextType="テキストタイプの確認:{{textType}}" AdvSceneSwitcher.condition.video.layout.ocrBaseDir="Tesseractベースディレクトリ:{{tesseractBaseDir}}" AdvSceneSwitcher.condition.video.layout.ocrLanguage="言語の確認:{{languageCode}}" AdvSceneSwitcher.condition.video.layout.ocrConfig="設定ファイル:{{configFile}}{{openConfigFile}}{{reloadConfig}}{{configFileHint}}" -AdvSceneSwitcher.condition.video.layout.color="カラーを確認してください:{{color}}{{selectColor}}" +AdvSceneSwitcher.condition.video.layout.color="カラーを確認してください:{{color}}" AdvSceneSwitcher.condition.video.minSize="最小サイズ:" AdvSceneSwitcher.condition.video.maxSize="最大サイズ:" AdvSceneSwitcher.condition.video.selectArea="範囲指定" diff --git a/data/locale/pt-BR.ini b/data/locale/pt-BR.ini index 21476e55..2fc4f7c9 100644 --- a/data/locale/pt-BR.ini +++ b/data/locale/pt-BR.ini @@ -371,10 +371,10 @@ AdvSceneSwitcher.condition.video.layout.minNeighbor="Vizinhos mínimos:{{minNeig AdvSceneSwitcher.condition.video.layout.throttle="{{throttleEnable}}Reduzir carga de CPU realizando a verificação apenas a cada {{throttleCount}} milissegundos" AdvSceneSwitcher.condition.video.layout.checkAreaEnable="Realizar verificação apenas na área" AdvSceneSwitcher.condition.video.layout.checkArea="{{checkAreaEnable}}{{checkArea}}{{selectArea}}" -AdvSceneSwitcher.condition.video.layout.ocrColorPick="Verificar cor do texto:{{textColor}}{{selectColor}}" +AdvSceneSwitcher.condition.video.layout.ocrColorPick="Verificar cor do texto:{{color}}" AdvSceneSwitcher.condition.video.layout.ocrTextType="Verificar tipo de texto:{{textType}}" AdvSceneSwitcher.condition.video.layout.ocrLanguage="Verificar idioma:{{languageCode}}" -AdvSceneSwitcher.condition.video.layout.color="Verificar cor:{{color}}{{selectColor}}" +AdvSceneSwitcher.condition.video.layout.color="Verificar cor:{{color}}" AdvSceneSwitcher.condition.video.minSize="Tamanho mínimo:" AdvSceneSwitcher.condition.video.maxSize="Tamanho máximo:" AdvSceneSwitcher.condition.video.selectArea="Selecionar área" diff --git a/data/locale/zh-CN.ini b/data/locale/zh-CN.ini index 83fc970c..84a78454 100644 --- a/data/locale/zh-CN.ini +++ b/data/locale/zh-CN.ini @@ -395,10 +395,10 @@ AdvSceneSwitcher.condition.video.layout.minNeighbor="最小区域: {{minNeighbor AdvSceneSwitcher.condition.video.layout.throttle="{{throttleEnable}}每隔{{throttleCount}} 毫秒,才执行一次检查,从而减少 CPU 负载." AdvSceneSwitcher.condition.video.layout.checkAreaEnable="仅在区域内执行检查" AdvSceneSwitcher.condition.video.layout.checkArea="{{checkAreaEnable}}{{checkArea}}{{selectArea}}" -AdvSceneSwitcher.condition.video.layout.ocrColorPick="文本检查颜色:{{textColor}}{{selectColor}}" +AdvSceneSwitcher.condition.video.layout.ocrColorPick="文本检查颜色:{{color}}" AdvSceneSwitcher.condition.video.layout.ocrTextType="文本检查类型:{{textType}}" AdvSceneSwitcher.condition.video.layout.ocrLanguage="语言检查:{{languageCode}}" -AdvSceneSwitcher.condition.video.layout.color="颜色检查:{{color}}{{selectColor}}" +AdvSceneSwitcher.condition.video.layout.color="颜色检查:{{color}}" AdvSceneSwitcher.condition.video.minSize="最小尺寸:" AdvSceneSwitcher.condition.video.maxSize="最大尺寸:" AdvSceneSwitcher.condition.video.selectArea="选择区域" diff --git a/plugins/video/macro-condition-video.cpp b/plugins/video/macro-condition-video.cpp index 1e3ee09b..de2d58c3 100644 --- a/plugins/video/macro-condition-video.cpp +++ b/plugins/video/macro-condition-video.cpp @@ -5,7 +5,6 @@ #include #include #include -#include #include #include #include @@ -409,7 +408,8 @@ bool MacroConditionVideo::CheckOCR() } auto text = RunOCR(ocr, _screenshotData.GetImage(), - _ocrParameters.color, _ocrParameters.colorThreshold); + _ocrParameters.color.GetValue(), + _ocrParameters.colorThreshold); if (!text) { return false; } @@ -425,7 +425,7 @@ bool MacroConditionVideo::CheckOCR() bool MacroConditionVideo::CheckColor() { const bool ret = ContainsPixelsInColorRange( - _screenshotData.GetImage(), _colorParameters.color, + _screenshotData.GetImage(), _colorParameters.color.GetValue(), _colorParameters.colorThreshold, _colorParameters.matchThreshold); @@ -677,9 +677,10 @@ OCREdit::OCREdit(QWidget *parent, PreviewDialog *previewDialog, : QWidget(parent), _matchText(new VariableTextEdit(this)), _regex(new RegexConfigWidget(this)), - _textColor(new QLabel), - _selectColor(new QPushButton(obs_module_text( - "AdvSceneSwitcher.condition.video.selectColor"))), + _colorButton(new VariableColorButton( + this, + obs_module_text( + "AdvSceneSwitcher.condition.video.selectColor"))), _colorThreshold(new SliderSpinBox( 0., 1., obs_module_text( @@ -709,8 +710,9 @@ OCREdit::OCREdit(QWidget *parent, PreviewDialog *previewDialog, _reloadConfig->setToolTip(obs_module_text( "AdvSceneSwitcher.condition.video.ocrConfigReload")); - QWidget::connect(_selectColor, SIGNAL(clicked()), this, - SLOT(SelectColorClicked())); + QWidget::connect(_colorButton, + SIGNAL(ColorVariableChanged(const ColorVariable &)), + this, SLOT(ColorChanged(const ColorVariable &))); QWidget::connect( _colorThreshold, SIGNAL(DoubleValueChanged(const NumberVariable &)), @@ -754,8 +756,7 @@ OCREdit::OCREdit(QWidget *parent, PreviewDialog *previewDialog, "AdvSceneSwitcher.condition.video.ocrConfigHint")); const std::unordered_map widgetPlaceholders = { - {"{{textColor}}", _textColor}, - {"{{selectColor}}", _selectColor}, + {"{{color}}", _colorButton}, {"{{textType}}", _pageSegMode}, {"{{tesseractBaseDir}}", _tesseractBaseDir}, {"{{languageCode}}", _languageCode}, @@ -807,7 +808,7 @@ OCREdit::OCREdit(QWidget *parent, PreviewDialog *previewDialog, _matchText->setPlainText(_entryData->_ocrParameters.text); _regex->SetRegexConfig(_entryData->_ocrParameters.regex); - SetupColorLabel(_entryData->_ocrParameters.color); + _colorButton->SetValue(_entryData->_ocrParameters.color); _colorThreshold->SetDoubleValue( _entryData->_ocrParameters.colorThreshold); _pageSegMode->setCurrentIndex(_pageSegMode->findData( @@ -823,31 +824,10 @@ OCREdit::OCREdit(QWidget *parent, PreviewDialog *previewDialog, _loading = false; } -void OCREdit::SetupColorLabel(const QColor &color) +void OCREdit::ColorChanged(const ColorVariable &value) { - _textColor->setText(color.name()); - _textColor->setPalette(QPalette(color)); - _textColor->setAutoFillBackground(true); -} - -void OCREdit::SelectColorClicked() -{ - if (_loading || !_entryData) { - return; - } - - const QColor color = QColorDialog::getColor( - _entryData->_ocrParameters.color, this, - obs_module_text("AdvSceneSwitcher.condition.video.selectColor"), - QColorDialog::ColorDialogOption()); - - if (!color.isValid()) { - return; - } - - SetupColorLabel(color); - auto lock = LockContext(); - _entryData->_ocrParameters.color = color; + GUARD_LOADING_AND_LOCK(); + _entryData->_ocrParameters.color = value; _previewDialog->OCRParametersChanged(_entryData->_ocrParameters); } @@ -1106,13 +1086,15 @@ ColorEdit::ColorEdit(QWidget *parent, obs_module_text( "AdvSceneSwitcher.condition.video.colorDeviationThresholdDescription"), true)), - _color(new QLabel), - _selectColor(new QPushButton(obs_module_text( - "AdvSceneSwitcher.condition.video.selectColor"))), + _colorButton(new VariableColorButton( + this, + obs_module_text( + "AdvSceneSwitcher.condition.video.selectColor"))), _entryData(data) { - QWidget::connect(_selectColor, SIGNAL(clicked()), this, - SLOT(SelectColorClicked())); + QWidget::connect(_colorButton, + SIGNAL(ColorVariableChanged(const ColorVariable &)), + this, SLOT(ColorChanged(const ColorVariable &))); QWidget::connect( _matchThreshold, SIGNAL(DoubleValueChanged(const NumberVariable &)), @@ -1125,8 +1107,7 @@ ColorEdit::ColorEdit(QWidget *parent, SLOT(ColorThresholdChanged(const NumberVariable &))); std::unordered_map widgetPlaceholders = { - {"{{color}}", _color}, - {"{{selectColor}}", _selectColor}, + {"{{color}}", _colorButton}, }; auto colorLayout = new QHBoxLayout; @@ -1145,15 +1126,14 @@ ColorEdit::ColorEdit(QWidget *parent, _entryData->_colorParameters.matchThreshold); _colorThreshold->SetDoubleValue( _entryData->_colorParameters.colorThreshold); - SetupColorLabel(_entryData->_colorParameters.color); + _colorButton->SetValue(_entryData->_colorParameters.color); _loading = false; } -void ColorEdit::SetupColorLabel(const QColor &color) +void ColorEdit::ColorChanged(const ColorVariable &value) { - _color->setText(color.name()); - _color->setPalette(QPalette(color)); - _color->setAutoFillBackground(true); + GUARD_LOADING_AND_LOCK(); + _entryData->_colorParameters.color = value; } void ColorEdit::MatchThresholdChanged(const DoubleVariable &value) @@ -1168,26 +1148,6 @@ void ColorEdit::ColorThresholdChanged(const DoubleVariable &value) _entryData->_colorParameters.colorThreshold = value; } -void ColorEdit::SelectColorClicked() -{ - if (_loading || !_entryData) { - return; - } - - const QColor color = QColorDialog::getColor( - _entryData->_colorParameters.color, this, - obs_module_text("AdvSceneSwitcher.condition.video.selectColor"), - QColorDialog::ColorDialogOption()); - - if (!color.isValid()) { - return; - } - - SetupColorLabel(color); - auto lock = LockContext(); - _entryData->_colorParameters.color = color; -} - AreaEdit::AreaEdit(QWidget *parent, PreviewDialog *previewDialog, const std::shared_ptr &data) : QWidget(parent), diff --git a/plugins/video/macro-condition-video.hpp b/plugins/video/macro-condition-video.hpp index 31b5b1cb..0fba56b2 100644 --- a/plugins/video/macro-condition-video.hpp +++ b/plugins/video/macro-condition-video.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -143,7 +144,7 @@ public: const std::shared_ptr &); private slots: - void SelectColorClicked(); + void ColorChanged(const ColorVariable &); void ColorThresholdChanged(const NumberVariable &); void MatchTextChanged(); void RegexChanged(const RegexConfig &conf); @@ -154,12 +155,9 @@ private slots: void ConfigFileChanged(const QString &); private: - void SetupColorLabel(const QColor &); - VariableTextEdit *_matchText; RegexConfigWidget *_regex; - QLabel *_textColor; - QPushButton *_selectColor; + VariableColorButton *_colorButton; SliderSpinBox *_colorThreshold; QComboBox *_pageSegMode; FileSelection *_tesseractBaseDir; @@ -212,17 +210,14 @@ public: const std::shared_ptr &); private slots: - void SelectColorClicked(); + void ColorChanged(const ColorVariable &); void MatchThresholdChanged(const NumberVariable &); void ColorThresholdChanged(const NumberVariable &); private: - void SetupColorLabel(const QColor &); - SliderSpinBox *_matchThreshold; SliderSpinBox *_colorThreshold; - QLabel *_color; - QPushButton *_selectColor; + VariableColorButton *_colorButton; std::shared_ptr _entryData; bool _loading = true; diff --git a/plugins/video/parameter-wrappers.cpp b/plugins/video/parameter-wrappers.cpp index 3d988c37..8b2826d4 100644 --- a/plugins/video/parameter-wrappers.cpp +++ b/plugins/video/parameter-wrappers.cpp @@ -273,27 +273,6 @@ OBSWeakSource VideoInput::GetVideo() const return nullptr; } -static void SaveColor(obs_data_t *obj, const char *name, const QColor &color) -{ - auto data = obs_data_create(); - obs_data_set_int(data, "red", color.red()); - obs_data_set_int(data, "green", color.green()); - obs_data_set_int(data, "blue", color.blue()); - obs_data_set_obj(obj, name, data); - obs_data_release(data); -} - -static QColor LoadColor(obs_data_t *obj, const char *name) -{ - QColor color = Qt::black; - auto data = obs_data_get_obj(obj, name); - color.setRed(obs_data_get_int(data, "red")); - color.setGreen(obs_data_get_int(data, "green")); - color.setBlue(obs_data_get_int(data, "blue")); - obs_data_release(data); - return color; -} - OCRParameters::OCRParameters() { Setup(); @@ -344,7 +323,7 @@ bool OCRParameters::Save(obs_data_t *obj) const languageCode.Save(data, "language"); obs_data_set_bool(data, "useConfig", useConfig); obs_data_set_string(data, "configFile", configFile.c_str()); - SaveColor(data, "textColor", color); + color.Save(data, "textColor"); colorThreshold.Save(data, "colorThreshold"); obs_data_set_int(data, "pageSegMode", static_cast(pageSegMode)); obs_data_set_int(data, "version", 3); @@ -387,7 +366,7 @@ bool OCRParameters::Load(obs_data_t *obj) useConfig = obs_data_get_bool(data, "useConfig"); configFile = obs_data_get_string(data, "configFile"); - color = LoadColor(data, "textColor"); + color.Load(data, "textColor"); if (obs_data_has_user_value(data, "version")) { colorThreshold.Load(data, "colorThreshold"); } @@ -516,7 +495,7 @@ void OCRParameters::Setup() bool ColorParameters::Save(obs_data_t *obj) const { auto data = obs_data_create(); - SaveColor(data, "color", color); + color.Save(data, "color"); colorThreshold.Save(data, "colorThreshold"); matchThreshold.Save(data, "matchThreshold"); obs_data_set_obj(obj, "colorData", data); @@ -527,7 +506,7 @@ bool ColorParameters::Save(obs_data_t *obj) const bool ColorParameters::Load(obs_data_t *obj) { auto data = obs_data_get_obj(obj, "colorData"); - color = LoadColor(data, "color"); + color.Load(data, "color"); colorThreshold.Load(data, "colorThreshold"); matchThreshold.Load(data, "matchThreshold"); obs_data_release(data); diff --git a/plugins/video/parameter-wrappers.hpp b/plugins/video/parameter-wrappers.hpp index 60e3ecad..a9500b45 100644 --- a/plugins/video/parameter-wrappers.hpp +++ b/plugins/video/parameter-wrappers.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -112,7 +113,7 @@ public: StringVariable text = obs_module_text("AdvSceneSwitcher.enterText"); RegexConfig regex = RegexConfig::PartialMatchRegexConfig(); - QColor color = Qt::black; + ColorVariable color; DoubleVariable colorThreshold = 0.3; private: @@ -134,7 +135,7 @@ public: bool Save(obs_data_t *obj) const; bool Load(obs_data_t *obj); - QColor color = Qt::black; + ColorVariable color; DoubleVariable colorThreshold = 0.1; DoubleVariable matchThreshold = 0.8; }; diff --git a/plugins/video/preview-dialog.cpp b/plugins/video/preview-dialog.cpp index e3f28f4a..6bd14b69 100644 --- a/plugins/video/preview-dialog.cpp +++ b/plugins/video/preview-dialog.cpp @@ -385,7 +385,8 @@ void PreviewImage::MarkOCRMatch(QImage &screenshot, "AdvSceneSwitcher.condition.video.ocrMatchFail")); return; } - auto text = RunOCR(ocrParams->GetOCR(), screenshot, ocrParams->color, + auto text = RunOCR(ocrParams->GetOCR(), screenshot, + ocrParams->color.GetValue(), ocrParams->colorThreshold); if (!text) {