From 69c6714090458cc1dca56bee0e058f4d41158ef2 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Sat, 7 Feb 2015 08:09:57 -0800 Subject: [PATCH] UI: Make service settings use OK/Apply/Cancel Currently service settings are updated in real time via the properties view, which means that OK/Cancel/Apply have no effect. This fixes that by using the new type of properties view that operates only on settings data, not an object. --- obs/window-basic-main.cpp | 15 ++++- obs/window-basic-main.hpp | 8 ++- obs/window-basic-settings.cpp | 104 ++++++++++++++++++++++++---------- obs/window-basic-settings.hpp | 8 ++- 4 files changed, 96 insertions(+), 39 deletions(-) diff --git a/obs/window-basic-main.cpp b/obs/window-basic-main.cpp index 0e4473ee1..70eb0085a 100644 --- a/obs/window-basic-main.cpp +++ b/obs/window-basic-main.cpp @@ -326,6 +326,11 @@ bool OBSBasic::LoadService() { const char *type; + if (service) { + obs_service_destroy(service); + service = nullptr; + } + char serviceJsonPath[512]; int ret = os_get_config_path(serviceJsonPath, sizeof(serviceJsonPath), SERVICE_PATH); @@ -658,7 +663,6 @@ void OBSBasic::SaveProject() if (ret <= 0) return; - SaveService(); Save(savePath); } @@ -1330,6 +1334,13 @@ void OBSBasic::SetService(obs_service_t *newService) } } +bool OBSBasic::StreamingActive() +{ + if (!outputHandler) + return false; + return outputHandler->StreamingActive(); +} + #ifdef _WIN32 #define IS_WIN32 1 #else @@ -2237,8 +2248,6 @@ void OBSBasic::on_streamButton_clicked() if (outputHandler->StreamingActive()) { outputHandler->StopStreaming(); } else { - SaveService(); - if (outputHandler->StartStreaming(service)) { ui->streamButton->setEnabled(false); ui->streamButton->setText( diff --git a/obs/window-basic-main.hpp b/obs/window-basic-main.hpp index 145512aaf..68524bd17 100644 --- a/obs/window-basic-main.hpp +++ b/obs/window-basic-main.hpp @@ -99,9 +99,6 @@ private: void Save(const char *file); void Load(const char *file); - void SaveService(); - bool LoadService(); - bool InitService(); bool InitBasicConfigDefaults(); @@ -192,6 +189,8 @@ public: obs_service_t *GetService(); void SetService(obs_service_t *service); + bool StreamingActive(); + int ResetVideo(); bool ResetAudio(); @@ -217,6 +216,9 @@ public: return os_cpu_usage_info_query(cpuUsageInfo); } + void SaveService(); + bool LoadService(); + protected: virtual void closeEvent(QCloseEvent *event) override; virtual void changeEvent(QEvent *event) override; diff --git a/obs/window-basic-settings.cpp b/obs/window-basic-settings.cpp index c2d3262bf..7bd6430c6 100644 --- a/obs/window-basic-settings.cpp +++ b/obs/window-basic-settings.cpp @@ -114,6 +114,7 @@ void OBSBasicSettings::HookWidget(QWidget *widget, const char *signal, #define SCROLL_CHANGED SIGNAL(valueChanged(int)) #define GENERAL_CHANGED SLOT(GeneralChanged()) +#define STREAM1_CHANGED SLOT(Stream1Changed()) #define OUTPUTS_CHANGED SLOT(OutputsChanged()) #define AUDIO_RESTART SLOT(AudioChangedRestart()) #define AUDIO_CHANGED SLOT(AudioChanged()) @@ -132,6 +133,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent) HookWidget(ui->language, COMBO_CHANGED, GENERAL_CHANGED); HookWidget(ui->outputMode, COMBO_CHANGED, OUTPUTS_CHANGED); + HookWidget(ui->streamType, COMBO_CHANGED, STREAM1_CHANGED); HookWidget(ui->simpleOutputPath, EDIT_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->simpleOutputVBitrate, SCROLL_CHANGED, OUTPUTS_CHANGED); HookWidget(ui->simpleOutputABitrate, COMBO_CHANGED, OUTPUTS_CHANGED); @@ -207,7 +209,6 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent) EnableApplyButton(false); LoadServiceTypes(); - LoadServiceInfo(); LoadEncoderTypes(); LoadSettings(false); } @@ -273,23 +274,6 @@ void OBSBasicSettings::LoadServiceTypes() SetComboByValue(ui->streamType, type); } -void OBSBasicSettings::LoadServiceInfo() -{ - QLayout *layout = ui->streamContainer->layout(); - obs_service_t *service = main->GetService(); - obs_data_t *settings = obs_service_get_settings(service); - - delete streamProperties; - streamProperties = new OBSPropertiesView(settings, service, - (PropertiesReloadCallback)obs_service_properties, - (PropertiesUpdateCallback)obs_service_update, - 170); - - layout->addWidget(streamProperties); - - obs_data_release(settings); -} - #define TEXT_USE_STREAM_ENC \ QTStr("Basic.Settings.Output.Adv.Recording.UseStreamEncoder") @@ -343,6 +327,37 @@ void OBSBasicSettings::LoadGeneralSettings() loading = false; } +void OBSBasicSettings::LoadStream1Settings() +{ + QLayout *layout = ui->streamContainer->layout(); + obs_service_t *service = main->GetService(); + const char *type = obs_service_gettype(service); + + loading = true; + + obs_data_t *settings = obs_service_get_settings(service); + + delete streamProperties; + streamProperties = new OBSPropertiesView(settings, type, + (PropertiesReloadCallback)obs_get_service_properties, + 170); + + streamProperties->setProperty("changed", QVariant(false)); + layout->addWidget(streamProperties); + + QObject::connect(streamProperties, SIGNAL(Changed()), + this, STREAM1_CHANGED); + + obs_data_release(settings); + + loading = false; + + if (main->StreamingActive()) { + ui->streamType->setEnabled(false); + ui->streamContainer->setEnabled(false); + } +} + void OBSBasicSettings::LoadRendererList() { const char *renderer = config_get_string(GetGlobalConfig(), "Video", @@ -893,6 +908,8 @@ void OBSBasicSettings::LoadSettings(bool changedOnly) { if (!changedOnly || generalChanged) LoadGeneralSettings(); + if (!changedOnly || stream1Changed) + LoadStream1Settings(); if (!changedOnly || outputsChanged) LoadOutputSettings(); if (!changedOnly || audioChanged) @@ -912,6 +929,19 @@ void OBSBasicSettings::SaveGeneralSettings() language.c_str()); } +void OBSBasicSettings::SaveStream1Settings() +{ + QString streamType = GetComboData(ui->streamType); + + obs_service_t *newService = obs_service_create(QT_TO_UTF8(streamType), + "default_service", streamProperties->GetSettings()); + if (!newService) + return; + + main->SetService(newService); + main->SaveService(); +} + void OBSBasicSettings::SaveVideoSettings() { QString baseResolution = ui->baseResolution->currentText(); @@ -1102,6 +1132,8 @@ void OBSBasicSettings::SaveSettings() { if (generalChanged) SaveGeneralSettings(); + if (stream1Changed) + SaveStream1Settings(); if (outputsChanged) SaveOutputSettings(); if (audioChanged) @@ -1182,20 +1214,26 @@ void OBSBasicSettings::on_buttonBox_clicked(QAbstractButton *button) void OBSBasicSettings::on_streamType_currentIndexChanged(int idx) { - QString val = ui->streamType->itemData(idx).toString(); - obs_service_t *newService; - if (loading) return; + QLayout *layout = ui->streamContainer->layout(); + QString streamType = ui->streamType->itemData(idx).toString(); + obs_data_t *settings = obs_service_defaults(QT_TO_UTF8(streamType)); + delete streamProperties; - streamProperties = nullptr; + streamProperties = new OBSPropertiesView(settings, + QT_TO_UTF8(streamType), + (PropertiesReloadCallback)obs_get_service_properties, + 170); - newService = obs_service_create(QT_TO_UTF8(val), nullptr, nullptr); - if (newService) - main->SetService(newService); + streamProperties->setProperty("changed", QVariant(true)); + layout->addWidget(streamProperties); - LoadServiceInfo(); + QObject::connect(streamProperties, SIGNAL(Changed()), + this, STREAM1_CHANGED); + + obs_data_release(settings); } void OBSBasicSettings::on_simpleOutputBrowse_clicked() @@ -1266,11 +1304,6 @@ void OBSBasicSettings::on_advOutRecEncoder_currentIndexChanged(int idx) } } -static inline bool StreamExists(const char *name) -{ - return obs_get_service_by_name(name) != nullptr; -} - #define INVALID_RES_STR "Basic.Settings.Video.InvalidResolution" static bool ValidResolutions(Ui::OBSBasicSettings *ui) @@ -1310,6 +1343,15 @@ void OBSBasicSettings::GeneralChanged() } } +void OBSBasicSettings::Stream1Changed() +{ + if (!loading) { + stream1Changed = true; + sender()->setProperty("changed", QVariant(true)); + EnableApplyButton(true); + } +} + void OBSBasicSettings::OutputsChanged() { if (!loading) { diff --git a/obs/window-basic-settings.hpp b/obs/window-basic-settings.hpp index 177dd0e7b..003827da7 100644 --- a/obs/window-basic-settings.hpp +++ b/obs/window-basic-settings.hpp @@ -38,6 +38,7 @@ private: std::unique_ptr ui; bool generalChanged = false; + bool stream1Changed = false; bool outputsChanged = false; bool audioChanged = false; bool videoChanged = false; @@ -61,7 +62,7 @@ private: inline bool Changed() const { - return generalChanged || outputsChanged || + return generalChanged || outputsChanged || stream1Changed || audioChanged || videoChanged; } @@ -73,6 +74,7 @@ private: inline void ClearChanged() { generalChanged = false; + stream1Changed = false; outputsChanged = false; audioChanged = false; videoChanged = false; @@ -84,10 +86,10 @@ private: bool QueryChanges(); void LoadServiceTypes(); - void LoadServiceInfo(); void LoadEncoderTypes(); void LoadGeneralSettings(); + void LoadStream1Settings(); void LoadOutputSettings(); void LoadAudioSettings(); void LoadVideoSettings(); @@ -121,6 +123,7 @@ private: void LoadFPSData(); void SaveGeneralSettings(); + void SaveStream1Settings(); void SaveOutputSettings(); void SaveAudioSettings(); void SaveVideoSettings(); @@ -146,6 +149,7 @@ private slots: void AudioChanged(); void AudioChangedRestart(); void OutputsChanged(); + void Stream1Changed(); void VideoChanged(); void VideoChangedResolution(); void VideoChangedRestart();