/** * \brief get the ID from the screen. * */ static void datadropper_id_sample_pt(bContext *C, DataDropper *ddr, int mx, int my, ID **r_id) { /* we could use some clever */ wmWindow *win = CTX_wm_window(C); ScrArea *sa; ScrArea *area_prev = CTX_wm_area(C); ARegion *ar_prev = CTX_wm_region(C); ddr->name[0] = '\0'; for (sa = win->screen->areabase.first; sa; sa = sa->next) { if (BLI_rcti_isect_pt(&sa->totrct, mx, my)) { if (sa->spacetype == SPACE_VIEW3D) { ARegion *ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW); if (ar && BLI_rcti_isect_pt(&ar->winrct, mx, my)) { int mval[2] = {mx - ar->winrct.xmin, my - ar->winrct.ymin}; Base *base; CTX_wm_area_set(C, sa); CTX_wm_region_set(C, ar); /* grr, always draw else we leave stale text */ ED_region_tag_redraw(ar); base = ED_view3d_give_base_under_cursor(C, mval); if (base) { Object *ob = base->object; ID *id = NULL; if (ddr->idcode == ID_OB) { id = (ID *)ob; } else if (ob->data) { if (GS(((ID *)ob->data)->name) == ddr->idcode) { id = (ID *)ob->data; } else { BLI_snprintf(ddr->name, sizeof(ddr->name), "Incompatible, expected a %s", ddr->idcode_name); } } if (id) { BLI_snprintf(ddr->name, sizeof(ddr->name), "%s: %s", ddr->idcode_name, id->name + 2); *r_id = id; } break; } } } } } CTX_wm_area_set(C, area_prev); CTX_wm_region_set(C, ar_prev); }
/** * \brief get the ID from the screen. */ static void datadropper_id_sample_pt(bContext *C, DataDropper *ddr, int mx, int my, ID **r_id) { /* we could use some clever */ bScreen *screen = CTX_wm_screen(C); ScrArea *sa = BKE_screen_find_area_xy(screen, -1, mx, my); ScrArea *area_prev = CTX_wm_area(C); ARegion *ar_prev = CTX_wm_region(C); ddr->name[0] = '\0'; if (sa) { if (sa->spacetype == SPACE_VIEW3D) { ARegion *ar = BKE_area_find_region_xy(sa, RGN_TYPE_WINDOW, mx, my); if (ar) { const int mval[2] = {mx - ar->winrct.xmin, my - ar->winrct.ymin}; Base *base; CTX_wm_area_set(C, sa); CTX_wm_region_set(C, ar); /* grr, always draw else we leave stale text */ ED_region_tag_redraw(ar); base = ED_view3d_give_base_under_cursor(C, mval); if (base) { Object *ob = base->object; ID *id = NULL; if (ddr->idcode == ID_OB) { id = (ID *)ob; } else if (ob->data) { if (GS(((ID *)ob->data)->name) == ddr->idcode) { id = (ID *)ob->data; } else { BLI_snprintf( ddr->name, sizeof(ddr->name), "Incompatible, expected a %s", ddr->idcode_name); } } PointerRNA idptr; RNA_id_pointer_create(id, &idptr); if (id && RNA_property_pointer_poll(&ddr->ptr, ddr->prop, &idptr)) { BLI_snprintf(ddr->name, sizeof(ddr->name), "%s: %s", ddr->idcode_name, id->name + 2); *r_id = id; } } } } } CTX_wm_area_set(C, area_prev); CTX_wm_region_set(C, ar_prev); }
static int drop_named_image_invoke(bContext *C, wmOperator *op, wmEvent *event) { Scene *scene= CTX_data_scene(C); View3D *v3d= CTX_wm_view3d(C); Base *base= ED_view3d_give_base_under_cursor(C, event->mval); Image *ima= NULL; Mesh *me; Object *obedit; int exitmode= 0; char name[32]; /* Check context */ if(base==NULL || base->object->type!=OB_MESH) { BKE_report(op->reports, RPT_ERROR, "Not an Object or Mesh"); return OPERATOR_CANCELLED; } /* check input variables */ if(RNA_property_is_set(op->ptr, "filepath")) { char path[FILE_MAX]; RNA_string_get(op->ptr, "filepath", path); ima= BKE_add_image_file(path); } else { RNA_string_get(op->ptr, "name", name); ima= (Image *)find_id("IM", name); } if(!ima) { BKE_report(op->reports, RPT_ERROR, "Not an Image."); return OPERATOR_CANCELLED; } /* turn mesh in editmode */ /* BKE_mesh_get/end_editmesh: ED_uvedit_assign_image also calls this */ obedit= base->object; me= obedit->data; if(me->edit_mesh==NULL) { make_editMesh(scene, obedit); exitmode= 1; } if(me->edit_mesh==NULL) return OPERATOR_CANCELLED; ED_uvedit_assign_image(scene, obedit, ima, NULL); if(exitmode) { load_editMesh(scene, obedit); free_editMesh(me->edit_mesh); MEM_freeN(me->edit_mesh); me->edit_mesh= NULL; } /* dummie drop support; ensure view shows a result :) */ if(v3d) v3d->flag2 |= V3D_SOLID_TEX; WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); return OPERATOR_FINISHED; }