From 41f180bde8ce2fe56f2cabcc4e854e341d463f20 Mon Sep 17 00:00:00 2001 From: Martin Piatka Date: Fri, 19 Feb 2021 16:04:21 +0100 Subject: [PATCH] GUI: Video compression quality lineedit now using parsed labels --- gui/QT/option/lineedit_ui.cpp | 9 +++++ gui/QT/option/lineedit_ui.hpp | 3 ++ gui/QT/option/settings_ui.cpp | 40 ++++++-------------- gui/QT/option/settings_ui.hpp | 1 - gui/QT/option/video_opts.cpp | 58 ++++++++++++++++++----------- gui/QT/option/video_opts.hpp | 8 ++++ gui/QT/option/widget_ui.cpp | 30 +++++++++++++-- gui/QT/option/widget_ui.hpp | 10 ++++- gui/QT/util/extra_callback_data.hpp | 8 ++++ gui/QT/uv-qt.pro | 1 + 10 files changed, 111 insertions(+), 57 deletions(-) create mode 100644 gui/QT/util/extra_callback_data.hpp diff --git a/gui/QT/option/lineedit_ui.cpp b/gui/QT/option/lineedit_ui.cpp index d0304c093..446681c16 100644 --- a/gui/QT/option/lineedit_ui.cpp +++ b/gui/QT/option/lineedit_ui.cpp @@ -20,3 +20,12 @@ void LineEditUi::updateUiState(){ updateUiState(getOptValue()); } +void LineEditUi::setEnabled(bool enabled){ + line->setEnabled(enabled); +} + +void LineEditUi::setToolTip(const QString& toolTip){ + line->setToolTip(toolTip); +} + + diff --git a/gui/QT/option/lineedit_ui.hpp b/gui/QT/option/lineedit_ui.hpp index f650201c4..de00d6a22 100644 --- a/gui/QT/option/lineedit_ui.hpp +++ b/gui/QT/option/lineedit_ui.hpp @@ -10,6 +10,9 @@ Q_OBJECT public: LineEditUi(QLineEdit *line, Settings *settings, const std::string &opt); + void setEnabled(bool enabled); + void setToolTip(const QString& toolTip); + private: QLineEdit *line; diff --git a/gui/QT/option/settings_ui.cpp b/gui/QT/option/settings_ui.cpp index b780bb140..298829708 100644 --- a/gui/QT/option/settings_ui.cpp +++ b/gui/QT/option/settings_ui.cpp @@ -3,6 +3,7 @@ #include #include #include "settings_ui.hpp" +#include "video_opts.hpp" void SettingsUi::init(Settings *settings, AvailableSettings *availableSettings){ this->settings = settings; @@ -50,9 +51,17 @@ void SettingsUi::initMainWin(Ui::UltragridWindow *ui){ ""); addControl(videoBitrate); - settings->getOption("video.compress").addOnChangeCallback( - Option::Callback(videoCompressBitrateCallback, videoBitrate) - ); + std::unique_ptr 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, @@ -122,9 +131,6 @@ void vuMeterCallback(Option &opt, bool /*suboption*/, void *opaque){ } void SettingsUi::addCallbacks(){ - settings->getOption("video.compress").addOnChangeCallback( - Option::Callback(&SettingsUi::jpegLabelCallback, this)); - settings->getOption("audio.compress").addOnChangeCallback( Option::Callback(&audioCompressionCallback, mainWin)); @@ -139,28 +145,6 @@ void SettingsUi::test(){ printf("%s\n", settings->getLaunchParams().c_str()); } -void SettingsUi::jpegLabelCallback(Option &opt, bool suboption, void *opaque){ - if(suboption) - return; - - SettingsUi *obj = static_cast(opaque); - Ui::UltragridWindow* mainWin = obj->mainWin; - - mainWin->videoBitrateLabel->setEnabled(true); - mainWin->videoBitrateEdit->setEnabled(true); - - const std::string &val = opt.getValue(); - if(val == "jpeg"){ - mainWin->videoBitrateLabel->setText(QString("Jpeg quality")); - } else { - mainWin->videoBitrateLabel->setText(QString("Bitrate")); - if(val == ""){ - mainWin->videoBitrateLabel->setEnabled(false); - mainWin->videoBitrateEdit->setEnabled(false); - } - } -} - void SettingsUi::initSettingsWin(Ui::Settings *ui){ settingsWin = ui; diff --git a/gui/QT/option/settings_ui.hpp b/gui/QT/option/settings_ui.hpp index b9b1bf9e7..348aa04bd 100644 --- a/gui/QT/option/settings_ui.hpp +++ b/gui/QT/option/settings_ui.hpp @@ -37,7 +37,6 @@ private: std::vector> uiControls; - static void jpegLabelCallback(Option &opt, bool suboption, void *); static void refreshAllCallback(Option&, bool, void *); void addCallbacks(); diff --git a/gui/QT/option/video_opts.cpp b/gui/QT/option/video_opts.cpp index 0239279bd..c8e0f2d16 100644 --- a/gui/QT/option/video_opts.cpp +++ b/gui/QT/option/video_opts.cpp @@ -1,4 +1,5 @@ #include +#include #include "video_opts.hpp" #include "combobox_ui.hpp" @@ -134,12 +135,12 @@ void populateVideoCompressSettings(AvailableSettings *availSettings, mod.name); for(const auto& modOption: mod.opts){ - settings->addOption(modOption.key, + settings->addOption(mod.name + "." + modOption.key, modOption.booleanOpt ? Option::BoolOpt : Option::StringOpt, modOption.optStr, "", false, - "video.compress." + mod.name, + "video.compress", mod.name ); } @@ -179,26 +180,39 @@ std::vector getVideoCompress(AvailableSettings *availSettings){ return res; } -static std::string getBitrateOpt(Settings *settings){ - std::string codec = settings->getOption("video.compress").getValue(); - std::string opt = "video.compress." + codec; - if(codec == "libavcodec"){ - opt += ".codec." - + settings->getOption("video.compress.libavcodec.codec").getValue() - + ".bitrate"; - } else if (codec == "jpeg") { - opt += ".quality"; - } else { - opt += codec + ".bitrate"; +void videoCompressBitrateCallback(Option &opt, bool suboption, void *opaque){ + VideoBitrateCallbackData *data = static_cast(opaque); + if(suboption) + return; + + Settings *settings = opt.getSettings(); + std::string mod = settings->getOption("video.compress").getValue(); + std::string codec = settings->getOption("video.compress." + mod + ".codec").getValue(); + + bool enableEdit = false; + QString toolTip; + QString qualityLabel; + + for(const auto& compMod : data->availSettings->getVideoCompressModules()){ + if(compMod.name == mod){ + for(const auto& modOpt : compMod.opts){ + if(modOpt.key == "quality"){ + enableEdit = true; + toolTip = QString::fromStdString(modOpt.displayDesc); + qualityLabel = QString::fromStdString(modOpt.displayName); + break; + } + } + } } - return opt; -} - -void videoCompressBitrateCallback(Option &opt, bool suboption, void *opaque){ - LineEditUi *bitrateLine = static_cast(opaque); - if(suboption) - return; - - bitrateLine->setOpt(getBitrateOpt(opt.getSettings())); + data->lineEditUi->setOpt("video.compress." + mod + ".quality"); + data->lineEditUi->setEnabled(enableEdit); + data->lineEditUi->setToolTip(toolTip); + if(data->label){ + data->label->setEnabled(enableEdit); + data->label->setToolTip(toolTip); + if(!qualityLabel.isEmpty()) + data->label->setText(qualityLabel); + } } diff --git a/gui/QT/option/video_opts.hpp b/gui/QT/option/video_opts.hpp index 14649d048..5aa658378 100644 --- a/gui/QT/option/video_opts.hpp +++ b/gui/QT/option/video_opts.hpp @@ -4,11 +4,19 @@ #include #include "available_settings.hpp" #include "settings.hpp" +#include "extra_callback_data.hpp" struct SettingItem; class LineEditUi; +class QLabel; +struct VideoBitrateCallbackData : public ExtraCallbackData{ + const AvailableSettings *availSettings; + LineEditUi *lineEditUi; + QLabel *label; +}; + std::vector getVideoSrc(AvailableSettings *availSettings); std::vector getVideoDisplay(AvailableSettings *availSettings); std::vector getVideoModes(AvailableSettings *availSettings); diff --git a/gui/QT/option/widget_ui.cpp b/gui/QT/option/widget_ui.cpp index ff13e0755..888d72095 100644 --- a/gui/QT/option/widget_ui.cpp +++ b/gui/QT/option/widget_ui.cpp @@ -22,14 +22,36 @@ void WidgetUi::optChangeCallbackStatic(Option& opt, bool subopt, void *opaque){ static_cast(opaque)->optChangeCallback(opt, subopt); } +void WidgetUi::registerCustomCallback(const std::string &option, + Option::Callback callback, + std::unique_ptr&& extraDataPtr) +{ + if(option == "") + return; + + std::pair elToInsert(option, callback); + + auto it = std::find(registeredCallbacks.begin(), + registeredCallbacks.end(), elToInsert); + if(it != registeredCallbacks.end()){ + return; + } + + + settings->getOption(option).addOnChangeCallback(callback); + registeredCallbacks.push_back(elToInsert); + + if(extraDataPtr) + extraData.emplace_back(std::move(extraDataPtr)); + +} + void WidgetUi::registerCallback(const std::string &option){ - if(option == "" || registeredCallbacks.find(option) != registeredCallbacks.end()) + if(option == "") return; Option::Callback callback(&WidgetUi::optChangeCallbackStatic, this); - settings->getOption(option).addOnChangeCallback(callback); - - registeredCallbacks.insert({option, callback}); + registerCustomCallback(option, callback); } void WidgetUi::registerCallback(){ diff --git a/gui/QT/option/widget_ui.hpp b/gui/QT/option/widget_ui.hpp index 8720a02e3..03c5cfc94 100644 --- a/gui/QT/option/widget_ui.hpp +++ b/gui/QT/option/widget_ui.hpp @@ -2,8 +2,10 @@ #define WIDGET_UI #include -#include +#include +#include #include "settings.hpp" +#include "extra_callback_data.hpp" class WidgetUi : public QObject{ Q_OBJECT @@ -23,11 +25,15 @@ public: virtual void refresh() { } void registerCallback(const std::string &option); + void registerCustomCallback(const std::string &option, + Option::Callback callback, + std::unique_ptr&& extraDataPtr = nullptr); protected: Settings *settings; std::string opt; - std::map registeredCallbacks; + std::vector> registeredCallbacks; + std::vector> extraData; void registerCallback(); diff --git a/gui/QT/util/extra_callback_data.hpp b/gui/QT/util/extra_callback_data.hpp new file mode 100644 index 000000000..75701caf8 --- /dev/null +++ b/gui/QT/util/extra_callback_data.hpp @@ -0,0 +1,8 @@ +#ifndef EXTRA_CALLBACK_DATA_HPP +#define EXTRA_CALLBACK_DATA_HPP + +struct ExtraCallbackData{ + virtual ~ExtraCallbackData() { } +}; + +#endif diff --git a/gui/QT/uv-qt.pro b/gui/QT/uv-qt.pro index 2225ae98f..4507e896e 100644 --- a/gui/QT/uv-qt.pro +++ b/gui/QT/uv-qt.pro @@ -65,6 +65,7 @@ HEADERS += window/ultragrid_window.hpp \ option/audio_opts.hpp \ option/video_opts.hpp \ util/overload.hpp \ + util/extra_callback_data.hpp \ FORMS += ui/ultragrid_window.ui \ ui/log_window.ui \