diff options
author | Richard Moe Gustavsen <richard.gustavsen@qt.io> | 2020-10-02 21:09:09 +0200 |
---|---|---|
committer | Richard Moe Gustavsen <richard.gustavsen@qt.io> | 2020-10-06 14:31:09 +0200 |
commit | 5ca072446a89d89e4017b6a04cc1ea14853a9f65 (patch) | |
tree | 4ded81113fd39bcd45b2b404b51a3f7671d7534d | |
parent | b68a83595d77d9967b5296858865c6a11d1022de (diff) |
Native style, StyleItem: add property 'minimumSize'
Some items, like the scrollbar handle, can scale
the handle down to 0 if no minimumSize is set. This
will truncate the image drawn by QStyle.
This patch will expose the minimum size read from
QStyle to the QML control. We can then set
ScrollBar.minimumSize to the correct value.
Change-Id: Ib87e3ca7ea661bf41ab8057941fec7364b606177
Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
-rw-r--r-- | src/imports/nativestyle/controls/DefaultScrollBar.qml | 6 | ||||
-rw-r--r-- | src/imports/nativestyle/items/qquickstyleitem.cpp | 10 | ||||
-rw-r--r-- | src/imports/nativestyle/items/qquickstyleitem.h | 3 |
3 files changed, 17 insertions, 2 deletions
diff --git a/src/imports/nativestyle/controls/DefaultScrollBar.qml b/src/imports/nativestyle/controls/DefaultScrollBar.qml index 9965b8cb..4ba4f80c 100644 --- a/src/imports/nativestyle/controls/DefaultScrollBar.qml +++ b/src/imports/nativestyle/controls/DefaultScrollBar.qml @@ -42,16 +42,18 @@ import QtQuick.NativeStyle as NativeStyle T.ScrollBar { id: control - readonly property bool __nativeBackground: background instanceof NativeStyle.StyleItem + readonly property bool __nativeContentItem: contentItem instanceof NativeStyle.StyleItem implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset, implicitContentWidth + leftPadding + rightPadding) implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset, implicitContentHeight + topPadding + bottomPadding) - font.pixelSize: __nativeBackground ? background.styleFont(control).pixelSize : undefined + font.pixelSize: __nativeContentItem ? contentItem.styleFont(control).pixelSize : undefined visible: policy === T.ScrollBar.AlwaysOn || size < 1.0 + minimumSize: !__nativeContentItem ? 10 : orientation === Qt.Vertical ? + contentItem.minimumSize.height / height : contentItem.minimumSize.width / width background: NativeStyle.ScrollBar { control: control diff --git a/src/imports/nativestyle/items/qquickstyleitem.cpp b/src/imports/nativestyle/items/qquickstyleitem.cpp index 4c84bf9a..643b190e 100644 --- a/src/imports/nativestyle/items/qquickstyleitem.cpp +++ b/src/imports/nativestyle/items/qquickstyleitem.cpp @@ -226,6 +226,7 @@ void QQuickStyleItem::updateGeometry() const QQuickStyleMargins oldContentPadding = contentPadding(); const QQuickStyleMargins oldLayoutMargins = layoutMargins(); + const QSize oldMinimumSize = minimumSize(); m_styleItemGeometry = calculateGeometry(); @@ -245,6 +246,8 @@ void QQuickStyleItem::updateGeometry() emit contentPaddingChanged(); if (layoutMargins() != oldLayoutMargins) emit layoutMarginsChanged(); + if (minimumSize() != oldMinimumSize) + emit minimumSizeChanged(); setImplicitSize(m_styleItemGeometry.implicitSize.width(), m_styleItemGeometry.implicitSize.height()); @@ -437,6 +440,13 @@ QQuickStyleMargins QQuickStyleItem::layoutMargins() const return QQuickStyleMargins(outerRect, m_styleItemGeometry.layoutRect); } +QSize QQuickStyleItem::minimumSize() +{ + // The style item should not be scaled below this size. + // Otherwise the image will be truncated. + return m_styleItemGeometry.minimumSize; +} + qreal QQuickStyleItem::focusFrameRadius() const { return m_styleItemGeometry.focusFrameRadius; diff --git a/src/imports/nativestyle/items/qquickstyleitem.h b/src/imports/nativestyle/items/qquickstyleitem.h index bfdabb79..ece2572d 100644 --- a/src/imports/nativestyle/items/qquickstyleitem.h +++ b/src/imports/nativestyle/items/qquickstyleitem.h @@ -167,6 +167,7 @@ class QQuickStyleItem : public QQuickItem // Output Q_PROPERTY(QQuickStyleMargins contentPadding READ contentPadding() NOTIFY contentPaddingChanged) Q_PROPERTY(QQuickStyleMargins layoutMargins READ layoutMargins() NOTIFY layoutMarginsChanged) + Q_PROPERTY(QSize minimumSize READ minimumSize() NOTIFY minimumSizeChanged) QML_NAMED_ELEMENT(StyleItem) QML_UNCREATABLE("StyleItem is an abstract base class.") @@ -214,6 +215,7 @@ public: QQuickStyleMargins contentPadding() const; QQuickStyleMargins layoutMargins() const; + QSize minimumSize(); qreal focusFrameRadius() const; Q_INVOKABLE virtual QFont styleFont(QQuickItem *control); @@ -226,6 +228,7 @@ signals: void contentPaddingChanged(); void layoutMarginsChanged(); void fontChanged(); + void minimumSizeChanged(); protected: void componentComplete() override; |