| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- // Copyright (C) 2024 The Qt Company Ltd.
- // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
- // Qt-Security score:significant reason:default
- import QtQuick
- import QtQuick.Controls.impl
- import QtQuick.Controls.FluentWinUI3.impl as Impl
- import QtQuick.Templates as T
- T.Slider {
- id: control
- implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
- implicitHandleWidth + leftPadding + rightPadding)
- implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
- implicitHandleHeight + topPadding + bottomPadding)
- topPadding: horizontal ? __config.topPadding : __config.leftPadding || 0
- leftPadding: horizontal ? __config.leftPadding : __config.bottomPadding || 0
- rightPadding: horizontal ? __config.rightPadding : __config.topPadding || 0
- bottomPadding: horizontal ? __config.bottomPadding : __config.rightPadding || 0
- readonly property string __currentState: [
- !control.enabled && "disabled",
- control.enabled && !control.pressed && control.hovered && "hovered",
- control.pressed && "pressed"
- ].filter(Boolean).join("_") || "normal"
- readonly property var __config: Config.controls.slider[__currentState] || {}
- readonly property Item __focusFrameTarget: control
- readonly property real __steps: Math.abs(to - from) / stepSize
- readonly property bool __isDiscrete: stepSize >= Number.EPSILON
- && Math.abs(Math.round(__steps) - __steps) < Number.EPSILON
- readonly property bool __isHighContrast: Application.styleHints.accessibility.contrastPreference === Qt.HighContrast
- handle: ItemGroup {
- x: Math.round(control.leftPadding + (control.horizontal
- ? control.visualPosition * (control.availableWidth - width)
- : (control.availableWidth - width) / 2))
- y: Math.round(control.topPadding + (control.horizontal
- ? (control.availableHeight - height) / 2
- : control.visualPosition * (control.availableHeight - height)))
- Impl.StyleImage {
- visible: !control.__isHighContrast
- imageConfig: control.__config.handle
- }
- Rectangle {
- visible: control.__isHighContrast
- implicitWidth: control.__config.handle.width
- implicitHeight: control.__config.handle.height
- color: control.palette.buttonText
- radius: width / 2
- }
- property HoverHandler _hoverHandler: HoverHandler {
- parent: control.handle
- target: control.handle
- }
- property Rectangle indicator: Rectangle {
- property real diameter: !control.enabled ? 10
- : control.pressed ? 8
- : control.__isHighContrast && !control.hovered ? 0
- : control.handle?._hoverHandler.hovered ? 14 : 10
- parent: control.handle
- width: diameter
- height: diameter
- radius: diameter * 0.5
- x: (control.__config.handle.width - width) / 2
- y: (control.__config.handle.height - height) / 2
- color: control.enabled ? (control.hovered ? Qt.rgba(control.palette.accent.r, control.palette.accent.g, control.palette.accent.b, 0.9020)
- : control.pressed ? Qt.rgba(control.palette.accent.r, control.palette.accent.g, control.palette.accent.b, 0.8)
- : control.palette.accent)
- : control.palette.accent
- Behavior on diameter {
- // From WindowsUI 3 Animation Values
- NumberAnimation {
- duration: 167
- easing.type: Easing.OutCubic
- }
- }
- }
- }
- background: Item {
- implicitWidth: control.horizontal
- ? (control.__config.groove.width)
- : (control.__config.groove.height)
- implicitHeight: control.horizontal
- ? (control.__config.groove.height)
- : (control.__config.groove.width)
- property Item _background: Impl.StyleImage {
- visible: !control.__isHighContrast
- parent: control.background
- width: parent.width
- height: parent.height
- imageConfig: control.__config.background
- property Item groove: Impl.StyleImage {
- parent: control.background._background
- x: control.leftPadding - control.leftInset + (control.horizontal
- ? control.__config.handle.width / 2
- : (control.availableWidth - width) / 2)
- y: control.topPadding - control.topInset + (control.horizontal
- ? ((control.availableHeight - height) / 2)
- : control.__config.handle.height / 2)
- width: control.horizontal
- ? control.availableWidth - control.__config.handle.width
- : implicitWidth
- height: control.horizontal
- ? implicitHeight
- : control.availableHeight - control.__config.handle.width
- imageConfig: control.__config.groove
- horizontal: control.horizontal
- property Rectangle track: Rectangle {
- parent: control.background._background.groove
- y: control.horizontal ? 0 : parent.height - (parent.height * control.position)
- implicitWidth: control.horizontal ? control.__config.track.width : control.__config.track.height
- implicitHeight: control.horizontal ? control.__config.track.height : control.__config.track.width
- width: control.horizontal ? parent.width * control.position : parent.width
- height: control.horizontal ? parent.height : parent.height * control.position
- radius: control.__config.track.height * 0.5
- color: control.palette.accent
- }
- }
- property Repeater ticksTop: Repeater {
- parent: control.__isHighContrast ? control.background._highContrastBackground : control.background._background.groove
- model: control.__isDiscrete ? Math.floor(control.__steps) + 1 : 0
- delegate: Rectangle {
- width: control.horizontal ? 1 : 4
- height: control.horizontal ? 4 : 1
- x: control.horizontal
- ? 6 + index * (parent.width - 2 * 6 - width) / (control.background._background.ticksTop.model - 1)
- : -4 - width
- y: control.horizontal
- ? -4 - height
- : 6 + index * (parent.height - 2 * 6 - height) / (control.background._background.ticksTop.model - 1)
- color: Application.styleHints.colorScheme == Qt.Light ? "#9C000000" : "#9AFFFFFF"
- required property int index
- }
- }
- property Repeater ticksBottom: Repeater {
- parent: control.__isHighContrast ? control.background._highContrastBackground : control.background._background.groove
- model: control.__isDiscrete ? Math.floor(control.__steps) + 1 : 0
- delegate: Rectangle {
- width: control.horizontal ? 1 : 4
- height: control.horizontal ? 4 : 1
- x: control.horizontal
- ? 6 + index * (parent.width - 2 * 6 - width) / (control.background._background.ticksBottom.model - 1)
- : parent.width + 4
- y: control.horizontal
- ? parent.height + 4
- : 6 + index * (parent.height - 2 * 6 - height) / (control.background._background.ticksBottom.model - 1)
- color: Application.styleHints.colorScheme == Qt.Light ? "#9C000000" : "#9AFFFFFF"
- required property int index
- }
- }
- }
- property Item _highContrastBackground: Rectangle {
- parent: control.background
- visible: control.__isHighContrast
- implicitWidth: control.horizontal ? 200 : 4
- implicitHeight: control.horizontal ? 4 : 200
- x: control.leftPadding - control.leftInset + (control.horizontal
- ? control.__config.handle.width / 2
- : (control.availableWidth - width) / 2)
- y: control.topPadding - control.topInset + (control.horizontal
- ? ((control.availableHeight - height) / 2)
- : control.__config.handle.height / 2)
- width: control.horizontal
- ? control.availableWidth - control.__config.handle.width
- : implicitWidth
- height: control.horizontal
- ? implicitHeight
- : control.availableHeight - control.__config.handle.width
- radius: 2
- color: control.palette.buttonText
- scale: control.horizontal && control.mirrored ? -1 : 1
- Rectangle {
- y: control.horizontal ? 0 : parent.height - (parent.height * control.position)
- implicitWidth: control.horizontal ? parent.width * control.position : parent.width
- implicitHeight: control.horizontal ? parent.height : parent.height * control.position
- radius: 2
- color: control.palette.highlight
- }
- }
- }
- }
|