diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/corelib/kernel/qassociativeiterable.h | 15 | ||||
| -rw-r--r-- | src/corelib/kernel/qsequentialiterable.h | 15 | ||||
| -rw-r--r-- | src/plugins/platforms/windows/qwindowswindow.cpp | 7 | ||||
| -rw-r--r-- | src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp | 10 | ||||
| -rw-r--r-- | src/testlib/qtest.h | 8 | ||||
| -rw-r--r-- | src/widgets/itemviews/qtreeview.cpp | 11 | ||||
| -rw-r--r-- | src/widgets/kernel/qstandardgestures.cpp | 10 | ||||
| -rw-r--r-- | src/widgets/styles/qstylesheetstyle.cpp | 77 |
8 files changed, 85 insertions, 68 deletions
diff --git a/src/corelib/kernel/qassociativeiterable.h b/src/corelib/kernel/qassociativeiterable.h index 4f9bbf67bfb..c042fe4a0ec 100644 --- a/src/corelib/kernel/qassociativeiterable.h +++ b/src/corelib/kernel/qassociativeiterable.h @@ -21,9 +21,8 @@ QT_WARNING_DISABLE_DEPRECATED Q_CORE_EXPORT QT_DEPRECATED_VERSION_X_6_15(text) #endif -class -QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaAssociation::Iterable::Iterator instead.") -QAssociativeIterator : public QIterator<QMetaAssociation> +// Keep this a single long line, otherwise syncqt doesn't create a class forwarding header +class QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaAssociation's iterables and iterators instead.") QAssociativeIterator : public QIterator<QMetaAssociation> { public: using key_type = QVariant; @@ -42,9 +41,8 @@ public: QVariantPointer<QAssociativeIterator> operator->() const; }; -class -QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaAssociation::Iterable::ConstIterator instead.") -QAssociativeConstIterator : public QConstIterator<QMetaAssociation> +// Keep this a single long line, otherwise syncqt doesn't create a class forwarding header +class QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaAssociation's iterables and iterators instead.") QAssociativeConstIterator : public QConstIterator<QMetaAssociation> { public: using key_type = QVariant; @@ -63,9 +61,8 @@ public: QVariantConstPointer operator->() const; }; -class -QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaAssociation::Iterable instead.") -QAssociativeIterable : public QIterable<QMetaAssociation> +// Keep this a single long line, otherwise syncqt doesn't create a class forwarding header +class QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaAssociation's iterables and iterators instead.") QAssociativeIterable : public QIterable<QMetaAssociation> { public: using iterator = QTaggedIterator<QAssociativeIterator, void>; diff --git a/src/corelib/kernel/qsequentialiterable.h b/src/corelib/kernel/qsequentialiterable.h index 76908bdae4b..b2e690ea9cf 100644 --- a/src/corelib/kernel/qsequentialiterable.h +++ b/src/corelib/kernel/qsequentialiterable.h @@ -21,9 +21,8 @@ QT_WARNING_DISABLE_DEPRECATED Q_CORE_EXPORT QT_DEPRECATED_VERSION_X_6_15(text) #endif -class -QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaSequence::Iterable::Iterator instead.") -QSequentialIterator : public QIterator<QMetaSequence> +// Keep this a single long line, otherwise syncqt doesn't create a class forwarding header +class QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaSequence's iterables and iterators instead.") QSequentialIterator : public QIterator<QMetaSequence> { public: using value_type = QVariant; @@ -38,9 +37,8 @@ public: QVariantPointer<QSequentialIterator> operator->() const; }; -class -QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaSequence::Iterable::ConstIterator instead.") -QSequentialConstIterator : public QConstIterator<QMetaSequence> +// Keep this a single long line, otherwise syncqt doesn't create a class forwarding header +class QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaSequence's iterables and iterators instead.") QSequentialConstIterator : public QConstIterator<QMetaSequence> { public: using value_type = QVariant; @@ -55,9 +53,8 @@ public: QVariantConstPointer operator->() const; }; -class -QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaSequence::Iterable instead.") -QSequentialIterable : public QIterable<QMetaSequence> +// Keep this a single long line, otherwise syncqt doesn't create a class forwarding header +class QT_CORE_DEPRECATED_EXPORT_VERSION_X_6_15("Use QMetaSequence's iterables and iterators instead.") QSequentialIterable : public QIterable<QMetaSequence> { public: using iterator = QTaggedIterator<QSequentialIterator, void>; diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index 9459e8bdfd3..f96f154f5b1 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -4035,10 +4035,13 @@ void QWindowsWindow::requestUpdate() // the Posted event on the GUI thread. if (m_vsyncUpdatePending.testAndSetAcquire(UpdateState::Requested, UpdateState::Posted)) { QWindowsWindow *oldSelf = this; - QMetaObject::invokeMethod(w, [w, oldSelf] { + qsizetype oldCallbackId = m_vsyncServiceCallbackId; + QMetaObject::invokeMethod(w, [w, oldSelf, oldCallbackId] { // 'oldSelf' is only used for comparison, don't access it directly! auto *self = static_cast<QWindowsWindow *>(w->handle()); - if (self && self == oldSelf) { + // NOTE: In the off chance that the window got destroyed and recreated with the + // same address, we also check that the callback id is the same. + if (self && self == oldSelf && self->m_vsyncServiceCallbackId == oldCallbackId) { // The platform window is still alive self->m_vsyncUpdatePending.storeRelease(UpdateState::Ready); self->deliverUpdateRequest(); diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp index e2f181aa628..2ea3fe38e1c 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp @@ -596,6 +596,16 @@ HRESULT QWindowsUiaMainProvider::GetPropertyValue(PROPERTYID idProp, VARIANT *pR *pRetVal = QComVariant{ accessible->text(QAccessible::Help) }.release(); break; case UIA_HasKeyboardFocusPropertyId: + // If the top-level window has no focused child, report the top-level + // widget (window). If it already has a focused widget, it will be + // reported automatically. + if (topLevelWindow) { + QAccessibleInterface *focusacc = accessible->focusChild(); + if (!focusacc) { + *pRetVal = QComVariant{ accessible->state().active ? true : false }.release(); + break; + } + } *pRetVal = QComVariant{ accessible->state().focused ? true : false }.release(); break; case UIA_IsKeyboardFocusablePropertyId: diff --git a/src/testlib/qtest.h b/src/testlib/qtest.h index 431f91d5474..10bb63040c8 100644 --- a/src/testlib/qtest.h +++ b/src/testlib/qtest.h @@ -181,16 +181,16 @@ inline bool qCompare(quint32 const &t1, quint64 const &t2, const char *actual, } namespace Internal { -template <typename T, typename = void> -struct HasInitMain : std::false_type{}; +template <typename T> +using InitMainTest = decltype(&T::initMain); template <typename T> -struct HasInitMain<T, std::void_t<decltype(&T::initMain)>> : std::true_type {}; +constexpr inline bool hasInitMain = qxp::is_detected_v<InitMainTest, T>; template<typename T> void callInitMain() { - if constexpr (HasInitMain<T>::value) + if constexpr (hasInitMain<T>) T::initMain(); } diff --git a/src/widgets/itemviews/qtreeview.cpp b/src/widgets/itemviews/qtreeview.cpp index 570566793dc..0f0496ad04d 100644 --- a/src/widgets/itemviews/qtreeview.cpp +++ b/src/widgets/itemviews/qtreeview.cpp @@ -1622,12 +1622,6 @@ void QTreeViewPrivate::calcLogicalIndices( const auto indicesCount = logicalIndices->size(); itemPositions->resize(indicesCount); for (qsizetype currentLogicalSection = 0; currentLogicalSection < indicesCount; ++currentLogicalSection) { - // shortcut, no need to calc anything more - if (indicesCount == 1 || spanning) { - (*itemPositions)[currentLogicalSection] = QStyleOptionViewItem::OnlyOne; - continue; - } - const int headerSection = logicalIndices->at(currentLogicalSection); // determine the viewItemPosition depending on the position of column 0 int nextLogicalSection = currentLogicalSection + 1 >= indicesCount ? logicalIndexAfterRight @@ -1635,8 +1629,11 @@ void QTreeViewPrivate::calcLogicalIndices( int prevLogicalSection = currentLogicalSection - 1 < 0 ? logicalIndexBeforeLeft : logicalIndices->at(currentLogicalSection - 1); + const int headerSection = logicalIndices->at(currentLogicalSection); QStyleOptionViewItem::ViewItemPosition pos; - if ((nextLogicalSection != 0 && prevLogicalSection == -1) || isTreePosition(headerSection)) + if ((nextLogicalSection == -1 && prevLogicalSection == -1) || spanning) { + pos = QStyleOptionViewItem::OnlyOne; + } else if ((nextLogicalSection != 0 && prevLogicalSection == -1) || isTreePosition(headerSection)) pos = QStyleOptionViewItem::Beginning; else if (nextLogicalSection == 0 || nextLogicalSection == -1) pos = QStyleOptionViewItem::End; diff --git a/src/widgets/kernel/qstandardgestures.cpp b/src/widgets/kernel/qstandardgestures.cpp index e9de82d2357..314d82fd64f 100644 --- a/src/widgets/kernel/qstandardgestures.cpp +++ b/src/widgets/kernel/qstandardgestures.cpp @@ -348,8 +348,14 @@ QGestureRecognizer::Result QSwipeGestureRecognizer::recognize(QGesture *state, result = QGestureRecognizer::Ignore; break; case QSwipeGesturePrivate::ThreePointsReached: - result = (ev->touchPointStates() & QEventPoint::State::Pressed) - ? QGestureRecognizer::CancelGesture : QGestureRecognizer::Ignore; + if (ev->touchPointStates() & QEventPoint::State::Pressed) { + result = QGestureRecognizer::CancelGesture; + } else if (d->verticalDirection != QSwipeGesture::NoDirection || + d->horizontalDirection != QSwipeGesture::NoDirection) { + result = QGestureRecognizer::TriggerGesture; + } else { + result = QGestureRecognizer::Ignore; + } break; } } diff --git a/src/widgets/styles/qstylesheetstyle.cpp b/src/widgets/styles/qstylesheetstyle.cpp index e0fdd56e6d8..f36bcf458d9 100644 --- a/src/widgets/styles/qstylesheetstyle.cpp +++ b/src/widgets/styles/qstylesheetstyle.cpp @@ -94,6 +94,7 @@ #endif #include <QtGui/qpainterpath.h> +#include <QtGui/qpainterstateguard.h> #include <QtGui/qscreen.h> #include <QtCore/private/qduplicatetracker_p.h> @@ -4085,29 +4086,56 @@ void QStyleSheetStyle::drawControl(ControlElement ce, const QStyleOption *opt, Q case CE_HeaderLabel: if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt)) { - QStyleOptionHeaderV2 hdr; - QStyleOptionHeader &v1Copy = hdr; - if (auto v2 = qstyleoption_cast<const QStyleOptionHeaderV2 *>(opt)) - hdr = *v2; - else - v1Copy = *header; + // Save painter state + QPainterStateGuard psGuard(p); + + QStyleOptionHeaderV2 hdr; + QStyleOptionHeader &v1Copy = hdr; + if (auto v2 = qstyleoption_cast<const QStyleOptionHeaderV2 *>(header)) + hdr = *v2; + else + v1Copy = *header; + QRenderRule subRule = renderRule(w, opt, PseudoElement_HeaderViewSection); if (hasStyleRule(w, PseudoElement_HeaderViewUpArrow) || hasStyleRule(w, PseudoElement_HeaderViewDownArrow)) { if (hdr.sortIndicator != QStyleOptionHeader::None) { + QRegion newClipRegion = QRegion(hdr.rect); const QRect arrowRect = subElementRect(SE_HeaderArrow, opt, w); - if (hdr.orientation == Qt::Horizontal) - hdr.rect.setWidth(hdr.rect.width() - arrowRect.width()); - else - hdr.rect.setHeight(hdr.rect.height() - arrowRect.height()); + const QRenderRule hrRule = renderRule(w, opt, PseudoElement_HeaderViewUpArrow); + // Clip the text to avoid overlapping with the sort arrow if + // the sort arrow is aligned to the right or left if horizontal + // or top or bottom if vertical. + if (hrRule.hasPosition()) { + const auto position = hrRule.position()->position; + if (hdr.orientation == Qt::Horizontal) { + if (position & Qt::AlignLeft) { + newClipRegion -= QRegion(arrowRect.x(), hdr.rect.y(), + arrowRect.width(), hdr.rect.height()); + } else if (position & Qt::AlignRight) { + newClipRegion -= QRegion(arrowRect.x(), hdr.rect.y(), + arrowRect.width(), hdr.rect.height()); + } + } else if (hdr.orientation == Qt::Vertical) { + if (position & Qt::AlignTop) { + newClipRegion -= QRegion(arrowRect.x(), hdr.rect.y(), + hdr.rect.width(), arrowRect.height()); + } else if (position & Qt::AlignBottom) { + newClipRegion -= QRegion(arrowRect.x(), arrowRect.y(), + hdr.rect.width(), arrowRect.height()); + } + } + } + p->setClipping(true); + p->setClipRegion(newClipRegion); } } + subRule.configurePalette(&hdr.palette, QPalette::ButtonText, QPalette::Button); + if (subRule.hasFont) { - QFont oldFont = p->font(); p->setFont(subRule.font.resolve(p->font())); ParentStyle::drawControl(ce, &hdr, p, w); - p->setFont(oldFont); } else { baseStyle()->drawControl(ce, &hdr, p, w); } @@ -5346,17 +5374,8 @@ QSize QStyleSheetStyle::sizeFromContents(ContentsType ct, const QStyleOption *op } return subRule.size(sz); } - sz = subRule.baseStyleCanDraw() ? baseStyle()->sizeFromContents(ct, opt, sz, w) - : QWindowsStyle::sizeFromContents(ct, opt, sz, w); - if (hasStyleRule(w, PseudoElement_HeaderViewDownArrow) - || hasStyleRule(w, PseudoElement_HeaderViewUpArrow)) { - const QRect arrowRect = subElementRect(SE_HeaderArrow, opt, w); - if (hdr->orientation == Qt::Horizontal) - sz.rwidth() += arrowRect.width(); - else - sz.rheight() += arrowRect.height(); - } - return sz; + return subRule.baseStyleCanDraw() ? baseStyle()->sizeFromContents(ct, opt, sz, w) + : QWindowsStyle::sizeFromContents(ct, opt, sz, w); } } break; @@ -6240,18 +6259,6 @@ QRect QStyleSheetStyle::subElementRect(SubElement se, const QStyleOption *opt, c QRenderRule subRule = renderRule(w, opt, PseudoElement_HeaderViewSection); if (subRule.hasBox() || !subRule.hasNativeBorder()) { auto r = subRule.contentsRect(opt->rect); - if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt)) { - // Subtract width needed for arrow, if there is one - if (header->sortIndicator != QStyleOptionHeader::None) { - const auto arrowRect = subElementRect(SE_HeaderArrow, opt, w); - if (arrowRect.isValid()) { - if (opt->state & State_Horizontal) - r.setWidth(r.width() - arrowRect.width()); - else - r.setHeight(r.height() - arrowRect.height()); - } - } - } return r; } } |
