plugin_menu

#!html
<h1 style="text-align: left; color: red">
This Plugin is not part of the current lcd4linux. This wiki entry was created for discussion about a plugin prototype.
<br><br>
</h1>

Plugin Menu

\

\

Plugin Menu, ctrl_serial (2 LED, 4 Buttons), Futaba VFD \
\

1. Description

The plugin Menu allows to configure and use menus.

This Plugin uses plugin Layout to switch Layouts. Therefore plugin Layout has to be configured and activated too.\

Due to this and the similar use of actions it's highly recommended to read the wiki entry of plugin Layout first.

While simple menus can be create with plugin Layout by using the change of button functions depending on the current layout, with plugin Menu menus are builded by using item selection and button functions that are depending on the current active item. So more choises can be made on a small display or with very few buttons. Its also a more natural way to build menus if controls with arrow buttons (e.g. widget Keypad) are used.

A part of a menu configured in the attached sample config file looks like this:

┌────────────────────────────────────────┐
│1.1/1.2     Main Menu 1/2               │
│ [[:SET|VALUE]] >CPU< [[:RAM]] [[:DISK]] [[:ETH]] >>│
└────────────────────────────────────────┘

In this example CPU is setected, inactive items are marked with ... to distinguish between selectable items and normal text like the title (Main Menu…).

The plugin Menu does NOT draw any item or menu itself. It only stores the current menu and item internally and provides functions to switch the current menu or item and functions to detect if a menu/item is active. Latter functions are used by visible widgets (usually the Text widget) to make the menu state visible (e.g. marks or blink). The functionality of the menus is specified by setting actions for each item. By this its very adjustable how a menu look and acts but that is paid with a more complex configuration.

\

\

2. Configuration

===== 2.1. Structure

The structure in the config-file looks like this:

    Plugin Menu {

        active 1

        blink 150
        initmenu 'M_Menu'

        confirm layout::confirm()
        cancel  layout::cancel()
        left    layout::left()
        right   layout::right()

        Menu1 {
            name 'M_Menu'
            
            layoutgroup 'G_Menu'

       	    confirm menu::none(); layout::layout('G_Diff','L_Dummy')
            cancel  ' '
            left    menu::prev(0)
            right   menu::next(0)

            Item1 {
                name    'I_Menu_SET'
                layout  'L_Menu_1'
       	        confirm menu::menu('M_SET')
            }

            Item2 {
                name    'I_Menu_CPU'
                confirm menu::none(); layout::layout('G_Diff','L_CPU')
            }

            ...
        }
        
        Menu2 {
            ...
        }
    }
    ...

    Widget W_Menu_CPU {
        class 'text'
        update t_item
        width 5  
        expression menu::if('M_Menu','I_Menu_CPU','>CPU<','[[:CPU]]')                      
    }
    ...

“active 1” activates the plugin. If it has not been activated all of its functions will return -1.

The plugin must contain at least 1 menu - each menu at least 1 item. Menus and items have to be numbered serially starting with 1.

In the example a text widget linked to item I_Menu_CPU of menu M_Menu is shown. If this item is active, the widget will be drawn as >CPU<, else CPU Of course menu::if() could be used in the prefix and postfix expressions of the text widget too.

Widgets which are linked to a menu item that way have to poll the current menu state periodically. Using a variable to set the update parameter of the widget to a decisecond might be a good idea.

For each menu a layout group has to be set. For each menu the layout of the first item has to be set explicitly. For all other items it's assumed that it has the same layout as its previous item if no layout was set. Of course this layout should contain the widget which represents the item visually.

If the current menu/item is switched the plugin will switch to the layout which was set for this item automatically.

===== 2.2. Section Plugin Menu

Parameters:

activeSet to 1 to activate plugin, otherwise the plugin won't work and all of its functions return -1.
initmenu*Name of the menu that should be active initially (first item). (If not set: No menu/item is active at the start.)
blinkblink*Duration in milliseconds between a state change in function menu::blink(…); default: 200
<actions>*see Actions
* optional

Subsections

Menussee Subsection Menu

===== menu2.3. Subsection Menu

Parameters:

name*Unique name of the menu. Default: 'Menu1' for Menu1, …
layoutgroupLayout group of the menu.
<actions>*see Actions
* optional

Subsections

Itemssee Subsection Item

===== item2.4. Subsection Item

Parameters:

nameName of the item. Default: 'Item1' for Item1, …
  • plugin_menu.txt
  • Last modified: 2020/07/17 18:33
  • (external edit)