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();
};