[Bf-blender-cvs] [2fa16018b8] id_override_static: Add some basic UI and RNA feedback for overriden properties.

Bastien Montagne noreply at git.blender.org
Thu Mar 2 12:00:50 CET 2017


Commit: 2fa16018b816534f470351a30ffeba02cdce191d
Author: Bastien Montagne
Date:   Thu Mar 2 09:53:41 2017 +0100
Branches: id_override_static
https://developer.blender.org/rB2fa16018b816534f470351a30ffeba02cdce191d

Add some basic UI and RNA feedback for overriden properties.

For now chose some teal blue to mark overridden state of prop in UI,
kind of last nicely different tint available...

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

M	release/scripts/startup/bl_ui/space_userpref.py
M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/interface/interface.c
M	source/blender/editors/interface/interface_handlers.c
M	source/blender/editors/interface/interface_intern.h
M	source/blender/editors/interface/interface_widgets.c
M	source/blender/makesdna/DNA_userdef_types.h
M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/intern/rna_access.c
M	source/blender/makesrna/intern/rna_rna.c
M	source/blender/makesrna/intern/rna_userdef.c

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

diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index d7f5723539..9464cba6bc 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -793,6 +793,7 @@ class USERPREF_PT_theme(Panel):
             colsub.row().prop(ui_state, "inner_anim_sel")
             colsub.row().prop(ui_state, "inner_driven")
             colsub.row().prop(ui_state, "inner_driven_sel")
+            colsub.row().prop(ui_state, "blend")
 
             subsplit = row.split(percentage=0.85)
 
@@ -801,7 +802,8 @@ class USERPREF_PT_theme(Panel):
             colsub = padding.column()
             colsub.row().prop(ui_state, "inner_key")
             colsub.row().prop(ui_state, "inner_key_sel")
-            colsub.row().prop(ui_state, "blend")
+            colsub.row().prop(ui_state, "inner_overridden")
+            colsub.row().prop(ui_state, "inner_overridden_sel")
 
             col.separator()
             col.separator()
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 9fbce7dd20..ea99b7cb47 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -182,6 +182,8 @@ enum {
 	UI_BUT_UPDATE_DELAY    = (1 << 28),  /* don't run updates while dragging (needed in rare cases). */
 	UI_BUT_TEXTEDIT_UPDATE = (1 << 29),  /* when widget is in textedit mode, update value on each char stroke */
 	UI_BUT_VALUE_CLEAR     = (1 << 30),  /* show 'x' icon to clear/unlink value of text or search button */
+
+	UI_BUT_OVERRIDEN       = (1 << 31),  /* RNA property of the button is overriden from linked reference data. */
 };
 
 #define UI_PANEL_WIDTH          340
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 682db20af5..ba5c38c289 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -1190,6 +1190,16 @@ 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) {
+		but->flag |= UI_BUT_OVERRIDEN;
+	}
+	else {
+		but->flag &= ~UI_BUT_OVERRIDEN;
+	}
+}
+
 void UI_block_update_from_old(const bContext *C, uiBlock *block)
 {
 	uiBut *but_old;
@@ -1254,6 +1264,7 @@ void UI_block_end_ex(const bContext *C, uiBlock *block, const int xy[2])
 		}
 
 		ui_but_anim_flag(but, (scene) ? scene->r.cfra : 0.0f);
+		ui_but_override_flag(but);
 	}
 
 
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 734cd02a05..681972d6bb 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -8159,6 +8159,7 @@ void UI_context_update_anim_flag(const bContext *C)
 		for (block = ar->uiblocks.first; block; block = block->next) {
 			for (but = block->buttons.first; but; but = but->next) {
 				ui_but_anim_flag(but, (scene) ? scene->r.cfra : 0.0f);
+				ui_but_override_flag(but);
 				ED_region_tag_redraw(ar);
 				
 				if (but->active) {
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index d8f9fdcbaa..ab660cfd1f 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -501,6 +501,7 @@ extern bool ui_but_supports_cycling(const uiBut *but) ATTR_WARN_UNUSED_RESULT;
 extern int  ui_but_is_pushed_ex(uiBut *but, double *value) ATTR_WARN_UNUSED_RESULT;
 extern int  ui_but_is_pushed(uiBut *but) ATTR_WARN_UNUSED_RESULT;
 
+void ui_but_override_flag(uiBut *but);
 
 extern void ui_block_bounds_calc(uiBlock *block);
 extern void ui_block_translate(uiBlock *block, int x, int y);
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index 6e871b8ec9..beab6cc413 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -1634,6 +1634,8 @@ static struct uiWidgetStateColors wcol_state_colors = {
 	{215, 211, 75, 255},
 	{180, 0, 255, 255},
 	{153, 0, 230, 255},
+	{74, 137, 137, 255},
+	{49, 112, 112, 255},
 	0.5f, 0.0f
 };
 
@@ -1972,6 +1974,8 @@ static void widget_state(uiWidgetType *wt, int state)
 			widget_state_blend(wt->wcol.inner, wcol_state->inner_anim_sel, wcol_state->blend);
 		else if (state & UI_BUT_DRIVEN)
 			widget_state_blend(wt->wcol.inner, wcol_state->inner_driven_sel, wcol_state->blend);
+		else if (state & UI_BUT_OVERRIDEN)
+			widget_state_blend(wt->wcol.inner, wcol_state->inner_overridden_sel, wcol_state->blend);
 
 		copy_v3_v3_char(wt->wcol.text, wt->wcol.text_sel);
 		
@@ -1985,6 +1989,8 @@ static void widget_state(uiWidgetType *wt, int state)
 			widget_state_blend(wt->wcol.inner, wcol_state->inner_anim, wcol_state->blend);
 		else if (state & UI_BUT_DRIVEN)
 			widget_state_blend(wt->wcol.inner, wcol_state->inner_driven, wcol_state->blend);
+		else if (state & UI_BUT_OVERRIDEN)
+			widget_state_blend(wt->wcol.inner, wcol_state->inner_overridden, wcol_state->blend);
 
 		if (state & UI_ACTIVE) { /* mouse over? */
 			wt->wcol.inner[0] = wt->wcol.inner[0] >= 240 ? 255 : wt->wcol.inner[0] + 15;
@@ -2030,7 +2036,9 @@ static void widget_state_numslider(uiWidgetType *wt, int state)
 			widget_state_blend(wt->wcol.item, wcol_state->inner_anim_sel, blend);
 		else if (state & UI_BUT_DRIVEN)
 			widget_state_blend(wt->wcol.item, wcol_state->inner_driven_sel, blend);
-		
+		else if (state & UI_BUT_OVERRIDEN)
+			widget_state_blend(wt->wcol.item, wcol_state->inner_overridden_sel, blend);
+
 		if (state & UI_SELECT)
 			SWAP(short, wt->wcol.shadetop, wt->wcol.shadedown);
 	}
@@ -2041,6 +2049,8 @@ static void widget_state_numslider(uiWidgetType *wt, int state)
 			widget_state_blend(wt->wcol.item, wcol_state->inner_anim, blend);
 		else if (state & UI_BUT_DRIVEN)
 			widget_state_blend(wt->wcol.item, wcol_state->inner_driven, blend);
+		else if (state & UI_BUT_OVERRIDEN)
+			widget_state_blend(wt->wcol.item, wcol_state->inner_overridden, blend);
 	}
 }
 
@@ -3018,7 +3028,7 @@ static void widget_swatch(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
 		
 	ui_but_v3_get(but, col);
 
-	if (state & (UI_BUT_ANIMATED | UI_BUT_ANIMATED_KEY | UI_BUT_DRIVEN | UI_BUT_REDALERT)) {
+	if (state & (UI_BUT_ANIMATED | UI_BUT_ANIMATED_KEY | UI_BUT_DRIVEN | UI_BUT_OVERRIDEN | UI_BUT_REDALERT)) {
 		/* draw based on state - color for keyed etc */
 		widgetbase_draw(&wtb, wcol);
 
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index 0ad4482708..fc5e0b2346 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -139,6 +139,8 @@ typedef struct uiWidgetStateColors {
 	char inner_key_sel[4];
 	char inner_driven[4];
 	char inner_driven_sel[4];
+	char inner_overridden[4];
+	char inner_overridden_sel[4];
 	float blend, pad;
 } uiWidgetStateColors;
 
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index 83d648657a..5f9267b3e2 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -41,6 +41,7 @@ struct bContext;
 struct ID;
 struct IDOverride;
 struct IDOverrideProperty;
+struct IDOverridePropertyOperation;
 struct ListBase;
 struct Main;
 struct ReportList;
@@ -1236,6 +1237,13 @@ void RNA_struct_override_apply(
 bool RNA_struct_auto_override(
         struct PointerRNA *local, struct PointerRNA *reference, struct IDOverride *override, const char *root_path);
 
+struct IDOverrideProperty *RNA_property_override_property_get(PointerRNA *ptr, PropertyRNA *prop);
+struct IDOverridePropertyOperation *RNA_property_override_property_operation_get(
+        PointerRNA *ptr, PropertyRNA *prop, const int index);
+
+bool RNA_property_overridable(PointerRNA *ptr, PropertyRNA *prop);
+bool RNA_property_overridden(PointerRNA *ptr, PropertyRNA *prop, const int index);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index 65c5bc5b2d..a1a25cf5c3 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -8046,6 +8046,80 @@ bool RNA_struct_auto_override(PointerRNA *local, PointerRNA *reference, IDOverri
 	return changed;
 }
 
+IDOverrideProperty *RNA_property_override_property_get(PointerRNA *ptr, PropertyRNA *prop)
+{
+	ID *id = ptr->id.data;
+
+	if (!id || !id->override) {
+		return NULL;
+	}
+
+	char *rna_path = RNA_path_from_ID_to_property(ptr, prop);
+	if (rna_path) {
+		for (IDOverrideProperty *op = id->override->properties.first; op; op = op->next) {
+			if (STREQ(rna_path, op->rna_path)) {
+				MEM_freeN(rna_path);
+				return op;
+			}
+		}
+		MEM_freeN(rna_path);
+	}
+	return NULL;
+}
+
+IDOverridePropertyOperation *RNA_property_override_property_operation_get(
+        PointerRNA *ptr, PropertyRNA *prop, const int index)
+{
+	IDOverrideProperty *op = RNA_property_override_property_get(ptr, prop);
+
+	if (!op) {
+		return NULL;
+	}
+
+	IDOverridePropertyOperation *opop_generic = NULL;
+	for (IDOverridePropertyOperation *opop = op->operations.first; opop; opop = opop->next) {
+		if (opop->subitem_local_index == index) {
+			return opop;
+		}
+		else if (opop->subitem_local_index == -1 && !opop_generic) {
+			/* index == -1 means all indices, that is valid fallback in case we requested specific index. */
+			opop_generic = opop;
+		}
+	}
+	return opop_generic;
+}
+
+bool RNA_property_overridable(PointerRNA *ptr, PropertyRNA *prop)
+{
+	if (!ptr || !prop || !ptr->id.data || !((ID *)ptr->id.data)->override) {
+		return false;
+	}
+
+	prop = rna_ensure_property(prop);
+
+	if (!(prop->flag & PROP_OVERRIDABLE)) {
+		return false;
+	}
+
+	return (prop->flag & PROP_EDITABLE) != 0;
+}
+
+bool RNA_property_overridden(PointerRNA *ptr, PropertyRNA *prop, const int index)
+{
+	if (!ptr || !prop) {
+		return false;
+	}
+
+	if (RN

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list