Browse Source

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.
jp9000 10 years ago
parent
commit
69c6714090

+ 12 - 3
obs/window-basic-main.cpp

@@ -326,6 +326,11 @@ bool OBSBasic::LoadService()
 {
 {
 	const char *type;
 	const char *type;
 
 
+	if (service) {
+		obs_service_destroy(service);
+		service = nullptr;
+	}
+
 	char serviceJsonPath[512];
 	char serviceJsonPath[512];
 	int ret = os_get_config_path(serviceJsonPath, sizeof(serviceJsonPath),
 	int ret = os_get_config_path(serviceJsonPath, sizeof(serviceJsonPath),
 			SERVICE_PATH);
 			SERVICE_PATH);
@@ -658,7 +663,6 @@ void OBSBasic::SaveProject()
 	if (ret <= 0)
 	if (ret <= 0)
 		return;
 		return;
 
 
-	SaveService();
 	Save(savePath);
 	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
 #ifdef _WIN32
 #define IS_WIN32 1
 #define IS_WIN32 1
 #else
 #else
@@ -2237,8 +2248,6 @@ void OBSBasic::on_streamButton_clicked()
 	if (outputHandler->StreamingActive()) {
 	if (outputHandler->StreamingActive()) {
 		outputHandler->StopStreaming();
 		outputHandler->StopStreaming();
 	} else {
 	} else {
-		SaveService();
-
 		if (outputHandler->StartStreaming(service)) {
 		if (outputHandler->StartStreaming(service)) {
 			ui->streamButton->setEnabled(false);
 			ui->streamButton->setEnabled(false);
 			ui->streamButton->setText(
 			ui->streamButton->setText(

+ 5 - 3
obs/window-basic-main.hpp

@@ -99,9 +99,6 @@ private:
 	void          Save(const char *file);
 	void          Save(const char *file);
 	void          Load(const char *file);
 	void          Load(const char *file);
 
 
-	void          SaveService();
-	bool          LoadService();
-
 	bool          InitService();
 	bool          InitService();
 
 
 	bool          InitBasicConfigDefaults();
 	bool          InitBasicConfigDefaults();
@@ -192,6 +189,8 @@ public:
 	obs_service_t *GetService();
 	obs_service_t *GetService();
 	void          SetService(obs_service_t *service);
 	void          SetService(obs_service_t *service);
 
 
+	bool StreamingActive();
+
 	int  ResetVideo();
 	int  ResetVideo();
 	bool ResetAudio();
 	bool ResetAudio();
 
 
@@ -217,6 +216,9 @@ public:
 		return os_cpu_usage_info_query(cpuUsageInfo);
 		return os_cpu_usage_info_query(cpuUsageInfo);
 	}
 	}
 
 
+	void SaveService();
+	bool LoadService();
+
 protected:
 protected:
 	virtual void closeEvent(QCloseEvent *event) override;
 	virtual void closeEvent(QCloseEvent *event) override;
 	virtual void changeEvent(QEvent *event) override;
 	virtual void changeEvent(QEvent *event) override;

+ 73 - 31
obs/window-basic-settings.cpp

@@ -114,6 +114,7 @@ void OBSBasicSettings::HookWidget(QWidget *widget, const char *signal,
 #define SCROLL_CHANGED  SIGNAL(valueChanged(int))
 #define SCROLL_CHANGED  SIGNAL(valueChanged(int))
 
 
 #define GENERAL_CHANGED SLOT(GeneralChanged())
 #define GENERAL_CHANGED SLOT(GeneralChanged())
+#define STREAM1_CHANGED SLOT(Stream1Changed())
 #define OUTPUTS_CHANGED SLOT(OutputsChanged())
 #define OUTPUTS_CHANGED SLOT(OutputsChanged())
 #define AUDIO_RESTART   SLOT(AudioChangedRestart())
 #define AUDIO_RESTART   SLOT(AudioChangedRestart())
 #define AUDIO_CHANGED   SLOT(AudioChanged())
 #define AUDIO_CHANGED   SLOT(AudioChanged())
@@ -132,6 +133,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
 
 
 	HookWidget(ui->language,             COMBO_CHANGED,  GENERAL_CHANGED);
 	HookWidget(ui->language,             COMBO_CHANGED,  GENERAL_CHANGED);
 	HookWidget(ui->outputMode,           COMBO_CHANGED,  OUTPUTS_CHANGED);
 	HookWidget(ui->outputMode,           COMBO_CHANGED,  OUTPUTS_CHANGED);
+	HookWidget(ui->streamType,           COMBO_CHANGED,  STREAM1_CHANGED);
 	HookWidget(ui->simpleOutputPath,     EDIT_CHANGED,   OUTPUTS_CHANGED);
 	HookWidget(ui->simpleOutputPath,     EDIT_CHANGED,   OUTPUTS_CHANGED);
 	HookWidget(ui->simpleOutputVBitrate, SCROLL_CHANGED, OUTPUTS_CHANGED);
 	HookWidget(ui->simpleOutputVBitrate, SCROLL_CHANGED, OUTPUTS_CHANGED);
 	HookWidget(ui->simpleOutputABitrate, COMBO_CHANGED,  OUTPUTS_CHANGED);
 	HookWidget(ui->simpleOutputABitrate, COMBO_CHANGED,  OUTPUTS_CHANGED);
@@ -207,7 +209,6 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
 	EnableApplyButton(false);
 	EnableApplyButton(false);
 
 
 	LoadServiceTypes();
 	LoadServiceTypes();
-	LoadServiceInfo();
 	LoadEncoderTypes();
 	LoadEncoderTypes();
 	LoadSettings(false);
 	LoadSettings(false);
 }
 }
@@ -273,23 +274,6 @@ void OBSBasicSettings::LoadServiceTypes()
 	SetComboByValue(ui->streamType, type);
 	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 \
 #define TEXT_USE_STREAM_ENC \
 	QTStr("Basic.Settings.Output.Adv.Recording.UseStreamEncoder")
 	QTStr("Basic.Settings.Output.Adv.Recording.UseStreamEncoder")
 
 
@@ -343,6 +327,37 @@ void OBSBasicSettings::LoadGeneralSettings()
 	loading = false;
 	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()
 void OBSBasicSettings::LoadRendererList()
 {
 {
 	const char *renderer = config_get_string(GetGlobalConfig(), "Video",
 	const char *renderer = config_get_string(GetGlobalConfig(), "Video",
@@ -893,6 +908,8 @@ void OBSBasicSettings::LoadSettings(bool changedOnly)
 {
 {
 	if (!changedOnly || generalChanged)
 	if (!changedOnly || generalChanged)
 		LoadGeneralSettings();
 		LoadGeneralSettings();
+	if (!changedOnly || stream1Changed)
+		LoadStream1Settings();
 	if (!changedOnly || outputsChanged)
 	if (!changedOnly || outputsChanged)
 		LoadOutputSettings();
 		LoadOutputSettings();
 	if (!changedOnly || audioChanged)
 	if (!changedOnly || audioChanged)
@@ -912,6 +929,19 @@ void OBSBasicSettings::SaveGeneralSettings()
 				language.c_str());
 				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()
 void OBSBasicSettings::SaveVideoSettings()
 {
 {
 	QString baseResolution   = ui->baseResolution->currentText();
 	QString baseResolution   = ui->baseResolution->currentText();
@@ -1102,6 +1132,8 @@ void OBSBasicSettings::SaveSettings()
 {
 {
 	if (generalChanged)
 	if (generalChanged)
 		SaveGeneralSettings();
 		SaveGeneralSettings();
+	if (stream1Changed)
+		SaveStream1Settings();
 	if (outputsChanged)
 	if (outputsChanged)
 		SaveOutputSettings();
 		SaveOutputSettings();
 	if (audioChanged)
 	if (audioChanged)
@@ -1182,20 +1214,26 @@ void OBSBasicSettings::on_buttonBox_clicked(QAbstractButton *button)
 
 
 void OBSBasicSettings::on_streamType_currentIndexChanged(int idx)
 void OBSBasicSettings::on_streamType_currentIndexChanged(int idx)
 {
 {
-	QString val = ui->streamType->itemData(idx).toString();
-	obs_service_t *newService;
-
 	if (loading)
 	if (loading)
 		return;
 		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;
 	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()
 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"
 #define INVALID_RES_STR "Basic.Settings.Video.InvalidResolution"
 
 
 static bool ValidResolutions(Ui::OBSBasicSettings *ui)
 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()
 void OBSBasicSettings::OutputsChanged()
 {
 {
 	if (!loading) {
 	if (!loading) {

+ 6 - 2
obs/window-basic-settings.hpp

@@ -38,6 +38,7 @@ private:
 
 
 	std::unique_ptr<Ui::OBSBasicSettings> ui;
 	std::unique_ptr<Ui::OBSBasicSettings> ui;
 	bool generalChanged = false;
 	bool generalChanged = false;
+	bool stream1Changed = false;
 	bool outputsChanged = false;
 	bool outputsChanged = false;
 	bool audioChanged = false;
 	bool audioChanged = false;
 	bool videoChanged = false;
 	bool videoChanged = false;
@@ -61,7 +62,7 @@ private:
 
 
 	inline bool Changed() const
 	inline bool Changed() const
 	{
 	{
-		return generalChanged || outputsChanged ||
+		return generalChanged || outputsChanged || stream1Changed ||
 			audioChanged || videoChanged;
 			audioChanged || videoChanged;
 	}
 	}
 
 
@@ -73,6 +74,7 @@ private:
 	inline void ClearChanged()
 	inline void ClearChanged()
 	{
 	{
 		generalChanged = false;
 		generalChanged = false;
+		stream1Changed = false;
 		outputsChanged = false;
 		outputsChanged = false;
 		audioChanged   = false;
 		audioChanged   = false;
 		videoChanged   = false;
 		videoChanged   = false;
@@ -84,10 +86,10 @@ private:
 	bool QueryChanges();
 	bool QueryChanges();
 
 
 	void LoadServiceTypes();
 	void LoadServiceTypes();
-	void LoadServiceInfo();
 	void LoadEncoderTypes();
 	void LoadEncoderTypes();
 
 
 	void LoadGeneralSettings();
 	void LoadGeneralSettings();
+	void LoadStream1Settings();
 	void LoadOutputSettings();
 	void LoadOutputSettings();
 	void LoadAudioSettings();
 	void LoadAudioSettings();
 	void LoadVideoSettings();
 	void LoadVideoSettings();
@@ -121,6 +123,7 @@ private:
 	void LoadFPSData();
 	void LoadFPSData();
 
 
 	void SaveGeneralSettings();
 	void SaveGeneralSettings();
+	void SaveStream1Settings();
 	void SaveOutputSettings();
 	void SaveOutputSettings();
 	void SaveAudioSettings();
 	void SaveAudioSettings();
 	void SaveVideoSettings();
 	void SaveVideoSettings();
@@ -146,6 +149,7 @@ private slots:
 	void AudioChanged();
 	void AudioChanged();
 	void AudioChangedRestart();
 	void AudioChangedRestart();
 	void OutputsChanged();
 	void OutputsChanged();
+	void Stream1Changed();
 	void VideoChanged();
 	void VideoChanged();
 	void VideoChangedResolution();
 	void VideoChangedResolution();
 	void VideoChangedRestart();
 	void VideoChangedRestart();