While "True"
If mouseClick And knobOn = "" Then
MouseClickKnobOff()
EndIf
If mouseDown And knobOn Then
MouseDownKnobOn()
EndIf
Program.Delay(20)
EndWhile
' ////////// SUBs \\\\\\\\\\
Sub MouseClickKnobOff
dX = GraphicsWindow.MouseX - knobX
dY = GraphicsWindow.MouseY - knobY
r = Math.SquareRoot(dX*dX + dY*dY)
If r <= knobWH2 Then
knobOn = "True"
EndIf
mouseClick = ""
EndSub
Sub MouseDownKnobOn
dX = GraphicsWindow.MouseX - knobX
dY = GraphicsWindow.MouseY - knobY
r = Math.SquareRoot(dX*dX + dY*dY)
If r > knobWH2 Then
knobOn = ""
Else ' ATan2 with 270° offset and neg. direction for y > 0
If dY = 0 Then
angle = pi/2
If dX < 0 Then
angle = angle + pi
EndIf
ElseIf dY < 0 Then
angle = Math.ArcTan(dX/dY) + pi
Else
angle = Math.ArcTan(dX/dY)
EndIf
angle = Math.Round(Math.GetDegrees(angle))
angle = Math.Remainder(360 - angle, 360)
EndIf
UpdateView()
EndSub
Sub UpdateView '' Shows Angle in Title; calculates and shows 'view' value
GraphicsWindow.Title = title + angle
view = Math.Floor(angle / unitRange)
a = Math.GetRadians(angle)
x = knobX - (knobWH2 - 4) * Math.Sin(a) - 2
y = knobY + (knobWH2 - 4) * Math.Cos(a) - 2
Shapes.Move(shpDot, x, y)
Shapes.SetText(shpLabel, view + unit)
EndSub
Sub BuildGUI
GraphicsWindow.BackgroundColor = "#1D1D1D"
GraphicsWindow.DrawImage(imgScale, knobX-scaleWH2, knobY-scaleWH2)