diff options
author | Mahmoud Badri <mahmoud.badri@qt.io> | 2019-08-09 15:54:13 +0300 |
---|---|---|
committer | Mahmoud Badri <mahmoud.badri@qt.io> | 2019-08-12 11:43:20 +0300 |
commit | 8a9acb021d29529c3e056829ca934bbb86235734 (patch) | |
tree | 05dfd244b5f1d6fffad688e90a5cb5f8d490e22b | |
parent | 1b9cf198c06c7da0c5b93b70c7d5e1af1721ff88 (diff) |
Implement property graph vertical ruler
Also:
- add proper icons for the maximize and fit graph buttons
- add hover effect for maximize, fit graph, and channel filtering
buttons
- disable the buttons when the row is locked
Task-number: QT3DS-3849
Change-Id: If2c276031428d4c1d84a7366c739566b7b12c2dc
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
-rw-r--r-- | src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTimelinePropertyGraph.cpp | 60 | ||||
-rw-r--r-- | src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTimelinePropertyGraph.h | 1 | ||||
-rw-r--r-- | src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTree.cpp | 256 | ||||
-rw-r--r-- | src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTree.h | 3 | ||||
-rw-r--r-- | src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/TreeHeader.cpp | 10 | ||||
-rw-r--r-- | src/Authoring/Qt3DStudio/images.qrc | 4 | ||||
-rw-r--r-- | src/Authoring/Qt3DStudio/images/maximize.png | bin | 0 -> 1070 bytes | |||
-rw-r--r-- | src/Authoring/Qt3DStudio/images/maximize@2x.png | bin | 0 -> 1163 bytes | |||
-rw-r--r-- | src/Authoring/Qt3DStudio/images/maximize_disabled.png | bin | 0 -> 1066 bytes | |||
-rw-r--r-- | src/Authoring/Qt3DStudio/images/maximize_disabled@2x.png | bin | 0 -> 1141 bytes |
10 files changed, 211 insertions, 123 deletions
diff --git a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTimelinePropertyGraph.cpp b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTimelinePropertyGraph.cpp index c5caffc6..a1f6a62a 100644 --- a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTimelinePropertyGraph.cpp +++ b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTimelinePropertyGraph.cpp @@ -69,21 +69,49 @@ void RowTimelinePropertyGraph::paintGraphs(QPainter *painter, const QRectF &rect painter->setRenderHint(QPainter::Antialiasing); painter->setClipRect(rect); - const QPointF edgeOffset(RULER_EDGE_OFFSET, 0); + static const QPointF edgeOffset(RULER_EDGE_OFFSET, 0); double timelineScale = m_rowTimeline->rowTree()->m_scene->ruler()->timelineScale(); // draw graph base line (graph_Y) painter->setPen(QPen(CStudioPreferences::studioColor3())); painter->drawLine(edgeOffset.x(), m_graphY, rect.right(), m_graphY); - // draw vertical keyframe separator line + // draw value ruler + static const int STEP_MIN = 20; + static const int STEP_MAX = 40; + static const QVector<qreal> RULER_VALS {1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000}; + + int rulerValIdx = 5; // start at val 100 + qreal step = RULER_VALS[rulerValIdx] * m_valScale; + + while (step < STEP_MIN && rulerValIdx < RULER_VALS.size() - 1) + step = RULER_VALS[++rulerValIdx] * m_valScale; + while (step > STEP_MAX && rulerValIdx > 0) + step = RULER_VALS[--rulerValIdx] * m_valScale; + + qreal dy = rect.bottom() - m_graphY; + qreal d_start = dy > 0 ? std::fmod(dy, step) : step - std::fmod(-dy, step); // start delta + qreal start_y = rect.bottom() - d_start; + painter->setFont(QFont(CStudioPreferences::GetFontFaceName(), 7)); + for (qreal i = start_y; i > rect.y(); i -= step) { + // draw ruler line + painter->setPen(QPen(CStudioPreferences::studioColor2(), 1)); + painter->drawLine(rect.x(), rect.y() + i, rect.right(), rect.y() + i); + + // draw ruler value text + painter->setPen(QPen(CStudioPreferences::studioColor3(), 1)); + qreal val_i = (m_graphY - i) / m_valScale; + painter->drawText(rect.x() + edgeOffset.x() + 3, i - 2, QString::number(qRound(val_i))); + } + + // draw vertical keyframe separator lines + painter->setPen(QPen(CStudioPreferences::studioColor2(), 1)); Qt3DSDMTimelineKeyframe::TKeyframeHandleList keyframeHandles; m_animCore->GetKeyframes(m_activeChannels[0], keyframeHandles); for (size_t i = 0; i < keyframeHandles.size(); ++i) { TKeyframe kf = m_animCore->GetKeyframeData(keyframeHandles[i]); QPointF centerPos = getKeyframePosition(GetKeyframeSeconds(kf), KeyframeValueValue(kf)) + edgeOffset; - painter->setPen(QPen(CStudioPreferences::studioColor2(), 1)); painter->drawLine(centerPos.x(), rect.y(), centerPos.x(), rect.height()); } @@ -95,6 +123,7 @@ void RowTimelinePropertyGraph::paintGraphs(QPainter *painter, const QRectF &rect long time = (j - edgeOffset.x()) / (RULER_MILLI_W * timelineScale); // millis qreal value = m_propBinding->GetChannelValueAtTime(m_activeChannelsIndex[i], time); qreal yPos = m_graphY - value * m_valScale; + if (j == start_j) path.moveTo(j, yPos); else @@ -117,8 +146,6 @@ void RowTimelinePropertyGraph::paintGraphs(QPainter *painter, const QRectF &rect for (size_t i = 0; i < m_activeChannels.size(); ++i) { // draw bezier control points static const QPixmap pixBezierHandle("://images/breadcrumb_component_button.png"); - static const QPixmap pixBezierHandlePressed("://images/breadcrumb_component_grey" - "_button.png"); Qt3DSDMTimelineKeyframe::TKeyframeHandleList keyframeHandles; m_animCore->GetKeyframes(m_activeChannels[i], keyframeHandles); @@ -155,7 +182,7 @@ void RowTimelinePropertyGraph::paintGraphs(QPainter *painter, const QRectF &rect // draw center point painter->setPen(QPen(CStudioPreferences::getBezierControlColor(), kfSelected - ? 6: 3)); + ? 6 : 3)); painter->drawPoint(centerPos); } } @@ -342,7 +369,6 @@ void RowTimelinePropertyGraph::updateChannelFiltering(const QVector<bool> &activ void RowTimelinePropertyGraph::fitGraph() { const qreal MARGIN_Y = 10; // margin at top & bottom of graph - m_graphY = m_rowTimeline->size().height() - MARGIN_Y; m_graphH = m_rowTimeline->size().height() - MARGIN_Y * 2; // get min/max keyframes values in the active channels @@ -382,11 +408,22 @@ void RowTimelinePropertyGraph::fitGraph() } m_valScale = m_graphH / (maxVal - minVal); - m_graphY += minVal * m_valScale; + checkValScaleLimits(); + + m_graphY = (m_rowTimeline->size().height() + (maxVal + minVal) * m_valScale) / 2; m_rowTimeline->update(); } +void RowTimelinePropertyGraph::checkValScaleLimits() +{ + // m_valScale can be NaN if maxVal and minVal are same (i.e. horizontal line curve) + if (isnan(m_valScale) || m_valScale > 10.f) + m_valScale = 10.f; + else if (m_valScale < .01f) + m_valScale = .01f; +} + void RowTimelinePropertyGraph::selectBezierKeyframesInRange(const QRectF &rect) { QRectF localRect = m_rowTimeline->mapFromScene(rect).boundingRect(); @@ -417,12 +454,7 @@ void RowTimelinePropertyGraph::adjustScale(bool isIncrement) { float pitch = m_valScale * .3f; m_valScale += isIncrement ? pitch : -pitch; - - if (m_valScale > 10.f) - m_valScale = 10.f; - else if (m_valScale < .01f) - m_valScale = .01f; - + checkValScaleLimits(); m_rowTimeline->update(); } diff --git a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTimelinePropertyGraph.h b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTimelinePropertyGraph.h index 5e84f5b1..bd165b4b 100644 --- a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTimelinePropertyGraph.h +++ b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTimelinePropertyGraph.h @@ -72,6 +72,7 @@ private: QPointF getBezierControlPosition(const qt3dsdm::SBezierKeyframe &kf, BezierControlType type = BezierControlType::None) const; QPointF getKeyframePosition(float time, float value) const; + void checkValScaleLimits(); std::pair<qt3dsdm::Qt3DSDMKeyframeHandle, qt3dsdm::TKeyframe> m_currKeyframeData; RowTimeline *m_rowTimeline = nullptr; diff --git a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTree.cpp b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTree.cpp index e0021fa9..53de5fdc 100644 --- a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTree.cpp +++ b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTree.cpp @@ -239,18 +239,18 @@ void RowTree::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, Q CStudioPreferences::timelineWidgetBgColor()); // Shy, eye, lock - static const QPixmap pixEmpty = QPixmap(":/images/Toggle-Empty.png"); - static const QPixmap pixShy = QPixmap(":/images/Toggle-Shy.png"); - static const QPixmap pixHide = QPixmap(":/images/Toggle-HideShow.png"); - static const QPixmap pixHideDisabled = QPixmap(":/images/Toggle-HideShow-disabled.png"); - static const QPixmap pixHideCtrld = QPixmap(":/images/Toggle-HideShowControlled.png"); - static const QPixmap pixLock = QPixmap(":/images/Toggle-Lock.png"); - static const QPixmap pixEmpty2x = QPixmap(":/images/Toggle-Empty@2x.png"); - static const QPixmap pixShy2x = QPixmap(":/images/Toggle-Shy@2x.png"); - static const QPixmap pixHide2x = QPixmap(":/images/Toggle-HideShow@2x.png"); - static const QPixmap pixHideDisabled2x = QPixmap(":/images/Toggle-HideShow-disabled@2x.png"); - static const QPixmap pixHideCtrld2x = QPixmap(":/images/Toggle-HideShowControlled@2x.png"); - static const QPixmap pixLock2x = QPixmap(":/images/Toggle-Lock@2x.png"); + static const QPixmap pixEmpty(":/images/Toggle-Empty.png"); + static const QPixmap pixShy(":/images/Toggle-Shy.png"); + static const QPixmap pixHide(":/images/Toggle-HideShow.png"); + static const QPixmap pixHideDisabled(":/images/Toggle-HideShow-disabled.png"); + static const QPixmap pixHideCtrld(":/images/Toggle-HideShowControlled.png"); + static const QPixmap pixLock(":/images/Toggle-Lock.png"); + static const QPixmap pixEmpty2x(":/images/Toggle-Empty@2x.png"); + static const QPixmap pixShy2x(":/images/Toggle-Shy@2x.png"); + static const QPixmap pixHide2x(":/images/Toggle-HideShow@2x.png"); + static const QPixmap pixHideDisabled2x(":/images/Toggle-HideShow-disabled@2x.png"); + static const QPixmap pixHideCtrld2x(":/images/Toggle-HideShowControlled@2x.png"); + static const QPixmap pixLock2x(":/images/Toggle-Lock@2x.png"); if (hasActionButtons()) { painter->drawPixmap(m_rectShy, hiResIcons ? (m_shy ? pixShy2x : pixEmpty2x) : (m_shy ? pixShy : pixEmpty)); @@ -273,10 +273,10 @@ void RowTree::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, Q : (m_locked ? pixLock : pixEmpty)); } - static const QPixmap pixInsertLeft = QPixmap(":/images/Insert-Left.png"); - static const QPixmap pixInsertRight = QPixmap(":/images/Insert-Right.png"); - static const QPixmap pixInsertLeft2x = QPixmap(":/images/Insert-Left@2x.png"); - static const QPixmap pixInsertRight2x = QPixmap(":/images/Insert-Right@2x.png"); + static const QPixmap pixInsertLeft(":/images/Insert-Left.png"); + static const QPixmap pixInsertRight(":/images/Insert-Right.png"); + static const QPixmap pixInsertLeft2x(":/images/Insert-Left@2x.png"); + static const QPixmap pixInsertRight2x(":/images/Insert-Right@2x.png"); if (m_dndState == DnDState::SP_TARGET) { // Candidate target of a subpresentation drop painter->drawPixmap(19, 2, hiResIcons ? pixInsertLeft2x : pixInsertLeft); painter->drawPixmap(rightDividerX() - 8, 2, hiResIcons ? pixInsertRight2x : pixInsertRight); @@ -286,20 +286,18 @@ void RowTree::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, Q } // Action indicators - static const QPixmap pixMasterAction = QPixmap(":/images/Action-MasterAction.png"); - static const QPixmap pixAction = QPixmap(":/images/Action-Action.png"); - static const QPixmap pixChildMasterAction = QPixmap(":/images/Action-ChildMasterAction.png"); - static const QPixmap pixChildAction = QPixmap(":/images/Action-ChildAction.png"); - static const QPixmap pixCompMasterAction = QPixmap(":/images/Action-ComponentMasterAction.png"); - static const QPixmap pixCompAction = QPixmap(":/images/Action-ComponentAction.png"); - static const QPixmap pixMasterAction2x = QPixmap(":/images/Action-MasterAction@2x.png"); - static const QPixmap pixAction2x = QPixmap(":/images/Action-Action@2x.png"); - static const QPixmap pixChildMasterAction2x - = QPixmap(":/images/Action-ChildMasterAction@2x.png"); - static const QPixmap pixChildAction2x = QPixmap(":/images/Action-ChildAction@2x.png"); - static const QPixmap pixCompMasterAction2x - = QPixmap(":/images/Action-ComponentMasterAction@2x.png"); - static const QPixmap pixCompAction2x = QPixmap(":/images/Action-ComponentAction@2x.png"); + static const QPixmap pixMasterAction(":/images/Action-MasterAction.png"); + static const QPixmap pixAction(":/images/Action-Action.png"); + static const QPixmap pixChildMasterAction(":/images/Action-ChildMasterAction.png"); + static const QPixmap pixChildAction(":/images/Action-ChildAction.png"); + static const QPixmap pixCompMasterAction(":/images/Action-ComponentMasterAction.png"); + static const QPixmap pixCompAction(":/images/Action-ComponentAction.png"); + static const QPixmap pixMasterAction2x(":/images/Action-MasterAction@2x.png"); + static const QPixmap pixAction2x(":/images/Action-Action@2x.png"); + static const QPixmap pixChildMasterAction2x(":/images/Action-ChildMasterAction@2x.png"); + static const QPixmap pixChildAction2x(":/images/Action-ChildAction@2x.png"); + static const QPixmap pixCompMasterAction2x(":/images/Action-ComponentMasterAction@2x.png"); + static const QPixmap pixCompAction2x(":/images/Action-ComponentAction@2x.png"); if (!isProperty()) { // subpresentation indicators @@ -333,15 +331,25 @@ void RowTree::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, Q painter->drawPixmap(0, 0, hiResIcons ? pixCompAction2x : pixCompAction); } else { // property row if (m_propGraphExpanded) { + if (m_hoveredRect) + painter->fillRect(*m_hoveredRect, CStudioPreferences::studioColor1()); + // draw maximize, fit graph buttons + static const QPixmap pixMaximize(":/images/maximize.png"); + static const QPixmap pixFit(":/images/editcamera_tools_hi-00.png"); + static const QPixmap pixMaximizeDisabled(":/images/maximize_disabled.png"); + static const QPixmap pixFitDisabled(":/images/editcamera_tools_hi-00_disabled.png"); if (m_PropBinding->animationType() == qt3dsdm::EAnimationTypeBezier) { - const int PROP_GRAPH_CONTROLS_Y = int(TimelineConstants::ROW_H * 1.5); - m_rectMaximizePropGraph.setRect(rightDividerX() - 16 * 1.1, PROP_GRAPH_CONTROLS_Y, - ICON_SIZE, ICON_SIZE); - m_rectFitPropGraph.setRect(rightDividerX() - 16 * 2.2, PROP_GRAPH_CONTROLS_Y, + m_rectMaximizePropGraph.setRect(rightDividerX() - 16 * 1.2, + TimelineConstants::ROW_H, ICON_SIZE, ICON_SIZE); + m_rectFitPropGraph.setRect(rightDividerX() - 16 * 2.4, TimelineConstants::ROW_H, ICON_SIZE, ICON_SIZE); - painter->drawPixmap(m_rectMaximizePropGraph, pixShy); - painter->drawPixmap(m_rectFitPropGraph, pixShy); + painter->setPen(CStudioPreferences::studioColor3()); + painter->drawRect(m_rectMaximizePropGraph); + painter->drawRect(m_rectFitPropGraph); + painter->drawPixmap(m_rectMaximizePropGraph, m_locked ? pixMaximizeDisabled + : pixMaximize); + painter->drawPixmap(m_rectFitPropGraph, m_locked ? pixFitDisabled : pixFit); } // draw channel selection buttons @@ -354,9 +362,15 @@ void RowTree::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, Q painter->setPen(CStudioPreferences::studioColor3()); painter->drawRect(m_rectChannels[i]); - painter->setPen(CStudioPreferences::textColor()); + painter->setPen(m_locked ? CStudioPreferences::studioColor3() + : CStudioPreferences::textColor()); painter->drawText(m_rectChannels[i].topLeft() + QPointF(5, 12), channelNames.at(i)); } + + if (m_hoveredRect) { + painter->setPen(CStudioPreferences::textColor()); + painter->drawRect(*m_hoveredRect); + } } } @@ -376,77 +390,73 @@ void RowTree::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, Q painter->setClipRect(0, 0, clipX(), TimelineConstants::ROW_H); // expand/collapse arrow - static const QPixmap pixArrow = QPixmap(":/images/arrow.png"); - static const QPixmap pixArrowDown = QPixmap(":/images/arrow_down.png"); - static const QPixmap pixArrow2x = QPixmap(":/images/arrow@2x.png"); - static const QPixmap pixArrowDown2x = QPixmap(":/images/arrow_down@2x.png"); + static const QPixmap pixArrow(":/images/arrow.png"); + static const QPixmap pixArrowDown(":/images/arrow_down.png"); + static const QPixmap pixArrow2x(":/images/arrow@2x.png"); + static const QPixmap pixArrowDown2x(":/images/arrow_down@2x.png"); if (m_arrowVisible) { painter->drawPixmap(m_rectArrow, hiResIcons ? (expanded() ? pixArrowDown2x : pixArrow2x) : (expanded() ? pixArrowDown : pixArrow)); } // Row type icon - static const QPixmap pixSceneNormal = QPixmap(":/images/Objects-Scene-Normal.png"); - static const QPixmap pixLayerNormal = QPixmap(":/images/Objects-Layer-Normal.png"); - static const QPixmap pixObjectNormal = QPixmap(":/images/Objects-Model-Normal.png"); - static const QPixmap pixLightNormal = QPixmap(":/images/Objects-Light-Normal.png"); - static const QPixmap pixCameraNormal = QPixmap(":/images/Objects-Camera-Normal.png"); - static const QPixmap pixTextNormal = QPixmap(":/images/Objects-Text-Normal.png"); - static const QPixmap pixAliasNormal = QPixmap(":/images/Objects-Alias-Normal.png"); - static const QPixmap pixGroupNormal = QPixmap(":/images/Objects-Group-Normal.png"); - static const QPixmap pixComponentNormal = QPixmap(":/images/Objects-Component-Normal.png"); - static const QPixmap pixMaterialNormal = QPixmap(":/images/Objects-Material-Normal.png"); - static const QPixmap pixPropertyNormal = QPixmap(":/images/Objects-Property-Normal.png"); - static const QPixmap pixImageNormal = QPixmap(":/images/Objects-Image-Normal.png"); - static const QPixmap pixBehaviorNormal = QPixmap(":/images/Objects-Behavior-Normal.png"); - static const QPixmap pixEffectNormal= QPixmap(":/images/Objects-Effect-Normal.png"); - static const QPixmap pixSceneNormal2x = QPixmap(":/images/Objects-Scene-Normal@2x.png"); - static const QPixmap pixLayerNormal2x = QPixmap(":/images/Objects-Layer-Normal@2x.png"); - static const QPixmap pixObjectNormal2x = QPixmap(":/images/Objects-Model-Normal@2x.png"); - static const QPixmap pixLightNormal2x = QPixmap(":/images/Objects-Light-Normal@2x.png"); - static const QPixmap pixCameraNormal2x = QPixmap(":/images/Objects-Camera-Normal@2x.png"); - static const QPixmap pixTextNormal2x = QPixmap(":/images/Objects-Text-Normal@2x.png"); - static const QPixmap pixAliasNormal2x = QPixmap(":/images/Objects-Alias-Normal@2x.png"); - static const QPixmap pixGroupNormal2x = QPixmap(":/images/Objects-Group-Normal@2x.png"); - static const QPixmap pixComponentNormal2x = QPixmap(":/images/Objects-Component-Normal@2x.png"); - static const QPixmap pixMaterialNormal2x = QPixmap(":/images/Objects-Material-Normal@2x.png"); - static const QPixmap pixPropertyNormal2x = QPixmap(":/images/Objects-Property-Normal@2x.png"); - static const QPixmap pixImageNormal2x = QPixmap(":/images/Objects-Image-Normal@2x.png"); - static const QPixmap pixBehaviorNormal2x = QPixmap(":/images/Objects-Behavior-Normal@2x.png"); - static const QPixmap pixEffectNormal2x = QPixmap(":/images/Objects-Effect-Normal@2x.png"); - - static const QPixmap pixSceneDisabled = QPixmap(":/images/Objects-Scene-Disabled.png"); - static const QPixmap pixLayerDisabled = QPixmap(":/images/Objects-Layer-Disabled.png"); - static const QPixmap pixObjectDisabled = QPixmap(":/images/Objects-Model-Disabled.png"); - static const QPixmap pixLightDisabled = QPixmap(":/images/Objects-Light-Disabled.png"); - static const QPixmap pixCameraDisabled = QPixmap(":/images/Objects-Camera-Disabled.png"); - static const QPixmap pixTextDisabled = QPixmap(":/images/Objects-Text-Disabled.png"); - static const QPixmap pixAliasDisabled = QPixmap(":/images/Objects-Alias-Disabled.png"); - static const QPixmap pixGroupDisabled = QPixmap(":/images/Objects-Group-Disabled.png"); - static const QPixmap pixComponentDisabled = QPixmap(":/images/Objects-Component-Disabled.png"); - static const QPixmap pixMaterialDisabled = QPixmap(":/images/Objects-Material-Disabled.png"); - static const QPixmap pixPropertyDisabled = QPixmap(":/images/Objects-Property-Disabled.png"); - static const QPixmap pixImageDisabled = QPixmap(":/images/Objects-Image-Disabled.png"); - static const QPixmap pixBehaviorDisabled = QPixmap(":/images/Objects-Behavior-Disabled.png"); - static const QPixmap pixEffectDisabled = QPixmap(":/images/Objects-Effect-Disabled.png"); - static const QPixmap pixSceneDisabled2x = QPixmap(":/images/Objects-Scene-Disabled@2x.png"); - static const QPixmap pixLayerDisabled2x = QPixmap(":/images/Objects-Layer-Disabled@2x.png"); - static const QPixmap pixObjectDisabled2x = QPixmap(":/images/Objects-Model-Disabled@2x.png"); - static const QPixmap pixLightDisabled2x = QPixmap(":/images/Objects-Light-Disabled@2x.png"); - static const QPixmap pixCameraDisabled2x = QPixmap(":/images/Objects-Camera-Disabled@2x.png"); - static const QPixmap pixTextDisabled2x = QPixmap(":/images/Objects-Text-Disabled@2x.png"); - static const QPixmap pixAliasDisabled2x = QPixmap(":/images/Objects-Alias-Disabled@2x.png"); - static const QPixmap pixGroupDisabled2x = QPixmap(":/images/Objects-Group-Disabled@2x.png"); - static const QPixmap pixComponentDisabled2x - = QPixmap(":/images/Objects-Component-Disabled@2x.png"); - static const QPixmap pixMaterialDisabled2x - = QPixmap(":/images/Objects-Material-Disabled@2x.png"); - static const QPixmap pixPropertyDisabled2x - = QPixmap(":/images/Objects-Property-Disabled@2x.png"); - static const QPixmap pixImageDisabled2x = QPixmap(":/images/Objects-Image-Disabled@2x.png"); - static const QPixmap pixBehaviorDisabled2x - = QPixmap(":/images/Objects-Behavior-Disabled@2x.png"); - static const QPixmap pixEffectDisabled2x = QPixmap(":/images/Objects-Effect-Disabled@2x.png"); + static const QPixmap pixSceneNormal(":/images/Objects-Scene-Normal.png"); + static const QPixmap pixLayerNormal(":/images/Objects-Layer-Normal.png"); + static const QPixmap pixObjectNormal(":/images/Objects-Model-Normal.png"); + static const QPixmap pixLightNormal(":/images/Objects-Light-Normal.png"); + static const QPixmap pixCameraNormal(":/images/Objects-Camera-Normal.png"); + static const QPixmap pixTextNormal(":/images/Objects-Text-Normal.png"); + static const QPixmap pixAliasNormal(":/images/Objects-Alias-Normal.png"); + static const QPixmap pixGroupNormal(":/images/Objects-Group-Normal.png"); + static const QPixmap pixComponentNormal(":/images/Objects-Component-Normal.png"); + static const QPixmap pixMaterialNormal(":/images/Objects-Material-Normal.png"); + static const QPixmap pixPropertyNormal(":/images/Objects-Property-Normal.png"); + static const QPixmap pixImageNormal(":/images/Objects-Image-Normal.png"); + static const QPixmap pixBehaviorNormal(":/images/Objects-Behavior-Normal.png"); + static const QPixmap pixEffectNormal(":/images/Objects-Effect-Normal.png"); + static const QPixmap pixSceneNormal2x(":/images/Objects-Scene-Normal@2x.png"); + static const QPixmap pixLayerNormal2x(":/images/Objects-Layer-Normal@2x.png"); + static const QPixmap pixObjectNormal2x(":/images/Objects-Model-Normal@2x.png"); + static const QPixmap pixLightNormal2x(":/images/Objects-Light-Normal@2x.png"); + static const QPixmap pixCameraNormal2x(":/images/Objects-Camera-Normal@2x.png"); + static const QPixmap pixTextNormal2x(":/images/Objects-Text-Normal@2x.png"); + static const QPixmap pixAliasNormal2x(":/images/Objects-Alias-Normal@2x.png"); + static const QPixmap pixGroupNormal2x(":/images/Objects-Group-Normal@2x.png"); + static const QPixmap pixComponentNormal2x(":/images/Objects-Component-Normal@2x.png"); + static const QPixmap pixMaterialNormal2x(":/images/Objects-Material-Normal@2x.png"); + static const QPixmap pixPropertyNormal2x(":/images/Objects-Property-Normal@2x.png"); + static const QPixmap pixImageNormal2x(":/images/Objects-Image-Normal@2x.png"); + static const QPixmap pixBehaviorNormal2x(":/images/Objects-Behavior-Normal@2x.png"); + static const QPixmap pixEffectNormal2x(":/images/Objects-Effect-Normal@2x.png"); + + static const QPixmap pixSceneDisabled(":/images/Objects-Scene-Disabled.png"); + static const QPixmap pixLayerDisabled(":/images/Objects-Layer-Disabled.png"); + static const QPixmap pixObjectDisabled(":/images/Objects-Model-Disabled.png"); + static const QPixmap pixLightDisabled(":/images/Objects-Light-Disabled.png"); + static const QPixmap pixCameraDisabled(":/images/Objects-Camera-Disabled.png"); + static const QPixmap pixTextDisabled(":/images/Objects-Text-Disabled.png"); + static const QPixmap pixAliasDisabled(":/images/Objects-Alias-Disabled.png"); + static const QPixmap pixGroupDisabled(":/images/Objects-Group-Disabled.png"); + static const QPixmap pixComponentDisabled(":/images/Objects-Component-Disabled.png"); + static const QPixmap pixMaterialDisabled(":/images/Objects-Material-Disabled.png"); + static const QPixmap pixPropertyDisabled(":/images/Objects-Property-Disabled.png"); + static const QPixmap pixImageDisabled(":/images/Objects-Image-Disabled.png"); + static const QPixmap pixBehaviorDisabled(":/images/Objects-Behavior-Disabled.png"); + static const QPixmap pixEffectDisabled(":/images/Objects-Effect-Disabled.png"); + static const QPixmap pixSceneDisabled2x(":/images/Objects-Scene-Disabled@2x.png"); + static const QPixmap pixLayerDisabled2x(":/images/Objects-Layer-Disabled@2x.png"); + static const QPixmap pixObjectDisabled2x(":/images/Objects-Model-Disabled@2x.png"); + static const QPixmap pixLightDisabled2x(":/images/Objects-Light-Disabled@2x.png"); + static const QPixmap pixCameraDisabled2x(":/images/Objects-Camera-Disabled@2x.png"); + static const QPixmap pixTextDisabled2x(":/images/Objects-Text-Disabled@2x.png"); + static const QPixmap pixAliasDisabled2x(":/images/Objects-Alias-Disabled@2x.png"); + static const QPixmap pixGroupDisabled2x(":/images/Objects-Group-Disabled@2x.png"); + static const QPixmap pixComponentDisabled2x(":/images/Objects-Component-Disabled@2x.png"); + static const QPixmap pixMaterialDisabled2x(":/images/Objects-Material-Disabled@2x.png"); + static const QPixmap pixPropertyDisabled2x(":/images/Objects-Property-Disabled@2x.png"); + static const QPixmap pixImageDisabled2x(":/images/Objects-Image-Disabled@2x.png"); + static const QPixmap pixBehaviorDisabled2x(":/images/Objects-Behavior-Disabled@2x.png"); + static const QPixmap pixEffectDisabled2x(":/images/Objects-Effect-Disabled@2x.png"); QPixmap pixRowType; if (m_isProperty) { @@ -1000,6 +1010,44 @@ void RowTree::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) m_binding->OpenAssociatedEditor(); } +void RowTree::hoverMoveEvent(QGraphicsSceneHoverEvent *event) +{ + if (m_locked) + return; + + QPoint p = mapFromScene(event->scenePos()).toPoint(); + QRect *hoveredRect = nullptr; + if (m_rectMaximizePropGraph.contains(p)) { + setToolTip(tr("Toggle property graph size")); + hoveredRect = &m_rectMaximizePropGraph; + } else if (m_rectFitPropGraph.contains(p)) { + setToolTip(tr("Fit curves")); + hoveredRect = &m_rectFitPropGraph; + } else { + setToolTip({}); + + // check hovering a channel button + auto it = std::find_if(m_rectChannels.begin(), m_rectChannels.end(), + [&p](const QRect &r){ return r.contains(p); }); + if (it != m_rectChannels.end()) + hoveredRect = it; + } + + if (m_hoveredRect != hoveredRect) { + // Update hover status only if it has changed + m_hoveredRect = hoveredRect; + update(); + } +} + +void RowTree::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) +{ + InteractiveTimelineItem::hoverLeaveEvent(event); + + m_hoveredRect = nullptr; + update(); +} + // handle clicked control and return its type TreeControlType RowTree::getClickedControl(const QPointF &scenePos) { @@ -1025,7 +1073,7 @@ TreeControlType RowTree::getClickedControl(const QPointF &scenePos) } } - if (isProperty()) { + if (isProperty() && !m_locked) { if (m_rectFitPropGraph.contains(p)) { // toggle fit graph m_rowTimeline->propertyGraph()->fitGraph(); } else if (m_rectMaximizePropGraph.contains(p)) { // toggle maximize graph @@ -1033,7 +1081,7 @@ TreeControlType RowTree::getClickedControl(const QPointF &scenePos) ? TimelineConstants::ROW_GRAPH_H_MAX : TimelineConstants::ROW_GRAPH_H; m_rowTimeline->propertyGraph()->setExpandHeight(m_propGraphHeight); animateExpand(ExpandState::Expanded); - } else { + } else { // toggle channels auto it = std::find_if(m_rectChannels.begin(), m_rectChannels.end(), [&p](const QRect &r){ return r.contains(p); }); diff --git a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTree.h b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTree.h index fb0d727c..505c6eca 100644 --- a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTree.h +++ b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTree.h @@ -159,6 +159,8 @@ public: protected: void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override; + void hoverMoveEvent(QGraphicsSceneHoverEvent *event) override; + void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override; private: void initialize(); @@ -208,6 +210,7 @@ private: QStringList m_variantsGroups; ITimelineItemBinding *m_binding = nullptr; ITimelineItemProperty *m_PropBinding = nullptr; // for property rows + QRect *m_hoveredRect = nullptr; QRect m_rectArrow; QRect m_rectShy; diff --git a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/TreeHeader.cpp b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/TreeHeader.cpp index 55e0a8fe..180b6ab4 100644 --- a/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/TreeHeader.cpp +++ b/src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/TreeHeader.cpp @@ -144,22 +144,22 @@ void TreeHeader::toggleFilterLocked() void TreeHeader::hoverMoveEvent(QGraphicsSceneHoverEvent *event) { - QPointF p = event->scenePos(); + QPoint p = event->scenePos().toPoint(); TreeControlType hoveredItem = TreeControlType::None; - if (m_rectShy.contains(p.x(), p.y())) { + if (m_rectShy.contains(p)) { QString action = m_shy ? tr("Show") : tr("Hide"); setToolTip(tr("%1 shy objects").arg(action)); hoveredItem = TreeControlType::Shy; - } else if (m_rectVisible.contains(p.x(), p.y())) { + } else if (m_rectVisible.contains(p)) { QString action = m_visible ? tr("Show") : tr("Hide"); setToolTip(tr("%1 inactive objects").arg(action)); hoveredItem = TreeControlType::Hide; - } else if (m_rectLock.contains(p.x(), p.y())) { + } else if (m_rectLock.contains(p)) { QString action = m_lock ? tr("Show") : tr("Hide"); setToolTip(tr("%1 locked objects").arg(action)); hoveredItem = TreeControlType::Lock; } else { - setToolTip(""); + setToolTip({}); } if (m_hoveredItem != hoveredItem) { diff --git a/src/Authoring/Qt3DStudio/images.qrc b/src/Authoring/Qt3DStudio/images.qrc index 357ae690..a21a1fb9 100644 --- a/src/Authoring/Qt3DStudio/images.qrc +++ b/src/Authoring/Qt3DStudio/images.qrc @@ -323,6 +323,10 @@ <file>images/helper_grid@2x.png</file> <file>images/helper_grid_disabled.png</file> <file>images/helper_grid_disabled@2x.png</file> + <file>images/maximize.png</file> + <file>images/maximize@2x.png</file> + <file>images/maximize_disabled.png</file> + <file>images/maximize_disabled@2x.png</file> </qresource> <qresource prefix="/startup"> <file alias="open_dialog.png">images/open_dialog.png</file> diff --git a/src/Authoring/Qt3DStudio/images/maximize.png b/src/Authoring/Qt3DStudio/images/maximize.png Binary files differnew file mode 100644 index 00000000..a5f63b03 --- /dev/null +++ b/src/Authoring/Qt3DStudio/images/maximize.png diff --git a/src/Authoring/Qt3DStudio/images/maximize@2x.png b/src/Authoring/Qt3DStudio/images/maximize@2x.png Binary files differnew file mode 100644 index 00000000..f5137285 --- /dev/null +++ b/src/Authoring/Qt3DStudio/images/maximize@2x.png diff --git a/src/Authoring/Qt3DStudio/images/maximize_disabled.png b/src/Authoring/Qt3DStudio/images/maximize_disabled.png Binary files differnew file mode 100644 index 00000000..bc820172 --- /dev/null +++ b/src/Authoring/Qt3DStudio/images/maximize_disabled.png diff --git a/src/Authoring/Qt3DStudio/images/maximize_disabled@2x.png b/src/Authoring/Qt3DStudio/images/maximize_disabled@2x.png Binary files differnew file mode 100644 index 00000000..83db6756 --- /dev/null +++ b/src/Authoring/Qt3DStudio/images/maximize_disabled@2x.png |