nodeparam: implemented parameters that allow arbitrary properties to be set

for UI representations

Allows properties to be set without adding explicit extra members to NodeInputs.
Crucially this means parameters like slider value representations (percent,
decibel, etc.) can be set from NodeInputs now.
This commit is contained in:
itsmattkc
2020-03-07 01:21:36 +11:00
parent d12a0dca23
commit c168bf1a80
8 changed files with 118 additions and 133 deletions
@@ -135,80 +135,60 @@ void NodeParamViewWidgetBridge::CreateWidgets()
case NodeParam::kInt:
{
IntegerSlider* slider = new IntegerSlider();
if (input_->has_minimum()) {
slider->SetMinimum(input_->minimum().toLongLong());
}
if (input_->has_maximum()) {
slider->SetMaximum(input_->maximum().toLongLong());
}
widgets_.append(slider);
connect(slider, &IntegerSlider::ValueChanged, this, &NodeParamViewWidgetBridge::WidgetCallback);
widgets_.append(slider);
if (input_->has_property(QStringLiteral("min"))) {
slider->SetMinimum(input_->get_property(QStringLiteral("min")).value<int64_t>());
}
if (input_->has_property(QStringLiteral("max"))) {
slider->SetMinimum(input_->get_property(QStringLiteral("max")).value<int64_t>());
}
break;
}
case NodeParam::kFloat:
{
FloatSlider* slider = new FloatSlider();
float min_flt = input_->get_property(QStringLiteral("min")).value<float>();
float max_flt = input_->get_property(QStringLiteral("max")).value<float>();
if (input_->has_minimum()) {
slider->SetMinimum(input_->minimum().toDouble());
}
if (input_->has_maximum()) {
slider->SetMaximum(input_->maximum().toDouble());
}
connect(slider, &FloatSlider::ValueChanged, this, &NodeParamViewWidgetBridge::WidgetCallback);
widgets_.append(slider);
CreateSliders(1,
input_->has_property(QStringLiteral("min")) ? &min_flt : nullptr,
input_->has_property(QStringLiteral("max")) ? &max_flt : nullptr,
input_->get_property(QStringLiteral("view")).toString());
break;
}
case NodeParam::kVec2:
{
FloatSlider* x_slider = new FloatSlider();
widgets_.append(x_slider);
connect(x_slider, &FloatSlider::ValueChanged, this, &NodeParamViewWidgetBridge::WidgetCallback);
QVector2D min_vec = input_->get_property(QStringLiteral("min")).value<QVector2D>();
QVector2D max_vec = input_->get_property(QStringLiteral("max")).value<QVector2D>();
FloatSlider* y_slider = new FloatSlider();
widgets_.append(y_slider);
connect(y_slider, &FloatSlider::ValueChanged, this, &NodeParamViewWidgetBridge::WidgetCallback);
CreateSliders(2,
input_->has_property(QStringLiteral("min")) ? reinterpret_cast<float*>(&min_vec) : nullptr,
input_->has_property(QStringLiteral("max")) ? reinterpret_cast<float*>(&max_vec) : nullptr,
input_->get_property(QStringLiteral("view")).toString());
break;
}
case NodeParam::kVec3:
{
FloatSlider* x_slider = new FloatSlider();
widgets_.append(x_slider);
connect(x_slider, &FloatSlider::ValueChanged, this, &NodeParamViewWidgetBridge::WidgetCallback);
QVector3D min_vec = input_->get_property(QStringLiteral("min")).value<QVector3D>();
QVector3D max_vec = input_->get_property(QStringLiteral("max")).value<QVector3D>();
FloatSlider* y_slider = new FloatSlider();
widgets_.append(y_slider);
connect(y_slider, &FloatSlider::ValueChanged, this, &NodeParamViewWidgetBridge::WidgetCallback);
FloatSlider* z_slider = new FloatSlider();
widgets_.append(z_slider);
connect(z_slider, &FloatSlider::ValueChanged, this, &NodeParamViewWidgetBridge::WidgetCallback);
CreateSliders(3,
input_->has_property(QStringLiteral("min")) ? reinterpret_cast<float*>(&min_vec) : nullptr,
input_->has_property(QStringLiteral("max")) ? reinterpret_cast<float*>(&max_vec) : nullptr,
input_->get_property(QStringLiteral("view")).toString());
break;
}
case NodeParam::kVec4:
{
FloatSlider* x_slider = new FloatSlider();
widgets_.append(x_slider);
connect(x_slider, &FloatSlider::ValueChanged, this, &NodeParamViewWidgetBridge::WidgetCallback);
QVector4D min_vec = input_->get_property(QStringLiteral("min")).value<QVector4D>();
QVector4D max_vec = input_->get_property(QStringLiteral("max")).value<QVector4D>();
FloatSlider* y_slider = new FloatSlider();
widgets_.append(y_slider);
connect(y_slider, &FloatSlider::ValueChanged, this, &NodeParamViewWidgetBridge::WidgetCallback);
FloatSlider* z_slider = new FloatSlider();
widgets_.append(z_slider);
connect(z_slider, &FloatSlider::ValueChanged, this, &NodeParamViewWidgetBridge::WidgetCallback);
FloatSlider* w_slider = new FloatSlider();
widgets_.append(w_slider);
connect(w_slider, &FloatSlider::ValueChanged, this, &NodeParamViewWidgetBridge::WidgetCallback);
CreateSliders(4,
input_->has_property(QStringLiteral("min")) ? reinterpret_cast<float*>(&min_vec) : nullptr,
input_->has_property(QStringLiteral("max")) ? reinterpret_cast<float*>(&max_vec) : nullptr,
input_->get_property(QStringLiteral("view")).toString());
break;
}
case NodeParam::kFile:
@@ -444,6 +424,29 @@ void NodeParamViewWidgetBridge::WidgetCallback()
}
}
void NodeParamViewWidgetBridge::CreateSliders(int count, float *min, float *max, const QString &type)
{
for (int i=0;i<count;i++) {
FloatSlider* fs = new FloatSlider();
widgets_.append(fs);
connect(fs, &FloatSlider::ValueChanged, this, &NodeParamViewWidgetBridge::WidgetCallback);
if (min) {
fs->SetMinimum(min[i]);
}
if (max) {
fs->SetMaximum(max[i]);
}
if (type == QStringLiteral("percent")) {
fs->SetDisplayType(FloatSlider::kPercentage);
} else if (type == QStringLiteral("db")) {
fs->SetDisplayType(FloatSlider::kDecibel);
}
}
}
void NodeParamViewWidgetBridge::InputValueChanged(const rational &start, const rational &end)
{
if (!dragging_ && start <= time_ && end >= time_) {
@@ -23,6 +23,8 @@ private:
void ProcessSlider(SliderBase* slider, const QVariant& value);
void CreateSliders(int count, float *min, float *max, const QString& type);
NodeInput* input_;
QList<QWidget*> widgets_;