void MultiTrackPlotter::updateTransform() { qreal y_scaling = 1.0; y_scaling *= m_height * 0.5; if (!m_overlay && m_channel_count > 1) y_scaling /= m_channel_count; qreal x_scaling = m_width; if (m_frame_count > 1) x_scaling /= (m_frame_count - 1); for (int idx = 0; idx < m_channel_count; ++idx) { qreal y_translation = 1.0; if (!m_overlay) y_translation += idx * 2.0; QMatrix4x4 matrix; matrix.scale(x_scaling, y_scaling); matrix.translate(0.0, y_translation); matrix.scale(1.0, -m_scaling); // flip y axis! QSGTransformNode *transformNode = static_cast<QSGTransformNode*>( childAtIndex(idx) );; transformNode->setMatrix(matrix); } }
void TimelineRenderState::assembleNodeTree(const TimelineModel *model, int defaultRowHeight, int defaultRowOffset) { Q_D(TimelineRenderState); QTC_ASSERT(isEmpty(), return); for (int pass = 0; pass < d->passes.length(); ++pass) { const TimelineRenderPass::State *passState = d->passes[pass]; if (!passState) continue; if (passState->expandedOverlay()) d->expandedOverlayRoot->appendChildNode(passState->expandedOverlay()); if (passState->collapsedOverlay()) d->collapsedOverlayRoot->appendChildNode(passState->collapsedOverlay()); } int row = 0; for (int i = 0; i < model->expandedRowCount(); ++i) { QSGTransformNode *rowNode = new QSGTransformNode; for (int pass = 0; pass < d->passes.length(); ++pass) { const TimelineRenderPass::State *passState = d->passes[pass]; if (!passState) continue; const QVector<QSGNode *> &rows = passState->expandedRows(); if (rows.length() > row) { QSGNode *rowChildNode = rows[row]; if (rowChildNode) rowNode->appendChildNode(rowChildNode); } } d->expandedRowRoot->appendChildNode(rowNode); ++row; } for (int row = 0; row < model->collapsedRowCount(); ++row) { QSGTransformNode *rowNode = new QSGTransformNode; QMatrix4x4 matrix; matrix.translate(0, row * defaultRowOffset, 0); matrix.scale(1.0, static_cast<float>(defaultRowHeight) / static_cast<float>(TimelineModel::defaultRowHeight()), 1.0); rowNode->setMatrix(matrix); for (int pass = 0; pass < d->passes.length(); ++pass) { const TimelineRenderPass::State *passState = d->passes[pass]; if (!passState) continue; const QVector<QSGNode *> &rows = passState->collapsedRows(); if (rows.length() > row) { QSGNode *rowChildNode = rows[row]; if (rowChildNode) rowNode->appendChildNode(rowChildNode); } } d->collapsedRowRoot->appendChildNode(rowNode); } updateExpandedRowHeights(model, defaultRowHeight, defaultRowOffset); }
QSGTransformNode *TimelineRenderState::finalize(QSGNode *oldNode, bool expanded, const QMatrix4x4 &transform) { Q_D(TimelineRenderState); QSGNode *rowNode = expanded ? d->expandedRowRoot : d->collapsedRowRoot; QSGNode *overlayNode = expanded ?d->expandedOverlayRoot : d->collapsedOverlayRoot; QSGTransformNode *node = oldNode ? static_cast<QSGTransformNode *>(oldNode) : new QSGTransformNode; node->setMatrix(transform); if (node->firstChild() != rowNode || node->lastChild() != overlayNode) { node->removeAllChildNodes(); node->appendChildNode(rowNode); node->appendChildNode(overlayNode); } return node; }