Files
oak-editor/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp
T

317 lines
9.0 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();
// Return empty list if the NodeInput has no actual input data types
if (base_input->inputs().isEmpty()) {
return;
}
// 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:
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(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(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(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(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_focus_manager->MostRecentlyFocused<ProjectPanel>();
footage_combobox->SetRoot(pp->project()->root());
// Use multiple values
footage_combobox->SetFootage(Node::ValueToPtr<Footage>(base_input->get_value(0)));
connect(footage_combobox, SIGNAL(FootageChanged(Footage*)), 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::kRational:
break;
case NodeParam::kInt:
{
// Widget is a IntegerSlider
IntegerSlider* int_slider = static_cast<IntegerSlider*>(sender());
input->set_value(int_slider->GetValue());
break;
}
case NodeParam::kFloat:
{
// Widget is a FloatSlider
FloatSlider* float_slider = static_cast<FloatSlider*>(sender());
input->set_value(float_slider->GetValue());
break;
}
case NodeParam::kVec2:
{
// Widgets are two FloatSliders
FloatSlider* slider = static_cast<FloatSlider*>(sender());
QVector2D val = input->get_value(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(val);
break;
}
case NodeParam::kVec3:
{
// Widgets are three FloatSliders
FloatSlider* slider = static_cast<FloatSlider*>(sender());
QVector3D val = input->get_value(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(val);
break;
}
case NodeParam::kVec4:
{
// Widgets are three FloatSliders
FloatSlider* slider = static_cast<FloatSlider*>(sender());
QVector4D val = input->get_value(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(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(line_edit->text());
break;
}
case NodeParam::kBoolean:
{
// Widget is a QCheckBox
QCheckBox* check_box = static_cast<QCheckBox*>(sender());
input->set_value(check_box->isChecked());
break;
}
case NodeParam::kFont:
{
// Widget is a QFontComboBox
QFontComboBox* font_combobox = static_cast<QFontComboBox*>(sender());
input->set_value(font_combobox->currentFont());
break;
}
case NodeParam::kFootage:
{
// Widget is a FootageComboBox
FootageComboBox* footage_combobox = static_cast<FootageComboBox*>(sender());
input->set_value(Node::PtrToValue(footage_combobox->SelectedFootage()));
break;
}
}
}
}