From b1a5c793e31aa68e5f33ed7b64e0b1563d5efc0a Mon Sep 17 00:00:00 2001 From: Janne Kangas Date: Wed, 6 Jun 2018 10:09:01 +0300 Subject: Improve datainput visualization in timeline Show controlling datainput over time context root (scene or component) timeline bar. Change bar color when animation has controlling datainput. Task-ID: QT3DS-1662 Change-Id: I19b4be622a48b9a3c8c5416bf3fc7c7b319cff68 Reviewed-by: Miikka Heikkinen --- .../Palettes/TimelineGraphicsView/RowManager.cpp | 2 + .../TimelineGraphicsView/TimelineConstants.h | 2 + .../TimelineGraphicsView/TimelineGraphicsScene.cpp | 24 +++++++++++ .../TimelineGraphicsView/TimelineGraphicsScene.h | 3 ++ .../TimelineGraphicsView/TimelineWidget.cpp | 10 +++++ .../TimelineGraphicsView/ui/RowTimeline.cpp | 46 +++++++++++++++++++-- .../Palettes/TimelineGraphicsView/ui/RowTimeline.h | 2 + .../Palettes/TimelineGraphicsView/ui/Ruler.cpp | 1 + .../Palettes/TimelineGraphicsView/ui/Ruler.h | 1 + .../TimelineGraphicsView/ui/TimelineToolbar.cpp | 8 ++++ .../TimelineGraphicsView/ui/TimelineToolbar.h | 2 + src/Authoring/Studio/images.qrc | 2 + .../Studio/images/Objects-DataInput-White.png | Bin 0 -> 363 bytes .../Studio/images/Objects-DataInput-White@2x.png | Bin 0 -> 601 bytes 14 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 src/Authoring/Studio/images/Objects-DataInput-White.png create mode 100644 src/Authoring/Studio/images/Objects-DataInput-White@2x.png (limited to 'src/Authoring') diff --git a/src/Authoring/Studio/Palettes/TimelineGraphicsView/RowManager.cpp b/src/Authoring/Studio/Palettes/TimelineGraphicsView/RowManager.cpp index defbf1ff..d78bed7f 100644 --- a/src/Authoring/Studio/Palettes/TimelineGraphicsView/RowManager.cpp +++ b/src/Authoring/Studio/Palettes/TimelineGraphicsView/RowManager.cpp @@ -275,9 +275,11 @@ void RowManager::updateRulerDuration(bool updateMaxDuration) if (dur_i > maxDuration) maxDuration = dur_i; } + rootRow->rowTimeline()->setEndTime(maxDuration); } m_scene->ruler()->setDuration(duration); + if (updateMaxDuration) m_scene->ruler()->setMaxDuration(maxDuration); } diff --git a/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineConstants.h b/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineConstants.h index 9c3ab457..52a54e7a 100644 --- a/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineConstants.h +++ b/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineConstants.h @@ -73,6 +73,8 @@ namespace TimelineConstants const char ROW_COLOR_DURATION_SELECTED[] = "#80000000"; const char ROW_COLOR_DND_SRC[] = "#464600"; const char ROW_COLOR_DND_TGT[] = "#292929"; + const char ROW_COLOR_DATAINPUT_TEXT[] = "#ffffff"; + const char ROW_COLOR_DATAINPUT_DURATION[] = "#ff5102"; const char ROW_TEXT_COLOR[] = "#bbbbbb"; const char ROW_TEXT_COLOR_DISABLED[] = "#888888"; const char PLAYHEAD_COLOR[] = "#ff0066"; diff --git a/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineGraphicsScene.cpp b/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineGraphicsScene.cpp index 65aa65cc..a1efdb72 100644 --- a/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineGraphicsScene.cpp +++ b/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineGraphicsScene.cpp @@ -337,6 +337,16 @@ void TimelineGraphicsScene::setTimelineScale(int scl) static_cast(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(m_layoutTimeline->itemAt(1)->graphicsItem()); + rt->setControllerText(controller); +} + void TimelineGraphicsScene::updateTimelineLayoutWidth() { double timelineWidth = TimelineConstants::RULER_EDGE_OFFSET * 2 @@ -347,6 +357,20 @@ void TimelineGraphicsScene::updateTimelineLayoutWidth() m_layoutTimeline->setMaximumWidth(timelineWidth); } +void TimelineGraphicsScene::updateControllerLayoutWidth() +{ + if (m_layoutTimeline->count() < 2) + return; + auto root = m_layoutTimeline->itemAt(1); + + static_cast(root->graphicsItem())->setEndTime(ruler()->duration()); +} + +void TimelineGraphicsScene::updateController() +{ + setControllerText(m_widgetTimeline->toolbar()->getCurrentController()); +} + void TimelineGraphicsScene::commitMoveRows() { if (!m_rowMover->insertionTarget() diff --git a/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineGraphicsScene.h b/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineGraphicsScene.h index ec878bf0..525421ae 100644 --- a/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineGraphicsScene.h +++ b/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineGraphicsScene.h @@ -66,7 +66,10 @@ public: virtual ~TimelineGraphicsScene(); void setTimelineScale(int scale); + void setControllerText(const QString &controller); void updateTimelineLayoutWidth(); + void updateControllerLayoutWidth(); + void updateController(); Ruler *ruler() const; PlayHead *playHead() const; RowManager *rowManager() const; diff --git a/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineWidget.cpp b/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineWidget.cpp index 71688bcb..8088d170 100644 --- a/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineWidget.cpp +++ b/src/Authoring/Studio/Palettes/TimelineGraphicsView/TimelineWidget.cpp @@ -267,10 +267,19 @@ TimelineWidget::TimelineWidget(const QSize &preferredSize, QWidget *parent) m_graphicsScene->setTimelineScale(scale); }); + connect(m_toolbar, &TimelineToolbar::controllerChanged, this, + [this](const QString &controller) { + m_graphicsScene->setControllerText(controller); + }); + connect(m_graphicsScene->ruler(), &Ruler::maxDurationChanged, this, [this]() { m_graphicsScene->updateTimelineLayoutWidth(); }); + connect(m_graphicsScene->ruler(), &Ruler::durationChanged, this, [this]() { + m_graphicsScene->updateControllerLayoutWidth(); + }); + // data model listeners g_StudioApp.GetCore()->GetDispatch()->AddPresentationChangeListener(this); g_StudioApp.GetCore()->GetDispatch()->AddClientPlayChangeListener(this); @@ -689,6 +698,7 @@ void TimelineWidget::onAsyncUpdate() m_graphicsScene->updateSnapSteps(); m_fullReconstruct = false; m_graphicsScene->rowManager()->updateFiltering(); + m_graphicsScene->updateController(); onSelectionChange(doc->GetSelectedValue()); } else { if (!m_moveMap.isEmpty()) { diff --git a/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/RowTimeline.cpp b/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/RowTimeline.cpp index b35b7fe3..1e34762e 100644 --- a/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/RowTimeline.cpp +++ b/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/RowTimeline.cpp @@ -38,6 +38,7 @@ #include "Bindings/ITimelineItemBinding.h" #include "Bindings/ITimelineTimebar.h" #include "Bindings/Qt3DSDMTimelineItemProperty.h" +#include "AppFonts.h" #include #include @@ -92,8 +93,9 @@ void RowTimeline::paint(QPainter *painter, const QStyleOptionGraphicsItem *optio painter->fillRect(0, 0, size().width(), currentHeight, bgColor); } - // Duration - if (m_rowTree->hasDurationBar()) { + // Duration. Draw duration bar (for scene/component root) also if it has + // datainput controller + if (m_rowTree->hasDurationBar() || m_controllerDataInput.size()) { painter->save(); // fully outside ancestors' limits, draw fully hashed @@ -112,17 +114,47 @@ void RowTimeline::paint(QPainter *painter, const QStyleOptionGraphicsItem *optio // draw main duration part double x = qMax(m_startX, m_minStartX); double w = qMin(m_endX, m_maxEndX) - x; + static const int marginY = 3; painter->setPen(Qt::NoPen); - painter->fillRect(QRect(x, 0, w, currentHeight), m_barColor); + + if (m_controllerDataInput.size()) { + painter->fillRect(QRect(x, 0, w, currentHeight), + QColor(TimelineConstants::ROW_COLOR_DATAINPUT_DURATION)); + } else { + painter->fillRect(QRect(x, 0, w, currentHeight), m_barColor); + } if ( m_state == Selected) { // draw selection overlay on bar - int marginY = 3; painter->fillRect(QRect(x, marginY, w, currentHeight - marginY * 2), QColor(TimelineConstants::ROW_COLOR_DURATION_SELECTED)); } + if (m_controllerDataInput.size()) { + static const QPixmap pixDataInput + = QPixmap(":/images/Objects-DataInput-White.png"); + static const QFont normalFont = CAppFonts::GetInstance()->GetNormalFont(); + static const QFontMetrics fm(normalFont); + + // need clip region to limit datainput icon visibility to the same rect as we use + // for text + painter->setClipRect(x, 0, w, currentHeight); + painter->setClipping(true); + painter->setPen(QPen(QColor(TimelineConstants::ROW_COLOR_DATAINPUT_TEXT), 2)); + painter->drawText(QRect(x + pixDataInput.width(), 0, w, currentHeight), + m_controllerDataInput, QTextOption(Qt::AlignCenter)); + // place the icon marginY amount away from the datainput name + int textwidth = fm.width(m_controllerDataInput); + int iconx = x + (w - textwidth) / 2; + if (iconx < x) + iconx = x; + painter->drawPixmap(iconx, marginY, pixDataInput.width(), pixDataInput.height(), + pixDataInput); + painter->setPen(Qt::NoPen); + painter->setClipping(false); + } + // draw hashed part before painter->setBrush(QBrush(QColor(TimelineConstants::ROW_COLOR_DURATION_OFF1), Qt::BDiagPattern)); @@ -626,6 +658,12 @@ void RowTimeline::setBarColor(const QColor &color) update(); } +void RowTimeline::setControllerText(const QString &controller) +{ + m_controllerDataInput = controller; + update(); +} + void RowTimeline::updateChildrenStartRecursive(RowTree *rowTree, double oldStartX) { // Update all bound childred diff --git a/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/RowTimeline.h b/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/RowTimeline.h index 2a7dd7c9..342b8782 100644 --- a/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/RowTimeline.h +++ b/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/RowTimeline.h @@ -58,6 +58,7 @@ public: void setStartX(double startX); void setEndX(double endX); void setBarColor(const QColor &color); + void setControllerText(const QString &controller); void putSelectedKeyframesOnTop(); void updateKeyframes(); void insertKeyframe(Keyframe *keyframe); @@ -107,6 +108,7 @@ private: double m_minStartX = 0; double m_maxEndX = 0; bool m_isProperty = false; // used in the destructor + QString m_controllerDataInput; QList m_keyframes; QColor m_barColor; diff --git a/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/Ruler.cpp b/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/Ruler.cpp index 30496f9f..be0cb878 100644 --- a/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/Ruler.cpp +++ b/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/Ruler.cpp @@ -171,6 +171,7 @@ void Ruler::setDuration(double duration) if (m_duration != duration) { m_duration = duration; update(); + emit durationChanged(m_duration); } } diff --git a/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/Ruler.h b/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/Ruler.h index 8715d1d4..a601c304 100644 --- a/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/Ruler.h +++ b/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/Ruler.h @@ -60,6 +60,7 @@ protected: signals: void maxDurationChanged(double maxDuration); + void durationChanged(double duration); private: const QString timestampString(int timeMs); diff --git a/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/TimelineToolbar.cpp b/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/TimelineToolbar.cpp index 15fb3144..5b505c11 100644 --- a/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/TimelineToolbar.cpp +++ b/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/TimelineToolbar.cpp @@ -194,6 +194,11 @@ void TimelineToolbar::setTime(long totalMillis) m_timeLabel->setText(QString::asprintf("%01d:%02d.%03d", mins, secs, millis)); } +QString TimelineToolbar::getCurrentController() const +{ + return m_currController; +} + void TimelineToolbar::updatePlayButtonState(bool started) { if (started) { @@ -280,6 +285,7 @@ void TimelineToolbar::updateDataInputStatus() updateTimelineTitleColor(false); } m_diLabel->setText(m_currController); + emit controllerChanged(m_currController); } } @@ -325,6 +331,8 @@ void TimelineToolbar::onDataInputChange(int handle, int instance, const QString updateTimelineTitleColor(false); } + emit controllerChanged(m_currController); + // To indicate that this presentation timeline is controlled by data input, // we set "controlled property" of this time context root (scene or component) // to contain the name of controller followed by special indicator "@timeline". diff --git a/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/TimelineToolbar.h b/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/TimelineToolbar.h index 77298c8a..ebd0c7bb 100644 --- a/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/TimelineToolbar.h +++ b/src/Authoring/Studio/Palettes/TimelineGraphicsView/ui/TimelineToolbar.h @@ -53,6 +53,7 @@ signals: void firstFrameTriggered(); void stopTriggered(); void playTriggered(); + void controllerChanged(const QString &controller); void lastFrameTriggered(); void timelineScaleChanged(int scale); void setDurationTriggered(); @@ -61,6 +62,7 @@ public: TimelineToolbar(); virtual ~TimelineToolbar(); void setTime(long totalMillis); + QString getCurrentController() const; // IDataModelListener void OnBeginDataModelNotifications() override; diff --git a/src/Authoring/Studio/images.qrc b/src/Authoring/Studio/images.qrc index 4e018f64..be5904a3 100644 --- a/src/Authoring/Studio/images.qrc +++ b/src/Authoring/Studio/images.qrc @@ -277,6 +277,8 @@ images/remote-disabled@2x.png images/Assets-Model.png images/Assets-Model@2x.png + images/Objects-DataInput-White.png + images/Objects-DataInput-White@2x.png images/open_dialog.png diff --git a/src/Authoring/Studio/images/Objects-DataInput-White.png b/src/Authoring/Studio/images/Objects-DataInput-White.png new file mode 100644 index 00000000..346f1c86 Binary files /dev/null and b/src/Authoring/Studio/images/Objects-DataInput-White.png differ diff --git a/src/Authoring/Studio/images/Objects-DataInput-White@2x.png b/src/Authoring/Studio/images/Objects-DataInput-White@2x.png new file mode 100644 index 00000000..a5e1a406 Binary files /dev/null and b/src/Authoring/Studio/images/Objects-DataInput-White@2x.png differ -- cgit v1.2.3