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