diff options
author | Jonathan Gordon <rockbox@jdgordon.info> | 2007-03-01 11:14:46 +0000 |
---|---|---|
committer | Jonathan Gordon <rockbox@jdgordon.info> | 2007-03-01 11:14:46 +0000 |
commit | 91cb68a1fb5b019aaebf77fae6506bb807059b65 (patch) | |
tree | ea3e56a915479ecad597cc0769ca24c2e2bcf686 /apps/root_menu.c | |
parent | d94c7d3f7679789cce916d213b39f3b54dc0216b (diff) |
Introducing the root menu!
Blind users: get a new voice file as there are lots of lang changes and new strings.
FS#6630 or RootMenu on the wiki for more info. complaints to /dev/null :)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12528 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/root_menu.c')
-rw-r--r-- | apps/root_menu.c | 361 |
1 files changed, 361 insertions, 0 deletions
diff --git a/apps/root_menu.c b/apps/root_menu.c new file mode 100644 index 0000000000..0f2153b03b --- /dev/null +++ b/apps/root_menu.c @@ -0,0 +1,361 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id: main.c 12101 2007-01-24 02:19:22Z jdgordon $ + * + * Copyright (C) 2007 Jonathan Gordon + * + * 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. + * + ****************************************************************************/ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <stdbool.h> +#include "config.h" +#include "menu.h" +#include "root_menu.h" +#include "lang.h" +#include "settings.h" +#include "kernel.h" +#include "debug.h" +#include "misc.h" +#include "rolo.h" +#include "backdrop.h" +#include "talk.h" +#include "audio.h" + +/* gui api */ +#include "list.h" +#include "statusbar.h" +#include "splash.h" +#include "buttonbar.h" +#include "textarea.h" +#include "action.h" +#include "yesno.h" + +#include "main_menu.h" +#include "tree.h" +#include "radio.h" +#ifdef HAVE_RECORDING +#include "recording.h" +#endif +#include "gwps-common.h" +#include "bookmark.h" +#include "tagtree.h" +#include "menus/exported_menus.h" + +struct root_items { + int (*function)(void* param); + void* param; +}; +static int last_screen = GO_TO_ROOT; /* unfortunatly needed so we can resume + or goto current track based on previous + screen */ +static int browser(void* param) +{ + int ret_val; + struct tree_context* tc = tree_get_context(); + int filter = SHOW_SUPPORTED; + char folder[MAX_PATH] = "/"; + /* stuff needed to remember position in file browser */ + static char last_folder[MAX_PATH] = "/"; + /* and stuff for the database browser */ + static int last_db_dirlevel = 0; + + switch ((int)param) + { + case GO_TO_FILEBROWSER: + filter = global_settings.dirfilter; + if (global_settings.browse_current && + last_screen == GO_TO_WPS && audio_status() && + wps_state.current_track_path[0] != '\0') + { + snprintf(folder, MAX_PATH, "%s", wps_state.current_track_path); + } + else + snprintf(folder, MAX_PATH, "%s/", last_folder); + break; + case GO_TO_DBBROWSER: + if (!tagcache_is_usable()) + { + gui_syncsplash(HZ, true, str(LANG_TAGCACHE_BUSY)); + return GO_TO_PREVIOUS; + } + filter = SHOW_ID3DB; + tc->dirlevel = last_db_dirlevel; + break; + case GO_TO_BROWSEPLUGINS: + filter = SHOW_PLUGINS; + snprintf(folder, MAX_PATH, "%s/", PLUGIN_DIR); + break; + } + ret_val = rockbox_browse(folder, filter); + switch ((int)param) + { + case GO_TO_FILEBROWSER: + strcpy(last_folder, tc->currdir); + break; + case GO_TO_DBBROWSER: + last_db_dirlevel = tc->dirlevel; + break; + } + return ret_val; +} + +static int menu(void* param) +{ + (void)param; + return main_menu(); + +} +#ifdef HAVE_RECORDING +static int recscrn(void* param) +{ + (void)param; + recording_screen(false); + return GO_TO_ROOT; +} +#endif +static int wpsscrn(void* param) +{ + int ret_val = GO_TO_PREVIOUS; + (void)param; + if (audio_status()) + { + ret_val = gui_wps_show(); + } + else if ( global_status.resume_index != -1 ) + { + DEBUGF("Resume index %X offset %X\n", + global_status.resume_index, + global_status.resume_offset); + +#ifdef HAVE_ALARM_MOD + if ( rtc_check_alarm_started(true) ) { + rtc_enable_alarm(false); + } +#endif + + if (playlist_resume() != -1) + { + playlist_start(global_status.resume_index, + global_status.resume_offset); + ret_val = gui_wps_show(); + } + } + else + { + gui_syncsplash(HZ*2, true, str(LANG_NOTHING_TO_RESUME)); + } +#if LCD_DEPTH > 1 + show_main_backdrop(); +#endif + return ret_val; +} +#if CONFIG_TUNER +static int radio(void* param) +{ + (void)param; + radio_screen(); + return GO_TO_ROOT; +} +#endif + +static int load_bmarks(void* param) +{ + (void)param; + bookmark_mrb_load(); + return GO_TO_PREVIOUS; +} + +static const struct root_items items[] = { + [GO_TO_FILEBROWSER] = { browser, (void*)GO_TO_FILEBROWSER }, + [GO_TO_DBBROWSER] = { browser, (void*)GO_TO_DBBROWSER }, + [GO_TO_WPS] = { wpsscrn, NULL }, + [GO_TO_MAINMENU] = { menu, NULL }, + +#ifdef HAVE_RECORDING + [GO_TO_RECSCREEN] = { recscrn, NULL }, +#endif + +#if CONFIG_TUNER + [GO_TO_FM] = { radio, NULL }, +#endif + + [GO_TO_RECENTBMARKS] = { load_bmarks, NULL }, + [GO_TO_BROWSEPLUGINS] = { browser, (void*)GO_TO_BROWSEPLUGINS }, + +}; +static const int nb_items = sizeof(items)/sizeof(*items); + +#ifdef BOOTFILE +extern bool boot_changed; /* from tree.c */ +static void check_boot(void) +{ + if (boot_changed) { + char *lines[]={str(LANG_BOOT_CHANGED), str(LANG_REBOOT_NOW)}; + struct text_message message={lines, 2}; + if(gui_syncyesno_run(&message, NULL, NULL)==YESNO_YES) + rolo_load("/" BOOTFILE); + boot_changed = false; + } +} +#else +# define check_boot() +#endif +int item_callback(int action, const struct menu_item_ex *this_item) ; + +MENUITEM_RETURNVALUE(file_browser, ID2P(LANG_DIR_BROWSER), GO_TO_FILEBROWSER, + NULL, bitmap_icons_6x8[Icon_file_view_menu]); +MENUITEM_RETURNVALUE(db_browser, ID2P(LANG_TAGCACHE), GO_TO_DBBROWSER, + NULL, bitmap_icons_6x8[Icon_Audio]); +MENUITEM_RETURNVALUE(rocks_browser, ID2P(LANG_PLUGINS), GO_TO_BROWSEPLUGINS, + NULL, bitmap_icons_6x8[Icon_Plugin]); +char *get_wps_item_name(int selected_item, void * data, char *buffer) +{ + (void)selected_item; (void)data; (void)buffer; + if (audio_status()) + return str(LANG_NOW_PLAYING); + return str(LANG_RESUME_PLAYBACK); +} +MENUITEM_RETURNVALUE_DYNTEXT(wps_item, GO_TO_WPS, NULL, get_wps_item_name, + NULL, bitmap_icons_6x8[Icon_Playback_menu]); +#ifdef HAVE_RECORDING +MENUITEM_RETURNVALUE(rec, ID2P(LANG_RECORDING_MENU), GO_TO_RECSCREEN, + NULL, bitmap_icons_6x8[Icon_Recording]); +#endif +#if CONFIG_TUNER +MENUITEM_RETURNVALUE(fm, ID2P(LANG_FM_RADIO), GO_TO_FM, + item_callback, bitmap_icons_6x8[Icon_Radio_screen]); +#endif +MENUITEM_RETURNVALUE(menu_, ID2P(LANG_SETTINGS_MENU), GO_TO_MAINMENU, + NULL, bitmap_icons_6x8[Icon_Submenu_Entered]); +MENUITEM_RETURNVALUE(bookmarks, ID2P(LANG_BOOKMARK_MENU_RECENT_BOOKMARKS), + GO_TO_RECENTBMARKS, item_callback, + bitmap_icons_6x8[Icon_Bookmark]); +#ifdef HAVE_LCD_CHARCELLS +static int do_shutdown(void) +{ + sys_poweroff(); + return 0; +} +MENUITEM_FUNCTION(do_shutdown_item, ID2P(LANG_SHUTDOWN), do_shutdown, NULL, NOICON); +#endif +MAKE_MENU(root_menu_, ID2P(LANG_ROCKBOX_TITLE), + NULL, bitmap_icons_6x8[Icon_Rockbox], + &bookmarks, &file_browser, &db_browser, + &wps_item, &menu_, +#ifdef HAVE_RECORDING + &rec, +#endif +#if CONFIG_TUNER + &fm, +#endif + &playlist_options, &rocks_browser, &info_menu + +#ifdef HAVE_LCD_CHARCELLS + ,&do_shutdown_item +#endif + ); + +int item_callback(int action, const struct menu_item_ex *this_item) +{ + switch (action) + { + case ACTION_REQUEST_MENUITEM: +#if CONFIG_TUNER + if (this_item == &fm) + { + if (radio_hardware_present() == 0) + return ACTION_EXIT_MENUITEM; + } + else +#endif + if (this_item == &bookmarks) + { + if (global_settings.usemrb == 0) + return ACTION_EXIT_MENUITEM; + } + break; + } + return action; +} + +void root_menu(void) +{ + int previous_browser = GO_TO_FILEBROWSER; + int previous_music = GO_TO_WPS; + int ret_val = GO_TO_ROOT; + int this_screen = GO_TO_ROOT; + int selected = 0; + + if (global_settings.start_in_screen == 0) + ret_val = (int)global_status.last_screen; + else ret_val = global_settings.start_in_screen - 2; + + while (true) + { + switch (ret_val) + { + case GO_TO_ROOT: + ret_val = do_menu(&root_menu_, &selected); + /* As long as MENU_ATTACHED_USB == GO_TO_ROOT this works */ + if (ret_val == MENU_ATTACHED_USB) + { + check_boot(); + continue; + } + + if (ret_val == GO_TO_PREVIOUS_MUSIC) + ret_val = previous_music; + last_screen = GO_TO_ROOT; + break; + case GO_TO_PREVIOUS: + ret_val = last_screen; + if (last_screen == GO_TO_ROOT) + continue; + break; + case GO_TO_PREVIOUS_BROWSER: + if ((previous_browser == GO_TO_DBBROWSER) && + !tagcache_is_usable()) + ret_val = GO_TO_FILEBROWSER; + else + ret_val = previous_browser; + break; + case GO_TO_PREVIOUS_MUSIC: + ret_val = previous_music; + break; + } + this_screen = ret_val; + + if (this_screen == GO_TO_FILEBROWSER) + previous_browser = GO_TO_FILEBROWSER; + else if (this_screen == GO_TO_DBBROWSER) + previous_browser = GO_TO_DBBROWSER; + else if (this_screen == GO_TO_WPS) + previous_music = GO_TO_WPS; +#if CONFIG_TUNER + else if (this_screen == GO_TO_FM) + previous_music = GO_TO_FM; +#endif + + /* set the global_status.last_screen before entering, + if we dont we will always return to the wrong screen on boot */ + global_status.last_screen = (char)this_screen; + status_save(); + action_signalscreenchange(); + ret_val = items[this_screen].function(items[this_screen].param); + if (ret_val != GO_TO_PREVIOUS) + last_screen = this_screen; + } + return; +} |