Index: apps/settings.c =================================================================== --- apps/settings.c (revision 18933) +++ apps/settings.c (working copy) @@ -281,6 +281,9 @@ { switch (settings[i].flags&F_T_MASK) { + case F_T_CUSTOM: + settings[i].custom_setting->load_from_cfg(settings[i].setting, value); + break; case F_T_INT: case F_T_UINT: #ifdef HAVE_LCD_COLOR @@ -418,6 +421,9 @@ const struct settings_list *setting = &settings[setting_id]; switch (setting->flags&F_T_MASK) { + case F_T_CUSTOM: + return setting->custom_setting->is_changed(setting->setting, setting->default_val.custom); + break; case F_T_INT: case F_T_UINT: if (setting->flags&F_DEF_ISFUNC) @@ -497,6 +503,10 @@ } switch (settings[i].flags&F_T_MASK) { + case F_T_CUSTOM: + settings[i].custom_setting->write_to_cfg(settings[i].setting, + value, MAX_PATH); + break; case F_T_INT: case F_T_UINT: #ifdef HAVE_LCD_COLOR @@ -951,6 +961,9 @@ { switch (setting->flags&F_T_MASK) { + case F_T_CUSTOM: + setting->custom_setting->set_default(setting->setting, setting->default_val.custom); + break; case F_T_INT: case F_T_UINT: if (setting->flags&F_DEF_ISFUNC) Index: apps/lang/english.lang =================================================================== --- apps/lang/english.lang (revision 18933) +++ apps/lang/english.lang (working copy) @@ -12109,3 +12109,71 @@ *: "Search Results" + + id: LANG_QS_ITEMS + desc: used for the submenu name for the quickscreen items + user: + + *: none + quickscreen: "Quickscreen Items" + + + *: none + quickscreen: "Quickscreen Items" + + + *: none + quickscreen: "Quickscreen Items" + + + + id: LANG_LEFT + desc: used for the submenu name for the quickscreen items + user: + + *: none + quickscreen: "Left" + + + *: none + quickscreen: "Left" + + + *: none + quickscreen: "Left" + + + + id: LANG_RIGHT + desc: used for the submenu name for the quickscreen items + user: + + *: none + quickscreen: "Right" + + + *: none + quickscreen: "Right" + + + *: none + quickscreen: "Right" + + + + id: LANG_BOTTOM + desc: used for the submenu name for the quickscreen items + user: + + *: none + quickscreen: "Bottom" + + + *: none + quickscreen: "Bottom" + + + *: none + quickscreen: "Bottom" + + Index: apps/gui/quickscreen.c =================================================================== --- apps/gui/quickscreen.c (revision 18933) +++ apps/gui/quickscreen.c (working copy) @@ -37,6 +37,7 @@ #include "audio.h" #include "quickscreen.h" #include "talk.h" +#include "list.h" static struct viewport vps[NB_SCREENS][QUICKSCREEN_ITEM_COUNT]; static struct viewport vp_icons[NB_SCREENS]; @@ -111,7 +112,7 @@ { /* scrolling needed */ int center = (parent->width - CENTER_ICONAREA_WIDTH)/2; - int width = MIN(center, MIN(left_width, right_width)); + int width = MAX(center, MIN(left_width, right_width)); vps[screen][QUICKSCREEN_LEFT].width = width; vps[screen][QUICKSCREEN_RIGHT].width = width; vps[screen][QUICKSCREEN_RIGHT].x = parent->x+parent->width - width; @@ -331,23 +332,42 @@ cond_talk_ids_fq(VOICE_OK); return changed; } - +static bool is_setting_quickscreenable(const struct settings_list *setting); bool quick_screen_quick(int button_enter) { struct gui_quickscreen qs; bool oldshuffle = global_settings.playlist_shuffle; int oldrepeat = global_settings.repeat_mode; - qs.items[QUICKSCREEN_LEFT] = + + if (global_settings.qs_item_left != -1 && + global_settings.qs_item_left < nb_settings && + is_setting_quickscreenable(&settings[global_settings.qs_item_left])) + qs.items[QUICKSCREEN_LEFT] = &settings[global_settings.qs_item_left]; + else + qs.items[QUICKSCREEN_LEFT] = find_setting(&global_settings.playlist_shuffle, NULL); - qs.items[QUICKSCREEN_RIGHT] = + + if (global_settings.qs_item_right != -1 && + global_settings.qs_item_right < nb_settings && + is_setting_quickscreenable(&settings[global_settings.qs_item_right])) + qs.items[QUICKSCREEN_RIGHT] = &settings[global_settings.qs_item_right]; + else + qs.items[QUICKSCREEN_RIGHT] = find_setting(&global_settings.repeat_mode, NULL); - qs.items[QUICKSCREEN_BOTTOM] = + + if (global_settings.qs_item_bottom != -1 && + global_settings.qs_item_bottom < nb_settings && + is_setting_quickscreenable(&settings[global_settings.qs_item_bottom])) + qs.items[QUICKSCREEN_BOTTOM] = &settings[global_settings.qs_item_bottom]; + else + qs.items[QUICKSCREEN_BOTTOM] = find_setting(&global_settings.dirfilter, NULL); qs.callback = NULL; if (gui_syncquickscreen_run(&qs, button_enter)) { settings_save(); settings_apply(false); + /* this all shuold be changed to using the settings callbacks */ /* make sure repeat/shuffle/any other nasty ones get updated */ if ( oldrepeat != global_settings.repeat_mode && (audio_status() & AUDIO_STATUS_PLAY) ) @@ -389,3 +409,111 @@ } #endif /* BUTTON_F3 */ +/* stuff to make the quickscreen configurable */ +static bool is_setting_quickscreenable(const struct settings_list *setting) +{ + /* to keep things simple, only settings which have a lang_id set are ok */ + if (setting->lang_id < 0 || (setting->flags&F_BANFROMQS)) + return false; + switch (setting->flags&F_T_MASK) + { + case F_T_BOOL: + return true; + case F_T_INT: + case F_T_UINT: + return (setting->RESERVED != NULL); + default: + return false; + } +} + +const struct settings_list *find_setting_from_index(int index) +{ + int count = -1, i; + const struct settings_list *setting = &settings[0]; + for(i=0;ilang_id), setting->cfg_name); + return buffer; +} +static int quickscreen_setter_speak_item(int selected_item, void * data) +{ + (void)data; + return find_setting_from_index(selected_item)->lang_id; +} +static int quickscreen_setter_action_callback(int action, + struct gui_synclist *lists) +{ + (void)lists; + switch (action) + { + case ACTION_STD_OK: + /* ok, quit */ + return ACTION_STD_CANCEL; + } + return action; +} +int quickscreen_set_option(void *data) +{ + int valid_settings_count = 0; + int i, newval = 0, oldval, *setting = NULL; + struct simplelist_info info; + switch ((intptr_t)data) + { + case QUICKSCREEN_LEFT: + setting = &global_settings.qs_item_left; + break; + case QUICKSCREEN_RIGHT: + setting = &global_settings.qs_item_right; + break; + case QUICKSCREEN_BOTTOM: + setting = &global_settings.qs_item_bottom; + break; + } + oldval = *setting; + for(i=0;icfg_name && !strcmp(setting->cfg_name, name)) + { + return i; + } + i++; + } + return -1; +} +void qs_load_from_cfg(void* var, char*value) +{ + *(int*)var = find_setting_by_name(value); +} +char* qs_write_to_cfg(void* setting, char*buf, int buf_len) +{ + const struct settings_list *var = &settings[*(int*)setting]; + strncpy(buf, var->cfg_name, buf_len); + return buf; +} +bool qs_is_changed(void* setting, void* defaultval) +{ + int i = *(int*)setting; + if (i < 0 || i >= nb_settings) + return false; + const struct settings_list *var = &settings[i]; + return var != find_setting(defaultval, NULL); +} +void qs_set_default(void* setting, void* defaultval) +{ + find_setting(defaultval, (int*)setting); +} +#endif const struct settings_list settings[] = { /* sound settings */ SOUND_SETTING(F_NO_WRAP,volume, LANG_VOLUME, "volume", SOUND_VOLUME), @@ -1364,6 +1411,20 @@ "touchpad sensitivity", "normal,high", touchpad_set_sensitivity, 2, ID2P(LANG_NORMAL), ID2P(LANG_HIGH)), #endif +#ifdef HAVE_QUICKSCREEN + CUSTOM_SETTING(0, qs_item_left, LANG_LEFT, + &global_settings.playlist_shuffle, "qs left", + qs_load_from_cfg, qs_write_to_cfg, + qs_is_changed, qs_set_default), + CUSTOM_SETTING(0, qs_item_right, LANG_RIGHT, + &global_settings.repeat_mode, "qs right", + qs_load_from_cfg, qs_write_to_cfg, + qs_is_changed, qs_set_default), + CUSTOM_SETTING(0, qs_item_bottom, LANG_BOTTOM, + &global_settings.dirfilter, "qs bottom", + qs_load_from_cfg, qs_write_to_cfg, + qs_is_changed, qs_set_default), +#endif }; const int nb_settings = sizeof(settings)/sizeof(*settings); Index: apps/settings_list.h =================================================================== --- apps/settings_list.h (revision 18933) +++ apps/settings_list.h (working copy) @@ -35,6 +35,7 @@ char *charptr; unsigned char *ucharptr; _isfunc_type func; + void* custom; }; /* the variable type for the setting */ #define F_T_INT 1 @@ -42,6 +43,7 @@ #define F_T_BOOL 3 #define F_T_CHARPTR 4 #define F_T_UCHARPTR 5 +#define F_T_CUSTOM 6 /* MUST use struct custom_setting below */ #define F_T_MASK 0x7 struct sound_setting { @@ -104,6 +106,14 @@ #define F_MAX_ISFUNC 0x200000 /* max(above) is function pointer to above type */ #define F_DEF_ISFUNC 0x400000 /* default_val is function pointer to above type */ +#define F_CUSTOM_SETTING 0x8000 +struct custom_setting { + void (*load_from_cfg)(void* setting, char*value); + char* (*write_to_cfg)(void* setting, char*buf, int buf_len); + bool (*is_changed)(void* setting, void* defaultval); + void (*set_default)(void* setting, void* defaultval); +}; + #define F_THEMESETTING 0x0800000 #define F_RECSETTING 0x1000000 #define F_EQSETTING 0x2000000 @@ -121,8 +131,9 @@ #define F_PADTITLE 0x800 /* pad the title with spaces to force it to scroll */ #define F_NO_WRAP 0x1000 /* used if the list should not wrap */ +#define F_BANFROMQS 0x80000000 /* ban the setting from the quickscreen items */ struct settings_list { - uint32_t flags; /* ____ _SER TFFF NNN_ _ATW PTVC IFRB STTT */ + uint32_t flags; /* B___ _SER TFFF NNN_ CATW PTVC IFRB STTT */ void *setting; int lang_id; /* -1 for none */ union storage_type default_val; @@ -137,6 +148,7 @@ const struct int_setting *int_setting; /* use F_INT_SETTING */ const struct choice_setting *choice_setting; /* F_CHOICE_SETTING */ const struct table_setting *table_setting; /* F_TABLE_SETTING */ + const struct custom_setting *custom_setting; }; }; const struct settings_list* get_settings_list(int*count);