Commit: 27e0d6cbd03db5d6eeead80953842968b1343e25
Author: Campbell Barton
Date:   Fri Jul 6 09:10:07 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB27e0d6cbd03db5d6eeead80953842968b1343e25

Fix image drag and drop

- Dropping now creates empty images w/o holding Ctrl.
- Dropping background images works when cursor over camera.

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

M       source/blender/editors/space_view3d/space_view3d.c
M       source/blender/editors/space_view3d/view3d_edit.c

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

diff --git a/source/blender/editors/space_view3d/space_view3d.c 
b/source/blender/editors/space_view3d/space_view3d.c
index 77beadccd5d..15d241a88cc 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -596,10 +596,23 @@ static bool view3d_ima_drop_poll(bContext *UNUSED(C), 
wmDrag *drag, const wmEven
        return 0;
 }
 
+static bool view3d_ima_bg_is_camera_view(bContext *C)
+{
+       RegionView3D *rv3d = CTX_wm_region_view3d(C);
+       if ((rv3d && (rv3d->persp == RV3D_CAMOB))) {
+               View3D *v3d = CTX_wm_view3d(C);
+               if (v3d && v3d->camera && v3d->camera->type == OB_CAMERA) {
+                       return true;
+               }
+       }
+       return false;
+}
+
 static bool view3d_ima_bg_drop_poll(bContext *C, wmDrag *drag, const wmEvent 
*event)
 {
-       if (event->ctrl)
-               return false;
+       if (view3d_ima_bg_is_camera_view(C)) {
+               return true;
+       }
 
        if (!ED_view3d_give_base_under_cursor(C, event->mval)) {
                return view3d_ima_drop_poll(C, drag, event);
@@ -609,10 +622,14 @@ static bool view3d_ima_bg_drop_poll(bContext *C, wmDrag 
*drag, const wmEvent *ev
 
 static bool view3d_ima_empty_drop_poll(bContext *C, wmDrag *drag, const 
wmEvent *event)
 {
+       if (!view3d_ima_bg_is_camera_view(C)) {
+               return true;
+       }
+
        Base *base = ED_view3d_give_base_under_cursor(C, event->mval);
 
        /* either holding and ctrl and no object, or dropping to empty */
-       if (((base == NULL) && event->ctrl) ||
+       if ((base == NULL) ||
            ((base != NULL) && base->object->type == OB_EMPTY))
        {
                return view3d_ima_drop_poll(C, drag, event);
diff --git a/source/blender/editors/space_view3d/view3d_edit.c 
b/source/blender/editors/space_view3d/view3d_edit.c
index 0078988e1b0..d4c2f5babb1 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -4427,30 +4427,40 @@ void VIEW3D_OT_navigate(wmOperatorType *ot)
 /** \name Background Image Add Operator
  * \{ */
 
-static CameraBGImage *background_image_add(bContext *C)
-{
-       Camera *cam = CTX_data_pointer_get_type(C, "camera", &RNA_Camera).data;
 
-       return BKE_camera_background_image_new(cam);
+static Camera *background_image_camera_from_context(bContext *C)
+{
+       /* Needed to support drag-and-drop & camera buttons context. */
+       View3D *v3d = CTX_wm_view3d(C);
+       if (v3d != NULL) {
+               if (v3d->camera && v3d->camera->data && v3d->camera->type == 
OB_CAMERA) {
+                       return v3d->camera->data;
+               }
+               return NULL;
+       }
+       else {
+               return CTX_data_pointer_get_type(C, "camera", &RNA_Camera).data;
+       }
 }
 
 static int background_image_add_exec(bContext *C, wmOperator *UNUSED(op))
 {
-       background_image_add(C);
+       Camera *cam = background_image_camera_from_context(C);
+       BKE_camera_background_image_new(cam);
 
        return OPERATOR_FINISHED;
 }
 
 static int background_image_add_invoke(bContext *C, wmOperator *op, const 
wmEvent *UNUSED(event))
 {
-       Camera *cam = CTX_data_pointer_get_type(C, "camera", &RNA_Camera).data;
+       Camera *cam = background_image_camera_from_context(C);
        Image *ima;
        CameraBGImage *bgpic;
 
        ima = (Image *)WM_operator_drop_load_path(C, op, ID_IM);
        /* may be NULL, continue anyway */
 
-       bgpic = background_image_add(C);
+       bgpic = BKE_camera_background_image_new(cam);
        bgpic->ima = ima;
 
        cam->flag |= CAM_SHOW_BG_IMAGE;
@@ -4460,19 +4470,24 @@ static int background_image_add_invoke(bContext *C, 
wmOperator *op, const wmEven
        return OPERATOR_FINISHED;
 }
 
+static bool background_image_add_poll(bContext *C)
+{
+       return background_image_camera_from_context(C) != NULL;
+}
+
 void VIEW3D_OT_background_image_add(wmOperatorType *ot)
 {
        /* identifiers */
        /* note: having key shortcut here is bad practice,
         * but for now keep because this displays when dragging an image over 
the 3D viewport */
-       ot->name   = "Add Background Image (Ctrl for Empty Object)";
-       ot->description = "Add a new background image (Ctrl for Empty Object)";
+       ot->name   = "Add Background Image";
+       ot->description = "Add a new background image";
        ot->idname = "VIEW3D_OT_background_image_add";
 
        /* api callbacks */
        ot->invoke = background_image_add_invoke;
        ot->exec   = background_image_add_exec;
-       ot->poll   = ED_operator_camera;
+       ot->poll   = background_image_add_poll;
 
        /* flags */
        ot->flag   = OPTYPE_UNDO;

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to