diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index 9eb5c102..1241e704 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -392,9 +392,9 @@ AdvSceneSwitcher.condition.variable.type.greaterThanVariable="ist größer als d AdvSceneSwitcher.condition.variable.entry="{{variables}}{{conditions}}{{strValue}}{{numValue}}{{variables2}}" ; Macro Actions -AdvSceneSwitcher.action.switchScene="Szene wechseln" -AdvSceneSwitcher.action.scene.entry="Wechsle zu Szene{{scenes}}mittels{{transitions}}mit einer Dauer von{{duration}}Sekunden" -AdvSceneSwitcher.action.scene.entry.noDuration="Wechsle zu Szene{{scenes}}mittels{{transitions}}" +AdvSceneSwitcher.action.scene="Szene wechseln" +AdvSceneSwitcher.action.scene.entry="Wechsle{{sceneTypes}}Szene zu{{scenes}}mittels{{transitions}}mit einer Dauer von{{duration}}Sekunden" +AdvSceneSwitcher.action.scene.entry.noDuration="Wechsle{{sceneTypes}}Szene zu{{scenes}}mittels{{transitions}}" AdvSceneSwitcher.action.scene.blockUntilTransitionDone="Warten, bis der Übergang zur Zielszene abgeschlossen ist" AdvSceneSwitcher.action.wait="Warten" AdvSceneSwitcher.action.wait.type.fixed="fixe" diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 5efb4a79..95fb626a 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -488,9 +488,12 @@ AdvSceneSwitcher.condition.slideshow.updateIntervalTooltip="Information about th AdvSceneSwitcher.condition.slideshow.entry="{{sources}}{{conditions}}{{index}}{{path}}" ; Macro Actions -AdvSceneSwitcher.action.switchScene="Switch scene" -AdvSceneSwitcher.action.scene.entry="Switch to scene{{scenes}}using{{transitions}}with a duration of{{duration}}seconds" -AdvSceneSwitcher.action.scene.entry.noDuration="Switch to scene{{scenes}}using{{transitions}}" +AdvSceneSwitcher.action.scene="Switch scene" +AdvSceneSwitcher.action.scene.type.program="Program" +AdvSceneSwitcher.action.scene.type.preview="Preview" +AdvSceneSwitcher.action.scene.entry="Switch{{sceneTypes}}scene to{{scenes}}using{{transitions}}with a duration of{{duration}}seconds" +AdvSceneSwitcher.action.scene.entry.noDuration="Switch{{sceneTypes}}scene to{{scenes}}using{{transitions}}" +AdvSceneSwitcher.action.scene.entry.preview="Switch{{sceneTypes}}scene to{{scenes}}" AdvSceneSwitcher.action.scene.blockUntilTransitionDone="Wait until transition to target scene is complete" AdvSceneSwitcher.action.wait="Wait" AdvSceneSwitcher.action.wait.type.fixed="fixed" diff --git a/data/locale/es-ES.ini b/data/locale/es-ES.ini index f4d6d8f3..ce7eaf75 100644 --- a/data/locale/es-ES.ini +++ b/data/locale/es-ES.ini @@ -322,8 +322,8 @@ AdvSceneSwitcher.condition.stats.dockHint="Puede abrir el panel de \"Estadístic AdvSceneSwitcher.condition.stats.entry="{{stats}} esta {{condition}} {{value}}" ; Macro Actions -AdvSceneSwitcher.action.switchScene="Cambiar escena" -AdvSceneSwitcher.action.scene.entry="Cambiar a la escena {{scenes}} usando {{transitions}} con una duración de {{duration}} segundos" +AdvSceneSwitcher.action.scene="Cambiar escena" +AdvSceneSwitcher.action.scene.entry="Cambiar a la{{sceneTypes}}escena{{scenes}}usando{{transitions}}con una duración de{{duration}} segundos" AdvSceneSwitcher.action.scene.blockUntilTransitionDone="Espere hasta que se complete la transición a la escena de destino" AdvSceneSwitcher.action.wait="Esperar" AdvSceneSwitcher.action.wait.type.fixed="fijo" diff --git a/data/locale/ru-RU.ini b/data/locale/ru-RU.ini index b1ea13b2..25c0cece 100644 --- a/data/locale/ru-RU.ini +++ b/data/locale/ru-RU.ini @@ -115,8 +115,8 @@ AdvSceneSwitcher.condition.pluginState.state.sceneSwitched="Автоматиче AdvSceneSwitcher.condition.pluginState.entry="{{condition}}" ; Macro Actions -AdvSceneSwitcher.action.switchScene="Переключить сцену" -AdvSceneSwitcher.action.scene.entry="Перейти к сцене {{scenes}} используя {{transitions}} с продолжительностью {{duration}} секунд" +AdvSceneSwitcher.action.scene="Переключить сцену" +AdvSceneSwitcher.action.scene.entry="Перейти к сцене{{sceneTypes}}{{scenes}}используя{{transitions}}с продолжительностью{{duration}}секунд" AdvSceneSwitcher.action.wait="Подождать" AdvSceneSwitcher.action.wait.type.fixed="фиксированный" AdvSceneSwitcher.action.wait.type.random="случайный" diff --git a/data/locale/tr-TR.ini b/data/locale/tr-TR.ini index d764f9f3..409a07e0 100644 --- a/data/locale/tr-TR.ini +++ b/data/locale/tr-TR.ini @@ -259,8 +259,8 @@ AdvSceneSwitcher.condition.openvr.entry.line2="{{controls}}" AdvSceneSwitcher.condition.openvr.entry.line3="HMD mevcut {{xPos}} x {{yPos}} x {{zPos}}" ; Macro Actions -AdvSceneSwitcher.action.switchScene="Sahne Degistirici" -AdvSceneSwitcher.action.scene.entry="Sahneyi {{scenes}} kullanarak {{transitions}} süresi olan {{duration}} saniye" +AdvSceneSwitcher.action.scene="Sahne Degistirici" +AdvSceneSwitcher.action.scene.entry="Sahneyi{{sceneTypes}}{{scenes}}kullanarak{{transitions}}süresi olan{{duration}}saniye" AdvSceneSwitcher.action.scene.blockUntilTransitionDone="Hedef sahneye geçiş tamamlanana kadar bekleyin" AdvSceneSwitcher.action.wait="Bekle" AdvSceneSwitcher.action.wait.type.fixed="sabit" diff --git a/data/locale/zh-CN.ini b/data/locale/zh-CN.ini index 4785179c..f12fac20 100644 --- a/data/locale/zh-CN.ini +++ b/data/locale/zh-CN.ini @@ -448,9 +448,9 @@ AdvSceneSwitcher.condition.display.type.displayCount="连接的显示器的数 AdvSceneSwitcher.condition.display.entry="{{conditions}}{{displays}}{{regex}}{{displayCount}}" ; Macro Actions -AdvSceneSwitcher.action.switchScene="切换场景" -AdvSceneSwitcher.action.scene.entry="切换场景 {{scenes}} 使用 {{transitions}} 时长 {{duration}} 秒" -AdvSceneSwitcher.action.scene.entry.noDuration="切换到场景{{scenes}}使用{{transitions}}" +AdvSceneSwitcher.action.scene="切换场景" +AdvSceneSwitcher.action.scene.entry="切换场景{{sceneTypes}}{{scenes}}使用{{transitions}}时长{{duration}}秒" +AdvSceneSwitcher.action.scene.entry.noDuration="切换到场景{{sceneTypes}}{{scenes}}使用{{transitions}}" AdvSceneSwitcher.action.scene.blockUntilTransitionDone="等待目标场景的过渡完成" AdvSceneSwitcher.action.wait="等待" AdvSceneSwitcher.action.wait.type.fixed="固定数值" diff --git a/src/macro-core/macro-action-scene-switch.cpp b/src/macro-core/macro-action-scene-switch.cpp index d4cd534d..24b9d070 100644 --- a/src/macro-core/macro-action-scene-switch.cpp +++ b/src/macro-core/macro-action-scene-switch.cpp @@ -12,7 +12,15 @@ const std::string MacroActionSwitchScene::id = "scene_switch"; bool MacroActionSwitchScene::_registered = MacroActionFactory::Register( MacroActionSwitchScene::id, {MacroActionSwitchScene::Create, MacroActionSwitchSceneEdit::Create, - "AdvSceneSwitcher.action.switchScene"}); + "AdvSceneSwitcher.action.scene"}); + +const static std::map + sceneTypes = { + {MacroActionSwitchScene::SceneType::PROGRAM, + "AdvSceneSwitcher.action.scene.type.program"}, + {MacroActionSwitchScene::SceneType::PREVIEW, + "AdvSceneSwitcher.action.scene.type.preview"}, +}; static void waitForTransitionChange(OBSWeakSource &transition, std::unique_lock *lock, @@ -126,6 +134,14 @@ bool MacroActionSwitchScene::WaitForTransition(OBSWeakSource &scene, bool MacroActionSwitchScene::PerformAction() { auto scene = _scene.GetScene(); + + if (_sceneType == SceneType::PREVIEW) { + OBSSourceAutoRelease previewScneSource = + obs_weak_source_get_source(scene); + obs_frontend_set_current_preview_scene(previewScneSource); + return true; + } + auto transition = _transition.GetTransition(); SwitchScene({scene, transition, (int)(_duration.Milliseconds())}, obs_frontend_preview_program_mode_active()); @@ -137,24 +153,9 @@ bool MacroActionSwitchScene::PerformAction() void MacroActionSwitchScene::LogAction() const { - auto t = _scene.GetType(); - auto sceneName = GetWeakSourceName(_scene.GetScene(false)); - switch (t) { - case SceneSelection::Type::SCENE: - vblog(LOG_INFO, "switch to scene '%s'", - _scene.ToString(true).c_str()); - break; - case SceneSelection::Type::GROUP: - vblog(LOG_INFO, "switch to scene '%s' (scene group '%s')", - sceneName.c_str(), _scene.ToString(true).c_str()); - break; - case SceneSelection::Type::PREVIOUS: - vblog(LOG_INFO, "switch to previous scene '%s'", - sceneName.c_str()); - break; - default: - break; - } + vblog(LOG_INFO, "switch%s scene to '%s'", + _sceneType == SceneType::PREVIEW ? " preview" : "", + _scene.ToString(true).c_str()); } bool MacroActionSwitchScene::Save(obs_data_t *obj) const @@ -165,6 +166,7 @@ bool MacroActionSwitchScene::Save(obs_data_t *obj) const _duration.Save(obj); obs_data_set_bool(obj, "blockUntilTransitionDone", _blockUntilTransitionDone); + obs_data_set_int(obj, "sceneType", static_cast(_sceneType)); return true; } @@ -176,6 +178,7 @@ bool MacroActionSwitchScene::Load(obs_data_t *obj) _duration.Load(obj); _blockUntilTransitionDone = obs_data_get_bool(obj, "blockUntilTransitionDone"); + _sceneType = static_cast(obs_data_get_int(obj, "sceneType")); return true; } @@ -184,6 +187,13 @@ std::string MacroActionSwitchScene::GetShortDesc() const return _scene.ToString(); } +static inline void populateTypeSelection(QComboBox *list) +{ + for (const auto &[_, name] : sceneTypes) { + list->addItem(obs_module_text(name.c_str())); + } +} + MacroActionSwitchSceneEdit::MacroActionSwitchSceneEdit( QWidget *parent, std::shared_ptr entryData) : QWidget(parent), @@ -192,9 +202,11 @@ MacroActionSwitchSceneEdit::MacroActionSwitchSceneEdit( _duration(new DurationSelection(parent, false)), _blockUntilTransitionDone(new QCheckBox(obs_module_text( "AdvSceneSwitcher.action.scene.blockUntilTransitionDone"))), + _sceneTypes(new QComboBox()), _entryLayout(new QHBoxLayout()) { _duration->SpinBox()->setSpecialValueText("-"); + populateTypeSelection(_sceneTypes); QWidget::connect(_scenes, SIGNAL(SceneChanged(const SceneSelection &)), this, SLOT(SceneChanged(const SceneSelection &))); @@ -206,28 +218,29 @@ MacroActionSwitchSceneEdit::MacroActionSwitchSceneEdit( this, SLOT(DurationChanged(const Duration &))); QWidget::connect(_blockUntilTransitionDone, SIGNAL(stateChanged(int)), this, SLOT(BlockUntilTransitionDoneChanged(int))); + QWidget::connect(_sceneTypes, SIGNAL(currentIndexChanged(int)), this, + SLOT(SceneTypeChanged(int))); - std::unordered_map widgetPlaceholders = { - {"{{scenes}}", _scenes}, - {"{{transitions}}", _transitions}, - {"{{duration}}", _duration}, - {"{{blockUntilTransitionDone}}", _blockUntilTransitionDone}, - }; PlaceWidgets(obs_module_text("AdvSceneSwitcher.action.scene.entry"), - _entryLayout, widgetPlaceholders); + _entryLayout, + {{"{{scenes}}", _scenes}, + {"{{transitions}}", _transitions}, + {"{{duration}}", _duration}, + {"{{sceneTypes}}", _sceneTypes}}); - QVBoxLayout *mainLayout = new QVBoxLayout; + auto mainLayout = new QVBoxLayout; mainLayout->addLayout(_entryLayout); mainLayout->addWidget(_blockUntilTransitionDone); setLayout(mainLayout); _entryData = entryData; + _sceneTypes->setCurrentIndex(static_cast(_entryData->_sceneType)); _scenes->SetScene(_entryData->_scene); _transitions->SetTransition(_entryData->_transition); _duration->SetDuration(_entryData->_duration); _blockUntilTransitionDone->setChecked( _entryData->_blockUntilTransitionDone); - SetDurationVisibility(); + SetWidgetVisibility(); _loading = false; } @@ -251,8 +264,44 @@ void MacroActionSwitchSceneEdit::BlockUntilTransitionDoneChanged(int state) _entryData->_blockUntilTransitionDone = state; } -void MacroActionSwitchSceneEdit::SetDurationVisibility() +void MacroActionSwitchSceneEdit::SceneTypeChanged(int value) { + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_sceneType = + static_cast(value); + SetWidgetVisibility(); +} + +void MacroActionSwitchSceneEdit::SetWidgetVisibility() +{ + _entryLayout->removeWidget(_scenes); + _entryLayout->removeWidget(_transitions); + _entryLayout->removeWidget(_duration); + _entryLayout->removeWidget(_sceneTypes); + ClearLayout(_entryLayout); + std::unordered_map widgetPlaceholders = { + {"{{scenes}}", _scenes}, + {"{{transitions}}", _transitions}, + {"{{duration}}", _duration}, + {"{{sceneTypes}}", _sceneTypes}, + }; + + if (_entryData->_sceneType == + MacroActionSwitchScene::SceneType::PREVIEW) { + _transitions->hide(); + _duration->hide(); + PlaceWidgets( + obs_module_text( + "AdvSceneSwitcher.action.scene.entry.preview"), + _entryLayout, widgetPlaceholders); + return; + } + + _transitions->show(); if (_entryData->_transition.GetType() != TransitionSelection::Type::TRANSITION) { _duration->show(); @@ -261,15 +310,6 @@ void MacroActionSwitchSceneEdit::SetDurationVisibility() _entryData->_transition.GetTransition()); _duration->setVisible(!fixedDuration); - _entryLayout->removeWidget(_scenes); - _entryLayout->removeWidget(_transitions); - _entryLayout->removeWidget(_duration); - ClearLayout(_entryLayout); - std::unordered_map widgetPlaceholders = { - {"{{scenes}}", _scenes}, - {"{{transitions}}", _transitions}, - {"{{duration}}", _duration}, - }; if (fixedDuration) { PlaceWidgets( obs_module_text( @@ -302,7 +342,7 @@ void MacroActionSwitchSceneEdit::TransitionChanged(const TransitionSelection &t) auto lock = LockContext(); _entryData->_transition = t; - SetDurationVisibility(); + SetWidgetVisibility(); } } // namespace advss diff --git a/src/macro-core/macro-action-scene-switch.hpp b/src/macro-core/macro-action-scene-switch.hpp index 925c8818..5df5e47d 100644 --- a/src/macro-core/macro-action-scene-switch.hpp +++ b/src/macro-core/macro-action-scene-switch.hpp @@ -22,6 +22,9 @@ public: { return std::make_shared(m); } + + enum class SceneType { PROGRAM, PREVIEW }; + SceneType _sceneType = SceneType::PROGRAM; SceneSelection _scene; TransitionSelection _transition; Duration _duration; @@ -55,20 +58,21 @@ private slots: void TransitionChanged(const TransitionSelection &); void DurationChanged(const Duration &seconds); void BlockUntilTransitionDoneChanged(int state); + void SceneTypeChanged(int); signals: void HeaderInfoChanged(const QString &); -protected: +private: + void SetWidgetVisibility(); + SceneSelectionWidget *_scenes; TransitionSelectionWidget *_transitions; DurationSelection *_duration; QCheckBox *_blockUntilTransitionDone; + QComboBox *_sceneTypes; QHBoxLayout *_entryLayout; std::shared_ptr _entryData; - -private: - void SetDurationVisibility(); bool _loading = true; };