Merging r50522 through r50572 from trunk into soc-2011-tomato
[blender.git] / source / blender / editors / interface / interface_utils.c
index 54aef0729a80bb8de61dc77f7ecb2163973ba910..d363609fbd92101f5207583dac15efaf0becc9c4 100644 (file)
@@ -36,8 +36,9 @@
 #include "DNA_object_types.h"
 
 #include "BLI_utildefines.h"
+#include "BLI_string.h"
 
-#include "BLF_api.h"
+#include "BLF_translation.h"
 
 #include "BKE_context.h"
 
 
 uiBut *uiDefAutoButR(uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int index, const char *name, int icon, int x1, int y1, int x2, int y2)
 {
-       uiBut *but=NULL;
+       uiBut *but = NULL;
 
-       switch(RNA_property_type(prop)) {
+       switch (RNA_property_type(prop)) {
                case PROP_BOOLEAN:
                {
-                       int arraylen= RNA_property_array_length(ptr, prop);
+                       int arraylen = RNA_property_array_length(ptr, prop);
 
-                       if(arraylen && index == -1)
+                       if (arraylen && index == -1)
                                return NULL;
                        
-                       if(icon && name && name[0] == '\0')
-                               but= uiDefIconButR_prop(block, ICONTOG, 0, icon, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
-                       else if(icon)
-                               but= uiDefIconTextButR_prop(block, ICONTOG, 0, icon, name, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
+                       if (icon && name && name[0] == '\0')
+                               but = uiDefIconButR_prop(block, ICONTOG, 0, icon, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
+                       else if (icon)
+                               but = uiDefIconTextButR_prop(block, ICONTOG, 0, icon, name, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
                        else
-                               but= uiDefButR_prop(block, OPTION, 0, name, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
+                               but = uiDefButR_prop(block, OPTION, 0, name, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
                        break;
                }
                case PROP_INT:
                case PROP_FLOAT:
                {
-                       int arraylen= RNA_property_array_length(ptr, prop);
+                       int arraylen = RNA_property_array_length(ptr, prop);
 
-                       if(arraylen && index == -1) {
-                               if(ELEM(RNA_property_subtype(prop), PROP_COLOR, PROP_COLOR_GAMMA))
-                                       but= uiDefButR_prop(block, COL, 0, name, x1, y1, x2, y2, ptr, prop, 0, 0, 0, -1, -1, NULL);
+                       if (arraylen && index == -1) {
+                               if (ELEM(RNA_property_subtype(prop), PROP_COLOR, PROP_COLOR_GAMMA))
+                                       but = uiDefButR_prop(block, COLOR, 0, name, x1, y1, x2, y2, ptr, prop, 0, 0, 0, -1, -1, NULL);
                        }
-                       else if(RNA_property_subtype(prop) == PROP_PERCENTAGE || RNA_property_subtype(prop) == PROP_FACTOR)
-                               but= uiDefButR_prop(block, NUMSLI, 0, name, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
+                       else if (RNA_property_subtype(prop) == PROP_PERCENTAGE || RNA_property_subtype(prop) == PROP_FACTOR)
+                               but = uiDefButR_prop(block, NUMSLI, 0, name, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
                        else
-                               but= uiDefButR_prop(block, NUM, 0, name, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
+                               but = uiDefButR_prop(block, NUM, 0, name, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
                        break;
                }
                case PROP_ENUM:
-                       if(icon && name && name[0] == '\0')
-                               but= uiDefIconButR_prop(block, MENU, 0, icon, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
-                       else if(icon)
-                               but= uiDefIconTextButR_prop(block, MENU, 0, icon, NULL, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
+                       if (icon && name && name[0] == '\0')
+                               but = uiDefIconButR_prop(block, MENU, 0, icon, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
+                       else if (icon)
+                               but = uiDefIconTextButR_prop(block, MENU, 0, icon, NULL, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
                        else
-                               but= uiDefButR_prop(block, MENU, 0, NULL, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
+                               but = uiDefButR_prop(block, MENU, 0, NULL, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
                        break;
                case PROP_STRING:
-                       if(icon && name && name[0] == '\0')
-                               but= uiDefIconButR_prop(block, TEX, 0, icon, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
-                       else if(icon)
-                               but= uiDefIconTextButR_prop(block, TEX, 0, icon, name, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
+                       if (icon && name && name[0] == '\0')
+                               but = uiDefIconButR_prop(block, TEX, 0, icon, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
+                       else if (icon)
+                               but = uiDefIconTextButR_prop(block, TEX, 0, icon, name, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
                        else
-                               but= uiDefButR_prop(block, TEX, 0, name, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
+                               but = uiDefButR_prop(block, TEX, 0, name, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
                        break;
-               case PROP_POINTER: {
+               case PROP_POINTER:
+               {
                        PointerRNA pptr;
 
-                       pptr= RNA_property_pointer_get(ptr, prop);
-                       if(!pptr.type)
-                               pptr.type= RNA_property_pointer_type(ptr, prop);
-                       icon= RNA_struct_ui_icon(pptr.type);
-                       if(icon == ICON_DOT)
-                               icon= 0;
+                       pptr = RNA_property_pointer_get(ptr, prop);
+                       if (!pptr.type)
+                               pptr.type = RNA_property_pointer_type(ptr, prop);
+                       icon = RNA_struct_ui_icon(pptr.type);
+                       if (icon == ICON_DOT)
+                               icon = 0;
 
-                       but= uiDefIconTextButR_prop(block, IDPOIN, 0, icon, name, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
+                       but = uiDefIconTextButR_prop(block, IDPOIN, 0, icon, name, x1, y1, x2, y2, ptr, prop, index, 0, 0, -1, -1, NULL);
                        break;
                }
-               case PROP_COLLECTION: {
+               case PROP_COLLECTION:
+               {
                        char text[256];
-                       sprintf(text, UI_translate_do_iface(N_("%d items")), RNA_property_collection_length(ptr, prop));
-                       but= uiDefBut(block, LABEL, 0, text, x1, y1, x2, y2, NULL, 0, 0, 0, 0, NULL);
+                       BLI_snprintf(text, sizeof(text), IFACE_("%d items"), RNA_property_collection_length(ptr, prop));
+                       but = uiDefBut(block, LABEL, 0, text, x1, y1, x2, y2, NULL, 0, 0, 0, 0, NULL);
                        uiButSetFlag(but, UI_BUT_DISABLED);
                        break;
                }
                default:
-                       but= NULL;
+                       but = NULL;
                        break;
        }
 
        return but;
 }
 
-int uiDefAutoButsRNA(uiLayout *layout, PointerRNA *ptr, int (*check_prop)(PropertyRNA *), const char label_align)
+/**
+ * \a check_prop callback filters functions to avoid drawing certain properties,
+ * in cases where PROP_HIDDEN flag can't be used for a property.
+ */
+int uiDefAutoButsRNA(uiLayout *layout, PointerRNA *ptr,
+                     int (*check_prop)(PointerRNA *, PropertyRNA *),
+                     const char label_align)
 {
        uiLayout *split, *col;
        int flag;
        const char *name;
-       int tot= 0;
+       int tot = 0;
 
        assert(ELEM3(label_align, '\0', 'H', 'V'));
 
-       RNA_STRUCT_BEGIN(ptr, prop) {
-               flag= RNA_property_flag(prop);
-               if(flag & PROP_HIDDEN || (check_prop && check_prop(prop)==FALSE))
+       RNA_STRUCT_BEGIN (ptr, prop)
+       {
+               flag = RNA_property_flag(prop);
+               if (flag & PROP_HIDDEN || (check_prop && check_prop(ptr, prop) == FALSE))
                        continue;
 
-               if(label_align != '\0') {
+               if (label_align != '\0') {
                        PropertyType type = RNA_property_type(prop);
                        int is_boolean = (type == PROP_BOOLEAN && !RNA_property_array_check(prop));
 
-                       name= RNA_property_ui_name(prop);
+                       name = RNA_property_ui_name(prop);
 
-                       if(label_align=='V') {
-                               col= uiLayoutColumn(layout, 1);
+                       if (label_align == 'V') {
+                               col = uiLayoutColumn(layout, TRUE);
 
-                               if(!is_boolean)
+                               if (!is_boolean)
                                        uiItemL(col, name, ICON_NONE);
                        }
-                       else if(label_align=='H') {
-                               split = uiLayoutSplit(layout, 0.5f, 0);
+                       else if (label_align == 'H') {
+                               split = uiLayoutSplit(layout, 0.5f, FALSE);
 
-                               col= uiLayoutColumn(split, 0);
-                               uiItemL(col, (is_boolean)? "": name, ICON_NONE);
-                               col= uiLayoutColumn(split, 0);
+                               col = uiLayoutColumn(split, FALSE);
+                               uiItemL(col, (is_boolean) ? "" : name, ICON_NONE);
+                               col = uiLayoutColumn(split, FALSE);
                        }
                        else {
-                               col= NULL;
+                               col = NULL;
                        }
 
                        /* may meed to add more cases here.
                         * don't override enum flag names */
 
                        /* name is shown above, empty name for button below */
-                       name= (flag & PROP_ENUM_FLAG || is_boolean)? NULL: "";
+                       name = (flag & PROP_ENUM_FLAG || is_boolean) ? NULL : "";
                }
                else {
-                       col= layout;
-                       name= NULL; /* no smart label alignment, show default name with button */
+                       col = layout;
+                       name = NULL; /* no smart label alignment, show default name with button */
                }
 
                uiItemFullR(col, ptr, prop, -1, 0, 0, name, ICON_NONE);
@@ -193,24 +203,24 @@ int uiIconFromID(ID *id)
        PointerRNA ptr;
        short idcode;
 
-       if(id==NULL)
+       if (id == NULL)
                return ICON_NONE;
        
-       idcode= GS(id->name);
+       idcode = GS(id->name);
 
        /* exception for objects */
-       if(idcode == ID_OB) {
-               ob= (Object*)id;
+       if (idcode == ID_OB) {
+               ob = (Object *)id;
 
-               if(ob->type == OB_EMPTY)
+               if (ob->type == OB_EMPTY)
                        return ICON_EMPTY_DATA;
                else
                        return uiIconFromID(ob->data);
        }
 
        /* otherwise get it through RNA, creating the pointer
-          will set the right type, also with subclassing */
+        * will set the right type, also with subclassing */
        RNA_id_pointer_create(id, &ptr);
 
-       return (ptr.type)? RNA_struct_ui_icon(ptr.type) : ICON_NONE;
+       return (ptr.type) ? RNA_struct_ui_icon(ptr.type) : ICON_NONE;
 }