Revision: 26524
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26524
Author:   theeth
Date:     2010-02-01 19:30:00 +0100 (Mon, 01 Feb 2010)

Log Message:
-----------
Mesh Extrude menu

Todo for Campbell: 
- Make menu context sensitive
- Make menu automatically run the operator if there is only one option


Note: Saved configurations and keymaps with references to "Extrude and Move" 
operator needs to be updated to either call the menu or one of the new extrude 
macros.

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_view3d.py
    trunk/blender/release/scripts/ui/space_view3d_toolbar.py
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    trunk/blender/source/blender/editors/mesh/mesh_ops.c

Modified: trunk/blender/release/scripts/ui/space_view3d.py
===================================================================
--- trunk/blender/release/scripts/ui/space_view3d.py    2010-02-01 18:26:45 UTC 
(rev 26523)
+++ trunk/blender/release/scripts/ui/space_view3d.py    2010-02-01 18:30:00 UTC 
(rev 26524)
@@ -1131,7 +1131,7 @@
 
         layout.separator()
 
-        layout.operator("mesh.extrude_move")
+        layout.operator("wm.call_menu", text="Extrude").name = 
"VIEW3D_MT_edit_mesh_extrude"
         layout.operator("mesh.duplicate_move")
         layout.operator("mesh.delete", text="Delete...")
 
@@ -1198,7 +1198,20 @@
         prop.value = "(False, False, True)"
         prop.path = "tool_settings.mesh_selection_mode"
 
+class VIEW3D_MT_edit_mesh_extrude(bpy.types.Menu):
+    bl_label = "Extrude"
 
+    def draw(self, context):
+        layout = self.layout
+        
+        layout.operator_context = 'INVOKE_REGION_WIN'
+        
+        layout.operator("mesh.extrude_region_move", text="Region")
+        layout.operator("mesh.extrude_faces_move", text="Individual Faces")
+        layout.operator("mesh.extrude_edges_move", text="Edges Only")
+        layout.operator("mesh.extrude_vertices_move", text="Vertices Only")
+
+
 class VIEW3D_MT_edit_mesh_vertices(bpy.types.Menu):
     bl_label = "Vertices"
 
@@ -2032,6 +2045,7 @@
 bpy.types.register(VIEW3D_MT_edit_mesh_faces)
 bpy.types.register(VIEW3D_MT_edit_mesh_normals)
 bpy.types.register(VIEW3D_MT_edit_mesh_showhide)
+bpy.types.register(VIEW3D_MT_edit_mesh_extrude)
 
 bpy.types.register(VIEW3D_MT_edit_curve)
 bpy.types.register(VIEW3D_MT_edit_curve_ctrlpoints)

Modified: trunk/blender/release/scripts/ui/space_view3d_toolbar.py
===================================================================
--- trunk/blender/release/scripts/ui/space_view3d_toolbar.py    2010-02-01 
18:26:45 UTC (rev 26523)
+++ trunk/blender/release/scripts/ui/space_view3d_toolbar.py    2010-02-01 
18:30:00 UTC (rev 26524)
@@ -99,7 +99,7 @@
 
         col = layout.column(align=True)
         col.label(text="Add:")
-        col.operator("mesh.extrude_move")
+        col.operator("wm.call_menu", text="Extrude").name = 
"VIEW3D_MT_edit_mesh_extrude"
         col.operator("mesh.subdivide")
         col.operator("mesh.loopcut_slide")
         col.operator("mesh.duplicate_move", text="Duplicate")

Modified: trunk/blender/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_tools.c  2010-02-01 
18:26:45 UTC (rev 26523)
+++ trunk/blender/source/blender/editors/mesh/editmesh_tools.c  2010-02-01 
18:30:00 UTC (rev 26524)
@@ -623,46 +623,16 @@
 }
 
 /* generic extern called extruder */
-void extrude_mesh(Scene *scene, Object *obedit, EditMesh *em, wmOperator *op)
+void extrude_mesh(Scene *scene, Object *obedit, EditMesh *em, wmOperator *op, 
short type)
 {
        float nor[3]= {0.0, 0.0, 0.0};
-       short nr, transmode= 0;
+       short transmode= 0;
 
-       /* extrude depends on totvertsel etc */
-       EM_stats_update(em);
-       
-       if(em->selectmode & SCE_SELECT_VERTEX) {
-               if(em->totvertsel==0) nr= 0;
-               else if(em->totvertsel==1) nr= 4;
-               else if(em->totedgesel==0) nr= 4;
-               else if(em->totfacesel==0)
-                       nr= 3; // pupmenu("Extrude %t|Only Edges%x3|Only 
Vertices%x4");
-               else if(em->totfacesel==1)
-                       nr= 1; // pupmenu("Extrude %t|Region %x1|Only 
Edges%x3|Only Vertices%x4");
-               else
-                       nr= 1; // pupmenu("Extrude %t|Region %x1||Individual 
Faces %x2|Only Edges%x3|Only Vertices%x4");
-       }
-       else if(em->selectmode & SCE_SELECT_EDGE) {
-               if (em->totedgesel==0) nr = 0;
-               else if (em->totedgesel==1) nr = 3;
-               else if(em->totfacesel==0) nr = 3;
-               else if(em->totfacesel==1)
-                       nr= 1; // pupmenu("Extrude %t|Region %x1|Only 
Edges%x3");
-               else
-                       nr= 1; // pupmenu("Extrude %t|Region %x1||Individual 
Faces %x2|Only Edges%x3");
-       }
-       else {
-               if (em->totfacesel == 0) nr = 0;
-               else if (em->totfacesel == 1) nr = 1;
-               else
-                       nr= 1; // pupmenu("Extrude %t|Region %x1||Individual 
Faces %x2");
-       }
+       if(type<1) return;
 
-       if(nr<1) return;
-
-       if(nr==1)  transmode= extrudeflag(obedit, em, SELECT, nor, 0);
-       else if(nr==4) transmode= extrudeflag_verts_indiv(em, SELECT, nor);
-       else if(nr==3) transmode= extrudeflag_edges_indiv(em, SELECT, nor);
+       if(type==1)  transmode= extrudeflag(obedit, em, SELECT, nor, 0);
+       else if(type==4) transmode= extrudeflag_verts_indiv(em, SELECT, nor);
+       else if(type==3) transmode= extrudeflag_edges_indiv(em, SELECT, nor);
        else transmode= extrudeflag_face_indiv(em, SELECT, nor);
 
        if(transmode==0) {
@@ -682,7 +652,7 @@
 
                /* individual faces? */
 //             BIF_TransformSetUndo("Extrude");
-               if(nr==2) {
+               if(type==2) {
 //                     initTransform(TFM_SHRINKFATTEN, 
CTX_NO_PET|CTX_NO_MIRROR);
 //                     Transform();
                }
@@ -706,7 +676,7 @@
        Object *obedit= CTX_data_edit_object(C);
        EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
        
-       extrude_mesh(scene, obedit, em, op);
+       extrude_mesh(scene, obedit, em, op, RNA_int_get(op->ptr, "type"));
 
        BKE_mesh_end_editmesh(obedit->data, em);
 
@@ -723,7 +693,7 @@
        Object *obedit= CTX_data_edit_object(C);
        EditMesh *em= BKE_mesh_get_editmesh(obedit->data);
 
-       extrude_mesh(scene, obedit, em, op);
+       extrude_mesh(scene, obedit, em, op, RNA_int_get(op->ptr, "type"));
 
        DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
@@ -732,62 +702,69 @@
        return OPERATOR_FINISHED;
 }
 
-/* extrude options */
-EnumPropertyItem extrude_item_region = {1, "REGION", 0, "Region", ""};
-EnumPropertyItem extrude_item_faces = {2, "FACES", 0, "Individual Faces", ""};
-EnumPropertyItem extrude_item_edges = {3, "EDGES", 0, "Only Edges", ""};
-EnumPropertyItem extrude_item_verts = {4, "VERTS", 0, "Only Vertices", ""};
+EnumPropertyItem extrude_items[] = {
+               {1, "REGION", 0, "Region", ""},
+               {2, "FACES", 0, "Individual Faces", ""},
+               {3, "EDGES", 0, "Only Edges", ""},
+               {4, "VERTS", 0, "Only Vertices", ""},
+               {0, NULL, 0, NULL, NULL}};
 
+
 static EnumPropertyItem *extrude_itemf(bContext *C, PointerRNA *ptr, int *free)
 {
        EnumPropertyItem *item= NULL;
        Object *obedit= CTX_data_edit_object(C);
-       EditMesh *em= BKE_mesh_get_editmesh(obedit->data);
+       EditMesh *em;
 
        int totitem= 0;
 
        if(!obedit)
-               return NULL;
+               return extrude_items;
 
+       em = BKE_mesh_get_editmesh(obedit->data);
+
+       EM_stats_update(em);
+
        if(em->selectmode & SCE_SELECT_VERTEX) {
                if(em->totvertsel==0) {}
-               else if(em->totvertsel==1) { RNA_enum_item_add(&item, &totitem, 
&extrude_item_verts); }
-               else if(em->totedgesel==0) { RNA_enum_item_add(&item, &totitem, 
&extrude_item_verts); }
+               else if(em->totvertsel==1) { RNA_enum_item_add(&item, &totitem, 
&extrude_items[3]); }
+               else if(em->totedgesel==0) { RNA_enum_item_add(&item, &totitem, 
&extrude_items[3]); }
                else if(em->totfacesel==0) {
-                       RNA_enum_item_add(&item, &totitem, &extrude_item_edges);
-                       RNA_enum_item_add(&item, &totitem, &extrude_item_verts);
+                       RNA_enum_item_add(&item, &totitem, &extrude_items[2]);
+                       RNA_enum_item_add(&item, &totitem, &extrude_items[3]);
                }
                else if(em->totfacesel==1) {
-                       RNA_enum_item_add(&item, &totitem, 
&extrude_item_region);
-                       RNA_enum_item_add(&item, &totitem, &extrude_item_edges);
-                       RNA_enum_item_add(&item, &totitem, &extrude_item_verts);
+                       RNA_enum_item_add(&item, &totitem, &extrude_items[0]);
+                       RNA_enum_item_add(&item, &totitem, &extrude_items[2]);
+                       RNA_enum_item_add(&item, &totitem, &extrude_items[3]);
                }
                else {
-                       RNA_enum_item_add(&item, &totitem, 
&extrude_item_region);
-                       RNA_enum_item_add(&item, &totitem, &extrude_item_edges);
-                       RNA_enum_item_add(&item, &totitem, &extrude_item_verts);
+                       RNA_enum_item_add(&item, &totitem, &extrude_items[0]);
+                       RNA_enum_item_add(&item, &totitem, &extrude_items[1]);
+                       RNA_enum_item_add(&item, &totitem, &extrude_items[2]);
+                       RNA_enum_item_add(&item, &totitem, &extrude_items[3]);
                }
        }
        else if(em->selectmode & SCE_SELECT_EDGE) {
                if (em->totedgesel==0) {}
-               else if (em->totedgesel==1) { RNA_enum_item_add(&item, 
&totitem, &extrude_item_edges); }
-               else if(em->totfacesel==0) { RNA_enum_item_add(&item, &totitem, 
&extrude_item_edges); }
+               else if (em->totedgesel==1) { RNA_enum_item_add(&item, 
&totitem, &extrude_items[2]); }
+               else if(em->totfacesel==0) { RNA_enum_item_add(&item, &totitem, 
&extrude_items[2]); }
                else if(em->totfacesel==1) {
-                       RNA_enum_item_add(&item, &totitem, 
&extrude_item_region);
-                       RNA_enum_item_add(&item, &totitem, &extrude_item_edges);
+                       RNA_enum_item_add(&item, &totitem, &extrude_items[0]);
+                       RNA_enum_item_add(&item, &totitem, &extrude_items[2]);
                }
                else {
-                       RNA_enum_item_add(&item, &totitem, 
&extrude_item_region);
-                       RNA_enum_item_add(&item, &totitem, &extrude_item_faces);
-                       RNA_enum_item_add(&item, &totitem, &extrude_item_edges);
+                       RNA_enum_item_add(&item, &totitem, &extrude_items[0]);
+                       RNA_enum_item_add(&item, &totitem, &extrude_items[1]);
+                       RNA_enum_item_add(&item, &totitem, &extrude_items[2]);
                }
        }
        else {
                if (em->totfacesel == 0) {}
-               else if (em->totfacesel == 1) { RNA_enum_item_add(&item, 
&totitem, &extrude_item_region); }
+               else if (em->totfacesel == 1) { RNA_enum_item_add(&item, 
&totitem, &extrude_items[0]); }
                else {
-                       RNA_enum_item_add(&item, &totitem, 
&extrude_item_region);
-                       RNA_enum_item_add(&item, &totitem, &extrude_item_faces);
+                       RNA_enum_item_add(&item, &totitem, &extrude_items[0]);
+                       RNA_enum_item_add(&item, &totitem, &extrude_items[1]);
                }
        }
 
@@ -803,9 +780,7 @@
 
 void MESH_OT_extrude(wmOperatorType *ot)
 {
-#if 0
        PropertyRNA *prop;
-#endif
 
        /* identifiers */
        ot->name= "Extrude";
@@ -820,12 +795,10 @@
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 
-#if 0
        /* properties */
-       prop= RNA_def_enum(ot->srna, "type", DummyRNA_NULL_items, 0, "Type", 
"");
+       prop= RNA_def_enum(ot->srna, "type", extrude_items, 0, "Type", "");
        RNA_def_enum_funcs(prop, extrude_itemf);
        ot->prop= prop;
-#endif
 }
 
 static int split_mesh(bContext *C, wmOperator *op)

Modified: trunk/blender/source/blender/editors/mesh/mesh_ops.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/mesh_ops.c        2010-02-01 
18:26:45 UTC (rev 26523)
+++ trunk/blender/source/blender/editors/mesh/mesh_ops.c        2010-02-01 
18:30:00 UTC (rev 26524)
@@ -188,18 +188,31 @@
        otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to