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 "Utils.h"
#include <obs-frontend-api.h> #include <obs-frontend-api.h>
#include <obs.hpp>
#include <QMainWindow> #include <QMainWindow>
#include <QSpinBox>
#include <QPushButton>
#include <QListWidget>
#include <QLayout>
#include "obs-websocket.h" #include "obs-websocket.h"
Q_DECLARE_METATYPE(OBSScene);
obs_data_array_t* string_list_to_array(char** strings, char* key) obs_data_array_t* string_list_to_array(char** strings, char* key)
{ {
if (!strings) if (!strings)
@ -247,6 +246,21 @@ QPushButton* Utils::GetPreviewModeButtonControl()
return main->findChild<QPushButton*>("modeSwitch"); 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() QLayout* Utils::GetPreviewLayout()
{ {
QMainWindow* main = (QMainWindow*)obs_frontend_get_main_window(); QMainWindow* main = (QMainWindow*)obs_frontend_get_main_window();
@ -288,16 +302,32 @@ const char* Utils::GetPreviewSceneName()
{ {
if (IsPreviewModeActive()) if (IsPreviewModeActive())
{ {
QMainWindow* main = (QMainWindow*)obs_frontend_get_main_window(); QListWidget* sceneList = GetSceneListControl();
QListWidget* sceneList = main->findChild<QListWidget*>("scenes");
QString name = sceneList->selectedItems().first()->text(); QList<QListWidgetItem*> selected = sceneList->selectedItems();
return name.toUtf8().constData(); 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; 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() void Utils::TransitionToProgram()
{ {
if (!IsPreviewModeActive()) if (!IsPreviewModeActive())

View File

@ -22,6 +22,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
#include <QSpinBox> #include <QSpinBox>
#include <QPushButton> #include <QPushButton>
#include <QLayout> #include <QLayout>
#include <QListWidget>
#include <stdio.h> #include <stdio.h>
#include <obs-module.h> #include <obs-module.h>
@ -46,6 +47,8 @@ class Utils
static QPushButton* GetPreviewModeButtonControl(); static QPushButton* GetPreviewModeButtonControl();
static QLayout* GetPreviewLayout(); static QLayout* GetPreviewLayout();
static QListWidget* GetSceneListControl();
static obs_scene_t* SceneListItemToScene(QListWidgetItem* item);
static bool IsPreviewModeActive(); static bool IsPreviewModeActive();
static void EnablePreviewMode(); static void EnablePreviewMode();
@ -53,6 +56,7 @@ class Utils
static void TogglePreviewMode(); static void TogglePreviewMode();
static const char* GetPreviewSceneName(); static const char* GetPreviewSceneName();
static void SetPreviewScene(const char* name);
static void TransitionToProgram(); static void TransitionToProgram();
static const char* OBSVersionString(); static const char* OBSVersionString();

View File

@ -68,6 +68,9 @@ WSEvents::WSEvents(WSServer *srv)
connect(statusTimer, SIGNAL(timeout()), this, SLOT(StreamStatus())); connect(statusTimer, SIGNAL(timeout()), this, SLOT(StreamStatus()));
statusTimer->start(2000); // equal to frontend's constant BITRATE_UPDATE_SECONDS 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; transition_handler = nullptr;
scene_handler = nullptr; scene_handler = nullptr;
@ -568,4 +571,22 @@ void WSEvents::OnSceneItemVisibilityChanged(void *param, calldata_t *data)
instance->broadcastUpdate("SceneItemVisibilityChanged", fields); instance->broadcastUpdate("SceneItemVisibilityChanged", fields);
obs_data_release(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 #define WSEVENTS_H
#include <obs-frontend-api.h> #include <obs-frontend-api.h>
#include <QListWidgetItem>
#include "WSServer.h" #include "WSServer.h"
class WSEvents : public QObject class WSEvents : public QObject
@ -43,6 +44,7 @@ class WSEvents : public QObject
private Q_SLOTS: private Q_SLOTS:
void StreamStatus(); void StreamStatus();
void TransitionDurationChanged(int ms); void TransitionDurationChanged(int ms);
void SelectedSceneChanged(QListWidgetItem *current, QListWidgetItem *prev);
void deferredInitOperations(); void deferredInitOperations();
private: private:

View File

@ -72,6 +72,7 @@ WSRequestHandler::WSRequestHandler(QWebSocket *client) :
messageMap["ListProfiles"] = WSRequestHandler::HandleListProfiles; messageMap["ListProfiles"] = WSRequestHandler::HandleListProfiles;
messageMap["GetStudioModeStatus"] = WSRequestHandler::HandleGetStudioModeStatus; messageMap["GetStudioModeStatus"] = WSRequestHandler::HandleGetStudioModeStatus;
messageMap["SetPreviewScene"] = WSRequestHandler::HandleSetPreviewScene;
messageMap["EnableStudioMode"] = WSRequestHandler::HandleEnableStudioMode; messageMap["EnableStudioMode"] = WSRequestHandler::HandleEnableStudioMode;
messageMap["DisableStudioMode"] = WSRequestHandler::HandleDisableStudioMode; messageMap["DisableStudioMode"] = WSRequestHandler::HandleDisableStudioMode;
messageMap["ToggleStudioMode"] = WSRequestHandler::HandleToggleStudioMode; messageMap["ToggleStudioMode"] = WSRequestHandler::HandleToggleStudioMode;
@ -759,8 +760,8 @@ void WSRequestHandler::HandleGetStudioModeStatus(WSRequestHandler *owner)
obs_data_set_bool(response, "studio-mode", previewActive); obs_data_set_bool(response, "studio-mode", previewActive);
if (previewActive) { if (previewActive) {
//const char* currentPreviewScene = Utils::GetPreviewSceneName(); const char* currentPreviewScene = Utils::GetPreviewSceneName();
//obs_data_set_string(response, "preview-scene", currentPreviewScene); obs_data_set_string(response, "preview-scene", currentPreviewScene);
} }
owner->SendOKResponse(response); owner->SendOKResponse(response);
@ -768,6 +769,20 @@ void WSRequestHandler::HandleGetStudioModeStatus(WSRequestHandler *owner)
obs_data_release(response); 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) void WSRequestHandler::HandleEnableStudioMode(WSRequestHandler *owner)
{ {
Utils::EnablePreviewMode(); Utils::EnablePreviewMode();

View File

@ -89,6 +89,7 @@ class WSRequestHandler : public QObject
static void HandleGetTransitionDuration(WSRequestHandler *owner); static void HandleGetTransitionDuration(WSRequestHandler *owner);
static void HandleGetStudioModeStatus(WSRequestHandler *owner); static void HandleGetStudioModeStatus(WSRequestHandler *owner);
static void HandleSetPreviewScene(WSRequestHandler *owner);
static void HandleEnableStudioMode(WSRequestHandler *owner); static void HandleEnableStudioMode(WSRequestHandler *owner);
static void HandleDisableStudioMode(WSRequestHandler *owner); static void HandleDisableStudioMode(WSRequestHandler *owner);
static void HandleToggleStudioMode(WSRequestHandler *owner); static void HandleToggleStudioMode(WSRequestHandler *owner);