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 @@
1
+
+ advss::SceneSelectionWidget
+ QWidget
+
+ 1
+
+
+ advss::VariableLineEdit
+ QLineEdit
+
+
+
+ advss::RegexConfigWidget
+ QWidget
+
+ 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;