diff options
Diffstat (limited to 'src/widgets/widgets')
43 files changed, 476 insertions, 330 deletions
diff --git a/src/widgets/widgets/qabstractscrollarea.cpp b/src/widgets/widgets/qabstractscrollarea.cpp index 65d06eafc5..946d683bf0 100644 --- a/src/widgets/widgets/qabstractscrollarea.cpp +++ b/src/widgets/widgets/qabstractscrollarea.cpp @@ -469,7 +469,7 @@ void QAbstractScrollAreaPrivate::layoutChildren() if ((vscrollOverlap > 0 && needv) || (hscrollOverlap > 0 && needh)) { const QList<QHeaderView *> headers = q->findChildren<QHeaderView*>(); if (headers.count() <= 2) { - Q_FOREACH (const QHeaderView *header, headers) { + for (const QHeaderView *header : headers) { const QRect geo = header->geometry(); if (header->orientation() == Qt::Vertical && header->isVisible() && QStyle::visualRect(opt.direction, opt.rect, geo).left() <= opt.rect.width() / 2) vHeaderRight = QStyle::visualRect(opt.direction, opt.rect, geo).right(); @@ -705,7 +705,7 @@ QScrollBar *QAbstractScrollArea::verticalScrollBar() const void QAbstractScrollArea::setVerticalScrollBar(QScrollBar *scrollBar) { Q_D(QAbstractScrollArea); - if (!scrollBar) { + if (Q_UNLIKELY(!scrollBar)) { qWarning("QAbstractScrollArea::setVerticalScrollBar: Cannot set a null scroll bar"); return; } @@ -766,7 +766,7 @@ QScrollBar *QAbstractScrollArea::horizontalScrollBar() const void QAbstractScrollArea::setHorizontalScrollBar(QScrollBar *scrollBar) { Q_D(QAbstractScrollArea); - if (!scrollBar) { + if (Q_UNLIKELY(!scrollBar)) { qWarning("QAbstractScrollArea::setHorizontalScrollBar: Cannot set a null scroll bar"); return; } diff --git a/src/widgets/widgets/qabstractslider.cpp b/src/widgets/widgets/qabstractslider.cpp index 8d8c3aa4bc..c2d4d3278f 100644 --- a/src/widgets/widgets/qabstractslider.cpp +++ b/src/widgets/widgets/qabstractslider.cpp @@ -205,7 +205,7 @@ QT_BEGIN_NAMESPACE QAbstractSliderPrivate::QAbstractSliderPrivate() : minimum(0), maximum(99), pageStep(10), value(0), position(0), pressValue(-1), - singleStep(1), offset_accumulated(0), tracking(true), + singleStep(1), singleStepFromItemView(-1), viewMayChangeSingleStep(true), offset_accumulated(0), tracking(true), blocktracking(false), pressed(false), invertedAppearance(false), invertedControls(false), orientation(Qt::Horizontal), repeatAction(QAbstractSlider::SliderNoAction) @@ -378,6 +378,11 @@ int QAbstractSlider::maximum() const void QAbstractSlider::setSingleStep(int step) { Q_D(QAbstractSlider); + + d->viewMayChangeSingleStep = (step < 0); + if (step < 0 && d->singleStepFromItemView > 0) + step = d->singleStepFromItemView; + if (step != d->singleStep) d->setSteps(step, d->pageStep); } @@ -936,4 +941,16 @@ bool QAbstractSlider::event(QEvent *e) return QWidget::event(e); } +// This function is called from itemviews when doing scroll per pixel (on updateGeometries()) +// It will not have any effect if there has been a call to setSingleStep with +// a 'reasonable' value (since viewMayChangeSingleStep will be set to false). +// (If setSingleStep is called with -1 it will however allow the views to change singleStep.) + +void QAbstractSliderPrivate::itemviewChangeSingleStep(int step) +{ + singleStepFromItemView = step; + if (viewMayChangeSingleStep && singleStep != step) + setSteps(step, pageStep); +} + QT_END_NAMESPACE diff --git a/src/widgets/widgets/qabstractslider_p.h b/src/widgets/widgets/qabstractslider_p.h index 3df73cf172..32ae55795b 100644 --- a/src/widgets/widgets/qabstractslider_p.h +++ b/src/widgets/widgets/qabstractslider_p.h @@ -67,6 +67,8 @@ public: * Call effectiveSingleStep() when changing the slider value. */ int singleStep; + int singleStepFromItemView; // If we have itemViews we track the views preferred singleStep value. + bool viewMayChangeSingleStep; float offset_accumulated; uint tracking : 1; @@ -108,6 +110,7 @@ public: #endif ; } + void itemviewChangeSingleStep(int step); virtual int bound(int val) const { return qMax(minimum, qMin(maximum, val)); } inline int overflowSafeAdd(int add) const diff --git a/src/widgets/widgets/qabstractspinbox.cpp b/src/widgets/widgets/qabstractspinbox.cpp index ba4bbe40a8..40c148f4c6 100644 --- a/src/widgets/widgets/qabstractspinbox.cpp +++ b/src/widgets/widgets/qabstractspinbox.cpp @@ -1931,7 +1931,7 @@ void QSpinBoxValidator::fixup(QString &input) const QVariant operator+(const QVariant &arg1, const QVariant &arg2) { QVariant ret; - if (arg1.type() != arg2.type()) + if (Q_UNLIKELY(arg1.type() != arg2.type())) qWarning("QAbstractSpinBox: Internal error: Different types (%s vs %s) (%s:%d)", arg1.typeName(), arg2.typeName(), __FILE__, __LINE__); switch (arg1.type()) { @@ -1970,7 +1970,7 @@ QVariant operator+(const QVariant &arg1, const QVariant &arg2) QVariant operator-(const QVariant &arg1, const QVariant &arg2) { QVariant ret; - if (arg1.type() != arg2.type()) + if (Q_UNLIKELY(arg1.type() != arg2.type())) qWarning("QAbstractSpinBox: Internal error: Different types (%s vs %s) (%s:%d)", arg1.typeName(), arg2.typeName(), __FILE__, __LINE__); switch (arg1.type()) { diff --git a/src/widgets/widgets/qcalendarwidget.cpp b/src/widgets/widgets/qcalendarwidget.cpp index 48b224fe13..eb216b1ad0 100644 --- a/src/widgets/widgets/qcalendarwidget.cpp +++ b/src/widgets/widgets/qcalendarwidget.cpp @@ -53,6 +53,8 @@ #include <qbasictimer.h> #include <qstylepainter.h> +#include <vector> + QT_BEGIN_NAMESPACE enum { @@ -423,6 +425,17 @@ QString QCalendarYearValidator::text(const QDate &date, int repeat) const /////////////////////////////////// +struct SectionToken { + Q_DECL_CONSTEXPR SectionToken(QCalendarDateSectionValidator *v, int rep) + : validator(v), repeat(rep) {} + + QCalendarDateSectionValidator *validator; + int repeat; +}; +} // unnamed namespace +Q_DECLARE_TYPEINFO(SectionToken, Q_PRIMITIVE_TYPE); +namespace { + class QCalendarDateValidator { public: @@ -438,13 +451,6 @@ public: void setLocale(const QLocale &locale); private: - - struct SectionToken { - SectionToken(QCalendarDateSectionValidator *val, int rep) : validator(val), repeat(rep) {} - QCalendarDateSectionValidator *validator; - int repeat; - }; - void toNextToken(); void toPreviousToken(); void applyToDate(); @@ -453,12 +459,12 @@ private: void clear(); QStringList m_separators; - QList<SectionToken *> m_tokens; + std::vector<SectionToken> m_tokens; QCalendarYearValidator m_yearValidator; QCalendarMonthValidator m_monthValidator; QCalendarDayValidator m_dayValidator; - SectionToken *m_currentToken; + int m_currentToken; QDate m_initialDate; QDate m_currentDate; @@ -467,7 +473,7 @@ private: }; QCalendarDateValidator::QCalendarDateValidator() - : m_currentToken(Q_NULLPTR), + : m_currentToken(-1), m_initialDate(QDate::currentDate()), m_currentDate(m_initialDate), m_lastSectionMove(QCalendarDateSectionValidator::ThisSection) @@ -510,17 +516,16 @@ void QCalendarDateValidator::setInitialDate(const QDate &date) QString QCalendarDateValidator::currentText() const { QString str; - QStringListIterator itSep(m_separators); - QListIterator<SectionToken *> itTok(m_tokens); - while (itSep.hasNext()) { - str += itSep.next(); - if (itTok.hasNext()) { - SectionToken *token = itTok.next(); - QCalendarDateSectionValidator *validator = token->validator; - if (m_currentToken == token) - str += validator->text(); + const int numSeps = m_separators.size(); + const int numTokens = int(m_tokens.size()); + for (int i = 0; i < numSeps; ++i) { + str += m_separators.at(i); + if (i < numTokens) { + const SectionToken &token = m_tokens[i]; + if (i == m_currentToken) + str += token.validator->text(); else - str += validator->text(m_currentDate, token->repeat); + str += token.validator->text(m_currentDate, token.repeat); } } return str; @@ -528,14 +533,10 @@ QString QCalendarDateValidator::currentText() const void QCalendarDateValidator::clear() { - QListIterator<SectionToken *> it(m_tokens); - while (it.hasNext()) - delete it.next(); - m_tokens.clear(); m_separators.clear(); - m_currentToken = 0; + m_currentToken = -1; } void QCalendarDateValidator::setFormat(const QString &format) @@ -558,25 +559,25 @@ void QCalendarDateValidator::setFormat(const QString &format) separator += nextChar; quoting = false; } else { - SectionToken *token = 0; + QCalendarDateSectionValidator *validator = 0; if (nextChar == QLatin1Char('d')) { offset = qMin(4, countRepeat(format, pos)); - token = new SectionToken(&m_dayValidator, offset); + validator = &m_dayValidator; } else if (nextChar == QLatin1Char('M')) { offset = qMin(4, countRepeat(format, pos)); - token = new SectionToken(&m_monthValidator, offset); + validator = &m_monthValidator; } else if (nextChar == QLatin1Char('y')) { offset = qMin(4, countRepeat(format, pos)); - token = new SectionToken(&m_yearValidator, offset); + validator = &m_yearValidator; } else { separator += nextChar; } - if (token) { - m_tokens.append(token); + if (validator) { + m_tokens.push_back(SectionToken(validator, offset)); m_separators.append(separator); separator = QString(); - if (!m_currentToken) - m_currentToken = token; + if (m_currentToken < 0) + m_currentToken = int(m_tokens.size()) - 1; } } @@ -595,29 +596,23 @@ void QCalendarDateValidator::applyToDate() void QCalendarDateValidator::toNextToken() { - const int idx = m_tokens.indexOf(m_currentToken); - if (idx == -1) + if (m_currentToken < 0) return; - if (idx + 1 >= m_tokens.count()) - m_currentToken = m_tokens.first(); - else - m_currentToken = m_tokens.at(idx + 1); + ++m_currentToken; + m_currentToken %= m_tokens.size(); } void QCalendarDateValidator::toPreviousToken() { - const int idx = m_tokens.indexOf(m_currentToken); - if (idx == -1) + if (m_currentToken < 0) return; - if (idx - 1 < 0) - m_currentToken = m_tokens.last(); - else - m_currentToken = m_tokens.at(idx - 1); + --m_currentToken; + m_currentToken %= m_tokens.size(); } void QCalendarDateValidator::handleKeyEvent(QKeyEvent *keyEvent) { - if (!m_currentToken) + if (m_currentToken < 0) return; int key = keyEvent->key(); @@ -630,7 +625,7 @@ void QCalendarDateValidator::handleKeyEvent(QKeyEvent *keyEvent) else if (key == Qt::Key_Left) toPreviousToken(); - m_lastSectionMove = m_currentToken->validator->handleKey(key); + m_lastSectionMove = m_tokens[m_currentToken].validator->handleKey(key); applyToDate(); if (m_lastSectionMove == QCalendarDateSectionValidator::NextSection) @@ -821,6 +816,41 @@ void QCalendarTextNavigator::setDateEditAcceptDelay(int delay) class QCalendarView; +// a small helper class that replaces a QMap<Qt::DayOfWeek, T>, +// but requires T to have a member-swap and a default constructor +// which should be cheap (no memory allocations) + +QT_WARNING_PUSH +QT_WARNING_DISABLE_MSVC(4351) // "new behavior: elements of array ... will be default initialized" + +template <typename T> +class StaticDayOfWeekAssociativeArray { + bool contained[7]; + T data[7]; + + static Q_DECL_CONSTEXPR int day2idx(Qt::DayOfWeek day) Q_DECL_NOTHROW { return int(day) - 1; } // alt: day % 7 +public: + Q_DECL_CONSTEXPR StaticDayOfWeekAssociativeArray() Q_DECL_NOEXCEPT_EXPR(noexcept(T())) + : contained(), data() {} + + Q_DECL_CONSTEXPR bool contains(Qt::DayOfWeek day) const Q_DECL_NOTHROW { return contained[day2idx(day)]; } + Q_DECL_CONSTEXPR const T &value(Qt::DayOfWeek day) const Q_DECL_NOTHROW { return data[day2idx(day)]; } + + Q_DECL_RELAXED_CONSTEXPR T &operator[](Qt::DayOfWeek day) Q_DECL_NOTHROW + { + const int idx = day2idx(day); + contained[idx] = true; + return data[idx]; + } + + Q_DECL_RELAXED_CONSTEXPR void insert(Qt::DayOfWeek day, T v) Q_DECL_NOTHROW + { + operator[](day).swap(v); + } +}; + +QT_WARNING_POP + class QCalendarModel : public QAbstractTableModel { Q_OBJECT @@ -899,7 +929,7 @@ public: Qt::DayOfWeek m_firstDay; QCalendarWidget::HorizontalHeaderFormat m_horizontalHeaderFormat; bool m_weekNumbersShown; - QMap<Qt::DayOfWeek, QTextCharFormat> m_dayFormats; + StaticDayOfWeekAssociativeArray<QTextCharFormat> m_dayFormats; QMap<QDate, QTextCharFormat> m_dateFormats; QTextCharFormat m_headerFormat; QCalendarView *m_view; @@ -2887,7 +2917,7 @@ void QCalendarWidget::setDateEditAcceptDelay(int delay) */ void QCalendarWidget::updateCell(const QDate &date) { - if (!date.isValid()) { + if (Q_UNLIKELY(!date.isValid())) { qWarning("QCalendarWidget::updateCell: Invalid date"); return; } diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp index ed3af90532..c442ace476 100644 --- a/src/widgets/widgets/qcombobox.cpp +++ b/src/widgets/widgets/qcombobox.cpp @@ -1360,7 +1360,7 @@ int QComboBox::maxVisibleItems() const void QComboBox::setMaxVisibleItems(int maxItems) { Q_D(QComboBox); - if (maxItems < 0) { + if (Q_UNLIKELY(maxItems < 0)) { qWarning("QComboBox::setMaxVisibleItems: " "Invalid max visible items (%d) must be >= 0", maxItems); return; @@ -1395,13 +1395,14 @@ int QComboBox::count() const void QComboBox::setMaxCount(int max) { Q_D(QComboBox); - if (max < 0) { + if (Q_UNLIKELY(max < 0)) { qWarning("QComboBox::setMaxCount: Invalid count (%d) must be >= 0", max); return; } - if (max < count()) - d->model->removeRows(max, count() - max, d->root); + const int rowCount = count(); + if (rowCount > max) + d->model->removeRows(max, rowCount - max, d->root); d->maxCount = max; } @@ -1448,7 +1449,7 @@ void QComboBox::setAutoCompletion(bool enable) Q_D(QComboBox); #ifdef QT_KEYPAD_NAVIGATION - if (QApplication::keypadNavigationEnabled() && !enable && isEditable()) + if (Q_UNLIKELY(QApplication::keypadNavigationEnabled() && !enable && isEditable())) qWarning("QComboBox::setAutoCompletion: auto completion is mandatory when combo box editable"); #endif @@ -1547,9 +1548,8 @@ void QComboBox::setDuplicatesEnabled(bool enable) int QComboBox::findData(const QVariant &data, int role, Qt::MatchFlags flags) const { Q_D(const QComboBox); - QModelIndexList result; QModelIndex start = d->model->index(0, d->modelColumn, d->root); - result = d->model->match(start, role, data, 1, flags); + const QModelIndexList result = d->model->match(start, role, data, 1, flags); if (result.isEmpty()) return -1; return result.first().row(); @@ -1758,7 +1758,7 @@ void QComboBox::setEditable(bool editable) void QComboBox::setLineEdit(QLineEdit *edit) { Q_D(QComboBox); - if (!edit) { + if (Q_UNLIKELY(!edit)) { qWarning("QComboBox::setLineEdit: cannot set a 0 line edit"); return; } @@ -1770,7 +1770,9 @@ void QComboBox::setLineEdit(QLineEdit *edit) delete d->lineEdit; d->lineEdit = edit; +#ifndef QT_NO_IM qt_widget_private(d->lineEdit)->inheritsInputMethodHints = 1; +#endif if (d->lineEdit->parent() != this) d->lineEdit->setParent(this); connect(d->lineEdit, SIGNAL(returnPressed()), this, SLOT(_q_returnPressed())); @@ -1915,7 +1917,7 @@ QAbstractItemDelegate *QComboBox::itemDelegate() const */ void QComboBox::setItemDelegate(QAbstractItemDelegate *delegate) { - if (!delegate) { + if (Q_UNLIKELY(!delegate)) { qWarning("QComboBox::setItemDelegate: cannot set a 0 delegate"); return; } @@ -1947,7 +1949,7 @@ void QComboBox::setModel(QAbstractItemModel *model) { Q_D(QComboBox); - if (!model) { + if (Q_UNLIKELY(!model)) { qWarning("QComboBox::setModel: cannot set a 0 model"); return; } @@ -2393,7 +2395,7 @@ QAbstractItemView *QComboBox::view() const void QComboBox::setView(QAbstractItemView *itemView) { Q_D(QComboBox); - if (!itemView) { + if (Q_UNLIKELY(!itemView)) { qWarning("QComboBox::setView: cannot set a 0 view"); return; } @@ -2583,7 +2585,7 @@ void QComboBox::showPopup() #endif while (!toCheck.isEmpty()) { QModelIndex parent = toCheck.pop(); - for (int i = 0; i < d->model->rowCount(parent); ++i) { + for (int i = 0, end = d->model->rowCount(parent); i < end; ++i) { QModelIndex idx = d->model->index(i, d->modelColumn, parent); if (!idx.isValid()) continue; @@ -3192,6 +3194,8 @@ void QComboBox::keyPressEvent(QKeyEvent *e) } } + const int rowCount = count(); + if (move != NoMove) { e->accept(); switch (move) { @@ -3199,11 +3203,11 @@ void QComboBox::keyPressEvent(QKeyEvent *e) newIndex = -1; case MoveDown: newIndex++; - while ((newIndex < count()) && !(d->model->flags(d->model->index(newIndex,d->modelColumn,d->root)) & Qt::ItemIsEnabled)) + while (newIndex < rowCount && !(d->model->index(newIndex, d->modelColumn, d->root).flags() & Qt::ItemIsEnabled)) newIndex++; break; case MoveLast: - newIndex = count(); + newIndex = rowCount; case MoveUp: newIndex--; while ((newIndex >= 0) && !(d->model->flags(d->model->index(newIndex,d->modelColumn,d->root)) & Qt::ItemIsEnabled)) @@ -3214,7 +3218,7 @@ void QComboBox::keyPressEvent(QKeyEvent *e) break; } - if (newIndex >= 0 && newIndex < count() && newIndex != currentIndex()) { + if (newIndex >= 0 && newIndex < rowCount && newIndex != currentIndex()) { setCurrentIndex(newIndex); d->emitActivated(d->currentIndex); } @@ -3247,6 +3251,7 @@ void QComboBox::wheelEvent(QWheelEvent *e) #else Q_D(QComboBox); if (!d->viewContainer()->isVisible()) { + const int rowCount = count(); int newIndex = currentIndex(); if (e->delta() > 0) { @@ -3255,11 +3260,11 @@ void QComboBox::wheelEvent(QWheelEvent *e) newIndex--; } else if (e->delta() < 0) { newIndex++; - while ((newIndex < count()) && !(d->model->flags(d->model->index(newIndex,d->modelColumn,d->root)) & Qt::ItemIsEnabled)) + while (newIndex < rowCount && !(d->model->index(newIndex, d->modelColumn, d->root).flags() & Qt::ItemIsEnabled)) newIndex++; } - if (newIndex >= 0 && newIndex < count() && newIndex != currentIndex()) { + if (newIndex >= 0 && newIndex < rowCount && newIndex != currentIndex()) { setCurrentIndex(newIndex); d->emitActivated(d->currentIndex); } diff --git a/src/widgets/widgets/qcombobox.h b/src/widgets/widgets/qcombobox.h index 3182a0a3aa..45b601788f 100644 --- a/src/widgets/widgets/qcombobox.h +++ b/src/widgets/widgets/qcombobox.h @@ -229,7 +229,9 @@ protected: #ifndef QT_NO_WHEELEVENT void wheelEvent(QWheelEvent *e) Q_DECL_OVERRIDE; #endif +#ifndef QT_NO_CONTEXTMENU void contextMenuEvent(QContextMenuEvent *e) Q_DECL_OVERRIDE; +#endif // QT_NO_CONTEXTMENU void inputMethodEvent(QInputMethodEvent *) Q_DECL_OVERRIDE; void initStyleOption(QStyleOptionComboBox *option) const; diff --git a/src/widgets/widgets/qdatetimeedit.cpp b/src/widgets/widgets/qdatetimeedit.cpp index abee788a46..c2ed0d33e2 100644 --- a/src/widgets/widgets/qdatetimeedit.cpp +++ b/src/widgets/widgets/qdatetimeedit.cpp @@ -760,17 +760,17 @@ QCalendarWidget *QDateTimeEdit::calendarWidget() const void QDateTimeEdit::setCalendarWidget(QCalendarWidget *calendarWidget) { Q_D(QDateTimeEdit); - if (!calendarWidget) { + if (Q_UNLIKELY(!calendarWidget)) { qWarning("QDateTimeEdit::setCalendarWidget: Cannot set a null calendar widget"); return; } - if (!d->calendarPopup) { + if (Q_UNLIKELY(!d->calendarPopup)) { qWarning("QDateTimeEdit::setCalendarWidget: calendarPopup is set to false"); return; } - if (!(d->display & QDateTimeParser::DateSectionMask)) { + if (Q_UNLIKELY(!(d->display & QDateTimeParser::DateSectionMask))) { qWarning("QDateTimeEdit::setCalendarWidget: no date sections specified"); return; } @@ -1868,7 +1868,7 @@ void QDateTimeEditPrivate::clearSection(int index) const QSignalBlocker blocker(edit); QString t = edit->text(); const int pos = sectionPos(index); - if (pos == -1) { + if (Q_UNLIKELY(pos == -1)) { qWarning("QDateTimeEdit: Internal error (%s:%d)", __FILE__, __LINE__); return; } diff --git a/src/widgets/widgets/qdialogbuttonbox.cpp b/src/widgets/widgets/qdialogbuttonbox.cpp index 4d2c32d43e..cad5e6f9e4 100644 --- a/src/widgets/widgets/qdialogbuttonbox.cpp +++ b/src/widgets/widgets/qdialogbuttonbox.cpp @@ -405,11 +405,10 @@ QPushButton *QDialogButtonBoxPrivate::createButton(QDialogButtonBox::StandardBut button->setStyle(style); standardButtonHash.insert(button, sbutton); QPlatformDialogHelper::ButtonRole role = QPlatformDialogHelper::buttonRole(static_cast<QPlatformDialogHelper::StandardButton>(sbutton)); - if (role != QPlatformDialogHelper::InvalidRole) { - addButton(button, static_cast<QDialogButtonBox::ButtonRole>(role), doLayout); - } else { + if (Q_UNLIKELY(role == QPlatformDialogHelper::InvalidRole)) qWarning("QDialogButtonBox::createButton: Invalid ButtonRole, button not added"); - } + else + addButton(button, static_cast<QDialogButtonBox::ButtonRole>(role), doLayout); #ifdef Q_DEAD_CODE_FROM_QT4_MAC // Since mnemonics is off by default on Mac, we add a Cmd-D @@ -753,7 +752,7 @@ void QDialogButtonBox::removeButton(QAbstractButton *button) void QDialogButtonBox::addButton(QAbstractButton *button, ButtonRole role) { Q_D(QDialogButtonBox); - if (role <= InvalidRole || role >= NRoles) { + if (Q_UNLIKELY(role <= InvalidRole || role >= NRoles)) { qWarning("QDialogButtonBox::addButton: Invalid ButtonRole, button not added"); return; } @@ -772,7 +771,7 @@ void QDialogButtonBox::addButton(QAbstractButton *button, ButtonRole role) QPushButton *QDialogButtonBox::addButton(const QString &text, ButtonRole role) { Q_D(QDialogButtonBox); - if (role <= InvalidRole || role >= NRoles) { + if (Q_UNLIKELY(role <= InvalidRole || role >= NRoles)) { qWarning("QDialogButtonBox::addButton: Invalid ButtonRole, button not added"); return 0; } diff --git a/src/widgets/widgets/qdockarealayout.cpp b/src/widgets/widgets/qdockarealayout.cpp index 8c79425e44..07efbafb31 100644 --- a/src/widgets/widgets/qdockarealayout.cpp +++ b/src/widgets/widgets/qdockarealayout.cpp @@ -1677,9 +1677,9 @@ void QDockAreaLayoutInfo::tab(int index, QLayoutItem *dockWidgetItem) QDockAreaLayoutInfo *new_info = new QDockAreaLayoutInfo(sep, dockPos, o, tabBarShape, mainWindow); item_list[index].subinfo = new_info; - new_info->item_list.append(item_list.at(index).widgetItem); + new_info->item_list.append(QDockAreaLayoutItem(item_list.at(index).widgetItem)); item_list[index].widgetItem = 0; - new_info->item_list.append(dockWidgetItem); + new_info->item_list.append(QDockAreaLayoutItem(dockWidgetItem)); new_info->tabbed = true; new_info->updateTabBar(); new_info->setCurrentTab(dockWidgetItem->widget()); @@ -1699,9 +1699,9 @@ void QDockAreaLayoutInfo::split(int index, Qt::Orientation orientation, QDockAreaLayoutInfo *new_info = new QDockAreaLayoutInfo(sep, dockPos, orientation, tabBarShape, mainWindow); item_list[index].subinfo = new_info; - new_info->item_list.append(item_list.at(index).widgetItem); + new_info->item_list.append(QDockAreaLayoutItem(item_list.at(index).widgetItem)); item_list[index].widgetItem = 0; - new_info->item_list.append(dockWidgetItem); + new_info->item_list.append(QDockAreaLayoutItem(dockWidgetItem)); } } @@ -1802,9 +1802,9 @@ void QDockAreaLayoutInfo::saveState(QDataStream &stream) const stream << (uchar) WidgetMarker; QWidget *w = item.widgetItem->widget(); QString name = w->objectName(); - if (name.isEmpty()) { - qWarning("QMainWindow::saveState(): 'objectName' not set for QDockWidget %p '%s;", - w, qPrintable(w->windowTitle())); + if (Q_UNLIKELY(name.isEmpty())) { + qWarning("QMainWindow::saveState(): 'objectName' not set for QDockWidget %p '%ls;", + w, qUtf16Printable(w->windowTitle())); } stream << name; @@ -3082,8 +3082,8 @@ void QDockAreaLayout::addDockWidget(QInternal::DockPosition pos, QDockWidget *do int tbshape = 0; #endif QDockAreaLayoutInfo new_info(&sep, pos, orientation, tbshape, mainWindow); - new_info.item_list.append(new QDockAreaLayoutInfo(info)); - new_info.item_list.append(dockWidgetItem); + new_info.item_list.append(QDockAreaLayoutItem(new QDockAreaLayoutInfo(info))); + new_info.item_list.append(QDockAreaLayoutItem(dockWidgetItem)); info = new_info; } @@ -3110,7 +3110,7 @@ void QDockAreaLayout::tabifyDockWidget(QDockWidget *first, QDockWidget *second) void QDockAreaLayout::resizeDocks(const QList<QDockWidget *> &docks, const QList<int> &sizes, Qt::Orientation o) { - if (docks.count() != sizes.count()) { + if (Q_UNLIKELY(docks.count() != sizes.count())) { qWarning("QMainWidget::resizeDocks: size of the lists are not the same"); return; } @@ -3118,12 +3118,12 @@ void QDockAreaLayout::resizeDocks(const QList<QDockWidget *> &docks, fallbackToSizeHints = false; for (int i = 0; i < count; ++i) { QList<int> path = indexOf(docks[i]); - if (path.isEmpty()) { + if (Q_UNLIKELY(path.isEmpty())) { qWarning("QMainWidget::resizeDocks: one QDockWidget is not part of the layout"); continue; } int size = sizes[i]; - if (size <= 0) { + if (Q_UNLIKELY(size <= 0)) { qWarning("QMainWidget::resizeDocks: all sizes need to be larger than 0"); size = 1; } diff --git a/src/widgets/widgets/qdockarealayout_p.h b/src/widgets/widgets/qdockarealayout_p.h index 5d352f0124..b0f2bdffa4 100644 --- a/src/widgets/widgets/qdockarealayout_p.h +++ b/src/widgets/widgets/qdockarealayout_p.h @@ -82,9 +82,9 @@ struct QDockAreaLayoutItem { enum ItemFlags { NoFlags = 0, GapItem = 1, KeepSize = 2 }; - QDockAreaLayoutItem(QLayoutItem *_widgetItem = 0); - QDockAreaLayoutItem(QDockAreaLayoutInfo *_subinfo); - QDockAreaLayoutItem(QPlaceHolderItem *_placeHolderItem); + explicit QDockAreaLayoutItem(QLayoutItem *_widgetItem = 0); + explicit QDockAreaLayoutItem(QDockAreaLayoutInfo *_subinfo); + explicit QDockAreaLayoutItem(QPlaceHolderItem *_placeHolderItem); QDockAreaLayoutItem(const QDockAreaLayoutItem &other); ~QDockAreaLayoutItem(); @@ -109,7 +109,7 @@ class Q_AUTOTEST_EXPORT QPlaceHolderItem { public: QPlaceHolderItem() : hidden(false), window(false) {} - QPlaceHolderItem(QWidget *w); + explicit QPlaceHolderItem(QWidget *w); QString objectName; bool hidden, window; diff --git a/src/widgets/widgets/qgroupbox.cpp b/src/widgets/widgets/qgroupbox.cpp index 0ff5dc8753..559c8bbd33 100644 --- a/src/widgets/widgets/qgroupbox.cpp +++ b/src/widgets/widgets/qgroupbox.cpp @@ -653,9 +653,7 @@ void QGroupBox::setChecked(bool b) void QGroupBoxPrivate::_q_setChildrenEnabled(bool b) { Q_Q(QGroupBox); - QObjectList childList = q->children(); - for (int i = 0; i < childList.size(); ++i) { - QObject *o = childList.at(i); + for (QObject *o : q->children()) { if (o->isWidgetType()) { QWidget *w = static_cast<QWidget *>(o); if (b) { @@ -707,6 +705,8 @@ void QGroupBox::mousePressEvent(QMouseEvent *event) if (d->checkable && (d->pressedControl & (QStyle::SC_GroupBoxCheckBox | QStyle::SC_GroupBoxLabel))) { d->overCheckBox = true; update(style()->subControlRect(QStyle::CC_GroupBox, &box, QStyle::SC_GroupBoxCheckBox, this)); + } else { + event->ignore(); } } @@ -723,6 +723,8 @@ void QGroupBox::mouseMoveEvent(QMouseEvent *event) if (d->checkable && (d->pressedControl == QStyle::SC_GroupBoxCheckBox || d->pressedControl == QStyle::SC_GroupBoxLabel) && (d->overCheckBox != oldOverCheckBox)) update(style()->subControlRect(QStyle::CC_GroupBox, &box, QStyle::SC_GroupBoxCheckBox, this)); + + event->ignore(); } /*! \reimp */ diff --git a/src/widgets/widgets/qlabel.cpp b/src/widgets/widgets/qlabel.cpp index 55e277026c..eeabd5db38 100644 --- a/src/widgets/widgets/qlabel.cpp +++ b/src/widgets/widgets/qlabel.cpp @@ -882,13 +882,11 @@ void QLabel::mouseReleaseEvent(QMouseEvent *ev) d->sendControlEvent(ev); } +#ifndef QT_NO_CONTEXTMENU /*!\reimp */ void QLabel::contextMenuEvent(QContextMenuEvent *ev) { -#ifdef QT_NO_CONTEXTMENU - Q_UNUSED(ev); -#else Q_D(QLabel); if (!d->isTextLabel) { ev->ignore(); @@ -902,8 +900,8 @@ void QLabel::contextMenuEvent(QContextMenuEvent *ev) ev->accept(); menu->setAttribute(Qt::WA_DeleteOnClose); menu->popup(ev->globalPos()); -#endif } +#endif // QT_NO_CONTEXTMENU /*! \reimp diff --git a/src/widgets/widgets/qlabel.h b/src/widgets/widgets/qlabel.h index 1a3a68db60..6b6e15e0a8 100644 --- a/src/widgets/widgets/qlabel.h +++ b/src/widgets/widgets/qlabel.h @@ -132,7 +132,9 @@ protected: void mousePressEvent(QMouseEvent *ev) Q_DECL_OVERRIDE; void mouseMoveEvent(QMouseEvent *ev) Q_DECL_OVERRIDE; void mouseReleaseEvent(QMouseEvent *ev) Q_DECL_OVERRIDE; +#ifndef QT_NO_CONTEXTMENU void contextMenuEvent(QContextMenuEvent *ev) Q_DECL_OVERRIDE; +#endif // QT_NO_CONTEXTMENU void focusInEvent(QFocusEvent *ev) Q_DECL_OVERRIDE; void focusOutEvent(QFocusEvent *ev) Q_DECL_OVERRIDE; bool focusNextPrevChild(bool next) Q_DECL_OVERRIDE; diff --git a/src/widgets/widgets/qlcdnumber.cpp b/src/widgets/widgets/qlcdnumber.cpp index d17e3e2470..b9c209ed3b 100644 --- a/src/widgets/widgets/qlcdnumber.cpp +++ b/src/widgets/widgets/qlcdnumber.cpp @@ -402,12 +402,12 @@ QLCDNumber::~QLCDNumber() void QLCDNumber::setDigitCount(int numDigits) { Q_D(QLCDNumber); - if (numDigits > 99) { + if (Q_UNLIKELY(numDigits > 99)) { qWarning("QLCDNumber::setNumDigits: (%s) Max 99 digits allowed", objectName().toLocal8Bit().constData()); numDigits = 99; } - if (numDigits < 0) { + if (Q_UNLIKELY(numDigits < 0)) { qWarning("QLCDNumber::setNumDigits: (%s) Min 0 digits allowed", objectName().toLocal8Bit().constData()); numDigits = 0; diff --git a/src/widgets/widgets/qlineedit.cpp b/src/widgets/widgets/qlineedit.cpp index 6b32665065..59e1d647f9 100644 --- a/src/widgets/widgets/qlineedit.cpp +++ b/src/widgets/widgets/qlineedit.cpp @@ -982,7 +982,7 @@ int QLineEdit::selectionStart() const void QLineEdit::setSelection(int start, int length) { Q_D(QLineEdit); - if (start < 0 || start > (int)d->control->end()) { + if (Q_UNLIKELY(start < 0 || start > (int)d->control->end())) { qWarning("QLineEdit::setSelection: Invalid start position (%d)", start); return; } @@ -2180,9 +2180,10 @@ void QLineEdit::changeEvent(QEvent *ev) update(); break; case QEvent::LayoutDirectionChange: - foreach (const QLineEditPrivate::SideWidgetEntry &e, d->trailingSideWidgets) // Refresh icon to show arrow in right direction. + for (const auto &e : d->trailingSideWidgets) { // Refresh icon to show arrow in right direction. if (e.flags & QLineEditPrivate::SideWidgetClearButton) static_cast<QLineEditIconButton *>(e.widget)->setIcon(d->clearButtonIcon()); + } d->positionSideWidgets(); break; default: diff --git a/src/widgets/widgets/qlineedit_p.cpp b/src/widgets/widgets/qlineedit_p.cpp index 599ebce0ab..59d8d79861 100644 --- a/src/widgets/widgets/qlineedit_p.cpp +++ b/src/widgets/widgets/qlineedit_p.cpp @@ -382,11 +382,11 @@ void QLineEditPrivate::_q_textChanged(const QString &text) lastTextSize = newTextSize; #ifndef QT_NO_ANIMATION const bool fadeIn = newTextSize > 0; - foreach (const SideWidgetEntry &e, leadingSideWidgets) { + for (const SideWidgetEntry &e : leadingSideWidgets) { if (e.flags & SideWidgetFadeInWithText) static_cast<QLineEditIconButton *>(e.widget)->animateShow(fadeIn); } - foreach (const SideWidgetEntry &e, trailingSideWidgets) { + for (const SideWidgetEntry &e : trailingSideWidgets) { if (e.flags & SideWidgetFadeInWithText) static_cast<QLineEditIconButton *>(e.widget)->animateShow(fadeIn); } @@ -453,13 +453,17 @@ void QLineEditPrivate::positionSideWidgets() QLineEditPrivate::PositionIndexPair QLineEditPrivate::findSideWidget(const QAction *a) const { - for (int i = 0; i < leadingSideWidgets.size(); ++i) { - if (a == leadingSideWidgets.at(i).action) + int i = 0; + for (const auto &e : leadingSideWidgets) { + if (a == e.action) return PositionIndexPair(QLineEdit::LeadingPosition, i); + ++i; } - for (int i = 0; i < trailingSideWidgets.size(); ++i) { - if (a == trailingSideWidgets.at(i).action) + i = 0; + for (const auto &e : trailingSideWidgets) { + if (a == e.action) return PositionIndexPair(QLineEdit::TrailingPosition, i); + ++i; } return PositionIndexPair(QLineEdit::LeadingPosition, -1); } @@ -493,8 +497,8 @@ QWidget *QLineEditPrivate::addAction(QAction *newAction, QAction *before, QLineE PositionIndexPair positionIndex = before ? findSideWidget(before) : PositionIndexPair(position, -1); SideWidgetEntryList &list = positionIndex.first == QLineEdit::TrailingPosition ? trailingSideWidgets : leadingSideWidgets; if (positionIndex.second < 0) - positionIndex.second = list.size(); - list.insert(positionIndex.second, SideWidgetEntry(w, newAction, flags)); + positionIndex.second = int(list.size()); + list.insert(list.begin() + positionIndex.second, SideWidgetEntry(w, newAction, flags)); positionSideWidgets(); w->show(); return w; @@ -507,7 +511,8 @@ void QLineEditPrivate::removeAction(QAction *action) if (positionIndex.second == -1) return; SideWidgetEntryList &list = positionIndex.first == QLineEdit::TrailingPosition ? trailingSideWidgets : leadingSideWidgets; - SideWidgetEntry entry = list.takeAt(positionIndex.second); + SideWidgetEntry entry = list[positionIndex.second]; + list.erase(list.begin() + positionIndex.second); if (entry.flags & SideWidgetCreatedByWidgetAction) static_cast<QWidgetAction *>(entry.action)->releaseWidget(entry.widget); else @@ -518,6 +523,28 @@ void QLineEditPrivate::removeAction(QAction *action) q->update(); } +static bool isSideWidgetVisible(const QLineEditPrivate::SideWidgetEntry &e) +{ + return e.widget->isVisible(); +} + +int QLineEditPrivate::effectiveLeftTextMargin() const +{ + const auto &list = leftSideWidgetList(); + return leftTextMargin + (QLineEditIconButton::IconMargin + iconSize().width()) + * int(std::count_if(list.begin(), list.end(), + isSideWidgetVisible)); +} + +int QLineEditPrivate::effectiveRightTextMargin() const +{ + const auto &list = rightSideWidgetList(); + return rightTextMargin + (QLineEditIconButton::IconMargin + iconSize().width()) + * int(std::count_if(list.begin(), list.end(), + isSideWidgetVisible)); +} + + QT_END_NAMESPACE #endif diff --git a/src/widgets/widgets/qlineedit_p.h b/src/widgets/widgets/qlineedit_p.h index 60372ab393..b2f8e537e4 100644 --- a/src/widgets/widgets/qlineedit_p.h +++ b/src/widgets/widgets/qlineedit_p.h @@ -108,13 +108,13 @@ public: }; struct SideWidgetEntry { - SideWidgetEntry(QWidget *w = 0, QAction *a = 0, int _flags = 0) : widget(w), action(a), flags(_flags) {} + explicit SideWidgetEntry(QWidget *w = 0, QAction *a = 0, int _flags = 0) : widget(w), action(a), flags(_flags) {} QWidget *widget; QAction *action; int flags; }; - typedef QVector<SideWidgetEntry> SideWidgetEntryList; + typedef std::vector<SideWidgetEntry> SideWidgetEntryList; QLineEditPrivate() : control(0), frame(1), contextMenuEnabled(1), cursorVisible(0), @@ -210,7 +210,7 @@ public: QIcon clearButtonIcon() const; void setClearButtonEnabled(bool enabled); void positionSideWidgets(); - inline bool hasSideWidgets() const { return !leadingSideWidgets.isEmpty() || !trailingSideWidgets.isEmpty(); } + inline bool hasSideWidgets() const { return !leadingSideWidgets.empty() || !trailingSideWidgets.empty(); } inline const SideWidgetEntryList &leftSideWidgetList() const { return q_func()->layoutDirection() == Qt::LeftToRight ? leadingSideWidgets : trailingSideWidgets; } inline const SideWidgetEntryList &rightSideWidgetList() const @@ -231,25 +231,6 @@ private: }; Q_DECLARE_TYPEINFO(QLineEditPrivate::SideWidgetEntry, Q_PRIMITIVE_TYPE); -static bool isSideWidgetVisible(const QLineEditPrivate::SideWidgetEntry &e) -{ - return e.widget->isVisible(); -} - -inline int QLineEditPrivate::effectiveLeftTextMargin() const -{ - return leftTextMargin + (QLineEditIconButton::IconMargin + iconSize().width()) - * int(std::count_if(leftSideWidgetList().constBegin(), leftSideWidgetList().constEnd(), - isSideWidgetVisible)); -} - -inline int QLineEditPrivate::effectiveRightTextMargin() const -{ - return rightTextMargin + (QLineEditIconButton::IconMargin + iconSize().width()) - * int(std::count_if(rightSideWidgetList().constBegin(), rightSideWidgetList().constEnd(), - isSideWidgetVisible)); -} - #endif // QT_NO_LINEEDIT QT_END_NAMESPACE diff --git a/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm b/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm index a384e41d1b..7bd539033a 100644 --- a/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm +++ b/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm @@ -31,7 +31,7 @@ ** ****************************************************************************/ -#import <Cocoa/Cocoa.h> +#import <AppKit/AppKit.h> #include "qmaccocoaviewcontainer_mac.h" #include <QtCore/QDebug> @@ -93,7 +93,7 @@ inline QPlatformNativeInterface::NativeResourceForIntegrationFunction resolvePla QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface(); QPlatformNativeInterface::NativeResourceForIntegrationFunction function = nativeInterface->nativeResourceFunctionForIntegration(functionName); - if (!function) + if (Q_UNLIKELY(!function)) qWarning() << "Qt could not resolve function" << functionName << "from QGuiApplication::platformNativeInterface()->nativeResourceFunctionForIntegration()"; return function; diff --git a/src/widgets/widgets/qmacnativewidget_mac.mm b/src/widgets/widgets/qmacnativewidget_mac.mm index 46a43c4110..729aa9aba0 100644 --- a/src/widgets/widgets/qmacnativewidget_mac.mm +++ b/src/widgets/widgets/qmacnativewidget_mac.mm @@ -31,7 +31,7 @@ ** ****************************************************************************/ -#import <Cocoa/Cocoa.h> +#import <AppKit/AppKit.h> #include "qmacnativewidget_mac.h" #include <QtCore/qdebug.h> @@ -82,7 +82,7 @@ inline QPlatformNativeInterface::NativeResourceForIntegrationFunction resolvePla QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface(); QPlatformNativeInterface::NativeResourceForIntegrationFunction function = nativeInterface->nativeResourceFunctionForIntegration(functionName); - if (!function) + if (Q_UNLIKELY(!function)) qWarning() << "Qt could not resolve function" << functionName << "from QGuiApplication::platformNativeInterface()->nativeResourceFunctionForIntegration()"; return function; diff --git a/src/widgets/widgets/qmainwindow.cpp b/src/widgets/widgets/qmainwindow.cpp index ff4bb3cc98..2fbd83ef54 100644 --- a/src/widgets/widgets/qmainwindow.cpp +++ b/src/widgets/widgets/qmainwindow.cpp @@ -693,7 +693,7 @@ void QMainWindow::setCorner(Qt::Corner corner, Qt::DockWidgetArea area) valid = (area == Qt::BottomDockWidgetArea || area == Qt::RightDockWidgetArea); break; } - if (!valid) + if (Q_UNLIKELY(!valid)) qWarning("QMainWindow::setCorner(): 'area' is not valid for 'corner'"); else d_func()->layout->setCorner(corner, area); diff --git a/src/widgets/widgets/qmainwindowlayout.cpp b/src/widgets/widgets/qmainwindowlayout.cpp index 54e956c4cf..6b171ae452 100644 --- a/src/widgets/widgets/qmainwindowlayout.cpp +++ b/src/widgets/widgets/qmainwindowlayout.cpp @@ -1945,7 +1945,7 @@ bool QMainWindowLayout::plug(QLayoutItem *widgetItem) static_cast<QMainWindow*>(parentWidget())); info->tabbed = true; QLayout *parentLayout = currentHoveredFloat->parentWidget()->layout(); - info->item_list.append(parentLayout->takeAt(parentLayout->indexOf(currentHoveredFloat))); + info->item_list.append(QDockAreaLayoutItem(parentLayout->takeAt(parentLayout->indexOf(currentHoveredFloat)))); dropTo->setParent(floatingTabs); dropTo->show(); diff --git a/src/widgets/widgets/qmainwindowlayout_p.h b/src/widgets/widgets/qmainwindowlayout_p.h index 9a13e5f5ce..b718a0ca4f 100644 --- a/src/widgets/widgets/qmainwindowlayout_p.h +++ b/src/widgets/widgets/qmainwindowlayout_p.h @@ -60,18 +60,6 @@ #include "qdockarealayout_p.h" #include "qtoolbararealayout_p.h" -#ifdef Q_DEAD_CODE_FROM_QT4_MAC -// Forward defs to make avoid including Carbon.h (faster compile you know ;). -struct OpaqueHIObjectRef; -typedef struct OpaqueHIObjectRef* HIObjectRef; -typedef HIObjectRef HIToolbarItemRef; -typedef const void * CFTypeRef; -typedef const struct __CFString * CFStringRef; - -#include <private/qunifiedtoolbarsurface_mac_p.h> - -#endif // Q_DEAD_CODE_FROM_QT4_MAC - QT_BEGIN_NAMESPACE class QToolBar; @@ -275,7 +263,7 @@ public: // save/restore - enum { // sentinel values used to validate state data + enum VersionMarkers { // sentinel values used to validate state data VersionMarker = 0xff }; void saveState(QDataStream &stream) const; diff --git a/src/widgets/widgets/qmdiarea.cpp b/src/widgets/widgets/qmdiarea.cpp index e683c48ad3..50685667d3 100644 --- a/src/widgets/widgets/qmdiarea.cpp +++ b/src/widgets/widgets/qmdiarea.cpp @@ -161,7 +161,6 @@ #include <QResizeEvent> #include <QScrollBar> #include <QtAlgorithms> -#include <QMutableVectorIterator> #include <QPainter> #include <QFontMetrics> #include <QStyleOption> @@ -179,7 +178,7 @@ using namespace QMdi; // Asserts in debug mode, gives warning otherwise. static bool sanityCheck(const QMdiSubWindow * const child, const char *where) { - if (!child) { + if (Q_UNLIKELY(!child)) { const char error[] = "null pointer"; Q_ASSERT_X(false, where, error); qWarning("%s:%s", where, error); @@ -190,13 +189,13 @@ static bool sanityCheck(const QMdiSubWindow * const child, const char *where) static bool sanityCheck(const QList<QWidget *> &widgets, const int index, const char *where) { - if (index < 0 || index >= widgets.size()) { + if (Q_UNLIKELY(index < 0 || index >= widgets.size())) { const char error[] = "index out of range"; Q_ASSERT_X(false, where, error); qWarning("%s:%s", where, error); return false; } - if (!widgets.at(index)) { + if (Q_UNLIKELY(!widgets.at(index))) { const char error[] = "null pointer"; Q_ASSERT_X(false, where, error); qWarning("%s:%s", where, error); @@ -380,7 +379,7 @@ void IconTiler::rearrange(QList<QWidget *> &widgets, const QRect &domain) const return; const int n = widgets.size(); - const int width = widgets.at(0)->width(); + const int width = qMax(widgets.at(0)->width(), 1); const int height = widgets.at(0)->height(); const int ncols = qMax(domain.width() / width, 1); const int nrows = n / ncols + ((n % ncols) ? 1 : 0); @@ -409,7 +408,7 @@ void IconTiler::rearrange(QList<QWidget *> &widgets, const QRect &domain) const int MinOverlapPlacer::accumulatedOverlap(const QRect &source, const QVector<QRect> &rects) { int accOverlap = 0; - foreach (const QRect &rect, rects) { + for (const QRect &rect : rects) { QRect intersection = source.intersected(rect); accOverlap += intersection.width() * intersection.height(); } @@ -426,7 +425,7 @@ QRect MinOverlapPlacer::findMinOverlapRect(const QVector<QRect> &source, const Q { int minAccOverlap = -1; QRect minAccOverlapRect; - foreach (const QRect &srcRect, source) { + for (const QRect &srcRect : source) { const int accOverlap = accumulatedOverlap(srcRect, rects); if (accOverlap < minAccOverlap || minAccOverlap == -1) { minAccOverlap = accOverlap; @@ -455,7 +454,7 @@ QVector<QRect> MinOverlapPlacer::getCandidatePlacements(const QSize &size, const if (domain.bottom() - size.height() + 1 >= 0) ylist << domain.bottom() - size.height() + 1; - foreach (const QRect &rect, rects) { + for (const QRect &rect : rects) { xlist << rect.right() + 1; ylist << rect.bottom() + 1; } @@ -480,17 +479,16 @@ QVector<QRect> MinOverlapPlacer::getCandidatePlacements(const QSize &size, const */ QVector<QRect> MinOverlapPlacer::findNonInsiders(const QRect &domain, QVector<QRect> &source) { + const auto containedInDomain = + [domain](const QRect &srcRect) { return domain.contains(srcRect); }; + + const auto firstOut = std::stable_partition(source.begin(), source.end(), containedInDomain); + QVector<QRect> result; - result.reserve(source.size()); + result.reserve(source.end() - firstOut); + std::copy(firstOut, source.end(), std::back_inserter(result)); - QMutableVectorIterator<QRect> it(source); - while (it.hasNext()) { - const QRect srcRect = it.next(); - if (!domain.contains(srcRect)) { - result << srcRect; - it.remove(); - } - } + source.erase(firstOut, source.end()); return result; } @@ -506,13 +504,13 @@ QVector<QRect> MinOverlapPlacer::findMaxOverlappers(const QRect &domain, const Q result.reserve(source.size()); int maxOverlap = -1; - foreach (const QRect &srcRect, source) { + for (const QRect &srcRect : source) { QRect intersection = domain.intersected(srcRect); const int overlap = intersection.width() * intersection.height(); if (overlap >= maxOverlap || maxOverlap == -1) { if (overlap > maxOverlap) { maxOverlap = overlap; - result.clear(); + result.resize(0); } result << srcRect; } @@ -551,7 +549,7 @@ QPoint MinOverlapPlacer::place(const QSize &size, const QVector<QRect> &rects, { if (size.isEmpty() || !domain.isValid()) return QPoint(); - foreach (const QRect &rect, rects) { + for (const QRect &rect : rects) { if (!rect.isValid()) return QPoint(); } @@ -938,7 +936,7 @@ void QMdiAreaPrivate::rearrange(Rearranger *rearranger) if (!sanityCheck(child, "QMdiArea::rearrange") || !child->isVisible()) continue; if (rearranger->type() == Rearranger::IconTiler) { - if (child->isMinimized() && !child->isShaded() && !(child->windowFlags() & Qt::FramelessWindowHint)) + if (child->isMinimized() && !child->isShaded()) widgets.append(child); } else { if (child->isMinimized() && !child->isShaded()) @@ -1239,7 +1237,8 @@ void QMdiAreaPrivate::internalRaise(QMdiSubWindow *mdiChild) const QMdiSubWindow *stackUnderChild = 0; if (!windowStaysOnTop(mdiChild)) { - foreach (QObject *object, viewport->children()) { + const auto children = viewport->children(); // take a copy, as raising/stacking under changes the order + for (QObject *object : children) { QMdiSubWindow *child = qobject_cast<QMdiSubWindow *>(object); if (!child || !childWindows.contains(child)) continue; @@ -1394,7 +1393,7 @@ QMdiAreaPrivate::subWindowList(QMdiArea::WindowOrder order, bool reversed) const list.prepend(child); } } else if (order == QMdiArea::StackingOrder) { - foreach (QObject *object, viewport->children()) { + for (QObject *object : viewport->children()) { QMdiSubWindow *child = qobject_cast<QMdiSubWindow *>(object); if (!child || !childWindows.contains(child)) continue; @@ -1743,7 +1742,7 @@ QSize QMdiArea::sizeHint() const QSize desktopSize = QApplication::desktop()->size(); QSize size(desktopSize.width() * 2 / scaleFactor, desktopSize.height() * 2 / scaleFactor); - foreach (QMdiSubWindow *child, d_func()->childWindows) { + for (QMdiSubWindow *child : d_func()->childWindows) { if (!sanityCheck(child, "QMdiArea::sizeHint")) continue; size = size.expandedTo(child->sizeHint()); @@ -1761,7 +1760,7 @@ QSize QMdiArea::minimumSizeHint() const style()->pixelMetric(QStyle::PM_TitleBarHeight, 0, this)); size = size.expandedTo(QAbstractScrollArea::minimumSizeHint()); if (!d->scrollBarsEnabled()) { - foreach (QMdiSubWindow *child, d->childWindows) { + for (QMdiSubWindow *child : d->childWindows) { if (!sanityCheck(child, "QMdiArea::sizeHint")) continue; size = size.expandedTo(child->minimumSizeHint()); @@ -1831,12 +1830,12 @@ void QMdiArea::setActiveSubWindow(QMdiSubWindow *window) return; } - if (d->childWindows.isEmpty()) { + if (Q_UNLIKELY(d->childWindows.isEmpty())) { qWarning("QMdiArea::setActiveSubWindow: workspace is empty"); return; } - if (d->childWindows.indexOf(window) == -1) { + if (Q_UNLIKELY(d->childWindows.indexOf(window) == -1)) { qWarning("QMdiArea::setActiveSubWindow: window is not inside workspace"); return; } @@ -1960,7 +1959,7 @@ void QMdiArea::activatePreviousSubWindow() */ QMdiSubWindow *QMdiArea::addSubWindow(QWidget *widget, Qt::WindowFlags windowFlags) { - if (!widget) { + if (Q_UNLIKELY(!widget)) { qWarning("QMdiArea::addSubWindow: null pointer to widget"); return 0; } @@ -1972,7 +1971,7 @@ QMdiSubWindow *QMdiArea::addSubWindow(QWidget *widget, Qt::WindowFlags windowFla // Widget is already a QMdiSubWindow if (child) { - if (d->childWindows.indexOf(child) != -1) { + if (Q_UNLIKELY(d->childWindows.indexOf(child) != -1)) { qWarning("QMdiArea::addSubWindow: window is already added"); return child; } @@ -2003,7 +2002,7 @@ QMdiSubWindow *QMdiArea::addSubWindow(QWidget *widget, Qt::WindowFlags windowFla */ void QMdiArea::removeSubWindow(QWidget *widget) { - if (!widget) { + if (Q_UNLIKELY(!widget)) { qWarning("QMdiArea::removeSubWindow: null pointer to widget"); return; } @@ -2014,7 +2013,7 @@ void QMdiArea::removeSubWindow(QWidget *widget) if (QMdiSubWindow *child = qobject_cast<QMdiSubWindow *>(widget)) { int index = d->childWindows.indexOf(child); - if (index == -1) { + if (Q_UNLIKELY(index == -1)) { qWarning("QMdiArea::removeSubWindow: window is not inside workspace"); return; } @@ -2038,7 +2037,7 @@ void QMdiArea::removeSubWindow(QWidget *widget) } } - if (!found) + if (Q_UNLIKELY(!found)) qWarning("QMdiArea::removeSubWindow: widget is not child of any window inside QMdiArea"); } diff --git a/src/widgets/widgets/qmdiarea_p.h b/src/widgets/widgets/qmdiarea_p.h index f6bdf61492..471703ea70 100644 --- a/src/widgets/widgets/qmdiarea_p.h +++ b/src/widgets/widgets/qmdiarea_p.h @@ -144,7 +144,7 @@ public: QList<QMdi::Rearranger *> pendingRearrangements; QVector< QPointer<QMdiSubWindow> > pendingPlacements; QVector< QPointer<QMdiSubWindow> > childWindows; - QList<int> indicesToActivatedChildren; + QVector<int> indicesToActivatedChildren; QPointer<QMdiSubWindow> active; QPointer<QMdiSubWindow> aboutToBecomeActive; QBrush background; diff --git a/src/widgets/widgets/qmdisubwindow.cpp b/src/widgets/widgets/qmdisubwindow.cpp index 14aeb73baf..83a997dae0 100644 --- a/src/widgets/widgets/qmdisubwindow.cpp +++ b/src/widgets/widgets/qmdisubwindow.cpp @@ -1000,7 +1000,9 @@ void QMdiSubWindowPrivate::removeBaseWidget() q->setWindowModified(false); } lastChildWindowTitle.clear(); - baseWidget->setParent(0); + // QTBUG-47993: parent widget can be reset before this call + if (baseWidget->parentWidget() == q) + baseWidget->setParent(0); baseWidget = 0; isWidgetHiddenByUs = false; } @@ -2204,8 +2206,8 @@ void QMdiSubWindowPrivate::setSizeGrip(QSizeGrip *newSizeGrip) void QMdiSubWindowPrivate::setSizeGripVisible(bool visible) const { // See if we can find any size grips - QList<QSizeGrip *> sizeGrips = q_func()->findChildren<QSizeGrip *>(); - foreach (QSizeGrip *grip, sizeGrips) + const QList<QSizeGrip *> sizeGrips = q_func()->findChildren<QSizeGrip *>(); + for (QSizeGrip *grip : sizeGrips) grip->setVisible(visible); } @@ -2307,7 +2309,7 @@ void QMdiSubWindow::setWidget(QWidget *widget) return; } - if (widget == d->baseWidget) { + if (Q_UNLIKELY(widget == d->baseWidget)) { qWarning("QMdiSubWindow::setWidget: widget is already set"); return; } @@ -2505,7 +2507,7 @@ void QMdiSubWindow::setKeyboardPageStep(int step) void QMdiSubWindow::setSystemMenu(QMenu *systemMenu) { Q_D(QMdiSubWindow); - if (systemMenu && systemMenu == d->systemMenu) { + if (Q_UNLIKELY(systemMenu && systemMenu == d->systemMenu)) { qWarning("QMdiSubWindow::setSystemMenu: system menu is already set"); return; } @@ -2653,7 +2655,7 @@ void QMdiSubWindow::showShaded() resize(d->internalMinimumSize); // Hide the internal widget if not already hidden by the user. - if (d->baseWidget && !d->baseWidget->isHidden()) { + if (d->baseWidget && !d->baseWidget->isHidden() && !(windowFlags() & Qt::FramelessWindowHint)) { d->baseWidget->hide(); d->isWidgetHiddenByUs = true; } diff --git a/src/widgets/widgets/qmenu_mac.mm b/src/widgets/widgets/qmenu_mac.mm index 8b29011178..58dee37bd9 100644 --- a/src/widgets/widgets/qmenu_mac.mm +++ b/src/widgets/widgets/qmenu_mac.mm @@ -32,7 +32,7 @@ ****************************************************************************/ #import <Foundation/Foundation.h> -#import <Cocoa/Cocoa.h> +#import <AppKit/AppKit.h> #include "qmenu.h" #include "qmenubar.h" @@ -55,7 +55,7 @@ inline QPlatformNativeInterface::NativeResourceForIntegrationFunction resolvePla QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface(); QPlatformNativeInterface::NativeResourceForIntegrationFunction function = nativeInterface->nativeResourceFunctionForIntegration(functionName); - if (!function) + if (Q_UNLIKELY(!function)) qWarning() << "Qt could not resolve function" << functionName << "from QGuiApplication::platformNativeInterface()->nativeResourceFunctionForIntegration()"; return function; diff --git a/src/widgets/widgets/qplaintextedit.cpp b/src/widgets/widgets/qplaintextedit.cpp index 91788a3383..7736356700 100644 --- a/src/widgets/widgets/qplaintextedit.cpp +++ b/src/widgets/widgets/qplaintextedit.cpp @@ -1291,7 +1291,7 @@ void QPlainTextEdit::setDocument(QTextDocument *document) document->setDocumentLayout(documentLayout); } else { documentLayout = qobject_cast<QPlainTextDocumentLayout*>(document->documentLayout()); - if (!documentLayout) { + if (Q_UNLIKELY(!documentLayout)) { qWarning("QPlainTextEdit::setDocument: Document set does not support QPlainTextDocumentLayout"); return; } @@ -1851,7 +1851,7 @@ void QPlainTextEditPrivate::relayoutDocument() } } -static void fillBackground(QPainter *p, const QRectF &rect, QBrush brush, QRectF gradientRect = QRectF()) +static void fillBackground(QPainter *p, const QRectF &rect, QBrush brush, const QRectF &gradientRect = QRectF()) { p->save(); if (brush.style() >= Qt::LinearGradientPattern && brush.style() <= Qt::ConicalGradientPattern) { diff --git a/src/widgets/widgets/qscrollbar.h b/src/widgets/widgets/qscrollbar.h index 4af5fb4a55..d044ec0519 100644 --- a/src/widgets/widgets/qscrollbar.h +++ b/src/widgets/widgets/qscrollbar.h @@ -78,6 +78,13 @@ private: Q_DISABLE_COPY(QScrollBar) Q_DECLARE_PRIVATE(QScrollBar) +#ifndef QT_NO_ITEMVIEWS + friend class QTableView; + friend class QTreeViewPrivate; + friend class QCommonListViewBase; + friend class QListModeViewBase; + friend class QAbstractItemView; +#endif }; #endif // QT_NO_SCROLLBAR diff --git a/src/widgets/widgets/qspinbox.cpp b/src/widgets/widgets/qspinbox.cpp index 457e2e1e4c..13076ad870 100644 --- a/src/widgets/widgets/qspinbox.cpp +++ b/src/widgets/widgets/qspinbox.cpp @@ -438,7 +438,7 @@ void QSpinBox::setDisplayIntegerBase(int base) { Q_D(QSpinBox); // Falls back to base 10 on invalid bases (like QString) - if (base < 2 || base > 36) { + if (Q_UNLIKELY(base < 2 || base > 36)) { qWarning("QSpinBox::setDisplayIntegerBase: Invalid base (%d)", base); base = 10; } diff --git a/src/widgets/widgets/qsplitter.cpp b/src/widgets/widgets/qsplitter.cpp index c2081c15f8..9162ba3c12 100644 --- a/src/widgets/widgets/qsplitter.cpp +++ b/src/widgets/widgets/qsplitter.cpp @@ -1058,7 +1058,7 @@ void QSplitter::setCollapsible(int index, bool collapse) { Q_D(QSplitter); - if (index < 0 || index >= d->list.size()) { + if (Q_UNLIKELY(index < 0 || index >= d->list.size())) { qWarning("QSplitter::setCollapsible: Index %d out of range", index); return; } @@ -1071,7 +1071,7 @@ void QSplitter::setCollapsible(int index, bool collapse) bool QSplitter::isCollapsible(int index) const { Q_D(const QSplitter); - if (index < 0 || index >= d->list.size()) { + if (Q_UNLIKELY(index < 0 || index >= d->list.size())) { qWarning("QSplitter::isCollapsible: Index %d out of range", index); return false; } @@ -1215,7 +1215,7 @@ void QSplitter::childEvent(QChildEvent *c) { Q_D(QSplitter); if (!c->child()->isWidgetType()) { - if (c->type() == QEvent::ChildAdded && qobject_cast<QLayout *>(c->child())) + if (Q_UNLIKELY(c->type() == QEvent::ChildAdded && qobject_cast<QLayout *>(c->child()))) qWarning("Adding a QLayout to a QSplitter is not supported."); return; } diff --git a/src/widgets/widgets/qstackedwidget.cpp b/src/widgets/widgets/qstackedwidget.cpp index 19a2edf0f2..8a2eff4e39 100644 --- a/src/widgets/widgets/qstackedwidget.cpp +++ b/src/widgets/widgets/qstackedwidget.cpp @@ -237,7 +237,7 @@ QWidget *QStackedWidget::currentWidget() const void QStackedWidget::setCurrentWidget(QWidget *widget) { Q_D(QStackedWidget); - if (d->layout->indexOf(widget) == -1) { + if (Q_UNLIKELY(d->layout->indexOf(widget) == -1)) { qWarning("QStackedWidget::setCurrentWidget: widget %p not contained in stack", widget); return; } diff --git a/src/widgets/widgets/qstatusbar.cpp b/src/widgets/widgets/qstatusbar.cpp index 19361fc793..2e8ca8510b 100644 --- a/src/widgets/widgets/qstatusbar.cpp +++ b/src/widgets/widgets/qstatusbar.cpp @@ -296,7 +296,7 @@ int QStatusBar::insertWidget(int index, QWidget *widget, int stretch) QStatusBarPrivate::SBItem* item = new QStatusBarPrivate::SBItem(widget, stretch, false); int idx = d->indexToLastNonPermanentWidget(); - if (index < 0 || index > d->items.size() || (idx >= 0 && index > idx + 1)) { + if (Q_UNLIKELY(index < 0 || index > d->items.size() || (idx >= 0 && index > idx + 1))) { qWarning("QStatusBar::insertWidget: Index out of range (%d), appending widget", index); index = idx + 1; } @@ -361,7 +361,7 @@ int QStatusBar::insertPermanentWidget(int index, QWidget *widget, int stretch) QStatusBarPrivate::SBItem* item = new QStatusBarPrivate::SBItem(widget, stretch, true); int idx = d->indexToLastNonPermanentWidget(); - if (index < 0 || index > d->items.size() || (idx >= 0 && index <= idx)) { + if (Q_UNLIKELY(index < 0 || index > d->items.size() || (idx >= 0 && index <= idx))) { qWarning("QStatusBar::insertPermanentWidget: Index out of range (%d), appending widget", index); index = d->items.size(); } diff --git a/src/widgets/widgets/qtabbar.cpp b/src/widgets/widgets/qtabbar.cpp index 7ea5455bf7..d2d737059e 100644 --- a/src/widgets/widgets/qtabbar.cpp +++ b/src/widgets/widgets/qtabbar.cpp @@ -348,13 +348,6 @@ void QTabBar::initStyleOption(QStyleOptionTab *option, int tabIndex) const \since 5.2 */ -int QTabBarPrivate::extraWidth() const -{ - Q_Q(const QTabBar); - return 2 * qMax(q->style()->pixelMetric(QStyle::PM_TabBarScrollButtonWidth, 0, q), - QApplication::globalStrut().width()); -} - void QTabBarPrivate::init() { Q_Q(QTabBar); @@ -408,7 +401,6 @@ int QTabBarPrivate::indexAtPos(const QPoint &p) const void QTabBarPrivate::layoutTabs() { Q_Q(QTabBar); - scrollOffset = 0; layoutDirty = false; QSize size = q->size(); int last, available; @@ -508,39 +500,48 @@ void QTabBarPrivate::layoutTabs() } if (useScrollButtons && tabList.count() && last > available) { - int extra = extraWidth(); - if (!vertTabs) { - Qt::LayoutDirection ld = q->layoutDirection(); - QRect arrows = QStyle::visualRect(ld, q->rect(), - QRect(available - extra, 0, extra, size.height())); - int buttonOverlap = q->style()->pixelMetric(QStyle::PM_TabBar_ScrollButtonOverlap, 0, q); - - if (ld == Qt::LeftToRight) { - leftB->setGeometry(arrows.left(), arrows.top(), extra/2, arrows.height()); - rightB->setGeometry(arrows.right() - extra/2 + buttonOverlap, arrows.top(), - extra/2, arrows.height()); - leftB->setArrowType(Qt::LeftArrow); - rightB->setArrowType(Qt::RightArrow); - } else { - rightB->setGeometry(arrows.left(), arrows.top(), extra/2, arrows.height()); - leftB->setGeometry(arrows.right() - extra/2 + buttonOverlap, arrows.top(), - extra/2, arrows.height()); - rightB->setArrowType(Qt::LeftArrow); - leftB->setArrowType(Qt::RightArrow); - } - } else { - QRect arrows = QRect(0, available - extra, size.width(), extra ); - leftB->setGeometry(arrows.left(), arrows.top(), arrows.width(), extra/2); + const QRect scrollRect = normalizedScrollRect(0); + scrollOffset = -scrollRect.left(); + + Q_Q(QTabBar); + QStyleOption opt; + opt.init(q); + QRect scrollButtonLeftRect = q->style()->subElementRect(QStyle::SE_TabBarScrollLeftButton, &opt, q); + QRect scrollButtonRightRect = q->style()->subElementRect(QStyle::SE_TabBarScrollRightButton, &opt, q); + int scrollButtonWidth = q->style()->pixelMetric(QStyle::PM_TabBarScrollButtonWidth, &opt, q); + + // Normally SE_TabBarScrollLeftButton should have the same width as PM_TabBarScrollButtonWidth. + // But if that is not the case, we set the actual button width to PM_TabBarScrollButtonWidth, and + // use the extra space from SE_TabBarScrollLeftButton as margins towards the tabs. + if (vertTabs) { + scrollButtonLeftRect.setHeight(scrollButtonWidth); + scrollButtonRightRect.setY(scrollButtonRightRect.bottom() + 1 - scrollButtonWidth); + scrollButtonRightRect.setHeight(scrollButtonWidth); leftB->setArrowType(Qt::UpArrow); - rightB->setGeometry(arrows.left(), arrows.bottom() - extra/2 + 1, - arrows.width(), extra/2); rightB->setArrowType(Qt::DownArrow); + } else if (q->layoutDirection() == Qt::RightToLeft) { + scrollButtonRightRect.setWidth(scrollButtonWidth); + scrollButtonLeftRect.setX(scrollButtonLeftRect.right() + 1 - scrollButtonWidth); + scrollButtonLeftRect.setWidth(scrollButtonWidth); + leftB->setArrowType(Qt::RightArrow); + rightB->setArrowType(Qt::LeftArrow); + } else { + scrollButtonLeftRect.setWidth(scrollButtonWidth); + scrollButtonRightRect.setX(scrollButtonRightRect.right() + 1 - scrollButtonWidth); + scrollButtonRightRect.setWidth(scrollButtonWidth); + leftB->setArrowType(Qt::LeftArrow); + rightB->setArrowType(Qt::RightArrow); } - leftB->setEnabled(scrollOffset > 0); - rightB->setEnabled(last - scrollOffset >= available - extra); + + leftB->setGeometry(scrollButtonLeftRect); + leftB->setEnabled(false); leftB->show(); + + rightB->setGeometry(scrollButtonRightRect); + rightB->setEnabled(last - scrollOffset > scrollRect.x() + scrollRect.width()); rightB->show(); } else { + scrollOffset = 0; rightB->hide(); leftB->hide(); } @@ -549,6 +550,81 @@ void QTabBarPrivate::layoutTabs() q->tabLayoutChange(); } +QRect QTabBarPrivate::normalizedScrollRect(int index) +{ + // "Normalized scroll rect" means return the free space on the tab bar + // that doesn't overlap with scroll buttons or tear indicators, and + // always return the rect as horizontal Qt::LeftToRight, even if the + // tab bar itself is in a different orientation. + + Q_Q(QTabBar); + QStyleOptionTab opt; + q->initStyleOption(&opt, currentIndex); + opt.rect = q->rect(); + + QRect scrollButtonLeftRect = q->style()->subElementRect(QStyle::SE_TabBarScrollLeftButton, &opt, q); + QRect scrollButtonRightRect = q->style()->subElementRect(QStyle::SE_TabBarScrollRightButton, &opt, q); + QRect tearLeftRect = q->style()->subElementRect(QStyle::SE_TabBarTearIndicatorLeft, &opt, q); + QRect tearRightRect = q->style()->subElementRect(QStyle::SE_TabBarTearIndicatorRight, &opt, q); + + if (verticalTabs(shape)) { + int topEdge, bottomEdge; + bool leftButtonIsOnTop = scrollButtonLeftRect.y() < q->height() / 2; + bool rightButtonIsOnTop = scrollButtonRightRect.y() < q->height() / 2; + + if (leftButtonIsOnTop && rightButtonIsOnTop) { + topEdge = scrollButtonRightRect.bottom() + 1; + bottomEdge = q->height(); + } else if (!leftButtonIsOnTop && !rightButtonIsOnTop) { + topEdge = 0; + bottomEdge = scrollButtonLeftRect.top(); + } else { + topEdge = scrollButtonLeftRect.bottom() + 1; + bottomEdge = scrollButtonRightRect.top(); + } + + bool tearTopVisible = index != 0 && topEdge != -scrollOffset; + bool tearBottomVisible = index != tabList.size() - 1 && bottomEdge != tabList.last().rect.bottom() + 1 - scrollOffset; + if (tearTopVisible && !tearLeftRect.isNull()) + topEdge = tearLeftRect.bottom() + 1; + if (tearBottomVisible && !tearRightRect.isNull()) + bottomEdge = tearRightRect.top(); + + return QRect(topEdge, 0, bottomEdge - topEdge, q->height()); + } else { + if (q->layoutDirection() == Qt::RightToLeft) { + scrollButtonLeftRect = QStyle::visualRect(Qt::RightToLeft, q->rect(), scrollButtonLeftRect); + scrollButtonRightRect = QStyle::visualRect(Qt::RightToLeft, q->rect(), scrollButtonRightRect); + tearLeftRect = QStyle::visualRect(Qt::RightToLeft, q->rect(), tearLeftRect); + tearRightRect = QStyle::visualRect(Qt::RightToLeft, q->rect(), tearRightRect); + } + + int leftEdge, rightEdge; + bool leftButtonIsOnLeftSide = scrollButtonLeftRect.x() < q->width() / 2; + bool rightButtonIsOnLeftSide = scrollButtonRightRect.x() < q->width() / 2; + + if (leftButtonIsOnLeftSide && rightButtonIsOnLeftSide) { + leftEdge = scrollButtonRightRect.right() + 1; + rightEdge = q->width(); + } else if (!leftButtonIsOnLeftSide && !rightButtonIsOnLeftSide) { + leftEdge = 0; + rightEdge = scrollButtonLeftRect.left(); + } else { + leftEdge = scrollButtonLeftRect.right() + 1; + rightEdge = scrollButtonRightRect.left(); + } + + bool tearLeftVisible = index != 0 && leftEdge != -scrollOffset; + bool tearRightVisible = index != tabList.size() - 1 && rightEdge != tabList.last().rect.right() + 1 - scrollOffset; + if (tearLeftVisible && !tearLeftRect.isNull()) + leftEdge = tearLeftRect.right() + 1; + if (tearRightVisible && !tearRightRect.isNull()) + rightEdge = tearRightRect.left(); + + return QRect(leftEdge, 0, rightEdge - leftEdge, q->height()); + } +} + void QTabBarPrivate::makeVisible(int index) { Q_Q(QTabBar); @@ -558,17 +634,24 @@ void QTabBarPrivate::makeVisible(int index) const QRect tabRect = tabList.at(index).rect; const int oldScrollOffset = scrollOffset; const bool horiz = !verticalTabs(shape); - const int available = (horiz ? q->width() : q->height()) - extraWidth(); - const int start = horiz ? tabRect.left() : tabRect.top(); - const int end = horiz ? tabRect.right() : tabRect.bottom(); - if (start < scrollOffset) // too far left - scrollOffset = start - (index ? 8 : 0); - else if (end > scrollOffset + available) // too far right - scrollOffset = end - available + 1; - - leftB->setEnabled(scrollOffset > 0); - const int last = horiz ? tabList.last().rect.right() : tabList.last().rect.bottom(); - rightB->setEnabled(last - scrollOffset >= available); + const int tabStart = horiz ? tabRect.left() : tabRect.top(); + const int tabEnd = horiz ? tabRect.right() : tabRect.bottom(); + const int lastTabEnd = horiz ? tabList.last().rect.right() : tabList.last().rect.bottom(); + const QRect scrollRect = normalizedScrollRect(index); + const int scrolledTabBarStart = qMax(1, scrollRect.left() + scrollOffset); + const int scrolledTabBarEnd = qMin(lastTabEnd - 1, scrollRect.right() + scrollOffset); + + if (tabStart < scrolledTabBarStart) { + // Tab is outside on the left, so scroll left. + scrollOffset = tabStart - scrollRect.left(); + } else if (tabEnd > scrolledTabBarEnd) { + // Tab is outside on the right, so scroll right. + scrollOffset = tabEnd - scrollRect.right(); + } + + leftB->setEnabled(scrollOffset > -scrollRect.left()); + rightB->setEnabled(scrollOffset < lastTabEnd - scrollRect.right()); + if (oldScrollOffset != scrollOffset) { q->update(); layoutWidgets(); @@ -664,39 +747,24 @@ void QTabBarPrivate::_q_scrollTabs() { Q_Q(QTabBar); const QObject *sender = q->sender(); + const bool horizontal = !verticalTabs(shape); + const QRect scrollRect = normalizedScrollRect(); int i = -1; - if (!verticalTabs(shape)) { - if (sender == leftB) { - for (i = tabList.count() - 1; i >= 0; --i) { - if (tabList.at(i).rect.left() - scrollOffset < 0) { - makeVisible(i); - return; - } - } - } else if (sender == rightB) { - int availableWidth = q->width() - extraWidth(); - for (i = 0; i < tabList.count(); ++i) { - if (tabList.at(i).rect.right() - scrollOffset > availableWidth) { - makeVisible(i); - return; - } + + if (sender == leftB) { + for (i = tabList.count() - 1; i >= 0; --i) { + int start = horizontal ? tabList.at(i).rect.left() : tabList.at(i).rect.top(); + if (start < scrollRect.left() + scrollOffset) { + makeVisible(i); + return; } } - } else { // vertical - if (sender == leftB) { - for (i = tabList.count() - 1; i >= 0; --i) { - if (tabList.at(i).rect.top() - scrollOffset < 0) { - makeVisible(i); - return; - } - } - } else if (sender == rightB) { - int available = q->height() - extraWidth(); - for (i = 0; i < tabList.count(); ++i) { - if (tabList.at(i).rect.bottom() - scrollOffset > available) { - makeVisible(i); - return; - } + } else if (sender == rightB) { + for (i = 0; i < tabList.count(); ++i) { + int end = horizontal ? tabList.at(i).rect.right() : tabList.at(i).rect.bottom(); + if (end > scrollRect.right() + scrollOffset) { + makeVisible(i); + return; } } } @@ -1571,13 +1639,15 @@ void QTabBar::paintEvent(QPaintEvent *) QStylePainter p(this); int selected = -1; - int cut = -1; - bool rtl = optTabBase.direction == Qt::RightToLeft; + int cutLeft = -1; + int cutRight = -1; bool vertical = verticalTabs(d->shape); - QStyleOptionTab cutTab; + QStyleOptionTab cutTabLeft; + QStyleOptionTab cutTabRight; selected = d->currentIndex; if (d->dragInProgress) selected = d->pressedIndex; + const QRect scrollRect = d->normalizedScrollRect(); for (int i = 0; i < d->tabList.count(); ++i) optTabBase.tabBarRect |= tabRect(i); @@ -1600,13 +1670,20 @@ void QTabBar::paintEvent(QPaintEvent *) if (!(tab.state & QStyle::State_Enabled)) { tab.palette.setCurrentColorGroup(QPalette::Disabled); } + // If this tab is partially obscured, make a note of it so that we can pass the information // along when we draw the tear. - if (((!vertical && (!rtl && tab.rect.left() < 0)) || (rtl && tab.rect.right() > width())) - || (vertical && tab.rect.top() < 0)) { - cut = i; - cutTab = tab; + QRect tabRect = d->tabList[i].rect; + int tabStart = vertical ? tabRect.top() : tabRect.left(); + int tabEnd = vertical ? tabRect.bottom() : tabRect.right(); + if (tabStart < scrollRect.left() + d->scrollOffset) { + cutLeft = i; + cutTabLeft = tab; + } else if (tabEnd > scrollRect.right() + d->scrollOffset) { + cutRight = i; + cutTabRight = tab; } + // Don't bother drawing a tab if the entire tab is outside of the visible tab bar. if ((!vertical && (tab.rect.right() < 0 || tab.rect.left() > width())) || (vertical && (tab.rect.bottom() < 0 || tab.rect.top() > height()))) @@ -1638,10 +1715,16 @@ void QTabBar::paintEvent(QPaintEvent *) } // Only draw the tear indicator if necessary. Most of the time we don't need too. - if (d->leftB->isVisible() && cut >= 0) { - cutTab.rect = rect(); - cutTab.rect = style()->subElementRect(QStyle::SE_TabBarTearIndicator, &cutTab, this); - p.drawPrimitive(QStyle::PE_IndicatorTabTear, cutTab); + if (d->leftB->isVisible() && cutLeft >= 0) { + cutTabLeft.rect = rect(); + cutTabLeft.rect = style()->subElementRect(QStyle::SE_TabBarTearIndicatorLeft, &cutTabLeft, this); + p.drawPrimitive(QStyle::PE_IndicatorTabTearLeft, cutTabLeft); + } + + if (d->rightB->isVisible() && cutRight >= 0) { + cutTabRight.rect = rect(); + cutTabRight.rect = style()->subElementRect(QStyle::SE_TabBarTearIndicatorRight, &cutTabRight, this); + p.drawPrimitive(QStyle::PE_IndicatorTabTearRight, cutTabRight); } } diff --git a/src/widgets/widgets/qtabbar_p.h b/src/widgets/widgets/qtabbar_p.h index 38a3c138cc..99b51199ed 100644 --- a/src/widgets/widgets/qtabbar_p.h +++ b/src/widgets/widgets/qtabbar_p.h @@ -150,7 +150,6 @@ public: int calculateNewPosition(int from, int to, int index) const; void slide(int from, int to); void init(); - int extraWidth() const; Tab *at(int index); const Tab *at(int index) const; @@ -178,6 +177,7 @@ public: bool isTabInMacUnifiedToolbarArea() const; void setupMovableTab(); void autoHideTabs(); + QRect normalizedScrollRect(int index = -1); void makeVisible(int index); QSize iconSize; @@ -248,7 +248,7 @@ class CloseButton : public QAbstractButton Q_OBJECT public: - CloseButton(QWidget *parent = 0); + explicit CloseButton(QWidget *parent = 0); QSize sizeHint() const Q_DECL_OVERRIDE; QSize minimumSizeHint() const Q_DECL_OVERRIDE diff --git a/src/widgets/widgets/qtextbrowser.cpp b/src/widgets/widgets/qtextbrowser.cpp index 2c073342b0..e88e280c16 100644 --- a/src/widgets/widgets/qtextbrowser.cpp +++ b/src/widgets/widgets/qtextbrowser.cpp @@ -93,7 +93,7 @@ public: HistoryEntry createHistoryEntry() const; - void restoreHistoryEntry(const HistoryEntry entry); + void restoreHistoryEntry(const HistoryEntry &entry); QStack<HistoryEntry> stack; QStack<HistoryEntry> forwardStack; @@ -292,7 +292,7 @@ void QTextBrowserPrivate::setSource(const QUrl &url) txt = data.toString(); #endif } - if (txt.isEmpty()) + if (Q_UNLIKELY(txt.isEmpty())) qWarning("QTextBrowser: No document for %s", url.toString().toLatin1().constData()); if (q->isVisible()) { @@ -554,7 +554,7 @@ QTextBrowserPrivate::HistoryEntry QTextBrowserPrivate::createHistoryEntry() cons return entry; } -void QTextBrowserPrivate::restoreHistoryEntry(const HistoryEntry entry) +void QTextBrowserPrivate::restoreHistoryEntry(const HistoryEntry &entry) { setSource(entry.url); hbar->setValue(entry.hpos); diff --git a/src/widgets/widgets/qtextedit.cpp b/src/widgets/widgets/qtextedit.cpp index 7439005b92..ba6db2971a 100644 --- a/src/widgets/widgets/qtextedit.cpp +++ b/src/widgets/widgets/qtextedit.cpp @@ -1060,6 +1060,8 @@ bool QTextEdit::event(QEvent *e) || e->type() == QEvent::ToolTip) { d->sendControlEvent(e); } +#else + Q_UNUSED(d) #endif // QT_NO_CONTEXTMENU #ifdef QT_KEYPAD_NAVIGATION if (e->type() == QEvent::EnterEditFocus || e->type() == QEvent::LeaveEditFocus) { diff --git a/src/widgets/widgets/qtoolbararealayout.cpp b/src/widgets/widgets/qtoolbararealayout.cpp index 16b1115dd6..b5379f594c 100644 --- a/src/widgets/widgets/qtoolbararealayout.cpp +++ b/src/widgets/widgets/qtoolbararealayout.cpp @@ -1128,7 +1128,7 @@ QRect QToolBarAreaLayout::itemRect(const QList<int> &path) const QLayoutItem *QToolBarAreaLayout::plug(const QList<int> &path) { QToolBarAreaLayoutItem *item = this->item(path); - if (!item) { + if (Q_UNLIKELY(!item)) { qWarning() << "No item at" << path; return 0; } @@ -1260,7 +1260,7 @@ void QToolBarAreaLayout::saveState(QDataStream &stream) const const QToolBarAreaLayoutItem &item = line.toolBarItems.at(k); QWidget *widget = const_cast<QLayoutItem*>(item.widgetItem)->widget(); QString objectName = widget->objectName(); - if (objectName.isEmpty()) { + if (Q_UNLIKELY(objectName.isEmpty())) { qWarning("QMainWindow::saveState(): 'objectName' not set for QToolBar %p '%s'", widget, widget->windowTitle().toLocal8Bit().constData()); } diff --git a/src/widgets/widgets/qtoolbox.cpp b/src/widgets/widgets/qtoolbox.cpp index beb70f1283..a37747e138 100644 --- a/src/widgets/widgets/qtoolbox.cpp +++ b/src/widgets/widgets/qtoolbox.cpp @@ -521,10 +521,10 @@ QWidget * QToolBox::currentWidget() const void QToolBox::setCurrentWidget(QWidget *widget) { int i = indexOf(widget); - if (i >= 0) - setCurrentIndex(i); - else + if (Q_UNLIKELY(i < 0)) qWarning("QToolBox::setCurrentWidget: widget not contained in tool box"); + else + setCurrentIndex(i); } /*! diff --git a/src/widgets/widgets/qwidgetanimator.cpp b/src/widgets/widgets/qwidgetanimator.cpp index 2bed11289f..3dc0e9a673 100644 --- a/src/widgets/widgets/qwidgetanimator.cpp +++ b/src/widgets/widgets/qwidgetanimator.cpp @@ -47,8 +47,8 @@ QWidgetAnimator::QWidgetAnimator(QMainWindowLayout *layout) : m_mainWindowLayout void QWidgetAnimator::abort(QWidget *w) { #ifndef QT_NO_ANIMATION - AnimationMap::iterator it = m_animation_map.find(w); - if (it == m_animation_map.end()) + const auto it = m_animation_map.constFind(w); + if (it == m_animation_map.cend()) return; QPropertyAnimation *anim = *it; m_animation_map.erase(it); diff --git a/src/widgets/widgets/qwidgetlinecontrol.cpp b/src/widgets/widgets/qwidgetlinecontrol.cpp index 436937be72..42cd51eca7 100644 --- a/src/widgets/widgets/qwidgetlinecontrol.cpp +++ b/src/widgets/widgets/qwidgetlinecontrol.cpp @@ -147,10 +147,7 @@ void QWidgetLineControl::copy(QClipboard::Mode mode) const { QString t = selectedText(); if (!t.isEmpty() && m_echoMode == QLineEdit::Normal) { - disconnect(QApplication::clipboard(), SIGNAL(selectionChanged()), this, 0); QApplication::clipboard()->setText(t, mode); - connect(QApplication::clipboard(), SIGNAL(selectionChanged()), - this, SLOT(_q_clipboardChanged())); } } @@ -309,7 +306,7 @@ void QWidgetLineControl::setSelection(int start, int length) { commitPreedit(); - if(start < 0 || start > (int)m_text.length()){ + if (Q_UNLIKELY(start < 0 || start > m_text.size())) { qWarning("QWidgetLineControl::setSelection: Invalid start position"); return; } @@ -339,10 +336,6 @@ void QWidgetLineControl::setSelection(int start, int length) emitCursorPositionChanged(); } -void QWidgetLineControl::_q_clipboardChanged() -{ -} - void QWidgetLineControl::_q_deleteSelected() { if (!hasSelectedText()) @@ -1523,14 +1516,7 @@ void QWidgetLineControl::timerEvent(QTimerEvent *event) #ifndef QT_NO_SHORTCUT void QWidgetLineControl::processShortcutOverrideEvent(QKeyEvent *ke) { - if (isReadOnly()) - return; - if (ke == QKeySequence::Copy - || ke == QKeySequence::Paste - || ke == QKeySequence::Cut - || ke == QKeySequence::Redo - || ke == QKeySequence::Undo || ke == QKeySequence::MoveToNextWord || ke == QKeySequence::MoveToPreviousWord || ke == QKeySequence::MoveToEndOfLine @@ -1544,22 +1530,35 @@ void QWidgetLineControl::processShortcutOverrideEvent(QKeyEvent *ke) || ke == QKeySequence::SelectEndOfBlock || ke == QKeySequence::SelectStartOfDocument || ke == QKeySequence::SelectAll - || ke == QKeySequence::SelectEndOfDocument - || ke == QKeySequence::DeleteCompleteLine) { + || ke == QKeySequence::SelectEndOfDocument) { ke->accept(); + } else if (ke == QKeySequence::Paste + || ke == QKeySequence::Cut + || ke == QKeySequence::Redo + || ke == QKeySequence::Undo + || ke == QKeySequence::DeleteCompleteLine) { + if (!isReadOnly()) + ke->accept(); } else if (ke->modifiers() == Qt::NoModifier || ke->modifiers() == Qt::ShiftModifier || ke->modifiers() == Qt::KeypadModifier) { if (ke->key() < Qt::Key_Escape) { - ke->accept(); + if (!isReadOnly()) + ke->accept(); } else { switch (ke->key()) { case Qt::Key_Delete: + case Qt::Key_Backspace: + if (!isReadOnly()) + ke->accept(); + break; + case Qt::Key_Home: case Qt::Key_End: - case Qt::Key_Backspace: case Qt::Key_Left: case Qt::Key_Right: ke->accept(); + break; + default: break; } diff --git a/src/widgets/widgets/qwidgetlinecontrol_p.h b/src/widgets/widgets/qwidgetlinecontrol_p.h index 039453f0d5..1ba7e659f6 100644 --- a/src/widgets/widgets/qwidgetlinecontrol_p.h +++ b/src/widgets/widgets/qwidgetlinecontrol_p.h @@ -535,7 +535,6 @@ protected: virtual void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE; private Q_SLOTS: - void _q_clipboardChanged(); void _q_deleteSelected(); private: diff --git a/src/widgets/widgets/qwidgettextcontrol.cpp b/src/widgets/widgets/qwidgettextcontrol.cpp index deca002bf5..1c249eee78 100644 --- a/src/widgets/widgets/qwidgettextcontrol.cpp +++ b/src/widgets/widgets/qwidgettextcontrol.cpp @@ -2401,8 +2401,8 @@ void QWidgetTextControl::setExtraSelections(const QList<QTextEdit::ExtraSelectio for (int i = 0; i < selections.count(); ++i) { const QTextEdit::ExtraSelection &sel = selections.at(i); - QHash<int, int>::iterator it = hash.find(sel.cursor.anchor()); - if (it != hash.end()) { + const auto it = hash.constFind(sel.cursor.anchor()); + if (it != hash.cend()) { const QAbstractTextDocumentLayout::Selection &esel = d->extraSelections.at(it.value()); if (esel.cursor.position() == sel.cursor.position() && esel.format == sel.format) { |