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