summaryrefslogtreecommitdiff
path: root/apps/plugins/main_menu_config.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/main_menu_config.c')
-rw-r--r--apps/plugins/main_menu_config.c204
1 files changed, 204 insertions, 0 deletions
diff --git a/apps/plugins/main_menu_config.c b/apps/plugins/main_menu_config.c
new file mode 100644
index 0000000000..da9fde8384
--- /dev/null
+++ b/apps/plugins/main_menu_config.c
@@ -0,0 +1,204 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ *
+ * Copyright (C) 2014 Jonathan Gordon
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+/* mandatory include for all plugins */
+#include "plugin.h"
+
+static struct menu_table *menu_table;
+static int menu_item_count;
+
+#define MAX_ITEM_NAME 64
+#define MAX_ITEMS 16
+struct items
+{
+ char string[MAX_ITEM_NAME];
+ bool enabled;
+};
+
+static struct items menu_items[MAX_ITEMS];
+
+
+static const char * menu_get_name(int selected_item, void * data,
+ char * buffer, size_t buffer_len)
+{
+ (void)data;
+ (void)buffer;
+ (void)buffer_len;
+
+ return menu_items[selected_item].string;
+}
+
+static enum themable_icons menu_get_icon(int selected_item, void * data)
+{
+ (void)data;
+
+ return menu_items[selected_item].enabled ? Icon_Config : Icon_NOICON;
+}
+
+void load_from_cfg(void)
+{
+ char config_str[128];
+ char *token, *save;
+ int done = 0;
+ int i = 0;
+ bool found = false;
+
+ rb->root_menu_write_to_cfg(NULL, config_str, sizeof(config_str));
+
+ token = strtok_r(config_str, ", ", &save);
+
+ while (token)
+ {
+ i = 0;
+ found = false;
+ for (i = 0, found = false; i < menu_item_count && !found; i++)
+ {
+ found = rb->strcmp(token, menu_table[i].string) == 0;
+ }
+ if (found)
+ {
+ rb->strcpy(menu_items[done].string, token);
+ menu_items[done].enabled = true;
+ done++;
+ }
+ token = strtok_r(NULL, ", ", &save);
+ }
+
+ if (done < menu_item_count)
+ {
+ for (i = 0; i < menu_item_count; i++)
+ {
+ found = false;
+ for (int j = 0; !found && j < done; j++)
+ {
+ found = rb->strcmp(menu_table[i].string, menu_items[j].string) == 0;
+ }
+
+ if (!found)
+ {
+ rb->strcpy(menu_items[done].string, menu_table[i].string);
+ menu_items[done].enabled = false;
+ done++;
+ }
+ }
+ }
+}
+
+static void save_to_cfg(void)
+{
+ char out[128];
+ int i, j = 0;
+
+ out[0] = '\0';
+ for (i = 0; i < menu_item_count; i++)
+ {
+ if (menu_items[i].enabled)
+ {
+ j += rb->snprintf(&out[j],sizeof(out) - j, "%s, ", menu_items[i].string);
+ }
+ }
+
+ rb->root_menu_load_from_cfg(&rb->global_settings->root_menu_customized, out);
+}
+
+static void swap_items(int a, int b)
+{
+ char temp[MAX_ITEM_NAME];
+ bool enabled;
+
+ rb->strcpy(temp, menu_items[a].string);
+ enabled = menu_items[a].enabled;
+ rb->strcpy(menu_items[a].string,
+ menu_items[b].string);
+ menu_items[a].enabled = menu_items[b].enabled;
+ rb->strcpy(menu_items[b].string, temp);
+ menu_items[b].enabled = enabled;
+}
+
+/* this is the plugin entry point */
+enum plugin_status plugin_start(const void* parameter)
+{
+ (void)parameter;
+ struct gui_synclist list;
+ bool done = false;
+ int action, cur_sel;
+
+ menu_table = rb->root_menu_get_options(&menu_item_count);
+ load_from_cfg();
+
+ rb->gui_synclist_init(&list, menu_get_name, NULL, false, 1, NULL);
+ rb->gui_synclist_set_icon_callback(&list, menu_get_icon);
+ rb->gui_synclist_set_nb_items(&list, menu_item_count);
+ rb->gui_synclist_set_title(&list, "Rockbox Main Menu Order", Icon_Rockbox);
+
+ while (!done)
+ {
+ rb->gui_synclist_draw(&list);
+ cur_sel = rb->gui_synclist_get_sel_pos(&list);
+ action = rb->get_action(CONTEXT_LIST,TIMEOUT_BLOCK);
+ if (rb->gui_synclist_do_button(&list,&action,LIST_WRAP_UNLESS_HELD))
+ continue;
+
+ switch (action)
+ {
+ case ACTION_STD_OK:
+ {
+ MENUITEM_STRINGLIST(menu, "Main Menu Editor", NULL,
+ "Toggle Item",
+ "Move Item Up", "Move Item down",
+ "----------",
+ "Load Default Configuration", "Exit");
+ switch (rb->do_menu(&menu, NULL, NULL, false))
+ {
+ case 0:
+ menu_items[cur_sel].enabled = !menu_items[cur_sel].enabled;
+ break;
+ case 1:
+ if (cur_sel == 0)
+ break;
+ swap_items(cur_sel, cur_sel - 1);
+ break;
+ case 2:
+ if (cur_sel + 1 == menu_item_count)
+ break;
+ swap_items(cur_sel, cur_sel + 1);
+ break;
+ case 4:
+ rb->root_menu_set_default(&rb->global_settings->root_menu_customized, NULL);
+ load_from_cfg();
+ break;
+ case 5:
+ done = true;
+ save_to_cfg();
+ rb->global_settings->root_menu_customized = true;
+ rb->settings_save();
+ break;
+ }
+ break;
+ }
+ case ACTION_STD_CANCEL:
+ done = true;
+ break;
+ }
+ }
+
+
+ return PLUGIN_OK;
+}