2.5: Various Fixes
[blender.git] / source / blender / editors / space_view3d / view3d_header.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2004-2008 Blender Foundation.
21  * All rights reserved.
22  *
23  * 
24  * Contributor(s): Blender Foundation
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 #include <string.h>
30 #include <stdio.h>
31 #include <stdlib.h>
32
33 #include "DNA_armature_types.h"
34 #include "DNA_ID.h"
35 #include "DNA_image_types.h"
36 #include "DNA_meshdata_types.h"
37 #include "DNA_mesh_types.h"
38 #include "DNA_object_types.h"
39 #include "DNA_space_types.h"
40 #include "DNA_scene_types.h"
41 #include "DNA_screen_types.h"
42 #include "DNA_texture_types.h"
43 #include "DNA_userdef_types.h" /* U.smooth_viewtx */
44 #include "DNA_view3d_types.h"
45 #include "DNA_windowmanager_types.h"
46
47 #include "RNA_access.h"
48
49 #include "MEM_guardedalloc.h"
50
51 #include "BKE_action.h"
52 #include "BKE_brush.h"
53 #include "BKE_context.h"
54 #include "BKE_curve.h"
55 #include "BKE_depsgraph.h"
56 #include "BKE_displist.h"
57 #include "BKE_effect.h"
58 #include "BKE_global.h"
59 #include "BKE_image.h"
60 #include "BKE_library.h"
61 #include "BKE_main.h"
62 #include "BKE_mesh.h"
63 #include "BKE_modifier.h"
64 #include "BKE_particle.h"
65 #include "BKE_screen.h"
66 #include "BKE_utildefines.h" /* for VECCOPY */
67
68 #include "ED_armature.h"
69 #include "ED_particle.h"
70 #include "ED_object.h"
71 #include "ED_mesh.h"
72 #include "ED_util.h"
73 #include "ED_screen.h"
74 #include "ED_types.h"
75
76 #include "WM_api.h"
77 #include "WM_types.h"
78
79 #include "RNA_access.h"
80 #include "RNA_define.h"
81
82 #include "BIF_gl.h"
83 #include "BIF_glutil.h"
84 #include "BIF_transform.h"
85
86 #include "BLI_arithb.h"
87 #include "BLI_blenlib.h"
88 #include "BLI_editVert.h"
89
90 #include "UI_interface.h"
91 #include "UI_interface_icons.h"
92 #include "UI_resources.h"
93 #include "UI_view2d.h"
94
95 #include "view3d_intern.h"
96
97
98 /* View3d->modeselect 
99  * This is a bit of a dodgy hack to enable a 'mode' menu with icons+labels
100  * rather than those buttons.
101  * I know the implementation's not good - it's an experiment to see if this
102  * approach would work well
103  *
104  * This can be cleaned when I make some new 'mode' icons.
105  */
106
107 #define V3D_OBJECTMODE_SEL                      ICON_OBJECT_DATA
108 #define V3D_EDITMODE_SEL                        ICON_EDITMODE_HLT
109 #define V3D_SCULPTMODE_SEL                      ICON_SCULPTMODE_HLT
110 #define V3D_FACESELECT_SEL                      ICON_FACESEL_HLT        /* this is not a mode anymore - just a switch */
111 #define V3D_VERTEXPAINTMODE_SEL         ICON_VPAINT_HLT
112 #define V3D_TEXTUREPAINTMODE_SEL        ICON_TPAINT_HLT
113 #define V3D_WEIGHTPAINTMODE_SEL         ICON_WPAINT_HLT
114 #define V3D_POSEMODE_SEL                        ICON_POSE_HLT
115 #define V3D_PARTICLEEDITMODE_SEL        ICON_ANIM
116
117 #define TEST_EDITMESH   if(obedit==0) return; \
118                                                 if( (v3d->lay & obedit->lay)==0 ) return;
119
120 /* XXX port over */
121 static void handle_view3d_lock(void) {}
122 static void countall(void) {}
123 extern void borderselect();
124 static int retopo_mesh_paint_check() {return 0;}
125
126 /* view3d handler codes */
127 #define VIEW3D_HANDLER_BACKGROUND       1
128 #define VIEW3D_HANDLER_PROPERTIES       2
129 #define VIEW3D_HANDLER_OBJECT           3
130 #define VIEW3D_HANDLER_PREVIEW          4
131 #define VIEW3D_HANDLER_MULTIRES         5
132 #define VIEW3D_HANDLER_TRANSFORM        6
133 #define VIEW3D_HANDLER_GREASEPENCIL 7
134 #define VIEW3D_HANDLER_BONESKETCH       8
135
136 /* end XXX ************* */
137
138
139 /* well... in this file a lot of view mode manipulation happens, so let's have it defined here */
140 void ED_view3d_exit_paint_modes(bContext *C)
141 {
142         if(G.f & G_TEXTUREPAINT)
143                 WM_operator_name_call(C, "PAINT_OT_texture_paint_toggle", WM_OP_EXEC_REGION_WIN, NULL);
144         if(G.f & G_VERTEXPAINT)
145                 WM_operator_name_call(C, "PAINT_OT_vertex_paint_toggle", WM_OP_EXEC_REGION_WIN, NULL);
146         else if(G.f & G_WEIGHTPAINT)
147                 WM_operator_name_call(C, "PAINT_OT_weight_paint_toggle", WM_OP_EXEC_REGION_WIN, NULL);
148
149         if(G.f & G_SCULPTMODE)
150                 WM_operator_name_call(C, "SCULPT_OT_sculptmode_toggle", WM_OP_EXEC_REGION_WIN, NULL);
151         if(G.f & G_PARTICLEEDIT)
152                 WM_operator_name_call(C, "PARTICLE_OT_particle_edit_toggle", WM_OP_EXEC_REGION_WIN, NULL);
153         
154         G.f &= ~(G_VERTEXPAINT+G_TEXTUREPAINT+G_WEIGHTPAINT+G_SCULPTMODE+G_PARTICLEEDIT);
155 }
156
157
158
159
160
161 static void do_view3d_header_buttons(bContext *C, void *arg, int event);
162
163 #define B_SCENELOCK 101
164 #define B_FULL          102
165 #define B_HOME          103
166 #define B_VIEWBUT       104
167 #define B_PERSP         105
168 #define B_VIEWRENDER    106
169 #define B_STARTGAME     107
170 #define B_MODESELECT 108
171 #define B_AROUND        109
172 #define B_SEL_VERT      110
173 #define B_SEL_EDGE      111
174 #define B_SEL_FACE      112
175 #define B_SEL_PATH      113
176 #define B_SEL_POINT     114
177 #define B_SEL_END       115
178 #define B_MAN_TRANS     116
179 #define B_MAN_ROT       117
180 #define B_MAN_SCALE     118
181 #define B_NDOF          119     
182 #define B_MAN_MODE      120
183 #define B_VIEW_BUTSEDIT 121
184 #define B_REDR          122
185 #define B_NOP           123
186 #define B_ACTCOPY       124
187 #define B_ACTPASTE      125
188 #define B_ACTPASTEFLIP 126
189
190 #define B_LAY           201
191
192
193 static RegionView3D *wm_region_view3d(const bContext *C)
194 {
195         ScrArea *sa= CTX_wm_area(C);
196         ARegion *ar;
197         /* XXX handle foursplit? */
198         for(ar= sa->regionbase.first; ar; ar= ar->next)
199                 if(ar->regiontype==RGN_TYPE_WINDOW)
200                         return ar->regiondata;
201         return NULL;
202 }
203
204 /* XXX; all this context stuff...  should become operator */
205 void do_layer_buttons(bContext *C, short event)
206 {
207         wmWindow *win= CTX_wm_window(C);
208         Scene *scene= CTX_data_scene(C);
209         ScrArea *sa= CTX_wm_area(C);
210         View3D *v3d= sa->spacedata.first;
211         static int oldlay= 1;
212         short shift, alt, ctrl;
213         
214         shift= win->eventstate->shift;
215         alt= win->eventstate->alt;
216         ctrl= win->eventstate->ctrl;
217         
218         if(v3d==0) return;
219         if(v3d->localview) return;
220         
221         if(event==-1 && ctrl) {
222                 v3d->scenelock= !v3d->scenelock;
223                 do_view3d_header_buttons(C, NULL, B_SCENELOCK);
224         } else if (event<0) {
225                 if(v3d->lay== (1<<20)-1) {
226                         if(event==-2 || shift) v3d->lay= oldlay;
227                 }
228                 else {
229                         oldlay= v3d->lay;
230                         v3d->lay= (1<<20)-1;
231                 }
232                 
233                 if(v3d->scenelock) handle_view3d_lock();
234                 
235                 /* new layers might need unflushed events events */
236                 DAG_scene_update_flags(scene, v3d->lay);        /* tags all that moves and flushes */
237         }
238         else {
239                 if(alt) {
240                         if(event<11) event+= 10;
241                 }
242                 if(shift) {
243                         if(v3d->lay & (1<<event)) v3d->lay -= (1<<event);
244                         else    v3d->lay += (1<<event);
245                 }
246                 do_view3d_header_buttons(C, NULL, event+B_LAY);
247         }
248         ED_area_tag_redraw(sa);
249         
250         if(v3d->drawtype == OB_SHADED) reshadeall_displist(scene);
251 }
252
253 static int layers_exec(bContext *C, wmOperator *op)
254 {
255         Scene *scene= CTX_data_scene(C);
256         ScrArea *sa= CTX_wm_area(C);
257         View3D *v3d= sa->spacedata.first;
258         int nr= RNA_int_get(op->ptr, "nr");
259         
260         if(nr<=0)
261                 return OPERATOR_CANCELLED;
262         nr--;
263         
264         if(RNA_boolean_get(op->ptr, "extend"))
265                 v3d->lay |= (1<<nr);
266         else 
267                 v3d->lay = (1<<nr);
268         
269         if(v3d->scenelock) handle_view3d_lock();
270         
271         /* new layers might need unflushed events events */
272         DAG_scene_update_flags(scene, v3d->lay);        /* tags all that moves and flushes */
273
274         ED_area_tag_redraw(sa);
275         
276         return OPERATOR_FINISHED;
277 }
278
279 /* applies shift and alt, lazy coding or ok? :) */
280 /* the local per-keymap-entry keymap will solve it */
281 static int layers_invoke(bContext *C, wmOperator *op, wmEvent *event)
282 {
283         if(event->ctrl || event->oskey)
284                 return OPERATOR_PASS_THROUGH;
285         
286         if(event->shift)
287                 RNA_boolean_set(op->ptr, "extend", 1);
288         
289         if(event->alt) {
290                 int nr= RNA_int_get(op->ptr, "nr") + 10;
291                 RNA_int_set(op->ptr, "nr", nr);
292         }
293         layers_exec(C, op);
294         
295         return OPERATOR_FINISHED;
296 }
297
298 void VIEW3D_OT_layers(wmOperatorType *ot)
299 {
300         /* identifiers */
301         ot->name= "Layers";
302         ot->idname= "VIEW3D_OT_layers";
303         
304         /* api callbacks */
305         ot->invoke= layers_invoke;
306         ot->exec= layers_exec;
307         ot->poll= ED_operator_view3d_active;
308         
309         /* flags */
310         ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
311         
312         RNA_def_int(ot->srna, "nr", 1, 0, 20, "Number", "", 0, 20);
313         RNA_def_boolean(ot->srna, "extend", 0, "Extend", "");
314 }
315
316
317 #if 0
318 static void do_view3d_view_camerasmenu(bContext *C, void *arg, int event)
319 {
320         Scene *scene= CTX_data_scene(C);
321         Base *base;
322         int i=1;
323         
324         if (event == 1) {
325                 /* Set Active Object as Active Camera */
326                 /* XXX ugly hack alert */
327 //              G.qual |= LR_CTRLKEY;
328 //              persptoetsen(PAD0);
329 //              G.qual &= ~LR_CTRLKEY;
330         } else {
331
332                 for( base = FIRSTBASE; base; base = base->next ) {
333                         if (base->object->type == OB_CAMERA) {
334                                 i++;
335                                 
336                                 if (event==i) {
337                                         /* XXX use api call! */
338                                         
339                                         break;
340                                 }
341                         }
342                 }
343         }
344         
345 }
346
347
348 static uiBlock *view3d_view_camerasmenu(bContext *C, ARegion *ar, void *arg_unused)
349 {
350         Scene *scene= CTX_data_scene(C);
351         Base *base;
352         uiBlock *block;
353         short yco= 0, menuwidth=120;
354         int i=1;
355         char camname[48];
356         
357         block= uiBeginBlock(C, ar, "view3d_view_camerasmenu", UI_EMBOSSP);
358         uiBlockSetButmFunc(block, do_view3d_view_camerasmenu, NULL);
359
360         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Active Object as Active Camera|Ctrl NumPad 0",       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
361
362         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
363         
364         for( base = FIRSTBASE; base; base = base->next ) {
365                 if (base->object->type == OB_CAMERA) {
366                         i++;
367                         
368                         strcpy(camname, base->object->id.name+2);
369                         if (base->object == scene->camera) strcat(camname, " (Active)");
370                         
371                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, camname,  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,  i, "");
372                 }
373         }
374         
375         uiBlockSetDirection(block, UI_RIGHT);
376         uiTextBoundsBlock(block, 50);
377         return block;
378 }
379 #endif
380
381 #if 0
382 static void do_view3d_view_cameracontrolsmenu(bContext *C, void *arg, int event)
383 {
384         switch(event) {
385         case 0: /* Orbit Left */
386                 persptoetsen(PAD4);
387                 break;
388         case 1: /* Orbit Right */
389                 persptoetsen(PAD6);
390                 break;
391         case 2: /* Orbit Up */
392                 persptoetsen(PAD8);
393                 break;
394         case 3: /* Orbit Down */
395                 persptoetsen(PAD2);
396                 break;
397         case 4: /* Pan left */
398                 /* XXX ugly hack alert */
399 //              G.qual |= LR_CTRLKEY;
400                 persptoetsen(PAD4);
401 //              G.qual &= ~LR_CTRLKEY;
402                 break;
403         case 5: /* Pan right */
404                 /* XXX ugly hack alert */
405 //              G.qual |= LR_CTRLKEY;
406                 persptoetsen(PAD6);
407 //              G.qual &= ~LR_CTRLKEY;
408                 break;
409         case 6: /* Pan up */
410                 /* ugly hack alert */
411 //              G.qual |= LR_CTRLKEY;
412                 persptoetsen(PAD8);
413 //              G.qual &= ~LR_CTRLKEY;
414                 break;
415         case 7: /* Pan down */
416                 /* ugly hack alert */
417 //              G.qual |= LR_CTRLKEY;
418                 persptoetsen(PAD2);
419 //              G.qual &= ~LR_CTRLKEY;
420                 break;
421         case 8: /* Zoom In */
422                 persptoetsen(PADPLUSKEY);
423                 break;
424         case 9: /* Zoom Out */
425                 persptoetsen(PADMINUS);
426                 break;
427         case 10: /* Reset Zoom */
428                 persptoetsen(PADENTER);
429                 break;
430         case 11: /* Camera Fly mode */
431                 fly();
432                 break;
433         }
434 }
435
436
437 static uiBlock *view3d_view_cameracontrolsmenu(bContext *C, ARegion *ar, void *arg_unused)
438 {
439 /*              static short tog=0; */
440         uiBlock *block;
441         short yco= 0, menuwidth=120;
442         
443         block= uiBeginBlock(C, ar, "view3d_view_cameracontrolsmenu", UI_EMBOSSP);
444         uiBlockSetButmFunc(block, do_view3d_view_cameracontrolsmenu, NULL);
445
446         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera Fly Mode|Shift F",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
447         
448         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
449         
450         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Orbit Left|NumPad 4",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
451         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Orbit Right|NumPad 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
452         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Orbit Up|NumPad 8",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
453         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Orbit Down|NumPad 2",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
454         
455         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
456         
457         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pan Left|Ctrl NumPad 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
458         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pan Right|Ctrl NumPad 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
459         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pan Up|Ctrl NumPad 8",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
460         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pan Down|Ctrl NumPad 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
461         
462         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
463         
464         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom In|NumPad +", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
465         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom Out|NumPad -",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
466         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Zoom|NumPad Enter",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 10, "");
467
468         uiBlockSetDirection(block, UI_RIGHT);
469         uiTextBoundsBlock(block, 50);
470         return block;
471 }
472
473 static void do_view3d_view_alignviewmenu(bContext *C, void *arg, int event)
474 {
475         Scene *scene= CTX_data_scene(C);
476         ScrArea *sa= CTX_wm_area(C);
477         View3D *v3d= sa->spacedata.first;
478         Object *obedit = CTX_data_edit_object(C);
479         float *curs;
480         
481         switch(event) {
482
483         case 0: /* Align View to Selected (edit/faceselect mode) */
484         case 1:
485         case 2:
486                 if ((obedit) && (obedit->type == OB_MESH)) {
487                         editmesh_align_view_to_selected(v3d, event + 1);
488                 } 
489                 else if (FACESEL_PAINT_TEST) {
490                         Object *obact= OBACT;
491                         if (obact && obact->type==OB_MESH) {
492                                 Mesh *me= obact->data;
493
494                                 if (me->mtface) {
495 // XXX                                  faceselect_align_view_to_selected(v3d, me, event + 1);
496                                         ED_area_tag_redraw(sa);
497                                 }
498                         }
499                 }
500                 break;
501         case 3: /* Center View to Cursor */
502                 curs= give_cursor(scene, v3d);
503                 v3d->ofs[0]= -curs[0];
504                 v3d->ofs[1]= -curs[1];
505                 v3d->ofs[2]= -curs[2];
506                 ED_area_tag_redraw(sa);
507                 break;
508         case 4: /* Align Active Camera to View */
509                 /* XXX This ugly hack is a symptom of the nasty persptoetsen function, 
510                  * but at least it works for now.
511                  */
512 //              G.qual |= LR_CTRLKEY|LR_ALTKEY;
513                 persptoetsen(PAD0);
514 //              G.qual &= ~(LR_CTRLKEY|LR_ALTKEY);
515                 break;
516         case 5: /* Align View to Selected (object mode) */
517 // XXX          mainqenter(PADASTERKEY, 1);
518                 break;
519         case 6: /* Center View and Cursor to Origin */
520                 WM_operator_name_call(C, "VIEW3D_OT_viewcenter", WM_OP_EXEC_REGION_WIN, NULL);
521                 curs= give_cursor(scene, v3d);
522                 curs[0]=curs[1]=curs[2]= 0.0;
523                 break;
524         }
525 }
526
527 static uiBlock *view3d_view_alignviewmenu(bContext *C, ARegion *ar, void *arg_unused)
528 {
529 /*              static short tog=0; */
530         uiBlock *block;
531         Object *obedit = CTX_data_edit_object(C);
532         short yco= 0, menuwidth=120;
533         
534         block= uiBeginBlock(C, ar, "view3d_view_alignviewmenu", UI_EMBOSSP);
535         uiBlockSetButmFunc(block, do_view3d_view_alignviewmenu, NULL);
536
537         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center View to Cursor|C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
538         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center Cursor and View All|Shift C",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
539         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align Active Camera to View|Ctrl Alt NumPad 0",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");   
540
541         if (((obedit) && (obedit->type == OB_MESH)) || (FACESEL_PAINT_TEST)) {
542                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected (Top)|Shift V",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
543                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected (Front)|Shift V",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
544                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected (Side)|Shift V",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
545         } else {
546                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected|NumPad *",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
547         }
548         
549         uiBlockSetDirection(block, UI_RIGHT);
550         uiTextBoundsBlock(block, 50);
551         return block;
552 }
553 #endif
554
555 #if 0
556 static uiBlock *view3d_view_spacehandlers(bContext *C, ARegion *ar, void *arg_unused)
557 {
558         /* XXX */
559         return NULL;
560 }
561
562
563 static void do_view3d_viewmenu(bContext *C, void *arg, int event)
564 {
565         
566         switch(event) {
567         case 0: /* User */
568                 break;
569         case 1: /* Camera */
570                 break;
571         case 2: /* Top */
572                 break;
573         case 3: /* Front */
574                 break;
575         case 4: /* Side */
576                 break;
577         case 5: /* Perspective */
578                 break;
579         case 6: /* Orthographic */
580                 break;
581         case 7: /* Local View */
582                 break;
583         case 8: /* Global View */
584                 break;
585         case 9: /* View All (Home) */
586                 WM_operator_name_call(C, "VIEW3D_OT_viewhome", WM_OP_EXEC_REGION_WIN, NULL);
587                 break;
588         case 11: /* View Selected */
589                 WM_operator_name_call(C, "VIEW3D_OT_viewcenter", WM_OP_EXEC_REGION_WIN, NULL);
590                 break;
591         case 13: /* Play Back Animation */
592                 break;
593         case 15: /* Background Image... */
594 //              add_blockhandler(sa, VIEW3D_HANDLER_BACKGROUND, UI_PNL_UNSTOW);
595                 break;
596         case 16: /* View  Panel */
597 //              add_blockhandler(sa, VIEW3D_HANDLER_PROPERTIES, UI_PNL_UNSTOW);
598                 break;
599         case 17: /* Set Clipping Border */
600                 WM_operator_name_call(C, "VIEW3D_OT_clipping", WM_OP_INVOKE_REGION_WIN, NULL);
601                 break;
602         case 18: /* render preview */
603 //              toggle_blockhandler(sa, VIEW3D_HANDLER_PREVIEW, 0);
604                 break;
605         case 19: /* zoom within border */
606 //              view3d_border_zoom();
607                 break;
608         case 20: /* Transform  Space Panel */
609 //              add_blockhandler(sa, VIEW3D_HANDLER_TRANSFORM, UI_PNL_UNSTOW);
610                 break;  
611         case 21: /* Grease Pencil */
612 //              add_blockhandler(sa, VIEW3D_HANDLER_GREASEPENCIL, UI_PNL_UNSTOW);
613                 break;          
614         case 22: /* View all layers */
615                 do_layer_buttons(C, -2);
616                 break;
617         }
618 }
619 #endif
620
621 static void view3d_view_viewnavmenu(bContext *C, uiLayout *layout, void *arg_unused)
622 {
623 //      uiItemO(layout, NULL, 0, "VIEW3D_OT_view_fly_mode");
624         
625 //      uiItemS(layout);
626         
627         uiItemsEnumO(layout, "VIEW3D_OT_view_orbit", "type");
628         
629         uiItemS(layout);
630         
631         uiItemsEnumO(layout, "VIEW3D_OT_view_pan", "type");
632         
633         uiItemS(layout);
634         
635         uiItemFloatO(layout, "Zoom in", 0, "VIEW3D_OT_zoom", "delta", 1.0f);
636         uiItemFloatO(layout, "Zoom out", 0, "VIEW3D_OT_zoom", "delta", -1.0f);
637         
638 }
639 static void view3d_view_alignviewmenu(bContext *C, uiLayout *layout, void *arg_unused)
640 {
641         
642 }
643
644 static void view3d_viewmenu(bContext *C, uiLayout *layout, void *arg_unused)
645 {
646         ScrArea *sa= CTX_wm_area(C);
647         
648 //      uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_transform_orientations_panel"); // Transform Orientations...
649 //      uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_render_preview_panel"); // render preview...
650 //      uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_view_properties_panel"); // View Properties....
651 //      uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_background_image_panel"); // Background Image....
652 //      uiItemO(layout, ICON_MENU_PANEL, "VIEW3D_OT_toggle_grease_pencil_panel"); // Grease Pencil....
653         
654 //      uiItemS(layout);
655         
656         uiItemEnumO(layout, NULL, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_CAMERA);
657         uiItemEnumO(layout, NULL, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_TOP);
658         uiItemEnumO(layout, NULL, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_FRONT);
659         uiItemEnumO(layout, NULL, 0, "VIEW3D_OT_viewnumpad", "type", V3D_VIEW_RIGHT);
660         
661         //uiItemMenuF(layout, "Cameras", view3d_view_camerasmenu);
662         
663         uiItemS(layout);
664
665         uiItemO(layout, NULL, 0, "VIEW3D_OT_view_persportho");
666         
667         uiItemS(layout);
668         
669 //      uiItemO(layout, NULL, 0, "VIEW3D_OT_view_show_all_layers");     
670         
671 //      uiItemS(layout);
672         
673 //      uiItemO(layout, NULL, 0, "VIEW3D_OT_view_local_view");
674 //      uiItemO(layout, NULL, 0, "VIEW3D_OT_view_global_view");
675         
676 //      uiItemS(layout);
677         
678         uiItemMenuF(layout, "View Navigation", 0, view3d_view_viewnavmenu);
679         uiItemMenuF(layout, "Align View", 0, view3d_view_alignviewmenu);
680         
681         uiItemS(layout);
682
683         uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_REGION_WIN);    
684
685         uiItemO(layout, NULL, 0, "VIEW3D_OT_clipping");
686         uiItemO(layout, NULL, 0, "VIEW3D_OT_zoom_border");
687         
688         uiItemS(layout);
689         
690         uiItemO(layout, NULL, 0, "VIEW3D_OT_viewcenter");
691         uiItemO(layout, NULL, 0, "VIEW3D_OT_viewhome");
692         
693         uiItemS(layout);
694         
695         if(sa->full) uiItemO(layout, NULL, 0, "SCREEN_OT_screen_full_area"); // "Tile Window", Ctrl UpArrow
696         else uiItemO(layout, NULL, 0, "SCREEN_OT_screen_full_area"); // "Maximize Window", Ctr DownArrow
697 }
698 #if 0
699 static uiBlock *view3d_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
700 {
701         ScrArea *sa= CTX_wm_area(C);
702         View3D *v3d= sa->spacedata.first;
703         RegionView3D *rv3d= wm_region_view3d(C);
704         uiBlock *block;
705         short yco= 0, menuwidth=120;
706         
707         block= uiBeginBlock(C, ar, "view3d_viewmenu", UI_EMBOSSP);
708         uiBlockSetButmFunc(block, do_view3d_viewmenu, NULL);
709         
710         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Orientations...",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 20, "");
711         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Render Preview...|Shift P",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 18, "");
712         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "View Properties...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 16, "");
713         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Background Image...",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 15, "");
714         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Grease Pencil...",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 21, "");
715         
716         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
717         
718         if ((rv3d->viewbut == 0) && !(rv3d->persp == V3D_CAMOB)) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "User",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
719         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "User",                                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
720         if (rv3d->persp == V3D_CAMOB) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Camera|NumPad 0",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
721         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Camera|NumPad 0",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
722         if (rv3d->viewbut == 1) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Top|NumPad 7",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
723         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Top|NumPad 7",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
724         if (rv3d->viewbut == 2) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Front|NumPad 1",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
725         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Front|NumPad 1",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
726         if (rv3d->viewbut == 3) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Side|NumPad 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
727         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Side|NumPad 3",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
728         
729         uiDefIconTextBlockBut(block, view3d_view_camerasmenu, NULL, ICON_RIGHTARROW_THIN, "Cameras", 0, yco-=20, 120, 19, "");
730         
731         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
732         
733         if(rv3d->persp==V3D_PERSP) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Perspective|NumPad 5",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
734         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Perspective|NumPad 5",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
735         if(rv3d->persp==V3D_ORTHO) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Orthographic|NumPad 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
736         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Orthographic|NumPad 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
737         
738         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
739         
740         if(v3d->lay== (1<<20)-1) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Previous Layers|Shift ~", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 22, "");
741         else uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show All Layers| ~", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 22, "");
742         
743         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
744         
745         if(v3d->localview) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Local View|NumPad /",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
746         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Local View|NumPad /", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
747         if(!v3d->localview) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Global View|NumPad /", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
748         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Global View|NumPad /",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
749         
750         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
751         
752         uiDefIconTextBlockBut(block, view3d_view_cameracontrolsmenu, NULL, ICON_RIGHTARROW_THIN, "View Navigation", 0, yco-=20, 120, 19, "");
753         uiDefIconTextBlockBut(block, view3d_view_alignviewmenu, NULL, ICON_RIGHTARROW_THIN, "Align View", 0, yco-=20, 120, 19, "");
754         
755         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
756         
757         if(rv3d->rflag & RV3D_CLIPPING)
758                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Clipping Border|Alt B",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 17, "");
759         else
760                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Clipping Border|Alt B",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 17, "");
761         if (rv3d->persp==V3D_ORTHO) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom Within Border...|Shift B",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 19, "");
762         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View Selected|NumPad .",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
763         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View All|Home",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
764         if(!sa->full) uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Maximize Window|Ctrl UpArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 99, "");
765         else uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Tile Window|Ctrl DownArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 99, "");
766
767         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
768         
769         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Animation|Alt A",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 13, "");
770
771 #ifndef DISABLE_PYTHON
772         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
773         uiDefIconTextBlockBut(block, view3d_view_spacehandlers, NULL, ICON_RIGHTARROW_THIN, "Space Handler Scripts", 0, yco-=20, 120, 19, "");
774 #endif
775
776         if(ar->alignment==RGN_ALIGN_TOP) {
777                 uiBlockSetDirection(block, UI_DOWN);
778         }
779         else {
780                 uiBlockSetDirection(block, UI_TOP);
781                 uiBlockFlipOrder(block);
782         }
783
784         uiTextBoundsBlock(block, 50);
785         
786         return block;
787 }
788 #endif
789
790 #if 0
791 void do_view3d_select_object_typemenu(bContext *C, void *arg, int event)
792 {
793
794         extern void selectall_type(short obtype);
795         
796         switch(event) {
797         case 1: /* Mesh */
798                 selectall_type(OB_MESH);
799                 break;
800         case 2: /* Curve */
801                 selectall_type(OB_CURVE);
802                 break;
803         case 3: /* Surface */
804                 selectall_type(OB_SURF);
805                 break;
806         case 4: /* Meta */
807                 selectall_type(OB_MBALL);
808                 break;
809         case 5: /* Armature */
810                 selectall_type(OB_ARMATURE);
811                 break;
812         case 6: /* Lattice */
813                 selectall_type(OB_LATTICE);
814                 break;
815         case 7: /* Text */
816                 selectall_type(OB_FONT);
817                 break;
818         case 8: /* Empty */
819                 selectall_type(OB_EMPTY);
820                 break;
821         case 9: /* Camera */
822                 selectall_type(OB_CAMERA);
823                 break;
824         case 10: /* Lamp */
825                 selectall_type(OB_LAMP);
826                 break;
827         case 20:
828                 do_layer_buttons(C, -2);
829                 break;
830         }
831 }
832
833 static uiBlock *view3d_select_object_typemenu(bContext *C, ARegion *ar, void *arg_unused)
834 {
835         uiBlock *block;
836         short yco = 20, menuwidth = 120;
837
838         block= uiBeginBlock(C, ar, "view3d_select_object_typemenu", UI_EMBOSSP);
839         uiBlockSetButmFunc(block, do_view3d_select_object_typemenu, NULL);
840
841         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mesh",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
842         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
843         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Surface",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
844         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
845         
846         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
847         
848         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Armature",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
849         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lattice",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
850         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Text",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
851         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Empty",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
852         
853         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
854         
855         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
856         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lamp",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
857         
858         uiBlockSetDirection(block, UI_RIGHT);
859         uiTextBoundsBlock(block, 60);
860         return block;
861 }
862
863
864 void do_view3d_select_object_layermenu(bContext *C, void *arg, int event)
865 {
866 // XXX  extern void selectall_layer(unsigned int layernum);
867         
868         switch(event) {
869         case 0:
870         case 1:
871         case 2:
872         case 3:
873         case 4:
874         case 5:
875         case 6:
876         case 7:
877         case 8:
878         case 9:
879         case 10:
880         case 11:
881         case 12:
882         case 13:
883         case 14:
884         case 15:
885         case 16:
886         case 17:
887         case 18:
888         case 19:
889         case 20:
890 // XXX          selectall_layer(event);
891                 break;
892         }
893 }
894
895 static uiBlock *view3d_select_object_layermenu(bContext *C, ARegion *ar, void *arg_unused)
896 {
897         uiBlock *block;
898         short xco= 0, yco = 20, menuwidth = 22;
899
900         block= uiBeginBlock(C, ar, "view3d_select_object_layermenu", UI_EMBOSSP);
901         uiBlockSetButmFunc(block, do_view3d_select_object_layermenu, NULL);
902
903         uiDefBut(block, BUTM, 1, "1",           xco, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
904         uiDefBut(block, BUTM, 1, "2",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
905         uiDefBut(block, BUTM, 1, "3",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
906         uiDefBut(block, BUTM, 1, "4",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
907         uiDefBut(block, BUTM, 1, "5",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
908         xco += 6;
909         uiDefBut(block, BUTM, 1, "6",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
910         uiDefBut(block, BUTM, 1, "7",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
911         uiDefBut(block, BUTM, 1, "8",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
912         uiDefBut(block, BUTM, 1, "9",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
913         uiDefBut(block, BUTM, 1, "10",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
914         xco = 0;
915         uiDefBut(block, BUTM, 1, "11",          xco, yco-=24, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
916         uiDefBut(block, BUTM, 1, "12",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
917         uiDefBut(block, BUTM, 1, "13",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
918         uiDefBut(block, BUTM, 1, "14",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
919         uiDefBut(block, BUTM, 1, "15",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
920         xco += 6;
921         uiDefBut(block, BUTM, 1, "16",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
922         uiDefBut(block, BUTM, 1, "17",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
923         uiDefBut(block, BUTM, 1, "18",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
924         uiDefBut(block, BUTM, 1, "19",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
925         uiDefBut(block, BUTM, 1, "20",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
926         
927         uiBlockSetDirection(block, UI_RIGHT);
928         /*uiTextBoundsBlock(block, 100);*/
929         return block;
930 }
931
932 void do_view3d_select_object_linkedmenu(bContext *C, void *arg, int event)
933 {
934         switch(event) {
935         case 1: /* Object Ipo */
936         case 2: /* ObData */
937         case 3: /* Current Material */
938         case 4: /* Current Texture */
939                 selectlinks(event);
940                 break;
941         }
942         countall();
943 }
944
945 static uiBlock *view3d_select_object_linkedmenu(bContext *C, ARegion *ar, void *arg_unused)
946 {
947         uiBlock *block;
948         short yco = 20, menuwidth = 120;
949
950         block= uiBeginBlock(C, ar, "view3d_select_object_linkedmenu", UI_EMBOSSP);
951         uiBlockSetButmFunc(block, do_view3d_select_object_linkedmenu, NULL);
952
953         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Ipo|Shift L, 1",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
954         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "ObData|Shift L, 2",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
955         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Material|Shift L, 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
956         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Texture|Shift L, 4",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
957         
958         uiBlockSetDirection(block, UI_RIGHT);
959         uiTextBoundsBlock(block, 60);
960         return block;
961 }
962
963 void do_view3d_select_object_groupedmenu(bContext *C, void *arg, int event)
964 {
965
966         switch(event) {
967         case 1: /* Children */
968         case 2: /* Immediate Children */
969         case 3: /* Parent */
970         case 4: /* Siblings */
971         case 5: /* Type */
972         case 6: /* Objects on Shared Layers */
973         case 7: /* Objects in Same Group */
974         case 8: /* Object Hooks*/
975         case 9: /* Object PassIndex*/
976         case 10: /* Object Color*/
977         case 11: /* Game Properties*/
978                 select_object_grouped((short)event);
979                 break;
980         }
981 }
982
983 static uiBlock *view3d_select_object_groupedmenu(bContext *C, ARegion *ar, void *arg_unused)
984 {
985         uiBlock *block;
986         short yco = 20, menuwidth = 120;
987
988         block= uiBeginBlock(C, ar, "view3d_select_object_groupedmenu", UI_EMBOSSP);
989         uiBlockSetButmFunc(block, do_view3d_select_object_groupedmenu, NULL);
990
991         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Children|Shift G, 1",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
992         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Immediate Children|Shift G, 2",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
993         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Parent|Shift G, 3",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
994         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Siblings (Shared Parent)|Shift G, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
995         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Objects of Same Type|Shift G, 5",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
996         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Objects on Shared Layers|Shift G, 6",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
997         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Objects in Same Group|Shift G, 7",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
998         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Hooks|Shift G, 8",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
999         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object PassIndex|Shift G, 9",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
1000         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Color|Shift G, 0",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");  
1001         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Game Properties|Shift G, Alt+1",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");  
1002
1003         uiBlockSetDirection(block, UI_RIGHT);
1004         uiTextBoundsBlock(block, 60);
1005         return block;
1006 }
1007
1008 #endif
1009
1010 static void view3d_select_objectmenu(bContext *C, uiLayout *layout, void *arg_unused)
1011 {
1012         uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border");
1013
1014         uiItemS(layout);
1015
1016         uiItemO(layout, "Select/Deselect All", 0, "OBJECT_OT_select_all_toggle");
1017         uiItemO(layout, "Inverse", 0, "OBJECT_OT_select_invert");
1018         uiItemO(layout, "Random", 0, "OBJECT_OT_select_random");
1019         uiItemO(layout, "Select All by Layer", 0, "OBJECT_OT_select_by_layer");
1020         uiItemMenuEnumO(layout, "Select All by Type", 0, "OBJECT_OT_select_by_type", "type");
1021
1022 #if 0
1023         uiDefIconTextBlockBut(block, view3d_select_object_layermenu, NULL, ICON_RIGHTARROW_THIN, "Select All by Layer", 0, yco-=20, 120, 19, "");
1024         uiDefIconTextBlockBut(block, view3d_select_object_typemenu, NULL, ICON_RIGHTARROW_THIN, "Select All by Type", 0, yco-=20, 120, 19, "");
1025
1026         uiItemS(layout);
1027
1028         uiDefIconTextBlockBut(block, view3d_select_object_linkedmenu, NULL, ICON_RIGHTARROW_THIN, "Linked", 0, yco-=20, 120, 19, "");
1029         uiDefIconTextBlockBut(block, view3d_select_object_groupedmenu, NULL, ICON_RIGHTARROW_THIN, "Grouped", 0, yco-=20, 120, 19, "");
1030 #endif
1031 }
1032
1033 static void view3d_select_meshmenu(bContext *C, uiLayout *layout, void *arg_unused)
1034 {
1035         uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border");
1036
1037         uiItemS(layout);
1038
1039         uiItemO(layout, "Select/Deselect All", 0, "MESH_OT_select_all_toggle");
1040         uiItemO(layout, "Inverse", 0, "MESH_OT_select_invert");
1041
1042         uiItemS(layout);
1043
1044         uiItemO(layout, "Random...", 0, "MESH_OT_select_random"); // Random...
1045         uiItemO(layout, "Sharp Edges", 0, "MESH_OT_edges_select_sharp");
1046         uiItemO(layout, "Linked Flat Faces", 0, "MESH_OT_faces_select_linked_flat");
1047
1048         uiItemS(layout);
1049
1050         uiItemEnumO(layout, "Triangles", 0, "MESH_OT_select_by_number_vertices", "type", 3); // Ctrl Alt Shift 3
1051         uiItemEnumO(layout, "Quads", 0, "MESH_OT_select_by_number_vertices", "type", 4); // Ctrl Alt Shift 4
1052         uiItemEnumO(layout, "Loose Verts/Edges", 0, "MESH_OT_select_by_number_vertices", "type", 5); // Ctrl Alt Shift 5
1053         uiItemO(layout, "Similar...", 0, "MESH_OT_select_similar");
1054
1055         uiItemS(layout);
1056
1057         uiItemO(layout, "Less", 0, "MESH_OT_select_more");
1058         uiItemO(layout, "More", 0, "MESH_OT_select_less");
1059
1060         uiItemS(layout);
1061
1062         uiItemO(layout, "Linked", 0, "MESH_OT_select_linked");
1063         uiItemO(layout, "Vertex Path", 0, "MESH_OT_select_vertex_path"); // W, Alt 7
1064         // XXX uiItemO(layout, "Edge Loop", 0, "MESH_OT_select_edge_loop"); // loop_multiselect(0)
1065         // XXX uiItemO(layout, "Edge Ring", 0, "MESH_OT_select_edge_ring"); // loop_multiselect(1)
1066
1067         uiItemS(layout);
1068
1069         uiItemO(layout, NULL, 0, "MESH_OT_loop_to_region"); // Ctrl E 8
1070         uiItemO(layout, NULL, 0, "MESH_OT_region_to_loop"); // Ctrl E 9
1071 }
1072
1073 static void view3d_select_curvemenu(bContext *C, uiLayout *layout, void *arg_unused)
1074 {
1075         Object *obedit= CTX_data_edit_object(C);
1076
1077         uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border");
1078         uiItemO(layout, NULL, 0, "VIEW3D_OT_select_circle");
1079
1080         uiItemS(layout);
1081
1082         uiItemO(layout, NULL, 0, "CURVE_OT_select_all_toggle");
1083         uiItemO(layout, NULL, 0, "CURVE_OT_select_invert");
1084         uiItemO(layout, NULL, 0, "CURVE_OT_select_random"); // Random...
1085         uiItemO(layout, NULL, 0, "CURVE_OT_select_every_nth"); // Every Nth..
1086
1087         uiItemS(layout);
1088
1089         if(obedit->type == OB_SURF) {
1090                 uiItemO(layout, NULL, 0, "CURVE_OT_select_row");
1091         }
1092         else {
1093                 uiItemO(layout, NULL, 0, "CURVE_OT_de_select_first");
1094                 uiItemO(layout, NULL, 0, "CURVE_OT_de_select_last");
1095                 uiItemO(layout, NULL, 0, "CURVE_OT_select_next");
1096                 uiItemO(layout, NULL, 0, "CURVE_OT_select_previous");
1097         }
1098
1099         uiItemS(layout);
1100
1101         uiItemO(layout, NULL, 0, "CURVE_OT_select_more");
1102         uiItemO(layout, NULL, 0, "CURVE_OT_select_less");
1103
1104         /* commented out because it seems to only like the LKEY method - based on mouse pointer position :( */
1105         /* uiItemO(layout, NULL, 0, "CURVE_OT_select_linked"); */
1106
1107 #if 0
1108         G.qual |= LR_CTRLKEY;
1109         select_connected_nurb();
1110         G.qual &= ~LR_CTRLKEY;
1111         break;*/
1112 #endif
1113 }
1114
1115 void do_view3d_select_metaballmenu(bContext *C, void *arg, int event)
1116 {
1117 #if 0
1118
1119         switch(event) {
1120                 case 0: /* border select */
1121                         borderselect();
1122                         break;
1123                 case 2: /* Select/Deselect all */
1124                         deselectall_mball();
1125                         break;
1126                 case 3: /* Inverse */
1127                         selectinverse_mball();
1128                         break;
1129                 case 4: /* Select Random */
1130                         selectrandom_mball();
1131                         break;
1132         }
1133 #endif
1134 }
1135
1136
1137 static uiBlock *view3d_select_metaballmenu(bContext *C, ARegion *ar, void *arg_unused)
1138 {
1139         uiBlock *block;
1140         short yco= 0, menuwidth=120;
1141         
1142         block= uiBeginBlock(C, ar, "view3d_select_metaballmenu", UI_EMBOSSP);
1143         uiBlockSetButmFunc(block, do_view3d_select_metaballmenu, NULL);
1144         
1145         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1146         
1147         uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1148         
1149         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1150
1151         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1152                 
1153         uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1154
1155         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Random...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1156
1157         if(ar->alignment==RGN_ALIGN_TOP) {
1158                 uiBlockSetDirection(block, UI_DOWN);
1159         }
1160         else {
1161                 uiBlockSetDirection(block, UI_TOP);
1162                 uiBlockFlipOrder(block);
1163         }
1164
1165         uiTextBoundsBlock(block, 50);
1166         return block;
1167 }
1168
1169 static void view3d_select_latticemenu(bContext *C, uiLayout *layout, void *arg_unused)
1170 {
1171         uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border");
1172         uiItemS(layout);
1173         uiItemO(layout, NULL, 0, "LATTICE_OT_select_all_toggle");
1174 }
1175
1176 static void view3d_select_armaturemenu(bContext *C, uiLayout *layout, void *arg_unused)
1177 {
1178         PointerRNA ptr;
1179
1180         uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border");
1181
1182         uiItemS(layout);
1183
1184         uiItemO(layout, "Select/Deselect All", 0, "ARMATURE_OT_select_all_toggle");
1185         uiItemO(layout, "Inverse", 0, "ARMATURE_OT_select_invert");
1186
1187         uiItemS(layout);
1188
1189         uiItemEnumO(layout, "Parent", 0, "ARMATURE_OT_select_hierarchy", "direction", BONE_SELECT_PARENT);
1190         uiItemEnumO(layout, "Child", 0, "ARMATURE_OT_select_hierarchy", "direction", BONE_SELECT_CHILD);
1191
1192         uiItemS(layout);
1193
1194         WM_operator_properties_create(&ptr, "ARMATURE_OT_select_hierarchy");
1195         RNA_boolean_set(&ptr, "extend", 1);
1196         RNA_enum_set(&ptr, "direction", BONE_SELECT_PARENT);
1197         uiItemFullO(layout, "Extend Parent", 0, "ARMATURE_OT_select_hierarchy", ptr.data, WM_OP_EXEC_REGION_WIN);
1198
1199         WM_operator_properties_create(&ptr, "ARMATURE_OT_select_hierarchy");
1200         RNA_boolean_set(&ptr, "extend", 1);
1201         RNA_enum_set(&ptr, "direction", BONE_SELECT_CHILD);
1202         uiItemFullO(layout, "Extend Child", 0, "ARMATURE_OT_select_hierarchy", ptr.data, WM_OP_EXEC_REGION_WIN);
1203 }
1204
1205 static void view3d_select_posemenu(bContext *C, uiLayout *layout, void *arg_unused)
1206 {
1207         PointerRNA ptr;
1208
1209         uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border");
1210
1211         uiItemS(layout);
1212
1213         uiItemO(layout, "Select/Deselect All", 0, "POSE_OT_select_all_toggle");
1214         uiItemO(layout, "Inverse", 0, "POSE_OT_select_invert");
1215         uiItemO(layout, "Constraint Target", 0, "POSE_OT_select_constraint_target");
1216
1217         uiItemS(layout);
1218
1219         uiItemEnumO(layout, "Parent", 0, "POSE_OT_select_hierarchy", "direction", BONE_SELECT_PARENT);
1220         uiItemEnumO(layout, "Child", 0, "POSE_OT_select_hierarchy", "direction", BONE_SELECT_CHILD);
1221
1222         uiItemS(layout);
1223
1224         WM_operator_properties_create(&ptr, "POSE_OT_select_hierarchy");
1225         RNA_boolean_set(&ptr, "extend", 1);
1226         RNA_enum_set(&ptr, "direction", BONE_SELECT_PARENT);
1227         uiItemFullO(layout, "Extend Parent", 0, "POSE_OT_select_hierarchy", ptr.data, WM_OP_EXEC_REGION_WIN);
1228
1229         WM_operator_properties_create(&ptr, "POSE_OT_select_hierarchy");
1230         RNA_boolean_set(&ptr, "extend", 1);
1231         RNA_enum_set(&ptr, "direction", BONE_SELECT_CHILD);
1232         uiItemFullO(layout, "Extend Child", 0, "POSE_OT_select_hierarchy", ptr.data, WM_OP_EXEC_REGION_WIN);
1233 }
1234
1235 void do_view3d_select_faceselmenu(bContext *C, void *arg, int event)
1236 {
1237 #if 0
1238         /* events >= 6 are registered bpython scripts */
1239 #ifndef DISABLE_PYTHON
1240         if (event >= 6) BPY_menu_do_python(PYMENU_FACESELECT, event - 6);
1241 #endif
1242         
1243         switch(event) {
1244                 case 0: /* border select */
1245                         borderselect();
1246                         break;
1247                 case 2: /* Select/Deselect all */
1248                         deselectall_tface();
1249                         break;
1250                 case 3: /* Select Inverse */
1251                         selectswap_tface();
1252                         break;
1253                 case 4: /* Select Linked */
1254                         select_linked_tfaces(2);
1255                         break;
1256         }
1257 #endif
1258 }
1259
1260 static uiBlock *view3d_select_faceselmenu(bContext *C, ARegion *ar, void *arg_unused)
1261 {
1262         uiBlock *block;
1263         short yco= 0, menuwidth=120;
1264 #ifndef DISABLE_PYTHON
1265 // XXX  BPyMenu *pym;
1266 //      int i = 0;
1267 #endif
1268
1269         block= uiBeginBlock(C, ar, "view3d_select_faceselmenu", UI_EMBOSSP);
1270         uiBlockSetButmFunc(block, do_view3d_select_faceselmenu, NULL);
1271         
1272         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1273         
1274         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1275         
1276         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1277         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1278
1279         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1280         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Linked Faces|Ctrl L",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1281
1282 #ifndef DISABLE_PYTHON
1283 //      uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1284
1285         /* note that we account for the 6 previous entries with i+6: */
1286 //      for (pym = BPyMenuTable[PYMENU_FACESELECT]; pym; pym = pym->next, i++) {
1287 //              uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20,
1288 //                      menuwidth, 19, NULL, 0.0, 0.0, 1, i+6,
1289 //                      pym->tooltip?pym->tooltip:pym->filename);
1290 //      }
1291 #endif
1292         
1293         if(ar->alignment==RGN_ALIGN_TOP) {
1294                 uiBlockSetDirection(block, UI_DOWN);
1295         }
1296         else {
1297                 uiBlockSetDirection(block, UI_TOP);
1298                 uiBlockFlipOrder(block);
1299         }
1300
1301         uiTextBoundsBlock(block, 50);
1302         return block;
1303 }
1304
1305 void do_view3d_edit_snapmenu(bContext *C, void *arg, int event)
1306 {
1307 #if 0
1308         switch (event) {
1309         case 1: /*Selection to grid*/
1310             snap_sel_to_grid();
1311                 ED_undo_push(C, "Snap selection to grid");
1312             break;
1313         case 2: /*Selection to cursor*/
1314             snap_sel_to_curs();
1315                 ED_undo_push(C, "Snap selection to cursor");
1316             break;
1317         case 3: /*Selection to center of selection*/
1318             snap_to_center();
1319                 ED_undo_push(C, "Snap selection to center");
1320             break;
1321         case 4: /*Cursor to selection*/
1322             snap_curs_to_sel();
1323             break;
1324         case 5: /*Cursor to grid*/
1325             snap_curs_to_grid();
1326             break;
1327         case 6: /*Cursor to Active*/
1328             snap_curs_to_active();
1329                 ED_undo_push(C, "Snap selection to center");
1330             break;
1331         }
1332 #endif
1333 }
1334
1335 static uiBlock *view3d_edit_snapmenu(bContext *C, ARegion *ar, void *arg_unused)
1336 {
1337         uiBlock *block;
1338         short yco = 20, menuwidth = 120;
1339
1340         block= uiBeginBlock(C, ar, "view3d_edit_snapmenu", UI_EMBOSSP);
1341         uiBlockSetButmFunc(block, do_view3d_edit_snapmenu, NULL);
1342         
1343         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selection -> Grid|Shift S, 1",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1344         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selection -> Cursor|Shift S, 2",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1345         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selection -> Center|Shift S, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1346         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1347         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cursor -> Selection|Shift S, 4",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1348         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cursor -> Grid|Shift S, 5",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1349         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cursor -> Active|Shift S, 6",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1350         
1351         
1352         
1353         uiBlockSetDirection(block, UI_RIGHT);
1354         uiTextBoundsBlock(block, 60);
1355         return block;
1356 }
1357
1358 void do_view3d_transform_moveaxismenu(bContext *C, void *arg, int event)
1359 {
1360 #if 0
1361         float mat[3][3];
1362         
1363         Mat3One(mat);
1364         
1365         switch(event)
1366         {
1367             case 0: /* X Global */
1368                         initTransform(TFM_TRANSLATION, CTX_NONE);
1369                         BIF_setSingleAxisConstraint(mat[0], " X");
1370                         Transform();
1371                         break;
1372                 case 1: /* Y Global */
1373                         initTransform(TFM_TRANSLATION, CTX_NONE);
1374                         BIF_setSingleAxisConstraint(mat[1], " Y");
1375                         Transform();
1376                         break;
1377                 case 2: /* Z Global */
1378                         initTransform(TFM_TRANSLATION, CTX_NONE);
1379                         BIF_setSingleAxisConstraint(mat[2], " Z");
1380                         Transform();
1381                         break;
1382                 case 3: /* X Local */
1383                         initTransform(TFM_TRANSLATION, CTX_NONE);
1384                         BIF_setLocalAxisConstraint('X', " X");
1385                         Transform();
1386                         break;
1387                 case 4: /* Y Local */
1388                         initTransform(TFM_TRANSLATION, CTX_NONE);
1389                         BIF_setLocalAxisConstraint('Y', " Y");
1390                         Transform();
1391                         break;
1392                 case 5: /* Z Local */
1393                         initTransform(TFM_TRANSLATION, CTX_NONE);
1394                         BIF_setLocalAxisConstraint('Z', " Z");
1395                         Transform();
1396                         break;
1397         }
1398 #endif
1399 }
1400
1401 static uiBlock *view3d_transform_moveaxismenu(bContext *C, ARegion *ar, void *arg_unused)
1402 {
1403         uiBlock *block;
1404         short yco = 20, menuwidth = 120;
1405
1406         block= uiBeginBlock(C, ar, "view3d_transform_moveaxismenu", UI_EMBOSSP);
1407         uiBlockSetButmFunc(block, do_view3d_transform_moveaxismenu, NULL);
1408
1409         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|G, X",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1410         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|G, Y",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1411         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|G, Z",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1412         
1413         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1414         
1415         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|G, X, X",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1416         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|G, Y, Y",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1417         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|G, Z, Z",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1418         
1419         
1420         uiBlockSetDirection(block, UI_RIGHT);
1421         uiTextBoundsBlock(block, 60);
1422         return block;
1423 }
1424
1425 void do_view3d_transform_rotateaxismenu(bContext *C, void *arg, int event)
1426 {
1427 #if 0
1428         float mat[3][3];
1429         
1430         Mat3One(mat);
1431         
1432         switch(event)
1433         {
1434             case 0: /* X Global */
1435                         initTransform(TFM_ROTATION, CTX_NONE);
1436                         BIF_setSingleAxisConstraint(mat[0], " X");
1437                         Transform();
1438                         break;
1439                 case 1: /* Y Global */
1440                         initTransform(TFM_ROTATION, CTX_NONE);
1441                         BIF_setSingleAxisConstraint(mat[1], " Y");
1442                         Transform();
1443                         break;
1444                 case 2: /* Z Global */
1445                         initTransform(TFM_ROTATION, CTX_NONE);
1446                         BIF_setSingleAxisConstraint(mat[2], " Z");
1447                         Transform();
1448                         break;
1449                 case 3: /* X Local */
1450                         initTransform(TFM_ROTATION, CTX_NONE);
1451                         BIF_setLocalAxisConstraint('X', " X");
1452                         Transform();
1453                         break;
1454                 case 4: /* Y Local */
1455                         initTransform(TFM_ROTATION, CTX_NONE);
1456                         BIF_setLocalAxisConstraint('Y', " Y");
1457                         Transform();
1458                         break;
1459                 case 5: /* Z Local */
1460                         initTransform(TFM_ROTATION, CTX_NONE);
1461                         BIF_setLocalAxisConstraint('Z', " Z");
1462                         Transform();
1463                         break;
1464         }
1465 #endif
1466 }
1467
1468 static uiBlock *view3d_transform_rotateaxismenu(bContext *C, ARegion *ar, void *arg_unused)
1469 {
1470         uiBlock *block;
1471         short yco = 20, menuwidth = 120;
1472
1473         block= uiBeginBlock(C, ar, "view3d_transform_rotateaxismenu", UI_EMBOSSP);
1474         uiBlockSetButmFunc(block, do_view3d_transform_rotateaxismenu, NULL);
1475
1476         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|R, X",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1477         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|R, Y",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1478         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|R, Z",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1479         
1480         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1481         
1482         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|R, X, X",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1483         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|R, Y, Y",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1484         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|R, Z, Z",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1485         
1486         
1487         uiBlockSetDirection(block, UI_RIGHT);
1488         uiTextBoundsBlock(block, 60);
1489         return block;
1490 }
1491
1492 void do_view3d_transform_scaleaxismenu(bContext *C, void *arg, int event)
1493 {
1494 #if 0
1495         float mat[3][3];
1496         
1497         Mat3One(mat);
1498         
1499         switch(event)
1500         {
1501             case 0: /* X Global */
1502                         initTransform(TFM_RESIZE, CTX_NONE);
1503                         BIF_setSingleAxisConstraint(mat[0], " X");
1504                         Transform();
1505                         break;
1506                 case 1: /* Y Global */
1507                         initTransform(TFM_RESIZE, CTX_NONE);
1508                         BIF_setSingleAxisConstraint(mat[1], " Y");
1509                         Transform();
1510                         break;
1511                 case 2: /* Z Global */
1512                         initTransform(TFM_RESIZE, CTX_NONE);
1513                         BIF_setSingleAxisConstraint(mat[2], " Z");
1514                         Transform();
1515                         break;
1516                 case 3: /* X Local */
1517                         initTransform(TFM_RESIZE, CTX_NONE);
1518                         BIF_setLocalAxisConstraint('X', " X");
1519                         Transform();
1520                         break;
1521                 case 4: /* Y Local */
1522                         initTransform(TFM_RESIZE, CTX_NONE);
1523                         BIF_setLocalAxisConstraint('X', " X");
1524                         Transform();
1525                         break;
1526                 case 5: /* Z Local */
1527                         initTransform(TFM_RESIZE, CTX_NONE);
1528                         BIF_setLocalAxisConstraint('X', " X");
1529                         Transform();
1530                         break;
1531         }
1532 #endif
1533 }
1534
1535 static uiBlock *view3d_transform_scaleaxismenu(bContext *C, ARegion *ar, void *arg_unused)
1536 {
1537         uiBlock *block;
1538         short yco = 20, menuwidth = 120;
1539
1540         block= uiBeginBlock(C, ar, "view3d_transform_scaleaxismenu", UI_EMBOSSP);
1541         uiBlockSetButmFunc(block, do_view3d_transform_scaleaxismenu, NULL);
1542
1543         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|S, X",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1544         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|S, Y",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1545         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|S, Z",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1546         
1547         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1548         
1549         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|S, X, X",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1550         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|S, Y, Y",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1551         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|S, Z, Z",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1552         
1553         
1554         uiBlockSetDirection(block, UI_RIGHT);
1555         uiTextBoundsBlock(block, 60);
1556         return block;
1557 }
1558
1559 static void do_view3d_transformmenu(bContext *C, void *arg, int event)
1560 {
1561 #if 0
1562         Scene *scene= CTX_data_scene(C);
1563         ToolSettings *ts= CTX_data_tool_settings(C);
1564         
1565         switch(event) {
1566         case 1:
1567                 initTransform(TFM_TRANSLATION, CTX_NONE);
1568                 Transform();
1569                 break;
1570         case 2:
1571                 initTransform(TFM_ROTATION, CTX_NONE);
1572                 Transform();
1573                 break;
1574         case 3:
1575                 initTransform(TFM_RESIZE, CTX_NONE);
1576                 Transform();
1577                 break;
1578         case 4:
1579                 image_aspect();
1580                 break;
1581         case 5:
1582                 initTransform(TFM_TOSPHERE, CTX_NONE);
1583                 Transform();
1584                 break;
1585         case 6:
1586                 initTransform(TFM_SHEAR, CTX_NONE);
1587                 Transform();
1588                 break;
1589         case 7:
1590                 initTransform(TFM_WARP, CTX_NONE);
1591                 Transform();
1592                 break;
1593         case 8:
1594                 initTransform(TFM_PUSHPULL, CTX_NONE);
1595                 Transform();
1596                 break;
1597         case 9:
1598                 if (obedit) {
1599                         if (obedit->type == OB_MESH)
1600                                 initTransform(TFM_SHRINKFATTEN, CTX_NONE);
1601                                 Transform();
1602                 } else error("Only meshes can be shrinked/fattened");
1603                 break;
1604         case 10:
1605                 docenter(0);
1606                 break;
1607         case 11:
1608                 docenter_new();
1609                 break;
1610         case 12:
1611                 docenter_cursor();
1612                 break;
1613         case 13:
1614                 initTransform(TFM_TILT, CTX_NONE);
1615                 Transform();
1616                 break;
1617         case 14:
1618                 initTransform(TFM_CURVE_SHRINKFATTEN, CTX_NONE);
1619                 Transform();
1620                 break;
1621         case 15:
1622                 ts->snap_flag &= ~SCE_SNAP;
1623                 break;
1624         case 16:
1625                 ts->snap_flag |= SCE_SNAP;
1626                 break;
1627         case 17:
1628                 ts->snap_target = SCE_SNAP_TARGET_CLOSEST;
1629                 break;
1630         case 18:
1631                 ts->snap_target = SCE_SNAP_TARGET_CENTER;
1632                 break;
1633         case 19:
1634                 ts->snap_target = SCE_SNAP_TARGET_MEDIAN;
1635                 break;
1636         case 20:
1637                 ts->snap_target = SCE_SNAP_TARGET_ACTIVE;
1638                 break;
1639         case 21:
1640                 alignmenu();
1641                 break;
1642         }
1643 #endif
1644 }
1645
1646 static uiBlock *view3d_transformmenu(bContext *C, ARegion *ar, void *arg_unused)
1647 {
1648         ToolSettings *ts= CTX_data_tool_settings(C);
1649         Object *obedit = CTX_data_edit_object(C);
1650         uiBlock *block;
1651         short yco = 20, menuwidth = 120;
1652
1653         block= uiBeginBlock(C, ar, "view3d_transformmenu", UI_EMBOSSP);
1654         uiBlockSetButmFunc(block, do_view3d_transformmenu, NULL);
1655
1656         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move|G",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1657         uiDefIconTextBlockBut(block, view3d_transform_moveaxismenu, NULL, ICON_RIGHTARROW_THIN, "Grab/Move on Axis", 0, yco-=20, 120, 19, "");
1658                 
1659         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate|R",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1660         uiDefIconTextBlockBut(block, view3d_transform_rotateaxismenu, NULL, ICON_RIGHTARROW_THIN, "Rotate on Axis", 0, yco-=20, 120, 19, "");
1661
1662         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale|S",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1663         uiDefIconTextBlockBut(block, view3d_transform_scaleaxismenu, NULL, ICON_RIGHTARROW_THIN, "Scale on Axis", 0, yco-=20, 120, 19, "");
1664
1665         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1666         
1667         if (obedit) {
1668                 if (obedit->type == OB_MESH)
1669                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shrink/Fatten Along Normals|Alt S",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
1670                 else if (obedit->type == OB_CURVE) {
1671                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Tilt|T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
1672                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shrink/Fatten Radius|Alt S",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
1673                 }
1674         }
1675         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "To Sphere|Ctrl Shift S",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1676         if (obedit) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl S",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1677         else uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl Shift Alt S",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1678         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Warp|Shift W",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1679         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Push/Pull|Shift P",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
1680         
1681         if (!obedit) {
1682                 uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1683                 
1684                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale to Image Aspect Ratio|Alt V",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1685         }
1686         
1687         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1688
1689         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "ObData to Center",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
1690         if (!obedit) {
1691                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center New",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
1692                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center Cursor",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
1693                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align to Transform Orientation|Ctrl Alt A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 21, "");
1694         }
1695         
1696         if (BIF_snappingSupported(obedit))
1697         {
1698                 uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1699         
1700                 if (ts->snap_flag & SCE_SNAP)
1701                 {
1702                         uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Grid",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
1703                         uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
1704                 }
1705                 else
1706                 {
1707                         uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Grid",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
1708                         uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
1709                 }
1710                         
1711                 uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1712
1713                 switch(ts->snap_target)
1714                 {
1715                         case SCE_SNAP_TARGET_CLOSEST:
1716                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Closest",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
1717                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Center",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
1718                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Median",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1719                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Active",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
1720                                 break;
1721                         case SCE_SNAP_TARGET_CENTER:
1722                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Closest",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
1723                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Center",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
1724                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Median",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1725                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Active",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
1726                                 break;
1727                         case SCE_SNAP_TARGET_MEDIAN:
1728                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Closest",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
1729                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Center",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
1730                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Median",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1731                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Active",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
1732                                 break;
1733                         case SCE_SNAP_TARGET_ACTIVE:
1734                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Closest",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
1735                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Center",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
1736                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Median",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1737                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Active",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
1738                                 break;
1739                 }
1740         }
1741
1742         uiBlockSetDirection(block, UI_RIGHT);
1743         uiTextBoundsBlock(block, 60);
1744         return block;
1745 }
1746
1747 void do_view3d_object_mirrormenu(bContext *C, void *arg, int event)
1748 {
1749 #if 0
1750         switch(event) {
1751                 case 0:
1752                         initTransform(TFM_MIRROR, CTX_NO_PET);
1753                         Transform();
1754                         break;
1755                 case 1:
1756                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
1757                         BIF_setLocalAxisConstraint('X', " on X axis");
1758                         Transform();
1759                         break;
1760                 case 2:
1761                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
1762                         BIF_setLocalAxisConstraint('Y', " on Y axis");
1763                         Transform();
1764                         break;
1765                 case 3:
1766                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
1767                         BIF_setLocalAxisConstraint('Z', " on Z axis");
1768                         Transform();
1769                         break;
1770         }
1771 #endif
1772 }
1773
1774 static uiBlock *view3d_object_mirrormenu(bContext *C, ARegion *ar, void *arg_unused)
1775 {
1776         uiBlock *block;
1777         short yco = 20, menuwidth = 120;
1778
1779         block= uiBeginBlock(C, ar, "view3d_object_mirrormenu", UI_EMBOSSP);
1780         uiBlockSetButmFunc(block, do_view3d_object_mirrormenu, NULL);
1781         
1782         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Interactive Mirror|Ctrl M",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1783         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1784         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|Ctrl M, X",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1785         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, Y",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1786         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, Z",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1787
1788         uiBlockSetDirection(block, UI_RIGHT);
1789         uiTextBoundsBlock(block, 60);
1790         return block;
1791 }
1792
1793 static void do_view3d_edit_object_transformmenu(bContext *C, void *arg, int event)
1794 {
1795 #if 0
1796         switch(event) {
1797         case 0: /*      clear origin */
1798                 clear_object('o');
1799                 break;
1800         case 1: /* clear scale */
1801                 clear_object('s');
1802                 break;
1803         case 2: /* clear rotation */
1804                 clear_object('r');
1805                 break;
1806         case 3: /* clear location */
1807                 clear_object('g');
1808                 break;
1809         case 4:
1810                 if(OBACT) object_apply_deform(OBACT);
1811                 break;
1812         case 5: /* make duplis real */
1813                 make_duplilist_real();
1814                 break;
1815         case 6: /* apply scale/rotation or deformation */
1816                 apply_objects_locrot();
1817                 break;  
1818         case 7: /* apply visual matrix to objects loc/size/rot */
1819                 apply_objects_visual_tx();
1820                 break;  
1821         }
1822 #endif
1823 }
1824
1825 static uiBlock *view3d_edit_object_transformmenu(bContext *C, ARegion *ar, void *arg_unused)
1826 {
1827         uiBlock *block;
1828         short yco = 20, menuwidth = 120;
1829
1830         block= uiBeginBlock(C, ar, "view3d_edit_object_transformmenu", UI_EMBOSSP);
1831         uiBlockSetButmFunc(block, do_view3d_edit_object_transformmenu, NULL);
1832         
1833         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Scale/Rotation to ObData|Ctrl A, 1",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1834         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Visual Transform|Ctrl A, 2",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1835         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Deformation|Ctrl Shift A",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1836         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Duplicates Real|Ctrl Shift A",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1837         
1838         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1839         
1840         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Location|Alt G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1841         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Rotation|Alt R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1842         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Scale|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1843         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Origin|Alt O",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1844         
1845         uiBlockSetDirection(block, UI_RIGHT);
1846         uiTextBoundsBlock(block, 60);
1847         return block;
1848 }
1849
1850 static void do_view3d_edit_object_makelocalmenu(bContext *C, void *arg, int event)
1851 {
1852 #if 0
1853         switch(event) {
1854                 case 1:
1855                 case 2:
1856                 case 3:
1857                         make_local(event);
1858                         break;
1859         }
1860 #endif
1861 }
1862
1863 static uiBlock *view3d_edit_object_makelocalmenu(bContext *C, ARegion *ar, void *arg_unused)
1864 {       
1865         uiBlock *block;
1866         short yco = 20, menuwidth = 120;
1867         
1868         block= uiBeginBlock(C, ar, "view3d_edit_object_makelocalmenu", UI_EMBOSSP);
1869         uiBlockSetButmFunc(block, do_view3d_edit_object_makelocalmenu, NULL);
1870         
1871         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selected Objects|L, 1",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1872         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selected Objects and Data|L, 2",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1873         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "All|L, 3",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1874         
1875         uiBlockSetDirection(block, UI_RIGHT);
1876         uiTextBoundsBlock(block, 60);
1877         return block;
1878 }
1879
1880 static void do_view3d_edit_object_makelinksmenu(bContext *C, void *arg, int event)
1881 {
1882 #if 0
1883         switch(event) {
1884         case 1:
1885         case 2:
1886         case 3:
1887         case 4:
1888                 make_links((short)event);
1889                 break;
1890                 }
1891 #endif
1892 }
1893
1894 static uiBlock *view3d_edit_object_makelinksmenu(bContext *C, ARegion *ar, void *arg_unused)
1895 {
1896         Scene *scene= CTX_data_scene(C);
1897         Object *ob=NULL;
1898         
1899         uiBlock *block;
1900         short yco = 20, menuwidth = 120;
1901
1902         block= uiBeginBlock(C, ar, "view3d_edit_object_makelinksmenu", UI_EMBOSSP);
1903         uiBlockSetButmFunc(block, do_view3d_edit_object_makelinksmenu, NULL);
1904         
1905         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "To Scene...|Ctrl L, 1",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1906         
1907         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1908         
1909         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Ipo|Ctrl L, 2",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1910         
1911         if ((ob=OBACT)) {
1912         
1913                 if(ob->type==OB_MESH) {
1914                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mesh Data|Ctrl L, 3",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1915                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1916                 } else if(ob->type==OB_CURVE) {
1917                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve Data|Ctrl L, 3",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1918                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1919                 } else if(ob->type==OB_FONT) {
1920                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Text Data|Ctrl L, 3",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1921                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1922                 } else if(ob->type==OB_SURF) {
1923                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Surface Data|Ctrl L, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1924                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1925                 } else if(ob->type==OB_MBALL) {
1926                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1927                 } else if(ob->type==OB_CAMERA) {
1928                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera Data|Ctrl L, 3",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1929                 } else if(ob->type==OB_LAMP) {
1930                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lamp Data|Ctrl L, 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1931                 } else if(ob->type==OB_LATTICE) {
1932                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lattice Data|Ctrl L, 3",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1933                 } else if(ob->type==OB_ARMATURE) {
1934                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Armature Data|Ctrl L, 3",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1935                 }
1936         }
1937         
1938         uiBlockSetDirection(block, UI_RIGHT);
1939         uiTextBoundsBlock(block, 60);
1940         return block;
1941 }
1942
1943 static void do_view3d_edit_object_singleusermenu(bContext *C, void *arg, int event)
1944 {
1945 #if 0
1946         switch(event) {
1947         case 1: /* Object */
1948                 single_object_users(1);
1949                 break;
1950         case 2: /* Object & ObData */ 
1951                 single_object_users(1);
1952                 single_obdata_users(1);
1953                 break;
1954         case 3: /* Object & ObData & Materials+Tex */
1955                 single_object_users(1);
1956                 single_obdata_users(1);
1957                 single_mat_users(1); /* also tex */
1958                 break;
1959         case 4: /* Materials+Tex */
1960                 single_mat_users(1);
1961                 break;
1962         case 5: /* Ipo */
1963                 single_ipo_users(1);
1964                 break;
1965         }
1966         
1967         clear_id_newpoins();
1968         countall();
1969         
1970 #endif
1971 }
1972
1973 static uiBlock *view3d_edit_object_singleusermenu(bContext *C, ARegion *ar, void *arg_unused)
1974 {
1975
1976         uiBlock *block;
1977         short yco = 20, menuwidth = 120;
1978
1979         block= uiBeginBlock(C, ar, "view3d_edit_object_singleusermenu", UI_EMBOSSP);
1980         uiBlockSetButmFunc(block, do_view3d_edit_object_singleusermenu, NULL);
1981         
1982         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object|U, 1",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1983         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object & ObData|U, 2",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1984         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object & ObData & Materials+Tex|U, 3",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1985         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials+Tex|U, 4",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1986         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Ipos|U, 5",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1987         
1988         uiBlockSetDirection(block, UI_RIGHT);
1989         uiTextBoundsBlock(block, 60);
1990         return block;
1991 }
1992
1993 static void do_view3d_edit_object_copyattrmenu(bContext *C, void *arg, int event)
1994 {
1995         switch(event) {
1996         case 1:
1997         case 2:
1998         case 3:
1999         case 4:
2000         case 5:
2001         case 6:
2002         case 7:
2003         case 8:
2004         case 9:
2005         case 10:
2006         case 11:
2007         case 17:
2008         case 18:
2009         case 19:
2010         case 20:
2011         case 21:
2012         case 22:
2013         case 23:
2014         case 24:
2015         case 25:
2016         case 26:
2017         case 29:
2018         case 30:
2019 // XXX          copy_attr((short)event);
2020                 break;
2021                 }
2022 }
2023
2024 static uiBlock *view3d_edit_object_copyattrmenu(bContext *C, ARegion *ar, void *arg_unused)
2025 {
2026         Scene *scene= CTX_data_scene(C);
2027         Object *ob=NULL;
2028         
2029         uiBlock *block;
2030         short yco = 20, menuwidth = 120;
2031
2032         block= uiBeginBlock(C, ar, "view3d_edit_object_copyattrmenu", UI_EMBOSSP);
2033         uiBlockSetButmFunc(block, do_view3d_edit_object_copyattrmenu, NULL);
2034         
2035         ob= OBACT;
2036         
2037         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Location|Ctrl C, 1",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2038         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotation|Ctrl C, 2",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2039         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Size|Ctrl C, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2040         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Drawtype|Ctrl C, 4",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2041         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Time Offset|Ctrl C, 5",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2042         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Dupli|Ctrl C, 6",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2043         
2044         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2045         
2046         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mass|Ctrl C, 7",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2047         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Damping|Ctrl C, 8",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
2048         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "All Physical Attributes|Ctrl C, 11",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
2049         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Properties|Ctrl C, 9",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2050         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Logic Bricks|Ctrl C, 10",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
2051         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Protected Transform |Ctrl C",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 29, "");
2052         
2053         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2054         
2055         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Constraints|Ctrl C",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
2056         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NLA Strips|Ctrl C",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 26, "");
2057         
2058         if (ob) {
2059         
2060                 if ((ob->type == OB_MESH) || (ob->type == OB_CURVE) || (ob->type == OB_SURF) ||
2061                                 (ob->type == OB_FONT) || (ob->type == OB_MBALL)) {
2062                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Texture Space|Ctrl C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
2063                 }       
2064                 
2065                 if(ob->type == OB_FONT) {
2066                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Font Settings|Ctrl C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
2067                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel Settings|Ctrl C",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
2068                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve Resolution|Ctrl C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
2069                 }
2070                 if(ob->type == OB_CURVE) {
2071                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel Settings|Ctrl C",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
2072                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve Resolution|Ctrl C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
2073                 }
2074         
2075                 if(ob->type==OB_MESH) {
2076                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subsurf Settings|Ctrl C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 21, "");
2077                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Modifiers ...|Ctrl C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 24, "");
2078                 }
2079                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Pass Index|Ctrl C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 30, "");
2080         }
2081         
2082         uiBlockSetDirection(block, UI_RIGHT);
2083         uiTextBoundsBlock(block, 60);
2084         return block;
2085 }
2086
2087
2088 static void do_view3d_edit_object_parentmenu(bContext *C, void *arg, int event)
2089 {
2090 #if 0
2091         switch(event) {
2092         case 0: /* clear parent */
2093                 clear_parent();
2094                 break;
2095         case 1: /* make parent */
2096                 make_parent();
2097                 break;
2098                 }
2099 #endif
2100 }
2101
2102 static uiBlock *view3d_edit_object_parentmenu(bContext *C, ARegion *ar, void *arg_unused)
2103 {
2104         uiBlock *block;
2105         short yco = 20, menuwidth = 120;
2106
2107         block= uiBeginBlock(C, ar, "view3d_edit_object_parentmenu", UI_EMBOSSP);
2108         uiBlockSetButmFunc(block, do_view3d_edit_object_parentmenu, NULL);
2109         
2110         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Parent...|Ctrl P",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2111         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Parent...|Alt P",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2112
2113         uiBlockSetDirection(block, UI_RIGHT);
2114         uiTextBoundsBlock(block, 60);
2115         return block;
2116 }
2117
2118 static void do_view3d_edit_object_groupmenu(bContext *C, void *arg, int event)
2119 {
2120 #if 0
2121         switch(event) {
2122                 case 1:
2123                 case 2:
2124                 case 3:
2125                         group_operation(event);
2126                         break;
2127         }
2128 #endif
2129 }
2130
2131 static uiBlock *view3d_edit_object_groupmenu(bContext *C, ARegion *ar, void *arg_unused)
2132 {
2133         uiBlock *block;
2134         short yco = 20, menuwidth = 120;
2135         
2136         block= uiBeginBlock(C, ar, "view3d_edit_object_groupmenu", UI_EMBOSSP);
2137         uiBlockSetButmFunc(block, do_view3d_edit_object_groupmenu, NULL);
2138         
2139         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add to Existing Group|Ctrl G, 1",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2140         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add to New Group|Ctrl G, 2",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2141         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remove from All Groups|Ctrl G, 3",       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2142         
2143         uiBlockSetDirection(block, UI_RIGHT);
2144         uiTextBoundsBlock(block, 60);
2145         return block;
2146 }
2147
2148 static void do_view3d_edit_object_trackmenu(bContext *C, void *arg, int event)
2149 {
2150 #if 0
2151         switch(event) {
2152         case 0: /* clear track */
2153                 clear_track();
2154                 break;
2155         case 1: /* make track */
2156                 make_track();
2157                 break;
2158                 }
2159 #endif
2160 }
2161
2162 static uiBlock *view3d_edit_object_trackmenu(bContext *C, ARegion *ar, void *arg_unused)
2163 {
2164         uiBlock *block;
2165         short yco = 20, menuwidth = 120;
2166
2167         block= uiBeginBlock(C, ar, "view3d_edit_object_trackmenu", UI_EMBOSSP);
2168         uiBlockSetButmFunc(block, do_view3d_edit_object_trackmenu, NULL);
2169         
2170         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Track...|Ctrl T",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2171         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Track...|Alt T",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2172         
2173         uiBlockSetDirection(block, UI_RIGHT);
2174         uiTextBoundsBlock(block, 60);
2175         return block;
2176 }
2177
2178 static void do_view3d_edit_object_constraintsmenu(bContext *C, void *arg, int event)
2179 {
2180 #if 0
2181         switch(event) {
2182         case 1: /* add constraint */
2183                 add_constraint(0);
2184                 break;
2185         case 2: /* clear constraint */
2186                 ob_clear_constraints();
2187                 break;
2188                 }
2189 #endif
2190 }
2191
2192 static uiBlock *view3d_edit_object_constraintsmenu(bContext *C, ARegion *ar, void *arg_unused)
2193 {
2194         uiBlock *block;
2195         short yco = 20, menuwidth = 120;
2196
2197         block= uiBeginBlock(C, ar, "view3d_edit_object_constraintsmenu", UI_EMBOSSP);
2198         uiBlockSetButmFunc(block, do_view3d_edit_object_constraintsmenu, NULL);
2199         
2200         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Constraint...|Ctrl Alt C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2201         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Constraints",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2202         
2203         uiBlockSetDirection(block, UI_RIGHT);
2204         uiTextBoundsBlock(block, 60);
2205         return block;
2206 }
2207
2208 static void do_view3d_edit_object_showhidemenu(bContext *C, void *arg, int event)
2209 {
2210 #if 0
2211         
2212         switch(event) {
2213                  
2214         case 0: /* show objects */
2215                 show_objects();
2216                 break;
2217         case 1: /* hide selected objects */
2218                 hide_objects(1);
2219                 break;
2220         case 2: /* hide deselected objects */
2221                 hide_objects(0);
2222                 break;
2223         }
2224 #endif
2225 }
2226
2227 static uiBlock *view3d_edit_object_showhidemenu(bContext *C, ARegion *ar, void *arg_unused)
2228 {
2229         uiBlock *block;
2230         short yco = 20, menuwidth = 120;
2231
2232         block= uiBeginBlock(C, ar, "view3d_edit_object_showhidemenu", UI_EMBOSSP);
2233         uiBlockSetButmFunc(block, do_view3d_edit_object_showhidemenu, NULL);
2234         
2235         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hidden|Alt H",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2236         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Selected|H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2237         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Unselected|Shift H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2238
2239         uiBlockSetDirection(block, UI_RIGHT);
2240         uiTextBoundsBlock(block, 60);
2241         return block;
2242 }
2243
2244 #ifndef DISABLE_PYTHON
2245 static void do_view3d_edit_object_scriptsmenu(bContext *C, void *arg, int event)
2246 {
2247 #if 0
2248         BPY_menu_do_python(PYMENU_OBJECT, event);
2249
2250 #endif
2251 }
2252
2253 static uiBlock *view3d_edit_object_scriptsmenu(bContext *C, ARegion *ar, void *arg_unused)
2254 {
2255         uiBlock *block;
2256 //      short yco = 20, menuwidth = 120;
2257 // XXX  BPyMenu *pym;
2258 //      int i = 0;
2259
2260         block= uiBeginBlock(C, ar, "v3d_eobject_pymenu", UI_EMBOSSP);
2261         uiBlockSetButmFunc(block, do_view3d_edit_object_scriptsmenu, NULL);
2262
2263 //      for (pym = BPyMenuTable[PYMENU_OBJECT]; pym; pym = pym->next, i++) {
2264 //              uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i, pym->tooltip?pym->tooltip:pym->filename);
2265 //      }
2266
2267         uiBlockSetDirection(block, UI_RIGHT);
2268         uiTextBoundsBlock(block, 60);
2269
2270         return block;
2271 }
2272 #endif /* DISABLE_PYTHON */
2273
2274
2275 static void do_view3d_edit_objectmenu(bContext *C, void *arg, int event)
2276 {
2277 #if 0
2278         Scene *scene= CTX_data_scene(C);
2279         ScrArea *sa= CTX_wm_area(C);
2280         View3D *v3d= sa->spacedata.first;
2281         
2282         switch(event) {
2283          
2284         case 0: /* transform    properties*/
2285 // XXX          mainqenter(NKEY, 1);
2286                 break;
2287         case 1: /* delete */
2288                 delete_context_selected();
2289                 break;
2290         case 2: /* duplicate */
2291                 duplicate_context_selected();
2292                 break;
2293         case 3: /* duplicate linked */
2294                 adduplicate(0, 0);
2295                 break;
2296         case 5: /* make single user */
2297                 single_user();
2298                 break;
2299         case 7: /* boolean operation */
2300                 special_editmenu();
2301                 break;
2302         case 8: /* join objects */
2303                 join_menu();
2304                 break;
2305         case 9: /* convert object type */
2306                 convertmenu();
2307                 break;
2308         case 10: /* move to layer */
2309                 movetolayer();
2310                 break;
2311         case 11: /* insert keyframe */
2312                 common_insertkey();
2313                 break;
2314         case 15: /* Object Panel */
2315                 add_blockhandler(sa, VIEW3D_HANDLER_OBJECT, UI_PNL_UNSTOW);
2316                 break;
2317         case 16: /* make proxy object*/
2318                 make_proxy();
2319                 break;
2320         case 18: /* delete keyframe */
2321                 common_deletekey();
2322                 break; 
2323         }
2324 #endif
2325 }
2326
2327 static uiBlock *view3d_edit_objectmenu(bContext *C, ARegion *ar, void *arg_unused)
2328 {
2329         Scene *scene= CTX_data_scene(C);
2330         uiBlock *block;
2331         short yco= 0, menuwidth=120;
2332         
2333         block= uiBeginBlock(C, ar, "view3d_edit_objectmenu", UI_EMBOSSP);
2334         uiBlockSetButmFunc(block, do_view3d_edit_objectmenu, NULL);
2335         
2336         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties|N",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 15, "");
2337         uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
2338         uiDefIconTextBlockBut(block, view3d_object_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
2339
2340         uiDefIconTextBlockBut(block, view3d_edit_object_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Clear/Apply", 0, yco-=20, 120, 19, "");
2341         uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
2342         
2343         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2344         
2345         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");  
2346         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Keyframe|Alt I",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");  
2347         
2348         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2349         
2350         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2351         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate Linked|Alt D",                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2352         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete|X",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2353         
2354         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2355         
2356         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Proxy|Ctrl Alt P",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
2357         uiDefIconTextBlockBut(block, view3d_edit_object_makelinksmenu, NULL, ICON_RIGHTARROW_THIN, "Make Links", 0, yco-=20, 120, 19, "");
2358         uiDefIconTextBlockBut(block, view3d_edit_object_singleusermenu, NULL, ICON_RIGHTARROW_THIN, "Make Single User", 0, yco-=20, 120, 19, "");
2359         uiDefIconTextBlockBut(block, view3d_edit_object_makelocalmenu, NULL, ICON_RIGHTARROW_THIN, "Make Local", 0, yco-=20, 120, 19, "");
2360         uiDefIconTextBlockBut(block, view3d_edit_object_copyattrmenu, NULL, ICON_RIGHTARROW_THIN, "Copy Attributes", 0, yco-=20, 120, 19, "");
2361         
2362         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2363         
2364         uiDefIconTextBlockBut(block, view3d_edit_object_parentmenu, NULL, ICON_RIGHTARROW_THIN, "Parent", 0, yco-=20, 120, 19, "");
2365         uiDefIconTextBlockBut(block, view3d_edit_object_groupmenu, NULL, ICON_RIGHTARROW_THIN, "Group", 0, yco-=20, 120, 19, "");
2366         uiDefIconTextBlockBut(block, view3d_edit_object_trackmenu, NULL, ICON_RIGHTARROW_THIN, "Track", 0, yco-=20, 120, 19, "");
2367         uiDefIconTextBlockBut(block, view3d_edit_object_constraintsmenu, NULL, ICON_RIGHTARROW_THIN, "Constraints", 0, yco-=20, 120, 19, "");
2368         
2369         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2370         
2371         if (OBACT && OBACT->type == OB_MESH) {
2372                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Boolean Operation...|W",                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2373         }
2374         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Join Objects|Ctrl J",                            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
2375         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Object Type...|Alt C",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2376         
2377         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2378         
2379         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move to Layer...|M",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
2380         uiDefIconTextBlockBut(block, view3d_edit_object_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Show/Hide Objects", 0, yco-=20, 120, 19, "");
2381         
2382 #ifndef DISABLE_PYTHON
2383         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2384         uiDefIconTextBlockBut(block, view3d_edit_object_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, "");
2385 #endif
2386                 
2387         if(ar->alignment==RGN_ALIGN_TOP) {
2388                 uiBlockSetDirection(block, UI_DOWN);
2389         }
2390         else {
2391                 uiBlockSetDirection(block, UI_TOP);
2392                 uiBlockFlipOrder(block);
2393         }
2394
2395         uiTextBoundsBlock(block, 50);
2396         return block;
2397 }
2398
2399
2400 static void do_view3d_edit_propfalloffmenu(bContext *C, void *arg, int event)
2401 {
2402         ToolSettings *ts= CTX_data_tool_settings(C);
2403         
2404         ts->prop_mode= event;
2405         
2406 }
2407
2408 static uiBlock *view3d_edit_propfalloffmenu(bContext *C, ARegion *ar, void *arg_unused)
2409 {
2410         ToolSettings *ts= CTX_data_tool_settings(C);
2411         uiBlock *block;
2412         short yco = 20, menuwidth = 120;
2413
2414         block= uiBeginBlock(C, ar, "view3d_edit_propfalloffmenu", UI_EMBOSSP);
2415         uiBlockSetButmFunc(block, do_view3d_edit_propfalloffmenu, NULL);
2416         
2417         if (ts->prop_mode==PROP_SMOOTH) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Smooth|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SMOOTH, "");
2418         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Smooth|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SMOOTH, "");
2419         if (ts->prop_mode==PROP_SPHERE) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Sphere|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SPHERE, "");
2420         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Sphere|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SPHERE, "");
2421         if (ts->prop_mode==PROP_ROOT) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Root|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_ROOT, "");
2422         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Root|Shift O",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_ROOT, "");
2423         if (ts->prop_mode==PROP_SHARP) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Sharp|Shift O",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SHARP, "");
2424         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Sharp|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SHARP, "");
2425         if (ts->prop_mode==PROP_LIN) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Linear|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_LIN, "");
2426         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Linear|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_LIN, "");
2427         if (ts->prop_mode==PROP_RANDOM) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Random|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_RANDOM, "");
2428         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Random|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_RANDOM, "");
2429         if (ts->prop_mode==PROP_CONST) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Constant|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_CONST, "");
2430         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Constant|Shift O",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_CONST, "");
2431                 
2432         uiBlockSetDirection(block, UI_RIGHT);
2433         uiTextBoundsBlock(block, 60);
2434         return block;
2435 }
2436
2437
2438 void do_view3d_edit_mesh_verticesmenu(bContext *C, void *arg, int event)
2439 {
2440 #if 0
2441         Scene *scene= CTX_data_scene(C);
2442         
2443         switch(event) {
2444         int count; 
2445         
2446         case 0: /* make vertex parent */
2447                 make_parent();
2448                 break;
2449         case 1: /* remove doubles */
2450                 count= removedoublesflag(1, 0, ts->doublimit);
2451                 notice("Removed: %d", count);
2452                 if (count) { /* only undo and redraw if an action is taken */
2453                         DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
2454                         ED_undo_push(C, "Rem Doubles");
2455                 }
2456                 break;
2457         case 2: /* smooth */
2458                 vertexsmooth();
2459                 break;
2460         case 3: /* separate */
2461                 separate_mesh();
2462                 break;
2463         case 4: /*split */
2464                 split_mesh();
2465                 break;
2466         case 5: /*merge */
2467                 mergemenu();
2468                 DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
2469                 break;
2470         case 6: /* add hook */
2471                 add_hook_menu();
2472                 break;
2473         case 7: /* rip */
2474                 mesh_rip();
2475                 break;
2476         }
2477 #endif
2478 }
2479
2480 static uiBlock *view3d_edit_mesh_verticesmenu(bContext *C, ARegion *ar, void *arg_unused)
2481 {
2482         uiBlock *block;
2483         short yco = 20, menuwidth = 120;
2484
2485         block= uiBeginBlock(C, ar, "view3d_edit_mesh_verticesmenu", UI_EMBOSSP);
2486         uiBlockSetButmFunc(block, do_view3d_edit_mesh_verticesmenu, NULL);
2487         
2488         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Merge...|Alt M",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2489         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rip|V",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2490         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Split|Y",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2491         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Separate|P",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2492         
2493         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2494         
2495         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Smooth|W, Alt 1",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2496         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remove Doubles|W, 6",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2497         
2498         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2499
2500         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Vertex Parent|Ctrl P",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2501         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Hook|Ctrl H",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2502
2503         uiBlockSetDirection(block, UI_RIGHT);
2504         uiTextBoundsBlock(block, 60);
2505         return block;
2506 }
2507
2508 extern void editmesh_mark_sharp(int set); /* declared in editmesh_mods.c */
2509
2510 void do_view3d_edit_mesh_edgesmenu(bContext *C, void *arg, int event)
2511 {
2512 #if 0
2513         Scene *scene= CTX_data_scene(C);
2514         float fac;
2515         short randfac;
2516
2517         switch(event) {
2518                  
2519         case 0: /* subdivide smooth */
2520                 esubdivideflag(1, 0.0, ts->editbutflag | B_SMOOTH,1,0);
2521                 ED_undo_push(C, "Subdivide Smooth");
2522                 break;
2523         case 1: /*subdivide fractal */
2524                 randfac= 10;
2525                 if(button(&randfac, 1, 100, "Rand fac:")==0) return;
2526                 fac= -( (float)randfac )/100;
2527                 esubdivideflag(1, fac, ts->editbutflag,1,0);
2528                 ED_undo_push(C, "Subdivide Fractal");
2529                 break;
2530         case 2: /* subdivide */
2531                 esubdivideflag(1, 0.0, ts->editbutflag,1,0);
2532                 ED_undo_push(C, "Subdivide");
2533                 break;
2534         case 3: /* knife subdivide */
2535                 KnifeSubdivide(KNIFE_PROMPT);
2536                 break;
2537         case 4: /* Loop subdivide */
2538                 CutEdgeloop(1);
2539                 break;
2540         case 5: /* Make Edge/Face */
2541                 addedgeface_mesh();
2542                 break;
2543         case 6:
2544                 bevel_menu();
2545                 break;
2546         case 7: /* Mark Seam */
2547                 editmesh_mark_seam(0);
2548                 break;
2549         case 8: /* Clear Seam */
2550                 editmesh_mark_seam(1);
2551                 break;
2552         case 9: /* Crease SubSurf */
2553                 if(!multires_level1_test()) {
2554                         initTransform(TFM_CREASE, CTX_EDGE);
2555                         Transform();
2556                 }
2557                 break;
2558         case 10: /* Rotate Edge */
2559                 edge_rotate_selected(2);
2560                 break;
2561         case 11: /* Rotate Edge */
2562                 edge_rotate_selected(1);
2563                 break;
2564         case 12: /* Edgeslide */
2565                 EdgeSlide(0,0.0);
2566                 break;
2567         case 13: /* Edge Loop Delete */
2568                 if(EdgeLoopDelete()) {
2569                         countall();
2570                         ED_undo_push(C, "Erase Edge Loop");
2571                         DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
2572                 }
2573                 break;
2574         case 14: /*Collapse Edges*/
2575                 collapseEdges();
2576                 ED_undo_push(C, "Collapse");
2577                 break;
2578         case 15:
2579                 editmesh_mark_sharp(1);
2580                 ED_undo_push(C, "Mark Sharp");
2581                 DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
2582                 break;
2583         case 16:
2584                 editmesh_mark_sharp(0);
2585                 ED_undo_push(C, "Clear Sharp");
2586                 DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
2587                 break;
2588         case 17: /* Adjust Bevel Weight */
2589                 if(!multires_level1_test()) {
2590                         initTransform(TFM_BWEIGHT, CTX_EDGE);
2591                         Transform();
2592                 }
2593                 break;
2594         }
2595 #endif
2596 }
2597
2598 static uiBlock *view3d_edit_mesh_edgesmenu(bContext *C, ARegion *ar, void *arg_unused)
2599 {
2600         uiBlock *block;
2601         short yco = 20, menuwidth = 120;
2602
2603         block= uiBeginBlock(C, ar, "view3d_edit_mesh_edgesmenu", UI_EMBOSSP);
2604         uiBlockSetButmFunc(block, do_view3d_edit_mesh_edgesmenu, NULL);
2605         
2606         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2607         
2608         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2609         
2610         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel|W, Alt 2",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2611         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Loop Subdivide...|Ctrl R",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2612         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Knife Subdivide...|Shift K",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2613         
2614         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2615         
2616         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide|W, 1",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2617         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide Fractal|W, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2618         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide Smooth|W, 4",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2619
2620         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2621
2622         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mark Seam|Ctrl E",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2623         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Seam|Ctrl E",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
2624         
2625         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2626         
2627         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mark Sharp|Ctrl E",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
2628         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Sharp|Ctrl E",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
2629         
2630         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2631         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Adjust Bevel Weight|Ctrl Shift E",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
2632
2633         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2634         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Crease SubSurf|Shift E",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2635
2636         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2637
2638         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate Edge CW|Ctrl E",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
2639         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate Edge CCW|Ctrl E",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");  
2640
2641         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Slide Edge |Ctrl E",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");  
2642         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Edge Loop|X",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");  
2643
2644         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Collapse",                               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");  
2645         uiBlockSetDirection(block, UI_RIGHT);
2646         uiTextBoundsBlock(block, 60);
2647         return block;
2648 }
2649
2650 void do_view3d_edit_mesh_facesmenu(bContext *C, void *arg, int event)
2651 {
2652 #if 0
2653         Scene *scene= CTX_data_scene(C);
2654         
2655         switch(event) {
2656         case 0: /* Fill Faces */
2657                 fill_mesh();
2658                 break;
2659         case 1: /* Beauty Fill Faces */
2660                 beauty_fill();
2661                 break;
2662         case 2: /* Quads to Tris */
2663                 convert_to_triface(0);
2664                 countall();
2665                 DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
2666                 break;
2667         case 3: /* Tris to Quads */
2668                 join_triangles();
2669                 break;
2670         case 4: /* Flip triangle edges */
2671                 edge_flip();
2672                 break;
2673         case 5: /* Make Edge/Face */
2674                 addedgeface_mesh();
2675                 break;
2676         case 6: /* Set Smooth */
2677                 mesh_set_smooth_faces(1);
2678                 break;
2679         case 7: /* Set Solid */
2680                 mesh_set_smooth_faces(0);
2681                 break;
2682         }
2683 #endif
2684 }
2685
2686 static uiBlock *view3d_edit_mesh_facesmenu(bContext *C, ARegion *ar, void *arg_unused)
2687 {
2688         uiBlock *block;
2689         short yco = 20, menuwidth = 120;
2690
2691         block= uiBeginBlock(C, ar, "view3d_edit_mesh_facesmenu", UI_EMBOSSP);
2692         uiBlockSetButmFunc(block, do_view3d_edit_mesh_facesmenu, NULL);
2693         
2694         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2695         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Fill|Shift F",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2696         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Beautify Fill|Alt F",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2697         
2698         
2699         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2700         
2701         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Quads to Triangles|Ctrl T",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2702         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Triangles to Quads|Alt J", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2703         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip Triangle Edges|Ctrl Shift F",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2704         
2705         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2706         
2707         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Smooth|W, Alt 3",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2708         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Solid|W, Alt 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2709         
2710         uiBlockSetDirection(block, UI_RIGHT);
2711         uiTextBoundsBlock(block, 60);
2712         return block;
2713 }
2714
2715 void do_view3d_edit_mesh_normalsmenu(bContext *C, void *arg, int event)
2716 {
2717 #if 0
2718         switch(event) {
2719         case 0: /* flip */
2720                 flip_editnormals();
2721                 break;
2722         case 1: /* recalculate inside */
2723                 righthandfaces(2);
2724                 break;
2725         case 2: /* recalculate outside */
2726                 righthandfaces(1);
2727                 break;
2728                 }
2729 #endif
2730 }
2731
2732 static uiBlock *view3d_edit_mesh_normalsmenu(bContext *C, ARegion *ar, void *arg_unused)
2733 {
2734         uiBlock *block;
2735         short yco = 20, menuwidth = 120;
2736
2737         block= uiBeginBlock(C, ar, "view3d_edit_mesh_normalsmenu", UI_EMBOSSP);
2738         uiBlockSetButmFunc(block, do_view3d_edit_mesh_normalsmenu, NULL);
2739         
2740         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recalculate Outside|Ctrl N",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2741         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recalculate Inside|Ctrl Shift N",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2742         
2743         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2744         
2745         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip|W, 0",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2746         
2747         uiBlockSetDirection(block, UI_RIGHT);
2748         uiTextBoundsBlock(block, 60);
2749         return block;
2750 }
2751
2752 void do_view3d_edit_mirrormenu(bContext *C, void *arg, int event)
2753 {
2754 #if 0
2755         float mat[3][3];
2756         
2757         Mat3One(mat);
2758         
2759         switch(event) {
2760                 case 0:
2761                         initTransform(TFM_MIRROR, CTX_NO_PET);
2762                         Transform();
2763                         break;
2764                 case 1:
2765                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
2766                         BIF_setSingleAxisConstraint(mat[0], " on global X axis");
2767                         Transform();
2768                         break;
2769                 case 2:
2770                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
2771                         BIF_setSingleAxisConstraint(mat[1], " on global Y axis");
2772                         Transform();
2773                         break;
2774                 case 3:
2775                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
2776                         BIF_setSingleAxisConstraint(mat[2], "on global Z axis");
2777                         Transform();
2778                         break;
2779                 case 4:
2780                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
2781                         BIF_setLocalAxisConstraint('X', " on local X axis");
2782                         Transform();
2783                         break;
2784                 case 5:
2785                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
2786                         BIF_setLocalAxisConstraint('Y', " on local Y axis");
2787                         Transform();
2788                         break;
2789                 case 6:
2790                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
2791                         BIF_setLocalAxisConstraint('Z', " on local Z axis");
2792                         Transform();
2793                         break;
2794         }
2795 #endif
2796 }
2797
2798 static uiBlock *view3d_edit_mirrormenu(bContext *C, ARegion *ar, void *arg_unused)
2799 {
2800         uiBlock *block;
2801         short yco = 20, menuwidth = 120;
2802
2803         block= uiBeginBlock(C, ar, "view3d_edit_mirrormenu", UI_EMBOSSP);
2804         uiBlockSetButmFunc(block, do_view3d_edit_mirrormenu, NULL);
2805         
2806         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Interactive Mirror|Ctrl M",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2807
2808         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2809         
2810         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|Ctrl M, X",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2811         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|Ctrl M, Y",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2812         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|Ctrl M, Z",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2813         
2814         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2815         
2816         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|Ctrl M, X X",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2817         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, Y Y",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2818         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, Z Z",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2819
2820         uiBlockSetDirection(block, UI_RIGHT);
2821         uiTextBoundsBlock(block, 60);
2822         return block;
2823 }
2824
2825 static void do_view3d_edit_mesh_showhidemenu(bContext *C, void *arg, int event)
2826 {
2827 #if 0
2828         
2829         switch(event) {
2830                  
2831         case 0: /* show hidden vertices */
2832                 reveal_mesh();
2833                 break;
2834         case 1: /* hide selected vertices */
2835                 hide_mesh(0);
2836                 break;
2837         case 2: /* hide deselected vertices */
2838                 hide_mesh(1);
2839                 break;
2840         }
2841 #endif
2842 }
2843
2844 static uiBlock *view3d_edit_mesh_showhidemenu(bContext *C, ARegion *ar, void *arg_unused)
2845 {
2846         uiBlock *block;
2847         short yco = 20, menuwidth = 120;
2848
2849         block= uiBeginBlock(C, ar, "view3d_edit_mesh_showhidemenu", UI_EMBOSSP);
2850         uiBlockSetButmFunc(block, do_view3d_edit_mesh_showhidemenu, NULL);
2851         
2852         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hidden|Alt H",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2853         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Selected|H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2854         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Unselected|Shift H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2855
2856         uiBlockSetDirection(block, UI_RIGHT);
2857         uiTextBoundsBlock(block, 60);
2858         return block;
2859 }
2860
2861 #ifndef DISABLE_PYTHON
2862 static void do_view3d_edit_mesh_scriptsmenu(bContext *C, void *arg, int event)
2863 {
2864 #if 0
2865         BPY_menu_do_python(PYMENU_MESH, event);
2866
2867 #endif
2868 }
2869
2870 static uiBlock *view3d_edit_mesh_scriptsmenu(bContext *C, ARegion *ar, void *arg_unused)
2871 {
2872         uiBlock *block;
2873 //      short yco = 20, menuwidth = 120;
2874 // XXX  BPyMenu *pym;
2875 //      int i = 0;
2876
2877         block= uiBeginBlock(C, ar, "v3d_emesh_pymenu", UI_EMBOSSP);
2878         uiBlockSetButmFunc(block, do_view3d_edit_mesh_scriptsmenu, NULL);
2879
2880 //      for (pym = BPyMenuTable[PYMENU_MESH]; pym; pym = pym->next, i++) {
2881 //              uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i, pym->tooltip?pym->tooltip:pym->filename);
2882 //      }
2883
2884         uiBlockSetDirection(block, UI_RIGHT);
2885         uiTextBoundsBlock(block, 60);
2886
2887         return block;
2888 }
2889 #endif /* DISABLE_PYTHON */
2890
2891 static void do_view3d_edit_meshmenu(bContext *C, void *arg, int event)
2892 {
2893 #if 0
2894         ToolSettings *ts= CTX_data_tool_settings(C);
2895         Scene *scene= CTX_data_scene(C);
2896         ScrArea *sa= CTX_wm_area(C);
2897         View3D *v3d= sa->spacedata.first;
2898         
2899         switch(event) {
2900         
2901         case 0: /* Undo Editing */
2902                 BIF_undo();
2903                 break;
2904         case 1: /* Redo Editing */
2905                 BIF_redo();
2906                 break;
2907         case 2: /* transform properties */
2908                 add_blockhandler(sa, VIEW3D_HANDLER_OBJECT, 0);
2909                 break;
2910         case 4: /* insert keyframe */
2911                 common_insertkey();
2912                 break;
2913         case 5: /* Extrude */
2914                 extrude_mesh();
2915                 break;
2916         case 6: /* duplicate */
2917                 duplicate_context_selected();
2918                 break;
2919         case 7: /* make edge face */
2920                 addedgeface_mesh();
2921                 break;
2922         case 8: /* delete */
2923                 delete_context_selected();
2924                 break;
2925         case 9: /* Shrink/Fatten Along Normals */
2926                 initTransform(TFM_SHRINKFATTEN, CTX_NONE);
2927                 Transform();
2928                 break;
2929         case 10: /* Shear */
2930                 initTransform(TFM_SHEAR, CTX_NONE);
2931                 Transform();
2932                 break;
2933         case 11: /* Warp */
2934                 initTransform(TFM_WARP, CTX_NONE);
2935                 Transform();
2936                 break;
2937         case 12: /* proportional edit (toggle) */
2938                 if(ts->proportional) ts->proportional= 0;
2939                 else ts->proportional= 1;
2940                 break;
2941         case 13: /* automerge edit (toggle) */
2942                 if(ts->automerge) ts->automerge= 0;
2943                 else ts->automerge= 1;
2944                 break;
2945         case 15:
2946                 uv_autocalc_tface();
2947                 break;
2948         case 16: /* delete keyframe */
2949                 common_deletekey();
2950                 break;
2951         }
2952 #endif
2953 }
2954
2955 static uiBlock *view3d_edit_meshmenu(bContext *C, ARegion *ar, void *arg_unused)
2956 {
2957         ToolSettings *ts= CTX_data_tool_settings(C);
2958         Object *obedit = CTX_data_edit_object(C);
2959         uiBlock *block;
2960         short yco= 0, menuwidth=120;
2961                 
2962         block= uiBeginBlock(C, ar, "view3d_edit_meshmenu", UI_EMBOSSP);
2963         uiBlockSetButmFunc(block, do_view3d_edit_meshmenu, NULL);
2964
2965         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|Ctrl Z",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2966         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Redo Editing|Ctrl Shift Z",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2967 // XXX  uiDefIconTextBlockBut(block, editmode_undohistorymenu, NULL, ICON_RIGHTARROW_THIN, "Undo History", 0, yco-=20, 120, 19, "");
2968         
2969         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2970         
2971         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties...|N",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2972         uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
2973         uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, 120, 19, "");
2974         uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
2975         
2976         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2977         
2978         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2979         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Keyframe|Alt I",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
2980         
2981         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2982         
2983         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "UV Unwrap|U",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
2984         
2985         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2986         
2987         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extrude|E",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2988         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2989         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2990         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete...|X",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
2991         
2992         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2993         
2994         uiDefIconTextBlockBut(block, view3d_edit_mesh_verticesmenu, NULL, ICON_RIGHTARROW_THIN, "Vertices", 0, yco-=20, 120, 19, "");
2995         uiDefIconTextBlockBut(block, view3d_edit_mesh_edgesmenu, NULL, ICON_RIGHTARROW_THIN, "Edges", 0, yco-=20, 120, 19, "");
2996         uiDefIconTextBlockBut(block, view3d_edit_mesh_facesmenu, NULL, ICON_RIGHTARROW_THIN, "Faces", 0, yco-=20, 120, 19, "");
2997         uiDefIconTextBlockBut(block, view3d_edit_mesh_normalsmenu, NULL, ICON_RIGHTARROW_THIN, "Normals", 0, yco-=20, 120, 19, "");
2998         
2999         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
3000                 
3001         
3002         
3003         if(ts->proportional) {
3004                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
3005         } else {
3006                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
3007         }
3008         uiDefIconTextBlockBut(block, view3d_edit_propfalloffmenu, NULL, ICON_RIGHTARROW_THIN, "Proportional Falloff", 0, yco-=20, 120, 19, "");