UI: Add extra bevel options to popover from tool settings bar

Also adds a generic popover that can be used whenever an active tool has too
many settings than can fit in the horizontal area. The popover calls the active
tool's draw_settings with "extra" set to True.
This commit is contained in:
Hans Goudey 2019-12-12 11:56:20 -05:00
parent c8d121bf35
commit d7a8a60688
2 changed files with 70 additions and 6 deletions

View File

@ -590,12 +590,52 @@ class _defs_edit_mesh:
@ToolDef.from_fn
def bevel():
def draw_settings(_context, layout, tool):
def draw_settings(context, layout, tool, *, extra=False):
props = tool.operator_properties("mesh.bevel")
layout.prop(props, "offset_type")
layout.prop(props, "segments")
layout.prop(props, "profile", slider=True)
layout.prop(props, "vertex_only")
region_type = context.region.type
if extra == False:
if props.offset_type == 'PERCENT':
layout.prop(props, "offset_pct")
else:
offset_text = "Width"
if props.offset_type == 'DEPTH':
offset_text = "Depth"
elif props.offset_type == 'OFFSET':
offset_text = "Offset"
layout.prop(props, "offset", text=offset_text)
if region_type == 'TOOL_HEADER':
layout.prop(props, "offset_type", text="")
else:
layout.prop(props, "offset_type")
layout.prop(props, "segments")
layout.prop(props, "profile", slider=True)
if region_type == 'TOOL_HEADER':
layout.popover("TOPBAR_PT_tool_settings_extra", text="...")
else:
extra = True
if extra or region_type != 'TOOL_HEADER':
layout.prop(props, "vertex_only")
layout.prop(props, "clamp_overlap")
layout.prop(props, "loop_slide")
layout.prop(props, "mark_seam")
layout.prop(props, "mark_sharp")
layout.prop(props, "harden_normals")
layout.prop(props, "material")
layout.prop(props, "miter_outer", text="Outer Miter")
layout.prop(props, "miter_inner", text="Inner Miter")
if props.miter_inner == 'ARC':
layout.prop(props, "spread")
layout.prop(props, "use_custom_profile")
if props.use_custom_profile:
tool_settings = context.tool_settings
layout.template_curveprofile(tool_settings, "custom_bevel_profile_preset")
return dict(
idname="builtin.bevel",

View File

@ -20,7 +20,6 @@
import bpy
from bpy.types import Header, Menu, Panel
class TOPBAR_HT_upper_bar(Header):
bl_space_type = 'TOPBAR'
@ -78,6 +77,30 @@ class TOPBAR_HT_upper_bar(Header):
unlink="scene.view_layer_remove")
class TOPBAR_PT_tool_settings_extra(Panel):
"""
Popover panel for adding extra options that don't fit in the tool settings header
"""
bl_idname = "TOPBAR_PT_tool_settings_extra"
bl_region_type = 'HEADER'
bl_space_type = 'TOPBAR'
bl_label = "Extra Options"
def draw(self, context):
from bl_ui.space_toolsystem_common import ToolSelectPanelHelper
layout = self.layout
# Get the active tool
space_type, mode = ToolSelectPanelHelper._tool_key_from_context(context)
cls = ToolSelectPanelHelper._tool_class_from_space_type(space_type)
item, tool, _ = cls._tool_get_active(context, space_type, mode, with_icon=True)
if item is None:
return
# Draw the extra settings
item.draw_settings(context, layout, tool, extra=True)
class TOPBAR_PT_tool_fallback(Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'HEADER'
@ -790,6 +813,7 @@ classes = (
TOPBAR_MT_window,
TOPBAR_MT_help,
TOPBAR_PT_tool_fallback,
TOPBAR_PT_tool_settings_extra,
TOPBAR_PT_gpencil_layers,
TOPBAR_PT_gpencil_primitive,
TOPBAR_PT_gpencil_fill,