Ooops
March 05, 2021, 07:33:47 AM

Author Topic: [bb] Load a menu from a file by JoshK [ 1+ years ago ]  (Read 522 times)

Offline BlitzBot

[bb] Load a menu from a file by JoshK [ 1+ years ago ]
« on: June 29, 2017, 12:28:40 AM »
Title : Load a menu from a file
Author : JoshK
Posted : 1+ years ago

Description : This is a useful routine to load your application's menu from a file.  You can even load a new menu, and the old one will be destroyed.  Menu gadgets are stored in a global MenuItem[] array, according to their tag.  If you need to check or disable a menu item, just check to see if the menu item exists, then perform the action:
Code: [Select]
Select WaitEvent()
Case EVENT_MENUEVENT
Select EventData()
Case MENU_ACTION
If MenuItem[MENU_ACTION] CheckMenu MenuItem[MENU_ACTION]


Here is a sample menu file:
<div class="quote"> [File]
   menu "New", NewFile
   <>
   menu "Open...", OpenFile, O, 2
   menu "Merge...", MergeFile
   <>
   menu "Save", SaveFile, S, 2
   menu "Save As...", SaveFileAs
   menu "Save Selected...", SaveSelected
   <>
   menu "Import....", ImportFile
   menu "Export...", ExportFile
   menu "Export Selected...", ExportSelected
   <>
   menu "Run Map...", NewFile, F5
   <>
   menu "Exit", Exit

[Edit]
   menu "Undo", Undo, Z, 2
   menu "Redo", Redo, Z, 6
   <>
   menu "Cut", CutSelection, X, 2
   menu "Copy", CopySelection, C, 2
   menu "Paste", PasteSelection, V, 2
   <>
   menu "Select All", SelectAll
   menu "Select None", SelectNone, Space
   menu "Intert Selection", SelectInvert
   <>
   menu "Select Object", SelectObject, Z
   menu "Select Subobject", SelectSubobject, X
   menu "Select Vertex", SelectVertex, C
   <>
   menu "Properties...", ShowProperties, Enter, 4   

[View]
   menu "Material Browser", ShowMaterialBrowser
   menu "Model Browser", ShowModelBrowser
   <>
   menu "Toolbar", ShowToolbar
   menu "Sidepanel", ShowSidepanel   
   menu "Scrollbars",ShowScrollbars
   <>
   menu "Console", ShowConsole   
   menu "Map Statistics", ShowStats
   <>
   menu "Full-Screen", FullScreenMode, F12
   <>
   menu "Increase Grid Size", GridMore, [   
   menu "Decrease Grid Size", GridLess, ]
   <>
   menu "Zoom In", ZoomMore, +
   menu "Zoom Out", ZoomLess, -
   <>
   menu "Render View"
      {
      menu "Perspective"
      menu "Front - XY"
      menu "Top - XZ"
      menu "Side - ZY"
      }
   menu "Culling"
      {
      menu "Occlusion"
      menu "Frustum"
      <>
      menu "Freeze Culling"
      }
   <>
   menu "World Render Mode"
      {
      menu "Wireframe"
      menu "Solid"
      menu "Textured"
      menu "Lighting"
      menu "Textured+Lighting"
      }
   menu "Model Render Mode"
      {
      menu "Wireframe"
      menu "Solid"
      menu "Textured"
      menu "Lighting"
      menu "Textured+Lighting"
      }
   <>
   menu "Render To File", RenderFile, F11

[Help]
   menu "Help Contents...", Help, F1
   <>
   menu "About...", About
</div> [/i]

Code :
Code: BlitzBasic
  1. Const MaxMenuItems=99
  2.  
  3. Global menuitem:TGadget[MaxMenuItems]
  4.  
  5. Const MENU_ABOUT=1
  6. Const MENU_EXIT=2
  7. Const MENU_CONSOLE=3
  8. Const MENU_CONSOLE_COPY=23
  9. Const MENU_CONSOLE_SELECTALL=24
  10. Const MENU_CONSOLE_STARTLOG=27
  11. Const MENU_CONSOLE_STOPLOG=28
  12. Const MENU_CONSOLE_SAVE=19
  13. Const MENU_CONSOLE_CLOSE=20
  14. Const MENU_FULLSCREEN=21
  15.  
  16. Function LoadMenu:Int(file$,window:TGadget)
  17.  
  18.         root:TGadget=WindowMenu(window)
  19.         If Not root Return
  20.  
  21.         f:TStream=ReadFile(file)
  22.         If Not f Return
  23.        
  24.         For menu:TGadget=EachIn root.kids
  25.                 FreeMenu menu
  26.         Next
  27.  
  28.         If Not root Return
  29.         For n=0 To MaxMenuItems-1
  30.                 MenuItem[n]=Null
  31.         Next
  32.        
  33.         While Not f.eof()
  34.                 s$=f.readline()
  35.                 s=Trim(s)
  36.                 If Left(s,1)="[" And Right(s,1)="]"
  37.                         title$=Mid(s,2,Len(s)-2)
  38.                         item:TGadget=Null
  39.                         menu:TGadget=CreateMenu(title,0,root)
  40.                         parent:TGadget=menu
  41.                 Else
  42.                         p=Instr(s," ")
  43.                         If p
  44.                                 command$=Left(s,p-1)
  45.                         Else
  46.                                 command=s
  47.                         EndIf
  48.                         command=Trim(command)
  49.                         command=Lower(command)
  50.                         If p
  51.                                 params$=Right(s,Len(s)-p)
  52.                         Else
  53.                                 params=""
  54.                         EndIf
  55.                         Select command
  56.                                 Case "<>"
  57.                                         If parent CreateMenu("",0,parent)
  58.                                 Case "{"
  59.                                         If item:TGadget<>Null parent=item
  60.                                 Case "}"
  61.                                         parent=menu
  62.                                 Case "menu"
  63.                                         If parent
  64.                                                 text$=Trim((piece(params,1,",")))
  65.                                                 If Not Instr(text,Chr(34)) text=""
  66.                                                 text=Replace(text,Chr(34),"")
  67.                                                 tagname$=piece(params,2,",")
  68.                                                 tag=GetMenuAction(tagname)
  69.                                                 hotkeyname$=Trim((piece(params,3,",")))
  70.                                                 hotkey=KeyCode(hotkeyname)
  71.                                                 modifier=Int(piece(params,4,","))
  72.                                                 item:TGadget=CreateMenu(text,tag,parent,hotkey,modifier)
  73.                                                 menuitem[tag]=item
  74.                                                 extrahotkey=0
  75.                                                 Select tag
  76.                                                         Case KEY_0 extrahotkey=KEY_NUM0
  77.                                                         Case KEY_1 extrahotkey=KEY_NUM1
  78.                                                         Case KEY_2 extrahotkey=KEY_NUM2
  79.                                                         Case KEY_3 extrahotkey=KEY_NUM3
  80.                                                         Case KEY_4 extrahotkey=KEY_NUM4
  81.                                                         Case KEY_5 extrahotkey=KEY_NUM5
  82.                                                         Case KEY_7 extrahotkey=KEY_NUM7
  83.                                                         Case KEY_8 extrahotkey=KEY_NUM8
  84.                                                         Case KEY_9 extrahotkey=KEY_NUM9
  85.                                                        
  86.                                                         Case KEY_SLASH extrahotkey=KEY_NUMDIVIDE
  87.                                                        
  88.                                                         Case KEY_PERIOD extrahotkey=KEY_NUMDECIMAL
  89.                                                         Case KEY_EQUALS extrahotkey=KEY_NUMADD
  90.                                                         Case KEY_MINUS extrahotkey=KEY_NUMSUBTRACT                                     
  91.                                                 EndSelect
  92.                                                 If extrahotkey SetHotKeyEvent(extrahotkey ,modifier,CreateEvent(EVENT_MENUACTION,Null,tag))
  93.                                         EndIf
  94.                         EndSelect
  95.                 EndIf
  96.         Wend
  97.        
  98.         f.close()
  99.         UpdateWindowMenu window
  100.         Return True
  101. EndFunction
  102.  
  103. Function GetMenuAction:Int(actionname$)
  104.         actionname=Upper(actionname)
  105.         actionname=Trim(actionname)
  106.         Select actionname
  107.                 Case "ABOUT" Return MENU_ABOUT
  108.                 Case "FULLSCREENMODE" Return MENU_FULLSCREEN
  109.                 Case "EXIT" Return MENU_EXIT
  110.         EndSelect
  111. EndFunction
  112.  
  113. Function KeyCode:Int(keyname$)
  114.         keyname=Upper(keyname)
  115.         keyname=Trim(keyname)
  116.         Select keyname
  117.        
  118.                 Case "A" Return KEY_A
  119.                 Case "B" Return KEY_B
  120.                 Case "C" Return KEY_C
  121.                 Case "D" Return KEY_D
  122.                 Case "E" Return KEY_E
  123.                 Case "F" Return KEY_F
  124.                 Case "G" Return KEY_G
  125.                 Case "H" Return KEY_H
  126.                 Case "I" Return KEY_I
  127.                 Case "J" Return KEY_J
  128.                 Case "K" Return KEY_K
  129.                 Case "L" Return KEY_L
  130.                 Case "M" Return KEY_M
  131.                 Case "N" Return KEY_N
  132.                 Case "O" Return KEY_O
  133.                 Case "P" Return KEY_P
  134.                 Case "Q" Return KEY_Q
  135.                 Case "R" Return KEY_R
  136.                 Case "S" Return KEY_S
  137.                 Case "T" Return KEY_T
  138.                 Case "U" Return KEY_U
  139.                 Case "V" Return KEY_V
  140.                 Case "W" Return KEY_W
  141.                 Case "X" Return KEY_X
  142.                 Case "Y" Return KEY_Y
  143.                 Case "Z" Return KEY_Z
  144.                
  145.                 Case "0" Return KEY_0
  146.                 Case "1" Return KEY_1
  147.                 Case "2" Return KEY_2
  148.                 Case "3" Return KEY_3
  149.                 Case "4" Return KEY_4
  150.                 Case "5" Return KEY_5
  151.                 Case "6" Return KEY_6
  152.                 Case "7" Return KEY_7
  153.                 Case "8" Return KEY_8
  154.                 Case "9" Return KEY_9
  155.  
  156.                 Case "F1" Return KEY_F1
  157.                 Case "F2" Return KEY_F2
  158.                 Case "F3" Return KEY_F3
  159.                 Case "F4" Return KEY_F4
  160.                 Case "F5" Return KEY_F5
  161.                 Case "F6" Return KEY_F6
  162.                 Case "F7" Return KEY_F7
  163.                 Case "F8" Return KEY_F8
  164.                 Case "F9" Return KEY_F9
  165.                 Case "F10" Return KEY_F10
  166.                 Case "F11" Return KEY_F11
  167.                 Case "F12" Return KEY_F12
  168.  
  169.                 Case "SPACE" Return KEY_SPACE
  170.                 Case "ESCAPE" Return KEY_ESCAPE
  171.                 Case "BACKSPACE" Return KEY_BACKSPACE
  172.                 Case "CLEAR" Return KEY_CLEAR
  173.                 Case "RETURN" Return KEY_RETURN
  174.                 Case "ENTER" Return KEY_ENTER
  175.                 Case "PAUSE" Return KEY_PAUSE
  176.  
  177.                 Case "CAPSLOCK" Return KEY_CAPSLOCK
  178.                 Case "PAGEUP" Return KEY_PAGEUP
  179.                 Case "PAGEDOWN" Return KEY_PAGEDOWN
  180.                 Case "END" Return KEY_END
  181.                 Case "HOME" Return KEY_HOME
  182.                 Case "LEFT" Return KEY_LEFT
  183.                 Case "RIGHT" Return KEY_RIGHT
  184.                 Case "UP" Return KEY_UP
  185.                 Case "DOWN" Return KEY_DOWN
  186.                 Case "SELECT" Return KEY_SELECT
  187.                 Case "PRINT" Return KEY_PRINT
  188.                 Case "EXECUTE" Return KEY_EXECUTE
  189.                 Case "SCREEN" Return KEY_SCREEN
  190.                 Case "INSERT" Return KEY_INSERT
  191.                 Case "DELETE" Return KEY_DELETE
  192.                 Case "HELP" Return KEY_HELP
  193.                 Case "NUMLOCK" Return KEY_NUMLOCK
  194.                 Case "SCROLL" Return KEY_SCROLL
  195.                 Case "-","_" Return KEY_MINUS
  196.                 Case "="."+" Return KEY_EQUALS
  197.                 Case "[","{" Return KEY_OPENBRACKET
  198.                 Case "]","}" Return KEY_CLOSEBRACKET
  199.                 Case "","|" Return KEY_BACKSLASH
  200.                 Case ";",":" Return KEY_SEMICOLON
  201.                 Case "'",Chr(34) Return KEY_QUOTES
  202.                 Case ",","<" Return KEY_COMMA
  203.                 Case ".".">" Return KEY_PERIOD
  204.                 Case "/","?" Return KEY_SLASH
  205.  
  206.         EndSelect
  207. EndFunction
  208.  
  209. Function Piece$(s$,entry,char$=" ")
  210.         Local n
  211.         Local p
  212.         Local a$
  213.         While Instr(s,char+char)
  214.                 s=Replace(s,char+char,char)
  215.         Wend
  216.         For n=1 To entry-1
  217.                 p=Instr(s,char)
  218.                 s=Right(s,Len(s)-p)
  219.                 If Not p
  220.                         If entry=n Exit Else Return
  221.                 EndIf
  222.         Next
  223.         p=Instr(s,char)
  224.         If p<1
  225.                 a$=s
  226.         Else
  227.                 a=Left(s,p-1)
  228.         EndIf
  229.         Return a
  230. End Function


Comments :


JoshK(Posted 1+ years ago)

 Here's an updated version, using the way I code now:
Code: [Select]
SuperStrict

Import maxgui.maxgui
Import brl.retro
Import brl.pngloader

Private
Global MenuMap:TMap=New TMap
Public

Function GetMenu:TGadget(menuname:String)
Return TGadget(menumap.valueforkey(menuname))
EndFunction

Function LoadMenu:Int(url:Object,root:TGadget)
Local text:String,s:String,command:String,parent:TGadget,item:Tgadget,p:Int,params:String,tagname:String,hotkeyname:String
Local hotkey:Int,modifier:Int,f:TStream,title:String,menu:TGadget,sarr:String[],menuname:String,actionname:String,pixmap:TPixmap

f=ReadStream(url)
If Not f Return False

While Not f.Eof()
s$=f.ReadLine()
s=Trim(s)
If Left(s,1)="[" And Right(s,1)="]"
title$=Mid(s,2,Len(s)-2)
item:TGadget=Null
menu:TGadget=CreateMenu(title,0,root)
parent:TGadget=menu
Else
p=Instr(s," ")
If p
command$=Left(s,p-1)
Else
command=s
EndIf
command=Trim(command)
command=Lower(command)
If p
params$=Right(s,Len(s)-p)
Else
params=""
EndIf
Select command
Case "<>"
If parent CreateMenu("",0,parent)
Case "{"
If item:TGadget<>Null parent=item
Case "}"
parent=menu
Case "menu"
If parent

sarr=params.split(",")[..4]

'Text to show on menu
menuname=sarr[0].Trim()
menuname=menuname.Replace("~q","")

'Hotkey
hotkeyname=sarr[1].Trim()
hotkey=KeyCode(hotkeyname)

'Hotkey modifier
modifier=Int(sarr[2])

'Menu action, stored in gadget extra
actionname=sarr[3].Trim()
If Not actionname actionname=menuname

item:TGadget=CreateMenu(menuname,0,parent,hotkey,modifier)
SetGadgetExtra item,actionname
MenuMap.insert(actionname,item)

pixmap=LoadPixmap(actionname+".png")
If pixmap SetGadgetPixmap(item,pixmap)

EndIf
EndSelect
EndIf
Wend

f.close()
Return True
EndFunction

Private

Function KeyCode:Int(keyname$)
keyname=Upper(keyname)
keyname=Trim(keyname)
Select keyname
Case "A" Return KEY_A
Case "B" Return KEY_B
Case "C" Return KEY_C
Case "D" Return KEY_D
Case "E" Return KEY_E
Case "F" Return KEY_F
Case "G" Return KEY_G
Case "H" Return KEY_H
Case "I" Return KEY_I
Case "J" Return KEY_J
Case "K" Return KEY_K
Case "L" Return KEY_L
Case "M" Return KEY_M
Case "N" Return KEY_N
Case "O" Return KEY_O
Case "P" Return KEY_P
Case "Q" Return KEY_Q
Case "R" Return KEY_R
Case "S" Return KEY_S
Case "T" Return KEY_T
Case "U" Return KEY_U
Case "V" Return KEY_V
Case "W" Return KEY_W
Case "X" Return KEY_X
Case "Y" Return KEY_Y
Case "Z" Return KEY_Z
Case "0" Return KEY_0
Case "1" Return KEY_1
Case "2" Return KEY_2
Case "3" Return KEY_3
Case "4" Return KEY_4
Case "5" Return KEY_5
Case "6" Return KEY_6
Case "7" Return KEY_7
Case "8" Return KEY_8
Case "9" Return KEY_9
Case "F1" Return KEY_F1
Case "F2" Return KEY_F2
Case "F3" Return KEY_F3
Case "F4" Return KEY_F4
Case "F5" Return KEY_F5
Case "F6" Return KEY_F6
Case "F7" Return KEY_F7
Case "F8" Return KEY_F8
Case "F9" Return KEY_F9
Case "F10" Return KEY_F10
Case "F11" Return KEY_F11
Case "F12" Return KEY_F12
Case "SPACE" Return KEY_SPACE
Case "ESCAPE" Return KEY_ESCAPE
Case "BACKSPACE" Return KEY_BACKSPACE
Case "CLEAR" Return KEY_CLEAR
Case "RETURN" Return KEY_RETURN
Case "ENTER" Return KEY_ENTER
'Case "PAUSE" Return KEY_PAUSE
'Case "CAPSLOCK" Return KEY_CAPSLOCK
Case "PAGEUP" Return KEY_PAGEUP
Case "PAGEDOWN" Return KEY_PAGEDOWN
Case "END" Return KEY_END
Case "HOME" Return KEY_HOME
Case "LEFT" Return KEY_LEFT
Case "RIGHT" Return KEY_RIGHT
Case "UP" Return KEY_UP
Case "DOWN" Return KEY_DOWN
Case "SELECT" Return KEY_SELECT
Case "PRINT" Return KEY_PRINT
Case "EXECUTE" Return KEY_EXECUTE
Case "SCREEN" Return KEY_SCREEN
Case "INSERT" Return KEY_INSERT
Case "DELETE" Return KEY_DELETE
'Case "HELP" Return KEY_HELP
'Case "NUMLOCK" Return KEY_NUMLOCK
'Case "SCROLL" Return KEY_SCROLL
Case "-","_" Return KEY_MINUS
Case "="."+" Return KEY_EQUALS
Case "[","{" Return KEY_OPENBRACKET
Case "]","}" Return KEY_CLOSEBRACKET
Case "","|" Return KEY_BACKSLASH
Case ";",":" Return KEY_SEMICOLON
Case "'","~q" Return KEY_QUOTES
Case ",","<" Return KEY_COMMA
Case ".".">" Return KEY_PERIOD
Case "/","?" Return KEY_SLASH
EndSelect
EndFunction

Public
Instead of having menu ids you just get the menu extra parameter, which is set to the action name.  You can then make menus in different languages and only have to specify a correct action name at the end.  If no action name is specified, the action name will be assumed to be the menu name:
Code: [Select]
If EventID()=EVENT_MENUACTION
Local menu:TGadget
menu=TGadget(EventSource())
Select String(menu.extra)
Case "OpenFile"
RequestFile("")
EndSelect
EndIf
And here is what my new menu file format looks like:
Code: [Select]
[File]
menu "New"
<>
menu "Open...", O, 2, OpenFile
So it is like this:
Code: [Select]
menu menuname [, hotkey, modifier, actionname ]If you need to retrieve a menu other than the current event source, just use GetMenu() to retrieve it by action name.This will also load a menu icon automatically if a png file exists that matches the action name. [/i]

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal