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