2.5 - Armature Buttons + UI-Templates
authorJoshua Leung <aligorith@gmail.com>
Sat, 13 Jun 2009 11:21:02 +0000 (11:21 +0000)
committerJoshua Leung <aligorith@gmail.com>
Sat, 13 Jun 2009 11:21:02 +0000 (11:21 +0000)
Added a new template for layer-buttons, which auto-determines the layout of the buttons instead of relying on some hardcoded pattern for n-layers (i.e. 16 or 20 currently). This is a still bit rough, and could do with some refining to allow us to define what extra info (icons) should get drawn on the buttons or so.

Currently, this is only used in the Armature buttons to allow showing/hiding layers.

release/ui/buttons_data_armature.py
source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface_api.c
source/blender/editors/interface/interface_templates.c

index fd317baf86110fa0df6639f2010495e5dce2c4c7..0b02eee9f7b8fa05a83ae1f749fb3e6ef62bb41c 100644 (file)
@@ -45,9 +45,9 @@ class DATA_PT_skeleton(DataButtonsPanel):
                        
                        sub = split.column()
                        sub.itemL(text="Layers:")
-                       sub.itemL(text="LAYERS")
-                       #sub.itemR(arm, "layer")
-                       #sub.itemR(arm, "layer_protection")
+                       sub.template_layers(arm, "layer")
+                       sub.itemL(text="Protected Layers:")
+                       sub.template_layers(arm, "layer_protection")
 
 class DATA_PT_display(DataButtonsPanel):
        __idname__ = "DATA_PT_display"
index 48a859dadc485e06a7634a2a24ff9e94fb915ecb..eb3a037d7b161c670b689b8fe9881cc0f96a9b7e 100644 (file)
@@ -615,6 +615,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, struct PointerRNA *ptr);
 void uiTemplatePreview(uiLayout *layout, struct ID *id);
 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);
 
 /* items */
 void uiItemO(uiLayout *layout, char *name, int icon, char *opname);
index 60bfe4e79ad774571d9d8540aab05b4fd31c0708..b4e7dc03506ed0cd3155621a5aeca894cb3aa280 100644 (file)
@@ -230,5 +230,11 @@ void RNA_api_ui_layout(StructRNA *srna)
        parm= RNA_def_pointer(func, "ramp", "ColorRamp", "", "Color ramp pointer.");
        RNA_def_property_flag(parm, PROP_REQUIRED);
        RNA_def_boolean(func, "expand", 0, "", "Expand button to show more detail.");
+       
+       func= RNA_def_function(srna, "template_layers", "uiTemplateLayers");
+       parm= RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property.");
+       RNA_def_property_flag(parm, PROP_REQUIRED);
+       parm= RNA_def_string(func, "property", "", 0, "", "Identifier of pointer property in data.");
+       RNA_def_property_flag(parm, PROP_REQUIRED);
 }
 
index 53238a306cd8e8c1ef5c176a187f6f001fa0241b..63de328af0f0e598e839c638ffc9d76648d5d43d 100644 (file)
@@ -1439,3 +1439,56 @@ void uiTemplateCurveMapping(uiLayout *layout, CurveMapping *cumap, int type)
        }
 }
 
+/********************* Layer Buttons Template ************************/
+
+// TODO:
+//     - option for showing extra info like whether layer has contents?
+//     - for now, grouping of layers is determined by dividing up the length of 
+//       the array of layer bitflags
+
+void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, char *propname)
+{
+       uiBlock *block;
+       uiLayout *uRow, *uSplit, *uCol;
+       PropertyRNA *prop;
+       StructRNA *type;
+       int groups, cols, layers;
+       int group, col, layer, row;
+       
+       if (!ptr->data)
+               return;
+       
+       prop= RNA_struct_find_property(ptr, propname);
+       if (!prop) {
+               printf("uiTemplateLayer: layers property not found: %s\n", propname);
+               return;
+       }
+       
+       /* the number of layers determines the way we group them 
+        *      - we want 2 rows only (for now)
+        *      - the number of columns (cols) is the total number of buttons per row
+        *        the 'remainder' is added to this, as it will be ok to have first row slightly wider if need be
+        *      - for now, only split into groups if if group will have at least 5 items
+        */
+       layers= RNA_property_array_length(prop);
+       cols= (layers / 2) + (layers % 2);
+       groups= ((cols / 2) < 5) ? (1) : (cols / 2);
+       
+       /* layers are laid out going across rows, with the columns being divided into groups */
+       uSplit= uiLayoutSplit(layout, (1.0f/(float)groups));
+       
+       for (group= 0; group < groups; group++) {
+               uCol= uiLayoutColumn(uSplit, 1);
+               
+               for (row= 0; row < 2; row++) {
+                       uRow= uiLayoutRow(uCol, 1);
+                       layer= groups*cols*row + cols*group;
+                       
+                       /* add layers as toggle buts */
+                       for (col= 0; (col < cols) && (layer < layers); col++, layer++) {
+                               int icon=0; // XXX - add some way of setting this...
+                               uiItemFullR(uRow, "", icon, ptr, prop, layer, 0, 0, 0, 1);
+                       }
+               }
+       }
+}