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