UI: remove unnecessary confirmation popups
authorEmanuel Claesson <emanuel.claesson@gmail.com>
Mon, 25 Nov 2013 03:55:26 +0000 (04:55 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Mon, 25 Nov 2013 11:21:45 +0000 (12:21 +0100)
This makes a number of operators no longer ask for confirmation, rather it will
show an info message after performing the operation. Ref T37422 for decision. In
particular, these were changed:

* Delete objects, bones, keyframes, masks, mask curves, motion tracks, markers.
* Clear and delete keyframes in the 3D view.
* Align bone to parents.
* Separate bones from armature.
* Group/ungroup metastrips in sequencer.
* Copy/paste objects to/from buffer.

Reviewed By: brecht, dingto

Differential Revision: http://developer.blender.org/D35

22 files changed:
source/blender/blenkernel/BKE_gpencil.h
source/blender/blenkernel/BKE_mask.h
source/blender/blenkernel/intern/gpencil.c
source/blender/blenkernel/intern/mask.c
source/blender/editors/animation/keyframes_general.c
source/blender/editors/animation/keyframing.c
source/blender/editors/armature/armature_edit.c
source/blender/editors/armature/armature_relations.c
source/blender/editors/gpencil/editaction_gpencil.c
source/blender/editors/include/ED_gpencil.h
source/blender/editors/include/ED_keyframes_edit.h
source/blender/editors/include/ED_mask.h
source/blender/editors/mask/mask_editaction.c
source/blender/editors/mask/mask_ops.c
source/blender/editors/object/object_add.c
source/blender/editors/screen/screen_ops.c
source/blender/editors/space_action/action_edit.c
source/blender/editors/space_clip/clip_graph_ops.c
source/blender/editors/space_clip/tracking_ops.c
source/blender/editors/space_graph/graph_edit.c
source/blender/editors/space_sequencer/sequencer_edit.c
source/blender/editors/space_view3d/view3d_ops.c

index 3cb20ead39e7ba4a31599418c90d693fa0d008a3..86c111653d1a6db86e39ff8c4d12033547bcafcb 100644 (file)
@@ -38,7 +38,7 @@ struct bGPDframe;
 
 /* ------------ Grease-Pencil API ------------------ */
 
-void free_gpencil_strokes(struct bGPDframe *gpf);
+bool free_gpencil_strokes(struct bGPDframe *gpf);
 void free_gpencil_frames(struct bGPDlayer *gpl);
 void free_gpencil_layers(struct ListBase *list);
 void BKE_gpencil_free(struct bGPdata *gpd);
@@ -59,7 +59,7 @@ void gpencil_frame_delete_laststroke(struct bGPDlayer *gpl, struct bGPDframe *gp
 
 struct bGPDframe *BKE_gpencil_layer_find_frame(struct bGPDlayer *gpl, int cframe);
 struct bGPDframe *gpencil_layer_getframe(struct bGPDlayer *gpl, int cframe, short addnew);
-void gpencil_layer_delframe(struct bGPDlayer *gpl, struct bGPDframe *gpf);
+bool gpencil_layer_delframe(struct bGPDlayer *gpl, struct bGPDframe *gpf);
 struct bGPDlayer *gpencil_layer_getactive(struct bGPdata *gpd);
 void gpencil_layer_setactive(struct bGPdata *gpd, struct bGPDlayer *active);
 void gpencil_layer_delete(struct bGPdata *gpd, struct bGPDlayer *gpl);
index d73249041e8441fa716820b55450c572ae10c998..9e7fcb4b2a716de4f1d4a9c9abbb88cbba765aa7 100644 (file)
@@ -158,7 +158,7 @@ struct MaskLayerShape *BKE_mask_layer_shape_alloc(struct MaskLayer *masklay, con
 void BKE_mask_layer_shape_free(struct MaskLayerShape *masklay_shape);
 struct MaskLayerShape *BKE_mask_layer_shape_verify_frame(struct MaskLayer *masklay, const int frame);
 struct MaskLayerShape *BKE_mask_layer_shape_duplicate(struct MaskLayerShape *masklay_shape);
-void BKE_mask_layer_shape_unlink(struct MaskLayer *masklay, struct MaskLayerShape *masklay_shape);
+bool BKE_mask_layer_shape_unlink(struct MaskLayer *masklay, struct MaskLayerShape *masklay_shape);
 void BKE_mask_layer_shape_sort(struct MaskLayer *masklay);
 
 bool BKE_mask_layer_shape_spline_from_index(struct MaskLayer *masklay, int index,
index 42e146301a249c9bd008a0be8e4b72501aa87bfb..689d0a2cd4734264d73ab982ffd50efd8dde3d83 100644 (file)
 /* --------- Memory Management ------------ */
 
 /* Free strokes belonging to a gp-frame */
-void free_gpencil_strokes(bGPDframe *gpf)
+bool free_gpencil_strokes(bGPDframe *gpf)
 {
        bGPDstroke *gps, *gpsn;
+       bool modified = gpf->strokes.first != NULL;
        
        /* error checking */
-       if (gpf == NULL) return;
+       if (gpf == NULL)
+               return false;
        
        /* free strokes */
        for (gps = gpf->strokes.first; gps; gps = gpsn) {
@@ -73,6 +75,8 @@ void free_gpencil_strokes(bGPDframe *gpf)
                if (gps->points) MEM_freeN(gps->points);
                BLI_freelinkN(&gpf->strokes, gps);
        }
+
+       return modified;
 }
 
 /* Free all of a gp-layer's frames */
@@ -467,16 +471,20 @@ bGPDframe *gpencil_layer_getframe(bGPDlayer *gpl, int cframe, short addnew)
 }
 
 /* delete the given frame from a layer */
-void gpencil_layer_delframe(bGPDlayer *gpl, bGPDframe *gpf)
+bool gpencil_layer_delframe(bGPDlayer *gpl, bGPDframe *gpf)
 {
+       bool modified = false;
+
        /* error checking */
        if (ELEM(NULL, gpl, gpf))
-               return;
+               return false;
                
        /* free the frame and its data */
-       free_gpencil_strokes(gpf);
+       modified = free_gpencil_strokes(gpf);
        BLI_freelinkN(&gpl->frames, gpf);
        gpl->actframe = NULL;
+
+       return modified;
 }
 
 /* get the active gp-layer for editing */
index b20b4294f84711fc0ee33612a0c10f1734faae77..214c49bcc8318f5f615233f92d88f18a5bf59020 100644 (file)
@@ -1813,11 +1813,15 @@ MaskLayerShape *BKE_mask_layer_shape_duplicate(MaskLayerShape *masklay_shape)
        return masklay_shape_copy;
 }
 
-void BKE_mask_layer_shape_unlink(MaskLayer *masklay, MaskLayerShape *masklay_shape)
+bool BKE_mask_layer_shape_unlink(MaskLayer *masklay, MaskLayerShape *masklay_shape)
 {
+       bool modified = masklay_shape != NULL;
+
        BLI_remlink(&masklay->splines_shapes, masklay_shape);
 
        BKE_mask_layer_shape_free(masklay_shape);
+
+       return modified;
 }
 
 static int mask_layer_shape_sort_cb(void *masklay_shape_a_ptr, void *masklay_shape_b_ptr)
index cfa5f9f032cc03698533203a34323919760b056e..15abdb452ce2d8234d8dc3c342e48846d4a38629 100644 (file)
@@ -104,12 +104,13 @@ void delete_fcurve_key(FCurve *fcu, int index, short do_recalc)
 }
 
 /* Delete selected keyframes in given F-Curve */
-void delete_fcurve_keys(FCurve *fcu)
+bool delete_fcurve_keys(FCurve *fcu)
 {
        int i;
+       bool modified = false;
        
        if (fcu->bezt == NULL) /* ignore baked curves */
-               return;
+               return false;
 
        /* Delete selected BezTriples */
        for (i = 0; i < fcu->totvert; i++) {
@@ -117,12 +118,15 @@ void delete_fcurve_keys(FCurve *fcu)
                        memmove(&fcu->bezt[i], &fcu->bezt[i + 1], sizeof(BezTriple) * (fcu->totvert - i - 1));
                        fcu->totvert--;
                        i--;
+                       modified = true;
                }
        }
        
        /* Free the array of BezTriples if there are not keyframes */
        if (fcu->totvert == 0)
                clear_fcurve_keys(fcu);
+
+       return modified;
 }
 
 
index 1028fb30ba430dd3592ceb0fd7e1943aa81e3d00..70a3985c26628515e0a59817a30806a5fc0ac2c7 100644 (file)
@@ -1474,8 +1474,10 @@ void ANIM_OT_keyframe_delete(wmOperatorType *ot)
  * it is more useful for animators working in the 3D view.
  */
  
-static int clear_anim_v3d_exec(bContext *C, wmOperator *UNUSED(op))
+static int clear_anim_v3d_exec(bContext *C, wmOperator *op)
 {
+       int num_removed = 0;
+
        CTX_DATA_BEGIN (C, Object *, ob, selected_objects)
        {
                /* just those in active action... */
@@ -1515,15 +1517,19 @@ static int clear_anim_v3d_exec(bContext *C, wmOperator *UNUSED(op))
                                /* delete F-Curve completely */
                                if (can_delete) {
                                        ANIM_fcurve_delete_from_animdata(NULL, adt, fcu);
+                                       num_removed++;
                                }
                        }
                }
-               
+
                /* update... */
                DAG_id_tag_update(&ob->id, OB_RECALC_OB);
        }
        CTX_DATA_END;
-       
+
+       if (num_removed > 0)
+               BKE_reportf(op->reports, RPT_INFO, "Deleted %d animation f-curves from selected objects", num_removed);
+
        /* send updates */
        WM_event_add_notifier(C, NC_OBJECT | ND_KEYS, NULL);
        
@@ -1538,7 +1544,6 @@ void ANIM_OT_keyframe_clear_v3d(wmOperatorType *ot)
        ot->idname = "ANIM_OT_keyframe_clear_v3d";
        
        /* callbacks */
-       ot->invoke = WM_operator_confirm;
        ot->exec = clear_anim_v3d_exec; 
        
        ot->poll = ED_operator_areaactive;
@@ -1602,7 +1607,6 @@ void ANIM_OT_keyframe_delete_v3d(wmOperatorType *ot)
        ot->idname = "ANIM_OT_keyframe_delete_v3d";
        
        /* callbacks */
-       ot->invoke = WM_operator_confirm;
        ot->exec = delete_key_v3d_exec; 
        
        ot->poll = ED_operator_areaactive;
index 1bc5bf0fd744786abf36ed625440892cee2807fe..55764a8919f496f2c03c22d74efe12abb1b755cd 100644 (file)
@@ -1020,6 +1020,8 @@ static int armature_align_bones_exec(bContext *C, wmOperator *op)
                        
                        if ((arm->flag & ARM_MIRROR_EDIT) && (actmirb->parent))
                                bone_align_to_bone(arm->edbo, actmirb, actmirb->parent);
+
+                       BKE_reportf(op->reports, RPT_INFO, "Aligned bone '%s' to parent", actbone->name);
                }
        }
        else {
@@ -1042,8 +1044,10 @@ static int armature_align_bones_exec(bContext *C, wmOperator *op)
                        }
                }
                CTX_DATA_END;
+
+               BKE_reportf(op->reports, RPT_INFO, "%d bones aligned to bone '%s'", CTX_DATA_COUNT(C, selected_editable_bones), actbone->name);
        }
-       
+
        /* note, notifier might evolve */
        WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, ob);
        
@@ -1058,7 +1062,6 @@ void ARMATURE_OT_align(wmOperatorType *ot)
        ot->description = "Align selected bones to the active bone (or to their parent)";
        
        /* api callbacks */
-       ot->invoke = WM_operator_confirm;
        ot->exec = armature_align_bones_exec;
        ot->poll = ED_operator_editarmature;
        
@@ -1108,12 +1111,13 @@ void ARMATURE_OT_split(wmOperatorType *ot)
 
 /* previously delete_armature */
 /* only editmode! */
-static int armature_delete_selected_exec(bContext *C, wmOperator *UNUSED(op))
+static int armature_delete_selected_exec(bContext *C, wmOperator *op)
 {
        bArmature *arm;
        EditBone *curBone, *ebone_next;
        bConstraint *con;
        Object *obedit = CTX_data_edit_object(C); // XXX get from context
+       int removed_num = 0;
        arm = obedit->data;
 
        /* cancel if nothing selected */
@@ -1170,10 +1174,12 @@ static int armature_delete_selected_exec(bContext *C, wmOperator *UNUSED(op))
                        if (curBone->flag & BONE_SELECTED) {
                                if (curBone == arm->act_edbone) arm->act_edbone = NULL;
                                ED_armature_edit_bone_remove(arm, curBone);
+                               removed_num++;
                        }
                }
        }
        
+       BKE_reportf(op->reports, RPT_INFO, "Deleted %d bones", removed_num);
        
        ED_armature_sync_selection(arm->edbo);
 
@@ -1190,7 +1196,6 @@ void ARMATURE_OT_delete(wmOperatorType *ot)
        ot->description = "Remove selected bones from the armature";
        
        /* api callbacks */
-       ot->invoke = WM_operator_confirm;
        ot->exec = armature_delete_selected_exec;
        ot->poll = ED_operator_editarmature;
        
index cd24e94f9e93037730e27e97b4cea738ceddb5b8..087e9a86241c9b6896d134e819bac01fe20ec023 100644 (file)
@@ -454,7 +454,7 @@ static void separate_armature_bones(Object *ob, short sel)
 }
 
 /* separate selected bones into their armature */
-static int separate_armature_exec(bContext *C, wmOperator *UNUSED(op))
+static int separate_armature_exec(bContext *C, wmOperator *op)
 {
        Main *bmain = CTX_data_main(C);
        Scene *scene = CTX_data_scene(C);
@@ -520,6 +520,8 @@ static int separate_armature_exec(bContext *C, wmOperator *UNUSED(op))
        
        ED_armature_to_edit(obedit);
        
+       BKE_report(op->reports, RPT_INFO, "Separated bones");
+
        /* note, notifier might evolve */
        WM_event_add_notifier(C, NC_OBJECT | ND_POSE, obedit);
        
@@ -537,7 +539,6 @@ void ARMATURE_OT_separate(wmOperatorType *ot)
        ot->description = "Isolate selected bones into a separate armature";
        
        /* callbacks */
-       ot->invoke = WM_operator_confirm;
        ot->exec = separate_armature_exec;
        ot->poll = ED_operator_editarmature;
        
index aee97f40c31f6fcdee6c854d3f56a1f62df69969..bd35bb1f8684806e17d06baa1fbd65b26c6cecae 100644 (file)
@@ -209,21 +209,24 @@ void ED_gplayer_frames_select_border(bGPDlayer *gpl, float min, float max, short
 /* Frame Editing Tools */
 
 /* Delete selected frames */
-void ED_gplayer_frames_delete(bGPDlayer *gpl)
+bool ED_gplayer_frames_delete(bGPDlayer *gpl)
 {
        bGPDframe *gpf, *gpfn;
+       bool modified = false;
        
        /* error checking */
        if (gpl == NULL)
-               return;
+               return false;
                
        /* check for frames to delete */
        for (gpf = gpl->frames.first; gpf; gpf = gpfn) {
                gpfn = gpf->next;
                
                if (gpf->flag & GP_FRAME_SELECT)
-                       gpencil_layer_delframe(gpl, gpf);
+                       modified |= gpencil_layer_delframe(gpl, gpf);
        }
+
+       return modified;
 }
 
 /* Duplicate selected frames from given gp-layer */
index cb4a81be8b81b7812f631d0d22e353b9ea678fc6..4e05c6c9fb65ab939f11b311139e6b1c6bdedefd 100644 (file)
@@ -95,7 +95,7 @@ void  ED_gplayer_frames_select_border(struct bGPDlayer *gpl, float min, float ma
 void  ED_gpencil_select_frames(struct bGPDlayer *gpl, short select_mode);
 void  ED_gpencil_select_frame(struct bGPDlayer *gpl, int selx, short select_mode);
 
-void  ED_gplayer_frames_delete(struct bGPDlayer *gpl);
+bool  ED_gplayer_frames_delete(struct bGPDlayer *gpl);
 void  ED_gplayer_frames_duplicate(struct bGPDlayer *gpl);
 
 void  ED_gplayer_snap_frames(struct bGPDlayer *gpl, struct Scene *scene, short mode);
index 3020fe6985aea7f25e2a8baced15467d1c4ad365..5718a70208e7007e27c92b5c73620ac3dffeb934 100644 (file)
@@ -237,7 +237,7 @@ void bezt_remap_times(KeyframeEditData *ked, struct BezTriple *bezt);
 /* Destructive Editing API (keyframes_general.c) */
 
 void delete_fcurve_key(struct FCurve *fcu, int index, short do_recalc);
-void delete_fcurve_keys(struct FCurve *fcu);
+bool delete_fcurve_keys(struct FCurve *fcu);
 void clear_fcurve_keys(struct FCurve *fcu);
 void duplicate_fcurve_keys(struct FCurve *fcu);
 
index 8da36f015dccdca92e33aa02954e3951d48719e1..d128d5389efad45fa0249a5a1f7e17de48db7455 100644 (file)
@@ -82,7 +82,7 @@ void  ED_masklayer_frames_select_border(struct MaskLayer *masklay, float min, fl
 void  ED_mask_select_frames(struct MaskLayer *masklay, short select_mode);
 void  ED_mask_select_frame(struct MaskLayer *masklay, int selx, short select_mode);
 
-void ED_masklayer_frames_delete(struct MaskLayer *masklay);
+bool ED_masklayer_frames_delete(struct MaskLayer *masklay);
 void ED_masklayer_frames_duplicate(struct MaskLayer *masklay);
 
 void ED_masklayer_snap_frames(struct MaskLayer *masklay, struct Scene *scene, short mode);
index 707622fa84163b53fc67ef94dad502442f87e6cb..5c76d4645022a51a0e497462519393fcf5ed8ad3 100644 (file)
@@ -207,21 +207,26 @@ void ED_masklayer_frames_select_border(MaskLayer *masklay, float min, float max,
 /* Frame Editing Tools */
 
 /* Delete selected frames */
-void ED_masklayer_frames_delete(MaskLayer *masklay)
+bool ED_masklayer_frames_delete(MaskLayer *masklay)
 {
        MaskLayerShape *masklay_shape, *masklay_shape_next;
+       bool modified = false;
 
        /* error checking */
        if (masklay == NULL)
-               return;
+               return false;
 
        /* check for frames to delete */
        for (masklay_shape = masklay->splines_shapes.first; masklay_shape; masklay_shape = masklay_shape_next) {
                masklay_shape_next = masklay_shape->next;
 
-               if (masklay_shape->flag & MASK_SHAPE_SELECT)
+               if (masklay_shape->flag & MASK_SHAPE_SELECT) {
                        BKE_mask_layer_shape_unlink(masklay, masklay_shape);
+                       modified = true;
+               }
        }
+
+       return modified;
 }
 
 /* Duplicate selected frames from given mask-layer */
index 5ca0d133b0e27a8a3a63aa51d3498347a73becef..aea346b63a671c175c12c22303da2b18d40b39c5 100644 (file)
@@ -38,6 +38,7 @@
 #include "BKE_depsgraph.h"
 #include "BKE_main.h"
 #include "BKE_mask.h"
+#include "BKE_report.h"
 
 #include "DNA_scene_types.h"
 #include "DNA_mask_types.h"
@@ -942,11 +943,12 @@ static void delete_feather_points(MaskSplinePoint *point)
        }
 }
 
-static int delete_exec(bContext *C, wmOperator *UNUSED(op))
+static int delete_exec(bContext *C, wmOperator *op)
 {
        Scene *scene = CTX_data_scene(C);
        Mask *mask = CTX_data_edit_mask(C);
        MaskLayer *masklay;
+       int num_deleted = 0;
 
        for (masklay = mask->masklayers.first; masklay; masklay = masklay->next) {
                MaskSpline *spline;
@@ -972,7 +974,6 @@ static int delete_exec(bContext *C, wmOperator *UNUSED(op))
                        }
 
                        if (count == 0) {
-
                                /* delete the whole spline */
                                BLI_remlink(&masklay->splines, spline);
                                BKE_mask_spline_free(spline);
@@ -983,6 +984,8 @@ static int delete_exec(bContext *C, wmOperator *UNUSED(op))
                                }
 
                                BKE_mask_layer_shape_changed_remove(masklay, mask_layer_shape_ofs, tot_point_orig);
+
+                               num_deleted++;
                        }
                        else {
                                MaskSplinePoint *new_points;
@@ -1010,6 +1013,8 @@ static int delete_exec(bContext *C, wmOperator *UNUSED(op))
                                                spline->tot_point--;
 
                                                BKE_mask_layer_shape_changed_remove(masklay, mask_layer_shape_ofs + j, 1);
+
+                                               num_deleted++;
                                        }
                                }
 
@@ -1031,12 +1036,19 @@ static int delete_exec(bContext *C, wmOperator *UNUSED(op))
                }
        }
 
-       /* TODO: only update edited splines */
-       BKE_mask_update_display(mask, CFRA);
+       if (num_deleted == 0) {
+               return OPERATOR_CANCELLED;
+       }
+       else {
+               /* TODO: only update edited splines */
+               BKE_mask_update_display(mask, CFRA);
 
-       WM_event_add_notifier(C, NC_MASK | NA_EDITED, mask);
+               WM_event_add_notifier(C, NC_MASK | NA_EDITED, mask);
 
-       return OPERATOR_FINISHED;
+               BKE_reportf(op->reports, RPT_INFO, "Deleted selected control points from mask '%s'", mask->id.name);
+
+               return OPERATOR_FINISHED;
+       }
 }
 
 void MASK_OT_delete(wmOperatorType *ot)
@@ -1047,7 +1059,6 @@ void MASK_OT_delete(wmOperatorType *ot)
        ot->idname = "MASK_OT_delete";
 
        /* api callbacks */
-       ot->invoke = WM_operator_confirm;
        ot->exec = delete_exec;
        ot->poll = ED_maskedit_mask_poll;
 
index 9dd686326bb40be0f1643cc9242601b24ab41470..8496aaaab4cb6ac7fb1cc2357e94cd4cecbf778b 100644 (file)
@@ -1057,6 +1057,7 @@ static int object_delete_exec(bContext *C, wmOperator *op)
        wmWindowManager *wm = CTX_wm_manager(C);
        wmWindow *win;
        const short use_global = RNA_boolean_get(op->ptr, "use_global");
+       int deleted_num = 0;
 
        if (CTX_data_edit_object(C)) 
                return OPERATOR_CANCELLED;
@@ -1068,6 +1069,7 @@ static int object_delete_exec(bContext *C, wmOperator *op)
 
                /* remove from current scene only */
                ED_base_object_free_and_unlink(bmain, scene, base);
+               deleted_num++;
 
                if (use_global) {
                        Scene *scene_iter;
@@ -1102,6 +1104,9 @@ static int object_delete_exec(bContext *C, wmOperator *op)
                }
        }
 
+       if (deleted_num > 0)
+               BKE_reportf(op->reports, RPT_INFO, "Deleted %d objects", deleted_num);
+
        return OPERATOR_FINISHED;
 }
 
@@ -1113,7 +1118,6 @@ void OBJECT_OT_delete(wmOperatorType *ot)
        ot->idname = "OBJECT_OT_delete";
 
        /* api callbacks */
-       ot->invoke = WM_operator_confirm;
        ot->exec = object_delete_exec;
        ot->poll = ED_operator_objectmode;
 
index 93923c24c849970cc15c773b476eba40bcb54ba7..cd215804f753d2256f71cf742e782a62f80c064a 100644 (file)
@@ -2878,7 +2878,6 @@ static void SCREEN_OT_region_quadview(wmOperatorType *ot)
        ot->idname = "SCREEN_OT_region_quadview";
        
        /* api callbacks */
-       //      ot->invoke = WM_operator_confirm;
        ot->exec = region_quadview_exec;
        ot->poll = ED_operator_region_view3d_active;
        ot->flag = 0;
index 7c9d867aad65fb1485a8ae18b0aacb0f55a7022b..d7eb617e56e0ef5363d4469c9e38bdbaa37bc0f0 100644 (file)
@@ -780,11 +780,12 @@ void ACTION_OT_duplicate(wmOperatorType *ot)
 
 /* ******************** Delete Keyframes Operator ************************* */
 
-static void delete_action_keys(bAnimContext *ac)
+static bool delete_action_keys(bAnimContext *ac)
 {
        ListBase anim_data = {NULL, NULL};
        bAnimListElem *ale;
        int filter;
+       bool modified = false;
        
        /* filter data */
        if (ELEM(ac->datatype, ANIMCONT_GPENCIL, ANIMCONT_MASK))
@@ -796,17 +797,17 @@ static void delete_action_keys(bAnimContext *ac)
        /* loop through filtered data and delete selected keys */
        for (ale = anim_data.first; ale; ale = ale->next) {
                if (ale->type == ANIMTYPE_GPLAYER) {
-                       ED_gplayer_frames_delete((bGPDlayer *)ale->data);
+                       modified |= ED_gplayer_frames_delete((bGPDlayer *)ale->data);
                }
                else if (ale->type == ANIMTYPE_MASKLAYER) {
-                       ED_masklayer_frames_delete((MaskLayer *)ale->data);
+                       modified |= ED_masklayer_frames_delete((MaskLayer *)ale->data);
                }
                else {
                        FCurve *fcu = (FCurve *)ale->key_data;
                        AnimData *adt = ale->adt;
                        
                        /* delete selected keyframes only */
-                       delete_fcurve_keys(fcu); 
+                       modified |= delete_fcurve_keys(fcu);
                        
                        /* Only delete curve too if it won't be doing anything anymore */
                        if ((fcu->totvert == 0) && (list_has_suitable_fmodifier(&fcu->modifiers, 0, FMI_TYPE_GENERATE_CURVE) == 0))
@@ -816,20 +817,23 @@ static void delete_action_keys(bAnimContext *ac)
        
        /* free filtered list */
        BLI_freelistN(&anim_data);
+
+       return modified;
 }
 
 /* ------------------- */
 
-static int actkeys_delete_exec(bContext *C, wmOperator *UNUSED(op))
+static int actkeys_delete_exec(bContext *C, wmOperator *op)
 {
        bAnimContext ac;
+       bool modified;
        
        /* get editor data */
        if (ANIM_animdata_get_context(C, &ac) == 0)
                return OPERATOR_CANCELLED;
                
        /* delete keyframes */
-       delete_action_keys(&ac);
+       modified = delete_action_keys(&ac);
        
        /* validate keyframes after editing */
        if (!ELEM(ac.datatype, ANIMCONT_GPENCIL, ANIMCONT_MASK))
@@ -838,6 +842,9 @@ static int actkeys_delete_exec(bContext *C, wmOperator *UNUSED(op))
        /* set notifier that keyframes have changed */
        WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
        
+       if (modified)
+               BKE_report(op->reports, RPT_INFO, "Deleted selected keyframes");
+
        return OPERATOR_FINISHED;
 }
  
@@ -849,7 +856,6 @@ void ACTION_OT_delete(wmOperatorType *ot)
        ot->description = "Remove all selected keyframes";
        
        /* api callbacks */
-       ot->invoke = WM_operator_confirm;
        ot->exec = actkeys_delete_exec;
        ot->poll = ED_operator_action_active;
        
index d1c4469399579e908b0ad2eb47385f9afbccc3e9..d25c827986ba059e6a96a09ded34b9b5ce9bfd29 100644 (file)
@@ -43,6 +43,7 @@
 #include "BKE_movieclip.h"
 #include "BKE_tracking.h"
 #include "BKE_depsgraph.h"
+#include "BKE_report.h"
 
 #include "WM_api.h"
 #include "WM_types.h"
@@ -471,16 +472,19 @@ void CLIP_OT_graph_select_all_markers(wmOperatorType *ot)
 
 /******************** delete curve operator ********************/
 
-static int delete_curve_exec(bContext *C, wmOperator *UNUSED(op))
+static int delete_curve_exec(bContext *C, wmOperator *op)
 {
        SpaceClip *sc = CTX_wm_space_clip(C);
        MovieClip *clip = ED_space_clip_get_clip(sc);
        MovieTracking *tracking = &clip->tracking;
        MovieTrackingTrack *act_track = BKE_tracking_track_get_active(tracking);
 
-       if (act_track)
+       if (act_track) {
                clip_delete_track(C, clip, act_track);
 
+               BKE_report(op->reports, RPT_INFO, "Deleted all selected curves");
+       }
+
        return OPERATOR_FINISHED;
 }
 
@@ -492,7 +496,6 @@ void CLIP_OT_graph_delete_curve(wmOperatorType *ot)
        ot->idname = "CLIP_OT_graph_delete_curve";
 
        /* api callbacks */
-       ot->invoke = WM_operator_confirm;
        ot->exec = delete_curve_exec;
        ot->poll = ED_space_clip_tracking_poll;
 
index 5607d7dc635b6958a7cdb823f5a5ddefbe7d2178..a5f9960480ebea3b0f022e44b77adf89e78cba2f 100644 (file)
@@ -234,7 +234,7 @@ void CLIP_OT_add_marker_at_click(wmOperatorType *ot)
 
 /********************** delete track operator *********************/
 
-static int delete_track_exec(bContext *C, wmOperator *UNUSED(op))
+static int delete_track_exec(bContext *C, wmOperator *op)
 {
        SpaceClip *sc = CTX_wm_space_clip(C);
        MovieClip *clip = ED_space_clip_get_clip(sc);
@@ -273,6 +273,7 @@ static int delete_track_exec(bContext *C, wmOperator *UNUSED(op))
        sc->flag &= ~SC_LOCK_SELECTION;
 
        if (modified) {
+               BKE_report(op->reports, RPT_INFO, "Deleted all selected tracks");
                WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip);
        }
 
@@ -287,7 +288,6 @@ void CLIP_OT_delete_track(wmOperatorType *ot)
        ot->description = "Delete selected tracks";
 
        /* api callbacks */
-       ot->invoke = WM_operator_confirm;
        ot->exec = delete_track_exec;
        ot->poll = ED_space_clip_tracking_poll;
 
@@ -297,7 +297,7 @@ void CLIP_OT_delete_track(wmOperatorType *ot)
 
 /********************** delete marker operator *********************/
 
-static int delete_marker_exec(bContext *C, wmOperator *UNUSED(op))
+static int delete_marker_exec(bContext *C, wmOperator *op)
 {
        SpaceClip *sc = CTX_wm_space_clip(C);
        MovieClip *clip = ED_space_clip_get_clip(sc);
@@ -350,6 +350,8 @@ static int delete_marker_exec(bContext *C, wmOperator *UNUSED(op))
                sc->flag &= ~SC_LOCK_SELECTION;
        }
 
+       BKE_report(op->reports, RPT_INFO, "Deleted all selected markers");
+
        return OPERATOR_FINISHED;
 }
 
@@ -361,7 +363,6 @@ void CLIP_OT_delete_marker(wmOperatorType *ot)
        ot->description = "Delete marker for current frame from selected tracks";
 
        /* api callbacks */
-       ot->invoke = WM_operator_confirm;
        ot->exec = delete_marker_exec;
        ot->poll = ED_space_clip_tracking_poll;
 
index db13e2a402460b7f64ab78f7e4637bbae2ed3aaa..fd92247ecd8fab20f7e37ee99b8703ad3d025286 100644 (file)
@@ -872,11 +872,12 @@ void GRAPH_OT_duplicate(wmOperatorType *ot)
 
 /* ******************** Delete Keyframes Operator ************************* */
 
-static void delete_graph_keys(bAnimContext *ac)
+static bool delete_graph_keys(bAnimContext *ac)
 {
        ListBase anim_data = {NULL, NULL};
        bAnimListElem *ale;
        int filter;
+       bool modified = false;
        
        /* filter data */
        filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_CURVE_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS);
@@ -888,7 +889,7 @@ static void delete_graph_keys(bAnimContext *ac)
                AnimData *adt = ale->adt;
                
                /* delete selected keyframes only */
-               delete_fcurve_keys(fcu); 
+               modified |= delete_fcurve_keys(fcu);
                
                /* Only delete curve too if it won't be doing anything anymore */
                if ((fcu->totvert == 0) &&
@@ -901,20 +902,23 @@ static void delete_graph_keys(bAnimContext *ac)
        
        /* free filtered list */
        BLI_freelistN(&anim_data);
+
+       return modified;
 }
 
 /* ------------------- */
 
-static int graphkeys_delete_exec(bContext *C, wmOperator *UNUSED(op))
+static int graphkeys_delete_exec(bContext *C, wmOperator *op)
 {
        bAnimContext ac;
+       bool modified;
        
        /* get editor data */
        if (ANIM_animdata_get_context(C, &ac) == 0)
                return OPERATOR_CANCELLED;
                
        /* delete keyframes */
-       delete_graph_keys(&ac);
+       modified = delete_graph_keys(&ac);
        
        /* validate keyframes after editing */
        ANIM_editkeyframes_refresh(&ac);
@@ -922,6 +926,9 @@ static int graphkeys_delete_exec(bContext *C, wmOperator *UNUSED(op))
        /* set notifier that keyframes have changed */
        WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);
        
+       if (modified)
+               BKE_report(op->reports, RPT_INFO, "Deleted selected keyframes");
+
        return OPERATOR_FINISHED;
 }
  
@@ -933,7 +940,6 @@ void GRAPH_OT_delete(wmOperatorType *ot)
        ot->description = "Remove all selected keyframes";
        
        /* api callbacks */
-       ot->invoke = WM_operator_confirm;
        ot->exec = graphkeys_delete_exec;
        ot->poll = graphop_editable_keyframes_poll;
        
index 63aa92517a71222bf71f6cf36ed0e1b1ad4dd6e3..42244a0d99ef4ce8f542729632953945917bcb65 100644 (file)
@@ -2064,6 +2064,8 @@ static int sequencer_meta_make_exec(bContext *C, wmOperator *op)
 
        WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene);
 
+       BKE_report(op->reports, RPT_INFO, "Grouped selected strips into a metastrip");
+
        return OPERATOR_FINISHED;
 }
 
@@ -2075,7 +2077,6 @@ void SEQUENCER_OT_meta_make(wmOperatorType *ot)
        ot->description = "Group selected strips into a metastrip";
        
        /* api callbacks */
-       ot->invoke = WM_operator_confirm;
        ot->exec = sequencer_meta_make_exec;
        ot->poll = sequencer_edit_poll;
        
@@ -2094,7 +2095,7 @@ static int seq_depends_on_meta(Sequence *seq, Sequence *seqm)
 }
 
 /* separate_meta_make operator */
-static int sequencer_meta_separate_exec(bContext *C, wmOperator *UNUSED(op))
+static int sequencer_meta_separate_exec(bContext *C, wmOperator *op)
 {
        Scene *scene = CTX_data_scene(C);
        Editing *ed = BKE_sequencer_editing_get(scene, FALSE);
@@ -2135,6 +2136,8 @@ static int sequencer_meta_separate_exec(bContext *C, wmOperator *UNUSED(op))
 
        WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene);
 
+       BKE_report(op->reports, RPT_INFO, "Metastrip content put back into the sequencer");
+
        return OPERATOR_FINISHED;
 }
 
@@ -2146,7 +2149,6 @@ void SEQUENCER_OT_meta_separate(wmOperatorType *ot)
        ot->description = "Put the contents of a metastrip back in the sequencer";
        
        /* api callbacks */
-       ot->invoke = WM_operator_confirm;
        ot->exec = sequencer_meta_separate_exec;
        ot->poll = sequencer_edit_poll;
        
index dec9085baebcc947262096773fcf381952724b78..111b2ea3143f7eaddd6b2c8f0481b3b9c1bff26f 100644 (file)
@@ -46,6 +46,7 @@
 #include "BKE_blender.h"
 #include "BKE_context.h"
 #include "BKE_main.h"
+#include "BKE_report.h"
 
 #include "RNA_access.h"
 
@@ -76,6 +77,8 @@ static int view3d_copybuffer_exec(bContext *C, wmOperator *op)
        BLI_make_file_string("/", str, BLI_temporary_dir(), "copybuffer.blend");
        BKE_copybuffer_save(str, op->reports);
        
+       BKE_report(op->reports, RPT_INFO, "Copied selected objects to buffer");
+
        return OPERATOR_FINISHED;
 }
 
@@ -88,7 +91,6 @@ static void VIEW3D_OT_copybuffer(wmOperatorType *ot)
        ot->description = "Selected objects are saved in a temp file";
        
        /* api callbacks */
-       ot->invoke = WM_operator_confirm;
        ot->exec = view3d_copybuffer_exec;
        ot->poll = ED_operator_view3d_active;
 }
@@ -102,6 +104,8 @@ static int view3d_pastebuffer_exec(bContext *C, wmOperator *op)
 
        WM_event_add_notifier(C, NC_WINDOW, NULL);
        
+       BKE_report(op->reports, RPT_INFO, "Objects pasted from buffer");
+
        return OPERATOR_FINISHED;
 }
 
@@ -114,7 +118,6 @@ static void VIEW3D_OT_pastebuffer(wmOperatorType *ot)
        ot->description = "Contents of copy buffer gets pasted";
        
        /* api callbacks */
-       ot->invoke = WM_operator_confirm;
        ot->exec = view3d_pastebuffer_exec;
        ot->poll = ED_operator_view3d_active;