[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40786] trunk/blender: Fix #28202: (only) modifying keymap item properties did not save properly, the

Brecht Van Lommel brechtvanlommel at pandora.be
Tue Oct 4 15:24:49 CEST 2011


Revision: 40786
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40786
Author:   blendix
Date:     2011-10-04 13:24:48 +0000 (Tue, 04 Oct 2011)
Log Message:
-----------
Fix #28202: (only) modifying keymap item properties did not save properly, the
update signal for this was missing. Problem is that the operator properties
RNA update callback doesn't know the associated keymap item, worked around it
with UI template now.

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/space_userpref_keymap.py
    trunk/blender/source/blender/editors/include/UI_interface.h
    trunk/blender/source/blender/editors/interface/interface_templates.c
    trunk/blender/source/blender/makesrna/intern/rna_ui_api.c

Modified: trunk/blender/release/scripts/startup/bl_ui/space_userpref_keymap.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/space_userpref_keymap.py	2011-10-04 12:30:26 UTC (rev 40785)
+++ trunk/blender/release/scripts/startup/bl_ui/space_userpref_keymap.py	2011-10-04 13:24:48 UTC (rev 40786)
@@ -121,19 +121,6 @@
                 for entry in children:
                     self.draw_entry(display_keymaps, entry, col, level + 1)
 
-    @staticmethod
-    def draw_kmi_properties(box, properties, title=None):
-        box.separator()
-        if title:
-            box.label(text=title)
-        flow = box.column_flow(columns=2)
-        for pname, value in properties.bl_rna.properties.items():
-            if pname != "rna_type" and not properties.is_property_hidden(pname):
-                if isinstance(value, OperatorProperties):
-                    InputKeyMapPanel.draw_kmi_properties(box, value, title=pname)
-                else:
-                    flow.prop(properties, pname)
-
     def draw_kmi(self, display_keymaps, kc, km, kmi, layout, level):
         map_type = kmi.map_type
 
@@ -218,9 +205,7 @@
                 subrow.prop(kmi, "key_modifier", text="", event=True)
 
             # Operator properties
-            props = kmi.properties
-            if props is not None:
-                InputKeyMapPanel.draw_kmi_properties(box, props)
+            box.template_keymap_item_properties(kmi)
 
             # Modal key maps attached to this operator
             if not km.is_modal:

Modified: trunk/blender/source/blender/editors/include/UI_interface.h
===================================================================
--- trunk/blender/source/blender/editors/include/UI_interface.h	2011-10-04 12:30:26 UTC (rev 40785)
+++ trunk/blender/source/blender/editors/include/UI_interface.h	2011-10-04 13:24:48 UTC (rev 40786)
@@ -749,6 +749,7 @@
 void uiTemplateEditModeSelection(uiLayout *layout, struct bContext *C);
 void uiTemplateTextureImage(uiLayout *layout, struct bContext *C, struct Tex *tex);
 void uiTemplateReportsBanner(uiLayout *layout, struct bContext *C);
+void uiTemplateKeymapItemProperties(uiLayout *layout, struct PointerRNA *ptr);
 
 void uiTemplateList(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, const char *propname, struct PointerRNA *activeptr, const char *activeprop, int rows, int maxrows, int type);
 

Modified: trunk/blender/source/blender/editors/interface/interface_templates.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_templates.c	2011-10-04 12:30:26 UTC (rev 40785)
+++ trunk/blender/source/blender/editors/interface/interface_templates.c	2011-10-04 13:24:48 UTC (rev 40786)
@@ -2542,3 +2542,61 @@
 	uiDefBut(block, LABEL, 0, report->message, UI_UNIT_X+10, 0, UI_UNIT_X+width, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "");
 }
 
+/********************************* Keymap *************************************/
+
+static void keymap_item_modified(bContext *UNUSED(C), void *kmi_p, void *UNUSED(unused))
+{
+	wmKeyMapItem *kmi= (wmKeyMapItem*)kmi_p;
+	WM_keyconfig_update_tag(NULL, kmi);
+}
+
+static void template_keymap_item_properties(uiLayout *layout, const char *title, PointerRNA *ptr)
+{
+	uiLayout *flow;
+
+	uiItemS(layout);
+
+	if(title)
+		uiItemL(layout, title, ICON_NONE);
+	
+	flow= uiLayoutColumnFlow(layout, 2, 0);
+
+	RNA_STRUCT_BEGIN(ptr, prop) {
+		int flag= RNA_property_flag(prop);
+
+		if(flag & PROP_HIDDEN)
+			continue;
+
+		/* recurse for nested properties */
+		if(RNA_property_type(prop) == PROP_POINTER) {
+			PointerRNA propptr= RNA_property_pointer_get(ptr, prop);
+			const char *name= RNA_property_ui_name(prop);
+
+			if(propptr.data && RNA_struct_is_a(propptr.type, &RNA_OperatorProperties)) {
+				template_keymap_item_properties(layout, name, &propptr);
+				continue;
+			}
+		}
+
+		/* add property */
+		uiItemR(flow, ptr, RNA_property_identifier(prop), 0, NULL, ICON_NONE);
+	}
+	RNA_STRUCT_END;
+}
+
+void uiTemplateKeymapItemProperties(uiLayout *layout, PointerRNA *ptr)
+{
+	PointerRNA propptr= RNA_pointer_get(ptr, "properties");
+
+	if(propptr.data) {
+		uiBut *but= uiLayoutGetBlock(layout)->buttons.last;
+
+		template_keymap_item_properties(layout, NULL, &propptr);
+
+		/* attach callbacks to compensate for missing properties update,
+		   we don't know which keymap (item) is being modified there */
+		for(; but; but=but->next)
+			uiButSetFunc(but, keymap_item_modified, ptr->data, NULL);
+	}
+}
+

Modified: trunk/blender/source/blender/makesrna/intern/rna_ui_api.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_ui_api.c	2011-10-04 12:30:26 UTC (rev 40785)
+++ trunk/blender/source/blender/makesrna/intern/rna_ui_api.c	2011-10-04 13:24:48 UTC (rev 40786)
@@ -428,6 +428,10 @@
 	func= RNA_def_function(srna, "template_reports_banner", "uiTemplateReportsBanner");
 	RNA_def_function_flag(func, FUNC_USE_CONTEXT);
 
+	func= RNA_def_function(srna, "template_keymap_item_properties", "uiTemplateKeymapItemProperties");
+	parm= RNA_def_pointer(func, "item", "KeyMapItem", "", "");
+	RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR|PROP_NEVER_NULL);
+
 	func= RNA_def_function(srna, "introspect", "uiLayoutIntrospect");
 	parm= RNA_def_string(func, "string", "", 1024*1024, "Descr", "DESCR");
 	RNA_def_function_return(func, parm);




More information about the Bf-blender-cvs mailing list