Home
Products
Community
Manuals
Contact
Login or Signup

Code archives/BlitzPlus Gui/Foldable menus

This code has been declared by its author to be Public Domain code.

Download source code

Foldable menus by Wiebo(Posted 7 years ago)
You know the ones I am talking about, the menus in a sidebar you can fold and unfold. Click on the grey area to fold and unfold. You can even add more menu bars to one window. NOTE: This code when run in debug mode can trash some gadgets. This does not happen with debug off.
; foldable menus for B+ by Wiebo

; how to use: create a window, add a menu, add panels to menu, add your gadgets to subpanels

main = CreateWindow ("Fold me", 0,0, 400, 400)

; window, panel amount, [rightside]

menu.collapse = CreateMainMenu ( main, 3, FALSE )

; menu, ysize, index, state, title$, titlestringlength

AddPanelToMenu( menu, 200, 1, OPEN, " Menu 1 ", 50 )
AddPanelToMenu( menu, 100, 2, OPEN, " Menu 2 ", 50 )
AddPanelToMenu( menu, 100, 3, OPEN, " Menu 3 ", 50 )

a = CreateButton( "Button 1", 25,25,50,25, menu\subpanel[1],0)
SetGadgetLayout a, 1,0,1,0

a = CreateButton( "Button 2", 25,25,50,25, menu\subpanel[2],0)
SetGadgetLayout a, 1,0,1,0

a = CreateButton( "Button 3", 25,25,50,25, menu\subpanel[3],0)
SetGadgetLayout a, 1,0,1,0

RedrawMenu( menu )

Repeat

	id = WaitEvent()

	Select id
		Case $201	; mouse down

			Select EventSource()

				Case menu\panel[1]
					menu\state[1]  = Not menu\state[1]
					RedrawMenu( menu )

				Case menu\panel[2]
					menu\state[2]  = Not menu\state[2]
					RedrawMenu( menu )

				Case menu\panel[3]
					menu\state[3]  = Not menu\state[3]
					RedrawMenu( menu )

			End Select

		Case $101

			Select EventData()

				Case 1
					End

			End Select


	End Select

Forever

; -------------------------------------------------------

Const OPEN = 0
Const CLOSED = 1
Const MENUWIDTH = 198;214
Const MAXPANELS = 10

Type Collapse
	Field MainPanel				; main panel to attach subpanels to goes here
	Field MainWidth				; width of main panel
	Field MainSlider			; slider attached to main panel
	Field Rightside	; true or false. false means panel is drawn at left side of window
	Field MainParent			; parent window
	Field PanelAmount			; amount of actiual panels in menu
	Field Panel[MAXPANELS]			; resizeable panels
	Field SubPanel[MAXPANELS]		; add your GADGETS to this panel
	Field Label[MAXPANELS]			; name to display
	Field State[MAXPANELS]			; open or closed
	Field Ysize[MAXPANELS]			; size when opened
End Type

; -------------------------------------------

Function CreateMainMenu.collapse( window, amount, rightside = TRUE )

	If amount > 0 And amount <= MAXPANELS

		; attach a menu bar to the correct side of a window

		collapse.collapse = New collapse

		collapse\MainParent = window
		collapse\MainWidth = MENUWIDTH
		collapse\PanelAmount = amount
		collapse\Rightside = rightside

		collapse\MainPanel = CreatePanel ( 0, 0, MENUWIDTH+16, 10, window )

		; determine position

		If rightside = TRUE

			SetGadgetLayout collapse\MainPanel, 0,1,1,0

			collapse\MainSlider = CreateSlider ( ClientWidth( window )-16, 0, 16, ClientHeight( window ), window, 2 )
			SetGadgetLayout collapse\MainSlider, 0,1,1,1
		Else
			SetGadgetLayout collapse\MainPanel, 1,0,1,0

			collapse\MainSlider = CreateSlider ( 0, 0, 16, ClientHeight( window ), window, 2 )
			SetGadgetLayout collapse\MainSlider, 1,0,1,1
		EndIf

;		SetPanelColor collapse\MainPanel, 255,0,255  ; indication of main panel

		Return collapse
	Else
		RuntimeError "Use index 1 to " + MAXPANELS + "!"
	EndIf

End Function


Function AddPanelToMenu( c.collapse, height, index, state, name$, length )

	If index > 0 And index <= c\panelamount

		c\Panel[index] = CreatePanel ( 0, 0, c\MainWidth, 10, c\MainPanel, 1 )
		SetGadgetLayout c\Panel[index], 1,1,1,1
		SetPanelColor c\panel[index], 190,190,190	; click on this panel to open or close menu

		c\SubPanel[index] = CreatePanel ( 0, 10, c\MainWidth, height, c\Panel[index],0 )
		SetGadgetLayout c\SubPanel[index], 1,1,1,1

		c\Ysize[index] = height + 8
		c\State[index] = state

		If state = CLOSED Then HideGadget c\SubPanel[index]

		c\Label[index] = CreateLabel ( name$, 24, 0, length, 15, c\MainPanel, 2 )
		SetGadgetLayout c\Label[index], 1,0,1,0
	Else
		RuntimeError "Use index 1 to " + c\panelamount + "!"
	EndIf

End Function


Function RedrawMenu( c.collapse )

	; get vertical size of menu and adjust main panel

	ysize = 8

	For count = 1 To c\panelamount
		If c\state[count] = CLOSED
			ysize = ysize + 10
		Else
			ysize = ysize + c\Ysize[count]
		EndIf

		ysize = ysize + 16
	Next

	If c\rightside = TRUE
		SetGadgetShape c\MainPanel, ClientWidth( c\mainparent )-32-MENUWIDTH, 0, MENUWIDTH+16, ysize
	Else
		SetGadgetShape c\MainPanel, 16, 0, MENUWIDTH+16, ysize
	EndIf

	; organise panel vertical positions

	Ypos = 8

	For index = 1 To c\panelamount

		If c\State[index] = CLOSED
			ysize = 10
		Else
			ysize = c\Ysize[index]
		EndIf

		; move panels and labels

		SetGadgetShape c\Panel[index], 8, Ypos, GadgetWidth( c\Panel[index] ), ysize
		SetGadgetShape c\Label[index], 16, Ypos - 8, GadgetWidth( c\Label[index] ), GadgetHeight( c\Label[index] )

		Ypos = Ypos + ysize + 16
	Next

	; adjust slider

	SetSliderRange c\MainSlider, ClientHeight(c\MainParent), Ypos

End Function

Comments

PCBGuy(Posted 5 years ago)
How do you work this with Blitz3D. Some of these commands are not seen like "Main"


Nilium(Posted 5 years ago)
Uh... PCBGuy.. this is for BlitzPlus...

*puts a bunch of electrodes on PCBGuy's head to make sure he's using his brain*


Code Archives Forum