Version 1.0 of the new Outliner

The outliner is a hierarchical diagram displaying a list of data in Blender
and its dependencies. The 'databrowse' doesn't really show it, and Oops is
too chaotic still. And most of all, the former two don't offer much tools.

After discussions on irc, Matt came with this design proposal;
http://mke3.net/blender/interface/layout/outliner/
Which is closely followed for the implementation.

The current version only shows all 'library data' in Blender (objects,
meshes, ipos, etc) and not the 'direct data' such as vertex groups or NLA.

I decided to make it inside the Oopw window, as an option. You can find the
option in the "View" pulldown, or directly invoke it with ALT+SHIFT+F9
Here's a quick overview of the Outliner GUI:

- Header pulldown has options what it can show (Visible = in current layers)
- click on triangle arrow to open/close
- press AKEY to open/close all
- Leftmouse click on an item activates; and does based on type a couple of
  extra things:
  - activates a scene
  - selects/activates the Object
  - enters editmode (if clicked on Mesh, Curve, etc)
  - shows the appropriate Shading buttons (Lamp, Material, Texture)
  - sets the IpoWindow to the current IPO
  - activates the Ipo-channel in an Action
- Selected and Active objects are drawn in its Theme selection color
- SHIFT+click on Object does extend-select
- Press DOTkey to get the current active data in center of view


TODO;
- rightmouse selection; for indicating operations like delete or duplicate
- showing more data types
- icon (re)design...
- lotsof options as described in Matts paper still...
This commit is contained in:
Ton Roosendaal 2004-10-06 18:55:00 +00:00
parent d5e1d1844a
commit d5e0c065bc
37 changed files with 3078 additions and 1795 deletions

@ -2624,13 +2624,24 @@ static void lib_link_screen(FileData *fd, Main *main)
else if(sl->spacetype==SPACE_OOPS) {
SpaceOops *so= (SpaceOops *)sl;
Oops *oops;
TreeStoreElem *tselem;
int a;
oops= so->oops.first;
while(oops) {
oops->id= newlibadr(fd, 0, oops->id);
oops->id= newlibadr(fd, NULL, oops->id);
oops= oops->next;
}
so->lockpoin= 0;
so->lockpoin= NULL;
so->tree.first= so->tree.last= NULL;
if(so->treestore) {
tselem= so->treestore->data;
for(a=0; a<so->treestore->usedelem; a++, tselem++) {
tselem->id= newlibadr(fd, NULL, tselem->id);
}
}
}
else if(sl->spacetype==SPACE_SOUND) {
SpaceSound *ssound= (SpaceSound *)sl;
@ -2746,14 +2757,22 @@ void lib_link_screen_restore(Main *newmain, char mode, Scene *curscene)
else if(sl->spacetype==SPACE_OOPS) {
SpaceOops *so= (SpaceOops *)sl;
Oops *oops;
int a;
oops= so->oops.first;
while(oops) {
oops->id= restore_pointer_by_name(newmain, (ID *)oops->id);
oops= oops->next;
}
so->lockpoin= NULL;
if(so->treestore) {
TreeStore *ts= so->treestore;
TreeStoreElem *tselem=ts->data;
for(a=0; a<ts->usedelem; a++, tselem++) {
tselem->id= restore_pointer_by_name(newmain, tselem->id);
}
}
}
else if(sl->spacetype==SPACE_SOUND) {
SpaceSound *ssound= (SpaceSound *)sl;
@ -2821,12 +2840,21 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
}
else if (sl->spacetype==SPACE_OOPS) {
SpaceOops *soops= (SpaceOops*) sl;
link_list(fd, &(soops->oops));
oops= soops->oops.first;
while(oops) {
oops->link.first= oops->link.last= 0;
oops= oops->next;
}
soops->treestore= newdataadr(fd, soops->treestore);
if(soops->treestore) {
soops->treestore->data= newdataadr(fd, soops->treestore->data);
/* we only saved what was used */
soops->treestore->totelem= soops->treestore->usedelem;
soops->storeflag |= SO_TREESTORE_CLEANUP; // at first draw
}
}
}

@ -1220,6 +1220,12 @@ static void write_screens(WriteData *wd, ListBase *scrbase)
writestruct(wd, DATA, "Oops", 1, oops);
oops= oops->next;
}
/* outliner */
if(so->treestore) {
writestruct(wd, DATA, "TreeStore", 1, so->treestore);
if(so->treestore->data)
writestruct(wd, DATA, "TreeStoreElem", so->treestore->usedelem, so->treestore->data);
}
}
else if(sl->spacetype==SPACE_IMAGE) {
writestruct(wd, DATA, "SpaceImage", 1, sl);

@ -40,7 +40,7 @@ struct ID;
/* external, butspace.c */
extern void do_butspace(unsigned short event);
extern void redraw_test_buttons(struct Base *new);
extern void redraw_test_buttons(struct Object *new);
/* buts->mainb old */
#define BUTS_VIEW 0

@ -36,7 +36,6 @@
struct ScrArea;
struct SpaceScript;
void init_scriptspace(struct ScrArea *sa);
void free_scriptspace(struct SpaceScript *sc);
#endif /* BIF_DRAWSCRIPT_H */

@ -39,7 +39,6 @@ struct Text;
void unlink_text(struct Text *text);
void init_textspace(struct ScrArea *sa);
void free_textspace(struct SpaceText *st);
void txt_write_file(struct Text *text);

@ -59,5 +59,8 @@ void borderselect_action(void);
void deselect_actionchannel_keys(bAction *act, int test);
void deselect_meshchannel_keys (Key *key, int test);
int select_channel(bAction *act, bActionChannel *chan, int selectmode);
#endif

@ -34,6 +34,7 @@
#define BIF_EDITNLA_H
void clever_numbuts_nla(void);
extern void winqreadnlaspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
/* NLA channel operations */
void delete_nlachannel_keys(void);

@ -51,7 +51,6 @@ void get_next_image(struct SpaceImaSel *simasel);
void get_file_info(struct SpaceImaSel *simasel);
void get_pib_file(struct SpaceImaSel *simasel);
void change_imadir(struct SpaceImaSel *simasel);
void init_imaselspace(struct ScrArea *sa);
void check_imasel_copy(struct SpaceImaSel *simasel);
void free_imasel(struct SpaceImaSel *simasel);

@ -0,0 +1,55 @@
/**
* $Id: BIF_outliner.h
*
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version. The Blender
* Foundation also sells licenses for use in proprietary software under
* the Blender License. See http://www.blender.org/BL/ for information
* about this.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* The Original Code is Copyright (C) 2004 Blender Foundation.
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): none yet.
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
#ifndef BIF_OUTLINER_H
#define BIF_OUTLINER_H
typedef struct TreeElement {
struct TreeElement *next, *prev, *parent;
ListBase subtree;
float xs, ys;
int store_index; // offset in tree store
short flag, index; // flag for non-saved stuff, index for (ID *) arrays
} TreeElement;
/* TreeElement->flag */
#define TE_ACTIVE 1
extern void draw_outliner(struct ScrArea *sa, struct SpaceOops *so);
extern void outliner_free_tree(struct ListBase *lb);
extern void outliner_mouse_event(struct ScrArea *sa, short event);
extern void outliner_toggle_visible(struct ScrArea *sa);
extern void outliner_show_active(struct ScrArea *sa);
#endif

@ -76,8 +76,8 @@ typedef enum {
ICON_SORTSIZE,
ICON_LONGDISPLAY,
ICON_SHORTDISPLAY,
ICON_BLANK4,
ICON_BLANK5,
ICON_TRIA_OPEN,
ICON_TRIA_CLOSED,
ICON_VIEW_AXIS_ALL,
ICON_VIEW_AXIS_NONE,
@ -255,7 +255,7 @@ typedef enum {
ICON_LIBRARY_HLT,
ICON_IMAGE_HLT,
ICON_CONSTRAINT,
ICON_BLANK32,
ICON_CAMERA_DEHLT,
ICON_BLANK33,
#define BIFICONID_LAST (ICON_BLANK33)
#define BIFNICONIDS (BIFICONID_LAST-BIFICONID_FIRST + 1)
@ -406,7 +406,7 @@ void BIF_ThemeColor4(int colorid);
void BIF_ThemeColorShade(int colorid, int offset);
// sets color plus offset for alpha
void BIF_ThemeColorShadeAlpha(int colorid, int coloffset, int alphaoffset);
void BIF_ThemeColorShadeAlpha(int colorid, int coloffset, int alphaoffset);
// sets color, which is blend between two theme colors
void BIF_ThemeColorBlend(int colorid1, int colorid2, float fac);
@ -424,6 +424,10 @@ void BIF_GetThemeColor3fv(int colorid, float *col);
void BIF_GetThemeColor3ubv(int colorid, char *col);
void BIF_GetThemeColor4ubv(int colorid, char *col);
// get a theme color from specified space type
void BIF_GetThemeColorType4ubv(int colorid, int spacetype, char *col);
struct ScrArea;
// internal (blender) usage only, for init and set active

@ -96,25 +96,10 @@ extern void force_draw_plus(int type);
extern void freespacelist(struct ListBase *lb);
extern void handle_view3d_around(void);
extern void handle_view3d_lock(void);
extern void init_butspace(struct ScrArea *sa);
extern void init_filespace(struct ScrArea *sa);
extern void init_imagespace(struct ScrArea *sa);
extern void init_oopsspace(struct ScrArea *sa);
extern void init_nlaspace(struct ScrArea *sa);
extern void init_seqspace(struct ScrArea *sa);
extern void init_v2d_oops(struct View2D *v2d);
extern void init_v2d_oops(struct ScrArea *, struct SpaceOops *);
extern void initipo(struct ScrArea *sa);
extern void initview3d(struct ScrArea *sa);
extern void newspace(struct ScrArea *sa, int type);
extern void set_rects_butspace(struct SpaceButs *buts);
extern void winqreadview3dspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
extern void winqreadbutspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
extern void winqreadimagespace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
extern void winqreadinfospace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
extern void winqreadipospace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
extern void winqreadoopsspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
extern void winqreadnlaspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
extern void winqreadseqspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
extern void test_butspace(void);
extern void start_game(void);
extern void select_group_menu(void);

@ -113,7 +113,6 @@ void test_actionpoin_but(char *name, ID **idpp);
void test_obcurpoin_but(char *name, ID **idpp);
void test_idbutton_cb(void *namev, void *arg2_unused);
void butspace_context_switch(SpaceButs *buts, struct Base *new);
/* -------------- internal event defines ------------ */

@ -129,7 +129,8 @@ typedef struct Library {
#define ID_SCRIPT MAKE_ID2('P', 'Y')
#define IPO_CO MAKE_ID2('C', 'O') /* NOTE! This is not an ID, but is needed for g.sipo->blocktype */
#define ID_NLA MAKE_ID2('N', 'L') /* fake ID for outliner */
/* id->flag: set frist 8 bits always at zero while reading */
#define LIB_LOCAL 0
#define LIB_EXTERN 1

@ -41,6 +41,16 @@
struct ID;
typedef struct TreeStoreElem {
short type, nr, flag, used;
ID *id;
} TreeStoreElem;
typedef struct TreeStore {
int totelem, usedelem;
TreeStoreElem *data;
} TreeStore;
typedef struct Oops {
struct Oops *next, *prev;
short type, flag, dt, hide;
@ -65,5 +75,10 @@ typedef struct OopsLink {
#define OOPS_DOSELECT 2
#define OOPS_REFER 4
/* TreeStoreElem->flag */
#define TSE_CLOSED 1
#define TSE_LASTCLICKED 2
#endif

@ -47,6 +47,8 @@ struct ImBuf;
struct Image;
struct SpaceIpo;
struct BlendHandle;
struct TreeStore;
/**
* The base structure all the other spaces
@ -194,6 +196,11 @@ typedef struct SpaceOops {
short pin, visiflag, flag, rt;
void *lockpoin;
ListBase tree;
struct TreeStore *treestore;
short type, outlinevis, storeflag;
short pad1;
} SpaceOops;
typedef struct SpaceImage {
@ -438,6 +445,9 @@ typedef struct SpaceImaSel {
#define ST_SCROLL_SELECT 0x0001 // scrollable
#define ST_CLEAR_NAMESPACE 0x0010 // clear namespace after script
// execution (see BPY_main.c)
/* SpaceOops->type */
#define SO_OOPS 0
#define SO_OUTLINER 1
/* SpaceOops->flag */
#define SO_TESTBLOCKS 1
@ -458,6 +468,16 @@ typedef struct SpaceImaSel {
#define OOPS_LI 2048
#define OOPS_IM 4096
/* SpaceOops->outlinevis */
#define SO_ALL_SCENES 0
#define SO_CUR_SCENE 1
#define SO_VISIBLE 2
#define SO_SELECTED 3
#define SO_ACTIVE 4
/* SpaceOops->storeflag */
#define SO_TREESTORE_CLEANUP 1
/* headerbuttons: 450-499 */
#define B_IMASELHOME 451

File diff suppressed because it is too large Load Diff

@ -326,30 +326,30 @@ void do_butspace(unsigned short event)
else if(event>REDRAWVIEW3D) allqueue(event, 0);
}
void butspace_context_switch(SpaceButs *buts, Base *new)
static void butspace_context_switch(SpaceButs *buts, Object *new)
{
// change type automatically
if(new) {
int tab= buts->tab[CONTEXT_SHADING];
if(tab == TAB_SHADING_WORLD) {
if(new->object->type==OB_LAMP) {
if(new->type==OB_LAMP) {
buts->tab[CONTEXT_SHADING]= TAB_SHADING_LAMP;
}
else buts->tab[CONTEXT_SHADING]= TAB_SHADING_MAT;
}
else if(tab == TAB_SHADING_TEX) {
if(new->object->type==OB_LAMP) buts->texfrom= 2;
else if(new->object->type==OB_CAMERA) buts->texfrom= 1;
if(new->type==OB_LAMP) buts->texfrom= 2;
else if(new->type==OB_CAMERA) buts->texfrom= 1;
else buts->texfrom= 0;
}
else if(tab == TAB_SHADING_RAD) {
}
else if(new->object->type==OB_CAMERA) {
else if(new->type==OB_CAMERA) {
buts->tab[CONTEXT_SHADING]= TAB_SHADING_WORLD;
}
else if(new->object->type==OB_LAMP) {
else if(new->type==OB_LAMP) {
buts->tab[CONTEXT_SHADING]= TAB_SHADING_LAMP;
}
else {
@ -359,7 +359,7 @@ void butspace_context_switch(SpaceButs *buts, Base *new)
}
/* new active object */
void redraw_test_buttons(Base *new)
void redraw_test_buttons(Object *new)
{
ScrArea *sa;
SpaceButs *buts;

@ -440,11 +440,13 @@ void do_common_editbuts(unsigned short event) // old name, is a mix of object an
new_material_to_objectdata((G.scene->basact) ? (G.scene->basact->object) : 0);
scrarea_queue_winredraw(curarea);
allqueue(REDRAWVIEW3D_Z, 0);
allqueue(REDRAWOOPS, 0);
break;
case B_MATDEL:
delete_material_index();
scrarea_queue_winredraw(curarea);
allqueue(REDRAWVIEW3D_Z, 0);
allqueue(REDRAWOOPS, 0);
break;
case B_MATASS:
if(G.obedit && G.obedit->actcol>0) {

@ -2376,11 +2376,13 @@ void do_matbuts(unsigned short event)
scrarea_queue_headredraw(curarea);
allqueue(REDRAWBUTSSHADING, 0);
allqueue(REDRAWIPO, 0);
allqueue(REDRAWOOPS, 0);
BIF_preview_changed(G.buts);
break;
case B_MATFROM:
scrarea_queue_headredraw(curarea);
allqueue(REDRAWBUTSSHADING, 0);
allqueue(REDRAWOOPS, 0);
// BIF_previewdraw(); push/pop!
break;
case B_MATPRV:

@ -378,6 +378,10 @@ void test_view2d(View2D *v2d, int winx, int winy)
rctf *cur, *tot;
float dx, dy, temp, fac, zoom;
/* correct winx for scroll */
if(v2d->scroll & L_SCROLL) winx-= SCROLLB;
if(v2d->scroll & B_SCROLL) winy-= SCROLLH;
cur= &v2d->cur;
tot= &v2d->tot;
@ -689,7 +693,8 @@ void drawscroll(int disptype)
val= ipogrid_startx;
while(fac < hor.xmax) {
if(curarea->spacetype==SPACE_SEQ) {
if(curarea->spacetype==SPACE_OOPS);
else if(curarea->spacetype==SPACE_SEQ) {
fac2= val/(float)G.scene->r.frs_sec;
tim= floor(fac2);
fac2= fac2-tim;
@ -748,7 +753,8 @@ void drawscroll(int disptype)
dfac= (ipogrid_dy)/(G.v2d->cur.ymax-G.v2d->cur.ymin);
dfac= dfac*(vert.ymax-vert.ymin-SCROLLH);
if(curarea->spacetype==SPACE_SEQ) {
if(curarea->spacetype==SPACE_OOPS);
else if(curarea->spacetype==SPACE_SEQ) {
BIF_ThemeColor(TH_TEXT);
val= ipogrid_starty;
fac+= 0.5*dfac;
@ -1917,8 +1923,9 @@ int view2dmove(unsigned short event)
else mousebut = L_MOUSE;
if ( (G.qual & LR_CTRLKEY) || (event==WHEELUPMOUSE) || (event==WHEELDOWNMOUSE) ) {
/* patch for buttonswin, standard scroll no zoom */
if(curarea->spacetype==SPACE_BUTS && (G.qual & LR_CTRLKEY)==0);
/* patch for oops & buttonswin, standard scroll no zoom */
if(curarea->spacetype==SPACE_OOPS);
else if(curarea->spacetype==SPACE_BUTS && (G.qual & LR_CTRLKEY)==0);
else if (view2dzoom(event)) {
curarea->head_swap= 0;
return 0;
@ -1958,6 +1965,8 @@ int view2dmove(unsigned short event)
facy= (G.v2d->cur.ymax-G.v2d->cur.ymin)/(float)(curarea->winy);
}
/* no x move in outliner */
if(curarea->spacetype==SPACE_OOPS && G.v2d->scroll) facx= 0.0;
/* no y move in audio */
if(curarea->spacetype==SPACE_SOUND) facy= 0.0;
@ -1978,7 +1987,6 @@ int view2dmove(unsigned short event)
if(event==WHEELDOWNMOUSE) {
facx= -facx; facy= -facy;
}
switch (G.qual & (LR_CTRLKEY|LR_SHIFTKEY|LR_ALTKEY)) {
case (LR_SHIFTKEY):
dx = 0.0;
@ -1989,7 +1997,11 @@ int view2dmove(unsigned short event)
dy = 0.0;
break;
default:
if(curarea->spacetype==SPACE_BUTS) {
if(curarea->spacetype==SPACE_OOPS) {
dx= 0.0;
dy= facy*20;
}
else if(curarea->spacetype==SPACE_BUTS) {
if(G.buts->align==BUT_HORIZONTAL) {
dx= facx*30; dy= 0.0;
} else {

@ -4269,7 +4269,7 @@ void draw_object(Base *base)
if(ob->hooks.first && ob!=G.obedit) draw_hooks(ob);
/* help lines and so */
if(ob->parent && (ob->parent->lay & G.vd->lay)) {
if(ob!=G.obedit && ob->parent && (ob->parent->lay & G.vd->lay)) {
setlinestyle(3);
glBegin(GL_LINES);
glVertex3fv(ob->obmat[3]);

@ -58,13 +58,13 @@
#include "BKE_utildefines.h"
#include "BKE_global.h"
#include "BIF_gl.h"
#include "BIF_interface.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
#include "BIF_mywindow.h"
#include "BIF_outliner.h"
#include "BIF_resources.h"
#include "BIF_screen.h"
#include "BIF_mywindow.h"
#include "BIF_resources.h"
/* #include "BIF_drawoops.h" bad name :(*/
#include "BIF_oops.h"
@ -388,6 +388,7 @@ void draw_oops(Oops *oops)
void drawoopsspace(ScrArea *sa, void *spacedata)
{
SpaceOops *soops= spacedata;
Oops *oops;
float col[3];
int ofsx, ofsy;
@ -395,57 +396,60 @@ void drawoopsspace(ScrArea *sa, void *spacedata)
BIF_GetThemeColor3fv(TH_BACK, col);
glClearColor(col[0], col[1], col[2], 0.0);
glClear(GL_COLOR_BUFFER_BIT);
if(G.soops==0) return;
if(soops==0) return;
if(soops->type==SO_OUTLINER) draw_outliner(sa, soops);
else {
boundbox_oops();
calc_scrollrcts(G.v2d, curarea->winx, curarea->winy);
boundbox_oops();
calc_scrollrcts(G.v2d, curarea->winx, curarea->winy);
if(curarea->winx>SCROLLB+10 && curarea->winy>SCROLLH+10) {
if(G.v2d->scroll) {
ofsx= curarea->winrct.xmin; /* because of mywin */
ofsy= curarea->winrct.ymin;
if(curarea->winx>SCROLLB+10 && curarea->winy>SCROLLH+10) {
if(G.v2d->scroll) {
ofsx= curarea->winrct.xmin; /* because of mywin */
ofsy= curarea->winrct.ymin;
glViewport(ofsx+G.v2d->mask.xmin, ofsy+G.v2d->mask.ymin, ( ofsx+G.v2d->mask.xmax-1)-(ofsx+G.v2d->mask.xmin)+1, ( ofsy+G.v2d->mask.ymax-1)-( ofsy+G.v2d->mask.ymin)+1);
glScissor(ofsx+G.v2d->mask.xmin, ofsy+G.v2d->mask.ymin, ( ofsx+G.v2d->mask.xmax-1)-(ofsx+G.v2d->mask.xmin)+1, ( ofsy+G.v2d->mask.ymax-1)-( ofsy+G.v2d->mask.ymin)+1);
glViewport(ofsx+G.v2d->mask.xmin, ofsy+G.v2d->mask.ymin, ( ofsx+G.v2d->mask.xmax-1)-(ofsx+G.v2d->mask.xmin)+1, ( ofsy+G.v2d->mask.ymax-1)-( ofsy+G.v2d->mask.ymin)+1);
glScissor(ofsx+G.v2d->mask.xmin, ofsy+G.v2d->mask.ymin, ( ofsx+G.v2d->mask.xmax-1)-(ofsx+G.v2d->mask.xmin)+1, ( ofsy+G.v2d->mask.ymax-1)-( ofsy+G.v2d->mask.ymin)+1);
}
}
}
myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax);
myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax);
oopscalex= .14*((float)curarea->winx)/(G.v2d->cur.xmax-G.v2d->cur.xmin);
calc_ipogrid(); /* for scrollvariables */
build_oops();
oopscalex= .14*((float)curarea->winx)/(G.v2d->cur.xmax-G.v2d->cur.xmin);
calc_ipogrid(); /* for scrollvariables */
build_oops();
oops= G.soops->oops.first;
while(oops) {
if(oops->hide==0) {
draw_oopslink(oops);
oops= soops->oops.first;
while(oops) {
if(oops->hide==0) {
draw_oopslink(oops);
}
oops= oops->next;
}
oops= oops->next;
}
oops= G.soops->oops.first;
while(oops) {
if(oops->hide==0) {
if(oops->flag & SELECT); else draw_oops(oops);
oops= soops->oops.first;
while(oops) {
if(oops->hide==0) {
if(oops->flag & SELECT); else draw_oops(oops);
}
oops= oops->next;
}
oops= oops->next;
}
oops= G.soops->oops.first;
while(oops) {
if(oops->hide==0) {
if(oops->flag & SELECT) draw_oops(oops);
oops= soops->oops.first;
while(oops) {
if(oops->hide==0) {
if(oops->flag & SELECT) draw_oops(oops);
}
oops= oops->next;
}
oops= oops->next;
}
/* restore viewport */
mywinset(curarea->win);
/* ortho at pixel level curarea */
myortho2(-0.375, sa->winx-0.375, -0.375, sa->winy-0.375);
if(G.v2d->scroll) {
drawscroll(0);
if(sa->winx>SCROLLB+10 && sa->winy>SCROLLH+10) {
if(G.v2d->scroll) drawscroll(0);
}
draw_area_emboss(sa);

@ -831,13 +831,28 @@ static void drawviewborder(void)
float x1, x2, y1, y2;
float x3, y3, x4, y4;
rcti viewborder;
calc_viewborder(G.vd, &viewborder);
x1= viewborder.xmin;
y1= viewborder.ymin;
x2= viewborder.xmax;
y2= viewborder.ymax;
/* passepartout, in color of backdrop minus 50 */
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glEnable(GL_BLEND);
glColor4ub(0, 0, 0, 50);
if (x1 > 0.0) {
glRectf(0.0, (float)curarea->winy, x1, 0.0);
glRectf(x2, (float)curarea->winy, (float)curarea->winx, 0.0);
}
if (y1 > 0.0) {
glRectf(x1, (float)curarea->winy, x2, y2);
glRectf(x1, y1, x2, 0.0);
}
glDisable(GL_BLEND);
/* edge */
setlinestyle(3);
cpack(0);

@ -759,7 +759,7 @@ void borderselect_mesh(Key *key)
}
}
/* used by ipo, outliner, buttons to find the active channel */
bActionChannel* get_hilighted_action_channel(bAction* action)
{
bActionChannel *chan;
@ -1601,7 +1601,8 @@ static void hilight_channel (bAction *act, bActionChannel *chan, short select)
* = SELECT_INVERT
*/
static int select_channel(bAction *act, bActionChannel *chan,
/* exported for outliner (ton) */
int select_channel(bAction *act, bActionChannel *chan,
int selectmode) {
/* Select the channel based on the selection mode
*/

@ -680,43 +680,6 @@ static void mouse_nlachannels(short mval[2])
}
void init_nlaspace(ScrArea *sa)
{
SpaceNla *snla;
snla= MEM_callocN(sizeof(SpaceNla), "initnlaspace");
BLI_addhead(&sa->spacedata, snla);
snla->spacetype= SPACE_NLA;
snla->blockscale= 0.7;
snla->v2d.tot.xmin= 1.0;
snla->v2d.tot.ymin= 0.0;
snla->v2d.tot.xmax= 1000.0;
snla->v2d.tot.ymax= 1000.0;
snla->v2d.cur.xmin= -5.0;
snla->v2d.cur.ymin= 0.0;
snla->v2d.cur.xmax= 65.0;
snla->v2d.cur.ymax= 1000.0;
snla->v2d.min[0]= 0.0;
snla->v2d.min[1]= 0.0;
snla->v2d.max[0]= 1000.0;
snla->v2d.max[1]= 1000.0;
snla->v2d.minzoom= 0.1F;
snla->v2d.maxzoom= 50;
snla->v2d.scroll= R_SCROLL+B_SCROLL;
snla->v2d.keepaspect= 0;
snla->v2d.keepzoom= V2D_LOCKZOOM_Y;
snla->v2d.keeptot= 0;
snla->lock = 0;
}
void deselect_nlachannel_keys (int test)
{
Base *base;

@ -202,7 +202,7 @@ void add_object_draw(int type) /* for toolbox */
allqueue(REDRAWVIEW3D, 0);
}
redraw_test_buttons(BASACT);
redraw_test_buttons(OBACT);
allqueue(REDRAWALL, 0);
@ -266,7 +266,7 @@ void delete_obj(int ok)
test_scene_constraints();
allqueue(REDRAWVIEW3D, 0);
redraw_test_buttons(BASACT);
redraw_test_buttons(OBACT);
allqueue (REDRAWACTION, 0);
allqueue(REDRAWIPO, 0);
allqueue(REDRAWDATASELECT, 0);
@ -1437,12 +1437,13 @@ void enter_editmode(void)
make_editNurb();
}
allqueue(REDRAWBUTSEDIT, 0);
allqueue(REDRAWOOPS, 0);
countall();
if(ok) {
setcursor_space(SPACE_VIEW3D, CURSOR_EDIT);
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWVIEW3D, 1);
}
else G.obedit= 0;
@ -1542,9 +1543,10 @@ void exit_editmode(int freedata) /* freedata==0 at render, 1= freedata, 2= do un
setcursor_space(SPACE_VIEW3D, CURSOR_STD);
countall();
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWVIEW3D, 1);
allqueue(REDRAWBUTSEDIT, 0);
allqueue(REDRAWBUTSLOGIC, 0);
allqueue(REDRAWOOPS, 0);
}
scrarea_queue_headredraw(curarea);

@ -1948,8 +1948,7 @@ void setscreen(bScreen *sc)
/* patch for old files */
if(soops->v2d.cur.xmin==soops->v2d.cur.xmax) {
extern void init_v2d_oops(View2D*);
init_v2d_oops(&soops->v2d);
init_v2d_oops(sa, soops);
}
}
else if(sl->spacetype==SPACE_BUTS) {

@ -269,7 +269,6 @@ static void do_lasso_select_objects(short mcords[][2], short moves, short select
}
}
}
allqueue(REDRAWVIEW3D, 0);
}
static void lasso_select_boundbox(rcti *rect, short mcords[][2], short moves)
@ -382,8 +381,6 @@ static void do_lasso_select_mesh(short mcords[][2], short moves, short select)
EM_free_backbuf_border();
EM_selectmode_flush();
allqueue(REDRAWVIEW3D, 0);
}
static void do_lasso_select(short mcords[][2], short moves, short select)
@ -396,6 +393,8 @@ static void do_lasso_select(short mcords[][2], short moves, short select)
BIF_undo_push("Lasso select");
allqueue(REDRAWVIEW3D, 0);
countall();
}
/* un-draws and draws again */
@ -825,7 +824,7 @@ void set_active_base(Base *base)
BASACT= base;
/* signals to buttons */
redraw_test_buttons(base);
redraw_test_buttons(base->object);
set_active_group();

@ -430,8 +430,7 @@ void do_info_buttons(unsigned short event)
case B_INFOSCE: /* menu select scene */
if( G.obedit) {
error("Unable to perform function in EditMode");
return;
exit_editmode(2);
}
if( G.curscreen->scenenr== -2) {
if(curarea->winy <50) {

@ -58,14 +58,17 @@
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BIF_gl.h"
#include "BIF_interface.h"
#include "BIF_resources.h"
#include "BIF_screen.h"
#include "BIF_editoops.h"
#include "BIF_oops.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BIF_space.h"
#include "BSE_drawipo.h"
#include "BSE_drawoops.h"
#include "BSE_headerbuttons.h"
@ -118,25 +121,45 @@ static void do_oops_viewmenu(void *arg, int event)
case 3: /* Maximize Window */
/* using event B_FULL */
break;
case 4: /* show outliner */
{
SpaceOops *soops= curarea->spacedata.first;
if(soops->type==SO_OOPS) soops->type= SO_OUTLINER;
else soops->type= SO_OOPS;
init_v2d_oops(curarea, soops);
scrarea_queue_winredraw(curarea);
}
break;
}
}
static uiBlock *oops_viewmenu(void *arg_unused)
{
/* static short tog=0; */
SpaceOops *soops= curarea->spacedata.first;
uiBlock *block;
short yco= 0, menuwidth=120;
block= uiNewBlock(&curarea->uiblocks, "oops_viewmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
uiBlockSetButmFunc(block, do_oops_viewmenu, NULL);
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shuffle Selected Blocks|Shift S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shrink Selected Blocks|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
if(soops->type==SO_OOPS) {
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Outliner", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
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, "View All|Home", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shuffle Selected Blocks|Shift S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shrink Selected Blocks|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View All|Home", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
}
else {
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Oops Schematic", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
}
if(!curarea->full) uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Maximize Window|Ctrl UpArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
else uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Tile Window|Ctrl DownArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
@ -282,66 +305,70 @@ void oops_buttons(void)
xco+=XIC;
if((curarea->flag & HEADER_NO_PULLDOWN)==0) {
/* pull down menus */
/* pull down menus */
uiBlockSetEmboss(block, UI_EMBOSSP);
xmax= GetButStringLength("View");
uiDefPulldownBut(block, oops_viewmenu, NULL, "View", xco, -2, xmax-3, 24, "");
xco+= xmax;
xmax= GetButStringLength("Select");
uiDefPulldownBut(block, oops_selectmenu, NULL, "Select", xco, -2, xmax-3, 24, "");
xco+= xmax;
xmax= GetButStringLength("Block");
uiDefPulldownBut(block, oops_blockmenu, NULL, "Block", xco, -2, xmax-3, 24, "");
xco+= xmax;
if(soops->type==SO_OOPS) {
xmax= GetButStringLength("Select");
uiDefPulldownBut(block, oops_selectmenu, NULL, "Select", xco, -2, xmax-3, 24, "");
xco+= xmax;
xmax= GetButStringLength("Block");
uiDefPulldownBut(block, oops_blockmenu, NULL, "Block", xco, -2, xmax-3, 24, "");
xco+= xmax;
}
}
uiBlockSetEmboss(block, UI_EMBOSSX);
xco+= 8;
/* ZOOM and BORDER */
uiBlockBeginAlign(block);
uiDefIconButI(block, TOG, B_VIEW2DZOOM, ICON_VIEWZOOM, (short)(xco),0,XIC,YIC, &viewmovetemp, 0, 0, 0, 0, "Zooms view (Ctrl MiddleMouse)");
uiDefIconBut(block, BUT, B_IPOBORDER, ICON_BORDERMOVE, (short)(xco+=XIC),0,XIC,YIC, 0, 0, 0, 0, 0, "Zooms view to area");
uiBlockEndAlign(block);
xco+= 8;
/* VISIBLE */
uiBlockBeginAlign(block);
uiDefButS(block, TOG|BIT|10,B_NEWOOPS, "Layer", (short)(xco+=XIC),0,XIC+20,YIC, &soops->visiflag, 0, 0, 0, 0, "Only show object datablocks on visible layers");
xco+= 20;
uiDefIconButS(block, TOG|BIT|0, B_NEWOOPS, ICON_SCENE_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Scene datablocks");
uiDefIconButS(block, TOG|BIT|1, B_NEWOOPS, ICON_OBJECT_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Object datablocks");
uiDefIconButS(block, TOG|BIT|2, B_NEWOOPS, ICON_MESH_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Mesh datablocks");
uiDefIconButS(block, TOG|BIT|3, B_NEWOOPS, ICON_CURVE_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Curve/Surface/Font datablocks");
uiDefIconButS(block, TOG|BIT|4, B_NEWOOPS, ICON_MBALL_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Metaball datablocks");
uiDefIconButS(block, TOG|BIT|5, B_NEWOOPS, ICON_LATTICE_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Lattice datablocks");
uiDefIconButS(block, TOG|BIT|6, B_NEWOOPS, ICON_LAMP_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Lamp datablocks");
uiDefIconButS(block, TOG|BIT|7, B_NEWOOPS, ICON_MATERIAL_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Material datablocks");
uiDefIconButS(block, TOG|BIT|8, B_NEWOOPS, ICON_TEXTURE_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Texture datablocks");
uiDefIconButS(block, TOG|BIT|9, B_NEWOOPS, ICON_IPO_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Ipo datablocks");
uiDefIconButS(block, TOG|BIT|12, B_NEWOOPS, ICON_IMAGE_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Image datablocks");
uiDefIconButS(block, TOG|BIT|11, B_NEWOOPS, ICON_LIBRARY_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Library datablocks");
uiBlockEndAlign(block);
/* name */
if(G.soops->lockpoin) {
oops= G.soops->lockpoin;
if(oops->type==ID_LI) strcpy(naam, ((Library *)oops->id)->name);
else strcpy(naam, oops->id->name);
if(soops->type==SO_OOPS) {
/* ZOOM and BORDER */
uiBlockBeginAlign(block);
uiDefIconButI(block, TOG, B_VIEW2DZOOM, ICON_VIEWZOOM, (short)(xco),0,XIC,YIC, &viewmovetemp, 0, 0, 0, 0, "Zooms view (Ctrl MiddleMouse)");
uiDefIconBut(block, BUT, B_IPOBORDER, ICON_BORDERMOVE, (short)(xco+=XIC),0,XIC,YIC, 0, 0, 0, 0, 0, "Zooms view to area");
uiBlockEndAlign(block);
cpack(0x0);
glRasterPos2i(xco+=XIC+10, 5);
BMF_DrawString(uiBlockGetCurFont(block), naam);
xco+= 8;
/* VISIBLE */
uiBlockBeginAlign(block);
uiDefButS(block, TOG|BIT|10,B_NEWOOPS, "Layer", (short)(xco+=XIC),0,XIC+20,YIC, &soops->visiflag, 0, 0, 0, 0, "Only show object datablocks on visible layers");
xco+= 20;
uiDefIconButS(block, TOG|BIT|0, B_NEWOOPS, ICON_SCENE_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Scene datablocks");
uiDefIconButS(block, TOG|BIT|1, B_NEWOOPS, ICON_OBJECT_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Object datablocks");
uiDefIconButS(block, TOG|BIT|2, B_NEWOOPS, ICON_MESH_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Mesh datablocks");
uiDefIconButS(block, TOG|BIT|3, B_NEWOOPS, ICON_CURVE_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Curve/Surface/Font datablocks");
uiDefIconButS(block, TOG|BIT|4, B_NEWOOPS, ICON_MBALL_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Metaball datablocks");
uiDefIconButS(block, TOG|BIT|5, B_NEWOOPS, ICON_LATTICE_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Lattice datablocks");
uiDefIconButS(block, TOG|BIT|6, B_NEWOOPS, ICON_LAMP_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Lamp datablocks");
uiDefIconButS(block, TOG|BIT|7, B_NEWOOPS, ICON_MATERIAL_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Material datablocks");
uiDefIconButS(block, TOG|BIT|8, B_NEWOOPS, ICON_TEXTURE_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Texture datablocks");
uiDefIconButS(block, TOG|BIT|9, B_NEWOOPS, ICON_IPO_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Ipo datablocks");
uiDefIconButS(block, TOG|BIT|12, B_NEWOOPS, ICON_IMAGE_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Image datablocks");
uiDefIconButS(block, TOG|BIT|11, B_NEWOOPS, ICON_LIBRARY_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Displays Library datablocks");
uiBlockEndAlign(block);
/* name */
if(G.soops->lockpoin) {
oops= G.soops->lockpoin;
if(oops->type==ID_LI) strcpy(naam, ((Library *)oops->id)->name);
else strcpy(naam, oops->id->name);
cpack(0x0);
glRasterPos2i(xco+=XIC+10, 5);
BMF_DrawString(uiBlockGetCurFont(block), naam);
}
}
else {
uiDefButS(block, MENU, B_REDR, "Outliner Display%t|All Scenes %x0|Current Scene %x1|Visible Layers %x2|Selected %x3|Active %x4", xco, 0, 100, 20, &soops->outlinevis, 0, 0, 0, 0, "");
}
/* always do as last */
curarea->headbutlen= xco+2*XIC;

@ -797,7 +797,6 @@ void do_global_buttons(unsigned short event)
if(idtest!=id) {
assign_material(ob, (Material *)idtest, ob->actcol);
allqueue(REDRAWBUTSHEAD, 0);
allqueue(REDRAWBUTSSHADING, 0);
allqueue(REDRAWIPO, 0);
BIF_preview_changed(G.buts);
@ -813,9 +812,9 @@ void do_global_buttons(unsigned short event)
ma= give_current_material(ob, ob->actcol);
if(ma) {
assign_material(ob, 0, ob->actcol);
allqueue(REDRAWBUTSHEAD, 0);
allqueue(REDRAWBUTSSHADING, 0);
allqueue(REDRAWIPO, 0);
allqueue(REDRAWOOPS, 0);
BIF_preview_changed(G.buts);
}
}
@ -922,9 +921,9 @@ void do_global_buttons(unsigned short event)
id_us_plus(idtest);
if(id) id->us--;
allqueue(REDRAWBUTSHEAD, 0);
allqueue(REDRAWBUTSSHADING, 0);
allqueue(REDRAWIPO, 0);
allqueue(REDRAWOOPS, 0);
BIF_preview_changed(G.buts);
}
}
@ -1206,9 +1205,9 @@ void do_global_buttons(unsigned short event)
id_us_plus(idtest);
if(id) id->us--;
allqueue(REDRAWBUTSHEAD, 0);
allqueue(REDRAWBUTSSHADING, 0);
allqueue(REDRAWIPO, 0);
allqueue(REDRAWOOPS, 0);
BIF_preview_changed(G.buts);
}
break;
@ -1271,9 +1270,9 @@ void do_global_buttons(unsigned short event)
id_us_plus(idtest);
if(id) id->us--;
allqueue(REDRAWBUTSHEAD, 0);
allqueue(REDRAWBUTSSHADING, 0);
allqueue(REDRAWIPO, 0);
allqueue(REDRAWOOPS, 0);
BIF_preview_changed(G.buts);
}
}
@ -1309,10 +1308,10 @@ void do_global_buttons(unsigned short event)
id_us_plus(idtest);
if(id) id->us--;
allqueue(REDRAWBUTSHEAD, 0);
allqueue(REDRAWBUTSSHADING, 0);
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWIPO, 0);
allqueue(REDRAWOOPS, 0);
BIF_preview_changed(G.buts);
}
break;
@ -1366,9 +1365,9 @@ void do_global_buttons(unsigned short event)
id_us_plus(idtest);
if(id) id->us--;
allqueue(REDRAWBUTSHEAD, 0);
allqueue(REDRAWBUTSSHADING, 0);
allqueue(REDRAWIPO, 0);
allqueue(REDRAWOOPS, 0);
BIF_preview_changed(G.buts);
}
}
@ -1382,29 +1381,28 @@ void do_global_buttons(unsigned short event)
case B_AUTOMATNAME:
automatname(G.buts->lockpoin);
allqueue(REDRAWBUTSHEAD, 0);
allqueue(REDRAWBUTSSHADING, 0);
allqueue(REDRAWOOPS, 0);
break;
case B_AUTOTEXNAME:
if(G.buts->mainb==CONTEXT_SHADING) {
if(G.buts->tab[CONTEXT_SHADING]==TAB_SHADING_TEX) {
autotexname(G.buts->lockpoin);
allqueue(REDRAWBUTSSHADING, 0);
}
else if(G.buts->tab[CONTEXT_SHADING]==TAB_SHADING_MAT) {
ma= G.buts->lockpoin;
if(ma->mtex[ ma->texact]) autotexname(ma->mtex[ma->texact]->tex);
allqueue(REDRAWBUTSSHADING, 0);
}
else if(G.buts->tab[CONTEXT_SHADING]==TAB_SHADING_WORLD) {
wrld= G.buts->lockpoin;
if(wrld->mtex[ wrld->texact]) autotexname(wrld->mtex[wrld->texact]->tex);
allqueue(REDRAWBUTSSHADING, 0);
}
else if(G.buts->tab[CONTEXT_SHADING]==TAB_SHADING_LAMP) {
la= G.buts->lockpoin;
if(la->mtex[ la->texact]) autotexname(la->mtex[la->texact]->tex);
allqueue(REDRAWBUTSSHADING, 0);
}
allqueue(REDRAWBUTSSHADING, 0);
allqueue(REDRAWOOPS, 0);
}
break;
@ -1591,7 +1589,6 @@ void do_global_buttons(unsigned short event)
/* redraw because name has changed: new pup */
scrarea_queue_headredraw(curarea);
allqueue(REDRAWBUTSHEAD, 0);
allqueue(REDRAWINFO, 1);
allqueue(REDRAWOOPS, 1);
/* name scene also in set PUPmenu */

@ -882,6 +882,11 @@ static void ui_draw_panel_header(uiBlock *block)
if(panel->control & UI_PNL_CLOSE) pnl_icons+= PNL_ICON;
if(nr==1) {
// full header
BIF_ThemeColorShade(TH_HEADER, -30);
uiSetRoundBox(3);
uiRoundBox(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 8);
/* active tab */
/* draw text label */
BIF_ThemeColor(TH_TEXT_HI);
@ -890,6 +895,11 @@ static void ui_draw_panel_header(uiBlock *block)
return;
}
// tabbed, full header brighter
BIF_ThemeColorShade(TH_HEADER, 0);
uiSetRoundBox(3);
uiRoundBox(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 8);
a= 0;
width= (panel->sizex - 3 - pnl_icons - PNL_ICON)/nr;
pa= curarea->panels.first;
@ -900,11 +910,11 @@ static void ui_draw_panel_header(uiBlock *block)
/* draw the active tab */
uiSetRoundBox(3);
BIF_ThemeColorShade(TH_HEADER, -3);
BIF_ThemeColorShade(TH_HEADER, -30);
uiRoundBox(2+pnl_icons+a*width, panel->sizey-1, pnl_icons+(a+1)*width, panel->sizey+PNL_HEADER-3, 8);
/* draw the active text label */
BIF_ThemeColor(TH_TEXT);
BIF_ThemeColor(TH_TEXT_HI);
ui_rasterpos_safe(16+pnl_icons+a*width, panel->sizey+4, block->aspect);
str= ui_block_cut_str(block, pa->panelname, (short)(width-10));
BIF_DrawString(block->curfont, str, (U.transopts & USER_TR_BUTTONS));
@ -914,11 +924,11 @@ static void ui_draw_panel_header(uiBlock *block)
else if(pa->paneltab==panel) {
/* draw an inactive tab */
uiSetRoundBox(3);
BIF_ThemeColorShade(TH_HEADER, -60);
BIF_ThemeColorShade(TH_HEADER, -10);
uiRoundBox(2+pnl_icons+a*width, panel->sizey, pnl_icons+(a+1)*width, panel->sizey+PNL_HEADER-3, 8);
/* draw an inactive tab label */
BIF_ThemeColorShade(TH_TEXT_HI, -40);
BIF_ThemeColor(TH_TEXT);
ui_rasterpos_safe(16+pnl_icons+a*width, panel->sizey+4, block->aspect);
str= ui_block_cut_str(block, pa->panelname, (short)(width-10));
BIF_DrawString(block->curfont, str, (U.transopts & USER_TR_BUTTONS));
@ -1050,10 +1060,6 @@ void ui_draw_panel(uiBlock *block)
}
/* floating panel */
else if(panel->control & UI_PNL_TRANSP) {
BIF_ThemeColorShade(TH_HEADER, -30);
uiSetRoundBox(3);
uiRoundBox(block->minx, block->maxy, block->maxx, block->maxy+PNL_HEADER, 8);
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glEnable(GL_BLEND);
@ -1375,9 +1381,12 @@ void uiDrawBlocksPanels(ScrArea *sa, int re_align)
if(minx<0.0) dx= -minx;
else if(maxx > (float)sa->winx) dx= sa->winx-maxx;
if( minx + dx < 0.0) dx= -minx; // when panel cant fit, put it fixed here
if(miny<0.0) dy= -miny;
else if(maxy > (float)sa->winy) dy= sa->winy-maxy;
if( miny + dy < 0.0) dy= -miny; // when panel cant fit, put it fixed here
block->panel->ofsx+= dx/sl->blockscale;
block->panel->ofsy+= dy/sl->blockscale;

@ -61,6 +61,7 @@
#include "BIF_toolbox.h"
#include "BIF_oops.h"
#include "BIF_drawoops.h"
#include "BIF_outliner.h"
#include "blendef.h"
#include "mydevice.h"
@ -633,6 +634,12 @@ void free_oopspace(SpaceOops *so)
BLI_remlink(&so->oops, oops);
free_oops(oops);
}
outliner_free_tree(&so->tree);
if(so->treestore) {
if(so->treestore->data) MEM_freeN(so->treestore->data);
MEM_freeN(so->treestore);
}
}
void add_material_oopslinks(Material *ma, Oops *oops, short flag)

File diff suppressed because it is too large Load Diff

@ -915,4 +915,13 @@ void BIF_GetThemeColor4ubv(int colorid, char *col)
col[3]= cp[3];
}
void BIF_GetThemeColorType4ubv(int colorid, int spacetype, char *col)
{
char *cp;
cp= BIF_ThemeGetColorPtr(theme_active, spacetype, colorid);
col[0]= cp[0];
col[1]= cp[1];
col[2]= cp[2];
col[3]= cp[3];
}

@ -81,6 +81,8 @@
#include "BKE_scene.h"
#include "BKE_utildefines.h"
#include "BIF_spacetypes.h" // first, nasty dependency with typedef
#include "BIF_butspace.h"
#include "BIF_drawimage.h"
#include "BIF_drawseq.h"
@ -93,6 +95,7 @@
#include "BIF_editlattice.h"
#include "BIF_editmesh.h"
#include "BIF_editmode_undo.h"
#include "BIF_editnla.h"
#include "BIF_editoops.h"
#include "BIF_editseq.h"
#include "BIF_editsima.h"
@ -104,10 +107,10 @@
#include "BIF_meshtools.h"
#include "BIF_mywindow.h"
#include "BIF_oops.h"
#include "BIF_outliner.h"
#include "BIF_resources.h"
#include "BIF_screen.h"
#include "BIF_space.h"
#include "BIF_spacetypes.h"
#include "BIF_toets.h"
#include "BIF_toolbox.h"
#include "BIF_usiblender.h"
@ -713,7 +716,7 @@ void BIF_undo_menu(void)
/* *************** */
void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
{
unsigned short event= evt->event;
short val= evt->val;
@ -1707,7 +1710,7 @@ void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
}
void initview3d(ScrArea *sa)
static void initview3d(ScrArea *sa)
{
View3D *vd;
@ -1750,7 +1753,7 @@ static void changeview2dspace(ScrArea *sa, void *spacedata)
myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax);
}
void winqreadipospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
static void winqreadipospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
{
extern void do_ipobuts(unsigned short event); // drawipo.c
unsigned short event= evt->event;
@ -2781,7 +2784,7 @@ void drawinfospace(ScrArea *sa, void *spacedata)
}
void winqreadinfospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
static void winqreadinfospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
{
unsigned short event= evt->event;
short val= evt->val;
@ -2855,7 +2858,7 @@ void winqreadinfospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
}
void init_infospace(ScrArea *sa)
static void init_infospace(ScrArea *sa)
{
SpaceInfo *sinfo;
@ -2877,7 +2880,7 @@ static void changebutspace(ScrArea *sa, void *spacedata)
myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax);
}
void winqreadbutspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
static void winqreadbutspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
{
unsigned short event= evt->event;
short val= evt->val;
@ -3000,7 +3003,7 @@ void test_butspace(void)
G.buts->v2d.tot.ymin= MIN2(0.0, blocksmin-10.0);
}
void init_butspace(ScrArea *sa)
static void init_butspace(ScrArea *sa)
{
SpaceButs *buts;
@ -3020,7 +3023,7 @@ void extern_set_butspace(int fkey)
ScrArea *sa;
SpaceButs *sbuts;
/* when a f-key pressed: closest button window is initialized */
/* when a f-key pressed: 'closest' button window is initialized */
if(curarea->spacetype==SPACE_BUTS) sa= curarea;
else {
/* find area */
@ -3073,7 +3076,7 @@ void extern_set_butspace(int fkey)
/* extern void drawseqspace(ScrArea *sa, void *spacedata); BIF_drawseq.h */
void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
{
unsigned short event= evt->event;
short val= evt->val;
@ -3283,7 +3286,7 @@ void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
void init_seqspace(ScrArea *sa)
static void init_seqspace(ScrArea *sa)
{
SpaceSeq *sseq;
@ -3334,7 +3337,7 @@ static void changeactionspace(ScrArea *sa, void *spacedata)
}
void init_actionspace(ScrArea *sa)
static void init_actionspace(ScrArea *sa)
{
SpaceAction *saction;
@ -3385,7 +3388,7 @@ void free_actionspace(SpaceAction *saction)
/* ******************** SPACE: FILE ********************** */
void init_filespace(ScrArea *sa)
static void init_filespace(ScrArea *sa)
{
SpaceFile *sfile;
@ -3398,7 +3401,7 @@ void init_filespace(ScrArea *sa)
sfile->spacetype= SPACE_FILE;
}
void init_textspace(ScrArea *sa)
static void init_textspace(ScrArea *sa)
{
SpaceText *st;
@ -3417,7 +3420,7 @@ void init_textspace(ScrArea *sa)
st->top= 0;
}
void init_scriptspace(ScrArea *sa)
static void init_scriptspace(ScrArea *sa)
{
SpaceScript *sc;
@ -3430,7 +3433,7 @@ void init_scriptspace(ScrArea *sa)
sc->flags = 0;
}
void init_imaselspace(ScrArea *sa)
static void init_imaselspace(ScrArea *sa)
{
SpaceImaSel *simasel;
@ -3469,7 +3472,7 @@ void init_imaselspace(ScrArea *sa)
extern void drawsoundspace(ScrArea *sa, void *spacedata);
extern void winqreadsoundspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
void init_soundspace(ScrArea *sa)
static void init_soundspace(ScrArea *sa)
{
SpaceSound *ssound;
@ -3517,7 +3520,7 @@ void free_soundspace(SpaceSound *ssound)
/* extern void drawimagespace(ScrArea *sa, void *spacedata); BIF_drawimage.h */
void winqreadimagespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
static void winqreadimagespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
{
unsigned short event= evt->event;
short val= evt->val;
@ -3746,7 +3749,7 @@ void winqreadimagespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
void init_imagespace(ScrArea *sa)
static void init_imagespace(ScrArea *sa)
{
SpaceImage *sima;
@ -3772,7 +3775,7 @@ extern void winqreadimaselspace(struct ScrArea *sa, void *spacedata, struct BWin
extern void drawoopsspace(ScrArea *sa, void *spacedata);
void winqreadoopsspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
static void winqreadoopsspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
{
unsigned short event= evt->event;
short val= evt->val;
@ -3796,147 +3799,202 @@ void winqreadoopsspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if (U.flag & USER_NONUMPAD) {
event= convert_for_nonumpad(event);
}
switch(event) {
case LEFTMOUSE:
gesture();
break;
case MIDDLEMOUSE:
case WHEELUPMOUSE:
case WHEELDOWNMOUSE:
view2dmove(event); /* in drawipo.c */
break;
case RIGHTMOUSE:
mouse_select_oops();
break;
case PADPLUSKEY:
dx= 0.1154*(v2d->cur.xmax-v2d->cur.xmin);
dy= 0.1154*(v2d->cur.ymax-v2d->cur.ymin);
v2d->cur.xmin+= dx;
v2d->cur.xmax-= dx;
v2d->cur.ymin+= dy;
v2d->cur.ymax-= dy;
test_view2d(G.v2d, curarea->winx, curarea->winy);
scrarea_queue_winredraw(curarea);
break;
case PADMINUS:
dx= 0.15*(v2d->cur.xmax-v2d->cur.xmin);
dy= 0.15*(v2d->cur.ymax-v2d->cur.ymin);
v2d->cur.xmin-= dx;
v2d->cur.xmax+= dx;
v2d->cur.ymin-= dy;
v2d->cur.ymax+= dy;
test_view2d(G.v2d, curarea->winx, curarea->winy);
scrarea_queue_winredraw(curarea);
break;
if(soops->type==SO_OUTLINER) {
switch(event) {
case LEFTMOUSE:
outliner_mouse_event(sa, event);
break;
case MIDDLEMOUSE:
case WHEELUPMOUSE:
case WHEELDOWNMOUSE:
view2dmove(event); /* in drawipo.c */
break;
case AKEY:
outliner_toggle_visible(sa);
break;
case HOMEKEY:
if((G.qual==0))
do_oops_buttons(B_OOPSHOME);
break;
case RETKEY:
case PADENTER:
outliner_mouse_event(sa, event);
break;
case PERIODKEY:
case PADPERIOD:
outliner_show_active(sa);
break;
}
}
else {
switch(event) {
case LEFTMOUSE:
gesture();
break;
case MIDDLEMOUSE:
case WHEELUPMOUSE:
case WHEELDOWNMOUSE:
view2dmove(event); /* in drawipo.c */
break;
case RIGHTMOUSE:
mouse_select_oops();
break;
case PADPLUSKEY:
case AKEY:
if((G.qual==0)) {
swap_select_all_oops();
dx= 0.1154*(v2d->cur.xmax-v2d->cur.xmin);
dy= 0.1154*(v2d->cur.ymax-v2d->cur.ymin);
v2d->cur.xmin+= dx;
v2d->cur.xmax-= dx;
v2d->cur.ymin+= dy;
v2d->cur.ymax-= dy;
test_view2d(G.v2d, curarea->winx, curarea->winy);
scrarea_queue_winredraw(curarea);
}
break;
case BKEY:
if((G.qual==0))
borderselect_oops();
break;
case GKEY:
if((G.qual==0))
transform_oops('g');
break;
case LKEY:
if((G.qual==LR_SHIFTKEY))
select_backlinked_oops();
else if((G.qual==0))
select_linked_oops();
break;
case SKEY:
if((G.qual==LR_ALTKEY)) {
if (okee("Shrink blocks")) {
shrink_oops();
break;
case PADMINUS:
dx= 0.15*(v2d->cur.xmax-v2d->cur.xmin);
dy= 0.15*(v2d->cur.ymax-v2d->cur.ymin);
v2d->cur.xmin-= dx;
v2d->cur.xmax+= dx;
v2d->cur.ymin-= dy;
v2d->cur.ymax+= dy;
test_view2d(G.v2d, curarea->winx, curarea->winy);
scrarea_queue_winredraw(curarea);
break;
case HOMEKEY:
if((G.qual==0))
do_oops_buttons(B_OOPSHOME);
break;
case AKEY:
if((G.qual==0)) {
swap_select_all_oops();
scrarea_queue_winredraw(curarea);
}
} else if((G.qual==LR_SHIFTKEY)) {
if (okee("Shuffle blocks")) {
shuffle_oops();
break;
case BKEY:
if((G.qual==0))
borderselect_oops();
break;
case GKEY:
if((G.qual==0))
transform_oops('g');
break;
case LKEY:
if((G.qual==LR_SHIFTKEY))
select_backlinked_oops();
else if((G.qual==0))
select_linked_oops();
break;
case SKEY:
if((G.qual==LR_ALTKEY)) {
if (okee("Shrink blocks")) {
shrink_oops();
}
} else if((G.qual==LR_SHIFTKEY)) {
if (okee("Shuffle blocks")) {
shuffle_oops();
}
} else if((G.qual==0)) {
transform_oops('s');
}
} else if((G.qual==0)) {
transform_oops('s');
}
break;
case PKEY:
if((G.qual==LR_CTRLKEY)) {
make_parent();
} else if((G.qual==LR_ALTKEY)) {
clear_parent();
}
break;
break;
case PKEY:
if((G.qual==LR_CTRLKEY)) {
make_parent();
} else if((G.qual==LR_ALTKEY)) {
clear_parent();
}
break;
case ONEKEY:
do_layer_buttons(0); break;
case TWOKEY:
do_layer_buttons(1); break;
case THREEKEY:
do_layer_buttons(2); break;
case FOURKEY:
do_layer_buttons(3); break;
case FIVEKEY:
do_layer_buttons(4); break;
case SIXKEY:
do_layer_buttons(5); break;
case SEVENKEY:
do_layer_buttons(6); break;
case EIGHTKEY:
do_layer_buttons(7); break;
case NINEKEY:
do_layer_buttons(8); break;
case ZEROKEY:
do_layer_buttons(9); break;
case MINUSKEY:
do_layer_buttons(10); break;
case EQUALKEY:
do_layer_buttons(11); break;
case ACCENTGRAVEKEY:
do_layer_buttons(-1); break;
case ONEKEY:
do_layer_buttons(0); break;
case TWOKEY:
do_layer_buttons(1); break;
case THREEKEY:
do_layer_buttons(2); break;
case FOURKEY:
do_layer_buttons(3); break;
case FIVEKEY:
do_layer_buttons(4); break;
case SIXKEY:
do_layer_buttons(5); break;
case SEVENKEY:
do_layer_buttons(6); break;
case EIGHTKEY:
do_layer_buttons(7); break;
case NINEKEY:
do_layer_buttons(8); break;
case ZEROKEY:
do_layer_buttons(9); break;
case MINUSKEY:
do_layer_buttons(10); break;
case EQUALKEY:
do_layer_buttons(11); break;
case ACCENTGRAVEKEY:
do_layer_buttons(-1); break;
}
}
}
void init_v2d_oops(View2D *v2d)
void init_v2d_oops(ScrArea *sa, SpaceOops *soops)
{
v2d->tot.xmin= -28.0;
v2d->tot.xmax= 28.0;
v2d->tot.ymin= -28.0;
v2d->tot.ymax= 28.0;
View2D *v2d= &soops->v2d;
v2d->cur= v2d->tot;
if(soops->type==SO_OUTLINER) {
/* outliner space is window size */
calc_scrollrcts(v2d, sa->winx, sa->winy);
v2d->tot.xmax= 0.0;
v2d->tot.ymax= 0.0;
v2d->tot.xmin= -(v2d->mask.xmax-v2d->mask.xmin);
v2d->tot.ymin= -(v2d->mask.ymax-v2d->mask.ymin);
v2d->cur= v2d->tot;
v2d->min[0]= v2d->tot.xmin;
v2d->min[1]= v2d->tot.ymin;
v2d->max[0]= v2d->tot.xmax;
v2d->max[1]= v2d->tot.ymax;
v2d->minzoom= 1.0;
v2d->maxzoom= 1.0;
v2d->scroll= L_SCROLL;
v2d->keepaspect= 1;
v2d->keepzoom= 1;
v2d->keeptot= 1;
}
else {
v2d->tot.xmin= -28.0;
v2d->tot.xmax= 28.0;
v2d->tot.ymin= -28.0;
v2d->tot.ymax= 28.0;
v2d->cur= v2d->tot;
v2d->min[0]= 10.0;
v2d->min[1]= 4.0;
v2d->min[0]= 10.0;
v2d->min[1]= 4.0;
v2d->max[0]= 320.0;
v2d->max[1]= 320.0;
v2d->minzoom= 0.01f;
v2d->maxzoom= 2.0;
/* v2d->scroll= L_SCROLL+B_SCROLL; */
v2d->scroll= 0;
v2d->keepaspect= 1;
v2d->keepzoom= 0;
v2d->keeptot= 0;
v2d->max[0]= 320.0;
v2d->max[1]= 320.0;
v2d->minzoom= 0.01f;
v2d->maxzoom= 2.0;
/* v2d->scroll= L_SCROLL+B_SCROLL; */
v2d->scroll= 0;
v2d->keepaspect= 1;
v2d->keepzoom= 0;
v2d->keeptot= 0;
}
}
void init_oopsspace(ScrArea *sa)
static void init_oopsspace(ScrArea *sa, int outliner)
{
SpaceOops *soops;
@ -3944,13 +4002,52 @@ void init_oopsspace(ScrArea *sa)
BLI_addhead(&sa->spacedata, soops);
soops->visiflag= OOPS_OB+OOPS_MA+OOPS_ME+OOPS_TE+OOPS_CU+OOPS_IP;
if(outliner) soops->type= SO_OUTLINER;
soops->spacetype= SPACE_OOPS;
soops->blockscale= 0.7;
init_v2d_oops(&soops->v2d);
init_v2d_oops(sa, soops);
}
/* ******************** SPACE: NLA ********************** */
static void init_nlaspace(ScrArea *sa)
{
SpaceNla *snla;
snla= MEM_callocN(sizeof(SpaceNla), "initnlaspace");
BLI_addhead(&sa->spacedata, snla);
snla->spacetype= SPACE_NLA;
snla->blockscale= 0.7;
snla->v2d.tot.xmin= 1.0;
snla->v2d.tot.ymin= 0.0;
snla->v2d.tot.xmax= 1000.0;
snla->v2d.tot.ymax= 1000.0;
snla->v2d.cur.xmin= -5.0;
snla->v2d.cur.ymin= 0.0;
snla->v2d.cur.xmax= 65.0;
snla->v2d.cur.ymax= 1000.0;
snla->v2d.min[0]= 0.0;
snla->v2d.min[1]= 0.0;
snla->v2d.max[0]= 1000.0;
snla->v2d.max[1]= 1000.0;
snla->v2d.minzoom= 0.1F;
snla->v2d.maxzoom= 50;
snla->v2d.scroll= R_SCROLL+B_SCROLL;
snla->v2d.keepaspect= 0;
snla->v2d.keepzoom= V2D_LOCKZOOM_Y;
snla->v2d.keeptot= 0;
snla->lock = 0;
}
/* ******************** SPACE: PAINT ********************** */
/* ******************** SPACE: Text ********************** */
@ -3967,6 +4064,10 @@ extern void winqreadscriptspace(struct ScrArea *sa, void *spacedata, struct BWin
void newspace(ScrArea *sa, int type)
{
int xtra= type & 256; // hack to enforce outliner with hotkey from toets.c
type &= ~256;
if(type>=0) {
if(sa->spacetype != type) {
SpaceLink *sl;
@ -4012,7 +4113,7 @@ void newspace(ScrArea *sa, int type)
else if(type==SPACE_IMASEL)
init_imaselspace(sa);
else if(type==SPACE_OOPS)
init_oopsspace(sa);
init_oopsspace(sa, xtra);
else if(type==SPACE_ACTION)
init_actionspace(sa);
else if(type==SPACE_TEXT)
@ -4032,8 +4133,8 @@ void newspace(ScrArea *sa, int type)
/* exception: filespace */
if(curarea->spacetype==SPACE_FILE) {
SpaceFile *sfile= curarea->spacedata.first;
if(sa->spacetype==SPACE_FILE) {
SpaceFile *sfile= sa->spacedata.first;
if(sfile->type==FILE_MAIN) {
freefilelist(sfile);
@ -4046,11 +4147,20 @@ void newspace(ScrArea *sa, int type)
if(sfile->filelist) test_flags_file(sfile);
}
/* exception: imasel space */
else if(curarea->spacetype==SPACE_IMASEL) {
SpaceImaSel *simasel= curarea->spacedata.first;
else if(sa->spacetype==SPACE_IMASEL) {
SpaceImaSel *simasel= sa->spacedata.first;
simasel->returnfunc= 0;
simasel->title[0]= 0;
}
else if(sa->spacetype==SPACE_OOPS) {
SpaceOops *so= sa->spacedata.first;
if(xtra && so->type!=SO_OUTLINER) {
so->type= SO_OUTLINER;
init_v2d_oops(sa, so);
scrarea_queue_winredraw(sa);
scrarea_queue_headredraw(sa);
}
}
}
void freespacelist(ListBase *lb)
@ -4127,7 +4237,9 @@ void duplicatespacelist(ScrArea *newarea, ListBase *lb1, ListBase *lb2)
}
else if(sl->spacetype==SPACE_OOPS) {
SpaceOops *so= (SpaceOops *)sl;
so->oops.first= so->oops.last= 0;
so->oops.first= so->oops.last= NULL;
so->tree.first= so->tree.last= NULL;
so->treestore= NULL;
}
else if(sl->spacetype==SPACE_IMASEL) {
check_imasel_copy((SpaceImaSel *) sl);

@ -638,6 +638,10 @@ int blenderqread(unsigned short event, short val)
newspace(curarea, SPACE_OOPS);
return 0;
}
else if(G.qual==(LR_SHIFTKEY|LR_ALTKEY)) {
newspace(curarea, SPACE_OOPS+256);
return 0;
}
else if(G.qual==0) {
extern_set_butspace(event);
}