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