Files
UltraGrid/gui/QT/option/settings_ui.cpp
Martin Piatka 41775b81d4 GUI: Move the "Advanced" menu item to settings with better name
Probably all of the useful devices are now reported by capabilities, so
it's likely to be not even needed, so to avoid confusion it's moved into
the settings window and given a more descriptive name
2021-03-15 14:59:55 +01:00

281 lines
9.3 KiB
C++

#include <stdio.h>
#include <iostream>
#include <QMetaType>
#include <QLabel>
#include <QLineEdit>
#include <QFormLayout>
#include <QCheckBox>
#include <functional>
#include "settings_ui.hpp"
#include "video_opts.hpp"
void SettingsUi::init(Settings *settings, AvailableSettings *availableSettings){
this->settings = settings;
this->availableSettings = availableSettings;
}
void SettingsUi::addControl(WidgetUi *widget){
uiControls.emplace_back(widget);
connect(widget, &WidgetUi::changed, this, &SettingsUi::changed);
}
void SettingsUi::initMainWin(Ui::UltragridWindow *ui){
mainWin = ui;
refreshAll();
addCallbacks();
#ifdef DEBUG
connect(mainWin->actionTest, SIGNAL(triggered()), this, SLOT(test()));
#endif
addControl(new CheckboxUi(ui->fECCheckBox, settings, "network.fec.enabled"));
addControl(new CheckboxUi(ui->previewCheckBox, settings, "preview"));
addControl(
new LineEditUi(ui->networkDestinationEdit, settings, "network.destination")
);
addControl(new ActionCheckableUi(ui->actionVuMeter, settings, "vuMeter"));
addControl(new ActionCheckableUi(ui->actionUse_hw_acceleration,
settings,
"decode.hwaccel"));
addControl(
new ComboBoxUi(ui->videoSourceComboBox,
settings,
"video.source",
std::bind(getVideoSrc, availableSettings))
);
LineEditUi *videoBitrate = new LineEditUi(ui->videoBitrateEdit,
settings,
"");
addControl(videoBitrate);
std::unique_ptr<VideoBitrateCallbackData> vidBitrateCallData(new VideoBitrateCallbackData());
vidBitrateCallData->availSettings = availableSettings;
vidBitrateCallData->lineEditUi = videoBitrate;
vidBitrateCallData->label = mainWin->videoBitrateLabel;
auto extraPtr = vidBitrateCallData.get();
videoBitrate->registerCustomCallback("video.compress",
Option::Callback(videoCompressBitrateCallback, extraPtr),
std::move(vidBitrateCallData));
addControl(
new ComboBoxUi(ui->videoCompressionComboBox,
settings,
"video.compress",
std::bind(getVideoCompress, availableSettings))
);
addControl(
new ComboBoxUi(ui->videoDisplayComboBox,
settings,
"video.display",
std::bind(getVideoDisplay, availableSettings))
);
ComboBoxUi *videoModeCombo = new ComboBoxUi(ui->videoModeComboBox,
settings,
"",
std::bind(getVideoModes, availableSettings));
videoModeCombo->registerCallback("video.source");
addControl(videoModeCombo);
addControl(
new ComboBoxUi(ui->audioCompressionComboBox,
settings,
"audio.compress",
std::bind(getAudioCompress, availableSettings))
);
ComboBoxUi *audioSrc = new ComboBoxUi(ui->audioSourceComboBox,
settings,
"audio.source",
std::bind(getAudioSrc, availableSettings));
audioSrc->registerCallback("video.source");
addControl(audioSrc);
ComboBoxUi *audioPlayback = new ComboBoxUi(ui->audioPlaybackComboBox,
settings,
"audio.playback",
std::bind(getAudioPlayback, availableSettings));
audioPlayback->registerCallback("video.display");
addControl(audioPlayback);
addControl(new LineEditUi(ui->audioBitrateEdit,
settings,
"audio.compress.bitrate"));
addControl(new SpinBoxUi(ui->audioChannelsSpinBox,
settings,
"audio.source.channels"));
addControl(new LineEditUi(ui->portLineEdit, settings, "network.port"));
}
void SettingsUi::refreshAll(){
for(auto &i : uiControls){
i->refresh();
}
}
void SettingsUi::refreshAllCallback(Option&, bool, void *opaque){
static_cast<SettingsUi *>(opaque)->refreshAll();
}
void vuMeterCallback(Option &opt, bool /*suboption*/, void *opaque){
static_cast<Ui::UltragridWindow *>(opaque)->vuMeter->setVisible(opt.isEnabled());
}
void SettingsUi::addCallbacks(){
settings->getOption("audio.compress").addOnChangeCallback(
Option::Callback(&audioCompressionCallback, mainWin));
settings->getOption("advanced").addOnChangeCallback(
Option::Callback(&SettingsUi::refreshAllCallback, this));
settings->getOption("vuMeter").addOnChangeCallback(
Option::Callback(&vuMeterCallback, mainWin));
}
void SettingsUi::test(){
printf("%s\n", settings->getLaunchParams().c_str());
}
void SettingsUi::initSettingsWin(Ui::Settings *ui){
settingsWin = ui;
addControl(new LineEditUi(ui->basePort, settings, "network.port"));
addControl(new LineEditUi(ui->controlPort, settings, "network.control_port"));
addControl(new CheckboxUi(ui->fecAutoCheck, settings, "network.fec.auto"));
addControl(new GroupBoxUi(ui->fecGroupBox, settings, "network.fec.enabled"));
addControl(new SpinBoxUi(ui->multSpin, settings, "network.fec.mult.factor"));
addControl(new SpinBoxUi(ui->ldgmK, settings, "network.fec.ldgm.k"));
addControl(new SpinBoxUi(ui->ldgmM, settings, "network.fec.ldgm.m"));
addControl(new SpinBoxUi(ui->ldgmC, settings, "network.fec.ldgm.c"));
addControl(new SpinBoxUi(ui->rsK, settings, "network.fec.rs.k"));
addControl(new SpinBoxUi(ui->rsN, settings, "network.fec.rs.n"));
addControl(new RadioButtonUi(ui->fecNoneRadio, "", settings, "network.fec.type"));
addControl(new RadioButtonUi(ui->fecMultRadio, "mult", settings, "network.fec.type"));
addControl(new RadioButtonUi(ui->fecLdgmRadio, "ldgm", settings, "network.fec.type"));
addControl(new RadioButtonUi(ui->fecRsRadio, "rs", settings, "network.fec.type"));
addControl(new CheckboxUi(ui->glCursor, settings, "video.display.gl.cursor"));
addControl(new CheckboxUi(ui->glDeinterlace, settings, "video.display.gl.deinterlace"));
addControl(new CheckboxUi(ui->glFullscreen, settings, "video.display.gl.fullscreen"));
addControl(new CheckboxUi(ui->glNoDecorate, settings, "video.display.gl.nodecorate"));
addControl(new CheckboxUi(ui->glNoVsync, settings, "video.display.gl.novsync"));
addControl(new CheckboxUi(ui->sdlDeinterlace, settings, "video.display.sdl.deinterlace"));
addControl(new CheckboxUi(ui->sdlFullscreen, settings, "video.display.sdl.fullscreen"));
addControl(new RadioButtonUi(ui->ldgmSimpCpuRadio, "CPU", settings, "network.fec.ldgm.device"));
addControl(new RadioButtonUi(ui->ldgmSimpGpuRadio, "GPU", settings, "network.fec.ldgm.device"));
addControl(new RadioButtonUi(ui->ldgmCpuRadio, "CPU", settings, "network.fec.ldgm.device"));
addControl(new RadioButtonUi(ui->ldgmGpuRadio, "GPU", settings, "network.fec.ldgm.device"));
addControl(new CheckboxUi(ui->decodeAccelCheck, settings, "decode.hwaccel"));
addControl(new CheckboxUi(ui->errorsFatalBox, settings, "errors_fatal"));
addControl(new LineEditUi(ui->encryptionLineEdit, settings, "encryption"));
addControl(new CheckboxUi(ui->advModeCheck, settings, "advanced"));
buildSettingsCodecList();
connect(settingsWin->codecList, &QListWidget::currentItemChanged,
this, &SettingsUi::settingsCodecSelected);
}
void SettingsUi::buildSettingsCodecList(){
QListWidget *list = settingsWin->codecList;
list->clear();
auto codecs = getVideoCompress(availableSettings);
for(const auto& codec : codecs){
QListWidgetItem *item = new QListWidgetItem(list);
item->setText(QString::fromStdString(codec.name));
item->setData(Qt::UserRole, QVariant::fromValue(codec));
list->addItem(item);
}
}
void SettingsUi::settingsCodecSelected(QListWidgetItem *curr, QListWidgetItem *){
const SettingItem &settingItem = curr->data(Qt::UserRole).value<SettingItem>();
auto modIt = std::find_if(settingItem.opts.begin(), settingItem.opts.end(),
[](const SettingValue& si){ return si.opt == "video.compress"; });
if(modIt == settingItem.opts.end())
return;
const std::string& modName = modIt->val;
auto codecIt = std::find_if(settingItem.opts.begin(), settingItem.opts.end(),
[modName](const SettingValue& si){
return si.opt == "video.compress." + modName + ".codec"; });
if(codecIt == settingItem.opts.end())
return;
buildCodecOptControls(modName, codecIt->val);
}
void SettingsUi::buildCodecOptControls(const std::string& mod, const std::string& codec){
codecControls.clear();
QWidget *container = new QWidget();
QFormLayout *formLayout = new QFormLayout(container);
QComboBox *encoderCombo = new QComboBox();
formLayout->addRow("Encoder", encoderCombo);
WidgetUi *encoderComboUi = new ComboBoxUi(encoderCombo,
settings,
"video.compress." + mod + ".codec." + codec + ".encoder",
std::bind(getCodecEncoders, availableSettings, mod, codec));
codecControls.emplace_back(encoderComboUi);
connect(encoderComboUi, &WidgetUi::changed, this, &SettingsUi::changed);
for(const auto& compMod : availableSettings->getVideoCompressModules()){
if(compMod.name == mod){
for(const auto& modOpt : compMod.opts){
QLabel *label = new QLabel(QString::fromStdString(modOpt.displayName));
QWidget *field = nullptr;
WidgetUi *widgetUi = nullptr;
std::string optKey = "video.compress." + mod + "." + modOpt.key;
if(modOpt.booleanOpt){
QCheckBox *checkBox = new QCheckBox();
field = checkBox;
widgetUi = new CheckboxUi(checkBox,
settings,
optKey);
} else {
QLineEdit *lineEdit = new QLineEdit();
field = lineEdit;
widgetUi = new LineEditUi(lineEdit,
settings,
optKey);
}
label->setToolTip(QString::fromStdString(modOpt.displayDesc));
field->setToolTip(QString::fromStdString(modOpt.displayDesc));
formLayout->addRow(label, field);
codecControls.emplace_back(widgetUi);
connect(widgetUi, &WidgetUi::changed, this, &SettingsUi::changed);
}
}
}
container->setLayout(formLayout);
delete settingsWin->scrollContents;
settingsWin->scrollContents = container;
settingsWin->codecOptScroll->setWidget(container);
}