menus.anubis 5.52 KB

   
   
                             The Anubis/Paradize Project.
   
                                   Creating menus. 
   
                         Copyright (c) Alain Prouté 2004-2005. 

   
   Authors:   Alain Prouté

   
   
read widget.anubis   
read tools.anubis
   

   This file contains tools for creating menus  (to be put in the command variable of your
   menu manager, within an 'add_?' command).
   
   
public type MenuItem:
   // separator between groups of items
   separator, 
   
   // simple item with fixed text
   item      (String                       text, 
              WidgetEventToolBox ->
                List(WidgetRectangle)      action),

   // same as above but inhibited
   inhibited_item  (String                 text), 
   
   // simple item with variable text
   item      (One -> String                dynamic_text, 
              WidgetEventToolBox -> 
                List(WidgetRectangle)      action),
   
   // sub menu
   sub_menu  (String                       text, 
              List(MenuItem)               sub_items). 
   

public define MenuItem
   item
     (
       String                       text, 
       WidgetEventToolBox -> One    action
     ) =
   item(text,(WidgetEventToolBox etb) |-> (action(etb); [])). 
   
public define MenuItem
   item
     (
       One -> String                dtext, 
       WidgetEventToolBox -> One    action
     ) =
   item(dtext,(WidgetEventToolBox etb) |-> (action(etb); [])). 
   
   
   You can create a menu (with submenus) with: 
   
public define Widget
   create_menu
     (
       WidgetParameters   parms, 
       List(MenuItem)     items,
       Var(MenuCommand)   menu_command_v   // command variable of your menu manager
     ). 
   
   
   
   
   --- That's all for the public part ! --------------------------------------------------
   
   
   
read widgets3/box.anubis
read widgets3/table.anubis
read widgets3/button.anubis   
read widgets3/space.anubis   

   
   
define List(List(MenuItem))
   split_at_separators
     (
       List(MenuItem) items
     ) =
   if items is 
     {
       [ ] then [ ],
       [item1 . others] then 
         with rest = split_at_separators(others),
         if item1 is 
           {
             separator then [[ ] . rest], 
   
             item(_,_) then 
               if rest is 
                 {
                   [ ]        then [[item1]], 
                   [g1 . gs]  then [[item1 . g1] . gs],
                 },
   
             inhibited_item(_) then 
               if rest is 
                 {
                   [ ]        then [[item1]], 
                   [g1 . gs]  then [[item1 . g1] . gs],
                 },
   
             item(_,_) then 
               if rest is 
                 {
                   [ ]        then [[item1]], 
                   [g1 . gs]  then [[item1 . g1] . gs],
                 },
   
             sub_menu(_,_) then 
               if rest is 
                 {
                   [ ]        then [[item1]], 
                   [g1 . gs]  then [[item1 . g1] . gs],
                 }
           }
     }.
   
   
   
define (List(MenuItem) group) -> List(WidgetCell)   
   make_group
     (
       WidgetParameters parms, 
       Var(MenuCommand) menu_command_v
     ) =
   (List(MenuItem) group) |-> 
     [
       cell(create_box(relief(parms),2,
              create_table(nude,0,0,
                  map((MenuItem i) |-> if i is 
                        {
                          separator   then alert, 
   
                          item(t,a)   then [cell(create_button(150,20,
                                              phantom(parms),
                                              a,
                                              (One u) |-> left_text(parms,t),
                                              []))],
   
                          inhibited_item(t) then [cell(create_button(150,20,
                                              phantom(parms),
                                              (WidgetEventToolBox etb) |-> unique,
                                              (One u) |-> left_text(parms,t),
                                              (One u) |-> true, 
                                              []))],
   
                          item(dt,a)  then [cell(create_button(150,20,
                                              phantom(parms),
                                              a,
                                              (One u) |-> left_text(parms,dt(unique)),
                                              []))],
   
                          sub_menu(t,l) then [cell(create_button(150,20,
                                                   phantom(parms),
                                                   (WidgetEventToolBox etb) |->
                                                      menu_command_v <-
                                                        add_left_right(etb,
                                                                       create_menu(parms,l,menu_command_v),
                                                                       rect(0,0,150,20)),
                                                   (One u) |-> left_text(parms,t),
                                                   []))]
                        },
                      group)
                )))
     ].
   
   
public define Widget
   create_menu
     (
       WidgetParameters   parms, 
       List(MenuItem)     items,
       Var(MenuCommand)   menu_command_v
     ) =
   create_table(nude,0,0,
       map(make_group(parms,menu_command_v),split_at_separators(items))).