diff --git a/app/widget/curvewidget/curveview.cpp b/app/widget/curvewidget/curveview.cpp index 375d9604a..a9b43d4a9 100644 --- a/app/widget/curvewidget/curveview.cpp +++ b/app/widget/curvewidget/curveview.cpp @@ -60,21 +60,6 @@ void CurveView::Clear() lines_.clear(); } -void CurveView::SetTrackCount(int count) -{ - track_count_ = count; - - track_visible_.resize(track_count_); - track_visible_.fill(true); -} - -void CurveView::SetTrackVisible(int track, bool visible) -{ - track_visible_[track] = visible; - - SetKeyframeTrackVisible(track, visible); -} - void CurveView::ConnectInput(NodeInput *input) { if (connected_inputs_.contains(input)) { @@ -87,6 +72,11 @@ void CurveView::ConnectInput(NodeInput *input) foreach (NodeKeyframePtr key, track) { this->AddKeyframe(key); } + + if (!keyframe_colors_.contains(&track)) { + // Generate a random color for this input + keyframe_colors_.insert(&track, QColor::fromHsv(std::rand()%360, std::rand()%255, 255)); + } } // Append to the list @@ -175,87 +165,85 @@ void CurveView::drawBackground(QPainter *painter, const QRectF &rect) painter->drawLines(lines); // Draw keyframe lines + foreach (NodeInput* input, connected_inputs_) { + if (input->is_keyframing()) { + foreach (const NodeInput::KeyframeTrack& track, input->keyframe_tracks()) { + if (!track.isEmpty()) { + painter->setPen(QPen(keyframe_colors_.value(&track), qMax(1, fontMetrics().height() / 4))); - for (int j=0;j keyframe_lines; - painter->setPen(QPen(GetKeyframeColor(j), qMax(1, fontMetrics().height() / 4))); - QList keys = GetKeyframesSortedByTime(j); + // Draw straight line leading to first keyframe + QPointF first_key_pos = item_map().value(track.first().get())->pos(); + keyframe_lines.append(QLineF(QPointF(scene_bottom_left.x(), first_key_pos.y()), first_key_pos)); - if (!keys.isEmpty()) { - QVector keyframe_lines; + // Draw lines between each keyframe + for (int i=1;ipos(); - keyframe_lines.append(QLineF(QPointF(scene_bottom_left.x(), first_key_pos.y()), first_key_pos)); + KeyframeViewItem* before_item = item_map().value(before.get()); + KeyframeViewItem* after_item = item_map().value(after.get()); - // Draw lines between each keyframe - for (int i=1;itype() == NodeKeyframe::kHold) { + // Draw a hold keyframe (basically a right angle) + keyframe_lines.append(QLineF(before_item->pos().x(), + before_item->pos().y(), + after_item->pos().x(), + before_item->pos().y())); + keyframe_lines.append(QLineF(after_item->pos().x(), + before_item->pos().y(), + after_item->pos().x(), + after_item->pos().y())); + } else if (before->type() == NodeKeyframe::kBezier && after->type() == NodeKeyframe::kBezier) { + // Draw a cubic bezier - KeyframeViewItem* before_item = item_map().value(before); - KeyframeViewItem* after_item = item_map().value(after); + // Cubic beziers have two control points, so we can just use both + QPointF before_control_point = before_item->pos() + ScalePoint(before->bezier_control_out()); + QPointF after_control_point = after_item->pos() + ScalePoint(after->bezier_control_in()); - if (before->type() == NodeKeyframe::kHold) { - // Draw a hold keyframe (basically a right angle) - keyframe_lines.append(QLineF(before_item->pos().x(), - before_item->pos().y(), - after_item->pos().x(), - before_item->pos().y())); - keyframe_lines.append(QLineF(after_item->pos().x(), - before_item->pos().y(), - after_item->pos().x(), - after_item->pos().y())); - } else if (before->type() == NodeKeyframe::kBezier && after->type() == NodeKeyframe::kBezier) { - // Draw a cubic bezier + QPainterPath path; + path.moveTo(before_item->pos()); + path.cubicTo(before_control_point, after_control_point, after_item->pos()); + painter->drawPath(path); - // Cubic beziers have two control points, so we can just use both - QPointF before_control_point = before_item->pos() + ScalePoint(before->bezier_control_out()); - QPointF after_control_point = after_item->pos() + ScalePoint(after->bezier_control_in()); + } else if (before->type() == NodeKeyframe::kBezier || after->type() == NodeKeyframe::kBezier) { + // Draw a quadratic bezier - QPainterPath path; - path.moveTo(before_item->pos()); - path.cubicTo(before_control_point, after_control_point, after_item->pos()); - painter->drawPath(path); + // Quadratic beziers have a single control point, we just have to determine which it is + QPointF key_anchor; + QPointF control_point; - } else if (before->type() == NodeKeyframe::kBezier || after->type() == NodeKeyframe::kBezier) { - // Draw a quadratic bezier + if (before->type() == NodeKeyframe::kBezier) { + key_anchor = before_item->pos(); + control_point = before->bezier_control_out(); + } else { + key_anchor = after_item->pos(); + control_point = after->bezier_control_in(); + } - // Quadratic beziers have a single control point, we just have to determine which it is - QPointF key_anchor; - QPointF control_point; + // Scale control point + control_point = key_anchor + ScalePoint(control_point); - if (before->type() == NodeKeyframe::kBezier) { - key_anchor = before_item->pos(); - control_point = before->bezier_control_out(); - } else { - key_anchor = after_item->pos(); - control_point = after->bezier_control_in(); + // Create the path from both keyframes + QPainterPath path; + path.moveTo(before_item->pos()); + path.quadTo(control_point, after_item->pos()); + painter->drawPath(path); + + } else { + // Linear to linear + keyframe_lines.append(QLineF(before_item->pos(), after_item->pos())); + } } - // Scale control point - control_point = key_anchor + ScalePoint(control_point); + // Draw straight line leading from end keyframe + QPointF last_key_pos = item_map().value(track.last().get())->pos(); + keyframe_lines.append(QLineF(last_key_pos, QPointF(scene_top_right.x(), last_key_pos.y()))); - // Create the path from both keyframes - QPainterPath path; - path.moveTo(before_item->pos()); - path.quadTo(control_point, after_item->pos()); - painter->drawPath(path); - - } else { - // Linear to linear - keyframe_lines.append(QLineF(before_item->pos(), after_item->pos())); + painter->drawLines(keyframe_lines); } } - - // Draw straight line leading from end keyframe - QPointF last_key_pos = item_map().value(keys.last())->pos(); - keyframe_lines.append(QLineF(last_key_pos, QPointF(scene_top_right.x(), last_key_pos.y()))); - - painter->drawLines(keyframe_lines); } } @@ -318,35 +306,6 @@ void CurveView::ContextMenuEvent(Menu &m) //QAction* reset_zoom_action = m.addAction(tr("Reset Zoom")); } -QList CurveView::GetKeyframesSortedByTime(int track) -{ - QList sorted; - - for (auto it=item_map().cbegin();it!=item_map().cend();it++) { - NodeKeyframe* key = it.key(); - - if (key->track() != track) { - continue; - } - - bool inserted = false; - - for (int i=0;itime() > key->time()) { - sorted.insert(i, key); - inserted = true; - break; - } - } - - if (!inserted) { - sorted.append(key); - } - } - - return sorted; -} - qreal CurveView::GetItemYFromKeyframeValue(NodeKeyframe *key) { return GetItemYFromKeyframeValue(key->value().toDouble()); @@ -381,17 +340,6 @@ void CurveView::CreateBezierControlPoints(KeyframeViewItem* item) connect(bezier_out_pt, &QObject::destroyed, this, &CurveView::BezierControlPointDestroyed, Qt::DirectConnection); } -QColor CurveView::GetKeyframeColor(int track) const -{ - if (track_count_) { - QColor c; - c.setHsvF(static_cast(track) / static_cast(track_count_), 0.5, 1.0); - return c; - } - - return palette().text().color(); -} - void CurveView::KeyframeValueChanged() { NodeKeyframe* key = static_cast(sender()); @@ -443,15 +391,13 @@ void CurveView::ZoomToFit() return; } - QMap::const_iterator i; - rational min_time = RATIONAL_MAX; rational max_time = RATIONAL_MIN; double min_val = DBL_MAX; double max_val = DBL_MIN; - for (i=item_map().constBegin(); i!=item_map().constEnd(); i++) { + for (auto i=item_map().constBegin(); i!=item_map().constEnd(); i++) { rational transformed_time = GetAdjustedTime(i.key()->parent()->parentNode(), GetTimeTarget(), i.key()->time(), @@ -479,7 +425,7 @@ void CurveView::AddKeyframe(NodeKeyframePtr key) { KeyframeViewItem* item = AddKeyframeInternal(key); SetItemYFromKeyframeValue(key.get(), item); - item->SetOverrideBrush(GetKeyframeColor(key->track())); + item->SetOverrideBrush(keyframe_colors_.value(&key->parent()->keyframe_tracks().at(key->track()))); connect(key.get(), &NodeKeyframe::ValueChanged, this, &CurveView::KeyframeValueChanged); connect(key.get(), &NodeKeyframe::TypeChanged, this, &CurveView::KeyframeTypeChanged); diff --git a/app/widget/curvewidget/curveview.h b/app/widget/curvewidget/curveview.h index a5a9dce8c..762a015c5 100644 --- a/app/widget/curvewidget/curveview.h +++ b/app/widget/curvewidget/curveview.h @@ -38,10 +38,6 @@ public: virtual void Clear() override; - void SetTrackCount(int count); - - void SetTrackVisible(int track, bool visible); - void ConnectInput(NodeInput* input); void DisconnectNode(Node* node); @@ -67,8 +63,6 @@ protected: virtual void ContextMenuEvent(Menu &m) override; private: - QList GetKeyframesSortedByTime(int track); - qreal GetItemYFromKeyframeValue(NodeKeyframe* key); qreal GetItemYFromKeyframeValue(double value); @@ -80,7 +74,7 @@ private: void CreateBezierControlPoints(KeyframeViewItem *item); - QColor GetKeyframeColor(int track) const; + QMap keyframe_colors_; int text_padding_; @@ -90,12 +84,8 @@ private: QList bezier_control_points_; - QVector track_visible_; - QList connected_inputs_; - int track_count_; - private slots: void KeyframeValueChanged(); diff --git a/app/widget/keyframeview/keyframeviewbase.cpp b/app/widget/keyframeview/keyframeviewbase.cpp index c114faf81..b53a0c236 100644 --- a/app/widget/keyframeview/keyframeviewbase.cpp +++ b/app/widget/keyframeview/keyframeviewbase.cpp @@ -109,10 +109,6 @@ KeyframeViewItem *KeyframeViewBase::AddKeyframeInternal(NodeKeyframePtr key) item->SetScale(GetScale()); item_map_.insert(key.get(), item); scene()->addItem(item); - - if (hidden_tracks_.contains(key->track())) { - item->setVisible(false); - } } return item; @@ -306,27 +302,6 @@ void KeyframeViewBase::TimeTargetChangedEvent(Node *target) } } -void KeyframeViewBase::SetKeyframeTrackVisible(int track, bool visible) -{ - if (!visible == hidden_tracks_.contains(track)) { - return; - } - - QMap::const_iterator i; - - for (i=item_map_.constBegin(); i!=item_map_.constEnd(); i++) { - if (i.key()->track() == track) { - i.value()->setVisible(visible); - } - } - - if (visible) { - hidden_tracks_.removeOne(track); - } else { - hidden_tracks_.append(track); - } -} - void KeyframeViewBase::ContextMenuEvent(Menu& m) { Q_UNUSED(m) diff --git a/app/widget/keyframeview/keyframeviewbase.h b/app/widget/keyframeview/keyframeviewbase.h index c6d40fbd8..f25a66937 100644 --- a/app/widget/keyframeview/keyframeviewbase.h +++ b/app/widget/keyframeview/keyframeviewbase.h @@ -62,8 +62,6 @@ protected: virtual void TimeTargetChangedEvent(Node*) override; - void SetKeyframeTrackVisible(int track, bool visible); - virtual void ContextMenuEvent(Menu &m); private: @@ -98,8 +96,6 @@ private: bool currently_autoselecting_; - QList hidden_tracks_; - private slots: void ShowContextMenu(); diff --git a/app/widget/nodeparamview/nodeparamview.cpp b/app/widget/nodeparamview/nodeparamview.cpp index 389a1db97..159c8d64d 100644 --- a/app/widget/nodeparamview/nodeparamview.cpp +++ b/app/widget/nodeparamview/nodeparamview.cpp @@ -308,7 +308,7 @@ void NodeParamView::ItemRequestedTimeChanged(const rational &time) void NodeParamView::UpdateGlobalScrollBar() { - int height_offscreen = param_widget_container_->height() - ruler()->height(); + int height_offscreen = param_widget_container_->height() - ruler()->height() + scrollbar()->height(); keyframe_view_->SetMaxScroll(height_offscreen); vertical_scrollbar_->setRange(0, height_offscreen - keyframe_view_->height());