diff --git a/release/scripts/ui/space_userpref.py b/release/scripts/ui/space_userpref.py index 5d9d3fce36f..21dae9982dc 100644 --- a/release/scripts/ui/space_userpref.py +++ b/release/scripts/ui/space_userpref.py @@ -1260,7 +1260,6 @@ class USERPREF_PT_input(bpy.types.Panel): km = kc.find_keymap(idname, space_type = spaceid, region_type = regionid) if km: - km = km.active() self.draw_km(kc, km, children, col, level) def indented_layout(self, layout, level): @@ -1275,6 +1274,8 @@ class USERPREF_PT_input(bpy.types.Panel): return col def draw_km(self, kc, km, children, layout, level): + km = km.active() + layout.set_context_pointer("keymap", km) col = self.indented_layout(layout, level) @@ -1463,7 +1464,35 @@ class USERPREF_PT_input(bpy.types.Panel): sub.prop(inputs, "ndof_rotate_speed", text="Orbit Speed") row.separator() + + def draw_filtered(self, kc, layout): + for km in kc.keymaps: + filtered_items = [kmi for kmi in km.items if kmi.name.lower().find(kc.filter.lower()) != -1] + + if len(filtered_items) != 0: + km = km.active() + + col = layout.column() + col.set_context_pointer("keymap", km) + row = col.row() + row.label(text=km.name, icon="DOT") + + row.label() + row.label() + + if km.user_defined: + row.operator("WM_OT_keymap_restore", text="Restore") + else: + row.operator("WM_OT_keymap_edit", text="Edit") + + for kmi in filtered_items: + self.draw_kmi(kc, km, kmi, col, 1) + + def draw_hierarchy(self, defkc, layout): + for entry in KM_HIERARCHY: + self.draw_entry(defkc, entry, layout) + def draw(self, context): layout = self.layout @@ -1480,17 +1509,23 @@ class USERPREF_PT_input(bpy.types.Panel): # Keymap Settings col = split.column() # kc = wm.active_keyconfig - defkc = wm.default_keyconfig + kc = wm.default_keyconfig sub = col.column() - subrow = sub.row() - subrow.prop_object(wm, "active_keyconfig", wm, "keyconfigs", text="Configuration:") - subrow.label() + + subsplit = sub.split() + subcol = subsplit.column() + subcol.prop_object(wm, "active_keyconfig", wm, "keyconfigs", text="Configuration:") + + subcol = subsplit.column() + subcol.prop(kc, "filter", icon="VIEWZOOM") col.separator() - for entry in KM_HIERARCHY: - self.draw_entry(defkc, entry, col) + if kc.filter != "": + self.draw_filtered(kc, col) + else: + self.draw_hierarchy(kc, col) bpy.types.register(USERPREF_HT_header) bpy.types.register(USERPREF_PT_tabs) @@ -1607,7 +1642,7 @@ class WM_OT_keymap_edit(bpy.types.Operator): def execute(self, context): wm = context.manager - km = context.keymap # wm.active_keymap + km = context.keymap km.copy_to_user() return ('FINISHED',) @@ -1626,7 +1661,7 @@ class WM_OT_keymap_restore(bpy.types.Operator): for km in wm.default_keyconfig.keymaps: km.restore_to_default() else: - km = context.keymap # wm.active_keymap + km = context.keymap km.restore_to_default() return ('FINISHED',) @@ -1639,7 +1674,7 @@ class WM_OT_keyitem_add(bpy.types.Operator): def execute(self, context): wm = context.manager - km = context.keymap # wm.active_keymap + km = context.keymap if km.modal: km.add_modal_item("", 'A', 'PRESS') # kmi else: @@ -1655,7 +1690,7 @@ class WM_OT_keyitem_remove(bpy.types.Operator): def execute(self, context): wm = context.manager kmi = context.keyitem - km = context.keymap # wm.active_keymap + km = context.keymap km.remove_item(kmi) return ('FINISHED',) diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h index 0b69b72aa41..c17ae1c53c8 100644 --- a/source/blender/makesdna/DNA_windowmanager_types.h +++ b/source/blender/makesdna/DNA_windowmanager_types.h @@ -123,7 +123,6 @@ typedef struct wmWindowManager { ListBase keyconfigs; /* known key configurations */ struct wmKeyConfig *defaultconf; /* default configuration, not saved */ - int defaultactmap, pad2; /* active keymap from default for editing */ ListBase timers; /* active timers */ struct wmTimer *autosavetimer; /* timer for auto save */ @@ -301,6 +300,8 @@ typedef struct wmKeyConfig { char idname[64]; /* unique name */ char basename[64]; /* idname of configuration this is derives from, "" if none */ + char filter[64]; /* search term for filtering in the UI */ + ListBase keymaps; int actkeymap, flag; } wmKeyConfig; diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c index b17cefcccac..7809c3a8c34 100644 --- a/source/blender/makesrna/intern/rna_wm.c +++ b/source/blender/makesrna/intern/rna_wm.c @@ -535,36 +535,6 @@ static void rna_WindowManager_active_keyconfig_set(PointerRNA *ptr, PointerRNA v BLI_strncpy(U.keyconfigstr, kc->idname, sizeof(U.keyconfigstr)); } -static PointerRNA rna_WindowManager_active_keymap_get(PointerRNA *ptr) -{ - wmWindowManager *wm= ptr->data; - wmKeyMap *km= NULL; - - if(wm->defaultconf) { - km= BLI_findlink(&wm->defaultconf->keymaps, wm->defaultactmap); - - if(!km) - km= wm->defaultconf->keymaps.first; - } - - return rna_pointer_inherit_refine(ptr, &RNA_KeyMap, WM_keymap_active(wm, km)); -} - -static void rna_WindowManager_active_keymap_set(PointerRNA *ptr, PointerRNA value) -{ - wmWindowManager *wm= ptr->data; - wmKeyMap *km= value.data; - int index; - - if(wm->defaultconf && km) { - km= WM_keymap_find(wm->defaultconf, km->idname, km->spaceid, km->regionid); - index= BLI_findindex(&wm->defaultconf->keymaps, km); - - if(index != -1) wm->defaultactmap= index; - else wm->defaultactmap= 0; - } -} - static void rna_wmKeyMapItem_idname_get(PointerRNA *ptr, char *value) { wmKeyMapItem *kmi= ptr->data; @@ -848,12 +818,6 @@ static void rna_def_windowmanager(BlenderRNA *brna) RNA_def_property_struct_type(prop, "KeyConfig"); RNA_def_property_ui_text(prop, "Default Key Configuration", ""); - prop= RNA_def_property(srna, "active_keymap", PROP_POINTER, PROP_NEVER_NULL); - RNA_def_property_struct_type(prop, "KeyMap"); - RNA_def_property_flag(prop, PROP_EDITABLE); - RNA_def_property_pointer_funcs(prop, "rna_WindowManager_active_keymap_get", "rna_WindowManager_active_keymap_set", 0); - RNA_def_property_ui_text(prop, "Active Key Map", ""); - RNA_api_wm(srna); } @@ -881,6 +845,10 @@ static void rna_def_keyconfig(BlenderRNA *brna) RNA_def_property_string_sdna(prop, NULL, "idname"); RNA_def_property_ui_text(prop, "Name", "Name of the key configuration."); RNA_def_struct_name_property(srna, prop); + + prop= RNA_def_property(srna, "filter", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "filter"); + RNA_def_property_ui_text(prop, "Filter", "Search term for filtering in the UI."); prop= RNA_def_property(srna, "keymaps", PROP_COLLECTION, PROP_NONE); RNA_def_property_struct_type(prop, "KeyMap"); @@ -1011,7 +979,7 @@ static void rna_def_keyconfig(BlenderRNA *brna) prop= RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", KMI_EXPANDED); - RNA_def_property_ui_text(prop, "Expanded", "Expanded in the user interface."); + RNA_def_property_ui_text(prop, "Expanded", "Show key map event and property details in the user interface."); RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1); prop= RNA_def_property(srna, "propvalue", PROP_ENUM, PROP_NONE);