arenos-nexus/Arenos Nexus/Library/PackageCache/com.unity.collab-proxy@ab839cc7d2ad/Editor/UI/UIElements/LoadingSpinner.cs
Daniel 2e704cae70 init
Init Commit Unity
2025-09-25 22:01:28 +02:00

65 lines
1.9 KiB
C#

using UnityEditor;
using UnityEngine.UIElements;
namespace Unity.PlasticSCM.Editor.UI.UIElements
{
internal class LoadingSpinner : VisualElement
{
internal LoadingSpinner()
{
// add child elements to set up centered spinner rotation
mSpinner = new VisualElement();
Add(mSpinner);
mSpinner.style.backgroundImage = Images.GetImage(Images.Name.Loading);
mSpinner.style.position = Position.Absolute;
mSpinner.style.width = 16;
mSpinner.style.height = 16;
mSpinner.style.left = -8;
mSpinner.style.top = -8;
style.position = Position.Relative;
style.width = 16;
style.height = 16;
style.left = 8;
style.top = 8;
}
internal void Start()
{
if (mRotationEvent != null)
return;
mRotationEvent = mSpinner.schedule.Execute(UpdateProgress).Every(ROTATION_REFRESH_RATE);
mStartTime = EditorApplication.timeSinceStartup;
}
internal void Stop()
{
if (mRotationEvent == null)
return;
mRotationEvent.Pause();
mRotationEvent = null;
}
void UpdateProgress()
{
double elapsedTime = EditorApplication.timeSinceStartup - mStartTime;
int rotation = (int)(ROTATION_SPEED * elapsedTime) % 360;
mSpinnerStyleRotate.value = new Rotate(rotation);
mSpinner.style.rotate = mSpinnerStyleRotate;
}
double mStartTime;
VisualElement mSpinner;
IVisualElementScheduledItem mRotationEvent;
StyleRotate mSpinnerStyleRotate;
const int ROTATION_SPEED = 360; // Euler degrees per second
const int ROTATION_REFRESH_RATE = 32; // (ms) roughly 30 FPS
}
}