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