From 0a56dbe42965d640dfe1fdf6681a1b5a696db4e6 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 9 Aug 2019 13:21:20 +1000 Subject: [PATCH] allow nodeui to modify several node values at once --- .../nodeparamview/nodeparamviewitem.cpp | 22 +++- app/widget/nodeparamview/nodeparamviewitem.h | 5 + .../nodeparamviewwidgetbridge.cpp | 119 ++++++++++-------- .../nodeparamview/nodeparamviewwidgetbridge.h | 6 +- 4 files changed, 95 insertions(+), 57 deletions(-) diff --git a/app/widget/nodeparamview/nodeparamviewitem.cpp b/app/widget/nodeparamview/nodeparamviewitem.cpp index c0c619c34..24dedeec7 100644 --- a/app/widget/nodeparamview/nodeparamviewitem.cpp +++ b/app/widget/nodeparamview/nodeparamviewitem.cpp @@ -25,7 +25,6 @@ #include -#include "nodeparamviewwidgetbridge.h" #include "project/item/sequence/sequence.h" #include "ui/icons/icons.h" @@ -80,6 +79,8 @@ void NodeParamViewItem::AttachNode(Node *n) // If the added node was the first node, set up the UI if (nodes_.size() == 1) { SetupUI(); + } else { + AddAdditionalNode(n); } } @@ -118,7 +119,9 @@ void NodeParamViewItem::SetupUI() content_layout_->addWidget(param_label, row_count, 0); // Create a widget/input bridge for this input - NodeParamViewWidgetBridge* bridge = new NodeParamViewWidgetBridge(this, static_cast(param)); + NodeParamViewWidgetBridge* bridge = new NodeParamViewWidgetBridge(this); + bridge->AddInput(static_cast(param)); + bridges_.append(bridge); // Add widgets for this parameter ot the layout const QList& widgets_for_param = bridge->widgets(); @@ -131,6 +134,21 @@ void NodeParamViewItem::SetupUI() } } +void NodeParamViewItem::AddAdditionalNode(Node *n) +{ + int bridge_count = 0; + + for (int i=0;iParameterCount();i++) { + NodeParam* param = n->ParamAt(i); + + if (param->type() == NodeParam::kInput) { + bridges_.at(bridge_count)->AddInput(static_cast(param)); + + bridge_count++; + } + } +} + void NodeParamViewItem::SetExpanded(bool e) { expanded_ = e; diff --git a/app/widget/nodeparamview/nodeparamviewitem.h b/app/widget/nodeparamview/nodeparamviewitem.h index dbddf7ddf..119b9d648 100644 --- a/app/widget/nodeparamview/nodeparamviewitem.h +++ b/app/widget/nodeparamview/nodeparamviewitem.h @@ -28,6 +28,7 @@ #include #include "node/node.h" +#include "nodeparamviewwidgetbridge.h" class NodeParamViewItemTitleBar : public QWidget { public: @@ -53,6 +54,8 @@ protected: private: void SetupUI(); + void AddAdditionalNode(Node* n); + bool expanded_; NodeParamViewItemTitleBar* title_bar_; @@ -67,6 +70,8 @@ private: QList nodes_; + QList bridges_; + private slots: void SetExpanded(bool e); }; diff --git a/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp b/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp index d5bb822fa..0f6d7d8ef 100644 --- a/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp +++ b/app/widget/nodeparamview/nodeparamviewwidgetbridge.cpp @@ -12,13 +12,19 @@ #include "panel/project/project.h" // End test code -NodeParamViewWidgetBridge::NodeParamViewWidgetBridge(QObject* parent, NodeInput* input) : - QObject(parent), - input_(input) +NodeParamViewWidgetBridge::NodeParamViewWidgetBridge(QObject* parent) : + QObject(parent) { - Q_ASSERT(parent != nullptr && input_ != nullptr); +} - CreateWidgets(); +void NodeParamViewWidgetBridge::AddInput(NodeInput *input) +{ + inputs_.append(input); + + // If this was the first input, create the widgets + if (inputs_.size() == 1) { + CreateWidgets(); + } } const QList &NodeParamViewWidgetBridge::widgets() @@ -28,13 +34,15 @@ const QList &NodeParamViewWidgetBridge::widgets() void NodeParamViewWidgetBridge::CreateWidgets() { + NodeInput* base_input = inputs_.first(); + // Return empty list if the NodeInput has no actual input data types - if (input_->inputs().isEmpty()) { + if (base_input->inputs().isEmpty()) { return; } // We assume the first data type is the "primary" type - switch (input_->inputs().first()) { + switch (base_input->inputs().first()) { // None of these inputs have applicable UI widgets case NodeParam::kNone: case NodeParam::kAny: @@ -80,7 +88,10 @@ void NodeParamViewWidgetBridge::CreateWidgets() // Pretty hacky way of getting the root folder for this node's sequence ProjectPanel* pp = olive::panel_focus_manager->MostRecentlyFocused(); footage_combobox->SetRoot(pp->project()->root()); - footage_combobox->SetFootage(Node::ValueToPtr(input_->get_value(Now()))); + + // Use multiple values + footage_combobox->SetFootage(Node::ValueToPtr(base_input->get_value(Now()))); + connect(footage_combobox, SIGNAL(FootageChanged(Footage*)), this, SLOT(WidgetCallback())); // End test code @@ -99,50 +110,52 @@ rational NodeParamViewWidgetBridge::Now() void NodeParamViewWidgetBridge::WidgetCallback() { - switch (input_->inputs().first()) { - // None of these inputs have applicable UI widgets - case NodeParam::kNone: - case NodeParam::kAny: - case NodeParam::kBlock: - case NodeParam::kTexture: - case NodeParam::kMatrix: - break; - case NodeParam::kInt: - // FIXME: LabelSlider in INTEGER mode - break; - case NodeParam::kFloat: - // FIXME: LabelSlider in FLOAT mode - 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(sender()); - break; - } - case NodeParam::kBoolean: - { - // Widget is a QCheckBox - //QCheckBox* check_box = static_cast(sender()); - break; - } - case NodeParam::kFont: - { - // Widget is a QFontComboBox - //QFontComboBox* font_combobox = static_cast(sender()); - break; - } - case NodeParam::kFootage: - { - // Widget is a FootageComboBox - FootageComboBox* footage_combobox = static_cast(sender()); - input_->set_value(Now(), Node::PtrToValue(footage_combobox->SelectedFootage())); - break; - } + foreach (NodeInput* input, inputs_) { + switch (input->inputs().first()) { + // None of these inputs have applicable UI widgets + case NodeParam::kNone: + case NodeParam::kAny: + case NodeParam::kBlock: + case NodeParam::kTexture: + case NodeParam::kMatrix: + break; + case NodeParam::kInt: + // FIXME: LabelSlider in INTEGER mode + break; + case NodeParam::kFloat: + // FIXME: LabelSlider in FLOAT mode + 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(sender()); + break; + } + case NodeParam::kBoolean: + { + // Widget is a QCheckBox + //QCheckBox* check_box = static_cast(sender()); + break; + } + case NodeParam::kFont: + { + // Widget is a QFontComboBox + //QFontComboBox* font_combobox = static_cast(sender()); + break; + } + case NodeParam::kFootage: + { + // Widget is a FootageComboBox + FootageComboBox* footage_combobox = static_cast(sender()); + input->set_value(Now(), Node::PtrToValue(footage_combobox->SelectedFootage())); + break; + } + } } } diff --git a/app/widget/nodeparamview/nodeparamviewwidgetbridge.h b/app/widget/nodeparamview/nodeparamviewwidgetbridge.h index f71b2568f..446878160 100644 --- a/app/widget/nodeparamview/nodeparamviewwidgetbridge.h +++ b/app/widget/nodeparamview/nodeparamviewwidgetbridge.h @@ -9,12 +9,14 @@ class NodeParamViewWidgetBridge : public QObject { Q_OBJECT public: - NodeParamViewWidgetBridge(QObject* parent, NodeInput* input); + NodeParamViewWidgetBridge(QObject* parent); + + void AddInput(NodeInput* input); const QList& widgets(); private: - NodeInput* input_; + QList inputs_; QList widgets_;