From 85307388bc3b3ea07e5b52479569bc21ede5b69b Mon Sep 17 00:00:00 2001 From: Matt Ebb Date: Wed, 20 Jan 2010 05:41:59 +0000 Subject: [PATCH] Fix [#20602] Cluttered UI in modifiers Split modifier header on two lines only if available space is low --- .../scripts/ui/properties_data_modifier.py | 7 +- source/blender/editors/include/UI_interface.h | 2 +- .../editors/interface/interface_templates.c | 121 +++++++++++------- source/blender/makesrna/intern/rna_modifier.c | 1 + source/blender/makesrna/intern/rna_ui_api.c | 1 + 5 files changed, 79 insertions(+), 53 deletions(-) diff --git a/release/scripts/ui/properties_data_modifier.py b/release/scripts/ui/properties_data_modifier.py index 1bafca378c4..77d46fbb6ef 100644 --- a/release/scripts/ui/properties_data_modifier.py +++ b/release/scripts/ui/properties_data_modifier.py @@ -20,7 +20,7 @@ import bpy narrowui = 180 - +narrowmod = 260 class DataButtonsPanel(bpy.types.Panel): bl_space_type = 'PROPERTIES' @@ -36,14 +36,13 @@ class DATA_PT_modifiers(DataButtonsPanel): ob = context.object wide_ui = context.region.width > narrowui + compact_mod = context.region.width < narrowmod row = layout.row() row.operator_menu_enum("object.modifier_add", "type") - if wide_ui: - row.label() for md in ob.modifiers: - box = layout.template_modifier(md) + box = layout.template_modifier(md, compact=compact_mod) if box: # match enum type to our functions, avoids a lookup table. getattr(self, md.type)(box, ob, md, wide_ui) diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 66878a26db1..6c03b136775 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -651,7 +651,7 @@ void uiTemplateAnyID(uiLayout *layout, struct bContext *C, struct PointerRNA *pt char *proptypename, char *text); void uiTemplatePathBuilder(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, struct PointerRNA *root_ptr, char *text); -uiLayout *uiTemplateModifier(uiLayout *layout, struct PointerRNA *ptr); +uiLayout *uiTemplateModifier(uiLayout *layout, struct PointerRNA *ptr, int compact); uiLayout *uiTemplateConstraint(uiLayout *layout, struct PointerRNA *ptr); void uiTemplatePreview(uiLayout *layout, struct ID *id, struct ID *parent, struct MTex *slot); void uiTemplateColorRamp(uiLayout *layout, struct PointerRNA *ptr, char *propname, int expand); diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 540e4a81d6e..2c6bf5f2d3c 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -653,13 +653,13 @@ static int modifier_can_delete(ModifierData *md) return 1; } -static uiLayout *draw_modifier(uiLayout *layout, Object *ob, ModifierData *md, int index, int cageIndex, int lastCageIndex) +static uiLayout *draw_modifier(uiLayout *layout, Object *ob, ModifierData *md, int index, int cageIndex, int lastCageIndex, int compact) { ModifierTypeInfo *mti = modifierType_getInfo(md->type); PointerRNA ptr; uiBut *but; uiBlock *block; - uiLayout *box, *column, *row; + uiLayout *box, *column, *row, *col; uiLayout *result= NULL; int isVirtual = (md->mode & eModifierMode_Virtual); char str[128]; @@ -673,11 +673,10 @@ static uiLayout *draw_modifier(uiLayout *layout, Object *ob, ModifierData *md, i /* rounded header ------------------------------------------------------------------- */ box= uiLayoutBox(column); - row= uiLayoutRow(box, 0); - uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_EXPAND); - block= uiLayoutGetBlock(row); - if (isVirtual) { + row= uiLayoutRow(box, 0); + uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_EXPAND); + block= uiLayoutGetBlock(row); /* VIRTUAL MODIFIER */ // XXX this is not used now, since these cannot be accessed via RNA sprintf(str, "%s parent deform", md->name); @@ -688,62 +687,88 @@ static uiLayout *draw_modifier(uiLayout *layout, Object *ob, ModifierData *md, i } else { /* REAL MODIFIER */ - uiLayout *subrow, *col2; + uiLayout *split; + + split = uiLayoutSplit(box, 0.16, 0); + + col= uiLayoutColumn(split, 0); + row = uiLayoutRow(col, 1); + + block = uiLayoutGetBlock(row); + + uiBlockSetEmboss(block, UI_EMBOSSN); /* Open/Close ................................. */ - uiBlockSetEmboss(block, UI_EMBOSSN); - uiDefIconButBitI(block, ICONTOG, eModifierMode_Expanded, 0, ICON_TRIA_RIGHT, 0, 0, UI_UNIT_X, UI_UNIT_Y, &md->mode, 0.0, 0.0, 0.0, 0.0, "Collapse/Expand Modifier"); + uiItemR(row, "", 0, &ptr, "expanded", 0); /* modifier-type icon */ uiItemL(row, "", RNA_struct_ui_icon(ptr.type)); + uiBlockSetEmboss(block, UI_EMBOSS); + /* 'Middle Column' ............................ * - first row is the name of the modifier * - second row is the visibility settings, since the layouts were not wide enough to show all */ - col2= uiLayoutColumn(row, 0); - /* First Row */ - subrow= uiLayoutRow(col2, 0); - /* modifier name */ - uiItemR(subrow, "", 0, &ptr, "name", 0); + col= uiLayoutColumn(split, 0); + + row= uiLayoutRow(col, 0); + uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_EXPAND); + + block = uiLayoutGetBlock(row); + + /* modifier name */ + uiItemR(row, "", 0, &ptr, "name", 0); + + if (compact) { + /* insert delete button at end of top row before splitting to second line */ + uiBlockSetEmboss(block, UI_EMBOSSN); + if (modifier_can_delete(md)) + uiItemO(row, "", ICON_X, "OBJECT_OT_modifier_remove"); + uiBlockSetEmboss(block, UI_EMBOSS); - /* Second Row */ - subrow= uiLayoutRow(col2, 1); - uiLayoutSetAlignment(subrow, UI_LAYOUT_ALIGN_EXPAND); - block= uiLayoutGetBlock(subrow); - /* Softbody not allowed in this situation, enforce! */ - if ( ((md->type!=eModifierType_Softbody && md->type!=eModifierType_Collision) || !(ob->pd && ob->pd->deflect)) - && (md->type!=eModifierType_Surface) ) - { - uiItemR(subrow, "", ICON_SCENE, &ptr, "render", 0); - uiItemR(subrow, "", ICON_RESTRICT_VIEW_OFF, &ptr, "realtime", 0); - - if (mti->flags & eModifierTypeFlag_SupportsEditmode) - uiItemR(subrow, "", ICON_EDITMODE_HLT, &ptr, "editmode", 0); - } - - if ((ob->type==OB_MESH) && modifier_couldBeCage(md) && (index <= lastCageIndex)) - { - but = uiDefIconButBitI(block, TOG, eModifierMode_OnCage, 0, ICON_MESH_DATA, 0, 0, 16, 20, &md->mode, 0.0, 0.0, 0.0, 0.0, "Apply modifier to editing cage during Editmode"); - if (index < cageIndex) - uiButSetFlag(but, UI_BUT_DISABLED); - uiButSetFunc(but, modifiers_setOnCage, ob, md); - } - - /* Up/Down + Delete ........................... */ - block= uiLayoutGetBlock(row); + split = uiLayoutSplit(box, 0.17, 0); + col= uiLayoutColumn(split, 0); + uiItemL(col, "", 0); + col= uiLayoutColumn(split, 0); + row = uiLayoutRow(col, 1); + } + + /* mode enabling buttons */ uiBlockBeginAlign(block); - uiItemO(row, "", ICON_TRIA_UP, "OBJECT_OT_modifier_move_up"); - uiItemO(row, "", ICON_TRIA_DOWN, "OBJECT_OT_modifier_move_down"); + /* Softbody not allowed in this situation, enforce! */ + if ( ((md->type!=eModifierType_Softbody && md->type!=eModifierType_Collision) || !(ob->pd && ob->pd->deflect)) + && (md->type!=eModifierType_Surface) ) + { + uiItemR(row, "", 0, &ptr, "render", 0); + uiItemR(row, "", 0, &ptr, "realtime", 0); + + if (mti->flags & eModifierTypeFlag_SupportsEditmode) + uiItemR(row, "", 0, &ptr, "editmode", 0); + } + if ((ob->type==OB_MESH) && modifier_couldBeCage(md) && (index <= lastCageIndex)) + { + /* -- convert to rna ? */ + but = uiDefIconButBitI(block, TOG, eModifierMode_OnCage, 0, ICON_MESH_DATA, 0, 0, 16, 20, &md->mode, 0.0, 0.0, 0.0, 0.0, "Apply modifier to editing cage during Editmode"); + if (index < cageIndex) + uiButSetFlag(but, UI_BUT_DISABLED); + uiButSetFunc(but, modifiers_setOnCage, ob, md); + } uiBlockEndAlign(block); - uiBlockSetEmboss(block, UI_EMBOSSN); + /* Up/Down + Delete ........................... */ + uiBlockBeginAlign(block); + uiItemO(row, "", ICON_TRIA_UP, "OBJECT_OT_modifier_move_up"); + uiItemO(row, "", ICON_TRIA_DOWN, "OBJECT_OT_modifier_move_down"); + uiBlockEndAlign(block); - if (modifier_can_delete(md)) - uiItemO(row, "", ICON_X, "OBJECT_OT_modifier_remove"); - - uiBlockSetEmboss(block, UI_EMBOSS); + if(!compact) { + uiBlockSetEmboss(block, UI_EMBOSSN); + if (modifier_can_delete(md)) + uiItemO(row, "", ICON_X, "OBJECT_OT_modifier_remove"); + uiBlockSetEmboss(block, UI_EMBOSS); + } } @@ -794,7 +819,7 @@ static uiLayout *draw_modifier(uiLayout *layout, Object *ob, ModifierData *md, i return result; } -uiLayout *uiTemplateModifier(uiLayout *layout, PointerRNA *ptr) +uiLayout *uiTemplateModifier(uiLayout *layout, PointerRNA *ptr, int compact) { Object *ob; ModifierData *md, *vmd; @@ -824,7 +849,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, PointerRNA *ptr) for(i=0; vmd; i++, vmd=vmd->next) { if(md == vmd) - return draw_modifier(layout, ob, md, i, cageIndex, lastCageIndex); + return draw_modifier(layout, ob, md, i, cageIndex, lastCageIndex, compact); else if(vmd->mode & eModifierMode_Virtual) i--; } diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index 1516ae2536d..dabebb1ff06 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -2124,6 +2124,7 @@ void RNA_def_modifier(BlenderRNA *brna) prop= RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "mode", eModifierMode_Expanded); RNA_def_property_ui_text(prop, "Expanded", "Set modifier expanded in the user interface."); + RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1); /* types */ diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c index 2ea8f191822..c344173afb3 100644 --- a/source/blender/makesrna/intern/rna_ui_api.c +++ b/source/blender/makesrna/intern/rna_ui_api.c @@ -303,6 +303,7 @@ void RNA_api_ui_layout(StructRNA *srna) RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR|PROP_NEVER_NULL); parm= RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in."); RNA_def_function_return(func, parm); + RNA_def_boolean(func, "compact", 0, "", "Show a smaller version of the template, split on two lines."); func= RNA_def_function(srna, "template_constraint", "uiTemplateConstraint"); parm= RNA_def_pointer(func, "data", "Constraint", "", "Constraint data.");