User definable UI viewport, to be able to restrict the UI into a viewport for all...
[kugel-rb/myfork.git] / apps / gui / list.h
blob23997e8a6502851df13ac64897f5d5d2f20897b4
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2005 by Kevin Ferrare
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
22 #ifndef _GUI_LIST_H_
23 #define _GUI_LIST_H_
25 #include "config.h"
26 #include "icon.h"
27 #include "screen_access.h"
29 #define SCROLLBAR_WIDTH 6
31 enum list_wrap {
32 LIST_WRAP_ON = 0,
33 LIST_WRAP_OFF,
34 LIST_WRAP_UNLESS_HELD,
38 * The gui_list is based on callback functions, if you want the list
39 * to display something you have to provide it a function that
40 * tells it what to display.
41 * There are three callback function :
42 * one to get the text, one to get the icon and one to get the color
46 * Icon callback
47 * - selected_item : an integer that tells the number of the item to display
48 * - data : a void pointer to the data you gave to the list when you
49 * initialized it
50 * Returns a pointer to the icon, the value inside it is used to display the
51 * icon after the function returns.
52 * Note : we use the ICON type because the real type depends of the plateform
54 typedef enum themable_icons list_get_icon(int selected_item, void * data);
56 * Text callback
57 * - selected_item : an integer that tells the number of the item to display
58 * - data : a void pointer to the data you gave to the list when you
59 * initialized it
60 * - buffer : a buffer to put the resulting text on it
61 * (The content of the buffer may not be used by the list, we use
62 * the return value of the function in all cases to avoid filling
63 * a buffer when it's not necessary)
64 * - buffer_len : length of the buffer
65 * Returns a pointer to a string that contains the text to display
67 typedef char * list_get_name(int selected_item, void * data,
68 char * buffer, size_t buffer_len);
70 * Voice callback
71 * - selected_item : an integer that tells the number of the item to speak
72 * - data : a void pointer to the data you gave to the list when you
73 * initialized it
74 * Returns an integer, 0 means success, ignored really...
76 typedef int list_speak_item(int selected_item, void * data);
77 #ifdef HAVE_LCD_COLOR
79 * Color callback
80 * - selected_item : an integer that tells the number of the item to display
81 * - data : a void pointer to the data you gave to the list when you
82 * initialized it
83 * Returns an int with the lower 16 bits representing the color to display the
84 * selected item, negative value for default coloring.
86 typedef int list_get_color(int selected_item, void * data);
87 #endif
89 struct gui_synclist
91 /* defines wether the list should stop when reaching the top/bottom
92 * or should continue (by going to bottom/top) */
93 bool limit_scroll;
94 /* wether the text of the whole items of the list have to be
95 * scrolled or only for the selected item */
96 bool scroll_all;
98 int nb_items;
99 int selected_item;
100 int start_item[NB_SCREENS]; /* the item that is displayed at the top of the screen */
101 /* the number of lines that are selected at the same time */
102 int selected_size;
103 /* These are used to calculate how much of the screen content we need
104 to redraw. */
105 int last_displayed_selected_item;
106 int last_displayed_start_item[NB_SCREENS];
107 #ifdef HAVE_LCD_BITMAP
108 int offset_position[NB_SCREENS]; /* the list's screen scroll placement in pixels */
109 #endif
110 /* Cache the width of the title string in pixels/characters */
111 int title_width;
112 long scheduled_talk_tick, last_talked_tick;
114 list_get_icon *callback_get_item_icon;
115 list_get_name *callback_get_item_name;
116 list_speak_item *callback_speak_item;
118 /* The data that will be passed to the callback function YOU implement */
119 void * data;
120 /* The optional title, set to NULL for none */
121 char * title;
122 /* Optional title icon */
123 enum themable_icons title_icon;
124 bool show_selection_marker; /* set to true by default */
126 #ifdef HAVE_LCD_COLOR
127 int title_color;
128 list_get_color *callback_get_item_color;
129 #endif
130 struct viewport *parent[NB_SCREENS];
134 #ifdef HAVE_LCD_BITMAP
135 /* parse global setting to static int */
136 extern void gui_list_screen_scroll_step(int ofs);
138 /* parse global setting to static bool */
139 extern void gui_list_screen_scroll_out_of_view(bool enable);
140 #endif /* HAVE_LCD_BITMAP */
142 extern void gui_synclist_init(
143 struct gui_synclist * lists,
144 list_get_name callback_get_item_name,
145 void * data,
146 bool scroll_all,
147 int selected_size,
148 struct viewport parent[NB_SCREENS] /* NOTE: new screens should NOT set this to NULL */
150 extern void gui_synclist_set_nb_items(struct gui_synclist * lists, int nb_items);
151 extern void gui_synclist_set_icon_callback(struct gui_synclist * lists, list_get_icon icon_callback);
152 extern void gui_synclist_set_voice_callback(struct gui_synclist * lists, list_speak_item voice_callback);
153 #ifdef HAVE_LCD_COLOR
154 extern void gui_synclist_set_color_callback(struct gui_synclist * lists, list_get_color color_callback);
155 #endif
156 extern void gui_synclist_speak_item(struct gui_synclist * lists);
157 extern int gui_synclist_get_nb_items(struct gui_synclist * lists);
159 extern int gui_synclist_get_sel_pos(struct gui_synclist * lists);
161 extern void gui_synclist_draw(struct gui_synclist * lists);
162 extern void gui_synclist_select_item(struct gui_synclist * lists,
163 int item_number);
164 extern void gui_synclist_add_item(struct gui_synclist * lists);
165 extern void gui_synclist_del_item(struct gui_synclist * lists);
166 extern void gui_synclist_limit_scroll(struct gui_synclist * lists, bool scroll);
167 extern void gui_synclist_flash(struct gui_synclist * lists);
168 extern void gui_synclist_set_title(struct gui_synclist * lists, char * title,
169 enum themable_icons icon);
170 extern void gui_synclist_hide_selection_marker(struct gui_synclist *lists,
171 bool hide);
172 extern bool gui_synclist_item_is_onscreen(struct gui_synclist *lists,
173 enum screen_type screen, int item);
175 * Do the action implied by the given button,
176 * returns true if the action was handled.
177 * NOTE: *action may be changed regardless of return value
179 extern bool gui_synclist_do_button(struct gui_synclist * lists,
180 int *action,
181 enum list_wrap);
183 #if defined(HAVE_TOUCHSCREEN)
184 /* this needs to be fixed if we ever get more than 1 touchscreen on a target */
185 unsigned gui_synclist_do_touchscreen(struct gui_synclist * gui_list);
186 #endif
188 /* If the list has a pending postponed scheduled announcement, that
189 may become due before the next get_action tmieout. This function
190 adjusts the get_action timeout appropriately. */
191 extern int list_do_action_timeout(struct gui_synclist *lists, int timeout);
192 /* This one combines a get_action call (with timeout overridden by
193 list_do_action_timeout) with the gui_synclist_do_button call, for
194 convenience. */
195 extern bool list_do_action(int context, int timeout,
196 struct gui_synclist *lists, int *action,
197 enum list_wrap wrap);
200 /** Simplelist implementation.
201 USe this if you dont need to reimplement the list code,
202 and just need to show a list
205 struct simplelist_info {
206 char *title; /* title to show on the list */
207 int count; /* number of items in the list, each item is selection_size high */
208 char selection_size; /* list selection size, usually 1 */
209 bool hide_selection;
210 bool scroll_all;
211 int timeout;
212 int selection; /* the item to select when the list is first displayed */
213 /* when the list is exited, this will be set to the
214 index of the last item selected, or -1 if the list
215 was exited with ACTION_STD_CANCEL */
216 int (*action_callback)(int action, struct gui_synclist *lists); /* can be NULL */
217 /* action_callback notes:
218 action == the action pressed by the user
219 _after_ gui_synclist_do_button returns.
220 lists == the lists sturct so the callack can get selection and count etc. */
221 list_get_icon *get_icon; /* can be NULL */
222 list_get_name *get_name; /* NULL if you're using simplelist_addline() */
223 list_speak_item *get_talk; /* can be NULL to not speak */
224 void *callback_data; /* data for callbacks */
227 #define SIMPLELIST_MAX_LINES 32
228 #define SIMPLELIST_MAX_LINELENGTH 32
230 /** The next three functions are used if the text is mostly static.
231 These should be called in the action callback for the list.
233 /* set the amount of lines shown in the list
234 Only needed if simplelist_info.get_name == NULL */
235 void simplelist_set_line_count(int lines);
236 /* get the current amount of lines shown */
237 int simplelist_get_line_count(void);
238 /* add/edit a line in the list.
239 if line_number > number of lines shown it adds the line, else it edits the line */
240 #define SIMPLELIST_ADD_LINE (SIMPLELIST_MAX_LINES+1)
241 void simplelist_addline(int line_number, const char *fmt, ...);
243 /* setup the info struct. members not setup in this function need to be assigned manually
244 members set in this function:
245 info.selection_size = 1;
246 info.hide_selection = false;
247 info.scroll_all = false;
248 info.action_callback = NULL;
249 info.get_icon = NULL;
250 info.get_name = NULL;
251 info.get_voice = NULL;
252 info.timeout = HZ/10;
253 info.selection = 0;
255 void simplelist_info_init(struct simplelist_info *info, char* title,
256 int count, void* data);
258 /* show a list.
259 if list->action_callback != NULL it is called with the action ACTION_REDRAW
260 before the list is dislplayed for the first time */
261 bool simplelist_show_list(struct simplelist_info *info);
263 #endif /* _GUI_LIST_H_ */