﻿B4J=true
Group=Default Group
ModulesStructureVersion=1
Type=Class
Version=10.5
@EndOfDesignText@
#DesignerProperty: Key: DotColor, DisplayName: Dot Color, FieldType: Color, DefaultValue: 0xFF2196F3
#DesignerProperty: Key: DotCount, DisplayName: Dot Count, FieldType: Int, DefaultValue: 12
#DesignerProperty: Key: Speed, DisplayName: Speed (ms), FieldType: Int, DefaultValue: 70
#DesignerProperty: Key: AutoStart, DisplayName: Auto Start, FieldType: Boolean, DefaultValue: True

Sub Class_Globals
	Private mEventName As String 'ignore
	Private mCallBack As Object 'ignore
	Public mBase As B4XView
	Private xui As XUI 'ignore
	Public Tag As Object
	

	Private cvs As B4XCanvas
	Private tmr As Timer

	Private DotColor As Int
	Private DotCount As Int
	Private Speed As Int
	Private AutoStart As Boolean

	Private CurrentFrame As Int
	Private Running As Boolean
End Sub

Public Sub Initialize (Callback As Object, EventName As String)
	mEventName = EventName
	mCallBack = Callback
End Sub


Public Sub DesignerCreateView (Base As Object, Lbl As Label, Props As Map)
	mBase = Base
	Tag = mBase.Tag
	mBase.Tag = Me
	
	DotColor = xui.PaintOrColorToColor(Props.Get("DotColor"))
	DotCount = Max(3, Props.GetDefault("DotCount", 12))
	Speed = Props.GetDefault("Speed", 70)
	AutoStart = Props.GetDefault("AutoStart", True)

	cvs.Initialize(mBase)
	tmr.Initialize("tmr", Speed)
	DrawSpinner

	If AutoStart Then
		Start
	End If
End Sub

Private Sub Base_Resize (Width As Double, Height As Double)
	cvs.Resize(Width, Height)
	DrawSpinner
End Sub

Private Sub tmr_Tick
	CurrentFrame = (CurrentFrame + 1) Mod DotCount
	DrawSpinner
End Sub

Private Sub DrawSpinner
	If mBase.Width = 0 Or mBase.Height = 0 Then Return

	cvs.ClearRect(cvs.TargetRect)

	Dim cx As Float = mBase.Width / 2
	Dim cy As Float = mBase.Height / 2

	Dim CircleRadius As Float = Min(cx, cy) * 0.72

	For i = 0 To DotCount - 1

		Dim Pos As Int = (i - CurrentFrame + DotCount) Mod DotCount

		Dim AngleDeg As Double = ((360 / DotCount) * i) - 90
		Dim AngleRad As Double = AngleDeg * cPI / 180

		Dim x As Float = cx + Cos(AngleRad) * CircleRadius
		Dim y As Float = cy + Sin(AngleRad) * CircleRadius

		Dim Factor As Float = (DotCount - Pos) / DotCount

		Dim Radius As Float = 2dip + Factor * 6dip

		Dim Alpha As Int = 20 + Factor * 235

		Dim clr As Int = SetColorAlpha(Alpha, DotColor)

		cvs.DrawCircle(x, y, Radius, clr, True, 0)
	Next

	cvs.Invalidate
End Sub

Private Sub SetColorAlpha(Alpha As Int, Color As Int) As Int
	Dim r As Int = Bit.UnsignedShiftRight(Bit.And(Color, 0x00FF0000),16)
	Dim g As Int = Bit.UnsignedShiftRight(Bit.And(Color, 0x0000FF00),8)
	Dim b As Int =  Bit.And(Color, 0x000000FF)
	Return xui.Color_ARGB(Alpha, r, g, b)
End Sub


Public Sub Start
	Running = True
	tmr.Enabled = True
End Sub

Public Sub Stop
	Running = False
	tmr.Enabled = False
End Sub

Public Sub IsRunning As Boolean
	Return Running
End Sub

Public Sub SetColor(Color As Int)
	DotColor = Color
	DrawSpinner
End Sub

Public Sub SetSpeed(Milliseconds As Int)
	Speed = Milliseconds
	tmr.Interval = Speed
End Sub

Public Sub SetDotCount(Count As Int)
	DotCount = Max(3, Count)
	CurrentFrame = 0
	DrawSpinner
End Sub
