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.
master
jp9000 2015-02-07 08:09:57 -08:00
parent 2ba5782fff
commit 69c6714090
4 changed files with 96 additions and 39 deletions

View File

@ -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(

View File

@ -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;

View File

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

View File

@ -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();