Normalize line endings for .qml files

This commit is contained in:
Felix Kauselmann
2018-08-05 13:14:30 +02:00
parent c2bc4ae675
commit d3b8f4d5b8
11 changed files with 2630 additions and 2630 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,211 +1,211 @@
import QtQuick 2.3 import QtQuick 2.3
import QtQuick.Controls 1.4 import QtQuick.Controls 1.4
import QtGraphicalEffects 1.0 import QtGraphicalEffects 1.0
import com.yacreader.ComicModel 1.0 import com.yacreader.ComicModel 1.0
Rectangle { Rectangle {
id: main id: main
property url backgroundImageURL; property url backgroundImageURL;
property real backgroundBlurRadius : 100; //85; property real backgroundBlurRadius : 100; //85;
property real backgroundBlurOpacity : 0.25; //0.35; property real backgroundBlurOpacity : 0.25; //0.35;
property bool backgroundBlurVisible : true; property bool backgroundBlurVisible : true;
property real additionalBottomSpace : 0; property real additionalBottomSpace : 0;
property real verticalPadding: 12 property real verticalPadding: 12
property real itemsSpacing: 17 property real itemsSpacing: 17
signal currentCoverChanged(int index) signal currentCoverChanged(int index)
Rectangle { Rectangle {
id: background id: background
color: "#2A2A2A" color: "#2A2A2A"
anchors.fill: backgroundImg anchors.fill: backgroundImg
} }
Image { Image {
id: backgroundImg id: backgroundImg
width: parent.width width: parent.width
height: parent.height + additionalBottomSpace height: parent.height + additionalBottomSpace
source: backgroundImage source: backgroundImage
fillMode: Image.PreserveAspectCrop fillMode: Image.PreserveAspectCrop
smooth: true smooth: true
mipmap: true mipmap: true
asynchronous : true asynchronous : true
cache: false //TODO clear cache only when it is needed cache: false //TODO clear cache only when it is needed
opacity: 0 opacity: 0
visible: false visible: false
} }
FastBlur { FastBlur {
anchors.fill: backgroundImg anchors.fill: backgroundImg
source: backgroundImg source: backgroundImg
radius: backgroundBlurRadius radius: backgroundBlurRadius
opacity: backgroundBlurOpacity opacity: backgroundBlurOpacity
visible: backgroundBlurVisible visible: backgroundBlurVisible
} }
anchors.margins: 0 anchors.margins: 0
MouseArea { MouseArea {
anchors.fill : list anchors.fill : list
onWheel: { onWheel: {
if(list.moving) if(list.moving)
return; return;
var ci var ci
if(wheel.angleDelta.y < 0) { if(wheel.angleDelta.y < 0) {
ci = Math.min(list.currentIndex+1, list.count - 1); ci = Math.min(list.currentIndex+1, list.count - 1);
} }
else if(wheel.angleDelta.y > 0) { else if(wheel.angleDelta.y > 0) {
ci = Math.max(0,list.currentIndex-1); ci = Math.max(0,list.currentIndex-1);
} else { } else {
return; return;
} }
list.currentIndex = ci; list.currentIndex = ci;
} }
} }
ListView { ListView {
id: list id: list
objectName: "list" objectName: "list"
anchors.fill: parent anchors.fill: parent
property int previousIndex; property int previousIndex;
orientation: Qt.Horizontal orientation: Qt.Horizontal
pixelAligned: true pixelAligned: true
model: comicsList model: comicsList
spacing: itemsSpacing spacing: itemsSpacing
anchors.leftMargin: Math.floor(verticalPadding * 1.1) anchors.leftMargin: Math.floor(verticalPadding * 1.1)
snapMode: ListView.SnapToItem snapMode: ListView.SnapToItem
highlightFollowsCurrentItem: true highlightFollowsCurrentItem: true
highlightRangeMode: ListView.StrictlyEnforceRange highlightRangeMode: ListView.StrictlyEnforceRange
preferredHighlightEnd: 50 preferredHighlightEnd: 50
highlightMoveDuration: 250 highlightMoveDuration: 250
onCurrentIndexChanged: { onCurrentIndexChanged: {
currentCoverChanged(currentIndex); currentCoverChanged(currentIndex);
} }
delegate: Component { delegate: Component {
//cover //cover
Rectangle { Rectangle {
width: Math.floor((list.height - (verticalPadding * 2)) * 0.65); width: Math.floor((list.height - (verticalPadding * 2)) * 0.65);
height: list.height - (verticalPadding * 2); height: list.height - (verticalPadding * 2);
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
color:"transparent" color:"transparent"
BusyIndicator { BusyIndicator {
scale: 0.5 scale: 0.5
anchors.centerIn: parent anchors.centerIn: parent
running: coverElement.status === Image.Loading running: coverElement.status === Image.Loading
} }
DropShadow { DropShadow {
anchors.fill: coverElement anchors.fill: coverElement
horizontalOffset: 0 horizontalOffset: 0
verticalOffset: 0 verticalOffset: 0
radius: 6 radius: 6
samples: 17 samples: 17
color: "#BB000000" color: "#BB000000"
source: coverElement source: coverElement
visible: (Qt.platform.os === "osx") ? false : true; visible: (Qt.platform.os === "osx") ? false : true;
} }
Image { Image {
id: coverElement id: coverElement
anchors.fill: parent anchors.fill: parent
source: cover_path source: cover_path
fillMode: Image.PreserveAspectCrop fillMode: Image.PreserveAspectCrop
smooth: true smooth: true
mipmap: true mipmap: true
asynchronous : true asynchronous : true
cache: false cache: false
} }
//mark //mark
Image { Image {
id: mark id: mark
width: 23 width: 23
height: 23 height: 23
source: read_column&&show_marks?"tick.png":has_been_opened&&show_marks?"reading.png":"" source: read_column&&show_marks?"tick.png":has_been_opened&&show_marks?"reading.png":""
anchors {right: coverElement.right; top: coverElement.top; topMargin: 9; rightMargin: 9} anchors {right: coverElement.right; top: coverElement.top; topMargin: 9; rightMargin: 9}
asynchronous : true asynchronous : true
} }
//border //border
Rectangle { Rectangle {
width: coverElement.width width: coverElement.width
height: coverElement.height height: coverElement.height
anchors.centerIn: coverElement anchors.centerIn: coverElement
color: "transparent" color: "transparent"
border { border {
color: "#30FFFFFF" color: "#30FFFFFF"
width: 1 width: 1
} }
} }
MouseArea { MouseArea {
id: mouseArea id: mouseArea
anchors.fill: parent anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton acceptedButtons: Qt.LeftButton | Qt.RightButton
hoverEnabled: true hoverEnabled: true
onDoubleClicked: { onDoubleClicked: {
list.currentIndex = index; list.currentIndex = index;
currentIndexHelper.selectedItem(index); currentIndexHelper.selectedItem(index);
} }
onReleased: { onReleased: {
list.currentIndex = index; list.currentIndex = index;
if(mouse.button === Qt.RightButton) // context menu is requested if(mouse.button === Qt.RightButton) // context menu is requested
{ {
var coordinates = main.mapFromItem(coverElement,mouseX,mouseY) var coordinates = main.mapFromItem(coverElement,mouseX,mouseY)
contextMenuHelper.requestedContextMenu(Qt.point(coordinates.x,coordinates.y)); contextMenuHelper.requestedContextMenu(Qt.point(coordinates.x,coordinates.y));
} }
mouse.accepted = true; mouse.accepted = true;
} }
} }
} }
} }
focus: true focus: true
Keys.onPressed: { Keys.onPressed: {
if (event.modifiers & Qt.ControlModifier || event.modifiers & Qt.ShiftModifier) if (event.modifiers & Qt.ControlModifier || event.modifiers & Qt.ShiftModifier)
return; return;
var ci var ci
if (event.key === Qt.Key_Right) { if (event.key === Qt.Key_Right) {
ci = Math.min(list.currentIndex+1, list.count - 1); ci = Math.min(list.currentIndex+1, list.count - 1);
} }
else if (event.key === Qt.Key_Left) { else if (event.key === Qt.Key_Left) {
ci = Math.max(0,list.currentIndex-1); ci = Math.max(0,list.currentIndex-1);
} else { } else {
return; return;
} }
list.currentIndex = ci; list.currentIndex = ci;
event.accepted = true; event.accepted = true;
} }
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,121 +1,121 @@
import QtQuick 2.5 import QtQuick 2.5
import QtQuick.Controls 1.2 import QtQuick.Controls 1.2
import QtGraphicalEffects 1.0 import QtGraphicalEffects 1.0
import QtQuick.Controls.Styles 1.4 import QtQuick.Controls.Styles 1.4
import com.yacreader.ComicModel 1.0 import com.yacreader.ComicModel 1.0
Rectangle { Rectangle {
id: main id: main
color: infoBackgroundColor color: infoBackgroundColor
width: parent.width width: parent.width
height: parent.height height: parent.height
anchors.margins: 0 anchors.margins: 0
FlowView { FlowView {
id: flow id: flow
objectName: "flow" objectName: "flow"
height: 256 //TODO dynamic size? height: 256 //TODO dynamic size?
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right
additionalBottomSpace: indicator.height additionalBottomSpace: indicator.height
} }
Image { Image {
id: top_shadow id: top_shadow
source: topShadow source: topShadow
width: parent.width width: parent.width
fillMode: Image.TileHorizontally fillMode: Image.TileHorizontally
} }
Rectangle { Rectangle {
id: indicator_container id: indicator_container
width: parent.width width: parent.width
y: 250 y: 250
Image { Image {
id: indicator id: indicator
source: infoIndicator source: infoIndicator
} }
Image { Image {
id: bottom_shadow id: bottom_shadow
x: indicator.width x: indicator.width
width: parent.width - indicator.width width: parent.width - indicator.width
source: infoShadow source: infoShadow
fillMode: Image.TileHorizontally fillMode: Image.TileHorizontally
} }
} }
Rectangle { Rectangle {
id: info_container id: info_container
width: parent.width width: parent.width
y: flow.height + flow.additionalBottomSpace - 6 y: flow.height + flow.additionalBottomSpace - 6
height: parent.height - y height: parent.height - y
color: infoBackgroundColor color: infoBackgroundColor
ScrollView { ScrollView {
__wheelAreaScrollSpeed: 75 __wheelAreaScrollSpeed: 75
anchors.fill: parent anchors.fill: parent
anchors.margins: 0 anchors.margins: 0
horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff
style: ScrollViewStyle { style: ScrollViewStyle {
transientScrollBars: false transientScrollBars: false
incrementControl: Item {} incrementControl: Item {}
decrementControl: Item {} decrementControl: Item {}
handle: Item { handle: Item {
implicitWidth: 10 implicitWidth: 10
implicitHeight: 26 implicitHeight: 26
Rectangle { Rectangle {
color: "#424246" color: "#424246"
anchors.fill: parent anchors.fill: parent
anchors.topMargin: 6 anchors.topMargin: 6
anchors.leftMargin: 4 anchors.leftMargin: 4
anchors.rightMargin: 4 anchors.rightMargin: 4
anchors.bottomMargin: 6 anchors.bottomMargin: 6
} }
} }
scrollBarBackground: Item { scrollBarBackground: Item {
implicitWidth: 14 implicitWidth: 14
implicitHeight: 26 implicitHeight: 26
} }
} }
ComicInfoView { ComicInfoView {
width: info_container.width - 14 width: info_container.width - 14
} }
} }
} }
DropArea { DropArea {
anchors.fill: parent anchors.fill: parent
onEntered: { onEntered: {
if(drag.hasUrls) if(drag.hasUrls)
{ {
if(dropManager.canDropUrls(drag.urls, drag.action)) if(dropManager.canDropUrls(drag.urls, drag.action))
{ {
drag.accepted = true; drag.accepted = true;
}else }else
drag.accepted = false; drag.accepted = false;
} }
} }
onDropped: { onDropped: {
if(drop.hasUrls && dropManager.canDropUrls(drop.urls, drop.action)) if(drop.hasUrls && dropManager.canDropUrls(drop.urls, drop.action))
{ {
dropManager.droppedFiles(drop.urls, drop.action); dropManager.droppedFiles(drop.urls, drop.action);
} }
} }
} }
} }

View File

@ -1,32 +1,32 @@
import QtQuick 2.6 import QtQuick 2.6
import QtGraphicalEffects 1.0 import QtGraphicalEffects 1.0
Item { Item {
width: 20 width: 20
height: 20 height: 20
property bool active property bool active
signal activeChangedByUser(bool active) signal activeChangedByUser(bool active)
MouseArea { MouseArea {
anchors.fill: favorites_button_compact anchors.fill: favorites_button_compact
onClicked: { onClicked: {
activeChangedByUser(!active); activeChangedByUser(!active);
} }
} }
Image { Image {
anchors.centerIn: parent anchors.centerIn: parent
id: favorites_button_compact id: favorites_button_compact
source: "info-favorites.png" source: "info-favorites.png"
} }
ColorOverlay { ColorOverlay {
anchors.fill: favorites_button_compact anchors.fill: favorites_button_compact
source: favorites_button_compact source: favorites_button_compact
color: active ? favCheckedColor : favUncheckedColor color: active ? favCheckedColor : favUncheckedColor
} }
} }

View File

@ -1,50 +1,50 @@
import QtQuick 2.6 import QtQuick 2.6
import QtGraphicalEffects 1.0 import QtGraphicalEffects 1.0
Row { Row {
spacing: 0 spacing: 0
property int rating : 0 property int rating : 0
property int mouseIndex : 0 property int mouseIndex : 0
signal ratingChangedByUser(int rating) signal ratingChangedByUser(int rating)
Repeater { Repeater {
id: rating_compact id: rating_compact
model: 5 model: 5
Item { Item {
width: 25 width: 25
height: 20 height: 20
Image { Image {
id: star id: star
source: "info-rating.png" source: "info-rating.png"
} }
ColorOverlay { ColorOverlay {
anchors.fill: star anchors.fill: star
source: star source: star
color: index < (mouseIndex > 0 ? mouseIndex : rating) ? ratingSelectedColor : ratingUnselectedColor color: index < (mouseIndex > 0 ? mouseIndex : rating) ? ratingSelectedColor : ratingUnselectedColor
} }
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
onPositionChanged: { onPositionChanged: {
mouseIndex = index + 1; mouseIndex = index + 1;
} }
onClicked: { onClicked: {
ratingChangedByUser(mouseIndex); ratingChangedByUser(mouseIndex);
} }
onExited: { onExited: {
mouseIndex = 0; mouseIndex = 0;
} }
} }
} }
} }
} }

View File

@ -1,29 +1,29 @@
import QtQuick 2.6 import QtQuick 2.6
import QtGraphicalEffects 1.0 import QtGraphicalEffects 1.0
Item { Item {
property bool read property bool read
signal readChangedByUser(bool read) signal readChangedByUser(bool read)
MouseArea { MouseArea {
anchors.fill: read_compact anchors.fill: read_compact
onClicked: { onClicked: {
readChangedByUser(!read); readChangedByUser(!read);
} }
} }
Image { Image {
id: read_compact id: read_compact
source: "info-tick.png" source: "info-tick.png"
} }
ColorOverlay { ColorOverlay {
anchors.fill: read_compact anchors.fill: read_compact
source: read_compact source: read_compact
color: read ? readTickCheckedColor : readTickUncheckedColor color: read ? readTickCheckedColor : readTickUncheckedColor
} }
} }

View File

@ -1,32 +1,32 @@
import QtQuick 2.9 import QtQuick 2.9
import QtQuick.Controls 1.4 import QtQuick.Controls 1.4
Image { Image {
id: ratingImage id: ratingImage
anchors {bottom: realCell.bottom; right: pageImage.left; bottomMargin: 5; rightMargin: Math.floor(pages.width)+12} anchors {bottom: realCell.bottom; right: pageImage.left; bottomMargin: 5; rightMargin: Math.floor(pages.width)+12}
source: "star.png" source: "star.png"
width: 13 width: 13
height: 11 height: 11
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
onPressed: { onPressed: {
console.log("rating"); console.log("rating");
comicsSelectionHelper.clear(); comicsSelectionHelper.clear();
comicsSelectionHelper.selectIndex(index); comicsSelectionHelper.selectIndex(index);
grid.currentIndex = index; grid.currentIndex = index;
ratingConextMenu.popup(); ratingConextMenu.popup();
} }
} }
Menu { Menu {
id: ratingConextMenu id: ratingConextMenu
MenuItem { text: "1"; enabled: true; iconSource:"star_menu.png"; onTriggered: comicRatingHelper.rate(index,1) } MenuItem { text: "1"; enabled: true; iconSource:"star_menu.png"; onTriggered: comicRatingHelper.rate(index,1) }
MenuItem { text: "2"; enabled: true; iconSource:"star_menu.png"; onTriggered: comicRatingHelper.rate(index,2) } MenuItem { text: "2"; enabled: true; iconSource:"star_menu.png"; onTriggered: comicRatingHelper.rate(index,2) }
MenuItem { text: "3"; enabled: true; iconSource:"star_menu.png"; onTriggered: comicRatingHelper.rate(index,3) } MenuItem { text: "3"; enabled: true; iconSource:"star_menu.png"; onTriggered: comicRatingHelper.rate(index,3) }
MenuItem { text: "4"; enabled: true; iconSource:"star_menu.png"; onTriggered: comicRatingHelper.rate(index,4) } MenuItem { text: "4"; enabled: true; iconSource:"star_menu.png"; onTriggered: comicRatingHelper.rate(index,4) }
MenuItem { text: "5"; enabled: true; iconSource:"star_menu.png"; onTriggered: comicRatingHelper.rate(index,5) } MenuItem { text: "5"; enabled: true; iconSource:"star_menu.png"; onTriggered: comicRatingHelper.rate(index,5) }
} }
} }

View File

@ -1,36 +1,36 @@
import QtQuick 2.9 import QtQuick 2.9
import QtQuick.Controls 1.4 import QtQuick.Controls 1.4
Image { Image {
id: ratingImage id: ratingImage
anchors {bottom: realCell.bottom; right: pageImage.left; bottomMargin: 5; rightMargin: Math.floor(pages.width)+12} anchors {bottom: realCell.bottom; right: pageImage.left; bottomMargin: 5; rightMargin: Math.floor(pages.width)+12}
source: "star.png" source: "star.png"
width: 13 width: 13
height: 11 height: 11
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
onPressed: { onPressed: {
console.log("rating"); console.log("rating");
comicsSelectionHelper.clear(); comicsSelectionHelper.clear();
comicsSelectionHelper.selectIndex(index); comicsSelectionHelper.selectIndex(index);
grid.currentIndex = index; grid.currentIndex = index;
ratingConextMenu.popup(); ratingConextMenu.popup();
} }
} }
MenuBar MenuBar
{ {
Menu { Menu {
id: ratingConextMenu id: ratingConextMenu
MenuItem { text: "1"; enabled: true; iconSource:"star_menu.png"; onTriggered: comicRatingHelper.rate(index,1) } MenuItem { text: "1"; enabled: true; iconSource:"star_menu.png"; onTriggered: comicRatingHelper.rate(index,1) }
MenuItem { text: "2"; enabled: true; iconSource:"star_menu.png"; onTriggered: comicRatingHelper.rate(index,2) } MenuItem { text: "2"; enabled: true; iconSource:"star_menu.png"; onTriggered: comicRatingHelper.rate(index,2) }
MenuItem { text: "3"; enabled: true; iconSource:"star_menu.png"; onTriggered: comicRatingHelper.rate(index,3) } MenuItem { text: "3"; enabled: true; iconSource:"star_menu.png"; onTriggered: comicRatingHelper.rate(index,3) }
MenuItem { text: "4"; enabled: true; iconSource:"star_menu.png"; onTriggered: comicRatingHelper.rate(index,4) } MenuItem { text: "4"; enabled: true; iconSource:"star_menu.png"; onTriggered: comicRatingHelper.rate(index,4) }
MenuItem { text: "5"; enabled: true; iconSource:"star_menu.png"; onTriggered: comicRatingHelper.rate(index,5) } MenuItem { text: "5"; enabled: true; iconSource:"star_menu.png"; onTriggered: comicRatingHelper.rate(index,5) }
} }
} }
} }

View File

@ -1,357 +1,357 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/ ** Contact: http://www.qt.io/licensing/
** **
** This file is part of the Qt Quick Controls module of the Qt Toolkit. ** This file is part of the Qt Quick Controls module of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL3$ ** $QT_BEGIN_LICENSE:LGPL3$
** Commercial License Usage ** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in ** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the ** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in ** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms ** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further ** and conditions see http://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us. ** information use the contact form at http://www.qt.io/contact-us.
** **
** GNU Lesser General Public License Usage ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software ** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPLv3 included in the ** Foundation and appearing in the file LICENSE.LGPLv3 included in the
** packaging of this file. Please review the following information to ** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements ** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl.html. ** will be met: https://www.gnu.org/licenses/lgpl.html.
** **
** GNU General Public License Usage ** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU ** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or later as published by the Free ** General Public License version 2.0 or later as published by the Free
** Software Foundation and appearing in the file LICENSE.GPL included in ** Software Foundation and appearing in the file LICENSE.GPL included in
** the packaging of this file. Please review the following information to ** the packaging of this file. Please review the following information to
** ensure the GNU General Public License version 2.0 requirements will be ** ensure the GNU General Public License version 2.0 requirements will be
** met: http://www.gnu.org/licenses/gpl-2.0.html. ** met: http://www.gnu.org/licenses/gpl-2.0.html.
** **
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **
****************************************************************************/ ****************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
import QtQuick.Controls 1.2 import QtQuick.Controls 1.2
import QtQuick.Controls.Private 1.0 import QtQuick.Controls.Private 1.0
import QtQuick.Controls.Styles 1.1 import QtQuick.Controls.Styles 1.1
/*! /*!
\qmltype ScrollView \qmltype ScrollView
\inqmlmodule QtQuick.Controls \inqmlmodule QtQuick.Controls
\since 5.1 \since 5.1
\ingroup views \ingroup views
\ingroup controls \ingroup controls
\brief Provides a scrolling view within another Item. \brief Provides a scrolling view within another Item.
\image scrollview.png \image scrollview.png
A ScrollView can be used either to replace a \l Flickable or decorate an A ScrollView can be used either to replace a \l Flickable or decorate an
existing \l Flickable. Depending on the platform, it will add scroll bars and existing \l Flickable. Depending on the platform, it will add scroll bars and
a content frame. a content frame.
Only one Item can be a direct child of the ScrollView and the child is implicitly anchored Only one Item can be a direct child of the ScrollView and the child is implicitly anchored
to fill the scroll view. to fill the scroll view.
Example: Example:
\code \code
ScrollView { ScrollView {
Image { source: "largeImage.png" } Image { source: "largeImage.png" }
} }
\endcode \endcode
In the previous example the Image item will implicitly get scroll behavior as if it was In the previous example the Image item will implicitly get scroll behavior as if it was
used within a \l Flickable. The width and height of the child item will be used to used within a \l Flickable. The width and height of the child item will be used to
define the size of the content area. define the size of the content area.
Example: Example:
\code \code
ScrollView { ScrollView {
ListView { ListView {
... ...
} }
} }
\endcode \endcode
In this case the content size of the ScrollView will simply mirror that of its contained In this case the content size of the ScrollView will simply mirror that of its contained
\l flickableItem. \l flickableItem.
You can create a custom appearance for a ScrollView by You can create a custom appearance for a ScrollView by
assigning a \l {ScrollViewStyle}. assigning a \l {ScrollViewStyle}.
*/ */
FocusScope { FocusScope {
id: root id: root
implicitWidth: 240 implicitWidth: 240
implicitHeight: 150 implicitHeight: 150
/*! /*!
This property tells the ScrollView if it should render This property tells the ScrollView if it should render
a frame around its content. a frame around its content.
The default value is \c false. The default value is \c false.
*/ */
property bool frameVisible: false property bool frameVisible: false
/*! \qmlproperty enumeration ScrollView::horizontalScrollBarPolicy /*! \qmlproperty enumeration ScrollView::horizontalScrollBarPolicy
\since QtQuick.Controls 1.3 \since QtQuick.Controls 1.3
This property holds the policy for showing the horizontal scrollbar. This property holds the policy for showing the horizontal scrollbar.
It can be any of the following values: It can be any of the following values:
\list \list
\li Qt.ScrollBarAsNeeded \li Qt.ScrollBarAsNeeded
\li Qt.ScrollBarAlwaysOff \li Qt.ScrollBarAlwaysOff
\li Qt.ScrollBarAlwaysOn \li Qt.ScrollBarAlwaysOn
\endlist \endlist
The default policy is \c Qt.ScrollBarAsNeeded. The default policy is \c Qt.ScrollBarAsNeeded.
*/ */
property alias horizontalScrollBarPolicy: scroller.horizontalScrollBarPolicy property alias horizontalScrollBarPolicy: scroller.horizontalScrollBarPolicy
/*! \qmlproperty enumeration ScrollView::verticalScrollBarPolicy /*! \qmlproperty enumeration ScrollView::verticalScrollBarPolicy
\since QtQuick.Controls 1.3 \since QtQuick.Controls 1.3
This property holds the policy for showing the vertical scrollbar. This property holds the policy for showing the vertical scrollbar.
It can be any of the following values: It can be any of the following values:
\list \list
\li Qt.ScrollBarAsNeeded \li Qt.ScrollBarAsNeeded
\li Qt.ScrollBarAlwaysOff \li Qt.ScrollBarAlwaysOff
\li Qt.ScrollBarAlwaysOn \li Qt.ScrollBarAlwaysOn
\endlist \endlist
The default policy is \c Qt.ScrollBarAsNeeded. The default policy is \c Qt.ScrollBarAsNeeded.
*/ */
property alias verticalScrollBarPolicy: scroller.verticalScrollBarPolicy property alias verticalScrollBarPolicy: scroller.verticalScrollBarPolicy
/*! /*!
This property controls if there should be a highlight This property controls if there should be a highlight
around the frame when the ScrollView has input focus. around the frame when the ScrollView has input focus.
The default value is \c false. The default value is \c false.
\note This property is only applicable on some platforms, such \note This property is only applicable on some platforms, such
as Mac OS. as Mac OS.
*/ */
property bool highlightOnFocus: false property bool highlightOnFocus: false
/*! /*!
\qmlproperty Item ScrollView::viewport \qmlproperty Item ScrollView::viewport
The viewport determines the current "window" on the contentItem. The viewport determines the current "window" on the contentItem.
In other words, it clips it and the size of the viewport tells you In other words, it clips it and the size of the viewport tells you
how much of the content area is visible. how much of the content area is visible.
*/ */
property alias viewport: viewportItem property alias viewport: viewportItem
/*! /*!
\qmlproperty Item ScrollView::flickableItem \qmlproperty Item ScrollView::flickableItem
The flickableItem of the ScrollView. If the contentItem provided The flickableItem of the ScrollView. If the contentItem provided
to the ScrollView is a Flickable, it will be the \l contentItem. to the ScrollView is a Flickable, it will be the \l contentItem.
*/ */
readonly property alias flickableItem: internal.flickableItem readonly property alias flickableItem: internal.flickableItem
/*! /*!
The contentItem of the ScrollView. This is set by the user. The contentItem of the ScrollView. This is set by the user.
Note that the definition of contentItem is somewhat different to that Note that the definition of contentItem is somewhat different to that
of a Flickable, where the contentItem is implicitly created. of a Flickable, where the contentItem is implicitly created.
*/ */
default property Item contentItem default property Item contentItem
/*! \internal */ /*! \internal */
property alias __scroller: scroller property alias __scroller: scroller
/*! \internal */ /*! \internal */
property alias __verticalScrollbarOffset: scroller.verticalScrollbarOffset property alias __verticalScrollbarOffset: scroller.verticalScrollbarOffset
/*! \internal */ /*! \internal */
property alias __wheelAreaScrollSpeed: wheelArea.scrollSpeed property alias __wheelAreaScrollSpeed: wheelArea.scrollSpeed
/*! \internal */ /*! \internal */
property int __scrollBarTopMargin: 0 property int __scrollBarTopMargin: 0
/*! \internal */ /*! \internal */
property int __viewTopMargin: 0 property int __viewTopMargin: 0
/*! \internal */ /*! \internal */
property alias __horizontalScrollBar: scroller.horizontalScrollBar property alias __horizontalScrollBar: scroller.horizontalScrollBar
/*! \internal */ /*! \internal */
property alias __verticalScrollBar: scroller.verticalScrollBar property alias __verticalScrollBar: scroller.verticalScrollBar
/*! \qmlproperty Component ScrollView::style /*! \qmlproperty Component ScrollView::style
The style Component for this control. The style Component for this control.
\sa {Qt Quick Controls Styles QML Types} \sa {Qt Quick Controls Styles QML Types}
*/ */
property Component style: Settings.styleComponent(Settings.style, "ScrollViewStyle.qml", root) property Component style: Settings.styleComponent(Settings.style, "ScrollViewStyle.qml", root)
/*! \internal */ /*! \internal */
property Style __style: styleLoader.item property Style __style: styleLoader.item
activeFocusOnTab: true activeFocusOnTab: true
onContentItemChanged: { onContentItemChanged: {
if (contentItem.hasOwnProperty("contentY") && // Check if flickable if (contentItem.hasOwnProperty("contentY") && // Check if flickable
contentItem.hasOwnProperty("contentHeight")) { contentItem.hasOwnProperty("contentHeight")) {
internal.flickableItem = contentItem // "Use content if it is a flickable internal.flickableItem = contentItem // "Use content if it is a flickable
internal.flickableItem.parent = viewportItem internal.flickableItem.parent = viewportItem
} else { } else {
internal.flickableItem = flickableComponent.createObject(viewportItem) internal.flickableItem = flickableComponent.createObject(viewportItem)
contentItem.parent = internal.flickableItem.contentItem contentItem.parent = internal.flickableItem.contentItem
} }
internal.flickableItem.anchors.fill = viewportItem internal.flickableItem.anchors.fill = viewportItem
if (!Settings.hasTouchScreen) if (!Settings.hasTouchScreen)
internal.flickableItem.interactive = false internal.flickableItem.interactive = false
} }
children: Item { children: Item {
id: internal id: internal
property Flickable flickableItem property Flickable flickableItem
Loader { Loader {
id: styleLoader id: styleLoader
sourceComponent: style sourceComponent: style
onStatusChanged: { onStatusChanged: {
if (status === Loader.Error) if (status === Loader.Error)
console.error("Failed to load Style for", root) console.error("Failed to load Style for", root)
} }
property alias __control: root property alias __control: root
} }
Binding { Binding {
target: flickableItem target: flickableItem
property: "contentHeight" property: "contentHeight"
when: contentItem !== flickableItem when: contentItem !== flickableItem
value: contentItem ? contentItem.height : 0 value: contentItem ? contentItem.height : 0
} }
Binding { Binding {
target: flickableItem target: flickableItem
when: contentItem !== flickableItem when: contentItem !== flickableItem
property: "contentWidth" property: "contentWidth"
value: contentItem ? contentItem.width : 0 value: contentItem ? contentItem.width : 0
} }
Connections { Connections {
target: flickableItem target: flickableItem
onContentYChanged: { onContentYChanged: {
scroller.blockUpdates = true scroller.blockUpdates = true
scroller.verticalScrollBar.value = flickableItem.contentY - flickableItem.originY scroller.verticalScrollBar.value = flickableItem.contentY - flickableItem.originY
scroller.blockUpdates = false scroller.blockUpdates = false
} }
onContentXChanged: { onContentXChanged: {
scroller.blockUpdates = true scroller.blockUpdates = true
scroller.horizontalScrollBar.value = flickableItem.contentX - flickableItem.originX scroller.horizontalScrollBar.value = flickableItem.contentX - flickableItem.originX
scroller.blockUpdates = false scroller.blockUpdates = false
} }
} }
anchors.fill: parent anchors.fill: parent
Component { Component {
id: flickableComponent id: flickableComponent
Flickable {} Flickable {}
} }
WheelArea { WheelArea {
id: wheelArea id: wheelArea
parent: flickableItem parent: flickableItem
z: -1 z: -1
// ### Note this is needed due to broken mousewheel behavior in Flickable. // ### Note this is needed due to broken mousewheel behavior in Flickable.
anchors.fill: parent anchors.fill: parent
property int acceleration: 40 property int acceleration: 40
property int flickThreshold: Settings.dragThreshold property int flickThreshold: Settings.dragThreshold
property real speedThreshold: 3 property real speedThreshold: 3
property real ignored: 0.001 // ## flick() does not work with 0 yVelocity property real ignored: 0.001 // ## flick() does not work with 0 yVelocity
property int maxFlick: 400 property int maxFlick: 400
property bool horizontalRecursionGuard: false property bool horizontalRecursionGuard: false
property bool verticalRecursionGuard: false property bool verticalRecursionGuard: false
horizontalMinimumValue: 0 horizontalMinimumValue: 0
horizontalMaximumValue: flickableItem ? flickableItem.contentWidth - viewport.width : 0 horizontalMaximumValue: flickableItem ? flickableItem.contentWidth - viewport.width : 0
verticalMinimumValue: 0 verticalMinimumValue: 0
verticalMaximumValue: flickableItem ? flickableItem.contentHeight - viewport.height + __viewTopMargin : 0 verticalMaximumValue: flickableItem ? flickableItem.contentHeight - viewport.height + __viewTopMargin : 0
// The default scroll speed for typical angle-based mouse wheels. The value // The default scroll speed for typical angle-based mouse wheels. The value
// comes originally from QTextEdit, which sets 20px steps by default, as well as // comes originally from QTextEdit, which sets 20px steps by default, as well as
// QQuickWheelArea. // QQuickWheelArea.
// TODO: centralize somewhere, QPlatformTheme? // TODO: centralize somewhere, QPlatformTheme?
scrollSpeed: 20 * (__style && __style.__wheelScrollLines || 1) scrollSpeed: 20 * (__style && __style.__wheelScrollLines || 1)
Connections { Connections {
target: flickableItem target: flickableItem
onContentYChanged: { onContentYChanged: {
wheelArea.verticalRecursionGuard = true wheelArea.verticalRecursionGuard = true
wheelArea.verticalValue = flickableItem.contentY - flickableItem.originY wheelArea.verticalValue = flickableItem.contentY - flickableItem.originY
wheelArea.verticalRecursionGuard = false wheelArea.verticalRecursionGuard = false
} }
onContentXChanged: { onContentXChanged: {
wheelArea.horizontalRecursionGuard = true wheelArea.horizontalRecursionGuard = true
wheelArea.horizontalValue = flickableItem.contentX - flickableItem.originX wheelArea.horizontalValue = flickableItem.contentX - flickableItem.originX
wheelArea.horizontalRecursionGuard = false wheelArea.horizontalRecursionGuard = false
} }
} }
onVerticalValueChanged: { onVerticalValueChanged: {
if (!verticalRecursionGuard) { if (!verticalRecursionGuard) {
var effectiveContentY = flickableItem.contentY - flickableItem.originY var effectiveContentY = flickableItem.contentY - flickableItem.originY
if (effectiveContentY < flickThreshold && verticalDelta > speedThreshold) { if (effectiveContentY < flickThreshold && verticalDelta > speedThreshold) {
flickableItem.flick(ignored, Math.min(maxFlick, acceleration * verticalDelta)) flickableItem.flick(ignored, Math.min(maxFlick, acceleration * verticalDelta))
} else if (effectiveContentY > flickableItem.contentHeight - flickThreshold - viewport.height } else if (effectiveContentY > flickableItem.contentHeight - flickThreshold - viewport.height
&& verticalDelta < -speedThreshold) { && verticalDelta < -speedThreshold) {
flickableItem.flick(ignored, Math.max(-maxFlick, acceleration * verticalDelta)) flickableItem.flick(ignored, Math.max(-maxFlick, acceleration * verticalDelta))
} else { } else {
flickableItem.contentY = verticalValue + flickableItem.originY flickableItem.contentY = verticalValue + flickableItem.originY
} }
flickableItem.contentY = Math.min(verticalMaximumValue, Math.max(0, flickableItem.contentY)); flickableItem.contentY = Math.min(verticalMaximumValue, Math.max(0, flickableItem.contentY));
} }
} }
onHorizontalValueChanged: { onHorizontalValueChanged: {
if (!horizontalRecursionGuard) if (!horizontalRecursionGuard)
flickableItem.contentX = horizontalValue + flickableItem.originX flickableItem.contentX = horizontalValue + flickableItem.originX
} }
} }
ScrollViewHelper { ScrollViewHelper {
id: scroller id: scroller
anchors.fill: parent anchors.fill: parent
active: wheelArea.active active: wheelArea.active
property bool outerFrame: !frameVisible || !(__style ? __style.__externalScrollBars : 0) property bool outerFrame: !frameVisible || !(__style ? __style.__externalScrollBars : 0)
property int scrollBarSpacing: outerFrame ? 0 : (__style ? __style.__scrollBarSpacing : 0) property int scrollBarSpacing: outerFrame ? 0 : (__style ? __style.__scrollBarSpacing : 0)
property int verticalScrollbarOffset: verticalScrollBar.visible && !verticalScrollBar.isTransient ? property int verticalScrollbarOffset: verticalScrollBar.visible && !verticalScrollBar.isTransient ?
verticalScrollBar.width + scrollBarSpacing : 0 verticalScrollBar.width + scrollBarSpacing : 0
property int horizontalScrollbarOffset: horizontalScrollBar.visible && !horizontalScrollBar.isTransient ? property int horizontalScrollbarOffset: horizontalScrollBar.visible && !horizontalScrollBar.isTransient ?
horizontalScrollBar.height + scrollBarSpacing : 0 horizontalScrollBar.height + scrollBarSpacing : 0
Loader { Loader {
id: frameLoader id: frameLoader
sourceComponent: __style ? __style.frame : null sourceComponent: __style ? __style.frame : null
anchors.fill: parent anchors.fill: parent
anchors.rightMargin: scroller.outerFrame ? 0 : scroller.verticalScrollbarOffset anchors.rightMargin: scroller.outerFrame ? 0 : scroller.verticalScrollbarOffset
anchors.bottomMargin: scroller.outerFrame ? 0 : scroller.horizontalScrollbarOffset anchors.bottomMargin: scroller.outerFrame ? 0 : scroller.horizontalScrollbarOffset
} }
Item { Item {
id: viewportItem id: viewportItem
anchors.fill: frameLoader anchors.fill: frameLoader
anchors.topMargin: frameVisible ? __style.padding.top : 0 anchors.topMargin: frameVisible ? __style.padding.top : 0
anchors.leftMargin: frameVisible ? __style.padding.left : 0 anchors.leftMargin: frameVisible ? __style.padding.left : 0
anchors.rightMargin: (frameVisible ? __style.padding.right : 0) + (scroller.outerFrame ? scroller.verticalScrollbarOffset : 0) anchors.rightMargin: (frameVisible ? __style.padding.right : 0) + (scroller.outerFrame ? scroller.verticalScrollbarOffset : 0)
anchors.bottomMargin: (frameVisible ? __style.padding.bottom : 0) + (scroller.outerFrame ? scroller.horizontalScrollbarOffset : 0) anchors.bottomMargin: (frameVisible ? __style.padding.bottom : 0) + (scroller.outerFrame ? scroller.horizontalScrollbarOffset : 0)
clip: true clip: true
} }
} }
FocusFrame { visible: highlightOnFocus && root.activeFocus } FocusFrame { visible: highlightOnFocus && root.activeFocus }
} }
} }

View File

@ -1,403 +1,403 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/ ** Contact: http://www.qt.io/licensing/
** **
** This file is part of the Qt Quick Controls module of the Qt Toolkit. ** This file is part of the Qt Quick Controls module of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL3$ ** $QT_BEGIN_LICENSE:LGPL3$
** Commercial License Usage ** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in ** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the ** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in ** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms ** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further ** and conditions see http://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us. ** information use the contact form at http://www.qt.io/contact-us.
** **
** GNU Lesser General Public License Usage ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software ** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPLv3 included in the ** Foundation and appearing in the file LICENSE.LGPLv3 included in the
** packaging of this file. Please review the following information to ** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements ** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl.html. ** will be met: https://www.gnu.org/licenses/lgpl.html.
** **
** GNU General Public License Usage ** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU ** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or later as published by the Free ** General Public License version 2.0 or later as published by the Free
** Software Foundation and appearing in the file LICENSE.GPL included in ** Software Foundation and appearing in the file LICENSE.GPL included in
** the packaging of this file. Please review the following information to ** the packaging of this file. Please review the following information to
** ensure the GNU General Public License version 2.0 requirements will be ** ensure the GNU General Public License version 2.0 requirements will be
** met: http://www.gnu.org/licenses/gpl-2.0.html. ** met: http://www.gnu.org/licenses/gpl-2.0.html.
** **
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **
****************************************************************************/ ****************************************************************************/
import QtQuick 2.2 import QtQuick 2.2
import QtQuick.Controls 1.2 import QtQuick.Controls 1.2
import QtQuick.Controls.Private 1.0 import QtQuick.Controls.Private 1.0
/*! /*!
\qmltype ScrollViewStyle \qmltype ScrollViewStyle
\inqmlmodule QtQuick.Controls.Styles \inqmlmodule QtQuick.Controls.Styles
\since 5.1 \since 5.1
\ingroup viewsstyling \ingroup viewsstyling
\ingroup controlsstyling \ingroup controlsstyling
\brief Provides custom styling for ScrollView \brief Provides custom styling for ScrollView
*/ */
Style { Style {
id: root id: root
/*! The \l ScrollView this style is attached to. */ /*! The \l ScrollView this style is attached to. */
readonly property ScrollView control: __control readonly property ScrollView control: __control
/*! This property controls the frame border padding of the scrollView. */ /*! This property controls the frame border padding of the scrollView. */
padding {left: 1; top: 1; right: 1; bottom: 1} padding {left: 1; top: 1; right: 1; bottom: 1}
/*! This Component paints the corner area between scroll bars */ /*! This Component paints the corner area between scroll bars */
property Component corner: Rectangle { color: "#ccc" } property Component corner: Rectangle { color: "#ccc" }
/*! This component determines if the flickable should reposition itself at the /*! This component determines if the flickable should reposition itself at the
mouse location when clicked. */ mouse location when clicked. */
property bool scrollToClickedPosition: true property bool scrollToClickedPosition: true
/*! This property holds whether the scroll bars are transient. Transient scroll bars /*! This property holds whether the scroll bars are transient. Transient scroll bars
appear when the content is scrolled and disappear when they are no longer needed. appear when the content is scrolled and disappear when they are no longer needed.
The default value is platform dependent. */ The default value is platform dependent. */
property bool transientScrollBars: Settings.isMobile && Settings.hasTouchScreen property bool transientScrollBars: Settings.isMobile && Settings.hasTouchScreen
/*! This Component paints the frame around scroll bars. */ /*! This Component paints the frame around scroll bars. */
property Component frame: Rectangle { property Component frame: Rectangle {
color: control["backgroundVisible"] ? "white": "transparent" color: control["backgroundVisible"] ? "white": "transparent"
border.color: "#999" border.color: "#999"
border.width: 1 border.width: 1
radius: 1 radius: 1
visible: control.frameVisible visible: control.frameVisible
} }
/*! This is the minimum extent of the scroll bar handle. /*! This is the minimum extent of the scroll bar handle.
The default value is \c 30. The default value is \c 30.
*/ */
property int minimumHandleLength: 30 property int minimumHandleLength: 30
/*! This property controls the edge overlap /*! This property controls the edge overlap
between the handle and the increment/decrement buttons. between the handle and the increment/decrement buttons.
The default value is \c 30. The default value is \c 30.
*/ */
property int handleOverlap: 1 property int handleOverlap: 1
/*! This component controls the appearance of the /*! This component controls the appearance of the
scroll bar background. scroll bar background.
You can access the following state properties: You can access the following state properties:
\table \table
\row \li property bool \b styleData.hovered \row \li property bool \b styleData.hovered
\row \li property bool \b styleData.horizontal \row \li property bool \b styleData.horizontal
\endtable \endtable
*/ */
property Component scrollBarBackground: Item { property Component scrollBarBackground: Item {
property bool sticky: false property bool sticky: false
property bool hovered: styleData.hovered property bool hovered: styleData.hovered
implicitWidth: Math.round(TextSingleton.implicitHeight) implicitWidth: Math.round(TextSingleton.implicitHeight)
implicitHeight: Math.round(TextSingleton.implicitHeight) implicitHeight: Math.round(TextSingleton.implicitHeight)
clip: true clip: true
opacity: transientScrollBars ? 0.5 : 1.0 opacity: transientScrollBars ? 0.5 : 1.0
visible: !Settings.hasTouchScreen && (!transientScrollBars || sticky) visible: !Settings.hasTouchScreen && (!transientScrollBars || sticky)
Rectangle { Rectangle {
anchors.fill: parent anchors.fill: parent
color: "#ddd" color: "#ddd"
border.color: "#aaa" border.color: "#aaa"
anchors.rightMargin: styleData.horizontal ? -2 : -1 anchors.rightMargin: styleData.horizontal ? -2 : -1
anchors.leftMargin: styleData.horizontal ? -2 : 0 anchors.leftMargin: styleData.horizontal ? -2 : 0
anchors.topMargin: styleData.horizontal ? 0 : -2 anchors.topMargin: styleData.horizontal ? 0 : -2
anchors.bottomMargin: styleData.horizontal ? -1 : -2 anchors.bottomMargin: styleData.horizontal ? -1 : -2
} }
onHoveredChanged: if (hovered) sticky = true onHoveredChanged: if (hovered) sticky = true
onVisibleChanged: if (!visible) sticky = false onVisibleChanged: if (!visible) sticky = false
} }
/*! This component controls the appearance of the /*! This component controls the appearance of the
scroll bar handle. scroll bar handle.
You can access the following state properties: You can access the following state properties:
\table \table
\row \li property bool \b styleData.hovered \row \li property bool \b styleData.hovered
\row \li property bool \b styleData.pressed \row \li property bool \b styleData.pressed
\row \li property bool \b styleData.horizontal \row \li property bool \b styleData.horizontal
\endtable \endtable
*/ */
property Component handle: Item { property Component handle: Item {
property bool sticky: false property bool sticky: false
property bool hovered: __activeControl !== "none" property bool hovered: __activeControl !== "none"
implicitWidth: Math.round(TextSingleton.implicitHeight) + 1 implicitWidth: Math.round(TextSingleton.implicitHeight) + 1
implicitHeight: Math.round(TextSingleton.implicitHeight) + 1 implicitHeight: Math.round(TextSingleton.implicitHeight) + 1
BorderImage { BorderImage {
id: img id: img
opacity: styleData.pressed && !transientScrollBars ? 0.5 : styleData.hovered ? 1 : 0.8 opacity: styleData.pressed && !transientScrollBars ? 0.5 : styleData.hovered ? 1 : 0.8
source: "images/scrollbar-handle-" + (transientScrollBars ? "transient" : styleData.horizontal ? "horizontal" : "vertical") + ".png" source: "images/scrollbar-handle-" + (transientScrollBars ? "transient" : styleData.horizontal ? "horizontal" : "vertical") + ".png"
border.left: transientScrollBars ? 5 : 2 border.left: transientScrollBars ? 5 : 2
border.top: transientScrollBars ? 5 : 2 border.top: transientScrollBars ? 5 : 2
border.right: transientScrollBars ? 5 : 2 border.right: transientScrollBars ? 5 : 2
border.bottom: transientScrollBars ? 5 : 2 border.bottom: transientScrollBars ? 5 : 2
anchors.top: !styleData.horizontal ? parent.top : undefined anchors.top: !styleData.horizontal ? parent.top : undefined
anchors.margins: transientScrollBars ? 2 : 0 anchors.margins: transientScrollBars ? 2 : 0
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
anchors.right: parent.right anchors.right: parent.right
anchors.left: styleData.horizontal ? parent.left : undefined anchors.left: styleData.horizontal ? parent.left : undefined
width: !styleData.horizontal && transientScrollBars ? sticky ? 13 : 10 : parent.width width: !styleData.horizontal && transientScrollBars ? sticky ? 13 : 10 : parent.width
height: styleData.horizontal && transientScrollBars ? sticky ? 13 : 10 : parent.height height: styleData.horizontal && transientScrollBars ? sticky ? 13 : 10 : parent.height
Behavior on width { enabled: !styleData.horizontal && transientScrollBars; NumberAnimation { duration: 100 } } Behavior on width { enabled: !styleData.horizontal && transientScrollBars; NumberAnimation { duration: 100 } }
Behavior on height { enabled: styleData.horizontal && transientScrollBars; NumberAnimation { duration: 100 } } Behavior on height { enabled: styleData.horizontal && transientScrollBars; NumberAnimation { duration: 100 } }
} }
onHoveredChanged: if (hovered) sticky = true onHoveredChanged: if (hovered) sticky = true
onVisibleChanged: if (!visible) sticky = false onVisibleChanged: if (!visible) sticky = false
} }
/*! This component controls the appearance of the /*! This component controls the appearance of the
scroll bar increment button. scroll bar increment button.
You can access the following state properties: You can access the following state properties:
\table \table
\row \li property bool \b styleData.hovered \row \li property bool \b styleData.hovered
\row \li property bool \b styleData.pressed \row \li property bool \b styleData.pressed
\row \li property bool \b styleData.horizontal \row \li property bool \b styleData.horizontal
\endtable \endtable
*/ */
property Component incrementControl: Rectangle { property Component incrementControl: Rectangle {
visible: !transientScrollBars visible: !transientScrollBars
implicitWidth: transientScrollBars ? 0 : Math.round(TextSingleton.implicitHeight) implicitWidth: transientScrollBars ? 0 : Math.round(TextSingleton.implicitHeight)
implicitHeight: transientScrollBars ? 0 : Math.round(TextSingleton.implicitHeight) implicitHeight: transientScrollBars ? 0 : Math.round(TextSingleton.implicitHeight)
Rectangle { Rectangle {
anchors.fill: parent anchors.fill: parent
anchors.bottomMargin: -1 anchors.bottomMargin: -1
anchors.rightMargin: -1 anchors.rightMargin: -1
border.color: "#aaa" border.color: "#aaa"
Rectangle { Rectangle {
anchors.fill: parent anchors.fill: parent
anchors.margins: 1 anchors.margins: 1
color: "transparent" color: "transparent"
border.color: "#44ffffff" border.color: "#44ffffff"
} }
Image { Image {
source: styleData.horizontal ? "images/arrow-right.png" : "images/arrow-down.png" source: styleData.horizontal ? "images/arrow-right.png" : "images/arrow-down.png"
anchors.centerIn: parent anchors.centerIn: parent
opacity: control.enabled ? 0.6 : 0.5 opacity: control.enabled ? 0.6 : 0.5
} }
gradient: Gradient { gradient: Gradient {
GradientStop {color: styleData.pressed ? "lightgray" : "white" ; position: 0} GradientStop {color: styleData.pressed ? "lightgray" : "white" ; position: 0}
GradientStop {color: styleData.pressed ? "lightgray" : "lightgray" ; position: 1} GradientStop {color: styleData.pressed ? "lightgray" : "lightgray" ; position: 1}
} }
} }
} }
/*! This component controls the appearance of the /*! This component controls the appearance of the
scroll bar decrement button. scroll bar decrement button.
You can access the following state properties: You can access the following state properties:
\table \table
\row \li property bool \b styleData.hovered \row \li property bool \b styleData.hovered
\row \li property bool \b styleData.pressed \row \li property bool \b styleData.pressed
\row \li property bool \b styleData.horizontal \row \li property bool \b styleData.horizontal
\endtable \endtable
*/ */
property Component decrementControl: Rectangle { property Component decrementControl: Rectangle {
visible: !transientScrollBars visible: !transientScrollBars
implicitWidth: transientScrollBars ? 0 : Math.round(TextSingleton.implicitHeight) implicitWidth: transientScrollBars ? 0 : Math.round(TextSingleton.implicitHeight)
implicitHeight: transientScrollBars ? 0 : Math.round(TextSingleton.implicitHeight) implicitHeight: transientScrollBars ? 0 : Math.round(TextSingleton.implicitHeight)
Rectangle { Rectangle {
anchors.fill: parent anchors.fill: parent
anchors.topMargin: styleData.horizontal ? 0 : -1 anchors.topMargin: styleData.horizontal ? 0 : -1
anchors.leftMargin: styleData.horizontal ? -1 : 0 anchors.leftMargin: styleData.horizontal ? -1 : 0
anchors.bottomMargin: styleData.horizontal ? -1 : 0 anchors.bottomMargin: styleData.horizontal ? -1 : 0
anchors.rightMargin: styleData.horizontal ? 0 : -1 anchors.rightMargin: styleData.horizontal ? 0 : -1
color: "lightgray" color: "lightgray"
Rectangle { Rectangle {
anchors.fill: parent anchors.fill: parent
anchors.margins: 1 anchors.margins: 1
color: "transparent" color: "transparent"
border.color: "#44ffffff" border.color: "#44ffffff"
} }
Image { Image {
source: styleData.horizontal ? "images/arrow-left.png" : "images/arrow-up.png" source: styleData.horizontal ? "images/arrow-left.png" : "images/arrow-up.png"
anchors.centerIn: parent anchors.centerIn: parent
anchors.verticalCenterOffset: styleData.horizontal ? 0 : -1 anchors.verticalCenterOffset: styleData.horizontal ? 0 : -1
anchors.horizontalCenterOffset: styleData.horizontal ? -1 : 0 anchors.horizontalCenterOffset: styleData.horizontal ? -1 : 0
opacity: control.enabled ? 0.6 : 0.5 opacity: control.enabled ? 0.6 : 0.5
} }
gradient: Gradient { gradient: Gradient {
GradientStop {color: styleData.pressed ? "lightgray" : "white" ; position: 0} GradientStop {color: styleData.pressed ? "lightgray" : "white" ; position: 0}
GradientStop {color: styleData.pressed ? "lightgray" : "lightgray" ; position: 1} GradientStop {color: styleData.pressed ? "lightgray" : "lightgray" ; position: 1}
} }
border.color: "#aaa" border.color: "#aaa"
} }
} }
/*! \internal */ /*! \internal */
property Component __scrollbar: Item { property Component __scrollbar: Item {
id: panel id: panel
property string activeControl: "none" property string activeControl: "none"
property bool scrollToClickPosition: true property bool scrollToClickPosition: true
property bool isTransient: transientScrollBars property bool isTransient: transientScrollBars
property bool on: false property bool on: false
property bool raised: false property bool raised: false
property bool sunken: __styleData.upPressed | __styleData.downPressed | __styleData.handlePressed property bool sunken: __styleData.upPressed | __styleData.downPressed | __styleData.handlePressed
states: State { states: State {
name: "out" name: "out"
when: isTransient when: isTransient
&& (!__stickyScrollbars || !flickableItem.moving) && (!__stickyScrollbars || !flickableItem.moving)
&& panel.activeControl === "none" && panel.activeControl === "none"
&& !panel.on && !panel.on
&& !panel.raised && !panel.raised
PropertyChanges { target: panel; opacity: 0 } PropertyChanges { target: panel; opacity: 0 }
} }
transitions: Transition { transitions: Transition {
to: "out" to: "out"
SequentialAnimation { SequentialAnimation {
PauseAnimation { duration: root.__scrollBarFadeDelay } PauseAnimation { duration: root.__scrollBarFadeDelay }
NumberAnimation { properties: "opacity"; duration: root.__scrollBarFadeDuration } NumberAnimation { properties: "opacity"; duration: root.__scrollBarFadeDuration }
PropertyAction { target: panel; property: "visible"; value: false } PropertyAction { target: panel; property: "visible"; value: false }
} }
} }
implicitWidth: __styleData.horizontal ? 200 : bg.implicitWidth implicitWidth: __styleData.horizontal ? 200 : bg.implicitWidth
implicitHeight: __styleData.horizontal ? bg.implicitHeight : 200 implicitHeight: __styleData.horizontal ? bg.implicitHeight : 200
function pixelMetric(arg) { function pixelMetric(arg) {
if (arg === "scrollbarExtent") if (arg === "scrollbarExtent")
return (__styleData.horizontal ? bg.height : bg.width); return (__styleData.horizontal ? bg.height : bg.width);
return 0; return 0;
} }
function styleHint(arg) { function styleHint(arg) {
return false; return false;
} }
function hitTest(argX, argY) { function hitTest(argX, argY) {
if (itemIsHit(handleControl, argX, argY)) if (itemIsHit(handleControl, argX, argY))
return "handle" return "handle"
else if (itemIsHit(incrementLoader, argX, argY)) else if (itemIsHit(incrementLoader, argX, argY))
return "up"; return "up";
else if (itemIsHit(decrementLoader, argX, argY)) else if (itemIsHit(decrementLoader, argX, argY))
return "down"; return "down";
else if (itemIsHit(bg, argX, argY)) { else if (itemIsHit(bg, argX, argY)) {
if (__styleData.horizontal && argX < handleControl.x || !__styleData.horizontal && argY < handleControl.y) if (__styleData.horizontal && argX < handleControl.x || !__styleData.horizontal && argY < handleControl.y)
return "upPage" return "upPage"
else else
return "downPage" return "downPage"
} }
return "none"; return "none";
} }
function subControlRect(arg) { function subControlRect(arg) {
if (arg === "handle") { if (arg === "handle") {
return Qt.rect(handleControl.x, handleControl.y, handleControl.width, handleControl.height); return Qt.rect(handleControl.x, handleControl.y, handleControl.width, handleControl.height);
} else if (arg === "groove") { } else if (arg === "groove") {
if (__styleData.horizontal) { if (__styleData.horizontal) {
return Qt.rect(incrementLoader.width - handleOverlap, return Qt.rect(incrementLoader.width - handleOverlap,
0, 0,
__control.width - (incrementLoader.width + decrementLoader.width - handleOverlap * 2), __control.width - (incrementLoader.width + decrementLoader.width - handleOverlap * 2),
__control.height); __control.height);
} else { } else {
return Qt.rect(0, return Qt.rect(0,
incrementLoader.height - handleOverlap, incrementLoader.height - handleOverlap,
__control.width, __control.width,
__control.height - (incrementLoader.height + decrementLoader.height - handleOverlap * 2)); __control.height - (incrementLoader.height + decrementLoader.height - handleOverlap * 2));
} }
} }
return Qt.rect(0,0,0,0); return Qt.rect(0,0,0,0);
} }
function itemIsHit(argItem, argX, argY) { function itemIsHit(argItem, argX, argY) {
var pos = argItem.mapFromItem(__control, argX, argY); var pos = argItem.mapFromItem(__control, argX, argY);
return (pos.x >= 0 && pos.x <= argItem.width && pos.y >= 0 && pos.y <= argItem.height); return (pos.x >= 0 && pos.x <= argItem.width && pos.y >= 0 && pos.y <= argItem.height);
} }
Loader { Loader {
id: incrementLoader id: incrementLoader
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
sourceComponent: decrementControl sourceComponent: decrementControl
property QtObject styleData: QtObject { property QtObject styleData: QtObject {
readonly property bool hovered: activeControl === "up" readonly property bool hovered: activeControl === "up"
readonly property bool pressed: __styleData.upPressed readonly property bool pressed: __styleData.upPressed
readonly property bool horizontal: __styleData.horizontal readonly property bool horizontal: __styleData.horizontal
} }
} }
Loader { Loader {
id: bg id: bg
anchors.top: __styleData.horizontal ? undefined : incrementLoader.bottom anchors.top: __styleData.horizontal ? undefined : incrementLoader.bottom
anchors.bottom: __styleData.horizontal ? undefined : decrementLoader.top anchors.bottom: __styleData.horizontal ? undefined : decrementLoader.top
anchors.left: __styleData.horizontal ? incrementLoader.right : undefined anchors.left: __styleData.horizontal ? incrementLoader.right : undefined
anchors.right: __styleData.horizontal ? decrementLoader.left : undefined anchors.right: __styleData.horizontal ? decrementLoader.left : undefined
sourceComponent: scrollBarBackground sourceComponent: scrollBarBackground
property QtObject styleData: QtObject { property QtObject styleData: QtObject {
readonly property bool horizontal: __styleData.horizontal readonly property bool horizontal: __styleData.horizontal
readonly property bool hovered: activeControl !== "none" readonly property bool hovered: activeControl !== "none"
} }
} }
Loader { Loader {
id: decrementLoader id: decrementLoader
anchors.bottom: __styleData.horizontal ? undefined : parent.bottom anchors.bottom: __styleData.horizontal ? undefined : parent.bottom
anchors.right: __styleData.horizontal ? parent.right : undefined anchors.right: __styleData.horizontal ? parent.right : undefined
sourceComponent: incrementControl sourceComponent: incrementControl
property QtObject styleData: QtObject { property QtObject styleData: QtObject {
readonly property bool hovered: activeControl === "down" readonly property bool hovered: activeControl === "down"
readonly property bool pressed: __styleData.downPressed readonly property bool pressed: __styleData.downPressed
readonly property bool horizontal: __styleData.horizontal readonly property bool horizontal: __styleData.horizontal
} }
} }
property var flickableItem: control.flickableItem property var flickableItem: control.flickableItem
property int extent: Math.max(minimumHandleLength, __styleData.horizontal ? property int extent: Math.max(minimumHandleLength, __styleData.horizontal ?
(flickableItem ? flickableItem.width/flickableItem.contentWidth : 0 ) * bg.width : (flickableItem ? flickableItem.width/flickableItem.contentWidth : 0 ) * bg.width :
(flickableItem ? flickableItem.height/flickableItem.contentHeight : 0) * bg.height) (flickableItem ? flickableItem.height/flickableItem.contentHeight : 0) * bg.height)
readonly property real range: __control.maximumValue - __control.minimumValue readonly property real range: __control.maximumValue - __control.minimumValue
readonly property real begin: __control.value - __control.minimumValue readonly property real begin: __control.value - __control.minimumValue
Loader { Loader {
id: handleControl id: handleControl
height: __styleData.horizontal ? implicitHeight : extent height: __styleData.horizontal ? implicitHeight : extent
width: __styleData.horizontal ? extent : implicitWidth width: __styleData.horizontal ? extent : implicitWidth
anchors.top: bg.top anchors.top: bg.top
anchors.left: bg.left anchors.left: bg.left
anchors.topMargin: __styleData.horizontal || range === 0 ? 0 : -handleOverlap + (2 * begin * (bg.height + (2 * handleOverlap) - extent) + range) / (2 * range) anchors.topMargin: __styleData.horizontal || range === 0 ? 0 : -handleOverlap + (2 * begin * (bg.height + (2 * handleOverlap) - extent) + range) / (2 * range)
anchors.leftMargin: __styleData.horizontal && range !== 0 ? -handleOverlap + (2 * begin * (bg.width + (2 * handleOverlap) - extent) + range) / (2 * range) : 0 anchors.leftMargin: __styleData.horizontal && range !== 0 ? -handleOverlap + (2 * begin * (bg.width + (2 * handleOverlap) - extent) + range) / (2 * range) : 0
sourceComponent: handle sourceComponent: handle
property QtObject styleData: QtObject { property QtObject styleData: QtObject {
readonly property bool hovered: activeControl === "handle" readonly property bool hovered: activeControl === "handle"
readonly property bool pressed: __styleData.handlePressed readonly property bool pressed: __styleData.handlePressed
readonly property bool horizontal: __styleData.horizontal readonly property bool horizontal: __styleData.horizontal
} }
readonly property alias __activeControl: panel.activeControl readonly property alias __activeControl: panel.activeControl
} }
} }
/*! \internal */ /*! \internal */
property bool __externalScrollBars: false property bool __externalScrollBars: false
/*! \internal */ /*! \internal */
property int __scrollBarSpacing: 4 property int __scrollBarSpacing: 4
/*! \internal */ /*! \internal */
property int __scrollBarFadeDelay: 450 property int __scrollBarFadeDelay: 450
/*! \internal */ /*! \internal */
property int __scrollBarFadeDuration: 200 property int __scrollBarFadeDuration: 200
/*! \internal */ /*! \internal */
property bool __stickyScrollbars: false property bool __stickyScrollbars: false
} }