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