diff --git a/app/widget/curvewidget/curveview.cpp b/app/widget/curvewidget/curveview.cpp index 9376d4760..623beb213 100644 --- a/app/widget/curvewidget/curveview.cpp +++ b/app/widget/curvewidget/curveview.cpp @@ -75,11 +75,6 @@ void CurveView::ConnectInput(NodeInput *input, int element, int track) this->AddKeyframe(key); } - if (!keyframe_colors_.contains(ref)) { - // Generate a random color for this input - keyframe_colors_.insert(ref, QColor::fromHsv(std::rand()%360, std::rand()%255, 255)); - } - // Append to the list connected_inputs_.append(ref); } @@ -130,6 +125,19 @@ void CurveView::ZoomToFitInput(NodeInput *input, int element, int track) ZoomToFitInternal(keys); } +void CurveView::SetKeyframeTrackColor(const NodeInput::KeyframeTrackReference &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) { + it.value()->SetOverrideBrush(color); + } + } +} + void CurveView::drawBackground(QPainter *painter, const QRectF &rect) { if (timebase().isNull()) { @@ -341,17 +349,17 @@ void CurveView::ZoomToFitInternal(const QList &keys) double min_val = DBL_MAX; double max_val = DBL_MIN; - for (auto i=item_map().constBegin(); i!=item_map().constEnd(); i++) { - rational transformed_time = GetAdjustedTime(i.key()->parent()->parent(), + foreach (NodeKeyframe* key, keys) { + rational transformed_time = GetAdjustedTime(key->parent()->parent(), GetTimeTarget(), - i.key()->time(), + key->time(), false); min_time = qMin(transformed_time, min_time); max_time = qMax(transformed_time, max_time); - min_val = qMin(i.key()->value().toDouble(), min_val); - max_val = qMax(i.key()->value().toDouble(), max_val); + min_val = qMin(key->value().toDouble(), min_val); + max_val = qMax(key->value().toDouble(), max_val); } double time_range = max_time.toDouble() - min_time.toDouble(); @@ -361,8 +369,10 @@ void CurveView::ZoomToFitInternal(const QList &keys) emit ScaleChanged(new_x_scale); SetYScale(new_y_scale); - horizontalScrollBar()->setValue(TimeToScene(min_time) - CalculatePaddingFromDimensionScale(this->width())); - verticalScrollBar()->setValue(GetItemYFromKeyframeValue(max_val) - CalculatePaddingFromDimensionScale(this->height())); + QMetaObject::invokeMethod(horizontalScrollBar(), "setValue", Qt::QueuedConnection, + Q_ARG(int, TimeToScene(min_time) - CalculatePaddingFromDimensionScale(this->width()))); + QMetaObject::invokeMethod(verticalScrollBar(), "setValue", Qt::QueuedConnection, + Q_ARG(int, GetItemYFromKeyframeValue(max_val) - CalculatePaddingFromDimensionScale(this->height()))); } qreal CurveView::GetItemYFromKeyframeValue(NodeKeyframe *key) diff --git a/app/widget/curvewidget/curveview.h b/app/widget/curvewidget/curveview.h index c308646a6..20a14d12b 100644 --- a/app/widget/curvewidget/curveview.h +++ b/app/widget/curvewidget/curveview.h @@ -46,6 +46,8 @@ public: void ZoomToFitInput(NodeInput* input, int element, int track); + void SetKeyframeTrackColor(const NodeInput::KeyframeTrackReference& ref, const QColor& color); + public slots: void AddKeyframe(NodeKeyframe* key); diff --git a/app/widget/curvewidget/curvewidget.cpp b/app/widget/curvewidget/curvewidget.cpp index 16061fb1c..2a580cd7a 100644 --- a/app/widget/curvewidget/curvewidget.cpp +++ b/app/widget/curvewidget/curvewidget.cpp @@ -229,6 +229,23 @@ void CurveWidget::ConnectInput(NodeInput *input, bool connect) bool multiple_tracks = track_count > 1; for (int i=-1; iArraySize(); i++) { + if (!input->IsKeyframable()) { + continue; + } + + // Generate a random color for this input + for (int j=0; jGetKeyframeTracks(i).size(); j++) { + NodeInput::KeyframeTrackReference ref = {input, i, j}; + + if (!keyframe_colors_.contains(ref)) { + QColor c = QColor::fromHsv(std::rand()%360, std::rand()%255, 255); + + keyframe_colors_.insert(ref, c); + tree_view_->SetKeyframeTrackColor(ref, c); + view_->SetKeyframeTrackColor(ref, c); + } + } + if (tree_view_->IsInputEnabled(input, i, multiple_tracks ? -1 : 0)) { if (multiple_tracks) { for (int j=0; j keyframe_colors_; + NodeTreeView* tree_view_; QPushButton* linear_button_; diff --git a/app/widget/nodetreeview/nodetreeview.cpp b/app/widget/nodetreeview/nodetreeview.cpp index 467a022d0..5772150f8 100644 --- a/app/widget/nodetreeview/nodetreeview.cpp +++ b/app/widget/nodetreeview/nodetreeview.cpp @@ -23,11 +23,24 @@ bool NodeTreeView::IsInputEnabled(NodeInput *i, int element, int track) const return !disabled_inputs_.contains({i, element, track}); } +void NodeTreeView::SetKeyframeTrackColor(const NodeInput::KeyframeTrackReference &ref, const QColor &color) +{ + // Insert into hashmap + keyframe_colors_.insert(ref, color); + + // If we currently have an item for this, set it + QTreeWidgetItem* item = item_map_.value(ref); + if (item) { + item->setForeground(0, color); + } +} + void NodeTreeView::SetNodes(const QVector &nodes) { nodes_ = nodes; this->clear(); + item_map_.clear(); foreach (Node* n, nodes_) { QTreeWidgetItem* node_item = new QTreeWidgetItem(); @@ -41,24 +54,30 @@ void NodeTreeView::SetNodes(const QVector &nodes) continue; } - int type_track_count = NodeValue::get_number_of_keyframe_tracks(input->GetDataType()); - bool type_has_multiple_tracks = (type_track_count > 1); + QTreeWidgetItem* input_item = nullptr; - QTreeWidgetItem* input_item = CreateItem(node_item, input, -1, type_has_multiple_tracks ? -1 : 0); + for (int i=-1; iArraySize(); i++) { + const QVector& key_tracks = input->GetKeyframeTracks(i); - if (input->IsArray()) { - for (int i=0; iArraySize(); i++) { - QTreeWidgetItem* element_item = CreateItem(input_item, input, i, type_has_multiple_tracks ? -1 : 0); + int this_element_track; - if (type_has_multiple_tracks && show_keyframe_tracks_as_rows_) { - for (int j=0; jIsArray()))) { + this_element_track = 0; + } else { + this_element_track = -1; } - } else if (type_has_multiple_tracks && show_keyframe_tracks_as_rows_) { - for (int j=0; j 1 && (!input->IsArray() || i >= 0)) { + CreateItemsForTracks(element_item, input, i, key_tracks.size()); } } @@ -152,9 +171,24 @@ QTreeWidgetItem* NodeTreeView::CreateItem(QTreeWidgetItem *parent, NodeInput *in input_item->setData(0, kItemElement, element); input_item->setData(0, kItemTrack, track); + NodeInput::KeyframeTrackReference ref = {input, element, track}; + + if (keyframe_colors_.contains(ref)) { + input_item->setForeground(0, keyframe_colors_.value(ref)); + } + + item_map_.insert(ref, input_item); + return input_item; } +void NodeTreeView::CreateItemsForTracks(QTreeWidgetItem *parent, NodeInput *input, int element, int track_count) +{ + for (int j=0; j disabled_inputs_; + QHash item_map_; + bool only_show_keyframable_; bool show_keyframe_tracks_as_rows_; + QHash keyframe_colors_; + private slots: void ItemCheckStateChanged(QTreeWidgetItem* item, int column);