CanvasGadget Circular Button Pad

Share your advanced PureBasic knowledge/code with the community.
User avatar
einander
Enthusiast
Enthusiast
Posts: 744
Joined: Thu Jun 26, 2003 2:09 am
Location: Spain (Galicia)

CanvasGadget Circular Button Pad

Post by einander »

Code: Select all

;CanvasGadget Circular ButtonPad test
; by einander - PureBasic 4.60 Beta 3
EnableExplicit
#DEGTORAD=#PI/180.0  ; degrees to radian
;
Macro CanvasMX(Canvas)
  GetGadgetAttribute(Canvas, #PB_Canvas_MouseX)  
EndMacro
;
Macro CanvasMY(Canvas)
  GetGadgetAttribute(Canvas, #PB_Canvas_MouseY)  
EndMacro
;
Procedure  CenterText(X,Y,X1,Y1,Tx.S,TextRGB=0,BkRGB=#White) 
  Protected TWi=TextWidth(Tx),THe=TextHeight(Tx)
  DrawingMode(#PB_2DDrawing_Transparent)
  If TWi >X1-X
    DrawText(X,(Y1+Y)/2-THe/2 , Tx, TextRGB)
  Else
    DrawText((X1+X)/2-TWi/2, (Y1+Y)/2-THe/2 , Tx, TextRGB)
  EndIf
EndProcedure  
;
Procedure AngleEndPoint(X,Y,Ang.F,Radius.F,*P.POINT) ; Ret circular end pointF for line, angle, size
  *P\X= X+Cos(Ang*#DEGTORAD)*Radius        
  *P\Y= Y+Sin(Ang*#DEGTORAD)*Radius 
EndProcedure
;
Procedure Canvas8Arrows(Canvas,Font,Array Pts.Point(1),Array Indx.I(1),Siz.F,Stp.F,Detach=-1,Hover=-1)
  Protected I,RGB,t$,SPi.F=Siz*#PI
  DrawingFont(Font)
  Restore Arrows
  Box(0,0,GadgetWidth(Canvas),GadgetHeight(Canvas),0)
  For I=0 To 7
    Read.I Indx(I)
    AngleEndPoint(Spi,Spi,I*Stp,Siz*2,@Pts(I))
    T$=Chr(230+Indx(I)) ;here change 230 for your offset (try 65 for text fonts) <<<<<<<
    If Detach>-1 And I=Detach:RGB=#Red
    ElseIf Hover>-1 And I=Hover And Hover<>Detach:RGB=#Green
    Else :RGB=#White
    EndIf
    CenterText(Pts(I)\X-TextWidth(T$)/2,Pts(I)\Y,Pts(I)\X,Pts(I)\Y,T$,RGB,0)
  Next
EndProcedure
;
Macro GetDistance(A1,A2)
  Sqr(Pow(A1,2) + Pow(A2,2))          
EndMacro
;
Procedure Near(X, Y, Array P.POINT(1)) ; Return elem de Array de Points Nearest to  x,y 
  Protected A,I,J,Min = $FFFFFFF 
  For I = 0 To ArraySize(P()) 
    A = GetDistance(X - P(I)\X, Y - P(I)\Y) 
    If A < Min  : Min = A  : J = I  : EndIf 
  Next I 
  ProcedureReturn J 
EndProcedure 
;
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
OpenWindow(0, 100, 100,600,500 ,"CanvasGadget Button Pad",#PB_Window_SystemMenu|1)
SetWindowColor(0,$112233)
Define PadSize=120  ; <<<<<< change here to your preferred size
Define Ev,I,Detach=-1,Hover=-1,Draw
Define.F Siz=PadSize/(#PI*2),Stp=360/8
Define Font1=FontID(LoadFont(#PB_Any,"Wingdings",Siz,#PB_Font_HighQuality))
;Define Font1=FontID(LoadFont(#PB_Any,"Arial",Siz,#PB_Font_HighQuality))

Dim PTS.Point(7)
Dim Indx.I(7)

Define Ca1=CanvasGadget(#PB_Any,200,200,PadSize,PadSize, #PB_Canvas_Keyboard) 
StartDrawing(CanvasOutput(Ca1))
Canvas8Arrows(Ca1,Font1,Pts(),Indx(),Siz,Stp)
StopDrawing()
Repeat
  If GetAsyncKeyState_(27)&$8000 :  End : EndIf
  EV=WaitWindowEvent()
  Select Ev
    Case #PB_Event_Gadget
      Select EventGadget()
        Case Ca1
          Select EventType()
            Case  #PB_EventType_LeftButtonDown      
              Detach=Near(CanvasMX(Ca1),CanvasMY(Ca1),Pts())
              Draw=1
            Case  #PB_EventType_MouseMove      
              Hover=Near(CanvasMX(Ca1),CanvasMY(Ca1),Pts())
              Draw=1
            Case  #PB_EventType_MouseLeave 
              Hover=-1
              Draw=1
          EndSelect
      EndSelect
      If Draw
        StartDrawing(CanvasOutput(Ca1))
        Canvas8Arrows(Ca1,Font1,Pts(),Indx(),Siz,Stp,Detach,Hover)
        StopDrawing()
        SetWindowTitle(0,"Hover "+Str(Hover)+"   Detach "+Str(Detach))    
        Draw=0  
      EndIf
  EndSelect
Until EV=#PB_Event_CloseWindow
End 
;
DataSection
  Arrows:
  Data.I 2,8,4,7,1,5,3,6 ; for WingDings
  ;Data.i 0,1,2,3,4,5,6,7 ; for text fonts 
EndDataSection
Cheers!
rsts
Addict
Addict
Posts: 2736
Joined: Wed Aug 24, 2005 8:39 am
Location: Southwest OH - USA

Re: CanvasGadget Circular Button Pad

Post by rsts »

Very nice.

Neat things with canvasgadget. Thanks for sharing.

cheers
User avatar
luis
Addict
Addict
Posts: 3895
Joined: Wed Aug 31, 2005 11:09 pm
Location: Italy

Re: CanvasGadget Circular Button Pad

Post by luis »

Very nice, thank you.

I agree, CanvasGadget it's a great addition for easier implementation of innovative and elegant gui elements and it's also ready to be abused in ways no human should ever know.
"Have you tried turning it off and on again ?"
User avatar
einander
Enthusiast
Enthusiast
Posts: 744
Joined: Thu Jun 26, 2003 2:09 am
Location: Spain (Galicia)

Re: CanvasGadget Circular Button Pad

Post by einander »

Thanks rsts.
Seeems that CanvasGadget is a good solution to selecting parts of a graphic. :)
Fred
Administrator
Administrator
Posts: 18248
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Re: CanvasGadget Circular Button Pad

Post by Fred »

Cool stuff
User avatar
einander
Enthusiast
Enthusiast
Posts: 744
Joined: Thu Jun 26, 2003 2:09 am
Location: Spain (Galicia)

Re: CanvasGadget Circular Button Pad

Post by einander »

Thanks Luis and Fred :)
@Luis:
It's also ready to be abused in ways no human should ever know
I agree!
And the best is yet to come! :mrgreen:
User avatar
flaith
Enthusiast
Enthusiast
Posts: 704
Joined: Mon Apr 25, 2005 9:28 pm
Location: $300:20 58 FC 60 - Rennes
Contact:

Re: CanvasGadget Circular Button Pad

Post by flaith »

einander wrote:And the best is yet to come! :mrgreen:
:D
“Fear is a reaction. Courage is a decision.” - WC
Post Reply