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 } } } } } }