[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45775] trunk/blender/source/blender/ editors/interface/interface_ops.c: Fix #30998: copy to selected in properties editor not working for bones.

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Apr 19 12:49:46 CEST 2012


Revision: 45775
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45775
Author:   blendix
Date:     2012-04-19 10:49:45 +0000 (Thu, 19 Apr 2012)
Log Message:
-----------
Fix #30998: copy to selected in properties editor not working for bones.

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

Modified: trunk/blender/source/blender/editors/interface/interface_ops.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_ops.c	2012-04-19 09:38:07 UTC (rev 45774)
+++ trunk/blender/source/blender/editors/interface/interface_ops.c	2012-04-19 10:49:45 UTC (rev 45775)
@@ -346,8 +346,10 @@
 
 /* Copy To Selected Operator ------------------------ */
 
-static int copy_to_selected_list(bContext *C, PointerRNA *ptr, ListBase *lb)
+static int copy_to_selected_list(bContext *C, PointerRNA *ptr, ListBase *lb, int *use_path)
 {
+	*use_path = 0;
+
 	if (RNA_struct_is_a(ptr->type, &RNA_EditBone))
 		*lb = CTX_data_collection_get(C, "selected_editable_bones");
 	else if (RNA_struct_is_a(ptr->type, &RNA_PoseBone))
@@ -357,8 +359,10 @@
 	else {
 		ID *id = ptr->id.data;
 
-		if(id && GS(id->name) == ID_OB)
+		if (id && GS(id->name) == ID_OB) {
 			*lb = CTX_data_collection_get(C, "selected_editable_objects");
+			*use_path = 1;
+		}
 		else
 			return 0;
 	}
@@ -375,26 +379,39 @@
 	uiContextActiveProperty(C, &ptr, &prop, &index);
 
 	if (ptr.data && prop) {
-		char *path = RNA_path_from_ID_to_property(&ptr, prop);
+		char *path = NULL;
+		int use_path;
 		CollectionPointerLink *link;
 		ListBase lb;
 
-		if (path && copy_to_selected_list(C, &ptr, &lb)) {
+		if (!copy_to_selected_list(C, &ptr, &lb, &use_path))
+			return success;
+
+		if (!use_path || (path = RNA_path_from_ID_to_property(&ptr, prop))) {
 			for (link = lb.first; link; link = link->next) {
 				if (link->ptr.data != ptr.data) {
-					RNA_id_pointer_create(link->ptr.id.data, &idptr);
+					if (use_path) {
+						lprop = NULL;
+						RNA_id_pointer_create(link->ptr.id.data, &idptr);
+						RNA_path_resolve(&idptr, path, &lptr, &lprop);
+					}
+					else {
+						lptr = link->ptr;
+						lprop = prop;
+					}
 
-					if (RNA_path_resolve(&idptr, path, &lptr, &lprop) && lprop == prop) {
+					if (lprop == prop) {
 						if (RNA_property_editable(&lptr, prop))
 							success = 1;
 					}
 				}
 			}
 
-			BLI_freelistN(&lb);
+			if (path)
+				MEM_freeN(path);
 		}
 
-		MEM_freeN(path);
+		BLI_freelistN(&lb);
 	}
 
 	return success;
@@ -412,16 +429,29 @@
 	
 	/* if there is a valid property that is editable... */
 	if (ptr.data && prop) {
-		char *path = RNA_path_from_ID_to_property(&ptr, prop);
+		char *path = NULL;
+		int use_path;
 		CollectionPointerLink *link;
 		ListBase lb;
 
-		if (path && copy_to_selected_list(C, &ptr, &lb)) {
+		if (!copy_to_selected_list(C, &ptr, &lb, &use_path))
+			return success;
+
+		if (!use_path || (path = RNA_path_from_ID_to_property(&ptr, prop))) {
 			for (link = lb.first; link; link = link->next) {
 				if (link->ptr.data != ptr.data) {
-					RNA_id_pointer_create(link->ptr.id.data, &idptr);
-					if (RNA_path_resolve(&idptr, path, &lptr, &lprop) && lprop == prop) {
-						if(RNA_property_editable(&lptr, lprop)) {
+					if (use_path) {
+						lprop = NULL;
+						RNA_id_pointer_create(link->ptr.id.data, &idptr);
+						RNA_path_resolve(&idptr, path, &lptr, &lprop);
+					}
+					else {
+						lptr = link->ptr;
+						lprop = prop;
+					}
+
+					if (lprop == prop) {
+						if (RNA_property_editable(&lptr, lprop)) {
 							if (RNA_property_copy(&lptr, &ptr, prop, (all) ? -1 : index)) {
 								RNA_property_update(C, &lptr, prop);
 								success = 1;
@@ -431,10 +461,11 @@
 				}
 			}
 
-			BLI_freelistN(&lb);
+			if (path)
+				MEM_freeN(path);
 		}
 
-		MEM_freeN(path);
+		BLI_freelistN(&lb);
 	}
 	
 	return (success) ? OPERATOR_FINISHED : OPERATOR_CANCELLED;




More information about the Bf-blender-cvs mailing list