void TiledListView::setSelection(const QRect &rect, QFlags<QItemSelectionModel::SelectionFlag> flags) { QRect rectangle = rect.translated(horizontalScrollBar()->value(), verticalScrollBar()->value()).normalized(); calculateRectsIfNecessary(); QHashIterator<int, QRectF> i(rectForRow); int firstRow = model()->rowCount(); int lastRow = -1; while (i.hasNext()) { i.next(); if (i.value().intersects(rectangle)) { firstRow = firstRow < i.key() ? firstRow : i.key(); lastRow = lastRow > i.key() ? lastRow : i.key(); } } if (firstRow != model()->rowCount() && lastRow != -1) { QItemSelection selection( model()->index(firstRow, 0, rootIndex()), model()->index(lastRow, 0, rootIndex())); selectionModel()->select(selection, flags); } else { QModelIndex invalid; QItemSelection selection(invalid, invalid); selectionModel()->select(selection, flags); } }
QRectF TiledListView::viewportRectForRow(int row) const { calculateRectsIfNecessary(); QRectF rect = rectForRow.value(row).toRect(); if (!rect.isValid()) return rect; return QRectF(rect.x() - horizontalScrollBar()->value(), rect.y() - verticalScrollBar()->value(), rect.width(), rect.height()); }
QModelIndex TiledListView::indexAt(const QPoint &point_) const { QPoint point(point_); point.rx() += horizontalScrollBar()->value(); point.ry() += verticalScrollBar()->value(); calculateRectsIfNecessary(); QHashIterator<int, QRectF> i(rectForRow); while (i.hasNext()) { i.next(); if (i.value().contains(point)) return model()->index(i.key(), 0, rootIndex()); } return QModelIndex(); }
void TiledListView::resizeEvent(QResizeEvent*) { hashIsDirty = true; calculateRectsIfNecessary(); updateGeometries(); }
//----------------------------------------------------------------------------- void vktraceviewer_QTimelineView::paint(QPainter *painter, QPaintEvent *event) { m_threadHeight = event->rect().height(); if (m_threadIdList.count() > 0) { m_threadHeight /= m_threadIdList.count(); } int arrowHeight = 12; int arrowTop = 2; int arrowHalfWidth = 4; QPolygon triangle(3); triangle.setPoint(0, 0, arrowTop); triangle.setPoint(1, -arrowHalfWidth, arrowTop+arrowHeight); triangle.setPoint(2, arrowHalfWidth, arrowTop+arrowHeight); QList<uint32_t> threadList = getModelThreadList(); calculateRectsIfNecessary(); if (m_pPixmap == NULL) { int pixmapHeight = event->rect().height(); int pixmapWidth = event->rect().width(); m_pPixmap = new QPixmap(pixmapWidth, pixmapHeight); for (int t = 0; t < m_threadIdList.size(); t++) { m_threadMask[m_threadIdList[t]] = QVector<int>(pixmapWidth, 0); } QPainter pixmapPainter(m_pPixmap); // fill entire background with background color pixmapPainter.fillRect(event->rect(), m_background); drawBaseTimelines(&pixmapPainter, event->rect(), threadList); if (model() != NULL) { int numRows = model()->rowCount(); for (int r = 0; r < numRows; r++) { QModelIndex index = model()->index(r, vktraceviewer_QTraceFileModel::Column_EntrypointName); drawTimelineItem(&pixmapPainter, index); } } } painter->drawPixmap(event->rect(), *m_pPixmap, m_pPixmap->rect()); if (model() == NULL) { return; } // draw current api call marker int currentIndexRow = currentIndex().row(); if (currentIndexRow >= 0) { // Overlay a black rectangle around the current item. // For more information on how rects are drawn as outlines, // see here: http://qt-project.org/doc/qt-4.8/qrectf.html#rendering int penWidth = 2; int penWidthHalf = 1; QPen blackPen(Qt::black); blackPen.setWidth(penWidth); blackPen.setJoinStyle(Qt::MiterJoin); painter->setPen(blackPen); // Don't fill the rectangle painter->setBrush(Qt::NoBrush); QModelIndex index = model()->index(currentIndexRow, vktraceviewer_QTraceFileModel::Column_EntrypointName); QRectF rect = visualRect(index); rect.adjust(-penWidthHalf, -penWidthHalf, penWidthHalf, penWidthHalf); painter->drawRect(rect); // Draw marker underneath the current rect painter->save(); QPainter::RenderHints hints = painter->renderHints(); painter->setRenderHints(QPainter::Antialiasing); painter->setPen(m_trianglePen); painter->setBrush(QColor(Qt::yellow)); painter->translate(rect.center().x(), rect.bottom()); painter->drawPolygon(triangle); painter->setRenderHints(hints, false); painter->restore(); } }