175
172
PointerRNA *ptr= &path->ptr[path->len-1];
177
174
/* if we already have a data, we're done */
178
if(RNA_struct_is_a(ptr->type, &RNA_Mesh) && (type == -1 || type == OB_MESH)) return 1;
179
else if(RNA_struct_is_a(ptr->type, &RNA_Curve) && (type == -1 || ELEM3(type, OB_CURVE, OB_SURF, OB_FONT))) return 1;
180
else if(RNA_struct_is_a(ptr->type, &RNA_Armature) && (type == -1 || type == OB_ARMATURE)) return 1;
181
else if(RNA_struct_is_a(ptr->type, &RNA_MetaBall) && (type == -1 || type == OB_MBALL)) return 1;
182
else if(RNA_struct_is_a(ptr->type, &RNA_Lattice) && (type == -1 || type == OB_LATTICE)) return 1;
183
else if(RNA_struct_is_a(ptr->type, &RNA_Camera) && (type == -1 || type == OB_CAMERA)) return 1;
184
else if(RNA_struct_is_a(ptr->type, &RNA_Lamp) && (type == -1 || type == OB_LAMP)) return 1;
175
if (RNA_struct_is_a(ptr->type, &RNA_Mesh) && (type == -1 || type == OB_MESH)) return 1;
176
else if (RNA_struct_is_a(ptr->type, &RNA_Curve) && (type == -1 || ELEM3(type, OB_CURVE, OB_SURF, OB_FONT))) return 1;
177
else if (RNA_struct_is_a(ptr->type, &RNA_Armature) && (type == -1 || type == OB_ARMATURE)) return 1;
178
else if (RNA_struct_is_a(ptr->type, &RNA_MetaBall) && (type == -1 || type == OB_MBALL)) return 1;
179
else if (RNA_struct_is_a(ptr->type, &RNA_Lattice) && (type == -1 || type == OB_LATTICE)) return 1;
180
else if (RNA_struct_is_a(ptr->type, &RNA_Camera) && (type == -1 || type == OB_CAMERA)) return 1;
181
else if (RNA_struct_is_a(ptr->type, &RNA_Lamp) && (type == -1 || type == OB_LAMP)) return 1;
182
else if (RNA_struct_is_a(ptr->type, &RNA_Speaker) && (type == -1 || type == OB_SPEAKER)) return 1;
185
183
/* try to get an object in the path, no pinning supported here */
186
else if(buttons_context_path_object(path)) {
184
else if (buttons_context_path_object(path)) {
187
185
ob= path->ptr[path->len-1].data;
189
if(ob && (type == -1 || type == ob->type)) {
187
if (ob && (type == -1 || type == ob->type)) {
190
188
RNA_id_pointer_create(ob->data, &path->ptr[path->len]);
205
if(buttons_context_path_object(path)) {
203
if (buttons_context_path_object(path)) {
206
204
ob= path->ptr[path->len-1].data;
208
if(ob && ELEM5(ob->type, OB_MESH, OB_CURVE, OB_FONT, OB_SURF, OB_LATTICE))
206
if (ob && ELEM5(ob->type, OB_MESH, OB_CURVE, OB_FONT, OB_SURF, OB_LATTICE))
215
static int buttons_context_path_material(ButsContextPath *path)
213
static int buttons_context_path_material(ButsContextPath *path, int for_texture)
218
216
PointerRNA *ptr= &path->ptr[path->len-1];
221
219
/* if we already have a (pinned) material, we're done */
222
if(RNA_struct_is_a(ptr->type, &RNA_Material)) {
220
if (RNA_struct_is_a(ptr->type, &RNA_Material)) {
225
223
/* if we have an object, use the object material slot */
226
else if(buttons_context_path_object(path)) {
224
else if (buttons_context_path_object(path)) {
227
225
ob= path->ptr[path->len-1].data;
229
if(ob && ob->type && (ob->type<OB_LAMP)) {
227
if (ob && OB_TYPE_SUPPORT_MATERIAL(ob->type)) {
230
228
ma= give_current_material(ob, ob->actcol);
231
229
RNA_id_pointer_create(&ma->id, &path->ptr[path->len]);
232
if (for_texture && give_current_material_texture_node(ma))
235
ma= give_node_material(ma);
237
RNA_id_pointer_create(&ma->id, &path->ptr[path->len]);
356
static int buttons_context_path_texture(const bContext *C, ButsContextPath *path)
368
static int buttons_context_path_texture(ButsContextPath *path, ButsContextTexture *ct)
363
PointerRNA *ptr= &path->ptr[path->len-1];
364
int orig_len = path->len;
366
/* if we already have a (pinned) texture, we're done */
367
if(RNA_struct_is_a(ptr->type, &RNA_Texture)) {
371
/* new shading system */
372
PointerRNA *ptr= &path->ptr[path->len-1];
375
/* if we already have a (pinned) texture, we're done */
376
if (RNA_struct_is_a(ptr->type, &RNA_Texture))
385
if (GS(id->name) == ID_BR)
386
buttons_context_path_brush(path);
387
else if (GS(id->name) == ID_MA)
388
buttons_context_path_material(path, 0);
389
else if (GS(id->name) == ID_WO)
390
buttons_context_path_world(path);
391
else if (GS(id->name) == ID_LA)
392
buttons_context_path_data(path, OB_LAMP);
393
else if (GS(id->name) == ID_PA)
394
buttons_context_path_particle(path);
395
else if (GS(id->name) == ID_OB)
396
buttons_context_path_object(path);
400
RNA_id_pointer_create(&ct->texture->id, &path->ptr[path->len]);
371
if((path->flag & SB_BRUSH_TEX) && buttons_context_path_brush(C, path)) {
372
br= path->ptr[path->len-1].data;
375
tex= give_current_brush_texture(br);
377
RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
383
if((path->flag & SB_WORLD_TEX) && buttons_context_path_world(path)) {
384
wo= path->ptr[path->len-1].data;
386
if(wo && GS(wo->id.name)==ID_WO) {
387
tex= give_current_world_texture(wo);
389
RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
395
if(buttons_context_path_material(path)) {
396
ma= path->ptr[path->len-1].data;
399
tex= give_current_material_texture(ma);
401
RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
407
if(buttons_context_path_data(path, OB_LAMP)) {
408
la= path->ptr[path->len-1].data;
411
tex= give_current_lamp_texture(la);
413
RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
418
/* try brushes again in case of no material, lamp, etc */
419
path->len = orig_len;
420
if(buttons_context_path_brush(C, path)) {
421
br= path->ptr[path->len-1].data;
424
tex= give_current_brush_texture(br);
426
RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
407
/* old shading system */
412
ParticleSystem *psys;
414
PointerRNA *ptr= &path->ptr[path->len-1];
415
int orig_len = path->len;
417
/* if we already have a (pinned) texture, we're done */
418
if (RNA_struct_is_a(ptr->type, &RNA_Texture)) {
422
if ((path->tex_ctx == SB_TEXC_BRUSH) && buttons_context_path_brush(path)) {
423
br= path->ptr[path->len-1].data;
426
tex= give_current_brush_texture(br);
428
RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
434
if ((path->tex_ctx == SB_TEXC_WORLD) && buttons_context_path_world(path)) {
435
wo= path->ptr[path->len-1].data;
437
if (wo && GS(wo->id.name)==ID_WO) {
438
tex= give_current_world_texture(wo);
440
RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
446
if ((path->tex_ctx == SB_TEXC_PARTICLES) && buttons_context_path_particle(path)) {
447
if (path->ptr[path->len-1].type == &RNA_ParticleSettings) {
448
ParticleSettings *part = path->ptr[path->len-1].data;
450
tex= give_current_particle_texture(part);
451
RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
456
psys= path->ptr[path->len-1].data;
458
if (psys && psys->part && GS(psys->part->id.name)==ID_PA) {
459
tex= give_current_particle_texture(psys->part);
461
RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
468
if (buttons_context_path_material(path, 1)) {
469
ma= path->ptr[path->len-1].data;
472
tex= give_current_material_texture(ma);
474
RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
480
if (buttons_context_path_data(path, OB_LAMP)) {
481
la= path->ptr[path->len-1].data;
484
tex= give_current_lamp_texture(la);
486
RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
491
/* try brushes again in case of no material, lamp, etc */
492
path->len = orig_len;
493
if (buttons_context_path_brush(path)) {
494
br= path->ptr[path->len-1].data;
497
tex= give_current_brush_texture(br);
499
RNA_id_pointer_create(&tex->id, &path->ptr[path->len]);
604
680
/************************* Context Callback ************************/
682
const char *buttons_context_dir[] = {
683
"world", "object", "mesh", "armature", "lattice", "curve",
684
"meta_ball", "lamp", "speaker", "camera", "material", "material_slot",
685
"texture", "texture_slot", "texture_user", "bone", "edit_bone",
686
"pose_bone", "particle_system", "particle_system_editable",
687
"cloth", "soft_body", "fluid", "smoke", "collision", "brush", "dynamic_paint", NULL};
606
689
int buttons_context(const bContext *C, const char *member, bContextDataResult *result)
608
691
SpaceButs *sbuts= CTX_wm_space_buts(C);
609
692
ButsContextPath *path= sbuts?sbuts->path:NULL;
614
697
/* here we handle context, getting data from precomputed path */
615
if(CTX_data_dir(member)) {
616
static const char *dir[] = {
617
"world", "object", "mesh", "armature", "lattice", "curve",
618
"meta_ball", "lamp", "camera", "material", "material_slot",
619
"texture", "texture_slot", "bone", "edit_bone", "pose_bone", "particle_system", "particle_system_editable",
620
"cloth", "soft_body", "fluid", "smoke", "collision", "brush", NULL};
622
CTX_data_dir_set(result, dir);
698
if (CTX_data_dir(member)) {
699
CTX_data_dir_set(result, buttons_context_dir);
625
else if(CTX_data_equals(member, "world")) {
702
else if (CTX_data_equals(member, "world")) {
626
703
set_pointer_type(path, result, &RNA_World);
629
else if(CTX_data_equals(member, "object")) {
706
else if (CTX_data_equals(member, "object")) {
630
707
set_pointer_type(path, result, &RNA_Object);
633
else if(CTX_data_equals(member, "mesh")) {
710
else if (CTX_data_equals(member, "mesh")) {
634
711
set_pointer_type(path, result, &RNA_Mesh);
637
else if(CTX_data_equals(member, "armature")) {
714
else if (CTX_data_equals(member, "armature")) {
638
715
set_pointer_type(path, result, &RNA_Armature);
641
else if(CTX_data_equals(member, "lattice")) {
718
else if (CTX_data_equals(member, "lattice")) {
642
719
set_pointer_type(path, result, &RNA_Lattice);
645
else if(CTX_data_equals(member, "curve")) {
722
else if (CTX_data_equals(member, "curve")) {
646
723
set_pointer_type(path, result, &RNA_Curve);
649
else if(CTX_data_equals(member, "meta_ball")) {
726
else if (CTX_data_equals(member, "meta_ball")) {
650
727
set_pointer_type(path, result, &RNA_MetaBall);
653
else if(CTX_data_equals(member, "lamp")) {
730
else if (CTX_data_equals(member, "lamp")) {
654
731
set_pointer_type(path, result, &RNA_Lamp);
657
else if(CTX_data_equals(member, "camera")) {
734
else if (CTX_data_equals(member, "camera")) {
658
735
set_pointer_type(path, result, &RNA_Camera);
661
else if(CTX_data_equals(member, "material")) {
738
else if (CTX_data_equals(member, "speaker")) {
739
set_pointer_type(path, result, &RNA_Speaker);
742
else if (CTX_data_equals(member, "material")) {
662
743
set_pointer_type(path, result, &RNA_Material);
665
else if(CTX_data_equals(member, "texture")) {
666
set_pointer_type(path, result, &RNA_Texture);
746
else if (CTX_data_equals(member, "texture")) {
747
ButsContextTexture *ct= sbuts->texuser;
750
/* new shading system */
751
CTX_data_pointer_set(result, &ct->texture->id, &RNA_Texture, ct->texture);
754
/* old shading system */
755
set_pointer_type(path, result, &RNA_Texture);
669
else if(CTX_data_equals(member, "material_slot")) {
760
else if (CTX_data_equals(member, "material_slot")) {
670
761
PointerRNA *ptr= get_pointer_type(path, &RNA_Object);
673
764
Object *ob= ptr->data;
675
if(ob && ob->type && (ob->type<OB_LAMP) && ob->totcol)
676
CTX_data_pointer_set(result, &ob->id, &RNA_MaterialSlot, ob->mat+ob->actcol-1);
681
else if(CTX_data_equals(member, "texture_node")) {
684
if((ptr=get_pointer_type(path, &RNA_Material))) {
685
Material *ma= ptr->data;
688
bNode *node= give_current_material_texture_node(ma);
689
CTX_data_pointer_set(result, &ma->id, &RNA_Node, node);
695
else if(CTX_data_equals(member, "texture_slot")) {
698
if((ptr=get_pointer_type(path, &RNA_Material))) {
766
if (ob && OB_TYPE_SUPPORT_MATERIAL(ob->type) && ob->totcol) {
767
/* a valid actcol isn't ensured [#27526] */
768
int matnr= ob->actcol-1;
769
if (matnr < 0) matnr= 0;
770
CTX_data_pointer_set(result, &ob->id, &RNA_MaterialSlot, &ob->mat[matnr]);
776
else if (CTX_data_equals(member, "texture_user")) {
777
ButsContextTexture *ct= sbuts->texuser;
780
return -1; /* old shading system (found but not available) */
782
if (ct->user && ct->user->ptr.data) {
783
ButsTextureUser *user= ct->user;
784
CTX_data_pointer_set(result, user->ptr.id.data, user->ptr.type, user->ptr.data);
789
else if (CTX_data_equals(member, "texture_node")) {
790
ButsContextTexture *ct= sbuts->texuser;
793
/* new shading system */
794
if (ct->user && ct->user->node)
795
CTX_data_pointer_set(result, &ct->user->ntree->id, &RNA_Node, ct->user->node);
800
/* old shading system */
803
if ((ptr=get_pointer_type(path, &RNA_Material))) {
804
Material *ma= ptr->data;
807
bNode *node= give_current_material_texture_node(ma);
808
CTX_data_pointer_set(result, &ma->nodetree->id, &RNA_Node, node);
815
else if (CTX_data_equals(member, "texture_slot")) {
816
ButsContextTexture *ct= sbuts->texuser;
820
return 0; /* new shading system */
822
if ((ptr=get_pointer_type(path, &RNA_Material))) {
699
823
Material *ma= ptr->data;
701
825
/* if we have a node material, get slot from material in material node */
702
if(ma && ma->use_nodes && ma->nodetree) {
826
if (ma && ma->use_nodes && ma->nodetree) {
703
827
/* if there's an active texture node in the node tree,
704
828
* then that texture is in context directly, without a texture slot */
705
829
if (give_current_material_texture_node(ma))
710
834
CTX_data_pointer_set(result, &ma->id, &RNA_MaterialTextureSlot, ma->mtex[(int)ma->texact]);
714
839
CTX_data_pointer_set(result, &ma->id, &RNA_MaterialTextureSlot, ma->mtex[(int)ma->texact]);
717
else if((ptr=get_pointer_type(path, &RNA_Lamp))) {
842
else if ((ptr=get_pointer_type(path, &RNA_Lamp))) {
718
843
Lamp *la= ptr->data;
721
846
CTX_data_pointer_set(result, &la->id, &RNA_LampTextureSlot, la->mtex[(int)la->texact]);
723
else if((ptr=get_pointer_type(path, &RNA_World))) {
848
else if ((ptr=get_pointer_type(path, &RNA_World))) {
724
849
World *wo= ptr->data;
727
852
CTX_data_pointer_set(result, &wo->id, &RNA_WorldTextureSlot, wo->mtex[(int)wo->texact]);
729
else if((ptr=get_pointer_type(path, &RNA_Brush))) { /* how to get this into context? */
854
else if ((ptr=get_pointer_type(path, &RNA_Brush))) { /* how to get this into context? */
730
855
Brush *br= ptr->data;
733
858
CTX_data_pointer_set(result, &br->id, &RNA_BrushTextureSlot, &br->mtex);
860
else if ((ptr=get_pointer_type(path, &RNA_ParticleSystem))) {
861
ParticleSettings *part= ((ParticleSystem *)ptr->data)->part;
864
CTX_data_pointer_set(result, &part->id, &RNA_ParticleSettingsTextureSlot, part->mtex[(int)part->texact]);
738
else if(CTX_data_equals(member, "bone")) {
869
else if (CTX_data_equals(member, "bone")) {
739
870
set_pointer_type(path, result, &RNA_Bone);
742
else if(CTX_data_equals(member, "edit_bone")) {
873
else if (CTX_data_equals(member, "edit_bone")) {
743
874
set_pointer_type(path, result, &RNA_EditBone);
746
else if(CTX_data_equals(member, "pose_bone")) {
877
else if (CTX_data_equals(member, "pose_bone")) {
747
878
set_pointer_type(path, result, &RNA_PoseBone);
750
else if(CTX_data_equals(member, "particle_system")) {
881
else if (CTX_data_equals(member, "particle_system")) {
751
882
set_pointer_type(path, result, &RNA_ParticleSystem);
754
else if(CTX_data_equals(member, "particle_system_editable")) {
755
if(PE_poll((bContext*)C))
885
else if (CTX_data_equals(member, "particle_system_editable")) {
886
if (PE_poll((bContext*)C))
756
887
set_pointer_type(path, result, &RNA_ParticleSystem);
758
889
CTX_data_pointer_set(result, NULL, &RNA_ParticleSystem, NULL);
761
else if(CTX_data_equals(member, "cloth")) {
892
else if (CTX_data_equals(member, "cloth")) {
762
893
PointerRNA *ptr= get_pointer_type(path, &RNA_Object);
764
if(ptr && ptr->data) {
895
if (ptr && ptr->data) {
765
896
Object *ob= ptr->data;
766
897
ModifierData *md= modifiers_findByType(ob, eModifierType_Cloth);
767
898
CTX_data_pointer_set(result, &ob->id, &RNA_ClothModifier, md);
771
else if(CTX_data_equals(member, "soft_body")) {
902
else if (CTX_data_equals(member, "soft_body")) {
772
903
PointerRNA *ptr= get_pointer_type(path, &RNA_Object);
774
if(ptr && ptr->data) {
905
if (ptr && ptr->data) {
775
906
Object *ob= ptr->data;
776
907
ModifierData *md= modifiers_findByType(ob, eModifierType_Softbody);
777
908
CTX_data_pointer_set(result, &ob->id, &RNA_SoftBodyModifier, md);
781
else if(CTX_data_equals(member, "fluid")) {
912
else if (CTX_data_equals(member, "fluid")) {
782
913
PointerRNA *ptr= get_pointer_type(path, &RNA_Object);
784
if(ptr && ptr->data) {
915
if (ptr && ptr->data) {
785
916
Object *ob= ptr->data;
786
917
ModifierData *md= modifiers_findByType(ob, eModifierType_Fluidsim);
787
918
CTX_data_pointer_set(result, &ob->id, &RNA_FluidSimulationModifier, md);
792
else if(CTX_data_equals(member, "smoke")) {
923
else if (CTX_data_equals(member, "smoke")) {
793
924
PointerRNA *ptr= get_pointer_type(path, &RNA_Object);
795
if(ptr && ptr->data) {
926
if (ptr && ptr->data) {
796
927
Object *ob= ptr->data;
797
928
ModifierData *md= modifiers_findByType(ob, eModifierType_Smoke);
798
929
CTX_data_pointer_set(result, &ob->id, &RNA_SmokeModifier, md);
802
else if(CTX_data_equals(member, "collision")) {
933
else if (CTX_data_equals(member, "collision")) {
803
934
PointerRNA *ptr= get_pointer_type(path, &RNA_Object);
805
if(ptr && ptr->data) {
936
if (ptr && ptr->data) {
806
937
Object *ob= ptr->data;
807
938
ModifierData *md= modifiers_findByType(ob, eModifierType_Collision);
808
939
CTX_data_pointer_set(result, &ob->id, &RNA_CollisionModifier, md);
812
else if(CTX_data_equals(member, "brush")) {
943
else if (CTX_data_equals(member, "brush")) {
813
944
set_pointer_type(path, result, &RNA_Brush);
947
else if (CTX_data_equals(member, "dynamic_paint")) {
948
PointerRNA *ptr= get_pointer_type(path, &RNA_Object);
950
if (ptr && ptr->data) {
951
Object *ob= ptr->data;
952
ModifierData *md= modifiers_findByType(ob, eModifierType_DynamicPaint);
953
CTX_data_pointer_set(result, &ob->id, &RNA_DynamicPaintModifier, md);
817
958
return 0; /* not found */
855
996
block= uiLayoutGetBlock(row);
856
997
uiBlockSetEmboss(block, UI_EMBOSSN);
857
but= uiDefIconButBitC(block, ICONTOG, SB_PIN_CONTEXT, 0, ICON_UNPINNED, 0, 0, UI_UNIT_X, UI_UNIT_Y, &sbuts->flag, 0, 0, 0, 0, "Follow context or keep fixed datablock displayed");
998
but = uiDefIconButBitC(block, ICONTOG, SB_PIN_CONTEXT, 0, ICON_UNPINNED, 0, 0, UI_UNIT_X, UI_UNIT_Y, &sbuts->flag, 0, 0, 0, 0, "Follow context or keep fixed datablock displayed");
999
uiButClearFlag(but, UI_BUT_UNDO); /* skip undo on screen buttons */
858
1000
uiButSetFunc(but, pin_cb, NULL, NULL);
860
for(a=0; a<path->len; a++) {
1002
for (a=0; a<path->len; a++) {
861
1003
ptr= &path->ptr[a];
864
1006
uiItemL(row, "", VICO_SMALL_TRI_RIGHT_VEC);
867
1009
icon= RNA_struct_ui_icon(ptr->type);
868
name= RNA_struct_name_get_alloc(ptr, namebuf, sizeof(namebuf));
1010
name= RNA_struct_name_get_alloc(ptr, namebuf, sizeof(namebuf), NULL);
871
if(!ELEM(sbuts->mainb, BCONTEXT_RENDER, BCONTEXT_SCENE) && ptr->type == &RNA_Scene)
1013
if (!ELEM(sbuts->mainb, BCONTEXT_RENDER, BCONTEXT_SCENE) && ptr->type == &RNA_Scene)
872
1014
uiItemLDrag(row, ptr, "", icon); /* save some space */
874
1016
uiItemLDrag(row, ptr, name, icon);
1018
if (name != namebuf)
877
1019
MEM_freeN(name);