Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_buttons/buttons_context.c
| Show First 20 Lines • Show All 774 Lines • ▼ Show 20 Lines | |||||
| #endif | #endif | ||||
| #ifdef WITH_PARTICLE_NODES | #ifdef WITH_PARTICLE_NODES | ||||
| "pointcloud", | "pointcloud", | ||||
| #endif | #endif | ||||
| "volume", | "volume", | ||||
| NULL, | NULL, | ||||
| }; | }; | ||||
| int buttons_context(const bContext *C, const char *member, bContextDataResult *result) | int /*eContextResult*/ buttons_context(const bContext *C, | ||||
| const char *member, | |||||
| bContextDataResult *result) | |||||
| { | { | ||||
| SpaceProperties *sbuts = CTX_wm_space_properties(C); | SpaceProperties *sbuts = CTX_wm_space_properties(C); | ||||
| ButsContextPath *path = sbuts ? sbuts->path : NULL; | ButsContextPath *path = sbuts ? sbuts->path : NULL; | ||||
| if (!path) { | if (!path) { | ||||
| return 0; | return CTX_RESULT_MEMBER_NOT_FOUND; | ||||
| } | } | ||||
| if (sbuts->mainb == BCONTEXT_TOOL) { | if (sbuts->mainb == BCONTEXT_TOOL) { | ||||
| return 0; | return CTX_RESULT_MEMBER_NOT_FOUND; | ||||
| } | } | ||||
| /* here we handle context, getting data from precomputed path */ | /* here we handle context, getting data from precomputed path */ | ||||
| if (CTX_data_dir(member)) { | if (CTX_data_dir(member)) { | ||||
| /* in case of new shading system we skip texture_slot, complex python | /* in case of new shading system we skip texture_slot, complex python | ||||
| * UI script logic depends on checking if this is available */ | * UI script logic depends on checking if this is available */ | ||||
| if (sbuts->texuser) { | if (sbuts->texuser) { | ||||
| CTX_data_dir_set(result, buttons_context_dir + 1); | CTX_data_dir_set(result, buttons_context_dir + 1); | ||||
| } | } | ||||
| else { | else { | ||||
| CTX_data_dir_set(result, buttons_context_dir); | CTX_data_dir_set(result, buttons_context_dir); | ||||
| } | } | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "scene")) { | if (CTX_data_equals(member, "scene")) { | ||||
| /* Do not return one here if scene not found in path, | /* Do not return one here if scene not found in path, | ||||
| * in this case we want to get default context scene! */ | * in this case we want to get default context scene! */ | ||||
| return set_pointer_type(path, result, &RNA_Scene); | return set_pointer_type(path, result, &RNA_Scene); | ||||
| } | } | ||||
| if (CTX_data_equals(member, "world")) { | if (CTX_data_equals(member, "world")) { | ||||
| set_pointer_type(path, result, &RNA_World); | set_pointer_type(path, result, &RNA_World); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "object")) { | if (CTX_data_equals(member, "object")) { | ||||
| set_pointer_type(path, result, &RNA_Object); | set_pointer_type(path, result, &RNA_Object); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "mesh")) { | if (CTX_data_equals(member, "mesh")) { | ||||
| set_pointer_type(path, result, &RNA_Mesh); | set_pointer_type(path, result, &RNA_Mesh); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "armature")) { | if (CTX_data_equals(member, "armature")) { | ||||
| set_pointer_type(path, result, &RNA_Armature); | set_pointer_type(path, result, &RNA_Armature); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "lattice")) { | if (CTX_data_equals(member, "lattice")) { | ||||
| set_pointer_type(path, result, &RNA_Lattice); | set_pointer_type(path, result, &RNA_Lattice); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "curve")) { | if (CTX_data_equals(member, "curve")) { | ||||
| set_pointer_type(path, result, &RNA_Curve); | set_pointer_type(path, result, &RNA_Curve); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "meta_ball")) { | if (CTX_data_equals(member, "meta_ball")) { | ||||
| set_pointer_type(path, result, &RNA_MetaBall); | set_pointer_type(path, result, &RNA_MetaBall); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "light")) { | if (CTX_data_equals(member, "light")) { | ||||
| set_pointer_type(path, result, &RNA_Light); | set_pointer_type(path, result, &RNA_Light); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "camera")) { | if (CTX_data_equals(member, "camera")) { | ||||
| set_pointer_type(path, result, &RNA_Camera); | set_pointer_type(path, result, &RNA_Camera); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "speaker")) { | if (CTX_data_equals(member, "speaker")) { | ||||
| set_pointer_type(path, result, &RNA_Speaker); | set_pointer_type(path, result, &RNA_Speaker); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "lightprobe")) { | if (CTX_data_equals(member, "lightprobe")) { | ||||
| set_pointer_type(path, result, &RNA_LightProbe); | set_pointer_type(path, result, &RNA_LightProbe); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| #ifdef WITH_HAIR_NODES | #ifdef WITH_HAIR_NODES | ||||
| if (CTX_data_equals(member, "hair")) { | if (CTX_data_equals(member, "hair")) { | ||||
| set_pointer_type(path, result, &RNA_Hair); | set_pointer_type(path, result, &RNA_Hair); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| #endif | #endif | ||||
| #ifdef WITH_PARTICLE_NODES | #ifdef WITH_PARTICLE_NODES | ||||
| if (CTX_data_equals(member, "pointcloud")) { | if (CTX_data_equals(member, "pointcloud")) { | ||||
| set_pointer_type(path, result, &RNA_PointCloud); | set_pointer_type(path, result, &RNA_PointCloud); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| #endif | #endif | ||||
| if (CTX_data_equals(member, "volume")) { | if (CTX_data_equals(member, "volume")) { | ||||
| set_pointer_type(path, result, &RNA_Volume); | set_pointer_type(path, result, &RNA_Volume); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "material")) { | if (CTX_data_equals(member, "material")) { | ||||
| set_pointer_type(path, result, &RNA_Material); | set_pointer_type(path, result, &RNA_Material); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "texture")) { | if (CTX_data_equals(member, "texture")) { | ||||
| ButsContextTexture *ct = sbuts->texuser; | ButsContextTexture *ct = sbuts->texuser; | ||||
| if (ct) { | if (ct) { | ||||
| CTX_data_pointer_set(result, &ct->texture->id, &RNA_Texture, ct->texture); | CTX_data_pointer_set(result, &ct->texture->id, &RNA_Texture, ct->texture); | ||||
| } | } | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "material_slot")) { | if (CTX_data_equals(member, "material_slot")) { | ||||
| PointerRNA *ptr = get_pointer_type(path, &RNA_Object); | PointerRNA *ptr = get_pointer_type(path, &RNA_Object); | ||||
| if (ptr) { | if (ptr) { | ||||
| Object *ob = ptr->data; | Object *ob = ptr->data; | ||||
| if (ob && OB_TYPE_SUPPORT_MATERIAL(ob->type) && ob->totcol) { | if (ob && OB_TYPE_SUPPORT_MATERIAL(ob->type) && ob->totcol) { | ||||
| /* a valid actcol isn't ensured T27526. */ | /* a valid actcol isn't ensured T27526. */ | ||||
| int matnr = ob->actcol - 1; | int matnr = ob->actcol - 1; | ||||
| if (matnr < 0) { | if (matnr < 0) { | ||||
| matnr = 0; | matnr = 0; | ||||
| } | } | ||||
| CTX_data_pointer_set(result, &ob->id, &RNA_MaterialSlot, &ob->mat[matnr]); | CTX_data_pointer_set(result, &ob->id, &RNA_MaterialSlot, &ob->mat[matnr]); | ||||
| } | } | ||||
| } | } | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "texture_user")) { | if (CTX_data_equals(member, "texture_user")) { | ||||
| ButsContextTexture *ct = sbuts->texuser; | ButsContextTexture *ct = sbuts->texuser; | ||||
| if (!ct) { | if (!ct) { | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| if (ct->user && ct->user->ptr.data) { | if (ct->user && ct->user->ptr.data) { | ||||
| ButsTextureUser *user = ct->user; | ButsTextureUser *user = ct->user; | ||||
| CTX_data_pointer_set(result, user->ptr.owner_id, user->ptr.type, user->ptr.data); | CTX_data_pointer_set(result, user->ptr.owner_id, user->ptr.type, user->ptr.data); | ||||
| } | } | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "texture_user_property")) { | if (CTX_data_equals(member, "texture_user_property")) { | ||||
| ButsContextTexture *ct = sbuts->texuser; | ButsContextTexture *ct = sbuts->texuser; | ||||
| if (!ct) { | if (!ct) { | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| if (ct->user && ct->user->ptr.data) { | if (ct->user && ct->user->ptr.data) { | ||||
| ButsTextureUser *user = ct->user; | ButsTextureUser *user = ct->user; | ||||
| CTX_data_pointer_set(result, NULL, &RNA_Property, user->prop); | CTX_data_pointer_set(result, NULL, &RNA_Property, user->prop); | ||||
| } | } | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "texture_node")) { | if (CTX_data_equals(member, "texture_node")) { | ||||
| ButsContextTexture *ct = sbuts->texuser; | ButsContextTexture *ct = sbuts->texuser; | ||||
| if (ct) { | if (ct) { | ||||
| /* new shading system */ | /* new shading system */ | ||||
| if (ct->user && ct->user->node) { | if (ct->user && ct->user->node) { | ||||
| CTX_data_pointer_set(result, &ct->user->ntree->id, &RNA_Node, ct->user->node); | CTX_data_pointer_set(result, &ct->user->ntree->id, &RNA_Node, ct->user->node); | ||||
| } | } | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| return -1; /* found but not available */ | return CTX_RESULT_NO_DATA; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "texture_slot")) { | if (CTX_data_equals(member, "texture_slot")) { | ||||
| ButsContextTexture *ct = sbuts->texuser; | ButsContextTexture *ct = sbuts->texuser; | ||||
| PointerRNA *ptr; | PointerRNA *ptr; | ||||
| /* Particles slots are used in both old and new textures handling. */ | /* Particles slots are used in both old and new textures handling. */ | ||||
| if ((ptr = get_pointer_type(path, &RNA_ParticleSystem))) { | if ((ptr = get_pointer_type(path, &RNA_ParticleSystem))) { | ||||
| ParticleSettings *part = ((ParticleSystem *)ptr->data)->part; | ParticleSettings *part = ((ParticleSystem *)ptr->data)->part; | ||||
| Show All 10 Lines | else if ((ptr = get_pointer_type(path, &RNA_FreestyleLineStyle))) { | ||||
| FreestyleLineStyle *ls = ptr->data; | FreestyleLineStyle *ls = ptr->data; | ||||
| if (ls) { | if (ls) { | ||||
| CTX_data_pointer_set( | CTX_data_pointer_set( | ||||
| result, &ls->id, &RNA_LineStyleTextureSlot, ls->mtex[(int)ls->texact]); | result, &ls->id, &RNA_LineStyleTextureSlot, ls->mtex[(int)ls->texact]); | ||||
| } | } | ||||
| } | } | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "bone")) { | if (CTX_data_equals(member, "bone")) { | ||||
| set_pointer_type(path, result, &RNA_Bone); | set_pointer_type(path, result, &RNA_Bone); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "edit_bone")) { | if (CTX_data_equals(member, "edit_bone")) { | ||||
| set_pointer_type(path, result, &RNA_EditBone); | set_pointer_type(path, result, &RNA_EditBone); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "pose_bone")) { | if (CTX_data_equals(member, "pose_bone")) { | ||||
| set_pointer_type(path, result, &RNA_PoseBone); | set_pointer_type(path, result, &RNA_PoseBone); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "particle_system")) { | if (CTX_data_equals(member, "particle_system")) { | ||||
| set_pointer_type(path, result, &RNA_ParticleSystem); | set_pointer_type(path, result, &RNA_ParticleSystem); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "particle_system_editable")) { | if (CTX_data_equals(member, "particle_system_editable")) { | ||||
| if (PE_poll((bContext *)C)) { | if (PE_poll((bContext *)C)) { | ||||
| set_pointer_type(path, result, &RNA_ParticleSystem); | set_pointer_type(path, result, &RNA_ParticleSystem); | ||||
| } | } | ||||
| else { | else { | ||||
| CTX_data_pointer_set(result, NULL, &RNA_ParticleSystem, NULL); | CTX_data_pointer_set(result, NULL, &RNA_ParticleSystem, NULL); | ||||
| } | } | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "particle_settings")) { | if (CTX_data_equals(member, "particle_settings")) { | ||||
| /* only available when pinned */ | /* only available when pinned */ | ||||
| PointerRNA *ptr = get_pointer_type(path, &RNA_ParticleSettings); | PointerRNA *ptr = get_pointer_type(path, &RNA_ParticleSettings); | ||||
| if (ptr && ptr->data) { | if (ptr && ptr->data) { | ||||
| CTX_data_pointer_set(result, ptr->owner_id, &RNA_ParticleSettings, ptr->data); | CTX_data_pointer_set(result, ptr->owner_id, &RNA_ParticleSettings, ptr->data); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| /* get settings from active particle system instead */ | /* get settings from active particle system instead */ | ||||
| ptr = get_pointer_type(path, &RNA_ParticleSystem); | ptr = get_pointer_type(path, &RNA_ParticleSystem); | ||||
| if (ptr && ptr->data) { | if (ptr && ptr->data) { | ||||
| ParticleSettings *part = ((ParticleSystem *)ptr->data)->part; | ParticleSettings *part = ((ParticleSystem *)ptr->data)->part; | ||||
| CTX_data_pointer_set(result, ptr->owner_id, &RNA_ParticleSettings, part); | CTX_data_pointer_set(result, ptr->owner_id, &RNA_ParticleSettings, part); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| set_pointer_type(path, result, &RNA_ParticleSettings); | set_pointer_type(path, result, &RNA_ParticleSettings); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "cloth")) { | if (CTX_data_equals(member, "cloth")) { | ||||
| PointerRNA *ptr = get_pointer_type(path, &RNA_Object); | PointerRNA *ptr = get_pointer_type(path, &RNA_Object); | ||||
| if (ptr && ptr->data) { | if (ptr && ptr->data) { | ||||
| Object *ob = ptr->data; | Object *ob = ptr->data; | ||||
| ModifierData *md = BKE_modifiers_findby_type(ob, eModifierType_Cloth); | ModifierData *md = BKE_modifiers_findby_type(ob, eModifierType_Cloth); | ||||
| CTX_data_pointer_set(result, &ob->id, &RNA_ClothModifier, md); | CTX_data_pointer_set(result, &ob->id, &RNA_ClothModifier, md); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| return -1; /* found but not available */ | return CTX_RESULT_NO_DATA; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "soft_body")) { | if (CTX_data_equals(member, "soft_body")) { | ||||
| PointerRNA *ptr = get_pointer_type(path, &RNA_Object); | PointerRNA *ptr = get_pointer_type(path, &RNA_Object); | ||||
| if (ptr && ptr->data) { | if (ptr && ptr->data) { | ||||
| Object *ob = ptr->data; | Object *ob = ptr->data; | ||||
| ModifierData *md = BKE_modifiers_findby_type(ob, eModifierType_Softbody); | ModifierData *md = BKE_modifiers_findby_type(ob, eModifierType_Softbody); | ||||
| CTX_data_pointer_set(result, &ob->id, &RNA_SoftBodyModifier, md); | CTX_data_pointer_set(result, &ob->id, &RNA_SoftBodyModifier, md); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| return -1; /* found but not available */ | return CTX_RESULT_NO_DATA; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "fluid")) { | if (CTX_data_equals(member, "fluid")) { | ||||
| PointerRNA *ptr = get_pointer_type(path, &RNA_Object); | PointerRNA *ptr = get_pointer_type(path, &RNA_Object); | ||||
| if (ptr && ptr->data) { | if (ptr && ptr->data) { | ||||
| Object *ob = ptr->data; | Object *ob = ptr->data; | ||||
| ModifierData *md = BKE_modifiers_findby_type(ob, eModifierType_Fluid); | ModifierData *md = BKE_modifiers_findby_type(ob, eModifierType_Fluid); | ||||
| CTX_data_pointer_set(result, &ob->id, &RNA_FluidModifier, md); | CTX_data_pointer_set(result, &ob->id, &RNA_FluidModifier, md); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| return -1; /* found but not available */ | return CTX_RESULT_NO_DATA; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "collision")) { | if (CTX_data_equals(member, "collision")) { | ||||
| PointerRNA *ptr = get_pointer_type(path, &RNA_Object); | PointerRNA *ptr = get_pointer_type(path, &RNA_Object); | ||||
| if (ptr && ptr->data) { | if (ptr && ptr->data) { | ||||
| Object *ob = ptr->data; | Object *ob = ptr->data; | ||||
| ModifierData *md = BKE_modifiers_findby_type(ob, eModifierType_Collision); | ModifierData *md = BKE_modifiers_findby_type(ob, eModifierType_Collision); | ||||
| CTX_data_pointer_set(result, &ob->id, &RNA_CollisionModifier, md); | CTX_data_pointer_set(result, &ob->id, &RNA_CollisionModifier, md); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| return -1; /* found but not available */ | return CTX_RESULT_NO_DATA; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "brush")) { | if (CTX_data_equals(member, "brush")) { | ||||
| set_pointer_type(path, result, &RNA_Brush); | set_pointer_type(path, result, &RNA_Brush); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "dynamic_paint")) { | if (CTX_data_equals(member, "dynamic_paint")) { | ||||
| PointerRNA *ptr = get_pointer_type(path, &RNA_Object); | PointerRNA *ptr = get_pointer_type(path, &RNA_Object); | ||||
| if (ptr && ptr->data) { | if (ptr && ptr->data) { | ||||
| Object *ob = ptr->data; | Object *ob = ptr->data; | ||||
| ModifierData *md = BKE_modifiers_findby_type(ob, eModifierType_DynamicPaint); | ModifierData *md = BKE_modifiers_findby_type(ob, eModifierType_DynamicPaint); | ||||
| CTX_data_pointer_set(result, &ob->id, &RNA_DynamicPaintModifier, md); | CTX_data_pointer_set(result, &ob->id, &RNA_DynamicPaintModifier, md); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| return -1; /* found but not available */ | return CTX_RESULT_NO_DATA; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "line_style")) { | if (CTX_data_equals(member, "line_style")) { | ||||
| set_pointer_type(path, result, &RNA_FreestyleLineStyle); | set_pointer_type(path, result, &RNA_FreestyleLineStyle); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| if (CTX_data_equals(member, "gpencil")) { | if (CTX_data_equals(member, "gpencil")) { | ||||
| set_pointer_type(path, result, &RNA_GreasePencil); | set_pointer_type(path, result, &RNA_GreasePencil); | ||||
| return 1; | return CTX_RESULT_OK; | ||||
| } | } | ||||
| return 0; /* not found */ | return CTX_RESULT_MEMBER_NOT_FOUND; | ||||
| } | } | ||||
| /************************* Drawing the Path ************************/ | /************************* Drawing the Path ************************/ | ||||
| static bool buttons_panel_context_poll(const bContext *C, PanelType *UNUSED(pt)) | static bool buttons_panel_context_poll(const bContext *C, PanelType *UNUSED(pt)) | ||||
| { | { | ||||
| SpaceProperties *sbuts = CTX_wm_space_properties(C); | SpaceProperties *sbuts = CTX_wm_space_properties(C); | ||||
| return sbuts->mainb != BCONTEXT_TOOL; | return sbuts->mainb != BCONTEXT_TOOL; | ||||
| ▲ Show 20 Lines • Show All 113 Lines • Show Last 20 Lines | |||||