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