Properties window: try to keep showing shading related tabs as you switch
between active objects, e.g. switch from lamp to material tab when you are selecting a lamp instead of a mesh.
This commit is contained in:
@@ -474,6 +474,32 @@ static int buttons_context_path(const bContext *C, ButsContextPath *path, int ma
|
||||
return found;
|
||||
}
|
||||
|
||||
static int buttons_shading_context(const bContext *C, int mainb)
|
||||
{
|
||||
Object *ob= CTX_data_active_object(C);
|
||||
|
||||
if(ELEM3(mainb, BCONTEXT_MATERIAL, BCONTEXT_WORLD, BCONTEXT_TEXTURE))
|
||||
return 1;
|
||||
if(mainb == BCONTEXT_DATA && ob && ELEM(ob->type, OB_LAMP, OB_CAMERA))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int buttons_shading_new_context(const bContext *C, int flag, int mainb)
|
||||
{
|
||||
Object *ob= CTX_data_active_object(C);
|
||||
|
||||
if(flag & (1 << BCONTEXT_MATERIAL))
|
||||
return BCONTEXT_MATERIAL;
|
||||
else if(ob && ELEM(ob->type, OB_LAMP, OB_CAMERA) && (flag & (1 << BCONTEXT_DATA)))
|
||||
return BCONTEXT_DATA;
|
||||
else if(flag & (1 << BCONTEXT_WORLD))
|
||||
return BCONTEXT_WORLD;
|
||||
|
||||
return BCONTEXT_RENDER;
|
||||
}
|
||||
|
||||
void buttons_context_compute(const bContext *C, SpaceButs *sbuts)
|
||||
{
|
||||
ButsContextPath *path;
|
||||
@@ -511,7 +537,11 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts)
|
||||
|
||||
/* in case something becomes invalid, change */
|
||||
if((flag & (1 << sbuts->mainb)) == 0) {
|
||||
if(flag & BCONTEXT_OBJECT) {
|
||||
if(sbuts->flag & SB_SHADING_CONTEXT) {
|
||||
/* try to keep showing shading related buttons */
|
||||
sbuts->mainb= buttons_shading_new_context(C, flag, sbuts->mainb);
|
||||
}
|
||||
else if(flag & BCONTEXT_OBJECT) {
|
||||
sbuts->mainb= BCONTEXT_OBJECT;
|
||||
}
|
||||
else {
|
||||
@@ -533,6 +563,11 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts)
|
||||
sbuts->mainb= BCONTEXT_SCENE;
|
||||
}
|
||||
|
||||
if(buttons_shading_context(C, sbuts->mainb))
|
||||
sbuts->flag |= SB_SHADING_CONTEXT;
|
||||
else
|
||||
sbuts->flag &= ~SB_SHADING_CONTEXT;
|
||||
|
||||
sbuts->pathflag= flag;
|
||||
}
|
||||
|
||||
|
||||
@@ -126,8 +126,8 @@ typedef struct SpaceButs {
|
||||
short preview; /* preview is signal to refresh */
|
||||
char flag, pad[3];
|
||||
|
||||
void *path; /* runtime */
|
||||
int pathflag, dataicon; /* runtime */
|
||||
void *path; /* runtime */
|
||||
int pathflag, dataicon; /* runtime */
|
||||
ID *pinid;
|
||||
} SpaceButs;
|
||||
|
||||
@@ -577,7 +577,6 @@ typedef struct SpaceUserPref {
|
||||
#define TAB_SCENE_SOUND 3
|
||||
#define TAB_SCENE_SEQUENCER 4
|
||||
|
||||
|
||||
/* buts->mainb new */
|
||||
#define BCONTEXT_RENDER 0
|
||||
#define BCONTEXT_SCENE 1
|
||||
@@ -599,6 +598,7 @@ typedef struct SpaceUserPref {
|
||||
#define SB_PIN_CONTEXT 2
|
||||
#define SB_WORLD_TEX 4
|
||||
#define SB_BRUSH_TEX 8
|
||||
#define SB_SHADING_CONTEXT 16
|
||||
|
||||
/* sbuts->align */
|
||||
#define BUT_FREE 0
|
||||
|
||||
Reference in New Issue
Block a user