summaryrefslogtreecommitdiffstats
path: root/apps/gui/quickscreen.c
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 /apps/gui/quickscreen.c
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
Diffstat (limited to 'apps/gui/quickscreen.c')
-rw-r--r--apps/gui/quickscreen.c164
1 files changed, 156 insertions, 8 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 @@
#include "audio.h"
#include "quickscreen.h"
#include "talk.h"
+#include "list.h"
+#include "splash.h"
static struct viewport vps[NB_SCREENS][QUICKSCREEN_ITEM_COUNT];
static struct viewport vp_icons[NB_SCREENS];
@@ -113,7 +115,7 @@ static void quickscreen_fix_viewports(struct gui_quickscreen *qs,
vps[screen][QUICKSCREEN_RIGHT].width = width;
/* shrink the icons vp by a few pixels if there is room so the arrows
- arnt' drawn right next to the text */
+ aren't drawn right next to the text */
if (vp_icons[screen].width > CENTER_ICONAREA_WIDTH+8)
{
vp_icons[screen].width -= 8;
@@ -320,18 +322,31 @@ bool gui_syncquickscreen_run(struct gui_quickscreen * qs, int button_enter)
cond_talk_ids_fq(VOICE_OK);
return changed;
}
-
+static bool is_setting_quickscreenable(const struct settings_list *setting);
+static inline const struct settings_list *get_setting(int gs_value,
+ const struct settings_list *defaultval)
+{
+ if (gs_value != -1 && gs_value < nb_settings &&
+ is_setting_quickscreenable(&settings[gs_value]))
+ return &settings[gs_value];
+ return defaultval;
+}
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] =
- find_setting(&global_settings.playlist_shuffle, NULL);
- qs.items[QUICKSCREEN_RIGHT] =
- find_setting(&global_settings.repeat_mode, NULL);
- qs.items[QUICKSCREEN_BOTTOM] =
- find_setting(&global_settings.dirfilter, NULL);
+
+ qs.items[QUICKSCREEN_LEFT] =
+ get_setting(global_settings.qs_item_left,
+ find_setting(&global_settings.playlist_shuffle, NULL));
+ qs.items[QUICKSCREEN_RIGHT] =
+ get_setting(global_settings.qs_item_right,
+ find_setting(&global_settings.repeat_mode, NULL));
+ qs.items[QUICKSCREEN_BOTTOM] =
+ get_setting(global_settings.qs_item_bottom,
+ find_setting(&global_settings.dirfilter, NULL));
+
qs.callback = NULL;
if (gui_syncquickscreen_run(&qs, button_enter))
{
@@ -378,3 +393,136 @@ bool quick_screen_f3(int button_enter)
}
#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;i<nb_settings;i++)
+ {
+ setting = &settings[i];
+ if (is_setting_quickscreenable(setting))
+ count++;
+ if (count == index)
+ return setting;
+ }
+ return NULL;
+}
+static char* quickscreen_setter_getname(int selected_item, void *data,
+ char *buffer, size_t buffer_len)
+{
+ (void)data;
+ const struct settings_list *setting = find_setting_from_index(selected_item);
+ snprintf(buffer, buffer_len, "%s (%s)",
+ str(setting->lang_id), setting->cfg_name);
+ return buffer;
+}
+static int quickscreen_setter_speak_item(int selected_item, void * data)
+{
+ (void)data;
+ talk_id(find_setting_from_index(selected_item)->lang_id, true);
+ return 0;
+}
+static int quickscreen_setter_action_callback(int action,
+ struct gui_synclist *lists)
+{
+ const struct settings_list *temp = lists->data;
+ switch (action)
+ {
+ case ACTION_STD_OK:
+ /* ok, quit */
+ return ACTION_STD_CANCEL;
+ case ACTION_STD_CONTEXT: /* real settings use this to reset to default */
+ {
+ int i=0, count=0;
+ reset_setting(temp, temp->setting);
+ for(i=0;i<nb_settings;i++)
+ {
+ if (is_setting_quickscreenable(&settings[i]))
+ count++;
+ if (*(int*)temp->setting == i)
+ {
+ gui_synclist_select_item(lists, count-1);
+ break;
+ }
+ }
+ return ACTION_REDRAW;
+ }
+ }
+ 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;i<nb_settings;i++)
+ {
+ if (is_setting_quickscreenable(&settings[i]))
+ valid_settings_count++;
+ if (oldval == i)
+ newval = valid_settings_count - 1;
+ }
+
+ simplelist_info_init(&info, str(LANG_QS_ITEMS),
+ valid_settings_count,
+ (void*)find_setting(setting, NULL)); /* find the qs item being changed */
+ info.get_name = quickscreen_setter_getname;
+ if(global_settings.talk_menu)
+ info.get_talk = quickscreen_setter_speak_item;
+ info.action_callback = quickscreen_setter_action_callback;
+ info.selection = newval;
+ simplelist_show_list(&info);
+ if (info.selection != oldval)
+ {
+ if (info.selection != -1)
+ {
+ const struct settings_list *temp = find_setting_from_index(info.selection);
+ int i = 0;
+ for(i=0;i<nb_settings;i++)
+ {
+ if (&settings[i] == temp)
+ break;
+ }
+ *setting = i;
+ settings_save();
+ }
+ /* probably should splash LANG_CANCEL here but right now
+ we cant find out the selection when the cancel button was
+ pressed, (without hacks)so we cant know if the
+ selection was changed, or just viewed */
+ }
+ return 0;
+}
+
+