From 33635d6991b9c6b1900497b5cca03dbba658409e Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sat, 4 Nov 2023 15:55:21 +0100 Subject: [PATCH] Add action to enable extraction of values from json string --- data/locale/en-US.ini | 1 + src/macro-core/macro-action-variable.cpp | 17 ++++++++++++++--- src/macro-core/macro-action-variable.hpp | 3 ++- src/utils/utility.cpp | 19 +++++++++++++++++++ src/utils/utility.hpp | 3 +++ 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 2b3c7d01..bce45fd6 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -802,6 +802,7 @@ AdvSceneSwitcher.action.variable.type.askForValue="Get user input" AdvSceneSwitcher.action.variable.type.environmentVariable="Set to environment variable value" AdvSceneSwitcher.action.variable.type.sceneItemCount="Set to scene item count of scene" AdvSceneSwitcher.action.variable.type.stringLength="Set to length of string" +AdvSceneSwitcher.action.variable.type.extractJson="Extract json field with name" AdvSceneSwitcher.action.variable.askForValuePromptDefault="Assign value to variable \"%1\":" AdvSceneSwitcher.action.variable.askForValuePrompt="Assign value to variable:" AdvSceneSwitcher.action.variable.mathExpression.example="( 1 + 2 * 3 ) / 4" diff --git a/src/macro-core/macro-action-variable.cpp b/src/macro-core/macro-action-variable.cpp index 4feacf83..bda508fe 100644 --- a/src/macro-core/macro-action-variable.cpp +++ b/src/macro-core/macro-action-variable.cpp @@ -47,6 +47,8 @@ const static std::map actionTypes = { "AdvSceneSwitcher.action.variable.type.sceneItemCount"}, {MacroActionVariable::Type::STRING_LENGTH, "AdvSceneSwitcher.action.variable.type.stringLength"}, + {MacroActionVariable::Type::EXTRACT_JSON, + "AdvSceneSwitcher.action.variable.type.extractJson"}, }; static void apppend(Variable &var, const std::string &value) @@ -244,6 +246,14 @@ bool MacroActionVariable::PerformAction() var->SetValue(std::string(_strValue).length()); return true; } + case Type::EXTRACT_JSON: { + auto value = GetJsonField(var->Value(), _strValue); + if (!value.has_value()) { + return true; + } + var->SetValue(*value); + return true; + } } return true; @@ -402,7 +412,7 @@ MacroActionVariableEdit::MacroActionVariableEdit( : QWidget(parent), _variables(new VariableSelection(this)), _variables2(new VariableSelection(this)), - _actions(new QComboBox()), + _actions(new FilterComboBox(this)), _strValue(new VariableTextEdit(this, 5, 1, 1)), _numValue(new QDoubleSpinBox()), _segmentIdx(new MacroSegmentSelection( @@ -631,7 +641,7 @@ void MacroActionVariableEdit::Variable2Changed(const QString &text) void MacroActionVariableEdit::ActionChanged(int idx) { - if (_loading || !_entryData) { + if (_loading || !_entryData || idx == -1) { return; } @@ -952,7 +962,8 @@ void MacroActionVariableEdit::SetWidgetVisibility() _entryData->_type == MacroActionVariable::Type::SET_FIXED_VALUE || _entryData->_type == MacroActionVariable::Type::APPEND || - _entryData->_type == MacroActionVariable::Type::STRING_LENGTH); + _entryData->_type == MacroActionVariable::Type::STRING_LENGTH || + _entryData->_type == MacroActionVariable::Type::EXTRACT_JSON); _numValue->setVisible( _entryData->_type == MacroActionVariable::Type::INCREMENT || _entryData->_type == MacroActionVariable::Type::DECREMENT); diff --git a/src/macro-core/macro-action-variable.hpp b/src/macro-core/macro-action-variable.hpp index ab5bada0..297c2de3 100644 --- a/src/macro-core/macro-action-variable.hpp +++ b/src/macro-core/macro-action-variable.hpp @@ -42,6 +42,7 @@ public: ENV_VARIABLE, SCENE_ITEM_COUNT, STRING_LENGTH, + EXTRACT_JSON, }; Type _type = Type::SET_FIXED_VALUE; @@ -135,7 +136,7 @@ private: VariableSelection *_variables; VariableSelection *_variables2; - QComboBox *_actions; + FilterComboBox *_actions; VariableTextEdit *_strValue; QDoubleSpinBox *_numValue; MacroSegmentSelection *_segmentIdx; diff --git a/src/utils/utility.cpp b/src/utils/utility.cpp index 934e583e..ae8cff58 100644 --- a/src/utils/utility.cpp +++ b/src/utils/utility.cpp @@ -31,6 +31,7 @@ #include #include #include +#include namespace advss { @@ -701,6 +702,24 @@ void LoadSplitterPos(QList &sizes, obs_data_t *obj, const std::string name) obs_data_array_release(array); } +std::optional GetJsonField(const std::string &jsonStr, + const std::string &fieldToExtract) +{ + try { + nlohmann::json json = nlohmann::json::parse(jsonStr); + auto it = json.find(fieldToExtract); + if (it == json.end()) { + return {}; + } + if (it->is_string()) { + return it->get(); + } + return it->dump(); + } catch (const nlohmann::json::exception &) { + return {}; + } + return {}; +} QStringList GetSourceNames() { auto sourceEnum = [](void *param, obs_source_t *source) -> bool /* -- */ diff --git a/src/utils/utility.hpp b/src/utils/utility.hpp index 1ac319a3..e3a2fe61 100644 --- a/src/utils/utility.hpp +++ b/src/utils/utility.hpp @@ -11,6 +11,7 @@ #include #include #include +#include namespace advss { @@ -134,6 +135,8 @@ void SaveSplitterPos(const QList &sizes, obs_data_t *obj, const std::string name); void LoadSplitterPos(QList &sizes, obs_data_t *obj, const std::string name); +std::optional GetJsonField(const std::string &json, + const std::string &id); /* Legacy helpers */