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