From 9e4761347d66fe0ae98d39c179b37d21d32a8591 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Mon, 25 Jan 2016 05:25:16 -0800 Subject: [PATCH] UI: Fix a case where output res. stays invalid If the base resolution is set to an invalid resolution, it would cause the output resolution to automatically change to an invalid resolution. After the invalid resolution was set for the output resolution, it would stay at that invalid resolution. This fixes it so it always tries to find the output resolution closest to what was last actually set or actually edited. --- obs/window-basic-settings.cpp | 49 ++++++++++++++++++++++++++--------- obs/window-basic-settings.hpp | 9 +++++-- 2 files changed, 44 insertions(+), 14 deletions(-) diff --git a/obs/window-basic-settings.cpp b/obs/window-basic-settings.cpp index 8f1a769b..8d3a5d2b 100644 --- a/obs/window-basic-settings.cpp +++ b/obs/window-basic-settings.cpp @@ -829,8 +829,7 @@ static const double vals[] = static const size_t numVals = sizeof(vals)/sizeof(double); -void OBSBasicSettings::ResetDownscales(uint32_t cx, uint32_t cy, - uint32_t out_cx, uint32_t out_cy) +void OBSBasicSettings::ResetDownscales(uint32_t cx, uint32_t cy) { QString advRescale; QString advRecRescale; @@ -838,11 +837,14 @@ void OBSBasicSettings::ResetDownscales(uint32_t cx, uint32_t cy, QString oldOutputRes; string bestScale; int bestPixelDiff = 0x7FFFFFFF; + uint32_t out_cx = outputCX; + uint32_t out_cy = outputCY; advRescale = ui->advOutRescale->lineEdit()->text(); advRecRescale = ui->advOutRecRescale->lineEdit()->text(); advFFRescale = ui->advOutFFRescale->lineEdit()->text(); - oldOutputRes = ui->outputResolution->lineEdit()->text(); + + ui->outputResolution->blockSignals(true); ui->outputResolution->clear(); ui->advOutRescale->clear(); @@ -852,6 +854,10 @@ void OBSBasicSettings::ResetDownscales(uint32_t cx, uint32_t cy, if (!out_cx || !out_cy) { out_cx = cx; out_cy = cy; + oldOutputRes = ui->baseResolution->lineEdit()->text(); + } else { + oldOutputRes = QString::number(out_cx) + "x" + + QString::number(out_cy); } for (size_t idx = 0; idx < numVals; idx++) { @@ -894,6 +900,8 @@ void OBSBasicSettings::ResetDownscales(uint32_t cx, uint32_t cy, else ui->outputResolution->lineEdit()->setText(bestScale.c_str()); + ui->outputResolution->blockSignals(false); + if (advRescale.isEmpty()) advRescale = res.c_str(); if (advRecRescale.isEmpty()) @@ -946,11 +954,14 @@ void OBSBasicSettings::LoadResolutionLists() ui->baseResolution->addItem(res.c_str()); } - ResetDownscales(cx, cy, out_cx, out_cy); + string outputResString = ResString(out_cx, out_cy); ui->baseResolution->lineEdit()->setText(ResString(cx, cy).c_str()); - ui->outputResolution->lineEdit()->setText( - ResString(out_cx, out_cy).c_str()); + + RecalcOutputResPixels(outputResString.c_str()); + ResetDownscales(cx, cy); + + ui->outputResolution->lineEdit()->setText(outputResString.c_str()); } static inline void LoadFPSCommon(OBSBasic *main, Ui::OBSBasicSettings *ui) @@ -2617,18 +2628,32 @@ static bool ValidResolutions(Ui::OBSBasicSettings *ui) return true; } +void OBSBasicSettings::RecalcOutputResPixels(const char *resText) +{ + uint32_t newCX; + uint32_t newCY; + + ConvertResText(resText, newCX, newCY); + if (newCX && newCY) { + outputCX = newCX; + outputCY = newCY; + } +} + +void OBSBasicSettings::on_outputResolution_editTextChanged(const QString &text) +{ + if (!loading) + RecalcOutputResPixels(QT_TO_UTF8(text)); +} + void OBSBasicSettings::on_baseResolution_editTextChanged(const QString &text) { if (!loading && ValidResolutions(ui.get())) { QString baseResolution = text; - uint32_t cx, cy, out_cx, out_cy; + uint32_t cx, cy; ConvertResText(QT_TO_UTF8(baseResolution), cx, cy); - - QString outRes = ui->outputResolution->lineEdit()->text(); - ConvertResText(QT_TO_UTF8(outRes), out_cx, out_cy); - - ResetDownscales(cx, cy, out_cx, out_cy); + ResetDownscales(cx, cy); } } diff --git a/obs/window-basic-settings.hpp b/obs/window-basic-settings.hpp index 96be12d1..8a592897 100644 --- a/obs/window-basic-settings.hpp +++ b/obs/window-basic-settings.hpp @@ -121,6 +121,9 @@ private: OBSSignal hotkeyRegistered; OBSSignal hotkeyUnregistered; + uint32_t outputCX = 0; + uint32_t outputCY = 0; + void SaveCombo(QComboBox *widget, const char *section, const char *value); void SaveComboData(QComboBox *widget, const char *section, @@ -210,8 +213,7 @@ private: /* video */ void LoadRendererList(); - void ResetDownscales(uint32_t cx, uint32_t cy, - uint32_t out_cx, uint32_t out_cy); + void ResetDownscales(uint32_t cx, uint32_t cy); void LoadDownscaleFilters(); void LoadResolutionLists(); void LoadFPSData(); @@ -230,6 +232,8 @@ private: void FillSimpleRecordingValues(); + void RecalcOutputResPixels(const char *resText); + private slots: void on_theme_activated(int idx); @@ -249,6 +253,7 @@ private slots: void on_colorFormat_currentIndexChanged(const QString &text); + void on_outputResolution_editTextChanged(const QString &text); void on_baseResolution_editTextChanged(const QString &text); void GeneralChanged(); -- GitLab