From 4113f9452873f83b94d8863d7fb716a4c48e9a0e Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Thu, 23 Jun 2022 19:45:34 +0200 Subject: [PATCH] Add condition to check current profile --- CMakeLists.txt | 2 + data/locale/en-US.ini | 2 + src/headers/macro-condition-profile.hpp | 53 ++++++++++++++++ src/headers/utility.hpp | 1 + src/macro-action-profile.cpp | 16 ----- src/macro-condition-profile.cpp | 83 +++++++++++++++++++++++++ src/utility.cpp | 16 +++++ 7 files changed, 157 insertions(+), 16 deletions(-) create mode 100644 src/headers/macro-condition-profile.hpp create mode 100644 src/macro-condition-profile.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 0be100b0..d256919e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -234,6 +234,7 @@ set(advanced-scene-switcher_HEADERS src/headers/macro-condition-obs-stats.hpp src/headers/macro-condition-plugin-state.hpp src/headers/macro-condition-process.hpp + src/headers/macro-condition-profile.hpp src/headers/macro-condition-recording.hpp src/headers/macro-condition-replay-buffer.hpp src/headers/macro-condition-scene-order.hpp @@ -340,6 +341,7 @@ set(advanced-scene-switcher_SOURCES src/macro-condition-obs-stats.cpp src/macro-condition-plugin-state.cpp src/macro-condition-process.cpp + src/macro-condition-profile.cpp src/macro-condition-recording.cpp src/macro-condition-replay-buffer.cpp src/macro-condition-scene-order.cpp diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 489b8904..496e2b6b 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -322,6 +322,8 @@ AdvSceneSwitcher.condition.stats.condition.equals="equal to" AdvSceneSwitcher.condition.stats.condition.below="below" AdvSceneSwitcher.condition.stats.dockHint="You can open the \"Stats\" dock to view the current status" AdvSceneSwitcher.condition.stats.entry="{{stats}} is {{condition}} {{value}}" +AdvSceneSwitcher.condition.profile="Profile" +AdvSceneSwitcher.condition.profile.entry="Current active profile is {{profiles}}" ; Macro Actions AdvSceneSwitcher.action.switchScene="Switch scene" diff --git a/src/headers/macro-condition-profile.hpp b/src/headers/macro-condition-profile.hpp new file mode 100644 index 00000000..42ff1910 --- /dev/null +++ b/src/headers/macro-condition-profile.hpp @@ -0,0 +1,53 @@ +#pragma once +#include "macro.hpp" +#include +#include + +class MacroConditionProfile : public MacroCondition { +public: + MacroConditionProfile(Macro *m) : MacroCondition(m) {} + bool CheckCondition(); + bool Save(obs_data_t *obj); + bool Load(obs_data_t *obj); + std::string GetShortDesc(); + std::string GetId() { return id; }; + static std::shared_ptr Create(Macro *m) + { + return std::make_shared(m); + } + + std::string _profile; + +private: + static bool _registered; + static const std::string id; +}; + +class MacroConditionProfileEdit : public QWidget { + Q_OBJECT + +public: + MacroConditionProfileEdit( + QWidget *parent, + std::shared_ptr cond = nullptr); + void UpdateEntryData(); + static QWidget *Create(QWidget *parent, + std::shared_ptr cond) + { + return new MacroConditionProfileEdit( + parent, + std::dynamic_pointer_cast(cond)); + } + +private slots: + void ProfileChanged(const QString &text); +signals: + void HeaderInfoChanged(const QString &); + +protected: + QComboBox *_profiles; + std::shared_ptr _entryData; + +private: + bool _loading = true; +}; diff --git a/src/headers/utility.hpp b/src/headers/utility.hpp index aff6bbc3..2e2629ab 100644 --- a/src/headers/utility.hpp +++ b/src/headers/utility.hpp @@ -81,5 +81,6 @@ void populateSceneItemSelection(QComboBox *list, OBSWeakSource sceneWeakSource = nullptr); void populateSceneItemSelection(QComboBox *list, SceneSelection &s); void populateSourceGroupSelection(QComboBox *list); +void populateProfileSelection(QComboBox *list); bool windowPosValid(QPoint pos); bool doubleEquals(double left, double right, double epsilon); diff --git a/src/macro-action-profile.cpp b/src/macro-action-profile.cpp index a0d9fa49..1847971c 100644 --- a/src/macro-action-profile.cpp +++ b/src/macro-action-profile.cpp @@ -39,22 +39,6 @@ std::string MacroActionProfile::GetShortDesc() return _profile; } -void populateProfileSelection(QComboBox *box) -{ - auto profiles = obs_frontend_get_profiles(); - char **temp = profiles; - while (*temp) { - const char *name = *temp; - box->addItem(name); - temp++; - } - bfree(profiles); - box->model()->sort(0); - addSelectionEntry( - box, obs_module_text("AdvSceneSwitcher.selectProfile"), false); - box->setCurrentIndex(0); -} - MacroActionProfileEdit::MacroActionProfileEdit( QWidget *parent, std::shared_ptr entryData) : QWidget(parent) diff --git a/src/macro-condition-profile.cpp b/src/macro-condition-profile.cpp new file mode 100644 index 00000000..5c0cbfbc --- /dev/null +++ b/src/macro-condition-profile.cpp @@ -0,0 +1,83 @@ +#include "headers/macro-condition-edit.hpp" +#include "headers/macro-condition-profile.hpp" +#include "headers/utility.hpp" +#include "headers/advanced-scene-switcher.hpp" + +const std::string MacroConditionProfile::id = "profile"; + +bool MacroConditionProfile::_registered = MacroConditionFactory::Register( + MacroConditionProfile::id, + {MacroConditionProfile::Create, MacroConditionProfileEdit::Create, + "AdvSceneSwitcher.condition.profile"}); + +bool MacroConditionProfile::CheckCondition() +{ + auto currentProfile = obs_frontend_get_current_profile(); + const bool match = _profile == currentProfile; + bfree(currentProfile); + return match; +} + +bool MacroConditionProfile::Save(obs_data_t *obj) +{ + MacroCondition::Save(obj); + obs_data_set_string(obj, "profile", _profile.c_str()); + return true; +} + +bool MacroConditionProfile::Load(obs_data_t *obj) +{ + MacroCondition::Load(obj); + _profile = obs_data_get_string(obj, "profile"); + return true; +} + +std::string MacroConditionProfile::GetShortDesc() +{ + return _profile; +} + +MacroConditionProfileEdit::MacroConditionProfileEdit( + QWidget *parent, std::shared_ptr entryData) + : QWidget(parent), _profiles(new QComboBox()) +{ + populateProfileSelection(_profiles); + QWidget::connect(_profiles, SIGNAL(currentTextChanged(const QString &)), + this, SLOT(ProfileChanged(const QString &))); + + QHBoxLayout *mainLayout = new QHBoxLayout; + + std::unordered_map widgetPlaceholders = { + {"{{profiles}}", _profiles}, + }; + + placeWidgets( + obs_module_text("AdvSceneSwitcher.condition.profile.entry"), + mainLayout, widgetPlaceholders); + setLayout(mainLayout); + + _entryData = entryData; + UpdateEntryData(); + _loading = false; +} + +void MacroConditionProfileEdit::ProfileChanged(const QString &text) +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_profile = text.toStdString(); + emit HeaderInfoChanged( + QString::fromStdString(_entryData->GetShortDesc())); +} + +void MacroConditionProfileEdit::UpdateEntryData() +{ + if (!_entryData) { + return; + } + + _profiles->setCurrentText(QString::fromStdString(_entryData->_profile)); +} diff --git a/src/utility.cpp b/src/utility.cpp index 26953277..004be184 100644 --- a/src/utility.cpp +++ b/src/utility.cpp @@ -885,6 +885,22 @@ void populateSourceGroupSelection(QComboBox *list) list->setCurrentIndex(0); } +void populateProfileSelection(QComboBox *box) +{ + auto profiles = obs_frontend_get_profiles(); + char **temp = profiles; + while (*temp) { + const char *name = *temp; + box->addItem(name); + temp++; + } + bfree(profiles); + box->model()->sort(0); + addSelectionEntry( + box, obs_module_text("AdvSceneSwitcher.selectProfile"), false); + box->setCurrentIndex(0); +} + bool windowPosValid(QPoint pos) { return !!QGuiApplication::screenAt(pos);