static int datadropper_init(bContext *C, wmOperator *op) { DataDropper *ddr; int index_dummy; StructRNA *type; SpaceType *st; ARegionType *art; st = BKE_spacetype_from_id(SPACE_VIEW3D); art = BKE_regiontype_from_id(st, RGN_TYPE_WINDOW); op->customdata = ddr = MEM_callocN(sizeof(DataDropper), "DataDropper"); UI_context_active_but_prop_get(C, &ddr->ptr, &ddr->prop, &index_dummy); if ((ddr->ptr.data == NULL) || (ddr->prop == NULL) || (RNA_property_editable(&ddr->ptr, ddr->prop) == false) || (RNA_property_type(ddr->prop) != PROP_POINTER)) { return false; } ddr->art = art; ddr->draw_handle_pixel = ED_region_draw_cb_activate(art, datadropper_draw_cb, ddr, REGION_DRAW_POST_PIXEL); type = RNA_property_pointer_type(&ddr->ptr, ddr->prop); ddr->idcode = RNA_type_to_ID_code(type); BLI_assert(ddr->idcode != 0); /* Note we can translate here (instead of on draw time), because this struct has very short lifetime. */ ddr->idcode_name = TIP_(BKE_idcode_to_name(ddr->idcode)); return true; }
static int datadropper_init(bContext *C, wmOperator *op) { DataDropper *ddr; int index_dummy; StructRNA *type; SpaceType *st; ARegionType *art; st = BKE_spacetype_from_id(SPACE_VIEW3D); art = BKE_regiontype_from_id(st, RGN_TYPE_WINDOW); op->customdata = ddr = MEM_callocN(sizeof(DataDropper), "DataDropper"); uiContextActiveProperty(C, &ddr->ptr, &ddr->prop, &index_dummy); if ((ddr->ptr.data == NULL) || (ddr->prop == NULL) || (RNA_property_editable(&ddr->ptr, ddr->prop) == false) || (RNA_property_type(ddr->prop) != PROP_POINTER)) { return false; } ddr->art = art; ddr->draw_handle_pixel = ED_region_draw_cb_activate(art, datadropper_draw_cb, ddr, REGION_DRAW_POST_PIXEL); type = RNA_property_pointer_type(&ddr->ptr, ddr->prop); ddr->idcode = RNA_type_to_ID_code(type); BLI_assert(ddr->idcode != 0); ddr->idcode_name = BKE_idcode_to_name(ddr->idcode); return true; }
/* not region itself */ void BKE_area_region_free(SpaceType *st, ARegion *ar) { uiList *uilst; if (st) { ARegionType *art = BKE_regiontype_from_id(st, ar->regiontype); if (art && art->free) art->free(ar); if (ar->regiondata) printf("regiondata free error\n"); } else if (ar->type && ar->type->free) ar->type->free(ar); if (ar->v2d.tab_offset) { MEM_freeN(ar->v2d.tab_offset); ar->v2d.tab_offset = NULL; } if (!BLI_listbase_is_empty(&ar->panels)) { Panel *pa, *pa_next; for (pa = ar->panels.first; pa; pa = pa_next) { pa_next = pa->next; if (pa->activedata) { MEM_freeN(pa->activedata); } MEM_freeN(pa); } } for (uilst = ar->ui_lists.first; uilst; uilst = uilst->next) { if (uilst->dyn_data) { uiListDyn *dyn_data = uilst->dyn_data; if (dyn_data->items_filter_flags) { MEM_freeN(dyn_data->items_filter_flags); } if (dyn_data->items_filter_neworder) { MEM_freeN(dyn_data->items_filter_neworder); } MEM_freeN(dyn_data); } if (uilst->properties) { IDP_FreeProperty(uilst->properties); MEM_freeN(uilst->properties); } } BLI_freelistN(&ar->ui_lists); BLI_freelistN(&ar->ui_previews); BLI_freelistN(&ar->panels_category); BLI_freelistN(&ar->panels_category_active); }
ARegion *BKE_area_region_copy(SpaceType *st, ARegion *ar) { ARegion *newar = MEM_dupallocN(ar); Panel *pa, *newpa, *patab; newar->prev = newar->next = NULL; BLI_listbase_clear(&newar->handlers); BLI_listbase_clear(&newar->uiblocks); BLI_listbase_clear(&newar->panels_category); BLI_listbase_clear(&newar->panels_category_active); BLI_listbase_clear(&newar->ui_lists); newar->swinid = 0; /* use optional regiondata callback */ if (ar->regiondata) { ARegionType *art = BKE_regiontype_from_id(st, ar->regiontype); if (art && art->duplicate) newar->regiondata = art->duplicate(ar->regiondata); else newar->regiondata = MEM_dupallocN(ar->regiondata); } if (ar->v2d.tab_offset) newar->v2d.tab_offset = MEM_dupallocN(ar->v2d.tab_offset); BLI_listbase_clear(&newar->panels); BLI_duplicatelist(&newar->panels, &ar->panels); BLI_listbase_clear(&newar->ui_previews); BLI_duplicatelist(&newar->ui_previews, &ar->ui_previews); /* copy panel pointers */ for (newpa = newar->panels.first; newpa; newpa = newpa->next) { patab = newar->panels.first; pa = ar->panels.first; while (patab) { if (newpa->paneltab == pa) { newpa->paneltab = patab; break; } patab = patab->next; pa = pa->next; } } return newar; }
static int depthdropper_init(bContext *C, wmOperator *op) { int index_dummy; SpaceType *st; ARegionType *art; st = BKE_spacetype_from_id(SPACE_VIEW3D); art = BKE_regiontype_from_id(st, RGN_TYPE_WINDOW); DepthDropper *ddr = MEM_callocN(sizeof(DepthDropper), __func__); uiBut *but = UI_context_active_but_prop_get(C, &ddr->ptr, &ddr->prop, &index_dummy); /* fallback to the active camera's dof */ if (ddr->prop == NULL) { RegionView3D *rv3d = CTX_wm_region_view3d(C); if (rv3d && rv3d->persp == RV3D_CAMOB) { View3D *v3d = CTX_wm_view3d(C); if (v3d->camera && v3d->camera->data && !ID_IS_LINKED(v3d->camera->data)) { RNA_id_pointer_create(v3d->camera->data, &ddr->ptr); ddr->prop = RNA_struct_find_property(&ddr->ptr, "dof_distance"); ddr->is_undo = true; } } } else { ddr->is_undo = UI_but_flag_is_set(but, UI_BUT_UNDO); } if ((ddr->ptr.data == NULL) || (ddr->prop == NULL) || (RNA_property_editable(&ddr->ptr, ddr->prop) == false) || (RNA_property_type(ddr->prop) != PROP_FLOAT)) { MEM_freeN(ddr); return false; } op->customdata = ddr; ddr->art = art; ddr->draw_handle_pixel = ED_region_draw_cb_activate( art, depthdropper_draw_cb, ddr, REGION_DRAW_POST_PIXEL); ddr->init_depth = RNA_property_float_get(&ddr->ptr, ddr->prop); return true; }
/* not region itself */ void BKE_area_region_free(SpaceType *st, ARegion *ar) { if (st) { ARegionType *art= BKE_regiontype_from_id(st, ar->regiontype); if (art && art->free) art->free(ar); if (ar->regiondata) printf("regiondata free error\n"); } else if (ar->type && ar->type->free) ar->type->free(ar); if (ar->v2d.tab_offset) { MEM_freeN(ar->v2d.tab_offset); ar->v2d.tab_offset= NULL; } BLI_freelistN(&ar->panels); }
static int depthdropper_init(bContext *C, wmOperator *op) { DepthDropper *ddr; int index_dummy; SpaceType *st; ARegionType *art; st = BKE_spacetype_from_id(SPACE_VIEW3D); art = BKE_regiontype_from_id(st, RGN_TYPE_WINDOW); op->customdata = ddr = MEM_callocN(sizeof(DepthDropper), "DepthDropper"); UI_context_active_but_prop_get(C, &ddr->ptr, &ddr->prop, &index_dummy); /* fallback to the active camera's dof */ if (ddr->prop == NULL) { RegionView3D *rv3d = CTX_wm_region_view3d(C); if (rv3d && rv3d->persp == RV3D_CAMOB) { View3D *v3d = CTX_wm_view3d(C); if (v3d->camera && v3d->camera->data && (((ID *)v3d->camera->data)->lib == NULL)) { RNA_id_pointer_create(v3d->camera->data, &ddr->ptr); ddr->prop = RNA_struct_find_property(&ddr->ptr, "dof_distance"); } } } if ((ddr->ptr.data == NULL) || (ddr->prop == NULL) || (RNA_property_editable(&ddr->ptr, ddr->prop) == false) || (RNA_property_type(ddr->prop) != PROP_FLOAT)) { return false; } ddr->art = art; ddr->draw_handle_pixel = ED_region_draw_cb_activate(art, depthdropper_draw_cb, ddr, REGION_DRAW_POST_PIXEL); return true; }
PyObject *pyrna_callback_classmethod_remove(PyObject *UNUSED(self), PyObject *args) { PyObject *cls; PyObject *py_handle; void *handle; void *customdata; StructRNA *srna; char *cb_regiontype_str; int cb_regiontype; if (PyTuple_GET_SIZE(args) < 2) { PyErr_SetString(PyExc_ValueError, "callback_remove(handle): expected at least 2 args"); return NULL; } cls = PyTuple_GET_ITEM(args, 0); if (!(srna = pyrna_struct_as_srna(cls, false, "callback_remove"))) { return NULL; } py_handle = PyTuple_GET_ITEM(args, 1); handle = PyCapsule_GetPointer(py_handle, RNA_CAPSULE_ID); if (handle == NULL) { PyErr_SetString(PyExc_ValueError, "callback_remove(handle): NULL handle given, invalid or already removed"); return NULL; } if (RNA_struct_is_a(srna, &RNA_Space)) { if (!PyArg_ParseTuple(args, "OO!s:Space.draw_handler_remove", &cls, &PyCapsule_Type, &py_handle, /* already assigned, no matter */ &cb_regiontype_str)) { return NULL; } customdata = ED_region_draw_cb_customdata(handle); Py_DECREF((PyObject *)customdata); if (pyrna_enum_value_from_id(region_type_items, cb_regiontype_str, &cb_regiontype, "bpy_struct.callback_remove()") == -1) { return NULL; } else { const eSpace_Type spaceid = rna_Space_refine_reverse(srna); if (spaceid == -1) { PyErr_Format(PyExc_TypeError, "unknown space type '%.200s'", RNA_struct_identifier(srna)); return NULL; } else { SpaceType *st = BKE_spacetype_from_id(spaceid); ARegionType *art = BKE_regiontype_from_id(st, cb_regiontype); ED_region_draw_cb_exit(art, handle); } } } else { PyErr_SetString(PyExc_TypeError, "callback_remove(): type does not support callbacks"); return NULL; } /* don't allow reuse */ PyCapsule_SetName(py_handle, RNA_CAPSULE_ID_INVALID); Py_RETURN_NONE; }
PyObject *pyrna_callback_classmethod_add(PyObject *UNUSED(self), PyObject *args) { void *handle; PyObject *cls; PyObject *cb_func, *cb_args; char *cb_regiontype_str; char *cb_event_str; int cb_event; int cb_regiontype; StructRNA *srna; if (PyTuple_GET_SIZE(args) < 2) { PyErr_SetString(PyExc_ValueError, "handler_add(handle): expected at least 2 args"); return NULL; } cls = PyTuple_GET_ITEM(args, 0); if (!(srna = pyrna_struct_as_srna(cls, false, "handler_add"))) { return NULL; } cb_func = PyTuple_GET_ITEM(args, 1); if (!PyCallable_Check(cb_func)) { PyErr_SetString(PyExc_TypeError, "first argument isn't callable"); return NULL; } /* class specific callbacks */ if (RNA_struct_is_a(srna, &RNA_Space)) { if (!PyArg_ParseTuple(args, "OOO!ss:Space.draw_handler_add", &cls, &cb_func, /* already assigned, no matter */ &PyTuple_Type, &cb_args, &cb_regiontype_str, &cb_event_str)) { return NULL; } if (pyrna_enum_value_from_id(region_draw_mode_items, cb_event_str, &cb_event, "bpy_struct.callback_add()") == -1) { return NULL; } else if (pyrna_enum_value_from_id(region_type_items, cb_regiontype_str, &cb_regiontype, "bpy_struct.callback_add()") == -1) { return NULL; } else { const eSpace_Type spaceid = rna_Space_refine_reverse(srna); if (spaceid == -1) { PyErr_Format(PyExc_TypeError, "unknown space type '%.200s'", RNA_struct_identifier(srna)); return NULL; } else { SpaceType *st = BKE_spacetype_from_id(spaceid); ARegionType *art = BKE_regiontype_from_id(st, cb_regiontype); handle = ED_region_draw_cb_activate(art, cb_region_draw, (void *)args, cb_event); Py_INCREF(args); } } } else { PyErr_SetString(PyExc_TypeError, "callback_add(): type does not support callbacks"); return NULL; } return PyCapsule_New((void *)handle, RNA_CAPSULE_ID, NULL); }