diff options
author | Richard Moe Gustavsen <richard.gustavsen@qt.io> | 2020-08-26 11:02:25 +0200 |
---|---|---|
committer | Richard Moe Gustavsen <richard.gustavsen@qt.io> | 2020-08-26 09:40:45 +0000 |
commit | 2812d380e5999733aaaf2ace2bdbd0702ce293dc (patch) | |
tree | 5e986c7d33e4e550362ccb2783ab2c7e2579e690 | |
parent | e8fcd9c1388d5a070b0a4fa39783f2a5339b9d6c (diff) |
Native style: add hover effects to ScrollBar on macOS
Change-Id: I61bb0c2b1fd4dce2939bc4fe91a498a280802cb9
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
-rw-r--r-- | src/imports/controls/macos/ScrollBar.qml | 20 | ||||
-rw-r--r-- | src/imports/nativestyle/items/qquickstyleitemscrollbar.cpp | 11 | ||||
-rw-r--r-- | src/imports/nativestyle/items/qquickstyleitemscrollbar.h | 17 |
3 files changed, 48 insertions, 0 deletions
diff --git a/src/imports/controls/macos/ScrollBar.qml b/src/imports/controls/macos/ScrollBar.qml index cfd5735e..8facff8e 100644 --- a/src/imports/controls/macos/ScrollBar.qml +++ b/src/imports/controls/macos/ScrollBar.qml @@ -40,4 +40,24 @@ import QtQuick.Controls.impl 2.12 import QtQuick.NativeStyle 6.0 as NativeStyle NativeStyle.DefaultScrollBar { + id: controlRoot + + contentItem: NativeStyle.ScrollBar { + control: controlRoot + subControl: NativeStyle.ScrollBar.Handle + overrideState: NativeStyle.ScrollBar.NeverHovered + } + + NativeStyle.ScrollBar { + // Fade a hovered-looking version of the handle + // on top of the default handle when hovering it + anchors.fill: contentItem + control: controlRoot + subControl: NativeStyle.ScrollBar.Handle + overrideState: NativeStyle.ScrollBar.AlwaysHovered + opacity: controlRoot.hovered || control.pressed ? 1 : 0 + visible: contentItem instanceof NativeStyle.StyleItem + Behavior on opacity { NumberAnimation { duration: 150 } } + } + } diff --git a/src/imports/nativestyle/items/qquickstyleitemscrollbar.cpp b/src/imports/nativestyle/items/qquickstyleitemscrollbar.cpp index 7a462082..72f850a8 100644 --- a/src/imports/nativestyle/items/qquickstyleitemscrollbar.cpp +++ b/src/imports/nativestyle/items/qquickstyleitemscrollbar.cpp @@ -83,6 +83,17 @@ void QQuickStyleItemScrollBar::initStyleOption(QStyleOptionSlider &styleOption) if (scrollBar->isPressed()) styleOption.state |= QStyle::State_Sunken; +#ifdef Q_OS_MACOS + if (m_overrideState != None) { + // In ScrollBar.qml we fade between two versions of + // the handle, depending on if it's hovered or not + if (m_overrideState & AlwaysHovered) + styleOption.state |= QStyle::State_Sunken; + else if (m_overrideState & NeverHovered) + styleOption.state &= ~QStyle::State_Sunken; + } +#endif + // The following values will let the handle fill 100% of the // groove / imageSize. But when the handle is resized by // QQuickScrollBar, it will end up with the correct size visually. diff --git a/src/imports/nativestyle/items/qquickstyleitemscrollbar.h b/src/imports/nativestyle/items/qquickstyleitemscrollbar.h index e181d4ec..db241ad8 100644 --- a/src/imports/nativestyle/items/qquickstyleitemscrollbar.h +++ b/src/imports/nativestyle/items/qquickstyleitemscrollbar.h @@ -46,6 +46,10 @@ class QQuickStyleItemScrollBar : public QQuickStyleItem Q_PROPERTY(SubControl subControl MEMBER m_subControl) +#ifdef Q_OS_MACOS + Q_PROPERTY(OverrideState overrideState MEMBER m_overrideState) +#endif + QML_NAMED_ELEMENT(ScrollBar) public: @@ -55,6 +59,15 @@ public: }; Q_ENUM(SubControl) +#ifdef Q_OS_MACOS + enum OverrideState { + None = 0, + AlwaysHovered, + NeverHovered, + }; + Q_ENUM(OverrideState) +#endif + QFont styleFont(QQuickItem *control) override; protected: @@ -67,6 +80,10 @@ private: private: SubControl m_subControl = Groove; + +#ifdef Q_OS_MACOS + OverrideState m_overrideState = None; +#endif }; #endif // QQUICKSTYLEITEMSCROLLBAR_H |