summaryrefslogtreecommitdiffstats
path: root/src/gui/widgets/qscrollarea.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/widgets/qscrollarea.cpp')
-rw-r--r--src/gui/widgets/qscrollarea.cpp522
1 files changed, 0 insertions, 522 deletions
diff --git a/src/gui/widgets/qscrollarea.cpp b/src/gui/widgets/qscrollarea.cpp
deleted file mode 100644
index 314f4fe9d2..0000000000
--- a/src/gui/widgets/qscrollarea.cpp
+++ /dev/null
@@ -1,522 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qscrollarea.h"
-#include "private/qscrollarea_p.h"
-
-#ifndef QT_NO_SCROLLAREA
-
-#include "qscrollbar.h"
-#include "qlayout.h"
-#include "qstyle.h"
-#include "qapplication.h"
-#include "qvariant.h"
-#include "qdebug.h"
-#include "private/qlayoutengine_p.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QScrollArea
-
- \brief The QScrollArea class provides a scrolling view onto
- another widget.
-
- \ingroup basicwidgets
-
-
- A scroll area is used to display the contents of a child widget
- within a frame. If the widget exceeds the size of the frame, the
- view can provide scroll bars so that the entire area of the child
- widget can be viewed. The child widget must be specified with
- setWidget(). For example:
-
- \snippet doc/src/snippets/code/src_gui_widgets_qscrollarea.cpp 0
-
- The code above creates a scroll area (shown in the images below)
- containing an image label. When scaling the image, the scroll area
- can provide the necessary scroll bars:
-
- \table
- \row
- \o \inlineimage qscrollarea-noscrollbars.png
- \o \inlineimage qscrollarea-onescrollbar.png
- \o \inlineimage qscrollarea-twoscrollbars.png
- \endtable
-
- The scroll bars appearance depends on the currently set \l
- {Qt::ScrollBarPolicy}{scroll bar policies}. You can control the
- appearance of the scroll bars using the inherited functionality
- from QAbstractScrollArea.
-
- For example, you can set the
- QAbstractScrollArea::horizontalScrollBarPolicy and
- QAbstractScrollArea::verticalScrollBarPolicy properties. Or if you
- want the scroll bars to adjust dynamically when the contents of
- the scroll area changes, you can use the \l
- {QAbstractScrollArea::horizontalScrollBar()}{horizontalScrollBar()}
- and \l
- {QAbstractScrollArea::verticalScrollBar()}{verticalScrollBar()}
- functions (which enable you to access the scroll bars) and set the
- scroll bars' values whenever the scroll area's contents change,
- using the QScrollBar::setValue() function.
-
- You can retrieve the child widget using the widget() function. The
- view can be made to be resizable with the setWidgetResizable()
- function. The alignment of the widget can be specified with
- setAlignment().
-
- Two convenience functions ensureVisible() and
- ensureWidgetVisible() ensure a certain region of the contents is
- visible inside the viewport, by scrolling the contents if
- necessary.
-
- \section1 Size Hints and Layouts
-
- When using a scroll area to display the contents of a custom
- widget, it is important to ensure that the
- \l{QWidget::sizeHint}{size hint} of the child widget is set to a
- suitable value. If a standard QWidget is used for the child
- widget, it may be necessary to call QWidget::setMinimumSize() to
- ensure that the contents of the widget are shown correctly within
- the scroll area.
-
- If a scroll area is used to display the contents of a widget that
- contains child widgets arranged in a layout, it is important to
- realize that the size policy of the layout will also determine the
- size of the widget. This is especially useful to know if you intend
- to dynamically change the contents of the layout. In such cases,
- setting the layout's \l{QLayout::sizeConstraint}{size constraint}
- property to one which provides constraints on the minimum and/or
- maximum size of the layout (e.g., QLayout::SetMinAndMaxSize) will
- cause the size of the scroll area to be updated whenever the
- contents of the layout changes.
-
- For a complete example using the QScrollArea class, see the \l
- {widgets/imageviewer}{Image Viewer} example. The example shows how
- to combine QLabel and QScrollArea to display an image.
-
- \sa QAbstractScrollArea, QScrollBar, {Image Viewer Example}
-*/
-
-
-/*!
- Constructs an empty scroll area with the given \a parent.
-
- \sa setWidget()
-*/
-QScrollArea::QScrollArea(QWidget *parent)
- : QAbstractScrollArea(*new QScrollAreaPrivate,parent)
-{
- Q_D(QScrollArea);
- d->viewport->setBackgroundRole(QPalette::NoRole);
- d->vbar->setSingleStep(20);
- d->hbar->setSingleStep(20);
- d->layoutChildren();
-}
-
-/*!
- \internal
-*/
-QScrollArea::QScrollArea(QScrollAreaPrivate &dd, QWidget *parent)
- : QAbstractScrollArea(dd, parent)
-{
- Q_D(QScrollArea);
- d->viewport->setBackgroundRole(QPalette::NoRole);
- d->vbar->setSingleStep(20);
- d->hbar->setSingleStep(20);
- d->layoutChildren();
-}
-
-/*!
- Destroys the scroll area and its child widget.
-
- \sa setWidget()
-*/
-QScrollArea::~QScrollArea()
-{
-}
-
-void QScrollAreaPrivate::updateWidgetPosition()
-{
- Q_Q(QScrollArea);
- Qt::LayoutDirection dir = q->layoutDirection();
- QRect scrolled = QStyle::visualRect(dir, viewport->rect(), QRect(QPoint(-hbar->value(), -vbar->value()), widget->size()));
- QRect aligned = QStyle::alignedRect(dir, alignment, widget->size(), viewport->rect());
- widget->move(widget->width() < viewport->width() ? aligned.x() : scrolled.x(),
- widget->height() < viewport->height() ? aligned.y() : scrolled.y());
-}
-
-void QScrollAreaPrivate::updateScrollBars()
-{
- Q_Q(QScrollArea);
- if (!widget)
- return;
- QSize p = viewport->size();
- QSize m = q->maximumViewportSize();
-
- QSize min = qSmartMinSize(widget);
- QSize max = qSmartMaxSize(widget);
-
- if (resizable) {
- if ((widget->layout() ? widget->layout()->hasHeightForWidth() : widget->sizePolicy().hasHeightForWidth())) {
- QSize p_hfw = p.expandedTo(min).boundedTo(max);
- int h = widget->heightForWidth( p_hfw.width() );
- min = QSize(p_hfw.width(), qMax(p_hfw.height(), h));
- }
- }
-
- if ((resizable && m.expandedTo(min) == m && m.boundedTo(max) == m)
- || (!resizable && m.expandedTo(widget->size()) == m))
- p = m; // no scroll bars needed
-
- if (resizable)
- widget->resize(p.expandedTo(min).boundedTo(max));
- QSize v = widget->size();
-
- hbar->setRange(0, v.width() - p.width());
- hbar->setPageStep(p.width());
- vbar->setRange(0, v.height() - p.height());
- vbar->setPageStep(p.height());
- updateWidgetPosition();
-
-}
-
-/*!
- Returns the scroll area's widget, or 0 if there is none.
-
- \sa setWidget()
-*/
-
-QWidget *QScrollArea::widget() const
-{
- Q_D(const QScrollArea);
- return d->widget;
-}
-
-/*!
- \fn void QScrollArea::setWidget(QWidget *widget)
-
- Sets the scroll area's \a widget.
-
- The \a widget becomes a child of the scroll area, and will be
- destroyed when the scroll area is deleted or when a new widget is
- set.
-
- The widget's \l{QWidget::setAutoFillBackground()}{autoFillBackground}
- property will be set to \c{true}.
-
- If the scroll area is visible when the \a widget is
- added, you must \l{QWidget::}{show()} it explicitly.
-
- Note that You must add the layout of \a widget before you call
- this function; if you add it later, the \a widget will not be
- visible - regardless of when you \l{QWidget::}{show()} the scroll
- area. In this case, you can also not \l{QWidget::}{show()} the \a
- widget later.
-
- \sa widget()
-*/
-void QScrollArea::setWidget(QWidget *widget)
-{
- Q_D(QScrollArea);
- if (widget == d->widget || !widget)
- return;
-
- delete d->widget;
- d->widget = 0;
- d->hbar->setValue(0);
- d->vbar->setValue(0);
- if (widget->parentWidget() != d->viewport)
- widget->setParent(d->viewport);
- if (!widget->testAttribute(Qt::WA_Resized))
- widget->resize(widget->sizeHint());
- d->widget = widget;
- d->widget->setAutoFillBackground(true);
- widget->installEventFilter(this);
- d->widgetSize = QSize();
- d->updateScrollBars();
- d->widget->show();
-
-}
-
-/*!
- Removes the scroll area's widget, and passes ownership of the
- widget to the caller.
-
- \sa widget()
- */
-QWidget *QScrollArea::takeWidget()
-{
- Q_D(QScrollArea);
- QWidget *w = d->widget;
- d->widget = 0;
- if (w)
- w->setParent(0);
- return w;
-}
-
-/*!
- \reimp
- */
-bool QScrollArea::event(QEvent *e)
-{
- Q_D(QScrollArea);
- if (e->type() == QEvent::StyleChange || e->type() == QEvent::LayoutRequest) {
- d->updateScrollBars();
- }
-#ifdef QT_KEYPAD_NAVIGATION
- else if (QApplication::keypadNavigationEnabled()) {
- if (e->type() == QEvent::Show)
- QApplication::instance()->installEventFilter(this);
- else if (e->type() == QEvent::Hide)
- QApplication::instance()->removeEventFilter(this);
- }
-#endif
- return QAbstractScrollArea::event(e);
-}
-
-
-/*!
- \reimp
- */
-bool QScrollArea::eventFilter(QObject *o, QEvent *e)
-{
- Q_D(QScrollArea);
-#ifdef QT_KEYPAD_NAVIGATION
- if (d->widget && o != d->widget && e->type() == QEvent::FocusIn
- && QApplication::keypadNavigationEnabled()) {
- if (o->isWidgetType())
- ensureWidgetVisible(static_cast<QWidget *>(o));
- }
-#endif
- if (o == d->widget && e->type() == QEvent::Resize)
- d->updateScrollBars();
-
- return false;
-}
-
-/*!
- \reimp
- */
-void QScrollArea::resizeEvent(QResizeEvent *)
-{
- Q_D(QScrollArea);
- d->updateScrollBars();
-
-}
-
-
-/*!\reimp
- */
-void QScrollArea::scrollContentsBy(int, int)
-{
- Q_D(QScrollArea);
- if (!d->widget)
- return;
- d->updateWidgetPosition();
-}
-
-
-/*!
- \property QScrollArea::widgetResizable
- \brief whether the scroll area should resize the view widget
-
- If this property is set to false (the default), the scroll area
- honors the size of its widget. Regardless of this property, you
- can programmatically resize the widget using widget()->resize(),
- and the scroll area will automatically adjust itself to the new
- size.
-
- If this property is set to true, the scroll area will
- automatically resize the widget in order to avoid scroll bars
- where they can be avoided, or to take advantage of extra space.
-*/
-bool QScrollArea::widgetResizable() const
-{
- Q_D(const QScrollArea);
- return d->resizable;
-}
-
-void QScrollArea::setWidgetResizable(bool resizable)
-{
- Q_D(QScrollArea);
- d->resizable = resizable;
- updateGeometry();
- d->updateScrollBars();
-}
-
-/*!
- \reimp
- */
-QSize QScrollArea::sizeHint() const
-{
- Q_D(const QScrollArea);
- int f = 2 * d->frameWidth;
- QSize sz(f, f);
- int h = fontMetrics().height();
- if (d->widget) {
- if (!d->widgetSize.isValid())
- d->widgetSize = d->resizable ? d->widget->sizeHint() : d->widget->size();
- sz += d->widgetSize;
- } else {
- sz += QSize(12 * h, 8 * h);
- }
- if (d->vbarpolicy == Qt::ScrollBarAlwaysOn)
- sz.setWidth(sz.width() + d->vbar->sizeHint().width());
- if (d->hbarpolicy == Qt::ScrollBarAlwaysOn)
- sz.setHeight(sz.height() + d->hbar->sizeHint().height());
- return sz.boundedTo(QSize(36 * h, 24 * h));
-}
-
-
-
-/*!
- \reimp
- */
-bool QScrollArea::focusNextPrevChild(bool next)
-{
- if (QWidget::focusNextPrevChild(next)) {
- if (QWidget *fw = focusWidget())
- ensureWidgetVisible(fw);
- return true;
- }
- return false;
-}
-
-/*!
- Scrolls the contents of the scroll area so that the point (\a x, \a y) is visible
- inside the region of the viewport with margins specified in pixels by \a xmargin and
- \a ymargin. If the specified point cannot be reached, the contents are scrolled to
- the nearest valid position. The default value for both margins is 50 pixels.
-*/
-void QScrollArea::ensureVisible(int x, int y, int xmargin, int ymargin)
-{
- Q_D(QScrollArea);
-
- int logicalX = QStyle::visualPos(layoutDirection(), d->viewport->rect(), QPoint(x, y)).x();
-
- if (logicalX - xmargin < d->hbar->value()) {
- d->hbar->setValue(qMax(0, logicalX - xmargin));
- } else if (logicalX > d->hbar->value() + d->viewport->width() - xmargin) {
- d->hbar->setValue(qMin(logicalX - d->viewport->width() + xmargin, d->hbar->maximum()));
- }
-
- if (y - ymargin < d->vbar->value()) {
- d->vbar->setValue(qMax(0, y - ymargin));
- } else if (y > d->vbar->value() + d->viewport->height() - ymargin) {
- d->vbar->setValue(qMin(y - d->viewport->height() + ymargin, d->vbar->maximum()));
- }
-}
-
-/*!
- \since 4.2
-
- Scrolls the contents of the scroll area so that the \a childWidget
- of QScrollArea::widget() is visible inside the viewport with
- margins specified in pixels by \a xmargin and \a ymargin. If the
- specified point cannot be reached, the contents are scrolled to
- the nearest valid position. The default value for both margins is
- 50 pixels.
-
-*/
-void QScrollArea::ensureWidgetVisible(QWidget *childWidget, int xmargin, int ymargin)
-{
- Q_D(QScrollArea);
-
- if (!d->widget->isAncestorOf(childWidget))
- return;
-
- const QRect microFocus = childWidget->inputMethodQuery(Qt::ImMicroFocus).toRect();
- const QRect defaultMicroFocus =
- childWidget->QWidget::inputMethodQuery(Qt::ImMicroFocus).toRect();
- QRect focusRect = (microFocus != defaultMicroFocus)
- ? QRect(childWidget->mapTo(d->widget, microFocus.topLeft()), microFocus.size())
- : QRect(childWidget->mapTo(d->widget, QPoint(0,0)), childWidget->size());
- const QRect visibleRect(-d->widget->pos(), d->viewport->size());
-
- if (visibleRect.contains(focusRect))
- return;
-
- focusRect.adjust(-xmargin, -ymargin, xmargin, ymargin);
-
- if (focusRect.width() > visibleRect.width())
- d->hbar->setValue(focusRect.center().x() - d->viewport->width() / 2);
- else if (focusRect.right() > visibleRect.right())
- d->hbar->setValue(focusRect.right() - d->viewport->width());
- else if (focusRect.left() < visibleRect.left())
- d->hbar->setValue(focusRect.left());
-
- if (focusRect.height() > visibleRect.height())
- d->vbar->setValue(focusRect.center().y() - d->viewport->height() / 2);
- else if (focusRect.bottom() > visibleRect.bottom())
- d->vbar->setValue(focusRect.bottom() - d->viewport->height());
- else if (focusRect.top() < visibleRect.top())
- d->vbar->setValue(focusRect.top());
-}
-
-
-/*!
- \property QScrollArea::alignment
- \brief the alignment of the scroll area's widget
- \since 4.2
-
- By default, the widget stays rooted to the top-left corner of the
- scroll area.
-*/
-
-void QScrollArea::setAlignment(Qt::Alignment alignment)
-{
- Q_D(QScrollArea);
- d->alignment = alignment;
- if (d->widget)
- d->updateWidgetPosition();
-}
-
-Qt::Alignment QScrollArea::alignment() const
-{
- Q_D(const QScrollArea);
- return d->alignment;
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_SCROLLAREA