* Object level restrictions in outliner
This adds the ability to restrict an individual object from: - being visible in the 3D View - being selectable in the 3D View - being renderable with 3 columns of buttons in the outliner. These restrictions are further down the hierarchy than layers, so for example if an object is in an invisible layer, it will be invisible regardless of whether the object's own visibility setting is on or off. This works on a different conceptual level than layers, being better for more quick interaction (like temporarily making a mesh unselectable while you're posing its armature), rather than so much for scene organisation. The 3 columns of icons can be turned off in the Outliner View menu. Along with this is some small cleaning up in interface_icons.c and outliner.c.
This commit is contained in:
@@ -58,7 +58,11 @@ typedef enum {
|
||||
ICON_SPACE4,
|
||||
ICON_TRIA_LEFT,
|
||||
ICON_TRIA_UP,
|
||||
|
||||
ICON_BLANK3,
|
||||
ICON_BLANK4,
|
||||
ICON_BLANK5,
|
||||
ICON_BLANK6,
|
||||
|
||||
ICON_ORTHO,
|
||||
ICON_PERSP,
|
||||
ICON_CAMERA,
|
||||
@@ -80,6 +84,10 @@ typedef enum {
|
||||
ICON_SHORTDISPLAY,
|
||||
ICON_TRIA_DOWN,
|
||||
ICON_TRIA_RIGHT,
|
||||
ICON_BLANK7,
|
||||
ICON_BLANK8,
|
||||
ICON_BLANK9,
|
||||
ICON_BLANK10,
|
||||
|
||||
ICON_VIEW_AXIS_ALL,
|
||||
ICON_VIEW_AXIS_NONE,
|
||||
@@ -103,6 +111,10 @@ typedef enum {
|
||||
ICON_FF,
|
||||
ICON_REW,
|
||||
ICON_PYTHON,
|
||||
ICON_BLANK11,
|
||||
ICON_BLANK12,
|
||||
ICON_BLANK13,
|
||||
ICON_BLANK14,
|
||||
|
||||
|
||||
ICON_DOTSUP,
|
||||
@@ -126,6 +138,10 @@ typedef enum {
|
||||
ICON_WPAINT_DEHLT,
|
||||
ICON_WPAINT_HLT,
|
||||
ICON_MARKER,
|
||||
ICON_BLANK15,
|
||||
ICON_BLANK16,
|
||||
ICON_BLANK17,
|
||||
ICON_BLANK18,
|
||||
|
||||
ICON_X,
|
||||
ICON_GO_LEFT,
|
||||
@@ -148,6 +164,10 @@ typedef enum {
|
||||
ICON_FACESEL_DEHLT,
|
||||
ICON_FACESEL_HLT,
|
||||
ICON_EDIT_DEHLT,
|
||||
ICON_BLANK19,
|
||||
ICON_BLANK20,
|
||||
ICON_BLANK21,
|
||||
ICON_BLANK22,
|
||||
|
||||
ICON_HELP,
|
||||
ICON_ERROR,
|
||||
@@ -170,6 +190,10 @@ typedef enum {
|
||||
ICON_BPIBFOLDERGREY,
|
||||
ICON_MAGNIFY,
|
||||
ICON_INFO2,
|
||||
ICON_BLANK23,
|
||||
ICON_BLANK24,
|
||||
ICON_BLANK25,
|
||||
ICON_BLANK26,
|
||||
|
||||
ICON_RIGHTARROW,
|
||||
ICON_DOWNARROW_HLT,
|
||||
@@ -192,6 +216,10 @@ typedef enum {
|
||||
ICON_KEY_DEHLT,
|
||||
ICON_KEY_HLT,
|
||||
ICON_GRID2,
|
||||
ICON_BLANK27,
|
||||
ICON_BLANK28,
|
||||
ICON_BLANK29,
|
||||
ICON_BLANK30,
|
||||
|
||||
ICON_EYE,
|
||||
ICON_LAMP,
|
||||
@@ -214,6 +242,10 @@ typedef enum {
|
||||
ICON_PIN_DEHLT,
|
||||
ICON_PIN_HLT,
|
||||
ICON_LITTLEGRID,
|
||||
ICON_BLANK31,
|
||||
ICON_BLANK32,
|
||||
ICON_BLANK33,
|
||||
ICON_BLANK34,
|
||||
|
||||
ICON_FULLSCREEN,
|
||||
ICON_SPLITSCREEN,
|
||||
@@ -236,6 +268,10 @@ typedef enum {
|
||||
ICON_EYEDROPPER,
|
||||
ICON_WINDOW_WINDOW,
|
||||
ICON_PANEL_CLOSE,
|
||||
ICON_BLANK35,
|
||||
ICON_BLANK36,
|
||||
ICON_BLANK37,
|
||||
ICON_BLANK38,
|
||||
|
||||
ICON_BLENDER,
|
||||
ICON_PACKAGE,
|
||||
@@ -258,6 +294,10 @@ typedef enum {
|
||||
ICON_CONSTRAINT,
|
||||
ICON_CAMERA_DEHLT,
|
||||
ICON_ARMATURE_DEHLT,
|
||||
ICON_BLANK39,
|
||||
ICON_BLANK40,
|
||||
ICON_BLANK41,
|
||||
ICON_BLANK42,
|
||||
|
||||
ICON_SMOOTHCURVE,
|
||||
ICON_SPHERECURVE,
|
||||
@@ -280,12 +320,16 @@ typedef enum {
|
||||
ICON_SOME_WACKY_VERTS_AND_LINES,
|
||||
ICON_A_WACKY_VERT_AND_SOME_LINES,
|
||||
ICON_VPAINT_COL,
|
||||
ICON_RESTRICT_SELECT_OFF,
|
||||
ICON_RESTRICT_SELECT_ON,
|
||||
ICON_BLANK45,
|
||||
ICON_BLANK46,
|
||||
|
||||
ICON_MAN_TRANS,
|
||||
ICON_MAN_ROT,
|
||||
ICON_MAN_SCALE,
|
||||
ICON_MANIPUL,
|
||||
ICON_BLANK65,
|
||||
ICON_BLANK_47,
|
||||
ICON_MODIFIER,
|
||||
ICON_MOD_WAVE,
|
||||
ICON_MOD_BUILD,
|
||||
@@ -302,6 +346,10 @@ typedef enum {
|
||||
ICON_ROTATECOLLECTION,
|
||||
ICON_ROTATECENTER,
|
||||
ICON_ROTACTIVE,
|
||||
ICON_RESTRICT_VIEW_OFF,
|
||||
ICON_RESTRICT_VIEW_ON,
|
||||
ICON_RESTRICT_RENDER_OFF,
|
||||
ICON_RESTRICT_RENDER_ON,
|
||||
|
||||
VICON_VIEW3D,
|
||||
VICON_EDIT,
|
||||
|
||||
@@ -55,6 +55,7 @@ void b_verse_pop_node(struct VNode *vnode);
|
||||
void b_verse_unsubscribe(VNode *vnode);
|
||||
void b_verse_push_object(struct VerseSession *session, struct Object *ob);
|
||||
void b_verse_delete_object(struct Object *ob);
|
||||
void b_verse_ms_get(void);
|
||||
|
||||
void post_transform(struct VNode *vnode);
|
||||
void post_link_set(struct VLink *vlink);
|
||||
|
||||
@@ -193,7 +193,9 @@ typedef struct Object {
|
||||
struct Group *dup_group; /* object duplicator for group */
|
||||
|
||||
short fluidsimFlag; /* NT toggle fluidsim participation on/off */
|
||||
short pad3;
|
||||
|
||||
short restrictflag; /* for restricting view, select, render etc. accessible in outliner */
|
||||
|
||||
short shapenr, shapeflag; /* current shape key for menu or pinned, flag for pinning */
|
||||
float smoothresh; /* smoothresh is phong interpolation ray_shadow correction in render */
|
||||
int pad4;
|
||||
@@ -333,6 +335,8 @@ extern Object workob;
|
||||
#define OB_BOUND_POLYH 4
|
||||
#define OB_BOUND_POLYT 5
|
||||
|
||||
/* **************** BASE ********************* */
|
||||
|
||||
/* also needed for base!!!!! or rather, thy interfere....*/
|
||||
/* base->flag and ob->flag */
|
||||
#define BA_WAS_SEL 2
|
||||
@@ -343,6 +347,11 @@ extern Object workob;
|
||||
|
||||
#define BA_FROMSET 128
|
||||
|
||||
/* an initial attempt as making selection more specific! */
|
||||
#define BA_DESELECT 0
|
||||
#define BA_SELECT 1
|
||||
|
||||
|
||||
#define OB_FROMDUPLI 512
|
||||
#define OB_DONE 1024
|
||||
#define OB_RADIO 2048
|
||||
@@ -393,6 +402,11 @@ extern Object workob;
|
||||
#define OB_ADDACT 1024
|
||||
#define OB_SHOWCONT 2048
|
||||
|
||||
/* ob->restrictflag */
|
||||
#define OB_RESTRICT_VIEW 1
|
||||
#define OB_RESTRICT_SELECT 2
|
||||
#define OB_RESTRICT_RENDER 4
|
||||
|
||||
/* ob->shapeflag */
|
||||
#define OB_SHAPE_LOCK 1
|
||||
#define OB_SHAPE_TEMPLOCK 2
|
||||
|
||||
@@ -508,6 +508,7 @@ typedef struct SpaceImaSel {
|
||||
/* SpaceOops->flag */
|
||||
#define SO_TESTBLOCKS 1
|
||||
#define SO_NEWSELECTED 2
|
||||
#define SO_HIDE_RESTRICTCOLS 4
|
||||
|
||||
/* SpaceOops->visiflag */
|
||||
#define OOPS_SCE 1
|
||||
|
||||
@@ -3245,6 +3245,9 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
|
||||
for(SETLOOPER(re->scene, base)) {
|
||||
ob= base->object;
|
||||
|
||||
/* if the object has been restricted from rendering in the outliner, ignore it */
|
||||
if (ob->restrictflag & OB_RESTRICT_RENDER) continue;
|
||||
|
||||
/* OB_DONE means the object itself got duplicated, so was already converted */
|
||||
if (ob->flag & OB_DONE) {
|
||||
#ifndef DISABLE_YAFRAY
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3823,6 +3823,8 @@ void draw_object(Base *base, int flag)
|
||||
|
||||
ob= base->object;
|
||||
|
||||
if (ob->restrictflag & OB_RESTRICT_VIEW) return;
|
||||
|
||||
/* xray delay? */
|
||||
if((flag & DRAW_PICKING)==0 && (base->flag & OB_FROMDUPLI)==0) {
|
||||
/* xray and transp are set when it is drawing the 2nd/3rd pass */
|
||||
|
||||
@@ -192,6 +192,22 @@ void arrows_move_cursor(unsigned short event)
|
||||
}
|
||||
}
|
||||
|
||||
/* simple API for object selection, rather than just using the flag
|
||||
* this takes into account the 'restrict selection in 3d view' flag.
|
||||
* deselect works always, the restriction just prevents selection */
|
||||
void select_base_v3d(Base *base, short mode)
|
||||
{
|
||||
if (base) {
|
||||
if (mode==BA_SELECT) {
|
||||
if (!(base->object->restrictflag & OB_RESTRICT_SELECT))
|
||||
if (mode==BA_SELECT) base->flag |= SELECT;
|
||||
}
|
||||
else if (mode==BA_DESELECT) {
|
||||
base->flag &= ~SELECT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* *********************** GESTURE AND LASSO ******************* */
|
||||
|
||||
/* helper also for borderselect */
|
||||
@@ -339,8 +355,8 @@ static void do_lasso_select_objects(short mcords[][2], short moves, short select
|
||||
project_short(base->object->obmat[3], &base->sx);
|
||||
if(lasso_inside(mcords, moves, base->sx, base->sy)) {
|
||||
|
||||
if(select) base->flag |= SELECT;
|
||||
else base->flag &= ~SELECT;
|
||||
if(select) select_base_v3d(base, BA_SELECT);
|
||||
else select_base_v3d(base, BA_DESELECT);
|
||||
base->object->flag= base->flag;
|
||||
}
|
||||
if(base->object->flag & OB_POSEMODE) {
|
||||
@@ -903,8 +919,10 @@ void deselectall(void) /* is toggle */
|
||||
base= FIRSTBASE;
|
||||
while(base) {
|
||||
if(base->lay & G.vd->lay) {
|
||||
if(a) base->flag &= ~SELECT;
|
||||
else base->flag |= SELECT;
|
||||
if(a)
|
||||
select_base_v3d(base, BA_DESELECT);
|
||||
else
|
||||
select_base_v3d(base, BA_SELECT);
|
||||
base->object->flag= base->flag;
|
||||
}
|
||||
base= base->next;
|
||||
@@ -925,8 +943,10 @@ void selectswap(void)
|
||||
|
||||
for(base= FIRSTBASE; base; base= base->next) {
|
||||
if(base->lay & G.vd->lay) {
|
||||
if TESTBASE(base) base->flag &= ~SELECT;
|
||||
else base->flag |= SELECT;
|
||||
if TESTBASE(base)
|
||||
select_base_v3d(base, BA_DESELECT);
|
||||
else
|
||||
select_base_v3d(base, BA_SELECT);
|
||||
base->object->flag= base->flag;
|
||||
}
|
||||
}
|
||||
@@ -948,7 +968,7 @@ void selectall_type(short obtype)
|
||||
base= FIRSTBASE;
|
||||
while(base) {
|
||||
if((base->lay & G.vd->lay) && (base->object->type == obtype)) {
|
||||
base->flag |= SELECT;
|
||||
select_base_v3d(base, BA_SELECT);
|
||||
base->object->flag= base->flag;
|
||||
}
|
||||
base= base->next;
|
||||
@@ -969,7 +989,7 @@ void selectall_layer(unsigned int layernum)
|
||||
base= FIRSTBASE;
|
||||
while(base) {
|
||||
if (base->lay == (1<< (layernum -1))) {
|
||||
base->flag |= SELECT;
|
||||
select_base_v3d(base, BA_SELECT);
|
||||
base->object->flag= base->flag;
|
||||
}
|
||||
base= base->next;
|
||||
@@ -991,7 +1011,7 @@ static void deselectall_except(Base *b) /* deselect all except b */
|
||||
while(base) {
|
||||
if (base->flag & SELECT) {
|
||||
if(b!=base) {
|
||||
base->flag &= ~SELECT;
|
||||
select_base_v3d(base, BA_DESELECT);
|
||||
base->object->flag= base->flag;
|
||||
}
|
||||
}
|
||||
@@ -1105,16 +1125,19 @@ static void select_all_from_groups(Base *basact)
|
||||
if(object_in_group(basact->object, group)) {
|
||||
for(go= group->gobject.first; go; go= go->next) {
|
||||
if(deselect) go->ob->flag &= ~SELECT;
|
||||
else go->ob->flag |= SELECT;
|
||||
else {
|
||||
if (!(go->ob->restrictflag & OB_RESTRICT_SELECT))
|
||||
go->ob->flag |= SELECT;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/* sync bases */
|
||||
for(basact= G.scene->base.first; basact; basact= basact->next) {
|
||||
if(basact->object->flag & SELECT)
|
||||
basact->flag |= SELECT;
|
||||
select_base_v3d(basact, BA_SELECT);
|
||||
else
|
||||
basact->flag &= ~SELECT;
|
||||
select_base_v3d(basact, BA_DESELECT);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1381,15 +1404,17 @@ void mouse_select(void)
|
||||
if(G.obedit) {
|
||||
/* only do select */
|
||||
deselectall_except(basact);
|
||||
basact->flag |= SELECT;
|
||||
select_base_v3d(basact, BA_SELECT);
|
||||
}
|
||||
else {
|
||||
/* also prevent making it active on mouse selection */
|
||||
else if (!(basact->object->restrictflag & OB_RESTRICT_SELECT)) {
|
||||
|
||||
oldbasact= BASACT;
|
||||
BASACT= basact;
|
||||
|
||||
if((G.qual & LR_SHIFTKEY)==0) {
|
||||
deselectall_except(basact);
|
||||
basact->flag |= SELECT;
|
||||
select_base_v3d(basact, BA_SELECT);
|
||||
}
|
||||
else if(G.qual==(LR_SHIFTKEY|LR_ALTKEY)) {
|
||||
select_all_from_groups(basact);
|
||||
@@ -1397,16 +1422,16 @@ void mouse_select(void)
|
||||
else {
|
||||
if(basact->flag & SELECT) {
|
||||
if(basact==oldbasact)
|
||||
basact->flag &= ~SELECT;
|
||||
select_base_v3d(basact, BA_DESELECT);
|
||||
}
|
||||
else basact->flag |= SELECT;
|
||||
else select_base_v3d(basact, BA_SELECT);
|
||||
}
|
||||
|
||||
/* copy */
|
||||
basact->object->flag= basact->flag;
|
||||
|
||||
if(oldbasact != basact) {
|
||||
set_active_base(basact);
|
||||
set_active_base(basact);
|
||||
}
|
||||
|
||||
/* for visual speed, only in wire mode */
|
||||
@@ -1771,9 +1796,9 @@ void borderselect(void)
|
||||
}
|
||||
else {
|
||||
if (selecting)
|
||||
base->flag |= SELECT;
|
||||
select_base_v3d(base, BA_SELECT);
|
||||
else
|
||||
base->flag &= ~SELECT;
|
||||
select_base_v3d(base, BA_DESELECT);
|
||||
|
||||
base->object->flag= base->flag;
|
||||
}
|
||||
|
||||
@@ -135,6 +135,7 @@ void do_oops_buttons(short event)
|
||||
|
||||
static void do_oops_viewmenu(void *arg, int event)
|
||||
{
|
||||
SpaceOops *soops= curarea->spacedata.first;
|
||||
|
||||
switch(event) {
|
||||
case 0: /* Shuffle Selected Blocks */
|
||||
@@ -153,14 +154,11 @@ static void do_oops_viewmenu(void *arg, int event)
|
||||
/* using event B_FULL */
|
||||
break;
|
||||
case 5: /* show outliner */
|
||||
{
|
||||
SpaceOops *soops= curarea->spacedata.first;
|
||||
if(soops->type==SO_OOPS || soops->type==SO_DEPSGRAPH) soops->type= SO_OUTLINER;
|
||||
else soops->type= SO_OOPS;
|
||||
init_v2d_oops(curarea, soops);
|
||||
test_view2d(G.v2d, curarea->winx, curarea->winy);
|
||||
scrarea_queue_winredraw(curarea);
|
||||
}
|
||||
if(soops->type==SO_OOPS || soops->type==SO_DEPSGRAPH) soops->type= SO_OUTLINER;
|
||||
else soops->type= SO_OOPS;
|
||||
init_v2d_oops(curarea, soops);
|
||||
test_view2d(G.v2d, curarea->winx, curarea->winy);
|
||||
scrarea_queue_winredraw(curarea);
|
||||
break;
|
||||
case 6:
|
||||
outliner_toggle_visible(curarea);
|
||||
@@ -193,6 +191,10 @@ static void do_oops_viewmenu(void *arg, int event)
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
case 12:
|
||||
if (soops->flag & SO_HIDE_RESTRICTCOLS) soops->flag &= ~SO_HIDE_RESTRICTCOLS;
|
||||
else soops->flag |= SO_HIDE_RESTRICTCOLS;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -229,13 +231,20 @@ static uiBlock *oops_viewmenu(void *arg_unused)
|
||||
else {
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Oops Schematic", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
|
||||
|
||||
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
||||
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
||||
|
||||
if (soops->flag & SO_HIDE_RESTRICTCOLS)
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Show Restriction Columns", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
|
||||
else
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Show Restriction Columns", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
|
||||
|
||||
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
||||
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Expand One Level|NumPad +", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Collapse One Level|NumPad -", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
|
||||
|
||||
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
||||
|
||||
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
||||
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show/Hide All", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hierarchy|Home", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Active|NumPad .", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
|
||||
|
||||
@@ -207,7 +207,7 @@ static void ui_draw_icon(uiBut *but, BIFIconID icon)
|
||||
glEnable(GL_BLEND);
|
||||
|
||||
/* calculate blend color */
|
||||
if ELEM4(but->type, ICONTOG, TOG, ROW, TOGN) {
|
||||
if ELEM3(but->type, TOG, ROW, TOGN) {
|
||||
if(but->flag & UI_SELECT);
|
||||
else if(but->flag & UI_ACTIVE);
|
||||
else blend= -60;
|
||||
|
||||
@@ -94,6 +94,13 @@
|
||||
#define ICON_RENDERSIZE 32
|
||||
#define ICON_MIPMAPS 8
|
||||
|
||||
#define ICON_GRID_COLS 25
|
||||
#define ICON_GRID_ROWS 12
|
||||
|
||||
#define ICON_GRID_MARGIN 5
|
||||
#define ICON_GRID_W 15
|
||||
#define ICON_GRID_H 16
|
||||
|
||||
typedef struct DrawInfo {
|
||||
int w;
|
||||
int h;
|
||||
@@ -457,29 +464,33 @@ static void clear_transp_rect_soft(unsigned char *transp, unsigned char *rect, i
|
||||
}
|
||||
#endif
|
||||
|
||||
static void clear_transp_rect(unsigned char *transp, unsigned char *rect, int w, int h, int rowstride)
|
||||
static void clear_icon_grid_margins(unsigned char *rect, int w, int h)
|
||||
{
|
||||
int x,y;
|
||||
int x, y;
|
||||
int xoffs=ICON_GRID_W+ICON_GRID_MARGIN;
|
||||
int yoffs=ICON_GRID_H+ICON_GRID_MARGIN;
|
||||
|
||||
for (y=0; y<h; y++) {
|
||||
unsigned char *row= &rect[y*rowstride];
|
||||
unsigned char *row= &rect[y*w*4];
|
||||
|
||||
for (x=0; x<w; x++) {
|
||||
unsigned char *pxl= &row[x*4];
|
||||
if (*((unsigned int*) pxl)==*((unsigned int*) transp)) {
|
||||
pxl[3]= 0;
|
||||
}
|
||||
|
||||
if ((x % xoffs < ICON_GRID_MARGIN-2) || (x % xoffs > ICON_GRID_W+2))
|
||||
pxl[3] = 0; //alpha channel == x+3
|
||||
else if ((y % yoffs < ICON_GRID_MARGIN-2) || (y % yoffs > ICON_GRID_H+2))
|
||||
pxl[3] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void prepare_internal_icons(ImBuf *bbuf)
|
||||
{
|
||||
int rowstride= bbuf->x*4;
|
||||
|
||||
char *back= (char *)bbuf->rect;
|
||||
unsigned char transp[4];
|
||||
|
||||
/* this sets blueish outside of icon to zero alpha */
|
||||
QUATCOPY(transp, back);
|
||||
clear_transp_rect(transp, back, bbuf->x, bbuf->y, rowstride);
|
||||
/* this sets the icon grid margin area outside of icon to zero alpha */
|
||||
clear_icon_grid_margins(back, bbuf->x, bbuf->y);
|
||||
|
||||
/* hack! */
|
||||
#if 0
|
||||
@@ -507,9 +518,11 @@ static void init_internal_icons()
|
||||
|
||||
prepare_internal_icons(bbuf);
|
||||
|
||||
for (y=0; y<12; y++) {
|
||||
for (x=0; x<21; x++) {
|
||||
def_internal_icon(bbuf, BIFICONID_FIRST + y*21 + x, x*20+3, y*21+3);
|
||||
for (y=0; y<ICON_GRID_ROWS; y++) {
|
||||
for (x=0; x<ICON_GRID_COLS; x++) {
|
||||
def_internal_icon(bbuf, BIFICONID_FIRST + y*ICON_GRID_COLS + x,
|
||||
x*(ICON_GRID_W+ICON_GRID_MARGIN)+3,
|
||||
y*(ICON_GRID_H+ICON_GRID_MARGIN)+3);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -109,6 +109,7 @@
|
||||
#include "BDR_editobject.h"
|
||||
#include "BSE_drawipo.h"
|
||||
#include "BSE_edit.h"
|
||||
#include "BSE_view.h"
|
||||
|
||||
#include "PIL_time.h"
|
||||
|
||||
@@ -118,6 +119,12 @@
|
||||
#define OL_H 19
|
||||
#define OL_X 18
|
||||
|
||||
#define OL_TOG_RESTRICT_VIEWX 54
|
||||
#define OL_TOG_RESTRICT_SELECTX 36
|
||||
#define OL_TOG_RESTRICT_RENDERX 18
|
||||
|
||||
#define OL_TOGW OL_TOG_RESTRICT_VIEWX
|
||||
|
||||
#define TS_CHUNK 128
|
||||
|
||||
#define TREESTORE(a) ((a)?soops->treestore->data+(a)->store_index:NULL)
|
||||
@@ -128,6 +135,10 @@ extern ListBase server_list;
|
||||
#endif
|
||||
|
||||
|
||||
/* ******************** PROTOTYPES ***************** */
|
||||
static void outliner_draw_tree_element(SpaceOops *soops, TreeElement *te, int startx, int *starty);
|
||||
|
||||
|
||||
/* ******************** PERSISTANT DATA ***************** */
|
||||
|
||||
static void outliner_storage_cleanup(SpaceOops *soops)
|
||||
@@ -1626,6 +1637,86 @@ static int tree_element_type_active(SpaceOops *soops, TreeElement *te, TreeStore
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void verse_operation_menu(TreeElement *te)
|
||||
{
|
||||
#ifdef WITH_VERSE
|
||||
short event=0;
|
||||
if(te->idcode==ID_VS) {
|
||||
struct VerseSession *session = (VerseSession*)te->directdata;
|
||||
struct VNode *vnode;
|
||||
if(!(session->flag & VERSE_AUTOSUBSCRIBE)) {
|
||||
event = pupmenu("VerseSession %t| End Session %x1| Subscribe to All Nodes %x2| Start Autosubscribe %x3");
|
||||
}
|
||||
else {
|
||||
event = pupmenu("VerseSession %t| End Session %x1| Subscribe to All Nodes %x2| Stop Autosubscribe %x4");
|
||||
}
|
||||
switch(event) {
|
||||
case 1:
|
||||
end_verse_session(session);
|
||||
break;
|
||||
case 2:
|
||||
vnode = session->nodes.lb.first;
|
||||
while(vnode) {
|
||||
b_verse_pop_node(vnode);
|
||||
vnode = vnode->next;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
vnode = session->nodes.lb.first;
|
||||
while(vnode) {
|
||||
b_verse_pop_node(vnode);
|
||||
vnode = vnode->next;
|
||||
}
|
||||
session->flag |= VERSE_AUTOSUBSCRIBE;
|
||||
break;
|
||||
case 4:
|
||||
session->flag &= ~VERSE_AUTOSUBSCRIBE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(te->idcode==ID_VN) {
|
||||
struct VNode *vnode = (VNode*)te->directdata;
|
||||
event = pupmenu("VerseNode %t| Subscribe %x1| Unsubscribe %x2");
|
||||
switch(event) {
|
||||
case 1:
|
||||
b_verse_pop_node(vnode);
|
||||
break;
|
||||
case 2:
|
||||
/* Global */
|
||||
b_verse_unsubscribe(vnode);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(te->idcode==ID_MS) {
|
||||
event = pupmenu("Verse Master Server %t| Refresh %x1");
|
||||
b_verse_ms_get();
|
||||
}
|
||||
else if(te->idcode==ID_SS) {
|
||||
struct VerseServer *vserver = (VerseServer*)te->directdata;
|
||||
|
||||
if(!(vserver->flag & VERSE_CONNECTING) && !(vserver->flag & VERSE_CONNECTED)) {
|
||||
event = pupmenu("VerseServer %t| Connect %x1");
|
||||
} else if((vserver->flag & VERSE_CONNECTING) && !(vserver->flag & VERSE_CONNECTED)) {
|
||||
event = pupmenu("VerseServer %t| Connecting %x2");
|
||||
} else if(!(vserver->flag & VERSE_CONNECTING) && (vserver->flag & VERSE_CONNECTED)) {
|
||||
event = pupmenu("VerseServer %t| Disconnect %x3");
|
||||
}
|
||||
switch(event) {
|
||||
case 1:
|
||||
b_verse_connect(vserver->ip);
|
||||
vserver->flag |= VERSE_CONNECTING;
|
||||
break;
|
||||
case 2:
|
||||
break;
|
||||
case 3:
|
||||
end_verse_session(vserver->session);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
static int do_outliner_mouse_event(SpaceOops *soops, TreeElement *te, short event, float *mval)
|
||||
{
|
||||
@@ -1659,105 +1750,18 @@ static int do_outliner_mouse_event(SpaceOops *soops, TreeElement *te, short even
|
||||
else if(mval[0]>te->xs && mval[0]<te->xend) {
|
||||
|
||||
/* activate a name button? */
|
||||
if(G.qual & LR_CTRLKEY) {
|
||||
if(ELEM5(tselem->type, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_MODIFIER_BASE, TSE_SCRIPT_BASE))
|
||||
error("Cannot edit builtin name");
|
||||
else if(tselem->id->lib)
|
||||
error("Cannot edit Library Data");
|
||||
else {
|
||||
tselem->flag |= TSE_TEXTBUT;
|
||||
}
|
||||
}
|
||||
else {
|
||||
#ifdef WITH_VERSE
|
||||
if(event==RIGHTMOUSE) {
|
||||
short event;
|
||||
if(te->idcode==ID_VS) {
|
||||
struct VerseSession *session = (VerseSession*)te->directdata;
|
||||
struct VNode *vnode;
|
||||
if(!(session->flag & VERSE_AUTOSUBSCRIBE)) {
|
||||
event = pupmenu("VerseSession %t| End Session %x1| Subscribe to All Nodes %x2| Start Autosubscribe %x3");
|
||||
}
|
||||
else {
|
||||
event = pupmenu("VerseSession %t| End Session %x1| Subscribe to All Nodes %x2| Stop Autosubscribe %x4");
|
||||
}
|
||||
switch(event) {
|
||||
case 1:
|
||||
end_verse_session(session);
|
||||
break;
|
||||
case 2:
|
||||
vnode = session->nodes.lb.first;
|
||||
while(vnode) {
|
||||
b_verse_pop_node(vnode);
|
||||
vnode = vnode->next;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
vnode = session->nodes.lb.first;
|
||||
while(vnode) {
|
||||
b_verse_pop_node(vnode);
|
||||
vnode = vnode->next;
|
||||
}
|
||||
session->flag |= VERSE_AUTOSUBSCRIBE;
|
||||
break;
|
||||
case 4:
|
||||
session->flag &= ~VERSE_AUTOSUBSCRIBE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(te->idcode==ID_VN) {
|
||||
struct VNode *vnode = (VNode*)te->directdata;
|
||||
if (vnode->type==V_NT_OBJECT || vnode->type==V_NT_BITMAP) {
|
||||
char subscribed = 0;
|
||||
if((vnode->type==V_NT_OBJECT) && (((VObjectData*)vnode->data)->object!=NULL))
|
||||
subscribed = 1;
|
||||
if((vnode->type==V_NT_BITMAP) && (((VBitmapData*)vnode->data)->image!=NULL))
|
||||
subscribed = 1;
|
||||
if(subscribed==1)
|
||||
event = pupmenu("VerseNode %t| Unsubscribe %x2");
|
||||
else
|
||||
event = pupmenu("VerseNode %t| Subscribe %x1");
|
||||
switch(event) {
|
||||
case 1:
|
||||
b_verse_pop_node(vnode);
|
||||
break;
|
||||
case 2:
|
||||
/* Global */
|
||||
b_verse_unsubscribe(vnode);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(te->idcode==ID_MS) {
|
||||
event = pupmenu("Verse Master Server %t| Refresh %x1");
|
||||
b_verse_ms_get();
|
||||
}
|
||||
else if(te->idcode==ID_SS) {
|
||||
struct VerseServer *vserver = (VerseServer*)te->directdata;
|
||||
|
||||
if(!(vserver->flag & VERSE_CONNECTING) && !(vserver->flag & VERSE_CONNECTED)) {
|
||||
event = pupmenu("VerseServer %t| Connect %x1");
|
||||
} else if((vserver->flag & VERSE_CONNECTING) && !(vserver->flag & VERSE_CONNECTED)) {
|
||||
event = pupmenu("VerseServer %t| Connecting %x2");
|
||||
} else if(!(vserver->flag & VERSE_CONNECTING) && (vserver->flag & VERSE_CONNECTED)) {
|
||||
event = pupmenu("VerseServer %t| Disconnect %x3");
|
||||
}
|
||||
switch(event) {
|
||||
case 1:
|
||||
b_verse_connect(vserver->ip);
|
||||
vserver->flag |= VERSE_CONNECTING;
|
||||
break;
|
||||
case 2:
|
||||
break;
|
||||
case 3:
|
||||
end_verse_session(vserver->session);
|
||||
break;
|
||||
}
|
||||
if(event==LEFTMOUSE) {
|
||||
|
||||
if (G.qual & LR_CTRLKEY) {
|
||||
if(ELEM5(tselem->type, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_MODIFIER_BASE, TSE_SCRIPT_BASE))
|
||||
error("Cannot edit builtin name");
|
||||
else if(tselem->id->lib)
|
||||
error("Cannot edit Library Data");
|
||||
else {
|
||||
tselem->flag |= TSE_TEXTBUT;
|
||||
}
|
||||
}
|
||||
else {
|
||||
#endif
|
||||
|
||||
|
||||
/* always makes active object */
|
||||
tree_element_active_object(soops, te);
|
||||
|
||||
@@ -1781,9 +1785,26 @@ static int do_outliner_mouse_event(SpaceOops *soops, TreeElement *te, short even
|
||||
|
||||
}
|
||||
else tree_element_type_active(soops, te, tselem, 1);
|
||||
}
|
||||
else if(event==RIGHTMOUSE) {
|
||||
#ifdef WITH_VERSE
|
||||
}
|
||||
if(ELEM4(te->idcode, ID_VS, ID_VN, ID_MS, ID_SS))
|
||||
verse_operation_menu(te);
|
||||
else
|
||||
#endif
|
||||
/* select object that's clicked on and popup context menu */
|
||||
if (!(tselem->flag & TSE_SELECTED)) {
|
||||
|
||||
if ( outliner_has_one_flag(soops, &soops->tree, TSE_SELECTED, 1) )
|
||||
outliner_set_flag(soops, &soops->tree, TSE_SELECTED, 0);
|
||||
|
||||
tselem->flag |= TSE_SELECTED;
|
||||
/* redraw, same as outliner_select function */
|
||||
scrarea_do_windraw(soops->area);
|
||||
screen_swapbuffers();
|
||||
}
|
||||
|
||||
outliner_operation_menu(soops->area);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@@ -2127,7 +2148,9 @@ void outliner_select(struct ScrArea *sa )
|
||||
getmouseco_areawin(mval);
|
||||
areamouseco_to_ipoco(&so->v2d, mval, fmval, fmval+1);
|
||||
y2= fmval[1];
|
||||
|
||||
if(yo!=mval[1]) {
|
||||
/* select the 'ouliner row' */
|
||||
do_outliner_select(so, &so->tree, y1, y2, &selecting);
|
||||
yo= mval[1];
|
||||
scrarea_do_windraw(sa);
|
||||
@@ -2467,7 +2490,7 @@ void outliner_operation_menu(ScrArea *sa)
|
||||
//else pupmenu("Scene Operations%t|Delete");
|
||||
}
|
||||
else if(objectlevel) {
|
||||
short event= pupmenu("Object Operations%t|Select%x1|Deselect%x2|Delete%x4|Make Local%x5");
|
||||
short event= pupmenu("Select%x1|Deselect%x2|Delete%x4|Make Local%x5");
|
||||
if(event>0) {
|
||||
char *str="";
|
||||
|
||||
@@ -2501,7 +2524,7 @@ void outliner_operation_menu(ScrArea *sa)
|
||||
else if(idlevel) {
|
||||
if(idlevel==-1 || datalevel) error("Mixed selection");
|
||||
else {
|
||||
short event= pupmenu("Data Operations%t|Unlink %x1|Make Local %x2");
|
||||
short event= pupmenu("Unlink %x1|Make Local %x2");
|
||||
|
||||
if(event==1) {
|
||||
switch(idlevel) {
|
||||
@@ -2744,7 +2767,7 @@ static void outliner_draw_tree_element(SpaceOops *soops, TreeElement *te, int st
|
||||
tselem= TREESTORE(te);
|
||||
|
||||
if(*starty >= soops->v2d.cur.ymin && *starty<= soops->v2d.cur.ymax) {
|
||||
|
||||
|
||||
glEnable(GL_BLEND);
|
||||
|
||||
/* colors for active/selected data */
|
||||
@@ -2929,12 +2952,12 @@ static void outliner_draw_tree_element(SpaceOops *soops, TreeElement *te, int st
|
||||
te->xend= startx+offsx;
|
||||
|
||||
*starty-= OL_H;
|
||||
|
||||
|
||||
if((tselem->flag & TSE_CLOSED)==0) {
|
||||
for(ten= te->subtree.first; ten; ten= ten->next) {
|
||||
outliner_draw_tree_element(soops, ten, startx+OL_X, starty);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void outliner_draw_hierarchy(SpaceOops *soops, ListBase *lb, int startx, int *starty)
|
||||
@@ -2988,6 +3011,7 @@ static void outliner_draw_selection(SpaceOops *soops, ListBase *lb, int *starty)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void outliner_draw_tree(SpaceOops *soops)
|
||||
{
|
||||
TreeElement *te;
|
||||
@@ -3036,6 +3060,72 @@ static void outliner_back(SpaceOops *soops)
|
||||
}
|
||||
}
|
||||
|
||||
static void outliner_draw_restrictcols(SpaceOops *soops)
|
||||
{
|
||||
int ystart;
|
||||
|
||||
/* background underneath */
|
||||
BIF_ThemeColor(TH_BACK);
|
||||
glRecti((int)soops->v2d.mask.xmax-(OL_TOGW+SCROLLB), soops->v2d.cur.ymin, (int)soops->v2d.mask.xmax, soops->v2d.tot.ymax);
|
||||
|
||||
BIF_ThemeColorShade(TH_BACK, 6);
|
||||
ystart= soops->v2d.tot.ymax;
|
||||
ystart= OL_H*(ystart/(OL_H));
|
||||
|
||||
while(ystart > soops->v2d.cur.ymin) {
|
||||
glRecti((int)soops->v2d.mask.xmax-(OL_TOGW+SCROLLB), ystart, (int)soops->v2d.mask.xmax, ystart+OL_H);
|
||||
ystart-= 2*OL_H;
|
||||
}
|
||||
|
||||
BIF_ThemeColorShadeAlpha(TH_BACK, -15, -200);
|
||||
|
||||
/* view */
|
||||
sdrawline((short)soops->v2d.mask.xmax-(OL_TOG_RESTRICT_VIEWX+SCROLLB),
|
||||
(short)soops->v2d.tot.ymax,
|
||||
(short)soops->v2d.mask.xmax-(OL_TOG_RESTRICT_VIEWX+SCROLLB),
|
||||
(short)soops->v2d.cur.ymin);
|
||||
|
||||
/* render */
|
||||
sdrawline((short)soops->v2d.mask.xmax-(OL_TOG_RESTRICT_SELECTX+SCROLLB),
|
||||
(short)soops->v2d.tot.ymax,
|
||||
(short)soops->v2d.mask.xmax-(OL_TOG_RESTRICT_SELECTX+SCROLLB),
|
||||
(short)soops->v2d.cur.ymin);
|
||||
|
||||
/* render */
|
||||
sdrawline((short)soops->v2d.mask.xmax-(OL_TOG_RESTRICT_RENDERX+SCROLLB),
|
||||
(short)soops->v2d.tot.ymax,
|
||||
(short)soops->v2d.mask.xmax-(OL_TOG_RESTRICT_RENDERX+SCROLLB),
|
||||
(short)soops->v2d.cur.ymin);
|
||||
}
|
||||
|
||||
static void restrictbutton_cb(void *poin, void *poin2)
|
||||
{
|
||||
allqueue(REDRAWOOPS, 0);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
}
|
||||
|
||||
static void restrictbutton_sel_cb(void *poin, void *poin2)
|
||||
{
|
||||
Base *base;
|
||||
Object *ob = (Object *)poin;
|
||||
|
||||
/* if select restriction has just been turned on */
|
||||
if (ob->restrictflag & OB_RESTRICT_SELECT) {
|
||||
|
||||
/* Ouch! There is no backwards pointer from Object to Base,
|
||||
* so have to do loop to find it. */
|
||||
for(base= FIRSTBASE; base; base= base->next) {
|
||||
if(base->object==ob) {
|
||||
base->flag &= ~SELECT;
|
||||
base->object->flag= base->flag;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
allqueue(REDRAWOOPS, 0);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
}
|
||||
|
||||
static void namebutton_cb(void *tep, void *oldnamep)
|
||||
{
|
||||
SpaceOops *soops= curarea->spacedata.first;
|
||||
@@ -3121,6 +3211,7 @@ static void outliner_buttons(uiBlock *block, SpaceOops *soops, ListBase *lb)
|
||||
uiBut *bt;
|
||||
TreeElement *te;
|
||||
TreeStoreElem *tselem;
|
||||
Object *ob;
|
||||
int dx, len;
|
||||
|
||||
for(te= lb->first; te; te= te->next) {
|
||||
@@ -3145,8 +3236,37 @@ static void outliner_buttons(uiBlock *block, SpaceOops *soops, ListBase *lb)
|
||||
/* otherwise keeps open on ESC */
|
||||
tselem->flag &= ~TSE_TEXTBUT;
|
||||
}
|
||||
else
|
||||
if((tselem->flag & TSE_CLOSED)==0) outliner_buttons(block, soops, &te->subtree);
|
||||
|
||||
if (!(soops->flag & SO_HIDE_RESTRICTCOLS)) {
|
||||
if(tselem->type==0 && te->idcode==ID_OB) {
|
||||
/* only objects have toggle-able flags */
|
||||
ob = (Object *)tselem->id;
|
||||
|
||||
uiBlockSetEmboss(block, UI_EMBOSSN);
|
||||
bt= uiDefIconButBitS(block, ICONTOG, OB_RESTRICT_VIEW, REDRAWALL, ICON_RESTRICT_VIEW_OFF,
|
||||
(int)soops->v2d.mask.xmax-(OL_TOG_RESTRICT_VIEWX+SCROLLB), te->ys, 17, OL_H-1, &(ob->restrictflag), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
|
||||
uiButSetFunc(bt, restrictbutton_cb, NULL, NULL);
|
||||
uiButSetFlag(bt, UI_NO_HILITE);
|
||||
|
||||
bt= uiDefIconButBitS(block, ICONTOG, OB_RESTRICT_SELECT, REDRAWALL, ICON_RESTRICT_SELECT_OFF,
|
||||
(int)soops->v2d.mask.xmax-(OL_TOG_RESTRICT_SELECTX+SCROLLB), te->ys, 17, OL_H-1, &(ob->restrictflag), 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
|
||||
uiButSetFunc(bt, restrictbutton_sel_cb, ob, NULL);
|
||||
uiButSetFlag(bt, UI_NO_HILITE);
|
||||
|
||||
/* don't show 'renderable' icons for objects that don't render anyway */
|
||||
if (! (ELEM4(ob->type, OB_CAMERA, OB_LATTICE, OB_ARMATURE, OB_EMPTY))) {
|
||||
bt= uiDefIconButBitS(block, ICONTOG, OB_RESTRICT_RENDER, REDRAWALL, ICON_RESTRICT_RENDER_OFF,
|
||||
(int)soops->v2d.mask.xmax-(OL_TOG_RESTRICT_RENDERX+SCROLLB), te->ys, 17, OL_H-1, &(ob->restrictflag), 0, 0, 0, 0, "Restrict/Allow renderability");
|
||||
uiButSetFunc(bt, restrictbutton_cb, NULL, NULL);
|
||||
uiButSetFlag(bt, UI_NO_HILITE);
|
||||
}
|
||||
|
||||
uiBlockSetEmboss(block, UI_EMBOSS);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if((tselem->flag & TSE_CLOSED)==0) outliner_buttons(block, soops, &te->subtree);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3189,6 +3309,8 @@ void draw_outliner(ScrArea *sa, SpaceOops *soops)
|
||||
/* draw outliner stuff */
|
||||
outliner_back(soops);
|
||||
outliner_draw_tree(soops);
|
||||
if (!(soops->flag & SO_HIDE_RESTRICTCOLS))
|
||||
outliner_draw_restrictcols(soops);
|
||||
|
||||
/* restore viewport */
|
||||
mywinset(sa->win);
|
||||
|
||||
@@ -4485,6 +4485,7 @@ static void winqreadoopsspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
if(soops->type==SO_OUTLINER) {
|
||||
switch(event) {
|
||||
case LEFTMOUSE:
|
||||
case RIGHTMOUSE:
|
||||
outliner_mouse_event(sa, event);
|
||||
break;
|
||||
case MIDDLEMOUSE:
|
||||
@@ -4492,14 +4493,6 @@ static void winqreadoopsspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
case WHEELDOWNMOUSE:
|
||||
view2dmove(event); /* in drawipo.c */
|
||||
break;
|
||||
case RIGHTMOUSE:
|
||||
#ifdef WITH_VERSE
|
||||
/* evil hack due to verse */
|
||||
outliner_mouse_event(sa, event);
|
||||
#else
|
||||
outliner_operation_menu(sa);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case AKEY:
|
||||
if(G.qual==LR_SHIFTKEY)
|
||||
|
||||
Reference in New Issue
Block a user