Ooops
October 28, 2020, 06:11:51 AM

Author Topic: [bmx] Spinner Proxygadget by JoshK [ 1+ years ago ]  (Read 1124 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bmx] Spinner Proxygadget by JoshK [ 1+ years ago ]
« on: June 29, 2017, 12:28:42 AM »
Title : Spinner Proxygadget
Author : JoshK
Posted : 1+ years ago

Description : Advanced number editor with an optional trackbar.  The gadget can edit integers and floats with any range of values, including negative numbers.  No floating point errors will occur.

Code :
Code: BlitzMax
  1. SuperStrict
  2.  
  3. Import MaxGui.Drivers
  4. Import brl.retro
  5.  
  6.  
  7. Local window:TGadget
  8.  
  9. window=CreateWindow("Spinner Example",40,40,320,240)
  10.  
  11. Local spinner:TSpinner
  12. Local label:TGadget
  13. Local x:Int=2,y:Int=2
  14.  
  15. label=CreateLabel("Float spinner:",x,y,200,18,window)
  16. SetGadgetLayout label,1,0,1,0
  17. y:+18
  18. spinner=CreateSpinner(x,y,50,20,window)
  19. SetSpinnerRange(spinner,0.11,1.2,2)
  20. SetSpinnerValue(spinner,0.1)
  21.  
  22. SetGadgetLayout spinner,1,1,1,0
  23. y:+22
  24.  
  25. label=CreateLabel("Integer spinner with trackbar:",x,y,200,18,window)
  26. SetGadgetLayout label,1,0,1,0
  27. y:+18
  28. spinner=CreateSpinner(x,y,300,20,window,SPINNER_TRACKBAR)
  29. SetSpinnerRange(spinner,-2,2,0)
  30. SetGadgetLayout spinner,1,1,1,0
  31. y:+22
  32.  
  33.  
  34. While True
  35.         WaitEvent
  36.         Print CurrentEvent.ToString()
  37.         Select EventID()
  38.                 Case EVENT_WINDOWCLOSE
  39.                         End
  40.         End Select
  41. Wend
  42.  
  43.  
  44. '-------------------------------------------------------------------
  45.  
  46. Const SPINNER_TRACKBAR:Int=1
  47.  
  48. Type TSpinner Extends TProxygadget
  49.        
  50.         Const SliderWidth:Int=12
  51.         Const Div:Int=52
  52.        
  53.         Field panel:TGadget
  54.         Field textfield:TGadget
  55.         Field slider:TGadget
  56.         Field trackbar:TGadget
  57.         Field value:Int
  58.         Field range:Int[2]
  59.         Field accuracy:Int=1
  60.         Field floatitemmultiplier:Double=10
  61.  
  62.         Method SetTextColor(r:Int,g:Int,b:Int)
  63.                 Local gadget:TGadget
  64.                 Super.SetTextColor(r,g,b)
  65.                 textfield.SetTextColor(r,g,b)
  66.                 slider.SetTextColor(r,g,b)
  67.                 If trackbar trackbar.SetTextColor(r,g,b)
  68.         EndMethod
  69.        
  70.         Method SetColor(r:Int,g:Int,b:Int)
  71.                 Local gadget:TGadget
  72.                 Super.SetColor(r,g,b)
  73.                 textfield.SetColor(r,g,b)
  74.                 slider.SetColor(r,g,b)
  75.                 If trackbar trackbar.SetColor(r,g,b)
  76.         EndMethod
  77.        
  78.         Method SetRange_(minimum:Double,maximum:Double,accuracy:Int=1)
  79.                 Self.accuracy=accuracy
  80.                 floatitemmultiplier=10.0^Double(accuracy)
  81.                 range[0]=Round(minimum*floatitemmultiplier)
  82.                 range[1]=Round(maximum*floatitemmultiplier)-range[0]
  83.                 SetSliderRange slider,1,range[1]+1
  84.                 If trackbar
  85.                         SetSliderRange trackbar,1,range[1]+1
  86.                 EndIf
  87.                 SetValue_(value)
  88.         EndMethod
  89.  
  90.         Method SetValue_(f:Double)
  91.                 Local i:Int
  92.                 i=Round(f*floatitemmultiplier)
  93.                 i=Max(i,range[0])
  94.                 i=Min(i,range[0]+range[1])
  95.                 'Notify i+", "+range[0]+", "+range[1]
  96.                 SetGadgetText textfield,FloatToString(i/floatitemmultiplier,accuracy)
  97.                 SetSliderValue slider,range[1]-(i-range[0])
  98.                 If trackbar SetSliderValue trackbar,i-range[0]+1
  99.                 value=i
  100.         EndMethod
  101.                
  102.         Method Cleanup()
  103.                 RemoveHook(EmitEventHook,EventHook,Self)
  104.                 Super.Cleanup()
  105.         EndMethod
  106.        
  107.         Function Create:TSpinner(x:Int,y:Int,width:Int,height:Int,group:TGadget,flags:Int=0)
  108.                 Local spinner:TSpinner
  109.                 Local w:Int
  110.                
  111.                 spinner=New TSpinner
  112.                                
  113.                 spinner.panel=CreatePanel(x,y,width,height,group)
  114.                 spinner.setproxy(spinner.panel)
  115.                
  116.                 w=spinner.panel.ClientWidth()
  117.                 If (SPINNER_TRACKBAR & flags)
  118.                         w=div
  119.                         If w>spinner.panel.ClientWidth() w=spinner.panel.ClientWidth()
  120.                 EndIf
  121.                
  122.                 spinner.textfield=CreateTextField(0,0,w-SliderWidth,spinner.panel.ClientHeight(),spinner.panel)
  123.                 If (SPINNER_TRACKBAR & flags)
  124.                         SetGadgetLayout spinner.textfield,1,0,1,1
  125.                 Else
  126.                         SetGadgetLayout spinner.textfield,1,1,1,1
  127.                 EndIf
  128.                
  129.                 spinner.slider=CreateSlider(w-SliderWidth,0,SliderWidth,spinner.panel.ClientHeight(),spinner.panel,SLIDER_VERTICAL)            
  130.                 If (SPINNER_TRACKBAR & flags)
  131.                         SetGadgetLayout spinner.slider,1,0,1,1
  132.                 Else
  133.                         SetGadgetLayout spinner.slider,0,1,1,1
  134.                 EndIf
  135.                 AddHook(EmitEventHook,EventHook,spinner)
  136.                
  137.                 If (SPINNER_TRACKBAR & flags)
  138.                         spinner.trackbar=CreateSlider(w,0,spinner.panel.ClientWidth()-w,spinner.panel.ClientHeight(),spinner.panel,SLIDER_TRACKBAR|SLIDER_HORIZONTAL)
  139.                         SetGadgetLayout spinner.trackbar,1,1,1,1
  140.                 EndIf
  141.                
  142.                 spinner.SetRange_(0,1)
  143.                 Return spinner
  144.         EndFunction
  145.  
  146.         Function EventHook:Object(id:Int,data:Object,context:Object)
  147.                 Local event:TEvent
  148.                 Local spinner:TSpinner
  149.                 Local i:Int
  150.                
  151.                 event=TEvent(data)
  152.                 If event
  153.                         spinner=TSpinner(context)
  154.                         If spinner
  155.                                 Select event.id
  156.                                 Case EVENT_GADGETLOSTFOCUS
  157.                                         If event.source=spinner.textfield
  158.                                                 Local old:Double=SpinnerValue(spinner)
  159.                                                 spinner.SetValue_(Double(GadgetText(spinner.textfield)))
  160.                                                 If old<>SpinnerValue(spinner)
  161.                                                         EmitEvent CreateEvent(EVENT_GADGETACTION,spinner)
  162.                                                 EndIf
  163.                                                 Return Null
  164.                                         EndIf                          
  165.                                 Case EVENT_GADGETACTION
  166.                                         Select event.source
  167.                                         Case spinner.trackbar
  168.                                                 If spinner.trackbar
  169.                                                         i=(SliderValue(spinner.trackbar)+spinner.range[0]-1)
  170.                                                         spinner.SetValue_(i/spinner.floatitemmultiplier)
  171.                                                         EmitEvent CreateEvent(EVENT_GADGETACTION,spinner)
  172.                                                 EndIf
  173.                                         Case spinner.textfield
  174.                                                 Return Null
  175.                                         Case spinner.slider
  176.                                                 i=spinner.range[1]-(SliderValue(spinner.slider)-spinner.range[0])
  177.                                                 spinner.SetValue_(Double(i)/spinner.floatitemmultiplier)
  178.                                                 EmitEvent CreateEvent(EVENT_GADGETACTION,spinner)
  179.                                                 Return Null
  180.                                         EndSelect
  181.                                 EndSelect
  182.                         EndIf
  183.                 EndIf
  184.                 Return data
  185.         EndFunction
  186.        
  187.         Function Round:Int(val:Double)
  188.                 Local dec#
  189.                 dec#=val-Floor(val)
  190.                 If dec<0.5 Return Floor(val) Else Return Ceil(val)
  191.         EndFunction    
  192.        
  193.         Function FloatToString:String(value:Float,places:Int=3)
  194.                 Local sign:Int=Sgn(value)
  195.                 value=Abs(value)
  196.                 Local i:Int=Round(value*10^places)
  197.                 Local ipart:Int=Int(i/10^places)
  198.                 Local dpart:Int=i-ipart*10^places
  199.                 Local si$=ipart
  200.                 Local di$
  201.                 If dpart>0
  202.                         di=dpart
  203.                         While di.length<places
  204.                                 di="0"+di
  205.                         Wend
  206.                         di="."+di
  207.                 EndIf
  208.                 While Right(di,1)="0"
  209.                         di=Left(di,di.length-1)
  210.                 Wend
  211.                 If places
  212.                         If di="" di=".0"
  213.                 EndIf
  214.                 If sign=-1 si="-"+si
  215.                 Return si+di
  216.         EndFunction    
  217.        
  218. EndType
  219.  
  220. Rem
  221. bbdoc:
  222. EndRem
  223. Function CreateSpinner:TSpinner(x:Int,y:Int,width:Int,height:Int,group:TGadget,flags:Int=0)
  224.         Return TSpinner.Create(x,y,width,height,group,flags)
  225. EndFunction
  226.  
  227. Rem
  228. bbdoc:
  229. EndRem
  230. Function SetSpinnerRange(spinner:TSpinner,minimum:Double,maximum:Double,accuracy:Int=1)
  231.         spinner.SetRange_(minimum,maximum,accuracy)
  232. EndFunction
  233.  
  234. Rem
  235. bbdoc:
  236. EndRem
  237. Function SetSpinnerValue(spinner:TSpinner,value:Double)
  238.         spinner.SetValue_(value)
  239. EndFunction
  240.  
  241. Rem
  242. bbdoc:
  243. EndRem
  244. Function SpinnerValue:Double(spinner:TSpinner)
  245.         Return spinner.value/spinner.floatitemmultiplier
  246. EndFunction


Comments :


JoshK(Posted 1+ years ago)

 Updated with some bug fixes and improvements.


JoshK(Posted 1+ years ago)

 Updated to fix bug when strange ranges are used.


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal