diff options
author | Kaj Grönholm <kaj.gronholm@qt.io> | 2018-04-12 14:25:28 +0300 |
---|---|---|
committer | Kaj Grönholm <kaj.gronholm@qt.io> | 2018-04-13 10:06:53 +0000 |
commit | 32922ea43b0627fc539dd74ebdbe8f1ff1903ad4 (patch) | |
tree | d20023f2ed4fea77e295499916427e6e5c8ceb63 | |
parent | 15a8684163c7382b86d2e6050d0d32aad71528f8 (diff) |
Select all property keyframes with master keyframe
When user (de)selects a non-property keyframe (circle), (de)select
all attached property keyframes (diamond). So when user moves a row
keyframe, all property keyframes move with it. Also undo/redo as
one transaction. Removed duplicate selected property, instead
requesting directly from bindings to make sure it is in-sync.
Task-number: QT3DS-1430
Change-Id: Iccf81655b388e6b9506c859f5852ad9c073b7ab0
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
6 files changed, 57 insertions, 27 deletions
diff --git a/src/Authoring/Studio/Palettes/TimelineGraphicsView/Keyframe.h b/src/Authoring/Studio/Palettes/TimelineGraphicsView/Keyframe.h index ab6fe38f..624a76ef 100644 --- a/src/Authoring/Studio/Palettes/TimelineGraphicsView/Keyframe.h +++ b/src/Authoring/Studio/Palettes/TimelineGraphicsView/Keyframe.h @@ -42,12 +42,16 @@ struct Keyframe , propertyType(propRow->rowTree()->propertyType()) {} + bool selected() const + { + return binding && binding->IsSelected(); + } + double time; - bool selected = false; QString propertyType; - RowTimeline *rowProperty; - RowTimeline *rowMaster; - Qt3DSDMTimelineKeyframe *binding; + RowTimeline *rowProperty = nullptr; + RowTimeline *rowMaster = nullptr; + Qt3DSDMTimelineKeyframe *binding = nullptr; }; #endif // KEYFRAME_H diff --git a/src/Authoring/Studio/Palettes/TimelineGraphicsView/KeyframeManager.cpp b/src/Authoring/Studio/Palettes/TimelineGraphicsView/KeyframeManager.cpp index 8ebd89cf..400c4707 100644 --- a/src/Authoring/Studio/Palettes/TimelineGraphicsView/KeyframeManager.cpp +++ b/src/Authoring/Studio/Palettes/TimelineGraphicsView/KeyframeManager.cpp @@ -99,7 +99,6 @@ QList<Keyframe *> KeyframeManager::insertKeyframe(RowTimeline *row, double time, void KeyframeManager::selectKeyframe(Keyframe *keyframe) { if (!m_selectedKeyframes.contains(keyframe)) { - keyframe->selected = true; m_selectedKeyframes.append(keyframe); if (!m_selectedKeyframesMasterRows.contains(keyframe->rowMaster)) @@ -112,6 +111,16 @@ void KeyframeManager::selectKeyframe(Keyframe *keyframe) } } +void KeyframeManager::selectConnectedKeyframes(Keyframe *keyframe) +{ + // Select all keyframes of same master row at same time + const auto keyframes = keyframe->rowMaster->keyframes(); + for (const auto k : keyframes) { + if (k->time == keyframe->time) + selectKeyframe(k); + } +} + void KeyframeManager::selectKeyframes(const QList<Keyframe *> &keyframes) { for (const auto keyframe : keyframes) { @@ -123,10 +132,8 @@ void KeyframeManager::selectKeyframes(const QList<Keyframe *> &keyframes) } } - for (auto keyframe : qAsConst(m_selectedKeyframes)) { - keyframe->selected = true; + for (auto keyframe : qAsConst(m_selectedKeyframes)) keyframe->binding->SetSelected(true); - } for (auto row : qAsConst(m_selectedKeyframesMasterRows)) { row->putSelectedKeyframesOnTop(); @@ -137,8 +144,10 @@ void KeyframeManager::selectKeyframes(const QList<Keyframe *> &keyframes) // update bindings after selected keyframes are moved void KeyframeManager::commitMoveSelectedKeyframes() { - for (auto keyframe : qAsConst(m_selectedKeyframes)) - keyframe->binding->SetTime(keyframe->time * 1000); + CDoc *theDoc = g_StudioApp.GetCore()->GetDoc(); + COffsetKeyframesCommandHelper h(*theDoc); + for (Keyframe *keyframe : qAsConst(m_selectedKeyframes)) + keyframe->binding->UpdateKeyframesTime(&h, keyframe->time * 1000); } void KeyframeManager::selectKeyframesInRect(const QRectF &rect) @@ -168,10 +177,8 @@ void KeyframeManager::selectKeyframesInRect(const QRectF &rect) } } - for (auto keyframe : qAsConst(m_selectedKeyframes)) { - keyframe->selected = true; + for (auto keyframe : qAsConst(m_selectedKeyframes)) keyframe->binding->SetSelected(true); - } for (auto row : qAsConst(m_selectedKeyframesMasterRows)) { row->putSelectedKeyframesOnTop(); @@ -182,21 +189,29 @@ void KeyframeManager::selectKeyframesInRect(const QRectF &rect) void KeyframeManager::deselectKeyframe(Keyframe *keyframe) { if (m_selectedKeyframes.contains(keyframe)) { - keyframe->selected = false; m_selectedKeyframes.removeAll(keyframe); keyframe->rowMaster->updateKeyframes(); m_selectedKeyframesMasterRows.removeAll(keyframe->rowMaster); keyframe->binding->SetSelected(false); + keyframe->rowMaster->putSelectedKeyframesOnTop(); + } +} + +void KeyframeManager::deselectConnectedKeyframes(Keyframe *keyframe) +{ + // Deselect all keyframes of same master row at same time + const auto keyframes = keyframe->rowMaster->keyframes(); + for (const auto k : keyframes) { + if (k->time == keyframe->time) + deselectKeyframe(k); } } void KeyframeManager::deselectAllKeyframes() { - for (auto keyframe : qAsConst(m_selectedKeyframes)) { - keyframe->selected = false; + for (auto keyframe : qAsConst(m_selectedKeyframes)) keyframe->binding->SetSelected(false); - } for (auto row : qAsConst(m_selectedKeyframesMasterRows)) row->updateKeyframes(); diff --git a/src/Authoring/Studio/Palettes/TimelineGraphicsView/KeyframeManager.h b/src/Authoring/Studio/Palettes/TimelineGraphicsView/KeyframeManager.h index 5b8b6bc6..7687c203 100644 --- a/src/Authoring/Studio/Palettes/TimelineGraphicsView/KeyframeManager.h +++ b/src/Authoring/Studio/Palettes/TimelineGraphicsView/KeyframeManager.h @@ -47,9 +47,11 @@ public: QList<Keyframe *> insertKeyframe(RowTimeline *row, double time, bool selectInsertedKeyframes = true); void selectKeyframe(Keyframe *keyframe); + void selectConnectedKeyframes(Keyframe *keyframe); void selectKeyframesInRect(const QRectF &rect); void selectKeyframes(const QList<Keyframe *> &keyframes); void deselectKeyframe(Keyframe *keyframe); + void deselectConnectedKeyframes(Keyframe *keyframe); void deselectAllKeyframes(); void deleteSelectedKeyframes(); void deleteKeyframes(RowTimeline *row, bool repaint = true); diff --git a/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineGraphicsScene.cpp b/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineGraphicsScene.cpp index de3a1214..553b708f 100644 --- a/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineGraphicsScene.cpp +++ b/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineGraphicsScene.cpp @@ -376,13 +376,20 @@ void TimelineGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *event) if (keyframe != nullptr) { // pressed a keyframe const bool ctrlKeyDown = event->modifiers() & Qt::ControlModifier; - if (ctrlKeyDown && keyframe->selected) { - m_keyframeManager->deselectKeyframe(keyframe); + if (ctrlKeyDown && keyframe->selected()) { + if (m_editedTimelineRow->rowTree()->isProperty()) + m_keyframeManager->deselectKeyframe(keyframe); + else + m_keyframeManager->deselectConnectedKeyframes(keyframe); } else { - if (!ctrlKeyDown && !keyframe->selected) + if (!ctrlKeyDown && !keyframe->selected()) m_keyframeManager->deselectAllKeyframes(); - m_keyframeManager->selectKeyframe(keyframe); + if (m_editedTimelineRow->rowTree()->isProperty()) + m_keyframeManager->selectKeyframe(keyframe); + else + m_keyframeManager->selectConnectedKeyframes(keyframe); + m_keyframePressed = true; } } else { diff --git a/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/RowTimeline.cpp b/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/RowTimeline.cpp index 2bc1a515..682e535c 100644 --- a/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/RowTimeline.cpp +++ b/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/RowTimeline.cpp @@ -134,7 +134,7 @@ void RowTimeline::paint(QPainter *painter, const QStyleOptionGraphicsItem *optio = QPixmap(":/images/Keyframe-Master-Selected.png"); for (auto keyframe : m_keyframes) { - painter->drawPixmap(timeToX(keyframe->time) - 8.5, keyFrameY, keyframe->selected + painter->drawPixmap(timeToX(keyframe->time) - 8.5, keyFrameY, keyframe->selected() ? pixKeyframeMasterSelected : pixKeyframeMasterNormal); } } else if (m_rowTree->isProperty()) { @@ -144,8 +144,8 @@ void RowTimeline::paint(QPainter *painter, const QStyleOptionGraphicsItem *optio = QPixmap(":/images/Keyframe-Property-Selected.png"); for (auto keyframe : m_keyframes) { - painter->drawPixmap(timeToX(keyframe->time) - (keyframe->selected ? 7.5 : 5.5), keyFrameY, - keyframe->selected ? pixKeyframePropertySelected + painter->drawPixmap(timeToX(keyframe->time) - (keyframe->selected() ? 7.5 : 5.5), + keyFrameY, keyframe->selected() ? pixKeyframePropertySelected : pixKeyframePropertyNormal); } } @@ -247,6 +247,8 @@ void RowTimeline::updateKeyframesFromBinding(qt3dsdm::Qt3DSDMPropertyHandle prop kf->setUI(kfUI); propRow->rowTimeline()->insertKeyframe(kfUI); propRow->parentRow()->rowTimeline()->insertKeyframe(kfUI); + if (kf->IsSelected()) + m_rowTree->m_scene->keyframeManager()->selectKeyframe(kfUI); } propRow->rowTimeline()->update(); @@ -268,7 +270,7 @@ void RowTimeline::putSelectedKeyframesOnTop() { if (!m_keyframes.empty()) std::partition(m_keyframes.begin(), m_keyframes.end(), [](Keyframe *kf) { - return !kf->selected; + return !kf->selected(); }); if (m_rowTree->hasPropertyChildren()) { // has property rows @@ -276,7 +278,7 @@ void RowTimeline::putSelectedKeyframesOnTop() for (auto child : childRows) { std::partition(child->rowTimeline()->m_keyframes.begin(), child->rowTimeline()->m_keyframes.end(), [](Keyframe *kf) { - return !kf->selected; + return !kf->selected(); }); } } diff --git a/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/RowTimelineContextMenu.cpp b/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/RowTimelineContextMenu.cpp index affd778b..e185d5e8 100644 --- a/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/RowTimelineContextMenu.cpp +++ b/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/RowTimelineContextMenu.cpp @@ -89,7 +89,7 @@ void RowTimelineContextMenu::showEvent(QShowEvent *event) Keyframe *keyframe = m_rowTree->rowTimeline()->getClickedKeyframe(m_menuEvent->scenePos()); bool ctrlPressed = m_menuEvent->modifiers() & Qt::ControlModifier; if (keyframe) { - if (!keyframe->selected && !ctrlPressed) + if (!keyframe->selected() && !ctrlPressed) m_keyframeManager->deselectAllKeyframes(); m_keyframeManager->selectKeyframe(keyframe); |