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