瀏覽代碼

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 年之前
父節點
當前提交
69c6714090
共有 4 個文件被更改,包括 96 次插入39 次删除
  1. 12 3
      obs/window-basic-main.cpp
  2. 5 3
      obs/window-basic-main.hpp
  3. 73 31
      obs/window-basic-settings.cpp
  4. 6 2
      obs/window-basic-settings.hpp

+ 12 - 3
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(

+ 5 - 3
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;

+ 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 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) {

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

@@ -38,6 +38,7 @@ private:
 
 	std::unique_ptr<Ui::OBSBasicSettings> 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();