[Asterisk-code-review] menuselect: Various menuselect enhancements (asterisk[14])

George Joseph asteriskteam at digium.com
Sun Jul 24 18:29:55 CDT 2016


George Joseph has uploaded a new change for review.

  https://gerrit.asterisk.org/3331

Change subject: menuselect:  Various menuselect enhancements
......................................................................

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 <module_prefix>/<module_prefix>.xml file.
* Expand the description field to 3 lines in the ncurses implementation.
* Allow the description field to wrap and scroll in the newt
  implementation.
* Add description field to the gtk implementation.

Change-Id: I7f9600a1984a42ce0696db574c1051bc9ad7c808
---
M Makefile.moddir_rules
M Makefile.rules
M menuselect/menuselect.c
M menuselect/menuselect.h
M menuselect/menuselect_curses.c
M menuselect/menuselect_gtk.c
M menuselect/menuselect_newt.c
7 files changed, 56 insertions(+), 31 deletions(-)


  git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/31/3331/1

diff --git a/Makefile.moddir_rules b/Makefile.moddir_rules
index a92b0d8..db8ce3e 100644
--- a/Makefile.moddir_rules
+++ b/Makefile.moddir_rules
@@ -164,9 +164,10 @@
 	$(AWK) -f $(ASTTOPDIR)/build_tools/get_moduleinfo $^ >> $@
 	echo "</member>" >> $@
 
-.moduleinfo:: $(addsuffix .moduleinfo,$(addprefix .,$(sort $(ALL_C_MODS) $(ALL_CC_MODS))))
+.moduleinfo:: $(addsuffix .moduleinfo,$(addprefix .,$(sort $(ALL_C_MODS) $(ALL_CC_MODS)))) | $(wildcard $(call tolower,$(MENUSELECT_CATEGORY)).xml)
 	@echo "<category name=\"MENUSELECT_$(MENUSELECT_CATEGORY)\" displayname=\"$(MENUSELECT_DESCRIPTION)\" remove_on_change=\"$(SUBDIR)/modules.link\">" > $@
 	@cat $^ >> $@
+	@if [ -f $(call tolower,$(MENUSELECT_CATEGORY)).xml ] ; then cat $(call tolower,$(MENUSELECT_CATEGORY)).xml >> $@ ; fi
 	@echo "</category>" >> $@
 
 moduleinfo: .moduleinfo
diff --git a/Makefile.rules b/Makefile.rules
index a22f19c..45989d6 100644
--- a/Makefile.rules
+++ b/Makefile.rules
@@ -17,6 +17,10 @@
 
 -include $(ASTTOPDIR)/makeopts
 
+# Helpful functions
+# call with $(call function,...)
+tolower = $(shell echo $(1) | tr '[:upper:]' '[:lower:]')
+
 .PHONY: dist-clean
 
 # If 'make' decides to create intermediate files to satisfy a build requirement
diff --git a/menuselect/menuselect.c b/menuselect/menuselect.c
index 6136135..efae311 100644
--- a/menuselect/menuselect.c
+++ b/menuselect/menuselect.c
@@ -246,6 +246,10 @@
 		return SUPPORT_DEPRECATED;
 	}
 
+	if (!strcasecmp(support_level, "external")) {
+		return SUPPORT_EXTERNAL;
+	}
+
 	return SUPPORT_UNSPECIFIED;
 }
 
@@ -259,6 +263,8 @@
 		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 112f1c8..7b3fe26 100644
--- a/menuselect/menuselect.h
+++ b/menuselect/menuselect.h
@@ -105,7 +105,8 @@
 	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 0064592..3baa57a 100644
--- a/menuselect/menuselect_curses.c
+++ b/menuselect/menuselect_curses.c
@@ -194,46 +194,50 @@
 	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 +248,7 @@
 		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 +259,7 @@
 		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 +272,7 @@
 
 	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 cd31b35..9379d7d 100644
--- a/menuselect/menuselect_gtk.c
+++ b/menuselect/menuselect_gtk.c
@@ -16,6 +16,8 @@
 	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 @@
 		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 @@
 				COLUMN_DEPS, dep_buf,
 				COLUMN_USES, use_buf,
 				COLUMN_CNFS, cnf_buf,
+				COLUMN_DESC, mem->displayname,
 				-1);
 		}
 	}
@@ -344,6 +348,11 @@
 				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 fca5587..636d0f3 100644
--- a/menuselect/menuselect_newt.c
+++ b/menuselect/menuselect_newt.c
@@ -326,7 +326,7 @@
 	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 | NEWT_FLAG_SCROLL);
 	dependsLabel            = newtLabel(2, y - 11, "    Depends on:");
 	usesLabel               = newtLabel(2, y - 10, "       Can use:");
 	conflictsLabel          = newtLabel(2, y - 9,  "Conflicts with:");

-- 
To view, visit https://gerrit.asterisk.org/3331
To unsubscribe, visit https://gerrit.asterisk.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I7f9600a1984a42ce0696db574c1051bc9ad7c808
Gerrit-PatchSet: 1
Gerrit-Project: asterisk
Gerrit-Branch: 14
Gerrit-Owner: George Joseph <gjoseph at digium.com>



More information about the asterisk-code-review mailing list