Index: source/blender/include/BIF_oops.h =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/include/BIF_oops.h,v retrieving revision 1.5 diff -u -r1.5 BIF_oops.h --- source/blender/include/BIF_oops.h 27 Dec 2002 13:10:20 -0000 1.5 +++ source/blender/include/BIF_oops.h 4 May 2004 15:45:29 -0000 @@ -53,7 +53,7 @@ void add_texture_oops(struct Material *ma); void build_oops(void); struct Oops *find_oops(ID *id); -void free_oops(struct Oops *oops); /* ook oops zelf */ +void free_oops(struct Oops *oops, struct SpaceOops *so); /* ook oops zelf */ void free_oopspace(struct SpaceOops *so); void new_oops_location(struct Oops *); int oops_test_overlap(struct Oops *test); @@ -64,6 +64,9 @@ int test_oops(struct Oops *oops); void test_oopslink(struct OopsLink *ol); void test_oopslinko(struct OopsLink *ol); +void organize_oops(); +float hierarchy_position_oops(struct Oops *curoop); +void organize_hierarchy_oops(); #endif 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.19 diff -u -r1.19 DNA_space_types.h --- source/blender/makesdna/DNA_space_types.h 19 Apr 2004 22:05:36 -0000 1.19 +++ source/blender/makesdna/DNA_space_types.h 4 May 2004 15:45:32 -0000 @@ -190,6 +190,9 @@ View2D v2d; + int viewType; + int organizeType; /* added to keep the struct 8 bytes aligned */ + ListBase oops; short pin, visiflag, flag, rt; void *lockpoin; @@ -454,6 +457,14 @@ #define OOPS_LAY 1024 #define OOPS_LI 2048 #define OOPS_IM 4096 + +/* SpaceOopes->viewType */ +#define MANUAL_DRAW 1 +#define SELECTION_ONLY 2 + +/* SpaceOopes->organizeType */ +#define DEFAULT_ORGANIZER 1 +#define TREE_GRAPH 2 /* headerbuttons: 450-499 */ Index: source/blender/src/editoops.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/src/editoops.c,v retrieving revision 1.9 diff -u -r1.9 editoops.c --- source/blender/src/editoops.c 19 Nov 2003 22:00:13 -0000 1.9 +++ source/blender/src/editoops.c 4 May 2004 15:45:36 -0000 @@ -79,6 +79,7 @@ #include "blendef.h" #include "mydevice.h" +#define PHYSICAL_OBJECT(type) (type == OB_MESH) || (type == OB_CURVE) || (type == OB_SURF) || (type == OB_FONT) || (type == OB_MBALL) || (type == OB_LAMP) || (type == OB_CAMERA) typedef struct TransOops { float *loc; @@ -95,25 +96,29 @@ Object *ob; if(G.soops==0) return; - + if(G.soops->viewType == SELECTION_ONLY) return; oops= G.soops->oops.first; while(oops) { if(oops->hide==0) { if(oops->type==ID_OB) { ob= (Object *)oops->id; - if(oops->flag & SELECT) ob->flag |= SELECT; - else ob->flag &= ~SELECT; + if (PHYSICAL_OBJECT(ob->type)) { + if(oops->flag & SELECT) ob->flag |= SELECT; + else ob->flag &= ~SELECT; + } } } oops= oops->next; } base= FIRSTBASE; - while(base) { - if(base->flag != base->object->flag) { - base->flag= base->object->flag; - } - base= base->next; - } +// while(base) { +// if (PHYSICAL_OBJECT(base->object->type)) { +// if(base->flag != base->object->flag) { +// base->flag= base->object->flag; +// } +// } +// base= base->next; +// } allqueue(REDRAWVIEW3D, 0); allqueue(REDRAWOOPS, 0); Index: source/blender/src/header_oops.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/src/header_oops.c,v retrieving revision 1.7 diff -u -r1.7 header_oops.c --- source/blender/src/header_oops.c 26 Mar 2004 01:12:45 -0000 1.7 +++ source/blender/src/header_oops.c 4 May 2004 15:45:38 -0000 @@ -101,209 +101,229 @@ break; } } - -static void do_oops_viewmenu(void *arg, int event) -{ - - switch(event) { - case 0: /* Shuffle Selected Blocks */ - shuffle_oops(); - break; - case 1: /* Shrink Selected Blocks */ - shrink_oops(); - break; - case 2: /* View All */ - do_oops_buttons(B_OOPSHOME); - break; - case 3: /* Maximize Window */ - /* using event B_FULL */ - break; - } -} - -static uiBlock *oops_viewmenu(void *arg_unused) -{ -/* static short tog=0; */ - 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, ""); +static void do_oops_viewmenu(void *arg, int event) +{ + + switch(event) { + case 0: /* Shuffle Selected Blocks */ + shuffle_oops(); + break; + case 1: /* Shrink Selected Blocks */ + shrink_oops(); + break; + case 2: /* View All */ + do_oops_buttons(B_OOPSHOME); + break; + case 3: /* Maximize Window */ + /* using event B_FULL */ + break; + case 4: /* Tree Graph arrangement Mode */ + G.soops->organizeType = TREE_GRAPH; + build_oops(0); + break; + case 5: /* Masking:Default Mode */ + G.soops->viewType = MANUAL_DRAW; + build_oops(0); + break; + case 6: /* Masking:Selection Mode */ + G.soops->viewType = SELECTION_ONLY; + build_oops(0); + break; + + } +} + +static uiBlock *oops_viewmenu(void *arg_unused) +{ +/* static short tog=0; */ + 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, ""); + + 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, ""); + + 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, ""); + 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, ""); - - 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, ""); - - if(curarea->headertype==HEADERTOP) { - uiBlockSetDirection(block, UI_DOWN); - } - else { - uiBlockSetDirection(block, UI_TOP); - uiBlockFlipOrder(block); - } - - uiTextBoundsBlock(block, 50); - - return block; -} - - -static void do_oops_selectmenu(void *arg, int event) -{ - - switch(event) - { - case 0: /* Border Select */ - borderselect_oops(); - break; - case 1: /* Select/Deselect All */ - swap_select_all_oops(); - break; - case 2: /* Linked to Selected */ - select_linked_oops(); - break; - case 3: /* Users of Selected */ - select_backlinked_oops(); - break; - } -} - -static uiBlock *oops_selectmenu(void *arg_unused) -{ - uiBlock *block; - short yco= 0, menuwidth=120; - - block= uiNewBlock(&curarea->uiblocks, "oops_selectmenu", UI_EMBOSSP, UI_HELV, curarea->headwin); - uiBlockSetButmFunc(block, do_oops_selectmenu, NULL); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, 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, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, ""); - - uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); - - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Linked to Selected|L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, ""); - uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Users of Selected|Shift L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, ""); - - if(curarea->headertype==HEADERTOP) { - uiBlockSetDirection(block, UI_DOWN); - } - else { - uiBlockSetDirection(block, UI_TOP); - uiBlockFlipOrder(block); - } - - uiTextBoundsBlock(block, 50); - - return block; -} - - -void oops_buttons(void) -{ - SpaceOops *soops; - Oops *oops; - uiBlock *block; - short xco, xmax; - char naam[256]; - - soops= curarea->spacedata.first; - - sprintf(naam, "header %d", curarea->headwin); - block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSS, UI_HELV, curarea->headwin); - - if(area_is_active_area(curarea)) uiBlockSetCol(block, TH_HEADER); - else uiBlockSetCol(block, TH_HEADERDESEL); - - curarea->butspacetype= SPACE_OOPS; - - xco = 8; - - uiDefIconTextButC(block, ICONTEXTROW,B_NEWSPACE, ICON_VIEW3D, windowtype_pup(), xco,0,XIC+10,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Displays Current Window Type. Click for menu of available types."); - - xco+= XIC+14; - - uiBlockSetEmboss(block, UI_EMBOSSN); - if(curarea->flag & HEADER_NO_PULLDOWN) { - uiDefIconButS(block, TOG|BIT|0, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_RIGHT, - xco,2,XIC,YIC-2, - &(curarea->flag), 0, 0, 0, 0, "Show pulldown menus"); - } else { - uiDefIconButS(block, TOG|BIT|0, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_DOWN, - xco,2,XIC,YIC-2, - &(curarea->flag), 0, 0, 0, 0, "Hide pulldown menus"); - } - uiBlockSetEmboss(block, UI_EMBOSS); - xco+=XIC; - - if((curarea->flag & HEADER_NO_PULLDOWN)==0) { - /* pull down menus */ - uiBlockSetEmboss(block, UI_EMBOSSP); - - xmax= GetButStringLength("View"); - uiDefBlockBut(block, oops_viewmenu, NULL, "View", xco, -2, xmax-3, 24, ""); - xco+= xmax; - - xmax= GetButStringLength("Select"); - uiDefBlockBut(block, oops_selectmenu, NULL, "Select", xco, -2, xmax-3, 24, ""); - xco+= xmax; - - } - - uiBlockSetEmboss(block, UI_EMBOSSX); + + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hierarchy View", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "Set Oops to Left->Right Tree Arrangment"); + uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Masking:Default", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "Set Oops to manual arrangement"); + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Masking:Selection", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "Set Oops to dynamic selection based arrangement"); + + if(curarea->headertype==HEADERTOP) { + uiBlockSetDirection(block, UI_DOWN); + } + else { + uiBlockSetDirection(block, UI_TOP); + uiBlockFlipOrder(block); + } + + uiTextBoundsBlock(block, 50); + + return block; +} + + +static void do_oops_selectmenu(void *arg, int event) +{ + + switch(event) + { + case 0: /* Border Select */ + borderselect_oops(); + break; + case 1: /* Select/Deselect All */ + swap_select_all_oops(); + break; + case 2: /* Linked to Selected */ + select_linked_oops(); + break; + case 3: /* Users of Selected */ + select_backlinked_oops(); + break; + } +} + +static uiBlock *oops_selectmenu(void *arg_unused) +{ + uiBlock *block; + short yco= 0, menuwidth=120; + + block= uiNewBlock(&curarea->uiblocks, "oops_selectmenu", UI_EMBOSSP, UI_HELV, curarea->headwin); + uiBlockSetButmFunc(block, do_oops_selectmenu, NULL); + + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, 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, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, ""); + + uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); + + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Linked to Selected|L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, ""); + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Users of Selected|Shift L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, ""); + + if(curarea->headertype==HEADERTOP) { + uiBlockSetDirection(block, UI_DOWN); + } + else { + uiBlockSetDirection(block, UI_TOP); + uiBlockFlipOrder(block); + } + + uiTextBoundsBlock(block, 50); + + return block; +} + + +void oops_buttons(void) +{ + SpaceOops *soops; + Oops *oops; + uiBlock *block; + short xco, xmax; + char naam[256]; + + soops= curarea->spacedata.first; + + sprintf(naam, "header %d", curarea->headwin); + block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSS, UI_HELV, curarea->headwin); + + if(area_is_active_area(curarea)) uiBlockSetCol(block, TH_HEADER); + else uiBlockSetCol(block, TH_HEADERDESEL); + + curarea->butspacetype= SPACE_OOPS; + + xco = 8; + + uiDefIconTextButC(block, ICONTEXTROW,B_NEWSPACE, ICON_VIEW3D, windowtype_pup(), xco,0,XIC+10,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Displays Current Window Type. Click for menu of available types."); + + xco+= XIC+14; + + uiBlockSetEmboss(block, UI_EMBOSSN); + if(curarea->flag & HEADER_NO_PULLDOWN) { + uiDefIconButS(block, TOG|BIT|0, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_RIGHT, + xco,2,XIC,YIC-2, + &(curarea->flag), 0, 0, 0, 0, "Show pulldown menus"); + } else { + uiDefIconButS(block, TOG|BIT|0, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_DOWN, + xco,2,XIC,YIC-2, + &(curarea->flag), 0, 0, 0, 0, "Hide pulldown menus"); + } + uiBlockSetEmboss(block, UI_EMBOSS); + xco+=XIC; + + if((curarea->flag & HEADER_NO_PULLDOWN)==0) { + /* pull down menus */ + uiBlockSetEmboss(block, UI_EMBOSSP); + + xmax= GetButStringLength("View"); + uiDefBlockBut(block, oops_viewmenu, NULL, "View", xco, -2, xmax-3, 24, ""); + xco+= xmax; + + xmax= GetButStringLength("Select"); + uiDefBlockBut(block, oops_selectmenu, NULL, "Select", 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); - + 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); - - cpack(0x0); - glRasterPos2i(xco+=XIC+10, 5); - BMF_DrawString(uiBlockGetCurFont(block), naam); - - } + + /* 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); + + } - /* always do as last */ - curarea->headbutlen= xco+2*XIC; + /* always do as last */ + curarea->headbutlen= xco+2*XIC; - uiDrawBlock(block); + uiDrawBlock(block); } Index: source/blender/src/oops.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/src/oops.c,v retrieving revision 1.6 diff -u -r1.6 oops.c --- source/blender/src/oops.c 7 Jan 2004 12:26:40 -0000 1.6 +++ source/blender/src/oops.c 4 May 2004 15:45:41 -0000 @@ -71,6 +71,7 @@ static int correct_oops_y(Oops *oops); +float oopslastx=0.0, oopslasty= 0.0; Oops *add_oops(void *id) { @@ -530,8 +531,6 @@ else return 1; } -float oopslastx=0.0, oopslasty= 0.0; - void new_oops_location(Oops *new) { float dirvec[4][2]; @@ -539,7 +538,11 @@ int a, b, rc= 1, tel=1, ok=0; if(G.soops==0) return; - + /* test for which positioning code I use here. */ + if(G.soops->organizeType == TREE_GRAPH) { + /* call our organizer code here */ + return; + } if(G.soops->oops.first==G.soops->oops.last) { oopslastx= oopslasty= 0.0; } @@ -617,9 +620,83 @@ } +static float xdist= (float)OOPSX*2; +static float ydist= (float)OOPSY*1.2; + +void organize_hierarchy_oops() { + /* INIT: + * get the first oops and the view type + * set begin position */ + Oops *curoop = G.soops->oops.first; + float xpos = 0.0; + float ypos = 0.0; + + /* clear all oops positions */ + while (curoop) { + curoop->x = xpos; + curoop->y = ypos; + curoop = curoop->next; + } + /* BEGIN: + * test current oop for view type mask and then + * position at 0.0,0.0 if mask fits */ + curoop = G.soops->oops.first; + while (curoop) { + if (curoop->x == 0.0 && curoop->y == 0.0) { + curoop->x = xpos; + curoop->y = ypos; + /* set the posvec to one down from the last oops done */ + ypos = hierarchy_position_oops(curoop); + ypos = ypos - ydist; + } + curoop = curoop->next; + } +} + +float hierarchy_position_oops (Oops *curoop) { + Oops *linkedoop; + OopsLink *ol; + float xpos = curoop->x + xdist; + float ypos = curoop->y; + + if (!curoop->link.first) return ypos; + ol= curoop->link.first; + linkedoop = ol->to; + + while (ol) { + + if (linkedoop->x == 0.0 && linkedoop->y == 0.0) { + linkedoop->x = xpos; + linkedoop->y = ypos; + /* set the posvec to one down from the last linkedoop done */ + ypos = hierarchy_position_oops(linkedoop); + ypos = ypos - ydist; + } + + if (!ol->next) break; + ol= ol->next; + linkedoop= ol->to; + } + return ypos; +} + +/* entry point for oops organization code */ +void organize_oops () +{ + switch(G.soops->organizeType) { + case TREE_GRAPH: + organize_hierarchy_oops(); + break; + default: + return; + } + G.soops->organizeType = 1; + allqueue(REDRAWOOPS, 1); +} -void free_oops(Oops *oops) /* also oops itself */ +void free_oops(Oops *oops, SpaceOops *so) /* also oops itself */ { + BLI_remlink(&so->oops, oops); BLI_freelistN(&oops->link); MEM_freeN(oops); } @@ -629,8 +706,7 @@ Oops *oops; while( (oops= so->oops.first) ) { - BLI_remlink(&so->oops, oops); - free_oops(oops); + free_oops(oops, so); } } @@ -759,20 +835,22 @@ } else { oops= add_oops(id); - new_oops_location(oops); + new_oops_location(oops);/* entry point for oops positioning code */ if(G.soops->flag & SO_NEWSELECTED) { oops->flag |= SELECT; } } - switch( GS( ((ID *)id)->name)) { case ID_SCE: - add_oopslink("set", oops, ID_SCE, &((Scene *)id)->set, (float)(.5*OOPSX), (float)OOPSY); + if (G.soops->viewType == SELECTION_ONLY) return NULL; + add_oopslink("set", oops, ID_SCE, &((Scene *)id)->set, (float)(.5*OOPSX), (float)OOPSY); break; case ID_OB: ob= (Object *)id; - if(ob->flag & SELECT) oops->flag |= SELECT; - else oops->flag &= ~SELECT; + if (!(G.soops->viewType == SELECTION_ONLY)) { + if(ob->flag & SELECT) oops->flag |= SELECT; + else oops->flag &= ~SELECT; + } add_object_oopslinks(ob, oops, G.soops->visiflag); break; case ID_ME: @@ -828,6 +906,7 @@ if(G.soops==0) return; + /* set hide flags */ oops= G.soops->oops.first; while(oops) { @@ -876,84 +955,11 @@ while(ob) { oops= add_test_oops(ob); - ob= ob->id.next; - } - } - if(G.soops->visiflag & OOPS_ME) { - Mesh *me= G.main->mesh.first; - while(me) { - oops= add_test_oops(me); - me= me->id.next; - } - } - - if(G.soops->visiflag & OOPS_CU) { - Curve *cu= G.main->curve.first; - while(cu) { - oops= add_test_oops(cu); - cu= cu->id.next; - } - } - - if(G.soops->visiflag & OOPS_MB) { - MetaBall *mb= G.main->mball.first; - while(mb) { - oops= add_test_oops(mb); - mb= mb->id.next; - } - } - - if(G.soops->visiflag & OOPS_LA) { - Lamp *la= G.main->lamp.first; - while(la) { - oops= add_test_oops(la); - la= la->id.next; - } - } - - if(G.soops->visiflag & OOPS_IP) { - Ipo *ipo= G.main->ipo.first; - while(ipo) { - oops= add_test_oops(ipo); - ipo= ipo->id.next; - } - } - - if(G.soops->visiflag & OOPS_MA) { - Material *ma= G.main->mat.first; - while(ma) { - oops= add_test_oops(ma); - ma= ma->id.next; - } - } - if(G.soops->visiflag & OOPS_TE) { - Tex *tex= G.main->tex.first; - while(tex) { - oops= add_test_oops(tex); - tex= tex->id.next; - } - } - if(G.soops->visiflag & OOPS_IM) { - Image *ima= G.main->image.first; - while(ima) { - oops= add_test_oops(ima); - ima= ima->id.next; - } - } - - } - else { - - /* only blocks from this scene */ - - base= FIRSTBASE; - while(base) { - - /* layer? */ - if( (G.soops->visiflag & OOPS_LAY)==0 || (base->lay & G.scene->lay)) { - ob= base->object; - - if(G.soops->visiflag & OOPS_OB) { + if ((G.soops->viewType == SELECTION_ONLY) && !(ob->flag & SELECT)) { + ob= ob->id.next; + continue; + } + if(G.soops->visiflag & OOPS_OB) { oops= add_test_oops(ob); } if(G.soops->visiflag & OOPS_MA) { @@ -1020,26 +1026,113 @@ oops= add_test_oops(ob->data); } } + ob= ob->id.next; + } + } + } +else { + + /* only blocks from this scene */ + + base= FIRSTBASE; + while(base) { + + /* layer? */ + if( (G.soops->visiflag & OOPS_LAY)==0 || (base->lay & G.scene->lay)) { + ob= base->object; + if ((G.soops->viewType == SELECTION_ONLY) && !(ob->flag & SELECT)) { + base= base->next; + continue; + } + if(G.soops->visiflag & OOPS_OB) { + oops= add_test_oops(ob); + } + if(G.soops->visiflag & OOPS_MA) { + for(a=0; atotcol; a++) { + if(ob->mat[a]) { + oops= add_test_oops(ob->mat[a]); + if(G.soops->visiflag & OOPS_TE) add_texture_oops(ob->mat[a]); + } + } + } + if(G.soops->visiflag & OOPS_IP) oops= add_test_oops(ob->ipo); + + id= ob->data; + if(id) { + type= GS(id->name); + + if(type==ID_ME && G.soops->visiflag & OOPS_ME) { + Mesh *me= ob->data; + oops= add_test_oops(ob->data); + + if(G.soops->visiflag & OOPS_MA) { + for(a=0; atotcol; a++) { + if(me->mat[a]) { + oops= add_test_oops(me->mat[a]); + if(G.soops->visiflag & OOPS_TE) add_texture_oops(me->mat[a]); + } + } + } + if(G.soops->visiflag & OOPS_IP) { + if(me->key) oops= add_test_oops(me->key->ipo); + } + } + else if(type==ID_CU && G.soops->visiflag & OOPS_CU) { + Curve *cu= ob->data; + oops= add_test_oops(ob->data); + + if(G.soops->visiflag & OOPS_MA) { + for(a=0; atotcol; a++) { + if(cu->mat[a]) { + oops= add_test_oops(cu->mat[a]); + if(G.soops->visiflag & OOPS_TE) add_texture_oops(cu->mat[a]); + } + } + } + if(G.soops->visiflag & OOPS_IP) { + if(cu->ipo) oops= add_test_oops(cu->ipo); + if(cu->key) oops= add_test_oops(cu->key->ipo); + } + } + else if(type==ID_MB && G.soops->visiflag & OOPS_MB) { + oops= add_test_oops(ob->data); + + if(G.soops->visiflag & OOPS_MA) { + MetaBall *mb= ob->data; + for(a=0; atotcol; a++) { + if(mb->mat[a]) { + oops= add_test_oops(mb->mat[a]); + if(G.soops->visiflag & OOPS_TE) add_texture_oops(mb->mat[a]); + } + } + } + } + else if(type==ID_LA && G.soops->visiflag & OOPS_LA) { + oops= add_test_oops(ob->data); + } } - base= base->next; } + base= base->next; } - - - +} - /* test links */ - oops= G.soops->oops.first; - while(oops) { - if(oops->hide==0) { - ol= oops->link.first; - while(ol) { - test_oopslink(ol); - ol= ol->next; + + + if (G.soops->oops.first) { + oops= G.soops->oops.first; + /* test links */ + while(oops) { + if(oops->hide==0) { + ol= oops->link.first; + while(ol) { + test_oopslink(ol); + ol= ol->next; + } } + oops= oops->next; } - oops= oops->next; + + G.soops->flag &= ~SO_NEWSELECTED; } - - G.soops->flag &= ~SO_NEWSELECTED; + organize_oops(); }