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