From 5ca072446a89d89e4017b6a04cc1ea14853a9f65 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Fri, 2 Oct 2020 21:09:09 +0200 Subject: Native style, StyleItem: add property 'minimumSize' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/imports/nativestyle/controls/DefaultScrollBar.qml | 6 ++++-- src/imports/nativestyle/items/qquickstyleitem.cpp | 10 ++++++++++ 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; -- cgit v1.2.3