From b4c5dcad014909310dd7a5b6112ca3c9fbb8692c Mon Sep 17 00:00:00 2001 From: George Joseph Date: Sun, 24 Jul 2016 17:27:26 -0600 Subject: menuselect: Various menuselect enhancements * Add 'external' as a support level. * Add ability for module directories to add entries to the menu by adding members to the /.xml file. * Expand the description field to 3 lines in the ncurses implementation. * Allow the description field to wrap in the newt implementation. * Add description field to the gtk implementation. Change-Id: I7f9600a1984a42ce0696db574c1051bc9ad7c808 --- menuselect/menuselect.c | 6 +++++ menuselect/menuselect.h | 3 ++- menuselect/menuselect_curses.c | 61 ++++++++++++++++++++++-------------------- menuselect/menuselect_gtk.c | 11 +++++++- menuselect/menuselect_newt.c | 2 +- 5 files changed, 51 insertions(+), 32 deletions(-) (limited to 'menuselect') diff --git a/menuselect/menuselect.c b/menuselect/menuselect.c index 6136135aa..efae311bb 100644 --- a/menuselect/menuselect.c +++ b/menuselect/menuselect.c @@ -246,6 +246,10 @@ static enum support_level_values string_to_support_level(const char *support_lev return SUPPORT_DEPRECATED; } + if (!strcasecmp(support_level, "external")) { + return SUPPORT_EXTERNAL; + } + return SUPPORT_UNSPECIFIED; } @@ -259,6 +263,8 @@ static const char *support_level_to_string(enum support_level_values support_lev return "Extended"; case SUPPORT_DEPRECATED: return "Deprecated"; + case SUPPORT_EXTERNAL: + return "External"; default: return "Unspecified"; } diff --git a/menuselect/menuselect.h b/menuselect/menuselect.h index 112f1c88c..7b3fe2656 100644 --- a/menuselect/menuselect.h +++ b/menuselect/menuselect.h @@ -105,7 +105,8 @@ enum support_level_values { SUPPORT_EXTENDED = 1, SUPPORT_DEPRECATED = 2, SUPPORT_UNSPECIFIED = 3, - SUPPORT_COUNT = 4, /* Keep this item at the end of the list. Tracks total number of support levels. */ + SUPPORT_EXTERNAL = 4, + SUPPORT_COUNT = 5, /* Keep this item at the end of the list. Tracks total number of support levels. */ }; AST_LIST_HEAD_NOLOCK(support_level_bucket, member); diff --git a/menuselect/menuselect_curses.c b/menuselect/menuselect_curses.c index 00645927a..e79957485 100644 --- a/menuselect/menuselect_curses.c +++ b/menuselect/menuselect_curses.c @@ -194,46 +194,49 @@ static void display_mem_info(WINDOW *menu, struct member *mem, int start_y, int int start_x = (max_x / 2 - MEMBER_INFO_LEFT_ADJ); int maxlen = (max_x - start_x); - wmove(menu, end - start_y + 1, start_x); + wmove(menu, end - start_y + 1, 0); wclrtoeol(menu); - wmove(menu, end - start_y + 2, start_x); + wmove(menu, end - start_y + 2, 0); wclrtoeol(menu); - wmove(menu, end - start_y + 3, start_x); + wmove(menu, end - start_y + 3, 0); wclrtoeol(menu); - wmove(menu, end - start_y + 4, start_x); + wmove(menu, end - start_y + 4, 0); wclrtoeol(menu); - wmove(menu, end - start_y + 5, start_x); + wmove(menu, end - start_y + 5, 0); wclrtoeol(menu); - wmove(menu, end - start_y + 6, start_x); + wmove(menu, end - start_y + 6, 0); + wclrtoeol(menu); + wmove(menu, end - start_y + 7, 0); wclrtoeol(menu); if (mem->displayname) { - int name_len = strlen(mem->displayname); + char buf[maxlen + 1]; + char *displayname = strdupa(mem->displayname); + char *word; + int current_line = 1; + int new_line = 1; + buf[0] = '\0'; wmove(menu, end - start_y + 1, start_x); - if (name_len > maxlen) { - char *last_space; - char *line_1 = strdup(mem->displayname); - - if (line_1) { - line_1[maxlen] = '\0'; - last_space = strrchr(line_1, ' '); - if (last_space) { - *last_space = '\0'; - } - waddstr(menu, line_1); - wmove(menu, end - start_y + 2, start_x); - waddstr(menu, &mem->displayname[last_space - line_1]); - free(line_1); - } else { - waddstr(menu, (char *) mem->displayname); + + while ((word = strsep(&displayname, " "))) { + if ((strlen(buf) + strlen(word) + 1) > maxlen) { + waddstr(menu, buf); + current_line++; + wmove(menu, end - start_y + current_line, start_x); + buf[0] = '\0'; + new_line = 1; } - } else { - waddstr(menu, (char *) mem->displayname); + sprintf(buf, "%s%*.*s%s", buf, new_line ? 0 : 1, new_line ? 0 : 1, " ", word); + new_line = 0; + } + if (strlen(buf)) { + waddstr(menu, buf); } } + if (!AST_LIST_EMPTY(&mem->deps)) { - wmove(menu, end - start_y + 3, start_x); + wmove(menu, end - start_y + 4, start_x); strcpy(buf, "Depends on: "); AST_LIST_TRAVERSE(&mem->deps, dep, list) { strncat(buf, dep->displayname, sizeof(buf) - strlen(buf) - 1); @@ -244,7 +247,7 @@ static void display_mem_info(WINDOW *menu, struct member *mem, int start_y, int waddstr(menu, buf); } if (!AST_LIST_EMPTY(&mem->uses)) { - wmove(menu, end - start_y + 4, start_x); + wmove(menu, end - start_y + 5, start_x); strcpy(buf, "Can use: "); AST_LIST_TRAVERSE(&mem->uses, use, list) { strncat(buf, use->displayname, sizeof(buf) - strlen(buf) - 1); @@ -255,7 +258,7 @@ static void display_mem_info(WINDOW *menu, struct member *mem, int start_y, int waddstr(menu, buf); } if (!AST_LIST_EMPTY(&mem->conflicts)) { - wmove(menu, end - start_y + 5, start_x); + wmove(menu, end - start_y + 6, start_x); strcpy(buf, "Conflicts with: "); AST_LIST_TRAVERSE(&mem->conflicts, con, list) { strncat(buf, con->displayname, sizeof(buf) - strlen(buf) - 1); @@ -268,7 +271,7 @@ static void display_mem_info(WINDOW *menu, struct member *mem, int start_y, int if (!mem->is_separator) { /* Separators lack support levels */ { /* support level */ - wmove(menu, end - start_y + 6, start_x); + wmove(menu, end - start_y + 7, start_x); snprintf(buf, sizeof(buf), "Support Level: %s", mem->support_level); if (mem->replacement && *mem->replacement) { char buf2[64]; diff --git a/menuselect/menuselect_gtk.c b/menuselect/menuselect_gtk.c index cd31b3580..9379d7de6 100644 --- a/menuselect/menuselect_gtk.c +++ b/menuselect/menuselect_gtk.c @@ -16,6 +16,8 @@ enum { COLUMN_USES, /*! Conflicts */ COLUMN_CNFS, + /*! Description */ + COLUMN_DESC, /*! Number of columns, must be the last element in the enum */ NUM_COLUMNS, }; @@ -254,7 +256,8 @@ int run_menu(void) G_TYPE_BOOLEAN, /* COLUMN_SELECTED */ G_TYPE_STRING, /* COLUMN_DEPS */ G_TYPE_STRING, /* COLUMN_USES */ - G_TYPE_STRING); /* COLUMN_CNFS */ + G_TYPE_STRING, /* COLUMN_CNFS */ + G_TYPE_STRING); /* COLUMN_DESC */ AST_LIST_TRAVERSE(&categories, cat, list) { GtkTreeIter iter, iter2; @@ -307,6 +310,7 @@ int run_menu(void) COLUMN_DEPS, dep_buf, COLUMN_USES, use_buf, COLUMN_CNFS, cnf_buf, + COLUMN_DESC, mem->displayname, -1); } } @@ -344,6 +348,11 @@ int run_menu(void) renderer, "text", COLUMN_CNFS, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes("Description", + renderer, "text", COLUMN_DESC, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); + g_signal_connect(tree, "row-activated", (GCallback) row_activated_handler, store); gtk_container_add(GTK_CONTAINER(s_window), GTK_WIDGET(tree)); diff --git a/menuselect/menuselect_newt.c b/menuselect/menuselect_newt.c index fca558781..bc03f9b1b 100644 --- a/menuselect/menuselect_newt.c +++ b/menuselect/menuselect_newt.c @@ -326,7 +326,7 @@ int run_menu(void) newtFormAddComponent(form, subOptions); newtComponentAddCallback(subOptions, category_menu_callback, NULL); - memberNameTextbox = newtTextbox(2, y - 13, x - 10, 1, 0); + memberNameTextbox = newtTextbox(2, y - 13, x - 10, 2, NEWT_FLAG_WRAP); dependsLabel = newtLabel(2, y - 11, " Depends on:"); usesLabel = newtLabel(2, y - 10, " Can use:"); conflictsLabel = newtLabel(2, y - 9, "Conflicts with:"); -- cgit v1.2.3