use strings to connect nodes
This makes the node system somewhat more high-level with the intent of making working with them far more flexible and stable. By making the architecture more abstracted, it becomes far less rigid which should allow us to do even more with it and make it much less crash prone.
This commit is contained in:
@@ -63,59 +63,51 @@ void CurveView::Clear()
|
||||
lines_.clear();
|
||||
}
|
||||
|
||||
void CurveView::ConnectInput(NodeInput *input, int element, int track)
|
||||
void CurveView::ConnectInput(const NodeKeyframeTrackReference& ref)
|
||||
{
|
||||
NodeInput::KeyframeTrackReference ref = {input, element, track};
|
||||
|
||||
if (connected_inputs_.contains(ref)) {
|
||||
// Input wasn't connected, do nothing
|
||||
return;
|
||||
}
|
||||
|
||||
// Add keyframes from track
|
||||
AddKeyframesOfTrack(input, element, track);
|
||||
AddKeyframesOfTrack(ref);
|
||||
|
||||
// Append to the list
|
||||
connected_inputs_.append(ref);
|
||||
}
|
||||
|
||||
void CurveView::DisconnectInput(NodeInput *input, int element, int track)
|
||||
void CurveView::DisconnectInput(const NodeKeyframeTrackReference& ref)
|
||||
{
|
||||
NodeInput::KeyframeTrackReference ref = {input, element, track};
|
||||
|
||||
if (!connected_inputs_.contains(ref)) {
|
||||
// Input wasn't connected, do nothing
|
||||
return;
|
||||
}
|
||||
|
||||
// Remove keyframes belonging to this element and track
|
||||
RemoveKeyframesOfTrack(input, element, track);
|
||||
RemoveKeyframesOfTrack(ref);
|
||||
|
||||
// Remove from the list
|
||||
connected_inputs_.removeOne(ref);
|
||||
}
|
||||
|
||||
void CurveView::SelectKeyframesOfInput(NodeInput *input, int element, int track)
|
||||
void CurveView::SelectKeyframesOfInput(const NodeKeyframeTrackReference& ref)
|
||||
{
|
||||
DeselectAll();
|
||||
|
||||
for (auto it=item_map().cbegin(); it!=item_map().cend(); it++) {
|
||||
if (it.key()->parent() == input
|
||||
&& it.key()->element() == element
|
||||
&& it.key()->track() == track) {
|
||||
if (it.key()->key_track_ref() == ref) {
|
||||
it.value()->setSelected(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CurveView::ZoomToFitInput(NodeInput *input, int element, int track)
|
||||
void CurveView::ZoomToFitInput(const NodeKeyframeTrackReference& ref)
|
||||
{
|
||||
QList<NodeKeyframe*> keys;
|
||||
|
||||
for (auto it=item_map().cbegin(); it!=item_map().cend(); it++) {
|
||||
if (it.key()->parent() == input
|
||||
&& it.key()->element() == element
|
||||
&& it.key()->track() == track) {
|
||||
if (it.key()->key_track_ref() == ref) {
|
||||
keys.append(it.key());
|
||||
}
|
||||
}
|
||||
@@ -123,14 +115,14 @@ void CurveView::ZoomToFitInput(NodeInput *input, int element, int track)
|
||||
ZoomToFitInternal(keys);
|
||||
}
|
||||
|
||||
void CurveView::SetKeyframeTrackColor(const NodeInput::KeyframeTrackReference &ref, const QColor &color)
|
||||
void CurveView::SetKeyframeTrackColor(const NodeKeyframeTrackReference &ref, const QColor &color)
|
||||
{
|
||||
// Insert color into hashmap
|
||||
keyframe_colors_.insert(ref, color);
|
||||
|
||||
// Update all keyframes
|
||||
for (auto it=item_map().cbegin(); it!=item_map().cend(); it++) {
|
||||
if (it.key()->parent() == ref.input && it.key()->element() == ref.element && it.key()->track() == ref.track) {
|
||||
if (it.key()->key_track_ref() == ref) {
|
||||
it.value()->SetOverrideBrush(color);
|
||||
}
|
||||
}
|
||||
@@ -187,13 +179,14 @@ void CurveView::drawBackground(QPainter *painter, const QRectF &rect)
|
||||
painter->drawLines(lines);
|
||||
|
||||
// Draw keyframe lines
|
||||
foreach (const NodeInput::KeyframeTrackReference& ref, connected_inputs_) {
|
||||
NodeInput* input = ref.input;
|
||||
foreach (const NodeKeyframeTrackReference& ref, connected_inputs_) {
|
||||
Node* node = ref.input().node();
|
||||
const QString& input = ref.input().input();
|
||||
|
||||
if (input->IsKeyframing(ref.element)) {
|
||||
const QVector<NodeKeyframeTrack>& tracks = input->GetKeyframeTracks(ref.element);
|
||||
if (node->IsInputKeyframing(input, ref.input().element())) {
|
||||
const QVector<NodeKeyframeTrack>& tracks = node->GetKeyframeTracks(ref.input());
|
||||
|
||||
const NodeKeyframeTrack& track = tracks.at(ref.track);
|
||||
const NodeKeyframeTrack& track = tracks.at(ref.track());
|
||||
|
||||
if (!track.isEmpty()) {
|
||||
painter->setPen(QPen(keyframe_colors_.value(ref),
|
||||
@@ -348,7 +341,7 @@ void CurveView::ZoomToFitInternal(const QList<NodeKeyframe *> &keys)
|
||||
double max_val = DBL_MIN;
|
||||
|
||||
foreach (NodeKeyframe* key, keys) {
|
||||
rational transformed_time = GetAdjustedTime(key->parent()->parent(),
|
||||
rational transformed_time = GetAdjustedTime(key->parent(),
|
||||
GetTimeTarget(),
|
||||
key->time(),
|
||||
false);
|
||||
@@ -480,7 +473,7 @@ KeyframeViewItem* CurveView::AddKeyframe(NodeKeyframe* key)
|
||||
{
|
||||
KeyframeViewItem* item = super::AddKeyframe(key);
|
||||
SetItemYFromKeyframeValue(key, item);
|
||||
item->SetOverrideBrush(keyframe_colors_.value({key->parent(), key->element(), key->track()}));
|
||||
item->SetOverrideBrush(keyframe_colors_.value(key->key_track_ref()));
|
||||
|
||||
connect(key, &NodeKeyframe::ValueChanged, this, &CurveView::KeyframeValueChanged);
|
||||
connect(key, &NodeKeyframe::TypeChanged, this, &CurveView::KeyframeTypeChanged);
|
||||
|
||||
@@ -38,15 +38,15 @@ public:
|
||||
|
||||
virtual void Clear() override;
|
||||
|
||||
void ConnectInput(NodeInput* input, int element, int track);
|
||||
void ConnectInput(const NodeKeyframeTrackReference &ref);
|
||||
|
||||
void DisconnectInput(NodeInput* input, int element, int track);
|
||||
void DisconnectInput(const NodeKeyframeTrackReference &ref);
|
||||
|
||||
void SelectKeyframesOfInput(NodeInput* input, int element, int track);
|
||||
void SelectKeyframesOfInput(const NodeKeyframeTrackReference &ref);
|
||||
|
||||
void ZoomToFitInput(NodeInput* input, int element, int track);
|
||||
void ZoomToFitInput(const NodeKeyframeTrackReference &ref);
|
||||
|
||||
void SetKeyframeTrackColor(const NodeInput::KeyframeTrackReference& ref, const QColor& color);
|
||||
void SetKeyframeTrackColor(const NodeKeyframeTrackReference& ref, const QColor& color);
|
||||
|
||||
public slots:
|
||||
virtual KeyframeViewItem* AddKeyframe(NodeKeyframe* key) override;
|
||||
@@ -84,7 +84,7 @@ private:
|
||||
|
||||
void CreateBezierControlPoints(KeyframeViewItem *item);
|
||||
|
||||
QHash<NodeInput::KeyframeTrackReference, QColor> keyframe_colors_;
|
||||
QHash<NodeKeyframeTrackReference, QColor> keyframe_colors_;
|
||||
|
||||
int text_padding_;
|
||||
|
||||
@@ -94,7 +94,7 @@ private:
|
||||
|
||||
QVector<BezierControlPointItem*> bezier_control_points_;
|
||||
|
||||
QVector<NodeInput::KeyframeTrackReference> connected_inputs_;
|
||||
QVector<NodeKeyframeTrackReference> connected_inputs_;
|
||||
|
||||
private slots:
|
||||
void KeyframeValueChanged();
|
||||
|
||||
@@ -219,24 +219,37 @@ void CurveWidget::UpdateBridgeTime(const int64_t ×tamp)
|
||||
|
||||
void CurveWidget::ConnectNode(Node *node, bool connect)
|
||||
{
|
||||
foreach (NodeInput* input, node->parameters()) {
|
||||
ConnectInput(input, connect);
|
||||
foreach (const QString& input, node->inputs()) {
|
||||
ConnectInput(node, input, connect);
|
||||
}
|
||||
|
||||
// Connect add/remove signals
|
||||
if (connect) {
|
||||
QObject::connect(node, &Node::KeyframeAdded, this, &CurveWidget::AddKeyframe);
|
||||
QObject::connect(node, &Node::KeyframeRemoved, this, &CurveWidget::RemoveKeyframe);
|
||||
} else {
|
||||
QObject::disconnect(node, &Node::KeyframeAdded, this, &CurveWidget::AddKeyframe);
|
||||
QObject::disconnect(node, &Node::KeyframeRemoved, this, &CurveWidget::RemoveKeyframe);
|
||||
}
|
||||
}
|
||||
|
||||
void CurveWidget::ConnectInput(NodeInput *input, bool connect)
|
||||
void CurveWidget::ConnectInput(Node *node, const QString &input, bool connect)
|
||||
{
|
||||
int track_count = NodeValue::get_number_of_keyframe_tracks(input->GetDataType());
|
||||
if (!node->IsInputKeyframable(input)) {
|
||||
qWarning() << "Tried to connect input that isn't keyframable";
|
||||
return;
|
||||
}
|
||||
|
||||
int track_count = NodeValue::get_number_of_keyframe_tracks(node->GetInputDataType(input));
|
||||
bool multiple_tracks = track_count > 1;
|
||||
|
||||
for (int i=-1; i<input->ArraySize(); i++) {
|
||||
if (!input->IsKeyframable()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int arr_sz = node->InputArraySize(input);
|
||||
for (int i=-1; i<arr_sz; i++) {
|
||||
// Generate a random color for this input
|
||||
for (int j=0; j<input->GetKeyframeTracks(i).size(); j++) {
|
||||
NodeInput::KeyframeTrackReference ref = {input, i, j};
|
||||
const QVector<NodeKeyframeTrack>& tracks = node->GetKeyframeTracks(input, i);
|
||||
|
||||
for (int j=0; j<tracks.size(); j++) {
|
||||
NodeKeyframeTrackReference ref(NodeInput(node, input, i), j);
|
||||
|
||||
if (!keyframe_colors_.contains(ref)) {
|
||||
QColor c = QColor::fromHsv(std::rand()%360, std::rand()%255, 255);
|
||||
@@ -247,35 +260,28 @@ void CurveWidget::ConnectInput(NodeInput *input, bool connect)
|
||||
}
|
||||
}
|
||||
|
||||
if (tree_view_->IsInputEnabled(input, i, multiple_tracks ? -1 : 0)) {
|
||||
if (tree_view_->IsInputEnabled(NodeKeyframeTrackReference(NodeInput(node, input, i), multiple_tracks ? -1 : 0))) {
|
||||
if (multiple_tracks) {
|
||||
for (int j=0; j<track_count; j++) {
|
||||
if (tree_view_->IsInputEnabled(input, i, j)) {
|
||||
NodeKeyframeTrackReference ref(NodeInput(node, input, i), j);
|
||||
if (tree_view_->IsInputEnabled(ref)) {
|
||||
if (connect) {
|
||||
view_->ConnectInput(input, i, j);
|
||||
view_->ConnectInput(ref);
|
||||
} else {
|
||||
view_->DisconnectInput(input, i, j);
|
||||
view_->DisconnectInput(ref);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
NodeKeyframeTrackReference ref(NodeInput(node, input, i), 0);
|
||||
if (connect) {
|
||||
view_->ConnectInput(input, i, 0);
|
||||
view_->ConnectInput(ref);
|
||||
} else {
|
||||
view_->DisconnectInput(input, i, 0);
|
||||
view_->DisconnectInput(ref);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Connect add/remove signals
|
||||
if (connect) {
|
||||
QObject::connect(input, &NodeInput::KeyframeAdded, this, &CurveWidget::AddKeyframe);
|
||||
QObject::connect(input, &NodeInput::KeyframeRemoved, this, &CurveWidget::RemoveKeyframe);
|
||||
} else {
|
||||
QObject::disconnect(input, &NodeInput::KeyframeAdded, this, &CurveWidget::AddKeyframe);
|
||||
QObject::disconnect(input, &NodeInput::KeyframeRemoved, this, &CurveWidget::RemoveKeyframe);
|
||||
}
|
||||
}
|
||||
|
||||
void CurveWidget::SelectionChanged()
|
||||
@@ -357,12 +363,12 @@ void CurveWidget::NodeEnabledChanged(Node* n, bool e)
|
||||
ConnectNode(n, e);
|
||||
}
|
||||
|
||||
void CurveWidget::InputEnabledChanged(NodeInput *i, int element, int track, bool e)
|
||||
void CurveWidget::InputEnabledChanged(const NodeKeyframeTrackReference& ref, bool e)
|
||||
{
|
||||
if (e) {
|
||||
view_->ConnectInput(i, element, track);
|
||||
view_->ConnectInput(ref);
|
||||
} else {
|
||||
view_->DisconnectInput(i, element, track);
|
||||
view_->DisconnectInput(ref);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -376,18 +382,18 @@ void CurveWidget::RemoveKeyframe(NodeKeyframe *key)
|
||||
view_->RemoveKeyframe(key);
|
||||
}
|
||||
|
||||
void CurveWidget::InputSelectionChanged(NodeInput *input, int element, int track)
|
||||
void CurveWidget::InputSelectionChanged(const NodeKeyframeTrackReference& ref)
|
||||
{
|
||||
key_control_->SetInput(input, element);
|
||||
key_control_->SetInput(ref.input());
|
||||
|
||||
if (input) {
|
||||
view_->SelectKeyframesOfInput(input, element, track);
|
||||
if (ref.IsValid()) {
|
||||
view_->SelectKeyframesOfInput(ref);
|
||||
}
|
||||
}
|
||||
|
||||
void CurveWidget::InputDoubleClicked(NodeInput *input, int element, int track)
|
||||
void CurveWidget::InputDoubleClicked(const NodeKeyframeTrackReference& ref)
|
||||
{
|
||||
view_->ZoomToFitInput(input, element, track);
|
||||
view_->ZoomToFitInput(ref);
|
||||
}
|
||||
|
||||
void CurveWidget::KeyframeViewDragged(int x, int y)
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
#include <QWidget>
|
||||
|
||||
#include "curveview.h"
|
||||
#include "node/input.h"
|
||||
#include "widget/nodeparamview/nodeparamviewkeyframecontrol.h"
|
||||
#include "widget/nodeparamview/nodeparamviewwidgetbridge.h"
|
||||
#include "widget/nodetreeview/nodetreeview.h"
|
||||
@@ -81,9 +80,9 @@ private:
|
||||
|
||||
void ConnectNode(Node* node, bool connect);
|
||||
|
||||
void ConnectInput(NodeInput* input, bool connect);
|
||||
void ConnectInput(Node* node, const QString& input, bool connect);
|
||||
|
||||
QHash<NodeInput::KeyframeTrackReference, QColor> keyframe_colors_;
|
||||
QHash<NodeKeyframeTrackReference, QColor> keyframe_colors_;
|
||||
|
||||
NodeTreeView* tree_view_;
|
||||
|
||||
@@ -108,15 +107,15 @@ private slots:
|
||||
|
||||
void NodeEnabledChanged(Node* n, bool e);
|
||||
|
||||
void InputEnabledChanged(NodeInput* i, int element, int track, bool e);
|
||||
void InputEnabledChanged(const NodeKeyframeTrackReference &ref, bool e);
|
||||
|
||||
void AddKeyframe(NodeKeyframe* key);
|
||||
|
||||
void RemoveKeyframe(NodeKeyframe* key);
|
||||
|
||||
void InputSelectionChanged(NodeInput* input, int element, int track);
|
||||
void InputSelectionChanged(const NodeKeyframeTrackReference& ref);
|
||||
|
||||
void InputDoubleClicked(NodeInput* input, int element, int track);
|
||||
void InputDoubleClicked(const NodeKeyframeTrackReference& ref);
|
||||
|
||||
void KeyframeViewDragged(int x, int y);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user