Index: source/blender/makesdna/DNA_oops_types.h =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/makesdna/DNA_oops_types.h,v retrieving revision 1.11 diff -u -r1.11 DNA_oops_types.h --- source/blender/makesdna/DNA_oops_types.h 7 Nov 2006 14:25:58 -0000 1.11 +++ source/blender/makesdna/DNA_oops_types.h 24 Mar 2007 17:41:22 -0000 @@ -72,12 +72,13 @@ } OopsLink; /* oops->flag (1==SELECT) */ -#define OOPS_DOSELECT 2 -#define OOPS_REFER 4 +#define OOPS_DOSELECT 2 +#define OOPS_REFER 4 + /* TreeStoreElem->flag */ #define TSE_CLOSED 1 -#define TSE_SELECTED 2 +#define TSE_SELECTED 2 #define TSE_TEXTBUT 4 /* TreeStoreElem types in BIF_outliner.h */ 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 24 Mar 2007 17:41:23 -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 24 Mar 2007 17:41:46 -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,22 @@ 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|Empty %x10|Mesh %x11|Curve %x12|Surface %x13|Font %x14|Metaball %x15|Lamp %x16|Camera %x17|Wave %x18|Lattice %x19|Armature %x20"); + soops->outlinevis = val; + + scrarea_queue_redraw(sa); + + BIF_undo_push("Outliner show By Type"); +} + + + + static void do_outliner_select(SpaceOops *soops, ListBase *lb, float y1, float y2, short *selecting) { TreeElement *te; @@ -3250,7 +3394,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.461 diff -u -r1.461 space.c --- source/blender/src/space.c 24 Mar 2007 11:56:10 -0000 1.461 +++ source/blender/src/space.c 24 Mar 2007 17:42:00 -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);