diff options
author | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-03-20 07:10:34 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-03-21 16:20:08 +0000 |
commit | 737bdea1e3dc41b5b30bb26c36224e31966ebd54 (patch) | |
tree | f1a2d013db2b7aa21c251553baae29f89712c861 | |
parent | 1cec731d40f6ed8a7755c9e3c0d100afbe099ed8 (diff) |
ScrollBar: use contentItem instead of handle
Thanks to virtual resizeContent() we can finally use contentItem like
everywhere else, and cleanup the special handle item.
Change-Id: I9e52ec3ff327d19cda3d85d2e2d9b73d80442bbc
Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
-rw-r--r-- | src/imports/controls/ScrollBar.qml | 16 | ||||
-rw-r--r-- | src/imports/controls/doc/images/qtquickcontrols-scrollbar-contentItem.png (renamed from src/imports/controls/doc/images/qtquickcontrols-scrollbar-handle.png) | bin | 248 -> 248 bytes | |||
-rw-r--r-- | src/imports/controls/doc/snippets/qtquickcontrols-scrollbar-contentItem.qml (renamed from src/imports/controls/doc/snippets/qtquickcontrols-scrollbar-handle.qml) | 2 | ||||
-rw-r--r-- | src/imports/controls/doc/src/qtlabscontrols-customize.qdoc | 8 | ||||
-rw-r--r-- | src/imports/controls/material/ScrollBar.qml | 16 | ||||
-rw-r--r-- | src/imports/controls/plugins.qmltypes | 1 | ||||
-rw-r--r-- | src/imports/controls/universal/ScrollBar.qml | 20 | ||||
-rw-r--r-- | src/imports/templates/plugins.qmltypes | 1 | ||||
-rw-r--r-- | src/templates/qquickscrollbar.cpp | 52 | ||||
-rw-r--r-- | src/templates/qquickscrollbar_p.h | 5 |
10 files changed, 46 insertions, 75 deletions
diff --git a/src/imports/controls/ScrollBar.qml b/src/imports/controls/ScrollBar.qml index 55d53191..16ac2dfc 100644 --- a/src/imports/controls/ScrollBar.qml +++ b/src/imports/controls/ScrollBar.qml @@ -41,14 +41,14 @@ T.ScrollBar { id: control implicitWidth: Math.max(background ? background.implicitWidth : 0, - handle.implicitWidth + leftPadding + rightPadding) + contentItem.implicitWidth + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, - handle.implicitHeight + topPadding + bottomPadding) + contentItem.implicitHeight + topPadding + bottomPadding) padding: 2 - //! [handle] - handle: Rectangle { + //! [contentItem] + contentItem: Rectangle { id: handle implicitWidth: 6 @@ -59,12 +59,6 @@ T.ScrollBar { visible: control.size < 1.0 opacity: 0.0 - readonly property bool horizontal: control.orientation === Qt.Horizontal - x: control.leftPadding + (horizontal ? control.position * control.width : 0) - y: control.topPadding + (horizontal ? 0 : control.position * control.height) - width: horizontal ? control.size * control.availableWidth : implicitWidth - height: horizontal ? implicitHeight : control.size * control.availableHeight - states: State { name: "active" when: control.active @@ -79,5 +73,5 @@ T.ScrollBar { } } } - //! [handle] + //! [contentItem] } diff --git a/src/imports/controls/doc/images/qtquickcontrols-scrollbar-handle.png b/src/imports/controls/doc/images/qtquickcontrols-scrollbar-contentItem.png Binary files differindex 5d916e66..5d916e66 100644 --- a/src/imports/controls/doc/images/qtquickcontrols-scrollbar-handle.png +++ b/src/imports/controls/doc/images/qtquickcontrols-scrollbar-contentItem.png diff --git a/src/imports/controls/doc/snippets/qtquickcontrols-scrollbar-handle.qml b/src/imports/controls/doc/snippets/qtquickcontrols-scrollbar-contentItem.qml index 45cde698..d1ce40d7 100644 --- a/src/imports/controls/doc/snippets/qtquickcontrols-scrollbar-handle.qml +++ b/src/imports/controls/doc/snippets/qtquickcontrols-scrollbar-contentItem.qml @@ -34,7 +34,7 @@ ScrollBar { active: true height: 100 Rectangle { - parent: handle + parent: contentItem anchors.fill: parent color: "transparent" border.color: "red" diff --git a/src/imports/controls/doc/src/qtlabscontrols-customize.qdoc b/src/imports/controls/doc/src/qtlabscontrols-customize.qdoc index daa74795..df1ba5d0 100644 --- a/src/imports/controls/doc/src/qtlabscontrols-customize.qdoc +++ b/src/imports/controls/doc/src/qtlabscontrols-customize.qdoc @@ -354,7 +354,7 @@ \section1 Customizing ScrollBar ScrollBar consists of two visual items: \l {Control::background}{background} - and \l {ScrollBar::handle}{handle}. + and \l {Control::contentItem}{content item}. \section3 Background @@ -362,11 +362,11 @@ ScrollBar has no background item by default. - \section3 Handle + \section3 Content item - \image qtquickcontrols-scrollbar-handle.png + \image qtquickcontrols-scrollbar-contentItem.png - \snippet ScrollBar.qml handle + \snippet ScrollBar.qml contentItem \section1 Customizing ScrollIndicator diff --git a/src/imports/controls/material/ScrollBar.qml b/src/imports/controls/material/ScrollBar.qml index 539b9243..7156b933 100644 --- a/src/imports/controls/material/ScrollBar.qml +++ b/src/imports/controls/material/ScrollBar.qml @@ -42,14 +42,14 @@ T.ScrollBar { id: control implicitWidth: Math.max(background ? background.implicitWidth : 0, - handle.implicitWidth + leftPadding + rightPadding) + contentItem.implicitWidth + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, - handle.implicitHeight + topPadding + bottomPadding) + contentItem.implicitHeight + topPadding + bottomPadding) padding: 2 - //! [handle] - handle: Rectangle { + //! [contentItem] + contentItem: Rectangle { id: handle implicitWidth: 4 @@ -59,12 +59,6 @@ T.ScrollBar { visible: control.size < 1.0 opacity: 0.0 - readonly property bool horizontal: control.orientation === Qt.Horizontal - x: control.leftPadding + (horizontal ? control.position * control.width : 0) - y: control.topPadding + (horizontal ? 0 : control.position * control.height) - width: horizontal ? control.size * control.availableWidth : implicitWidth - height: horizontal ? implicitHeight : control.size * control.availableHeight - states: State { name: "active" when: control.active @@ -79,5 +73,5 @@ T.ScrollBar { } } } - //! [handle] + //! [contentItem] } diff --git a/src/imports/controls/plugins.qmltypes b/src/imports/controls/plugins.qmltypes index 08597083..9a8b1255 100644 --- a/src/imports/controls/plugins.qmltypes +++ b/src/imports/controls/plugins.qmltypes @@ -502,7 +502,6 @@ Module { Property { name: "active"; type: "bool" } Property { name: "pressed"; type: "bool" } Property { name: "orientation"; type: "Qt::Orientation" } - Property { name: "handle"; type: "QQuickItem"; isPointer: true } Method { name: "setSize" Parameter { name: "size"; type: "double" } diff --git a/src/imports/controls/universal/ScrollBar.qml b/src/imports/controls/universal/ScrollBar.qml index b1bc8f6a..393a640e 100644 --- a/src/imports/controls/universal/ScrollBar.qml +++ b/src/imports/controls/universal/ScrollBar.qml @@ -42,28 +42,22 @@ T.ScrollBar { id: control implicitWidth: Math.max(background ? background.implicitWidth : 0, - handle.implicitWidth + leftPadding + rightPadding) + contentItem.implicitWidth + leftPadding + rightPadding) implicitHeight: Math.max(background ? background.implicitHeight : 0, - handle.implicitHeight + topPadding + bottomPadding) + contentItem.implicitHeight + topPadding + bottomPadding) // TODO: arrows - //! [handle] - handle: Rectangle { + //! [contentItem] + contentItem: Rectangle { implicitWidth: 12 implicitHeight: 12 color: control.pressed ? control.Universal.baseMediumColor : control.Universal.chromeHighColor visible: control.size < 1.0 opacity: 0.0 - - readonly property bool horizontal: control.orientation === Qt.Horizontal - x: control.leftPadding + (horizontal ? control.position * control.width : 0) - y: control.topPadding + (horizontal ? 0 : control.position * control.height) - width: horizontal ? control.size * control.availableWidth : implicitWidth - height: horizontal ? implicitHeight : control.size * control.availableHeight } - //! [handle] + //! [contentItem] //! [background] background: Rectangle { @@ -86,13 +80,13 @@ T.ScrollBar { transitions: [ Transition { to: "active" - NumberAnimation { targets: [handle, background]; property: "opacity"; to: 1.0 } + NumberAnimation { targets: [contentItem, background]; property: "opacity"; to: 1.0 } }, Transition { from: "active" SequentialAnimation { PauseAnimation { duration: 3000 } - NumberAnimation { targets: [handle, background]; property: "opacity"; to: 0.0 } + NumberAnimation { targets: [contentItem, background]; property: "opacity"; to: 0.0 } } } ] diff --git a/src/imports/templates/plugins.qmltypes b/src/imports/templates/plugins.qmltypes index 94cdf8cc..54f44d16 100644 --- a/src/imports/templates/plugins.qmltypes +++ b/src/imports/templates/plugins.qmltypes @@ -496,7 +496,6 @@ Module { Property { name: "active"; type: "bool" } Property { name: "pressed"; type: "bool" } Property { name: "orientation"; type: "Qt::Orientation" } - Property { name: "handle"; type: "QQuickItem"; isPointer: true } Method { name: "setSize" Parameter { name: "size"; type: "double" } diff --git a/src/templates/qquickscrollbar.cpp b/src/templates/qquickscrollbar.cpp index 60e68e3b..e457e510 100644 --- a/src/templates/qquickscrollbar.cpp +++ b/src/templates/qquickscrollbar.cpp @@ -85,7 +85,7 @@ class QQuickScrollBarPrivate : public QQuickControlPrivate public: QQuickScrollBarPrivate() : size(0), position(0), offset(0), active(false), pressed(false), moving(false), - orientation(Qt::Vertical), handle(nullptr) + orientation(Qt::Vertical) { } @@ -96,6 +96,8 @@ public: qreal positionAt(const QPoint &point) const; + void resizeContent() override; + qreal size; qreal position; qreal offset; @@ -103,7 +105,6 @@ public: bool pressed; bool moving; Qt::Orientation orientation; - QQuickItem *handle; }; qreal QQuickScrollBarPrivate::positionAt(const QPoint &point) const @@ -115,6 +116,21 @@ qreal QQuickScrollBarPrivate::positionAt(const QPoint &point) const return point.y() / q->height(); } +void QQuickScrollBarPrivate::resizeContent() +{ + Q_Q(QQuickScrollBar); + if (!contentItem) + return; + + if (orientation == Qt::Horizontal) { + contentItem->setPosition(QPointF(q->leftPadding() + position * q->availableWidth(), q->topPadding())); + contentItem->setSize(QSizeF(q->availableWidth() * size, q->availableHeight())); + } else { + contentItem->setPosition(QPointF(q->leftPadding(), q->topPadding() + position * q->availableHeight())); + contentItem->setSize(QSizeF(q->availableWidth(), q->availableHeight() * size)); + } +} + QQuickScrollBar::QQuickScrollBar(QQuickItem *parent) : QQuickControl(*(new QQuickScrollBarPrivate), parent) { @@ -152,6 +168,8 @@ void QQuickScrollBar::setSize(qreal size) return; d->size = size; + if (isComponentComplete()) + d->resizeContent(); emit sizeChanged(); } @@ -175,6 +193,8 @@ void QQuickScrollBar::setPosition(qreal position) return; d->position = position; + if (isComponentComplete()) + d->resizeContent(); emit positionChanged(); } @@ -245,35 +265,11 @@ void QQuickScrollBar::setOrientation(Qt::Orientation orientation) return; d->orientation = orientation; + if (isComponentComplete()) + d->resizeContent(); emit orientationChanged(); } -/*! - \qmlproperty Item Qt.labs.controls::ScrollBar::handle - - This property holds the handle item. - - \sa {Customizing ScrollBar} -*/ -QQuickItem *QQuickScrollBar::handle() const -{ - Q_D(const QQuickScrollBar); - return d->handle; -} - -void QQuickScrollBar::setHandle(QQuickItem *handle) -{ - Q_D(QQuickScrollBar); - if (d->handle == handle) - return; - - delete d->handle; - d->handle = handle; - if (handle && !handle->parentItem()) - handle->setParentItem(this); - emit handleChanged(); -} - void QQuickScrollBar::mousePressEvent(QMouseEvent *event) { Q_D(QQuickScrollBar); diff --git a/src/templates/qquickscrollbar_p.h b/src/templates/qquickscrollbar_p.h index eda26cf4..1803c30a 100644 --- a/src/templates/qquickscrollbar_p.h +++ b/src/templates/qquickscrollbar_p.h @@ -64,7 +64,6 @@ class Q_QUICKTEMPLATES_EXPORT QQuickScrollBar : public QQuickControl Q_PROPERTY(bool active READ isActive WRITE setActive NOTIFY activeChanged FINAL) Q_PROPERTY(bool pressed READ isPressed WRITE setPressed NOTIFY pressedChanged FINAL) Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation NOTIFY orientationChanged FINAL) - Q_PROPERTY(QQuickItem *handle READ handle WRITE setHandle NOTIFY handleChanged FINAL) public: explicit QQuickScrollBar(QQuickItem *parent = nullptr); @@ -83,9 +82,6 @@ public: Qt::Orientation orientation() const; void setOrientation(Qt::Orientation orientation); - QQuickItem *handle() const; - void setHandle(QQuickItem *handle); - public Q_SLOTS: void setSize(qreal size); void setPosition(qreal position); @@ -96,7 +92,6 @@ Q_SIGNALS: void activeChanged(); void pressedChanged(); void orientationChanged(); - void handleChanged(); protected: void mousePressEvent(QMouseEvent *event) override; |