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:
parent
3314d0bcb6
commit
27e0d6cbd0
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue