summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaj Grönholm <kaj.gronholm@qt.io>2018-04-12 14:25:28 +0300
committerKaj Grönholm <kaj.gronholm@qt.io>2018-04-13 10:06:53 +0000
commit32922ea43b0627fc539dd74ebdbe8f1ff1903ad4 (patch)
treed20023f2ed4fea77e295499916427e6e5c8ceb63
parent15a8684163c7382b86d2e6050d0d32aad71528f8 (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>
-rw-r--r--src/Authoring/Studio/Palettes/TimelineGraphicsView/Keyframe.h12
-rw-r--r--src/Authoring/Studio/Palettes/TimelineGraphicsView/KeyframeManager.cpp41
-rw-r--r--src/Authoring/Studio/Palettes/TimelineGraphicsView/KeyframeManager.h2
-rw-r--r--src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineGraphicsScene.cpp15
-rw-r--r--src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/RowTimeline.cpp12
-rw-r--r--src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/RowTimelineContextMenu.cpp2
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);