Add support for changing T-bar value

This commit is contained in:
WarmUpTill 2026-03-18 19:27:01 +01:00
parent 8e2c466c2d
commit a59a5fc3f7
3 changed files with 71 additions and 2 deletions

View File

@ -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"

View File

@ -3,6 +3,7 @@
#include "transition-helpers.hpp"
#include <obs-frontend-api.h>
#include <algorithm>
namespace advss {
@ -22,6 +23,8 @@ const static std::map<MacroActionTransition::Type, std::string> 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<double> &)),
this,
SLOT(TbarPositionChanged(const NumberVariable<double> &)));
const std::unordered_map<std::string, QWidget *> 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<double> &value)
{
GUARD_LOADING_AND_LOCK();
_entryData->_tbarPosition = value;
emit HeaderInfoChanged(
QString::fromStdString(_entryData->GetShortDesc()));
}
} // namespace advss

View File

@ -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 <QCheckBox>
#include <QHBoxLayout>
@ -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<double> &);
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<MacroActionTransition> _entryData;
private: