GUI: Video compression quality lineedit now using parsed labels

This commit is contained in:
Martin Piatka
2021-02-19 16:04:21 +01:00
parent 029f16fe61
commit 41f180bde8
10 changed files with 111 additions and 57 deletions

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -3,6 +3,7 @@
#include <QMetaType>
#include <functional>
#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<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,
@@ -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<SettingsUi *>(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;

View File

@@ -37,7 +37,6 @@ private:
std::vector<std::unique_ptr<WidgetUi>> uiControls;
static void jpegLabelCallback(Option &opt, bool suboption, void *);
static void refreshAllCallback(Option&, bool, void *);
void addCallbacks();

View File

@@ -1,4 +1,5 @@
#include <cstring>
#include <QLabel>
#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<SettingItem> 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<VideoBitrateCallbackData *>(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<LineEditUi *>(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);
}
}

View File

@@ -4,11 +4,19 @@
#include <vector>
#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<SettingItem> getVideoSrc(AvailableSettings *availSettings);
std::vector<SettingItem> getVideoDisplay(AvailableSettings *availSettings);
std::vector<SettingItem> getVideoModes(AvailableSettings *availSettings);

View File

@@ -22,14 +22,36 @@ void WidgetUi::optChangeCallbackStatic(Option& opt, bool subopt, void *opaque){
static_cast<WidgetUi *>(opaque)->optChangeCallback(opt, subopt);
}
void WidgetUi::registerCustomCallback(const std::string &option,
Option::Callback callback,
std::unique_ptr<ExtraCallbackData>&& extraDataPtr)
{
if(option == "")
return;
std::pair<std::string, Option::Callback> 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(){

View File

@@ -2,8 +2,10 @@
#define WIDGET_UI
#include <QObject>
#include <set>
#include <vector>
#include <utility>
#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<ExtraCallbackData>&& extraDataPtr = nullptr);
protected:
Settings *settings;
std::string opt;
std::map<std::string, Option::Callback> registeredCallbacks;
std::vector<std::pair<std::string, Option::Callback>> registeredCallbacks;
std::vector<std::unique_ptr<ExtraCallbackData>> extraData;
void registerCallback();

View File

@@ -0,0 +1,8 @@
#ifndef EXTRA_CALLBACK_DATA_HPP
#define EXTRA_CALLBACK_DATA_HPP
struct ExtraCallbackData{
virtual ~ExtraCallbackData() { }
};
#endif

View File

@@ -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 \