[Bf-blender-cvs] [0301835] master: Fix T38827: Input preferences can not find Left Mouse or Left Arrow

Campbell Barton noreply at git.blender.org
Tue Feb 25 14:39:56 CET 2014


Commit: 03018353f67a1fc5e65585844144cfdf5addd408
Author: Campbell Barton
Date:   Wed Feb 26 00:35:00 2014 +1100
https://developer.blender.org/rB03018353f67a1fc5e65585844144cfdf5addd408

Fix T38827: Input preferences can not find Left Mouse or Left Arrow

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

M	release/scripts/modules/rna_keymap_ui.py

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

diff --git a/release/scripts/modules/rna_keymap_ui.py b/release/scripts/modules/rna_keymap_ui.py
index e6112cb..89e794f 100644
--- a/release/scripts/modules/rna_keymap_ui.py
+++ b/release/scripts/modules/rna_keymap_ui.py
@@ -255,6 +255,9 @@ def draw_filtered(display_keymaps, filter_type, filter_text, layout):
         # KeyMapItem like dict, use for comparing against
         # attr: {states, ...}
         kmi_test_dict = {}
+        # Special handling of 'type' using a list if sets,
+        # keymap items must match against all.
+        kmi_test_type = []
 
         # initialize? - so if a if a kmi has a MOD assigned it wont show up.
         #~ for kv in key_mod.values():
@@ -265,11 +268,10 @@ def draw_filtered(display_keymaps, filter_type, filter_text, layout):
             if kk in filter_text_split:
                 filter_text_split.remove(kk)
                 kmi_test_dict[kv] = {True}
+
         # whats left should be the event type
-        if len(filter_text_split) > 1:
-            return False
-        elif filter_text_split:
-            kmi_type = filter_text_split[0].upper()
+        def kmi_type_set_from_string(kmi_type):
+            kmi_type = kmi_type.upper()
             kmi_type_set = set()
 
             if kmi_type in _EVENT_TYPES:
@@ -288,25 +290,38 @@ def draw_filtered(display_keymaps, filter_type, filter_text, layout):
                         for k, v in event_type_map.items():
                             if (kmi_type in k) or (kmi_type in v):
                                 kmi_type_set.add(v)
+            return kmi_type_set
+
+        kmi_type_set_combine = None
+        for i, kmi_type in enumerate(filter_text_split):
+            kmi_type_set = kmi_type_set_from_string(kmi_type)
 
             if not kmi_type_set:
                 return False
-            else:
-                kmi_test_dict["type"] = kmi_type_set
+
+            kmi_test_type.append(kmi_type_set)
+        # tiny optimization, sort sets so the smallest is first
+        # improve chances of failing early
+        kmi_test_type.sort(key=lambda kmi_type_set: len(kmi_type_set))
 
         # main filter func, runs many times
         def filter_func(kmi):
             for kk, ki in kmi_test_dict.items():
                 val = getattr(kmi, kk)
+                if val not in ki:
+                    return False
+
+            # special handling of 'type'
+            for ki in kmi_test_type:
+                val = kmi.type
                 if val == 'NONE' or val not in ki:
                     # exception for 'type'
                     # also inspect 'key_modifier' as a fallback
-                    if kk == "type":
-                        val = getattr(kmi, "key_modifier")
-                        if not (val == 'NONE' or val not in ki):
-                            continue
-
+                    val = kmi.key_modifier
+                    if not (val == 'NONE' or val not in ki):
+                        continue
                     return False
+
             return True
 
     for km, kc in display_keymaps:




More information about the Bf-blender-cvs mailing list