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