OpenModem/bertos/gui/menu.h

136 lines
5.3 KiB
C

/**
* \file
* <!--
* This file is part of BeRTOS.
*
* Bertos is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* As a special exception, you may use this file as part of a free software
* library without restriction. Specifically, if other files instantiate
* templates or use macros or inline functions from this file, or you compile
* this file and link it with other files to produce an executable, this
* file does not by itself cause the resulting executable to be covered by
* the GNU General Public License. This exception does not however
* invalidate any other reasons why the executable file might be covered by
* the GNU General Public License.
*
* Copyright 2003, 2004, 2006, 2010 Develer S.r.l. (http://www.develer.com/)
* Copyright 2000 Bernie Innocenti <bernie@codewiz.org>
* All Rights Reserved.
* -->
*
* \defgroup menu Menu handling module
* \ingroup gui
* \{
* \author Bernie Innocenti <bernie@codewiz.org>
* \author Stefano Fedrigo <aleph@develer.com>
*
* \brief Common menu handling API
*
* $WIZ$ module_name = "menu"
* $WIZ$ module_depends = "text", "gfx", "timer", "kbd"
*/
#ifndef GUI_MENU_H
#define GUI_MENU_H
#include <cfg/compiler.h>
#include <gfx/gfx.h>
/** Menu callback function */
typedef iptr_t (*MenuHook)(iptr_t userdata);
typedef void (*BlitBitmap)(const Bitmap *bm);
/**
* Menu item description.
*/
typedef struct MenuItem
{
const_iptr_t label; /**< Item label (ID or ptr to string, 0 to disable) */
int flags; /**< See MIF_#? definitions below */
MenuHook hook; /**< Callback function (NULL to terminate item list) */
iptr_t userdata; /**< User data to be passed back to the hook */
} MenuItem;
/** Render hook callback function prototype */
typedef void (*RenderHook)(struct Bitmap *bitmap, int ypos, bool selected, const struct MenuItem *item);
/**
* \name Flags for MenuItem.flags.
* \{
*/
#define MIF_EXCLUDE_MASK 0x00FF /**< Mask for mutual exclusion map (shared with priority). */
#define MIF_PRI_MASK 0x00FF /**< Mask for priority value (shared with mutual exclusion). */
#define MIF_PRI(x) ((x) & MIF_PRI_MASK) /**< Set menu item priority. */
#define MIF_EXCLUDE_0 BV(0) /**< Exclude item 0 when this item is checked */
#define MIF_EXCLUDE_1 BV(1) /**< Exclude item 1 when this item is checked */
#define MIF_EXCLUDE_2 BV(2) /**< Exclude item 2 when this item is checked */
#define MIF_EXCLUDE_3 BV(3) /**< Exclude item 3 when this item is checked */
#define MIF_EXCLUDE_4 BV(4) /**< Exclude item 4 when this item is checked */
#define MIF_EXCLUDE_5 BV(5) /**< Exclude item 5 when this item is checked */
#define MIF_EXCLUDE_6 BV(6) /**< Exclude item 6 when this item is checked */
#define MIF_EXCLUDE_7 BV(7) /**< Exclude item 7 when this item is checked */
#define MIF_CHECKED BV(8) /**< Item is currently checked */
#define MIF_CHECKIT BV(9) /**< Automatically check this item when selected */
#define MIF_TOGGLE BV(10) /**< Toggle MIF_CHECKED when item is selected */
#define MIF_HIDDEN BV(11) /**< This menu item is not visible */
#define MIF_DISABLED BV(12) /**< This menu item is not visible */
#define MIF_RAMLABEL BV(13) /**< Item label is stored in RAM, not in program memory */
#define MIF_RENDERHOOK BV(14) /**< Menu render function is passed in label field */
/* \} */
/**
* Menu description.
*/
typedef struct Menu
{
MenuItem *items; /**< Array of items (end with a NULL hook) */
const_iptr_t title; /**< Menu title (ID or ptr to string, 0 to disable) */
int flags; /**< See MF_#? definitions below */
struct Bitmap *bitmap; /**< Bitmap where the menu is rendered */
int selected; /**< Initial selection (written to if MF_SAVESEL is set). */
BlitBitmap lcd_blitBitmap; /**< Callback to call to do smooth the display */
} Menu;
/**
* \name Flags for Menu.flags.
* \{
*/
#define MF_STICKY BV(0) /**< Stay in the menu when the items called return */
#define MF_TOPLEVEL BV(1) /**< Top-level menu (do not display "back" label) */
#define MF_ROMITEMS BV(2) /**< Menu items are stored in ROM (default is RAM) */
#define MF_SAVESEL BV(3) /**< Remember the selected item across invocations. */
/* \} */
/**
* \name Special result codes for menu_handle().
* \{
*/
#define MENU_OK ((iptr_t)0)
#define MENU_CANCEL ((iptr_t)-1)
#define MENU_TIMEOUT ((iptr_t)-2)
#define MENU_ABORT ((iptr_t)-3)
#define MENU_DISABLED ((iptr_t)-4)
/* \} */
/* Function prototypes */
iptr_t menu_handle(const struct Menu *menu);
int menu_setFlags(struct Menu *menu, int idx, int flags);
int menu_clearFlags(struct Menu *menu, int idx, int flags);
/** \} */ //defgroup menu
#endif /* GUI_MENU_H */