Add variable trim and case change actions

This commit is contained in:
Przemek Pawlas 2024-09-15 16:34:10 +02:00 committed by WarmUpTill
parent 2d3dada30e
commit 57d78a996a
4 changed files with 117 additions and 2 deletions

View File

@ -1040,6 +1040,12 @@ AdvSceneSwitcher.action.variable.type.sceneItemName="Set to scene item name at i
AdvSceneSwitcher.action.variable.type.padValue="Pad current value"
AdvSceneSwitcher.action.variable.type.truncateValue="Truncate current value"
AdvSceneSwitcher.action.variable.type.swapValues="Swap variable values"
AdvSceneSwitcher.action.variable.type.trim="Trim whitespace"
AdvSceneSwitcher.action.variable.type.changeCase="Change case"
AdvSceneSwitcher.action.variable.case.type.lowerCase="lowercase"
AdvSceneSwitcher.action.variable.case.type.upperCase="UPPERCASE"
AdvSceneSwitcher.action.variable.case.type.capitalized="Capitalized"
AdvSceneSwitcher.action.variable.case.type.startCase="Start Case"
AdvSceneSwitcher.action.variable.truncateOrPadDirection.left="Left"
AdvSceneSwitcher.action.variable.truncateOrPadDirection.right="Right"
AdvSceneSwitcher.action.variable.askForValuePromptDefault="Assign value to variable \"%1\":"
@ -1053,7 +1059,7 @@ AdvSceneSwitcher.action.variable.invalidSelection="Invalid selection!"
AdvSceneSwitcher.action.variable.actionNoVariableSupport="Getting variable values from %1 actions is not supported!"
AdvSceneSwitcher.action.variable.conditionNoVariableSupport="Getting variable values from %1 conditions is not supported!"
AdvSceneSwitcher.action.variable.currentSegmentValue="Current value:"
AdvSceneSwitcher.action.variable.entry.other="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}{{mathExpression}}{{envVariableName}}{{scenes}}{{tempVars}}{{tempVarsHelp}}{{sceneItemIndex}}{{direction}}{{stringLength}}{{paddingCharSelection}}"
AdvSceneSwitcher.action.variable.entry.other="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}{{mathExpression}}{{envVariableName}}{{scenes}}{{tempVars}}{{tempVarsHelp}}{{sceneItemIndex}}{{direction}}{{stringLength}}{{paddingCharSelection}}{{caseType}}"
AdvSceneSwitcher.action.variable.entry.pad="{{actions}}of{{variables}}to length{{stringLength}}by adding{{paddingCharSelection}}to the{{direction}}"
AdvSceneSwitcher.action.variable.entry.truncate="{{actions}}of{{variables}}to length{{stringLength}}by removing characters from the{{direction}}"
AdvSceneSwitcher.action.variable.entry.substringIndex="Substring start:{{subStringStart}}Substring size:{{subStringSize}}"

View File

@ -1038,7 +1038,6 @@ AdvSceneSwitcher.action.variable.invalidSelection="Seleção inválida!"
AdvSceneSwitcher.action.variable.actionNoVariableSupport="Obter valores de variáveis das ações %1 não é suportado!"
AdvSceneSwitcher.action.variable.conditionNoVariableSupport="Obter valores de variáveis das condições %1 não é suportado!"
AdvSceneSwitcher.action.variable.currentSegmentValue="Valor atual:"
AdvSceneSwitcher.action.variable.entry.other="{{actions}}{{variables}}{{variables2}}{{strValue}}{{numValue}}{{segmentIndex}}{{mathExpression}}{{envVariableName}}{{scenes}}{{tempVars}}{{tempVarsHelp}}{{sceneItemIndex}}{{direction}}{{stringLength}}{{paddingCharSelection}}"
AdvSceneSwitcher.action.variable.entry.pad="{{actions}}de{{variables}}para comprimento{{stringLength}}adicionando{{paddingCharSelection}}ao{{direction}}"
AdvSceneSwitcher.action.variable.entry.truncate="{{actions}}de{{variables}}para comprimento{{stringLength}}removendo caracteres da{{direction}}"
AdvSceneSwitcher.action.variable.entry.substringIndex="Início da substring:{{subStringStart}}Tamanho da substring:{{subStringSize}}"

View File

@ -60,6 +60,21 @@ const static std::map<MacroActionVariable::Type, std::string> actionTypes = {
"AdvSceneSwitcher.action.variable.type.truncateValue"},
{MacroActionVariable::Type::SWAP_VALUES,
"AdvSceneSwitcher.action.variable.type.swapValues"},
{MacroActionVariable::Type::TRIM,
"AdvSceneSwitcher.action.variable.type.trim"},
{MacroActionVariable::Type::CHANGE_CASE,
"AdvSceneSwitcher.action.variable.type.changeCase"},
};
const static std::map<MacroActionVariable::CaseType, std::string> caseTypes = {
{MacroActionVariable::CaseType::LOWER_CASE,
"AdvSceneSwitcher.action.variable.case.type.lowerCase"},
{MacroActionVariable::CaseType::UPPER_CASE,
"AdvSceneSwitcher.action.variable.case.type.upperCase"},
{MacroActionVariable::CaseType::CAPITALIZED,
"AdvSceneSwitcher.action.variable.case.type.capitalized"},
{MacroActionVariable::CaseType::START_CASE,
"AdvSceneSwitcher.action.variable.case.type.startCase"},
};
static void apppend(Variable &var, const std::string &value)
@ -159,6 +174,43 @@ void MacroActionVariable::HandleMathExpression(Variable *var)
var->SetValue(std::get<double>(result));
}
void MacroActionVariable::HandleCaseChange(Variable *var)
{
auto value = QString::fromStdString(var->Value());
switch (_caseType) {
case CaseType::LOWER_CASE:
var->SetValue(value.toLower().toStdString());
break;
case CaseType::UPPER_CASE:
var->SetValue(value.toUpper().toStdString());
break;
case CaseType::CAPITALIZED: {
if (value.isEmpty()) {
return;
}
value[0] = value[0].toUpper();
var->SetValue(value.toStdString());
break;
}
case CaseType::START_CASE: {
auto partList = value.split(QRegularExpression("\\b"));
for (auto &part : partList) {
if (part.isEmpty()) {
continue;
}
part[0] = part[0].toUpper();
}
var->SetValue(partList.join("").toStdString());
break;
}
}
}
struct GetSceneItemNameHelper {
int curIdx = 0;
int targetIdx = 0;
@ -405,6 +457,15 @@ bool MacroActionVariable::PerformAction()
var2->SetValue(tempValue);
return true;
}
case Type::TRIM: {
var->SetValue(QString::fromStdString(var->Value())
.trimmed()
.toStdString());
return true;
}
case Type::CHANGE_CASE:
HandleCaseChange(var.get());
return true;
}
return true;
@ -441,6 +502,8 @@ bool MacroActionVariable::Save(obs_data_t *obj) const
obs_data_set_int(obj, "direction", static_cast<int>(_direction));
_stringLength.Save(obj, "stringLength");
obs_data_set_int(obj, "paddingChar", _paddingChar);
obs_data_set_int(obj, "caseType", static_cast<int>(_caseType));
return true;
}
@ -479,6 +542,8 @@ bool MacroActionVariable::Load(obs_data_t *obj)
} else {
_paddingChar = ' ';
}
_caseType = static_cast<CaseType>(obs_data_get_int(obj, "caseType"));
return true;
}
@ -597,6 +662,14 @@ static inline void populateTypeSelection(QComboBox *list)
}
}
static inline void populateCaseTypeSelection(QComboBox *list)
{
for (const auto &[type, name] : caseTypes) {
list->addItem(obs_module_text(name.c_str()),
static_cast<int>(type));
}
}
static inline void populateDirectionSelection(QComboBox *list)
{
list->addItems(
@ -649,6 +722,7 @@ MacroActionVariableEdit::MacroActionVariableEdit(
_direction(new QComboBox()),
_stringLength(new VariableSpinBox()),
_paddingCharSelection(new SingleCharSelection()),
_caseType(new FilterComboBox(this)),
_entryLayout(new QHBoxLayout())
{
_numValue->setMinimum(-9999999999);
@ -671,6 +745,7 @@ MacroActionVariableEdit::MacroActionVariableEdit(
_stringLength->setMaximum(999);
populateTypeSelection(_actions);
populateDirectionSelection(_direction);
populateCaseTypeSelection(_caseType);
QWidget::connect(_variables, SIGNAL(SelectionChanged(const QString &)),
this, SLOT(VariableChanged(const QString &)));
@ -735,6 +810,8 @@ MacroActionVariableEdit::MacroActionVariableEdit(
QWidget::connect(_paddingCharSelection,
SIGNAL(CharChanged(const QString &)), this,
SLOT(CharSelectionChanged(const QString &)));
QWidget::connect(_caseType, SIGNAL(currentIndexChanged(int)), this,
SLOT(CaseTypeChanged(int)));
const std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{variables}}", _variables},
@ -762,6 +839,7 @@ MacroActionVariableEdit::MacroActionVariableEdit(
{"{{direction}}", _direction},
{"{{stringLength}}", _stringLength},
{"{{paddingCharSelection}}", _paddingCharSelection},
{"{{caseType}}", _caseType},
};
PlaceWidgets(
obs_module_text("AdvSceneSwitcher.action.variable.entry.other"),
@ -862,6 +940,9 @@ void MacroActionVariableEdit::UpdateEntryData()
_stringLength->SetValue(_entryData->_stringLength);
_paddingCharSelection->setText(
QChar::fromLatin1(_entryData->_paddingChar));
_caseType->setCurrentIndex(
_caseType->findData(static_cast<int>(_entryData->_caseType)));
SetWidgetVisibility();
}
@ -1268,6 +1349,17 @@ void MacroActionVariableEdit::CharSelectionChanged(const QString &character)
}
}
void MacroActionVariableEdit::CaseTypeChanged(int index)
{
if (_loading || !_entryData) {
return;
}
auto lock = LockContext();
_entryData->_caseType = static_cast<MacroActionVariable::CaseType>(
_caseType->itemData(index).toInt());
}
void MacroActionVariableEdit::SetWidgetVisibility()
{
if (!_entryData) {
@ -1290,6 +1382,7 @@ void MacroActionVariableEdit::SetWidgetVisibility()
{"{{direction}}", _direction},
{"{{stringLength}}", _stringLength},
{"{{paddingCharSelection}}", _paddingCharSelection},
{"{{caseType}}", _caseType},
};
const char *layoutString = "";
@ -1414,6 +1507,9 @@ void MacroActionVariableEdit::SetWidgetVisibility()
_entryData->_type == MacroActionVariable::Type::TRUNCATE);
_paddingCharSelection->setVisible(_entryData->_type ==
MacroActionVariable::Type::PAD);
_caseType->setVisible(_entryData->_type ==
MacroActionVariable::Type::CHANGE_CASE);
adjustSize();
updateGeometry();
}

View File

@ -50,6 +50,8 @@ public:
PAD,
TRUNCATE,
SWAP_VALUES,
TRIM,
CHANGE_CASE,
};
Type _type = Type::SET_FIXED_VALUE;
@ -89,12 +91,22 @@ public:
IntVariable _stringLength = 1;
char _paddingChar = '0';
enum class CaseType {
LOWER_CASE,
UPPER_CASE,
CAPITALIZED,
START_CASE,
};
CaseType _caseType = CaseType::LOWER_CASE;
private:
void DecrementCurrentSegmentVariableRef();
void HandleIndexSubString(Variable *);
void HandleRegexSubString(Variable *);
void HandleFindAndReplace(Variable *);
void HandleMathExpression(Variable *);
void HandleCaseChange(Variable *);
void SetToSceneItemName(Variable *);
std::weak_ptr<MacroSegment> _macroSegment;
@ -148,6 +160,7 @@ private slots:
void DirectionChanged(int);
void StringLengthChanged(const NumberVariable<int> &);
void CharSelectionChanged(const QString &);
void CaseTypeChanged(int index);
signals:
void HeaderInfoChanged(const QString &);
@ -192,6 +205,7 @@ private:
QComboBox *_direction;
VariableSpinBox *_stringLength;
SingleCharSelection *_paddingCharSelection;
FilterComboBox *_caseType;
QHBoxLayout *_entryLayout;
std::shared_ptr<MacroActionVariable> _entryData;