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