mirror of
https://github.com/Palakis/obs-websocket.git
synced 2024-08-30 18:12:16 +00:00
studio mode: Remove parts of Qt UI hacks
This commit is contained in:
parent
73302cb060
commit
fcf1fa8aff
65
Utils.cpp
65
Utils.cpp
@ -276,67 +276,8 @@ QLayout* Utils::GetPreviewLayout() {
|
|||||||
return main->findChild<QLayout*>("previewLayout");
|
return main->findChild<QLayout*>("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()->count();
|
|
||||||
blog(LOG_INFO, "preview layout children count : %d", previewChildCount);
|
|
||||||
|
|
||||||
return buttonToggledOn || (previewChildCount >= 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Utils::EnablePreviewMode() {
|
|
||||||
if (!IsPreviewModeActive())
|
|
||||||
GetPreviewModeButtonControl()->click();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Utils::DisablePreviewMode() {
|
|
||||||
if (IsPreviewModeActive())
|
|
||||||
GetPreviewModeButtonControl()->click();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Utils::TogglePreviewMode() {
|
|
||||||
GetPreviewModeButtonControl()->click();
|
|
||||||
}
|
|
||||||
|
|
||||||
obs_scene_t* Utils::GetPreviewScene() {
|
|
||||||
if (IsPreviewModeActive()) {
|
|
||||||
QListWidget* sceneList = GetSceneListControl();
|
|
||||||
QList<QListWidgetItem*> selected = sceneList->selectedItems();
|
|
||||||
|
|
||||||
// Qt::UserRole == QtUserRole::OBSRef
|
|
||||||
obs_scene_t* scene = Utils::SceneListItemToScene(selected.first());
|
|
||||||
|
|
||||||
obs_scene_addref(scene);
|
|
||||||
return scene;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool 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());
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Utils::TransitionToProgram() {
|
void Utils::TransitionToProgram() {
|
||||||
if (!IsPreviewModeActive())
|
if (!obs_frontend_preview_program_mode_active())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// WARNING : if the layout created in OBS' CreateProgramOptions() changes
|
// WARNING : if the layout created in OBS' CreateProgramOptions() changes
|
||||||
@ -517,13 +458,13 @@ bool Utils::ReplayBufferEnabled() {
|
|||||||
|
|
||||||
bool Utils::RPHotkeySet() {
|
bool Utils::RPHotkeySet() {
|
||||||
obs_output_t* rp_output = obs_frontend_get_replay_buffer_output();
|
obs_output_t* rp_output = obs_frontend_get_replay_buffer_output();
|
||||||
|
|
||||||
obs_data_t *hotkeys = obs_hotkeys_save_output(rp_output);
|
obs_data_t *hotkeys = obs_hotkeys_save_output(rp_output);
|
||||||
obs_data_array_t *bindings = obs_data_get_array(hotkeys,
|
obs_data_array_t *bindings = obs_data_get_array(hotkeys,
|
||||||
"ReplayBuffer.Save");
|
"ReplayBuffer.Save");
|
||||||
|
|
||||||
size_t count = obs_data_array_count(bindings);
|
size_t count = obs_data_array_count(bindings);
|
||||||
|
|
||||||
obs_data_array_release(bindings);
|
obs_data_array_release(bindings);
|
||||||
obs_data_release(hotkeys);
|
obs_data_release(hotkeys);
|
||||||
obs_output_release(rp_output);
|
obs_output_release(rp_output);
|
||||||
|
9
Utils.h
9
Utils.h
@ -44,7 +44,7 @@ class Utils {
|
|||||||
|
|
||||||
static obs_data_array_t* GetSceneCollections();
|
static obs_data_array_t* GetSceneCollections();
|
||||||
static obs_data_array_t* GetProfiles();
|
static obs_data_array_t* GetProfiles();
|
||||||
|
|
||||||
static QSpinBox* GetTransitionDurationControl();
|
static QSpinBox* GetTransitionDurationControl();
|
||||||
static int GetTransitionDuration();
|
static int GetTransitionDuration();
|
||||||
static void SetTransitionDuration(int ms);
|
static void SetTransitionDuration(int ms);
|
||||||
@ -56,13 +56,6 @@ class Utils {
|
|||||||
static QListWidget* GetSceneListControl();
|
static QListWidget* GetSceneListControl();
|
||||||
static obs_scene_t* SceneListItemToScene(QListWidgetItem* item);
|
static obs_scene_t* SceneListItemToScene(QListWidgetItem* item);
|
||||||
|
|
||||||
static bool IsPreviewModeActive();
|
|
||||||
static void EnablePreviewMode();
|
|
||||||
static void DisablePreviewMode();
|
|
||||||
static void TogglePreviewMode();
|
|
||||||
|
|
||||||
static obs_scene_t* GetPreviewScene();
|
|
||||||
static bool SetPreviewScene(const char* name);
|
|
||||||
static void TransitionToProgram();
|
static void TransitionToProgram();
|
||||||
|
|
||||||
static const char* OBSVersionString();
|
static const char* OBSVersionString();
|
||||||
|
15
WSEvents.cpp
15
WSEvents.cpp
@ -78,9 +78,6 @@ WSEvents::WSEvents(WSServer* srv) {
|
|||||||
connect(sceneList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
|
connect(sceneList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
|
||||||
this, SLOT(SelectedSceneChanged(QListWidgetItem*, QListWidgetItem*)));
|
this, SLOT(SelectedSceneChanged(QListWidgetItem*, QListWidgetItem*)));
|
||||||
|
|
||||||
QPushButton* modeSwitch = Utils::GetPreviewModeButtonControl();
|
|
||||||
connect(modeSwitch, SIGNAL(clicked(bool)), this, SLOT(ModeSwitchClicked(bool)));
|
|
||||||
|
|
||||||
transition_handler = nullptr;
|
transition_handler = nullptr;
|
||||||
scene_handler = nullptr;
|
scene_handler = nullptr;
|
||||||
|
|
||||||
@ -179,6 +176,12 @@ void WSEvents::FrontendEventHandler(enum obs_frontend_event event, void* private
|
|||||||
else if (event == OBS_FRONTEND_EVENT_REPLAY_BUFFER_STOPPED) {
|
else if (event == OBS_FRONTEND_EVENT_REPLAY_BUFFER_STOPPED) {
|
||||||
owner->OnReplayStopped();
|
owner->OnReplayStopped();
|
||||||
}
|
}
|
||||||
|
else if (event == OBS_FRONTEND_EVENT_STUDIO_MODE_ENABLED) {
|
||||||
|
owner->OnStudioModeSwitched(true);
|
||||||
|
}
|
||||||
|
else if (event == OBS_FRONTEND_EVENT_STUDIO_MODE_DISABLED) {
|
||||||
|
owner->OnStudioModeSwitched(false);
|
||||||
|
}
|
||||||
else if (event == OBS_FRONTEND_EVENT_EXIT) {
|
else if (event == OBS_FRONTEND_EVENT_EXIT) {
|
||||||
owner->OnExit();
|
owner->OnExit();
|
||||||
}
|
}
|
||||||
@ -303,7 +306,7 @@ void WSEvents::OnSceneChange() {
|
|||||||
|
|
||||||
// Dirty fix : OBS blocks signals when swapping scenes in Studio Mode
|
// Dirty fix : OBS blocks signals when swapping scenes in Studio Mode
|
||||||
// after transition end, so SelectedSceneChanged is never called...
|
// after transition end, so SelectedSceneChanged is never called...
|
||||||
if (Utils::IsPreviewModeActive()) {
|
if (obs_frontend_preview_program_mode_active()) {
|
||||||
QListWidget* list = Utils::GetSceneListControl();
|
QListWidget* list = Utils::GetSceneListControl();
|
||||||
SelectedSceneChanged(list->currentItem(), nullptr);
|
SelectedSceneChanged(list->currentItem(), nullptr);
|
||||||
}
|
}
|
||||||
@ -914,7 +917,7 @@ void WSEvents::OnSceneItemVisibilityChanged(void* param, calldata_t* data) {
|
|||||||
* @since 4.1.0
|
* @since 4.1.0
|
||||||
*/
|
*/
|
||||||
void WSEvents::SelectedSceneChanged(QListWidgetItem* current, QListWidgetItem* prev) {
|
void WSEvents::SelectedSceneChanged(QListWidgetItem* current, QListWidgetItem* prev) {
|
||||||
if (Utils::IsPreviewModeActive()) {
|
if (obs_frontend_preview_program_mode_active()) {
|
||||||
obs_scene_t* scene = Utils::SceneListItemToScene(current);
|
obs_scene_t* scene = Utils::SceneListItemToScene(current);
|
||||||
if (!scene) return;
|
if (!scene) return;
|
||||||
|
|
||||||
@ -942,7 +945,7 @@ void WSEvents::SelectedSceneChanged(QListWidgetItem* current, QListWidgetItem* p
|
|||||||
* @category studio mode
|
* @category studio mode
|
||||||
* @since 4.1.0
|
* @since 4.1.0
|
||||||
*/
|
*/
|
||||||
void WSEvents::ModeSwitchClicked(bool checked) {
|
void WSEvents::OnStudioModeSwitched(bool checked) {
|
||||||
obs_data_t* data = obs_data_create();
|
obs_data_t* data = obs_data_create();
|
||||||
obs_data_set_bool(data, "new-state", checked);
|
obs_data_set_bool(data, "new-state", checked);
|
||||||
|
|
||||||
|
@ -49,7 +49,6 @@ class WSEvents : public QObject {
|
|||||||
void TransitionDurationChanged(int ms);
|
void TransitionDurationChanged(int ms);
|
||||||
void SelectedSceneChanged(
|
void SelectedSceneChanged(
|
||||||
QListWidgetItem* current, QListWidgetItem* prev);
|
QListWidgetItem* current, QListWidgetItem* prev);
|
||||||
void ModeSwitchClicked(bool checked);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
WSServer* _srv;
|
WSServer* _srv;
|
||||||
@ -96,6 +95,8 @@ class WSEvents : public QObject {
|
|||||||
void OnReplayStopping();
|
void OnReplayStopping();
|
||||||
void OnReplayStopped();
|
void OnReplayStopped();
|
||||||
|
|
||||||
|
void OnStudioModeSwitched(bool enabled);
|
||||||
|
|
||||||
void OnExit();
|
void OnExit();
|
||||||
|
|
||||||
static void OnTransitionBegin(void* param, calldata_t* data);
|
static void OnTransitionBegin(void* param, calldata_t* data);
|
||||||
|
@ -40,7 +40,8 @@ WSRequestHandler::WSRequestHandler(QWebSocket* client) :
|
|||||||
_messageId(0),
|
_messageId(0),
|
||||||
_requestType(""),
|
_requestType(""),
|
||||||
data(nullptr),
|
data(nullptr),
|
||||||
_client(client) {
|
_client(client)
|
||||||
|
{
|
||||||
messageMap["GetVersion"] = WSRequestHandler::HandleGetVersion;
|
messageMap["GetVersion"] = WSRequestHandler::HandleGetVersion;
|
||||||
messageMap["GetAuthRequired"] = WSRequestHandler::HandleGetAuthRequired;
|
messageMap["GetAuthRequired"] = WSRequestHandler::HandleGetAuthRequired;
|
||||||
messageMap["Authenticate"] = WSRequestHandler::HandleAuthenticate;
|
messageMap["Authenticate"] = WSRequestHandler::HandleAuthenticate;
|
||||||
@ -68,7 +69,7 @@ WSRequestHandler::WSRequestHandler(QWebSocket* client) :
|
|||||||
|
|
||||||
messageMap["StartStopReplayBuffer"] = WSRequestHandler::HandleStartStopReplayBuffer;
|
messageMap["StartStopReplayBuffer"] = WSRequestHandler::HandleStartStopReplayBuffer;
|
||||||
messageMap["StartReplayBuffer"] = WSRequestHandler::HandleStartReplayBuffer;
|
messageMap["StartReplayBuffer"] = WSRequestHandler::HandleStartReplayBuffer;
|
||||||
messageMap["StopReplayBuffer"] = WSRequestHandler::HandleStopReplayBuffer;
|
messageMap["StopReplayBuffer"] = WSRequestHandler::HandleStopReplayBuffer;
|
||||||
messageMap["SaveReplayBuffer"] = WSRequestHandler::HandleSaveReplayBuffer;
|
messageMap["SaveReplayBuffer"] = WSRequestHandler::HandleSaveReplayBuffer;
|
||||||
|
|
||||||
messageMap["SetRecordingFolder"] = WSRequestHandler::HandleSetRecordingFolder;
|
messageMap["SetRecordingFolder"] = WSRequestHandler::HandleSetRecordingFolder;
|
||||||
@ -1581,7 +1582,7 @@ void WSRequestHandler::HandleListProfiles(WSRequestHandler* req) {
|
|||||||
* @since 4.1.0
|
* @since 4.1.0
|
||||||
*/
|
*/
|
||||||
void WSRequestHandler::HandleGetStudioModeStatus(WSRequestHandler* req) {
|
void WSRequestHandler::HandleGetStudioModeStatus(WSRequestHandler* req) {
|
||||||
bool previewActive = Utils::IsPreviewModeActive();
|
bool previewActive = obs_frontend_preview_program_mode_active();
|
||||||
|
|
||||||
obs_data_t* response = obs_data_create();
|
obs_data_t* response = obs_data_create();
|
||||||
obs_data_set_bool(response, "studio-mode", previewActive);
|
obs_data_set_bool(response, "studio-mode", previewActive);
|
||||||
@ -1603,25 +1604,21 @@ void WSRequestHandler::HandleGetStudioModeStatus(WSRequestHandler* req) {
|
|||||||
* @since 4.1.0
|
* @since 4.1.0
|
||||||
*/
|
*/
|
||||||
void WSRequestHandler::HandleGetPreviewScene(WSRequestHandler* req) {
|
void WSRequestHandler::HandleGetPreviewScene(WSRequestHandler* req) {
|
||||||
if (!Utils::IsPreviewModeActive()) {
|
if (!obs_frontend_preview_program_mode_active()) {
|
||||||
req->SendErrorResponse("studio mode not enabled");
|
req->SendErrorResponse("studio mode not enabled");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
obs_scene_t* preview_scene = Utils::GetPreviewScene();
|
obs_source_t* scene = obs_frontend_get_current_preview_scene();
|
||||||
obs_source_t* source = obs_scene_get_source(preview_scene);
|
obs_data_array_t* scene_items = Utils::GetSceneItems(scene);
|
||||||
const char* name = obs_source_get_name(source);
|
|
||||||
|
|
||||||
obs_data_array_t* scene_items = Utils::GetSceneItems(source);
|
|
||||||
|
|
||||||
obs_data_t* data = obs_data_create();
|
obs_data_t* data = obs_data_create();
|
||||||
obs_data_set_string(data, "name", name);
|
obs_data_set_string(data, "name", obs_source_get_name(scene));
|
||||||
obs_data_set_array(data, "sources", scene_items);
|
obs_data_set_array(data, "sources", scene_items);
|
||||||
|
|
||||||
req->SendOKResponse(data);
|
req->SendOKResponse(data);
|
||||||
obs_data_release(data);
|
obs_data_release(data);
|
||||||
obs_data_array_release(scene_items);
|
obs_data_array_release(scene_items);
|
||||||
obs_scene_release(preview_scene);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1636,7 +1633,7 @@ void WSRequestHandler::HandleGetPreviewScene(WSRequestHandler* req) {
|
|||||||
* @since 4.1.0
|
* @since 4.1.0
|
||||||
*/
|
*/
|
||||||
void WSRequestHandler::HandleSetPreviewScene(WSRequestHandler* req) {
|
void WSRequestHandler::HandleSetPreviewScene(WSRequestHandler* req) {
|
||||||
if (!Utils::IsPreviewModeActive()) {
|
if (!obs_frontend_preview_program_mode_active()) {
|
||||||
req->SendErrorResponse("studio mode not enabled");
|
req->SendErrorResponse("studio mode not enabled");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1647,11 +1644,16 @@ void WSRequestHandler::HandleSetPreviewScene(WSRequestHandler* req) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const char* scene_name = obs_data_get_string(req->data, "scene-name");
|
const char* scene_name = obs_data_get_string(req->data, "scene-name");
|
||||||
bool success = Utils::SetPreviewScene(scene_name);
|
obs_source_t* scene = Utils::GetSceneFromNameOrCurrent(scene_name);
|
||||||
if (success)
|
|
||||||
|
if (scene) {
|
||||||
|
obs_frontend_set_current_preview_scene(scene);
|
||||||
req->SendOKResponse();
|
req->SendOKResponse();
|
||||||
else
|
} else {
|
||||||
req->SendErrorResponse("specified scene doesn't exist");
|
req->SendErrorResponse("specified scene doesn't exist");
|
||||||
|
}
|
||||||
|
|
||||||
|
obs_source_release(scene);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1668,7 +1670,7 @@ void WSRequestHandler::HandleSetPreviewScene(WSRequestHandler* req) {
|
|||||||
* @since 4.1.0
|
* @since 4.1.0
|
||||||
*/
|
*/
|
||||||
void WSRequestHandler::HandleTransitionToProgram(WSRequestHandler* req) {
|
void WSRequestHandler::HandleTransitionToProgram(WSRequestHandler* req) {
|
||||||
if (!Utils::IsPreviewModeActive()) {
|
if (!obs_frontend_preview_program_mode_active()) {
|
||||||
req->SendErrorResponse("studio mode not enabled");
|
req->SendErrorResponse("studio mode not enabled");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1715,7 +1717,7 @@ void WSRequestHandler::HandleTransitionToProgram(WSRequestHandler* req) {
|
|||||||
* @since 4.1.0
|
* @since 4.1.0
|
||||||
*/
|
*/
|
||||||
void WSRequestHandler::HandleEnableStudioMode(WSRequestHandler* req) {
|
void WSRequestHandler::HandleEnableStudioMode(WSRequestHandler* req) {
|
||||||
Utils::EnablePreviewMode();
|
obs_frontend_set_preview_program_mode(true);
|
||||||
req->SendOKResponse();
|
req->SendOKResponse();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1728,7 +1730,7 @@ void WSRequestHandler::HandleEnableStudioMode(WSRequestHandler* req) {
|
|||||||
* @since 4.1.0
|
* @since 4.1.0
|
||||||
*/
|
*/
|
||||||
void WSRequestHandler::HandleDisableStudioMode(WSRequestHandler* req) {
|
void WSRequestHandler::HandleDisableStudioMode(WSRequestHandler* req) {
|
||||||
Utils::DisablePreviewMode();
|
obs_frontend_set_preview_program_mode(false);
|
||||||
req->SendOKResponse();
|
req->SendOKResponse();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1741,7 +1743,8 @@ void WSRequestHandler::HandleDisableStudioMode(WSRequestHandler* req) {
|
|||||||
* @since 4.1.0
|
* @since 4.1.0
|
||||||
*/
|
*/
|
||||||
void WSRequestHandler::HandleToggleStudioMode(WSRequestHandler* req) {
|
void WSRequestHandler::HandleToggleStudioMode(WSRequestHandler* req) {
|
||||||
Utils::TogglePreviewMode();
|
bool previewProgramMode = obs_frontend_preview_program_mode_active();
|
||||||
|
obs_frontend_set_preview_program_mode(!previewProgramMode);
|
||||||
req->SendOKResponse();
|
req->SendOKResponse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user