summaryrefslogtreecommitdiff
path: root/apps/plugins
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2014-02-13 22:01:13 +1100
committerJonathan Gordon <rockbox@jdgordon.info>2014-02-13 22:11:23 +1100
commit6dbfd44b6e6a4e01066ff3a99748e586d7cd458a (patch)
tree0570c0dbe96277cb8e31a6797b3b8628aea1e5b0 /apps/plugins
parent1210de217ebdbd35734f57d82a6e935ef60e6555 (diff)
downloadrockbox-6dbfd44b6e6a4e01066ff3a99748e586d7cd458a.zip
rockbox-6dbfd44b6e6a4e01066ff3a99748e586d7cd458a.tar.gz
rockbox-6dbfd44b6e6a4e01066ff3a99748e586d7cd458a.tar.bz2
rockbox-6dbfd44b6e6a4e01066ff3a99748e586d7cd458a.tar.xz
main_menu_config: New plugin to configur the main menu order
Plugins/Applications/main_menu_config allows you to edit the main menu order without having to manually edit config.cfg. Press the standard OK button to access the internal menu which allows you to move items up/down in the order and toggle their visibility. Exit via this menu to have the order saved. (Suggestions welcome to improve this UI) Change-Id: I59715ef1ca265aeb6f9666ef27026bc1093f2579
Diffstat (limited to 'apps/plugins')
-rw-r--r--apps/plugins/CATEGORIES1
-rw-r--r--apps/plugins/SOURCES1
-rw-r--r--apps/plugins/main_menu_config.c204
3 files changed, 206 insertions, 0 deletions
diff --git a/apps/plugins/CATEGORIES b/apps/plugins/CATEGORIES
index 54a316e..8a849aa 100644
--- a/apps/plugins/CATEGORIES
+++ b/apps/plugins/CATEGORIES
@@ -48,6 +48,7 @@ logo,demos
lrcplayer,apps
lua,viewers
fractals,demos
+main_menu_config,apps
matrix,demos
maze,games
mazezam,games
diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES
index c512a9e..59bd402 100644
--- a/apps/plugins/SOURCES
+++ b/apps/plugins/SOURCES
@@ -11,6 +11,7 @@ keybox.c
logo.c
lrcplayer.c
mosaique.c
+main_menu_config.c
properties.c
random_folder_advance_config.c
rockblox.c
diff --git a/apps/plugins/main_menu_config.c b/apps/plugins/main_menu_config.c
new file mode 100644
index 0000000..da9fde8
--- /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;
+}