Unfinished slider panel gadget

BlitzMax Forums/MaxGUI Module/Unfinished slider panel gadget

JoshK(Posted 2009) [#1]
Import MaxGui.Drivers

Strict 

Local window:TGadget
Local panel:TGadget
Local panel2:TGadget
Local group:TGadget

window=CreateWindow("My Window",40,40,320,240)

' create a purple panel that occupies entire window client area

panel=CreatePanel(0,0,ClientWidth(window),ClientHeight(window),window,PANEL_ACTIVE)
SetGadgetLayout panel,1,1,1,1
'SetPanelColor panel,100,0,200

' and a smaller box


' and a group panel with a child button

Local sp:TSliderpanel=TSliderPanel.Create(120,10,100,100,panel)
CreateButton("hello",0,0,sp.subpanel.ClientWidth(),sp.subpanel.ClientHeight(),sp.subpanel)


While True
	WaitEvent 
	Print CurrentEvent.ToString()
	Select EventID()
		Case EVENT_WINDOWCLOSE
			End
	End Select
Wend


Type TSliderPanel Extends TProxyGadget

	Field panel:TGadget
	Field subpanel:TGadget
	Field subsubpanel:TGadget
	Field slider:TGadget[2]
	Const sliderwidth:Int=18
	Field desiredwidth:Int,desiredheight:Int

	Function Create:TSliderPanel(x:Int,y:Int,width:Int,height:Int,group:TGadget,style:Int=0)
		Local sliderpanel:TSliderPanel=New TSliderPanel
		sliderpanel.panel=CreatePanel(x,y,width,height,group)
		sliderpanel.slider[0]=CreateSlider(sliderpanel.panel.ClientWidth()-sliderwidth,0,sliderwidth,sliderpanel.panel.ClientHeight(),sliderpanel.panel,SLIDER_VERTICAL)
		sliderpanel.slider[1]=CreateSlider(0,sliderpanel.panel.ClientHeight()-sliderwidth,sliderpanel.panel.ClientWidth(),sliderwidth,sliderpanel.panel,SLIDER_HORIZONTAL)

		sliderpanel.subpanel=CreatePanel(0,0,sliderpanel.panel.ClientWidth(),sliderpanel.panel.ClientHeight(),sliderpanel.panel)
		SetGadgetLayout sliderpanel.panel,1,1,1,1
		SetGadgetLayout sliderpanel.subpanel,1,1,1,1
		SetGadgetColor sliderpanel.panel,255,0,0
		SetGadgetColor sliderpanel.subpanel,0,0,255
		sliderpanel.setproxy(sliderpanel.panel)
		SetGadgetLayout sliderpanel.slider[0],0,1,1,1
		SetGadgetLayout sliderpanel.slider[1],1,1,0,1
		HideGadget sliderpanel.slider[0]
		HideGadget sliderpanel.slider[1]
		sliderpanel.desiredwidth=width
		sliderpanel.desiredheight=height
		AddHook(EmitEventHook,EventHook,sliderpanel)
		Return sliderpanel
	EndFunction

	Method AdjustLayout()
		Local w:Int=panel.ClientWidth()
		Local h:Int=panel.ClientHeight()
		Local x%=0,y%=0
		
		If desiredheight>h h=desiredheight
		If desiredwidth>w w=desiredwidth
		
		If panel.ClientHeight()<desiredheight
			SetSliderRange slider[0],panel.ClientHeight(),desiredheight
			ShowGadget slider[0]
			w:-sliderwidth
			y=-SliderValue(slider[0])
		Else
			HideGadget slider[0]
		EndIf
		
		If panel.ClientWidth()<desiredwidth
			SetSliderRange slider[1],panel.ClientWidth(),desiredwidth
			ShowGadget slider[1]
			h:-sliderwidth
			x=-SliderValue(slider[1])
		Else
			HideGadget slider[1]
		EndIf		
		
		
		
		SetGadgetShape slider[0],panel.ClientWidth()-sliderwidth,0,sliderwidth,h
		SetGadgetShape slider[1],0,panel.ClientHeight()-sliderwidth,w,sliderwidth
		SetGadgetShape subpanel,x,y,w,h
	EndMethod
	
	Function EventHook:Object(id:Int,data:Object,context:Object)
		Local event:TEvent
		Local sliderpanel:TSliderpanel
		Local n:Int
		
		event=TEvent(data)
		If event
			sliderpanel=TSliderpanel(context)
			If sliderpanel
				Select event.id
				Case EVENT_GADGETACTION
					Select event.source
					Case sliderpanel.slider[0],sliderpanel.slider[1]
						sliderpanel.AdjustLayout()
					EndSelect		
				Case EVENT_WINDOWSIZE
					sliderpanel.AdjustLayout()
				EndSelect
			EndIf
		EndIf
		Return data
	EndFunction
	
EndType



SebHoll(Posted 2009) [#2]
I have been working separately on a new TScrollPanel proxy gaget myself that should be available in the next MaxGUI release. It's working really quite nicely, but I'll try and have a look at your version before release to see if I've missed any tricks. :P


SebHoll(Posted 2009) [#3]
I'm super pleased with my new TScrollPanel gadget that will be available with the next MaxGUI release (MaxGUI.ProxyGadget v1.08). The following functions will be provided:

CreateScrollPanel()
Creates a scrollable panel.

ScrollPanelClient()
Retrieves the panel that is scrolled.

FitScrollPanelClient()
Helper function that resizes the client area to common dimensions.

ScrollScrollPanel()
Scrolls the current viewport to a new position.

ScrollPanelX()
Returns the x position of the client-area that is currently at the top-left of the viewport.

ScrollPanelY()
Returns the y position of the client-area that is currently at the top-left of the viewport.

I've also spent a lot of time writing the documentation, so hopefully it should be super easy to pick-up and use.