Code archives/File Utilities/Load a menu from a file
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
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:Select WaitEvent() Case EVENT_MENUEVENT Select EventData() Case MENU_ACTION If MenuItem[MENU_ACTION] CheckMenu MenuItem[MENU_ACTION] Here is a sample menu file: [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 | |||||
Const MaxMenuItems=99 Global menuitem:TGadget[MaxMenuItems] Const MENU_ABOUT=1 Const MENU_EXIT=2 Const MENU_CONSOLE=3 Const MENU_CONSOLE_COPY=23 Const MENU_CONSOLE_SELECTALL=24 Const MENU_CONSOLE_STARTLOG=27 Const MENU_CONSOLE_STOPLOG=28 Const MENU_CONSOLE_SAVE=19 Const MENU_CONSOLE_CLOSE=20 Const MENU_FULLSCREEN=21 Function LoadMenu:Int(file$,window:TGadget) root:TGadget=WindowMenu(window) If Not root Return f:TStream=ReadFile(file) If Not f Return For menu:TGadget=EachIn root.kids FreeMenu menu Next If Not root Return For n=0 To MaxMenuItems-1 MenuItem[n]=Null Next 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 text$=Trim((piece(params,1,","))) If Not Instr(text,Chr(34)) text="" text=Replace(text,Chr(34),"") tagname$=piece(params,2,",") tag=GetMenuAction(tagname) hotkeyname$=Trim((piece(params,3,","))) hotkey=KeyCode(hotkeyname) modifier=Int(piece(params,4,",")) item:TGadget=CreateMenu(text,tag,parent,hotkey,modifier) menuitem[tag]=item extrahotkey=0 Select tag Case KEY_0 extrahotkey=KEY_NUM0 Case KEY_1 extrahotkey=KEY_NUM1 Case KEY_2 extrahotkey=KEY_NUM2 Case KEY_3 extrahotkey=KEY_NUM3 Case KEY_4 extrahotkey=KEY_NUM4 Case KEY_5 extrahotkey=KEY_NUM5 Case KEY_7 extrahotkey=KEY_NUM7 Case KEY_8 extrahotkey=KEY_NUM8 Case KEY_9 extrahotkey=KEY_NUM9 Case KEY_SLASH extrahotkey=KEY_NUMDIVIDE Case KEY_PERIOD extrahotkey=KEY_NUMDECIMAL Case KEY_EQUALS extrahotkey=KEY_NUMADD Case KEY_MINUS extrahotkey=KEY_NUMSUBTRACT EndSelect If extrahotkey SetHotKeyEvent(extrahotkey ,modifier,CreateEvent(EVENT_MENUACTION,Null,tag)) EndIf EndSelect EndIf Wend f.close() UpdateWindowMenu window Return True EndFunction Function GetMenuAction:Int(actionname$) actionname=Upper(actionname) actionname=Trim(actionname) Select actionname Case "ABOUT" Return MENU_ABOUT Case "FULLSCREENMODE" Return MENU_FULLSCREEN Case "EXIT" Return MENU_EXIT EndSelect EndFunction 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 "'",Chr(34) Return KEY_QUOTES Case ",","<" Return KEY_COMMA Case ".".">" Return KEY_PERIOD Case "/","?" Return KEY_SLASH EndSelect EndFunction Function Piece$(s$,entry,char$=" ") Local n Local p Local a$ While Instr(s,char+char) s=Replace(s,char+char,char) Wend For n=1 To entry-1 p=Instr(s,char) s=Right(s,Len(s)-p) If Not p If entry=n Exit Else Return EndIf Next p=Instr(s,char) If p<1 a$=s Else a=Left(s,p-1) EndIf Return a End Function |
Comments
| ||
Here's an updated version, using the way I code now: 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: 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: [File] menu "New" <> menu "Open...", O, 2, OpenFile So it is like this: 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. |
Code Archives Forum