Sebastian Kügler a3b39a8321 All imports are now 2.0
This patch changes the version numbers of the plugins to 2.0. This
includes the previously 0.1 plasmacomponents, extras and
qtextracomponents. DragandDrop, which was at 1.0 is now also at 2.0.

Also, all the QML code has been changed to import the 2.0 plugins.

As a side-effect, we now share a version number with QtQuick 2.0 now.
2013-03-13 02:34:53 +01:00

260 lines
8.9 KiB
QML

/*
* Copyright 2012 Marco Martin <mart@kde.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA.
*/
import QtQuick 2.0
import org.kde.plasma.components 2.0 as PlasmaComponents
import org.kde.plasma.core 2.0 as PlasmaCore
/**
* This item takes a Flickable and automatically puts scrollbars in adjusting
* the layout if needed. The scrollbars will be interactive or not, depending
* on the platform. If flickableItem is a categorized ListView the vertical
* scrollbar will be a SectionScroller.
*/
Item {
id: root
/**
* The Flickable of this area: it can be either a Flickable or a subclass,
* ListView or GridView
*/
property Flickable flickableItem
//FIXME: this alias seems necessary for it to correctly parse
default property alias flickableItemDefault: root.flickableItem
Connections {
target: root
onFlickableItemChanged: {
root.flickableItem.parent = root
root.flickableItem.anchors.fill = root
root.flickableItem.clip = true
internal.checkVerticalScrollBar()
internal.checkHorizontalScrollBar()
}
}
Component.onCompleted: {
root.flickableItem.parent = root
root.flickableItem.anchors.fill = root
root.flickableItem.clip = true
internal.checkVerticalScrollBar()
internal.checkHorizontalScrollBar()
}
Connections {
target: flickableItem
onContentHeightChanged: internal.checkVerticalScrollBar()
onHeightChanged: internal.checkVerticalScrollBar()
onContentWidthChanged: internal.checkHorizontalScrollBar()
onWidthChanged: internal.checkHorizontalScrollBar()
}
QtObject {
id: internal
property Item verticalScrollBar
property Item horizontalScrollBar
function checkVerticalScrollBar() {
if (!flickableItem) {
return
}
if (flickableItem.contentHeight > flickableItem.height) {
//Do we have to change the type?
//from section to normal
if ((!flickableItem.model || flickableItem.model.get === undefined || !flickableItem.section || !flickableItem.section.property) &&
(!verticalScrollBar || verticalScrollBar.orientation === undefined)) {
if (verticalScrollBar) verticalScrollBar.destroy()
verticalScrollBar = verticalScrollBarComponent.createObject(root)
//from normal to section
} else if (flickableItem.section && flickableItem.section.property &&
flickableItem.model.get !== undefined &&
(!verticalScrollBar || verticalScrollBar.orientation !== undefined)) {
if (verticalScrollBar) verticalScrollBar.destroy()
verticalScrollBar = sectionScrollerComponent.createObject(root)
}
}
checkVerticalScrollBarMargins()
}
function checkVerticalScrollBarMargins() {
//undefined in case of SectionScroller
if ((flickableItem.contentHeight > flickableItem.height) &&
((verticalScrollBar.interactive && verticalScrollBar.visible) || (verticalScrollBar.orientation === undefined &&
//FIXME: heuristic on width to distinguish the touch sectionscroller
verticalScrollBar.width < 30))) {
flickableItem.anchors.rightMargin = verticalScrollBar.width
} else {
flickableItem.anchors.rightMargin = 0
}
}
function checkHorizontalScrollBar() {
if (!flickableItem || horizontalScrollBar) {
return
}
if (flickableItem.contentWidth > flickableItem.width) {
if (!horizontalScrollBar) {
horizontalScrollBar = horizontalScrollBarComponent.createObject(root)
}
}
checkHorizontalScrollBarMargins()
}
function checkHorizontalScrollBarMargins() {
if ((flickableItem.contentWidth > flickableItem.width) &&
horizontalScrollBar.interactive && horizontalScrollBar.visible) {
flickableItem.anchors.bottomMargin = horizontalScrollBar.height
} else {
flickableItem.anchors.bottomMargin = 0
}
}
}
Component {
id: verticalScrollBarComponent
PlasmaComponents.ScrollBar {
flickableItem: root.flickableItem
orientation: Qt.Vertical
property bool isScrollBar: true
z: root.flickableItem.z + 1
anchors {
left: undefined
top: root.top
right: root.right
bottom: root.bottom
bottomMargin: root.height - root.flickableItem.height
}
onVisibleChanged: internal.checkVerticalScrollBarMargins()
}
}
Component {
id: horizontalScrollBarComponent
PlasmaComponents.ScrollBar {
flickableItem: root.flickableItem
orientation: Qt.Horizontal
z: root.flickableItem.z + 1
anchors {
left: root.left
top: undefined
right: root.right
bottom: root.bottom
rightMargin: root.width - root.flickableItem.width
}
onVisibleChanged: internal.checkHorizontalScrollBarMargins()
}
}
Component {
id: sectionScrollerComponent
PlasmaComponents.SectionScroller {
listView: root.flickableItem
property bool isScrollBar: false
z: root.flickableItem.z + 1
anchors {
left: undefined
top: root.top
right: root.right
bottom: root.bottom
bottomMargin: root.height - root.flickableItem.height
}
onVisibleChanged: internal.checkVerticalScrollBarMargins()
}
}
//FIXME: create all this stuff only on demand, like scrollbars?
PlasmaCore.Svg {
id: borderSvg
imagePath: "widgets/scrollwidget"
}
PlasmaCore.SvgItem {
svg: borderSvg
z: 1000
elementId: "border-top"
width: 100
height: naturalSize.height
opacity: flickableItem.atYBeginning ? 0 : 1
Behavior on opacity {
NumberAnimation {
duration: 250
easing.type: Easing.InOutQuad
}
}
anchors {
left: parent.left
top: parent.top
right: parent.right
topMargin: flickableItem.anchors.topMargin
}
}
PlasmaCore.SvgItem {
svg: borderSvg
z: 1000
elementId: "border-bottom"
width: 100
height: naturalSize.height
opacity: flickableItem.atYEnd ? 0 : 1
Behavior on opacity {
NumberAnimation {
duration: 250
easing.type: Easing.InOutQuad
}
}
anchors {
left: parent.left
bottom: parent.bottom
right: parent.right
bottomMargin: flickableItem.anchors.bottomMargin
}
}
PlasmaCore.SvgItem {
svg: borderSvg
z: 1000
elementId: "border-left"
width: naturalSize.width
opacity: flickableItem.atXBeginning ? 0 : 1
Behavior on opacity {
NumberAnimation {
duration: 250
easing.type: Easing.InOutQuad
}
}
anchors {
left: parent.left
top: parent.top
bottom: parent.bottom
leftMargin: flickableItem.anchors.leftMargin
}
}
PlasmaCore.SvgItem {
svg: borderSvg
z: 1000
elementId: "border-right"
width: naturalSize.width
opacity: flickableItem.atXEnd ? 0 : 1
Behavior on opacity {
NumberAnimation {
duration: 250
easing.type: Easing.InOutQuad
}
}
anchors {
top: parent.top
bottom: parent.bottom
right: parent.right
rightMargin: flickableItem.anchors.rightMargin
}
}
}