mirror of
https://github.com/Palakis/obs-websocket.git
synced 2024-08-30 18:12:16 +00:00
Add SetPreviewScene request type and PreviewSceneChanged event
This commit is contained in:
parent
ff8eda3682
commit
b7df1e8596
46
Utils.cpp
46
Utils.cpp
@ -18,13 +18,12 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
||||
|
||||
#include "Utils.h"
|
||||
#include <obs-frontend-api.h>
|
||||
#include <obs.hpp>
|
||||
#include <QMainWindow>
|
||||
#include <QSpinBox>
|
||||
#include <QPushButton>
|
||||
#include <QListWidget>
|
||||
#include <QLayout>
|
||||
#include "obs-websocket.h"
|
||||
|
||||
Q_DECLARE_METATYPE(OBSScene);
|
||||
|
||||
obs_data_array_t* string_list_to_array(char** strings, char* key)
|
||||
{
|
||||
if (!strings)
|
||||
@ -247,6 +246,21 @@ QPushButton* Utils::GetPreviewModeButtonControl()
|
||||
return main->findChild<QPushButton*>("modeSwitch");
|
||||
}
|
||||
|
||||
QListWidget* Utils::GetSceneListControl()
|
||||
{
|
||||
QMainWindow* main = (QMainWindow*)obs_frontend_get_main_window();
|
||||
return main->findChild<QListWidget*>("scenes");
|
||||
}
|
||||
|
||||
obs_scene_t* Utils::SceneListItemToScene(QListWidgetItem* item)
|
||||
{
|
||||
if (!item)
|
||||
return nullptr;
|
||||
|
||||
QVariant item_data = item->data(static_cast<int>(Qt::UserRole));
|
||||
return item_data.value<OBSScene>();
|
||||
}
|
||||
|
||||
QLayout* Utils::GetPreviewLayout()
|
||||
{
|
||||
QMainWindow* main = (QMainWindow*)obs_frontend_get_main_window();
|
||||
@ -288,16 +302,32 @@ const char* Utils::GetPreviewSceneName()
|
||||
{
|
||||
if (IsPreviewModeActive())
|
||||
{
|
||||
QMainWindow* main = (QMainWindow*)obs_frontend_get_main_window();
|
||||
QListWidget* sceneList = main->findChild<QListWidget*>("scenes");
|
||||
QListWidget* sceneList = GetSceneListControl();
|
||||
|
||||
QString name = sceneList->selectedItems().first()->text();
|
||||
return name.toUtf8().constData();
|
||||
QList<QListWidgetItem*> selected = sceneList->selectedItems();
|
||||
blog(LOG_INFO, "GetPreviewSceneName: %d selected item(s)", selected.count());
|
||||
|
||||
// Qt::UserRole == QtUserRole::OBSRef
|
||||
obs_source_t* source = obs_scene_get_source(Utils::SceneListItemToScene(selected.first()));
|
||||
|
||||
return obs_source_get_name(source);
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void Utils::SetPreviewScene(const char* name)
|
||||
{
|
||||
if (IsPreviewModeActive())
|
||||
{
|
||||
QListWidget* sceneList = GetSceneListControl();
|
||||
QList<QListWidgetItem*> matchingItems = sceneList->findItems(name, Qt::MatchExactly);
|
||||
|
||||
if (matchingItems.count() > 0)
|
||||
sceneList->setCurrentItem(matchingItems.first());
|
||||
}
|
||||
}
|
||||
|
||||
void Utils::TransitionToProgram()
|
||||
{
|
||||
if (!IsPreviewModeActive())
|
||||
|
4
Utils.h
4
Utils.h
@ -22,6 +22,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
||||
#include <QSpinBox>
|
||||
#include <QPushButton>
|
||||
#include <QLayout>
|
||||
#include <QListWidget>
|
||||
#include <stdio.h>
|
||||
#include <obs-module.h>
|
||||
|
||||
@ -46,6 +47,8 @@ class Utils
|
||||
|
||||
static QPushButton* GetPreviewModeButtonControl();
|
||||
static QLayout* GetPreviewLayout();
|
||||
static QListWidget* GetSceneListControl();
|
||||
static obs_scene_t* SceneListItemToScene(QListWidgetItem* item);
|
||||
|
||||
static bool IsPreviewModeActive();
|
||||
static void EnablePreviewMode();
|
||||
@ -53,6 +56,7 @@ class Utils
|
||||
static void TogglePreviewMode();
|
||||
|
||||
static const char* GetPreviewSceneName();
|
||||
static void SetPreviewScene(const char* name);
|
||||
static void TransitionToProgram();
|
||||
|
||||
static const char* OBSVersionString();
|
||||
|
21
WSEvents.cpp
21
WSEvents.cpp
@ -68,6 +68,9 @@ WSEvents::WSEvents(WSServer *srv)
|
||||
connect(statusTimer, SIGNAL(timeout()), this, SLOT(StreamStatus()));
|
||||
statusTimer->start(2000); // equal to frontend's constant BITRATE_UPDATE_SECONDS
|
||||
|
||||
QListWidget* sceneList = Utils::GetSceneListControl();
|
||||
connect(sceneList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(SelectedSceneChanged(QListWidgetItem*, QListWidgetItem*)));
|
||||
|
||||
transition_handler = nullptr;
|
||||
scene_handler = nullptr;
|
||||
|
||||
@ -569,3 +572,21 @@ void WSEvents::OnSceneItemVisibilityChanged(void *param, calldata_t *data)
|
||||
|
||||
obs_data_release(fields);
|
||||
}
|
||||
|
||||
void WSEvents::SelectedSceneChanged(QListWidgetItem *current, QListWidgetItem *prev)
|
||||
{
|
||||
if (Utils::IsPreviewModeActive())
|
||||
{
|
||||
obs_scene_t* scene = Utils::SceneListItemToScene(current);
|
||||
if (!scene) return;
|
||||
|
||||
obs_source_t* scene_source = obs_scene_get_source(scene);
|
||||
|
||||
obs_data_t* data = obs_data_create();
|
||||
obs_data_set_string(data, "scene-name", obs_source_get_name(scene_source));
|
||||
|
||||
broadcastUpdate("PreviewSceneChanged", data);
|
||||
|
||||
obs_data_release(data);
|
||||
}
|
||||
}
|
@ -21,6 +21,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
||||
#define WSEVENTS_H
|
||||
|
||||
#include <obs-frontend-api.h>
|
||||
#include <QListWidgetItem>
|
||||
#include "WSServer.h"
|
||||
|
||||
class WSEvents : public QObject
|
||||
@ -43,6 +44,7 @@ class WSEvents : public QObject
|
||||
private Q_SLOTS:
|
||||
void StreamStatus();
|
||||
void TransitionDurationChanged(int ms);
|
||||
void SelectedSceneChanged(QListWidgetItem *current, QListWidgetItem *prev);
|
||||
void deferredInitOperations();
|
||||
|
||||
private:
|
||||
|
@ -72,6 +72,7 @@ WSRequestHandler::WSRequestHandler(QWebSocket *client) :
|
||||
messageMap["ListProfiles"] = WSRequestHandler::HandleListProfiles;
|
||||
|
||||
messageMap["GetStudioModeStatus"] = WSRequestHandler::HandleGetStudioModeStatus;
|
||||
messageMap["SetPreviewScene"] = WSRequestHandler::HandleSetPreviewScene;
|
||||
messageMap["EnableStudioMode"] = WSRequestHandler::HandleEnableStudioMode;
|
||||
messageMap["DisableStudioMode"] = WSRequestHandler::HandleDisableStudioMode;
|
||||
messageMap["ToggleStudioMode"] = WSRequestHandler::HandleToggleStudioMode;
|
||||
@ -759,8 +760,8 @@ void WSRequestHandler::HandleGetStudioModeStatus(WSRequestHandler *owner)
|
||||
obs_data_set_bool(response, "studio-mode", previewActive);
|
||||
|
||||
if (previewActive) {
|
||||
//const char* currentPreviewScene = Utils::GetPreviewSceneName();
|
||||
//obs_data_set_string(response, "preview-scene", currentPreviewScene);
|
||||
const char* currentPreviewScene = Utils::GetPreviewSceneName();
|
||||
obs_data_set_string(response, "preview-scene", currentPreviewScene);
|
||||
}
|
||||
|
||||
owner->SendOKResponse(response);
|
||||
@ -768,6 +769,20 @@ void WSRequestHandler::HandleGetStudioModeStatus(WSRequestHandler *owner)
|
||||
obs_data_release(response);
|
||||
}
|
||||
|
||||
void WSRequestHandler::HandleSetPreviewScene(WSRequestHandler *owner)
|
||||
{
|
||||
const char* scene_name = obs_data_get_string(owner->_requestData, "scene-name");
|
||||
if (!scene_name)
|
||||
{
|
||||
owner->SendErrorResponse("invalid request parameters");
|
||||
return;
|
||||
}
|
||||
|
||||
Utils::SetPreviewScene(scene_name);
|
||||
|
||||
owner->SendOKResponse();
|
||||
}
|
||||
|
||||
void WSRequestHandler::HandleEnableStudioMode(WSRequestHandler *owner)
|
||||
{
|
||||
Utils::EnablePreviewMode();
|
||||
|
@ -89,6 +89,7 @@ class WSRequestHandler : public QObject
|
||||
static void HandleGetTransitionDuration(WSRequestHandler *owner);
|
||||
|
||||
static void HandleGetStudioModeStatus(WSRequestHandler *owner);
|
||||
static void HandleSetPreviewScene(WSRequestHandler *owner);
|
||||
static void HandleEnableStudioMode(WSRequestHandler *owner);
|
||||
static void HandleDisableStudioMode(WSRequestHandler *owner);
|
||||
static void HandleToggleStudioMode(WSRequestHandler *owner);
|
||||
|
Loading…
x
Reference in New Issue
Block a user