From d397f5e4067e4c042d5ff8cc3828d8b5f1911d25 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sun, 19 Sep 2021 13:52:02 +0200 Subject: [PATCH] Add transition action --- CMakeLists.txt | 2 + data/locale/en-US.ini | 3 + src/headers/macro-action-transition.hpp | 67 ++++++++++ src/macro-action-transition.cpp | 169 ++++++++++++++++++++++++ 4 files changed, 241 insertions(+) create mode 100644 src/headers/macro-action-transition.hpp create mode 100644 src/macro-action-transition.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index afba6f6d..3a7a9320 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -214,6 +214,7 @@ set(advanced-scene-switcher_HEADERS src/headers/macro-action-scene-visibility.hpp src/headers/macro-action-source.hpp src/headers/macro-action-streaming.hpp + src/headers/macro-action-transition.hpp src/headers/macro-action-virtual-cam.hpp src/headers/macro-action-wait.hpp src/headers/macro-condition-edit.hpp @@ -299,6 +300,7 @@ set(advanced-scene-switcher_SOURCES src/macro-action-scene-visibility.cpp src/macro-action-source.cpp src/macro-action-streaming.cpp + src/macro-action-transition.cpp src/macro-action-virtual-cam.cpp src/macro-action-wait.cpp src/macro-condition-edit.cpp diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index fcd11713..adf486fe 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -302,6 +302,9 @@ AdvSceneSwitcher.action.previewScene="Switch preview scene" AdvSceneSwitcher.action.previewScene.entry="Switch preview scene to {{scenes}}" AdvSceneSwitcher.action.SceneSwap="Swap scene (Studio mode)" AdvSceneSwitcher.action.SceneSwap.entry="Swap preview and program scene in studio mode" +AdvSceneSwitcher.action.transition="Transition" +AdvSceneSwitcher.action.transition.entry.line1="{{setType}}Set transition type to {{transitions}}" +AdvSceneSwitcher.action.transition.entry.line2="{{setDuration}}Set transition duration to {{duration}}seconds" ; Transition Tab AdvSceneSwitcher.transitionTab.title="Transition" diff --git a/src/headers/macro-action-transition.hpp b/src/headers/macro-action-transition.hpp new file mode 100644 index 00000000..95d49218 --- /dev/null +++ b/src/headers/macro-action-transition.hpp @@ -0,0 +1,67 @@ +#pragma once +#include "macro-action-edit.hpp" +#include "duration-control.hpp" + +#include +#include + +class MacroActionTransition : public MacroAction { +public: + bool PerformAction(); + void LogAction(); + bool Save(obs_data_t *obj); + bool Load(obs_data_t *obj); + std::string GetShortDesc(); + std::string GetId() { return id; }; + static std::shared_ptr Create() + { + return std::make_shared(); + } + + bool _setDuration = true; + bool _setType = true; + OBSWeakSource _transition; + Duration _duration; + +private: + static bool _registered; + static const std::string id; +}; + +class MacroActionTransitionEdit : public QWidget { + Q_OBJECT + +public: + MacroActionTransitionEdit( + QWidget *parent, + std::shared_ptr entryData = nullptr); + void UpdateEntryData(); + static QWidget *Create(QWidget *parent, + std::shared_ptr action) + { + return new MacroActionTransitionEdit( + parent, + std::dynamic_pointer_cast( + action)); + } + +private slots: + void SetTypeChanged(int state); + void SetDurationChanged(int state); + void TransitionChanged(const QString &text); + void DurationChanged(double seconds); +signals: + void HeaderInfoChanged(const QString &); + +protected: + QCheckBox *_setType; + QCheckBox *_setDuration; + QComboBox *_transitions; + DurationSelection *_duration; + QHBoxLayout *_typeLayout; + QHBoxLayout *_durationLayout; + std::shared_ptr _entryData; + +private: + bool _loading = true; +}; diff --git a/src/macro-action-transition.cpp b/src/macro-action-transition.cpp new file mode 100644 index 00000000..e4191753 --- /dev/null +++ b/src/macro-action-transition.cpp @@ -0,0 +1,169 @@ +#include "headers/macro-action-transition.hpp" +#include "headers/advanced-scene-switcher.hpp" +#include "headers/utility.hpp" + +const std::string MacroActionTransition::id = "transition"; + +bool MacroActionTransition::_registered = MacroActionFactory::Register( + MacroActionTransition::id, + {MacroActionTransition::Create, MacroActionTransitionEdit::Create, + "AdvSceneSwitcher.action.transition"}); + +bool MacroActionTransition::PerformAction() +{ + if (_setType) { + auto t = obs_weak_source_get_source(_transition); + obs_frontend_set_current_transition(t); + obs_source_release(t); + } + if (_setDuration) { + obs_frontend_set_transition_duration(_duration.seconds * 1000); + } + return true; +} + +void MacroActionTransition::LogAction() +{ + if (_setDuration) { + vblog(LOG_INFO, "set transition duration to %s", + _duration.ToString().c_str()); + } + if (_setType) { + vblog(LOG_INFO, "set transition type to \"%s\"", + GetWeakSourceName(_transition).c_str()); + } +} + +bool MacroActionTransition::Save(obs_data_t *obj) +{ + MacroAction::Save(obj); + _duration.Save(obj); + obs_data_set_string(obj, "transition", + GetWeakSourceName(_transition).c_str()); + obs_data_set_bool(obj, "setDuration", _setDuration); + obs_data_set_bool(obj, "setType", _setType); + return true; +} + +bool MacroActionTransition::Load(obs_data_t *obj) +{ + MacroAction::Load(obj); + _duration.Load(obj); + const char *transitionName = obs_data_get_string(obj, "transition"); + _transition = GetWeakTransitionByQString(transitionName); + _setDuration = obs_data_get_bool(obj, "setDuration"); + _setType = obs_data_get_bool(obj, "setType"); + return true; +} + +std::string MacroActionTransition::GetShortDesc() +{ + if (_transition) { + return GetWeakSourceName(_transition); + } + return ""; +} + +MacroActionTransitionEdit::MacroActionTransitionEdit( + QWidget *parent, std::shared_ptr entryData) + : QWidget(parent) +{ + _transitions = new QComboBox(); + _duration = new DurationSelection(this, false); + _setType = new QCheckBox(); + _setDuration = new QCheckBox(); + + populateTransitionSelection(_transitions, false); + + QWidget::connect(_transitions, + SIGNAL(currentTextChanged(const QString &)), this, + SLOT(TransitionChanged(const QString &))); + QWidget::connect(_duration, SIGNAL(DurationChanged(double)), this, + SLOT(DurationChanged(double))); + QWidget::connect(_setType, SIGNAL(stateChanged(int)), this, + SLOT(SetTypeChanged(int))); + QWidget::connect(_setDuration, SIGNAL(stateChanged(int)), this, + SLOT(SetDurationChanged(int))); + + std::unordered_map widgetPlaceholders = { + {"{{transitions}}", _transitions}, + {"{{duration}}", _duration}, + {"{{setType}}", _setType}, + {"{{setDuration}}", _setDuration}, + }; + _typeLayout = new QHBoxLayout; + placeWidgets(obs_module_text( + "AdvSceneSwitcher.action.transition.entry.line1"), + _typeLayout, widgetPlaceholders); + _durationLayout = new QHBoxLayout; + placeWidgets(obs_module_text( + "AdvSceneSwitcher.action.transition.entry.line2"), + _durationLayout, widgetPlaceholders); + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addLayout(_typeLayout); + mainLayout->addLayout(_durationLayout); + setLayout(mainLayout); + + _entryData = entryData; + UpdateEntryData(); + _loading = false; +} + +void MacroActionTransitionEdit::UpdateEntryData() +{ + if (!_entryData) { + return; + } + + _setDuration->setChecked(_entryData->_setDuration); + _duration->SetDuration(_entryData->_duration); + _setType->setChecked(_entryData->_setType); + _transitions->setCurrentText( + GetWeakSourceName(_entryData->_transition).c_str()); + _transitions->setEnabled(_entryData->_setType); + _duration->setEnabled(_entryData->_setDuration); +} + +void MacroActionTransitionEdit::TransitionChanged(const QString &text) +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_transition = GetWeakTransitionByQString(text); + emit HeaderInfoChanged( + QString::fromStdString(_entryData->GetShortDesc())); +} + +void MacroActionTransitionEdit::DurationChanged(double seconds) +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_duration.seconds = seconds; +} + +void MacroActionTransitionEdit::SetTypeChanged(int state) +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_setType = state; + _transitions->setEnabled(state); +} + +void MacroActionTransitionEdit::SetDurationChanged(int state) +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_setDuration = state; + _duration->setEnabled(state); +}