[Bf-blender-cvs] [7312e48ae43] blender2.8: UI: Extend context menu to check current selection

William Reynish noreply at git.blender.org
Mon Dec 17 22:17:21 CET 2018


Commit: 7312e48ae43e32f4d7c95a6d170861abbf03190d
Author: William Reynish
Date:   Tue Dec 18 07:54:32 2018 +1100
Branches: blender2.8
https://developer.blender.org/rB7312e48ae43e32f4d7c95a6d170861abbf03190d

UI: Extend context menu to check current selection

- This extends context menus, checking the selection in some cases
  to conditionally show operators.

- When nothing is selected, add, paste .. etc are added to the menu.

- Use columns when mixed mesh modes are used (vert/edge/face).

- Move armature naming operators into sub-menu.

See D4043

===================================================================

M	release/scripts/startup/bl_ui/space_node.py
M	release/scripts/startup/bl_ui/space_view3d.py

===================================================================

diff --git a/release/scripts/startup/bl_ui/space_node.py b/release/scripts/startup/bl_ui/space_node.py
index 750c01d28e5..c5718df3b92 100644
--- a/release/scripts/startup/bl_ui/space_node.py
+++ b/release/scripts/startup/bl_ui/space_node.py
@@ -331,22 +331,35 @@ class NODE_MT_specials(Menu):
     def draw(self, context):
         layout = self.layout
 
+        # If nothing is selected
+        selected_nodes_len = len(context.selected_nodes)
+        if selected_nodes_len == 0:
+            layout.operator_context = 'INVOKE_DEFAULT'
+            layout.menu("NODE_MT_add")
+            layout.operator("node.clipboard_paste", text="Paste")
+            return
+
+        # If something is selected
         layout.operator_context = 'INVOKE_DEFAULT'
         layout.operator("node.duplicate_move")
         layout.operator("node.delete")
+        layout.operator("node.clipboard_copy", text="Copy")
+        layout.operator("node.clipboard_paste", text="Paste")
         layout.operator_context = 'EXEC_DEFAULT'
 
         layout.operator("node.delete_reconnect")
 
-        layout.separator()
+        if selected_nodes_len > 1:
+            layout.separator()
 
-        layout.operator("node.link_make").replace = False
-        layout.operator("node.link_make", text="Make and Replace Links").replace = True
-        layout.operator("node.links_detach")
+            layout.operator("node.link_make").replace = False
+            layout.operator("node.link_make", text="Make and Replace Links").replace = True
+            layout.operator("node.links_detach")
 
-        layout.separator()
+            layout.separator()
+
+            layout.operator("node.group_make", text="Group")
 
-        layout.operator("node.group_make", text="Group")
         layout.operator("node.group_ungroup", text="Ungroup")
         layout.operator("node.group_edit").exit = False
 
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 8791e2713a0..536a3204ad9 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -1732,11 +1732,6 @@ class VIEW3D_MT_object_clear(Menu):
 class VIEW3D_MT_object_specials(Menu):
     bl_label = "Object Context Menu"
 
-    @classmethod
-    def poll(cls, context):
-        # add more special types
-        return context.object
-
     def draw(self, context):
 
         layout = self.layout
@@ -1745,6 +1740,16 @@ class VIEW3D_MT_object_specials(Menu):
         obj = context.object
         is_eevee = context.scene.render.engine == 'BLENDER_EEVEE'
 
+        # If nothing is selected
+        selected_objects_len = len(context.selected_objects)
+        if selected_objects_len == 0:
+
+            layout.menu("VIEW3D_MT_add", text="Add")
+            layout.operator("view3d.pastebuffer", text="Paste Objects", icon='PASTEDOWN')
+
+            return
+
+        # If something is selected
         if obj.type == 'MESH':
 
             layout.operator("object.shade_smooth", text="Shade Smooth")
@@ -1756,8 +1761,9 @@ class VIEW3D_MT_object_specials(Menu):
             layout.operator_menu_enum("object.origin_set", text="Set Origin...", property="type")
 
             layout.operator_context = 'INVOKE_DEFAULT'
-            layout.operator("object.join")
-            layout.operator_menu_enum("object.convert", "target")
+            # If more than one object is selected
+            if selected_objects_len > 1:
+                layout.operator("object.join")
 
         if obj.type == 'CAMERA':
             layout.operator_context = 'INVOKE_REGION_WIN'
@@ -1804,6 +1810,17 @@ class VIEW3D_MT_object_specials(Menu):
             props.input_scale = 0.01
             props.header_text = "Width Size: %.3f"
 
+            layout.operator("object.convert", text="Convert to Mesh").target = 'MESH'
+
+            layout.operator_menu_enum("object.origin_set", text="Set Origin...", property="type")
+
+        if obj.type == 'GPENCIL':
+            layout.operator("gpencil.convert", text="Convert to Path").type = 'PATH'
+            layout.operator("gpencil.convert", text="Convert to Bezier Curves").type = 'CURVE'
+            layout.operator("gpencil.convert", text="Convert to Mesh").type = 'POLY'
+
+            layout.operator_menu_enum("object.origin_set", text="Set Origin...", property="type")
+
         if obj.type == 'EMPTY':
             layout.operator_context = 'INVOKE_REGION_WIN'
 
@@ -2479,7 +2496,7 @@ class VIEW3D_MT_pose(Menu):
 
         layout.operator("pose.copy", icon='COPYDOWN')
         layout.operator("pose.paste", icon='PASTEDOWN').flipped = False
-        layout.operator("pose.paste", text="Paste Pose Flipped").flipped = True
+        layout.operator("pose.paste", icon='PASTEFLIPDOWN', text="Paste Pose Flipped").flipped = True
 
         layout.separator()
 
@@ -2656,22 +2673,26 @@ class VIEW3D_MT_pose_specials(Menu):
     def draw(self, context):
         layout = self.layout
 
+        layout.operator_context = 'INVOKE_REGION_WIN'
+
         layout.operator("anim.keyframe_insert_menu", text="Insert Keyframe...")
 
         layout.separator()
 
         layout.operator("pose.copy", icon='COPYDOWN')
         layout.operator("pose.paste", icon='PASTEDOWN').flipped = False
-        layout.operator("pose.paste", text="Paste X-Flipped Pose").flipped = True
+        layout.operator("pose.paste", icon='PASTEFLIPDOWN', text="Paste X-Flipped Pose").flipped = True
 
         layout.separator()
 
-        layout.operator("pose.select_constraint_target")
+        layout.operator("pose.paths_calculate", text="Calculate")
+        layout.operator("pose.paths_clear", text="Clear")
 
         layout.separator()
 
-        layout.operator("pose.paths_calculate", text="Calculate")
-        layout.operator("pose.paths_clear", text="Clear")
+        layout.operator("pose.push")
+        layout.operator("pose.relax")
+        layout.operator("pose.breakdown")
 
         layout.separator()
 
@@ -2783,94 +2804,189 @@ class VIEW3D_MT_edit_mesh(Menu):
 
 
 class VIEW3D_MT_edit_mesh_specials(Menu):
-    bl_label = "Mesh Context Menu"
+    bl_label = ""
 
     def draw(self, context):
-        layout = self.layout
 
-        select_mode = context.tool_settings.mesh_select_mode
+        def count_selected_items_for_objects_in_mode():
+            selected_verts_len = 0
+            selected_edges_len = 0
+            selected_faces_len = 0
+            for ob in context.objects_in_mode_unique_data:
+                v, e, f = ob.data.count_selected_items()
+                selected_verts_len += v
+                selected_edges_len += e
+                selected_faces_len += f
+            return (selected_verts_len, selected_edges_len, selected_faces_len)
+
+        is_vert_mode, is_edge_mode, is_face_mode = context.tool_settings.mesh_select_mode
+        selected_verts_len, selected_edges_len, selected_faces_len = count_selected_items_for_objects_in_mode()
+
+        del count_selected_items_for_objects_in_mode
+
+        layout = self.layout
 
         layout.operator_context = 'INVOKE_REGION_WIN'
 
-        layout.operator("mesh.subdivide", text="Subdivide")
+        # If nothing is selected
+        if not (selected_verts_len or selected_edges_len or selected_faces_len):
+            layout.menu("VIEW3D_MT_mesh_add", text="Add")
 
-        layout.separator()
+            return
 
-        layout.operator("mesh.duplicate_move", text="Duplicate")
+        # Else something is selected
 
-        # Vertex Select Commands
-        if select_mode[0]:
-            layout.separator()
+        row = layout.row()
 
-            layout.operator("mesh.edge_face_add", text="New Edge/Face from Vertices")
-            layout.operator("mesh.vert_connect_path", text="Connect Vertex Path")
-            layout.operator("mesh.vert_connect", text="Connect Vertex Pairs")
+        if is_vert_mode:
+            col = row.column()
 
-            layout.separator()
+            col.label(text="Vertex Context Menu", icon='VERTEXSEL')
+            col.separator()
 
-            layout.operator("mesh.vertices_smooth", text="Smooth")
-            layout.operator("mesh.vertices_smooth_laplacian", text="Smooth Laplacian")
+            # Additive Operators
+            col.operator("mesh.subdivide", text="Subdivide")
 
-            layout.separator()
-            layout.operator("mesh.merge", text="Merge Vertices...")
-            layout.operator("mesh.remove_doubles", text="Remove Double Vertices")
-            layout.operator("mesh.dissolve_verts")
-            layout.operator("mesh.delete", text="Delete Vertices").type = 'VERT'
+            col.separator()
 
-        # Edge Select Commands
-        if select_mode[1]:
-            layout.separator()
+            col.operator("mesh.extrude_vertices_move", text="Extrude Vertices"),
+            col.operator("mesh.bevel", text="Bevel Vertices").vertex_only = True
 
-            layout.operator("mesh.bridge_edge_loops", text="Bridge Edge Loops")
+            if selected_verts_len > 1:
+                col.separator()
+                col.operator("mesh.edge_face_add", text="New Edge/Face from Vertices")
+                col.operator("mesh.vert_connect_path", text="Connect Vertex Path")
+                col.operator("mesh.vert_connect", text="Connect Vertex Pairs")
 
-            layout.separator()
+            col.separator()
 
-            layout.operator("mesh.dissolve_edges")
-            layout.operator("mesh.delete", text="Delete Edges").type = 'EDGE'
+            # Deform Operators
+            col.operator("transform.push_pull", text="Push/Pull")
+            col.operator("transform.shrink_fatten", text="Shrink/Fatten")
+            col.operator("transform.shear", text="Shear")
+            col.operator("transform.vert_slide", text="Slide Vertices")
+            col.operator("transform.vertex_random", text="Randomize Vertices")
+            col.operator("mesh.vertices_smooth", text="Smooth Vertices")
+            col.operator("mesh.vertices_smooth_laplacian", text="Smooth Laplacian")
 
-        # Face Select Commands
-        if select_mode[2]:
-            layout.separator()
+            col.separator()
 
-            layout.operator(

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list