all remove functions now invalidate the RNA objects passed, to help script authors...
authorCampbell Barton <ideasman42@gmail.com>
Fri, 2 Nov 2012 09:41:26 +0000 (09:41 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Fri, 2 Nov 2012 09:41:26 +0000 (09:41 +0000)
31 files changed:
source/blender/blenkernel/BKE_colortools.h
source/blender/blenkernel/BKE_tracking.h
source/blender/blenkernel/intern/colortools.c
source/blender/blenkernel/intern/tracking.c
source/blender/collada/DocumentExporter.cpp
source/blender/collada/collada_internal.h
source/blender/editors/object/object_vgroup.c
source/blender/makesrna/intern/rna_action.c
source/blender/makesrna/intern/rna_animation.c
source/blender/makesrna/intern/rna_armature.c
source/blender/makesrna/intern/rna_color.c
source/blender/makesrna/intern/rna_curve.c
source/blender/makesrna/intern/rna_fcurve.c
source/blender/makesrna/intern/rna_gpencil.c
source/blender/makesrna/intern/rna_main_api.c
source/blender/makesrna/intern/rna_mask.c
source/blender/makesrna/intern/rna_mesh.c
source/blender/makesrna/intern/rna_meta.c
source/blender/makesrna/intern/rna_nla.c
source/blender/makesrna/intern/rna_nodetree.c
source/blender/makesrna/intern/rna_object.c
source/blender/makesrna/intern/rna_pose.c
source/blender/makesrna/intern/rna_scene.c
source/blender/makesrna/intern/rna_sequencer.c
source/blender/makesrna/intern/rna_sequencer_api.c
source/blender/makesrna/intern/rna_space.c
source/blender/makesrna/intern/rna_tracking.c
source/blender/makesrna/intern/rna_userdef.c
source/blender/makesrna/intern/rna_wm_api.c
source/blender/windowmanager/WM_keymap.h
source/blender/windowmanager/intern/wm_keymap.c

index f30cc57bde4335dc4f099d4126939345e22ea2cf..96e05aa87b9c0dbcf810fd6b8e8d639d50a532be 100644 (file)
@@ -63,8 +63,8 @@ void                curvemapping_set_black_white(struct CurveMapping *cumap, con
 #define CURVEMAP_SLOPE_POSITIVE 1
 void                    curvemap_reset(struct CurveMap *cuma, const struct rctf *clipr, int preset, int slope);
 void                    curvemap_remove(struct CurveMap *cuma, const short flag);
-void                    curvemap_remove_point(struct CurveMap *cuma, struct CurveMapPoint *cmp);
-struct CurveMapPoint    *curvemap_insert(struct CurveMap *cuma, float x, float y);
+int                     curvemap_remove_point(struct CurveMap *cuma, struct CurveMapPoint *cmp);
+struct CurveMapPoint   *curvemap_insert(struct CurveMap *cuma, float x, float y);
 void                    curvemap_sethandle(struct CurveMap *cuma, int type);
 
 void                curvemapping_changed(struct CurveMapping *cumap, int rem_doubles);
index 167f7bd831a2f2fb8ccc16e153ab8414fd712f7b..eb7004b1ceded0f710f86324c057aafe781ab07c 100644 (file)
@@ -114,7 +114,7 @@ void BKE_tracking_marker_get_subframe_position(struct MovieTrackingTrack *track,
 
 /* **** Object **** */
 struct MovieTrackingObject *BKE_tracking_object_add(struct MovieTracking *tracking, const char *name);
-void BKE_tracking_object_delete(struct MovieTracking *tracking, struct MovieTrackingObject *object);
+int BKE_tracking_object_delete(struct MovieTracking *tracking, struct MovieTrackingObject *object);
 
 void BKE_tracking_object_unique_name(struct MovieTracking *tracking, struct MovieTrackingObject *object);
 
index 0c369a463d5c28450da760053e878f802d9f50ef..75276adf518a8cdb2ea7345bf08b4ec345005749 100644 (file)
@@ -182,14 +182,14 @@ void curvemapping_set_black_white(CurveMapping *cumap, const float black[3], con
 /* ********** NOTE: requires curvemapping_changed() call after ******** */
 
 /* remove specified point */
-void curvemap_remove_point(CurveMap *cuma, CurveMapPoint *point)
+int curvemap_remove_point(CurveMap *cuma, CurveMapPoint *point)
 {
        CurveMapPoint *cmp;
        int a, b, removed = 0;
        
        /* must have 2 points minimum */
        if (cuma->totpoint <= 2)
-               return;
+               return FALSE;
 
        cmp = MEM_mallocN((cuma->totpoint) * sizeof(CurveMapPoint), "curve points");
 
@@ -205,6 +205,7 @@ void curvemap_remove_point(CurveMap *cuma, CurveMapPoint *point)
        MEM_freeN(cuma->curve);
        cuma->curve = cmp;
        cuma->totpoint -= removed;
+       return (removed != 0);
 }
 
 /* removes with flag set */
index e39ad4a08c03fb9be1a2468ffa29ac54267e7971..26775eaac8c91bfa8830eb438570fae6572ad4f2 100644 (file)
@@ -1189,17 +1189,17 @@ MovieTrackingObject *BKE_tracking_object_add(MovieTracking *tracking, const char
        return object;
 }
 
-void BKE_tracking_object_delete(MovieTracking *tracking, MovieTrackingObject *object)
+int BKE_tracking_object_delete(MovieTracking *tracking, MovieTrackingObject *object)
 {
        MovieTrackingTrack *track;
        int index = BLI_findindex(&tracking->objects, object);
 
-       if (index < 0)
-               return;
+       if (index == -1)
+               return FALSE;
 
        if (object->flag & TRACKING_OBJECT_CAMERA) {
                /* object used for camera solving can't be deleted */
-               return;
+               return FALSE;
        }
 
        track = object->tracks.first;
@@ -1215,10 +1215,11 @@ void BKE_tracking_object_delete(MovieTracking *tracking, MovieTrackingObject *ob
 
        tracking->tot_object--;
 
-       if (index > 0)
+       if (index != 0)
                tracking->objectnr = index - 1;
        else
                tracking->objectnr = 0;
+       return TRUE;
 }
 
 void BKE_tracking_object_unique_name(MovieTracking *tracking, MovieTrackingObject *object)
index f21a4f6c5578d6b6c53584a41748f082c4b052e2..c491326519f9e240ba34b50cc0accbad974f7dec 100644 (file)
@@ -110,6 +110,7 @@ extern char build_rev[];
 }
 
 #include "collada_internal.h"
+#include "collada_utils.h"
 #include "DocumentExporter.h"
 
 extern bool bc_has_object_type(LinkNode *export_set, short obtype);
index c1f75f996cecff39e9253687db39d09b61630df2..6eec6a1675e2693f733dc95443d4893a52ae225f 100644 (file)
@@ -88,6 +88,7 @@ extern std::string translate_id(const std::string &id);
 
 extern std::string id_name(void *id);
 
+extern std::string get_geometry_id(Object *ob);
 extern std::string get_geometry_id(Object *ob, bool use_instantiation);
 
 extern std::string get_light_id(Object *ob);
index c0f9ecfa5a26cb3562437c0a88d984a18c3d35da..05524af34f049269a783b5484d14c28d47eff311 100644 (file)
@@ -138,21 +138,12 @@ bDeformGroup *ED_vgroup_add(Object *ob)
 
 void ED_vgroup_delete(Object *ob, bDeformGroup *defgroup) 
 {
-       bDeformGroup *dg = (bDeformGroup *)ob->defbase.first;
-
-       while (dg) {
-               if (dg == defgroup)
-                       break;
-               dg = dg->next;
-       }
-
-       if (dg == NULL)
-               return;
+       BLI_assert(BLI_findindex(&ob->defbase, defgroup) != -1);
 
        if (ED_vgroup_object_is_edit_mode(ob))
-               vgroup_delete_edit_mode(ob, dg);
+               vgroup_delete_edit_mode(ob, defgroup);
        else
-               vgroup_delete_object_mode(ob, dg);
+               vgroup_delete_object_mode(ob, defgroup);
 }
 
 void ED_vgroup_clear(Object *ob)
index 6c6ccc5c4320ae9f7085533ddd3dab798fe3fbdb..ba1aca2babab047efd58b3b8fa268fd14f82a2b5 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <stdlib.h>
 
+#include "RNA_access.h"
 #include "RNA_define.h"
 #include "RNA_enum_types.h"
 
@@ -68,12 +69,13 @@ static bActionGroup *rna_Action_groups_new(bAction *act, const char name[])
        return action_groups_add_new(act, name);
 }
 
-static void rna_Action_groups_remove(bAction *act, ReportList *reports, bActionGroup *agrp)
+static void rna_Action_groups_remove(bAction *act, ReportList *reports, PointerRNA *agrp_ptr)
 {
+       bActionGroup *agrp = agrp_ptr->data;
        FCurve *fcu, *fcn;
        
        /* try to remove the F-Curve from the action */
-       if (!BLI_remlink_safe(&act->groups, agrp)) {
+       if (BLI_remlink_safe(&act->groups, agrp) == FALSE) {
                BKE_reportf(reports, RPT_ERROR, "Action group '%s' not found in action '%s'", agrp->name, act->id.name + 2);
                return;
        }
@@ -81,16 +83,16 @@ static void rna_Action_groups_remove(bAction *act, ReportList *reports, bActionG
        /* move every one one of the group's F-Curves out into the Action again */
        for (fcu = agrp->channels.first; (fcu) && (fcu->grp == agrp); fcu = fcn) {
                fcn = fcu->next;
-               
+
                /* remove from group */
                action_groups_remove_channel(act, fcu);
-               
+
                /* tack onto the end */
                BLI_addtail(&act->curves, fcu);
        }
-       
-       /* XXX, invalidates PyObject */
+
        MEM_freeN(agrp);
+       RNA_POINTER_INVALIDATE(agrp_ptr);
 }
 
 static FCurve *rna_Action_fcurve_new(bAction *act, ReportList *reports, const char *data_path,
@@ -112,8 +114,9 @@ static FCurve *rna_Action_fcurve_new(bAction *act, ReportList *reports, const ch
        return verify_fcurve(act, group, NULL, data_path, index, 1);
 }
 
-static void rna_Action_fcurve_remove(bAction *act, ReportList *reports, FCurve *fcu)
+static void rna_Action_fcurve_remove(bAction *act, ReportList *reports, PointerRNA *fcu_ptr)
 {
+       FCurve *fcu = fcu_ptr->data;
        if (fcu->grp) {
                if (BLI_findindex(&act->groups, fcu->grp) == -1) {
                        BKE_reportf(reports, RPT_ERROR, "F-Curve's action group '%s' not found in action '%s'",
@@ -123,6 +126,7 @@ static void rna_Action_fcurve_remove(bAction *act, ReportList *reports, FCurve *
                
                action_groups_remove_channel(act, fcu);
                free_fcurve(fcu);
+               RNA_POINTER_INVALIDATE(fcu_ptr);
        }
        else {
                if (BLI_findindex(&act->curves, fcu) == -1) {
@@ -132,6 +136,7 @@ static void rna_Action_fcurve_remove(bAction *act, ReportList *reports, FCurve *
                
                BLI_remlink(&act->curves, fcu);
                free_fcurve(fcu);
+               RNA_POINTER_INVALIDATE(fcu_ptr);
        }
 }
 
@@ -145,15 +150,16 @@ static TimeMarker *rna_Action_pose_markers_new(bAction *act, const char name[])
        return marker;
 }
 
-static void rna_Action_pose_markers_remove(bAction *act, ReportList *reports, TimeMarker *marker)
+static void rna_Action_pose_markers_remove(bAction *act, ReportList *reports, PointerRNA *marker_ptr)
 {
-       if (!BLI_remlink_safe(&act->markers, marker)) {
+       TimeMarker *marker = marker_ptr->data;
+       if (BLI_remlink_safe(&act->markers, marker) == FALSE) {
                BKE_reportf(reports, RPT_ERROR, "Timeline marker '%s' not found in action '%s'", marker->name, act->id.name + 2);
                return;
        }
 
-       /* XXX, invalidates PyObject */
        MEM_freeN(marker);
+       RNA_POINTER_INVALIDATE(marker_ptr);
 }
 
 static PointerRNA rna_Action_active_pose_marker_get(PointerRNA *ptr)
@@ -516,7 +522,8 @@ static void rna_def_action_groups(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove action group");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "action_group", "ActionGroup", "", "Action group to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 }
 
 static void rna_def_action_fcurves(BlenderRNA *brna, PropertyRNA *cprop)
@@ -547,7 +554,8 @@ static void rna_def_action_fcurves(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove action group");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "fcurve", "FCurve", "", "F-Curve to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 }
 
 static void rna_def_action_pose_markers(BlenderRNA *brna, PropertyRNA *cprop)
@@ -575,7 +583,8 @@ static void rna_def_action_pose_markers(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove a timeline marker");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "marker", "TimelineMarker", "", "Timeline marker to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
        
        prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
        RNA_def_property_struct_type(prop, "TimelineMarker");
index a68898112a0be805ba4d25124478fda41abb11d0..ce884fa4eccbd1d9aa703afb9522255c82db6b4a 100644 (file)
@@ -376,20 +376,23 @@ static KS_Path *rna_KeyingSet_paths_add(KeyingSet *keyingset, ReportList *report
        return ksp;
 }
 
-static void rna_KeyingSet_paths_remove(KeyingSet *keyingset, ReportList *reports, KS_Path *ksp)
+static void rna_KeyingSet_paths_remove(KeyingSet *keyingset, ReportList *reports, PointerRNA *ksp_ptr)
 {
+       KS_Path *ksp = ksp_ptr->data;
+
        /* if data is valid, call the API function for this */
-       if (keyingset && ksp) {
-               /* remove the active path from the KeyingSet */
-               BKE_keyingset_free_path(keyingset, ksp);
-                       
-               /* the active path number will most likely have changed */
-               /* TODO: we should get more fancy and actually check if it was removed, but this will do for now */
-               keyingset->active_path = 0;
-       }
-       else {
+       if ((keyingset && ksp) == FALSE) {
                BKE_report(reports, RPT_ERROR, "Keying set path could not be removed");
+               return;
        }
+
+       /* remove the active path from the KeyingSet */
+       BKE_keyingset_free_path(keyingset, ksp);
+       RNA_POINTER_INVALIDATE(ksp_ptr);
+
+       /* the active path number will most likely have changed */
+       /* TODO: we should get more fancy and actually check if it was removed, but this will do for now */
+       keyingset->active_path = 0;
 }
 
 static void rna_KeyingSet_paths_clear(KeyingSet *keyingset, ReportList *reports)
@@ -422,9 +425,17 @@ static NlaTrack *rna_NlaTrack_new(AnimData *adt, bContext *C, NlaTrack *track)
        return new_track;
 }
 
-static void rna_NlaTrack_remove(AnimData *adt, bContext *C, NlaTrack *track)
+static void rna_NlaTrack_remove(AnimData *adt, bContext *C, ReportList *reports, PointerRNA *track_ptr)
 {
+       NlaTrack *track = track_ptr->data;
+
+       if (BLI_findindex(&adt->nla_tracks, track) == -1) {
+               BKE_reportf(reports, RPT_ERROR, "NlaTrack '%s' can't be removed", track->name);
+               return;
+       }
+
        free_nlatrack(&adt->nla_tracks, track);
+       RNA_POINTER_INVALIDATE(track_ptr);
 
        WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_REMOVED, NULL);
 }
@@ -678,7 +689,8 @@ static void rna_def_keyingset_paths(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        /* path to remove */
        parm = RNA_def_pointer(func, "path", "KeyingSetPath", "Path", "");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 
 
        /* Remove All Paths */
@@ -783,10 +795,11 @@ static void rna_api_animdata_nla_tracks(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_return(func, parm);
        
        func = RNA_def_function(srna, "remove", "rna_NlaTrack_remove");
-       RNA_def_function_flag(func, FUNC_USE_CONTEXT);
+       RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_CONTEXT);
        RNA_def_function_ui_description(func, "Remove a NLA Track");
        parm = RNA_def_pointer(func, "track", "NlaTrack", "", "NLA Track to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 
        prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
        RNA_def_property_struct_type(prop, "NlaTrack");
index 4c188414cf8acc3f214e84044d71df430e50d1b2..4c566d71981d2ce100c200f88d2bd8835b66400e 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "BLI_math.h"
 
+#include "RNA_access.h"
 #include "RNA_define.h"
 
 #include "rna_internal.h"
@@ -109,8 +110,9 @@ static EditBone *rna_Armature_edit_bone_new(bArmature *arm, ReportList *reports,
        return ED_armature_edit_bone_add(arm, name);
 }
 
-static void rna_Armature_edit_bone_remove(bArmature *arm, ReportList *reports, EditBone *ebone)
+static void rna_Armature_edit_bone_remove(bArmature *arm, ReportList *reports, PointerRNA *ebone_ptr)
 {
+       EditBone *ebone = ebone_ptr->data;
        if (arm->edbo == NULL) {
                BKE_reportf(reports, RPT_ERROR, "Armature '%s' not in edit mode, cannot remove an editbone", arm->id.name + 2);
                return;
@@ -122,6 +124,7 @@ static void rna_Armature_edit_bone_remove(bArmature *arm, ReportList *reports, E
        }
 
        ED_armature_edit_bone_remove(arm, ebone);
+       RNA_POINTER_INVALIDATE(ebone_ptr);
 }
 
 static void rna_Armature_update_layers(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
@@ -865,7 +868,8 @@ static void rna_def_armature_edit_bones(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove an existing bone from the armature");
        /* target to remove*/
        parm = RNA_def_pointer(func, "bone", "EditBone", "", "EditBone to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 }
 
 static void rna_def_armature(BlenderRNA *brna)
index c5f1ac748fabe240b6d5e33e438adf77b39db7a3..c93d2ef15cf3cb423d042e818814d47c0bec42df 100644 (file)
@@ -329,12 +329,27 @@ static CBData *rna_ColorRampElement_new(struct ColorBand *coba, ReportList *repo
        return element;
 }
 
-static void rna_ColorRampElement_remove(struct ColorBand *coba, ReportList *reports, CBData *element)
+static void rna_ColorRampElement_remove(struct ColorBand *coba, ReportList *reports, PointerRNA *element_ptr)
 {
+       CBData *element = element_ptr->data;
        int index = (int)(element - coba->data);
-       if (colorband_element_remove(coba, index) == 0)
+       if (colorband_element_remove(coba, index) == FALSE) {
                BKE_report(reports, RPT_ERROR, "Element not found in element collection or last element");
+               return;
+       }
 
+       RNA_POINTER_INVALIDATE(element_ptr);
+}
+
+void rna_CurveMap_remove_point(CurveMap *cuma, ReportList *reports, PointerRNA *point_ptr)
+{
+       CurveMapPoint *point = point_ptr->data;
+       if (curvemap_remove_point(cuma, point) == FALSE) {
+               BKE_report(reports, RPT_ERROR, "Unable to remove curve point");
+               return;
+       }
+
+       RNA_POINTER_INVALIDATE(point_ptr);
 }
 
 static void rna_Scopes_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
@@ -559,10 +574,12 @@ static void rna_def_curvemap_points_api(BlenderRNA *brna, PropertyRNA *cprop)
        parm = RNA_def_pointer(func, "point", "CurveMapPoint", "", "New point");
        RNA_def_function_return(func, parm);
 
-       func = RNA_def_function(srna, "remove", "curvemap_remove_point");
+       func = RNA_def_function(srna, "remove", "rna_CurveMap_remove_point");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Delete point from CurveMap");
        parm = RNA_def_pointer(func, "point", "CurveMapPoint", "", "PointElement to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 }
 
 static void rna_def_curvemap(BlenderRNA *brna)
@@ -711,7 +728,8 @@ static void rna_def_color_ramp_element_api(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Delete element from ColorRamp");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "element", "ColorRampElement", "", "Element to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 }
 
 static void rna_def_color_ramp(BlenderRNA *brna)
index 354d7bae1ed3aab4f07b89d0958db351340233a1..35699c6ef3fce8f47a8603048e955c5e6015621d 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <stdlib.h>
 
+#include "RNA_access.h"
 #include "RNA_define.h"
 
 #include "rna_internal.h"
@@ -573,20 +574,18 @@ static Nurb *rna_Curve_spline_new(Curve *cu, int type)
        return nu;
 }
 
-static void rna_Curve_spline_remove(Curve *cu, ReportList *reports, Nurb *nu)
+static void rna_Curve_spline_remove(Curve *cu, ReportList *reports, PointerRNA *nu_ptr)
 {
-       int found = 0;
+       Nurb *nu = nu_ptr->data;
        ListBase *nurbs = BKE_curve_nurbs_get(cu);
 
-       found = BLI_remlink_safe(nurbs, nu);
-
-       if (!found) {
+       if (BLI_remlink_safe(nurbs, nu) == FALSE) {
                BKE_reportf(reports, RPT_ERROR, "Curve '%s' does not contain spline given", cu->id.name + 2);
                return;
        }
 
        BKE_nurb_free(nu);
-       /* invalidate pointer!, no can do */
+       RNA_POINTER_INVALIDATE(nu_ptr);
 
        DAG_id_tag_update(&cu->id, OB_RECALC_DATA);
        WM_main_add_notifier(NC_GEOM | ND_DATA, NULL);
@@ -1171,7 +1170,8 @@ static void rna_def_curve_spline_points(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove a spline from a curve");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "spline", "Spline", "", "The spline to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 #endif
 }
 
@@ -1198,7 +1198,8 @@ static void rna_def_curve_spline_bezpoints(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove a spline from a curve");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "spline", "Spline", "", "The spline to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 #endif
 }
 
@@ -1227,7 +1228,8 @@ static void rna_def_curve_splines(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove a spline from a curve");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "spline", "Spline", "", "The spline to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 
        func = RNA_def_function(srna, "clear", "rna_Curve_spline_clear");
        RNA_def_function_ui_description(func, "Remove all spline from a curve");
index d899b5833bbe85a62f32c54791fee5f4105197c3..4250acf5848c94ae5c344abc43e566f8924cb85e 100644 (file)
@@ -409,14 +409,16 @@ static DriverVar *rna_Driver_new_variable(ChannelDriver *driver)
        return driver_add_new_variable(driver);
 }
 
-static void rna_Driver_remove_variable(ChannelDriver *driver, ReportList *reports, DriverVar *dvar)
+static void rna_Driver_remove_variable(ChannelDriver *driver, ReportList *reports, PointerRNA *dvar_ptr)
 {
+       DriverVar *dvar = dvar_ptr->data;
        if (BLI_findindex(&driver->variables, dvar) == -1) {
                BKE_report(reports, RPT_ERROR, "Variable does not exist in this driver");
                return;
        }
 
        driver_free_variable(driver, dvar);
+       RNA_POINTER_INVALIDATE(dvar_ptr);
 }
 
 
@@ -438,13 +440,16 @@ static FModifier *rna_FCurve_modifiers_new(FCurve *fcu, int type)
        return add_fmodifier(&fcu->modifiers, type);
 }
 
-static void rna_FCurve_modifiers_remove(FCurve *fcu, ReportList *reports, FModifier *fcm)
+static void rna_FCurve_modifiers_remove(FCurve *fcu, ReportList *reports, PointerRNA *fcm_ptr)
 {
+       FModifier *fcm = fcm_ptr->data;
        if (BLI_findindex(&fcu->modifiers, fcm) == -1) {
                BKE_reportf(reports, RPT_ERROR, "F-Curve modifier '%s' not found in F-Curve", fcm->name);
                return;
        }
+
        remove_fmodifier(&fcu->modifiers, fcm);
+       RNA_POINTER_INVALIDATE(fcm_ptr);
 }
 
 static void rna_FModifier_active_set(PointerRNA *ptr, int UNUSED(value))
@@ -610,8 +615,9 @@ static void rna_FKeyframe_points_add(FCurve *fcu, int tot)
        }
 }
 
-static void rna_FKeyframe_points_remove(FCurve *fcu, ReportList *reports, BezTriple *bezt, int do_fast)
+static void rna_FKeyframe_points_remove(FCurve *fcu, ReportList *reports, PointerRNA *bezt_ptr, int do_fast)
 {
+       BezTriple *bezt = bezt_ptr->data;
        int index = (int)(bezt - fcu->bezt);
        if (index < 0 || index >= fcu->totvert) {
                BKE_report(reports, RPT_ERROR, "Keyframe not in F-Curve");
@@ -619,6 +625,7 @@ static void rna_FKeyframe_points_remove(FCurve *fcu, ReportList *reports, BezTri
        }
 
        delete_fcurve_key(fcu, index, !do_fast);
+       RNA_POINTER_INVALIDATE(bezt_ptr);
 }
 
 static void rna_fcurve_range(FCurve *fcu, float range[2])
@@ -1263,7 +1270,8 @@ static void rna_def_channeldriver_variables(BlenderRNA *brna, PropertyRNA *cprop
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        /* target to remove */
        parm = RNA_def_pointer(func, "variable", "DriverVariable", "", "Variable to remove from the driver");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 }
 
 static void rna_def_channeldriver(BlenderRNA *brna)
@@ -1458,7 +1466,8 @@ static void rna_def_fcurve_modifiers(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove a modifier from this F-Curve");
        /* modifier to remove */
        parm = RNA_def_pointer(func, "modifier", "FModifier", "", "Removed modifier");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 }
 
 /* fcurve.keyframe_points */
@@ -1503,7 +1512,8 @@ static void rna_def_fcurve_keyframe_points(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove keyframe from an F-Curve");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "keyframe", "Keyframe", "", "Keyframe to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
        /* optional */
        RNA_def_boolean(func, "fast", 0, "Fast", "Fast keyframe removal to avoid recalculating the curve each time");
 }
index 1fc8e73bb6961064d9a33f37e5070d3162955f2f..b3c1f4dd50573e92dcef61ffce6039ff2a45f2e2 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <stdlib.h>
 
+#include "RNA_access.h"
 #include "RNA_define.h"
 
 #include "rna_internal.h"
@@ -162,14 +163,16 @@ static bGPDstroke *rna_GPencil_stroke_new(bGPDframe *frame)
        return stroke;
 }
 
-static void rna_GPencil_stroke_remove(bGPDframe *frame, ReportList *reports, bGPDstroke *stroke)
+static void rna_GPencil_stroke_remove(bGPDframe *frame, ReportList *reports, PointerRNA *stroke_ptr)
 {
+       bGPDstroke *stroke = stroke_ptr->data;
        if (BLI_findindex(&frame->strokes, stroke) == -1) {
                BKE_report(reports, RPT_ERROR, "Stroke not found in grease pencil frame");
                return;
        }
-       
+
        BLI_freelinkN(&frame->strokes, stroke);
+       RNA_POINTER_INVALIDATE(stroke_ptr);
 
        WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL);
 }
@@ -190,14 +193,16 @@ static bGPDframe *rna_GPencil_frame_new(bGPDlayer *layer, ReportList *reports, i
        return frame;
 }
 
-static void rna_GPencil_frame_remove(bGPDlayer *layer, ReportList *reports, bGPDframe *frame)
+static void rna_GPencil_frame_remove(bGPDlayer *layer, ReportList *reports, PointerRNA *frame_ptr)
 {
+       bGPDframe *frame = frame_ptr->data;
        if (BLI_findindex(&layer->frames, frame) == -1) {
                BKE_report(reports, RPT_ERROR, "Frame not found in grease pencil layer");
                return;
        }
-       
+
        gpencil_layer_delframe(layer, frame);
+       RNA_POINTER_INVALIDATE(frame_ptr);
 
        WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL);
 }
@@ -226,14 +231,16 @@ static bGPDlayer *rna_GPencil_layer_new(bGPdata *gpd, const char *name, int seta
        return gl;
 }
 
-static void rna_GPencil_layer_remove(bGPdata *gpd, ReportList *reports, bGPDlayer *layer)
+static void rna_GPencil_layer_remove(bGPdata *gpd, ReportList *reports, PointerRNA *layer_ptr)
 {
+       bGPDlayer *layer = layer_ptr->data;
        if (BLI_findindex(&gpd->layers, layer) == -1) {
                BKE_report(reports, RPT_ERROR, "Layer not found in grease pencil data");
                return;
        }
-       
+
        gpencil_layer_delete(gpd, layer);
+       RNA_POINTER_INVALIDATE(layer_ptr);
 
        WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
 }
@@ -357,7 +364,8 @@ static void rna_def_gpencil_strokes_api(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove a grease pencil frame");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "stroke", "GPencilStroke", "Stroke", "The stroke to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 }
 
 static void rna_def_gpencil_frame(BlenderRNA *brna)
@@ -421,7 +429,8 @@ static void rna_def_gpencil_frames_api(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove a grease pencil frame");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "frame", "GPencilFrame", "Frame", "The frame to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 
        func = RNA_def_function(srna, "copy", "rna_GPencil_frame_copy");
        RNA_def_function_ui_description(func, "Copy a grease pencil frame");
@@ -568,7 +577,8 @@ static void rna_def_gpencil_layers_api(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove a grease pencil layer");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "layer", "GPencilLayer", "", "The layer to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 
        prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
        RNA_def_property_struct_type(prop, "GreasePencil");
index 2d62e377cea359fe6c62ec7c3c552d83e7f4e5b5..cf9415a75e77825a00ae5f6d4b370f4ebbc5c4e5 100644 (file)
@@ -204,6 +204,7 @@ static void rna_Main_objects_remove(Main *bmain, ReportList *reports, PointerRNA
        if (ID_REAL_USERS(object) <= 0) {
                BKE_object_unlink(object); /* needed or ID pointers to this are not cleared */
                BKE_libblock_free(&bmain->object, object);
+               RNA_POINTER_INVALIDATE(object_ptr);
        }
        else {
                BKE_reportf(reports, RPT_ERROR, "Object '%s' must have zero users to be removed, found %d",
index d7243dc519f1ac82c9a13eff9d9503df7adf7881..56caa254a59e9964bb1ee4a4f969288918d857e8 100644 (file)
@@ -315,14 +315,16 @@ static MaskLayer *rna_Mask_layers_new(Mask *mask, const char *name)
        return masklay;
 }
 
-static void rna_Mask_layers_remove(Mask *mask, ReportList *reports, MaskLayer *masklay)
+static void rna_Mask_layers_remove(Mask *mask, ReportList *reports, PointerRNA *masklay_ptr)
 {
+       MaskLayer *masklay = masklay_ptr->data;
        if (BLI_findindex(&mask->masklayers, masklay) == -1) {
                BKE_reportf(reports, RPT_ERROR, "Mask layer '%s' not found in mask '%s'", masklay->name, mask->id.name + 2);
                return;
        }
 
        BKE_mask_layer_remove(mask, masklay);
+       RNA_POINTER_INVALIDATE(masklay_ptr);
 
        WM_main_add_notifier(NC_MASK | NA_EDITED, mask);
 }
@@ -705,7 +707,9 @@ static void rna_def_masklayers(BlenderRNA *brna, PropertyRNA *cprop)
        func = RNA_def_function(srna, "remove", "rna_Mask_layers_remove");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove layer from this mask");
-       RNA_def_pointer(func, "layer", "MaskLayer", "", "Shape to be removed");
+       parm = RNA_def_pointer(func, "layer", "MaskLayer", "", "Shape to be removed");
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 
        /* clear all layers */
        func = RNA_def_function(srna, "clear", "rna_Mask_layers_clear");
index 048c38d33658ff823a1a29ad53336757fb7b7425..f0b84332d07f0b1ac60f9c80f77d66f9603beb1b 100644 (file)
@@ -2394,7 +2394,8 @@ static void rna_def_loop_colors(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove a vertex color layer");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "layer", "Layer", "", "The layer to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 #endif
 
        prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_UNSIGNED);
@@ -2571,7 +2572,8 @@ static void rna_def_uv_textures(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove a vertex color layer");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "layer", "Layer", "", "The layer to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 #endif
 
        prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_UNSIGNED);
index fe2c29632f2e71ce14d4182cc14759d9fd2e1597..08eefc082bfc4b696d533be6b518a8ee792b72d9 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <stdlib.h>
 
+#include "RNA_access.h"
 #include "RNA_define.h"
 #include "RNA_enum_types.h"
 
@@ -126,19 +127,17 @@ static MetaElem *rna_MetaBall_elements_new(MetaBall *mb, int type)
        return ml;
 }
 
-static void rna_MetaBall_elements_remove(MetaBall *mb, ReportList *reports, MetaElem *ml)
+static void rna_MetaBall_elements_remove(MetaBall *mb, ReportList *reports, PointerRNA *ml_ptr)
 {
-       int found = 0;
+       MetaElem *ml = ml_ptr->data;
 
-       found = BLI_remlink_safe(&mb->elems, ml);
-
-       if (!found) {
+       if (BLI_remlink_safe(&mb->elems, ml) == FALSE) {
                BKE_reportf(reports, RPT_ERROR, "Metaball '%s' does not contain spline given", mb->id.name + 2);
                return;
        }
 
        MEM_freeN(ml);
-       /* invalidate pointer!, no can do */
+       RNA_POINTER_INVALIDATE(ml_ptr);
 
        /* cheating way for importers to avoid slow updates */
        if (mb->id.us > 0) {
@@ -254,7 +253,8 @@ static void rna_def_metaball_elements(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove an element from the metaball");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "element", "MetaElement", "", "The element to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 
        func = RNA_def_function(srna, "clear", "rna_MetaBall_elements_clear");
        RNA_def_function_ui_description(func, "Remove all elements from the metaball");
index 8378cb92e2080b961c9e596ce4d72cdc4dbc99a1..574f06e91070ae0ab5e4dede49a62d6c1a9da13f 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <stdlib.h>
 
+#include "RNA_access.h"
 #include "RNA_define.h"
 
 #include "rna_internal.h"
@@ -345,16 +346,18 @@ static NlaStrip *rna_NlaStrip_new(NlaTrack *track, bContext *C, ReportList *repo
        return strip;
 }
 
-static void rna_NlaStrip_remove(NlaTrack *track, bContext *C, ReportList *reports, NlaStrip *strip)
+static void rna_NlaStrip_remove(NlaTrack *track, bContext *C, ReportList *reports, PointerRNA *strip_ptr)
 {
+       NlaStrip *strip = strip_ptr->data;
        if (BLI_findindex(&track->strips, strip) == -1) {
                BKE_reportf(reports, RPT_ERROR, "NLA strip '%s' not found in track '%s'", strip->name, track->name);
                return;
        }
-       else {
-               free_nlastrip(&track->strips, strip);
-               WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_REMOVED, NULL);
-       }
+
+       free_nlastrip(&track->strips, strip);
+       RNA_POINTER_INVALIDATE(strip_ptr);
+
+       WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_REMOVED, NULL);
 }
 
 /* Set the 'solo' setting for the given NLA-track, making sure that it is the only one
@@ -639,7 +642,8 @@ static void rna_api_nlatrack_strips(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_CONTEXT | FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove a NLA Strip");
        parm = RNA_def_pointer(func, "strip", "NlaStrip", "", "NLA Strip to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 }
 
 static void rna_def_nlatrack(BlenderRNA *brna)
index 241ee8f9c9b4409af1b273b8e41720938c08c77a..be9a2d8c613e64ca93a64ec436b84b3482b21757 100644 (file)
@@ -749,20 +749,20 @@ static bNode *rna_NodeTree_node_texture_new(bNodeTree *ntree, bContext *C, Repor
        return node;
 }
 
-static void rna_NodeTree_node_remove(bNodeTree *ntree, ReportList *reports, bNode *node)
+static void rna_NodeTree_node_remove(bNodeTree *ntree, ReportList *reports, PointerRNA *node_ptr)
 {
+       bNode *node = node_ptr->data;
        if (BLI_findindex(&ntree->nodes, node) == -1) {
                BKE_reportf(reports, RPT_ERROR, "Unable to locate node '%s' in node tree", node->name);
+               return;
        }
-       else {
-               if (node->id)
-                       id_us_min(node->id);
 
-               nodeFreeNode(ntree, node);
-               ntreeUpdateTree(ntree); /* update group node socket links*/
+       id_us_min(node->id);
+       nodeFreeNode(ntree, node);
+       RNA_POINTER_INVALIDATE(node_ptr);
 
-               WM_main_add_notifier(NC_NODE | NA_EDITED, ntree);
-       }
+       ntreeUpdateTree(ntree); /* update group node socket links */
+       WM_main_add_notifier(NC_NODE | NA_EDITED, ntree);
 }
 
 static void rna_NodeTree_node_clear(bNodeTree *ntree)
@@ -820,17 +820,19 @@ static bNodeLink *rna_NodeTree_link_new(bNodeTree *ntree, ReportList *reports,
        return ret;
 }
 
-static void rna_NodeTree_link_remove(bNodeTree *ntree, ReportList *reports, bNodeLink *link)
+static void rna_NodeTree_link_remove(bNodeTree *ntree, ReportList *reports, PointerRNA *link_ptr)
 {
+       bNodeLink *link = link_ptr->data;
        if (BLI_findindex(&ntree->links, link) == -1) {
                BKE_report(reports, RPT_ERROR, "Unable to locate link in node tree");
+               return;
        }
-       else {
-               nodeRemLink(ntree, link);
-               ntreeUpdateTree(ntree);
 
-               WM_main_add_notifier(NC_NODE | NA_EDITED, ntree);
-       }
+       nodeRemLink(ntree, link);
+       RNA_POINTER_INVALIDATE(link_ptr);
+
+       ntreeUpdateTree(ntree);
+       WM_main_add_notifier(NC_NODE | NA_EDITED, ntree);
 }
 
 static void rna_NodeTree_link_clear(bNodeTree *ntree)
@@ -4001,7 +4003,8 @@ static void rna_def_nodetree_link_api(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "remove a node link from the node tree");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "link", "NodeLink", "", "The node link to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 
        func = RNA_def_function(srna, "clear", "rna_NodeTree_link_clear");
        RNA_def_function_ui_description(func, "remove all node links from the node tree");
@@ -4045,7 +4048,8 @@ static void rna_def_composite_nodetree_api(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove a node from this node tree");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "node", "Node", "", "The node to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 
        func = RNA_def_function(srna, "clear", "rna_NodeTree_node_clear");
        RNA_def_function_ui_description(func, "Remove all nodes from this node tree");
@@ -4078,7 +4082,8 @@ static void rna_def_shader_nodetree_api(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove a node from this node tree");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "node", "Node", "", "The node to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 
        func = RNA_def_function(srna, "clear", "rna_NodeTree_node_clear");
        RNA_def_function_ui_description(func, "Remove all nodes from this node tree");
@@ -4111,7 +4116,8 @@ static void rna_def_texture_nodetree_api(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove a node from this node tree");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "node", "Node", "", "The node to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 
        func = RNA_def_function(srna, "clear", "rna_NodeTree_node_clear");
        RNA_def_function_ui_description(func, "Remove all nodes from this node tree");
index 02351be62a9962e328a15263c42fcbbc2dd7f0f3..10f361ef1bdd51377ef5820f77587eba7e0fd661 100644 (file)
@@ -1259,14 +1259,17 @@ static bConstraint *rna_Object_constraints_new(Object *object, int type)
        return add_ob_constraint(object, NULL, type);
 }
 
-static void rna_Object_constraints_remove(Object *object, ReportList *reports, bConstraint *con)
+static void rna_Object_constraints_remove(Object *object, ReportList *reports, PointerRNA *con_ptr)
 {
+       bConstraint *con = con_ptr->data;
        if (BLI_findindex(&object->constraints, con) == -1) {
                BKE_reportf(reports, RPT_ERROR, "Constraint '%s' not found in object '%s'", con->name, object->id.name + 2);
                return;
        }
 
        remove_constraint(&object->constraints, con);
+       RNA_POINTER_INVALIDATE(con_ptr);
+
        ED_object_constraint_update(object);
        ED_object_constraint_set_active(object, NULL);
        WM_main_add_notifier(NC_OBJECT | ND_CONSTRAINT | NA_REMOVED, object);
@@ -1288,9 +1291,15 @@ static ModifierData *rna_Object_modifier_new(Object *object, bContext *C, Report
        return ED_object_modifier_add(reports, CTX_data_main(C), CTX_data_scene(C), object, name, type);
 }
 
-static void rna_Object_modifier_remove(Object *object, bContext *C, ReportList *reports, ModifierData *md)
+static void rna_Object_modifier_remove(Object *object, bContext *C, ReportList *reports, PointerRNA *md_ptr)
 {
-       ED_object_modifier_remove(reports, CTX_data_main(C), CTX_data_scene(C), object, md);
+       ModifierData *md = md_ptr->data;
+       if (ED_object_modifier_remove(reports, CTX_data_main(C), CTX_data_scene(C), object, md) == FALSE) {
+               /* error is already set */
+               return;
+       }
+
+       RNA_POINTER_INVALIDATE(md_ptr);
 
        WM_main_add_notifier(NC_OBJECT | ND_MODIFIER | NA_REMOVED, object);
 }
@@ -1324,9 +1333,16 @@ static bDeformGroup *rna_Object_vgroup_new(Object *ob, const char *name)
        return defgroup;
 }
 
-static void rna_Object_vgroup_remove(Object *ob, bDeformGroup *defgroup)
+static void rna_Object_vgroup_remove(Object *ob, ReportList *reports, PointerRNA *defgroup_ptr)
 {
+       bDeformGroup *defgroup = defgroup_ptr->data;
+       if (BLI_findindex(&ob->defbase, defgroup) == -1) {
+               BKE_reportf(reports, RPT_ERROR, "DeformGroup '%s' not in object '%s'", defgroup->name, ob->id.name + 2);
+               return;
+       }
+
        ED_vgroup_delete(ob, defgroup);
+       RNA_POINTER_INVALIDATE(defgroup_ptr);
 
        WM_main_add_notifier(NC_OBJECT | ND_DRAW, ob);
 }
@@ -1816,7 +1832,8 @@ static void rna_def_object_constraints(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        /* constraint to remove */
        parm = RNA_def_pointer(func, "constraint", "Constraint", "", "Removed constraint");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 
        func = RNA_def_function(srna, "clear", "rna_Object_constraints_clear");
        RNA_def_function_ui_description(func, "Remove all constraint from this object");
@@ -1867,7 +1884,8 @@ static void rna_def_object_modifiers(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove an existing modifier from the object");
        /* modifier to remove */
        parm = RNA_def_pointer(func, "modifier", "Modifier", "", "Modifier to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 
        /* clear all modifiers */
        func = RNA_def_function(srna, "clear", "rna_Object_modifier_clear");
@@ -1945,9 +1963,11 @@ static void rna_def_object_vertex_groups(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_return(func, parm);
 
        func = RNA_def_function(srna, "remove", "rna_Object_vgroup_remove");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Delete vertex group from object");
        parm = RNA_def_pointer(func, "group", "VertexGroup", "", "Vertex group to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 
        func = RNA_def_function(srna, "clear", "rna_Object_vgroup_clear");
        RNA_def_function_ui_description(func, "Delete all vertex groups from object");
index df278e7cf16e8f774ab288a92a22baad1d3e62c9..c29537378dd44b4f3f1f68c7a3abf27b718cc1bb 100644 (file)
@@ -497,24 +497,28 @@ static bConstraint *rna_PoseChannel_constraints_new(bPoseChannel *pchan, int typ
        return add_pose_constraint(NULL, pchan, NULL, type);
 }
 
-static void rna_PoseChannel_constraints_remove(ID *id, bPoseChannel *pchan, ReportList *reports, bConstraint *con)
+static void rna_PoseChannel_constraints_remove(ID *id, bPoseChannel *pchan, ReportList *reports, PointerRNA *con_ptr)
 {
+       bConstraint *con = con_ptr->data;
+       const short is_ik = ELEM(con->type, CONSTRAINT_TYPE_KINEMATIC, CONSTRAINT_TYPE_SPLINEIK);
+       Object *ob = (Object *)id;
+
        if (BLI_findindex(&pchan->constraints, con) == -1) {
                BKE_reportf(reports, RPT_ERROR, "Constraint '%s' not found in pose bone '%s'", con->name, pchan->name);
                return;
        }
-       else {
-               Object *ob = (Object *)id;
-               const short is_ik = ELEM(con->type, CONSTRAINT_TYPE_KINEMATIC, CONSTRAINT_TYPE_SPLINEIK);
 
-               remove_constraint(&pchan->constraints, con);
-               ED_object_constraint_update(ob);
-               constraints_set_active(&pchan->constraints, NULL);
-               WM_main_add_notifier(NC_OBJECT | ND_CONSTRAINT | NA_REMOVED, id);
+       remove_constraint(&pchan->constraints, con);
+       RNA_POINTER_INVALIDATE(con_ptr);
 
-               if (is_ik) {
-                       BIK_clear_data(ob->pose);
-               }
+       ED_object_constraint_update(ob);
+
+       constraints_set_active(&pchan->constraints, NULL);  /* XXX, is this really needed? - Campbell */
+
+       WM_main_add_notifier(NC_OBJECT | ND_CONSTRAINT | NA_REMOVED, id);
+
+       if (is_ik) {
+               BIK_clear_data(ob->pose);
        }
 }
 
@@ -727,7 +731,8 @@ static void rna_def_pose_channel_constraints(BlenderRNA *brna, PropertyRNA *cpro
        RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID); /* ID needed for refresh */
        /* constraint to remove */
        parm = RNA_def_pointer(func, "constraint", "Constraint", "", "Removed constraint");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 }
 
 static void rna_def_pose_channel(BlenderRNA *brna)
index 8704763a6f2fcb9a64551584319d513732a58148..df50f84add7c06a207bf2d2f5ad56e5947f89450 100644 (file)
@@ -1033,17 +1033,20 @@ static SceneRenderLayer *rna_RenderLayer_new(ID *id, RenderData *UNUSED(rd), con
 }
 
 static void rna_RenderLayer_remove(ID *id, RenderData *UNUSED(rd), Main *bmain, ReportList *reports,
-                                   SceneRenderLayer *srl)
+                                   PointerRNA *srl_ptr)
 {
+       SceneRenderLayer *srl = srl_ptr->data;
        Scene *scene = (Scene *)id;
 
        if (!BKE_scene_remove_render_layer(bmain, scene, srl)) {
                BKE_reportf(reports, RPT_ERROR, "Render layer '%s' could not be removed from scene '%s'",
                            srl->name, scene->id.name + 2);
+               return;
        }
-       else {
-               WM_main_add_notifier(NC_SCENE | ND_RENDER_OPTIONS, NULL);
-       }
+
+       RNA_POINTER_INVALIDATE(srl_ptr);
+
+       WM_main_add_notifier(NC_SCENE | ND_RENDER_OPTIONS, NULL);
 }
 
 static void rna_RenderSettings_engine_set(PointerRNA *ptr, int value)
@@ -1333,15 +1336,16 @@ static TimeMarker *rna_TimeLine_add(Scene *scene, const char name[])
        return marker;
 }
 
-static void rna_TimeLine_remove(Scene *scene, ReportList *reports, TimeMarker *marker)
+static void rna_TimeLine_remove(Scene *scene, ReportList *reports, PointerRNA *marker_ptr)
 {
-       if (!BLI_remlink_safe(&scene->markers, marker)) {
+       TimeMarker *marker = marker_ptr->data;
+       if (BLI_remlink_safe(&scene->markers, marker) == FALSE) {
                BKE_reportf(reports, RPT_ERROR, "Timeline marker '%s' not found in scene '%s'", marker->name, scene->id.name + 2);
                return;
        }
 
-       /* XXX, invalidates PyObject */
        MEM_freeN(marker);
+       RNA_POINTER_INVALIDATE(marker_ptr);
 
        WM_main_add_notifier(NC_SCENE | ND_MARKERS, NULL);
        WM_main_add_notifier(NC_ANIMATION | ND_MARKERS, NULL);
@@ -2812,7 +2816,8 @@ static void rna_def_render_layers(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove a render layer");
        RNA_def_function_flag(func, FUNC_USE_MAIN | FUNC_USE_REPORTS | FUNC_USE_SELF_ID);
        parm = RNA_def_pointer(func, "layer", "SceneRenderLayer", "", "Timeline marker to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 }
 
 /* use for render output and image save operator,
@@ -4123,7 +4128,8 @@ static void rna_def_timeline_markers(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove a timeline marker");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "marker", "TimelineMarker", "", "Timeline marker to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 
        func = RNA_def_function(srna, "clear", "rna_TimeLine_clear");
        RNA_def_function_ui_description(func, "Remove all timeline markers");
index d8ca1aea5dd2e43d1930405a1ecbf5b466dca31f..054d0cc82c6f4b6e428b73f72b04317891ce39a1 100644 (file)
@@ -966,18 +966,20 @@ static SequenceModifierData *rna_Sequence_modifier_new(Sequence *seq, bContext *
        }
 }
 
-static void rna_Sequence_modifier_remove(Sequence *seq, bContext *C, ReportList *reports, SequenceModifierData *smd)
+static void rna_Sequence_modifier_remove(Sequence *seq, bContext *C, ReportList *reports, PointerRNA *smd_ptr)
 {
+       SequenceModifierData *smd = smd_ptr->data;
        Scene *scene = CTX_data_scene(C);
 
-       if (BKE_sequence_modifier_remove(seq, smd)) {
-               BKE_sequence_invalidate_cache_for_modifier(scene, seq);
-
-               WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, NULL);
-       }
-       else {
+       if (BKE_sequence_modifier_remove(seq, smd) == FALSE) {
                BKE_report(reports, RPT_ERROR, "Modifier was not found in the stack");
+               return;
        }
+
+       RNA_POINTER_INVALIDATE(smd_ptr);
+       BKE_sequence_invalidate_cache_for_modifier(scene, seq);
+
+       WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, NULL);
 }
 
 static void rna_Sequence_modifier_clear(Sequence *seq, bContext *C)
@@ -1267,7 +1269,8 @@ static void rna_def_sequence_modifiers(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove an existing modifier from the sequence");
        /* modifier to remove */
        parm = RNA_def_pointer(func, "modifier", "SequenceModifier", "", "Modifier to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 
        /* clear all modifiers */
        func = RNA_def_function(srna, "clear", "rna_Sequence_modifier_clear");
index f51b3901f4f71216cd85ddb57a90f81f5f6c7916..8ddb9d0a7e7738d891b78c92c47335cbb76d6c78 100644 (file)
@@ -308,12 +308,18 @@ static Sequence *rna_Sequences_new_effect(ID *id, Editing *ed, ReportList *repor
        return seq;
 }
 
-static void rna_Sequences_remove(ID *id, Editing *ed, Sequence *seq)
+static void rna_Sequences_remove(ID *id, Editing *ed, ReportList *reports, PointerRNA *seq_ptr)
 {
+       Sequence *seq = seq_ptr->data;
        Scene *scene = (Scene *)id;
 
-       BLI_remlink(&ed->seqbase, seq);
+       if (BLI_remlink_safe(&ed->seqbase, seq) == FALSE) {
+               BKE_reportf(reports, RPT_ERROR, "Sequence '%s' not in scene '%s'", seq->name + 2, scene->id.name + 2);
+               return;
+       }
+
        BKE_sequence_free(scene, seq);
+       RNA_POINTER_INVALIDATE(seq_ptr);
 
        WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, scene);
 }
@@ -579,10 +585,11 @@ void RNA_api_sequences(BlenderRNA *brna, PropertyRNA *cprop)
 
 
        func = RNA_def_function(srna, "remove", "rna_Sequences_remove");
-       RNA_def_function_flag(func, FUNC_USE_SELF_ID);
+       RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove a Sequence");
        parm = RNA_def_pointer(func, "sequence", "Sequence", "", "Sequence to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 }
 
 
index 4a29ae03d9d13731675382d9569611338e1dd3a6..962a92223eb6d98a25e8442d7cee059c7b23429d 100644 (file)
@@ -958,15 +958,17 @@ static BGpic *rna_BackgroundImage_new(View3D *v3d)
        return bgpic;
 }
 
-static void rna_BackgroundImage_remove(View3D *v3d, ReportList *reports, BGpic *bgpic)
+static void rna_BackgroundImage_remove(View3D *v3d, ReportList *reports, PointerRNA *bgpic_ptr)
 {
+       BGpic *bgpic = bgpic_ptr->data;
        if (BLI_findindex(&v3d->bgpicbase, bgpic) == -1) {
                BKE_report(reports, RPT_ERROR, "Background image cannot be removed");
        }
-       else {
-               ED_view3D_background_image_remove(v3d, bgpic);
-               WM_main_add_notifier(NC_SPACE | ND_SPACE_VIEW3D, v3d);
-       }
+
+       ED_view3D_background_image_remove(v3d, bgpic);
+       RNA_POINTER_INVALIDATE(bgpic_ptr);
+
+       WM_main_add_notifier(NC_SPACE | ND_SPACE_VIEW3D, v3d);
 }
 
 static void rna_BackgroundImage_clear(View3D *v3d)
@@ -1451,7 +1453,8 @@ static void rna_def_backgroundImages(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_ui_description(func, "Remove background image");
        RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "image", "BackgroundImage", "", "Image displayed as viewport background");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 
        func = RNA_def_function(srna, "clear", "rna_BackgroundImage_clear");
        RNA_def_function_ui_description(func, "Remove all background images");
index 6499375cb6679508c94ce7ea27a01ea886041575..365b80b6d7c75f477fc02af028bbfc073c559f6f 100644 (file)
@@ -35,6 +35,7 @@
 #include "BKE_movieclip.h"
 #include "BKE_tracking.h"
 
+#include "RNA_access.h"
 #include "RNA_define.h"
 
 #include "rna_internal.h"
@@ -447,9 +448,15 @@ static MovieTrackingObject *rna_trackingObject_new(MovieTracking *tracking, cons
        return object;
 }
 
-static void rna_trackingObject_remove(MovieTracking *tracking, MovieTrackingObject *object)
+static void rna_trackingObject_remove(MovieTracking *tracking, ReportList *reports, PointerRNA *object_ptr)
 {
-       BKE_tracking_object_delete(tracking, object);
+       MovieTrackingObject *object = object_ptr->data;
+       if (BKE_tracking_object_delete(tracking, object) == FALSE) {
+               BKE_reportf(reports, RPT_ERROR, "MovieTracking '%s' can't be removed", object->name);
+               return;
+       }
+
+       RNA_POINTER_INVALIDATE(object_ptr);
 
        WM_main_add_notifier(NC_MOVIECLIP | NA_EDITED, NULL);
 }
@@ -1416,8 +1423,11 @@ static void rna_def_trackingObjects(BlenderRNA *brna, PropertyRNA *cprop)
        RNA_def_function_return(func, parm);
 
        func = RNA_def_function(srna, "remove", "rna_trackingObject_remove");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove tracking object from this movie clip");
-       RNA_def_pointer(func, "object", "MovieTrackingObject", "", "Motion tracking object to be removed");
+       parm = RNA_def_pointer(func, "object", "MovieTrackingObject", "", "Motion tracking object to be removed");
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 
        /* active object */
        prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
index f7d3238631e10ac896db4d5bf6c3998d1edcac30..415d5308d85569aa9c2526b80e230e13063a7523 100644 (file)
@@ -24,9 +24,9 @@
  *  \ingroup RNA
  */
 
-
 #include <stdlib.h>
 
+#include "RNA_access.h"
 #include "RNA_define.h"
 #include "RNA_enum_types.h"
 
@@ -311,9 +311,16 @@ static bAddon *rna_userdef_addon_new(void)
        return bext;
 }
 
-static void rna_userdef_addon_remove(bAddon *bext)
+static void rna_userdef_addon_remove(ReportList *reports, PointerRNA *bext_ptr)
 {
+       bAddon *bext = bext_ptr->data;
+       if (BLI_findindex(&U.addons, bext) == -1) {
+               BKE_report(reports, RPT_ERROR, "Addon is no longer valid");
+               return;
+       }
+
        BLI_freelinkN(&U.addons, bext);
+       RNA_POINTER_INVALIDATE(bext_ptr);
 }
 
 static void rna_userdef_temp_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *UNUSED(ptr))
@@ -3649,10 +3656,11 @@ static void rna_def_userdef_addon_collection(BlenderRNA *brna, PropertyRNA *cpro
        RNA_def_function_return(func, parm);
 
        func = RNA_def_function(srna, "remove", "rna_userdef_addon_remove");
-       RNA_def_function_flag(func, FUNC_NO_SELF);
+       RNA_def_function_flag(func, FUNC_NO_SELF | FUNC_USE_REPORTS);
        RNA_def_function_ui_description(func, "Remove addon");
        parm = RNA_def_pointer(func, "addon", "Addon", "", "Addon to remove");
-       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 }
 
 void RNA_def_userdef(BlenderRNA *brna)
index d6979161cdcc0b8f458596baad2d8dfc8ca16df6..e653a888e96c3e69e8dc6967b64530aabecd5241 100644 (file)
@@ -153,6 +153,18 @@ static wmKeyMapItem *rna_KeyMap_item_new_modal(wmKeyMap *km, ReportList *reports
        return WM_modalkeymap_add_item(km, type, value, modifier, keymodifier, propvalue);
 }
 
+static void rna_KeyMap_item_remove(wmKeyMap *km, ReportList *reports, PointerRNA *kmi_ptr)
+{
+       wmKeyMapItem *kmi = kmi_ptr->data;
+
+       if (WM_keymap_remove_item(km, kmi) == FALSE) {
+               BKE_reportf(reports, RPT_ERROR, "KeyMapItem '%s' can't be removed from '%s'", kmi->idname, km->idname);
+               return;
+       }
+
+       RNA_POINTER_INVALIDATE(kmi_ptr);
+}
+
 static wmKeyMap *rna_keymap_new(wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid, int modal)
 {
        if (modal == 0) {
@@ -178,6 +190,18 @@ static wmKeyMap *rna_keymap_find_modal(wmKeyConfig *UNUSED(keyconf), const char
                return ot->modalkeymap;
 }
 
+static void rna_KeyConfig_remove(wmWindowManager *wm, ReportList *reports, PointerRNA *keyconf_ptr)
+{
+       wmKeyConfig *keyconf = keyconf_ptr->data;
+
+       if (WM_keyconfig_remove(wm, keyconf) == FALSE) {
+               BKE_reportf(reports, RPT_ERROR, "KeyConfig '%s' can't be removed", keyconf->idname);
+               return;
+       }
+
+       RNA_POINTER_INVALIDATE(keyconf_ptr);
+}
+
 #else
 
 #define WM_GEN_INVOKE_EVENT (1 << 0)
@@ -464,9 +488,11 @@ void RNA_api_keymapitems(StructRNA *srna)
        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");
+       func = RNA_def_function(srna, "remove", "rna_KeyMap_item_remove");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "item", "KeyMapItem", "Item", "");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 
        func = RNA_def_function(srna, "from_id", "WM_keymap_item_find_id");
        parm = RNA_def_property(func, "id", PROP_INT, PROP_NONE);
@@ -516,10 +542,11 @@ void RNA_api_keyconfigs(StructRNA *srna)
        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 */
+       func = RNA_def_function(srna, "remove", "rna_KeyConfig_remove"); /* remove_keyconfig */
+       RNA_def_function_flag(func, FUNC_USE_REPORTS);
        parm = RNA_def_pointer(func, "keyconfig", "KeyConfig", "Key Configuration", "Removed key configuration");
-       RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
+       RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
 }
 
 #endif
-
index 5c88babfb473535117d7a2ec27cfe058da96a451..43369154dbb3b03f2e3060e7f501e529496e2893 100644 (file)
@@ -43,7 +43,7 @@ struct EnumPropertyItem;
 
 wmKeyConfig *WM_keyconfig_new  (struct wmWindowManager *wm, const char *idname);
 wmKeyConfig *WM_keyconfig_new_user(struct wmWindowManager *wm, const char *idname);
-void           WM_keyconfig_remove     (struct wmWindowManager *wm, struct wmKeyConfig *keyconf);
+int         WM_keyconfig_remove        (struct wmWindowManager *wm, struct wmKeyConfig *keyconf);
 void           WM_keyconfig_free       (struct wmKeyConfig *keyconf);
 
 void           WM_keyconfig_set_active(struct wmWindowManager *wm, const char *idname);
@@ -63,8 +63,8 @@ wmKeyMapItem *WM_keymap_add_item(struct wmKeyMap *keymap, const char *idname, in
 wmKeyMapItem *WM_keymap_add_menu(struct wmKeyMap *keymap, const char *idname, int type,
                                  int val, int modifier, int keymodifier);
 
-void           WM_keymap_remove_item(struct wmKeyMap *keymap, struct wmKeyMapItem *kmi);
-char            *WM_keymap_item_to_string(wmKeyMapItem *kmi, char *str, int len);
+int                    WM_keymap_remove_item(struct wmKeyMap *keymap, struct wmKeyMapItem *kmi);
+char           *WM_keymap_item_to_string(wmKeyMapItem *kmi, char *str, int len);
 
 wmKeyMap       *WM_keymap_list_find(ListBase *lb, const char *idname, int spaceid, int regionid);
 wmKeyMap       *WM_keymap_find(struct wmKeyConfig *keyconf, const char *idname, int spaceid, int regionid);
index 2781ec2d3df85c57168d224509945b438e88f171..7aa2b403897edd9aca2149bc5e4310033396830f 100644 (file)
@@ -190,9 +190,9 @@ wmKeyConfig *WM_keyconfig_new_user(wmWindowManager *wm, const char *idname)
        return keyconf;
 }
 
-void WM_keyconfig_remove(wmWindowManager *wm, wmKeyConfig *keyconf)
+int WM_keyconfig_remove(wmWindowManager *wm, wmKeyConfig *keyconf)
 {
-       if (keyconf) {
+       if (BLI_findindex(&wm->keyconfigs, keyconf) != -1) {
                if (strncmp(U.keyconfigstr, keyconf->idname, sizeof(U.keyconfigstr)) == 0) {
                        BLI_strncpy(U.keyconfigstr, wm->defaultconf->idname, sizeof(U.keyconfigstr));
                        WM_keyconfig_update_tag(NULL, NULL);
@@ -200,6 +200,11 @@ void WM_keyconfig_remove(wmWindowManager *wm, wmKeyConfig *keyconf)
 
                BLI_remlink(&wm->keyconfigs, keyconf);
                WM_keyconfig_free(keyconf);
+
+               return TRUE;
+       }
+       else {
+               return FALSE;
        }
 }
 
@@ -381,7 +386,7 @@ wmKeyMapItem *WM_keymap_add_menu(wmKeyMap *keymap, const char *idname, int type,
        return kmi;
 }
 
-void WM_keymap_remove_item(wmKeyMap *keymap, wmKeyMapItem *kmi)
+int WM_keymap_remove_item(wmKeyMap *keymap, wmKeyMapItem *kmi)
 {
        if (BLI_findindex(&keymap->items, kmi) != -1) {
                if (kmi->ptr) {
@@ -391,6 +396,10 @@ void WM_keymap_remove_item(wmKeyMap *keymap, wmKeyMapItem *kmi)
                BLI_freelinkN(&keymap->items, kmi);
 
                WM_keyconfig_update_tag(keymap, kmi);
+               return TRUE;
+       }
+       else {
+               return FALSE;
        }
 }