summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMahmoud Badri <mahmoud.badri@qt.io>2019-08-09 15:54:13 +0300
committerMahmoud Badri <mahmoud.badri@qt.io>2019-08-12 11:43:20 +0300
commit8a9acb021d29529c3e056829ca934bbb86235734 (patch)
tree05dfd244b5f1d6fffad688e90a5cb5f8d490e22b
parent1b9cf198c06c7da0c5b93b70c7d5e1af1721ff88 (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.cpp60
-rw-r--r--src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTimelinePropertyGraph.h1
-rw-r--r--src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTree.cpp256
-rw-r--r--src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/RowTree.h3
-rw-r--r--src/Authoring/Qt3DStudio/Palettes/TimelineGraphicsView/ui/TreeHeader.cpp10
-rw-r--r--src/Authoring/Qt3DStudio/images.qrc4
-rw-r--r--src/Authoring/Qt3DStudio/images/maximize.pngbin0 -> 1070 bytes
-rw-r--r--src/Authoring/Qt3DStudio/images/maximize@2x.pngbin0 -> 1163 bytes
-rw-r--r--src/Authoring/Qt3DStudio/images/maximize_disabled.pngbin0 -> 1066 bytes
-rw-r--r--src/Authoring/Qt3DStudio/images/maximize_disabled@2x.pngbin0 -> 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
new file mode 100644
index 00000000..a5f63b03
--- /dev/null
+++ b/src/Authoring/Qt3DStudio/images/maximize.png
Binary files differ
diff --git a/src/Authoring/Qt3DStudio/images/maximize@2x.png b/src/Authoring/Qt3DStudio/images/maximize@2x.png
new file mode 100644
index 00000000..f5137285
--- /dev/null
+++ b/src/Authoring/Qt3DStudio/images/maximize@2x.png
Binary files differ
diff --git a/src/Authoring/Qt3DStudio/images/maximize_disabled.png b/src/Authoring/Qt3DStudio/images/maximize_disabled.png
new file mode 100644
index 00000000..bc820172
--- /dev/null
+++ b/src/Authoring/Qt3DStudio/images/maximize_disabled.png
Binary files differ
diff --git a/src/Authoring/Qt3DStudio/images/maximize_disabled@2x.png b/src/Authoring/Qt3DStudio/images/maximize_disabled@2x.png
new file mode 100644
index 00000000..83db6756
--- /dev/null
+++ b/src/Authoring/Qt3DStudio/images/maximize_disabled@2x.png
Binary files differ