2.5: UI
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Tue, 21 Jul 2009 01:26:17 +0000 (01:26 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Tue, 21 Jul 2009 01:26:17 +0000 (01:26 +0000)
* List template visual changes. Items now look different,
  and it expands to size 5 as more items are added.

* Added LISTROW and LISTBOX elements. The former is like
  a typical ROW button, but looks diffrent. The latter
  looks like a BOUNDBOX, and has no extra features yet.
* Fix some glColor3ubv warnings with casting, did not find
  a nicer way.

13 files changed:
source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface.c
source/blender/editors/interface/interface_draw.c
source/blender/editors/interface/interface_handlers.c
source/blender/editors/interface/interface_intern.h
source/blender/editors/interface/interface_layout.c
source/blender/editors/interface/interface_style.c
source/blender/editors/interface/interface_templates.c
source/blender/editors/interface/interface_widgets.c
source/blender/makesdna/DNA_userdef_types.h
source/blender/makesrna/intern/rna_ui.c
source/blender/makesrna/intern/rna_ui_api.c
source/blender/makesrna/intern/rna_userdef.c

index 66089272737d7282a392246c4478aada8d2ef541..2fec61fda3c31bea21311c38ae4545d8b525d5ae 100644 (file)
@@ -30,6 +30,8 @@
 #ifndef UI_INTERFACE_H
 #define UI_INTERFACE_H
 
+#include "RNA_types.h"
+
 /* Struct Declarations */
 
 struct ID;
@@ -201,7 +203,9 @@ typedef struct uiLayout uiLayout;
 #define SEARCH_MENU    (40<<9)
 #define BUT_EXTRA      (41<<9)
 #define HSVCIRCLE      (42<<9)
-#define BUTTYPE        (63<<9)
+#define LISTBOX                (43<<9)
+#define LISTROW                (44<<9)
+#define BUTTYPE                (63<<9)
 
 /* Drawing
  *
@@ -588,7 +592,6 @@ void uiLayoutSetKeepAspect(uiLayout *layout, int keepaspect);
 void uiLayoutSetScaleX(uiLayout *layout, float scale);
 void uiLayoutSetScaleY(uiLayout *layout, float scale);
 
-
 int uiLayoutGetOperatorContext(uiLayout *layout);
 int uiLayoutGetActive(uiLayout *layout);
 int uiLayoutGetEnabled(uiLayout *layout);
@@ -597,12 +600,14 @@ int uiLayoutGetAlignment(uiLayout *layout);
 int uiLayoutGetKeepAspect(uiLayout *layout);
 float uiLayoutGetScaleX(uiLayout *layout);
 float uiLayoutGetScaleY(uiLayout *layout);
+ListBase *uiLayoutBoxGetList(uiLayout *layout);
 
 /* layout specifiers */
 uiLayout *uiLayoutRow(uiLayout *layout, int align);
 uiLayout *uiLayoutColumn(uiLayout *layout, int align);
 uiLayout *uiLayoutColumnFlow(uiLayout *layout, int number, int align);
 uiLayout *uiLayoutBox(uiLayout *layout);
+uiLayout *uiLayoutListBox(uiLayout *layout);
 uiLayout *uiLayoutFree(uiLayout *layout, int align);
 uiLayout *uiLayoutSplit(uiLayout *layout, float percentage);
 
@@ -619,11 +624,19 @@ void uiTemplateColorRamp(uiLayout *layout, struct ColorBand *coba, int expand);
 void uiTemplateCurveMapping(uiLayout *layout, struct CurveMapping *cumap, int type);
 void uiTemplateLayers(uiLayout *layout, struct PointerRNA *ptr, char *propname);
 void uiTemplateImageLayers(uiLayout *layout, struct bContext *C, struct Image *ima, struct ImageUser *iuser);
-ListBase uiTemplateList(uiLayout *layout, struct PointerRNA *ptr, char *propname, struct PointerRNA *activeptr, char *activeprop, int rows, int columns, int compact);
 void uiTemplateRunningJobs(uiLayout *layout, struct bContext *C);
 void uiTemplateOperatorSearch(uiLayout *layout);
 void uiTemplateHeader3D(uiLayout *layout, struct bContext *C);
 
+typedef struct uiListItem {
+       struct uiListItem *next, *prev;
+
+       struct PointerRNA data;
+       uiLayout *layout;
+} uiListItem;
+
+ListBase uiTemplateList(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, struct PointerRNA *activeptr, char *activeprop, int rows, int type);
+
 /* items */
 void uiItemO(uiLayout *layout, char *name, int icon, char *opname);
 void uiItemEnumO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value);
index 9ded2ec9eb872963d907b6ccbaa91f5ad800fd17..27561f42b8a647fccc1848bc967030b7e2026fd2 100644 (file)
@@ -720,6 +720,7 @@ static void ui_is_but_sel(uiBut *but)
                        if(value==0.0) push= 1;
                        break;
                case ROW:
+               case LISTROW:
                        if(value == but->hardmax) push= 1;
                        break;
                case COL:
@@ -2149,7 +2150,7 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
 
                                freestr= 1;
                        }
-                       else if(type == ROW && proptype == PROP_ENUM) {
+                       else if(ELEM(type, ROW, LISTROW) && proptype == PROP_ENUM) {
                                EnumPropertyItem *item;
                                int i, totitem, free;
 
@@ -2202,7 +2203,7 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
                                RNA_property_int_range(ptr, prop, &hardmin, &hardmax);
                                RNA_property_int_ui_range(ptr, prop, &softmin, &softmax, &step);
 
-                               if(type != ROW && min == max) {
+                               if(!ELEM(type, ROW, LISTROW) && min == max) {
                                        min= hardmin;
                                        max= hardmax;
                                }
@@ -2217,7 +2218,7 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
                                RNA_property_float_range(ptr, prop, &hardmin, &hardmax);
                                RNA_property_float_ui_range(ptr, prop, &softmin, &softmax, &step, &precision);
 
-                               if(type != ROW && min == max) {
+                               if(!ELEM(type, ROW, LISTROW) && min == max) {
                                        min= hardmin;
                                        max= hardmax;
                                }
index 8400fee0c5547c26dbf0fd57f02719049a47616f..cded4753f61f1fcead8e27d26f4a3682a90720cc 100644 (file)
@@ -788,7 +788,7 @@ void ui_draw_but_NORMAL(uiBut *but, uiWidgetColors *wcol, rcti *rect)
        glGetMaterialfv(GL_FRONT, GL_DIFFUSE, diff);
                
        /* backdrop */
-       glColor3ubv(wcol->inner);
+       glColor3ubv((unsigned char*)wcol->inner);
        uiSetRoundBox(15);
        gl_round_box(GL_POLYGON, rect->xmin, rect->ymin, rect->xmax, rect->ymax, 5.0f);
        
@@ -852,7 +852,7 @@ void ui_draw_but_NORMAL(uiBut *but, uiWidgetColors *wcol, rcti *rect)
        /* AA circle */
        glEnable(GL_BLEND);
        glEnable(GL_LINE_SMOOTH );
-       glColor3ubv(wcol->inner);
+       glColor3ubv((unsigned char*)wcol->inner);
        glutil_draw_lined_arc(0.0f, M_PI*2.0, 100.0f, 32);
        glDisable(GL_BLEND);
        glDisable(GL_LINE_SMOOTH );
@@ -926,14 +926,14 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect
        if(cumap->flag & CUMA_DO_CLIP) {
                glColor3ubvShade(wcol->inner, -20);
                glRectf(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
-               glColor3ubv(wcol->inner);
+               glColor3ubv((unsigned char*)wcol->inner);
                glRectf(rect->xmin + zoomx*(cumap->clipr.xmin-offsx),
                                rect->ymin + zoomy*(cumap->clipr.ymin-offsy),
                                rect->xmin + zoomx*(cumap->clipr.xmax-offsx),
                                rect->ymin + zoomy*(cumap->clipr.ymax-offsy));
        }
        else {
-               glColor3ubv(wcol->inner);
+               glColor3ubv((unsigned char*)wcol->inner);
                glRectf(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
        }
        
@@ -989,7 +989,7 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect
        }*/
        
        /* the curve */
-       glColor3ubv(wcol->item);
+       glColor3ubv((unsigned char*)wcol->item);
        glEnable(GL_LINE_SMOOTH);
        glEnable(GL_BLEND);
        glBegin(GL_LINE_STRIP);
@@ -1043,7 +1043,7 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect
        glScissor(scissor[0], scissor[1], scissor[2], scissor[3]);
 
        /* outline */
-       glColor3ubv(wcol->outline);
+       glColor3ubv((unsigned char*)wcol->outline);
        fdrawbox(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
 }
 
index 0fbfeffba0d252e4554e6272a7dd4b718cebf3d4..442d472a47a651ca5a94bf16bde12fa96a8eeb20 100644 (file)
@@ -188,7 +188,7 @@ static uiBut *ui_but_prev(uiBut *but)
 {
        while(but->prev) {
                but= but->prev;
-               if(but->type!=LABEL && but->type!=SEPR && but->type!=ROUNDBOX) return but;
+               if(!ELEM4(but->type, LABEL, SEPR, ROUNDBOX, LISTBOX)) return but;
        }
        return NULL;
 }
@@ -197,7 +197,7 @@ static uiBut *ui_but_next(uiBut *but)
 {
        while(but->next) {
                but= but->next;
-               if(but->type!=LABEL && but->type!=SEPR && but->type!=ROUNDBOX) return but;
+               if(!ELEM4(but->type, LABEL, SEPR, ROUNDBOX, LISTBOX)) return but;
        }
        return NULL;
 }
@@ -208,7 +208,7 @@ static uiBut *ui_but_first(uiBlock *block)
        
        but= block->buttons.first;
        while(but) {
-               if(but->type!=LABEL && but->type!=SEPR && but->type!=ROUNDBOX) return but;
+               if(!ELEM4(but->type, LABEL, SEPR, ROUNDBOX, LISTBOX)) return but;
                but= but->next;
        }
        return NULL;
@@ -220,7 +220,7 @@ static uiBut *ui_but_last(uiBlock *block)
        
        but= block->buttons.last;
        while(but) {
-               if(but->type!=LABEL && but->type!=SEPR && but->type!=ROUNDBOX) return but;
+               if(!ELEM4(but->type, LABEL, SEPR, ROUNDBOX, LISTBOX)) return but;
                but= but->prev;
        }
        return NULL;
@@ -284,7 +284,7 @@ static void ui_apply_autokey_undo(bContext *C, uiBut *but)
        uiAfterFunc *after;
        char *str= NULL;
 
-       if ELEM5(but->type, BLOCK, BUT, LABEL, PULLDOWN, ROUNDBOX);
+       if ELEM6(but->type, BLOCK, BUT, LABEL, PULLDOWN, ROUNDBOX, LISTBOX);
        else {
                /* define which string to use for undo */
                if ELEM(but->type, LINK, INLINK) str= "Add button link";
@@ -449,7 +449,7 @@ static void ui_apply_but_ROW(bContext *C, uiBlock *block, uiBut *but, uiHandleBu
        
        /* states of other row buttons */
        for(bt= block->buttons.first; bt; bt= bt->next)
-               if(bt!=but && bt->poin==but->poin && bt->type==ROW)
+               if(bt!=but && bt->poin==but->poin && ELEM(bt->type, ROW, LISTROW))
                        ui_check_but(bt);
        
        ui_apply_but_func(C, but);
@@ -782,6 +782,7 @@ static void ui_apply_button(bContext *C, uiBlock *block, uiBut *but, uiHandleBut
                        ui_apply_but_TOG(C, block, but, data);
                        break;
                case ROW:
+               case LISTROW:
                        ui_apply_but_ROW(C, block, but, data);
                        break;
                case SCROLL:
@@ -1392,7 +1393,7 @@ static void ui_textedit_next_but(uiBlock *block, uiBut *actbut, uiHandleButtonDa
        uiBut *but;
 
        /* label and roundbox can overlap real buttons (backdrops...) */
-       if(actbut->type==LABEL && actbut->type==ROUNDBOX)
+       if(ELEM4(actbut->type, LABEL, SEPR, ROUNDBOX, LISTBOX))
                return;
 
        for(but= actbut->next; but; but= but->next) {
@@ -1416,7 +1417,7 @@ static void ui_textedit_prev_but(uiBlock *block, uiBut *actbut, uiHandleButtonDa
        uiBut *but;
 
        /* label and roundbox can overlap real buttons (backdrops...) */
-       if(actbut->type==LABEL && actbut->type==ROUNDBOX)
+       if(ELEM4(actbut->type, LABEL, SEPR, ROUNDBOX, LISTBOX))
                return;
 
        for(but= actbut->prev; but; but= but->prev) {
@@ -3183,9 +3184,11 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event)
                retval= ui_do_but_SLI(C, block, but, data, event);
                break;
        case ROUNDBOX:  
+       case LISTBOX:
        case LABEL:     
        case TOG3:      
        case ROW:
+       case LISTROW:
                retval= ui_do_but_EXIT(C, but, data, event);
                break;
        case TEX:
@@ -3331,7 +3334,7 @@ static uiBut *ui_but_find_mouse_over(ARegion *ar, int x, int y)
                ui_window_to_block(ar, block, &mx, &my);
 
                for(but=block->buttons.first; but; but= but->next) {
-                       if(ELEM3(but->type, LABEL, ROUNDBOX, SEPR))
+                       if(ELEM4(but->type, LABEL, ROUNDBOX, SEPR, LISTBOX))
                                continue;
                        if(but->flag & UI_HIDDEN)
                                continue;
index 5760a28cb5c34f43dc903b2671d9fefd31c2d677..70d60502ac47cd23796499ea104469be7789e450 100644 (file)
@@ -84,7 +84,8 @@ typedef enum {
        UI_WTYPE_RGB_PICKER,
        UI_WTYPE_NORMAL,
        UI_WTYPE_BOX,
-       UI_WTYPE_SCROLL
+       UI_WTYPE_SCROLL,
+       UI_WTYPE_LISTITEM
        
 } uiWidgetTypeEnum;
 
index 284da29f0d2ed3da6e432c2d770b5bff8616f478..07fe2686317d953f4a131739dab79d14fe4717b9 100644 (file)
@@ -148,6 +148,7 @@ typedef struct uiLayoutItemFlow {
 typedef struct uiLayoutItemBx {
        uiLayout litem;
        uiBut *roundbox;
+       ListBase items;
 } uiLayoutItemBx;
 
 typedef struct uiLayoutItemSplt {
@@ -218,7 +219,7 @@ static int ui_text_icon_width(uiLayout *layout, char *name, int icon)
 {
        int variable = ui_layout_vary_direction(layout) == UI_ITEM_VARY_X;
 
-       if(icon && strcmp(name, "") == 0)
+       if(icon && !name[0])
                return UI_UNIT_X; /* icon only */
        else if(icon)
                return (variable)? UI_GetStringWidth(name) + 4 + UI_UNIT_X: 10*UI_UNIT_X; /* icon + text */
@@ -723,15 +724,17 @@ static void ui_item_rna_size(uiLayout *layout, char *name, int icon, PropertyRNA
        subtype= RNA_property_subtype(prop);
        len= RNA_property_array_length(prop);
 
-       if(ELEM(type, PROP_STRING, PROP_POINTER) && strcmp(name, "") == 0)
+       if(ELEM(type, PROP_STRING, PROP_POINTER) && !name[0])
                name= "non-empty";
+       else if(type == PROP_BOOLEAN && !name[0])
+               icon= ICON_DOT;
 
        w= ui_text_icon_width(layout, name, icon);
        h= UI_UNIT_Y;
 
        /* increase height for arrays */
        if(index == RNA_NO_INDEX && len > 0) {
-               if(strcmp(name, "") == 0 && icon == 0)
+               if(!name[0] && icon == 0)
                        h= 0;
 
                if(type == PROP_BOOLEAN && len == 20)
@@ -1808,7 +1811,7 @@ uiLayout *uiLayoutColumnFlow(uiLayout *layout, int number, int align)
        return &flow->litem;
 }
 
-uiLayout *uiLayoutBox(uiLayout *layout)
+static uiLayout *ui_layout_box(uiLayout *layout, int type)
 {
        uiLayoutItemBx *box;
 
@@ -1823,11 +1826,27 @@ uiLayout *uiLayoutBox(uiLayout *layout)
 
        uiBlockSetCurLayout(layout->root->block, &box->litem);
 
-       box->roundbox= uiDefBut(layout->root->block, ROUNDBOX, 0, "", 0, 0, 0, 0, NULL, 0.0, 0.0, 0, 0, "");
+       box->roundbox= uiDefBut(layout->root->block, type, 0, "", 0, 0, 0, 0, NULL, 0.0, 0.0, 0, 0, "");
 
        return &box->litem;
 }
 
+uiLayout *uiLayoutBox(uiLayout *layout)
+{
+       return ui_layout_box(layout, ROUNDBOX);
+}
+
+uiLayout *uiLayoutListBox(uiLayout *layout)
+{
+       return ui_layout_box(layout, LISTBOX);
+}
+
+ListBase *uiLayoutBoxGetList(uiLayout *layout)
+{
+       uiLayoutItemBx *box= (uiLayoutItemBx*)layout;
+       return &box->items;
+}
+
 uiLayout *uiLayoutFree(uiLayout *layout, int align)
 {
        uiLayout *litem;
@@ -2132,6 +2151,9 @@ static void ui_layout_free(uiLayout *layout)
                        ui_layout_free((uiLayout*)item);
        }
 
+       if(layout->item.type == ITEM_LAYOUT_BOX)
+               BLI_freelistN(&((uiLayoutItemBx*)layout)->items);
+
        MEM_freeN(layout);
 }
 
index 6faa658c3d0d4328776db9eee6faced1f00079cb..e2c97e4f05e2b5c7041377f1cfb5bbe339f94502 100644 (file)
@@ -93,7 +93,7 @@ static uiStyle *ui_style_new(ListBase *styles, const char *name)
 
        style->paneltitle.uifont_id= UIFONT_DEFAULT;
        style->paneltitle.points= 12;
-       style->paneltitle.kerning= 0;
+       style->paneltitle.kerning= 1;
        style->paneltitle.shadow= 5;
        style->paneltitle.shadx= 2;
        style->paneltitle.shady= -2;
@@ -102,7 +102,7 @@ static uiStyle *ui_style_new(ListBase *styles, const char *name)
        
        style->grouplabel.uifont_id= UIFONT_DEFAULT;
        style->grouplabel.points= 12;
-       style->grouplabel.kerning= 0;
+       style->grouplabel.kerning= 1;
        style->grouplabel.shadow= 3;
        style->grouplabel.shadx= 1;
        style->grouplabel.shady= -1;
@@ -110,7 +110,7 @@ static uiStyle *ui_style_new(ListBase *styles, const char *name)
        
        style->widgetlabel.uifont_id= UIFONT_DEFAULT;
        style->widgetlabel.points= 11;
-       style->widgetlabel.kerning= 0;
+       style->widgetlabel.kerning= 1;
        style->widgetlabel.shadow= 3;
        style->widgetlabel.shadx= 1;
        style->widgetlabel.shady= -1;
@@ -119,7 +119,7 @@ static uiStyle *ui_style_new(ListBase *styles, const char *name)
        
        style->widget.uifont_id= UIFONT_DEFAULT;
        style->widget.points= 11;
-       style->widget.kerning= 0;
+       style->widget.kerning= 1;
        style->widget.shadowalpha= 0.25f;
 
        style->columnspace= 5;
index 512d279cc37bd722b9b62dd2985c8aac023ccc36..f34774b0516c067f3c1277853a7b37f6d582cf60 100644 (file)
@@ -99,11 +99,12 @@ static void id_search_cb(const struct bContext *C, void *arg_template, char *str
 
        /* ID listbase */
        for(id= lb->first; id; id= id->next) {
-               iconid= ui_id_icon_get(scene, id);
+               if(BLI_strcasestr(id->name+2, str)) {
+                       iconid= ui_id_icon_get(scene, id);
 
-               if(BLI_strcasestr(id->name+2, str))
                        if(!uiSearchItemAdd(items, id->name+2, id, iconid))
                                break;
+               }
        }
 }
 
@@ -1296,17 +1297,36 @@ void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, char *propname)
 
 /************************* List Template **************************/
 
-ListBase uiTemplateList(uiLayout *layout, PointerRNA *ptr, char *propname, PointerRNA *activeptr, char *activepropname, int rows, int columns, int compact)
+#if 0
+static void list_item_add(ListBase *lb, ListBase *itemlb, uiLayout *layout, PointerRNA *data)
 {
        CollectionPointerLink *link;
+       uiListItem *item;
+
+       /* add to list to store in box */
+       item= MEM_callocN(sizeof(uiListItem), "uiListItem");
+       item->layout= layout;
+       item->data= *data;
+       BLI_addtail(itemlb, item);
+
+       /* add to list to return from function */
+       link= MEM_callocN(sizeof(CollectionPointerLink), "uiTemplateList return");
+       RNA_pointer_create(NULL, &RNA_UIListItem, item, &link->ptr);
+       BLI_addtail(lb, link);
+}
+#endif
+
+ListBase uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, PointerRNA *activeptr, char *activepropname, int rows, int listtype)
+{
+       //Scene *scene= CTX_data_scene(C);
        PropertyRNA *prop= NULL, *activeprop;
        PropertyType type, activetype;
        StructRNA *ptype;
-       uiLayout *box, *row, *col;
+       uiLayout *box, *row, *col, *subrow;
        uiBlock *block;
        uiBut *but;
        Panel *pa;
-       ListBase lb;
+       ListBase lb, *itemlb;
        char *name, str[32];
        int icon=0, i= 0, activei= 0, len, items, found, min, max;
 
@@ -1361,7 +1381,39 @@ ListBase uiTemplateList(uiLayout *layout, PointerRNA *ptr, char *propname, Point
        /* get active data */
        activei= RNA_property_int_get(activeptr, activeprop);
 
-       if(compact) {
+       if(listtype == 'i') {
+               box= uiLayoutListBox(layout);
+               col= uiLayoutColumn(box, 1);
+               row= uiLayoutRow(col, 0);
+
+               itemlb= uiLayoutBoxGetList(box);
+
+               if(ptr->data && prop) {
+                       /* create list items */
+                       RNA_PROP_BEGIN(ptr, itemptr, prop) {
+                               /* create button */
+                               if(i == 9)
+                                       row= uiLayoutRow(col, 0);
+
+                               if(RNA_struct_is_a(itemptr.type, &RNA_TextureSlot)) {
+#if 0
+                                       MTex *mtex= itemptr.data;
+
+                                       if(mtex && mtex->tex)
+                                               icon= ui_id_icon_get(scene, &mtex->tex->id);
+#endif
+                               }
+
+                               uiDefIconButR(block, LISTROW, 0, icon, 0,0,UI_UNIT_X*10,UI_UNIT_Y, activeptr, activepropname, 0, 0, i, 0, 0, "");
+
+                               //list_item_add(&lb, itemlb, uiLayoutRow(row, 1), &itemptr);
+
+                               i++;
+                       }
+                       RNA_PROP_END;
+               }
+       }
+       else if(listtype == 'c') {
                /* compact layout */
                found= 0;
 
@@ -1381,9 +1433,7 @@ ListBase uiTemplateList(uiLayout *layout, PointerRNA *ptr, char *propname, Point
                                                MEM_freeN(name);
 
                                        /* add to list to return */
-                                       link= MEM_callocN(sizeof(CollectionPointerLink), "uiTemplateList return");
-                                       link->ptr= itemptr;
-                                       BLI_addtail(&lb, link);
+                                       //list_item_add(&lb, itemlb, uiLayoutRow(row, 1), &itemptr);
                                }
 
                                i++;
@@ -1402,45 +1452,53 @@ ListBase uiTemplateList(uiLayout *layout, PointerRNA *ptr, char *propname, Point
                        uiButSetFlag(but, UI_BUT_DISABLED);
        }
        else {
-               /* default rows/columns */
+               /* default rows */
                if(rows == 0)
                        rows= 5;
-               if(columns == 0)
-                       columns= 1;
 
                /* layout */
-               box= uiLayoutBox(layout);
+               box= uiLayoutListBox(layout);
                row= uiLayoutRow(box, 0);
                col = uiLayoutColumn(row, 1);
 
-               uiBlockSetEmboss(block, UI_EMBOSSN);
-
                /* init numbers */
                RNA_property_int_range(activeptr, activeprop, &min, &max);
 
                len= max - min + 1;
-               items= rows*columns;
+               items= CLAMPIS(len, rows, 5);
 
                pa->list_scroll= MIN2(pa->list_scroll, len-items);
                pa->list_scroll= MAX2(pa->list_scroll, 0);
 
+               itemlb= uiLayoutBoxGetList(box);
+
                if(ptr->data && prop) {
                        /* create list items */
                        RNA_PROP_BEGIN(ptr, itemptr, prop) {
                                if(i >= pa->list_scroll && i<pa->list_scroll+items) {
                                        name= RNA_struct_name_get_alloc(&itemptr, NULL, 0);
 
+                                       subrow= uiLayoutRow(col, 0);
+
                                        /* create button */
-                                       but= uiDefIconTextButR(block, ROW, 0, icon, (name)? name: "", 0,0,UI_UNIT_X*10,UI_UNIT_Y, activeptr, activepropname, 0, 0, i, 0, 0, "");
+                                       if(!icon || icon == ICON_DOT)
+                                               but= uiDefButR(block, LISTROW, 0, (name)? name: "", 0,0,UI_UNIT_X*10,UI_UNIT_Y, activeptr, activepropname, 0, 0, i, 0, 0, "");
+                                       else
+                                               but= uiDefIconTextButR(block, LISTROW, 0, icon, (name)? name: "", 0,0,UI_UNIT_X*10,UI_UNIT_Y, activeptr, activepropname, 0, 0, i, 0, 0, "");
                                        uiButSetFlag(but, UI_ICON_LEFT|UI_TEXT_LEFT);
 
+                                       /* XXX hardcoded */
+                                       if(itemptr.type == &RNA_MeshTextureFaceLayer || itemptr.type == &RNA_MeshColorLayer) {
+                                               uiBlockSetEmboss(block, UI_EMBOSSN);
+                                               uiItemR(subrow, "", ICON_SCENE, &itemptr, "active_render", 0, 0, 0);
+                                               uiBlockSetEmboss(block, UI_EMBOSS);
+                                       }
+
                                        if(name)
                                                MEM_freeN(name);
 
                                        /* add to list to return */
-                                       link= MEM_callocN(sizeof(CollectionPointerLink), "uiTemplateList return");
-                                       link->ptr= itemptr;
-                                       BLI_addtail(&lb, link);
+                                       //list_item_add(&lb, itemlb, subrow, &itemptr);
                                }
 
                                i++;
@@ -1455,8 +1513,6 @@ ListBase uiTemplateList(uiLayout *layout, PointerRNA *ptr, char *propname, Point
                        i++;
                }
 
-               uiBlockSetEmboss(block, UI_EMBOSS);
-
                /* add scrollbar */
                if(len > items) {
                        col= uiLayoutColumn(row, 0);
index afb7e74daff4a7d0545702f73aa78931a7dcfdae..97c2bb55a691174baa18c4ed230ec6e69c3959f9 100644 (file)
@@ -536,7 +536,7 @@ static void shadecolors4(char *coltop, char *coldown, char *color, short shadeto
 static void round_box_shade_col4(char *col1, char *col2, float fac)
 {
        int faci, facm;
-       char col[4];
+       unsigned char col[4];
        
        faci= floor(255.1f*fac);
        facm= 255-faci;
@@ -575,7 +575,7 @@ static void widgetbase_draw(uiWidgetBase *wtb, uiWidgetColors *wcol)
                if(wcol->shaded==0) {
                        
                        /* filled center, solid */
-                       glColor4ubv(wcol->inner);
+                       glColor4ubv((unsigned char*)wcol->inner);
                        glBegin(GL_POLYGON);
                        for(a=0; a<wtb->totvert; a++)
                                glVertex2fv(wtb->inner_v[a]);
@@ -682,7 +682,7 @@ static void widget_draw_icon(uiBut *but, BIFIconID icon, int blend, rcti *rect)
                height= ICON_HEIGHT;
        
        /* calculate blend color */
-       if ELEM3(but->type, TOG, ROW, TOGN) {
+       if ELEM4(but->type, TOG, ROW, TOGN, LISTROW) {
                if(but->flag & UI_SELECT);
                else if(but->flag & UI_ACTIVE);
                else blend= -60;
@@ -806,7 +806,7 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b
                                
                                but->drawstr[selend_tmp]= ch;
                                
-                               glColor3ubv(wcol->item);
+                               glColor3ubv((unsigned char*)wcol->item);
                                glRects(rect->xmin+selsta_draw+1, rect->ymin+2, rect->xmin+selwidth_draw+1, rect->ymax-2);
                        }
                } else {
@@ -838,7 +838,7 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b
                if(cpoin) *cpoin= 0;            
        }
        
-       glColor3ubv(wcol->text);
+       glColor3ubv((unsigned char*)wcol->text);
        uiStyleFontDraw(fstyle, rect, but->drawstr+but->ofs);
 
        /* part text right aligned */
@@ -1123,6 +1123,19 @@ static struct uiWidgetColors wcol_scroll= {
        10, -20
 };
 
+static struct uiWidgetColors wcol_list_item= {
+       {0, 0, 0, 255},
+       {0, 0, 0, 0},
+       {86, 128, 194, 255},
+       {0, 0, 0, 255},
+       
+       {0, 0, 0, 255},
+       {0, 0, 0, 255},
+       
+       0,
+       0, 0
+};
+
 /* free wcol struct to play with */
 static struct uiWidgetColors wcol_tmp= {
        {0, 0, 0, 255},
@@ -1155,6 +1168,7 @@ void ui_widget_color_init(ThemeUI *tui)
        tui->wcol_menu_item= wcol_menu_item;
        tui->wcol_box= wcol_box;
        tui->wcol_scroll= wcol_scroll;
+       tui->wcol_list_item= wcol_list_item;
 
        tui->wcol_state= wcol_state;
 }
@@ -1724,7 +1738,7 @@ static void widget_scroll(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
 {
        rcti rect1;
        double value;
-       float fac, size;
+       float fac, size, min;
        int horizontal;
 
        /* calculate slider part */
@@ -1743,11 +1757,35 @@ static void widget_scroll(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
                fac= (rect->xmax - rect->xmin)/(size);
                rect1.xmin= rect1.xmin + ceil(fac*(value - but->softmin));
                rect1.xmax= rect1.xmin + ceil(fac*(but->a1 - but->softmin));
+
+               /* ensure minimium size */
+               min= rect->ymax - rect->ymin;
+
+               if(rect1.xmax - rect1.xmin < min) {
+                       rect1.xmax= rect1.xmin + min;
+
+                       if(rect1.xmax > rect->xmax) {
+                               rect1.xmax= rect->xmax;
+                               rect1.xmin= MAX2(rect1.xmax - min, rect->xmin);
+                       }
+               }
        }
        else {
                fac= (rect->ymax - rect->ymin)/(size);
                rect1.ymax= rect1.ymax - ceil(fac*(value - but->softmin));
                rect1.ymin= rect1.ymax - ceil(fac*(but->a1 - but->softmin));
+
+               /* ensure minimium size */
+               min= rect->xmax - rect->xmin;
+
+               if(rect1.ymax - rect1.ymin < min) {
+                       rect1.ymax= rect1.ymin + min;
+
+                       if(rect1.ymax > rect->ymax) {
+                               rect1.ymax= rect->ymax;
+                               rect1.ymin= MAX2(rect1.ymax - min, rect->ymin);
+                       }
+               }
        }
 
        if(state & UI_SELECT)
@@ -1755,7 +1793,6 @@ static void widget_scroll(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
        else
                state= 0;
        uiWidgetScrollDraw(wcol, rect, &rect1, state);
-
 }
 
 static void widget_link(uiBut *but, uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
@@ -1918,6 +1955,18 @@ static void widget_menu_itembut(uiWidgetColors *wcol, rcti *rect, int state, int
        widgetbase_draw(&wtb, wcol);
 }
 
+static void widget_list_itembut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
+{
+       uiWidgetBase wtb;
+       
+       widget_init(&wtb);
+       
+       /* rounded, but no outline */
+       wtb.outline= 0;
+       round_box_edges(&wtb, 15, rect, 4.0f);
+       
+       widgetbase_draw(&wtb, wcol);
+}
 
 static void widget_optionbut(uiWidgetColors *wcol, rcti *rect, int state, int roundboxalign)
 {
@@ -2067,7 +2116,6 @@ static uiWidgetType *widget_type(uiWidgetTypeEnum type)
                case UI_WTYPE_OPTION:
                        wt.wcol_theme= &btheme->tui.wcol_option;
                        wt.draw= widget_optionbut;
-                       wt.state= widget_state_label;
                        break;
                        
                case UI_WTYPE_RADIO:
@@ -2161,6 +2209,11 @@ static uiWidgetType *widget_type(uiWidgetTypeEnum type)
                        wt.state= widget_state_nothing;
                        wt.custom= widget_scroll;
                        break;
+
+               case UI_WTYPE_LISTITEM:
+                       wt.wcol_theme= &btheme->tui.wcol_list_item;
+                       wt.draw= widget_list_itembut;
+                       break;
        }
        
        return &wt;
@@ -2268,6 +2321,10 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct
                        case ROW:
                                wt= widget_type(UI_WTYPE_RADIO);
                                break;
+
+                       case LISTROW:
+                               wt= widget_type(UI_WTYPE_LISTITEM);
+                               break;
                                
                        case TEX:
                                wt= widget_type(UI_WTYPE_NAME);
@@ -2315,6 +2372,7 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct
                                break;
                                
                        case ROUNDBOX:
+                       case LISTBOX:
                                wt= widget_type(UI_WTYPE_BOX);
                                break;
                                
@@ -2437,7 +2495,7 @@ void ui_draw_menu_item(uiFontStyle *fstyle, rcti *rect, char *name, int iconid,
                rect->xmax -= BLF_width(cpoin+1) + 10;
        }
        
-       glColor3ubv(wt->wcol.text);
+       glColor3ubv((unsigned char*)wt->wcol.text);
        uiStyleFontDraw(fstyle, rect, name);
        
        /* part text right aligned */
index 4fab0de1f0ad6e1c018d2aaa7bc03d1edcefdae4..d8a943e165663b6da125287b4aea493478f2e098 100644 (file)
@@ -139,7 +139,7 @@ typedef struct ThemeUI {
        uiWidgetColors wcol_radio, wcol_option, wcol_toggle;
        uiWidgetColors wcol_num, wcol_numslider;
        uiWidgetColors wcol_menu, wcol_pulldown, wcol_menu_back, wcol_menu_item;
-       uiWidgetColors wcol_box, wcol_scroll;
+       uiWidgetColors wcol_box, wcol_scroll, wcol_list_item;
 
        uiWidgetStateColors wcol_state;
        
index e83557957f69f3830be6d07ed3d62ce9d5d01a2a..8a51a5f4142b73805af586bfd4b592bb137259c2 100644 (file)
@@ -199,7 +199,7 @@ static StructRNA *rna_Panel_register(const bContext *C, ReportList *reports, voi
        return pt->py_srna;
 }
 
-static StructRNA* rna_Panel_refine(struct PointerRNA *ptr)
+static StructRNA* rna_Panel_refine(PointerRNA *ptr)
 {
        Panel *hdr= (Panel*)ptr->data;
        return (hdr->type && hdr->type->py_srna)? hdr->type->py_srna: &RNA_Panel;
@@ -290,7 +290,7 @@ static StructRNA *rna_Header_register(const bContext *C, ReportList *reports, vo
        return ht->py_srna;
 }
 
-static StructRNA* rna_Header_refine(struct PointerRNA *htr)
+static StructRNA* rna_Header_refine(PointerRNA *htr)
 {
        Header *hdr= (Header*)htr->data;
        return (hdr->type && hdr->type->py_srna)? hdr->type->py_srna: &RNA_Header;
@@ -405,92 +405,108 @@ static StructRNA *rna_Menu_register(const bContext *C, ReportList *reports, void
        return mt->py_srna;
 }
 
-static StructRNA* rna_Menu_refine(struct PointerRNA *mtr)
+static StructRNA* rna_Menu_refine(PointerRNA *mtr)
 {
        Menu *hdr= (Menu*)mtr->data;
        return (hdr->type && hdr->type->py_srna)? hdr->type->py_srna: &RNA_Menu;
 }
 
-static int rna_UILayout_active_get(struct PointerRNA *ptr)
+static int rna_UILayout_active_get(PointerRNA *ptr)
 {
        return uiLayoutGetActive(ptr->data);
 }
 
-static void rna_UILayout_active_set(struct PointerRNA *ptr, int value)
+static void rna_UILayout_active_set(PointerRNA *ptr, int value)
 {
        uiLayoutSetActive(ptr->data, value);
 }
 
-static void rna_UILayout_op_context_set(struct PointerRNA *ptr, int value)
+static void rna_UILayout_op_context_set(PointerRNA *ptr, int value)
 {
        uiLayoutSetOperatorContext(ptr->data, value);
 }
 
-static int rna_UILayout_op_context_get(struct PointerRNA *ptr)
+static int rna_UILayout_op_context_get(PointerRNA *ptr)
 {
        return uiLayoutGetOperatorContext(ptr->data);
 }
 
-static int rna_UILayout_enabled_get(struct PointerRNA *ptr)
+static int rna_UILayout_enabled_get(PointerRNA *ptr)
 {
        return uiLayoutGetEnabled(ptr->data);
 }
 
-static void rna_UILayout_enabled_set(struct PointerRNA *ptr, int value)
+static void rna_UILayout_enabled_set(PointerRNA *ptr, int value)
 {
        uiLayoutSetEnabled(ptr->data, value);
 }
 
-static int rna_UILayout_red_alert_get(struct PointerRNA *ptr)
+#if 0
+static int rna_UILayout_red_alert_get(PointerRNA *ptr)
 {
        return uiLayoutGetRedAlert(ptr->data);
 }
 
-static void rna_UILayout_red_alert_set(struct PointerRNA *ptr, int value)
+static void rna_UILayout_red_alert_set(PointerRNA *ptr, int value)
 {
        uiLayoutSetRedAlert(ptr->data, value);
 }
 
-static int rna_UILayout_keep_aspect_get(struct PointerRNA *ptr)
+static int rna_UILayout_keep_aspect_get(PointerRNA *ptr)
 {
        return uiLayoutGetKeepAspect(ptr->data);
 }
 
-static void rna_UILayout_keep_aspect_set(struct PointerRNA *ptr, int value)
+static void rna_UILayout_keep_aspect_set(PointerRNA *ptr, int value)
 {
        uiLayoutSetKeepAspect(ptr->data, value);
 }
+#endif
 
-static int rna_UILayout_alignment_get(struct PointerRNA *ptr)
+static int rna_UILayout_alignment_get(PointerRNA *ptr)
 {
        return uiLayoutGetAlignment(ptr->data);
 }
 
-static void rna_UILayout_alignment_set(struct PointerRNA *ptr, int value)
+static void rna_UILayout_alignment_set(PointerRNA *ptr, int value)
 {
        uiLayoutSetAlignment(ptr->data, value);
 }
 
-static float rna_UILayout_scale_x_get(struct PointerRNA *ptr)
+static float rna_UILayout_scale_x_get(PointerRNA *ptr)
 {
        return uiLayoutGetScaleX(ptr->data);
 }
 
-static void rna_UILayout_scale_x_set(struct PointerRNA *ptr, float value)
+static void rna_UILayout_scale_x_set(PointerRNA *ptr, float value)
 {
        uiLayoutSetScaleX(ptr->data, value);
 }
 
-static float rna_UILayout_scale_y_get(struct PointerRNA *ptr)
+static float rna_UILayout_scale_y_get(PointerRNA *ptr)
 {
        return uiLayoutGetScaleY(ptr->data);
 }
 
-static void rna_UILayout_scale_y_set(struct PointerRNA *ptr, float value)
+static void rna_UILayout_scale_y_set(PointerRNA *ptr, float value)
 {
        uiLayoutSetScaleY(ptr->data, value);
 }
 
+static PointerRNA rna_UIListItem_layout_get(PointerRNA *ptr)
+{
+       uiListItem *item= (uiListItem*)ptr->data;
+       PointerRNA newptr;
+       RNA_pointer_create(NULL, &RNA_UILayout, item->layout, &newptr);
+       return newptr;
+}
+
+static PointerRNA rna_UIListItem_data_get(PointerRNA *ptr)
+{
+       uiListItem *item= (uiListItem*)ptr->data;
+       return item->data;
+}
+
 #else // RNA_RUNTIME
 
 static void rna_def_ui_layout(BlenderRNA *brna)
@@ -516,6 +532,8 @@ static void rna_def_ui_layout(BlenderRNA *brna)
                {WM_OP_EXEC_AREA, "EXEC_AREA", 0, "Exec Area", ""},
                {WM_OP_EXEC_SCREEN, "EXEC_SCREEN", 0, "Exec Screen", ""},
                {0, NULL, 0, NULL, NULL}};
+       
+       /* layout */
 
        srna= RNA_def_struct(brna, "UILayout", NULL);
        RNA_def_struct_sdna(srna, "uiLayout");
@@ -531,15 +549,19 @@ static void rna_def_ui_layout(BlenderRNA *brna)
        prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_funcs(prop, "rna_UILayout_enabled_get", "rna_UILayout_enabled_set");
 
+#if 0
        prop= RNA_def_property(srna, "red_alert", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_funcs(prop, "rna_UILayout_red_alert_get", "rna_UILayout_red_alert_set");
+#endif
 
        prop= RNA_def_property(srna, "alignment", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_items(prop, alignment_items);
        RNA_def_property_enum_funcs(prop, "rna_UILayout_alignment_get", "rna_UILayout_alignment_set", NULL);
 
+#if 0
        prop= RNA_def_property(srna, "keep_aspect", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_funcs(prop, "rna_UILayout_keep_aspect_get", "rna_UILayout_keep_aspect_set");
+#endif
 
        prop= RNA_def_property(srna, "scale_x", PROP_FLOAT, PROP_UNSIGNED);
        RNA_def_property_float_funcs(prop, "rna_UILayout_scale_x_get", "rna_UILayout_scale_x_set", NULL);
@@ -548,6 +570,21 @@ static void rna_def_ui_layout(BlenderRNA *brna)
        RNA_def_property_float_funcs(prop, "rna_UILayout_scale_y_get", "rna_UILayout_scale_y_set", NULL);
 
        RNA_api_ui_layout(srna);
+
+       /* list item */
+
+       srna= RNA_def_struct(brna, "UIListItem", NULL);
+       RNA_def_struct_ui_text(srna, "UI List Item", "User interface list.");
+
+       prop= RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE);
+       RNA_def_property_struct_type(prop, "UILayout");
+       RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+       RNA_def_property_pointer_funcs(prop, "rna_UIListItem_layout_get", NULL, NULL);
+
+       prop= RNA_def_property(srna, "data", PROP_POINTER, PROP_NONE);
+       RNA_def_property_struct_type(prop, "AnyType");
+       RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+       RNA_def_property_pointer_funcs(prop, "rna_UIListItem_data_get", NULL, NULL);
 }
 
 static void rna_def_panel(BlenderRNA *brna)
index 404befc9bb284ef67406840cb88b331d23ea5c00..e89e633acbe417804d6958fdb8fd080d2434402b 100644 (file)
@@ -86,6 +86,12 @@ void RNA_api_ui_layout(StructRNA *srna)
                {'v', "VECTOR", 0, "Vector", ""},
                {'c', "COLOR", 0, "Color", ""},
                {0, NULL, 0, NULL, NULL}};
+       
+       static EnumPropertyItem list_type_items[] = {
+               {0, "DEFAULT", 0, "None", ""},
+               {'c', "COMPACT", 0, "Compact", ""},
+               {'i', "ICONS", 0, "Icons", ""},
+               {0, NULL, 0, NULL, NULL}};
 
        /* simple layout specifiers */
        func= RNA_def_function(srna, "row", "uiLayoutRow");
@@ -258,14 +264,14 @@ void RNA_api_ui_layout(StructRNA *srna)
        RNA_def_property_flag(parm, PROP_REQUIRED);
 
        func= RNA_def_function(srna, "template_list", "uiTemplateList");
+       RNA_def_function_flag(func, FUNC_USE_CONTEXT);
        api_ui_item_rna_common(func);
        parm= RNA_def_pointer(func, "active_data", "AnyType", "", "Data from which to take property for the active element.");
        RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR);
        parm= RNA_def_string(func, "active_property", "", 0, "", "Identifier of property in data, for the active element.");
        RNA_def_property_flag(parm, PROP_REQUIRED);
        parm= RNA_def_int(func, "rows", 5, 0, INT_MAX, "", "Number of rows to display.", 0, INT_MAX);
-       parm= RNA_def_int(func, "columns", 5, 0, INT_MAX, "", "Number of columns to display.", 0, INT_MAX);
-       parm= RNA_def_boolean(func, "compact", 0, "", "Use compact, single row list template.");
+       parm= RNA_def_enum(func, "type", list_type_items, 0, "Type", "Type of list to use.");
        parm= RNA_def_collection(func, "items", 0, "", "Items visible in the list.");
        RNA_def_function_return(func, parm);
 
index 5235883e4089d7773a273595a08f388ac03d4aa3..f9aa27fcdbd8f8cf65ad336c08f749438934d152 100644 (file)
@@ -410,6 +410,12 @@ static void rna_def_userdef_theme_ui(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Scroll Widget Colors", "");
        RNA_def_property_update(prop, NC_WINDOW, NULL);
 
+       prop= RNA_def_property(srna, "wcol_list_item", PROP_POINTER, PROP_NEVER_NULL);
+       RNA_def_property_pointer_sdna(prop, NULL, "wcol_list_item");
+       RNA_def_property_struct_type(prop, "ThemeWidgetColors");
+       RNA_def_property_ui_text(prop, "List Item Colors", "");
+       RNA_def_property_update(prop, NC_WINDOW, NULL);
+
        prop= RNA_def_property(srna, "wcol_state", PROP_POINTER, PROP_NEVER_NULL);
        RNA_def_property_pointer_sdna(prop, NULL, "wcol_state");
        RNA_def_property_struct_type(prop, "ThemeWidgetStateColors");