diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 95fb626a..9ee5c3b2 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -751,7 +751,8 @@ AdvSceneSwitcher.action.variable.entry="{{actions}}{{variables}}{{variables2}}{{ AdvSceneSwitcher.action.variable.entry.substringIndex="Substring start:{{subStringStart}}Substring size:{{subStringSize}}" AdvSceneSwitcher.action.variable.entry.substringRegex="Assign value of{{regexMatchIdx}}match using regular expression:" AdvSceneSwitcher.action.variable.entry.findAndReplace="{{findStr}}{{replaceStr}}" -AdvSceneSwitcher.action.variable.entry.userInput="{{useCustomPrompt}}Use custom prompt{{inputPrompt}}" +AdvSceneSwitcher.action.variable.entry.userInput.customPrompt="{{useCustomPrompt}}Use custom prompt{{inputPrompt}}" +AdvSceneSwitcher.action.variable.entry.userInput.placeholder="{{useInputPlaceholder}}Fill with placeholder{{inputPlaceholder}}" AdvSceneSwitcher.action.projector="Projector" AdvSceneSwitcher.action.projector.type.source="Source" AdvSceneSwitcher.action.projector.type.scene="Scene" diff --git a/src/macro-core/macro-action-variable.cpp b/src/macro-core/macro-action-variable.cpp index 59430e4e..8b8863cb 100644 --- a/src/macro-core/macro-action-variable.cpp +++ b/src/macro-core/macro-action-variable.cpp @@ -126,6 +126,7 @@ void MacroActionVariable::HandleMathExpression(Variable *var) struct AskForInputParams { QString prompt; + QString placeholder; std::optional result; }; @@ -134,6 +135,7 @@ static void askForInput(void *param) auto parameters = static_cast(param); auto dialog = new NonModalMessageDialog( parameters->prompt, NonModalMessageDialog::Type::INPUT); + dialog->SetInput(parameters->placeholder); parameters->result = dialog->GetInput(); } @@ -213,6 +215,9 @@ bool MacroActionVariable::PerformAction() "AdvSceneSwitcher.action.variable.askForValuePromptDefault")) .arg(QString::fromStdString( var->Name())), + _useCustomPrompt && _useInputPlaceholder + ? QString::fromStdString(_inputPlaceholder) + : "", {}}; obs_queue_task(OBS_TASK_UI, askForInput, ¶ms, true); if (!params.result.has_value()) { @@ -247,6 +252,8 @@ bool MacroActionVariable::Save(obs_data_t *obj) const _mathExpression.Save(obj, "mathExpression"); obs_data_set_bool(obj, "useCustomPrompt", _useCustomPrompt); _inputPrompt.Save(obj, "inputPrompt"); + obs_data_set_bool(obj, "useInputPlaceholder", _useInputPlaceholder); + _inputPlaceholder.Save(obj, "inputPlaceholder"); return true; } @@ -271,6 +278,8 @@ bool MacroActionVariable::Load(obs_data_t *obj) _mathExpression.Load(obj, "mathExpression"); _useCustomPrompt = obs_data_get_bool(obj, "useCustomPrompt"); _inputPrompt.Load(obj, "inputPrompt"); + _useInputPlaceholder = obs_data_get_bool(obj, "useInputPlaceholder"); + _inputPlaceholder.Load(obj, "inputPlaceholder"); return true; } @@ -392,7 +401,10 @@ MacroActionVariableEdit::MacroActionVariableEdit( _mathExpressionResult(new QLabel()), _promptLayout(new QHBoxLayout()), _useCustomPrompt(new QCheckBox()), - _inputPrompt(new VariableLineEdit(this)) + _inputPrompt(new VariableLineEdit(this)), + _placeholderLayout(new QHBoxLayout()), + _useInputPlaceholder(new QCheckBox()), + _inputPlaceholder(new VariableLineEdit(this)) { _numValue->setMinimum(-9999999999); _numValue->setMaximum(9999999999); @@ -447,6 +459,10 @@ MacroActionVariableEdit::MacroActionVariableEdit( SLOT(UseCustomPromptChanged(int))); QWidget::connect(_inputPrompt, SIGNAL(editingFinished()), this, SLOT(InputPromptChanged())); + QWidget::connect(_useInputPlaceholder, SIGNAL(stateChanged(int)), this, + SLOT(UseInputPlaceholderChanged(int))); + QWidget::connect(_inputPlaceholder, SIGNAL(editingFinished()), this, + SLOT(InputPlaceholderChanged())); std::unordered_map widgetPlaceholders = { {"{{variables}}", _variables}, @@ -463,6 +479,8 @@ MacroActionVariableEdit::MacroActionVariableEdit( {"{{mathExpression}}", _mathExpression}, {"{{useCustomPrompt}}", _useCustomPrompt}, {"{{inputPrompt}}", _inputPrompt}, + {"{{useInputPlaceholder}}", _useInputPlaceholder}, + {"{{inputPlaceholder}}", _inputPlaceholder}, }; auto entryLayout = new QHBoxLayout; PlaceWidgets(obs_module_text("AdvSceneSwitcher.action.variable.entry"), @@ -485,8 +503,12 @@ MacroActionVariableEdit::MacroActionVariableEdit( PlaceWidgets( obs_module_text( - "AdvSceneSwitcher.action.variable.entry.userInput"), + "AdvSceneSwitcher.action.variable.entry.userInput.customPrompt"), _promptLayout, widgetPlaceholders); + PlaceWidgets( + obs_module_text( + "AdvSceneSwitcher.action.variable.entry.userInput.placeholder"), + _placeholderLayout, widgetPlaceholders); auto regexConfigLayout = new QHBoxLayout; regexConfigLayout->addWidget(_regex); @@ -505,6 +527,7 @@ MacroActionVariableEdit::MacroActionVariableEdit( layout->addLayout(_findReplaceLayout); layout->addWidget(_mathExpressionResult); layout->addLayout(_promptLayout); + layout->addLayout(_placeholderLayout); setLayout(layout); _entryData = entryData; @@ -547,6 +570,8 @@ void MacroActionVariableEdit::UpdateEntryData() _mathExpression->setText(_entryData->_mathExpression); _useCustomPrompt->setChecked(_entryData->_useCustomPrompt); _inputPrompt->setText(_entryData->_inputPrompt); + _useInputPlaceholder->setChecked(_entryData->_useInputPlaceholder); + _inputPlaceholder->setText(_entryData->_inputPlaceholder); SetWidgetVisibility(); } @@ -818,15 +843,9 @@ void MacroActionVariableEdit::UseCustomPromptChanged(int value) return; } - _inputPrompt->setVisible(value); - if (value) { - RemoveStretchIfPresent(_promptLayout); - } else { - AddStretchIfNecessary(_promptLayout); - } - auto lock = LockContext(); _entryData->_useCustomPrompt = value; + SetWidgetVisibility(); } void MacroActionVariableEdit::InputPromptChanged() @@ -839,6 +858,27 @@ void MacroActionVariableEdit::InputPromptChanged() _entryData->_inputPrompt = _inputPrompt->text().toStdString(); } +void MacroActionVariableEdit::UseInputPlaceholderChanged(int value) +{ + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_useInputPlaceholder = value; + SetWidgetVisibility(); +} + +void MacroActionVariableEdit::InputPlaceholderChanged() +{ + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_inputPlaceholder = _inputPlaceholder->text().toStdString(); +} + void MacroActionVariableEdit::SetWidgetVisibility() { if (!_entryData) { @@ -887,7 +927,30 @@ void MacroActionVariableEdit::SetWidgetVisibility() SetLayoutVisible(_promptLayout, _entryData->_type == MacroActionVariable::Type::USER_INPUT); - _inputPrompt->setVisible(_entryData->_useCustomPrompt); + _inputPrompt->setVisible( + _entryData->_type == MacroActionVariable::Type::USER_INPUT && + _entryData->_useCustomPrompt); + if (_entryData->_useCustomPrompt) { + RemoveStretchIfPresent(_promptLayout); + } else { + AddStretchIfNecessary(_promptLayout); + } + SetLayoutVisible( + _placeholderLayout, + _entryData->_type == MacroActionVariable::Type::USER_INPUT && + _entryData->_useCustomPrompt); + _useInputPlaceholder->setVisible( + _entryData->_type == MacroActionVariable::Type::USER_INPUT && + _entryData->_useCustomPrompt); + _inputPlaceholder->setVisible( + _entryData->_type == MacroActionVariable::Type::USER_INPUT && + _entryData->_useCustomPrompt && + _entryData->_useInputPlaceholder); + if (_entryData->_useInputPlaceholder) { + RemoveStretchIfPresent(_placeholderLayout); + } else { + AddStretchIfNecessary(_placeholderLayout); + } adjustSize(); updateGeometry(); } diff --git a/src/macro-core/macro-action-variable.hpp b/src/macro-core/macro-action-variable.hpp index 0f66332b..56a65142 100644 --- a/src/macro-core/macro-action-variable.hpp +++ b/src/macro-core/macro-action-variable.hpp @@ -58,6 +58,9 @@ public: bool _useCustomPrompt = false; StringVariable _inputPrompt = obs_module_text( "AdvSceneSwitcher.action.variable.askForValuePrompt"); + bool _useInputPlaceholder = false; + StringVariable _inputPlaceholder = + obs_module_text("AdvSceneSwitcher.enterText"); private: void DecrementCurrentSegmentVariableRef(); @@ -107,11 +110,16 @@ private slots: void MathExpressionChanged(); void UseCustomPromptChanged(int); void InputPromptChanged(); + void UseInputPlaceholderChanged(int); + void InputPlaceholderChanged(); signals: void HeaderInfoChanged(const QString &); -protected: +private: + void SetWidgetVisibility(); + void SetSegmentValueError(const QString &); + VariableSelection *_variables; VariableSelection *_variables2; QComboBox *_actions; @@ -136,12 +144,11 @@ protected: QHBoxLayout *_promptLayout; QCheckBox *_useCustomPrompt; VariableLineEdit *_inputPrompt; + QHBoxLayout *_placeholderLayout; + QCheckBox *_useInputPlaceholder; + VariableLineEdit *_inputPlaceholder; + std::shared_ptr _entryData; - -private: - void SetWidgetVisibility(); - void SetSegmentValueError(const QString &); - QTimer _timer; bool _loading = true; }; diff --git a/src/utils/non-modal-dialog.cpp b/src/utils/non-modal-dialog.cpp index 2dda32c8..908860b3 100644 --- a/src/utils/non-modal-dialog.cpp +++ b/src/utils/non-modal-dialog.cpp @@ -75,7 +75,7 @@ std::optional NonModalMessageDialog::GetInput() show(); // Trigger resize - _inputEdit->setPlainText(""); + _inputEdit->setPlainText(_inputEdit->toPlainText()); exec(); this->deleteLater(); @@ -85,6 +85,12 @@ std::optional NonModalMessageDialog::GetInput() return {}; } +void NonModalMessageDialog::SetInput(const QString &input) +{ + assert(_type == Type::INPUT); + _inputEdit->setPlainText(input); +} + void NonModalMessageDialog::YesClicked() { _answer = QMessageBox::Yes; diff --git a/src/utils/non-modal-dialog.hpp b/src/utils/non-modal-dialog.hpp index 3af4605b..d4684e98 100644 --- a/src/utils/non-modal-dialog.hpp +++ b/src/utils/non-modal-dialog.hpp @@ -19,7 +19,8 @@ public: NonModalMessageDialog(const QString &message, bool question); QMessageBox::StandardButton ShowMessage(); std::optional GetInput(); - Type GetType() { return _type; } + Type GetType() const { return _type; } + void SetInput(const QString &); private slots: void YesClicked();