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