Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/space_outliner/space_outliner.c')
-rw-r--r--source/blender/editors/space_outliner/space_outliner.c444
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)
{