[Bf-blender-cvs] [f025c57cb4] id_override_static: Implement 'delete override' from UI menu options.

Bastien Montagne noreply at git.blender.org
Fri Mar 24 12:55:14 CET 2017


Commit: f025c57cb45420f39d596243cdae8f59a61d3bff
Author: Bastien Montagne
Date:   Fri Mar 24 12:47:34 2017 +0100
Branches: id_override_static
https://developer.blender.org/rBf025c57cb45420f39d596243cdae8f59a61d3bff

Implement 'delete override' from UI menu options.

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

M	source/blender/editors/interface/interface.c
M	source/blender/editors/interface/interface_ops.c

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

diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index ff98bb86c7..c350ec86a7 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -1192,7 +1192,7 @@ static void ui_menu_block_set_keymaps(const bContext *C, uiBlock *block)
 
 void ui_but_override_flag(uiBut *but)
 {
-	if (RNA_property_overridden(&but->rnapoin, but->rnaprop, but->rnaindex) != NULL) {
+	if (RNA_property_overridden(&but->rnapoin, but->rnaprop, but->rnaindex)) {
 		but->flag |= UI_BUT_OVERRIDEN;
 	}
 	else {
diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c
index f0e1792925..a1e34e407b 100644
--- a/source/blender/editors/interface/interface_ops.c
+++ b/source/blender/editors/interface/interface_ops.c
@@ -44,6 +44,7 @@
 #include "BKE_context.h"
 #include "BKE_screen.h"
 #include "BKE_global.h"
+#include "BKE_library_override.h"
 #include "BKE_node.h"
 #include "BKE_text.h" /* for UI_OT_reports_to_text */
 #include "BKE_report.h"
@@ -335,7 +336,7 @@ static void UI_OT_unset_property_button(wmOperatorType *ot)
 /* Note that we use different values for UI/UX than 'real' override operations, user does not care
  * whether it's added or removed for the differential operation e.g. */
 enum {
-	UIOverride_Type_NOP = 0,
+	UIOverride_Type_NOOP = 0,
 	UIOverride_Type_Replace = 1,
 	UIOverride_Type_Difference = 2,  /* Add/subtract */
 	UIOverride_Type_Factor = 3,  /* Multiply */
@@ -343,7 +344,7 @@ enum {
 };
 
 static EnumPropertyItem override_type_items[] = {
-	{UIOverride_Type_NOP, "NOP", 0, "NOP",
+	{UIOverride_Type_NOOP, "NOOP", 0, "NoOp",
 	                      "'No-Operation', place holder preventing automatic override to ever affect the property"},
 	{UIOverride_Type_Replace, "REPLACE", 0, "Replace", "Completely replace value from linked data by local one"},
 	{UIOverride_Type_Difference, "DIFFERENCE", 0, "Difference", "Store difference to linked data value"},
@@ -415,12 +416,12 @@ static int override_remove_button_poll(bContext *C)
 
 	UI_context_active_but_prop_get(C, &ptr, &prop, &index);
 
-	return (ptr.data && prop && RNA_property_overridden(&ptr, prop, index));
+	return (ptr.data && ptr.id.data && prop && RNA_property_overridden(&ptr, prop, index));
 }
 
 static int override_remove_button_exec(bContext *C, wmOperator *op)
 {
-	PointerRNA ptr;
+	PointerRNA ptr, id_refptr, src;
 	PropertyRNA *prop;
 	int index;
 	const bool all = RNA_boolean_get(op->ptr, "all");
@@ -428,14 +429,43 @@ static int override_remove_button_exec(bContext *C, wmOperator *op)
 	/* try to reset the nominated setting to its default value */
 	UI_context_active_but_prop_get(C, &ptr, &prop, &index);
 
-	printf("We should remove, or remove generic-add per-index override operations...\n");
-//	/* if there is a valid property that is editable... */
-//	if (ptr.data && prop && RNA_property_editable(&ptr, prop)) {
-//		if (RNA_property_reset(&ptr, prop, (all) ? -1 : index))
-//			return operator_button_property_finish(C, &ptr, prop);
-//	}
+	ID *id = ptr.id.data;
+	IDOverrideProperty *oprop = RNA_property_override_property_get(&ptr, prop);
+	BLI_assert(oprop != NULL);
+	BLI_assert(id != NULL && id->override != NULL);
 
-	return OPERATOR_FINISHED;
+	/* We need source (i.e. linked data) to restore values of deleted overrides... */
+	RNA_id_pointer_create(id->override->reference, &id_refptr);
+	if (!RNA_path_resolve(&id_refptr, oprop->rna_path, &src, NULL)) {
+		BLI_assert(0 && "Failed to create matching source (linked data) RNA pointer");
+	}
+
+	if (!all && index != -1) {
+		/* Remove override operation for given item, add singular operations for the other items as needed. */
+		IDOverridePropertyOperation *opop = BKE_override_property_operation_find(oprop, NULL, NULL, index, index);
+		if (opop == NULL) {
+			/* No specific override operation, we have to get generic one, and... */
+			opop = BKE_override_property_operation_find(oprop, NULL, NULL, -1, -1);
+			BLI_assert(opop != NULL);
+			/* ... create item-specific override operations for all but given index, before removing generic one. */
+			for (int idx = RNA_property_array_length(&ptr, prop); idx--; ) {
+				if (idx != index) {
+					BKE_override_property_operation_get(oprop, opop->operation, NULL, NULL, idx, idx, NULL);
+				}
+			}
+		}
+		BKE_override_property_operation_delete(oprop, opop);
+		RNA_property_copy(&ptr, &src, prop, index);
+		if (BLI_listbase_is_empty(&oprop->operations)) {
+			BKE_override_property_delete(id->override, oprop);
+		}
+	}
+	else {
+		/* Just remove whole generic override operation of this property. */
+		BKE_override_property_delete(id->override, oprop);
+		RNA_property_copy(&ptr, &src, prop, -1);
+	}
+	return operator_button_property_finish(C, &ptr, prop);
 }
 
 static void UI_OT_override_remove_button(wmOperatorType *ot)




More information about the Bf-blender-cvs mailing list