Fix image drag and drop

- Dropping now creates empty images w/o holding Ctrl.
- Dropping background images works when cursor over camera.
This commit is contained in:
Campbell Barton 2018-07-06 09:10:07 +02:00
parent 3314d0bcb6
commit 27e0d6cbd0
2 changed files with 45 additions and 13 deletions

View File

@ -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);

View File

@ -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;