[Bf-blender-cvs] [873f901] master: UI: improve reports popup

Campbell Barton noreply at git.blender.org
Sun Feb 9 02:34:16 CET 2014


Commit: 873f901e5a3d0d10c4cca579ce1f2aaed852b1e8
Author: Campbell Barton
Date:   Sun Feb 9 12:00:03 2014 +1100
https://developer.blender.org/rB873f901e5a3d0d10c4cca579ce1f2aaed852b1e8

UI: improve reports popup

- use labels rather then menu items (items selected but did nothing)
- each report gets its own icon (icons besides first were ignored)
- use uiPupMenu rather then string based menu.

===================================================================

M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/interface/interface_regions.c
M	source/blender/editors/interface/interface_templates.c
M	source/blender/editors/interface/interface_utils.c

===================================================================

diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 754beb5..a0a2fde 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -350,7 +350,7 @@ struct uiLayout *uiPupMenuLayout(uiPopupMenu *head);
 
 void uiPupMenuOkee(struct bContext *C, const char *opname, const char *str, ...) ATTR_PRINTF_FORMAT(3, 4);
 void uiPupMenuSaveOver(struct bContext *C, struct wmOperator *op, const char *filename);
-void uiPupMenuReports(struct bContext *C, struct ReportList *reports);
+void uiPupMenuReports(struct bContext *C, struct ReportList *reports) ATTR_NONNULL();
 void uiPupMenuInvoke(struct bContext *C, const char *idname); /* popup registered menu */
 
 /* Popup Blocks
@@ -578,6 +578,7 @@ void uiButGetStrInfo(struct bContext *C, uiBut *but, ...) ATTR_SENTINEL(0);
 #define UI_ID_FULL          (UI_ID_RENAME | UI_ID_BROWSE | UI_ID_ADD_NEW | UI_ID_OPEN | UI_ID_ALONE | UI_ID_DELETE | UI_ID_LOCAL)
 
 int uiIconFromID(struct ID *id);
+int uiIconFromReportType(int type);
 
 uiBut *uiDefPulldownBut(uiBlock *block, uiBlockCreateFunc func, void *arg, const char *str, int x, int y, short width, short height, const char *tip);
 uiBut *uiDefMenuBut(uiBlock *block, uiMenuCreateFunc func, void *arg, const char *str, int x, int y, short width, short height, const char *tip);
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index c6ebdc7..f1a03bc 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -2690,37 +2690,50 @@ void uiPupMenuSaveOver(bContext *C, wmOperator *op, const char *filename)
 void uiPupMenuReports(bContext *C, ReportList *reports)
 {
 	Report *report;
-	DynStr *ds;
-	char *str;
 
-	if (!reports || !reports->list.first)
-		return;
+	uiPopupMenu *pup = NULL;
+	uiLayout *layout;
+
 	if (!CTX_wm_window(C))
 		return;
 
-	ds = BLI_dynstr_new();
-
 	for (report = reports->list.first; report; report = report->next) {
+		int icon;
+		const char *msg, *msg_next;
+
 		if (report->type < reports->printlevel) {
-			/* pass */
-		}
-		else if (report->type >= RPT_ERROR) {
-			BLI_dynstr_appendf(ds, IFACE_("Error %%i%d%%t|%s"), ICON_ERROR, report->message);
-		}
-		else if (report->type >= RPT_WARNING) {
-			BLI_dynstr_appendf(ds, IFACE_("Warning %%i%d%%t|%s"), ICON_ERROR, report->message);
+			continue;
 		}
-		else if (report->type >= RPT_INFO) {
-			BLI_dynstr_appendf(ds, IFACE_("Info %%i%d%%t|%s"), ICON_INFO, report->message);
+
+		if (pup == NULL) {
+			char title[UI_MAX_DRAW_STR];
+			BLI_snprintf(title, sizeof(title), "%s: %s", IFACE_("Report"), report->typestr);
+			pup = uiPupMenuBegin(C, title, ICON_NONE);
+			layout = uiPupMenuLayout(pup);
 		}
+		else {
+			uiItemS(layout);
+		}
+
+		/* split each newline into a label */
+		msg = report->message;
+		icon = uiIconFromReportType(report->type);
+		do {
+			char buf[UI_MAX_DRAW_STR];
+			msg_next = strchr(msg, '\n');
+			if (msg_next) {
+				msg_next++;
+				BLI_strncpy(buf, msg, MIN2(sizeof(buf), msg_next - msg));
+				msg = buf;
+			}
+			uiItemL(layout, msg, icon);
+			icon = ICON_NONE;
+		} while ((msg = msg_next) && *msg);
 	}
 
-	str = BLI_dynstr_get_cstring(ds);
-	if (str[0] != '\0')
-		ui_popup_menu_create(C, NULL, NULL, NULL, NULL, str);
-	MEM_freeN(str);
-
-	BLI_dynstr_free(ds);
+	if (pup) {
+		uiPupMenuEnd(C, pup);
+	}
 }
 
 void uiPupMenuInvoke(bContext *C, const char *idname)
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index c2076f9..35733eb 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -1,5 +1,4 @@
 /*
-
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
  * This program is free software; you can redistribute it and/or
@@ -3285,7 +3284,7 @@ void uiTemplateReportsBanner(uiLayout *layout, bContext *C)
 	uiBut *but;
 	uiStyle *style = UI_GetStyle();
 	int width;
-	int icon = 0;
+	int icon;
 	
 	/* if the report display has timed out, don't show */
 	if (!reports->reporttimer) return;
@@ -3317,12 +3316,7 @@ void uiTemplateReportsBanner(uiLayout *layout, bContext *C)
 	
 	
 	/* icon and report message on top */
-	if (report->type & RPT_ERROR_ALL)
-		icon = ICON_ERROR;
-	else if (report->type & RPT_WARNING_ALL)
-		icon = ICON_ERROR;
-	else if (report->type & RPT_INFO_ALL)
-		icon = ICON_INFO;
+	icon = uiIconFromReportType(report->type);
 	
 	/* XXX: temporary operator to dump all reports to a text block, but only if more than 1 report 
 	 * to be shown instead of icon when appropriate...
diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c
index ed4852b..fa6eef4 100644
--- a/source/blender/editors/interface/interface_utils.c
+++ b/source/blender/editors/interface/interface_utils.c
@@ -44,6 +44,7 @@
 #include "BLF_translation.h"
 
 #include "BKE_context.h"
+#include "BKE_report.h"
 
 #include "MEM_guardedalloc.h"
 
@@ -231,6 +232,19 @@ int uiIconFromID(ID *id)
 	return (ptr.type) ? RNA_struct_ui_icon(ptr.type) : ICON_NONE;
 }
 
+/* see: report_type_str */
+int uiIconFromReportType(int type)
+{
+	if (type & RPT_ERROR_ALL)
+		return ICON_ERROR;
+	else if (type & RPT_WARNING_ALL)
+		return ICON_ERROR;
+	else if (type & RPT_INFO_ALL)
+		return ICON_INFO;
+	else
+		return ICON_NONE;
+}
+
 /********************************** Misc **************************************/
 
 /**




More information about the Bf-blender-cvs mailing list