diff options
Diffstat (limited to 'src/widgets/widgets/qtoolbox.cpp')
-rw-r--r-- | src/widgets/widgets/qtoolbox.cpp | 182 |
1 files changed, 82 insertions, 100 deletions
diff --git a/src/widgets/widgets/qtoolbox.cpp b/src/widgets/widgets/qtoolbox.cpp index 46ade0277c..e0fac9be0f 100644 --- a/src/widgets/widgets/qtoolbox.cpp +++ b/src/widgets/widgets/qtoolbox.cpp @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWidgets module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "qtoolbox.h" @@ -47,13 +11,17 @@ #include <qscrollarea.h> #include <qstyle.h> #include <qstyleoption.h> +#if QT_CONFIG(tooltip) #include <qtooltip.h> +#endif #include <qabstractbutton.h> #include "qframe_p.h" QT_BEGIN_NAMESPACE +using namespace Qt::StringLiterals; + class QToolBoxButton : public QAbstractButton { Q_OBJECT @@ -94,7 +62,7 @@ public: inline void setText(const QString &text) { button->setText(text); } inline void setIcon(const QIcon &is) { button->setIcon(is); } -#ifndef QT_NO_TOOLTIP +#if QT_CONFIG(tooltip) inline void setToolTip(const QString &tip) { button->setToolTip(tip); } inline QString toolTip() const { return button->toolTip(); } #endif @@ -106,10 +74,10 @@ public: return widget == other.widget; } }; - typedef QList<Page> PageList; + typedef std::vector<std::unique_ptr<Page>> PageList; inline QToolBoxPrivate() - : currentPage(0) + : currentPage(nullptr) { } void _q_buttonClicked(); @@ -130,40 +98,40 @@ public: const QToolBoxPrivate::Page *QToolBoxPrivate::page(const QObject *widget) const { if (!widget) - return 0; + return nullptr; - for (PageList::ConstIterator i = pageList.constBegin(); i != pageList.constEnd(); ++i) - if ((*i).widget == widget) - return (const Page*) &(*i); - return 0; + for (const auto &page : pageList) { + if (page->widget == widget) + return page.get(); + } + return nullptr; } QToolBoxPrivate::Page *QToolBoxPrivate::page(int index) { - if (index >= 0 && index < pageList.size()) - return &pageList[index]; - return 0; + if (index >= 0 && index < static_cast<int>(pageList.size())) + return pageList[index].get(); + return nullptr; } const QToolBoxPrivate::Page *QToolBoxPrivate::page(int index) const { - if (index >= 0 && index < pageList.size()) - return &pageList.at(index); - return 0; + if (index >= 0 && index < static_cast<int>(pageList.size())) + return pageList[index].get(); + return nullptr; } void QToolBoxPrivate::updateTabs() { - QToolBoxButton *lastButton = currentPage ? currentPage->button : 0; + QToolBoxButton *lastButton = currentPage ? currentPage->button : nullptr; bool after = false; int index = 0; - for (index = 0; index < pageList.count(); ++index) { - const Page &page = pageList.at(index); - QToolBoxButton *tB = page.button; + for (const auto &page : pageList) { + 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; + QWidget *tW = page->widget; if (after) { QPalette p = tB->palette(); p.setColor(tB->backgroundRole(), tW->palette().color(tW->backgroundRole())); @@ -174,6 +142,7 @@ void QToolBoxPrivate::updateTabs() tB->update(); } after = tB == lastButton; + ++index; } } @@ -181,20 +150,19 @@ QSize QToolBoxButton::sizeHint() const { QSize iconSize(8, 8); if (!icon().isNull()) { - int icone = style()->pixelMetric(QStyle::PM_SmallIconSize, 0, parentWidget() /* QToolBox */); + int icone = style()->pixelMetric(QStyle::PM_SmallIconSize, nullptr, 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()); + return QSize(iconSize.width() + textSize.width(), qMax(iconSize.height(), textSize.height())); } QSize QToolBoxButton::minimumSizeHint() const { if (icon().isNull()) return QSize(); - int icone = style()->pixelMetric(QStyle::PM_SmallIconSize, 0, parentWidget() /* QToolBox */); + int icone = style()->pixelMetric(QStyle::PM_SmallIconSize, nullptr, parentWidget() /* QToolBox */); return QSize(icone + 8, icone + 8); } @@ -294,7 +262,7 @@ QToolBox::QToolBox(QWidget *parent, Qt::WindowFlags f) { Q_D(QToolBox); d->layout = new QVBoxLayout(this); - d->layout->setMargin(0); + d->layout->setContentsMargins(QMargins()); setBackgroundRole(QPalette::Button); } @@ -345,10 +313,11 @@ int QToolBox::insertItem(int index, QWidget *widget, const QIcon &icon, const QS Q_D(QToolBox); connect(widget, SIGNAL(destroyed(QObject*)), this, SLOT(_q_widgetDestroyed(QObject*))); - QToolBoxPrivate::Page c; + auto newPage = std::make_unique<QToolBoxPrivate::Page>(); + auto &c = *newPage; c.widget = widget; c.button = new QToolBoxButton(this); - c.button->setObjectName(QLatin1String("qt_toolbox_toolboxbutton")); + c.button->setObjectName("qt_toolbox_toolboxbutton"_L1); connect(c.button, SIGNAL(clicked()), this, SLOT(_q_buttonClicked())); c.sv = new QScrollArea(this); @@ -360,21 +329,21 @@ int QToolBox::insertItem(int index, QWidget *widget, const QIcon &icon, const QS c.setText(text); c.setIcon(icon); - if (index < 0 || index >= (int)d->pageList.count()) { - index = d->pageList.count(); - d->pageList.append(c); + if (index < 0 || index >= static_cast<int>(d->pageList.size())) { + index = static_cast<int>(d->pageList.size()); + d->pageList.push_back(std::move(newPage)); d->layout->addWidget(c.button); d->layout->addWidget(c.sv); if (index == 0) setCurrentIndex(index); } else { - d->pageList.insert(index, c); + d->pageList.insert(d->pageList.cbegin() + index, std::move(newPage)); d->relayout(); if (d->currentPage) { QWidget *current = d->currentPage->widget; int oldindex = indexOf(current); if (index <= oldindex) { - d->currentPage = 0; // trigger change + d->currentPage = nullptr; // trigger change setCurrentIndex(oldindex); } } @@ -391,12 +360,13 @@ 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; + QWidget* item = nullptr; + for (const auto &page : pageList) { + if (page->button == tb) { + item = page->widget; break; } + } q->setCurrentIndex(q->indexOf(item)); } @@ -411,7 +381,7 @@ void QToolBoxPrivate::_q_buttonClicked() int QToolBox::count() const { Q_D(const QToolBox); - return d->pageList.count(); + return static_cast<int>(d->pageList.size()); } void QToolBox::setCurrentIndex(int index) @@ -437,13 +407,19 @@ 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); + layout->setContentsMargins(QMargins()); + for (const auto &page : pageList) { + layout->addWidget(page->button); + layout->addWidget(page->sv); } } +auto pageEquals = [](const QToolBoxPrivate::Page *page) { + return [page](const std::unique_ptr<QToolBoxPrivate::Page> &ptr) { + return ptr.get() == page; + }; +}; + void QToolBoxPrivate::_q_widgetDestroyed(QObject *object) { Q_Q(QToolBox); @@ -458,13 +434,13 @@ void QToolBoxPrivate::_q_widgetDestroyed(QObject *object) delete c->button; bool removeCurrent = c == currentPage; - pageList.removeAll(*c); + pageList.erase(std::remove_if(pageList.begin(), pageList.end(), pageEquals(c)), pageList.end()); - if (!pageList.count()) { - currentPage = 0; + if (pageList.empty()) { + currentPage = nullptr; emit q->currentChanged(-1); } else if (removeCurrent) { - currentPage = 0; + currentPage = nullptr; q->setCurrentIndex(0); } } @@ -504,7 +480,8 @@ int QToolBox::currentIndex() const } /*! - Returns a pointer to the current widget, or 0 if there is no such item. + Returns a pointer to the current widget, or \nullptr if there is + no such item. \sa currentIndex(), setCurrentWidget() */ @@ -512,7 +489,7 @@ int QToolBox::currentIndex() const QWidget * QToolBox::currentWidget() const { Q_D(const QToolBox); - return d->currentPage ? d->currentPage->widget : 0; + return d->currentPage ? d->currentPage->widget : nullptr; } /*! @@ -530,16 +507,16 @@ void QToolBox::setCurrentWidget(QWidget *widget) } /*! - Returns the widget at position \a index, or 0 if there is no such - item. + Returns the widget at position \a index, or \nullptr 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; + if (index < 0 || index >= static_cast<int>(d->pageList.size())) + return nullptr; + return d->pageList[index]->widget; } /*! @@ -547,11 +524,16 @@ QWidget *QToolBox::widget(int index) const exist. */ -int QToolBox::indexOf(QWidget *widget) const +int QToolBox::indexOf(const QWidget *widget) const { Q_D(const QToolBox); - const QToolBoxPrivate::Page *c = (widget ? d->page(widget) : 0); - return c ? d->pageList.indexOf(*c) : -1; + const QToolBoxPrivate::Page *c = (widget ? d->page(widget) : nullptr); + if (!c) + return -1; + const auto it = std::find_if(d->pageList.cbegin(), d->pageList.cend(), pageEquals(c)); + if (it == d->pageList.cend()) + return -1; + return static_cast<int>(it - d->pageList.cbegin()); } /*! @@ -570,7 +552,7 @@ void QToolBox::setItemEnabled(int index, bool enabled) if (!enabled && c == d->currentPage) { int curIndexUp = index; int curIndexDown = curIndexUp; - const int count = d->pageList.count(); + const int count = static_cast<int>(d->pageList.size()); while (curIndexUp > 0 || curIndexDown < count-1) { if (curIndexDown < count-1) { if (d->page(++curIndexDown)->button->isEnabled()) { @@ -622,7 +604,7 @@ void QToolBox::setItemIcon(int index, const QIcon &icon) c->setIcon(icon); } -#ifndef QT_NO_TOOLTIP +#if QT_CONFIG(tooltip) /*! Sets the tooltip of the item at position \a index to \a toolTip. */ @@ -634,7 +616,7 @@ void QToolBox::setItemToolTip(int index, const QString &toolTip) if (c) c->setToolTip(toolTip); } -#endif // QT_NO_TOOLTIP +#endif // QT_CONFIG(tooltip) /*! Returns \c true if the item at position \a index is enabled; otherwise returns \c false. @@ -671,7 +653,7 @@ QIcon QToolBox::itemIcon(int index) const return (c ? c->icon() : QIcon()); } -#ifndef QT_NO_TOOLTIP +#if QT_CONFIG(tooltip) /*! Returns the tooltip of the item at position \a index, or an empty string if \a index is out of range. @@ -683,7 +665,7 @@ QString QToolBox::itemToolTip(int index) const const QToolBoxPrivate::Page *c = d->page(index); return (c ? c->toolTip() : QString()); } -#endif // QT_NO_TOOLTIP +#endif // QT_CONFIG(tooltip) /*! \reimp */ void QToolBox::showEvent(QShowEvent *e) @@ -695,7 +677,7 @@ void QToolBox::showEvent(QShowEvent *e) void QToolBox::changeEvent(QEvent *ev) { Q_D(QToolBox); - if(ev->type() == QEvent::StyleChange) + if (ev->type() == QEvent::StyleChange) d->updateTabs(); QFrame::changeEvent(ev); } @@ -708,7 +690,7 @@ void QToolBox::changeEvent(QEvent *ev) */ void QToolBox::itemInserted(int index) { - Q_UNUSED(index) + Q_UNUSED(index); } /*! @@ -719,7 +701,7 @@ void QToolBox::itemInserted(int index) */ void QToolBox::itemRemoved(int index) { - Q_UNUSED(index) + Q_UNUSED(index); } /*! \reimp */ |