KEYMAP REFACTORING
[blender.git] / source / blender / makesrna / intern / rna_wm.c
index a046be59ab512739bbb29c6f63f0ed85a249d9fa..307cf0e175add145871a4bbf490ec584328f7f9b 100644 (file)
@@ -578,22 +578,6 @@ static EnumPropertyItem *rna_KeyMapItem_propvalue_itemf(bContext *C, PointerRNA
        wmKeyConfig *kc;
        wmKeyMap *km;
 
-       /* check user keymaps */
-       for(km=U.keymaps.first; km; km=km->next) {
-               wmKeyMapItem *kmi;
-               for (kmi=km->items.first; kmi; kmi=kmi->next) {
-                       if (kmi == ptr->data) {
-                               if (!km->modal_items) {
-                                       if (!WM_keymap_user_init(wm, km)) {
-                                               return keymap_propvalue_items; /* ERROR */
-                                       }
-                               }
-
-                               return km->modal_items;
-                       }
-               }
-       }
-
        for(kc=wm->keyconfigs.first; kc; kc=kc->next) {
                for(km=kc->keymaps.first; km; km=km->next) {
                        /* only check if it's a modal keymap */
@@ -654,12 +638,13 @@ static PointerRNA rna_WindowManager_active_keyconfig_get(PointerRNA *ptr)
        return rna_pointer_inherit_refine(ptr, &RNA_KeyConfig, kc);
 }
 
-static void rna_WindowManager_active_keyconfig_set(PointerRNA *UNUSED(ptr), PointerRNA value)
+static void rna_WindowManager_active_keyconfig_set(PointerRNA *ptr, PointerRNA value)
 {
+       wmWindowManager *wm= ptr->data;
        wmKeyConfig *kc= value.data;
 
        if(kc)
-               BLI_strncpy(U.keyconfigstr, kc->idname, sizeof(U.keyconfigstr));
+               WM_keyconfig_set_active(wm, kc->idname);
 }
 
 static void rna_wmKeyMapItem_idname_get(PointerRNA *ptr, char *value)
@@ -1130,93 +1115,6 @@ static StructRNA* rna_MacroOperator_refine(PointerRNA *opr)
        return (op->type && op->type->ext.srna)? op->type->ext.srna: &RNA_Macro;
 }
 
-static wmKeyMapItem *rna_KeyMap_item_new(wmKeyMap *km, ReportList *reports, const char *idname, int type, int value, int any, int shift, int ctrl, int alt, int oskey, int keymodifier)
-{
-//     wmWindowManager *wm = CTX_wm_manager(C);
-       char idname_bl[OP_MAX_TYPENAME];
-       int modifier= 0;
-
-       /* only on non-modal maps */
-       if (km->flag & KEYMAP_MODAL) {
-               BKE_report(reports, RPT_ERROR, "Not a non-modal keymap.");
-               return NULL;
-       }
-
-       WM_operator_bl_idname(idname_bl, idname);
-
-       if(shift) modifier |= KM_SHIFT;
-       if(ctrl) modifier |= KM_CTRL;
-       if(alt) modifier |= KM_ALT;
-       if(oskey) modifier |= KM_OSKEY;
-
-       if(any) modifier = KM_ANY;
-
-       return WM_keymap_add_item(km, idname_bl, type, value, modifier, keymodifier);
-}
-
-static wmKeyMapItem *rna_KeyMap_item_new_modal(wmKeyMap *km, bContext *C, ReportList *reports, const char *propvalue_str, int type, int value, int any, int shift, int ctrl, int alt, int oskey, int keymodifier)
-{
-       wmWindowManager *wm = CTX_wm_manager(C);
-       int modifier= 0;
-       int propvalue = 0;
-
-       /* only modal maps */
-       if ((km->flag & KEYMAP_MODAL) == 0) {
-               BKE_report(reports, RPT_ERROR, "Not a modal keymap.");
-               return NULL;
-       }
-
-       if (!km->modal_items) {
-               if(!WM_keymap_user_init(wm, km)) {
-                       BKE_report(reports, RPT_ERROR, "User defined keymap doesn't correspond to a system keymap.");
-                       return NULL;
-               }
-       }
-
-       if (!km->modal_items) {
-               BKE_report(reports, RPT_ERROR, "No property values defined.");
-               return NULL;
-       }
-
-
-       if(RNA_enum_value_from_id(km->modal_items, propvalue_str, &propvalue)==0) {
-               BKE_report(reports, RPT_WARNING, "Property value not in enumeration.");
-       }
-
-       if(shift) modifier |= KM_SHIFT;
-       if(ctrl) modifier |= KM_CTRL;
-       if(alt) modifier |= KM_ALT;
-       if(oskey) modifier |= KM_OSKEY;
-
-       if(any) modifier = KM_ANY;
-
-       return WM_modalkeymap_add_item(km, type, value, modifier, keymodifier, propvalue);
-}
-
-static wmKeyMap *rna_keymap_new(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid, int modal)
-{
-       if (modal == 0) {
-               return WM_keymap_find(keyconf, idname, spaceid, regionid);
-       } else {
-               return WM_modalkeymap_add(keyconf, idname, NULL); /* items will be lazy init */
-       }
-}
-
-static wmKeyMap *rna_keymap_find(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid)
-{
-       return WM_keymap_list_find(&keyconf->keymaps, idname, spaceid, regionid);
-}
-
-static wmKeyMap *rna_keymap_find_modal(wmKeyConfig *UNUSED(keyconf), const char *idname)
-{
-       wmOperatorType *ot = WM_operatortype_find(idname, 0);
-
-       if (!ot)
-               return NULL;
-       else
-               return ot->modalkeymap;
-}
-
 /* just to work around 'const char *' warning and to ensure this is a python op */
 static void rna_Operator_bl_idname_set(PointerRNA *ptr, const char *value)
 {
@@ -1242,6 +1140,12 @@ static void rna_Operator_bl_description_set(PointerRNA *ptr, const char *value)
        else            assert(!"setting the bl_description on a non-builtin operator");
 }
 
+static void rna_KeyMapItem_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+       wmKeyMapItem *kmi= ptr->data;
+       WM_keyconfig_update_tag(NULL, kmi);
+}
+
 #else /* RNA_RUNTIME */
 
 static void rna_def_operator(BlenderRNA *brna)
@@ -1566,9 +1470,6 @@ static void rna_def_wm_keyconfigs(BlenderRNA *brna, PropertyRNA *cprop)
        StructRNA *srna;
        PropertyRNA *prop;
 
-       FunctionRNA *func;
-       PropertyRNA *parm;
-
        RNA_def_property_srna(cprop, "KeyConfigurations");
        srna= RNA_def_struct(brna, "KeyConfigurations", NULL);
        RNA_def_struct_sdna(srna, "wmWindowManager");
@@ -1578,23 +1479,24 @@ static void rna_def_wm_keyconfigs(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_property_struct_type(prop, "KeyConfig");
        RNA_def_property_pointer_funcs(prop, "rna_WindowManager_active_keyconfig_get", "rna_WindowManager_active_keyconfig_set", NULL, NULL);
        RNA_def_property_flag(prop, PROP_EDITABLE);
-       RNA_def_property_ui_text(prop, "Active KeyConfig", "Active wm KeyConfig");
+       RNA_def_property_ui_text(prop, "Active KeyConfig", "Active key configuration (preset)");
        
        prop= RNA_def_property(srna, "default", PROP_POINTER, PROP_NEVER_NULL);
        RNA_def_property_pointer_sdna(prop, NULL, "defaultconf");
        RNA_def_property_struct_type(prop, "KeyConfig");
-       RNA_def_property_ui_text(prop, "Default Key Configuration", "");
+       RNA_def_property_ui_text(prop, "Default Key Configuration", "Default builtin key configuration");
+
+       prop= RNA_def_property(srna, "addon", PROP_POINTER, PROP_NEVER_NULL);
+       RNA_def_property_pointer_sdna(prop, NULL, "addonconf");
+       RNA_def_property_struct_type(prop, "KeyConfig");
+       RNA_def_property_ui_text(prop, "Addon Key Configuration", "Key configuration that can be extended by addons, and is added to the active configuration when handling events");
+
+       prop= RNA_def_property(srna, "user", PROP_POINTER, PROP_NEVER_NULL);
+       RNA_def_property_pointer_sdna(prop, NULL, "userconf");
+       RNA_def_property_struct_type(prop, "KeyConfig");
+       RNA_def_property_ui_text(prop, "User Key Configuration", "Final key configuration that combines keymaps from the active and addon configurations, and can be edited by the user");
        
-       /* funcs */
-       func= RNA_def_function(srna, "new", "WM_keyconfig_new_user"); // add_keyconfig
-       parm= RNA_def_string(func, "name", "", 0, "Name", "");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
-       parm= RNA_def_pointer(func, "keyconfig", "KeyConfig", "Key Configuration", "Added key configuration.");
-       RNA_def_function_return(func, parm);
-
-       func= RNA_def_function(srna, "remove", "WM_keyconfig_remove"); // remove_keyconfig
-       parm= RNA_def_pointer(func, "keyconfig", "KeyConfig", "Key Configuration", "Removed key configuration.");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_api_keyconfigs(srna);
 }
 
 static void rna_def_windowmanager(BlenderRNA *brna)
@@ -1631,107 +1533,30 @@ static void rna_def_windowmanager(BlenderRNA *brna)
 static void rna_def_keymap_items(BlenderRNA *brna, PropertyRNA *cprop)
 {
        StructRNA *srna;
-//     PropertyRNA *prop;
-
-       FunctionRNA *func;
-       PropertyRNA *parm;
        
        RNA_def_property_srna(cprop, "KeyMapItems");
        srna= RNA_def_struct(brna, "KeyMapItems", NULL);
        RNA_def_struct_sdna(srna, "wmKeyMap");
        RNA_def_struct_ui_text(srna, "KeyMap Items", "Collection of keymap items");
 
-       func= RNA_def_function(srna, "new", "rna_KeyMap_item_new");
-       RNA_def_function_flag(func, FUNC_USE_REPORTS);
-       parm= RNA_def_string(func, "idname", "", 0, "Operator Identifier", "");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
-       parm= RNA_def_enum(func, "type", event_type_items, 0, "Type", "");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
-       parm= RNA_def_enum(func, "value", event_value_items, 0, "Value", "");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
-       RNA_def_boolean(func, "any", 0, "Any", "");
-       RNA_def_boolean(func, "shift", 0, "Shift", "");
-       RNA_def_boolean(func, "ctrl", 0, "Ctrl", "");
-       RNA_def_boolean(func, "alt", 0, "Alt", "");
-       RNA_def_boolean(func, "oskey", 0, "OS Key", "");
-       RNA_def_enum(func, "key_modifier", event_type_items, 0, "Key Modifier", "");
-       parm= RNA_def_pointer(func, "item", "KeyMapItem", "Item", "Added key map item.");
-       RNA_def_function_return(func, parm);
-
-       func= RNA_def_function(srna, "new_modal", "rna_KeyMap_item_new_modal");
-       RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
-       parm= RNA_def_string(func, "propvalue", "", 0, "Property Value", "");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
-       parm= RNA_def_enum(func, "type", event_type_items, 0, "Type", "");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
-       parm= RNA_def_enum(func, "value", event_value_items, 0, "Value", "");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
-       RNA_def_boolean(func, "any", 0, "Any", "");
-       RNA_def_boolean(func, "shift", 0, "Shift", "");
-       RNA_def_boolean(func, "ctrl", 0, "Ctrl", "");
-       RNA_def_boolean(func, "alt", 0, "Alt", "");
-       RNA_def_boolean(func, "oskey", 0, "OS Key", "");
-       RNA_def_enum(func, "key_modifier", event_type_items, 0, "Key Modifier", "");
-       parm= RNA_def_pointer(func, "item", "KeyMapItem", "Item", "Added key map item.");
-       RNA_def_function_return(func, parm);
-       
-       func= RNA_def_function(srna, "remove", "WM_keymap_remove_item");
-       parm= RNA_def_pointer(func, "item", "KeyMapItem", "Item", "");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
-
-       func= RNA_def_function(srna, "from_id", "WM_keymap_item_find_id");
-       parm= RNA_def_property(func, "id", PROP_INT, PROP_NONE);
-       RNA_def_property_flag(parm, PROP_REQUIRED);
-       RNA_def_property_ui_text(parm, "id", "ID of the item");
-       parm= RNA_def_pointer(func, "item", "KeyMapItem", "Item", "");
-       RNA_def_function_return(func, parm);
-       
+       RNA_api_keymapitems(srna);
 }
 
 static void rna_def_wm_keymaps(BlenderRNA *brna, PropertyRNA *cprop)
 {
        StructRNA *srna;
-       //PropertyRNA *prop;
-
-       FunctionRNA *func;
-       PropertyRNA *parm;
-
 
        RNA_def_property_srna(cprop, "KeyMaps");
        srna= RNA_def_struct(brna, "KeyMaps", NULL);
        RNA_def_struct_sdna(srna, "wmKeyConfig");
        RNA_def_struct_ui_text(srna, "Key Maps", "Collection of keymaps");
 
-       func= RNA_def_function(srna, "new", "rna_keymap_new"); // add_keymap
-       parm= RNA_def_string(func, "name", "", 0, "Name", "");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
-       RNA_def_enum(func, "space_type", space_type_items, SPACE_EMPTY, "Space Type", "");
-       RNA_def_enum(func, "region_type", region_type_items, RGN_TYPE_WINDOW, "Region Type", "");
-       RNA_def_boolean(func, "modal", 0, "Modal", "");
-       parm= RNA_def_pointer(func, "keymap", "KeyMap", "Key Map", "Added key map.");
-       RNA_def_function_return(func, parm);
-
-       func= RNA_def_function(srna, "find", "rna_keymap_find"); // find_keymap
-       parm= RNA_def_string(func, "name", "", 0, "Name", "");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
-       RNA_def_enum(func, "space_type", space_type_items, SPACE_EMPTY, "Space Type", "");
-       RNA_def_enum(func, "region_type", region_type_items, RGN_TYPE_WINDOW, "Region Type", "");
-       parm= RNA_def_pointer(func, "keymap", "KeyMap", "Key Map", "Corresponding key map.");
-       RNA_def_function_return(func, parm);
-
-       func= RNA_def_function(srna, "find_modal", "rna_keymap_find_modal"); // find_keymap_modal
-       parm= RNA_def_string(func, "name", "", 0, "Operator Name", "");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
-       parm= RNA_def_pointer(func, "keymap", "KeyMap", "Key Map", "Corresponding key map.");
-       RNA_def_function_return(func, parm);
-       
+       RNA_api_keymaps(srna);
 }
 
 static void rna_def_keyconfig(BlenderRNA *brna)
 {
        StructRNA *srna;
-       // FunctionRNA *func;
-       // PropertyRNA *parm;
        PropertyRNA *prop;
 
        static EnumPropertyItem map_type_items[] = {
@@ -1794,8 +1619,8 @@ static void rna_def_keyconfig(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Items", "Items in the keymap, linking an operator to an input event");
        rna_def_keymap_items(brna, prop);
 
-       prop= RNA_def_property(srna, "is_user_defined", PROP_BOOLEAN, PROP_NEVER_NULL);
-       RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYMAP_USER);
+       prop= RNA_def_property(srna, "is_user_modified", PROP_BOOLEAN, PROP_NEVER_NULL);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", KEYMAP_USER_MODIFIED);
        RNA_def_property_ui_text(prop, "User Defined", "Keymap is defined by the user");
 
        prop= RNA_def_property(srna, "is_modal", PROP_BOOLEAN, PROP_NONE);
@@ -1826,6 +1651,7 @@ static void rna_def_keyconfig(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Identifier", "Identifier of operator to call on input event");
        RNA_def_property_string_funcs(prop, "rna_wmKeyMapItem_idname_get", "rna_wmKeyMapItem_idname_length", "rna_wmKeyMapItem_idname_set");
        RNA_def_struct_name_property(srna, prop);
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
        
        prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
@@ -1836,62 +1662,73 @@ static void rna_def_keyconfig(BlenderRNA *brna)
        RNA_def_property_struct_type(prop, "OperatorProperties");
        RNA_def_property_pointer_funcs(prop, "rna_KeyMapItem_properties_get", NULL, NULL, NULL);
        RNA_def_property_ui_text(prop, "Properties", "Properties to set when the operator is called");
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
 
        prop= RNA_def_property(srna, "map_type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "maptype");
        RNA_def_property_enum_items(prop, map_type_items);
        RNA_def_property_enum_funcs(prop, "rna_wmKeyMapItem_map_type_get", "rna_wmKeyMapItem_map_type_set", NULL);
        RNA_def_property_ui_text(prop, "Map Type", "Type of event mapping");
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
 
        prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "type");
        RNA_def_property_enum_items(prop, event_type_items);
        RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_KeyMapItem_type_itemf");
        RNA_def_property_ui_text(prop, "Type", "Type of event");
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
 
        prop= RNA_def_property(srna, "value", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "val");
        RNA_def_property_enum_items(prop, event_value_items);
        RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_KeyMapItem_value_itemf");
        RNA_def_property_ui_text(prop, "Value", "");
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
 
        prop= RNA_def_property(srna, "id", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "id");
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "id", "ID of the item");
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
 
        prop= RNA_def_property(srna, "any", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_any_getf", "rna_KeyMapItem_any_setf");
        RNA_def_property_ui_text(prop, "Any", "Any modifier keys pressed");
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
 
        prop= RNA_def_property(srna, "shift", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "shift", 0);
 //     RNA_def_property_enum_sdna(prop, NULL, "shift");
 //     RNA_def_property_enum_items(prop, keymap_modifiers_items);
        RNA_def_property_ui_text(prop, "Shift", "Shift key pressed");
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
 
        prop= RNA_def_property(srna, "ctrl", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "ctrl", 0);
 //     RNA_def_property_enum_sdna(prop, NULL, "ctrl");
 //     RNA_def_property_enum_items(prop, keymap_modifiers_items);
        RNA_def_property_ui_text(prop, "Ctrl", "Control key pressed");
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
 
        prop= RNA_def_property(srna, "alt", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "alt", 0);
 //     RNA_def_property_enum_sdna(prop, NULL, "alt");
 //     RNA_def_property_enum_items(prop, keymap_modifiers_items);
        RNA_def_property_ui_text(prop, "Alt", "Alt key pressed");
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
 
        prop= RNA_def_property(srna, "oskey", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "oskey", 0);
 //     RNA_def_property_enum_sdna(prop, NULL, "oskey");
 //     RNA_def_property_enum_items(prop, keymap_modifiers_items);
        RNA_def_property_ui_text(prop, "OS Key", "Operating system key pressed");
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
 
        prop= RNA_def_property(srna, "key_modifier", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "keymodifier");
        RNA_def_property_enum_items(prop, event_type_items);
        RNA_def_property_ui_text(prop, "Key Modifier", "Regular key pressed as a modifier");
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
 
        prop= RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", KMI_EXPANDED);
@@ -1903,15 +1740,21 @@ static void rna_def_keyconfig(BlenderRNA *brna)
        RNA_def_property_enum_items(prop, keymap_propvalue_items);
        RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_KeyMapItem_propvalue_itemf");
        RNA_def_property_ui_text(prop, "Property Value", "The value this event translates to in a modal keymap");
+       RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
 
        prop= RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", KMI_INACTIVE);
        RNA_def_property_ui_text(prop, "Active", "Activate or deactivate item");
        RNA_def_property_ui_icon(prop, ICON_CHECKBOX_DEHLT, 1);
 
+       prop= RNA_def_property(srna, "is_user_modified", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", KMI_USER_MODIFIED);
+       RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+       RNA_def_property_ui_text(prop, "User Modified", "Is this keymap item modified by the user");
+
        prop= RNA_def_property(srna, "is_user_defined", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-       RNA_def_property_ui_text(prop, "User Defined", "Is this keymap item user defined (doesn't just override a builtin item)");
+       RNA_def_property_ui_text(prop, "User Defined", "Is this keymap item user defined (doesn't just replace a builtin item)");
        RNA_def_property_boolean_funcs(prop, "rna_KeyMapItem_userdefined_get", NULL);
 
        RNA_api_keymapitem(srna);