diff options
author | Tor Arne Vestbø <[email protected]> | 2024-10-30 16:07:13 +0100 |
---|---|---|
committer | Tor Arne Vestbø <[email protected]> | 2025-05-18 00:37:02 +0200 |
commit | 369d975c9055d204e60f43d12f601f5e1655e7cf (patch) | |
tree | 52789d61ca442e9a11f06eef419c8708a1b47676 | |
parent | 498ae026e98ed181d1480fe5f6f2f1453a725e78 (diff) |
Add QPlatformTheme::ScrollSingleStepDistance theme hint
The hard coded value of 20 used in various QAbstractScrollArea
subclasses does not represent the default behavior on all of
our platforms. On macOS e.g. the native NSScrollView has a
default line scroll value of 10 pixels.
The default value isn't changed for macOS in this patch, as it
has to be done in coordination with other changes to make the
behavior change atomic.
Task-number: QTBUG-130667
Change-Id: I532dbd3e2e946a00f426475adfa851d35a656c1b
Reviewed-by: Shawn Rutledge <[email protected]>
-rw-r--r-- | src/gui/kernel/qplatformtheme.cpp | 6 | ||||
-rw-r--r-- | src/gui/kernel/qplatformtheme.h | 1 | ||||
-rw-r--r-- | src/widgets/graphicsview/qgraphicsview.cpp | 6 | ||||
-rw-r--r-- | src/widgets/widgets/qabstractscrollarea.cpp | 9 | ||||
-rw-r--r-- | src/widgets/widgets/qabstractscrollarea_p.h | 2 | ||||
-rw-r--r-- | src/widgets/widgets/qmdiarea.cpp | 6 | ||||
-rw-r--r-- | src/widgets/widgets/qplaintextedit.cpp | 2 | ||||
-rw-r--r-- | src/widgets/widgets/qscrollarea.cpp | 12 | ||||
-rw-r--r-- | src/widgets/widgets/qtextedit.cpp | 5 |
9 files changed, 34 insertions, 15 deletions
diff --git a/src/gui/kernel/qplatformtheme.cpp b/src/gui/kernel/qplatformtheme.cpp index d9584a202e0..1be5fbd8b6d 100644 --- a/src/gui/kernel/qplatformtheme.cpp +++ b/src/gui/kernel/qplatformtheme.cpp @@ -158,6 +158,10 @@ QT_BEGIN_NAMESPACE \value MouseCursorSize (QSize) Size of the mouse cursor. This enum value has been added in Qt 6.5. + \value ScrollSingleStepDistance (int) The distance in logical pixels that scrollable + controls should scroll in response to a single step (e.g. scroll-bar arrow click, + mouse wheel line). + \sa themeHint(), QStyle::pixelMetric() */ @@ -710,6 +714,8 @@ QVariant QPlatformTheme::defaultThemeHint(ThemeHint hint) return false; case MenuSelectionWraps: return true; + case ScrollSingleStepDistance: + return 20; } return QVariant(); diff --git a/src/gui/kernel/qplatformtheme.h b/src/gui/kernel/qplatformtheme.h index c39d1cdcded..e07ac5195b8 100644 --- a/src/gui/kernel/qplatformtheme.h +++ b/src/gui/kernel/qplatformtheme.h @@ -100,6 +100,7 @@ public: ShowIconsInMenus, PreferFileIconFromTheme, MenuSelectionWraps, + ScrollSingleStepDistance, }; Q_ENUM(ThemeHint) diff --git a/src/widgets/graphicsview/qgraphicsview.cpp b/src/widgets/graphicsview/qgraphicsview.cpp index af113432ba2..35445c66bf3 100644 --- a/src/widgets/graphicsview/qgraphicsview.cpp +++ b/src/widgets/graphicsview/qgraphicsview.cpp @@ -389,6 +389,8 @@ void QGraphicsViewPrivate::recalculateContentSize() const qreal oldLeftIndent = leftIndent; const qreal oldTopIndent = topIndent; + const auto singleStep = defaultSingleStep(); + // If the whole scene fits horizontally, we center the scene horizontally, // and ignore the horizontal scroll bars. const int left = q_round_bound(viewRect.left()); @@ -413,7 +415,7 @@ void QGraphicsViewPrivate::recalculateContentSize() hbar->setRange(left, right); hbar->setPageStep(width); - hbar->setSingleStep(width / 20); + hbar->setSingleStep(width / singleStep); if (oldLeftIndent != 0) hbar->setValue(-oldLeftIndent); @@ -443,7 +445,7 @@ void QGraphicsViewPrivate::recalculateContentSize() vbar->setRange(top, bottom); vbar->setPageStep(height); - vbar->setSingleStep(height / 20); + vbar->setSingleStep(height / singleStep); if (oldTopIndent != 0) vbar->setValue(-oldTopIndent); diff --git a/src/widgets/widgets/qabstractscrollarea.cpp b/src/widgets/widgets/qabstractscrollarea.cpp index a146d4c4f90..df5886c71aa 100644 --- a/src/widgets/widgets/qabstractscrollarea.cpp +++ b/src/widgets/widgets/qabstractscrollarea.cpp @@ -24,6 +24,9 @@ #include "qscrollbar_p.h" #include <qwidget.h> +#include <private/qguiapplication_p.h> +#include <qpa/qplatformtheme.h> + #include <private/qapplication_p.h> #ifdef Q_OS_WIN @@ -1500,6 +1503,12 @@ void QAbstractScrollArea::setupViewport(QWidget *viewport) Q_UNUSED(viewport); } +int QAbstractScrollAreaPrivate::defaultSingleStep() const +{ + auto *platformTheme = QGuiApplicationPrivate::platformTheme(); + return platformTheme->themeHint(QPlatformTheme::ScrollSingleStepDistance).value<int>(); +} + QT_END_NAMESPACE #include "moc_qabstractscrollarea.cpp" diff --git a/src/widgets/widgets/qabstractscrollarea_p.h b/src/widgets/widgets/qabstractscrollarea_p.h index 7224d489cea..5530f3ee429 100644 --- a/src/widgets/widgets/qabstractscrollarea_p.h +++ b/src/widgets/widgets/qabstractscrollarea_p.h @@ -73,6 +73,8 @@ public: inline bool viewportEvent(QEvent *event) { return q_func()->viewportEvent(event); } QScopedPointer<QObject> viewportFilter; + + int defaultSingleStep() const; }; class QAbstractScrollAreaFilter : public QObject diff --git a/src/widgets/widgets/qmdiarea.cpp b/src/widgets/widgets/qmdiarea.cpp index 1c7e6a6393d..9d2c14daaea 100644 --- a/src/widgets/widgets/qmdiarea.cpp +++ b/src/widgets/widgets/qmdiarea.cpp @@ -1170,6 +1170,8 @@ void QMdiAreaPrivate::updateScrollBars() const int startX = q->isLeftToRight() ? childrenRect.left() : viewportRect.right() - childrenRect.right(); + const auto singleStep = defaultSingleStep(); + // Horizontal scroll bar. if (isSubWindowsTiled && hbar->value() != 0) hbar->setValue(0); @@ -1177,7 +1179,7 @@ void QMdiAreaPrivate::updateScrollBars() hbar->setRange(qMin(0, xOffset), qMax(0, xOffset + childrenRect.width() - viewportRect.width())); hbar->setPageStep(childrenRect.width()); - hbar->setSingleStep(childrenRect.width() / 20); + hbar->setSingleStep(childrenRect.width() / singleStep); // Vertical scroll bar. if (isSubWindowsTiled && vbar->value() != 0) @@ -1186,7 +1188,7 @@ void QMdiAreaPrivate::updateScrollBars() vbar->setRange(qMin(0, yOffset), qMax(0, yOffset + childrenRect.height() - viewportRect.height())); vbar->setPageStep(childrenRect.height()); - vbar->setSingleStep(childrenRect.height() / 20); + vbar->setSingleStep(childrenRect.height() / singleStep); } /*! diff --git a/src/widgets/widgets/qplaintextedit.cpp b/src/widgets/widgets/qplaintextedit.cpp index fb7ec9725c0..bdeba6954d3 100644 --- a/src/widgets/widgets/qplaintextedit.cpp +++ b/src/widgets/widgets/qplaintextedit.cpp @@ -781,7 +781,7 @@ void QPlainTextEditPrivate::init(const QString &txt) if (!txt.isEmpty()) control->setPlainText(txt); - hbar->setSingleStep(20); + hbar->setSingleStep(defaultSingleStep()); vbar->setSingleStep(1); viewport->setBackgroundRole(QPalette::Base); diff --git a/src/widgets/widgets/qscrollarea.cpp b/src/widgets/widgets/qscrollarea.cpp index efbf4da07fa..731f416f30e 100644 --- a/src/widgets/widgets/qscrollarea.cpp +++ b/src/widgets/widgets/qscrollarea.cpp @@ -101,13 +101,8 @@ QT_BEGIN_NAMESPACE \sa setWidget() */ QScrollArea::QScrollArea(QWidget *parent) - : QAbstractScrollArea(*new QScrollAreaPrivate,parent) + : QScrollArea(*new QScrollAreaPrivate, parent) { - Q_D(QScrollArea); - d->viewport->setBackgroundRole(QPalette::NoRole); - d->vbar->setSingleStep(20); - d->hbar->setSingleStep(20); - d->layoutChildren(); } /*! @@ -118,8 +113,9 @@ QScrollArea::QScrollArea(QScrollAreaPrivate &dd, QWidget *parent) { Q_D(QScrollArea); d->viewport->setBackgroundRole(QPalette::NoRole); - d->vbar->setSingleStep(20); - d->hbar->setSingleStep(20); + const auto singleStep = d->defaultSingleStep(); + d->vbar->setSingleStep(singleStep); + d->hbar->setSingleStep(singleStep); d->layoutChildren(); } diff --git a/src/widgets/widgets/qtextedit.cpp b/src/widgets/widgets/qtextedit.cpp index d547a41f515..2f61cdd20df 100644 --- a/src/widgets/widgets/qtextedit.cpp +++ b/src/widgets/widgets/qtextedit.cpp @@ -170,8 +170,9 @@ void QTextEditPrivate::init(const QString &html) if (!html.isEmpty()) control->setHtml(html); - hbar->setSingleStep(20); - vbar->setSingleStep(20); + const auto singleStep = defaultSingleStep(); + hbar->setSingleStep(singleStep); + vbar->setSingleStep(singleStep); viewport->setBackgroundRole(QPalette::Base); q->setMouseTracking(true); |