Skip to content

Menu API: multi-level submenus (submenus of submenus of ...)

Bitbucket Importer requested to merge bitbucket/merged-pr-368 into branch/unified

Created originally on Bitbucket by dmilligan (David Milligan)

Was already merged in Bitbucket before import, marked as merged by the import user

This is mainly for adv_int to clear up the menu issues (so it doesn't need it's own top level menu), but it may be useful for other modules or core functions. This needs more work b/c I'm not all that familiar with menu.c. Basically I'm posting this to get advice and feedback, there's a lot more that needs to be done.

Here's my basic test code:

#!C

#include <module.h>
#include <dryos.h>
#include <menu.h>

int test_val1 = 0;
int test_val2 = 0;
int test_val3 = 0;
int test_val4 = 0;
int test_val5 = 0;

struct menu_entry test_menu[] =
{
    {
        .name = "Menu Test",
        .select = menu_open_submenu,
        .children =  (struct menu_entry[])
        {
            {
                .name = "Test 1",
                .select = menu_open_submenu,
                .children =  (struct menu_entry[])
                {
                    {
                        .name = "Test 1.1",
                        .priv = &test_val1,
                        .max = 1,
                        .icon_type = IT_BOOL
                    },
                    {
                        .name = "Test 1.2",
                        .priv = &test_val2,
                        .max = 4,
                        .icon_type = IT_PERCENT
                    },
                    {
                        .name = "Test 1.3",
                        .select = menu_open_submenu,
                        .children =  (struct menu_entry[])
                        {
                            {
                                .name = "Test 1.3.1",
                                .priv = &test_val3,
                                .max = 1,
                                .icon_type = IT_BOOL
                            },
                            {
                                .name = "Test 1.3.2",
                                .priv = &test_val4,
                                .max = 4
                            },
                            {
                                .name = "Test 1.3.3",
                                .priv = &test_val5,
                                .max = 4,
                            },
                            MENU_EOL
                        }
                    },
                    MENU_EOL
                }
            },
            {
                .name = "Test 2",
                .select = menu_open_submenu,
                .children =  (struct menu_entry[])
                {
                    {
                        .name = "Test 2.1"
                    },
                    {
                        .name = "Test 2.2"
                    },
                    {
                        .name = "Test 2.3"
                    },
                    MENU_EOL
                }
            },
            {
                .name = "Test 3"
            },
            MENU_EOL
        }
    }
};

unsigned int test_init()
{
    menu_add("Debug", test_menu, COUNT(test_menu));

    return 0;
}

unsigned int test_deinit()
{
    return 0;
}

MODULE_INFO_START()
    MODULE_INIT(test_init)
    MODULE_DEINIT(test_deinit)
MODULE_INFO_END()

Merge request reports