Index: source/blender/makesdna/DNA_space_types.h =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/makesdna/DNA_space_types.h,v retrieving revision 1.56 diff -u -r1.56 DNA_space_types.h --- source/blender/makesdna/DNA_space_types.h 17 Jan 2007 03:24:21 -0000 1.56 +++ source/blender/makesdna/DNA_space_types.h 27 Mar 2007 23:12:24 -0000 @@ -529,16 +529,30 @@ #define OOPS_AR 8192 /* SpaceOops->outlinevis */ -#define SO_ALL_SCENES 0 -#define SO_CUR_SCENE 1 +#define SO_ALL_SCENES 0 +#define SO_CUR_SCENE 1 #define SO_VISIBLE 2 #define SO_SELECTED 3 #define SO_ACTIVE 4 -#define SO_SAME_TYPE 5 +#define SO_SAME_TYPE 5 #define SO_GROUPS 6 -#define SO_LIBRARIES 7 +#define SO_LIBRARIES 7 #define SO_VERSE_SESSION 8 #define SO_VERSE_MS 9 + +/* SpaceOops->outlinevis By Type*/ +#define SO_EMPTY 10 +#define SO_MESH 11 +#define SO_CURVE 12 +#define SO_SURF 13 +#define SO_FONT 14 +#define SO_MBALL 15 +#define SO_LAMP 16 +#define SO_CAMERA 17 +#define SO_WAVE 18 +#define SO_LATTICE 19 +#define SO_ARMATURE 20 + /* SpaceOops->storeflag */ #define SO_TREESTORE_CLEANUP 1 Index: source/blender/src/outliner.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/src/outliner.c,v retrieving revision 1.99 diff -u -r1.99 outliner.c --- source/blender/src/outliner.c 21 Mar 2007 20:40:18 -0000 1.99 +++ source/blender/src/outliner.c 27 Mar 2007 23:12:35 -0000 @@ -923,6 +923,7 @@ Object *ob; TreeElement *te, *ten; TreeStoreElem *tselem; + int show_opened= soops->treestore==NULL; /* on first view, we open scenes */ #ifdef WITH_VERSE struct VerseSession *session; @@ -937,147 +938,274 @@ /* clear ob id.new flags */ for(ob= G.main->object.first; ob; ob= ob->id.next) ob->id.newid= NULL; + /* options */ - if(soops->outlinevis == SO_LIBRARIES) { - Library *lib; + + switch(soops->outlinevis) { + case SO_LIBRARIES: + { + Library *lib; + for(lib= G.main->library.first; lib; lib= lib->id.next) { + ten= outliner_add_element(soops, &soops->tree, lib, NULL, 0, 0); + lib->id.newid= (ID *)ten; + } + /* make hierarchy */ + ten= soops->tree.first; + while(ten) { + TreeElement *nten= ten->next, *par; + tselem= TREESTORE(ten); + lib= (Library *)tselem->id; + if(lib->parent) { + BLI_remlink(&soops->tree, ten); + par= (TreeElement *)lib->parent->id.newid; + BLI_addtail(&par->subtree, ten); + ten->parent= par; + } + ten= nten; + } + /* restore newid pointers */ + for(lib= G.main->library.first; lib; lib= lib->id.next) + lib->id.newid= NULL; + } + break; + + case SO_ALL_SCENES: + { + Scene *sce; + for(sce= G.main->scene.first; sce; sce= sce->id.next) { + te= outliner_add_element(soops, &soops->tree, sce, NULL, 0, 0); + tselem= TREESTORE(te); + if(sce==G.scene && show_opened) + tselem->flag &= ~TSE_CLOSED; + + for(base= sce->base.first; base; base= base->next) { + ten= outliner_add_element(soops, &te->subtree, base->object, te, 0, 0); + ten->directdata= base; + } + outliner_make_hierarchy(soops, &te->subtree); + /* clear id.newid, to prevent objects be inserted in wrong scenes (parent in other scene) */ + for(base= sce->base.first; base; base= base->next) base->object->id.newid= NULL; + } + } + break; + + case SO_CUR_SCENE: + outliner_add_scene_contents(soops, &soops->tree, G.scene, NULL); - for(lib= G.main->library.first; lib; lib= lib->id.next) { - ten= outliner_add_element(soops, &soops->tree, lib, NULL, 0, 0); - lib->id.newid= (ID *)ten; - } - /* make hierarchy */ - ten= soops->tree.first; - while(ten) { - TreeElement *nten= ten->next, *par; - tselem= TREESTORE(ten); - lib= (Library *)tselem->id; - if(lib->parent) { - BLI_remlink(&soops->tree, ten); - par= (TreeElement *)lib->parent->id.newid; - BLI_addtail(&par->subtree, ten); - ten->parent= par; - } - ten= nten; - } - /* restore newid pointers */ - for(lib= G.main->library.first; lib; lib= lib->id.next) - lib->id.newid= NULL; - - } - else if(soops->outlinevis == SO_ALL_SCENES) { - Scene *sce; - for(sce= G.main->scene.first; sce; sce= sce->id.next) { - te= outliner_add_element(soops, &soops->tree, sce, NULL, 0, 0); - tselem= TREESTORE(te); - if(sce==G.scene && show_opened) - tselem->flag &= ~TSE_CLOSED; - - for(base= sce->base.first; base; base= base->next) { - ten= outliner_add_element(soops, &te->subtree, base->object, te, 0, 0); + for(base= G.scene->base.first; base; base= base->next) { + ten= outliner_add_element(soops, &soops->tree, base->object, NULL, 0, 0); ten->directdata= base; } - outliner_make_hierarchy(soops, &te->subtree); - /* clear id.newid, to prevent objects be inserted in wrong scenes (parent in other scene) */ - for(base= sce->base.first; base; base= base->next) base->object->id.newid= NULL; - } - } - else if(soops->outlinevis == SO_CUR_SCENE) { - - outliner_add_scene_contents(soops, &soops->tree, G.scene, NULL); - - for(base= G.scene->base.first; base; base= base->next) { - ten= outliner_add_element(soops, &soops->tree, base->object, NULL, 0, 0); - ten->directdata= base; - } - outliner_make_hierarchy(soops, &soops->tree); - } - else if(soops->outlinevis == SO_VISIBLE) { - for(base= G.scene->base.first; base; base= base->next) { - if(base->lay & G.scene->lay) - outliner_add_element(soops, &soops->tree, base->object, NULL, 0, 0); - } - outliner_make_hierarchy(soops, &soops->tree); - } - else if(soops->outlinevis == SO_GROUPS) { - Group *group; - GroupObject *go; - - for(group= G.main->group.first; group; group= group->id.next) { - if(group->id.us) { - te= outliner_add_element(soops, &soops->tree, group, NULL, 0, 0); - tselem= TREESTORE(te); - - for(go= group->gobject.first; go; go= go->next) { - ten= outliner_add_element(soops, &te->subtree, go->ob, te, 0, 0); - ten->directdata= NULL; /* eh, why? */ + outliner_make_hierarchy(soops, &soops->tree); + break; + + case SO_VISIBLE: + for(base= G.scene->base.first; base; base= base->next) { + if(base->lay & G.scene->lay) + outliner_add_element(soops, &soops->tree, base->object, NULL, 0, 0); + } + outliner_make_hierarchy(soops, &soops->tree); + break; + + case SO_GROUPS: + { + Group *group; + GroupObject *go; + for(group= G.main->group.first; group; group= group->id.next) { + if(group->id.us) { + te= outliner_add_element(soops, &soops->tree, group, NULL, 0, 0); + tselem= TREESTORE(te); + + for(go= group->gobject.first; go; go= go->next) { + ten= outliner_add_element(soops, &te->subtree, go->ob, te, 0, 0); + ten->directdata= NULL; /* eh, why? */ + } + outliner_make_hierarchy(soops, &te->subtree); + /* clear id.newid, to prevent objects be inserted in wrong scenes (parent in other scene) */ + for(go= group->gobject.first; go; go= go->next) go->ob->id.newid= NULL; + } + } + } + break; + + case SO_SAME_TYPE: + { + Object *ob= OBACT; + + if(ob) { + for(base= G.scene->base.first; base; base= base->next) { + if(base->object->type==ob->type) { + ten= outliner_add_element(soops, &soops->tree, base->object, NULL, 0, 0); + ten->directdata= base; + } + } + outliner_make_hierarchy(soops, &soops->tree); } - outliner_make_hierarchy(soops, &te->subtree); - /* clear id.newid, to prevent objects be inserted in wrong scenes (parent in other scene) */ - for(go= group->gobject.first; go; go= go->next) go->ob->id.newid= NULL; } - } - } - else if(soops->outlinevis == SO_SAME_TYPE) { - Object *ob= OBACT; - if(ob) { + break; + + case SO_SELECTED: + for(base= G.scene->base.first; base; base= base->next) { + if(base->lay & G.scene->lay) { + if(base==BASACT || (base->flag & SELECT)) { + ten= outliner_add_element(soops, &soops->tree, base->object, NULL, 0, 0); + ten->directdata= base; + } + } + } + outliner_make_hierarchy(soops, &soops->tree); + break; + +#ifdef WITH_VERSE + case SO_VERSE_SESSION: + /* add all session to the "root" of hierarchy */ + for(session=session_list.first; session; session = session->next) { + struct VNode *vnode; + if(session->flag & VERSE_CONNECTED) { + te= outliner_add_element(soops, &soops->tree, session, NULL, ID_VS, 0); + /* add all object nodes as childreen of session */ + for(vnode=session->nodes.lb.first; vnode; vnode=vnode->next) { + if(vnode->type==V_NT_OBJECT) { + ten= outliner_add_element(soops, &te->subtree, vnode, te, ID_VN, 0); + ten->directdata= vnode; + } + else if(vnode->type==V_NT_BITMAP) { + ten= outliner_add_element(soops, &te->subtree, vnode, te, ID_VN, 0); + ten->directdata= vnode; + } + } + } + } + break; + + case SO_VERSE_MS: + te= outliner_add_element(soops, &soops->tree, "MS", NULL, ID_MS, 0); + if(server_list.first!=NULL) { + struct VerseServer *server; + /* add one main entry to root of hierarchy */ + for(server=server_list.first; server; server=server->next) { + ten= outliner_add_element(soops, &te->subtree, server, te, ID_SS, 0); + ten->directdata= server; + } + } + break; +#endif + +/*Show By Type */ + + case SO_EMPTY: for(base= G.scene->base.first; base; base= base->next) { - if(base->object->type==ob->type) { + if(base->object->type==OB_EMPTY) { ten= outliner_add_element(soops, &soops->tree, base->object, NULL, 0, 0); ten->directdata= base; } } + outliner_make_hierarchy(soops, &soops->tree); - } - } - else if(soops->outlinevis == SO_SELECTED) { - for(base= G.scene->base.first; base; base= base->next) { - if(base->lay & G.scene->lay) { - if(base==BASACT || (base->flag & SELECT)) { + break; + + case SO_MESH: + for(base= G.scene->base.first; base; base= base->next) { + if(base->object->type==OB_MESH) { ten= outliner_add_element(soops, &soops->tree, base->object, NULL, 0, 0); ten->directdata= base; } } - } - outliner_make_hierarchy(soops, &soops->tree); - } -#ifdef WITH_VERSE - else if(soops->outlinevis == SO_VERSE_SESSION) { - /* add all session to the "root" of hierarchy */ - for(session=session_list.first; session; session = session->next) { - struct VNode *vnode; - if(session->flag & VERSE_CONNECTED) { - te= outliner_add_element(soops, &soops->tree, session, NULL, ID_VS, 0); - /* add all object nodes as childreen of session */ - for(vnode=session->nodes.lb.first; vnode; vnode=vnode->next) { - if(vnode->type==V_NT_OBJECT) { - ten= outliner_add_element(soops, &te->subtree, vnode, te, ID_VN, 0); - ten->directdata= vnode; - } - else if(vnode->type==V_NT_BITMAP) { - ten= outliner_add_element(soops, &te->subtree, vnode, te, ID_VN, 0); - ten->directdata= vnode; - } + outliner_make_hierarchy(soops, &soops->tree); + break; + + case SO_CURVE: + for(base= G.scene->base.first; base; base= base->next) { + if(base->object->type==OB_CURVE) { + ten= outliner_add_element(soops, &soops->tree, base->object, NULL, 0, 0); + ten->directdata= base; } } - } - } - else if(soops->outlinevis == SO_VERSE_MS) { - te= outliner_add_element(soops, &soops->tree, "MS", NULL, ID_MS, 0); - if(server_list.first!=NULL) { - struct VerseServer *server; - /* add one main entry to root of hierarchy */ - for(server=server_list.first; server; server=server->next) { - ten= outliner_add_element(soops, &te->subtree, server, te, ID_SS, 0); - ten->directdata= server; + outliner_make_hierarchy(soops, &soops->tree); + break; + + case SO_SURF: + for(base= G.scene->base.first; base; base= base->next) { + if(base->object->type==OB_SURF) { + ten= outliner_add_element(soops, &soops->tree, base->object, NULL, 0, 0); + ten->directdata= base; + } } - } - } -#endif - else { - ten= outliner_add_element(soops, &soops->tree, OBACT, NULL, 0, 0); - if(ten) ten->directdata= BASACT; - } + outliner_make_hierarchy(soops, &soops->tree); + break; + + case SO_FONT: + for(base= G.scene->base.first; base; base= base->next) { + if(base->object->type==OB_FONT) { + ten= outliner_add_element(soops, &soops->tree, base->object, NULL, 0, 0); + ten->directdata= base; + } + } + outliner_make_hierarchy(soops, &soops->tree); + break; + case SO_MBALL: + for(base= G.scene->base.first; base; base= base->next) { + if(base->object->type==OB_MBALL) { + ten= outliner_add_element(soops, &soops->tree, base->object, NULL, 0, 0); + ten->directdata= base; + } + } + outliner_make_hierarchy(soops, &soops->tree); + break; + case SO_LAMP: + for(base= G.scene->base.first; base; base= base->next) { + if(base->object->type==OB_LAMP) { + ten= outliner_add_element(soops, &soops->tree, base->object, NULL, 0, 0); + ten->directdata= base; + } + } + outliner_make_hierarchy(soops, &soops->tree); + break; + + case SO_CAMERA: + for(base= G.scene->base.first; base; base= base->next) { + if(base->object->type==OB_CAMERA) { + ten= outliner_add_element(soops, &soops->tree, base->object, NULL, 0, 0); + ten->directdata= base; + } + } + outliner_make_hierarchy(soops, &soops->tree); + break; + case SO_WAVE: + for(base= G.scene->base.first; base; base= base->next) { + if(base->object->type==OB_WAVE) { + ten= outliner_add_element(soops, &soops->tree, base->object, NULL, 0, 0); + ten->directdata= base; + } + } + outliner_make_hierarchy(soops, &soops->tree); + break; + case SO_LATTICE: + for(base= G.scene->base.first; base; base= base->next) { + if(base->object->type==OB_LATTICE) { + ten= outliner_add_element(soops, &soops->tree, base->object, NULL, 0, 0); + ten->directdata= base; + } + } + outliner_make_hierarchy(soops, &soops->tree); + break; + + case SO_ARMATURE: + for(base= G.scene->base.first; base; base= base->next) { + if(base->object->type==OB_ARMATURE) { + ten= outliner_add_element(soops, &soops->tree, base->object, NULL, 0, 0); + ten->directdata= base; + } + } + outliner_make_hierarchy(soops, &soops->tree); + break; + + default: + ten= outliner_add_element(soops, &soops->tree, OBACT, NULL, 0, 0); + if(ten) ten->directdata= BASACT; + break; + } outliner_sort(soops, &soops->tree); } @@ -2258,6 +2386,21 @@ BIF_undo_push("Outliner show hierarchy"); } +void outliner_show_bytype(struct ScrArea *sa) +{ + short val; + SpaceOops *soops = sa->spacedata.first; + + val= pupmenu("Show By Type%t|Camera %x17|Armature %x20|Lamp %x16|Empty %x10|Mesh %x11|Curve %x12|Surface %x13|Lattice %x19|Metaball %x15|Wave %x18|Font %x14"); + + if(val>0) { + soops->outlinevis = val; + scrarea_queue_redraw(sa); + } +} + + static void do_outliner_select(SpaceOops *soops, ListBase *lb, float y1, float y2, short *selecting) { TreeElement *te; @@ -3250,7 +3393,7 @@ soops->v2d.mask.xmax-(OL_TOG_RESTRICT_VIEWX+SCROLLB), soops->v2d.cur.ymin); - /* render */ + /* selectr */ fdrawline(soops->v2d.mask.xmax-(OL_TOG_RESTRICT_SELECTX+SCROLLB), soops->v2d.tot.ymax, soops->v2d.mask.xmax-(OL_TOG_RESTRICT_SELECTX+SCROLLB), Index: source/blender/src/space.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/src/space.c,v retrieving revision 1.463 diff -u -r1.463 space.c --- source/blender/src/space.c 26 Mar 2007 11:24:52 -0000 1.463 +++ source/blender/src/space.c 27 Mar 2007 23:12:47 -0000 @@ -4945,6 +4945,9 @@ outliner_find_panel(sa, again, search_flags); } break; + case TKEY: + outliner_show_bytype(sa); + break; case XKEY: case DELKEY: outliner_del(sa);