It is currently Thu Jun 20, 2013 10:53 am

All times are UTC + 1 hour




Post new topic Reply to topic  [ 5 posts ] 
Author Message
 Post subject: [CanvasGadget] FaderGadget / TrackBarGadget
PostPosted: Tue Jul 19, 2011 6:28 pm 
Offline
Enthusiast
Enthusiast
User avatar

Joined: Sun Mar 18, 2007 2:26 pm
Posts: 342
Location: Munich, Germany
Hi, everybody.
Creating new Gadgets on the Canvas seems to be quite popular.
So here's my take on it.
I had something like this using quite a lot of Win-Api.
Now here it is without any Api.
It's a bigger, more touchscreen-friendly TrackbarGadget that looks like a progressbar.

Updated exampled with less flickering of the TextGadgets (thanks to netmaestro) below:

Todo: SetFaderGadgetState(value.i)

Code:
;-
;- BEGIN INCLUDE
;-

EnableExplicit

;-Flags
#TG_Fader_Horizontal    = 1


Structure faderGadget
   id.i
   state.i
   colorF.i
   colorB.i
   height.i
   width.i
   min.i
   max.i
   horizontal.i
   image.i
EndStructure

Global NewList FaderGadgets.faderGadget()



Macro RePaint(_INIT_)   
   
   Select FaderGadgets()\horizontal
      Case 0
         MouseY = GetGadgetAttribute(eventGadget, #PB_Canvas_MouseY )
         
         If _INIT_ = #True
            MouseY = FaderGadgets()\height
         EndIf
         
         StartDrawing(CanvasOutput(eventGadget))
         Box(0, 0, FaderGadgets()\width, FaderGadgets()\height, FaderGadgets()\colorB)
         
         If  FaderGadgets()\image >= 0
            ImagePos = MouseY
            If ImagePos <0 : ImagePos = 0 : EndIf
            If  ImagePos >FaderGadgets()\height : ImagePos = FaderGadgets()\height : EndIf
            DrawImage(ImageID(FaderGadgets()\image), 0, ImagePos - ImageHeight(FaderGadgets()\image)/2)   
            
         Else          
            Box(0, MouseY, FaderGadgets()\width, FaderGadgets()\height-MouseY, FaderGadgets()\colorF)
            
         EndIf
         
         State=FaderGadgets()\height-MouseY
         
         If State<0 : State=0:EndIf
         If State>FaderGadgets()\height:State=FaderGadgets()\height:EndIf
                  
         FaderGadgets()\state = State
         StopDrawing()
         
         
      Case #True
         MouseX = GetGadgetAttribute(eventGadget, #PB_Canvas_MouseX )
         
         StartDrawing(CanvasOutput(eventGadget))
         Box(0, 0, FaderGadgets()\width, FaderGadgets()\height, FaderGadgets()\colorB)
         
         If  FaderGadgets()\image >= 0
            ImagePos = MouseX
            If ImagePos <0 : ImagePos = 0 : EndIf
            If  ImagePos >FaderGadgets()\width : ImagePos = FaderGadgets()\width : EndIf
            DrawImage(ImageID(FaderGadgets()\image), ImagePos - ImageWidth(FaderGadgets()\image)/2, 0)
            
         Else
            Box(0, 0, MouseX, FaderGadgets()\height , FaderGadgets()\colorF)
         EndIf
         
         State=FaderGadgets()\width-MouseX
         
         If State<0 : State=0:EndIf
         If State>FaderGadgets()\width:State=FaderGadgets()\width:EndIf    
         
         StopDrawing()
         
   EndSelect
   
   FaderGadgets()\state =    State
   
EndMacro

Procedure FaderUpdate(eventGadget.i, eventType.i)
   Static  lDown.i    ;leftMouseDown
   Protected MouseX.i   ;
   Protected MouseY.i   ;
   Protected State.i   ;GadgetState
   Protected ImagePos.i   

   
   ForEach FaderGadgets()
      
      If FaderGadgets()\id = eventGadget
         
         Select eventType   
               
            Case #PB_Ignore
               Repaint(1)
               
            Case #PB_EventType_LeftButtonDown
               lDown = 1               
               RePaint(0)               
               
            Case #PB_EventType_LeftButtonUp
               lDown = 0
               
            Case #PB_EventType_MouseLeave
               lDown = 0
               
            Case #PB_EventType_MouseMove
               
               If lDown = 1
                  Repaint(0)                  
               EndIf
               
         EndSelect          
         
      EndIf
      
   Next
   
   
EndProcedure



Procedure FaderGadget(id.i, x.i, y.i, width.i, height.i, min.i, max.i, FGColor.i, BGColor.i, CanvasFlags.i=0, flags=0, Image.i=-1)
   
   AddElement(FaderGadgets())
   With FaderGadgets()
      
      If id = #PB_Any
         \id = CanvasGadget(#PB_Any, x, y, width, height, CanvasFlags)
      Else
         CanvasGadget(id, x, y, width, height, CanvasFlags)
         \id = id
      EndIf
      
      StartDrawing(CanvasOutput(\id))
      Box(0, 0, width, height, BGColor)      
      StopDrawing()
      
      \colorB = BGColor
      \colorF = FGColor
      \min    = min
      \max    = max
      \height = height
      \width    = width
      If IsImage(image)
         \image    = image
      Else
         \image = -1
      EndIf
      
      If flags & #TG_Fader_Horizontal
         \horizontal = #True
      EndIf
      
      FaderUpdate(\id,#PB_Ignore)
      
      ProcedureReturn \id
      
   EndWith
EndProcedure




Procedure GetFaderGadgetState(gadget.i, trueState=#False)
   Protected min.i, max.i   
   Protected state.i
   Protected height.i, width.i
   Protected scala.i   
   Protected position.f
   
   ForEach FaderGadgets()
      If FaderGadgets()\id = gadget
         
         If truestate = #True         
            ProcedureReturn FaderGadgets()\state
         Else
            
            min    = FaderGadgets()\min
            max    = FaderGadgets()\max
            state    = FaderGadgets()\state
            height    = FaderGadgets()\height
            width    = FaderGadgets()\width
            Select FaderGadgets()\horizontal
               Case 1
                  
                  
                  If width>0            
                     position = state / width                     
                  EndIf
                  
                  scala = max-min
                  
                  ProcedureReturn max - (position * scala )
                  
                  
               Default
                  If height>0            
                     position = state / height
                  EndIf
                  
                  scala = max-min
                  
                  ProcedureReturn position * scala + min
            EndSelect
         EndIf
      EndIf
   Next
EndProcedure

DisableExplicit
;-
;- END INCLUDE
;-





;- Beispiel / Example

Define event.i
Define Any_Fader

Define OldValue_1.i
Define OldValue_2.i
Define OldValue_3.i
Define OldValue_4.i
Define OldValue_5.i

Enumeration 4
   #Text_Static_1
   #Text_Value_1
   #Text_Static_2
   #Text_Value_2
   #Text_Static_3
   #Text_Value_3
   #Text_Static_4
   #Text_Value_4
   #Text_Static_5
   #Text_Value_5
EndEnumeration


CreateImage(1, 90, 15)
StartDrawing(ImageOutput(1))
Box(0, 0, 90, 15, $0000FF)
LineXY(0, 0, 90, 8, $00CC00)
LineXY(0, 14, 90, 8, $00CC00)
FillArea(0, 8, $00CC00, $00CC00)
StopDrawing()


CreateImage(2, 15, 90)
StartDrawing(ImageOutput(2))
Box(0, 0, 15, 90, $0000FF)
LineXY(0, 0, 8, 90, 0)
LineXY(14, 0, 8, 90, 0)
FillArea(8, 9, 0, 0)
StopDrawing()




OpenWindow(0, 0, 0, 705, 600, "FaderGadget", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)

fadergadget(0,                  5, 5, 90, 500,       0,       500,     $0000FF, $000000, #PB_Canvas_GrabMouse)
fadergadget(1,                  105, 5, 90, 500,       1000,    99999,  $0000FF, $000022, #PB_Canvas_GrabMouse, 0, 1)
Any_Fader=fadergadget(#PB_Any,    200, 5, 400, 90,       1,       2,      $009900, $330000, #PB_Canvas_GrabMouse)
fadergadget(2,                200, 100, 400, 90,       100,    0,       $0066cc, $003300, #PB_Canvas_GrabMouse,  #TG_Fader_Horizontal)
fadergadget(3,                200, 195, 400, 90,       -10,    10,    $0066cc, $003300, #PB_Canvas_GrabMouse,  #TG_Fader_Horizontal, 2)


TextGadget(#Text_Static_1, 5, 510, 40, 20, "Fader 1:")       :TextGadget(#Text_Value_1, 50, 510, 40, 20, Str(GetFaderGadgetState(0)))
TextGadget(#Text_Static_2, 105, 510, 40, 20, "Fader 2:")   :TextGadget(#Text_Value_2, 155, 510, 40, 20, Str(GetFaderGadgetState(1)))
TextGadget(#Text_Static_3, 605, 5, 40, 20, "Fader 3:")      :TextGadget(#Text_Value_3, 650, 5, 40, 20, Str(GetFaderGadgetState(Any_Fader)))
TextGadget(#Text_Static_4, 605, 105, 40, 20, "Fader 4:")   :TextGadget(#Text_Value_4, 650, 105, 40, 20, Str(GetFaderGadgetState(2)))
TextGadget(#Text_Static_5, 605, 195, 40, 20, "Fader 5:")   :TextGadget(#Text_Value_5, 650, 195, 40, 20, Str(GetFaderGadgetState(3)))

Repeat
   event = WaitWindowEvent(20)
   Select event
      Case #PB_Event_Gadget
         Select EventGadget()
            Case 0, 1, 2, 3, Any_Fader
               FaderUpdate(EventGadget(), EventType())
               
               If OldValue_1 <> GetFaderGadgetState(0)                  
                  SetGadgetText(#Text_Value_1, Str(GetFaderGadgetState(0)))
                  OldValue_1 = GetFaderGadgetState(0)   
               EndIf
               
               If OldValue_2 <> GetFaderGadgetState(1)                  
                  SetGadgetText(#Text_Value_2, Str(GetFaderGadgetState(1)))
                  OldValue_2 = GetFaderGadgetState(1)   
               EndIf
               
               If OldValue_3 <> GetFaderGadgetState(Any_Fader)                  
                  SetGadgetText(#Text_Value_3, Str(GetFaderGadgetState(Any_Fader)))
                  OldValue_3 = GetFaderGadgetState(Any_Fader)   
               EndIf
               
               If OldValue_4 <> GetFaderGadgetState(2)                  
                  SetGadgetText(#Text_Value_4, Str(GetFaderGadgetState(2)))
                  OldValue_4 = GetFaderGadgetState(2)   
               EndIf
               
               If OldValue_5 <> GetFaderGadgetState(3)                  
                  SetGadgetText(#Text_Value_5, Str(GetFaderGadgetState(3)))
                  OldValue_5 = GetFaderGadgetState(3)   
               EndIf
                  
                              
            
         EndSelect
   EndSelect
Until event = #PB_Event_CloseWindow









Last edited by TomS on Tue Jul 19, 2011 7:19 pm, edited 1 time in total.

Top
 Profile  
 
 Post subject: Re: [CanvasGadget] FaderGadget / TrackBarGadget
PostPosted: Tue Jul 19, 2011 6:47 pm 
Offline
PureBasic Bullfrog
PureBasic Bullfrog
User avatar

Joined: Wed Jul 06, 2005 5:42 am
Posts: 6466
Nice work! Looks very good. 8)

One good way to avoid the text flicker is to replace this:
Code:
SetGadgetText(4, "Fader 1: "+Str(GetFaderGadgetState(0)))
with something along this line:
Code:
If GetFaderGadgetState(0)<>OldFaderState(0)
  SetGadgetText(4, "Fader 1: "+Str(GetFaderGadgetState(0)))
  OldFaderState(0) = GetFaderGadgetState(0)
EndIf
also consider making separate text gadgets for the "Fader 1:" part, that way those portions will never flicker.

_________________
Veni, vidi, vici.


Top
 Profile  
 
 Post subject: Re: [CanvasGadget] FaderGadget / TrackBarGadget
PostPosted: Tue Jul 19, 2011 7:17 pm 
Offline
Enthusiast
Enthusiast
User avatar

Joined: Sun Mar 18, 2007 2:26 pm
Posts: 342
Location: Munich, Germany
Thanks for the tips.
It's just a quick example.
In the first version, I had a Button that "debugged" the values, I figured a "live" display would be better.


Top
 Profile  
 
 Post subject: Re: [CanvasGadget] FaderGadget / TrackBarGadget
PostPosted: Sat Sep 10, 2011 4:50 pm 
Offline
Enthusiast
Enthusiast

Joined: Tue Mar 21, 2006 12:31 am
Posts: 376
Thanks TomS,

Using RC1, to compile I had to alter some lines to replace
- #PB_Canvas_GrabMouse > #PB_Canvas_Cursor

_________________
ʽʽSuccess is almost totally dependent upon drive and persistence. The extra energy required to make another effort or try another approach is the secret of winning.ʾʾ --Dennis Waitley


Top
 Profile  
 
 Post subject: Re: [CanvasGadget] FaderGadget / TrackBarGadget
PostPosted: Mon Mar 05, 2012 7:16 pm 
Offline
Addict
Addict
User avatar

Joined: Sun Nov 05, 2006 11:42 pm
Posts: 2532
Location: Lyon - France
Good job..thanks for sharing 8)

_________________
ImageThe happiness is a road...
Not a destination


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 5 posts ] 

All times are UTC + 1 hour


Who is online

Users browsing this forum: Exabot [Bot] and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
Jump to:  

 


Powered by phpBB © 2008 phpBB Group
subSilver+ theme by Canver Software, sponsor Sanal Modifiye