From 6d5086b971006d143474a7c18b948a9815b8cf63 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Fri, 19 Feb 2021 19:03:38 +0100 Subject: [PATCH] Add option to select 'current transition' (#123) * move addSelectionEntry to AdvSceneSwitcher class and allow select entry to be 'selectable' Can be useful for implementing 'current transition' as an option or just allowing to select 'None' for screen region ignore * Add option to select 'current transition' --- data/locale/de-DE.ini | 1 + data/locale/en-US.ini | 1 + src/advanced-scene-switcher.cpp | 31 +++++++++++++++++------- src/headers/advanced-scene-switcher.hpp | 10 ++++++-- src/headers/switch-generic.hpp | 4 +++- src/headers/switcher-data-structs.hpp | 1 + src/scene-trigger.cpp | 14 +++++++---- src/switch-generic.cpp | 32 ++++++++++++++++++------- src/switch-screen-region.cpp | 3 ++- src/switch-transitions.cpp | 4 ++-- 10 files changed, 74 insertions(+), 27 deletions(-) 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 = {