[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [39103] trunk/blender/source/blender/ editors/interface/interface.c: make ui_def_but_rna into 2 functions, once which takes a prop, another which takes a propname, no functional change yet but lets us avoid duplicate hash lookups.

Campbell Barton ideasman42 at gmail.com
Sat Aug 6 16:57:56 CEST 2011


Revision: 39103
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39103
Author:   campbellbarton
Date:     2011-08-06 14:57:55 +0000 (Sat, 06 Aug 2011)
Log Message:
-----------
make ui_def_but_rna into 2 functions, once which takes a prop, another which takes a propname, no functional change yet but lets us avoid duplicate hash lookups.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/interface/interface.c

Modified: trunk/blender/source/blender/editors/interface/interface.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface.c	2011-08-06 14:52:45 UTC (rev 39102)
+++ trunk/blender/source/blender/editors/interface/interface.c	2011-08-06 14:57:55 UTC (rev 39103)
@@ -2490,138 +2490,141 @@
 	return but;
 }
 
-static uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2,  const char *tip)
+/* ui_def_but_rna_propname and ui_def_but_rna
+ * both take the same args except for propname vs prop, this is done so we can
+ * avoid an extra lookup on 'prop' when its already available.
+ *
+ * When this kind of change won't disrupt branches, best look into making more
+ * of our UI functions take prop rather then propname.
+ */
+
+#define UI_DEF_BUT_RNA_DISABLE(but) \
+	but->flag |= UI_BUT_DISABLED; \
+	but->lock = 1; \
+	but->lockstr = ""
+
+
+static uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, PointerRNA *ptr, PropertyRNA *prop, int index, float min, float max, float a1, float a2,  const char *tip)
 {
 	uiBut *but;
-	PropertyRNA *prop;
 	PropertyType proptype;
 	int freestr= 0, icon= 0;
 
-	prop= RNA_struct_find_property(ptr, propname);
+	proptype= RNA_property_type(prop);
 
-	if(prop) {
-		proptype= RNA_property_type(prop);
+	/* use rna values if parameters are not specified */
+	if(!str) {
+		if(type == MENU && proptype == PROP_ENUM) {
+			EnumPropertyItem *item;
+			DynStr *dynstr;
+			int i, totitem, value, free;
 
-		/* use rna values if parameters are not specified */
-		if(!str) {
-			if(type == MENU && proptype == PROP_ENUM) {
-				EnumPropertyItem *item;
-				DynStr *dynstr;
-				int i, totitem, value, free;
+			RNA_property_enum_items(block->evil_C, ptr, prop, &item, &totitem, &free);
+			value= RNA_property_enum_get(ptr, prop);
 
-				RNA_property_enum_items(block->evil_C, ptr, prop, &item, &totitem, &free);
-				value= RNA_property_enum_get(ptr, prop);
-
-				dynstr= BLI_dynstr_new();
-				BLI_dynstr_appendf(dynstr, "%s%%t", RNA_property_ui_name(prop));
-				for(i=0; i<totitem; i++) {
-					if(!item[i].identifier[0]) {
-						if(item[i].name)
-							BLI_dynstr_appendf(dynstr, "|%s%%l", item[i].name);
-						else
-							BLI_dynstr_append(dynstr, "|%l");
-					}
-					else if(item[i].icon)
-						BLI_dynstr_appendf(dynstr, "|%s %%i%d %%x%d", item[i].name, item[i].icon, item[i].value);
+			dynstr= BLI_dynstr_new();
+			BLI_dynstr_appendf(dynstr, "%s%%t", RNA_property_ui_name(prop));
+			for(i=0; i<totitem; i++) {
+				if(!item[i].identifier[0]) {
+					if(item[i].name)
+						BLI_dynstr_appendf(dynstr, "|%s%%l", item[i].name);
 					else
-						BLI_dynstr_appendf(dynstr, "|%s %%x%d", item[i].name, item[i].value);
+						BLI_dynstr_append(dynstr, "|%l");
+				}
+				else if(item[i].icon)
+					BLI_dynstr_appendf(dynstr, "|%s %%i%d %%x%d", item[i].name, item[i].icon, item[i].value);
+				else
+					BLI_dynstr_appendf(dynstr, "|%s %%x%d", item[i].name, item[i].value);
 
-					if(value == item[i].value) {
-						icon= item[i].icon;
-						if(!tip)
-							tip= item[i].description;
-					}
+				if(value == item[i].value) {
+					icon= item[i].icon;
+					if(!tip)
+						tip= item[i].description;
 				}
-				str= BLI_dynstr_get_cstring(dynstr);
-				BLI_dynstr_free(dynstr);
+			}
+			str= BLI_dynstr_get_cstring(dynstr);
+			BLI_dynstr_free(dynstr);
 
-				if(free)
-					MEM_freeN(item);
+			if(free)
+				MEM_freeN(item);
 
-				freestr= 1;
-			}
-			else if(ELEM(type, ROW, LISTROW) && proptype == PROP_ENUM) {
-				EnumPropertyItem *item;
-				int i, totitem, free;
+			freestr= 1;
+		}
+		else if(ELEM(type, ROW, LISTROW) && proptype == PROP_ENUM) {
+			EnumPropertyItem *item;
+			int i, totitem, free;
 
-				RNA_property_enum_items(block->evil_C, ptr, prop, &item, &totitem, &free);
-				for(i=0; i<totitem; i++) {
-					if(item[i].identifier[0] && item[i].value == (int)max) {
-						str= item[i].name;
-						icon= item[i].icon;
-					}
+			RNA_property_enum_items(block->evil_C, ptr, prop, &item, &totitem, &free);
+			for(i=0; i<totitem; i++) {
+				if(item[i].identifier[0] && item[i].value == (int)max) {
+					str= item[i].name;
+					icon= item[i].icon;
 				}
+			}
 
-				if(!str)
-					str= RNA_property_ui_name(prop);
-				if(free)
-					MEM_freeN(item);
-			}
-			else {
+			if(!str)
 				str= RNA_property_ui_name(prop);
-				icon= RNA_property_ui_icon(prop);
-			}
+			if(free)
+				MEM_freeN(item);
 		}
-		
-		if(!tip && proptype != PROP_ENUM)
-			tip= RNA_property_ui_description(prop);
+		else {
+			str= RNA_property_ui_name(prop);
+			icon= RNA_property_ui_icon(prop);
+		}
+	}
 
-		if(min == max || a1 == -1 || a2 == -1) {
-			if(proptype == PROP_INT) {
-				int hardmin, hardmax, softmin, softmax, step;
+	if(!tip && proptype != PROP_ENUM)
+		tip= RNA_property_ui_description(prop);
 
-				RNA_property_int_range(ptr, prop, &hardmin, &hardmax);
-				RNA_property_int_ui_range(ptr, prop, &softmin, &softmax, &step);
+	if(min == max || a1 == -1 || a2 == -1) {
+		if(proptype == PROP_INT) {
+			int hardmin, hardmax, softmin, softmax, step;
 
-				if(!ELEM(type, ROW, LISTROW) && min == max) {
-					min= hardmin;
-					max= hardmax;
-				}
-				if(a1 == -1)
-					a1= step;
-				if(a2 == -1)
-					a2= 0;
+			RNA_property_int_range(ptr, prop, &hardmin, &hardmax);
+			RNA_property_int_ui_range(ptr, prop, &softmin, &softmax, &step);
+
+			if(!ELEM(type, ROW, LISTROW) && min == max) {
+				min= hardmin;
+				max= hardmax;
 			}
-			else if(proptype == PROP_FLOAT) {
-				float hardmin, hardmax, softmin, softmax, step, precision;
+			if(a1 == -1)
+				a1= step;
+			if(a2 == -1)
+				a2= 0;
+		}
+		else if(proptype == PROP_FLOAT) {
+			float hardmin, hardmax, softmin, softmax, step, precision;
 
-				RNA_property_float_range(ptr, prop, &hardmin, &hardmax);
-				RNA_property_float_ui_range(ptr, prop, &softmin, &softmax, &step, &precision);
+			RNA_property_float_range(ptr, prop, &hardmin, &hardmax);
+			RNA_property_float_ui_range(ptr, prop, &softmin, &softmax, &step, &precision);
 
-				if(!ELEM(type, ROW, LISTROW) && min == max) {
-					min= hardmin;
-					max= hardmax;
-				}
-				if(a1 == -1)
-					a1= step;
-				if(a2 == -1)
-					a2= precision;
+			if(!ELEM(type, ROW, LISTROW) && min == max) {
+				min= hardmin;
+				max= hardmax;
 			}
-			else if(proptype == PROP_STRING) {
-				min= 0;
-				max= RNA_property_string_maxlength(prop);
-				if(max == 0) /* interface code should ideally support unlimited length */
-					max= UI_MAX_DRAW_STR; 
-			}
+			if(a1 == -1)
+				a1= step;
+			if(a2 == -1)
+				a2= precision;
 		}
+		else if(proptype == PROP_STRING) {
+			min= 0;
+			max= RNA_property_string_maxlength(prop);
+			if(max == 0) /* interface code should ideally support unlimited length */
+				max= UI_MAX_DRAW_STR;
+		}
 	}
-	else {
-		RNA_warning("ui_def_but_rna: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
-		str= propname;
-	}
 
 	/* now create button */
 	but= ui_def_but(block, type, retval, str, x1, y1, x2, y2, NULL, min, max, a1, a2, tip);
 
-	if(prop) {
-		but->rnapoin= *ptr;
-		but->rnaprop= prop;
+	but->rnapoin= *ptr;
+	but->rnaprop= prop;
 
-		if(RNA_property_array_length(&but->rnapoin, but->rnaprop))
-			but->rnaindex= index;
-		else
-			but->rnaindex= 0;
-	}
+	if(RNA_property_array_length(&but->rnapoin, but->rnaprop))
+		but->rnaindex= index;
+	else
+		but->rnaindex= 0;
 
 	if(icon) {
 		but->icon= (BIFIconID)icon;
@@ -2629,10 +2632,8 @@
 		but->flag|= UI_ICON_LEFT;
 	}
 	
-	if (!prop || !RNA_property_editable(&but->rnapoin, prop)) {
-		but->flag |= UI_BUT_DISABLED;
-		but->lock = 1;
-		but->lockstr = "";
+	if (!RNA_property_editable(&but->rnapoin, prop)) {
+		UI_DEF_BUT_RNA_DISABLE(but);
 	}
 
 	/* If this button uses units, calculate the step from this */
@@ -2645,6 +2646,23 @@
 	return but;
 }
 
+static uiBut *ui_def_but_rna_propname(uiBlock *block, int type, int retval, const char *str, int x1, int y1, short x2, short y2, PointerRNA *ptr, const char *propname, int index, float min, float max, float a1, float a2,  const char *tip)
+{
+	PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
+	uiBut *but;
+
+	if(prop) {
+		but= ui_def_but_rna(block, type, retval, str, x1, y1, x2, y2, ptr, prop, index, min, max, a1, a2,  tip);
+	}
+	else {
+		but= ui_def_but(block, type, retval, propname, x1, y1, x2, y2, NULL, min, max, a1, a2, tip);
+
+		UI_DEF_BUT_RNA_DISABLE(but);
+	}
+
+	return but;
+}
+
 static uiBut *ui_def_but_operator(uiBlock *block, int type, const char *opname, int opcontext, const char *str, int x1, int y1, short x2, short y2, const char *tip)
 {
 	uiBut *but;
@@ -2857,7 +2875,7 @@
 {
 	uiBut *but;
 
-	but= ui_def_but_rna(block, type, retval, str, x1, y1, x2, y2, ptr, propname, index, min, max, a1, a2, tip);
+	but= ui_def_but_rna_propname(block, type, retval, str, x1, y1, x2, y2, ptr, propname, index, min, max, a1, a2, tip);
 	if(but)
 		ui_check_but(but);
 
@@ -2942,7 +2960,7 @@
 {
 	uiBut *but;
 
-	but= ui_def_but_rna(block, type, retval, "", x1, y1, x2, y2, ptr, propname, index, min, max, a1, a2, tip);
+	but= ui_def_but_rna_propname(block, type, retval, "", x1, y1, x2, y2, ptr, propname, index, min, max, a1, a2, tip);
 	if(but) {
 		if(icon) {
 			but->icon= (BIFIconID) icon;
@@ -3027,7 +3045,7 @@
 {
 	uiBut *but;
 
-	but= ui_def_but_rna(block, type, retval, str, x1, y1, x2, y2, ptr, propname, index, min, max, a1, a2, tip);
+	but= ui_def_but_rna_propname(block, type, retval, str, x1, y1, x2, y2, ptr, propname, index, min, max, a1, a2, tip);
 	if(but) {
 		if(icon) {
 			but->icon= (BIFIconID) icon;




More information about the Bf-blender-cvs mailing list