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