diff options
| author | Marius Bugge Monsen <mmonsen@trolltech.com> | 2009-08-28 13:32:41 +0200 |
|---|---|---|
| committer | Marius Bugge Monsen <mmonsen@trolltech.com> | 2009-08-28 13:32:41 +0200 |
| commit | f755b4fec12ad63d0de3e275c0ac9db778ad421a (patch) | |
| tree | a47caff8f4c4961fddfd1e16cbd1cfc0d265f385 | |
| parent | 8c162f244297d9d6ab65bbbeba44c0470b17b102 (diff) | |
Make QtListWidgetNG use QGraphicsView's scrollbar rather than using QtGraphicsScrollbar.
Give the correct geometry to the QtGraphicsListViewItems in QGraphicsListView::doLayout().
| -rw-r--r-- | src/experimental/qgraphicsgridview.cpp | 2 | ||||
| -rw-r--r-- | src/qgraphicslistview.cpp | 116 | ||||
| -rw-r--r-- | src/qgraphicslistview.h | 12 | ||||
| -rw-r--r-- | src/qgraphicslistview_p.h | 1 | ||||
| -rw-r--r-- | src/qgraphicsscrollbar.cpp | 9 | ||||
| -rw-r--r-- | src/qlistcontroller.cpp | 8 | ||||
| -rw-r--r-- | src/qlistcontroller.h | 1 | ||||
| -rw-r--r-- | src/qlistwidgetng.cpp | 64 | ||||
| -rw-r--r-- | src/qlistwidgetng.h | 4 | ||||
| -rw-r--r-- | src/qlistwidgetng_p.h | 2 |
10 files changed, 124 insertions, 95 deletions
diff --git a/src/experimental/qgraphicsgridview.cpp b/src/experimental/qgraphicsgridview.cpp index e50b45a..3297e35 100644 --- a/src/experimental/qgraphicsgridview.cpp +++ b/src/experimental/qgraphicsgridview.cpp @@ -357,7 +357,7 @@ void QtGraphicsGridView::doLayout() const QRectF viewport(QPointF(horizontalOffset, verticalOffset), size()); const int firstVisibleIndex = d->firstVisibleIndex(viewport); const int lastVisibleIndex = qMin(d->lastVisibleIndex(viewport), count - 1); - d->scrollItems(firstVisibleIndex); + //d->scrollItems(firstVisibleIndex); // ### FIXME int index = firstVisibleIndex; for (; index <= lastVisibleIndex; ++index) { //initStyleOption(&option, index); diff --git a/src/qgraphicslistview.cpp b/src/qgraphicslistview.cpp index 09b57ac..ce61895 100644 --- a/src/qgraphicslistview.cpp +++ b/src/qgraphicslistview.cpp @@ -129,6 +129,7 @@ QSizeF QtGraphicsListViewItem::sizeHint(Qt::SizeHint which, const QSizeF &constr initStyleOption(&d->option); switch (which) { case Qt::MinimumSize: + return QSizeF(0, 0); case Qt::PreferredSize: { const QVariant value = d->view->d_func()->cachedData(d->index, Qt::SizeHintRole); if (value.isValid()) @@ -157,7 +158,8 @@ void QtGraphicsListViewItem::paint(QPainter *painter, const QStyleOptionGraphics copyStyleOptionState(option, &d->option); d->view->initStyleOption(&d->option); initStyleOption(&d->option); - d->option.rect = boundingRect().toRect(); + d->option.rect = rect().toRect(); + //qDebug() << "rect" << boundingRect() << "view rect" << parentItem()->boundingRect(); d->view->style()->drawControl(QStyle::CE_ItemViewItem, &d->option, painter, widget); } } @@ -569,30 +571,6 @@ int QtGraphicsListViewPrivate::currentItem() const /*! \internal */ -void QtGraphicsListViewPrivate::scrollItems(int firstVisibleIndex) -{ - Q_Q(QtGraphicsListView); - // shift items around - if (!items.isEmpty()) { - // scrolling down or right - move from first to last - while (items.first().first < firstVisibleIndex) { - const int index = items.last().first + 1; - QPair<int,QGraphicsObject*> item = items.takeFirst(); - items.append(QPair<int,QGraphicsObject*>(index, creator->reassign(index, item.second, q))); - } - // scrolling up or left - move from last to first (assuming same view size) - const int firstNonVisibleIndex = firstVisibleIndex + items.count(); - while (items.last().first >= firstNonVisibleIndex) { - const int index = items.first().first - 1; - QPair<int,QGraphicsObject*> item = items.takeLast(); - items.prepend(QPair<int,QGraphicsObject*>(index, creator->reassign(index, item.second, q))); - } - } -} - -/*! - \internal - */ QSizeF QtGraphicsListViewPrivate::itemSize(int index) const { Q_Q(const QtGraphicsListView); @@ -603,7 +581,7 @@ QSizeF QtGraphicsListViewPrivate::itemSize(int index) const if (QGraphicsObject *item = creator->create(index, 0)) { QSizeF size = (item->isWidget() ? static_cast<QGraphicsWidget*>(item)->size() - : item->boundingRect().size()); // ### FIXME: don't use bounding rect + : item->boundingRect().size()); creator->recycle(item); // ### FIXME: save it for re-use later return size; } @@ -612,7 +590,7 @@ QSizeF QtGraphicsListViewPrivate::itemSize(int index) const } // average size of visible items QSizeF size; - for (int i = 0; i < items.count(); ++i) + for (int i = 0; i < items.count(); ++i) // ### FIXME: don't iterate every time size += items.at(i).second->boundingRect().size(); return size / items.count(); } @@ -635,6 +613,7 @@ QtGraphicsListView::QtGraphicsListView(Qt::Orientation orientation, QGraphicsWid : QGraphicsWidget(parent, wFlags), d_ptr(new QtGraphicsListViewPrivate) { Q_D(QtGraphicsListView); + //setFlag(QGraphicsItem::ItemClipsChildrenToShape); d->q_ptr = this; d->orientation = orientation; } @@ -646,6 +625,7 @@ QtGraphicsListView::QtGraphicsListView(QtGraphicsListViewPrivate &dd, Qt::Orient : QGraphicsWidget(parent, wFlags), d_ptr(&dd) { Q_D(QtGraphicsListView); + //setFlag(QGraphicsItem::ItemClipsChildrenToShape); d->q_ptr = this; d->orientation = orientation; } @@ -774,7 +754,8 @@ void QtGraphicsListView::setOrientation(Qt::Orientation orientation) Q_D(QtGraphicsListView); d->orientation = orientation; //d->checkCache(0, 0); // TODO - updateLayout(); + emit orientationChanged(orientation); + doLayout(); // don't wait } /*! @@ -908,7 +889,7 @@ void QtGraphicsListView::updateLayout() { Q_D(QtGraphicsListView); if (!d->layoutTimer.isActive()) - doLayout(); //d->layoutTimer.start(0, this); + d->layoutTimer.start(0, this); } /*! @@ -921,7 +902,7 @@ void QtGraphicsListView::doLayout() Q_D(QtGraphicsListView); d->layoutTimer.stop(); - const QRectF area = boundingRect(); + const QRectF area = geometry(); const QSizeF constraint = (d->orientation == Qt::Horizontal ? QSizeF(-1, size().height()) : QSizeF(size().width(), -1)); @@ -966,19 +947,62 @@ void QtGraphicsListView::doLayout() #endif } - // shuffle the existing items around + // move existing items around in the list const int firstVisibleIndex = index; - d->scrollItems(firstVisibleIndex); + if (!d->items.isEmpty()) { + // scrolling down or right - move from first to last + while (d->items.first().first < firstVisibleIndex) { + const int index = d->items.last().first + 1; + QGraphicsObject *item = d->items.takeFirst().second; + d->items.append(QPair<int,QGraphicsObject*>(index, d->creator->reassign(index, item, this))); + const bool isWidget = item->isWidget(); + const QSizeF size = (isWidget + ? static_cast<QGraphicsWidget*>(item)->effectiveSizeHint(Qt::PreferredSize, constraint) + : item->boundingRect().size()); + if (vertical) { + if (isWidget) + static_cast<QGraphicsWidget*>(item)->resize(area.width(), size.height()); + } else { + if (isWidget) + static_cast<QGraphicsWidget*>(item)->resize(size.width(), area.height()); + } + } + // scrolling up or left - move from last to first (assuming same view size) + const int firstNonVisibleIndex = firstVisibleIndex + d->items.count(); + while (d->items.last().first >= firstNonVisibleIndex) { + const int index = d->items.first().first - 1; + QGraphicsObject *item = d->items.takeLast().second; + d->items.prepend(QPair<int,QGraphicsObject*>(index, d->creator->reassign(index, item, this))); + const bool isWidget = item->isWidget(); + const QSizeF size = (isWidget + ? static_cast<QGraphicsWidget*>(item)->effectiveSizeHint(Qt::PreferredSize, constraint) + : item->boundingRect().size()); + if (vertical) { + if (isWidget) + static_cast<QGraphicsWidget*>(item)->resize(area.width(), size.height()); + } else { + if (isWidget) + static_cast<QGraphicsWidget*>(item)->resize(size.width(), area.height()); + } + } + } - // set existing item positions + // set existing items geometry for (int i = 0; i < d->items.count() && index < count && coordinate < areaEnd; ++i) { QGraphicsObject *item = d->items.at(i).second; - const QSizeF size = item->boundingRect().size(); + const bool isWidget = item->isWidget(); + const QSizeF size = item->boundingRect().size(); // use existing size if (vertical) { - item->setPos(0, coordinate); + if (isWidget && size.width() != area.width()) // only change size if with has changed + static_cast<QGraphicsWidget*>(item)->setGeometry(0, coordinate, area.width(), size.height()); + else + item->setPos(0, coordinate); coordinate += size.height(); } else { - item->setPos(coordinate, 0); + if (isWidget && size.height() != area.height()) // only change size if height has changed + static_cast<QGraphicsWidget*>(item)->setGeometry(coordinate, 0, size.width(), area.height()); + else + item->setPos(coordinate, 0); coordinate += size.width(); } ++index; @@ -991,16 +1015,18 @@ void QtGraphicsListView::doLayout() const bool isWidget = item->isWidget(); const QSizeF size = (isWidget ? static_cast<QGraphicsWidget*>(item)->effectiveSizeHint(Qt::PreferredSize, constraint) - : item->boundingRect().size()); // ### don't use bounding rect + : item->boundingRect().size()); if (vertical) { - item->setPos(0, coordinate); if (isWidget) - static_cast<QGraphicsWidget*>(item)->resize(area.width(), size.height()); + static_cast<QGraphicsWidget*>(item)->setGeometry(0, coordinate, area.width(), size.height()); + else + item->setPos(0, coordinate); coordinate += size.height(); } else { - item->setPos(coordinate, 0); if (isWidget) - static_cast<QGraphicsWidget*>(item)->resize(size.width(), area.height()); + static_cast<QGraphicsWidget*>(item)->setGeometry(coordinate, 0, size.width(), area.height()); + else + item->setPos(coordinate, 0); coordinate += size.width(); } } @@ -1097,7 +1123,7 @@ void QtGraphicsListView::setFirstIndex(int index) return; d->firstIndex = index; emit firstIndexChanged(index); - updateLayout(); + doLayout(); // don't wait } /*! @@ -1122,7 +1148,7 @@ void QtGraphicsListView::setOffset(qreal offset) Q_D(QtGraphicsListView); d->offset = offset; emit offsetChanged(offset); - updateLayout(); + doLayout(); // don't wait } /*! @@ -1225,7 +1251,7 @@ void QtGraphicsListView::initStyleOption(QStyleOptionViewItemV4 *option) const option->locale.setNumberOptions(QLocale::OmitGroupSeparator); //if (d->wrapText) option->features |= QStyleOptionViewItemV2::WrapText; //if (d->alternate) option->features |= QStyleOptionViewItemV2::Alternate; - if (isActiveWindow()) + if (isActiveWindow()) // ### FIXME option->state |= QStyle::State_Active; } @@ -1240,7 +1266,7 @@ bool QtGraphicsListView::event(QEvent *event) event->accept(); return true; } - // delayed layout mechanism ### FIXME + // delayed layout mechanism if (event->type() == QEvent::Timer && static_cast<QTimerEvent*>(event)->timerId() == d->layoutTimer.timerId()) doLayout(); return QGraphicsWidget::event(event); diff --git a/src/qgraphicslistview.h b/src/qgraphicslistview.h index 4459226..4e57fe4 100644 --- a/src/qgraphicslistview.h +++ b/src/qgraphicslistview.h @@ -88,7 +88,10 @@ template <class T> class Q_ITEMVIEWSNG_EXPORT QtGraphicsListViewItemCreator : public QtGraphicsListViewItemCreatorBase { public: - inline QGraphicsObject *create(int index, QtGraphicsListView *view) { return new T(index, view); } + inline QGraphicsObject *create(int index, QtGraphicsListView *view) + { + return new T(index, view); + } inline QGraphicsObject *reassign(int index, QGraphicsObject *item, QtGraphicsListView *view) { Q_UNUSED(view); @@ -105,10 +108,10 @@ public: class Q_ITEMVIEWSNG_EXPORT QtGraphicsListView : public QGraphicsWidget { Q_OBJECT - Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation) + Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation NOTIFY orientationChanged) Q_PROPERTY(Qt::TextElideMode textElideMode READ textElideMode WRITE setTextElideMode) - Q_PROPERTY(int firstIndex READ firstIndex WRITE setFirstIndex) - Q_PROPERTY(qreal offset READ offset WRITE setOffset) + Q_PROPERTY(int firstIndex READ firstIndex WRITE setFirstIndex NOTIFY firstIndexChanged) + Q_PROPERTY(qreal offset READ offset WRITE setOffset NOTIFY offsetChanged) Q_PROPERTY(QGraphicsObject* highlight READ highlight WRITE setHighlight) public: @@ -153,6 +156,7 @@ public Q_SLOTS: void updateLayout(); Q_SIGNALS: + void orientationChanged(Qt::Orientation orientation); void firstIndexChanged(int index); void offsetChanged(qreal offset); diff --git a/src/qgraphicslistview_p.h b/src/qgraphicslistview_p.h index 87e9a77..2c94f32 100644 --- a/src/qgraphicslistview_p.h +++ b/src/qgraphicslistview_p.h @@ -82,7 +82,6 @@ public: int currentItem() const; // used by updateLayout - void scrollItems(int firstVisibleIndex); QSizeF itemSize(int index) const; QtGraphicsListView *q_ptr; diff --git a/src/qgraphicsscrollbar.cpp b/src/qgraphicsscrollbar.cpp index 45c8e7b..f1fd0a3 100644 --- a/src/qgraphicsscrollbar.cpp +++ b/src/qgraphicsscrollbar.cpp @@ -252,14 +252,13 @@ QSizeF QtGraphicsScrollBar::sizeHint(Qt::SizeHint which, const QSizeF &constrain int scrollBarExtent = style()->pixelMetric(QStyle::PM_ScrollBarExtent, &option, 0); int scrollBarSliderMin = style()->pixelMetric(QStyle::PM_ScrollBarSliderMin, &option, 0); - QSize size; + QSize contents; if (orientation() == Qt::Vertical) - size = QSize(scrollBarExtent, scrollBarExtent * 2 + scrollBarSliderMin); + contents = QSize(scrollBarExtent, scrollBarExtent * 2 + scrollBarSliderMin); else - size = QSize(scrollBarExtent * 2 + scrollBarSliderMin, scrollBarExtent); + contents = QSize(scrollBarExtent * 2 + scrollBarSliderMin, scrollBarExtent); - QSize contents = style()->sizeFromContents(QStyle::CT_ScrollBar, &option, size, 0); - return contents.expandedTo(QApplication::globalStrut()); + return style()->sizeFromContents(QStyle::CT_ScrollBar, &option, contents, 0); } return QGraphicsWidget::sizeHint(which, constraint); } diff --git a/src/qlistcontroller.cpp b/src/qlistcontroller.cpp index cd3e57e..ee86436 100644 --- a/src/qlistcontroller.cpp +++ b/src/qlistcontroller.cpp @@ -355,6 +355,14 @@ void QtListController::setScrollValue(qreal value) } /*! + */ +void QtListController::setScrollValue(int value) +{ + setScrollValue(qreal(value)); +} + + +/*! Returns the page step value of the view. This value depends on the controller scroll mode and the view orientation. diff --git a/src/qlistcontroller.h b/src/qlistcontroller.h index ad7f7c6..57cb33d 100644 --- a/src/qlistcontroller.h +++ b/src/qlistcontroller.h @@ -104,6 +104,7 @@ Q_SIGNALS: public Q_SLOTS: void setScrollValue(qreal value); + void setScrollValue(int value); // ### protected: QtListController(QtListControllerPrivate &, QObject *parent); diff --git a/src/qlistwidgetng.cpp b/src/qlistwidgetng.cpp index 2a221d2..34fb103 100644 --- a/src/qlistwidgetng.cpp +++ b/src/qlistwidgetng.cpp @@ -28,15 +28,14 @@ #include "qlistcontroller.h" #include "qlistselectionmanager.h" #include "qgraphicslistview.h" -#include "qgraphicsscrollbar.h" -#include <qgraphicsgridlayout.h> +#include <qscrollbar.h> #include <qdebug.h> QT_BEGIN_NAMESPACE QtListWidgetNGPrivate::QtListWidgetNGPrivate() - : controller(0), scrollbar(0), q_ptr(0) + : controller(0), q_ptr(0) { } @@ -49,7 +48,7 @@ void QtListWidgetNGPrivate::_q_itemsInserted(int index, int count) { Q_UNUSED(index); Q_UNUSED(count); - //_q_updateScrollbars(); // ### FIXME + //_q_updateGeometries(); // ### FIXME } void QtListWidgetNGPrivate::_q_itemsRemoved(int index, int count) @@ -70,7 +69,7 @@ void QtListWidgetNGPrivate::_q_itemsChanged(int from, int count, const QList<int Q_UNUSED(from); Q_UNUSED(count); Q_UNUSED(roles); - //_q_updateScrollbars(); // ### FIXME + //_q_updateGeometries(); // ### FIXME } void QtListWidgetNGPrivate::_q_showView() @@ -99,6 +98,8 @@ void QtListWidgetNGPrivate::_q_controllerChanged(QtListController *current, QtLi q, SLOT(_q_selectionManagerChanged(QtListSelectionManager*,QtListSelectionManager*))); QObject::disconnect(previous, SIGNAL(viewChanged(QtGraphicsListView*,QtGraphicsListView*)), q, SLOT(_q_viewChanged(QtGraphicsListView*,QtGraphicsListView*))); + QObject::disconnect(q->verticalScrollBar(), SIGNAL(valueChanged(int)), + previous, SLOT(setScrollValue(int))); } if (current) { @@ -108,10 +109,8 @@ void QtListWidgetNGPrivate::_q_controllerChanged(QtListController *current, QtLi q, SLOT(_q_selectionManagerChanged(QtListSelectionManager*,QtListSelectionManager*))); QObject::connect(current, SIGNAL(viewChanged(QtGraphicsListView*,QtGraphicsListView*)), q, SLOT(_q_viewChanged(QtGraphicsListView*,QtGraphicsListView*))); - //QObject::connect(current, SIGNAL(scrollValueChanged(qreal)), - // scrollbar, SLOT(setValue(qreal))); - QObject::connect(scrollbar, SIGNAL(valueChanged(qreal)), - current, SLOT(setScrollValue(qreal))); + QObject::connect(q->verticalScrollBar(), SIGNAL(valueChanged(int)), + current, SLOT(setScrollValue(int))); } // everything changed _q_modelChanged(current ? current->model() : 0, previous ? previous->model() : 0); @@ -162,35 +161,21 @@ void QtListWidgetNGPrivate::_q_viewChanged(QtGraphicsListView *current, QtGraphi q->scene()->addItem(current); current->grabKeyboard(); } - //_q_updateScrollbars(); + //_q_updateGeometries(); } -void QtListWidgetNGPrivate::_q_updateScrollbars() +void QtListWidgetNGPrivate::_q_updateGeometries() { Q_Q(QtListWidgetNG); - if (!controller || !controller->view()) { - scrollbar->hide(); - return; - } - - QRect r = q->viewport()->geometry(); - q->scene()->setSceneRect(0, 0, r.width(), r.height()); - qreal w = scrollbar->effectiveSizeHint(Qt::PreferredSize).width(); - scrollbar->setGeometry(QRect(r.width() - w, 0, w, r.height())); + // ### check scrollbar policy + QScrollBar *scrollbar = q->verticalScrollBar(); - // first set the geometry to allow maximumVerticalScrollValue to use it - controller->view()->setGeometry(QRect(0, 0, r.width(), r.height())); qreal maximum = 0; scrollbar->setPageStep(controller->pageStepValue(&maximum)); scrollbar->setMaximum(maximum); - if (scrollbar->minimum() >= scrollbar->maximum()) { - scrollbar->hide(); - } else { - scrollbar->show(); - controller->view()->setGeometry(QRect(0, 0, r.width() - w, r.height())); // ### - } - + QRect rect = q->viewport()->geometry(); + controller->view()->setGeometry(QRect(0, 0, rect.width(), rect.height())); controller->view()->doLayout(); } @@ -200,11 +185,8 @@ void QtListWidgetNGPrivate::_q_updateScrollbars() void QtListWidgetNGPrivate::initialize() { Q_Q(QtListWidgetNG); + q->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); q->setScene(new QGraphicsScene(q)); - // scrollbar - scrollbar = new QtGraphicsScrollBar(Qt::Vertical); - q->scene()->addItem(scrollbar); - // other parts if (!controller) controller = new QtListController(q); if (!controller->model()) @@ -298,7 +280,7 @@ QtListDefaultModel *QtListWidgetNG::defaultModel() const void QtListWidgetNG::showEvent(QShowEvent *event) { Q_D(QtListWidgetNG); - d->_q_updateScrollbars(); + d->_q_updateGeometries(); QGraphicsView::showEvent(event); } @@ -308,8 +290,18 @@ void QtListWidgetNG::showEvent(QShowEvent *event) void QtListWidgetNG::resizeEvent(QResizeEvent *event) { Q_D(QtListWidgetNG); - d->_q_updateScrollbars(); - QGraphicsView::resizeEvent(event); + d->_q_updateGeometries(); + QAbstractScrollArea::resizeEvent(event); +} + +/*! + \reimp +*/ +void QtListWidgetNG::scrollContentsBy(int dx, int dy) +{ + Q_UNUSED(dx); + Q_UNUSED(dy); + // do nothing } QT_END_NAMESPACE diff --git a/src/qlistwidgetng.h b/src/qlistwidgetng.h index 5e491cf..5167992 100644 --- a/src/qlistwidgetng.h +++ b/src/qlistwidgetng.h @@ -53,6 +53,8 @@ protected: void showEvent(QShowEvent *event); void resizeEvent(QResizeEvent *event); + void scrollContentsBy(int dx, int dy); + protected: QtListWidgetNGPrivate *d_ptr; @@ -65,7 +67,7 @@ private: Q_PRIVATE_SLOT(d_func(), void _q_itemsChanged(int from, int count, const QList<int> &roles)) Q_PRIVATE_SLOT(d_func(), void _q_showView()) Q_PRIVATE_SLOT(d_func(), void _q_hideView()) - Q_PRIVATE_SLOT(d_func(), void _q_updateScrollbars()) + Q_PRIVATE_SLOT(d_func(), void _q_updateGeometries()) Q_PRIVATE_SLOT(d_func(), void _q_modelChanged(QtListModelInterface *current, QtListModelInterface *previous)) Q_PRIVATE_SLOT(d_func(), void _q_selectionManagerChanged(QtListSelectionManager *current, QtListSelectionManager *previous)) Q_PRIVATE_SLOT(d_func(), void _q_viewChanged(QtGraphicsListView *current, QtGraphicsListView *previous)) diff --git a/src/qlistwidgetng_p.h b/src/qlistwidgetng_p.h index 0151c45..294deb1 100644 --- a/src/qlistwidgetng_p.h +++ b/src/qlistwidgetng_p.h @@ -59,13 +59,11 @@ public: void _q_modelChanged(QtListModelInterface *current, QtListModelInterface *previous); void _q_selectionManagerChanged(QtListSelectionManager *current, QtListSelectionManager *previous); void _q_viewChanged(QtGraphicsListView *current, QtGraphicsListView *previous); - void _q_updateScrollbars(); void _q_updateGeometries(); void initialize(); QtListController *controller; - QtGraphicsScrollBar *scrollbar; QtListWidgetNG *q_ptr; }; |
