diff --git a/Utils.cpp b/Utils.cpp index 0ac75611..3693eaf1 100644 --- a/Utils.cpp +++ b/Utils.cpp @@ -20,6 +20,9 @@ with this program. If not, see #include #include #include +#include +#include +#include #include "obs-websocket.h" obs_data_array_t* string_list_to_array(char** strings, char* key) @@ -238,6 +241,83 @@ void Utils::SetTransitionDuration(int ms) } } +QPushButton* Utils::GetPreviewModeButtonControl() +{ + QMainWindow* main = (QMainWindow*)obs_frontend_get_main_window(); + return main->findChild("modeSwitch"); +} + +QLayout* Utils::GetPreviewLayout() +{ + QMainWindow* main = (QMainWindow*)obs_frontend_get_main_window(); + return main->findChild("previewLayout"); +} + +bool Utils::IsPreviewModeActive() +{ + QMainWindow* main = (QMainWindow*)obs_frontend_get_main_window(); + + // Clue 1 : "Studio Mode" button is toggled on + bool buttonToggledOn = GetPreviewModeButtonControl()->isChecked(); + + // Clue 2 : Preview layout has more than one item + int previewChildCount = GetPreviewLayout()->children().count(); + + return buttonToggledOn || (previewChildCount >= 2); +} + +void Utils::EnablePreviewMode() +{ + GetPreviewModeButtonControl()->setChecked(true); +} + +void Utils::DisablePreviewMode() +{ + GetPreviewModeButtonControl()->setChecked(false); +} + +void Utils::TogglePreviewMode() +{ + GetPreviewModeButtonControl()->toggle(); +} + +const char* Utils::GetPreviewSceneName() +{ + if (IsPreviewModeActive()) + { + QMainWindow* main = (QMainWindow*)obs_frontend_get_main_window(); + QListWidget* sceneList = main->findChild("scenes"); + + QString name = sceneList->selectedItems().first()->text(); + return name.toUtf8().constData(); + } + + return nullptr; +} + +void Utils::TransitionToProgram() +{ + if (!IsPreviewModeActive()) + return; + + // WARNING : if the layout created in OBS' CreateProgramOptions() changes + // then this won't work as expected + + // The program options widget is the second item in the left-to-right layout + QWidget* programOptions = GetPreviewLayout()->itemAt(1)->widget(); + + // The "Transition" button lies in the mainButtonLayout + // which is the first itemin the program options' layout + QLayout* mainButtonLayout = programOptions->layout()->itemAt(0)->layout(); + QWidget* transitionBtnWidget = mainButtonLayout->itemAt(0)->widget(); + + // Try to cast that widget into a button + QPushButton* transitionBtn = qobject_cast(transitionBtnWidget); + + // Perform a click on that button + transitionBtn->click(); +} + const char* Utils::OBSVersionString() { uint32_t version = obs_get_version(); diff --git a/Utils.h b/Utils.h index 91b22be7..d75aca48 100644 --- a/Utils.h +++ b/Utils.h @@ -20,6 +20,8 @@ with this program. If not, see #define UTILS_H #include +#include +#include #include #include @@ -42,6 +44,17 @@ class Utils static int GetTransitionDuration(); static void SetTransitionDuration(int ms); + static QPushButton* GetPreviewModeButtonControl(); + static QLayout* GetPreviewLayout(); + + static bool IsPreviewModeActive(); + static void EnablePreviewMode(); + static void DisablePreviewMode(); + static void TogglePreviewMode(); + + static const char* GetPreviewSceneName(); + static void TransitionToProgram(); + static const char* OBSVersionString(); };