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