summaryrefslogtreecommitdiffstats
path: root/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineGraphicsScene.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineGraphicsScene.cpp')
-rw-r--r--src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineGraphicsScene.cpp1199
1 files changed, 0 insertions, 1199 deletions
diff --git a/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineGraphicsScene.cpp b/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineGraphicsScene.cpp
deleted file mode 100644
index b4a52760..00000000
--- a/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineGraphicsScene.cpp
+++ /dev/null
@@ -1,1199 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2018 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of Qt 3D Studio.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "TimelineGraphicsScene.h"
-#include "TimelineItem.h"
-#include "TreeHeader.h"
-#include "Ruler.h"
-#include "PlayHead.h"
-#include "RowTree.h"
-#include "RowMover.h"
-#include "RowTimeline.h"
-#include "TimelineConstants.h"
-#include "TimelineToolbar.h"
-#include "SelectionRect.h"
-#include "RowManager.h"
-#include "KeyframeManager.h"
-#include "Keyframe.h"
-#include "IDocumentEditor.h"
-#include "StudioApp.h"
-#include "Core.h"
-#include "Doc.h"
-#include "Bindings/Qt3DSDMTimelineItemBinding.h"
-#include "ResourceCache.h"
-#include "TimelineControl.h"
-#include "RowTreeContextMenu.h"
-#include "RowTimelineContextMenu.h"
-#include "StudioPreferences.h"
-#include "TimeEnums.h"
-#include "StudioClipboard.h"
-#include "Dialogs.h"
-#include "Qt3DSDMStudioSystem.h"
-#include "ClientDataModelBridge.h"
-
-#include <QtWidgets/qcombobox.h>
-#include <QtWidgets/qgraphicssceneevent.h>
-#include <QtWidgets/qgraphicslinearlayout.h>
-#include <QtWidgets/qgraphicswidget.h>
-#include <QtWidgets/qgraphicsview.h>
-#include <QtWidgets/qscrollbar.h>
-#include <QtWidgets/qmenu.h>
-#include <QtWidgets/qlabel.h>
-#include <QtWidgets/qaction.h>
-#include <QtGui/qevent.h>
-#include <QtCore/qtimer.h>
-#include <QtCore/qglobal.h>
-#include <QtWidgets/qaction.h>
-
-static const QPointF invalidPoint(-999999.0, -999999.0);
-
-TimelineGraphicsScene::TimelineGraphicsScene(TimelineWidget *timelineWidget)
- : QGraphicsScene(timelineWidget)
- , m_layoutRoot(new QGraphicsLinearLayout)
- , m_layoutTree(new QGraphicsLinearLayout(Qt::Vertical))
- , m_layoutTimeline(new QGraphicsLinearLayout(Qt::Vertical))
- , m_ruler(new Ruler)
- , m_playHead(new PlayHead(m_ruler))
- , m_widgetTimeline(timelineWidget)
- , m_widgetRoot(new QGraphicsWidget)
- , m_rowMover(new RowMover(this))
- , m_selectionRect(new SelectionRect())
- , m_rowManager(new RowManager(this, m_layoutTree, m_layoutTimeline))
- , m_keyframeManager(new KeyframeManager(this))
- , m_pressPos(invalidPoint)
- , m_pressScreenPos(invalidPoint)
- , m_timelineControl(new TimelineControl(this))
-{
- addItem(m_playHead);
- addItem(m_selectionRect);
- addItem(m_rowMover);
- addItem(m_widgetRoot);
-
- m_timebarToolTip = new QLabel(m_widgetTimeline);
- m_timebarToolTip->setObjectName(QStringLiteral("timebarToolTip"));
- m_timebarToolTip->setWindowModality(Qt::NonModal);
- m_timebarToolTip->setWindowFlags(Qt::FramelessWindowHint | Qt::ToolTip);
- m_timebarToolTip->setContentsMargins(2, 2, 2, 2);
-
- m_variantsToolTip = new QLabel(m_widgetTimeline);
- m_variantsToolTip->setObjectName(QStringLiteral("variantsToolTip"));
- m_variantsToolTip->setWindowModality(Qt::NonModal);
- m_variantsToolTip->setWindowFlags(Qt::FramelessWindowHint | Qt::ToolTip
- | Qt::WindowTransparentForInput);
- m_variantsToolTip->setContentsMargins(2, 2, 2, 2);
-
- connect(qApp, &QApplication::focusChanged,
- this, &TimelineGraphicsScene::handleApplicationFocusLoss);
-
- m_rowMover->setVisible(false);
-
- m_autoScrollTimelineTimer.setInterval(10); // 10 ms
-
- m_layoutRoot->setSpacing(0);
- m_layoutRoot->setContentsMargins(0, 0, 0, 0);
- m_layoutRoot->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
- m_widgetRoot->setLayout(m_layoutRoot);
-
- m_layoutTree->setSpacing(0);
- m_layoutTree->setContentsMargins(0, 0, 0, 0);
- m_layoutTree->setMinimumWidth(TimelineConstants::TREE_BOUND_W);
- m_layoutTree->setMaximumWidth(TimelineConstants::TREE_BOUND_W);
- m_layoutTree->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
-
- m_layoutTimeline->setSpacing(0);
- m_layoutTimeline->setContentsMargins(0, 0, 0, 0);
- m_layoutTimeline->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
-
- m_layoutRoot->addItem(m_layoutTree);
- m_layoutRoot->addItem(m_layoutTimeline);
-
- m_treeHeader = new TreeHeader(this);
-
- m_layoutTree->addItem(m_treeHeader);
- m_layoutTimeline->addItem(m_ruler);
-
- // auto scrolling (when DnD is active and hovering on top or bottom of the tree list)
- connect(&m_autoScrollTimer, &QTimer::timeout, [this]() {
- QScrollBar *scrollbar = m_widgetTimeline->viewTreeContent()->verticalScrollBar();
- if (m_autoScrollUpOn)
- scrollbar->setValue(scrollbar->value() - TimelineConstants::AUTO_SCROLL_DELTA);
- else if (m_autoScrollDownOn)
- scrollbar->setValue(scrollbar->value() + TimelineConstants::AUTO_SCROLL_DELTA);
- });
-
- connect(&m_autoScrollTimelineTimer, &QTimer::timeout, [this]() {
- if (!qApp->focusWindow() && !g_StudioApp.isOnProgress()) {
- resetMousePressParams();
- return;
- }
- QGraphicsView *timelineContent = m_widgetTimeline->viewTimelineContent();
- const QPoint scrollBarOffsets(getScrollbarOffsets());
- const QRect contentRect = timelineContent->contentsRect();
- const double right = timelineContent->width() - scrollBarOffsets.x();
- QPoint p = m_widgetTimeline->mapFromGlobal(QCursor::pos())
- - QPoint(m_widgetTimeline->viewTreeContent()->width()
- + TimelineConstants::SPLITTER_W, 0);
-
- // Limit the maximum scroll speed
- if (p.x() < 0) {
- p.setX(qMax(-TimelineConstants::TIMELINE_SCROLL_MAX_DELTA,
- p.x() / TimelineConstants::TIMELINE_SCROLL_DIVISOR));
- } else if (p.x() > right) {
- p.setX(qMin(right + TimelineConstants::TIMELINE_SCROLL_MAX_DELTA,
- right + 1 + ((p.x() - right)
- / TimelineConstants::TIMELINE_SCROLL_DIVISOR)));
- }
-
- if (m_selectionRect->isActive()) {
- p -= QPoint(0, m_widgetTimeline->navigationBar()->height() + TimelineConstants::ROW_H);
- const double bottom = timelineContent->contentsRect().height() - scrollBarOffsets.y();
- if (m_lastAutoScrollX != p.x() || p.x() <= 0 || p.x() >= right
- || m_lastAutoScrollY != p.y() || p.y() <= 0 || p.y() >= bottom) {
- m_lastAutoScrollX = p.x();
- m_lastAutoScrollY = p.y();
-
- if (p.y() < 0) {
- p.setY(qMax(-TimelineConstants::TIMELINE_SCROLL_MAX_DELTA,
- p.y() / TimelineConstants::TIMELINE_SCROLL_DIVISOR));
- } else if (p.y() > bottom) {
- p.setY(qMin(bottom + TimelineConstants::TIMELINE_SCROLL_MAX_DELTA,
- bottom + 1 + ((p.y() - bottom)
- / TimelineConstants::TIMELINE_SCROLL_DIVISOR)));
- }
-
- // Resize keyframe selection rect
- const QPointF scenePoint = timelineContent->mapToScene(p);
- timelineContent->ensureVisible(scenePoint.x(), scenePoint.y(),
- 0, 0, 0, 0);
- QRectF visibleScene(
- timelineContent->mapToScene(contentRect.topLeft()),
- timelineContent->mapToScene(contentRect.bottomRight()
- - scrollBarOffsets));
- m_selectionRect->updateSize(scenePoint, visibleScene);
- m_keyframeManager->selectKeyframesInRect(m_selectionRect->rect());
- }
- } else if (m_lastAutoScrollX != p.x() || p.x() <= 0 || p.x() >= right) {
- m_lastAutoScrollX = p.x();
-
- bool shift = QGuiApplication::queryKeyboardModifiers() & Qt::ShiftModifier;
- double scroll = timelineContent->horizontalScrollBar()->value();
- if (scroll != 0)
- scroll -= TimelineConstants::TREE_BOUND_W;
-
- double distance = p.x() + scroll - TimelineConstants::RULER_EDGE_OFFSET;
- if (m_clickedTimelineControlType == TimelineControlType::Duration
- && !m_editedTimelineRow.isNull()) {
- distance -= m_editedTimelineRow->getDurationMoveOffsetX();
- }
-
- if (shift)
- snap(distance, !m_rulerPressed);
-
- if (m_rulerPressed) {
- long time = m_ruler->distanceToTime(distance);
- if (time < 0)
- time = 0;
- g_StudioApp.GetCore()->GetDoc()->NotifyTimeChanged(time);
- } else {
- if (m_editedTimelineRow.isNull()) {
- resetMousePressParams();
- return;
- }
-
- if (m_dragging) {
- if (m_clickedTimelineControlType == TimelineControlType::StartHandle) {
- double visiblePtX = distance > 0 ? m_editedTimelineRow->getStartX() : 0;
- if (distance > m_editedTimelineRow->getEndX())
- visiblePtX += TimelineConstants::RULER_EDGE_OFFSET;
-
- m_editedTimelineRow->setStartX(distance);
- m_editedTimelineRow->showToolTip(QCursor::pos());
- timelineContent->ensureVisible(TimelineConstants::TREE_BOUND_W
- + TimelineConstants::RULER_EDGE_OFFSET
- + visiblePtX,
- m_editedTimelineRow->y(), 0, 0, 0, 0);
- } else if (m_clickedTimelineControlType == TimelineControlType::EndHandle) {
- long time = m_ruler->distanceToTime(distance);
- double edgeMargin = 0;
- if (time > TimelineConstants::MAX_SLIDE_TIME) {
- distance = m_ruler->timeToDistance(TimelineConstants::MAX_SLIDE_TIME);
- edgeMargin = TimelineConstants::RULER_EDGE_OFFSET;
- } else if (time < m_editedTimelineRow->getStartTime()) {
- edgeMargin = -TimelineConstants::RULER_EDGE_OFFSET;
- }
- m_editedTimelineRow->setEndX(distance);
- m_editedTimelineRow->showToolTip(QCursor::pos());
- rowManager()->updateRulerDuration(p.x() > right);
- timelineContent->ensureVisible(
- TimelineConstants::TREE_BOUND_W
- + TimelineConstants::RULER_EDGE_OFFSET
- + m_editedTimelineRow->getEndX() + edgeMargin,
- m_editedTimelineRow->y(), 0, 0, 0, 0);
- } else if (m_clickedTimelineControlType == TimelineControlType::Duration) {
- long time = m_ruler->distanceToTime(distance)
- + m_editedTimelineRow->getDuration(); // milliseconds
- double visiblePtX = distance
- + m_editedTimelineRow->getDurationMoveOffsetX();
- if (time > TimelineConstants::MAX_SLIDE_TIME) {
- distance = m_ruler->timeToDistance(TimelineConstants::MAX_SLIDE_TIME
- - m_editedTimelineRow->getDuration());
- visiblePtX = m_editedTimelineRow->getEndX()
- + TimelineConstants::RULER_EDGE_OFFSET;
- }
-
- m_editedTimelineRow->moveDurationTo(distance);
- m_editedTimelineRow->showToolTip(QCursor::pos());
- rowManager()->updateRulerDuration(p.x() > right);
- timelineContent->ensureVisible(
- TimelineConstants::TREE_BOUND_W
- + TimelineConstants::RULER_EDGE_OFFSET + visiblePtX,
- m_editedTimelineRow->y(), 0, 0, 0, 0);
- }
- }
- }
- }
- });
-
- connect(&m_autoScrollTriggerTimer, &QTimer::timeout, [this]() {
- m_autoScrollTimer.start(TimelineConstants::AUTO_SCROLL_PERIOD);
- });
-
- QTimer::singleShot(0, this, [this]() {
- m_playHead->setPosition(0);
- m_widgetTimeline->viewTreeContent()->horizontalScrollBar()->setValue(0);
- });
-
- QAction *action = new QAction(this);
- action->setShortcut(Qt::Key_S);
- action->setShortcutContext(Qt::ApplicationShortcut);
- connect(action, &QAction::triggered, this, &TimelineGraphicsScene::handleInsertKeyframe);
- timelineWidget->addAction(action);
-
- action = new QAction(this);
- action->setShortcut(QKeySequence(Qt::ControlModifier | Qt::AltModifier | Qt::Key_K));
- action->setShortcutContext(Qt::ApplicationShortcut);
- connect(action, &QAction::triggered, this,
- &TimelineGraphicsScene::handleDeleteChannelKeyframes);
- timelineWidget->addAction(action);
-
- action = new QAction(this);
- action->setShortcut(QKeySequence(Qt::ShiftModifier | Qt::Key_T));
- action->setShortcutContext(Qt::ApplicationShortcut);
- connect(action, &QAction::triggered, this, &TimelineGraphicsScene::handleSetTimeBarTime);
- timelineWidget->addAction(action);
-
- action = new QAction(this);
- action->setShortcut(QKeySequence(Qt::ShiftModifier | Qt::Key_G));
- action->setShortcutContext(Qt::ApplicationShortcut);
- connect(action, &QAction::triggered, this, &TimelineGraphicsScene::handleMakeComponent);
- timelineWidget->addAction(action);
-
- action = new QAction(this);
- action->setShortcut(QKeySequence(Qt::ControlModifier | Qt::ShiftModifier | Qt::Key_G));
- action->setShortcutContext(Qt::ApplicationShortcut);
- connect(action, &QAction::triggered, this, &TimelineGraphicsScene::handleEditComponent);
- timelineWidget->addAction(action);
-
- action = new QAction(this);
- action->setShortcut(QKeySequence(Qt::ControlModifier | Qt::ShiftModifier | Qt::Key_C));
- action->setShortcutContext(Qt::ApplicationShortcut);
- connect(action, &QAction::triggered, this, &TimelineGraphicsScene::handleCopyObjectPath);
- timelineWidget->addAction(action);
-
- action = new QAction(this);
- action->setShortcut(QKeySequence(Qt::ShiftModifier | Qt::Key_H));
- action->setShortcutContext(Qt::ApplicationShortcut);
- connect(action, &QAction::triggered, &g_StudioApp, &CStudioApp::toggleShy);
- timelineWidget->addAction(action);
-
- action = new QAction(this);
- action->setShortcut(QKeySequence(Qt::ControlModifier | Qt::Key_H));
- action->setShortcutContext(Qt::ApplicationShortcut);
- connect(action, &QAction::triggered, &g_StudioApp, &CStudioApp::toggleLocked);
- timelineWidget->addAction(action);
-}
-
-TimelineGraphicsScene::~TimelineGraphicsScene()
-{
- disconnect(qApp, &QApplication::focusChanged,
- this, &TimelineGraphicsScene::handleApplicationFocusLoss);
- delete m_dataInputSelector;
-}
-
-void TimelineGraphicsScene::setTimelineScale(int scl)
-{
- m_ruler->setTimelineScale(scl);
- m_playHead->updatePosition();
- updateTimelineLayoutWidth();
-
- for (int i = 1; i < m_layoutTimeline->count(); i++)
- static_cast<RowTimeline *>(m_layoutTimeline->itemAt(i)->graphicsItem())->updatePosition();
-}
-
-void TimelineGraphicsScene::setControllerText(const QString &controller)
-{
- // check that we have scene/container root item at index 1
- if (m_layoutTimeline->count() < 2)
- return;
-
- RowTimeline *rt = static_cast<RowTimeline *>(m_layoutTimeline->itemAt(1)->graphicsItem());
- rt->setControllerText(controller);
-}
-
-void TimelineGraphicsScene::updateTimelineLayoutWidth()
-{
- double timelineWidth = TimelineConstants::RULER_EDGE_OFFSET * 2
- + m_ruler->maxDuration() * TimelineConstants::RULER_MILLI_W
- * m_ruler->timelineScale();
-
- m_layoutTimeline->setMinimumWidth(timelineWidth);
- m_layoutTimeline->setMaximumWidth(timelineWidth);
-}
-
-void TimelineGraphicsScene::updateControllerLayoutWidth()
-{
- if (m_layoutTimeline->count() < 2)
- return;
- auto root = m_layoutTimeline->itemAt(1);
-
- static_cast<RowTimeline *>(root->graphicsItem())->setEndTime(ruler()->duration());
-}
-
-void TimelineGraphicsScene::updateController()
-{
- setControllerText(m_widgetTimeline->toolbar()->getCurrentController());
-}
-
-void TimelineGraphicsScene::commitMoveRows()
-{
- if (!m_rowMover->insertionTarget()
- || m_rowMover->sourceRows().contains(m_rowMover->insertionTarget())) {
- return;
- }
-
- // handles for the moving rows
- qt3dsdm::TInstanceHandleList sourceHandles;
- const auto sourceRows = m_rowMover->sourceRows();
- for (auto sourceRow : sourceRows) {
- qt3dsdm::Qt3DSDMInstanceHandle handleSource = static_cast<Qt3DSDMTimelineItemBinding *>
- (sourceRow->getBinding())->GetInstance();
- sourceHandles.push_back(handleSource);
- }
- qt3dsdm::Qt3DSDMInstanceHandle handleTarget = static_cast<Qt3DSDMTimelineItemBinding *>
- (m_rowMover->insertionTarget()->getBinding())->GetInstance();
-
- if (!m_rowMover->insertionParent()->expanded())
- m_rowMover->insertionParent()->updateExpandStatus(RowTree::ExpandState::Expanded, false);
-
- // Remove sourcerows for items that will be deleted as result of RearrangeObjects,
- // f.ex objects that will be moved to a component; otherwise we try to update
- // timeline rows that no longer have valid scene objects linked to them.
- // Note that we remove all sourcerows that are being dragged currently, because they
- // all share the same drop target anyway.
- if (m_rowMover->shouldDeleteAfterMove()) {
- for (auto sourceRow : sourceRows)
- m_rowMover->removeSourceRow(sourceRow);
- }
-
- Q3DStudio::SCOPED_DOCUMENT_EDITOR(*g_StudioApp.GetCore()->GetDoc(),
- QObject::tr("Move Rows"))
- ->RearrangeObjects(sourceHandles, handleTarget, m_rowMover->insertionType());
-
- // updating the UI happens in TimelineWidget.onChildAdded()
-}
-
-void TimelineGraphicsScene::updateTreeWidth(double treeWidth)
-{
- if (m_treeWidth != treeWidth) {
- m_treeWidth = treeWidth;
- update();
- }
-}
-
-double TimelineGraphicsScene::treeWidth() const
-{
- return m_treeWidth;
-}
-
-void TimelineGraphicsScene::setMouseCursor(CMouseCursor::Qt3DSMouseCursor cursor)
-{
- if (m_currentCursor != cursor) {
- if (m_currentCursor != -1)
- qApp->changeOverrideCursor(CResourceCache::GetInstance()->GetCursor(cursor));
- else
- qApp->setOverrideCursor(CResourceCache::GetInstance()->GetCursor(cursor));
- m_currentCursor = cursor;
- }
-}
-
-void TimelineGraphicsScene::resetMouseCursor()
-{
- if (m_currentCursor != -1) {
- // Restoring back to no-override state seems to not change the cursor automatically
- // to the default cursor, so let's do that manually before restoring the cursor
- qApp->changeOverrideCursor(Qt::ArrowCursor);
- qApp->restoreOverrideCursor();
- m_currentCursor = -1;
- }
-}
-
-void TimelineGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
-{
- g_StudioApp.setLastActiveView(m_widgetTimeline);
-
- if ((event->modifiers() & Qt::AltModifier) && !m_dragging) {
- if (event->button() == Qt::RightButton && !m_timelinePanning) {
- // Start zooming
- m_timelineZooming = true;
- m_pressScreenPos = event->screenPos();
- event->accept();
- return;
- } else if (event->button() == Qt::MiddleButton && !m_timelineZooming) {
- // Start panning
- m_timelinePanning = true;
- m_pressPos = event->scenePos();
- event->accept();
- return;
- }
- }
-
- // Ignore non-left presses if dragging
- if (event->button() != Qt::LeftButton && (m_dragging || m_startRowMoverOnNextDrag)) {
- event->accept();
- return;
- }
-
- if (m_widgetTimeline->blockMousePress())
- return;
-
- if (!m_widgetTimeline->isFullReconstructPending() && event->button() == Qt::LeftButton) {
- resetMousePressParams();
- m_pressPos = event->scenePos();
- QGraphicsItem *item = itemAt(m_pressPos, QTransform());
- const bool ctrlKeyDown = event->modifiers() & Qt::ControlModifier;
- if (item) {
- item = getItemBelowType(TimelineItem::TypePlayHead, item, m_pressPos);
- if (item->type() == TimelineItem::TypeRuler) {
- m_rulerPressed = true;
- m_autoScrollTimelineTimer.start();
- } else if (item->type() == TimelineItem::TypeTreeHeader) {
- if (m_treeHeader->handleButtonsClick(m_pressPos) != TreeControlType::None) {
- m_rowManager->updateFiltering();
- updateSnapSteps();
- }
- } else if (item->type() == TimelineItem::TypeRowTree
- || item->type() == TimelineItem::TypeRowTreeLabelItem) {
- item = getItemBelowType(TimelineItem::TypeRowTreeLabelItem, item, m_pressPos);
- RowTree *rowTree = static_cast<RowTree *>(item);
- m_clickedTreeControlType = rowTree->getClickedControl(m_pressPos);
- if (m_clickedTreeControlType == TreeControlType::Shy
- || m_clickedTreeControlType == TreeControlType::Hide
- || m_clickedTreeControlType == TreeControlType::Lock) {
- m_rowManager->updateFiltering(rowTree);
- updateSnapSteps();
- } else if (m_clickedTreeControlType == TreeControlType::None) {
- // Prepare to change selection to single selection at release if a multiselected
- // row is clicked without ctrl.
- if (!ctrlKeyDown && m_rowManager->isRowSelected(rowTree)
- && !m_rowManager->isSingleSelected() ) {
- m_releaseSelectRow = rowTree;
- }
- m_rowManager->selectRow(rowTree, ctrlKeyDown);
- if (rowTree->draggable())
- m_startRowMoverOnNextDrag = true;
- } else if (m_clickedTreeControlType == TreeControlType::Arrow) {
- updateSnapSteps();
- }
- } else if (item->type() == TimelineItem::TypeRowTimeline) {
- m_editedTimelineRow = static_cast<RowTimeline *>(item);
- Keyframe *keyframe = m_editedTimelineRow->getClickedKeyframe(m_pressPos);
- if (keyframe) { // pressed a keyframe
- if (ctrlKeyDown && keyframe->selected()) {
- if (m_editedTimelineRow->rowTree()->isProperty())
- m_keyframeManager->deselectKeyframe(keyframe);
- else
- m_keyframeManager->deselectConnectedKeyframes(keyframe);
- } else {
- if (!ctrlKeyDown && !keyframe->selected())
- m_keyframeManager->deselectAllKeyframes();
-
- if (m_editedTimelineRow->rowTree()->isProperty())
- m_keyframeManager->selectKeyframe(keyframe);
- else
- m_keyframeManager->selectConnectedKeyframes(keyframe);
-
- m_pressPosInKeyframe = (m_pressPos.x() - m_ruler->x())
- - (TimelineConstants::RULER_EDGE_OFFSET
- + m_ruler->timeToDistance(keyframe->time));
- m_pressedKeyframe = keyframe;
- }
- } else {
- m_keyframeManager->deselectAllKeyframes();
- m_clickedTimelineControlType
- = m_editedTimelineRow->getClickedControl(m_pressPos);
-
- // clicked an empty spot on a timeline row, start selection rect.
- if (m_clickedTimelineControlType == TimelineControlType::None) {
- m_selectionRect->start(m_pressPos);
- } else if (m_clickedTimelineControlType == TimelineControlType::Duration) {
- if (!ctrlKeyDown
- && m_rowManager->isRowSelected(m_editedTimelineRow->rowTree())
- && !m_rowManager->isSingleSelected()) {
- m_releaseSelectRow = m_editedTimelineRow->rowTree();
- }
-
- m_rowManager->selectRow(m_editedTimelineRow->rowTree(), ctrlKeyDown);
- // click position in ruler space
- m_editedTimelineRow->startDurationMove(m_pressPos.x() - m_ruler->x());
- } else if (m_clickedTimelineControlType == TimelineControlType::StartHandle
- || m_clickedTimelineControlType == TimelineControlType::EndHandle) {
- m_editedTimelineRow->updateBoundChildren(
- m_clickedTimelineControlType
- == TimelineControlType::StartHandle);
- }
- m_autoScrollTimelineTimer.start();
- }
- }
- } else {
- m_keyframeManager->deselectAllKeyframes();
-
- if (m_pressPos.x() > m_ruler->x() && m_pressPos.y() > TimelineConstants::ROW_H) {
- m_selectionRect->start(m_pressPos);
- m_autoScrollTimelineTimer.start();
- }
- }
- }
-
- QGraphicsScene::mousePressEvent(event);
-}
-
-void TimelineGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
-{
- if (m_timelineZooming) {
- int deltaY = event->screenPos().y() - m_pressScreenPos.y();
- int deltaX = event->screenPos().x() - m_pressScreenPos.x();
- // Zooming in when moving down/right.
- int delta = -deltaX - deltaY;
- const int threshold = 20;
- if (delta < -threshold) {
- m_widgetTimeline->toolbar()->onZoomInButtonClicked();
- m_pressScreenPos = event->screenPos();
- } else if (delta > threshold) {
- m_widgetTimeline->toolbar()->onZoomOutButtonClicked();
- m_pressScreenPos = event->screenPos();
- }
- } else if (m_timelinePanning) {
- int deltaX = event->scenePos().x() - m_pressPos.x();
- QScrollBar *scrollbar = m_widgetTimeline->viewTimelineContent()->horizontalScrollBar();
- scrollbar->setValue(scrollbar->value() - deltaX);
- }
-
- if (m_editedTimelineRow.isNull())
- updateHoverStatus(event->scenePos());
-
- if (!m_dragging && !m_timelineZooming && !m_timelinePanning
- && m_pressPos != invalidPoint
- && (event->scenePos() - m_pressPos).manhattanLength() > 10) {
- m_dragging = true;
- }
-
- bool shift = event->modifiers() & Qt::ShiftModifier;
- if (m_dragging) {
- if (m_startRowMoverOnNextDrag || m_rowMover->isActive()) {
- // moving rows vertically (reorder/reparent)
- if (m_startRowMoverOnNextDrag) {
- m_startRowMoverOnNextDrag = false;
- m_rowMover->start(m_rowManager->selectedRows());
- }
- if (m_rowMover->isActive()) {
- m_rowMover->updateTargetRow(event->scenePos());
- updateAutoScrolling(event->scenePos().y());
- }
- } else if (m_pressedKeyframe) { // moving selected keyframes
- double newX = event->scenePos().x() - m_ruler->x()
- - TimelineConstants::RULER_EDGE_OFFSET - m_pressPosInKeyframe;
-
- if (newX < 0)
- newX = 0;
- if (shift)
- snap(newX);
-
- m_keyframeManager->moveSelectedKeyframes(ruler()->distanceToTime(newX));
-
- m_pressPos.setX(newX);
- }
- }
-
- QGraphicsScene::mouseMoveEvent(event);
-}
-
-// auto scroll when the mouse is at the top or bottom of the tree list
-void TimelineGraphicsScene::updateAutoScrolling(double scenePosY)
-{
- QScrollBar *scrollbar = m_widgetTimeline->viewTreeContent()->verticalScrollBar();
- double mouseY = scenePosY - scrollbar->value();
- int bottomY = m_widgetTimeline->height() - m_widgetTimeline->toolbar()->height()
- - TimelineConstants::ROW_H;
- if (mouseY > 0 && mouseY < TimelineConstants::ROW_H) {
- if (!m_autoScrollUpOn) {
- m_autoScrollTriggerTimer.start(TimelineConstants::AUTO_SCROLL_TRIGGER);
- m_autoScrollUpOn = true;
- }
- } else if (m_autoScrollUpOn) {
- m_autoScrollTimer.stop();
- m_autoScrollTriggerTimer.stop();
- m_autoScrollUpOn = false;
- }
-
- if (mouseY > bottomY - TimelineConstants::ROW_H - TimelineConstants::TOOLBAR_MARGIN
- && mouseY < bottomY) {
- if (!m_autoScrollDownOn) {
- m_autoScrollTriggerTimer.start(TimelineConstants::AUTO_SCROLL_TRIGGER);
- m_autoScrollDownOn = true;
- }
- } else if (m_autoScrollDownOn) {
- m_autoScrollTimer.stop();
- m_autoScrollTriggerTimer.stop();
- m_autoScrollDownOn = false;
- }
-}
-
-void TimelineGraphicsScene::stopAutoScroll() {
- m_autoScrollTimer.stop();
- m_autoScrollTriggerTimer.stop();
- m_autoScrollUpOn = false;
- m_autoScrollDownOn = false;
-}
-
-void TimelineGraphicsScene::updateSnapSteps()
-{
- m_snapSteps.clear();
- // i = 1 is always the scene row (or component root)
- for (int i = 2; i < m_layoutTimeline->count(); i++) {
- RowTree *rowTree = static_cast<RowTree *>(m_layoutTree->itemAt(i)->graphicsItem());
- if (rowTree->hasDurationBar() && rowTree->isVisible()) {
- double startX = rowTree->rowTimeline()->getStartX();
- if (!m_snapSteps.contains(startX))
- m_snapSteps.push_back(startX);
-
- double endX = rowTree->rowTimeline()->getEndX();
- if (!m_snapSteps.contains(endX))
- m_snapSteps.push_back(endX);
-
- // add keyframes times
- if (rowTree->hasPropertyChildren()) {
- const QList<Keyframe *> keyframes = rowTree->rowTimeline()->keyframes();
- for (Keyframe *k : keyframes) {
- double kX = m_ruler->timeToDistance(k->time);
- if (!m_snapSteps.contains(kX))
- m_snapSteps.push_back(kX);
- }
- }
- }
- }
-}
-
-TExpandMap &TimelineGraphicsScene::expandMap()
-{
- return m_expandMap;
-}
-
-void TimelineGraphicsScene::resetMousePressParams()
-{
- m_autoScrollTimelineTimer.stop();
- m_selectionRect->end();
- m_rowMover->end();
- m_dragging = false;
- m_timelineZooming = false;
- m_timelinePanning = false;
- m_startRowMoverOnNextDrag = false;
- m_rulerPressed = false;
- m_pressedKeyframe = nullptr;
- m_clickedTimelineControlType = TimelineControlType::None;
- m_editedTimelineRow.clear();
- m_releaseSelectRow.clear();
- m_autoScrollTimer.stop();
- m_autoScrollTriggerTimer.stop();
- m_timebarToolTip->hide();
- m_pressPos = invalidPoint;
- m_pressScreenPos = invalidPoint;
- m_lastAutoScrollX = -1.0;
- m_lastAutoScrollY = -1.0;
-}
-
-void TimelineGraphicsScene::resetPressedKeyframe()
-{
- m_pressedKeyframe = nullptr;
-}
-
-QLabel *TimelineGraphicsScene::timebarTooltip()
-{
- return m_timebarToolTip;
-}
-
-void TimelineGraphicsScene::snap(double &value, bool snapToPlayHead)
-{
- // snap to play head
- if (snapToPlayHead) {
- double playHeadX = m_playHead->x() - TimelineConstants::TREE_BOUND_W
- - TimelineConstants::RULER_EDGE_OFFSET;
- if (abs(value - playHeadX) < CStudioPreferences::GetSnapRange()) {
- value = playHeadX;
- return;
- }
- }
-
- // duration edges snap
- for (double v : qAsConst(m_snapSteps)) {
- if (abs(value - v) < CStudioPreferences::GetSnapRange()) {
- value = v;
- return;
- }
- }
-
- // time steps snap
- if (CStudioPreferences::IsTimelineSnappingGridActive()) {
- double snapStep = TimelineConstants::RULER_SEC_W * m_ruler->timelineScale();
- if (CStudioPreferences::GetTimelineSnappingGridResolution() == SNAPGRID_HALFSECONDS)
- snapStep *= .5;
- else if (CStudioPreferences::GetTimelineSnappingGridResolution() == SNAPGRID_TICKMARKS)
- snapStep *= .1;
-
- double snapValue = round(value / snapStep) * snapStep;
- if (abs(value - snapValue) < CStudioPreferences::GetSnapRange())
- value = snapValue;
- }
-}
-
-void TimelineGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
-{
- if (event->button() == Qt::LeftButton) {
- if (m_dragging) {
- if (m_rowMover->isActive()) { // moving rows (reorder/reparent)
- commitMoveRows();
- } else if (m_pressedKeyframe) {
- // update keyframe movement (time) to binding
- m_keyframeManager->commitMoveSelectedKeyframes();
- } else if (m_clickedTimelineControlType == TimelineControlType::StartHandle) {
- if (!m_editedTimelineRow.isNull()) {
- ITimelineTimebar *timebar = m_editedTimelineRow->rowTree()->getBinding()
- ->GetTimelineItem()->GetTimebar();
- timebar->ChangeTime(m_editedTimelineRow->getStartTime(), true);
- timebar->CommitTimeChange();
- }
- } else if (m_clickedTimelineControlType == TimelineControlType::EndHandle) {
- if (!m_editedTimelineRow.isNull()) {
- ITimelineTimebar *timebar = m_editedTimelineRow->rowTree()->getBinding()
- ->GetTimelineItem()->GetTimebar();
- timebar->ChangeTime(m_editedTimelineRow->getEndTime(), false);
- timebar->CommitTimeChange();
- if (m_playHead->time() > ruler()->duration())
- g_StudioApp.GetCore()->GetDoc()->NotifyTimeChanged(ruler()->duration());
- }
- } else if (m_clickedTimelineControlType == TimelineControlType::Duration) {
- if (!m_editedTimelineRow.isNull()) {
- ITimelineTimebar *timebar = m_editedTimelineRow->rowTree()->getBinding()
- ->GetTimelineItem()->GetTimebar();
- timebar->OffsetTime(m_editedTimelineRow->getDurationMoveTime());
- timebar->CommitTimeChange();
- if (m_playHead->time() > ruler()->duration())
- g_StudioApp.GetCore()->GetDoc()->NotifyTimeChanged(ruler()->duration());
- }
- }
- } else if (!m_rulerPressed && (!m_releaseSelectRow.isNull() || !itemAt(event->scenePos(),
- QTransform()))) {
- m_rowManager->selectRow(nullptr);
- if (!m_releaseSelectRow.isNull())
- m_rowManager->selectRow(m_releaseSelectRow);
- }
- }
-
- if (m_timelineZooming)
- updateSnapSteps();
-
- resetMousePressParams();
-
- QGraphicsScene::mouseReleaseEvent(event);
-}
-
-void TimelineGraphicsScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
-{
- if (event->button() == Qt::LeftButton) {
- const QPointF scenePos = event->scenePos();
- QGraphicsItem *item = itemAt(scenePos, QTransform());
- if (item) {
- QGraphicsItem *itemBelowPlayhead =
- getItemBelowType(TimelineItem::TypePlayHead, item, scenePos);
- if (item->type() == TimelineItem::TypeRuler
- || itemBelowPlayhead->type() == TimelineItem::TypeRuler) {
- CDoc *doc = g_StudioApp.GetCore()->GetDoc();
- g_StudioApp.GetDialogs()->asyncDisplayTimeEditDialog(doc->GetCurrentViewTime(),
- doc, PLAYHEAD,
- m_keyframeManager);
- } else {
- item = itemBelowPlayhead;
- if (item->type() == TimelineItem::TypeRowTree) {
- RowTree *treeItem = static_cast<RowTree *>(item);
- if (treeItem->isProperty())
- treeItem->togglePropertyExpanded();
- } else if (item->type() == TimelineItem::TypeRowTreeLabelItem) {
- RowTreeLabelItem *treeLabelItem = static_cast<RowTreeLabelItem *>(item);
- if (treeLabelItem->parentRow()->isProperty()) {
- treeLabelItem->parentRow()->togglePropertyExpanded();
- } else if (!treeLabelItem->isLocked()
- && treeLabelItem->parentRow()->objectType() != OBJTYPE_SCENE
- && treeLabelItem->parentRow()->objectType() != OBJTYPE_IMAGE) {
- int instance = treeLabelItem->parentRow()->instance();
- const auto bridge = g_StudioApp.GetCore()->GetDoc()->GetStudioSystem()
- ->GetClientDataModelBridge();
- if (bridge->GetObjectType(instance) != OBJTYPE_REFERENCEDMATERIAL
- || bridge->GetSourcePath(instance).isEmpty()) {
- // Tree labels text can be edited with double-click,
- // except for Scene label and basic materials
- treeLabelItem->setEnabled(true);
- treeLabelItem->setFocus();
- }
- }
- } else if (item->type() == TimelineItem::TypeRowTimeline) {
- RowTimeline *rowTimeline = static_cast<RowTimeline *>(item);
- Keyframe *clickedKeyframe = rowTimeline->getClickedKeyframe(scenePos);
- if (clickedKeyframe) {
- m_pressedKeyframe = clickedKeyframe;
- g_StudioApp.GetDialogs()->asyncDisplayTimeEditDialog(
- clickedKeyframe->time, g_StudioApp.GetCore()->GetDoc(),
- ASSETKEYFRAME, m_keyframeManager);
- } else {
- if (!rowTimeline->rowTree()->locked())
- handleSetTimeBarTime();
- }
- }
- }
- }
- }
-
- QGraphicsScene::mouseDoubleClickEvent(event);
-}
-
-void TimelineGraphicsScene::wheelEvent(QGraphicsSceneWheelEvent *wheelEvent)
-{
- // Make sure drag states update on wheel scrolls done during drag
- m_lastAutoScrollX = -1.0;
- m_lastAutoScrollY = -1.0;
- QGraphicsScene::wheelEvent(wheelEvent);
-}
-
-void TimelineGraphicsScene::keyPressEvent(QKeyEvent *keyEvent)
-{
- // Eat left/right arrow keys on tree side unless some item (e.g. label) has focus
- if ((keyEvent->key() == Qt::Key_Left || keyEvent->key() == Qt::Key_Right)
- && (qApp->focusObject() == m_widgetTimeline->viewTreeContent() && !focusItem())) {
- keyEvent->accept();
- return;
- } else if (keyEvent->key() == Qt::Key_Escape && m_rowMover->isActive()) {
- m_rowMover->end();
- } else if (keyEvent->key() == Qt::Key_Delete && !m_rowMover->isActive()
- && !focusItem()) {
- g_StudioApp.DeleteSelectedObject(); // Despite the name, this deletes objects and keyframes
- }
- // Make sure drag states update on keyboard scrolls done during drag
- if (keyEvent->key() == Qt::Key_Left || keyEvent->key() == Qt::Key_Right
- || keyEvent->key() == Qt::Key_Up || keyEvent->key() == Qt::Key_Down) {
- m_lastAutoScrollX = -1.0;
- m_lastAutoScrollY = -1.0;
- }
-
- QGraphicsScene::keyPressEvent(keyEvent);
-}
-
-void TimelineGraphicsScene::keyReleaseEvent(QKeyEvent *keyEvent)
-{
- QGraphicsScene::keyReleaseEvent(keyEvent);
-}
-
-void TimelineGraphicsScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
-{
- // No context menu if user is pressing ALT (so panning/zooming timeline)
- bool alt = event->modifiers() & Qt::AltModifier;
- RowTree *row = m_rowManager->getRowAtPos(QPointF(0, event->scenePos().y()));
- if (!row || m_widgetTimeline->isFullReconstructPending() || m_dragging
- || m_startRowMoverOnNextDrag || row->locked() || alt) {
- return;
- }
-
- resetMousePressParams(); // Make sure our mouse handling doesn't get confused by context menu
-
- // Internally some things like make component depend on the correct row being selected,
- // so make sure it is.
- m_rowManager->selectRow(row);
- if (event->scenePos().x() > TimelineConstants::TREE_BOUND_W) { // timeline context menu
- RowTimelineContextMenu timelineContextMenu(row, m_keyframeManager, event,
- m_timelineControl);
- timelineContextMenu.exec(event->screenPos());
- } else { // tree context menu
- if (!row->isProperty()) {
- RowTreeContextMenu treeContextMenu(row);
- treeContextMenu.exec(event->screenPos());
- }
- }
-}
-
-bool TimelineGraphicsScene::event(QEvent *event)
-{
- switch (event->type()) {
- case QEvent::ShortcutOverride:
- if (static_cast<QKeyEvent *>(event)->key() == Qt::Key_Delete) {
- QGraphicsScene::keyPressEvent(static_cast<QKeyEvent *>(event));
- event->accept();
- return true;
- }
- Q_FALLTHROUGH();
-
- default:
- return QGraphicsScene::event(event);
- }
-}
-
-void TimelineGraphicsScene::updateHoverStatus(const QPointF &scenePos)
-{
- bool variantsAreaHovered = false;
- QGraphicsItem *item = itemAt(scenePos, QTransform());
- if (item) {
- item = getItemBelowType(TimelineItem::TypePlayHead, item, scenePos);
- // update timeline row cursor
- if (item->type() == TimelineItem::TypeRowTimeline) {
- RowTimeline *timelineItem = static_cast<RowTimeline *>(item);
- TimelineControlType controlType = timelineItem->getClickedControl(scenePos);
- if (controlType == TimelineControlType::StartHandle
- || controlType == TimelineControlType::EndHandle) {
- setMouseCursor(CMouseCursor::CURSOR_RESIZE_LEFTRIGHT);
- } else {
- resetMouseCursor();
- }
- } else if (!m_dragging && (item->type() == TimelineItem::TypeRowTree
- || item->type() == TimelineItem::TypeRowTreeLabelItem)) {
- // update tree row variants tooltip
- RowTree *rowTree = item->type() == TimelineItem::TypeRowTree
- ? static_cast<RowTree *>(item)
- : static_cast<RowTreeLabelItem *>(item)->parentRow();
- if (!rowTree->isProperty()) {
- int left = rowTree->clipX();
- int right = (int)rowTree->treeWidth() - TimelineConstants::TREE_ICONS_W;
- variantsAreaHovered = scenePos.x() > left && scenePos.x() < right;
- if (variantsAreaHovered && rowTree != m_variantsRowTree) {
- CDoc *doc = g_StudioApp.GetCore()->GetDoc();
- const auto propertySystem = doc->GetStudioSystem()->GetPropertySystem();
- const auto bridge = doc->GetStudioSystem()->GetClientDataModelBridge();
- auto property = bridge->getVariantsProperty(rowTree->instance());
-
- using namespace qt3dsdm;
- SValue sValue;
- if (propertySystem->GetInstancePropertyValue(rowTree->instance(), property,
- sValue)) {
- QString propVal = get<TDataStrPtr>(sValue)->toQString();
- if (!propVal.isEmpty()) {
- // parse propVal into variantsHash (group => tags)
- const QStringList tagPairs = propVal.split(QLatin1Char(','));
- QHash<QString, QStringList> variantsHash;
- QStringList variantsHashKeys; // maintain traverse order
- for (auto &tagPair : tagPairs) {
- const QStringList pair = tagPair.split(QLatin1Char(':'));
- variantsHash[pair[0]].append(pair[1]);
- if (!variantsHashKeys.contains(pair[0]))
- variantsHashKeys.append(pair[0]);
- }
-
- // parse variantsHash into tooltipStr
- const auto variantsDef
- = g_StudioApp.GetCore()->getProjectFile().variantsDef();
- QString templ = QStringLiteral("<font color='%1'>%2</font>");
- QString tooltipStr("<table>");
- for (auto &g : qAsConst(variantsHashKeys)) {
- tooltipStr.append("<tr><td>");
- tooltipStr.append(templ.arg(variantsDef[g].m_color).arg(g + ": "));
- tooltipStr.append("</td><td>");
- for (auto &t : qAsConst(variantsHash[g]))
- tooltipStr.append(t + ", ");
- tooltipStr.chop(2);
- tooltipStr.append("</td></tr>");
- }
- tooltipStr.append("</table>");
-
- int ttY = int(rowTree->y())
- + widgetTimeline()->navigationBar()->height();
-
- m_variantsToolTip->setText(tooltipStr);
- m_variantsToolTip->adjustSize();
- m_variantsToolTip->move(m_widgetTimeline->mapToGlobal({right, ttY}));
- m_variantsToolTip->raise();
- m_variantsToolTip->show();
- m_variantsRowTree = rowTree;
- }
- }
- }
- }
- }
- }
-
- if (m_variantsRowTree && !variantsAreaHovered) {
- m_variantsToolTip->hide();
- m_variantsRowTree = nullptr;
- }
-}
-
-// Return next item below [type] item, or item itself
-// Used at least for skipping PlayHead and RowTreeLabelItem
-QGraphicsItem *TimelineGraphicsScene::getItemBelowType(TimelineItem::ItemType type,
- QGraphicsItem *item,
- const QPointF &scenePos) const
-{
- if (item->type() == type) {
- const QList<QGraphicsItem *> hoverItems = items(scenePos);
- if (hoverItems.size() > 1)
- return hoverItems.at(1);
- }
- return item;
-}
-
-QPoint TimelineGraphicsScene::getScrollbarOffsets() const
-{
- QGraphicsView *timelineContent = m_widgetTimeline->viewTimelineContent();
- return QPoint(timelineContent->verticalScrollBar()->isVisible()
- ? timelineContent->verticalScrollBar()->width() : 0,
- timelineContent->horizontalScrollBar()->isVisible()
- ? timelineContent->horizontalScrollBar()->height() : 0);
-}
-
-void TimelineGraphicsScene::handleInsertKeyframe()
-{
- RowTree *selectedRow = m_rowManager->selectedRow();
- if (selectedRow)
- selectedRow->getBinding()->InsertKeyframe();
-}
-
-void TimelineGraphicsScene::handleDeleteChannelKeyframes()
-{
- RowTree *selectedRow = m_rowManager->selectedRow();
- if (selectedRow)
- selectedRow->getBinding()->DeleteAllChannelKeyframes();
-}
-
-void TimelineGraphicsScene::handleSetTimeBarTime()
-{
- RowTree *selectedRow = m_rowManager->selectedRow();
- if (selectedRow && selectedRow->hasDurationBar()) {
- m_timelineControl->setRowTimeline(selectedRow->rowTimeline());
- m_timelineControl->showDurationEditDialog();
- }
-}
-
-void TimelineGraphicsScene::handleMakeComponent()
-{
- RowTree *selectedRow = m_rowManager->selectedRow();
- if (selectedRow) {
- selectedRow->getBinding()->PerformTransaction(
- ITimelineItemBinding::EUserTransaction_MakeComponent);
- }
-}
-
-void TimelineGraphicsScene::handleCopyObjectPath()
-{
- RowTree *selectedRow = m_rowManager->selectedRow();
- if (selectedRow) {
- CStudioClipboard::CopyTextToClipboard(
- selectedRow->getBinding()->GetObjectPath().toQString());
- }
-}
-
-void TimelineGraphicsScene::handleEditComponent()
-{
- RowTree *selectedRow = m_rowManager->selectedRow();
- if (selectedRow && selectedRow->getBinding()->IsValidTransaction(
- ITimelineItemBinding::EUserTransaction_EditComponent)) {
- selectedRow->getBinding()->OpenAssociatedEditor();
- }
-}
-
-void TimelineGraphicsScene::handleApplicationFocusLoss()
-{
- // Hide the timebar and variants tooltips if application loses focus
- if (!QApplication::focusWidget()) {
- m_timebarToolTip->hide();
- m_variantsToolTip->hide();
- }
-}
-
-void TimelineGraphicsScene::handleShowDISelector(const QString &propertyname,
- qt3dsdm::Qt3DSDMInstanceHandle inInst,
- const QPoint &pos)
-{
- auto doc = g_StudioApp.GetCore()->GetDoc();
- qt3dsdm::Qt3DSDMPropertyHandle propHandle = doc->GetPropertySystem()
- ->GetAggregateInstancePropertyByName(inInst, propertyname.toStdWString().c_str());
-
- QVector<EDataType> allowedTypes = CDataInputDlg::getAcceptedTypes(
- doc->GetPropertySystem()->GetDataType(propHandle));
-
- // Instantiate selector in TimelineGraphicsScene instead of the originating context menu,
- // as context menu gets destructed when a selection is made.
- if (!m_dataInputSelector)
- m_dataInputSelector = new DataInputSelectView(allowedTypes, widgetTimeline());
-
- QVector<QPair<QString, int>> dataInputList;
- for (auto &it : qAsConst(g_StudioApp.m_dataInputDialogItems))
- dataInputList.append({it->name, it->type});
- // needs to be set just in case we are reusing an existing datainput selector instance
- m_dataInputSelector->setMatchingTypes(allowedTypes);
- m_dataInputSelector->setTypeFilter(DataInputTypeFilter::MatchingTypes);
- m_dataInputSelector->setData(dataInputList, m_dataInputSelector->getNoneString(),
- propHandle, inInst);
- m_dataInputSelector->setCurrentController(doc->GetCurrentController(inInst, propHandle));
-
- connect(m_dataInputSelector, &DataInputSelectView::dataInputChanged,
- [&](int handle, int instance, const QString &controllerName) {
- bool controlled = controllerName != m_dataInputSelector->getNoneString();
- g_StudioApp.GetCore()->GetDoc()
- ->SetInstancePropertyControlled(instance, Q3DStudio::CString(), handle,
- Q3DStudio::CString::fromQString(controllerName),
- controlled);
- });
-
- CDialogs::showWidgetBrowser(widgetTimeline(), m_dataInputSelector, pos);
-}
-
-// Getters
-Ruler *TimelineGraphicsScene::ruler() const { return m_ruler; }
-PlayHead *TimelineGraphicsScene::playHead() const { return m_playHead; }
-TreeHeader *TimelineGraphicsScene::treeHeader() const { return m_treeHeader; }
-RowMover *TimelineGraphicsScene::rowMover() const { return m_rowMover; }
-RowManager *TimelineGraphicsScene::rowManager() const { return m_rowManager; }
-QGraphicsWidget *TimelineGraphicsScene::widgetRoot() const { return m_widgetRoot; }
-KeyframeManager *TimelineGraphicsScene::keyframeManager() const { return m_keyframeManager; }
-QGraphicsLinearLayout *TimelineGraphicsScene::layoutTree() const { return m_layoutTree; }
-QGraphicsLinearLayout *TimelineGraphicsScene::layoutTimeline() const { return m_layoutTimeline; }
-TimelineWidget *TimelineGraphicsScene::widgetTimeline() const { return m_widgetTimeline; }
-Keyframe *TimelineGraphicsScene::pressedKeyframe() const { return m_pressedKeyframe; }