[Bf-blender-cvs] [27e0d6cbd03] blender2.8: Fix image drag and drop

Campbell Barton noreply at git.blender.org
Fri Jul 6 09:11:51 CEST 2018


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;



More information about the Bf-blender-cvs mailing list