diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index de6b31c1..0fc64d96 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -12,7 +12,7 @@ AdvSceneSwitcher.generalTab.status.onStartup.alwaysStart="Aktiviere den Szenenwe AdvSceneSwitcher.generalTab.status.onStartup.doNotStart="Aktiviere den Szenenwechsler nicht" AdvSceneSwitcher.generalTab.status.start="Start" AdvSceneSwitcher.generalTab.status.stop="Stop" -AdvSceneSwitcher.generalTab.status.autoStart="Starte auotmatischen den Szenenwechsler beim:" +AdvSceneSwitcher.generalTab.status.autoStart.startup="Starte auotmatischen den Szenenwechsler beim:" AdvSceneSwitcher.generalTab.status.autoStart.never="Niemals" AdvSceneSwitcher.generalTab.status.autoStart.recording="Aufnehmen" AdvSceneSwitcher.generalTab.status.autoStart.streaming="Streamen" diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 9673d431..35b85427 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -12,11 +12,12 @@ AdvSceneSwitcher.generalTab.status.onStartup.alwaysStart="Always start the scene AdvSceneSwitcher.generalTab.status.onStartup.doNotStart="Do not start the scene switcher" AdvSceneSwitcher.generalTab.status.start="Start" AdvSceneSwitcher.generalTab.status.stop="Stop" -AdvSceneSwitcher.generalTab.status.autoStart="Automatically start the scene switcher when:" +AdvSceneSwitcher.generalTab.status.autoStart.startup="Automatically start the scene switcher when:" AdvSceneSwitcher.generalTab.status.autoStart.never="Never" AdvSceneSwitcher.generalTab.status.autoStart.recording="Recording" AdvSceneSwitcher.generalTab.status.autoStart.streaming="Streaming" AdvSceneSwitcher.generalTab.status.autoStart.recordingAndStreaming="Recording or Streaming" +AdvSceneSwitcher.generalTab.status.autoStart.scene="Automatically start the scene switcher on scene:" AdvSceneSwitcher.generalTab.status.checkInterval="Check conditions every" AdvSceneSwitcher.generalTab.status.checkIntervalTooLow="⚠️ Conflict with macro \"%1\"!" AdvSceneSwitcher.generalTab.status.checkIntervalTooLow.tooltip="Macro \"%1\" won't be able to check its condition at the desired interval of %2.\nEither change the condition check value on the General tab or in the settings of macro \"%3\"." diff --git a/data/locale/es-ES.ini b/data/locale/es-ES.ini index f295a1f5..ab03764b 100644 --- a/data/locale/es-ES.ini +++ b/data/locale/es-ES.ini @@ -12,7 +12,7 @@ AdvSceneSwitcher.generalTab.status.onStartup.alwaysStart="Siempre iniciar el sel AdvSceneSwitcher.generalTab.status.onStartup.doNotStart="No iniciar el selector de escenas" AdvSceneSwitcher.generalTab.status.start="Iniciar" AdvSceneSwitcher.generalTab.status.stop="Detener" -AdvSceneSwitcher.generalTab.status.autoStart="Iniciar automáticamente el selector de escenas cuando:" +AdvSceneSwitcher.generalTab.status.autoStart.startup="Iniciar automáticamente el selector de escenas cuando:" AdvSceneSwitcher.generalTab.status.autoStart.never="Nunca" AdvSceneSwitcher.generalTab.status.autoStart.recording="Grabando" AdvSceneSwitcher.generalTab.status.autoStart.streaming="Emitiendo" diff --git a/data/locale/fr-FR.ini b/data/locale/fr-FR.ini index 2dc19b24..25ff5266 100644 --- a/data/locale/fr-FR.ini +++ b/data/locale/fr-FR.ini @@ -12,7 +12,7 @@ AdvSceneSwitcher.generalTab.status.onStartup.alwaysStart="Toujours démarrer le AdvSceneSwitcher.generalTab.status.onStartup.doNotStart="Ne pas démarrer le sélecteur de scène" AdvSceneSwitcher.generalTab.status.start="Démarrer" AdvSceneSwitcher.generalTab.status.stop="Arrêter" -AdvSceneSwitcher.generalTab.status.autoStart="Démarrer automatiquement le sélecteur de scène lorsque :" +AdvSceneSwitcher.generalTab.status.autoStart.startup="Démarrer automatiquement le sélecteur de scène lorsque :" AdvSceneSwitcher.generalTab.status.autoStart.never="Jamais" AdvSceneSwitcher.generalTab.status.autoStart.recording="Enregistrement" AdvSceneSwitcher.generalTab.status.autoStart.streaming="Diffusion en continu" diff --git a/data/locale/ja-JP.ini b/data/locale/ja-JP.ini index d663e54a..0b943387 100644 --- a/data/locale/ja-JP.ini +++ b/data/locale/ja-JP.ini @@ -12,7 +12,7 @@ AdvSceneSwitcher.generalTab.status.onStartup.alwaysStart="常にシーンスイ AdvSceneSwitcher.generalTab.status.onStartup.doNotStart="シーンスイッチャーを起動しない" AdvSceneSwitcher.generalTab.status.start="起動する" AdvSceneSwitcher.generalTab.status.stop="停止する" -AdvSceneSwitcher.generalTab.status.autoStart="次の場合にシーンスイッチャーを自動起動する" +AdvSceneSwitcher.generalTab.status.autoStart.startup="次の場合にシーンスイッチャーを自動起動する" AdvSceneSwitcher.generalTab.status.autoStart.never="自動起動しない" AdvSceneSwitcher.generalTab.status.autoStart.recording="録画を開始した時" AdvSceneSwitcher.generalTab.status.autoStart.streaming="配信を開始した時" diff --git a/data/locale/pt-BR.ini b/data/locale/pt-BR.ini index c60334ed..615bca6a 100644 --- a/data/locale/pt-BR.ini +++ b/data/locale/pt-BR.ini @@ -12,7 +12,7 @@ AdvSceneSwitcher.generalTab.status.onStartup.alwaysStart="Sempre iniciar o switc AdvSceneSwitcher.generalTab.status.onStartup.doNotStart="Não iniciar o switcher de cenas" AdvSceneSwitcher.generalTab.status.start="Iniciar" AdvSceneSwitcher.generalTab.status.stop="Parar" -AdvSceneSwitcher.generalTab.status.autoStart="Iniciar automaticamente o switcher de cenas quando:" +AdvSceneSwitcher.generalTab.status.autoStart.startup="Iniciar automaticamente o switcher de cenas quando:" AdvSceneSwitcher.generalTab.status.autoStart.never="Nunca" AdvSceneSwitcher.generalTab.status.autoStart.recording="Gravando" AdvSceneSwitcher.generalTab.status.autoStart.streaming="Transmitindo" diff --git a/data/locale/ru-RU.ini b/data/locale/ru-RU.ini index 289da14a..7959cfff 100644 --- a/data/locale/ru-RU.ini +++ b/data/locale/ru-RU.ini @@ -12,7 +12,7 @@ AdvSceneSwitcher.generalTab.status.onStartup.alwaysStart="Всегда запу AdvSceneSwitcher.generalTab.status.onStartup.doNotStart="Не запускать переключатель сцен" AdvSceneSwitcher.generalTab.status.start="Старт" AdvSceneSwitcher.generalTab.status.stop="Стоп" -AdvSceneSwitcher.generalTab.status.autoStart="Автоматически запускать переключатель сцен, когда:" +AdvSceneSwitcher.generalTab.status.autoStart.startup="Автоматически запускать переключатель сцен, когда:" AdvSceneSwitcher.generalTab.status.autoStart.never="Никогда" AdvSceneSwitcher.generalTab.status.autoStart.recording="Запись" AdvSceneSwitcher.generalTab.status.autoStart.streaming="Вещание" diff --git a/data/locale/tr-TR.ini b/data/locale/tr-TR.ini index 1c984253..0508a765 100644 --- a/data/locale/tr-TR.ini +++ b/data/locale/tr-TR.ini @@ -12,7 +12,7 @@ AdvSceneSwitcher.generalTab.status.onStartup.alwaysStart="Her zaman sahne deği AdvSceneSwitcher.generalTab.status.onStartup.doNotStart="Sahne değiştiriciyi başlatma" AdvSceneSwitcher.generalTab.status.start="Başlat" AdvSceneSwitcher.generalTab.status.stop="Durdur" -AdvSceneSwitcher.generalTab.status.autoStart="Aşağıdaki durumlarda sahne değiştiriciyi otomatik olarak başlatın:" +AdvSceneSwitcher.generalTab.status.autoStart.startup="Aşağıdaki durumlarda sahne değiştiriciyi otomatik olarak başlatın:" AdvSceneSwitcher.generalTab.status.autoStart.never="Asla" AdvSceneSwitcher.generalTab.status.autoStart.recording="Kayıt" AdvSceneSwitcher.generalTab.status.autoStart.streaming="Yayın" diff --git a/data/locale/zh-CN.ini b/data/locale/zh-CN.ini index 7a2fd7f7..431eba29 100644 --- a/data/locale/zh-CN.ini +++ b/data/locale/zh-CN.ini @@ -12,7 +12,7 @@ AdvSceneSwitcher.generalTab.status.onStartup.alwaysStart="总是自动启动" AdvSceneSwitcher.generalTab.status.onStartup.doNotStart="不要启动" AdvSceneSwitcher.generalTab.status.start="启动" AdvSceneSwitcher.generalTab.status.stop="停止" -AdvSceneSwitcher.generalTab.status.autoStart="在以下情况下自动启动场景切换器:" +AdvSceneSwitcher.generalTab.status.autoStart.startup="在以下情况下自动启动场景切换器:" AdvSceneSwitcher.generalTab.status.autoStart.never="从不" AdvSceneSwitcher.generalTab.status.autoStart.recording="录制" AdvSceneSwitcher.generalTab.status.autoStart.streaming="直播" diff --git a/forms/advanced-scene-switcher.ui b/forms/advanced-scene-switcher.ui index 879d08aa..be110967 100644 --- a/forms/advanced-scene-switcher.ui +++ b/forms/advanced-scene-switcher.ui @@ -87,6 +87,40 @@ + + + + AdvSceneSwitcher.generalTab.status.autoStart.startup + + + + + + + + + AdvSceneSwitcher.generalTab.status.checkInterval + + + + + + + + + + + + + + + + + + + + + @@ -94,16 +128,13 @@ - - + + - - - - - + + - AdvSceneSwitcher.generalTab.status.autoStart + AdvSceneSwitcher.generalTab.status.hotkeytips @@ -130,36 +161,25 @@ - + - AdvSceneSwitcher.generalTab.status.hotkeytips + AdvSceneSwitcher.generalTab.status.autoStart.scene - - + + - - - AdvSceneSwitcher.generalTab.status.checkInterval - - + - - - - - + + + + - - - - - - @@ -4124,6 +4144,23 @@
macro-edit.hpp
1 + + advss::SceneSelectionWidget + QWidget +
scene-selection.hpp
+ 1 +
+ + advss::VariableLineEdit + QLineEdit +
variable-line-edit.hpp
+
+ + advss::RegexConfigWidget + QWidget +
regex-config.hpp
+ 1 +
tabWidget @@ -4131,6 +4168,10 @@ checkInterval startupBehavior autoStartEvent + autoStartSceneEnable + autoStartScene + autoStartSceneName + autoStartSceneNameRegex logLevel saveWindowGeo showTrayNotifications diff --git a/lib/advanced-scene-switcher.cpp b/lib/advanced-scene-switcher.cpp index 26f6f9a6..7a02e344 100644 --- a/lib/advanced-scene-switcher.cpp +++ b/lib/advanced-scene-switcher.cpp @@ -538,6 +538,7 @@ static void handleSceneChange() } switcher->checkDefaultSceneTransitions(); + switcher->CheckAutoStart(); } static void setLiveTime() diff --git a/lib/general.cpp b/lib/general.cpp index cfa94af2..db077adf 100644 --- a/lib/general.cpp +++ b/lib/general.cpp @@ -3,6 +3,7 @@ #include "filter-combo-box.hpp" #include "layout-helpers.hpp" #include "macro.hpp" +#include "macro-settings.hpp" #include "path-helpers.hpp" #include "selection-helpers.hpp" #include "source-helpers.hpp" @@ -536,8 +537,13 @@ void SwitcherData::SaveGeneralSettings(obs_data_t *obj) obs_data_set_int(obj, "startup_behavior", static_cast(startupBehavior)); - obs_data_set_int(obj, "autoStartEvent", - static_cast(autoStartEvent)); + OBSDataAutoRelease autoStart = obs_data_create(); + obs_data_set_int(autoStart, "event", static_cast(autoStartEvent)); + obs_data_set_bool(autoStart, "useAutoStartScene", useAutoStartScene); + autoStartScene.Save(autoStart); + autoStartSceneName.Save(autoStart, "name"); + autoStartSceneRegex.Save(autoStart); + obs_data_set_obj(obj, "autoStart", autoStart); SaveLogLevel(obj); @@ -595,8 +601,15 @@ void SwitcherData::LoadGeneralSettings(obs_data_t *obj) stop = true; } - autoStartEvent = - static_cast(obs_data_get_int(obj, "autoStartEvent")); + OBSDataAutoRelease autoStart = obs_data_get_obj(obj, "autoStart"); + autoStartEvent = static_cast( + obs_data_has_user_value(obj, "autoStart") + ? obs_data_get_int(autoStart, "event") + : obs_data_get_int(obj, "autoStartEvent")); + useAutoStartScene = obs_data_get_bool(autoStart, "useAutoStartScene"); + autoStartScene.Load(autoStart); + autoStartSceneName.Load(autoStart, "name"); + autoStartSceneRegex.Load(autoStart); LoadLogLevel(obj); @@ -687,6 +700,27 @@ void SwitcherData::CheckNoMatchSwitch(bool &match, OBSWeakSource &scene, } } +void SwitcherData::CheckAutoStart() +{ + if (!useAutoStartScene) { + return; + } + + bool shouldStartPlugin = false; + if (autoStartSceneRegex.Enabled()) { + const auto currentSceneName = GetWeakSourceName(currentScene); + shouldStartPlugin = autoStartSceneRegex.Matches( + currentSceneName, autoStartSceneName); + } else { + shouldStartPlugin = autoStartScene.GetScene(false) == + currentScene; + } + + if (shouldStartPlugin) { + Start(); + } +} + void SwitcherData::checkSwitchCooldown(bool &match) { if (!match || !enableCooldown) { @@ -829,7 +863,7 @@ static void setupGeneralTabInactiveWarning(QTabWidget *tabs) inactiveTimer->start(); } -void advss::AdvSceneSwitcher::SetCheckIntervalTooLowVisibility() const +void AdvSceneSwitcher::SetCheckIntervalTooLowVisibility() const { auto macro = GetMacroWithInvalidConditionInterval(); if (!macro) { @@ -918,6 +952,75 @@ void AdvSceneSwitcher::SetupGeneralTab() populateAutoStartEventSelection(ui->autoStartEvent); ui->autoStartEvent->setCurrentIndex( static_cast(switcher->autoStartEvent)); + ui->autoStartSceneEnable->setChecked(switcher->useAutoStartScene); + ui->autoStartScene->SetScene(switcher->autoStartScene); + ui->autoStartScene->LockToMainCanvas(); + ui->autoStartSceneName->setText(switcher->autoStartSceneName); + ui->autoStartSceneNameRegex->SetRegexConfig( + switcher->autoStartSceneRegex); + + const auto setupAutoStartSceneLayoutVisibility = [this](bool useRegex) { + ui->autoStartSceneName->setVisible(useRegex); + ui->autoStartScene->setVisible(!useRegex); + if (useRegex) { + RemoveStretchIfPresent(ui->autoStartSceneLayout); + } else { + AddStretchIfNecessary(ui->autoStartSceneLayout); + } + }; + setupAutoStartSceneLayoutVisibility( + switcher->autoStartSceneRegex.Enabled()); + + const auto setupAutoStartSceneWidgetState = + [this](bool useAutoStartScene) { + ui->autoStartScene->setEnabled(useAutoStartScene); + ui->autoStartSceneName->setEnabled(useAutoStartScene); + ui->autoStartSceneNameRegex->setEnabled( + useAutoStartScene); + }; + setupAutoStartSceneWidgetState(switcher->useAutoStartScene); + + connect(ui->autoStartSceneEnable, &QCheckBox::stateChanged, this, + [this, setupAutoStartSceneWidgetState](int enabled) { + if (loading) { + return; + } + std::lock_guard lock(switcher->m); + switcher->useAutoStartScene = enabled; + setupAutoStartSceneWidgetState(enabled); + }); + + connect(ui->autoStartScene, &SceneSelectionWidget::SceneChanged, this, + [this](const SceneSelection &scene) { + if (loading) { + return; + } + std::lock_guard lock(switcher->m); + switcher->autoStartScene = scene; + switcher->CheckAutoStart(); + }); + connect(ui->autoStartSceneName, &VariableLineEdit::editingFinished, + this, [this]() { + if (loading) { + return; + } + std::lock_guard lock(switcher->m); + switcher->autoStartSceneName = + ui->autoStartSceneName->text().toStdString(); + switcher->CheckAutoStart(); + }); + connect(ui->autoStartSceneNameRegex, + &RegexConfigWidget::RegexConfigChanged, this, + [this, setupAutoStartSceneLayoutVisibility]( + const RegexConfig ®ex) { + if (loading) { + return; + } + std::lock_guard lock(switcher->m); + switcher->autoStartSceneRegex = regex; + setupAutoStartSceneLayoutVisibility(regex.Enabled()); + switcher->CheckAutoStart(); + }); // Set up status control auto statusControl = new StatusControl(this, true); diff --git a/lib/switcher-data.hpp b/lib/switcher-data.hpp index c76b9685..98efa7ea 100644 --- a/lib/switcher-data.hpp +++ b/lib/switcher-data.hpp @@ -14,10 +14,12 @@ #include "switch-sequence.hpp" #include "switch-video.hpp" -#include "macro-settings.hpp" #include "duration-control.hpp" -#include "priority-helper.hpp" #include "plugin-state-helpers.hpp" +#include "priority-helper.hpp" +#include "regex-config.hpp" +#include "scene-selection.hpp" +#include "variable-string.hpp" #include #include @@ -62,6 +64,7 @@ public: bool ¯oMatch); void CheckNoMatchSwitch(bool &match, OBSWeakSource &scene, OBSWeakSource &transition, int &sleep); + void CheckAutoStart(); /* --- Start of saving / loading section --- */ @@ -118,6 +121,10 @@ public: RECORINDG_OR_STREAMING }; AutoStart autoStartEvent = AutoStart::NEVER; + bool useAutoStartScene = false; + SceneSelection autoStartScene; + StringVariable autoStartSceneName; + RegexConfig autoStartSceneRegex; bool enableCooldown = false; Duration cooldown; bool showSystemTrayNotifications = false;