[Bf-blender-cvs] [73a7885ab30] master: WM: initialize last used macro properties

Campbell Barton noreply at git.blender.org
Fri May 11 20:04:37 CEST 2018


Commit: 73a7885ab30bfb1bc11dc2575271bc8b3ab887a4
Author: Campbell Barton
Date:   Fri May 11 20:01:51 2018 +0200
Branches: master
https://developer.blender.org/rB73a7885ab30bfb1bc11dc2575271bc8b3ab887a4

WM: initialize last used macro properties

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

M	source/blender/windowmanager/intern/wm_event_system.c

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

diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index a6c98686f5a..f8bebf3898b 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -1022,48 +1022,60 @@ static void wm_region_mouse_co(bContext *C, wmEvent *event)
 }
 
 #if 1 /* may want to disable operator remembering previous state for testing */
-bool WM_operator_last_properties_init(wmOperator *op)
+
+static bool operator_last_properties_init_impl(wmOperator *op, IDProperty *last_properties)
 {
 	bool changed = false;
+	IDPropertyTemplate val = {0};
+	IDProperty *replaceprops = IDP_New(IDP_GROUP, &val, "wmOperatorProperties");
+	PropertyRNA *iterprop;
 
-	if (op->type->last_properties) {
-		IDPropertyTemplate val = {0};
-		IDProperty *replaceprops = IDP_New(IDP_GROUP, &val, "wmOperatorProperties");
-		PropertyRNA *iterprop;
-
-		CLOG_INFO(WM_LOG_OPERATORS, 1, "loading previous properties for '%s'", op->type->idname);
+	CLOG_INFO(WM_LOG_OPERATORS, 1, "loading previous properties for '%s'", op->type->idname);
 
-		iterprop = RNA_struct_iterator_property(op->type->srna);
+	iterprop = RNA_struct_iterator_property(op->type->srna);
 
-		RNA_PROP_BEGIN (op->ptr, itemptr, iterprop)
-		{
-			PropertyRNA *prop = itemptr.data;
-			if ((RNA_property_flag(prop) & PROP_SKIP_SAVE) == 0) {
-				if (!RNA_property_is_set(op->ptr, prop)) { /* don't override a setting already set */
-					const char *identifier = RNA_property_identifier(prop);
-					IDProperty *idp_src = IDP_GetPropertyFromGroup(op->type->last_properties, identifier);
-					if (idp_src) {
-						IDProperty *idp_dst = IDP_CopyProperty(idp_src);
-
-						/* note - in the future this may need to be done recursively,
-						 * but for now RNA doesn't access nested operators */
-						idp_dst->flag |= IDP_FLAG_GHOST;
-
-						/* add to temporary group instead of immediate replace,
-						 * because we are iterating over this group */
-						IDP_AddToGroup(replaceprops, idp_dst);
-						changed = true;
-					}
+	RNA_PROP_BEGIN (op->ptr, itemptr, iterprop)
+	{
+		PropertyRNA *prop = itemptr.data;
+		if ((RNA_property_flag(prop) & PROP_SKIP_SAVE) == 0) {
+			if (!RNA_property_is_set(op->ptr, prop)) { /* don't override a setting already set */
+				const char *identifier = RNA_property_identifier(prop);
+				IDProperty *idp_src = IDP_GetPropertyFromGroup(last_properties, identifier);
+				if (idp_src) {
+					IDProperty *idp_dst = IDP_CopyProperty(idp_src);
+
+					/* note - in the future this may need to be done recursively,
+					 * but for now RNA doesn't access nested operators */
+					idp_dst->flag |= IDP_FLAG_GHOST;
+
+					/* add to temporary group instead of immediate replace,
+					 * because we are iterating over this group */
+					IDP_AddToGroup(replaceprops, idp_dst);
+					changed = true;
 				}
 			}
 		}
-		RNA_PROP_END;
-
-		IDP_MergeGroup(op->properties, replaceprops, true);
-		IDP_FreeProperty(replaceprops);
-		MEM_freeN(replaceprops);
 	}
+	RNA_PROP_END;
+
+	IDP_MergeGroup(op->properties, replaceprops, true);
+	IDP_FreeProperty(replaceprops);
+	MEM_freeN(replaceprops);
+	return changed;
+}
 
+bool WM_operator_last_properties_init(wmOperator *op)
+{
+	bool changed = false;
+	if (op->type->last_properties) {
+		changed |= operator_last_properties_init_impl(op, op->type->last_properties);
+		for (wmOperator *opm = op->macro.first; opm; opm = opm->next) {
+			IDProperty *idp_src = IDP_GetPropertyFromGroup(op->type->last_properties, opm->idname);
+			if (idp_src) {
+				changed |= operator_last_properties_init_impl(opm, idp_src);
+			}
+		}
+	}
 	return changed;
 }



More information about the Bf-blender-cvs mailing list