(maxgui) center slider cursor
BlitzMax Forums/BlitzMax Beginners Area/(maxgui) center slider cursor| 
 | ||
| Hi ! when slider was created, what's the formulae to center the cursor (knob) ? (using setslidervalue). This is 'maxslidervalue' / 2 but is there a command to access or compute this value ? Thanks ! | 
| 
 | ||
| SetSliderValue(slider:TGadget,value)? | 
| 
 | ||
| i know setslidervalue() function. I'm searching how to determine the value to center the knob. | 
| 
 | ||
| It depends on your slider range. Could you make a plain example of your slider. So we have something to work with. | 
| 
 | ||
| Min+(Max-Min)/2 | 
| 
 | ||
| some code sample to explain more. 
Strict 
Local window:TGadget=CreateWindow("My Window",0,0,240,280,,WINDOW_TITLEBAR)
Global Panel :  TGadget  = CreatePanel:TGadget (10,10,200,200,window)
Global Canvas : TGadget  = CreateCanvas (0,0,340,240,Panel)
Local sv : Tgadget = CreateSlider(210,10,16,200,window,SLIDER_VERTICAL)
Local sh : Tgadget = CreateSlider(10 , 210 , 200 , 16 , window , SLIDER_HORIZONTAL)
SetSliderRange sh , GadgetWidth(Panel) , GadgetWidth(Canvas)
SetSliderRange sv , GadgetHeight(Panel) , GadgetHeight(Canvas)
'SetSliderValue sh,  ? ' how to determine value to center the knob
'SetSliderValue sv,  ? ' how to determine value to center the knob
Local t:TTimer = CreateTimer(60)
While WaitEvent()
	Print CurrentEvent.ToString()
	Select EventID()
	
		Case EVENT_TIMERTICK
		
			SetGadgetShape (Canvas, -SliderValue (sh), -SliderValue (sv), GadgetWidth(Canvas), GadgetHeight(Canvas))
			SetGraphics CanvasGraphics(Canvas)
			Cls
			
			DrawLine 0 , 0 , GadgetWidth(canvas) , GadgetHeight(canvas)
			DrawLine 0, GadgetHeight(Canvas),GadgetWidth(canvas),0
			
			Flip
	
		Case EVENT_WINDOWCLOSE
			End
	End Select
Wend
 | 
| 
 | ||
| hope someone could help me with this ! i've tested setslider value, sh, (GadgetWidth(Panel)/GadgetWidth(canvas)) * 50, but it's not the answer ! in fact i don't know what'is the value computed by setsliderrange. ratio = 'GetSliderRange' sh , GadgetWidth(Panel) , GadgetWidth(Canvas) setslidervalue sh, ratio * 50 | 
| 
 | ||
| This seems to work: finding the range, calculating its center, and setting the slider values to half of that.  (I think that TomToad was onto it, but I tried it hands-on rather than theoretical <g>.) Strict 
Local window:TGadget=CreateWindow("My Window",300,100,240,280,,WINDOW_TITLEBAR)
Global Panel :  TGadget  = CreatePanel:TGadget (10,10,200,200,window)
Global Canvas : TGadget  = CreateCanvas (0,0,340,240,Panel)
Local sv : Tgadget = CreateSlider(210,10,16,200,window,SLIDER_VERTICAL)
Local sh : Tgadget = CreateSlider(10 , 210 , 200 , 16 , window , SLIDER_HORIZONTAL)
Local h0 = GadgetWidth(Panel)
Local h1 = GadgetWidth(Canvas)
Local v0 = GadgetHeight(Panel)
Local v1 = GadgetHeight(Canvas)
Print "h/v ranges= " + h0 + "," + h1 + " / " + v0 + "," + v1
SetSliderRange sh , h0 , h1
SetSliderRange sv , v0 , v1
' calculate the the max values possible:
Local hmax = h1 - h0
Local vMax = v1 - v0
Print "hmax = " + hmax
Print "vmax = " + vmax
' set to center of range:
SetSliderValue sh, hmax/2
SetSliderValue sv, vmax/2
Local t:TTimer = CreateTimer(60)
Local oldh, oldv ' for printing values
While WaitEvent()
	' print current values
	
	If ( oldh <> SliderValue(sh) )
		Print "sh = " + SliderValue(sh) + ", " + "range = " + h0 + " to " + h1
		oldh = SliderValue(sh)
	EndIf
	
	If ( oldv <> SliderValue(sv) )
		Print "sv = " + SliderValue(sv) + ", " + "range = " + v0 + " to " + v1
		oldv = SliderValue(sv)
	EndIf
	
	
	'Print CurrentEvent.ToString()
	Select EventID()
	
		Case EVENT_TIMERTICK
		
			SetGadgetShape (Canvas, -SliderValue (sh), -SliderValue (sv), GadgetWidth(Canvas), GadgetHeight(Canvas))
			SetGraphics CanvasGraphics(Canvas)
			Cls
			
			DrawLine 0 , 0 , GadgetWidth(canvas) , GadgetHeight(canvas)
			DrawLine 0, GadgetHeight(Canvas),GadgetWidth(canvas),0
			
			Flip
	
		Case EVENT_WINDOWCLOSE
			End
	End Select
Wend
It's the way that sliders calulate position that's a bit tricky. It's how far it is along from min to max, adjusted to make min into 0 (rather than where far left = min and far right = max). | 
| 
 | ||
| Too slow, but here's my code... 
Strict 
Local window:TGadget=CreateWindow("My Window",0,0,240,280,,WINDOW_TITLEBAR)
Global Panel :  TGadget  = CreatePanel:TGadget (10,10,200,200,window)
Global Canvas : TGadget  = CreateCanvas (0,0,340,240,Panel)
Local sv : Tgadget = CreateSlider(210,10,16,200,window,SLIDER_VERTICAL)
Local sh : Tgadget = CreateSlider(10 , 210 , 200 , 16 , window , SLIDER_HORIZONTAL)
SetSliderRange sh , GadgetWidth(Panel) , GadgetWidth(Canvas)
SetSliderRange sv , GadgetHeight(Panel) , GadgetHeight(Canvas)
SetSliderValue sh,  (GadgetWidth(Canvas)-GadgetWidth(Panel))/2
SetSliderValue sv,  (GadgetHeight(Canvas)-GadgetHeight(Panel))/2
Local t:TTimer = CreateTimer(60)
While WaitEvent()
	'Print CurrentEvent.ToString()
	Select EventID()
	
		Case EVENT_TIMERTICK
		    Print "SH: "+SliderValue(sh)+" and SV: "+SliderValue(sv)
		
			SetGadgetShape (Canvas, -SliderValue (sh), -SliderValue (sv), GadgetWidth(Canvas), GadgetHeight(Canvas))
			SetGraphics CanvasGraphics(Canvas)
			Cls
			
			DrawLine 0 , 0 , GadgetWidth(canvas) , GadgetHeight(canvas)
			DrawLine 0, GadgetHeight(Canvas),GadgetWidth(canvas),0
			
			Flip
	
		Case EVENT_WINDOWCLOSE
			End
	End Select
Wend
P.S.: To speed this up, store the canvas size and panel size values in different vars. So you don't need to call the functions dozens of times every loop. | 
| 
 | ||
| Many thanks for your code samples ! i've used Grisu code into my program. |