UI: move tool definitions to classes

Originally it was nice to have a small list of definitions
with tools inline.

However we need to be able to define drawing functions for tools
which Python can't easily inline.

Use function for keymap definition,
support creating a function from a tuple as well
(handy for simple key-maps).
This commit is contained in:
Campbell Barton
2018-04-27 13:23:29 +02:00
parent e01cadd657
commit 9504652687
2 changed files with 435 additions and 362 deletions

View File

@@ -28,9 +28,334 @@ from bpy.types import Panel
from .space_toolsystem_common import (
ToolSelectPanelHelper,
ToolDef,
)
class _defs_view3d_generic:
class cursor(ToolDef):
text = "Cursor"
icon = "ops.generic.cursor"
widget = None
keymap = (
("view3d.cursor3d", dict(), dict(type='ACTIONMOUSE', value='CLICK')),
)
class ruler(ToolDef):
text = "Ruler/Protractor"
icon = "ops.view3d.ruler"
widget = "VIEW3D_WGT_ruler"
keymap = (
("view3d.ruler_add", dict(), dict(type='EVT_TWEAK_A', value='ANY')),
)
class _defs_transform:
class translate(ToolDef):
text = "Translate"
icon = "ops.transform.translate"
widget = "TRANSFORM_WGT_manipulator"
keymap = (
("transform.translate", dict(release_confirm=True), dict(type='EVT_TWEAK_A', value='ANY')),
)
class rotate(ToolDef):
text = "Rotate"
icon = "ops.transform.rotate"
widget = "TRANSFORM_WGT_manipulator"
keymap = (
("transform.rotate", dict(release_confirm=True), dict(type='EVT_TWEAK_A', value='ANY')),
)
class scale(ToolDef):
text = "Scale"
icon = "ops.transform.resize"
widget = "TRANSFORM_WGT_manipulator"
keymap = (
("transform.resize", dict(release_confirm=True), dict(type='EVT_TWEAK_A', value='ANY')),
)
class scale_cage(ToolDef):
text = "Scale Cage"
icon = "ops.transform.resize.cage"
widget = "VIEW3D_WGT_xform_cage"
keymap = None
class _defs_view3d_select:
class border(ToolDef):
text = "Select Border"
icon = "ops.generic.select_border"
widget = None
keymap = (
("view3d.select_border",
dict(deselect=False),
dict(type='EVT_TWEAK_A', value='ANY')),
("view3d.select_border",
dict(deselect=True),
dict(type='EVT_TWEAK_A', value='ANY', ctrl=True)),
)
class circle(ToolDef):
text = "Select Circle"
icon = "ops.generic.select_circle"
widget = None
keymap = (
("view3d.select_circle",
dict(deselect=False),
dict(type='ACTIONMOUSE', value='PRESS')),
("view3d.select_circle",
dict(deselect=True),
dict(type='ACTIONMOUSE', value='PRESS', ctrl=True)),
)
class lasso(ToolDef):
text = "Select Lasso"
icon = "ops.generic.select_lasso"
widget = None
keymap = (
("view3d.select_lasso",
dict(deselect=False),
dict(type='EVT_TWEAK_A', value='ANY')),
("view3d.select_lasso",
dict(deselect=True),
dict(type='EVT_TWEAK_A', value='ANY', ctrl=True)),
)
# -----------------------------------------------------------------------------
# Object Modes (named based on context.mode)
class _defs_weight_paint:
class gradient_linear(ToolDef):
text = "Linear Gradient"
icon = None
widget = None
keymap = (
("paint.weight_gradient", dict(type='LINEAR'),
dict(type='EVT_TWEAK_A', value='ANY')),
)
class gradient_radial(ToolDef):
text = "Radial Gradient"
icon = None
widget = None
keymap = (
("paint.weight_gradient",
dict(type='RADIAL'),
dict(type='EVT_TWEAK_A', value='ANY')),
)
class _defs_edit_armature:
class roll(ToolDef):
text = "Roll"
icon = None
widget = None
keymap = (
("transform.transform",
dict(release_confirm=True, mode='BONE_ROLL'),
dict(type='EVT_TWEAK_A', value='ANY'),),
)
class extrude_cursor(ToolDef):
text = "Extrude Cursor",
icon = "ops.armature.extrude",
widget = None,
keymap = (
("armature.click_extrude", dict(), dict(type='ACTIONMOUSE', value='PRESS')),
)
class _defs_edit_mesh:
class rip_region(ToolDef):
text = "Rip Region"
icon = "ops.mesh.rip"
widget = None
keymap = (
("mesh.rip_move", dict(),
dict(type='ACTIONMOUSE', value='PRESS')),
)
class rip_edge(ToolDef):
text = "Rip Edge"
icon = "ops.mesh.rip_edge"
widget = None
keymap = (
("mesh.rip_edge_edge_move", dict(),
dict(type='ACTIONMOUSE', value='PRESS')),
)
class poly_build(ToolDef):
text = "Poly Build"
icon = "ops.mesh.polybuild_hover"
widget = None
keymap = (
("mesh.polybuild_face_at_cursor_move",
dict(TRANSFORM_OT_translate=dict(release_confirm=True)),
dict(type='ACTIONMOUSE', value='PRESS')),
("mesh.polybuild_split_at_cursor_move",
dict(TRANSFORM_OT_translate=dict(release_confirm=True)),
dict(type='ACTIONMOUSE', value='PRESS', ctrl=True)),
("mesh.polybuild_dissolve_at_cursor", dict(), dict(type='ACTIONMOUSE', value='CLICK', alt=True)),
("mesh.polybuild_hover", dict(use_boundary=False), dict(type='MOUSEMOVE', value='ANY', alt=True)),
("mesh.polybuild_hover", dict(use_boundary=True), dict(type='MOUSEMOVE', value='ANY', any=True)),
)
class edge_slide(ToolDef):
text = "Edge Slide"
icon = "ops.transform.edge_slide"
widget = None
keymap = (
("transform.edge_slide", dict(release_confirm=True),
dict(type='ACTIONMOUSE', value='PRESS')
),
)
class vert_slide(ToolDef):
text = "Vertex Slide"
icon = "ops.transform.vert_slide"
widget = None
keymap = (
("transform.vert_slide", dict(release_confirm=True),
dict(type='ACTIONMOUSE', value='PRESS')),
)
class spin(ToolDef):
text = "Spin"
icon = "ops.mesh.spin"
widget = None
keymap = (
("mesh.spin", dict(),
dict(type='ACTIONMOUSE', value='PRESS')),
)
class spin_duplicate(ToolDef):
text = "Spin (Duplicate)"
icon = "ops.mesh.spin.duplicate"
widget = None
keymap = (
("mesh.spin", dict(dupli=True),
dict(type='ACTIONMOUSE', value='PRESS')),
)
class inset(ToolDef):
text = "Inset Faces"
icon = "ops.mesh.inset"
widget = None
keymap = (
("mesh.inset", dict(),
dict(type='ACTIONMOUSE', value='PRESS')),
)
class extrude(ToolDef):
text = "Extrude Region"
icon = "ops.view3d.edit_mesh_extrude"
widget = None
keymap = (
("view3d.edit_mesh_extrude", dict(),
dict(type='ACTIONMOUSE', value='PRESS')),
)
class extrude_individual(ToolDef):
text = "Extrude Individual"
icon = "ops.view3d.edit_mesh_extrude_individual"
widget = None
keymap = (
("mesh.extrude_faces_move", dict(),
dict(type='ACTIONMOUSE', value='PRESS')),
)
class vertex_smooth(ToolDef):
text = "Smooth"
icon = "ops.mesh.vertices_smooth"
widget = None
keymap = (
("mesh.vertices_smooth", dict(),
dict(type='ACTIONMOUSE', value='PRESS')),
)
class vertex_randomize(ToolDef):
text = "Randomize"
icon = "ops.transform.vertex_random"
widget = None
keymap = (
("transform.vertex_random", dict(),
dict(type='ACTIONMOUSE', value='PRESS')),
)
class shrink_fatten(ToolDef):
text = "Shrink/Fatten"
icon = "ops.transform.shrink_fatten"
widget = None
keymap = (
("transform.shrink_fatten", dict(release_confirm=True),
dict(type='ACTIONMOUSE', value='PRESS')),
)
class push_pull(ToolDef):
text = "Push/Pull"
icon = "ops.transform.push_pull"
widget = None
keymap = (
("transform.push_pull", dict(release_confirm=True),
dict(type='ACTIONMOUSE', value='PRESS')),
)
class knife(ToolDef):
text = "Knife"
icon = "ops.mesh.knife_tool"
widget = None
keymap = (
("mesh.knife_tool",
dict(wait_for_input=False, use_occlude_geometry=True, only_selected=False),
dict(type='ACTIONMOUSE', value='PRESS')),
)
class bisect(ToolDef):
text = "Bisect"
icon = "ops.mesh.bisect"
widget = None
keymap = (
("mesh.bisect",
dict(),
dict(type='EVT_TWEAK_A', value='ANY')),
)
class extrude_cursor(ToolDef):
text = "Extrude Cursor"
icon = None
widget = None
keymap = (
("mesh.dupli_extrude_cursor", dict(), dict(type='ACTIONMOUSE', value='PRESS')),
)
class _defs_edit_curve:
class draw(ToolDef):
text = "Draw"
icon = None
widget = None
keymap = (
("curve.draw", dict(wait_for_input=False), dict(type='ACTIONMOUSE', value='PRESS')),
)
class extrude_cursor(ToolDef):
text = "Extrude Cursor"
icon = None
widget = None
keymap = (
("curve.vertex_add", dict(), dict(type='ACTIONMOUSE', value='PRESS')),
)
class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel):
bl_space_type = 'VIEW_3D'
bl_region_type = 'TOOLS'
@@ -53,104 +378,25 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel):
# for reuse
_tools_transform = (
dict(
text="Translate",
icon="ops.transform.translate",
widget="TRANSFORM_WGT_manipulator",
keymap=(
("transform.translate", dict(release_confirm=True), dict(type='EVT_TWEAK_A', value='ANY')),
),
),
dict(
text="Rotate",
icon="ops.transform.rotate",
widget="TRANSFORM_WGT_manipulator",
keymap=(
("transform.rotate", dict(release_confirm=True), dict(type='EVT_TWEAK_A', value='ANY')),
),
),
_defs_transform.translate,
_defs_transform.rotate,
(
dict(
text="Scale",
icon="ops.transform.resize",
widget="TRANSFORM_WGT_manipulator",
keymap=(
("transform.resize", dict(release_confirm=True), dict(type='EVT_TWEAK_A', value='ANY')),
),
),
dict(
text="Scale Cage",
icon="ops.transform.resize.cage",
widget="VIEW3D_WGT_xform_cage",
keymap=None,
),
_defs_transform.scale,
_defs_transform.scale_cage,
),
None,
dict(
text="Ruler/Protractor",
icon="ops.view3d.ruler",
widget="VIEW3D_WGT_ruler",
keymap=(
("view3d.ruler_add", dict(), dict(type='EVT_TWEAK_A', value='ANY')),
),
),
# DEBUGGING ONLY
# ("Pixel Test", "tool_icon.pixeltest", None, (("wm.splash", dict(), dict(type='ACTIONMOUSE', value='PRESS')),)),
_defs_view3d_generic.ruler,
)
_tools = {
None: [
dict(
text="Cursor",
icon="ops.generic.cursor",
widget=None,
keymap=(
("view3d.cursor3d", dict(), dict(type='ACTIONMOUSE', value='CLICK')),
),
),
_defs_view3d_generic.cursor,
# 'Select' Group
(
dict(
text="Select Border",
icon="ops.generic.select_border",
widget=None,
keymap=(
("view3d.select_border",
dict(deselect=False),
dict(type='EVT_TWEAK_A', value='ANY')),
("view3d.select_border",
dict(deselect=True),
dict(type='EVT_TWEAK_A', value='ANY', ctrl=True)),
),
),
dict(
text="Select Circle",
icon="ops.generic.select_circle",
widget=None,
keymap=(
("view3d.select_circle",
dict(deselect=False),
dict(type='ACTIONMOUSE', value='PRESS')),
("view3d.select_circle",
dict(deselect=True),
dict(type='ACTIONMOUSE', value='PRESS', ctrl=True)),
),
),
dict(
text="Select Lasso",
icon="ops.generic.select_lasso",
widget=None,
keymap=(
("view3d.select_lasso",
dict(deselect=False),
dict(type='EVT_TWEAK_A', value='ANY')),
("view3d.select_lasso",
dict(deselect=True),
dict(type='EVT_TWEAK_A', value='ANY', ctrl=True)),
),
),
_defs_view3d_select.border,
_defs_view3d_select.circle,
_defs_view3d_select.lasso,
),
# End group.
],
@@ -163,262 +409,65 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel):
'PAINT_WEIGHT': [
# TODO, override brush events
(
dict(
text="Linear Gradient",
icon=None,
widget=None,
keymap=(
("paint.weight_gradient", dict(type='LINEAR'),
dict(type='EVT_TWEAK_A', value='ANY')),
),
),
dict(
text="Radial Gradient",
icon=None,
widget=None,
keymap=(
("paint.weight_gradient",
dict(type='RADIAL'),
dict(type='EVT_TWEAK_A', value='ANY')),
),
),
_defs_weight_paint.gradient_linear,
_defs_weight_paint.gradient_radial,
),
],
'EDIT_ARMATURE': [
*_tools_transform,
dict(
text="Roll",
icon=None,
widget=None,
keymap=(
("transform.transform",
dict(release_confirm=True, mode='BONE_ROLL'),
dict(type='EVT_TWEAK_A', value='ANY'),),
),
),
_defs_edit_armature.roll,
None,
dict(
text="Extrude Cursor",
icon="ops.armature.extrude",
widget=None,
keymap=(
("armature.click_extrude", dict(), dict(type='ACTIONMOUSE', value='PRESS')),
),
),
_defs_edit_armature.extrude_cursor,
],
'EDIT_MESH': [
*_tools_transform,
None,
(
dict(
text="Rip Region",
icon="ops.mesh.rip",
widget=None,
keymap=(
("mesh.rip_move", dict(),
dict(type='ACTIONMOUSE', value='PRESS')),
),
),
dict(
text="Rip Edge",
icon="ops.mesh.rip_edge",
widget=None,
keymap=(
("mesh.rip_edge_edge_move", dict(),
dict(type='ACTIONMOUSE', value='PRESS')),
),
),
_defs_edit_mesh.rip_region,
_defs_edit_mesh.rip_edge,
),
dict(
text="Poly Build",
icon="ops.mesh.polybuild_hover",
widget=None,
keymap=(
("mesh.polybuild_face_at_cursor_move",
dict(TRANSFORM_OT_translate=dict(release_confirm=True)),
dict(type='ACTIONMOUSE', value='PRESS')),
("mesh.polybuild_split_at_cursor_move",
dict(TRANSFORM_OT_translate=dict(release_confirm=True)),
dict(type='ACTIONMOUSE', value='PRESS', ctrl=True)),
("mesh.polybuild_dissolve_at_cursor", dict(), dict(type='ACTIONMOUSE', value='CLICK', alt=True)),
("mesh.polybuild_hover", dict(use_boundary=False), dict(type='MOUSEMOVE', value='ANY', alt=True)),
("mesh.polybuild_hover", dict(use_boundary=True), dict(type='MOUSEMOVE', value='ANY', any=True)),
),
),
_defs_edit_mesh.poly_build,
# 'Slide' Group
(
dict(
text="Edge Slide",
icon="ops.transform.edge_slide",
widget=None,
keymap=(
("transform.edge_slide", dict(release_confirm=True),
dict(type='ACTIONMOUSE', value='PRESS')),
),
),
dict(
text="Vertex Slide",
icon="ops.transform.vert_slide",
widget=None,
keymap=(
("transform.vert_slide", dict(release_confirm=True),
dict(type='ACTIONMOUSE', value='PRESS')),
),
),
_defs_edit_mesh.edge_slide,
_defs_edit_mesh.vert_slide,
),
# End group.
(
dict(
text="Spin",
icon="ops.mesh.spin",
widget=None,
keymap=(
("mesh.spin", dict(),
dict(type='ACTIONMOUSE', value='PRESS')),
),
),
dict(
text="Spin (Duplicate)",
icon="ops.mesh.spin.duplicate",
widget=None,
keymap=(
("mesh.spin", dict(dupli=True),
dict(type='ACTIONMOUSE', value='PRESS')),
),
),
_defs_edit_mesh.spin,
_defs_edit_mesh.spin_duplicate,
),
_defs_edit_mesh.inset,
dict(
text="Inset Faces",
icon="ops.mesh.inset",
widget=None,
keymap=(
("mesh.inset", dict(),
dict(type='ACTIONMOUSE', value='PRESS')),
),
(
_defs_edit_mesh.extrude,
_defs_edit_mesh.extrude_individual,
),
(
dict(
text="Extrude Region",
icon="ops.view3d.edit_mesh_extrude",
widget=None,
keymap=(
("view3d.edit_mesh_extrude", dict(),
dict(type='ACTIONMOUSE', value='PRESS')),
),
),
dict(
text="Extrude Individual",
icon="ops.view3d.edit_mesh_extrude_individual",
widget=None,
keymap=(
("mesh.extrude_faces_move", dict(),
dict(type='ACTIONMOUSE', value='PRESS')),
),
),
_defs_edit_mesh.vertex_smooth,
_defs_edit_mesh.vertex_randomize,
),
(
dict(
text="Randomize",
icon="ops.transform.vertex_random",
widget=None,
keymap=(
("transform.vertex_random", dict(),
dict(type='ACTIONMOUSE', value='PRESS')),
),
),
dict(
text="Smooth",
icon="ops.mesh.vertices_smooth",
widget=None,
keymap=(
("mesh.vertices_smooth", dict(),
dict(type='ACTIONMOUSE', value='PRESS')),
),
),
_defs_edit_mesh.shrink_fatten,
_defs_edit_mesh.push_pull,
),
(
dict(
text="Shrink/Fatten",
icon="ops.transform.shrink_fatten",
widget=None,
keymap=(
("transform.shrink_fatten", dict(release_confirm=True),
dict(type='ACTIONMOUSE', value='PRESS')),
),
),
dict(
text="Push/Pull",
icon="ops.transform.push_pull",
widget=None,
keymap=(
("transform.push_pull", dict(release_confirm=True),
dict(type='ACTIONMOUSE', value='PRESS')),
),
),
),
# Knife Group
(
dict(
text="Knife",
icon="ops.mesh.knife_tool",
widget=None,
keymap=(
("mesh.knife_tool",
dict(wait_for_input=False, use_occlude_geometry=True, only_selected=False),
dict(type='ACTIONMOUSE', value='PRESS')),
),
),
None,
dict(
text="Bisect",
icon="ops.mesh.bisect",
widget=None,
keymap=(
("mesh.bisect",
dict(),
dict(type='EVT_TWEAK_A', value='ANY')),
),
),
),
# End group.
dict(
text="Extrude Cursor",
icon=None,
widget=None,
keymap=(
("mesh.dupli_extrude_cursor", dict(), dict(type='ACTIONMOUSE', value='PRESS')),
),
_defs_edit_mesh.knife,
_defs_edit_mesh.bisect,
),
_defs_edit_mesh.extrude_cursor,
],
'EDIT_CURVE': [
*_tools_transform,
None,
dict(
text="Draw",
icon=None,
widget=None,
keymap=(
("curve.draw", dict(wait_for_input=False), dict(type='ACTIONMOUSE', value='PRESS')),
),
),
dict(
text="Extrude Cursor",
icon=None,
widget=None,
keymap=(
("curve.vertex_add", dict(), dict(type='ACTIONMOUSE', value='PRESS')),
),
),
_defs_edit_curve.draw,
_defs_edit_curve.extrude_cursor,
],
}