mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-02-28 20:36:59 -05:00
UI: Add service res/fps limitation support to settings
Allows services to limit and enforce resolution and framerate values the user can select in the UI if "ignore service recommendations" is not checked. If the "ignore service recommendations" option is not checked, the user will not be able to select or use a resolution and/or framerate in the user interface that the service does not support. If "ignore service recommendations" is checked, it will work as it normally would, allowing any value to be used as per normal. Fortunately, and hopefully for the foreseeable future, there is only one service that enforces resolutions and framerates.
This commit is contained in:
@@ -1365,14 +1365,17 @@ void OBSBasicSettings::ResetDownscales(uint32_t cx, uint32_t cy,
|
||||
advRecRescale = ui->advOutRecRescale->lineEdit()->text();
|
||||
advFFRescale = ui->advOutFFRescale->lineEdit()->text();
|
||||
|
||||
ui->outputResolution->blockSignals(true);
|
||||
bool lockedOutputRes = !ui->outputResolution->isEditable();
|
||||
|
||||
if (!lockedOutputRes) {
|
||||
ui->outputResolution->blockSignals(true);
|
||||
ui->outputResolution->clear();
|
||||
}
|
||||
if (ignoreAllSignals) {
|
||||
ui->advOutRescale->blockSignals(true);
|
||||
ui->advOutRecRescale->blockSignals(true);
|
||||
ui->advOutFFRescale->blockSignals(true);
|
||||
}
|
||||
ui->outputResolution->clear();
|
||||
ui->advOutRescale->clear();
|
||||
ui->advOutRecRescale->clear();
|
||||
ui->advOutFFRescale->clear();
|
||||
@@ -1399,7 +1402,8 @@ void OBSBasicSettings::ResetDownscales(uint32_t cx, uint32_t cy,
|
||||
|
||||
string res = ResString(downscaleCX, downscaleCY);
|
||||
string outRes = ResString(outDownscaleCX, outDownscaleCY);
|
||||
ui->outputResolution->addItem(res.c_str());
|
||||
if (!lockedOutputRes)
|
||||
ui->outputResolution->addItem(res.c_str());
|
||||
ui->advOutRescale->addItem(outRes.c_str());
|
||||
ui->advOutRecRescale->addItem(outRes.c_str());
|
||||
ui->advOutFFRescale->addItem(outRes.c_str());
|
||||
@@ -1418,23 +1422,27 @@ void OBSBasicSettings::ResetDownscales(uint32_t cx, uint32_t cy,
|
||||
|
||||
string res = ResString(cx, cy);
|
||||
|
||||
float baseAspect = float(cx) / float(cy);
|
||||
float outputAspect = float(out_cx) / float(out_cy);
|
||||
if (!lockedOutputRes) {
|
||||
float baseAspect = float(cx) / float(cy);
|
||||
float outputAspect = float(out_cx) / float(out_cy);
|
||||
bool closeAspect = close_float(baseAspect, outputAspect, 0.01f);
|
||||
|
||||
bool closeAspect = close_float(baseAspect, outputAspect, 0.01f);
|
||||
if (closeAspect) {
|
||||
ui->outputResolution->lineEdit()->setText(oldOutputRes);
|
||||
on_outputResolution_editTextChanged(oldOutputRes);
|
||||
} else {
|
||||
ui->outputResolution->lineEdit()->setText(bestScale.c_str());
|
||||
on_outputResolution_editTextChanged(bestScale.c_str());
|
||||
}
|
||||
if (closeAspect) {
|
||||
ui->outputResolution->lineEdit()->setText(oldOutputRes);
|
||||
on_outputResolution_editTextChanged(oldOutputRes);
|
||||
} else {
|
||||
ui->outputResolution->lineEdit()->setText(
|
||||
bestScale.c_str());
|
||||
on_outputResolution_editTextChanged(bestScale.c_str());
|
||||
}
|
||||
|
||||
ui->outputResolution->blockSignals(false);
|
||||
ui->outputResolution->blockSignals(false);
|
||||
|
||||
if (!closeAspect) {
|
||||
ui->outputResolution->setProperty("changed", QVariant(true));
|
||||
videoChanged = true;
|
||||
if (!closeAspect) {
|
||||
ui->outputResolution->setProperty("changed",
|
||||
QVariant(true));
|
||||
videoChanged = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (advRescale.isEmpty())
|
||||
@@ -3884,16 +3892,22 @@ void OBSBasicSettings::on_colorFormat_currentIndexChanged(const QString &text)
|
||||
static bool ValidResolutions(Ui::OBSBasicSettings *ui)
|
||||
{
|
||||
QString baseRes = ui->baseResolution->lineEdit()->text();
|
||||
QString outputRes = ui->outputResolution->lineEdit()->text();
|
||||
uint32_t cx, cy;
|
||||
|
||||
if (!ConvertResText(QT_TO_UTF8(baseRes), cx, cy) ||
|
||||
!ConvertResText(QT_TO_UTF8(outputRes), cx, cy)) {
|
||||
|
||||
if (!ConvertResText(QT_TO_UTF8(baseRes), cx, cy)) {
|
||||
ui->videoMsg->setText(QTStr(INVALID_RES_STR));
|
||||
return false;
|
||||
}
|
||||
|
||||
bool lockedOutRes = !ui->outputResolution->isEditable();
|
||||
if (!lockedOutRes) {
|
||||
QString outRes = ui->outputResolution->lineEdit()->text();
|
||||
if (!ConvertResText(QT_TO_UTF8(outRes), cx, cy)) {
|
||||
ui->videoMsg->setText(QTStr(INVALID_RES_STR));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
ui->videoMsg->setText("");
|
||||
return true;
|
||||
}
|
||||
@@ -4865,3 +4879,31 @@ int OBSBasicSettings::CurrentFLVTrack()
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Using setEditable(true) on a QComboBox when there's a custom style in use
|
||||
* does not work properly, so instead completely recreate the widget, which
|
||||
* seems to work fine. */
|
||||
void OBSBasicSettings::RecreateOutputResolutionWidget()
|
||||
{
|
||||
QSizePolicy sizePolicy = ui->outputResolution->sizePolicy();
|
||||
delete ui->outputResolution;
|
||||
ui->outputResolution = new QComboBox(ui->videoPage);
|
||||
ui->outputResolution->setObjectName(
|
||||
QString::fromUtf8("outputResolution"));
|
||||
ui->outputResolution->setSizePolicy(sizePolicy);
|
||||
ui->outputResolution->setEditable(true);
|
||||
ui->outputResLabel->setBuddy(ui->outputResolution);
|
||||
|
||||
ui->outputResLayout->insertWidget(0, ui->outputResolution);
|
||||
|
||||
QWidget::setTabOrder(ui->baseResolution, ui->outputResolution);
|
||||
QWidget::setTabOrder(ui->outputResolution, ui->downscaleFilter);
|
||||
|
||||
HookWidget(ui->outputResolution, CBEDIT_CHANGED, VIDEO_RES);
|
||||
|
||||
connect(ui->outputResolution, &QComboBox::editTextChanged, this,
|
||||
&OBSBasicSettings::on_outputResolution_editTextChanged);
|
||||
|
||||
ui->outputResolution->lineEdit()->setValidator(
|
||||
ui->baseResolution->lineEdit()->validator());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user