diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2017-01-19 20:47:01 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2017-01-20 15:26:27 +0000 |
commit | 6c0ee76c646778d6a45018acc8d561c5a5d931f8 (patch) | |
tree | 4dce1aa95b24b88c810c8277f4eddd8d17a12f3f | |
parent | fa388f4a5986ae243d9d50ea26b320cb76619377 (diff) |
Add ScrollBar::policy
[ChangeLog][Controls][ScrollBar] Added a policy-property, which holds
whether the scroll bar is shown always/never/as needed (default).
Change-Id: Ibe25edaef04a7926bc12c59913efa7a3d43a5ccf
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
-rw-r--r-- | src/imports/controls/ScrollBar.qml | 4 | ||||
-rw-r--r-- | src/imports/controls/doc/snippets/qtquickcontrols2-scrollbar-policy.qml | 51 | ||||
-rw-r--r-- | src/imports/controls/material/ScrollBar.qml | 4 | ||||
-rw-r--r-- | src/imports/controls/universal/ScrollBar.qml | 5 | ||||
-rw-r--r-- | src/quicktemplates2/qquickscrollbar.cpp | 34 | ||||
-rw-r--r-- | src/quicktemplates2/qquickscrollbar_p.h | 12 | ||||
-rw-r--r-- | src/quicktemplates2/qquickscrollbar_p_p.h | 1 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_scrollbar.qml | 25 |
8 files changed, 129 insertions, 7 deletions
diff --git a/src/imports/controls/ScrollBar.qml b/src/imports/controls/ScrollBar.qml index 366be48e..79e3e1ee 100644 --- a/src/imports/controls/ScrollBar.qml +++ b/src/imports/controls/ScrollBar.qml @@ -48,6 +48,7 @@ T.ScrollBar { contentItem.implicitHeight + topPadding + bottomPadding) padding: 2 + visible: control.policy !== T.ScrollBar.AlwaysOff contentItem: Rectangle { id: handle @@ -57,12 +58,11 @@ T.ScrollBar { radius: width / 2 color: control.pressed ? Default.scrollBarPressedColor : Default.scrollBarColor - visible: control.size < 1.0 opacity: 0.0 states: State { name: "active" - when: control.active + when: control.policy === T.ScrollBar.AlwaysOn || (control.active && control.size < 1.0) PropertyChanges { target: handle; opacity: 0.75 } } diff --git a/src/imports/controls/doc/snippets/qtquickcontrols2-scrollbar-policy.qml b/src/imports/controls/doc/snippets/qtquickcontrols2-scrollbar-policy.qml new file mode 100644 index 00000000..f0478efe --- /dev/null +++ b/src/imports/controls/doc/snippets/qtquickcontrols2-scrollbar-policy.qml @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.9 +import QtQuick.Controls 2.2 + +//! [1] +Flickable { + contentHeight: 2000 + ScrollBar.vertical: ScrollBar { + policy: ScrollBar.AlwaysOn + } +} +//! [1] diff --git a/src/imports/controls/material/ScrollBar.qml b/src/imports/controls/material/ScrollBar.qml index 5993ab58..156c5781 100644 --- a/src/imports/controls/material/ScrollBar.qml +++ b/src/imports/controls/material/ScrollBar.qml @@ -47,6 +47,7 @@ T.ScrollBar { contentItem.implicitHeight + topPadding + bottomPadding) padding: control.interactive ? 1 : 2 + visible: control.policy !== T.ScrollBar.AlwaysOff contentItem: Rectangle { id: handle @@ -56,7 +57,6 @@ T.ScrollBar { color: control.pressed ? control.Material.scrollBarPressedColor : control.interactive && control.hovered ? control.Material.scrollBarHoveredColor : control.Material.scrollBarColor - visible: control.size < 1.0 opacity: 0.0 } @@ -70,7 +70,7 @@ T.ScrollBar { states: State { name: "active" - when: control.active + when: control.policy === T.ScrollBar.AlwaysOn || (control.active && control.size < 1.0) } transitions: [ diff --git a/src/imports/controls/universal/ScrollBar.qml b/src/imports/controls/universal/ScrollBar.qml index d627eab6..981e382a 100644 --- a/src/imports/controls/universal/ScrollBar.qml +++ b/src/imports/controls/universal/ScrollBar.qml @@ -46,6 +46,8 @@ T.ScrollBar { implicitHeight: Math.max(background ? background.implicitHeight : 0, contentItem.implicitHeight + topPadding + bottomPadding) + visible: control.policy !== T.ScrollBar.AlwaysOff + // TODO: arrows contentItem: Rectangle { @@ -54,7 +56,6 @@ T.ScrollBar { color: control.pressed ? control.Universal.baseMediumColor : control.interactive && control.hovered ? control.Universal.baseMediumLowColor : control.Universal.chromeHighColor - visible: control.size < 1.0 opacity: 0.0 } @@ -70,7 +71,7 @@ T.ScrollBar { states: [ State { name: "active" - when: control.active + when: control.policy === T.ScrollBar.AlwaysOn || (control.active && control.size < 1.0) } ] diff --git a/src/quicktemplates2/qquickscrollbar.cpp b/src/quicktemplates2/qquickscrollbar.cpp index d2d9a194..f118a2b3 100644 --- a/src/quicktemplates2/qquickscrollbar.cpp +++ b/src/quicktemplates2/qquickscrollbar.cpp @@ -164,7 +164,8 @@ QQuickScrollBarPrivate::QQuickScrollBarPrivate() moving(false), interactive(true), orientation(Qt::Vertical), - snapMode(QQuickScrollBar::NoSnap) + snapMode(QQuickScrollBar::NoSnap), + policy(QQuickScrollBar::AsNeeded) { } @@ -487,6 +488,37 @@ void QQuickScrollBar::setInteractive(bool interactive) } /*! + \since QtQuick.Controls 2.2 + \qmlproperty enumeration QtQuick.Controls::ScrollBar::policy + + This property holds the policy of the scroll bar. The default policy is \c ScrollBar.AsNeeded. + + Possible values: + \value ScrollBar.AsNeeded The scroll bar is only shown when the content is too large to fit. + \value ScrollBar.AlwaysOff The scroll bar is never shown. + \value ScrollBar.AlwaysOn The scroll bar is always shown. + + The following example keeps the vertical scroll bar always visible: + + \snippet qtquickcontrols2-scrollbar-policy.qml 1 +*/ +QQuickScrollBar::Policy QQuickScrollBar::policy() const +{ + Q_D(const QQuickScrollBar); + return d->policy; +} + +void QQuickScrollBar::setPolicy(Policy policy) +{ + Q_D(QQuickScrollBar); + if (d->policy == policy) + return; + + d->policy = policy; + emit policyChanged(); +} + +/*! \qmlmethod void QtQuick.Controls::ScrollBar::increase() Increases the position by \l stepSize or \c 0.1 if stepSize is \c 0.0. diff --git a/src/quicktemplates2/qquickscrollbar_p.h b/src/quicktemplates2/qquickscrollbar_p.h index b447694a..dabc860b 100644 --- a/src/quicktemplates2/qquickscrollbar_p.h +++ b/src/quicktemplates2/qquickscrollbar_p.h @@ -66,6 +66,7 @@ class Q_QUICKTEMPLATES2_PRIVATE_EXPORT QQuickScrollBar : public QQuickControl Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation NOTIFY orientationChanged FINAL) Q_PROPERTY(SnapMode snapMode READ snapMode WRITE setSnapMode NOTIFY snapModeChanged FINAL REVISION 2) Q_PROPERTY(bool interactive READ isInteractive WRITE setInteractive NOTIFY interactiveChanged FINAL REVISION 2) + Q_PROPERTY(Policy policy READ policy WRITE setPolicy NOTIFY policyChanged FINAL REVISION 2) public: explicit QQuickScrollBar(QQuickItem *parent = nullptr); @@ -100,6 +101,16 @@ public: bool isInteractive() const; void setInteractive(bool interactive); + enum Policy { + AsNeeded = Qt::ScrollBarAsNeeded, + AlwaysOff = Qt::ScrollBarAlwaysOff, + AlwaysOn = Qt::ScrollBarAlwaysOn + }; + Q_ENUM(Policy) + + Policy policy() const; + void setPolicy(Policy policy); + public Q_SLOTS: void increase(); void decrease(); @@ -115,6 +126,7 @@ Q_SIGNALS: void orientationChanged(); Q_REVISION(2) void snapModeChanged(); Q_REVISION(2) void interactiveChanged(); + Q_REVISION(2) void policyChanged(); protected: void mousePressEvent(QMouseEvent *event) override; diff --git a/src/quicktemplates2/qquickscrollbar_p_p.h b/src/quicktemplates2/qquickscrollbar_p_p.h index 20d66716..a4526245 100644 --- a/src/quicktemplates2/qquickscrollbar_p_p.h +++ b/src/quicktemplates2/qquickscrollbar_p_p.h @@ -88,6 +88,7 @@ public: bool interactive; Qt::Orientation orientation; QQuickScrollBar::SnapMode snapMode; + QQuickScrollBar::Policy policy; }; class QQuickScrollBarAttachedPrivate : public QObjectPrivate, public QQuickItemChangeListener diff --git a/tests/auto/controls/data/tst_scrollbar.qml b/tests/auto/controls/data/tst_scrollbar.qml index 15f965bb..0a7fab9e 100644 --- a/tests/auto/controls/data/tst_scrollbar.qml +++ b/tests/auto/controls/data/tst_scrollbar.qml @@ -467,4 +467,29 @@ TestCase { mouseRelease(control, 0, 0, Qt.LeftButton) compare(control.pressed, false) } + + function test_policy() { + var control = createTemporaryObject(scrollBar, testCase, {active: true}) + verify(control) + + compare(ScrollBar.AsNeeded, Qt.ScrollBarAsNeeded) + compare(ScrollBar.AlwaysOff, Qt.ScrollBarAlwaysOff) + compare(ScrollBar.AlwaysOn, Qt.ScrollBarAlwaysOn) + + compare(control.visible, true) + compare(control.policy, ScrollBar.AsNeeded) + + control.size = 0.5 + verify(control.state === "active" || control.contentItem.state === "active") + + control.size = 1.0 + verify(control.state !== "active" && control.contentItem.state !== "active") + + control.policy = ScrollBar.AlwaysOff + compare(control.visible, false) + + control.policy = ScrollBar.AlwaysOn + compare(control.visible, true) + verify(control.state === "active" || control.contentItem.state === "active") + } } |