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