aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2017-01-19 20:47:01 +0100
committerJ-P Nurmi <jpnurmi@qt.io>2017-01-20 15:26:27 +0000
commit6c0ee76c646778d6a45018acc8d561c5a5d931f8 (patch)
tree4dce1aa95b24b88c810c8277f4eddd8d17a12f3f
parentfa388f4a5986ae243d9d50ea26b320cb76619377 (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.qml4
-rw-r--r--src/imports/controls/doc/snippets/qtquickcontrols2-scrollbar-policy.qml51
-rw-r--r--src/imports/controls/material/ScrollBar.qml4
-rw-r--r--src/imports/controls/universal/ScrollBar.qml5
-rw-r--r--src/quicktemplates2/qquickscrollbar.cpp34
-rw-r--r--src/quicktemplates2/qquickscrollbar_p.h12
-rw-r--r--src/quicktemplates2/qquickscrollbar_p_p.h1
-rw-r--r--tests/auto/controls/data/tst_scrollbar.qml25
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")
+ }
}