From d8df104c35b7a29aa58cde136b0296877955d75f Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 14 Apr 2020 23:26:59 +1000 Subject: [PATCH] keyframeviewbase: for one-dimensional views, if multiple keys are at the same time, select all of them --- app/widget/keyframeview/keyframeviewbase.cpp | 38 ++++++++++++++++++-- app/widget/keyframeview/keyframeviewbase.h | 4 +++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/app/widget/keyframeview/keyframeviewbase.cpp b/app/widget/keyframeview/keyframeviewbase.cpp index fce735a3a..300fbf4b3 100644 --- a/app/widget/keyframeview/keyframeviewbase.cpp +++ b/app/widget/keyframeview/keyframeviewbase.cpp @@ -36,12 +36,14 @@ KeyframeViewBase::KeyframeViewBase(QWidget *parent) : TimelineViewBase(parent), dragging_bezier_point_(nullptr), y_axis_enabled_(false), - y_scale_(1.0) + y_scale_(1.0), + currently_autoselecting_(false) { SetDefaultDragMode(RubberBandDrag); setContextMenuPolicy(Qt::CustomContextMenu); connect(this, &KeyframeViewBase::customContextMenuRequested, this, &KeyframeViewBase::ShowContextMenu); + connect(scene(), &QGraphicsScene::selectionChanged, this, &KeyframeViewBase::AutoSelectKeyTimeNeighbors); } void KeyframeViewBase::Clear() @@ -128,7 +130,6 @@ void KeyframeViewBase::mousePressEvent(QMouseEvent *event) GetAdjustedTime(key->key()->parent()->parentNode(), GetTimeTarget(), key->key()->time(), NodeParam::kOutput), key->key()->value().toDouble()}); } - } } } @@ -480,4 +481,37 @@ void KeyframeViewBase::ShowKeyframePropertiesDialog() } } +void KeyframeViewBase::AutoSelectKeyTimeNeighbors() +{ + if (currently_autoselecting_ || y_axis_enabled_) { + return; + } + + // Prevents infinite loop + currently_autoselecting_ = true; + + QList selected_items = scene()->selectedItems(); + + foreach (QGraphicsItem* g, selected_items) { + KeyframeViewItem* key_item = static_cast(g); + + rational key_time = key_item->key()->time(); + + QList keys = key_item->key()->parent()->get_keyframe_at_time(key_time); + + foreach (NodeKeyframePtr k, keys) { + if (k == key_item->key()) { + continue; + } + + // Ensure this key is not already selected + KeyframeViewItem* item = item_map_.value(k.get()); + + item->setSelected(true); + } + } + + currently_autoselecting_ = false; +} + OLIVE_NAMESPACE_EXIT diff --git a/app/widget/keyframeview/keyframeviewbase.h b/app/widget/keyframeview/keyframeviewbase.h index 46f50452b..71b46f6a7 100644 --- a/app/widget/keyframeview/keyframeviewbase.h +++ b/app/widget/keyframeview/keyframeviewbase.h @@ -96,11 +96,15 @@ private: double y_scale_; + bool currently_autoselecting_; + private slots: void ShowContextMenu(); void ShowKeyframePropertiesDialog(); + void AutoSelectKeyTimeNeighbors(); + }; OLIVE_NAMESPACE_EXIT