Files
oak-editor/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp
T
itsmattkc 16ac2fc0e1 sweeping node graph changes for new rendering pipeline
The new rendering pipeline strives to simplify the nodes themselves as much
as possible and move much of the logic to an external rendering engine. This
change removes all of the responsibilities that no longer belong to the
nodes themselves and will soon be folded into the renderer.
2019-11-02 01:39:37 +11:00

314 lines
9.1 KiB
C++

#include "nodeparamviewwidgetbridge.h"
#include <QFontComboBox>
#include <QLineEdit>
#include <QCheckBox>
#include "node/node.h"
#include "widget/footagecombobox/footagecombobox.h"
#include "widget/slider/floatslider.h"
#include "widget/slider/integerslider.h"
// FIXME: Test code only
#include "panel/panelmanager.h"
#include "panel/project/project.h"
// End test code
NodeParamViewWidgetBridge::NodeParamViewWidgetBridge(QObject* parent) :
QObject(parent)
{
}
void NodeParamViewWidgetBridge::AddInput(NodeInput *input)
{
inputs_.append(input);
// If this was the first input, create the widgets
if (inputs_.size() == 1) {
CreateWidgets();
}
}
const QList<QWidget *> &NodeParamViewWidgetBridge::widgets()
{
return widgets_;
}
void NodeParamViewWidgetBridge::CreateWidgets()
{
NodeInput* base_input = inputs_.first();
// We assume the first data type is the "primary" type
switch (base_input->data_type()) {
// None of these inputs have applicable UI widgets
case NodeParam::kNone:
case NodeParam::kAny:
case NodeParam::kBlock:
case NodeParam::kTexture:
case NodeParam::kMatrix:
case NodeParam::kTrack:
case NodeParam::kRational:
case NodeParam::kSamples:
break;
case NodeParam::kInt:
{
IntegerSlider* slider = new IntegerSlider();
widgets_.append(slider);
connect(slider, SIGNAL(ValueChanged(int)), this, SLOT(WidgetCallback()));
break;
}
case NodeParam::kFloat:
{
FloatSlider* slider = new FloatSlider();
slider->SetValue(base_input->get_value_at_time(0).toDouble());
if (base_input->has_minimum()) {
slider->SetMinimum(base_input->minimum().toDouble());
}
if (base_input->has_maximum()) {
slider->SetMaximum(base_input->maximum().toDouble());
}
connect(slider, SIGNAL(ValueChanged(double)), this, SLOT(WidgetCallback()));
widgets_.append(slider);
break;
}
case NodeParam::kVec2:
{
QVector2D vec2 = base_input->get_value_at_time(0).value<QVector2D>();
FloatSlider* x_slider = new FloatSlider();
x_slider->SetValue(static_cast<double>(vec2.x()));
widgets_.append(x_slider);
connect(x_slider, SIGNAL(ValueChanged(double)), this, SLOT(WidgetCallback()));
FloatSlider* y_slider = new FloatSlider();
y_slider->SetValue(static_cast<double>(vec2.y()));
widgets_.append(y_slider);
connect(y_slider, SIGNAL(ValueChanged(double)), this, SLOT(WidgetCallback()));
break;
}
case NodeParam::kVec3:
{
QVector3D vec3 = base_input->get_value_at_time(0).value<QVector3D>();
FloatSlider* x_slider = new FloatSlider();
x_slider->SetValue(static_cast<double>(vec3.x()));
widgets_.append(x_slider);
connect(x_slider, SIGNAL(ValueChanged(double)), this, SLOT(WidgetCallback()));
FloatSlider* y_slider = new FloatSlider();
y_slider->SetValue(static_cast<double>(vec3.y()));
widgets_.append(y_slider);
connect(y_slider, SIGNAL(ValueChanged(double)), this, SLOT(WidgetCallback()));
FloatSlider* z_slider = new FloatSlider();
z_slider->SetValue(static_cast<double>(vec3.z()));
widgets_.append(z_slider);
connect(z_slider, SIGNAL(ValueChanged(double)), this, SLOT(WidgetCallback()));
break;
}
case NodeParam::kVec4:
{
QVector4D vec4 = base_input->get_value_at_time(0).value<QVector4D>();
FloatSlider* x_slider = new FloatSlider();
x_slider->SetValue(static_cast<double>(vec4.x()));
widgets_.append(x_slider);
connect(x_slider, SIGNAL(ValueChanged(double)), this, SLOT(WidgetCallback()));
FloatSlider* y_slider = new FloatSlider();
y_slider->SetValue(static_cast<double>(vec4.y()));
widgets_.append(y_slider);
connect(y_slider, SIGNAL(ValueChanged(double)), this, SLOT(WidgetCallback()));
FloatSlider* z_slider = new FloatSlider();
z_slider->SetValue(static_cast<double>(vec4.z()));
widgets_.append(z_slider);
connect(z_slider, SIGNAL(ValueChanged(double)), this, SLOT(WidgetCallback()));
FloatSlider* w_slider = new FloatSlider();
w_slider->SetValue(static_cast<double>(vec4.w()));
widgets_.append(w_slider);
connect(w_slider, SIGNAL(ValueChanged(double)), this, SLOT(WidgetCallback()));
break;
}
case NodeParam::kFile:
// FIXME: File selector
break;
case NodeParam::kColor:
// FIXME: Color selector
break;
case NodeParam::kString:
{
QLineEdit* line_edit = new QLineEdit();
widgets_.append(line_edit);
connect(line_edit, SIGNAL(textEdited(const QString &text)), this, SLOT(WidgetCallback()));
break;
}
case NodeParam::kBoolean:
{
QCheckBox* check_box = new QCheckBox();
widgets_.append(check_box);
break;
}
case NodeParam::kFont:
{
QFontComboBox* font_combobox = new QFontComboBox();
widgets_.append(font_combobox);
break;
}
case NodeParam::kFootage:
{
FootageComboBox* footage_combobox = new FootageComboBox();
// FIXME: Test code
// Pretty hacky way of getting the root folder for this node's sequence
ProjectPanel* pp = olive::panel_manager->MostRecentlyFocused<ProjectPanel>();
footage_combobox->SetRoot(pp->project()->root());
// Use multiple values
footage_combobox->SetFootage(base_input->get_value_at_time(0).value<StreamPtr>());
connect(footage_combobox, SIGNAL(FootageChanged(StreamPtr)), this, SLOT(WidgetCallback()));
// End test code
widgets_.append(footage_combobox);
break;
}
}
}
void NodeParamViewWidgetBridge::WidgetCallback()
{
foreach (NodeInput* input, inputs_) {
switch (input->data_type()) {
// None of these inputs have applicable UI widgets
case NodeParam::kNone:
case NodeParam::kAny:
case NodeParam::kBlock:
case NodeParam::kTexture:
case NodeParam::kMatrix:
case NodeParam::kTrack:
case NodeParam::kSamples:
case NodeParam::kRational:
break;
case NodeParam::kInt:
{
// Widget is a IntegerSlider
IntegerSlider* int_slider = static_cast<IntegerSlider*>(sender());
input->set_value_at_time(0, int_slider->GetValue());
break;
}
case NodeParam::kFloat:
{
// Widget is a FloatSlider
FloatSlider* float_slider = static_cast<FloatSlider*>(sender());
input->set_value_at_time(0, float_slider->GetValue());
break;
}
case NodeParam::kVec2:
{
// Widgets are two FloatSliders
FloatSlider* slider = static_cast<FloatSlider*>(sender());
QVector2D val = input->get_value_at_time(0).value<QVector2D>();
if (slider == widgets_.at(0)) {
// Slider is X slider
val.setX(static_cast<float>(slider->GetValue()));
} else {
// Slider is Y slider
val.setY(static_cast<float>(slider->GetValue()));
}
input->set_value_at_time(0, val);
break;
}
case NodeParam::kVec3:
{
// Widgets are three FloatSliders
FloatSlider* slider = static_cast<FloatSlider*>(sender());
QVector3D val = input->get_value_at_time(0).value<QVector3D>();
if (slider == widgets_.at(0)) {
// Slider is X slider
val.setX(static_cast<float>(slider->GetValue()));
} else if (slider == widgets_.at(1)) {
// Slider is Y slider
val.setY(static_cast<float>(slider->GetValue()));
} else {
// Slider is Z slider
val.setZ(static_cast<float>(slider->GetValue()));
}
input->set_value_at_time(0, val);
break;
}
case NodeParam::kVec4:
{
// Widgets are three FloatSliders
FloatSlider* slider = static_cast<FloatSlider*>(sender());
QVector4D val = input->get_value_at_time(0).value<QVector4D>();
if (slider == widgets_.at(0)) {
// Slider is X slider
val.setX(static_cast<float>(slider->GetValue()));
} else if (slider == widgets_.at(1)) {
// Slider is Y slider
val.setY(static_cast<float>(slider->GetValue()));
} else if (slider == widgets_.at(2)) {
// Slider is Z slider
val.setZ(static_cast<float>(slider->GetValue()));
} else {
// Slider is W slider
val.setW(static_cast<float>(slider->GetValue()));
}
input->set_value_at_time(0, val);
break;
}
case NodeParam::kFile:
// FIXME: File selector
break;
case NodeParam::kColor:
// FIXME: Color selector
break;
case NodeParam::kString:
{
// Sender is a QLineEdit
QLineEdit* line_edit = static_cast<QLineEdit*>(sender());
input->set_value_at_time(0, line_edit->text());
break;
}
case NodeParam::kBoolean:
{
// Widget is a QCheckBox
QCheckBox* check_box = static_cast<QCheckBox*>(sender());
input->set_value_at_time(0, check_box->isChecked());
break;
}
case NodeParam::kFont:
{
// Widget is a QFontComboBox
QFontComboBox* font_combobox = static_cast<QFontComboBox*>(sender());
input->set_value_at_time(0, font_combobox->currentFont());
break;
}
case NodeParam::kFootage:
{
// Widget is a FootageComboBox
FootageComboBox* footage_combobox = static_cast<FootageComboBox*>(sender());
input->set_value_at_time(0, QVariant::fromValue(footage_combobox->SelectedFootage()));
break;
}
}
}
}