Files
overtime-guard/refusi/AnalogClockX.bas
2024-12-28 13:09:34 +01:00

144 lines
5.3 KiB
QBasic

Sub Class_Globals
Private pnlClock As Panel ' Pannello in cui disegnare l'orologio
Private cvsClock As Canvas ' Canvas per disegnare l'orologio
Private clockDiameter As Float ' Diametro dell'orologio (in pixel)
Private centerX As Float ' Coordinata X del centro dell'orologio
Private centerY As Float ' Coordinata Y del centro dell'orologio
Private intervals As List ' Lista degli intervalli da disegnare
End Sub
' Inizializza l'orologio
Public Sub Initialize(ParentPanel As Panel, PercentageOfWidth As Float)
pnlClock = ParentPanel
cvsClock.Initialize(pnlClock)
intervals.Initialize
SetClockSize(PercentageOfWidth)
End Sub
' Imposta la dimensione dell'orologio come percentuale della larghezza del pannello
Public Sub SetClockSize(PercentageOfWidth As Float)
clockDiameter = pnlClock.Width * PercentageOfWidth / 100
centerX = pnlClock.Width / 2
centerY = pnlClock.Height / 2
DrawClock
End Sub
' Disegna l'orologio
Public Sub DrawClock
cvsClock.Initialize(pnlClock)
' Cancella il canvas
cvsClock.DrawColor(Colors.White)
' Disegna il cerchio esterno
cvsClock.DrawCircle(centerX, centerY, clockDiameter / 2, Colors.Black, False, 5)
' Disegna le tacche delle ore e dei minuti
DrawTicks
' Disegna gli intervalli
For Each interval As Map In intervals
DrawInterval(interval.Get("startHour"), interval.Get("startMinute"), interval.Get("endHour"), interval.Get("endMinute"), interval.Get("color"), interval.Get("radius"))
Next
' Disegna le lancette
Dim now As Long = DateTime.Now
Dim Hours As Int = DateTime.GetHour(now) Mod 12
Dim Minutes As Int = DateTime.GetMinute(now)
Dim Seconds As Int = DateTime.GetSecond(now)
' Lancetta ore
Dim HourAngle As Float = -90 + Hours * 30 + Minutes / 2
DrawHand(centerX, centerY, clockDiameter * 0.25, HourAngle, 8, Colors.Black)
' Lancetta minuti
Dim MinuteAngle As Float = -90 + Minutes * 6
DrawHand(centerX, centerY, clockDiameter * 0.4, MinuteAngle, 5, Colors.Blue)
' Lancetta secondi
Dim SecondAngle As Float = -90 + Seconds * 6
DrawHand(centerX, centerY, clockDiameter * 0.45, SecondAngle, 2, Colors.Red)
' Aggiorna il pannello
pnlClock.Invalidate
End Sub
' Disegna una singola lancetta
Private Sub DrawHand(x As Float, y As Float, length As Float, angle As Float, width As Int, color As Int)
Dim endX As Float = x + length * CosD(angle)
Dim endY As Float = y + length * SinD(angle)
cvsClock.DrawLine(x, y, endX, endY, color, width)
End Sub
' Disegna le tacche delle ore e dei minuti
Private Sub DrawTicks
For i = 0 To 59
Dim angle As Float = -90 + i * 6
Dim startX As Float
Dim startY As Float
Dim endX As Float
Dim endY As Float
If i Mod 5 = 0 Then
' Tacca delle ore
startX = centerX + (clockDiameter / 2 - 20dip) * CosD(angle)
startY = centerY + (clockDiameter / 2 - 20dip) * SinD(angle)
endX = centerX + (clockDiameter / 2 - 5dip) * CosD(angle)
endY = centerY + (clockDiameter / 2 - 5dip) * SinD(angle)
cvsClock.DrawLine(startX, startY, endX, endY, Colors.Black, 5)
Else
' Tacca dei minuti
startX = centerX + (clockDiameter / 2 - 10dip) * CosD(angle)
startY = centerY + (clockDiameter / 2 - 10dip) * SinD(angle)
endX = centerX + (clockDiameter / 2 - 5dip) * CosD(angle)
endY = centerY + (clockDiameter / 2 - 5dip) * SinD(angle)
cvsClock.DrawLine(startX, startY, endX, endY, Colors.Black, 2)
End If
Next
End Sub
' Aggiunge un intervallo da disegnare
Public Sub AddInterval(startHour As Int, startMinute As Int, endHour As Int, endMinute As Int, tipo As String)
Dim interval As Map
interval.Initialize
interval.Put("startHour", startHour)
interval.Put("startMinute", startMinute)
interval.Put("endHour", endHour)
interval.Put("endMinute", endMinute)
Select tipo.ToLowerCase
Case "mattino"
interval.Put("color", Colors.Blue)
interval.Put("radius", clockDiameter / 2 - 15dip)
Case "pomeriggio"
interval.Put("color", Colors.Green)
interval.Put("radius", clockDiameter / 2 - 25dip)
Case Else
Log("Tipo di intervallo non riconosciuto: " & tipo)
Return
End Select
intervals.Add(interval)
DrawClock
End Sub
' Disegna un intervallo sul quadrante
Private Sub DrawInterval(startHour As Int, startMinute As Int, endHour As Int, endMinute As Int, color As Int, radius As Float)
Dim startAngle As Float = (startHour Mod 12 + startMinute / 60) * 30 - 90
Dim endAngle As Float = (endHour Mod 12 + endMinute / 60) * 30 - 90
Dim sweepAngle As Float = endAngle - startAngle
If sweepAngle < 0 Then sweepAngle = sweepAngle + 360
Dim path As Path
path.Initialize(centerX, centerY)
path.LineTo(centerX + radius * CosD(startAngle), centerY + radius * SinD(startAngle))
path.AddArc2(centerX - radius, centerY - radius, centerX + radius, centerY + radius, startAngle, sweepAngle)
path.LineTo(centerX, centerY)
path.Close
cvsClock.ClipPath(path)
cvsClock.DrawCircle(centerX, centerY, radius, color, True, 0)
cvsClock.RemoveClip
End Sub