diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index f8be388e..59460efe 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -249,6 +249,7 @@ AdvSceneSwitcher.browse="Öffnen" AdvSceneSwitcher.selectScene="--Szene auswählen--" AdvSceneSwitcher.selectPreviousScene="Vorhergehende Szene" +AdvSceneSwitcher.currentTransition="Aktueller Szenenübergang" AdvSceneSwitcher.selectTransition="--Szenenübergang auswählen--" AdvSceneSwitcher.selectWindow="--Fenster auswählen--" AdvSceneSwitcher.selectAudioSource="--Audio Quelle auswählen--" diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 92f1deb0..58bd1538 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -248,6 +248,7 @@ AdvSceneSwitcher.browse="Browse" AdvSceneSwitcher.selectScene="--select scene--" AdvSceneSwitcher.selectPreviousScene="Previous Scene" +AdvSceneSwitcher.currentTransition="Current Transition" AdvSceneSwitcher.selectTransition="--select transition--" AdvSceneSwitcher.selectWindow="--select window--" AdvSceneSwitcher.selectAudioSource="--select audio source--" diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp index 21b90396..d7ed0161 100644 --- a/src/advanced-scene-switcher.cpp +++ b/src/advanced-scene-switcher.cpp @@ -92,8 +92,9 @@ bool AdvSceneSwitcher::DisplayMessage(QString msg, bool question) return false; } -void addSelectionEntry(QComboBox *sel, const char *description, - const char *tooltip = "") +void AdvSceneSwitcher::addSelectionEntry(QComboBox *sel, + const char *description, + bool selectable, const char *tooltip) { sel->addItem(description); @@ -106,14 +107,17 @@ void addSelectionEntry(QComboBox *sel, const char *description, QModelIndex firstIndex = model->index(0, sel->modelColumn(), sel->rootModelIndex()); QStandardItem *firstItem = model->itemFromIndex(firstIndex); - firstItem->setSelectable(false); - firstItem->setEnabled(false); + if (!selectable) { + firstItem->setSelectable(false); + firstItem->setEnabled(false); + } } void AdvSceneSwitcher::populateSceneSelection(QComboBox *sel, bool addPrevious, bool addSceneGroup, bool addSelect, - std::string selectText) + std::string selectText, + bool selectable) { sel->clear(); @@ -122,10 +126,11 @@ void AdvSceneSwitcher::populateSceneSelection(QComboBox *sel, bool addPrevious, addSelectionEntry( sel, obs_module_text("AdvSceneSwitcher.selectScene"), + selectable, obs_module_text( "AdvSceneSwitcher.invaildEntriesWillNotBeSaved")); } else { - addSelectionEntry(sel, selectText.c_str()); + addSelectionEntry(sel, selectText.c_str(), selectable); } } @@ -150,12 +155,20 @@ void AdvSceneSwitcher::populateSceneSelection(QComboBox *sel, bool addPrevious, } void AdvSceneSwitcher::populateTransitionSelection(QComboBox *sel, - bool addSelect) + bool addCurrent, + bool addSelect, + bool selectable) { if (addSelect) { addSelectionEntry( sel, - obs_module_text("AdvSceneSwitcher.selectTransition")); + obs_module_text("AdvSceneSwitcher.selectTransition"), + selectable); + } + + if (addCurrent) { + sel->addItem( + obs_module_text("AdvSceneSwitcher.currentTransition")); } obs_frontend_source_list *transitions = new obs_frontend_source_list(); @@ -197,6 +210,7 @@ void AdvSceneSwitcher::populateAudioSelection(QComboBox *sel, bool addSelect) addSelectionEntry( sel, obs_module_text("AdvSceneSwitcher.selectAudioSource"), + false, obs_module_text( "AdvSceneSwitcher.invaildEntriesWillNotBeSaved")); } @@ -227,6 +241,7 @@ void AdvSceneSwitcher::populateMediaSelection(QComboBox *sel, bool addSelect) addSelectionEntry( sel, obs_module_text("AdvSceneSwitcher.selectMediaSource"), + false, obs_module_text( "AdvSceneSwitcher.invaildEntriesWillNotBeSaved")); } diff --git a/src/headers/advanced-scene-switcher.hpp b/src/headers/advanced-scene-switcher.hpp index 8298c5ac..394ced97 100644 --- a/src/headers/advanced-scene-switcher.hpp +++ b/src/headers/advanced-scene-switcher.hpp @@ -62,14 +62,20 @@ public: static bool DisplayMessage(QString msg, bool question = false); static void AskBackup(obs_data_t *obj); + static void addSelectionEntry(QComboBox *sel, const char *description, + bool selectable = false, + const char *tooltip = ""); static void populateSceneSelection(QComboBox *sel, bool addPrevious = false, bool addSceneGroup = false, bool addSelect = true, - std::string selectText = ""); + std::string selectText = "", + bool selectable = false); static void populateTransitionSelection(QComboBox *sel, - bool addSelect = true); + bool addCurrent = true, + bool addSelect = true, + bool selectable = false); static void populateWindowSelection(QComboBox *sel, bool addSelect = true); static void populateAudioSelection(QComboBox *sel, diff --git a/src/headers/switch-generic.hpp b/src/headers/switch-generic.hpp index 071e31d7..f33788df 100644 --- a/src/headers/switch-generic.hpp +++ b/src/headers/switch-generic.hpp @@ -8,6 +8,7 @@ struct SceneSwitcherEntry { OBSWeakSource scene = nullptr; OBSWeakSource transition = nullptr; bool usePreviousScene = false; + bool useCurrentTransition = false; virtual const char *getType() = 0; virtual bool initialized(); @@ -64,7 +65,8 @@ class SwitchWidget : public QWidget { public: SwitchWidget(QWidget *parent, SceneSwitcherEntry *s, - bool usePreviousScene = true, bool addSceneGroup = false); + bool usePreviousScene = true, bool addSceneGroup = false, + bool addCurrentTransition = true); virtual SceneSwitcherEntry *getSwitchData(); virtual void setSwitchData(SceneSwitcherEntry *s); void showSwitchData(); diff --git a/src/headers/switcher-data-structs.hpp b/src/headers/switcher-data-structs.hpp index 94c89cb7..eec830c5 100644 --- a/src/headers/switcher-data-structs.hpp +++ b/src/headers/switcher-data-structs.hpp @@ -24,6 +24,7 @@ constexpr auto default_interval = 300; constexpr auto previous_scene_name = "Previous Scene"; +constexpr auto current_transition_name = "Current Transition"; typedef enum { NO_SWITCH = 0, SWITCH = 1, RANDOM_SWITCH = 2 } NoMatch; typedef enum { PERSIST = 0, START = 1, STOP = 2 } StartupBehavior; diff --git a/src/scene-trigger.cpp b/src/scene-trigger.cpp index aa9ed291..7c917407 100644 --- a/src/scene-trigger.cpp +++ b/src/scene-trigger.cpp @@ -429,8 +429,11 @@ void SceneTrigger::load(obs_data_t *obj) static inline void populateTriggers(QComboBox *list) { - list->addItem(obs_module_text( - "AdvSceneSwitcher.sceneTriggerTab.sceneTriggerType.none")); + AdvSceneSwitcher::addSelectionEntry( + list, + obs_module_text( + "AdvSceneSwitcher.sceneTriggerTab.sceneTriggerType.none")); + list->addItem(obs_module_text( "AdvSceneSwitcher.sceneTriggerTab.sceneTriggerType.sceneActive")); list->addItem(obs_module_text( @@ -441,8 +444,11 @@ static inline void populateTriggers(QComboBox *list) inline void populateActions(QComboBox *list) { - list->addItem(obs_module_text( - "AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.none")); + AdvSceneSwitcher::addSelectionEntry( + list, + obs_module_text( + "AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.none")); + list->addItem(obs_module_text( "AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.startRecording")); list->addItem(obs_module_text( diff --git a/src/switch-generic.cpp b/src/switch-generic.cpp index 87f58278..5490a4a6 100644 --- a/src/switch-generic.cpp +++ b/src/switch-generic.cpp @@ -5,14 +5,15 @@ bool SceneSwitcherEntry::initialized() { return (usePreviousScene || WeakSourceValid(scene) || SceneGroupValid(group)) && - transition; + (useCurrentTransition || transition); } bool SceneSwitcherEntry::valid() { - return !initialized() || ((usePreviousScene || WeakSourceValid(scene) || - SceneGroupValid(group)) && - WeakSourceValid(transition)); + return !initialized() || + ((usePreviousScene || WeakSourceValid(scene) || + SceneGroupValid(group)) && + (useCurrentTransition || WeakSourceValid(transition))); } void SceneSwitcherEntry::logMatchScene() @@ -82,8 +83,11 @@ void SceneSwitcherEntry::save(obs_data_t *obj, const char *targetTypeSaveName, obs_data_set_string(obj, targetSaveName, targetName.c_str()); - obs_data_set_string(obj, transitionSaveName, - GetWeakSourceName(transition).c_str()); + std::string transitionName = current_transition_name; + if (!useCurrentTransition) { + transitionName = GetWeakSourceName(transition); + } + obs_data_set_string(obj, transitionSaveName, transitionName.c_str()); } void SceneSwitcherEntry::load(obs_data_t *obj, const char *targetTypeLoadName, @@ -104,11 +108,14 @@ void SceneSwitcherEntry::load(obs_data_t *obj, const char *targetTypeLoadName, group = GetSceneGroupByName(targetName); } + usePreviousScene = strcmp(targetName, previous_scene_name) == 0; + const char *transitionName = obs_data_get_string(obj, transitionLoadName); transition = GetWeakTransitionByName(transitionName); - usePreviousScene = strcmp(targetName, previous_scene_name) == 0; + useCurrentTransition = + strcmp(transitionName, current_transition_name) == 0; } void SwitchWidget::SceneGroupAdd(const QString &name) @@ -166,7 +173,8 @@ void SwitchWidget::SceneGroupRename(const QString &oldName, } SwitchWidget::SwitchWidget(QWidget *parent, SceneSwitcherEntry *s, - bool usePreviousScene, bool addSceneGroup) + bool usePreviousScene, bool addSceneGroup, + bool addCurrentTransition) { scenes = new QComboBox(); transitions = new QComboBox(); @@ -194,7 +202,8 @@ SwitchWidget::SwitchWidget(QWidget *parent, SceneSwitcherEntry *s, AdvSceneSwitcher::populateSceneSelection(scenes, usePreviousScene, addSceneGroup); - AdvSceneSwitcher::populateTransitionSelection(transitions); + AdvSceneSwitcher::populateTransitionSelection(transitions, + addCurrentTransition); switchData = s; showSwitchData(); @@ -218,6 +227,10 @@ void SwitchWidget::showSwitchData() transitions->setCurrentText( GetWeakSourceName(switchData->transition).c_str()); + if (switchData->useCurrentTransition) { + transitions->setCurrentText( + obs_module_text("AdvSceneSwitcher.currentTransition")); + } if (switchData->usePreviousScene) { scenes->setCurrentText(obs_module_text( @@ -278,4 +291,5 @@ void SwitchWidget::TransitionChanged(const QString &text) std::lock_guard lock(switcher->m); switchData->transition = GetWeakTransitionByQString(text); + switchData->useCurrentTransition = switchData->transition == nullptr; } diff --git a/src/switch-screen-region.cpp b/src/switch-screen-region.cpp index 5bb6cd05..9e5f9e4a 100644 --- a/src/switch-screen-region.cpp +++ b/src/switch-screen-region.cpp @@ -353,7 +353,8 @@ ScreenRegionWidget::ScreenRegionWidget(QWidget *parent, ScreenRegionSwitch *s) AdvSceneSwitcher::populateSceneSelection( excludeScenes, false, false, true, obs_module_text( - "AdvSceneSwitcher.screenRegionTab.excludeScenes.None")); + "AdvSceneSwitcher.screenRegionTab.excludeScenes.None"), + true); if (s) { excludeScenes->setCurrentText( diff --git a/src/switch-transitions.cpp b/src/switch-transitions.cpp index fb4364de..91e1f791 100644 --- a/src/switch-transitions.cpp +++ b/src/switch-transitions.cpp @@ -427,7 +427,7 @@ bool SceneTransition::valid() TransitionSwitchWidget::TransitionSwitchWidget(QWidget *parent, SceneTransition *s) - : SwitchWidget(parent, s, false) + : SwitchWidget(parent, s, false, false, false) { scenes2 = new QComboBox(); @@ -486,7 +486,7 @@ void TransitionSwitchWidget::Scene2Changed(const QString &text) DefTransitionSwitchWidget::DefTransitionSwitchWidget(QWidget *parent, DefaultSceneTransition *s) - : SwitchWidget(parent, s, false) + : SwitchWidget(parent, s, false, false, false) { QHBoxLayout *mainLayout = new QHBoxLayout; std::unordered_map widgetPlaceholders = {