{ /* ENiGMA½ Menu Configuration This configuration is in HJSON format. Strict to-spec JSON is also perfectly valid. The hjson npm can be used to convert to/from JSON. See http://hjson.org/ for more information and syntax. */ /* :TODO: Fully convert to HJSON Menu Configuration Tip: demjson's jsonlint is an excellent tool for linting JSON files that contains comments: jsonlint -S menu.json Some concept/ideas: "mci" : { "BT1" : { ... "draw" : "@script:blah.js/drawButton" // @method:scriptName[.js]/methodName (foreign .js) // @art:artName // @method:/methodName (local to module.js) // ... pass isFocused/etc. into draw method NOte that @draw & @art should check theme first. @draw:myMethod -> theme/draw.js::myMethod(opts) priority: @draw:location.js/myMethod -> outside of theme @draw:myMethod -> checks theme -> local first -OR- just inside themes for customization... e.g; { "myTheme" { "views" : { "VerticalMenuView" : { "draw" : "@method:location.js/myMethod" } } } } } } */ menus: { connected: { art: CONNECT next: matrix options: { nextTimeout: 1500 } } matrix: { art: matrix form: { 0: { // :TODO: Make form "0" the default if missing (e.g. optional)... not sure how with current structure though VM: { mci: { VM1: { submit: true focus: true // :TODO: need a good way to localize these ... Standard Orig->Lookup seems good. items: [ "Login", "Apply", "Log Off" ] } } submit: { *: [ { value: { 1: 0 } action: @menu:login2 }, { value: { 1: 1 }, action: @menu:apply }, { value: { 1: 2 }, action: @menu:logoff } ] } } } } } "login" : { "prompt" : "userLoginCredentials", "fallback" : "matrix", "next" : "fullLoginSequenceLoginArt", "action" : "@systemMethod:login", // :TODO: support alt submit method for prompts // if present, standard filters apply. No need for multiple submit ID's // since a prompt can only utilize one: /*"submit" : [ { "value" : { "password" : null }, "action" : "@systemMethod:login" } ]*/ }, "login2" : { "art" : "USRCRED", "fallback" : "matrix", next: messageArea //"next" : "fullLoginSequenceLoginArt", "form" : { "0" : { "mci" : { "ET1" : { "width" : 20, "maxLength" : "@config:users.usernameMax", "argName" : "username", "focus" : true }, "ET2" : { "width" : 20, "password" : true, "maxLength" : "@config:users.passwordMax", "argName" : "password", "submit" : true } }, "submit" : { "*" : [ { "value" : { "password" : null }, "action" : "@systemMethod:login" } ] }, "actionKeys" : [ { "keys" : [ "escape" ], "action" : "@menu:matrix" } ] } } }, "logoff" : { "art" : "LOGOFF", "next" : "@systemMethod:logoff", }, "apply" : { "art" : "APPLY", "next" : "newUserActive", "form" : { "0" : { "BTBTETETETETETETETETETMETL" : { "mci" : { "ET1" : { "focus" : true, "argName" : "username", "maxLength" : "@config:users.usernameMax" }, "ET2" : { "argName" : "realName", "maxLength" : 32 }, "ME3" : { "argName" : "birthdate", "maskPattern" : "####/##/##" }, "ET4" : { "argName" : "sex", "maxLength" : 1 }, "ET5" : { "argName" : "location", "maxLength" : 32 }, "ET6" : { "argName" : "affils", "maxLength" : 32 }, "ET7" : { "argName" : "email", "maxLength" : 255 }, "ET8" : { "argName" : "web", "maxLength" : 255 }, "ET9" : { "argName" : "password", "password" : true, "maxLength" : "@config:users.passwordMax" }, "ET10" : { "argName" : "passwordConfirm", "password" : true, "maxLength" : "@config:users.passwordMax" }, "BT12" : { "submit" : true, "text" : "Apply" }, "BT13" : { "submit" : [ "escape" ], "text" : "Cancel" } }, "submit" : { "12" : [ // Apply { "value" : 12, // :TODO: better, this should be optional; if not present it's a any match "action" : "@method:apply/submitApplication", "extraArgs" : { "inactive" : "userNeedsActivated", "error" : "newUserCreateError" } } ], "13" : [ // Cancel { "value" : 13, "action" : "@menu:matrix" } ] } actionKeys: [ { keys: [ "escape" ] viewId: 13 } ] } } } }, "fullLoginSequenceLoginArt" : { "art" : "LOGIN", "options" : { "pause" : true }, "next" : "fullLoginSequenceLastCallers" }, "fullLoginSequenceLastCallers": { "module" : "last_callers", "art" : "LASTCALL", "options" : { "pause" : true }, "config" : { "dateTimeFormat" : "ddd MMM Do h:mm a" }, "next" : "fullLoginSequenceSysStats" }, "fullLoginSequenceSysStats" : { "art" : "SYSSTAT", "options" : { "pause" : true }, "next" : "fullLoginSequenceUserStats" }, "fullLoginSequenceUserStats" : { "art" : "USRSTAT", "options" : { "pause" : true }, "next" : "mainMenu" }, "newUserActive" : { "art" : "SO-CC1.ANS", "options" : { "pause" : true }, "next" : "currentUserStats" }, "currentUserStats" : { "art" : "userstats", "options" : { "pause" : true } //"action" : "@menu:lastCallers" }, "mainMenu" : { "art" : "MMENU1", "desc" : "Main Menu", "prompt" : "menuCommand", "submit" : [ { "value" : { "command" : "G" }, "action" : "@menu:logoff" }, { "value" : { "command" : "D" }, "action" : "@menu:doorPimpWars" }, /* { "value" : { "command" : "L" }, "action" : "@menu:doorLORD" }, */ { "value" : { "command" : "L" }, "action" : "@menu:mainMenuLastCallers" }, { "value" : { "command" : "U" }, "action" : "@menu:mainMenuUserStats" }, { "value" : { "command" : "M" }, "action" : "@menu:messageArea" }, { "value" : 1, "action" : "@menu:mainMenu" } ] }, "mainMenuLastCallers" : { "module" : "last_callers", "art" : "LASTCALL", "options" : { "pause" : true }, "config" : { "dateTimeFormat" : "ddd MMM Do h:mm a" }, "next" : "mainMenu" }, "mainMenuUserStats" : { "art" : "USRSTAT", "options" : { "pause" : true }, "next" : "mainMenu" }, /////////////////////////////////////////////////////////////////////// // Message Area Related /////////////////////////////////////////////////////////////////////// "messageArea" : { "module" : "msg_area", "art" : "MSGAREA", "desc" : "Message Area", "prompt" : "menuCommand", "submit" : [ { "value" : { "command" : "N" }, "action" : "@menu:messageAreaNewPost"//, //"extraArgs" : { "messageAreaId" : 123 } }, { "value" : { "command" : "C" }, "action" : "@menu:messageAreaChangeCurrentArea" }, { "value" : { "command" : "L" }, "action" : "@menu:messageAreaMessageList" }, /*{ "value" : { "command" : "A" }, "action" : "@method:changeArea" }, */ { "value" : { "command" : "Q" }, "action" : "@menu:mainMenu" }, { "value" : 1, "action" : "@menu:messageArea" } ] }, "messageAreaChangeCurrentArea" : { "art" : "msg_area_list.ans", "module" : "msg_area_list", "fallback" : "messageArea", "form" : { "0" : { "VM" : { "mci" : { "VM1" : { "widht" : 30, "height" : 10, "focus" : true, "submit" : true, "argName" : "area" } }, "submit" : { "*" : [ { "value" : { "area" : null }, "action" : "@method:changeArea" } ] }, "actionKeys" : [ { "keys" : [ "escape" ], "action" : "@menu:messageArea" } ] } } } }, "messageAreaMessageList" : { "module" : "msg_list", "art" : "msg_list", "fallback" : "messageArea", "config" : { "listType" : "public" }, "form" : { "0" : { "VM" : { "mci" : { "VM1" : { "height" : 10, "focus" : true, "submit" : true, "argName" : "message" } }, "submit" : { "*": [ { "value" : { "message" : null }, "action" : "@method:selectMessage" } ] }, "actionKeys" : [ { "keys" : [ "escape" ], "action" : "@menu:messageArea" } ] } } } }, messageAreaViewPost: { module: msg_area_view_fse // :TODO: remove once default fallback is in place fallback: messageArea config: { art: { header: MSGVHDR // :TODO: fix these!! body: MSGBODY footerEdit: demo_fse_netmail_footer_edit.ans footerEditMenu: demo_fse_netmail_footer_edit_menu.ans footerView: MSGVFTR help: MSGVHLP }, editorMode: view editorType: area }, "form" : { "0" : { "mci" : { "TL1" : { "width" : 27 }, "TL2" : { "width" : 27 }, "TL3" : { //"width" : 39, //"width" : 27, //"textOverflow" : "..." }, "TL5" : { "width" : 27 }, "MA5" : { "width" : 27, "textOverflow" : "..." } } }, "1" : { "mci" : { "MT1" : { "width" : 79, "height" : 14, "mode" : "preview" } }, "submit" : { "*" : [ { "value" : "message", "action" : "@method:editModeEscPressed" } ] }, "actionKeys" : [ { "keys" : [ "escape" ], "viewId" : 1 } ] }, "2" : { "TLTL" : { "mci" : { "TL1" : { "width" : 5 }, "TL2" : { "width" : 4 } } } }, 4: { mci: { HM1: { // :TODO: (#)Jump/(L)Index (msg list)/Last items: [ // (P)revious Prev // (N)ext Next // (R)reply Reply // (Q)uit (ESC) Quit // (?)Help Help ] } }, "submit" : { "*" : [ { value: { 1: 0 } action: @method:prevMessage" } { value: { 1: 1 } action: @method:nextMessage } { value: { 1: 2 } action: @method:replyMessage extraArgs: { menu: messageAreaReplyPost } } { value: { 1: 3 } action: @menu:messageArea } { value: { 1: 4 } action: @method:viewModeMenuHelp } ] }, "actionKeys" : [ /* { "keys" : [ "escape" ], "action" : "@method:editModeEscPressed" // :TODO: fixme }, */ // :TODO: Need similar to viewId for actionKeys for specifis, e.g. viewId + index type stuff { keys: [ "p", "shift + p" ] action: @method:prevMessage } { keys: [ "n", "shift + n" ] action: @method:nextMessage } { keys: [ "r", "shift + r" ] action: @method:replyMessage extraArgs: { menu: messageAreaReplyPost } } { keys: [ "escape", "q", "shift + q" ] action: @menu:messageArea } { keys: [ "?" ] action: @method:viewModeMenuHelp } { "keys" : [ "down arrow", "up arrow", "page up", "page down" ], "action" : "@method:movementKeyPressed" } ] } } }, messageAreaReplyPost: { module: msg_area_post_fse config: { art: { header: MSGEHDR body: MSGBODY quote: MSGQUOT footerEditor: MSGEFTR footerEditorMenu: MSGEMFT help: MSGEHLP } editorMode: edit editorType: area } form: { 0: { mci: { // :TODO: use appropriate system properties for these lenghts TL1: { width: 27 argName: from } ET2: { width: 27 argName: to focus: true } ET3: { width: 27 argName: subject maxLength: 72 submit: true textOverflow: ... } TL4: { // :TODO: this is for RE: line (NYI) width: 27 textOverflow: ... } MA5: { width: 27 textOverflow: ... } } submit: { 3: [ { "value" : { "subject" : null }, "action" : "@method:headerSubmit" } ] } } 1: { mci: { MT1: { width: 79 height: 14 argName: message mode: edit } } submit: { *: [ { "value": "message", "action": "@method:editModeEscPressed" } ] } actionKeys: [ { keys: [ "escape" ], viewId: 1 } ] } 3: { HM: { mci: { HM1: { items: [ "Save", "Discard", "Quote", "Help" ] } } submit: { *: [ { value: { 1: 0 } action: @method:editModeMenuSave } { value: { 1: 1 } action: @method:replyDiscard } { value: { 1: 2 }, action: @method:editModeMenuQuote } { value: { 1: 3 } action: @method:editModeMenuHelp } ] } actionKeys: [ { keys: [ "escape" ] action: @method:editModeEscPressed } { keys: [ "s", "shift + s" ] action: @method:editModeMenuSave } { keys: [ "d", "shift + d" ] action: @method:replyDiscard } { keys: [ "q", "shift + q" ] action: @method:editModeMenuQuote } { keys: [ "?" ] action: @method:editModeMenuHelp } ] } } // Quote builder 5: { mci: { MT1: { width: 79 height: 7 } VM3: { width: 79 height: 4 argName: quote } } submit: { *: [ { value: { quote: null } action: @method:appendQuoteEntry } ] } actionKeys: [ { keys: [ "escape" ] action: @method:quoteBuilderEscPressed } ] } } } // :TODO: messageAreaSelect (change msg areas -> call @systemMethod -> fallback to menu "messageAreaNewPost" : { "status" : "Posting message", "module" : "msg_area_post_fse", "fallback" : "messageArea", // :TODO: remove once default fallback is in place config: { art: { header: MSGEHDR body: MSGBODY footerEditor: MSGEFTR footerEditorMenu: MSGEMFT help: MSGEHLP }, editorMode: edit editorType: area }, "form" : { "0" : { mci: { TL1: { width: 27 argName: from } ET2: { width: 27 argName: to focus: true } "ET3" : { "width" : 27, "argName" : "subject", "maxLength" : 72, "submit" : true }, "MA5" : { "width" : 27, "textOverflow" : "..." } }, "submit" : { "3" : [ { "value" : { "subject" : null }, "action" : "@method:headerSubmit" } ] } }, "1" : { "mci" : { MT1: { width: 79 height: 14 argName: message mode: edit } } submit: { *: [ { "value": "message", "action": "@method:editModeEscPressed" } ] }, "actionKeys" : [ { "keys" : [ "escape" ], "viewId" : 1 } ] }, "2" : { "TLTL" : { "mci" : { "TL1" : { "width" : 5 }, "TL2" : { "width" : 4 } } } }, "3" : { "HM" : { "mci" : { "HM1" : { // :TODO: Continue, Save, Discard, Clear, Quote, Help "items" : [ "Save", "Discard", "Quote", "Help" ] } }, "submit" : { "*" : [ { "value" : { "1" : 0 }, "action" : "@method:editModeMenuSave" }, { "value" : { "1" : 1 }, "action" : "@menu:messageArea" }, { value: { 1: 2 }, action: @method:editModeQuote }, { "value" : { "1" : 3 }, "action" : "@method:editModeMenuHelp" } ] }, "actionKeys" : [ // :TODO: Need better name { "keys" : [ "escape" ], "action" : "@method:editModeEscPressed" } ] // :TODO: something like the following for overriding keymap // this should only override specified entries. others will default /* "keyMap" : { "accept" : [ "return" ] } */ } } } }, /////////////////////////////////////////////////////////////////////// // Doors /////////////////////////////////////////////////////////////////////// "doorPimpWars" : { "module" : "abracadabra", "fallback" : "mainMenu", "config" : { "name" : "PimpWars", "dropFileType" : "DORINFO", "cmd" : "/usr/bin/dosemu", "args" : [ "-quiet", "-f", "/home/nuskooler/DOS/X/LORD/dosemu.conf", "X:\\PW\\START.BAT {dropfile} {node}" ], "nodeMax" : 1, "tooManyArt" : "doortoomany.ans" } }, "doorLORD" : { "module" : "abracadabra", "fallback" : "mainMenu", "config" : { "name" : "LORD", "dropFileType" : "DOOR", "cmd" : "/usr/bin/dosemu", "args" : [ "-quiet", "-f", "/home/nuskooler/DOS/X/LORD/dosemu.conf", "X:\\LORD\\START.BAT {node}" ] } }, //////////////////////////////////////////////////////////////////////// // Mods //////////////////////////////////////////////////////////////////////// idleLogoff: { art: IDLELOG next: @systemMethod:logoff }, //////////////////////////////////////////////////////////////////////// // Mods //////////////////////////////////////////////////////////////////////// "lastCallers" :{ "module" : "last_callers", "art" : "LASTCALL.ANS", "options" : { "pause" : true }, "config" : { "dateTimeFormat" : "ddd MMM Do H:mm a" }, "form" : { "0" : { "TLTLTLTL" : { "mci" : { // :TODO: Bug: Without any keys here, theme customization does not apply!!!! "TL1" : { "styleSGR1" : "|00|24" }, "TL2" : { "styleSGR1" : "|00|24" }, "TL3" : { "styleSGR1" : "|00|24" }, "TL4" : { "styleSGR1" : "|00|24" } } } } } }, //////////////////////////////////////////////////////////////////////// // Demo Section //////////////////////////////////////////////////////////////////////// "demoMain" : { "art" : "demo_selection_vm.ans", "form" : { "0" : { "VM" : { "mci" : { "VM1" : { "items" : [ "Single Line Text Editing Views", "Spinner & Toggle Views", "Mask Edit Views", "Multi Line Text Editor", "Vertical Menu Views", "Horizontal Menu Views", "Art Display", "Full Screen Editor" ], "height" : 10, "itemSpacing" : 1, "justify" : "center", "focusTextStyle" : "small i" } }, "submit" : { "*" : [ { "value" : { "1" : 0 }, "action" : "@menu:demoEditTextView" }, { "value" : { "1" : 1 }, "action" : "@menu:demoSpinAndToggleView" }, { "value" : { "1" : 2 }, "action" : "@menu:demoMaskEditView" }, { "value" : { "1" : 3 }, "action" : "@menu:demoMultiLineEditTextView" }, { "value" : { "1" : 4 }, "action" : "@menu:demoVerticalMenuView" }, { "value" : { "1" : 5 }, "action" : "@menu:demoHorizontalMenuView" }, { "value" : { "1" : 6 }, "action" : "@menu:demoArtDisplay" }, { "value" : { "1" : 7 }, "action" : "@menu:demoFullScreenEditor" } ] } } } } }, "demoEditTextView" : { "art" : "demo_edit_text_view1.ans", "form" : { "0" : { "BTETETETET" : { "mci" : { "ET1" : { "width" : 20, "maxLength" : 20 }, "ET2" : { "width" : 20, "maxLength" : 40, "textOverflow" : "..." }, "ET3" : { "width" : 20, "fillChar" : "-", "styleSGR1" : "|00|36", "maxLength" : 20 }, "ET4" : { "width" : 20, "maxLength" : 20, "password" : true }, "BT5" : { "width" : 8, "text" : "< Back" } }, "submit" : { "*" : [ { "value" : 5, "action" : "@menu:demoMain" } ] }, "actionKeys" : [ { "keys" : [ "escape" ], "viewId" : 5 } ] } } } }, "demoSpinAndToggleView" : { "art" : "demo_spin_and_toggle.ans", "form" : { "0" : { "BTSMSMTM" : { "mci" : { "SM1" : { "items" : [ "Henry Morgan", "François l'Ollonais", "Roche Braziliano", "Black Bart", "Blackbeard" ] }, "SM2" : { "items" : [ "Razor 1911", "DrinkOrDie", "TRSI" ] }, "TM3" : { "items" : [ "Yarly", "Nowaii" ], "styleSGR1" : "|00|30|01", "hotKeys" : { "Y" : 0, "N" : 1 } }, "BT8" : { "text" : "< Back" } }, "submit" : { "*" : [ { "value" : 8, "action" : "@menu:demoMain" } ] }, "actionKeys" : [ { "keys" : [ "escape" ], "viewId" : 8 } ] } } } }, "demoMaskEditView" : { "art" : "demo_mask_edit_text_view1.ans", "form" : { "0" : { "BTMEME" : { "mci" : { "ME1" : { "maskPattern" : "##/##/##", "styleSGR1" : "|00|30|01", //"styleSGR2" : "|00|45|01", "styleSGR3" : "|00|30|35", "fillChar" : "#" }, "BT5" : { "text" : "< Back" } }, "submit" : { "*" : [ { "value" : 5, "action" : "@menu:demoMain" } ] }, "actionKeys" : [ { "keys" : [ "escape" ], "viewId" : 5 } ] } } } }, "demoMultiLineEditTextView" : { "art" : "demo_multi_line_edit_text_view1.ans", "form" : { "0" : { "BTMT" : { "mci" : { "MT1" : { "width" : 70, "height" : 17, //"text" : "@art:demo_multi_line_edit_text_view_text.txt", // "text" : "@systemMethod:textFromFile" text: "Hints:\n\t* Insert / CTRL-V toggles overtype mode\n\t* CTRL-Y deletes the current line\n\t* Try Page Up / Page Down\n\t* Home goes to the start of line text\n\t* End goes to the end of a line\n\n\nTab handling:\n-------------------------------------------------\n\tA\tB\tC\tD\tE\tF\nA\tB\tC\tD\tE\tF\tG\tH\n\tA\tB\tC\tD\tE\tF\nA\tB\tC\tD\tE\tF\tG\tH\nA0\tBB\t1\tCCC\t2\tDDD\t3EEEE\nW\t\tX\t\tY\t\tZ\n\nAn excerpt from A Clockwork Orange:\n\"What sloochatted then, of course, was that my cellmates woke up and started joining in, tolchocking a bit wild in the near-dark, and the shoom seemed to wake up the whole tier, so that you could slooshy a lot of creeching and banging about with tin mugs on the wall, as though all the plennies in all the cells thought a big break was about to commence, O my brothers.\n", "focus" : true }, "BT5" : { "text" : "< Back" } }, "submit" : { "*" : [ { "value" : 5, "action" : "@menu:demoMain" } ] }, "actionKeys" : [ { "keys" : [ "escape" ], "viewId" : 5 } ] } } } }, "demoHorizontalMenuView" : { "art" : "demo_horizontal_menu_view1.ans", "form" : { "0" : { "BTHMHM" : { "mci" : { "HM1" : { "items" : [ "One", "Two", "Three" ], "hotKeys" : { "1" : 0, "2" : 1, "3" : 2 } }, "HM2" : { "items" : [ "Uno", "Dos", "Tres" ], "hotKeys" : { "U" : 0, "D" : 1, "T" : 2 } }, "BT5" : { "text" : "< Back" } }, "submit" : { "*" : [ { "value" : 5, "action" : "@menu:demoMain" } ] }, "actionKeys" : [ { "keys" : [ "escape" ], "viewId" : 5 } ] } } } }, "demoVerticalMenuView" : { "art" : "demo_vertical_menu_view1.ans", "form" : { "0" : { "BTVM" : { "mci" : { "VM1" : { "items" : [ "|33Oblivion/2", "|33iNiQUiTY", "|33ViSiON/X" ], "focusItems" : [ "|33Oblivion|01/|00|332", "|01|33i|00|33N|01i|00|33QU|01i|00|33TY", "|33ViSiON/X" ] // // :TODO: how to do the following: // 1) Supply a view a string for a standard vs focused item // "items" : [...], "focusItems" : [ ... ] ? // "draw" : "@method:drawItemX", then items: [...] }, "BT5" : { "text" : "< Back" } }, "submit" : { "*" : [ { "value" : 5, "action" : "@menu:demoMain" } ] }, "actionKeys" : [ { "keys" : [ "escape" ], "viewId" : 5 } ] } } } }, "demoArtDisplay" : { "art" : "demo_selection_vm.ans", "form" : { "0" : { "VM" : { "mci" : { "VM1" : { "items" : [ "Defaults - DOS ANSI", "bw_mindgames.ans - DOS", "test.ans - DOS", "Defaults - Amiga", "Pause at Term Height" ], // :TODO: justify not working?? "focusTextStyle" : "small i" } }, "submit" : { "*" : [ { "value" : { "1" : 0 }, "action" : "@menu:demoDefaultsDosAnsi" }, { "value" : { "1" : 1 }, "action" : "@menu:demoDefaultsDosAnsi_bw_mindgames" }, { "value" : { "1" : 2 }, "action" : "@menu:demoDefaultsDosAnsi_test" } ] } } } } }, "demoDefaultsDosAnsi" : { "art" : "DM-ENIG2.ANS" }, "demoDefaultsDosAnsi_bw_mindgames" : { "art" : "bw_mindgames.ans" }, "demoDefaultsDosAnsi_test" : { "art" : "test.ans" }, "demoFullScreenEditor" : { "module" : "@systemModule:fse", "config" : { "editorType" : "netMail", "art" : { "header" : "demo_fse_netmail_header.ans", "body" : "demo_fse_netmail_body.ans", "footerEditor" : "demo_fse_netmail_footer_edit.ans", "footerEditorMenu" : "demo_fse_netmail_footer_edit_menu.ans", "footerView" : "demo_fse_netmail_footer_view.ans", "help" : "demo_fse_netmail_help.ans" } }, "form" : { "0" : { "ETETET" : { "mci" : { "ET1" : { // :TODO: from/to may be set by args // :TODO: focus may change dep on view vs edit "width" : 36, "focus" : true, "argName" : "to" }, "ET2" : { "width" : 36, "argName" : "from" }, "ET3" : { "width" : 65, "maxLength" : 72, "submit" : [ "enter" ], "argName" : "subject" } }, "submit" : { "3" : [ { "value" : { "subject" : null }, "action" : "@method:headerSubmit" } ] } } }, "1" : { "MT" : { "mci" : { "MT1" : { "width" : 79, "height" : 17, "text" : "", // :TODO: should not be req. "argName" : "message" } }, "submit" : { "*" : [ { "value" : "message", "action" : "@method:editModeEscPressed" } ] }, "actionKeys" : [ { "keys" : [ "escape" ], "viewId" : 1 } ] } }, "2" : { "TLTL" : { "mci" : { "TL1" : { "width" : 5 }, "TL2" : { "width" : 4 } } } }, "3" : { "HM" : { "mci" : { "HM1" : { // :TODO: Continue, Save, Discard, Clear, Quote, Help "items" : [ "Save", "Discard", "Quote", "Help" ] } }, "submit" : { "*" : [ { "value" : { "1" : 0 }, "action" : "@method:editModeMenuSave" }, { "value" : { "1" : 1 }, "action" : "@menu:demoMain" }, { "value" : { "1" : 2 }, "action" : "@method:editModeMenuQuote" }, { "value" : { "1" : 3 }, "action" : "@method:editModeMenuHelp" }, { "value" : 1, "action" : "@method:editModeEscPressed" } ] }, "actionKeys" : [ // :TODO: Need better name { "keys" : [ "escape" ], "action" : "@method:editModeEscPressed" } ] // :TODO: something like the following for overriding keymap // this should only override specified entries. others will default /* "keyMap" : { "accept" : [ "return" ] } */ } } } /* "form" : { "0" : { "ET1ET2MT3" : { "mci" : { "ET1" : { "width" : 20, "placeholder" : "TODO support this", "focus" : true }, "ET2" : { "width" : 20 }, "MT3" : { "width" : 79, "height" : 17, "text" : "", "submit" : [ "escape" ] } }, "submit" : { // :TODO: It may be nice to have a way to submit without data - e.g. we just care about the key press. "3" : [ { "value" : 3, "action" : "@method:editorEscPressed" } ] } } } } */ } /* :TODO: conceptual simplified menus -- actions/etc. without forms { "myMenu" : { "art" : "MENUART", "mci" : { // lack of "form": direct to form:0 {} "VM1" : { "items" : [ "Hello", "Goodbye" ], "action" : "@method:someMethod" // implies { "submit" : true } }, "submit" : { // alternate form with filters } } } } */ /* "demoEditTextView" : { "art" : "demo_edit_text_view.ans", "form" : { "0" : { "ET1ET2ET3ET5SM4TM6" : { "mci" : { "ET1" : { "maxLength" : 1 }, "ET2" : { "maxLength" : 1 }, "ET3" : { "maxLength" : 1 }, "SM4" : { "items" : [ "One", "Two", "Three", "Four" ] }, "ET5" : { "password" : true, "submit" : [ "escape" ], "fillChar" : "#" }, "TM6" : { "items" : [ "Yes", "No" ], "hotkeys" : { "Y" : 0, "n" : 1 } } } } } } } */ } }