WIP:Make the extrude menus for vertices,edges,faces gray and adding a red tooltip when not selected #115756

Closed
Prikshit singh wants to merge 2 commits from Prikshit-singh/blender:Fix/incorrect-extrude-menu into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
5 changed files with 64 additions and 24 deletions

View File

@ -80,7 +80,9 @@ class VIEW3D_OT_edit_mesh_extrude_move(Operator):
@classmethod
def poll(cls, context):
obj = context.active_object
return (obj is not None and obj.mode == 'EDIT')
mesh = context.object.data
cls.poll_message_set("Object has no face selected")
return (obj is not None and obj.mode == 'EDIT' and mesh.total_face_sel>=1)
@staticmethod
def extrude_region(context, use_vert_normals, dissolve_and_intersect):
@ -160,7 +162,9 @@ class VIEW3D_OT_edit_mesh_extrude_shrink_fatten(Operator):
@classmethod
def poll(cls, context):
obj = context.active_object
return (obj is not None and obj.mode == 'EDIT')
mesh = context.object.data
cls.poll_message_set("Object has no face selected")
return (obj is not None and obj.mode == 'EDIT' and mesh.total_face_sel>=1)
def execute(self, context):
return VIEW3D_OT_edit_mesh_extrude_move.extrude_region(context, True, False)
@ -177,7 +181,9 @@ class VIEW3D_OT_edit_mesh_extrude_manifold_normal(Operator):
@classmethod
def poll(cls, context):
obj = context.active_object
return (obj is not None and obj.mode == 'EDIT')
mesh = context.object.data
cls.poll_message_set("Object has no face selected")
return (obj is not None and obj.mode == 'EDIT' and mesh.total_face_sel>=1)
def execute(self, _context):
bpy.ops.mesh.extrude_manifold(

View File

@ -4558,24 +4558,13 @@ class VIEW3D_MT_edit_mesh_extrude(Menu):
select_mode = tool_settings.mesh_select_mode
mesh = context.object.data
if mesh.total_face_sel:
layout.operator("view3d.edit_mesh_extrude_move_normal",
text="Extrude Faces")
layout.operator("view3d.edit_mesh_extrude_move_shrink_fatten",
text="Extrude Faces Along Normals")
layout.operator(
"mesh.extrude_faces_move",
text="Extrude Individual Faces")
layout.operator("view3d.edit_mesh_extrude_manifold_normal",
text="Extrude Manifold")
if mesh.total_edge_sel and (select_mode[0] or select_mode[1]):
layout.operator("mesh.extrude_edges_move",
text="Extrude Edges")
if mesh.total_vert_sel and select_mode[0]:
layout.operator("mesh.extrude_vertices_move",
text="Extrude Vertices")
layout.operator("view3d.edit_mesh_extrude_move_normal",text="Extrude Faces")
layout.operator("view3d.edit_mesh_extrude_move_shrink_fatten",text="Extrude Faces Along Normals")
layout.operator("mesh.extrude_faces_move",text="Extrude Individual Faces")
layout.operator("view3d.edit_mesh_extrude_manifold_normal",text="Extrude Manifold")
layout.operator("mesh.extrude_edges_move",text="Extrude Edges")
layout.operator("mesh.extrude_vertices_move",text="Extrude Vertices")
layout.separator()

View File

@ -541,6 +541,9 @@ bool ED_operator_object_active_editable_mesh(bContext *C);
bool ED_operator_object_active_editable_font(bContext *C);
bool ED_operator_editable_mesh(bContext *C);
bool ED_operator_editmesh(bContext *C);
bool ED_operator_editmesh_extrude_vertices(bContext *C);
bool ED_operator_editmesh_extrude_edges(bContext *C);
bool ED_operator_editmesh_extrude_faces(bContext *C);
bool ED_operator_editmesh_view3d(bContext *C);
bool ED_operator_editmesh_region_view3d(bContext *C);
bool ED_operator_editarmature(bContext *C);

View File

@ -578,7 +578,7 @@ void MESH_OT_extrude_verts_indiv(wmOperatorType *ot)
/* api callbacks */
ot->exec = edbm_extrude_verts_exec;
ot->poll = ED_operator_editmesh;
ot->poll = ED_operator_editmesh_extrude_vertices;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@ -631,7 +631,7 @@ void MESH_OT_extrude_edges_indiv(wmOperatorType *ot)
/* api callbacks */
ot->exec = edbm_extrude_edges_exec;
ot->poll = ED_operator_editmesh;
ot->poll = ED_operator_editmesh_extrude_edges;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@ -684,7 +684,7 @@ void MESH_OT_extrude_faces_indiv(wmOperatorType *ot)
/* api callbacks */
ot->exec = edbm_extrude_faces_exec;
ot->poll = ED_operator_editmesh;
ot->poll = ED_operator_editmesh_extrude_faces;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;

View File

@ -467,6 +467,48 @@ bool ED_operator_editmesh(bContext *C)
return false;
}
bool ED_operator_editmesh_extrude_vertices(bContext *C)
{
Object *obedit = CTX_data_edit_object(C);
if (obedit && obedit->type == OB_MESH) {
BMEditMesh *mesh = BKE_editmesh_from_object(obedit);
if (mesh->bm->totvertsel == 0 && mesh->bm->selectmode != 0) {
CTX_wm_operator_poll_msg_set(C, "Object has no vertex selected");
return false;
}
return nullptr != BKE_editmesh_from_object(obedit);
}
return false;
}
bool ED_operator_editmesh_extrude_edges(bContext *C)
{
Object *obedit = CTX_data_edit_object(C);
if (obedit && obedit->type == OB_MESH) {
BMEditMesh *mesh = BKE_editmesh_from_object(obedit);
if (mesh->bm->totedgesel == 0 && (mesh->bm->selectmode != 0 || mesh->bm->selectmode != 1)) {
CTX_wm_operator_poll_msg_set(C, "Object has no edge selected");
return false;
}
return nullptr != BKE_editmesh_from_object(obedit);
}
return false;
}
bool ED_operator_editmesh_extrude_faces(bContext *C)
{
Object *obedit = CTX_data_edit_object(C);
if (obedit && obedit->type == OB_MESH) {
BMEditMesh *mesh = BKE_editmesh_from_object(obedit);
if (mesh->bm->totfacesel == 0) {
CTX_wm_operator_poll_msg_set(C, "Object has no face selected");
return false;
}
return nullptr != BKE_editmesh_from_object(obedit);
}
return false;
}
bool ED_operator_editmesh_view3d(bContext *C)
{
return ED_operator_editmesh(C) && ED_operator_view3d_active(C);