From f577c2a2226f528284e9447a9fd54ce357667863 Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Thu, 31 May 2007 20:08:06 +0000 Subject: [PATCH] reimplemented rubberband handling in Details View without using the (quite slow) QRubberBand widget svn path=/trunk/KDE/kdebase/apps/; revision=670234 --- src/dolphindetailsview.cpp | 74 ++++++++++++++++++++++++-------------- src/dolphindetailsview.h | 21 +++++++---- 2 files changed, 63 insertions(+), 32 deletions(-) diff --git a/src/dolphindetailsview.cpp b/src/dolphindetailsview.cpp index 2bb145cc4..998d3c870 100644 --- a/src/dolphindetailsview.cpp +++ b/src/dolphindetailsview.cpp @@ -32,13 +32,15 @@ #include #include +#include #include DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* controller) : QTreeView(parent), m_controller(controller), - m_rubberBand(0), - m_origin() + m_showElasticBand(false), + m_elasticBandOrigin(), + m_elasticBandDestination() { Q_ASSERT(controller != 0); @@ -155,34 +157,29 @@ void DolphinDetailsView::mousePressEvent(QMouseEvent* event) QTreeView::mousePressEvent(event); if (event->button() == Qt::LeftButton) { - // initialize rubberband for the selection - if (m_rubberBand == 0) { - m_rubberBand = new QRubberBand(QRubberBand::Rectangle, viewport()); - } + m_showElasticBand = true; const QPoint pos(contentsPos()); - m_origin = event->pos(); - m_origin.setX(m_origin.x() + pos.x()); - m_origin.setY(m_origin.y() + pos.y()); - updateRubberBandGeometry(); - m_rubberBand->show(); + m_elasticBandOrigin = event->pos(); + m_elasticBandOrigin.setX(m_elasticBandOrigin.x() + pos.x()); + m_elasticBandOrigin.setY(m_elasticBandOrigin.y() + pos.y()); + m_elasticBandDestination = event->pos(); } } void DolphinDetailsView::mouseMoveEvent(QMouseEvent* event) { QTreeView::mouseMoveEvent(event); - if (m_rubberBand != 0) { - updateRubberBandGeometry(); + if (m_showElasticBand) { + updateElasticBand(); } } void DolphinDetailsView::mouseReleaseEvent(QMouseEvent* event) { QTreeView::mouseReleaseEvent(event); - if (m_rubberBand != 0) { - m_rubberBand->hide(); - } + updateElasticBand(); + m_showElasticBand = false; m_controller->triggerActivation(); } @@ -191,9 +188,8 @@ void DolphinDetailsView::dragEnterEvent(QDragEnterEvent* event) if (event->mimeData()->hasUrls()) { event->acceptProposedAction(); } - if (m_rubberBand != 0) { - m_rubberBand->hide(); - } + updateElasticBand(); + m_showElasticBand = false; } void DolphinDetailsView::dropEvent(QDropEvent* event) @@ -208,6 +204,26 @@ void DolphinDetailsView::dropEvent(QDropEvent* event) QTreeView::dropEvent(event); } +void DolphinDetailsView::paintEvent(QPaintEvent* event) +{ + QTreeView::paintEvent(event); + if (m_showElasticBand) { + // The following code has been taken from QListView + // and adapted to DolphinDetailsView. + // (C) 1992-2007 Trolltech ASA + QStyleOptionRubberBand opt; + opt.initFrom(this); + opt.shape = QRubberBand::Rectangle; + opt.opaque = false; + opt.rect = elasticBandRect(); + + QPainter painter(viewport()); + painter.save(); + style()->drawControl(QStyle::CE_RubberBand, &opt, &painter); + painter.restore(); + } +} + void DolphinDetailsView::setSortIndicatorSection(DolphinView::Sorting sorting) { QHeaderView* headerView = header(); @@ -242,14 +258,13 @@ void DolphinDetailsView::slotEntered(const QModelIndex& index) } } -void DolphinDetailsView::updateRubberBandGeometry() +void DolphinDetailsView::updateElasticBand() { - if (m_rubberBand != 0) { - const QPoint pos(contentsPos()); - const QPoint origin(m_origin.x() - pos.x(), m_origin.y() - pos.y()); - const QPoint dest(viewport()->mapFromGlobal(QCursor::pos())); - m_rubberBand->setGeometry(QRect(origin, dest).normalized()); - } + Q_ASSERT(m_showElasticBand); + QRect dirtyRegion(elasticBandRect()); + m_elasticBandDestination = viewport()->mapFromGlobal(QCursor::pos()); + dirtyRegion = dirtyRegion.united(elasticBandRect()); + setDirtyRegion(dirtyRegion); } void DolphinDetailsView::zoomIn() @@ -322,4 +337,11 @@ QPoint DolphinDetailsView::contentsPos() const return QPoint(0, y); } +QRect DolphinDetailsView::elasticBandRect() const +{ + const QPoint pos(contentsPos()); + const QPoint topLeft(m_elasticBandOrigin.x() - pos.x(), m_elasticBandOrigin.y() - pos.y()); + return QRect(topLeft, m_elasticBandDestination).normalized(); +} + #include "dolphindetailsview.moc" diff --git a/src/dolphindetailsview.h b/src/dolphindetailsview.h index da3f2ec90..290e3cc06 100644 --- a/src/dolphindetailsview.h +++ b/src/dolphindetailsview.h @@ -27,7 +27,6 @@ #include class DolphinController; -class QRubberBand; /** * @brief Represents the details view which shows the name, size, @@ -54,6 +53,7 @@ protected: virtual void mouseReleaseEvent(QMouseEvent* event); virtual void dragEnterEvent(QDragEnterEvent* event); virtual void dropEvent(QDropEvent* event); + virtual void paintEvent(QPaintEvent* event); private slots: /** @@ -85,10 +85,18 @@ private slots: void slotEntered(const QModelIndex& index); /** - * Updates the geometry of the rubberband dependent from the current - * mouse position and the starting origin \a m_origin. + * Updates the destination \a m_elasticBandDestination from + * the elastic band to the current mouse position and triggers + * an update. */ - void updateRubberBandGeometry(); + void updateElasticBand(); + + /** + * Returns the rectangle for the elastic band dependent from the + * origin \a m_elasticBandOrigin, the current destination + * \a m_elasticBandDestination and the viewport position. + */ + QRect elasticBandRect() const; void zoomIn(); void zoomOut(); @@ -112,8 +120,9 @@ private: DolphinController* m_controller; QStyleOptionViewItem m_viewOptions; - QRubberBand* m_rubberBand; - QPoint m_origin; + bool m_showElasticBand; + QPoint m_elasticBandOrigin; + QPoint m_elasticBandDestination; }; #endif -- 2.47.3