diff options
Diffstat (limited to 'src/gui/widgets/qtoolbox.cpp')
-rw-r--r-- | src/gui/widgets/qtoolbox.cpp | 822 |
1 files changed, 0 insertions, 822 deletions
diff --git a/src/gui/widgets/qtoolbox.cpp b/src/gui/widgets/qtoolbox.cpp deleted file mode 100644 index 711bf8c89c..0000000000 --- a/src/gui/widgets/qtoolbox.cpp +++ /dev/null @@ -1,822 +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 "qtoolbox.h" - -#ifndef QT_NO_TOOLBOX - -#include <qapplication.h> -#include <qeventloop.h> -#include <qlayout.h> -#include <qlist.h> -#include <qpainter.h> -#include <qscrollarea.h> -#include <qstyle.h> -#include <qstyleoption.h> -#include <qtooltip.h> -#include <qabstractbutton.h> - -#include "qframe_p.h" - -QT_BEGIN_NAMESPACE - -class QToolBoxButton : public QAbstractButton -{ - Q_OBJECT -public: - QToolBoxButton(QWidget *parent) - : QAbstractButton(parent), selected(false), indexInPage(-1) - { - setBackgroundRole(QPalette::Window); - setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum); - setFocusPolicy(Qt::NoFocus); - } - - inline void setSelected(bool b) { selected = b; update(); } - inline void setIndex(int newIndex) { indexInPage = newIndex; } - - QSize sizeHint() const; - QSize minimumSizeHint() const; - -protected: - void initStyleOption(QStyleOptionToolBox *opt) const; - void paintEvent(QPaintEvent *); - -private: - bool selected; - int indexInPage; -}; - - -class QToolBoxPrivate : public QFramePrivate -{ - Q_DECLARE_PUBLIC(QToolBox) -public: - struct Page - { - QToolBoxButton *button; - QScrollArea *sv; - QWidget *widget; - - inline void setText(const QString &text) { button->setText(text); } - inline void setIcon(const QIcon &is) { button->setIcon(is); } -#ifndef QT_NO_TOOLTIP - inline void setToolTip(const QString &tip) { button->setToolTip(tip); } - inline QString toolTip() const { return button->toolTip(); } -#endif - inline QString text() const { return button->text(); } - inline QIcon icon() const { return button->icon(); } - - inline bool operator==(const Page& other) const - { - return widget == other.widget; - } - }; - typedef QList<Page> PageList; - - inline QToolBoxPrivate() - : currentPage(0) - { - } - void _q_buttonClicked(); - void _q_widgetDestroyed(QObject*); - - Page *page(QWidget *widget) const; - const Page *page(int index) const; - Page *page(int index); - - void updateTabs(); - void relayout(); - - PageList pageList; - QVBoxLayout *layout; - Page *currentPage; -}; - -QToolBoxPrivate::Page *QToolBoxPrivate::page(QWidget *widget) const -{ - if (!widget) - return 0; - - for (PageList::ConstIterator i = pageList.constBegin(); i != pageList.constEnd(); ++i) - if ((*i).widget == widget) - return (Page*) &(*i); - return 0; -} - -QToolBoxPrivate::Page *QToolBoxPrivate::page(int index) -{ - if (index >= 0 && index < pageList.size()) - return &pageList[index]; - return 0; -} - -const QToolBoxPrivate::Page *QToolBoxPrivate::page(int index) const -{ - if (index >= 0 && index < pageList.size()) - return &pageList.at(index); - return 0; -} - -void QToolBoxPrivate::updateTabs() -{ - QToolBoxButton *lastButton = currentPage ? currentPage->button : 0; - bool after = false; - int index = 0; - for (index = 0; index < pageList.count(); ++index) { - const Page &page = pageList.at(index); - QToolBoxButton *tB = page.button; - // update indexes, since the updates are delayed, the indexes will be correct - // when we actually paint. - tB->setIndex(index); - QWidget *tW = page.widget; - if (after) { - QPalette p = tB->palette(); - p.setColor(tB->backgroundRole(), tW->palette().color(tW->backgroundRole())); - tB->setPalette(p); - tB->update(); - } else if (tB->backgroundRole() != QPalette::Window) { - tB->setBackgroundRole(QPalette::Window); - tB->update(); - } - after = tB == lastButton; - } -} - -QSize QToolBoxButton::sizeHint() const -{ - QSize iconSize(8, 8); - if (!icon().isNull()) { - int icone = style()->pixelMetric(QStyle::PM_SmallIconSize, 0, parentWidget() /* QToolBox */); - iconSize += QSize(icone + 2, icone); - } - QSize textSize = fontMetrics().size(Qt::TextShowMnemonic, text()) + QSize(0, 8); - - QSize total(iconSize.width() + textSize.width(), qMax(iconSize.height(), textSize.height())); - return total.expandedTo(QApplication::globalStrut()); -} - -QSize QToolBoxButton::minimumSizeHint() const -{ - if (icon().isNull()) - return QSize(); - int icone = style()->pixelMetric(QStyle::PM_SmallIconSize, 0, parentWidget() /* QToolBox */); - return QSize(icone + 8, icone + 8); -} - -void QToolBoxButton::initStyleOption(QStyleOptionToolBox *option) const -{ - if (!option) - return; - option->initFrom(this); - if (selected) - option->state |= QStyle::State_Selected; - if (isDown()) - option->state |= QStyle::State_Sunken; - option->text = text(); - option->icon = icon(); - - if (QStyleOptionToolBoxV2 *optionV2 = qstyleoption_cast<QStyleOptionToolBoxV2 *>(option)) { - QToolBox *toolBox = static_cast<QToolBox *>(parentWidget()); // I know I'm in a tool box. - int widgetCount = toolBox->count(); - int currIndex = toolBox->currentIndex(); - if (widgetCount == 1) { - optionV2->position = QStyleOptionToolBoxV2::OnlyOneTab; - } else if (indexInPage == 0) { - optionV2->position = QStyleOptionToolBoxV2::Beginning; - } else if (indexInPage == widgetCount - 1) { - optionV2->position = QStyleOptionToolBoxV2::End; - } else { - optionV2->position = QStyleOptionToolBoxV2::Middle; - } - if (currIndex == indexInPage - 1) { - optionV2->selectedPosition = QStyleOptionToolBoxV2::PreviousIsSelected; - } else if (currIndex == indexInPage + 1) { - optionV2->selectedPosition = QStyleOptionToolBoxV2::NextIsSelected; - } else { - optionV2->selectedPosition = QStyleOptionToolBoxV2::NotAdjacent; - } - } -} - -void QToolBoxButton::paintEvent(QPaintEvent *) -{ - QPainter paint(this); - QString text = QAbstractButton::text(); - QPainter *p = &paint; - QStyleOptionToolBoxV2 opt; - initStyleOption(&opt); - style()->drawControl(QStyle::CE_ToolBoxTab, &opt, p, parentWidget()); -} - -/*! - \class QToolBox - - \brief The QToolBox class provides a column of tabbed widget items. - - - \ingroup basicwidgets - - A toolbox is a widget that displays a column of tabs one above the - other, with the current item displayed below the current tab. - Every tab has an index position within the column of tabs. A tab's - item is a QWidget. - - Each item has an itemText(), an optional itemIcon(), an optional - itemToolTip(), and a widget(). The item's attributes can be - changed with setItemText(), setItemIcon(), and - setItemToolTip(). Each item can be enabled or disabled - individually with setItemEnabled(). - - Items are added using addItem(), or inserted at particular - positions using insertItem(). The total number of items is given - by count(). Items can be deleted with delete, or removed from the - toolbox with removeItem(). Combining removeItem() and insertItem() - allows you to move items to different positions. - - The index of the current item widget is returned by currentIndex(), - and set with setCurrentIndex(). The index of a particular item can - be found using indexOf(), and the item at a given index is returned - by item(). - - The currentChanged() signal is emitted when the current item is - changed. - - \sa QTabWidget -*/ - -/*! - \fn void QToolBox::currentChanged(int index) - - This signal is emitted when the current item is changed. The new - current item's index is passed in \a index, or -1 if there is no - current item. -*/ - -#ifdef QT3_SUPPORT -/*! - Constructs a toolbox called \a name with parent \a parent and flags \a f. -*/ -QToolBox::QToolBox(QWidget *parent, const char *name, Qt::WindowFlags f) - : QFrame(*new QToolBoxPrivate, parent, f) -{ - Q_D(QToolBox); - setObjectName(QString::fromAscii(name)); - d->layout = new QVBoxLayout(this); - d->layout->setMargin(0); - setBackgroundRole(QPalette::Button); -} -#endif - -/*! - Constructs a new toolbox with the given \a parent and the flags, \a f. -*/ -QToolBox::QToolBox(QWidget *parent, Qt::WindowFlags f) - : QFrame(*new QToolBoxPrivate, parent, f) -{ - Q_D(QToolBox); - d->layout = new QVBoxLayout(this); - d->layout->setMargin(0); - setBackgroundRole(QPalette::Button); -} - -/*! - Destroys the toolbox. -*/ - -QToolBox::~QToolBox() -{ -} - -/*! - \fn int QToolBox::addItem(QWidget *w, const QString &text) - \overload - - Adds the widget \a w in a new tab at bottom of the toolbox. The - new tab's text is set to \a text. Returns the new tab's index. -*/ - -/*! - \fn int QToolBox::addItem(QWidget *widget, const QIcon &iconSet,const QString &text) - Adds the \a widget in a new tab at bottom of the toolbox. The - new tab's text is set to \a text, and the \a iconSet is - displayed to the left of the \a text. Returns the new tab's index. -*/ - -/*! - \fn int QToolBox::insertItem(int index, QWidget *widget, const QString &text) - \overload - - Inserts the \a widget at position \a index, or at the bottom - of the toolbox if \a index is out of range. The new item's text is - set to \a text. Returns the new item's index. -*/ - -/*! - Inserts the \a widget at position \a index, or at the bottom - of the toolbox if \a index is out of range. The new item's text - is set to \a text, and the \a icon is displayed to the left of - the \a text. Returns the new item's index. -*/ - -int QToolBox::insertItem(int index, QWidget *widget, const QIcon &icon, const QString &text) -{ - if (!widget) - return -1; - - Q_D(QToolBox); - connect(widget, SIGNAL(destroyed(QObject*)), this, SLOT(_q_widgetDestroyed(QObject*))); - - QToolBoxPrivate::Page c; - c.widget = widget; - c.button = new QToolBoxButton(this); - c.button->setObjectName(QLatin1String("qt_toolbox_toolboxbutton")); - connect(c.button, SIGNAL(clicked()), this, SLOT(_q_buttonClicked())); - - c.sv = new QScrollArea(this); - c.sv->setWidget(widget); - c.sv->setWidgetResizable(true); - c.sv->hide(); - c.sv->setFrameStyle(QFrame::NoFrame); - - c.setText(text); - c.setIcon(icon); - - if (index < 0 || index >= (int)d->pageList.count()) { - index = d->pageList.count(); - d->pageList.append(c); - d->layout->addWidget(c.button); - d->layout->addWidget(c.sv); - if (index == 0) - setCurrentIndex(index); - } else { - d->pageList.insert(index, c); - d->relayout(); - if (d->currentPage) { - QWidget *current = d->currentPage->widget; - int oldindex = indexOf(current); - if (index <= oldindex) { - d->currentPage = 0; // trigger change - setCurrentIndex(oldindex); - } - } - } - - c.button->show(); - - d->updateTabs(); - itemInserted(index); - return index; -} - -void QToolBoxPrivate::_q_buttonClicked() -{ - Q_Q(QToolBox); - QToolBoxButton *tb = qobject_cast<QToolBoxButton*>(q->sender()); - QWidget* item = 0; - for (QToolBoxPrivate::PageList::ConstIterator i = pageList.constBegin(); i != pageList.constEnd(); ++i) - if ((*i).button == tb) { - item = (*i).widget; - break; - } - - q->setCurrentIndex(q->indexOf(item)); -} - -/*! - \property QToolBox::count - \brief The number of items contained in the toolbox. - - By default, this property has a value of 0. -*/ - -int QToolBox::count() const -{ - Q_D(const QToolBox); - return d->pageList.count(); -} - -void QToolBox::setCurrentIndex(int index) -{ - Q_D(QToolBox); - QToolBoxPrivate::Page *c = d->page(index); - if (!c || d->currentPage == c) - return; - - c->button->setSelected(true); - if (d->currentPage) { - d->currentPage->sv->hide(); - d->currentPage->button->setSelected(false); - } - d->currentPage = c; - d->currentPage->sv->show(); - d->updateTabs(); - emit currentChanged(index); -} - -void QToolBoxPrivate::relayout() -{ - Q_Q(QToolBox); - delete layout; - layout = new QVBoxLayout(q); - layout->setMargin(0); - for (QToolBoxPrivate::PageList::ConstIterator i = pageList.constBegin(); i != pageList.constEnd(); ++i) { - layout->addWidget((*i).button); - layout->addWidget((*i).sv); - } -} - -void QToolBoxPrivate::_q_widgetDestroyed(QObject *object) -{ - Q_Q(QToolBox); - // no verification - vtbl corrupted already - QWidget *p = (QWidget*)object; - - QToolBoxPrivate::Page *c = page(p); - if (!p || !c) - return; - - layout->removeWidget(c->sv); - layout->removeWidget(c->button); - c->sv->deleteLater(); // page might still be a child of sv - delete c->button; - - bool removeCurrent = c == currentPage; - pageList.removeAll(*c); - - if (!pageList.count()) { - currentPage = 0; - emit q->currentChanged(-1); - } else if (removeCurrent) { - currentPage = 0; - q->setCurrentIndex(0); - } -} - -/*! - Removes the item at position \a index from the toolbox. Note that - the widget is \e not deleted. -*/ - -void QToolBox::removeItem(int index) -{ - Q_D(QToolBox); - if (QWidget *w = widget(index)) { - disconnect(w, SIGNAL(destroyed(QObject*)), this, SLOT(_q_widgetDestroyed(QObject*))); - w->setParent(this); - // destroy internal data - d->_q_widgetDestroyed(w); - itemRemoved(index); - } -} - - -/*! - \property QToolBox::currentIndex - \brief the index of the current item - - By default, for an empty toolbox, this property has a value of -1. - - \sa indexOf(), widget() -*/ - - -int QToolBox::currentIndex() const -{ - Q_D(const QToolBox); - return d->currentPage ? indexOf(d->currentPage->widget) : -1; -} - -/*! - Returns a pointer to the current widget, or 0 if there is no such item. - - \sa currentIndex(), setCurrentWidget() -*/ - -QWidget * QToolBox::currentWidget() const -{ - Q_D(const QToolBox); - return d->currentPage ? d->currentPage->widget : 0; -} - -/*! - Makes\a widget the current widget. The \a widget must be an item in this tool box. - - \sa addItem(), setCurrentIndex(), currentWidget() - */ -void QToolBox::setCurrentWidget(QWidget *widget) -{ - int i = indexOf(widget); - if (i >= 0) - setCurrentIndex(i); - else - qWarning("QToolBox::setCurrentWidget: widget not contained in tool box"); -} - -/*! - Returns the widget at position \a index, or 0 if there is no such - item. -*/ - -QWidget *QToolBox::widget(int index) const -{ - Q_D(const QToolBox); - if (index < 0 || index >= (int) d->pageList.size()) - return 0; - return d->pageList.at(index).widget; -} - -/*! - Returns the index of \a widget, or -1 if the item does not - exist. -*/ - -int QToolBox::indexOf(QWidget *widget) const -{ - Q_D(const QToolBox); - QToolBoxPrivate::Page *c = (widget ? d->page(widget) : 0); - return c ? d->pageList.indexOf(*c) : -1; -} - -/*! - If \a enabled is true then the item at position \a index is enabled; otherwise - the item at position \a index is disabled. -*/ - -void QToolBox::setItemEnabled(int index, bool enabled) -{ - Q_D(QToolBox); - QToolBoxPrivate::Page *c = d->page(index); - if (!c) - return; - - c->button->setEnabled(enabled); - if (!enabled && c == d->currentPage) { - int curIndexUp = index; - int curIndexDown = curIndexUp; - const int count = d->pageList.count(); - while (curIndexUp > 0 || curIndexDown < count-1) { - if (curIndexDown < count-1) { - if (d->page(++curIndexDown)->button->isEnabled()) { - index = curIndexDown; - break; - } - } - if (curIndexUp > 0) { - if (d->page(--curIndexUp)->button->isEnabled()) { - index = curIndexUp; - break; - } - } - } - setCurrentIndex(index); - } -} - - -/*! - Sets the text of the item at position \a index to \a text. - - If the provided text contains an ampersand character ('&'), a - mnemonic is automatically created for it. The character that - follows the '&' will be used as the shortcut key. Any previous - mnemonic will be overwritten, or cleared if no mnemonic is defined - by the text. See the \l {QShortcut#mnemonic}{QShortcut} - documentation for details (to display an actual ampersand, use - '&&'). -*/ - -void QToolBox::setItemText(int index, const QString &text) -{ - Q_D(QToolBox); - QToolBoxPrivate::Page *c = d->page(index); - if (c) - c->setText(text); -} - -/*! - Sets the icon of the item at position \a index to \a icon. -*/ - -void QToolBox::setItemIcon(int index, const QIcon &icon) -{ - Q_D(QToolBox); - QToolBoxPrivate::Page *c = d->page(index); - if (c) - c->setIcon(icon); -} - -#ifndef QT_NO_TOOLTIP -/*! - Sets the tooltip of the item at position \a index to \a toolTip. -*/ - -void QToolBox::setItemToolTip(int index, const QString &toolTip) -{ - Q_D(QToolBox); - QToolBoxPrivate::Page *c = d->page(index); - if (c) - c->setToolTip(toolTip); -} -#endif // QT_NO_TOOLTIP - -/*! - Returns true if the item at position \a index is enabled; otherwise returns false. -*/ - -bool QToolBox::isItemEnabled(int index) const -{ - Q_D(const QToolBox); - const QToolBoxPrivate::Page *c = d->page(index); - return c && c->button->isEnabled(); -} - -/*! - Returns the text of the item at position \a index, or an empty string if - \a index is out of range. -*/ - -QString QToolBox::itemText(int index) const -{ - Q_D(const QToolBox); - const QToolBoxPrivate::Page *c = d->page(index); - return (c ? c->text() : QString()); -} - -/*! - Returns the icon of the item at position \a index, or a null - icon if \a index is out of range. -*/ - -QIcon QToolBox::itemIcon(int index) const -{ - Q_D(const QToolBox); - const QToolBoxPrivate::Page *c = d->page(index); - return (c ? c->icon() : QIcon()); -} - -#ifndef QT_NO_TOOLTIP -/*! - Returns the tooltip of the item at position \a index, or an - empty string if \a index is out of range. -*/ - -QString QToolBox::itemToolTip(int index) const -{ - Q_D(const QToolBox); - const QToolBoxPrivate::Page *c = d->page(index); - return (c ? c->toolTip() : QString()); -} -#endif // QT_NO_TOOLTIP - -/*! \reimp */ -void QToolBox::showEvent(QShowEvent *e) -{ - QWidget::showEvent(e); -} - -/*! \reimp */ -void QToolBox::changeEvent(QEvent *ev) -{ - Q_D(QToolBox); - if(ev->type() == QEvent::StyleChange) - d->updateTabs(); - QFrame::changeEvent(ev); -} - -/*! - This virtual handler is called after a new item was added or - inserted at position \a index. - - \sa itemRemoved() - */ -void QToolBox::itemInserted(int index) -{ - Q_UNUSED(index) -} - -/*! - This virtual handler is called after an item was removed from - position \a index. - - \sa itemInserted() - */ -void QToolBox::itemRemoved(int index) -{ - Q_UNUSED(index) -} - -/*! - \fn void QToolBox::setItemLabel(int index, const QString &text) - - Use setItemText() instead. -*/ - -/*! - \fn QString QToolBox::itemLabel(int index) const - - Use itemText() instead. -*/ - -/*! - \fn QWidget *QToolBox::currentItem() const - - Use widget(currentIndex()) instead. -*/ - -/*! - \fn void QToolBox::setCurrentItem(QWidget *widget) - - Use setCurrentIndex(indexOf(widget)) instead. -*/ - -/*! - \fn void QToolBox::setItemIconSet(int index, const QIcon &icon) - - Use setItemIcon() instead. -*/ - -/*! - \fn QIcon QToolBox::itemIconSet(int index) const - - Use itemIcon() instead. -*/ - -/*! - \fn int QToolBox::removeItem(QWidget *widget) - - Use toolbox->removeItem(toolbox->indexOf(widget)) instead. -*/ - -/*! - \fn QWidget *QToolBox::item(int index) const - - Use widget() instead. -*/ - -/*! - \fn void QToolBox::setMargin(int margin) - Sets the width of the margin around the contents of the widget to \a margin. - - Use QWidget::setContentsMargins() instead. - \sa margin(), QWidget::setContentsMargins() -*/ - -/*! - \fn int QToolBox::margin() const - Returns the width of the margin around the contents of the widget. - - Use QWidget::getContentsMargins() instead. - \sa setMargin(), QWidget::getContentsMargins() -*/ - -/*! \reimp */ -bool QToolBox::event(QEvent *e) -{ - return QFrame::event(e); -} - -QT_END_NAMESPACE - -#include "moc_qtoolbox.cpp" -#include "qtoolbox.moc" - -#endif //QT_NO_TOOLBOX |