Add SetPreviewScene request type and PreviewSceneChanged event

This commit is contained in:
Palakis 2017-04-19 13:43:58 +02:00
parent ff8eda3682
commit b7df1e8596
6 changed files with 83 additions and 10 deletions

View File

@ -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())

View File

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

View File

@ -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;
@ -568,4 +571,22 @@ void WSEvents::OnSceneItemVisibilityChanged(void *param, calldata_t *data)
instance->broadcastUpdate("SceneItemVisibilityChanged", fields);
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);
}
}

View File

@ -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:

View File

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

View File

@ -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);