Special Toolbar help

BlitzPlus Forums/BlitzPlus Programming/Special Toolbar help

Hi everyone!

My problem sounds rather simple, but I haven't found s solution by now. :(

What I need is a "vertical" toolbar for 120+ (64x64 pixel) button images. -
As my window (800x600) isn't that in height size I also need some kind of "arrows" to the end or a "slider" to the toolbar sides in order to navigate.

I have uploaded some testing images here:
http://legion.gibbering.net/grisu/buttons.zip

Thanks in advance.

Sounds like you want one like the one used in MS Outlook (not Outlook Express).

I would imagine you could do it with a panel and canvas.

I have tried to code such with the help of the code archives, but its really slow and buggy as the canvas has to be 8000+ pixel in height, which is crazy!

There has to be another way by only creating some image buttons and simply change the images displayed onto them when needed. *still thinking....

app=CreateWindow("Database",0,0,640,480,0,17)


; create 2 parent panels
panel1=CreatePanel(5,5,230,450,app)
scrollpanel1=CreateVScrollpanel(105,7900,panel1,20,160,160,160)

; put some example crap on the scrollpanels
For t=0 To 120
    CreateButton(t,10,10+t*64,64,64,VScrollpanelPanel(scrollpanel1)) 
Next

; main loop
quit=False
Repeat
	WaitEvent()
	
	If EventID()=$803 quit=True

	; if you don't include these, you can't scroll!	
	VScrollpanelEvents (scrollpanel1)
	
Until quit

; clean-up
FreeBank scrollpanel1

; bye!
End

; returns the actual panelhandle of the scrollpanel..
Function VScrollpanelPanel(bank)
	Return PeekInt(bank,4)
End Function



Function VScrollpanelEvents(bank)

	canvas=PeekInt(bank,8)
	
	If EventSource()=canvas
	
		If EventID()=$201 
			PokeByte bank,19,1 ; drag=true
			PokeShort bank,20,MouseY() ; start coord.
		EndIf
		
		If EventID()=$202
			PokeByte bank,19,0 ; drag=false
		EndIf
		
		If PeekByte(bank,19) ; drag ?
			If EventID()=$203
			
				y=MouseY()
				
				panel=PeekInt(bank,4)
				oldy=PeekShort(bank,20)
				
				ycoord=GadgetY(panel)+y-oldy
				ycoord=Limit(ycoord,-PeekShort(bank,14)+PeekShort(bank,22),0)
				
				SetGadgetShape panel,GadgetX(panel),ycoord,GadgetWidth(panel),GadgetHeight(panel)

				PokeShort bank,20,y
				
			EndIf
		EndIf
		
	EndIf

End Function

Function CreateVScrollpanel(width,height,parent,dragwidth,r,g,b)

	If width*height=0 Break"Incorrect dimensions!"
	If height<GadgetHeight(parent) Break"Panel height-bigger than parent-height!"
	If Not parent Break"Parent missing"
	If Not dragwidth Break"Dragbar zero"
	r=Limit(r,0,255)
	g=Limit(g,0,255)
	b=Limit(b,0,255)
	
	; adr	name		size
	; 00	ID			4 bytes    <- reserved for an optional 4-chars ID check! not used right now..
	; 04	panel		1 int (4 bytes)
	; 08	dragcanvas	1 Int (4 bytes)
	; 12	width		1 short (2 bytes)
	; 14	height		1 short (2 bytes)
	; 16	r			1 byte
	; 17	g			1 byte
	; 18	b			1 byte
	; 19	dragstatus	1 byte
	; 20	dragY		1 short (2 bytes)
	; 22	parntheight	1 short (2 bytes)

	bank=CreateBank(24)
	
	panel=CreatePanel(0,0,width,height,parent)
	SetPanelColor panel,r,g,b
	canvas=CreateCanvas(width-dragwidth,0,dragwidth,height,panel)
	SetCanvas canvas
		ClsColor r,g,b:Cls
		For y=2 To height-1 Step 4
			For x=2 To dragwidth-1 Step 4
				xo=(y Mod 8)/4
				Bcolor r*1.3,g*1.3,b*1.3
				Plot x+xo,y
				Bcolor r*0.7,g*0.7,b*0.7
				Plot x+xo+1,y+1
			Next
		Next
		Bcolor r*1.3,g*1.3,b*1.3
		Line 0,0,0,height-2
		Line 0,0,dragwidth-2,0
		
		Bcolor r*0.7,g*0.7,b*0.7
		Line dragwidth-1,1,dragwidth-1,height-2
		Line 1,height-1,dragwidth-2,height-1
		
	FlipCanvas canvas
	
	PokeInt bank,4,panel
	PokeInt bank,8,canvas
	PokeShort bank,12,width
	PokeShort bank,14,height
	PokeByte bank,16,r
	PokeByte bank,17,g
	PokeByte bank,18,b
	
	PokeShort bank,22,GadgetHeight (parent)
	
	Return bank

End Function

; misc. needed global functions.. some useful, some just for the lazy coder (SetCanvas) :)

Function Limit(value,minvalue,maxvalue)
	If value<minvalue Return minvalue
	If value>maxvalue Return maxvalue
	Return value
End Function

Function Break(s$)
	Notify s$
	End
End Function

Function Bcolor(r,g,b)
	r=Limit(r,0,255)
	g=Limit(g,0,255)
	b=Limit(b,0,255)
	Color r,g,b
End Function

Function SetCanvas(bla)
	SetBuffer CanvasBuffer(bla)
End Function