ClockGadget like CalendarGadget
Posted: Mon Sep 02, 2013 10:29 pm
Deleted for new version.
Look below to see the new version. Drag the hands to set the time.

Look below to see the new version. Drag the hands to set the time.

http://www.purebasic.com
https://www.purebasic.fr/english/
Thanks friend!IdeasVacuum wrote:Nice work, thanks for sharing
PB wrote:My first reaction was to click and drag a clock hand.
Was disappointed that it doesn't work that way.
Sorry. Just kidding! therefore drag .. like android with your finger. It is a nonsense.PB wrote:Android? No, why?
You can't exceed the time-space continuum.NoahPhense wrote:If you grab a hand on the clock and drag it outside the form,the app crashes.
- np
Oh. But I can. Maybe that's the problem.Kuron wrote:You can't exceed the time-space continuum.NoahPhense wrote:If you grab a hand on the clock and drag it outside the form,the app crashes.
- np
It still crashed for me with the same issue. It was more difficult to invoke the crash, but still possible. (W7-64 running PB5.2 x86).minimy wrote:solved! where is my applause?NoahPhense wrote:If you grab a hand on the clock and drag it outside the form,the app crashes.
- np![]()
Tenaja wrote:It still crashed for me with the same issue. It was more difficult to invoke the crash, but still possible. (W7-64 running PB5.2 x86).minimy wrote:solved! where is my applause?NoahPhense wrote:If you grab a hand on the clock and drag it outside the form,the app crashes.
- np![]()
Code: Select all
; CLOCKGADGET v2.2
; Toni Manrique 2013 (E) ;-)
; This is a 'draghand' ClockGadget
Structure datos
Conten.l
Horas.l
Minut.l
Segun.l
Image.l
Canvas.l
Hora24.l
InkHor.l
InkMin.l
InkSeg.l
InkOut.l
InkCir.l
InkDot.l
Paper.l
WithDots.i
Result.s
Talla.w
; Counter.l
EndStructure
Global NewList Reloj.datos()
;----Fonts
LoadFont(1,"Arial",12,#PB_Font_HighQuality|#PB_Font_Bold)
Procedure DefaultFontID()
ProcedureReturn GetStockObject_(#SYSTEM_FONT)
EndProcedure
;---Maths
;give the real angle
Procedure AtanEx(Diametro,X,Y)
Protected grad,grado
grad = Degree(ATan2(x-(Diametro/2),y-(Diametro/2)))+90 : If grad <0 : grado = grad+360 :Else :grado = grad :EndIf
ProcedureReturn Grado
EndProcedure
Procedure SinPointX(Center.l, Angle.l, Radius.l)
; Angulos en grados
ProcedureReturn Center+Sin(Angle*0.01745329)*Radius
EndProcedure
Procedure CosPointY(Center.l, Angle.l, Radius.l)
; Angulos en grados
ProcedureReturn Center-Cos(Angle*0.01745329)*Radius
EndProcedure
;create line from third part
Procedure LineFrom(x,y,AngDist,Dist,Angulo,Largo)
Protected Xx1=SinPointX(x,Angulo-AngDist,Dist)
Protected yy1=CosPointY(y,Angulo-AngDist,Dist)
Protected Xx2=SinPointX(xx1,Angulo,Largo)
Protected yy2=CosPointY(yy1,Angulo,Largo)
LineXY(xx1,yy1,xx2,yy2,$0000FF)
EndProcedure
;create fat line
Procedure BoxFrom(x.l ,y.l ,Ancho.l ,Angulo.l ,Largo.l ,color.l)
Protected Xx1=SinPointX(x,Angulo+225,Ancho)
Protected yy1=CosPointY(y,Angulo+225,Ancho)
Protected Xx2=SinPointX(xx1,Angulo,Largo)
Protected yy2=CosPointY(yy1,Angulo,Largo)
LineXY(xx1,yy1,xx2,yy2,Color)
xx1=xx2:yy1=yy2
Xx2=SinPointX(xx1,Angulo+90,ancho*2)
yy2=CosPointY(yy1,Angulo+90,ancho*2)
LineXY(xx1,yy1,xx2,yy2,Color)
xx1=xx2:yy1=yy2
Xx2=SinPointX(xx1,Angulo+180,Largo)
yy2=CosPointY(yy1,Angulo+180,Largo)
LineXY(xx1,yy1,xx2,yy2,Color)
xx1=xx2:yy1=yy2
Xx2=SinPointX(xx1,Angulo+270,ancho*2)
yy2=CosPointY(yy1,Angulo+270,ancho*2)
LineXY(xx1,yy1,xx2,yy2,Color)
EndProcedure
;Draw clock
Procedure DrawClock(Canvas ,H.l ,M.l ,S.l)
Protected Size = GadgetWidth(Canvas)
Protected Center = Size/2
Protected OutLine= Center*0.95
Protected Circulo= Center*0.90
Protected F1,F2,F3,F4,X,Y,Color
Box(0,0,Size,Size,Reloj()\Paper)
Circle(Center,Center,OutLine,Reloj()\InkOut)
Circle(Center,Center,Circulo,Reloj()\InkCir)
If Reloj()\WithDots > 0
For p=0 To 11
x=SinPointX(Center,p*30,Circulo*0.9)
Y=CosPointY(Center,p*30,Circulo*0.9)
If Reloj()\WithDots = 1
BoxFrom(x,y,2,p*30,8,Reloj()\InkDot)
FillArea(x,y,Reloj()\InkDot,Reloj()\InkDot)
EndIf
If Reloj()\WithDots = 2
Circle(x,y,5,Reloj()\InkDot)
FillArea(x,y,Reloj()\InkDot,Reloj()\InkDot)
EndIf
Next p
EndIf
If Reloj()\WithDots = 0
For p=0 To 11
x=SinPointX(Center,p*30,Circulo*0.9)
Y=CosPointY(Center,p*30,Circulo*0.9)
F1=H-1:If F1<0:F1=23:EndIf
F2=H+1:If F2>23:F2=0:EndIf
F3=H-2:If F3<0:F3=0:EndIf
F4=H+2:If F4>23:F4=0:EndIf
If F1=p Or F1=p+12
BoxFrom(x,y,2,p*30,8,Reloj()\InkSeg)
FillArea(x,y,Reloj()\InkSeg,Reloj()\InkSeg)
EndIf
If F2=p Or F2=p+12
BoxFrom(x,y,2,p*30,8,Reloj()\InkSeg)
FillArea(x,y,Reloj()\InkSeg,Reloj()\InkSeg)
EndIf
If F3=p Or F3=p+12
BoxFrom(x,y,2,p*30,8,Reloj()\InkMin)
FillArea(x,y,Reloj()\InkMin,Reloj()\InkMin)
EndIf
If F4=p Or F4=p+12
BoxFrom(x,y,2,p*30,8,Reloj()\InkMin)
FillArea(x,y,Reloj()\InkMin,Reloj()\InkMin)
EndIf
If H=p Or H=p+12
BoxFrom(x,y,2,p*30,8,Reloj()\InkHor)
FillArea(x,y,Reloj()\InkHor,Reloj()\InkHor)
EndIf
Next p
EndIf
color=Reloj()\InkHor
BoxFrom(Center,Center,5,H,36,color)
FillArea(Center,Center,Color,color)
Circle(Center,Center,14,color)
color=Reloj()\InkMin
BoxFrom(Center,Center,4,M,46,color)
FillArea(Center,Center,Color,color)
Circle(Center,Center,11,Color)
color=Reloj()\InkSeg
BoxFrom(Center,Center,3,S,56,color)
FillArea(Center,Center,Color,color)
Circle(Center,Center,8,Color)
; StopDrawing()
EndProcedure
;Colours more easy
Procedure SetGadgetColorEx(Gadget.l, Ink.l, Paper.l)
SetGadgetColor(Gadget,#PB_Gadget_BackColor,Paper)
SetGadgetColor(Gadget,#PB_Gadget_FrontColor,Ink)
EndProcedure
Procedure SpinGadgetSet(Gadget.l, Min.l, Max.l, v.l, WidthString.l)
If v<Min:v=Max:EndIf
If v>Max:v=Min:EndIf
SetGadgetState (Gadget, V)
SetGadgetText(Gadget, RSet(Str(v),WidthString,"0"))
EndProcedure
;some body make clik?
Procedure SpinGadgetClik(Gadget.l, Min.l, Max.l)
If GetGadgetState(Gadget)<Min:SetGadgetState(Gadget,Max):EndIf
If GetGadgetState(Gadget)>Max:SetGadgetState(Gadget,Min):EndIf
SpinGadgetSet(Gadget,Min,Max,GetGadgetState(Gadget),2)
SetActiveGadget(-1)
EndProcedure
;create spingadget with attributes
Procedure SpinGadgetEx(Gadget.l, X.l, y.l, w.l, h.l, Min.l, Max.l, Flags.l, V.l, Ink.l, Paper.l=-1, Font.l=-1)
Protected FontID
If Gadget = #PB_Any:Gadget = SpinGadget(#PB_Any ,x,y,w,h,Min,Max,Flags):Else:SpinGadget(Gadget,x,y,w,h,Min,Max,flags):EndIf
If ink > -1 : SetGadgetColor(Gadget,#PB_Gadget_FrontColor,Ink) : EndIf
If Paper > -1 : SetGadgetColor(Gadget,#PB_Gadget_BackColor,Paper) :EndIf
If IsFont(Font) = 0 Or font=-1 :FontID = DefaultFontID():Else:FontID = FontID(Font):EndIf
SetGadgetFont(Gadget,FontID)
SpinGadgetSet(Gadget, Min,Max,v,2)
ProcedureReturn Gadget
EndProcedure
;Create clock & store datas
Procedure ClockGadget(x.l, y.l, h.l, m.l, s.l, InkHor.l, InkMin.l, InkSeg.l, InkOut.l, InkCir.l, InkDot.l, Paper.l, Font.l, WithDots.i=1,Hours24.i=0,flags.l=0)
Protected mifont.l
AddElement(Reloj())
Reloj()\Conten = ContainerGadget(#PB_Any, x, y, 210, 240, flags)
If Reloj()\Conten
SetGadgetColor(Reloj()\Conten,#PB_Gadget_BackColor,Paper)
Reloj()\InkCir= InkCir
Reloj()\InkDot= InkDot
Reloj()\InkHor= InkHor
Reloj()\InkMin= InkMin
Reloj()\InkOut= InkOut
Reloj()\InkSeg= InkSeg
Reloj()\Paper = Paper
Reloj()\WithDots = WithDots
Reloj()\Canvas = CanvasGadget(#PB_Any, 5, 35, 195, 195)
StartDrawing(CanvasOutput(Reloj()\Canvas))
DrawClock(Reloj()\Canvas ,H*30 ,M*6 ,S*6)
StopDrawing()
Reloj()\Horas = SpinGadgetEx(#PB_Any, 5, 5, 40, 25, -1, 100,0, h,Tinta,Papel,Font)
Reloj()\Minut = SpinGadgetEx(#PB_Any, 50, 5, 40, 25, -1, 100,0, m,Tinta,Papel,Font)
Reloj()\Segun = SpinGadgetEx(#PB_Any, 95, 5, 40, 25, -1, 100,0, s,Tinta,Papel,Font)
Reloj()\Hora24 = ButtonGadget(#PB_Any, 140, 5, 60, 25,"12h",#PB_Button_Toggle)
If Hours24=1:SetGadgetState(Reloj()\Hora24,1):SetGadgetText(Reloj()\Hora24,"24h"):EndIf
CloseGadgetList()
SetGadgetColorEx(Reloj()\Horas,Reloj()\InkHor,Reloj()\InkCir)
SetGadgetColorEx(Reloj()\Minut,Reloj()\InkMin,Reloj()\InkCir)
SetGadgetColorEx(Reloj()\Segun,Reloj()\InkSeg,Reloj()\InkCir)
If IsFont(font)=0:mifont=DefaultFontID():Else: mifont=FontID(font):EndIf
If font=-1:mifont=DefaultFontID():EndIf
SetGadgetFont(Reloj()\Hora24,mifont)
EndIf
EndProcedure
;watch the events
Procedure EventClock(Window)
Protected TFour.l, talla.w
ForEach Reloj()
If DesktopMouseX()>WindowX(Window)+GadgetX(Reloj()\Conten)+GadgetX(Reloj()\Canvas) And DesktopMouseX()<WindowX(Window)+GadgetX(Reloj()\Conten)+GadgetX(Reloj()\Canvas)+GadgetWidth(Reloj()\Canvas)
If DesktopMouseY()>WindowY(Window)+GadgetY(Reloj()\Conten)+GadgetY(Reloj()\Canvas)+35 And DesktopMouseY()<WindowY(Window)+GadgetY(Reloj()\Conten)+GadgetY(Reloj()\Canvas)+GadgetHeight(Reloj()\Canvas)
If EventGadget() = Reloj()\Horas
If GetGadgetState(Reloj()\Hora24)=1: SpinGadgetClik(EventGadget(), 0, 23) :Else: SpinGadgetClik(EventGadget(), 1, 12) :EndIf
StartDrawing(CanvasOutput(Reloj()\Canvas))
DrawClock(Reloj()\Canvas,GetGadgetState(Reloj()\Horas)*30,GetGadgetState(Reloj()\Minut)*6,GetGadgetState(Reloj()\Segun)*6)
StopDrawing()
Reloj()\Result = GetGadgetText(Reloj()\Horas)+":"+GetGadgetText(Reloj()\Minut)+":"+GetGadgetText(Reloj()\Segun)
EndIf
If EventGadget() = Reloj()\Minut
SpinGadgetClik(EventGadget(), 0, 59)
StartDrawing(CanvasOutput(Reloj()\Canvas))
DrawClock(Reloj()\Canvas,GetGadgetState(Reloj()\Horas)*30,GetGadgetState(Reloj()\Minut)*6,GetGadgetState(Reloj()\Segun)*6)
StopDrawing()
Reloj()\Result = GetGadgetText(Reloj()\Horas)+":"+GetGadgetText(Reloj()\Minut)+":"+GetGadgetText(Reloj()\Segun)
EndIf
If EventGadget() = Reloj()\Segun
SpinGadgetClik(EventGadget(), 0, 59)
StartDrawing(CanvasOutput(Reloj()\Canvas))
DrawClock(Reloj()\Canvas,GetGadgetState(Reloj()\Horas)*30,GetGadgetState(Reloj()\Minut)*6,GetGadgetState(Reloj()\Segun)*6)
StopDrawing()
Reloj()\Result = GetGadgetText(Reloj()\Horas)+":"+GetGadgetText(Reloj()\Minut)+":"+GetGadgetText(Reloj()\Segun)
EndIf
If EventGadget() = Reloj()\Canvas
If GetGadgetState(Reloj()\Hora24)=1:TFour=12 :Else:TFour=0:EndIf
If EventType() = #PB_EventType_LeftButtonDown Or (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(Reloj()\Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
; Reloj()\Counter+1:If Reloj()\Counter=500:Reloj()\Counter=0:SetCursorPos_(WindowX(Window)+GadgetX(Reloj()\Conten)+GadgetX(Reloj()\Canvas)+5,WindowY(Window)+GadgetY(Reloj()\Conten)+GadgetY(Reloj()\Canvas)+40):RightClick():EndIf
If StartDrawing(CanvasOutput(Reloj()\Canvas))
talla=GadgetWidth(Reloj()\Canvas)
x = GetGadgetAttribute(Reloj()\Canvas, #PB_Canvas_MouseX)
y = GetGadgetAttribute(Reloj()\Canvas, #PB_Canvas_MouseY)
If x>0 And x<GadgetWidth(Reloj()\Canvas) And y>0 And y<GadgetHeight(Reloj()\Canvas)
If Point(x,y)=Reloj()\InkSeg
grado = AtanEx(Talla,x,y)
DrawClock(Reloj()\Canvas,GetGadgetState(Reloj()\Horas)*30,GetGadgetState(Reloj()\Minut)*6,grado)
SpinGadgetSet(Reloj()\Segun,0,59,grado/6,2)
EndIf
If Point(x,y)=Reloj()\InkMin
grado = AtanEx(Talla,x,y)
DrawClock(Reloj()\Canvas,GetGadgetState(Reloj()\Horas)*30,grado,GetGadgetState(Reloj()\Segun)*6)
SpinGadgetSet(Reloj()\Minut,0,59,grado/6,2)
EndIf
If Point(x,y)=Reloj()\InkHor
grado = AtanEx(Talla,x,y)
DrawClock(Reloj()\Canvas,grado,GetGadgetState(Reloj()\Minut)*6,GetGadgetState(Reloj()\Segun)*6)
SpinGadgetSet(Reloj()\Horas,0,23,(grado/30)+TFour,2)
EndIf
EndIf
StopDrawing()
EndIf
EndIf
If EventType() = #PB_EventType_LeftButtonUp
; Reloj()\Counter=0
EndIf
Reloj()\Result = GetGadgetText(Reloj()\Horas)+":"+GetGadgetText(Reloj()\Minut)+":"+GetGadgetText(Reloj()\Segun)
EndIf
If EventGadget() = Reloj()\Hora24
If GetGadgetState(Reloj()\Hora24)=1
SetGadgetText(Reloj()\Hora24,"24h")
If GetGadgetState(Reloj()\Horas)<12
SetGadgetState(Reloj()\Horas,GetGadgetState(Reloj()\Horas)+12):SetGadgetText(Reloj()\Horas,RSet(Str(GetGadgetState(Reloj()\Horas)),2,"0"))
EndIf
Else
SetGadgetText(Reloj()\Hora24,"12h")
If GetGadgetState(Reloj()\Horas)>11
SetGadgetState(Reloj()\Horas,GetGadgetState(Reloj()\Horas)-12):SetGadgetText(Reloj()\Horas,RSet(Str(GetGadgetState(Reloj()\Horas)),2,"0"))
EndIf
EndIf
EndIf
EndIf
EndIf
Next
EndProcedure
CompilerIf Not #PB_Compiler_IsIncludeFile
Global Window_0
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
Procedure OpenWindow_Window_0()
Window_0 = OpenWindow(#PB_Any, 100, 200, 650, 400, "ClockGadget v2.0 (Drag the hand)", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
SetWindowColor(Window_0,$444444)
; DO NOT USE SAME COLORS FOR HOURS, MINUTES AND SECONDS
ClockGadget(5,5,Random(23),Random(59),Random(59),$0000FF,$FF0000,$00FF00,$0,$FFFFFF,$0,$CCCCCC,1,2,1)
ClockGadget(220,5,Random(12),Random(59),Random(59),$FFFFFF,$CCCCCC,$999999,$0,$333333,$0,$444444,0,1,0,#PB_Canvas_Border)
ClockGadget(440,5,Random(23),Random(59),Random(59),$55FFFF,$22FF22,$00CC00,$00FFFF,$005500,$99FFFF,$444444,0,1,1)
EndProcedure
OpenWindow_Window_0()
Repeat
Event = WaitWindowEvent(1)
Select Event
Case #PB_Event_Gadget
EventGadget = EventGadget()
EventType = EventType()
; If EventGadget = Container_0
; ElseIf EventGadget = CanvasReloj
; EndIf
EventClock(Window_0)
Case #PB_Event_CloseWindow
EventWindow = EventWindow()
If EventWindow = Window_0
CloseWindow(Window_0)
Window_0 = 0
Break
EndIf
EndSelect
ForEver
CompilerEndIf