studio mode: Remove parts of Qt UI hacks

This commit is contained in:
Palakis 2017-10-16 15:28:54 +02:00
parent 73302cb060
commit fcf1fa8aff
5 changed files with 37 additions and 96 deletions

View File

@ -276,67 +276,8 @@ QLayout* Utils::GetPreviewLayout() {
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() {
if (!IsPreviewModeActive())
if (!obs_frontend_preview_program_mode_active())
return;
// WARNING : if the layout created in OBS' CreateProgramOptions() changes
@ -517,13 +458,13 @@ bool Utils::ReplayBufferEnabled() {
bool Utils::RPHotkeySet() {
obs_output_t* rp_output = obs_frontend_get_replay_buffer_output();
obs_data_t *hotkeys = obs_hotkeys_save_output(rp_output);
obs_data_array_t *bindings = obs_data_get_array(hotkeys,
"ReplayBuffer.Save");
size_t count = obs_data_array_count(bindings);
obs_data_array_release(bindings);
obs_data_release(hotkeys);
obs_output_release(rp_output);

View File

@ -44,7 +44,7 @@ class Utils {
static obs_data_array_t* GetSceneCollections();
static obs_data_array_t* GetProfiles();
static QSpinBox* GetTransitionDurationControl();
static int GetTransitionDuration();
static void SetTransitionDuration(int ms);
@ -56,13 +56,6 @@ class Utils {
static QListWidget* GetSceneListControl();
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 const char* OBSVersionString();

View File

@ -78,9 +78,6 @@ WSEvents::WSEvents(WSServer* srv) {
connect(sceneList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
this, SLOT(SelectedSceneChanged(QListWidgetItem*, QListWidgetItem*)));
QPushButton* modeSwitch = Utils::GetPreviewModeButtonControl();
connect(modeSwitch, SIGNAL(clicked(bool)), this, SLOT(ModeSwitchClicked(bool)));
transition_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) {
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) {
owner->OnExit();
}
@ -303,7 +306,7 @@ void WSEvents::OnSceneChange() {
// Dirty fix : OBS blocks signals when swapping scenes in Studio Mode
// after transition end, so SelectedSceneChanged is never called...
if (Utils::IsPreviewModeActive()) {
if (obs_frontend_preview_program_mode_active()) {
QListWidget* list = Utils::GetSceneListControl();
SelectedSceneChanged(list->currentItem(), nullptr);
}
@ -914,7 +917,7 @@ void WSEvents::OnSceneItemVisibilityChanged(void* param, calldata_t* data) {
* @since 4.1.0
*/
void WSEvents::SelectedSceneChanged(QListWidgetItem* current, QListWidgetItem* prev) {
if (Utils::IsPreviewModeActive()) {
if (obs_frontend_preview_program_mode_active()) {
obs_scene_t* scene = Utils::SceneListItemToScene(current);
if (!scene) return;
@ -942,7 +945,7 @@ void WSEvents::SelectedSceneChanged(QListWidgetItem* current, QListWidgetItem* p
* @category studio mode
* @since 4.1.0
*/
void WSEvents::ModeSwitchClicked(bool checked) {
void WSEvents::OnStudioModeSwitched(bool checked) {
obs_data_t* data = obs_data_create();
obs_data_set_bool(data, "new-state", checked);

View File

@ -49,7 +49,6 @@ class WSEvents : public QObject {
void TransitionDurationChanged(int ms);
void SelectedSceneChanged(
QListWidgetItem* current, QListWidgetItem* prev);
void ModeSwitchClicked(bool checked);
private:
WSServer* _srv;
@ -96,6 +95,8 @@ class WSEvents : public QObject {
void OnReplayStopping();
void OnReplayStopped();
void OnStudioModeSwitched(bool enabled);
void OnExit();
static void OnTransitionBegin(void* param, calldata_t* data);

View File

@ -40,7 +40,8 @@ WSRequestHandler::WSRequestHandler(QWebSocket* client) :
_messageId(0),
_requestType(""),
data(nullptr),
_client(client) {
_client(client)
{
messageMap["GetVersion"] = WSRequestHandler::HandleGetVersion;
messageMap["GetAuthRequired"] = WSRequestHandler::HandleGetAuthRequired;
messageMap["Authenticate"] = WSRequestHandler::HandleAuthenticate;
@ -68,7 +69,7 @@ WSRequestHandler::WSRequestHandler(QWebSocket* client) :
messageMap["StartStopReplayBuffer"] = WSRequestHandler::HandleStartStopReplayBuffer;
messageMap["StartReplayBuffer"] = WSRequestHandler::HandleStartReplayBuffer;
messageMap["StopReplayBuffer"] = WSRequestHandler::HandleStopReplayBuffer;
messageMap["StopReplayBuffer"] = WSRequestHandler::HandleStopReplayBuffer;
messageMap["SaveReplayBuffer"] = WSRequestHandler::HandleSaveReplayBuffer;
messageMap["SetRecordingFolder"] = WSRequestHandler::HandleSetRecordingFolder;
@ -1581,7 +1582,7 @@ void WSRequestHandler::HandleListProfiles(WSRequestHandler* req) {
* @since 4.1.0
*/
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_set_bool(response, "studio-mode", previewActive);
@ -1603,25 +1604,21 @@ void WSRequestHandler::HandleGetStudioModeStatus(WSRequestHandler* req) {
* @since 4.1.0
*/
void WSRequestHandler::HandleGetPreviewScene(WSRequestHandler* req) {
if (!Utils::IsPreviewModeActive()) {
if (!obs_frontend_preview_program_mode_active()) {
req->SendErrorResponse("studio mode not enabled");
return;
}
obs_scene_t* preview_scene = Utils::GetPreviewScene();
obs_source_t* source = obs_scene_get_source(preview_scene);
const char* name = obs_source_get_name(source);
obs_data_array_t* scene_items = Utils::GetSceneItems(source);
obs_source_t* scene = obs_frontend_get_current_preview_scene();
obs_data_array_t* scene_items = Utils::GetSceneItems(scene);
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);
req->SendOKResponse(data);
obs_data_release(data);
obs_data_array_release(scene_items);
obs_scene_release(preview_scene);
}
/**
@ -1636,7 +1633,7 @@ void WSRequestHandler::HandleGetPreviewScene(WSRequestHandler* req) {
* @since 4.1.0
*/
void WSRequestHandler::HandleSetPreviewScene(WSRequestHandler* req) {
if (!Utils::IsPreviewModeActive()) {
if (!obs_frontend_preview_program_mode_active()) {
req->SendErrorResponse("studio mode not enabled");
return;
}
@ -1647,11 +1644,16 @@ void WSRequestHandler::HandleSetPreviewScene(WSRequestHandler* req) {
}
const char* scene_name = obs_data_get_string(req->data, "scene-name");
bool success = Utils::SetPreviewScene(scene_name);
if (success)
obs_source_t* scene = Utils::GetSceneFromNameOrCurrent(scene_name);
if (scene) {
obs_frontend_set_current_preview_scene(scene);
req->SendOKResponse();
else
} else {
req->SendErrorResponse("specified scene doesn't exist");
}
obs_source_release(scene);
}
/**
@ -1668,7 +1670,7 @@ void WSRequestHandler::HandleSetPreviewScene(WSRequestHandler* req) {
* @since 4.1.0
*/
void WSRequestHandler::HandleTransitionToProgram(WSRequestHandler* req) {
if (!Utils::IsPreviewModeActive()) {
if (!obs_frontend_preview_program_mode_active()) {
req->SendErrorResponse("studio mode not enabled");
return;
}
@ -1715,7 +1717,7 @@ void WSRequestHandler::HandleTransitionToProgram(WSRequestHandler* req) {
* @since 4.1.0
*/
void WSRequestHandler::HandleEnableStudioMode(WSRequestHandler* req) {
Utils::EnablePreviewMode();
obs_frontend_set_preview_program_mode(true);
req->SendOKResponse();
}
@ -1728,7 +1730,7 @@ void WSRequestHandler::HandleEnableStudioMode(WSRequestHandler* req) {
* @since 4.1.0
*/
void WSRequestHandler::HandleDisableStudioMode(WSRequestHandler* req) {
Utils::DisablePreviewMode();
obs_frontend_set_preview_program_mode(false);
req->SendOKResponse();
}
@ -1741,7 +1743,8 @@ void WSRequestHandler::HandleDisableStudioMode(WSRequestHandler* req) {
* @since 4.1.0
*/
void WSRequestHandler::HandleToggleStudioMode(WSRequestHandler* req) {
Utils::TogglePreviewMode();
bool previewProgramMode = obs_frontend_preview_program_mode_active();
obs_frontend_set_preview_program_mode(!previewProgramMode);
req->SendOKResponse();
}