diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index f2641368..6da3815e 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -1091,9 +1091,11 @@ AdvSceneSwitcher.action.transition.type.scene="scene transition" AdvSceneSwitcher.action.transition.type.sceneOverride="scene transition override" AdvSceneSwitcher.action.transition.type.sourceShow="source show transition" AdvSceneSwitcher.action.transition.type.sourceHide="source hide transition" +AdvSceneSwitcher.action.transition.type.tbar="T-Bar position" AdvSceneSwitcher.action.transition.entry.line1="Modify{{type}}{{scenes}}{{sources}}" AdvSceneSwitcher.action.transition.entry.line2="{{setTransition}}Set transition type to{{transitions}}" AdvSceneSwitcher.action.transition.entry.line3="{{setDuration}}Set transition duration to{{duration}}seconds" +AdvSceneSwitcher.action.transition.entry.line4="Set T-Bar position to{{tbarPosition}}" AdvSceneSwitcher.action.timer="Timer" AdvSceneSwitcher.action.timer.type.pause="Pause" AdvSceneSwitcher.action.timer.type.continue="Continue" diff --git a/plugins/base/macro-action-transition.cpp b/plugins/base/macro-action-transition.cpp index de8de695..b5515186 100644 --- a/plugins/base/macro-action-transition.cpp +++ b/plugins/base/macro-action-transition.cpp @@ -3,6 +3,7 @@ #include "transition-helpers.hpp" #include +#include namespace advss { @@ -22,6 +23,8 @@ const static std::map actionTypes = { "AdvSceneSwitcher.action.transition.type.sourceShow"}, {MacroActionTransition::Type::SOURCE_HIDE, "AdvSceneSwitcher.action.transition.type.sourceHide"}, + {MacroActionTransition::Type::TBAR, + "AdvSceneSwitcher.action.transition.type.tbar"}, }; void MacroActionTransition::SetSceneTransition() @@ -76,6 +79,17 @@ static void obs_sceneitem_set_transition_duration(obs_sceneitem_t *item, } #endif +void MacroActionTransition::SetTbarPosition() +{ + const double percent = std::clamp(_tbarPosition.GetValue(), 0.0, 100.0); + const int tbarValue = (int)std::round(percent / 100.0 * 1023.0); + obs_frontend_set_tbar_position(tbarValue); + + if (tbarValue == 0 || tbarValue == 1024) { + obs_frontend_release_tbar(); + } +} + void MacroActionTransition::SetSourceTransition(bool show) { #if LIBOBS_API_VER >= MAKE_SEMANTIC_VERSION(27, 0, 0) @@ -110,6 +124,9 @@ bool MacroActionTransition::PerformAction() case Type::SOURCE_HIDE: SetSourceTransition(false); break; + case Type::TBAR: + SetTbarPosition(); + break; } return true; } @@ -135,6 +152,10 @@ void MacroActionTransition::LogAction() const _source.ToString(true) + " on scene " + _scene.ToString(true); break; + case Type::TBAR: + ablog(LOG_INFO, "set T-Bar position to %.2f%%", + _tbarPosition.GetValue()); + return; } if (_setDuration) { ablog(LOG_INFO, "%s duration to %s", msgBegin.c_str(), @@ -156,6 +177,7 @@ bool MacroActionTransition::Save(obs_data_t *obj) const _transition.Save(obj); obs_data_set_bool(obj, "setDuration", _setDuration); obs_data_set_bool(obj, "setType", _setTransitionType); + _tbarPosition.Save(obj, "tbarPosition"); return true; } @@ -169,6 +191,7 @@ bool MacroActionTransition::Load(obs_data_t *obj) _transition.Load(obj); _setDuration = obs_data_get_bool(obj, "setDuration"); _setTransitionType = obs_data_get_bool(obj, "setType"); + _tbarPosition.Load(obj, "tbarPosition"); return true; } @@ -186,6 +209,8 @@ std::string MacroActionTransition::GetShortDesc() const case Type::SOURCE_HIDE: return _scene.ToString() + " - " + _source.ToString() + " - " + _transition.ToString(); + case Type::TBAR: + return std::to_string(_tbarPosition.GetValue()) + "%"; } return ""; } @@ -205,6 +230,7 @@ void MacroActionTransition::ResolveVariablesToFixedValues() _source.ResolveVariables(); _scene.ResolveVariables(); _duration.ResolveVariables(); + _tbarPosition.ResolveVariables(); } static inline void populateActionSelection(QComboBox *list) @@ -236,9 +262,16 @@ MacroActionTransitionEdit::MacroActionTransitionEdit( _setDuration(new QCheckBox), _transitions(new TransitionSelectionWidget(this, false)), _duration(new DurationSelection(this, false)), + _tbarPosition(new VariableDoubleSpinBox), _transitionLayout(new QHBoxLayout), - _durationLayout(new QHBoxLayout) + _durationLayout(new QHBoxLayout), + _tbarLayout(new QHBoxLayout) { + _tbarPosition->setMinimum(0.0); + _tbarPosition->setMaximum(100.0); + _tbarPosition->setDecimals(2); + _tbarPosition->setSuffix("%"); + populateActionSelection(_actions); QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this, @@ -260,6 +293,11 @@ MacroActionTransitionEdit::MacroActionTransitionEdit( SLOT(SetTransitionChanged(int))); QWidget::connect(_setDuration, SIGNAL(stateChanged(int)), this, SLOT(SetDurationChanged(int))); + QWidget::connect( + _tbarPosition, + SIGNAL(NumberVariableChanged(const NumberVariable &)), + this, + SLOT(TbarPositionChanged(const NumberVariable &))); const std::unordered_map widgetPlaceholders = { {"{{type}}", _actions}, @@ -269,6 +307,7 @@ MacroActionTransitionEdit::MacroActionTransitionEdit( {"{{duration}}", _duration}, {"{{setTransition}}", _setTransition}, {"{{setDuration}}", _setDuration}, + {"{{tbarPosition}}", _tbarPosition}, }; auto typeLayout = new QHBoxLayout; @@ -281,10 +320,14 @@ MacroActionTransitionEdit::MacroActionTransitionEdit( PlaceWidgets(obs_module_text( "AdvSceneSwitcher.action.transition.entry.line3"), _durationLayout, widgetPlaceholders); + PlaceWidgets(obs_module_text( + "AdvSceneSwitcher.action.transition.entry.line4"), + _tbarLayout, widgetPlaceholders); auto mainLayout = new QVBoxLayout; mainLayout->addLayout(typeLayout); mainLayout->addLayout(_transitionLayout); mainLayout->addLayout(_durationLayout); + mainLayout->addLayout(_tbarLayout); setLayout(mainLayout); _entryData = entryData; @@ -307,6 +350,7 @@ void MacroActionTransitionEdit::UpdateEntryData() _transitions->SetTransition(_entryData->_transition); _transitions->setEnabled(_entryData->_setTransitionType); _duration->setEnabled(_entryData->_setDuration); + _tbarPosition->SetValue(_entryData->_tbarPosition); SetWidgetVisibility(); } @@ -353,11 +397,17 @@ void MacroActionTransitionEdit::DurationChanged(const Duration &dur) void MacroActionTransitionEdit::SetWidgetVisibility() { + const bool isTbar = _entryData->_type == + MacroActionTransition::Type::TBAR; _sources->setVisible( _entryData->_type == MacroActionTransition::Type::SOURCE_HIDE || _entryData->_type == MacroActionTransition::Type::SOURCE_SHOW); _scenes->setVisible(_entryData->_type != - MacroActionTransition::Type::SCENE); + MacroActionTransition::Type::SCENE && + !isTbar); + SetLayoutVisible(_transitionLayout, !isTbar); + SetLayoutVisible(_durationLayout, !isTbar); + SetLayoutVisible(_tbarLayout, isTbar); adjustSize(); } @@ -381,4 +431,13 @@ void MacroActionTransitionEdit::SetDurationChanged(int state) _duration->setEnabled(state); } +void MacroActionTransitionEdit::TbarPositionChanged( + const NumberVariable &value) +{ + GUARD_LOADING_AND_LOCK(); + _entryData->_tbarPosition = value; + emit HeaderInfoChanged( + QString::fromStdString(_entryData->GetShortDesc())); +} + } // namespace advss diff --git a/plugins/base/macro-action-transition.hpp b/plugins/base/macro-action-transition.hpp index a10b96e6..895b970f 100644 --- a/plugins/base/macro-action-transition.hpp +++ b/plugins/base/macro-action-transition.hpp @@ -4,6 +4,8 @@ #include "transition-selection.hpp" #include "scene-selection.hpp" #include "scene-item-selection.hpp" +#include "variable-number.hpp" +#include "variable-spinbox.hpp" #include #include @@ -28,6 +30,7 @@ public: SCENE_OVERRIDE, SOURCE_SHOW, SOURCE_HIDE, + TBAR, }; Type _type = Type::SCENE; @@ -37,11 +40,13 @@ public: bool _setTransitionType = true; TransitionSelection _transition; Duration _duration; + DoubleVariable _tbarPosition = 0.0; private: void SetSceneTransition(); void SetTransitionOverride(); void SetSourceTransition(bool); + void SetTbarPosition(); static bool _registered; static const std::string id; @@ -72,6 +77,7 @@ private slots: void SetDurationChanged(int state); void TransitionChanged(const TransitionSelection &); void DurationChanged(const Duration &seconds); + void TbarPositionChanged(const NumberVariable &); signals: void HeaderInfoChanged(const QString &); @@ -83,8 +89,10 @@ protected: QCheckBox *_setDuration; TransitionSelectionWidget *_transitions; DurationSelection *_duration; + VariableDoubleSpinBox *_tbarPosition; QHBoxLayout *_transitionLayout; QHBoxLayout *_durationLayout; + QHBoxLayout *_tbarLayout; std::shared_ptr _entryData; private: