summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2008-11-03 11:11:07 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2008-11-03 11:11:07 +0000
commitedcacaa787d770cd5b944c18082b5b80128f7e4e (patch)
treec9c15530510a02327bcd20808ac470304781879e
parent5395957549c9b04fefa87a0aedb6bc15bf360739 (diff)
downloadrockbox-edcacaa787d770cd5b944c18082b5b80128f7e4e.tar.gz
rockbox-edcacaa787d770cd5b944c18082b5b80128f7e4e.zip
FS#9515 - customisable quickscreen. Allows you to choose which setting you want displayed on the quickscreen.
Allows almost every available setting. (change the options in settings > general settings > quickscreen items) Not every setting will work perfectly, some might need aditional handling if the change doesnt take effect straight away (let us know which are problematic so they can be fixed) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18984 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/gui/quickscreen.c164
-rw-r--r--apps/gui/quickscreen.h2
-rw-r--r--apps/lang/english.lang68
-rw-r--r--apps/menus/settings_menu.c22
-rw-r--r--apps/settings.h6
-rw-r--r--apps/settings_list.c53
-rw-r--r--apps/settings_list.h4
7 files changed, 309 insertions, 10 deletions
diff --git a/apps/gui/quickscreen.c b/apps/gui/quickscreen.c
index 0bfe746661..189a1e5989 100644
--- a/apps/gui/quickscreen.c
+++ b/apps/gui/quickscreen.c
@@ -37,6 +37,8 @@
37#include "audio.h" 37#include "audio.h"
38#include "quickscreen.h" 38#include "quickscreen.h"
39#include "talk.h" 39#include "talk.h"
40#include "list.h"
41#include "splash.h"
40 42
41static struct viewport vps[NB_SCREENS][QUICKSCREEN_ITEM_COUNT]; 43static struct viewport vps[NB_SCREENS][QUICKSCREEN_ITEM_COUNT];
42static struct viewport vp_icons[NB_SCREENS]; 44static struct viewport vp_icons[NB_SCREENS];
@@ -113,7 +115,7 @@ static void quickscreen_fix_viewports(struct gui_quickscreen *qs,
113 vps[screen][QUICKSCREEN_RIGHT].width = width; 115 vps[screen][QUICKSCREEN_RIGHT].width = width;
114 116
115 /* shrink the icons vp by a few pixels if there is room so the arrows 117 /* shrink the icons vp by a few pixels if there is room so the arrows
116 arnt' drawn right next to the text */ 118 aren't drawn right next to the text */
117 if (vp_icons[screen].width > CENTER_ICONAREA_WIDTH+8) 119 if (vp_icons[screen].width > CENTER_ICONAREA_WIDTH+8)
118 { 120 {
119 vp_icons[screen].width -= 8; 121 vp_icons[screen].width -= 8;
@@ -320,18 +322,31 @@ bool gui_syncquickscreen_run(struct gui_quickscreen * qs, int button_enter)
320 cond_talk_ids_fq(VOICE_OK); 322 cond_talk_ids_fq(VOICE_OK);
321 return changed; 323 return changed;
322} 324}
323 325static bool is_setting_quickscreenable(const struct settings_list *setting);
326static inline const struct settings_list *get_setting(int gs_value,
327 const struct settings_list *defaultval)
328{
329 if (gs_value != -1 && gs_value < nb_settings &&
330 is_setting_quickscreenable(&settings[gs_value]))
331 return &settings[gs_value];
332 return defaultval;
333}
324bool quick_screen_quick(int button_enter) 334bool quick_screen_quick(int button_enter)
325{ 335{
326 struct gui_quickscreen qs; 336 struct gui_quickscreen qs;
327 bool oldshuffle = global_settings.playlist_shuffle; 337 bool oldshuffle = global_settings.playlist_shuffle;
328 int oldrepeat = global_settings.repeat_mode; 338 int oldrepeat = global_settings.repeat_mode;
329 qs.items[QUICKSCREEN_LEFT] = 339
330 find_setting(&global_settings.playlist_shuffle, NULL); 340 qs.items[QUICKSCREEN_LEFT] =
331 qs.items[QUICKSCREEN_RIGHT] = 341 get_setting(global_settings.qs_item_left,
332 find_setting(&global_settings.repeat_mode, NULL); 342 find_setting(&global_settings.playlist_shuffle, NULL));
333 qs.items[QUICKSCREEN_BOTTOM] = 343 qs.items[QUICKSCREEN_RIGHT] =
334 find_setting(&global_settings.dirfilter, NULL); 344 get_setting(global_settings.qs_item_right,
345 find_setting(&global_settings.repeat_mode, NULL));
346 qs.items[QUICKSCREEN_BOTTOM] =
347 get_setting(global_settings.qs_item_bottom,
348 find_setting(&global_settings.dirfilter, NULL));
349
335 qs.callback = NULL; 350 qs.callback = NULL;
336 if (gui_syncquickscreen_run(&qs, button_enter)) 351 if (gui_syncquickscreen_run(&qs, button_enter))
337 { 352 {
@@ -378,3 +393,136 @@ bool quick_screen_f3(int button_enter)
378} 393}
379#endif /* BUTTON_F3 */ 394#endif /* BUTTON_F3 */
380 395
396/* stuff to make the quickscreen configurable */
397static bool is_setting_quickscreenable(const struct settings_list *setting)
398{
399 /* to keep things simple, only settings which have a lang_id set are ok */
400 if (setting->lang_id < 0 || (setting->flags&F_BANFROMQS))
401 return false;
402 switch (setting->flags&F_T_MASK)
403 {
404 case F_T_BOOL:
405 return true;
406 case F_T_INT:
407 case F_T_UINT:
408 return (setting->RESERVED != NULL);
409 default:
410 return false;
411 }
412}
413
414const struct settings_list *find_setting_from_index(int index)
415{
416 int count = -1, i;
417 const struct settings_list *setting = &settings[0];
418 for(i=0;i<nb_settings;i++)
419 {
420 setting = &settings[i];
421 if (is_setting_quickscreenable(setting))
422 count++;
423 if (count == index)
424 return setting;
425 }
426 return NULL;
427}
428static char* quickscreen_setter_getname(int selected_item, void *data,
429 char *buffer, size_t buffer_len)
430{
431 (void)data;
432 const struct settings_list *setting = find_setting_from_index(selected_item);
433 snprintf(buffer, buffer_len, "%s (%s)",
434 str(setting->lang_id), setting->cfg_name);
435 return buffer;
436}
437static int quickscreen_setter_speak_item(int selected_item, void * data)
438{
439 (void)data;
440 talk_id(find_setting_from_index(selected_item)->lang_id, true);
441 return 0;
442}
443static int quickscreen_setter_action_callback(int action,
444 struct gui_synclist *lists)
445{
446 const struct settings_list *temp = lists->data;
447 switch (action)
448 {
449 case ACTION_STD_OK:
450 /* ok, quit */
451 return ACTION_STD_CANCEL;
452 case ACTION_STD_CONTEXT: /* real settings use this to reset to default */
453 {
454 int i=0, count=0;
455 reset_setting(temp, temp->setting);
456 for(i=0;i<nb_settings;i++)
457 {
458 if (is_setting_quickscreenable(&settings[i]))
459 count++;
460 if (*(int*)temp->setting == i)
461 {
462 gui_synclist_select_item(lists, count-1);
463 break;
464 }
465 }
466 return ACTION_REDRAW;
467 }
468 }
469 return action;
470}
471int quickscreen_set_option(void *data)
472{
473 int valid_settings_count = 0;
474 int i, newval = 0, oldval, *setting = NULL;
475 struct simplelist_info info;
476 switch ((intptr_t)data)
477 {
478 case QUICKSCREEN_LEFT:
479 setting = &global_settings.qs_item_left;
480 break;
481 case QUICKSCREEN_RIGHT:
482 setting = &global_settings.qs_item_right;
483 break;
484 case QUICKSCREEN_BOTTOM:
485 setting = &global_settings.qs_item_bottom;
486 break;
487 }
488 oldval = *setting;
489 for(i=0;i<nb_settings;i++)
490 {
491 if (is_setting_quickscreenable(&settings[i]))
492 valid_settings_count++;
493 if (oldval == i)
494 newval = valid_settings_count - 1;
495 }
496
497 simplelist_info_init(&info, str(LANG_QS_ITEMS),
498 valid_settings_count,
499 (void*)find_setting(setting, NULL)); /* find the qs item being changed */
500 info.get_name = quickscreen_setter_getname;
501 if(global_settings.talk_menu)
502 info.get_talk = quickscreen_setter_speak_item;
503 info.action_callback = quickscreen_setter_action_callback;
504 info.selection = newval;
505 simplelist_show_list(&info);
506 if (info.selection != oldval)
507 {
508 if (info.selection != -1)
509 {
510 const struct settings_list *temp = find_setting_from_index(info.selection);
511 int i = 0;
512 for(i=0;i<nb_settings;i++)
513 {
514 if (&settings[i] == temp)
515 break;
516 }
517 *setting = i;
518 settings_save();
519 }
520 /* probably should splash LANG_CANCEL here but right now
521 we cant find out the selection when the cancel button was
522 pressed, (without hacks)so we cant know if the
523 selection was changed, or just viewed */
524 }
525 return 0;
526}
527
528
diff --git a/apps/gui/quickscreen.h b/apps/gui/quickscreen.h
index 1d2ed18c97..f084d83b61 100644
--- a/apps/gui/quickscreen.h
+++ b/apps/gui/quickscreen.h
@@ -50,7 +50,7 @@ bool gui_syncquickscreen_run(struct gui_quickscreen * qs, int button_enter);
50extern bool quick_screen_f3(int button_enter); 50extern bool quick_screen_f3(int button_enter);
51#endif 51#endif
52extern bool quick_screen_quick(int button_enter); 52extern bool quick_screen_quick(int button_enter);
53 53int quickscreen_set_option(void *data);
54 54
55#endif /*_GUI_QUICK_SCREEN_H_*/ 55#endif /*_GUI_QUICK_SCREEN_H_*/
56#endif /* HAVE_QUICKSCREEN */ 56#endif /* HAVE_QUICKSCREEN */
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 8cb1007ad5..7e638f3a5c 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -12109,3 +12109,71 @@
12109 *: "Search Results" 12109 *: "Search Results"
12110 </voice> 12110 </voice>
12111</phrase> 12111</phrase>
12112<phrase>
12113 id: LANG_QS_ITEMS
12114 desc: used for the submenu name for the quickscreen items
12115 user:
12116 <source>
12117 *: none
12118 quickscreen: "Quickscreen Items"
12119 </source>
12120 <dest>
12121 *: none
12122 quickscreen: "Quickscreen Items"
12123 </dest>
12124 <voice>
12125 *: none
12126 quickscreen: "Quickscreen Items"
12127 </voice>
12128</phrase>
12129<phrase>
12130 id: LANG_LEFT
12131 desc: used for the submenu name for the quickscreen items
12132 user:
12133 <source>
12134 *: none
12135 quickscreen: "Left"
12136 </source>
12137 <dest>
12138 *: none
12139 quickscreen: "Left"
12140 </dest>
12141 <voice>
12142 *: none
12143 quickscreen: "Left"
12144 </voice>
12145</phrase>
12146<phrase>
12147 id: LANG_RIGHT
12148 desc: used for the submenu name for the quickscreen items
12149 user:
12150 <source>
12151 *: none
12152 quickscreen: "Right"
12153 </source>
12154 <dest>
12155 *: none
12156 quickscreen: "Right"
12157 </dest>
12158 <voice>
12159 *: none
12160 quickscreen: "Right"
12161 </voice>
12162</phrase>
12163<phrase>
12164 id: LANG_BOTTOM
12165 desc: used for the submenu name for the quickscreen items
12166 user:
12167 <source>
12168 *: none
12169 quickscreen: "Bottom"
12170 </source>
12171 <dest>
12172 *: none
12173 quickscreen: "Bottom"
12174 </dest>
12175 <voice>
12176 *: none
12177 quickscreen: "Bottom"
12178 </voice>
12179</phrase>
diff --git a/apps/menus/settings_menu.c b/apps/menus/settings_menu.c
index 60fc9c0cc0..1610cfbef1 100644
--- a/apps/menus/settings_menu.c
+++ b/apps/menus/settings_menu.c
@@ -49,6 +49,7 @@
49#if CONFIG_RTC 49#if CONFIG_RTC
50#include "screens.h" 50#include "screens.h"
51#endif 51#endif
52#include "quickscreen.h"
52 53
53/***********************************/ 54/***********************************/
54/* TAGCACHE MENU */ 55/* TAGCACHE MENU */
@@ -486,7 +487,25 @@ MAKE_MENU(voice_settings_menu, ID2P(LANG_VOICE), 0, Icon_Voice,
486/* VOICE MENU */ 487/* VOICE MENU */
487/***********************************/ 488/***********************************/
488 489
490#ifdef HAVE_QUICKSCREEN
489/***********************************/ 491/***********************************/
492/* CUSTOMISABLE QUICKSCREEN CODE */
493
494MENUITEM_FUNCTION(qs_left_item, MENU_FUNC_USEPARAM, ID2P(LANG_LEFT),
495 (menu_function)quickscreen_set_option, (intptr_t*)QUICKSCREEN_LEFT, NULL,
496 Icon_Menu_setting);
497MENUITEM_FUNCTION(qs_right_item, MENU_FUNC_USEPARAM, ID2P(LANG_RIGHT),
498 (menu_function)quickscreen_set_option, (intptr_t*)QUICKSCREEN_RIGHT, NULL,
499 Icon_Menu_setting);
500MENUITEM_FUNCTION(qs_bottom_item, MENU_FUNC_USEPARAM, ID2P(LANG_BOTTOM),
501 (menu_function)quickscreen_set_option, (intptr_t*)QUICKSCREEN_BOTTOM, NULL,
502 Icon_Menu_setting);
503
504MAKE_MENU(quickscreen_settings, ID2P(LANG_QS_ITEMS), NULL, Icon_Config,
505 &qs_left_item, &qs_right_item, &qs_bottom_item);
506/* CUSTOMISABLE QUICKSCREEN CODE */
507/***********************************/
508#endif
490 509
491/***********************************/ 510/***********************************/
492/* SETTINGS MENU */ 511/* SETTINGS MENU */
@@ -500,6 +519,9 @@ MENUITEM_FUNCTION(browse_langs, 0, ID2P(LANG_LANGUAGE), language_browse,
500MAKE_MENU(settings_menu_item, ID2P(LANG_GENERAL_SETTINGS), 0, 519MAKE_MENU(settings_menu_item, ID2P(LANG_GENERAL_SETTINGS), 0,
501 Icon_General_settings_menu, 520 Icon_General_settings_menu,
502 &playlist_settings, &file_menu, 521 &playlist_settings, &file_menu,
522#ifdef HAVE_QUICKSCREEN
523 &quickscreen_settings,
524#endif
503#ifdef HAVE_TAGCACHE 525#ifdef HAVE_TAGCACHE
504 &tagcache_menu, 526 &tagcache_menu,
505#endif 527#endif
diff --git a/apps/settings.h b/apps/settings.h
index 8c206053aa..8448059308 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -751,6 +751,12 @@ struct user_settings
751#ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING 751#ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING
752 int touchpad_sensitivity; 752 int touchpad_sensitivity;
753#endif 753#endif
754#ifdef HAVE_QUICKSCREEN
755 /* these are split because settings_list cant handle arrays */
756 int qs_item_left;
757 int qs_item_right;
758 int qs_item_bottom;
759#endif
754}; 760};
755 761
756/** global variables **/ 762/** global variables **/
diff --git a/apps/settings_list.c b/apps/settings_list.c
index 99a4601a3f..7bdf4f4ce9 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -409,6 +409,45 @@ static int32_t jumpscroll_getlang(int value, int unit)
409} 409}
410#endif /* HAVE_LCD_CHARCELLS */ 410#endif /* HAVE_LCD_CHARCELLS */
411 411
412#ifdef HAVE_QUICKSCREEN
413int find_setting_by_name(char*name)
414{
415 int i = 0;
416 const struct settings_list *setting;
417 while (i<nb_settings)
418 {
419 setting = &settings[i];
420 if (setting->cfg_name && !strcmp(setting->cfg_name, name))
421 {
422 return i;
423 }
424 i++;
425 }
426 return -1;
427}
428void qs_load_from_cfg(void* var, char*value)
429{
430 *(int*)var = find_setting_by_name(value);
431}
432char* qs_write_to_cfg(void* setting, char*buf, int buf_len)
433{
434 const struct settings_list *var = &settings[*(int*)setting];
435 strncpy(buf, var->cfg_name, buf_len);
436 return buf;
437}
438bool qs_is_changed(void* setting, void* defaultval)
439{
440 int i = *(int*)setting;
441 if (i < 0 || i >= nb_settings)
442 return false;
443 const struct settings_list *var = &settings[i];
444 return var != find_setting(defaultval, NULL);
445}
446void qs_set_default(void* setting, void* defaultval)
447{
448 find_setting(defaultval, (int*)setting);
449}
450#endif
412const struct settings_list settings[] = { 451const struct settings_list settings[] = {
413 /* sound settings */ 452 /* sound settings */
414 SOUND_SETTING(F_NO_WRAP,volume, LANG_VOLUME, "volume", SOUND_VOLUME), 453 SOUND_SETTING(F_NO_WRAP,volume, LANG_VOLUME, "volume", SOUND_VOLUME),
@@ -1372,6 +1411,20 @@ const struct settings_list settings[] = {
1372 "touchpad sensitivity", "normal,high", touchpad_set_sensitivity, 2, 1411 "touchpad sensitivity", "normal,high", touchpad_set_sensitivity, 2,
1373 ID2P(LANG_NORMAL), ID2P(LANG_HIGH)), 1412 ID2P(LANG_NORMAL), ID2P(LANG_HIGH)),
1374#endif 1413#endif
1414#ifdef HAVE_QUICKSCREEN
1415 CUSTOM_SETTING(0, qs_item_left, LANG_LEFT,
1416 &global_settings.playlist_shuffle, "qs left",
1417 qs_load_from_cfg, qs_write_to_cfg,
1418 qs_is_changed, qs_set_default),
1419 CUSTOM_SETTING(0, qs_item_right, LANG_RIGHT,
1420 &global_settings.repeat_mode, "qs right",
1421 qs_load_from_cfg, qs_write_to_cfg,
1422 qs_is_changed, qs_set_default),
1423 CUSTOM_SETTING(0, qs_item_bottom, LANG_BOTTOM,
1424 &global_settings.dirfilter, "qs bottom",
1425 qs_load_from_cfg, qs_write_to_cfg,
1426 qs_is_changed, qs_set_default),
1427#endif
1375}; 1428};
1376 1429
1377const int nb_settings = sizeof(settings)/sizeof(*settings); 1430const int nb_settings = sizeof(settings)/sizeof(*settings);
diff --git a/apps/settings_list.h b/apps/settings_list.h
index 60e3f7f0c7..1bc529c7d9 100644
--- a/apps/settings_list.h
+++ b/apps/settings_list.h
@@ -152,8 +152,10 @@ struct custom_setting {
152#define F_PADTITLE 0x800 /* pad the title with spaces to force it to scroll */ 152#define F_PADTITLE 0x800 /* pad the title with spaces to force it to scroll */
153#define F_NO_WRAP 0x1000 /* used if the list should not wrap */ 153#define F_NO_WRAP 0x1000 /* used if the list should not wrap */
154 154
155#define F_BANFROMQS 0x80000000 /* ban the setting from the quickscreen items */
156
155struct settings_list { 157struct settings_list {
156 uint32_t flags; /* ____ _SER TFFF NNN_ _ATW PTVC IFRB STTT */ 158 uint32_t flags; /* B___ _SER TFFF NNN_ _ATW PTVC IFRB STTT */
157 void *setting; 159 void *setting;
158 int lang_id; /* -1 for none */ 160 int lang_id; /* -1 for none */
159 union storage_type default_val; 161 union storage_type default_val;