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