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