summaryrefslogtreecommitdiffstats
path: root/src/gui/kernel/qstackedlayout.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/kernel/qstackedlayout.cpp')
-rw-r--r--src/gui/kernel/qstackedlayout.cpp543
1 files changed, 0 insertions, 543 deletions
diff --git a/src/gui/kernel/qstackedlayout.cpp b/src/gui/kernel/qstackedlayout.cpp
deleted file mode 100644
index c5ce238958..0000000000
--- a/src/gui/kernel/qstackedlayout.cpp
+++ /dev/null
@@ -1,543 +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$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, 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.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qstackedlayout.h"
-#include "qlayout_p.h"
-
-#include <qlist.h>
-#include <qwidget.h>
-#include "private/qlayoutengine_p.h"
-
-QT_BEGIN_NAMESPACE
-
-class QStackedLayoutPrivate : public QLayoutPrivate
-{
- Q_DECLARE_PUBLIC(QStackedLayout)
-public:
- QStackedLayoutPrivate() : index(-1), stackingMode(QStackedLayout::StackOne) {}
- QList<QLayoutItem *> list;
- int index;
- QStackedLayout::StackingMode stackingMode;
-};
-
-/*!
- \class QStackedLayout
-
- \brief The QStackedLayout class provides a stack of widgets where
- only one widget is visible at a time.
-
- \ingroup geomanagement
-
- QStackedLayout can be used to create a user interface similar to
- the one provided by QTabWidget. There is also a convenience
- QStackedWidget class built on top of QStackedLayout.
-
- A QStackedLayout can be populated with a number of child widgets
- ("pages"). For example:
-
- \snippet doc/src/snippets/qstackedlayout/main.cpp 0
- \codeline
- \snippet doc/src/snippets/qstackedlayout/main.cpp 2
- \snippet doc/src/snippets/qstackedlayout/main.cpp 3
-
- QStackedLayout provides no intrinsic means for the user to switch
- page. This is typically done through a QComboBox or a QListWidget
- that stores the titles of the QStackedLayout's pages. For
- example:
-
- \snippet doc/src/snippets/qstackedlayout/main.cpp 1
-
- When populating a layout, the widgets are added to an internal
- list. The indexOf() function returns the index of a widget in that
- list. The widgets can either be added to the end of the list using
- the addWidget() function, or inserted at a given index using the
- insertWidget() function. The removeWidget() function removes the
- widget at the given index from the layout. The number of widgets
- contained in the layout, can be obtained using the count()
- function.
-
- The widget() function returns the widget at a given index
- position. The index of the widget that is shown on screen is given
- by currentIndex() and can be changed using setCurrentIndex(). In a
- similar manner, the currently shown widget can be retrieved using
- the currentWidget() function, and altered using the
- setCurrentWidget() function.
-
- Whenever the current widget in the layout changes or a widget is
- removed from the layout, the currentChanged() and widgetRemoved()
- signals are emitted respectively.
-
- \sa QStackedWidget, QTabWidget
-*/
-
-/*!
- \fn void QStackedLayout::currentChanged(int index)
-
- This signal is emitted whenever the current widget in the layout
- changes. The \a index specifies the index of the new current
- widget, or -1 if there isn't a new one (for example, if there
- are no widgets in the QStackedLayout)
-
- \sa currentWidget(), setCurrentWidget()
-*/
-
-/*!
- \fn void QStackedLayout::widgetRemoved(int index)
-
- This signal is emitted whenever a widget is removed from the
- layout. The widget's \a index is passed as parameter.
-
- \sa removeWidget()
-*/
-
-/*!
- \fn QWidget *QStackedLayout::widget()
- \internal
-*/
-
-/*!
- Constructs a QStackedLayout with no parent.
-
- This QStackedLayout must be installed on a widget later on to
- become effective.
-
- \sa addWidget(), insertWidget()
-*/
-QStackedLayout::QStackedLayout()
- : QLayout(*new QStackedLayoutPrivate, 0, 0)
-{
-}
-
-/*!
- Constructs a new QStackedLayout with the given \a parent.
-
- This layout will install itself on the \a parent widget and
- manage the geometry of its children.
-*/
-QStackedLayout::QStackedLayout(QWidget *parent)
- : QLayout(*new QStackedLayoutPrivate, 0, parent)
-{
-}
-
-/*!
- Constructs a new QStackedLayout and inserts it into
- the given \a parentLayout.
-*/
-QStackedLayout::QStackedLayout(QLayout *parentLayout)
- : QLayout(*new QStackedLayoutPrivate, parentLayout, 0)
-{
-}
-
-/*!
- Destroys this QStackedLayout. Note that the layout's widgets are
- \e not destroyed.
-*/
-QStackedLayout::~QStackedLayout()
-{
- Q_D(QStackedLayout);
- qDeleteAll(d->list);
-}
-
-/*!
- Adds the given \a widget to the end of this layout and returns the
- index position of the \a widget.
-
- If the QStackedLayout is empty before this function is called,
- the given \a widget becomes the current widget.
-
- \sa insertWidget(), removeWidget(), setCurrentWidget()
-*/
-int QStackedLayout::addWidget(QWidget *widget)
-{
- Q_D(QStackedLayout);
- return insertWidget(d->list.count(), widget);
-}
-
-/*!
- Inserts the given \a widget at the given \a index in this
- QStackedLayout. If \a index is out of range, the widget is
- appended (in which case it is the actual index of the \a widget
- that is returned).
-
- If the QStackedLayout is empty before this function is called, the
- given \a widget becomes the current widget.
-
- Inserting a new widget at an index less than or equal to the current index
- will increment the current index, but keep the current widget.
-
- \sa addWidget(), removeWidget(), setCurrentWidget()
-*/
-int QStackedLayout::insertWidget(int index, QWidget *widget)
-{
- Q_D(QStackedLayout);
- addChildWidget(widget);
- index = qMin(index, d->list.count());
- if (index < 0)
- index = d->list.count();
- QWidgetItem *wi = QLayoutPrivate::createWidgetItem(this, widget);
- d->list.insert(index, wi);
- invalidate();
- if (d->index < 0) {
- setCurrentIndex(index);
- } else {
- if (index <= d->index)
- ++d->index;
- if (d->stackingMode == StackOne)
- widget->hide();
- widget->lower();
- }
- return index;
-}
-
-/*!
- \reimp
-*/
-QLayoutItem *QStackedLayout::itemAt(int index) const
-{
- Q_D(const QStackedLayout);
- return d->list.value(index);
-}
-
-// Code that enables proper handling of the case that takeAt() is
-// called somewhere inside QObject destructor (can't call hide()
-// on the object then)
-
-class QtFriendlyLayoutWidget : public QWidget
-{
-public:
- inline bool wasDeleted() const { return d_ptr->wasDeleted; }
-};
-
-static bool qt_wasDeleted(const QWidget *w) { return static_cast<const QtFriendlyLayoutWidget*>(w)->wasDeleted(); }
-
-
-/*!
- \reimp
-*/
-QLayoutItem *QStackedLayout::takeAt(int index)
-{
- Q_D(QStackedLayout);
- if (index <0 || index >= d->list.size())
- return 0;
- QLayoutItem *item = d->list.takeAt(index);
- if (index == d->index) {
- d->index = -1;
- if ( d->list.count() > 0 ) {
- int newIndex = (index == d->list.count()) ? index-1 : index;
- setCurrentIndex(newIndex);
- } else {
- emit currentChanged(-1);
- }
- } else if (index < d->index) {
- --d->index;
- }
- emit widgetRemoved(index);
- if (item->widget() && !qt_wasDeleted(item->widget()))
- item->widget()->hide();
- return item;
-}
-
-/*!
- \property QStackedLayout::currentIndex
- \brief the index position of the widget that is visible
-
- The current index is -1 if there is no current widget.
-
- \sa currentWidget(), indexOf()
-*/
-void QStackedLayout::setCurrentIndex(int index)
-{
- Q_D(QStackedLayout);
- QWidget *prev = currentWidget();
- QWidget *next = widget(index);
- if (!next || next == prev)
- return;
-
- bool reenableUpdates = false;
- QWidget *parent = parentWidget();
-
- if (parent && parent->updatesEnabled()) {
- reenableUpdates = true;
- parent->setUpdatesEnabled(false);
- }
-
- QWidget *fw = parent ? parent->window()->focusWidget() : 0;
- if (prev) {
- prev->clearFocus();
- if (d->stackingMode == StackOne)
- prev->hide();
- }
-
- d->index = index;
- next->raise();
- next->show();
-
- // try to move focus onto the incoming widget if focus
- // was somewhere on the outgoing widget.
-
- if (parent) {
- if (fw && (prev && prev->isAncestorOf(fw))) { // focus was on old page
- // look for the best focus widget we can find
- if (QWidget *nfw = next->focusWidget())
- nfw->setFocus();
- else {
- // second best: first child widget in the focus chain
- QWidget *i = fw;
- while ((i = i->nextInFocusChain()) != fw) {
- if (((i->focusPolicy() & Qt::TabFocus) == Qt::TabFocus)
- && !i->focusProxy() && i->isVisibleTo(next) && i->isEnabled()
- && next->isAncestorOf(i)) {
- i->setFocus();
- break;
- }
- }
- // third best: incoming widget
- if (i == fw )
- next->setFocus();
- }
- }
- }
- if (reenableUpdates)
- parent->setUpdatesEnabled(true);
- emit currentChanged(index);
-}
-
-int QStackedLayout::currentIndex() const
-{
- Q_D(const QStackedLayout);
- return d->index;
-}
-
-
-/*!
- \fn void QStackedLayout::setCurrentWidget(QWidget *widget)
-
- Sets the current widget to be the specified \a widget. The new
- current widget must already be contained in this stacked layout.
-
- \sa setCurrentIndex(), currentWidget()
- */
-void QStackedLayout::setCurrentWidget(QWidget *widget)
-{
- int index = indexOf(widget);
- if (index == -1) {
- qWarning("QStackedLayout::setCurrentWidget: Widget %p not contained in stack", widget);
- return;
- }
- setCurrentIndex(index);
-}
-
-
-/*!
- Returns the current widget, or 0 if there are no widgets in this
- layout.
-
- \sa currentIndex(), setCurrentWidget()
-*/
-QWidget *QStackedLayout::currentWidget() const
-{
- Q_D(const QStackedLayout);
- return d->index >= 0 ? d->list.at(d->index)->widget() : 0;
-}
-
-/*!
- Returns the widget at the given \a index, or 0 if there is no
- widget at the given position.
-
- \sa currentWidget(), indexOf()
-*/
-QWidget *QStackedLayout::widget(int index) const
-{
- Q_D(const QStackedLayout);
- if (index < 0 || index >= d->list.size())
- return 0;
- return d->list.at(index)->widget();
-}
-
-/*!
- \property QStackedLayout::count
- \brief the number of widgets contained in the layout
-
- \sa currentIndex(), widget()
-*/
-int QStackedLayout::count() const
-{
- Q_D(const QStackedLayout);
- return d->list.size();
-}
-
-
-/*!
- \reimp
-*/
-void QStackedLayout::addItem(QLayoutItem *item)
-{
- QWidget *widget = item->widget();
- if (widget) {
- addWidget(widget);
- delete item;
- } else {
- qWarning("QStackedLayout::addItem: Only widgets can be added");
- }
-}
-
-/*!
- \reimp
-*/
-QSize QStackedLayout::sizeHint() const
-{
- Q_D(const QStackedLayout);
- QSize s(0, 0);
- int n = d->list.count();
-
- for (int i = 0; i < n; ++i)
- if (QWidget *widget = d->list.at(i)->widget()) {
- QSize ws(widget->sizeHint());
- if (widget->sizePolicy().horizontalPolicy() == QSizePolicy::Ignored)
- ws.setWidth(0);
- if (widget->sizePolicy().verticalPolicy() == QSizePolicy::Ignored)
- ws.setHeight(0);
- s = s.expandedTo(ws);
- }
- return s;
-}
-
-/*!
- \reimp
-*/
-QSize QStackedLayout::minimumSize() const
-{
- Q_D(const QStackedLayout);
- QSize s(0, 0);
- int n = d->list.count();
-
- for (int i = 0; i < n; ++i)
- if (QWidget *widget = d->list.at(i)->widget())
- s = s.expandedTo(qSmartMinSize(widget));
- return s;
-}
-
-/*!
- \reimp
-*/
-void QStackedLayout::setGeometry(const QRect &rect)
-{
- Q_D(QStackedLayout);
- switch (d->stackingMode) {
- case StackOne:
- if (QWidget *widget = currentWidget())
- widget->setGeometry(rect);
- break;
- case StackAll:
- if (const int n = d->list.count())
- for (int i = 0; i < n; ++i)
- if (QWidget *widget = d->list.at(i)->widget())
- widget->setGeometry(rect);
- break;
- }
-}
-
-/*!
- \enum QStackedLayout::StackingMode
- \since 4.4
-
- This enum specifies how the layout handles its child widgets
- regarding their visibility.
-
- \value StackOne
- Only the current widget is visible. This is the default.
-
- \value StackAll
- All widgets are visible. The current widget is merely raised.
-*/
-
-
-/*!
- \property QStackedLayout::stackingMode
- \brief determines the way visibility of child widgets are handled.
- \since 4.4
-
- The default value is StackOne. Setting the property to StackAll
- allows you to make use of the layout for overlay widgets
- that do additional drawing on top of other widgets, for example,
- graphical editors.
-*/
-
-QStackedLayout::StackingMode QStackedLayout::stackingMode() const
-{
- Q_D(const QStackedLayout);
- return d->stackingMode;
-}
-
-void QStackedLayout::setStackingMode(StackingMode stackingMode)
-{
- Q_D(QStackedLayout);
- if (d->stackingMode == stackingMode)
- return;
- d->stackingMode = stackingMode;
-
- const int n = d->list.count();
- if (n == 0)
- return;
-
- switch (d->stackingMode) {
- case StackOne:
- if (const int idx = currentIndex())
- for (int i = 0; i < n; ++i)
- if (QWidget *widget = d->list.at(i)->widget())
- widget->setVisible(i == idx);
- break;
- case StackAll: { // Turn overlay on: Make sure all widgets are the same size
- QRect geometry;
- if (const QWidget *widget = currentWidget())
- geometry = widget->geometry();
- for (int i = 0; i < n; ++i)
- if (QWidget *widget = d->list.at(i)->widget()) {
- if (!geometry.isNull())
- widget->setGeometry(geometry);
- widget->setVisible(true);
- }
- }
- break;
- }
-}
-
-QT_END_NAMESPACE