diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index c7d78e93d..6cf015abf 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -2546,6 +2546,7 @@ AdvSceneSwitcher.selectCurrentScene="Current Scene" AdvSceneSwitcher.selectPreviewScene="Preview Scene" AdvSceneSwitcher.selectAnyScene="Any Scene" AdvSceneSwitcher.currentTransition="Current Transition" +AdvSceneSwitcher.noneTransition="None" AdvSceneSwitcher.anyTransition="Any Transition" AdvSceneSwitcher.selectTransition="--select transition--" AdvSceneSwitcher.selectWindow="--select window--" diff --git a/lib/utils/selection-helpers.cpp b/lib/utils/selection-helpers.cpp index 6001ebbaa..af423cf39 100644 --- a/lib/utils/selection-helpers.cpp +++ b/lib/utils/selection-helpers.cpp @@ -135,7 +135,7 @@ QStringList GetSourceNames() } void PopulateTransitionSelection(QComboBox *sel, bool addCurrent, bool addAny, - bool addSelect) + bool addSelect, bool addNone) { obs_frontend_source_list *transitions = new obs_frontend_source_list(); @@ -168,6 +168,11 @@ void PopulateTransitionSelection(QComboBox *sel, bool addCurrent, bool addAny, addSelect ? 1 : 0, obs_module_text("AdvSceneSwitcher.anyTransition")); } + if (addNone) { + sel->insertItem( + addSelect ? 1 : 0, + obs_module_text("AdvSceneSwitcher.noneTransition")); + } } void PopulateWindowSelection(QComboBox *sel, bool addSelect) diff --git a/lib/utils/selection-helpers.hpp b/lib/utils/selection-helpers.hpp index db9d69880..fb4ea3883 100644 --- a/lib/utils/selection-helpers.hpp +++ b/lib/utils/selection-helpers.hpp @@ -19,7 +19,8 @@ EXPORT QStringList GetSourceNames(); EXPORT void PopulateTransitionSelection(QComboBox *sel, bool addCurrent = true, bool addAny = false, - bool addSelect = true); + bool addSelect = true, + bool addNone = false); EXPORT void PopulateWindowSelection(QComboBox *sel, bool addSelect = true); void PopulateAudioSelection(QComboBox *sel, bool addSelect = true); void PopulateVideoSelection(QComboBox *sel, bool addMainOutput = false, diff --git a/plugins/base/macro-action-scene-visibility.cpp b/plugins/base/macro-action-scene-visibility.cpp index 905309d62..0806f4a25 100644 --- a/plugins/base/macro-action-scene-visibility.cpp +++ b/plugins/base/macro-action-scene-visibility.cpp @@ -160,12 +160,11 @@ static void attachRestoreContext(obs_sceneitem_t *item, static void setSceneItemVisibility(obs_sceneitem_t *item, const bool setTransition, - const OBSWeakSource &transitionWeak, + const TransitionSelection &transitionSel, const bool setDuration, const Duration &duration, MacroActionSceneVisibility::Action action) { - const OBSSourceAutoRelease transition = OBSGetStrongRef(transitionWeak); const bool itemIsVisible = obs_sceneitem_visible(item); const OBSSource currentTransition = @@ -175,6 +174,16 @@ static void setSceneItemVisibility(obs_sceneitem_t *item, OBSSource privateTransitionSource = nullptr; if (setTransition) { + OBSSourceAutoRelease transition; + if (transitionSel.GetType() == + TransitionSelection::Type::CURRENT) { + transition = obs_source_get_ref( + obs_sceneitem_get_transition(item, + !itemIsVisible)); + } else { + transition = + OBSGetStrongRef(transitionSel.GetTransition()); + } privateTransitionSource = SetSceneItemTransition( item, transition, !itemIsVisible); } else { @@ -229,8 +238,7 @@ bool MacroActionSceneVisibility::PerformAction() { auto items = _source.GetSceneItems(_scene); for (const auto &item : items) { - setSceneItemVisibility(item, _updateTransition, - _transition.GetTransition(), + setSceneItemVisibility(item, _updateTransition, _transition, _updateDuration, _duration, _action); } return true; @@ -340,7 +348,7 @@ MacroActionSceneVisibilityEdit::MacroActionSceneVisibilityEdit( }, SceneItemSelectionWidget::NameClashMode::ALL)), _updateTransition(new QCheckBox(this)), - _transitions(new TransitionSelectionWidget(this, false, false)), + _transitions(new TransitionSelectionWidget(this, true, false, true)), _updateDuration(new QCheckBox(this)), _duration(new DurationSelection(this, false)), _durationLayout(new QHBoxLayout), @@ -474,8 +482,11 @@ void MacroActionSceneVisibilityEdit::ActionChanged(int value) void MacroActionSceneVisibilityEdit::SetWidgetVisibility() { + const auto transitionType = _entryData->_transition.GetType(); const bool hideDurationSelection = _entryData->_updateTransition && + transitionType != TransitionSelection::Type::CURRENT && + transitionType != TransitionSelection::Type::NONE && IsFixedLengthTransition( _entryData->_transition.GetTransition()); diff --git a/plugins/base/macro-action-transition.cpp b/plugins/base/macro-action-transition.cpp index 7c796c909..cafcc812a 100644 --- a/plugins/base/macro-action-transition.cpp +++ b/plugins/base/macro-action-transition.cpp @@ -406,15 +406,17 @@ void MacroActionTransitionEdit::SetWidgetVisibility() MacroActionTransition::Type::TBAR; const bool isReleaseTbar = _entryData->_type == MacroActionTransition::Type::RELEASE_TBAR; - _sources->setVisible( - _entryData->_type == MacroActionTransition::Type::SOURCE_HIDE || - _entryData->_type == MacroActionTransition::Type::SOURCE_SHOW); + const bool isSourceTransition = + _entryData->_type == MacroActionTransition::Type::SOURCE_SHOW || + _entryData->_type == MacroActionTransition::Type::SOURCE_HIDE; + _sources->setVisible(isSourceTransition); _scenes->setVisible(_entryData->_type != MacroActionTransition::Type::SCENE && !isTbar && !isReleaseTbar); SetLayoutVisible(_transitionLayout, !isTbar && !isReleaseTbar); SetLayoutVisible(_durationLayout, !isTbar && !isReleaseTbar); SetLayoutVisible(_tbarLayout, isTbar); + _transitions->EnableNoneEntry(isSourceTransition); adjustSize(); } diff --git a/plugins/base/utils/transition-selection.cpp b/plugins/base/utils/transition-selection.cpp index 09792c143..8a33499ef 100644 --- a/plugins/base/utils/transition-selection.cpp +++ b/plugins/base/utils/transition-selection.cpp @@ -48,6 +48,8 @@ OBSWeakSource TransitionSelection::GetTransition() const obs_source_release(source); return weakSource; } + case Type::NONE: + return nullptr; default: break; } @@ -63,6 +65,8 @@ std::string TransitionSelection::ToString() const return obs_module_text("AdvSceneSwitcher.currentTransition"); case Type::ANY: return obs_module_text("AdvSceneSwitcher.anyTransition"); + case Type::NONE: + return obs_module_text("AdvSceneSwitcher.noneTransition"); default: break; } @@ -70,14 +74,16 @@ std::string TransitionSelection::ToString() const } TransitionSelectionWidget::TransitionSelectionWidget(QWidget *parent, - bool current, bool any) + bool current, bool any, + bool none) : FilterComboBox(parent, obs_module_text("AdvSceneSwitcher.selectTransition")), _addCurrent(current), - _addAny(any) + _addAny(any), + _addNone(none) { setDuplicatesEnabled(true); - PopulateTransitionSelection(this, current, any, false); + PopulateTransitionSelection(this, current, any, false, none); QWidget::connect(this, SIGNAL(currentTextChanged(const QString &)), this, SLOT(SelectionChanged(const QString &))); @@ -86,8 +92,9 @@ TransitionSelectionWidget::TransitionSelectionWidget(QWidget *parent, void TransitionSelectionWidget::SetTransition(const TransitionSelection &t) { // Order of entries - // 1. Any transition - // 2. Current transition + // 1. None transition + // 2. Any transition + // 3. Current transition // 4. Transitions switch (t.GetType()) { @@ -102,6 +109,10 @@ void TransitionSelectionWidget::SetTransition(const TransitionSelection &t) setCurrentIndex(findText(QString::fromStdString( obs_module_text("AdvSceneSwitcher.anyTransition")))); break; + case TransitionSelection::Type::NONE: + setCurrentIndex(findText(QString::fromStdString( + obs_module_text("AdvSceneSwitcher.noneTransition")))); + break; default: setCurrentIndex(-1); break; @@ -120,6 +131,17 @@ void TransitionSelectionWidget::EnableAnyEntry(bool enable) Populate(); } +void TransitionSelectionWidget::EnableNoneEntry(bool enable) +{ + if (_addNone == enable) { + return; + } + const auto selection = GetCurrentSelection(); + _addNone = enable; + Populate(); + SetTransition(selection); +} + void TransitionSelectionWidget::showEvent(QShowEvent *event) { FilterComboBox::showEvent(event); @@ -133,7 +155,7 @@ void TransitionSelectionWidget::Populate() { const QSignalBlocker blocker(this); clear(); - PopulateTransitionSelection(this, _addCurrent, _addAny); + PopulateTransitionSelection(this, _addCurrent, _addAny, true, _addNone); } static bool isFirstEntry(const QComboBox *l, QString name, int idx) @@ -163,6 +185,9 @@ TransitionSelection TransitionSelectionWidget::GetCurrentSelection() const if (IsAnyTransitionSelected(text)) { result._type = TransitionSelection::Type::ANY; } + if (IsNoneTransitionSelected(text)) { + result._type = TransitionSelection::Type::NONE; + } } return result; } @@ -187,6 +212,16 @@ bool TransitionSelectionWidget::IsAnyTransitionSelected( return false; } +bool TransitionSelectionWidget::IsNoneTransitionSelected( + const QString &name) const +{ + if (name == QString::fromStdString((obs_module_text( + "AdvSceneSwitcher.noneTransition")))) { + return isFirstEntry(this, name, currentIndex()); + } + return false; +} + void TransitionSelectionWidget::SelectionChanged(const QString &) { emit TransitionChanged(GetCurrentSelection()); diff --git a/plugins/base/utils/transition-selection.hpp b/plugins/base/utils/transition-selection.hpp index f77e319fd..5132c5a0b 100644 --- a/plugins/base/utils/transition-selection.hpp +++ b/plugins/base/utils/transition-selection.hpp @@ -16,6 +16,7 @@ class TransitionSelection { TRANSITION, CURRENT, ANY, + NONE, }; Type GetType() const { return _type; } @@ -33,10 +34,11 @@ class TransitionSelectionWidget : public FilterComboBox { public: TransitionSelectionWidget(QWidget *parent, bool current = true, - bool any = false); + bool any = false, bool none = false); void SetTransition(const TransitionSelection &); void EnableCurrentEntry(bool enable); void EnableAnyEntry(bool enable); + void EnableNoneEntry(bool enable); protected: void showEvent(QShowEvent *event) override; @@ -52,9 +54,11 @@ private slots: TransitionSelection GetCurrentSelection() const; bool IsCurrentTransitionSelected(const QString &name) const; bool IsAnyTransitionSelected(const QString &name) const; + bool IsNoneTransitionSelected(const QString &name) const; bool _addCurrent; bool _addAny; + bool _addNone; }; } // namespace advss