Warning, /frameworks/qqc2-desktop-style/org.kde.desktop/BusyIndicator.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 SPDX-FileCopyrightText: 2018 Oleg Chernovskiy <adonai@xaker.ru>
0003 SPDX-FileCopyrightText: 2018 The Qt Company Ltd.
0004 SPDX-FileCopyrightText: 2022 ivan tkachenko <me@ratijas.tk>
0005
0006 SPDX-License-Identifier: LGPL-3.0-only OR GPL-2.0-or-later
0007 */
0008
0009 import QtQuick
0010 import QtQuick.Templates as T
0011 import org.kde.kirigami as Kirigami
0012
0013 T.BusyIndicator {
0014 id: control
0015
0016 implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
0017 implicitContentWidth + leftPadding + rightPadding)
0018 implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
0019 implicitContentHeight + topPadding + bottomPadding)
0020
0021 // BusyIndicator doesn't need padding since it has no background.
0022 // A Control containing a BusyIndicator can have padding instead
0023 // (e.g., a ToolBar, a Page or maybe a widget in a Plasma panel).
0024 padding: 0
0025
0026 hoverEnabled: false
0027
0028 contentItem: Item {
0029 /* Binding on `visible` implicitly takes care of `control.visible`,
0030 * `control.running` and `opacity > 0` at once.
0031 * Also, don't animate at all if the user has disabled animations,
0032 * and don't animate when window is hidden (which somehow does not
0033 * affect items' visibility).
0034 */
0035 readonly property bool animationShouldBeRunning:
0036 visible
0037 && Window.visibility !== Window.Hidden
0038 && Kirigami.Units.longDuration > 1
0039
0040 /* implicitWidth and implicitHeight won't work unless they come
0041 * from a child of the contentItem. No idea why.
0042 */
0043 implicitWidth: Kirigami.Units.gridUnit * 2
0044 implicitHeight: Kirigami.Units.gridUnit * 2
0045
0046 // We can't bind directly to opacity, as Animator won't update its value immediately.
0047 visible: control.running || opacityAnimator.running
0048 opacity: control.running ? 1 : 0
0049 Behavior on opacity {
0050 OpacityAnimator {
0051 id: opacityAnimator
0052 duration: Kirigami.Units.shortDuration
0053 easing.type: Easing.OutCubic
0054 }
0055 }
0056
0057 // sync all busy animations such that they start at a common place in the rotation
0058 onAnimationShouldBeRunningChanged: startOrStopAnimation();
0059
0060 function startOrStopAnimation() {
0061 if (rotationAnimator.running === animationShouldBeRunning) {
0062 return;
0063 }
0064 if (animationShouldBeRunning) {
0065 const date = new Date;
0066 const ms = date.valueOf();
0067 const startAngle = ((ms % rotationAnimator.duration) / rotationAnimator.duration) * 360;
0068 rotationAnimator.from = startAngle;
0069 rotationAnimator.to = startAngle + 360
0070 }
0071 rotationAnimator.running = animationShouldBeRunning;
0072 }
0073
0074 Kirigami.Icon {
0075 /* Do not use `anchors.fill: parent` in here or else
0076 * the aspect ratio won't always be 1:1.
0077 */
0078 anchors.centerIn: parent
0079 width: Math.min(parent.width, parent.height)
0080 height: width
0081
0082 source: "process-working-symbolic"
0083 smooth: true
0084
0085 RotationAnimator on rotation {
0086 id: rotationAnimator
0087 from: 0
0088 to: 360
0089 // Not using a standard duration value because we don't want the
0090 // animation to spin faster or slower based on the user's animation
0091 // scaling preferences; it doesn't make sense in this context
0092 duration: 2000
0093 loops: Animation.Infinite
0094 // Initially false, will be set as appropriate after
0095 // initialization. Can't be bound declaratively due to the
0096 // procedural nature of to/from adjustments: order of
0097 // assignments is crucial, as animator won't use new to/from
0098 // values while running.
0099 running: false
0100 }
0101 }
0102
0103 Component.onCompleted: startOrStopAnimation();
0104 }
0105 }