diff options
-rw-r--r-- | release/ui/buttons_data_armature.py | 6 | ||||
-rw-r--r-- | source/blender/editors/include/UI_interface.h | 1 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_api.c | 6 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_templates.c | 53 |
4 files changed, 63 insertions, 3 deletions
diff --git a/release/ui/buttons_data_armature.py b/release/ui/buttons_data_armature.py index fd317baf861..0b02eee9f7b 100644 --- a/release/ui/buttons_data_armature.py +++ b/release/ui/buttons_data_armature.py @@ -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" diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 48a859dadc4..eb3a037d7b1 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -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); diff --git a/source/blender/editors/interface/interface_api.c b/source/blender/editors/interface/interface_api.c index 60bfe4e79ad..b4e7dc03506 100644 --- a/source/blender/editors/interface/interface_api.c +++ b/source/blender/editors/interface/interface_api.c @@ -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); } diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 53238a306cd..63de328af0f 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -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); + } + } + } +} |