218 lines
6.9 KiB
QML
218 lines
6.9 KiB
QML
import QtQuick
|
|
import QtQuick.Controls
|
|
import QtQuick.Templates as T
|
|
import qs.Constants
|
|
import qs.Noctalia
|
|
|
|
Item {
|
|
id: root
|
|
|
|
property color handleColor: Qt.alpha(Color.mTertiary, 0.8)
|
|
property color handleHoverColor: handleColor
|
|
property color handlePressedColor: handleColor
|
|
property color trackColor: Color.transparent
|
|
property real handleWidth: 6
|
|
property real handleRadius: Style.radiusM
|
|
property int verticalPolicy: ScrollBar.AsNeeded
|
|
property int horizontalPolicy: ScrollBar.AsNeeded
|
|
// Forward ListView properties
|
|
property alias model: listView.model
|
|
property alias delegate: listView.delegate
|
|
property alias spacing: listView.spacing
|
|
property alias orientation: listView.orientation
|
|
property alias currentIndex: listView.currentIndex
|
|
property alias count: listView.count
|
|
property alias contentHeight: listView.contentHeight
|
|
property alias contentWidth: listView.contentWidth
|
|
property alias contentY: listView.contentY
|
|
property alias contentX: listView.contentX
|
|
property alias currentItem: listView.currentItem
|
|
property alias highlightItem: listView.highlightItem
|
|
property alias headerItem: listView.headerItem
|
|
property alias footerItem: listView.footerItem
|
|
property alias section: listView.section
|
|
property alias highlightFollowsCurrentItem: listView.highlightFollowsCurrentItem
|
|
property alias highlightMoveDuration: listView.highlightMoveDuration
|
|
property alias highlightMoveVelocity: listView.highlightMoveVelocity
|
|
property alias preferredHighlightBegin: listView.preferredHighlightBegin
|
|
property alias preferredHighlightEnd: listView.preferredHighlightEnd
|
|
property alias highlightRangeMode: listView.highlightRangeMode
|
|
property alias snapMode: listView.snapMode
|
|
property alias keyNavigationWraps: listView.keyNavigationWraps
|
|
property alias cacheBuffer: listView.cacheBuffer
|
|
property alias displayMarginBeginning: listView.displayMarginBeginning
|
|
property alias displayMarginEnd: listView.displayMarginEnd
|
|
property alias layoutDirection: listView.layoutDirection
|
|
property alias effectiveLayoutDirection: listView.effectiveLayoutDirection
|
|
property alias verticalLayoutDirection: listView.verticalLayoutDirection
|
|
property alias boundsBehavior: listView.boundsBehavior
|
|
property alias flickableDirection: listView.flickableDirection
|
|
property alias interactive: listView.interactive
|
|
property alias moving: listView.moving
|
|
property alias flicking: listView.flicking
|
|
property alias dragging: listView.dragging
|
|
property alias horizontalVelocity: listView.horizontalVelocity
|
|
property alias verticalVelocity: listView.verticalVelocity
|
|
|
|
// Forward ListView methods
|
|
function positionViewAtIndex(index, mode) {
|
|
listView.positionViewAtIndex(index, mode);
|
|
}
|
|
|
|
function positionViewAtBeginning() {
|
|
listView.positionViewAtBeginning();
|
|
}
|
|
|
|
function positionViewAtEnd() {
|
|
listView.positionViewAtEnd();
|
|
}
|
|
|
|
function forceLayout() {
|
|
listView.forceLayout();
|
|
}
|
|
|
|
function cancelFlick() {
|
|
listView.cancelFlick();
|
|
}
|
|
|
|
function flick(xVelocity, yVelocity) {
|
|
listView.flick(xVelocity, yVelocity);
|
|
}
|
|
|
|
function incrementCurrentIndex() {
|
|
listView.incrementCurrentIndex();
|
|
}
|
|
|
|
function decrementCurrentIndex() {
|
|
listView.decrementCurrentIndex();
|
|
}
|
|
|
|
function indexAt(x, y) {
|
|
return listView.indexAt(x, y);
|
|
}
|
|
|
|
function itemAt(x, y) {
|
|
return listView.itemAt(x, y);
|
|
}
|
|
|
|
function itemAtIndex(index) {
|
|
return listView.itemAtIndex(index);
|
|
}
|
|
|
|
// Set reasonable implicit sizes for Layout usage
|
|
implicitWidth: 200
|
|
implicitHeight: 200
|
|
|
|
ListView {
|
|
id: listView
|
|
|
|
anchors.fill: parent
|
|
// Enable clipping to keep content within bounds
|
|
clip: true
|
|
// Enable flickable for smooth scrolling
|
|
boundsBehavior: Flickable.StopAtBounds
|
|
|
|
ScrollBar.vertical: ScrollBar {
|
|
parent: listView
|
|
x: listView.mirrored ? 0 : listView.width - width
|
|
y: 0
|
|
height: listView.height
|
|
active: listView.ScrollBar.horizontal.active
|
|
policy: root.verticalPolicy
|
|
|
|
contentItem: Rectangle {
|
|
implicitWidth: root.handleWidth
|
|
implicitHeight: 100
|
|
radius: root.handleRadius
|
|
color: parent.pressed ? root.handlePressedColor : parent.hovered ? root.handleHoverColor : root.handleColor
|
|
opacity: parent.policy === ScrollBar.AlwaysOn || parent.active ? 1 : 0
|
|
|
|
Behavior on opacity {
|
|
NumberAnimation {
|
|
duration: Style.animationFast
|
|
}
|
|
|
|
}
|
|
|
|
Behavior on color {
|
|
ColorAnimation {
|
|
duration: Style.animationFast
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
background: Rectangle {
|
|
implicitWidth: root.handleWidth
|
|
implicitHeight: 100
|
|
color: root.trackColor
|
|
opacity: parent.policy === ScrollBar.AlwaysOn || parent.active ? 0.3 : 0
|
|
radius: root.handleRadius / 2
|
|
|
|
Behavior on opacity {
|
|
NumberAnimation {
|
|
duration: Style.animationFast
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ScrollBar.horizontal: ScrollBar {
|
|
id: horizontalScrollBar
|
|
|
|
parent: listView
|
|
x: 0
|
|
y: listView.height - height
|
|
width: listView.width
|
|
active: listView.ScrollBar.vertical.active
|
|
policy: root.horizontalPolicy
|
|
|
|
contentItem: Rectangle {
|
|
implicitWidth: 100
|
|
implicitHeight: root.handleWidth
|
|
radius: root.handleRadius
|
|
color: parent.pressed ? root.handlePressedColor : parent.hovered ? root.handleHoverColor : root.handleColor
|
|
opacity: parent.policy === ScrollBar.AlwaysOn || parent.active ? 1 : 0
|
|
|
|
Behavior on opacity {
|
|
NumberAnimation {
|
|
duration: Style.animationFast
|
|
}
|
|
|
|
}
|
|
|
|
Behavior on color {
|
|
ColorAnimation {
|
|
duration: Style.animationFast
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
background: Rectangle {
|
|
implicitWidth: 100
|
|
implicitHeight: root.handleWidth
|
|
color: root.trackColor
|
|
opacity: parent.policy === ScrollBar.AlwaysOn || parent.active ? 0.3 : 0
|
|
radius: root.handleRadius / 2
|
|
|
|
Behavior on opacity {
|
|
NumberAnimation {
|
|
duration: Style.animationFast
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|