From 57bf1ab13e3703649b507d0ffc8fcdfea69eb75b Mon Sep 17 00:00:00 2001 From: Martin Piatka Date: Mon, 22 Feb 2021 15:28:41 +0100 Subject: [PATCH] GUI: codec options tab --- gui/QT/option/settings_ui.cpp | 101 ++++++++++++++++++++++++++++++++++ gui/QT/option/settings_ui.hpp | 6 ++ gui/QT/option/video_opts.cpp | 26 +++++++++ gui/QT/option/video_opts.hpp | 4 ++ gui/QT/ui/settings.ui | 42 +++++++++++++- 5 files changed, 178 insertions(+), 1 deletion(-) diff --git a/gui/QT/option/settings_ui.cpp b/gui/QT/option/settings_ui.cpp index 298829708..957b25b51 100644 --- a/gui/QT/option/settings_ui.cpp +++ b/gui/QT/option/settings_ui.cpp @@ -1,6 +1,10 @@ #include #include #include +#include +#include +#include +#include #include #include "settings_ui.hpp" #include "video_opts.hpp" @@ -176,4 +180,101 @@ void SettingsUi::initSettingsWin(Ui::Settings *ui){ addControl(new CheckboxUi(ui->decodeAccelCheck, settings, "decode.hwaccel")); addControl(new CheckboxUi(ui->errorsFatalBox, settings, "errors_fatal")); addControl(new LineEditUi(ui->encryptionLineEdit, settings, "encryption")); + + 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(); + + 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); } diff --git a/gui/QT/option/settings_ui.hpp b/gui/QT/option/settings_ui.hpp index 348aa04bd..f79c30d8f 100644 --- a/gui/QT/option/settings_ui.hpp +++ b/gui/QT/option/settings_ui.hpp @@ -36,6 +36,7 @@ private: AvailableSettings *availableSettings = nullptr; std::vector> uiControls; + std::vector> codecControls; static void refreshAllCallback(Option&, bool, void *); @@ -47,6 +48,11 @@ private slots: void test(); + void buildSettingsCodecList(); + void settingsCodecSelected(QListWidgetItem *curr, QListWidgetItem *prev); + void buildCodecOptControls(const std::string& mod, const std::string& codec); + + signals: void changed(); }; diff --git a/gui/QT/option/video_opts.cpp b/gui/QT/option/video_opts.cpp index c8e0f2d16..537a7debe 100644 --- a/gui/QT/option/video_opts.cpp +++ b/gui/QT/option/video_opts.cpp @@ -105,6 +105,32 @@ std::vector getVideoDisplay(AvailableSettings *availSettings){ return res; } +std::vector getCodecEncoders(AvailableSettings *availSettings, + const std::string& mod, const std::string& codec) +{ + std::vector res; + + for(const auto& compMod : availSettings->getVideoCompressModules()){ + if(compMod.name != mod) + continue; + + for(const auto& modCodec : compMod.codecs){ + if(modCodec.name != codec) + continue; + + for(const auto& encoder: modCodec.encoders){ + SettingItem item; + item.name = encoder.name; + item.opts.push_back({"video.compress." + mod + ".codec." + codec + ".encoder", encoder.optStr}); + + res.emplace_back(std::move(item)); + } + } + } + + return res; +} + struct VideoCompressItem{ const char * displayName; const char * value; diff --git a/gui/QT/option/video_opts.hpp b/gui/QT/option/video_opts.hpp index 5aa658378..cbbf28344 100644 --- a/gui/QT/option/video_opts.hpp +++ b/gui/QT/option/video_opts.hpp @@ -2,6 +2,7 @@ #define VIDEO_OPTS_HPP #include +#include #include "available_settings.hpp" #include "settings.hpp" #include "extra_callback_data.hpp" @@ -22,6 +23,9 @@ std::vector getVideoDisplay(AvailableSettings *availSettings); std::vector getVideoModes(AvailableSettings *availSettings); std::vector getVideoCompress(AvailableSettings *availSettings); +std::vector getCodecEncoders(AvailableSettings *availSettings, + const std::string& mod, const std::string& codec); + void populateVideoCompressSettings(AvailableSettings *availSettings, Settings* settings); diff --git a/gui/QT/ui/settings.ui b/gui/QT/ui/settings.ui index 1cfef45d0..05f3ab469 100644 --- a/gui/QT/ui/settings.ui +++ b/gui/QT/ui/settings.ui @@ -6,7 +6,7 @@ 0 0 - 452 + 480 460 @@ -481,6 +481,46 @@ + + + Video compress + + + + + + + 1 + 0 + + + + + + + + + 3 + 0 + + + + true + + + + + 0 + 0 + 98 + 28 + + + + + + + Acceleration