diff --git a/lib/macro/macro-action-variable.cpp b/lib/macro/macro-action-variable.cpp index 2b770b5c2..f8ae03def 100644 --- a/lib/macro/macro-action-variable.cpp +++ b/lib/macro/macro-action-variable.cpp @@ -105,16 +105,20 @@ MacroActionVariable::~MacroActionVariable() void MacroActionVariable::HandleIndexSubString(Variable *var) { const auto curValue = var->Value(); + const auto subStringSize = _subStringSize.GetValue(); + const auto subStringStart = _subStringStart.GetValue() - 1; + try { - if (_subStringSize == 0) { - var->SetValue(curValue.substr(_subStringStart)); + if (subStringSize == 0) { + var->SetValue(curValue.substr(subStringStart)); return; } - var->SetValue(curValue.substr(_subStringStart, _subStringSize)); + + var->SetValue(curValue.substr(subStringStart, subStringSize)); } catch (const std::out_of_range &) { vblog(LOG_WARNING, "invalid start index \"%d\" selected for substring of \"%s\" of variable \"%s\"", - _subStringStart, curValue.c_str(), var->Name().c_str()); + subStringStart, curValue.c_str(), var->Name().c_str()); } } @@ -127,7 +131,8 @@ void MacroActionVariable::HandleRegexSubString(Variable *var) } auto it = regex.globalMatch(QString::fromStdString(curValue)); - for (int idx = 0; idx < _regexMatchIdx; idx++) { + const auto regexMatchIndex = _regexMatchIdx.GetValue() - 1; + for (int idx = 0; idx < regexMatchIndex; idx++) { if (!it.hasNext()) { return; } @@ -324,10 +329,10 @@ bool MacroActionVariable::PerformAction() break; } case Type::INCREMENT: - modifyNumValue(*var, _numValue, true); + modifyNumValue(*var, _numValue.GetValue(), true); break; case Type::DECREMENT: - modifyNumValue(*var, _numValue, false); + modifyNumValue(*var, _numValue.GetValue(), false); break; case Type::SET_CONDITION_VALUE: case Type::SET_ACTION_VALUE: { @@ -473,13 +478,13 @@ bool MacroActionVariable::Save(obs_data_t *obj) const obs_data_set_string(obj, "variable2Name", GetWeakVariableName(_variable2).c_str()); _strValue.Save(obj, "strValue"); - obs_data_set_double(obj, "numValue", _numValue); + _numValue.Save(obj, "numValue"); obs_data_set_int(obj, "condition", static_cast(_type)); obs_data_set_int(obj, "segmentIdx", GetSegmentIndexValue()); - obs_data_set_int(obj, "subStringStart", _subStringStart); - obs_data_set_int(obj, "subStringSize", _subStringSize); + _subStringStart.Save(obj, "subStringStart"); + _subStringSize.Save(obj, "subStringSize"); obs_data_set_string(obj, "regexPattern", _regexPattern.c_str()); - obs_data_set_int(obj, "regexMatchIdx", _regexMatchIdx); + _regexMatchIdx.Save(obj, "regexMatchIdx"); _findRegex.Save(obj, "findRegex"); _findStr.Save(obj, "findStr"); _replaceStr.Save(obj, "replaceStr"); @@ -498,6 +503,8 @@ bool MacroActionVariable::Save(obs_data_t *obj) const obs_data_set_int(obj, "paddingChar", _paddingChar); obs_data_set_int(obj, "caseType", static_cast(_caseType)); + obs_data_set_int(obj, "version", 1); + return true; } @@ -509,14 +516,10 @@ bool MacroActionVariable::Load(obs_data_t *obj) _variable2 = GetWeakVariableByName( obs_data_get_string(obj, "variable2Name")); _strValue.Load(obj, "strValue"); - _numValue = obs_data_get_double(obj, "numValue"); _type = static_cast(obs_data_get_int(obj, "condition")); _segmentIdxLoadValue = obs_data_get_int(obj, "segmentIdx"); - _subStringStart = obs_data_get_int(obj, "subStringStart"); - _subStringSize = obs_data_get_int(obj, "subStringSize"); _subStringRegex.Load(obj); _regexPattern = obs_data_get_string(obj, "regexPattern"); - _regexMatchIdx = obs_data_get_int(obj, "regexMatchIdx"); _findRegex.Load(obj, "findRegex"); _findStr.Load(obj, "findStr"); _replaceStr.Load(obj, "replaceStr"); @@ -538,6 +541,20 @@ bool MacroActionVariable::Load(obs_data_t *obj) } _caseType = static_cast(obs_data_get_int(obj, "caseType")); + // Convert old data format + // TODO: Remove in future version + if (!obs_data_has_user_value(obj, "version")) { + _numValue = obs_data_get_double(obj, "numValue"); + _subStringStart = obs_data_get_int(obj, "subStringStart") + 1; + _subStringSize = obs_data_get_int(obj, "subStringSize"); + _regexMatchIdx = obs_data_get_int(obj, "regexMatchIdx") + 1; + } else { + _numValue.Load(obj, "numValue"); + _subStringStart.Load(obj, "subStringStart"); + _subStringSize.Load(obj, "subStringSize"); + _regexMatchIdx.Load(obj, "regexMatchIdx"); + } + return true; } @@ -681,7 +698,7 @@ MacroActionVariableEdit::MacroActionVariableEdit( _variables2(new VariableSelection(this)), _actions(new FilterComboBox(this)), _strValue(new VariableTextEdit(this, 5, 1, 1)), - _numValue(new QDoubleSpinBox()), + _numValue(new VariableDoubleSpinBox(this)), _segmentIdx(new MacroSegmentSelection( this, MacroSegmentSelection::Type::CONDITION, false)), _segmentValueStatus(new QLabel()), @@ -689,11 +706,11 @@ MacroActionVariableEdit::MacroActionVariableEdit( _substringLayout(new QVBoxLayout()), _subStringIndexEntryLayout(new QHBoxLayout()), _subStringRegexEntryLayout(new QHBoxLayout()), - _subStringStart(new QSpinBox()), - _subStringSize(new QSpinBox()), + _subStringStart(new VariableSpinBox(this)), + _subStringSize(new VariableSpinBox(this)), _substringRegex(new RegexConfigWidget(parent)), _regexPattern(new ResizingPlainTextEdit(this, 10, 1, 1)), - _regexMatchIdx(new QSpinBox()), + _regexMatchIdx(new VariableSpinBox(this)), _findReplaceLayout(new QHBoxLayout()), _findRegex(new RegexConfigWidget()), _findStr(new VariableTextEdit(this, 10, 1, 1)), @@ -712,9 +729,9 @@ MacroActionVariableEdit::MacroActionVariableEdit( _tempVars(new TempVariableSelection(this)), _tempVarsHelp(new HelpIcon(obs_module_text( "AdvSceneSwitcher.action.variable.type.setToTempvar.help"))), - _sceneItemIndex(new VariableSpinBox()), + _sceneItemIndex(new VariableSpinBox(this)), _direction(new QComboBox()), - _stringLength(new VariableSpinBox()), + _stringLength(new VariableSpinBox(this)), _paddingCharSelection(new SingleCharSelection()), _caseType(new FilterComboBox(this)), _entryLayout(new QHBoxLayout()) @@ -751,24 +768,32 @@ MacroActionVariableEdit::MacroActionVariableEdit( SLOT(ActionChanged(int))); QWidget::connect(_strValue, SIGNAL(textChanged()), this, SLOT(StrValueChanged())); - QWidget::connect(_numValue, SIGNAL(valueChanged(double)), this, - SLOT(NumValueChanged(double))); + QWidget::connect( + _numValue, + SIGNAL(NumberVariableChanged(const NumberVariable &)), + this, SLOT(NumValueChanged(const NumberVariable &))); QWidget::connect(_segmentIdx, SIGNAL(SelectionChanged(const IntVariable &)), this, SLOT(SegmentIndexChanged(const IntVariable &))); QWidget::connect(window(), SIGNAL(MacroSegmentOrderChanged()), this, SLOT(MacroSegmentOrderChanged())); - QWidget::connect(_subStringStart, SIGNAL(valueChanged(int)), this, - SLOT(SubStringStartChanged(int))); - QWidget::connect(_subStringSize, SIGNAL(valueChanged(int)), this, - SLOT(SubStringSizeChanged(int))); + QWidget::connect( + _subStringStart, + SIGNAL(NumberVariableChanged(const NumberVariable &)), + this, SLOT(SubStringStartChanged(const NumberVariable &))); + QWidget::connect( + _subStringSize, + SIGNAL(NumberVariableChanged(const NumberVariable &)), + this, SLOT(SubStringSizeChanged(const NumberVariable &))); QWidget::connect(_substringRegex, SIGNAL(RegexConfigChanged(const RegexConfig &)), this, SLOT(SubStringRegexChanged(const RegexConfig &))); QWidget::connect(_regexPattern, SIGNAL(textChanged()), this, SLOT(RegexPatternChanged())); - QWidget::connect(_regexMatchIdx, SIGNAL(valueChanged(int)), this, - SLOT(RegexMatchIdxChanged(int))); + QWidget::connect( + _regexMatchIdx, + SIGNAL(NumberVariableChanged(const NumberVariable &)), + this, SLOT(RegexMatchIdxChanged(const NumberVariable &))); QWidget::connect(_findRegex, SIGNAL(RegexConfigChanged(const RegexConfig &)), this, SLOT(FindRegexChanged(const RegexConfig &))); @@ -906,7 +931,7 @@ void MacroActionVariableEdit::UpdateEntryData() _actions->setCurrentIndex( _actions->findData(static_cast(_entryData->_type))); _strValue->setPlainText(_entryData->_strValue); - _numValue->setValue(_entryData->_numValue); + _numValue->SetValue(_entryData->_numValue); _segmentIdx->SetValue(_entryData->GetSegmentIndexValue() + 1); _segmentIdx->SetMacro(_entryData->GetMacro()); _segmentIdx->SetType( @@ -914,13 +939,13 @@ void MacroActionVariableEdit::UpdateEntryData() MacroActionVariable::Type::SET_CONDITION_VALUE ? MacroSegmentSelection::Type::CONDITION : MacroSegmentSelection::Type::ACTION); - _subStringStart->setValue(_entryData->_subStringStart + 1); - _subStringSize->setValue(_entryData->_subStringSize); + _subStringStart->SetValue(_entryData->_subStringStart); + _subStringSize->SetValue(_entryData->_subStringSize); _substringRegex->SetRegexConfig(_entryData->_subStringRegex); _findRegex->SetRegexConfig(_entryData->_findRegex); _regexPattern->setPlainText( QString::fromStdString(_entryData->_regexPattern)); - _regexMatchIdx->setValue(_entryData->_regexMatchIdx + 1); + _regexMatchIdx->SetValue(_entryData->_regexMatchIdx); _findStr->setPlainText(_entryData->_findStr); _replaceStr->setPlainText(_entryData->_replaceStr); _mathExpression->setText(_entryData->_mathExpression); @@ -995,14 +1020,15 @@ void MacroActionVariableEdit::StrValueChanged() updateGeometry(); } -void MacroActionVariableEdit::NumValueChanged(double val) +void MacroActionVariableEdit::NumValueChanged( + const NumberVariable &value) { if (_loading || !_entryData) { return; } auto lock = LockContext(); - _entryData->_numValue = val; + _entryData->_numValue = value; } void MacroActionVariableEdit::SegmentIndexChanged(const IntVariable &val) @@ -1113,24 +1139,26 @@ void MacroActionVariableEdit::MacroSegmentOrderChanged() _segmentIdx->SetValue(_entryData->GetSegmentIndexValue() + 1); } -void MacroActionVariableEdit::SubStringStartChanged(int val) +void MacroActionVariableEdit::SubStringStartChanged( + const NumberVariable &start) { if (_loading || !_entryData) { return; } auto lock = LockContext(); - _entryData->_subStringStart = val - 1; + _entryData->_subStringStart = start; } -void MacroActionVariableEdit::SubStringSizeChanged(int val) +void MacroActionVariableEdit::SubStringSizeChanged( + const NumberVariable &size) { if (_loading || !_entryData) { return; } auto lock = LockContext(); - _entryData->_subStringSize = val; + _entryData->_subStringSize = size; } void MacroActionVariableEdit::SubStringRegexChanged(const RegexConfig &conf) @@ -1157,14 +1185,15 @@ void MacroActionVariableEdit::RegexPatternChanged() updateGeometry(); } -void MacroActionVariableEdit::RegexMatchIdxChanged(int val) +void MacroActionVariableEdit::RegexMatchIdxChanged( + const NumberVariable &index) { if (_loading || !_entryData) { return; } auto lock = LockContext(); - _entryData->_regexMatchIdx = val - 1; + _entryData->_regexMatchIdx = index; } void MacroActionVariableEdit::FindStrValueChanged() diff --git a/lib/macro/macro-action-variable.hpp b/lib/macro/macro-action-variable.hpp index fe60dae62..1aeb3bc2f 100644 --- a/lib/macro/macro-action-variable.hpp +++ b/lib/macro/macro-action-variable.hpp @@ -58,12 +58,12 @@ class MacroActionVariable : public MacroAction { std::weak_ptr _variable; std::weak_ptr _variable2; StringVariable _strValue = ""; - double _numValue = 0; - int _subStringStart = 0; - int _subStringSize = 0; + DoubleVariable _numValue = 0; + IntVariable _subStringStart = 0; + IntVariable _subStringSize = 0; RegexConfig _subStringRegex = RegexConfig::PartialMatchRegexConfig(); std::string _regexPattern = ".*"; - int _regexMatchIdx = 0; + IntVariable _regexMatchIdx = 0; RegexConfig _findRegex; StringVariable _findStr = obs_module_text( "AdvSceneSwitcher.action.variable.findAndReplace.find"); @@ -136,15 +136,15 @@ private slots: void Variable2Changed(const QString &); void ActionChanged(int); void StrValueChanged(); - void NumValueChanged(double); + void NumValueChanged(const NumberVariable &value); void SegmentIndexChanged(const IntVariable &); void UpdateSegmentVariableValue(); void MacroSegmentOrderChanged(); - void SubStringStartChanged(int val); - void SubStringSizeChanged(int val); + void SubStringStartChanged(const NumberVariable &start); + void SubStringSizeChanged(const NumberVariable &size); void SubStringRegexChanged(const RegexConfig &conf); void RegexPatternChanged(); - void RegexMatchIdxChanged(int val); + void RegexMatchIdxChanged(const NumberVariable &index); void FindStrValueChanged(); void FindRegexChanged(const RegexConfig &conf); void ReplaceStrValueChanged(); @@ -173,18 +173,18 @@ private slots: VariableSelection *_variables2; FilterComboBox *_actions; VariableTextEdit *_strValue; - QDoubleSpinBox *_numValue; + VariableDoubleSpinBox *_numValue; MacroSegmentSelection *_segmentIdx; QLabel *_segmentValueStatus; ResizingPlainTextEdit *_segmentValue; QVBoxLayout *_substringLayout; QHBoxLayout *_subStringIndexEntryLayout; QHBoxLayout *_subStringRegexEntryLayout; - QSpinBox *_subStringStart; - QSpinBox *_subStringSize; + VariableSpinBox *_subStringStart; + VariableSpinBox *_subStringSize; RegexConfigWidget *_substringRegex; ResizingPlainTextEdit *_regexPattern; - QSpinBox *_regexMatchIdx; + VariableSpinBox *_regexMatchIdx; QHBoxLayout *_findReplaceLayout; RegexConfigWidget *_findRegex; VariableTextEdit *_findStr;