Fix [#20602] Cluttered UI in modifiers
Split modifier header on two lines only if available space is low
This commit is contained in:
parent
8830528b02
commit
85307388bc
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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--;
|
||||
}
|
||||
|
@ -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 */
|
||||
|
@ -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.");
|
||||
|
Loading…
Reference in New Issue
Block a user