/*************************************************************************** * __________ __ ___. * Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * $Id$ * * Copyright (C) 2002 Robert E. Hak * * All files in this archive are subject to the GNU General Public License. * See the file COPYING in the source tree root for full license agreement. * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * KIND, either express or implied. * ****************************************************************************/ #ifndef __MENU_H__ #define __MENU_H__ #include #include "icon.h" #include "icons.h" enum menu_item_type { MT_MENU = 0, MT_SETTING, MT_SETTING_W_TEXT, /* same as setting, but uses different text for the setting title, ID2P() or "literal" for the str param */ MT_FUNCTION_CALL, /* used when the standard code wont work */ MT_FUNCTION_WITH_PARAM, MT_RETURN_ID, /* returns the position of the selected item (starting at 0)*/ MT_RETURN_VALUE, /* returns a value associated with an item */ MT_OLD_MENU, /* used so we can wrap the old menu api around the new api. Noone else should use this */ }; typedef int (*menu_function)(void); struct menu_func_with_param { int (*function)(void* param); void *param; }; #define MENU_TYPE_MASK 0xF /* MT_* type */ /* these next two are mutually exclusive */ #define MENU_HAS_DESC 0x10 #define MENU_DYNAMIC_DESC 0x20 /* unless we need more flags*/ #define MENU_COUNT_MASK (~(MENU_TYPE_MASK|MENU_HAS_DESC|MENU_DYNAMIC_DESC)) #define MENU_COUNT_SHIFT 6 struct menu_item_ex { int flags; /* above defines */ union { const struct menu_item_ex **submenus; /* used with MT_MENU */ void *variable; /* used with MT_SETTING, must be in the settings_list.c list */ int (*function)(void); /* used with MT_FUNCTION_CALL */ const struct menu_func_with_param *func_with_param; /* MT_FUNCTION_WITH_PARAM */ const char **strings; /* used with MT_RETURN_ID */ int value; /* MT_RETURN_VALUE */ }; union { /* For settings */ int (*menu_callback)(int action, const struct menu_item_ex *this_item); /* For everything else, except if the text is dynamic */ const struct menu_callback_with_desc { int (*menu_callback)(int action, const struct menu_item_ex *this_item); unsigned char *desc; /* string or ID */ int icon_id; /* from icons_6x8 in icons.h */ } *callback_and_desc; /* For when the item text is dynamic */ const struct menu_get_name_and_icon { int (*menu_callback)(int action, const struct menu_item_ex *this_item); char *(*list_get_name)(int selected_item, void * data, char *buffer); void *list_get_name_data; int icon_id; } *menu_get_name_and_icon; }; }; typedef int (*menu_callback_type)(int action, const struct menu_item_ex *this_item); int do_menu(const struct menu_item_ex *menu, int *start_selected); bool do_setting_from_menu(const struct menu_item_ex *temp); #define MENU_ITEM_COUNT(c) (c<