mirror of
https://github.com/outbackdingo/UltraGrid.git
synced 2026-03-20 14:40:10 +00:00
GUI: Video compression quality lineedit now using parsed labels
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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(){
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
8
gui/QT/util/extra_callback_data.hpp
Normal file
8
gui/QT/util/extra_callback_data.hpp
Normal file
@@ -0,0 +1,8 @@
|
||||
#ifndef EXTRA_CALLBACK_DATA_HPP
|
||||
#define EXTRA_CALLBACK_DATA_HPP
|
||||
|
||||
struct ExtraCallbackData{
|
||||
virtual ~ExtraCallbackData() { }
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -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 \
|
||||
|
||||
Reference in New Issue
Block a user