diff options
Diffstat (limited to 'source/blender/editors/space_outliner/space_outliner.c')
-rw-r--r-- | source/blender/editors/space_outliner/space_outliner.c | 444 |
1 files changed, 1 insertions, 443 deletions
diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c index 35fb0cd0371..26d8aec3672 100644 --- a/source/blender/editors/space_outliner/space_outliner.c +++ b/source/blender/editors/space_outliner/space_outliner.c @@ -71,328 +71,6 @@ #include "outliner_intern.h" -#define SET_INT_IN_POINTER(i) ((void*)(intptr_t)(i)) -#define GET_INT_FROM_POINTER(i) ((int)(intptr_t)(i)) - -#define ROW_HEIGHT 19 -#define COLUMN_WIDTH 150 - -typedef void (*uiTableCellFunc)(void *userdata, int row, int col, struct rcti *rct, struct uiBlock *block); - -typedef struct uiTable { - rcti rct; - int rows, cols; - - uiTableCellFunc cellfunc; - void *userdata; -} uiTable; - -uiTable *UI_table_create(int rows, int cols, rcti *rct, uiTableCellFunc cellfunc, void *userdata) -{ - uiTable *table; - - table= MEM_callocN(sizeof(uiTable), "uiTable"); - table->rct= *rct; - table->cellfunc= cellfunc; - table->rows= rows; - table->cols= cols; - table->userdata= userdata; - - return table; -} - -void UI_table_free(uiTable *table) -{ - MEM_freeN(table); -} - -void UI_table_draw(const bContext *C, uiTable *table) -{ - ARegion *ar= CTX_wm_region(C); - uiBlock *block; - View2D *v2d; - rcti *rct, cellrct; - int y, row, col; - - v2d= &ar->v2d; - rct= &table->rct; - - block= uiBeginBlock(C, ar, "table outliner", UI_EMBOSST, UI_HELV); - - for(y=rct->ymax, row=0; y>rct->ymin; y-=ROW_HEIGHT, row++) { - if(row%2 == 0) { - UI_ThemeColorShade(TH_BACK, 6); - glRecti(v2d->cur.xmin, y-ROW_HEIGHT, v2d->cur.xmax, y); - } - - if(row >= table->rows) - continue; - - for(col=0; col<table->cols; col++) { - cellrct.xmin= rct->xmin+COLUMN_WIDTH*col + 1; - cellrct.xmax= rct->xmin+COLUMN_WIDTH*(col+1); - cellrct.ymin= y-ROW_HEIGHT; - cellrct.ymax= y; - - table->cellfunc(table->userdata, row, col, &cellrct, block); - } - } - - UI_ThemeColorShadeAlpha(TH_BACK, -15, -200); - - for(col=0; col<table->cols; col++) - fdrawline(rct->xmin+COLUMN_WIDTH*(col+1), rct->ymin, rct->xmin+COLUMN_WIDTH*(col+1), rct->ymax); - - uiEndBlock(C, block); - uiDrawBlock(C, block); -} - - -/* ************************ main outliner area region *********************** */ - -typedef struct CellRNA { - SpaceOops *space; - StructRNA *srna; - PropertyRNA *prop; - PointerRNA ptr; - int lastrow, index; - - CollectionPropertyIterator iter; -} CellRNA; - -static void rna_back_cb(bContext *C, void *arg_unused, void *arg_unused2) -{ - SpaceOops *soutliner= (SpaceOops*)CTX_wm_space_data(C); - char *newpath; - - newpath= RNA_path_back(soutliner->rnapath); - if(soutliner->rnapath) - MEM_freeN(soutliner->rnapath); - soutliner->rnapath= newpath; -} - -static void rna_pointer_cb(bContext *C, void *arg_prop, void *arg_index) -{ - SpaceOops *soutliner= (SpaceOops*)CTX_wm_space_data(C); - PropertyRNA *prop= arg_prop; - char *newpath; - int index= GET_INT_FROM_POINTER(arg_index);; - - newpath= RNA_path_append(soutliner->rnapath, NULL, prop, index, NULL); - if(soutliner->rnapath) - MEM_freeN(soutliner->rnapath); - soutliner->rnapath= newpath; -} - -static void rna_label(CellRNA *cell, rcti *rct, uiBlock *block) -{ - PropertySubType subtype; - PropertyType type; - PropertyRNA *prop; - char *vectoritem[4]= {"x", "y", "z", "w"}; - char *quatitem[4]= {"w", "x", "y", "z"}; - char *coloritem[4]= {"r", "g", "b", "a"}; - char item[32]; - int arraylength; - - prop= cell->prop; - type= RNA_property_type(&cell->ptr, prop); - subtype= RNA_property_subtype(&cell->ptr, prop); - arraylength= RNA_property_array_length(&cell->ptr, prop); - - if(cell->index == -1) { - uiDefBut(block, LABEL, 0, (char*)RNA_property_ui_name(&cell->ptr, prop), rct->xmin, rct->ymin, rct->xmax-rct->xmin, rct->ymax-rct->ymin, 0, 0, 0, 0, 0, (char*)RNA_property_ui_description(&cell->ptr, prop)); - } - else if (type != PROP_COLLECTION) { - if(arraylength == 4 && subtype == PROP_ROTATION) - sprintf(item, " %s", quatitem[cell->index]); - else if(arraylength <= 4 && (subtype == PROP_VECTOR || subtype == PROP_ROTATION)) - sprintf(item, " %s", vectoritem[cell->index]); - else if(arraylength <= 4 && subtype == PROP_COLOR) - sprintf(item, " %s", coloritem[cell->index]); - else - sprintf(item, " %d", cell->index+1); - - uiDefBut(block, LABEL, 0, item, rct->xmin, rct->ymin, rct->xmax-rct->xmin, rct->ymax-rct->ymin, 0, 0, 0, 0, 0, ""); - } -} - -static void rna_collection_but(CellRNA *cell, rcti *rct, uiBlock *block) -{ - uiBut *but; - PointerRNA lookup; - PropertyRNA *nameprop; - char name[256]= "", *nameptr= name; - - RNA_property_collection_lookup_int(&cell->ptr, cell->prop, cell->index, &lookup); - - if(lookup.data) { - nameprop= RNA_struct_name_property(&lookup); - - if(nameprop) - nameptr= RNA_property_string_get_alloc(&lookup, nameprop, name, sizeof(name)); - - if(!nameprop || strlen(nameptr) == 0) - sprintf(nameptr, "%d", cell->index+1); - } - - but= uiDefBut(block, BUT, 0, nameptr, rct->xmin, rct->ymin, rct->xmax-rct->xmin, rct->ymax-rct->ymin, 0, 0, 0, 0, 0, ""); - uiButSetFlag(but, UI_TEXT_LEFT); - - if(nameptr != name) - MEM_freeN(nameptr); - - uiButSetFunc(but, rna_pointer_cb, cell->prop, SET_INT_IN_POINTER(cell->index)); -} - -static uiBut *rna_auto_but(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int index, int x1, int y1, int x2, int y2) -{ - uiBut *but; - const char *propname= RNA_property_identifier(ptr, prop); - - switch(RNA_property_type(ptr, prop)) { - case PROP_BOOLEAN: { - int value, length; - - length= RNA_property_array_length(ptr, prop); - - if(length) - value= RNA_property_boolean_get_array(ptr, prop, index); - else - value= RNA_property_boolean_get(ptr, prop); - - but= uiDefButR(block, TOG, 0, (value)? "True": "False", x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL); - break; - } - case PROP_INT: - case PROP_FLOAT: - but= uiDefButR(block, NUM, 0, "", x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL); - break; - case PROP_ENUM: - but= uiDefButR(block, MENU, 0, NULL, x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL); - break; - case PROP_STRING: - but= uiDefButR(block, TEX, 0, "", x1, y1, x2, y2, ptr, propname, index, 0, 0, -1, -1, NULL); - break; - case PROP_POINTER: { - PointerRNA pptr; - PropertyRNA *nameprop; - char name[256]= "", *nameptr= name; - - RNA_property_pointer_get(ptr, prop, &pptr); - - if(pptr.data) { - nameprop= RNA_struct_name_property(&pptr); - if(pptr.type && nameprop) - nameptr= RNA_property_string_get_alloc(&pptr, nameprop, name, sizeof(name)); - else - strcpy(nameptr, "->"); - } - - but= uiDefButR(block, BUT, 0, nameptr, x1, y1, x2, y2, ptr, propname, index, 0, 0, 0, 0, NULL); - uiButSetFlag(but, UI_TEXT_LEFT); - - if(nameptr != name) - MEM_freeN(nameptr); - - break; - } - default: - but= NULL; - break; - } - - return but; -} - -static void rna_but(CellRNA *cell, rcti *rct, uiBlock *block) -{ - uiBut *but; - PropertyRNA *prop; - PropertyType type; - int arraylength, index; - - prop= cell->prop; - type= RNA_property_type(&cell->ptr, prop); - arraylength= RNA_property_array_length(&cell->ptr, prop); - - if(type == PROP_COLLECTION) { - /* item in a collection */ - if(cell->index >= 0) - rna_collection_but(cell, rct, block); - } - else { - /* other cases */ - index= (arraylength)? cell->index: 0; - - if(index >= 0) { - but= rna_auto_but(block, &cell->ptr, prop, index, rct->xmin, rct->ymin, rct->xmax-rct->xmin, rct->ymax-rct->ymin); - - if(type == PROP_POINTER) - uiButSetFunc(but, rna_pointer_cb, prop, SET_INT_IN_POINTER(0)); - } - } -} - -static void rna_path_but(CellRNA *cell, rcti *rct, uiBlock *block) -{ - uiBut *but; - - but= uiDefBut(block, BUT, 0, (cell->space->rnapath)? "..": ".", rct->xmin, rct->ymin, rct->xmax-rct->xmin, rct->ymax-rct->ymin, 0, 0, 0, 0, 0, ""); - uiButSetFlag(but, UI_TEXT_LEFT); - uiButSetFunc(but, rna_back_cb, cell->space, NULL); -} - -static void rna_table_cell_func(void *userdata, int row, int col, rcti *rct, uiBlock *block) -{ - CellRNA *cell= userdata; - PropertyType type; - int length; - - /* path button */ - if(row == 0) { - if(col == 0) - rna_path_but(cell, rct, block); - - return; - } - - /* set next property for new row */ - if(row != cell->lastrow) { - if(cell->prop) { - cell->index++; - - type= RNA_property_type(&cell->ptr, cell->prop); - if(type == PROP_COLLECTION) - length= RNA_property_collection_length(&cell->ptr, cell->prop); - else - length= RNA_property_array_length(&cell->ptr, cell->prop); - - /* verify if we need to go to the next property */ - if(type == PROP_COLLECTION && cell->index < length); - else if(length && cell->index < length); - else { - RNA_property_collection_next(&cell->iter); - cell->prop= cell->iter.ptr.data; - cell->index= -1; - } - } - else { - /* initialize */ - cell->prop= cell->iter.ptr.data; - cell->index= -1; - } - - cell->lastrow= row; - } - - /* make button */ - if(col == 0) - rna_label(cell, rct, block); - else if(col == 1) - rna_but(cell, rct, block); -} - static void outliner_main_area_init(wmWindowManager *wm, ARegion *ar) { ListBase *keymap; @@ -404,105 +82,7 @@ static void outliner_main_area_init(wmWindowManager *wm, ARegion *ar) WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct); } -static void outliner_rna_draw(const bContext *C, ARegion *ar) -{ - uiTable *table; - rcti rct; - CellRNA cell; - PropertyRNA *prop, *iterprop; - PointerRNA newptr; - float col[3]; - int rows, cols, awidth, aheight, width, height; - SpaceOops *soutliner= (SpaceOops*)CTX_wm_space_data(C); - View2D *v2d= &ar->v2d; - View2DScrollers *scrollers; - - /* clear */ - UI_GetThemeColor3fv(TH_BACK, col); - glClearColor(col[0], col[1], col[2], 0.0); - glClear(GL_COLOR_BUFFER_BIT); - - awidth= width= ar->winx; - aheight= height= ar->winy; - - /* create table */ - cell.space= soutliner; - cell.lastrow= -1; - RNA_main_pointer_create(CTX_data_main(C), &cell.ptr); - cell.prop= NULL; - - /* solve RNA path or reset if fails */ - if(soutliner->rnapath) { - if(!RNA_path_resolve(&cell.ptr, soutliner->rnapath, &newptr, &prop)) { - newptr.data= NULL; - printf("RNA outliner: failed resolving path. (%s)\n", soutliner->rnapath); - } - - if(newptr.data && newptr.type) { - cell.ptr= newptr; - } - else { - MEM_freeN(soutliner->rnapath); - soutliner->rnapath= NULL; - } - } - - /* compute number of rows and columns */ - rows= 1; - cols= 2; - - iterprop= RNA_struct_iterator_property(&cell.ptr); - RNA_property_collection_begin(&cell.ptr, iterprop, &cell.iter); - - for(; cell.iter.valid; RNA_property_collection_next(&cell.iter)) { - prop= cell.iter.ptr.data; - - rows += 1 + RNA_property_array_length(&cell.ptr, prop); - if(RNA_property_type(&cell.ptr, prop) == PROP_COLLECTION) - rows += RNA_property_collection_length(&cell.ptr, prop); - } - - RNA_property_collection_end(&cell.iter); - - /* determine extents of data - * - height must be at least the height of the mask area - * - width is columns + 1, as otherwise, part of last column - * will be obscured by scrollers - */ - if ((rows*ROW_HEIGHT) > height) - height= rows * ROW_HEIGHT; - width= (cols + 1) * COLUMN_WIDTH; - - /* update size of tot-rect (extents of data/viewable area) */ - UI_view2d_totRect_set(v2d, width, height); - - rct.xmin= 0; - rct.ymin= -height; - rct.xmax= width; - rct.ymax= 0; - - /* set matrix for 2d-view controls */ - UI_view2d_view_ortho(C, v2d); - - /* create and draw table */ - table= UI_table_create(rows, 2, &rct, rna_table_cell_func, &cell); - - RNA_property_collection_begin(&cell.ptr, iterprop, &cell.iter); - UI_table_draw(C, table); - RNA_property_collection_end(&cell.iter); - - UI_table_free(table); - - /* reset view matrix */ - UI_view2d_view_restore(C); - - /* scrollers */ - scrollers= UI_view2d_scrollers_calc(C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY); - UI_view2d_scrollers_draw(C, v2d, scrollers); - UI_view2d_scrollers_free(scrollers); -} - -static void outliner_tree_draw(const bContext *C, ARegion *ar) +static void outliner_main_area_draw(const bContext *C, ARegion *ar) { View2D *v2d= &ar->v2d; View2DScrollers *scrollers; @@ -524,16 +104,6 @@ static void outliner_tree_draw(const bContext *C, ARegion *ar) UI_view2d_scrollers_free(scrollers); } -static void outliner_main_area_draw(const bContext *C, ARegion *ar) -{ - SpaceOops *so= (SpaceOops *)CTX_wm_space_data(C); - - if(so->type==SO_RNA) - outliner_rna_draw(C, ar); - else - outliner_tree_draw(C, ar); -} - static void outliner_main_area_free(ARegion *ar) { @@ -633,18 +203,6 @@ static void free_oops(Oops *oops) /* also oops itself */ MEM_freeN(oops); } -static void outliner_free_tree(ListBase *lb) -{ - - while(lb->first) { - TreeElement *te= lb->first; - - outliner_free_tree(&te->subtree); - BLI_remlink(lb, te); - MEM_freeN(te); - } -} - /* not spacelink itself */ static void outliner_free(SpaceLink *sl) { |