diff options
Diffstat (limited to 'src/gui/widgets/qtabwidget.cpp')
-rw-r--r-- | src/gui/widgets/qtabwidget.cpp | 1516 |
1 files changed, 0 insertions, 1516 deletions
diff --git a/src/gui/widgets/qtabwidget.cpp b/src/gui/widgets/qtabwidget.cpp deleted file mode 100644 index c296b77370..0000000000 --- a/src/gui/widgets/qtabwidget.cpp +++ /dev/null @@ -1,1516 +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 "qtabwidget.h" - -#ifndef QT_NO_TABWIDGET -#include "private/qwidget_p.h" -#include "private/qtabbar_p.h" -#include "qapplication.h" -#include "qbitmap.h" -#include "qdesktopwidget.h" -#include "qevent.h" -#include "qlayout.h" -#include "qstackedwidget.h" -#include "qstyle.h" -#include "qstyleoption.h" -#include "qstylepainter.h" -#include "qtabbar.h" -#include "qtoolbutton.h" - -QT_BEGIN_NAMESPACE - -/*! - \class QTabWidget - \brief The QTabWidget class provides a stack of tabbed widgets. - - \ingroup organizers - \ingroup basicwidgets - - - A tab widget provides a tab bar (see QTabBar) and a "page area" - that is used to display pages related to each tab. By default, the - tab bar is shown above the page area, but different configurations - are available (see \l{TabPosition}). Each tab is associated with a - different widget (called a page). Only the current page is shown in - the page area; all the other pages are hidden. The user can show a - different page by clicking on its tab or by pressing its - Alt+\e{letter} shortcut if it has one. - - The normal way to use QTabWidget is to do the following: - \list 1 - \i Create a QTabWidget. - \i Create a QWidget for each of the pages in the tab dialog, but - do not specify parent widgets for them. - \i Insert child widgets into the page widget, using layouts to - position them as normal. - \i Call addTab() or insertTab() to put the page widgets into the - tab widget, giving each tab a suitable label with an optional - keyboard shortcut. - \endlist - - The position of the tabs is defined by \l tabPosition, their shape - by \l tabShape. - - The signal currentChanged() is emitted when the user selects a - page. - - The current page index is available as currentIndex(), the current - page widget with currentWidget(). You can retrieve a pointer to a - page widget with a given index using widget(), and can find the - index position of a widget with indexOf(). Use setCurrentWidget() - or setCurrentIndex() to show a particular page. - - You can change a tab's text and icon using setTabText() or - setTabIcon(). A tab and its associated page can be removed with - removeTab(). - - Each tab is either enabled or disabled at any given time (see - setTabEnabled()). If a tab is enabled, the tab text is drawn - normally and the user can select that tab. If it is disabled, the - tab is drawn in a different way and the user cannot select that - tab. Note that even if a tab is disabled, the page can still be - visible, for example if all of the tabs happen to be disabled. - - Tab widgets can be a very good way to split up a complex dialog. - An alternative is to use a QStackedWidget for which you provide some - means of navigating between pages, for example, a QToolBar or a - QListWidget. - - Most of the functionality in QTabWidget is provided by a QTabBar - (at the top, providing the tabs) and a QStackedWidget (most of the - area, organizing the individual pages). - - \table 100% - \row \o \inlineimage windowsxp-tabwidget.png Screenshot of a Windows XP style tab widget - \o \inlineimage macintosh-tabwidget.png Screenshot of a Macintosh style tab widget - \o \inlineimage plastique-tabwidget.png Screenshot of a Plastique style tab widget - \row \o A Windows XP style tab widget. - \o A Macintosh style tab widget. - \o A Plastique style tab widget. - \endtable - - \sa QTabBar, QStackedWidget, QToolBox, {Tab Dialog Example} -*/ - -/*! - \enum QTabWidget::TabPosition - - This enum type defines where QTabWidget draws the tab row: - - \value North The tabs are drawn above the pages. - \value South The tabs are drawn below the pages. - \value West The tabs are drawn to the left of the pages. - \value East The tabs are drawn to the right of the pages. - \omitvalue Bottom - \omitvalue Top -*/ - -/*! - \enum QTabWidget::TabShape - - This enum type defines the shape of the tabs: - \value Rounded The tabs are drawn with a rounded look. This is the default - shape. - \value Triangular The tabs are drawn with a triangular look. -*/ - -/*! - \fn void QTabWidget::selected(const QString &tabLabel) - - This signal is emitted whenever a tab is selected (raised), - including during the first show(). - - You can normally use currentChanged() instead. -*/ - -/*! - \fn void QTabWidget::currentChanged(int index) - - This signal is emitted whenever the current page index changes. - The parameter is the new current page \a index position, or -1 - if there isn't a new one (for example, if there are no widgets - in the QTabWidget) - - \sa currentWidget() currentIndex -*/ - -/*! - \fn void QTabWidget::tabCloseRequested(int index) - \since 4.5 - - This signal is emitted when the close button on a tab is clicked. - The \a index is the index that should be removed. - - \sa setTabsClosable() -*/ - -class QTabWidgetPrivate : public QWidgetPrivate -{ - Q_DECLARE_PUBLIC(QTabWidget) - -public: - QTabWidgetPrivate(); - ~QTabWidgetPrivate(); - void updateTabBarPosition(); - void _q_showTab(int); - void _q_removeTab(int); - void _q_tabMoved(int from, int to); - void init(); - bool hasHeightForWidth() const; - - QTabBar *tabs; - QStackedWidget *stack; - QRect panelRect; - bool dirty; - QTabWidget::TabPosition pos; - QTabWidget::TabShape shape; - int alignment; - QWidget *leftCornerWidget; - QWidget *rightCornerWidget; -}; - -QTabWidgetPrivate::QTabWidgetPrivate() - : tabs(0), stack(0), dirty(true), - pos(QTabWidget::North), shape(QTabWidget::Rounded), - leftCornerWidget(0), rightCornerWidget(0) -{} - -QTabWidgetPrivate::~QTabWidgetPrivate() -{} - -void QTabWidgetPrivate::init() -{ - Q_Q(QTabWidget); - - stack = new QStackedWidget(q); - stack->setObjectName(QLatin1String("qt_tabwidget_stackedwidget")); - stack->setLineWidth(0); - // hack so that QMacStyle::layoutSpacing() can detect tab widget pages - stack->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred, QSizePolicy::TabWidget)); - - QObject::connect(stack, SIGNAL(widgetRemoved(int)), q, SLOT(_q_removeTab(int))); - QTabBar *tabBar = new QTabBar(q); - tabBar->setObjectName(QLatin1String("qt_tabwidget_tabbar")); - tabBar->setDrawBase(false); - q->setTabBar(tabBar); - - q->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding, - QSizePolicy::TabWidget)); -#ifdef QT_KEYPAD_NAVIGATION - if (QApplication::keypadNavigationEnabled()) - q->setFocusPolicy(Qt::NoFocus); - else -#endif - q->setFocusPolicy(Qt::TabFocus); - q->setFocusProxy(tabs); - q->setTabPosition(static_cast<QTabWidget::TabPosition> (q->style()->styleHint( - QStyle::SH_TabWidget_DefaultTabPosition, 0, q ))); - -} - -bool QTabWidgetPrivate::hasHeightForWidth() const -{ - bool has = size_policy.hasHeightForWidth(); - if (!has && stack) - has = qt_widget_private(stack)->hasHeightForWidth(); - return has; -} - - -/*! - Initialize \a option with the values from this QTabWidget. This method is useful - for subclasses when they need a QStyleOptionTabWidgetFrame, but don't want to fill - in all the information themselves. - - \sa QStyleOption::initFrom() QTabBar::initStyleOption() -*/ -void QTabWidget::initStyleOption(QStyleOptionTabWidgetFrame *option) const -{ - if (!option) - return; - - Q_D(const QTabWidget); - option->initFrom(this); - - if (documentMode()) - option->lineWidth = 0; - else - option->lineWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth, 0, this); - - int exth = style()->pixelMetric(QStyle::PM_TabBarBaseHeight, 0, this); - QSize t(0, d->stack->frameWidth()); - if (d->tabs->isVisibleTo(const_cast<QTabWidget *>(this))) { - t = d->tabs->sizeHint(); - if (documentMode()) { - if (tabPosition() == East || tabPosition() == West) { - t.setHeight(height()); - } else { - t.setWidth(width()); - } - } - } - - if (d->rightCornerWidget) { - const QSize rightCornerSizeHint = d->rightCornerWidget->sizeHint(); - const QSize bounds(rightCornerSizeHint.width(), t.height() - exth); - option->rightCornerWidgetSize = rightCornerSizeHint.boundedTo(bounds); - } else { - option->rightCornerWidgetSize = QSize(0, 0); - } - - if (d->leftCornerWidget) { - const QSize leftCornerSizeHint = d->leftCornerWidget->sizeHint(); - const QSize bounds(leftCornerSizeHint.width(), t.height() - exth); - option->leftCornerWidgetSize = leftCornerSizeHint.boundedTo(bounds); - } else { - option->leftCornerWidgetSize = QSize(0, 0); - } - - switch (d->pos) { - case QTabWidget::North: - option->shape = d->shape == QTabWidget::Rounded ? QTabBar::RoundedNorth - : QTabBar::TriangularNorth; - break; - case QTabWidget::South: - option->shape = d->shape == QTabWidget::Rounded ? QTabBar::RoundedSouth - : QTabBar::TriangularSouth; - break; - case QTabWidget::West: - option->shape = d->shape == QTabWidget::Rounded ? QTabBar::RoundedWest - : QTabBar::TriangularWest; - break; - case QTabWidget::East: - option->shape = d->shape == QTabWidget::Rounded ? QTabBar::RoundedEast - : QTabBar::TriangularEast; - break; - } - - option->tabBarSize = t; - - if (QStyleOptionTabWidgetFrameV2 *tabframe = qstyleoption_cast<QStyleOptionTabWidgetFrameV2*>(option)) { - QRect tbRect = tabBar()->geometry(); - QRect selectedTabRect = tabBar()->tabRect(tabBar()->currentIndex()); - tabframe->tabBarRect = tbRect; - selectedTabRect.moveTopLeft(selectedTabRect.topLeft() + tbRect.topLeft()); - tabframe->selectedTabRect = selectedTabRect; - } -} - -/*! - Constructs a tabbed widget with parent \a parent. -*/ -QTabWidget::QTabWidget(QWidget *parent) - : QWidget(*new QTabWidgetPrivate, parent, 0) -{ - Q_D(QTabWidget); - d->init(); -} - -#ifdef QT3_SUPPORT -/*! - Use one of the constructors that doesn't take the \a name - argument and then use setObjectName() instead. -*/ -QTabWidget::QTabWidget(QWidget *parent, const char *name, Qt::WindowFlags f) - : QWidget(*new QTabWidgetPrivate, parent, f) -{ - Q_D(QTabWidget); - setObjectName(QString::fromAscii(name)); - d->init(); -} -#endif - -/*! - Destroys the tabbed widget. -*/ -QTabWidget::~QTabWidget() -{ -} - -/*! - \fn int QTabWidget::addTab(QWidget *page, const QString &label) - - Adds a tab with the given \a page and \a label to the tab widget, - and returns the index of the tab in the tab bar. - - If the tab's \a label contains an ampersand, the letter following - the ampersand is used as a shortcut for the tab, e.g. if the - label is "Bro\&wse" then Alt+W becomes a shortcut which will - move the focus to this tab. - - \note If you call addTab() after show(), the layout system will try - to adjust to the changes in its widgets hierarchy and may cause - flicker. To prevent this, you can set the QWidget::updatesEnabled - property to false prior to changes; remember to set the property - to true when the changes are done, making the widget receive paint - events again. - - \sa insertTab() -*/ -int QTabWidget::addTab(QWidget *child, const QString &label) -{ - return insertTab(-1, child, label); -} - - -/*! - \fn int QTabWidget::addTab(QWidget *page, const QIcon &icon, const QString &label) - \overload - - Adds a tab with the given \a page, \a icon, and \a label to the tab - widget, and returns the index of the tab in the tab bar. - - This function is the same as addTab(), but with an additional \a - icon. -*/ -int QTabWidget::addTab(QWidget *child, const QIcon& icon, const QString &label) -{ - return insertTab(-1, child, icon, label); -} - - -/*! - \fn int QTabWidget::insertTab(int index, QWidget *page, const QString &label) - - Inserts a tab with the given \a label and \a page into the tab - widget at the specified \a index, and returns the index of the - inserted tab in the tab bar. - - The label is displayed in the tab and may vary in appearance depending - on the configuration of the tab widget. - - If the tab's \a label contains an ampersand, the letter following - the ampersand is used as a shortcut for the tab, e.g. if the - label is "Bro\&wse" then Alt+W becomes a shortcut which will - move the focus to this tab. - - If \a index is out of range, the tab is simply appended. - Otherwise it is inserted at the specified position. - - If the QTabWidget was empty before this function is called, the - new page becomes the current page. Inserting a new tab at an index - less than or equal to the current index will increment the current - index, but keep the current page. - - \note If you call insertTab() after show(), the layout system will try - to adjust to the changes in its widgets hierarchy and may cause - flicker. To prevent this, you can set the QWidget::updatesEnabled - property to false prior to changes; remember to set the property - to true when the changes are done, making the widget receive paint - events again. - - \sa addTab() -*/ -int QTabWidget::insertTab(int index, QWidget *w, const QString &label) -{ - return insertTab(index, w, QIcon(), label); -} - - -/*! - \fn int QTabWidget::insertTab(int index, QWidget *page, const QIcon& icon, const QString &label) - \overload - - Inserts a tab with the given \a label, \a page, and \a icon into - the tab widget at the specified \a index, and returns the index of the - inserted tab in the tab bar. - - This function is the same as insertTab(), but with an additional - \a icon. -*/ -int QTabWidget::insertTab(int index, QWidget *w, const QIcon& icon, const QString &label) -{ - Q_D(QTabWidget); - if(!w) - return -1; - index = d->stack->insertWidget(index, w); - d->tabs->insertTab(index, icon, label); - setUpLayout(); - tabInserted(index); - - return index; -} - - -/*! - Defines a new \a label for the page at position \a index's tab. - - If the provided text contains an ampersand character ('&'), a - shortcut is automatically created for it. The character that - follows the '&' will be used as the shortcut key. Any previous - shortcut will be overwritten, or cleared if no shortcut is defined - by the text. See the \l {QShortcut#mnemonic}{QShortcut} - documentation for details (to display an actual ampersand, use - '&&'). - -*/ -void QTabWidget::setTabText(int index, const QString &label) -{ - Q_D(QTabWidget); - d->tabs->setTabText(index, label); - setUpLayout(); -} - -/*! - Returns the label text for the tab on the page at position \a index. -*/ - -QString QTabWidget::tabText(int index) const -{ - Q_D(const QTabWidget); - return d->tabs->tabText(index); -} - -/*! - \overload - - Sets the \a icon for the tab at position \a index. -*/ -void QTabWidget::setTabIcon(int index, const QIcon &icon) -{ - Q_D(QTabWidget); - d->tabs->setTabIcon(index, icon); - setUpLayout(); -} - -/*! - Returns the icon for the tab on the page at position \a index. -*/ - -QIcon QTabWidget::tabIcon(int index) const -{ - Q_D(const QTabWidget); - return d->tabs->tabIcon(index); -} - -/*! - Returns true if the page at position \a index is enabled; otherwise returns false. - - \sa setTabEnabled(), QWidget::isEnabled() -*/ - -bool QTabWidget::isTabEnabled(int index) const -{ - Q_D(const QTabWidget); - return d->tabs->isTabEnabled(index); -} - -/*! - If \a enable is true, the page at position \a index is enabled; otherwise the page at position \a index is - disabled. The page's tab is redrawn appropriately. - - QTabWidget uses QWidget::setEnabled() internally, rather than - keeping a separate flag. - - Note that even a disabled tab/page may be visible. If the page is - visible already, QTabWidget will not hide it; if all the pages are - disabled, QTabWidget will show one of them. - - \sa isTabEnabled(), QWidget::setEnabled() -*/ - -void QTabWidget::setTabEnabled(int index, bool enable) -{ - Q_D(QTabWidget); - d->tabs->setTabEnabled(index, enable); - if (QWidget *widget = d->stack->widget(index)) - widget->setEnabled(enable); -} - -/*! - \fn void QTabWidget::setCornerWidget(QWidget *widget, Qt::Corner corner) - - Sets the given \a widget to be shown in the specified \a corner of the - tab widget. The geometry of the widget is determined based on the widget's - sizeHint() and the style(). - - Only the horizontal element of the \a corner will be used. - - Passing 0 shows no widget in the corner. - - Any previously set corner widget is hidden. - - All widgets set here will be deleted by the tab widget when it is - destroyed unless you separately reparent the widget after setting - some other corner widget (or 0). - - Note: Corner widgets are designed for \l North and \l South tab positions; - other orientations are known to not work properly. - - \sa cornerWidget(), setTabPosition() -*/ -void QTabWidget::setCornerWidget(QWidget * widget, Qt::Corner corner) -{ - Q_D(QTabWidget); - if (widget && widget->parentWidget() != this) - widget->setParent(this); - - if (corner & Qt::TopRightCorner) { - if (d->rightCornerWidget) - d->rightCornerWidget->hide(); - d->rightCornerWidget = widget; - } else { - if (d->leftCornerWidget) - d->leftCornerWidget->hide(); - d->leftCornerWidget = widget; - } - setUpLayout(); -} - -/*! - Returns the widget shown in the \a corner of the tab widget or 0. -*/ -QWidget * QTabWidget::cornerWidget(Qt::Corner corner) const -{ - Q_D(const QTabWidget); - if (corner & Qt::TopRightCorner) - return d->rightCornerWidget; - return d->leftCornerWidget; -} - -/*! - Removes the tab at position \a index from this stack of widgets. - The page widget itself is not deleted. - - \sa addTab(), insertTab() -*/ -void QTabWidget::removeTab(int index) -{ - Q_D(QTabWidget); - if (QWidget *w = d->stack->widget(index)) - d->stack->removeWidget(w); -} - -/*! - Returns a pointer to the page currently being displayed by the tab - dialog. The tab dialog does its best to make sure that this value - is never 0 (but if you try hard enough, it can be). - - \sa currentIndex(), setCurrentWidget() -*/ - -QWidget * QTabWidget::currentWidget() const -{ - Q_D(const QTabWidget); - return d->stack->currentWidget(); -} - -/*! - Makes \a widget the current widget. The \a widget used must be a page in - this tab widget. - - \sa addTab(), setCurrentIndex(), currentWidget() - */ -void QTabWidget::setCurrentWidget(QWidget *widget) -{ - Q_D(const QTabWidget); - d->tabs->setCurrentIndex(indexOf(widget)); -} - - -/*! - \property QTabWidget::currentIndex - \brief the index position of the current tab page - - The current index is -1 if there is no current widget. - - By default, this property contains a value of -1 because there are initially - no tabs in the widget. -*/ - -int QTabWidget::currentIndex() const -{ - Q_D(const QTabWidget); - return d->tabs->currentIndex(); -} - -void QTabWidget::setCurrentIndex(int index) -{ - Q_D(QTabWidget); - d->tabs->setCurrentIndex(index); -} - - -/*! - Returns the index position of the page occupied by the widget \a - w, or -1 if the widget cannot be found. -*/ -int QTabWidget::indexOf(QWidget* w) const -{ - Q_D(const QTabWidget); - return d->stack->indexOf(w); -} - - -/*! - \reimp -*/ -void QTabWidget::resizeEvent(QResizeEvent *e) -{ - QWidget::resizeEvent(e); - setUpLayout(); -} - -/*! - Replaces the dialog's QTabBar heading with the tab bar \a tb. Note - that this must be called \e before any tabs have been added, or - the behavior is undefined. - - \sa tabBar() -*/ -void QTabWidget::setTabBar(QTabBar* tb) -{ - Q_D(QTabWidget); - Q_ASSERT(tb); - - if (tb->parentWidget() != this) { - tb->setParent(this); - tb->show(); - } - delete d->tabs; - d->tabs = tb; - setFocusProxy(d->tabs); - connect(d->tabs, SIGNAL(currentChanged(int)), - this, SLOT(_q_showTab(int))); - connect(d->tabs, SIGNAL(tabMoved(int,int)), - this, SLOT(_q_tabMoved(int,int))); - if (d->tabs->tabsClosable()) - connect(d->tabs, SIGNAL(tabCloseRequested(int)), - this, SIGNAL(tabCloseRequested(int))); - tb->setExpanding(!documentMode()); - setUpLayout(); -} - - -/*! - Returns the current QTabBar. - - \sa setTabBar() -*/ -QTabBar* QTabWidget::tabBar() const -{ - Q_D(const QTabWidget); - return d->tabs; -} - -/*! - Ensures that the selected tab's page is visible and appropriately - sized. -*/ - -void QTabWidgetPrivate::_q_showTab(int index) -{ - Q_Q(QTabWidget); - if (index < stack->count() && index >= 0) - stack->setCurrentIndex(index); - emit q->currentChanged(index); -#ifdef QT3_SUPPORT - emit q->selected(q->tabText(index)); - emit q->currentChanged(stack->widget(index)); -#endif -} - -void QTabWidgetPrivate::_q_removeTab(int index) -{ - Q_Q(QTabWidget); - tabs->removeTab(index); - q->setUpLayout(); - q->tabRemoved(index); -} - -void QTabWidgetPrivate::_q_tabMoved(int from, int to) -{ - stack->blockSignals(true); - QWidget *w = stack->widget(from); - stack->removeWidget(w); - stack->insertWidget(to, w); - stack->blockSignals(false); -} - -/* - Set up the layout. - Get subrect from the current style, and set the geometry for the - stack widget, tab bar and corner widgets. -*/ -void QTabWidget::setUpLayout(bool onlyCheck) -{ - Q_D(QTabWidget); - if (onlyCheck && !d->dirty) - return; // nothing to do - - QStyleOptionTabWidgetFrameV2 option; - initStyleOption(&option); - - // this must be done immediately, because QWidgetItem relies on it (even if !isVisible()) - d->setLayoutItemMargins(QStyle::SE_TabWidgetLayoutItem, &option); - - if (!isVisible()) { - d->dirty = true; - return; // we'll do it later - } - - QRect tabRect = style()->subElementRect(QStyle::SE_TabWidgetTabBar, &option, this); - d->panelRect = style()->subElementRect(QStyle::SE_TabWidgetTabPane, &option, this); - QRect contentsRect = style()->subElementRect(QStyle::SE_TabWidgetTabContents, &option, this); - QRect leftCornerRect = style()->subElementRect(QStyle::SE_TabWidgetLeftCorner, &option, this); - QRect rightCornerRect = style()->subElementRect(QStyle::SE_TabWidgetRightCorner, &option, this); - - d->tabs->setGeometry(tabRect); - d->stack->setGeometry(contentsRect); - if (d->leftCornerWidget) - d->leftCornerWidget->setGeometry(leftCornerRect); - if (d->rightCornerWidget) - d->rightCornerWidget->setGeometry(rightCornerRect); - - if (!onlyCheck) - update(); - updateGeometry(); -} - -/*! - \internal -*/ -static inline QSize basicSize( - bool horizontal, const QSize &lc, const QSize &rc, const QSize &s, const QSize &t) -{ - return horizontal - ? QSize(qMax(s.width(), t.width() + rc.width() + lc.width()), - s.height() + (qMax(rc.height(), qMax(lc.height(), t.height())))) - : QSize(s.width() + (qMax(rc.width(), qMax(lc.width(), t.width()))), - qMax(s.height(), t.height() + rc.height() + lc.height())); -} - -/*! - \reimp -*/ -QSize QTabWidget::sizeHint() const -{ - Q_D(const QTabWidget); - QSize lc(0, 0), rc(0, 0); - QStyleOptionTabWidgetFrameV2 opt; - initStyleOption(&opt); - opt.state = QStyle::State_None; - - if (d->leftCornerWidget) - lc = d->leftCornerWidget->sizeHint(); - if(d->rightCornerWidget) - rc = d->rightCornerWidget->sizeHint(); - if (!d->dirty) { - QTabWidget *that = (QTabWidget*)this; - that->setUpLayout(true); - } - QSize s(d->stack->sizeHint()); - QSize t(d->tabs->sizeHint()); - if(usesScrollButtons()) - t = t.boundedTo(QSize(200,200)); - else - t = t.boundedTo(QApplication::desktop()->size()); - - QSize sz = basicSize(d->pos == North || d->pos == South, lc, rc, s, t); - - return style()->sizeFromContents(QStyle::CT_TabWidget, &opt, sz, this) - .expandedTo(QApplication::globalStrut()); -} - - -/*! - \reimp - - Returns a suitable minimum size for the tab widget. -*/ -QSize QTabWidget::minimumSizeHint() const -{ - Q_D(const QTabWidget); - QSize lc(0, 0), rc(0, 0); - - if(d->leftCornerWidget) - lc = d->leftCornerWidget->minimumSizeHint(); - if(d->rightCornerWidget) - rc = d->rightCornerWidget->minimumSizeHint(); - if (!d->dirty) { - QTabWidget *that = (QTabWidget*)this; - that->setUpLayout(true); - } - QSize s(d->stack->minimumSizeHint()); - QSize t(d->tabs->minimumSizeHint()); - - QSize sz = basicSize(d->pos == North || d->pos == South, lc, rc, s, t); - - QStyleOptionTabWidgetFrameV2 opt; - initStyleOption(&opt); - opt.palette = palette(); - opt.state = QStyle::State_None; - return style()->sizeFromContents(QStyle::CT_TabWidget, &opt, sz, this) - .expandedTo(QApplication::globalStrut()); -} - -/* - \reimp -*/ -int QTabWidget::heightForWidth(int width) const -{ - Q_D(const QTabWidget); - QStyleOptionTabWidgetFrameV2 opt; - initStyleOption(&opt); - opt.state = QStyle::State_None; - - QSize zero(0,0); - const QSize padding = style()->sizeFromContents(QStyle::CT_TabWidget, &opt, zero, this) - .expandedTo(QApplication::globalStrut()); - - QSize lc(0, 0), rc(0, 0); - if (d->leftCornerWidget) - lc = d->leftCornerWidget->sizeHint(); - if(d->rightCornerWidget) - rc = d->rightCornerWidget->sizeHint(); - if (!d->dirty) { - QTabWidget *that = (QTabWidget*)this; - that->setUpLayout(true); - } - QSize t(d->tabs->sizeHint()); - - if(usesScrollButtons()) - t = t.boundedTo(QSize(200,200)); - else - t = t.boundedTo(QApplication::desktop()->size()); - - const bool tabIsHorizontal = (d->pos == North || d->pos == South); - const int contentsWidth = width - padding.width(); - int stackWidth = contentsWidth; - if (!tabIsHorizontal) - stackWidth -= qMax(t.width(), qMax(lc.width(), rc.width())); - - int stackHeight = d->stack->heightForWidth(stackWidth); - QSize s(stackWidth, stackHeight); - - QSize contentSize = basicSize(tabIsHorizontal, lc, rc, s, t); - return (contentSize + padding).expandedTo(QApplication::globalStrut()).height(); -} - - -/*! - \reimp - */ -void QTabWidget::showEvent(QShowEvent *) -{ - setUpLayout(); -} - -void QTabWidgetPrivate::updateTabBarPosition() -{ - Q_Q(QTabWidget); - switch (pos) { - case QTabWidget::North: - tabs->setShape(shape == QTabWidget::Rounded ? QTabBar::RoundedNorth - : QTabBar::TriangularNorth); - break; - case QTabWidget::South: - tabs->setShape(shape == QTabWidget::Rounded ? QTabBar::RoundedSouth - : QTabBar::TriangularSouth); - break; - case QTabWidget::West: - tabs->setShape(shape == QTabWidget::Rounded ? QTabBar::RoundedWest - : QTabBar::TriangularWest); - break; - case QTabWidget::East: - tabs->setShape(shape == QTabWidget::Rounded ? QTabBar::RoundedEast - : QTabBar::TriangularEast); - break; - } - q->setUpLayout(); -} - -/*! - \property QTabWidget::tabPosition - \brief the position of the tabs in this tab widget - - Possible values for this property are described by the TabPosition - enum. - - By default, this property is set to \l North. - - \sa TabPosition -*/ -QTabWidget::TabPosition QTabWidget::tabPosition() const -{ - Q_D(const QTabWidget); - return d->pos; -} - -void QTabWidget::setTabPosition(TabPosition pos) -{ - Q_D(QTabWidget); - if (d->pos == pos) - return; - d->pos = pos; - d->updateTabBarPosition(); -} - -/*! - \property QTabWidget::tabsClosable - \brief whether close buttons are automatically added to each tab. - - \since 4.5 - - \sa QTabBar::tabsClosable() -*/ -bool QTabWidget::tabsClosable() const -{ - return tabBar()->tabsClosable(); -} - -void QTabWidget::setTabsClosable(bool closeable) -{ - if (tabsClosable() == closeable) - return; - - tabBar()->setTabsClosable(closeable); - if (closeable) - connect(tabBar(), SIGNAL(tabCloseRequested(int)), - this, SIGNAL(tabCloseRequested(int))); - else - disconnect(tabBar(), SIGNAL(tabCloseRequested(int)), - this, SIGNAL(tabCloseRequested(int))); - setUpLayout(); -} - -/*! - \property QTabWidget::movable - \brief This property holds whether the user can move the tabs - within the tabbar area. - - \since 4.5 - - By default, this property is false; -*/ - -bool QTabWidget::isMovable() const -{ - return tabBar()->isMovable(); -} - -void QTabWidget::setMovable(bool movable) -{ - tabBar()->setMovable(movable); -} - -/*! - \property QTabWidget::tabShape - \brief the shape of the tabs in this tab widget - - Possible values for this property are QTabWidget::Rounded - (default) or QTabWidget::Triangular. - - \sa TabShape -*/ - -QTabWidget::TabShape QTabWidget::tabShape() const -{ - Q_D(const QTabWidget); - return d->shape; -} - -void QTabWidget::setTabShape(TabShape s) -{ - Q_D(QTabWidget); - if (d->shape == s) - return; - d->shape = s; - d->updateTabBarPosition(); -} - -/*! - \reimp - */ -bool QTabWidget::event(QEvent *ev) -{ - if (ev->type() == QEvent::LayoutRequest) - setUpLayout(); - return QWidget::event(ev); -} - -/*! - \reimp - */ -void QTabWidget::changeEvent(QEvent *ev) -{ - if (ev->type() == QEvent::StyleChange -#ifdef Q_WS_MAC - || ev->type() == QEvent::MacSizeChange -#endif - ) - setUpLayout(); - QWidget::changeEvent(ev); -} - - -/*! - \reimp - */ -void QTabWidget::keyPressEvent(QKeyEvent *e) -{ - Q_D(QTabWidget); - if (((e->key() == Qt::Key_Tab || e->key() == Qt::Key_Backtab) && - count() > 1 && e->modifiers() & Qt::ControlModifier) -#ifdef QT_KEYPAD_NAVIGATION - || QApplication::keypadNavigationEnabled() && (e->key() == Qt::Key_Left || e->key() == Qt::Key_Right) && count() > 1 -#endif - ) { - int pageCount = d->tabs->count(); - int page = currentIndex(); - int dx = (e->key() == Qt::Key_Backtab || e->modifiers() & Qt::ShiftModifier) ? -1 : 1; -#ifdef QT_KEYPAD_NAVIGATION - if (QApplication::keypadNavigationEnabled() && (e->key() == Qt::Key_Left || e->key() == Qt::Key_Right)) - dx = e->key() == (isRightToLeft() ? Qt::Key_Right : Qt::Key_Left) ? -1 : 1; -#endif - for (int pass = 0; pass < pageCount; ++pass) { - page+=dx; - if (page < 0 -#ifdef QT_KEYPAD_NAVIGATION - && !e->isAutoRepeat() -#endif - ) { - page = count() - 1; - } else if (page >= pageCount -#ifdef QT_KEYPAD_NAVIGATION - && !e->isAutoRepeat() -#endif - ) { - page = 0; - } - if (d->tabs->isTabEnabled(page)) { - setCurrentIndex(page); - break; - } - } - if (!QApplication::focusWidget()) - d->tabs->setFocus(); - } else { - e->ignore(); - } -} - -/*! - Returns the tab page at index position \a index or 0 if the \a - index is out of range. -*/ -QWidget *QTabWidget::widget(int index) const -{ - Q_D(const QTabWidget); - return d->stack->widget(index); -} - -/*! - \property QTabWidget::count - \brief the number of tabs in the tab bar - - By default, this property contains a value of 0. -*/ -int QTabWidget::count() const -{ - Q_D(const QTabWidget); - return d->tabs->count(); -} - -#ifndef QT_NO_TOOLTIP -/*! - Sets the tab tool tip for the page at position \a index to \a tip. - - \sa tabToolTip() -*/ -void QTabWidget::setTabToolTip(int index, const QString & tip) -{ - Q_D(QTabWidget); - d->tabs->setTabToolTip(index, tip); -} - -/*! - Returns the tab tool tip for the page at position \a index or - an empty string if no tool tip has been set. - - \sa setTabToolTip() -*/ -QString QTabWidget::tabToolTip(int index) const -{ - Q_D(const QTabWidget); - return d->tabs->tabToolTip(index); -} -#endif // QT_NO_TOOLTIP - -#ifndef QT_NO_WHATSTHIS -/*! - \since 4.1 - - Sets the What's This help text for the page at position \a index - to \a text. -*/ -void QTabWidget::setTabWhatsThis(int index, const QString &text) -{ - Q_D(QTabWidget); - d->tabs->setTabWhatsThis(index, text); -} - -/*! - \since 4.1 - - Returns the What's This help text for the page at position \a index, - or an empty string if no help text has been set. -*/ -QString QTabWidget::tabWhatsThis(int index) const -{ - Q_D(const QTabWidget); - return d->tabs->tabWhatsThis(index); -} -#endif // QT_NO_WHATSTHIS - -/*! - This virtual handler is called after a new tab was added or - inserted at position \a index. - - \sa tabRemoved() - */ -void QTabWidget::tabInserted(int index) -{ - Q_UNUSED(index) -} - -/*! - This virtual handler is called after a tab was removed from - position \a index. - - \sa tabInserted() - */ -void QTabWidget::tabRemoved(int index) -{ - Q_UNUSED(index) -} - -/*! - \fn void QTabWidget::paintEvent(QPaintEvent *event) - - Paints the tab widget's tab bar in response to the paint \a event. -*/ -void QTabWidget::paintEvent(QPaintEvent *) -{ - Q_D(QTabWidget); - if (documentMode()) { - QStylePainter p(this, tabBar()); - if (QWidget *w = cornerWidget(Qt::TopLeftCorner)) { - QStyleOptionTabBarBaseV2 opt; - QTabBarPrivate::initStyleBaseOption(&opt, tabBar(), w->size()); - opt.rect.moveLeft(w->x() + opt.rect.x()); - opt.rect.moveTop(w->y() + opt.rect.y()); - p.drawPrimitive(QStyle::PE_FrameTabBarBase, opt); - } - if (QWidget *w = cornerWidget(Qt::TopRightCorner)) { - QStyleOptionTabBarBaseV2 opt; - QTabBarPrivate::initStyleBaseOption(&opt, tabBar(), w->size()); - opt.rect.moveLeft(w->x() + opt.rect.x()); - opt.rect.moveTop(w->y() + opt.rect.y()); - p.drawPrimitive(QStyle::PE_FrameTabBarBase, opt); - } - return; - } - QStylePainter p(this); - - QStyleOptionTabWidgetFrameV2 opt; - initStyleOption(&opt); - opt.rect = d->panelRect; - p.drawPrimitive(QStyle::PE_FrameTabWidget, opt); -} - -/*! - \property QTabWidget::iconSize - \brief The size for icons in the tab bar - \since 4.2 - - The default value is style-dependent. This is the maximum size - that the icons will have. Icons are not scaled up if they are of - smaller size. - - \sa QTabBar::iconSize -*/ -QSize QTabWidget::iconSize() const -{ - return d_func()->tabs->iconSize(); -} - -void QTabWidget::setIconSize(const QSize &size) -{ - d_func()->tabs->setIconSize(size); -} - -/*! - \property QTabWidget::elideMode - \brief how to elide text in the tab bar - \since 4.2 - - This property controls how items are elided when there is not - enough space to show them for a given tab bar size. - - By default the value is style dependant. - - \sa QTabBar::elideMode usesScrollButtons QStyle::SH_TabBar_ElideMode -*/ -Qt::TextElideMode QTabWidget::elideMode() const -{ - return d_func()->tabs->elideMode(); -} - -void QTabWidget::setElideMode(Qt::TextElideMode mode) -{ - d_func()->tabs->setElideMode(mode); -} - -/*! - \property QTabWidget::usesScrollButtons - \brief Whether or not a tab bar should use buttons to scroll tabs when it - has many tabs. - \since 4.2 - - When there are too many tabs in a tab bar for its size, the tab bar can either choose - to expand its size or to add buttons that allow you to scroll through the tabs. - - By default the value is style dependant. - - \sa elideMode QTabBar::usesScrollButtons QStyle::SH_TabBar_PreferNoArrows -*/ -bool QTabWidget::usesScrollButtons() const -{ - return d_func()->tabs->usesScrollButtons(); -} - -void QTabWidget::setUsesScrollButtons(bool useButtons) -{ - d_func()->tabs->setUsesScrollButtons(useButtons); -} - -/*! - \property QTabWidget::documentMode - \brief Whether or not the tab widget is rendered in a mode suitable for document - pages. This is the same as document mode on Mac OS X. - \since 4.5 - - When this property is set the tab widget frame is not rendered. This mode is useful - for showing document-type pages where the page covers most of the tab widget - area. - - \sa elideMode, QTabBar::documentMode, QTabBar::usesScrollButtons, QStyle::SH_TabBar_PreferNoArrows -*/ -bool QTabWidget::documentMode() const -{ - Q_D(const QTabWidget); - return d->tabs->documentMode(); -} - -void QTabWidget::setDocumentMode(bool enabled) -{ - Q_D(QTabWidget); - d->tabs->setDocumentMode(enabled); - d->tabs->setExpanding(!enabled); - d->tabs->setDrawBase(enabled); - setUpLayout(); -} - -/*! - Removes all the pages, but does not delete them. Calling this function - is equivalent to calling removeTab() until the tab widget is empty. -*/ -void QTabWidget::clear() -{ - // ### optimize by introduce QStackedLayout::clear() - while (count()) - removeTab(0); -} - -/*! - \fn void QTabWidget::insertTab(QWidget *widget, const QString &label, int index) - - Use insertTab(index, widget, label) instead. -*/ - -/*! - \fn void QTabWidget::insertTab(QWidget *widget, const QIcon& icon, const QString &label, int index) - - Use insertTab(index, widget, icon, label) instead. -*/ - -/*! - \fn void QTabWidget::changeTab(QWidget *widget, const QString - &label) - - Use setTabText() instead. - -*/ - -/*! - \fn void QTabWidget::changeTab(QWidget *widget, const QIcon& icon, const QString &label) - - Use setTabText() and setTabIcon() instead. -*/ - -/*! - \fn bool QTabWidget::isTabEnabled( QWidget *widget) const - - Use isTabEnabled(tabWidget->indexOf(widget)) instead. -*/ - -/*! - \fn void QTabWidget::setTabEnabled(QWidget *widget, bool b) - - Use setTabEnabled(tabWidget->indexOf(widget), b) instead. -*/ - -/*! - \fn QString QTabWidget::tabLabel(QWidget *widget) const - - Use tabText(tabWidget->indexOf(widget)) instead. -*/ - -/*! - \fn void QTabWidget::setTabLabel(QWidget *widget, const QString - &label) - - Use setTabText(tabWidget->indexOf(widget), label) instead. -*/ - -/*! - \fn QIcon QTabWidget::tabIconSet(QWidget * widget) const - - Use tabIcon(tabWidget->indexOf(widget)) instead. -*/ - -/*! - \fn void QTabWidget::setTabIconSet(QWidget * widget, const QIcon & icon) - - Use setTabIcon(tabWidget->indexOf(widget), icon) instead. -*/ - -/*! - \fn void QTabWidget::removeTabToolTip(QWidget * widget) - - Use setTabToolTip(tabWidget->indexOf(widget), QString()) instead. -*/ - -/*! - \fn void QTabWidget::setTabToolTip(QWidget * widget, const QString & tip) - - Use setTabToolTip(tabWidget->indexOf(widget), tip) instead. -*/ - -/*! - \fn QString QTabWidget::tabToolTip(QWidget * widget) const - - Use tabToolTip(tabWidget->indexOf(widget)) instead. -*/ - -/*! - \fn QWidget * QTabWidget::currentPage() const - - Use currentWidget() instead. -*/ - -/*! - \fn QWidget *QTabWidget::page(int index) const - - Use widget() instead. -*/ - -/*! - \fn QString QTabWidget::label(int index) const - - Use tabText() instead. -*/ - -/*! - \fn int QTabWidget::currentPageIndex() const - - Use currentIndex() instead. -*/ - -/*! - \fn int QTabWidget::margin() const - - This function is kept only to make old code compile. - This functionality is no longer supported by QTabWidget. - - \sa contentsRect(), setContentsMargins() -*/ - -/*! - \fn void QTabWidget::setMargin(int margin) - - This function is kept only to make old code compile. - This functionality is no longer supported by QTabWidget. - - \sa contentsRect(), setContentsMargins() -*/ - -/*! - \fn void QTabWidget::setCurrentPage(int index) - - Use setCurrentIndex() instead. -*/ - -/*! - \fn void QTabWidget::showPage(QWidget *widget) - - Use setCurrentIndex(indexOf(widget)) instead. -*/ - -/*! - \fn void QTabWidget::removePage(QWidget *widget) - - Use removeTab(indexOf(widget)) instead. -*/ - -/*! - \fn void QTabWidget::currentChanged(QWidget *widget) - - Use currentChanged(int) instead. -*/ - -QT_END_NAMESPACE - -#include "moc_qtabwidget.cpp" - -#endif //QT_NO_TABWIDGET |