forked from len0rd/rockbox
convert the rockbox info screen to use the list. you need to move up/down in the list to voice each item
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15240 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
afcfa1f669
commit
7c594d6ea1
1 changed files with 154 additions and 179 deletions
|
|
@ -120,55 +120,125 @@ static bool show_credits(void)
|
||||||
#else
|
#else
|
||||||
#define SIZE_FMT "%s %s"
|
#define SIZE_FMT "%s %s"
|
||||||
#endif
|
#endif
|
||||||
|
struct info_data {
|
||||||
static bool show_info(void)
|
bool new_data;
|
||||||
{
|
unsigned long size;
|
||||||
char s[64], s1[32];
|
unsigned long free;
|
||||||
unsigned long size, free;
|
|
||||||
long buflen = ((audiobufend - audiobuf) * 2) / 2097; /* avoid overflow */
|
|
||||||
int key;
|
|
||||||
int i;
|
|
||||||
bool done = false;
|
|
||||||
bool new_info = true;
|
|
||||||
#ifdef HAVE_MULTIVOLUME
|
#ifdef HAVE_MULTIVOLUME
|
||||||
char s2[32];
|
unsigned long size2;
|
||||||
unsigned long size2, free2;
|
unsigned long free2;
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_LCD_CHARCELLS
|
};
|
||||||
int page = 0;
|
static char* info_getname(int selected_item, void * data, char *buffer)
|
||||||
#endif
|
{
|
||||||
|
struct info_data *info = (struct info_data*)data;
|
||||||
const unsigned char *kbyte_units[] = {
|
const unsigned char *kbyte_units[] = {
|
||||||
ID2P(LANG_KILOBYTE),
|
ID2P(LANG_KILOBYTE),
|
||||||
ID2P(LANG_MEGABYTE),
|
ID2P(LANG_MEGABYTE),
|
||||||
ID2P(LANG_GIGABYTE)
|
ID2P(LANG_GIGABYTE)
|
||||||
};
|
};
|
||||||
#if defined(HAVE_LCD_BITMAP)
|
char s1[32];
|
||||||
FOR_NB_SCREENS(i)
|
#ifdef HAVE_MULTIVOLUME
|
||||||
screens[i].setmargins(0, 0);
|
char s2[32];
|
||||||
#endif
|
#endif
|
||||||
while (!done)
|
if (info->new_data)
|
||||||
{
|
{
|
||||||
int y=0;
|
fat_size( IF_MV2(0,) &info->size, &info->free );
|
||||||
|
|
||||||
if (new_info)
|
|
||||||
{
|
|
||||||
fat_size( IF_MV2(0,) &size, &free );
|
|
||||||
#ifdef HAVE_MULTIVOLUME
|
#ifdef HAVE_MULTIVOLUME
|
||||||
if (fat_ismounted(1))
|
if (fat_ismounted(1))
|
||||||
fat_size( 1, &size2, &free2 );
|
fat_size( 1, &info->size2, &info->free2 );
|
||||||
else
|
else
|
||||||
size2 = 0;
|
info->size2 = 0;
|
||||||
#endif
|
#endif
|
||||||
|
info->new_data = false;
|
||||||
if (global_settings.talk_menu)
|
}
|
||||||
|
switch (selected_item)
|
||||||
{
|
{
|
||||||
/* say whatever is reasonable, no real connection to the screen */
|
case 0:
|
||||||
bool enqueue = false; /* enqueue all but the first */
|
snprintf(buffer, MAX_PATH, "%s: %s",
|
||||||
|
str(LANG_VERSION), appsversion);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
return "";
|
||||||
|
case 2: /* buffer */
|
||||||
|
{
|
||||||
|
long buflen = ((audiobufend - audiobuf) * 2) / 2097; /* avoid overflow */
|
||||||
|
int integer = buflen / 1000;
|
||||||
|
int decimal = buflen % 1000;
|
||||||
|
|
||||||
|
snprintf(buffer, MAX_PATH, (char *)str(LANG_BUFFER_STAT),
|
||||||
|
integer, decimal);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3: /* battery */
|
||||||
|
#if CONFIG_CHARGING == CHARGING_CONTROL
|
||||||
|
if (charge_state == CHARGING)
|
||||||
|
snprintf(buffer, MAX_PATH, (char *)str(LANG_BATTERY_CHARGE));
|
||||||
|
else if (charge_state == TOPOFF)
|
||||||
|
snprintf(buffer, MAX_PATH, (char *)str(LANG_BATTERY_TOPOFF_CHARGE));
|
||||||
|
else if (charge_state == TRICKLE)
|
||||||
|
snprintf(buffer, MAX_PATH, (char *)str(LANG_BATTERY_TRICKLE_CHARGE));
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
if (battery_level() >= 0)
|
||||||
|
snprintf(buffer, MAX_PATH, (char *)str(LANG_BATTERY_TIME), battery_level(),
|
||||||
|
battery_time() / 60, battery_time() % 60);
|
||||||
|
else
|
||||||
|
strcpy(buffer, "(n/a)");
|
||||||
|
break;
|
||||||
|
case 4: /* disc usage 1 */
|
||||||
|
#ifdef HAVE_MULTIVOLUME
|
||||||
|
output_dyn_value(s1, sizeof s1, info->free, kbyte_units, true);
|
||||||
|
output_dyn_value(s2, sizeof s2, info->size, kbyte_units, true);
|
||||||
|
snprintf(buffer, MAX_PATH, "%s %s/%s", str(LANG_DISK_NAME_INTERNAL),
|
||||||
|
s1, s2);
|
||||||
|
#else
|
||||||
|
output_dyn_value(s1, sizeof s1, info->size, kbyte_units, true);
|
||||||
|
snprintf(buffer, MAX_PATH, SIZE_FMT, str(LANG_DISK_SIZE_INFO), s1);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 5: /* disc usage 2 */
|
||||||
|
#ifdef HAVE_MULTIVOLUME
|
||||||
|
if (info->size2)
|
||||||
|
{
|
||||||
|
output_dyn_value(s1, sizeof s1, info->free2, kbyte_units, true);
|
||||||
|
output_dyn_value(s2, sizeof s2, info->size2, kbyte_units, true);
|
||||||
|
snprintf(buffer, MAX_PATH, "%s %s/%s", str(LANG_DISK_NAME_MMC),
|
||||||
|
s1, s2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return "";
|
||||||
|
#else
|
||||||
|
output_dyn_value(s1, sizeof s1, info->free, kbyte_units, true);
|
||||||
|
snprintf(buffer, MAX_PATH, SIZE_FMT, str(LANG_DISK_FREE_INFO), s1);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
static int info_speak_item(int selected_item, void * data)
|
||||||
|
{
|
||||||
|
struct info_data *info = (struct info_data*)data;
|
||||||
|
const unsigned char *kbyte_units[] = {
|
||||||
|
ID2P(LANG_KILOBYTE),
|
||||||
|
ID2P(LANG_MEGABYTE),
|
||||||
|
ID2P(LANG_GIGABYTE)
|
||||||
|
};
|
||||||
|
switch (selected_item)
|
||||||
|
{
|
||||||
|
case 0:/* version, not voiced, so say the time instead */
|
||||||
|
#if CONFIG_RTC
|
||||||
|
talk_date_time(get_time(), false);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
case 1: /* nothing */
|
||||||
|
break;
|
||||||
|
case 2: /* buffer, not spoken */
|
||||||
|
break;
|
||||||
|
case 3: /* battery */
|
||||||
if (battery_level() >= 0)
|
if (battery_level() >= 0)
|
||||||
{
|
{
|
||||||
talk_id(LANG_BATTERY_TIME, enqueue);
|
talk_id(LANG_BATTERY_TIME, false);
|
||||||
enqueue = true;
|
|
||||||
talk_value(battery_level(), UNIT_PERCENT, true);
|
talk_value(battery_level(), UNIT_PERCENT, true);
|
||||||
#if CONFIG_CHARGING >= CHARGING_MONITOR
|
#if CONFIG_CHARGING >= CHARGING_MONITOR
|
||||||
if (charge_state == CHARGING)
|
if (charge_state == CHARGING)
|
||||||
|
|
@ -181,156 +251,61 @@ static bool show_info(void)
|
||||||
talk_id(LANG_BATTERY_TRICKLE_CHARGE, true);
|
talk_id(LANG_BATTERY_TRICKLE_CHARGE, true);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
talk_id(LANG_DISK_FREE_INFO, enqueue);
|
case 4: /* disk 1 */
|
||||||
|
talk_id(LANG_DISK_FREE_INFO, false);
|
||||||
#ifdef HAVE_MULTIVOLUME
|
#ifdef HAVE_MULTIVOLUME
|
||||||
talk_id(LANG_DISK_NAME_INTERNAL, true);
|
talk_id(LANG_DISK_NAME_INTERNAL, true);
|
||||||
output_dyn_value(NULL, 0, free, kbyte_units, true);
|
|
||||||
if (size2)
|
|
||||||
{
|
|
||||||
talk_id(LANG_DISK_NAME_MMC, true);
|
|
||||||
output_dyn_value(NULL, 0, free2, kbyte_units, true);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
output_dyn_value(NULL, 0, free, kbyte_units, true);
|
|
||||||
#endif
|
#endif
|
||||||
#if CONFIG_RTC
|
output_dyn_value(NULL, 0, info->free, kbyte_units, true);
|
||||||
talk_date_time(get_time(), true);
|
break;
|
||||||
#endif
|
case 5: /* disk 2 */
|
||||||
new_info = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FOR_NB_SCREENS(i)
|
|
||||||
{
|
|
||||||
screens[i].clear_display();
|
|
||||||
#ifdef HAVE_LCD_BITMAP
|
|
||||||
screens[i].puts(0, y, str(LANG_ROCKBOX_INFO));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#ifdef HAVE_LCD_BITMAP
|
|
||||||
y++;
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_LCD_CHARCELLS
|
|
||||||
if (page == 0)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
snprintf(s, sizeof(s), "%s: %s", str(LANG_VERSION), appsversion);
|
|
||||||
FOR_NB_SCREENS(i)
|
|
||||||
screens[i].puts_scroll(0, y, (unsigned char *)s);
|
|
||||||
#ifdef HAVE_LCD_BITMAP
|
|
||||||
y += 2;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_LCD_CHARCELLS
|
|
||||||
if (page == 1)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
int integer = buflen / 1000;
|
|
||||||
int decimal = buflen % 1000;
|
|
||||||
|
|
||||||
snprintf(s, sizeof(s), (char *)str(LANG_BUFFER_STAT),
|
|
||||||
integer, decimal);
|
|
||||||
|
|
||||||
FOR_NB_SCREENS(i)
|
|
||||||
screens[i].puts_scroll(0, y, (unsigned char *)s);
|
|
||||||
y++;
|
|
||||||
#if CONFIG_CHARGING == CHARGING_CONTROL
|
|
||||||
if (charge_state == CHARGING)
|
|
||||||
snprintf(s, sizeof(s), (char *)str(LANG_BATTERY_CHARGE));
|
|
||||||
else if (charge_state == TOPOFF)
|
|
||||||
snprintf(s, sizeof(s), (char *)str(LANG_BATTERY_TOPOFF_CHARGE));
|
|
||||||
else if (charge_state == TRICKLE)
|
|
||||||
snprintf(s, sizeof(s), (char *)str(LANG_BATTERY_TRICKLE_CHARGE));
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
if (battery_level() >= 0)
|
|
||||||
snprintf(s, sizeof(s), (char *)str(LANG_BATTERY_TIME), battery_level(),
|
|
||||||
battery_time() / 60, battery_time() % 60);
|
|
||||||
else
|
|
||||||
strncpy(s, "(n/a)", sizeof(s));
|
|
||||||
FOR_NB_SCREENS(i)
|
|
||||||
screens[i].puts_scroll(0, y, (unsigned char *)s);
|
|
||||||
y++;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_LCD_CHARCELLS
|
|
||||||
if (page == 2)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
#ifdef HAVE_MULTIVOLUME
|
#ifdef HAVE_MULTIVOLUME
|
||||||
output_dyn_value(s1, sizeof s1, free, kbyte_units, true);
|
if (info->size2)
|
||||||
output_dyn_value(s2, sizeof s2, size, kbyte_units, true);
|
{
|
||||||
snprintf(s, sizeof s, "%s %s/%s", str(LANG_DISK_NAME_INTERNAL),
|
talk_id(LANG_DISK_NAME_MMC, false);
|
||||||
s1, s2);
|
output_dyn_value(NULL, 0, info->free2, kbyte_units, true);
|
||||||
FOR_NB_SCREENS(i)
|
|
||||||
screens[i].puts_scroll(0, y, (unsigned char *)s);
|
|
||||||
y++;
|
|
||||||
|
|
||||||
if (size2) {
|
|
||||||
output_dyn_value(s1, sizeof s1, free2, kbyte_units, true);
|
|
||||||
output_dyn_value(s2, sizeof s2, size2, kbyte_units, true);
|
|
||||||
snprintf(s, sizeof s, "%s %s/%s", str(LANG_DISK_NAME_MMC),
|
|
||||||
s1, s2);
|
|
||||||
FOR_NB_SCREENS(i)
|
|
||||||
screens[i].puts_scroll(0, y, (unsigned char *)s);
|
|
||||||
y++;
|
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
output_dyn_value(s1, sizeof s1, size, kbyte_units, true);
|
|
||||||
snprintf(s, sizeof s, SIZE_FMT, str(LANG_DISK_SIZE_INFO), s1);
|
|
||||||
FOR_NB_SCREENS(i)
|
|
||||||
screens[i].puts_scroll(0, y, (unsigned char *)s);
|
|
||||||
y++;
|
|
||||||
output_dyn_value(s1, sizeof s1, free, kbyte_units, true);
|
|
||||||
snprintf(s, sizeof s, SIZE_FMT, str(LANG_DISK_FREE_INFO), s1);
|
|
||||||
FOR_NB_SCREENS(i)
|
|
||||||
screens[i].puts_scroll(0, y, (unsigned char *)s);
|
|
||||||
y++;
|
|
||||||
#endif
|
#endif
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
FOR_NB_SCREENS(i)
|
static int info_action_callback(int action, struct gui_synclist *lists)
|
||||||
screens[i].update();
|
{
|
||||||
|
(void)lists;
|
||||||
/* Wait for a key to be pushed */
|
if ((action == ACTION_STD_OK)
|
||||||
key = get_action(CONTEXT_MAINMENU,HZ*5);
|
#ifdef HAVE_MULTIVOLUME
|
||||||
switch(key) {
|
|| action == SYS_HOTSWAP_INSERTED
|
||||||
|
|| action == SYS_HOTSWAP_EXTRACTED
|
||||||
case ACTION_STD_CANCEL:
|
|
||||||
done = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
#ifdef HAVE_LCD_CHARCELLS
|
|
||||||
case ACTION_STD_NEXT:
|
|
||||||
page = (page+1)%3;
|
|
||||||
break;
|
|
||||||
case ACTION_STD_PREV:
|
|
||||||
page--;
|
|
||||||
if (page < 0)
|
|
||||||
page = 2;
|
|
||||||
break;
|
|
||||||
#endif
|
#endif
|
||||||
|
)
|
||||||
|
{
|
||||||
#ifndef SIMULATOR
|
#ifndef SIMULATOR
|
||||||
case ACTION_STD_OK:
|
struct info_data *info = (struct info_data *)lists->gui_list[SCREEN_MAIN].data;
|
||||||
gui_syncsplash(0, str(LANG_SCANNING_DISK));
|
info->new_data = true;
|
||||||
|
gui_syncsplash(0, ID2P(LANG_SCANNING_DISK));
|
||||||
fat_recalc_free(IF_MV(0));
|
fat_recalc_free(IF_MV(0));
|
||||||
#ifdef HAVE_MULTIVOLUME
|
#ifdef HAVE_MULTIVOLUME
|
||||||
if (fat_ismounted(1))
|
if (fat_ismounted(1))
|
||||||
fat_recalc_free(1);
|
fat_recalc_free(1);
|
||||||
#endif
|
#endif
|
||||||
new_info = true;
|
|
||||||
break;
|
|
||||||
#endif
|
#endif
|
||||||
|
return ACTION_REDRAW;
|
||||||
default:
|
|
||||||
if (default_event_handler(key) == SYS_USB_CONNECTED)
|
|
||||||
return true;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
return action;
|
||||||
return false;
|
}
|
||||||
|
static bool show_info(void)
|
||||||
|
{
|
||||||
|
struct info_data data = {.new_data = true};
|
||||||
|
struct simplelist_info info;
|
||||||
|
simplelist_info_init(&info, str(LANG_ROCKBOX_INFO), 6, (void*)&data);
|
||||||
|
info.hide_selection = !global_settings.talk_menu;
|
||||||
|
info.get_name = info_getname;
|
||||||
|
info.get_talk = info_speak_item;
|
||||||
|
info.action_callback = info_action_callback;
|
||||||
|
return simplelist_show_list(&info);
|
||||||
}
|
}
|
||||||
MENUITEM_FUNCTION(show_info_item, 0, ID2P(LANG_ROCKBOX_INFO),
|
MENUITEM_FUNCTION(show_info_item, 0, ID2P(LANG_ROCKBOX_INFO),
|
||||||
(menu_function)show_info, NULL, NULL, Icon_NOICON);
|
(menu_function)show_info, NULL, NULL, Icon_NOICON);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue