f7cf9dd22cd840c6ee914ee832bced41c2851f93
[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 1:
1885                 case 2:
1886                 case 3:
1887                         Mirror(event + 3); /* + 3 because the first three modes are global*/
1888                         break;
1889         }
1890         allqueue(REDRAWVIEW3D, 0);
1891 }
1892
1893 static uiBlock *view3d_object_mirrormenu(void *arg_unused)
1894 {
1895         uiBlock *block;
1896         short yco = 20, menuwidth = 120;
1897
1898         block= uiNewBlock(&curarea->uiblocks, "view3d_object_mirrormenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1899         uiBlockSetButmFunc(block, do_view3d_object_mirrormenu, NULL);
1900         
1901         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|Ctrl M, 1",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1902         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, 2",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1903         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, 3",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1904
1905         uiBlockSetDirection(block, UI_RIGHT);
1906         uiTextBoundsBlock(block, 60);
1907         return block;
1908 }
1909
1910 static void do_view3d_edit_object_transformmenu(void *arg, int event)
1911 {
1912         switch(event) {
1913         case 0: /*      clear origin */
1914                 clear_object('o');
1915                 break;
1916         case 1: /* clear scale */
1917                 clear_object('s');
1918                 break;
1919         case 2: /* clear rotation */
1920                 clear_object('r');
1921                 break;
1922         case 3: /* clear location */
1923                 clear_object('g');
1924                 break;
1925         case 4:
1926                 if(OBACT) object_apply_deform(OBACT);
1927                 break;
1928         case 5: /* make duplis real */
1929                 make_duplilist_real();
1930                 break;
1931         case 6: /* apply scale/rotation or deformation */
1932                 apply_objects_locrot();
1933                 break;  
1934         case 7: /* apply visual matrix to objects loc/size/rot */
1935                 apply_objects_visual_tx();
1936                 break;  
1937         }
1938         allqueue(REDRAWVIEW3D, 0);
1939 }
1940
1941 static uiBlock *view3d_edit_object_transformmenu(void *arg_unused)
1942 {
1943         uiBlock *block;
1944         short yco = 20, menuwidth = 120;
1945
1946         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_transformmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1947         uiBlockSetButmFunc(block, do_view3d_edit_object_transformmenu, NULL);
1948         
1949         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, "");
1950         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Visual Transform|Ctrl A, 2",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1951         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Deformation|Ctrl Shift A",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1952         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Duplicates Real|Ctrl Shift A",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1953         
1954         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1955         
1956         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Location|Alt G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1957         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Rotation|Alt R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1958         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Scale|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1959         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Origin|Alt O",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1960         
1961         uiBlockSetDirection(block, UI_RIGHT);
1962         uiTextBoundsBlock(block, 60);
1963         return block;
1964 }
1965
1966 static void do_view3d_edit_object_makelocalmenu(void *arg, int event)
1967 {
1968         switch(event) {
1969                 case 1:
1970                 case 2:
1971                 case 3:
1972                         make_local(event);
1973                         break;
1974         }
1975 }
1976
1977 static uiBlock *view3d_edit_object_makelocalmenu(void *arg_unused)
1978 {       
1979         uiBlock *block;
1980         short yco = 20, menuwidth = 120;
1981         
1982         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_makelocalmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1983         uiBlockSetButmFunc(block, do_view3d_edit_object_makelocalmenu, NULL);
1984         
1985         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selected Objects|L, 1",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1986         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selected Objects and Data|L, 2",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1987         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "All|L, 3",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1988         
1989         uiBlockSetDirection(block, UI_RIGHT);
1990         uiTextBoundsBlock(block, 60);
1991         return block;
1992 }
1993
1994 static void do_view3d_edit_object_makelinksmenu(void *arg, int event)
1995 {
1996         switch(event) {
1997         case 1:
1998         case 2:
1999         case 3:
2000         case 4:
2001                 make_links((short)event);
2002                 break;
2003                 }
2004         allqueue(REDRAWVIEW3D, 0);
2005 }
2006
2007 static uiBlock *view3d_edit_object_makelinksmenu(void *arg_unused)
2008 {
2009         Object *ob=NULL;
2010         
2011         uiBlock *block;
2012         short yco = 20, menuwidth = 120;
2013
2014         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_makelinksmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2015         uiBlockSetButmFunc(block, do_view3d_edit_object_makelinksmenu, NULL);
2016         
2017         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "To Scene...|Ctrl L, 1",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2018         
2019         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2020         
2021         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Ipo|Ctrl L, 2",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2022         
2023         if ((ob=OBACT)) {
2024         
2025                 if(ob->type==OB_MESH) {
2026                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mesh Data|Ctrl L, 3",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2027                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2028                 } else if(ob->type==OB_CURVE) {
2029                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve Data|Ctrl L, 3",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2030                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2031                 } else if(ob->type==OB_FONT) {
2032                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Text Data|Ctrl L, 3",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2033                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2034                 } else if(ob->type==OB_SURF) {
2035                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Surface Data|Ctrl L, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2036                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2037                 } else if(ob->type==OB_MBALL) {
2038                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2039                 } else if(ob->type==OB_CAMERA) {
2040                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera Data|Ctrl L, 3",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2041                 } else if(ob->type==OB_LAMP) {
2042                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lamp Data|Ctrl L, 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2043                 } else if(ob->type==OB_LATTICE) {
2044                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lattice Data|Ctrl L, 3",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2045                 } else if(ob->type==OB_ARMATURE) {
2046                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Armature Data|Ctrl L, 3",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2047                 }
2048         }
2049         
2050         uiBlockSetDirection(block, UI_RIGHT);
2051         uiTextBoundsBlock(block, 60);
2052         return block;
2053 }
2054
2055 static void do_view3d_edit_object_singleusermenu(void *arg, int event)
2056 {
2057         switch(event) {
2058         case 1: /* Object */
2059                 single_object_users(1);
2060                 break;
2061         case 2: /* Object & ObData */ 
2062                 single_object_users(1);
2063                 single_obdata_users(1);
2064                 break;
2065         case 3: /* Object & ObData & Materials+Tex */
2066                 single_object_users(1);
2067                 single_obdata_users(1);
2068                 single_mat_users(1); /* also tex */
2069                 break;
2070         case 4: /* Materials+Tex */
2071                 single_mat_users(1);
2072                 break;
2073         }
2074         
2075         clear_id_newpoins();
2076         countall();
2077         
2078         allqueue(REDRAWALL, 0);
2079 }
2080
2081 static uiBlock *view3d_edit_object_singleusermenu(void *arg_unused)
2082 {
2083
2084         uiBlock *block;
2085         short yco = 20, menuwidth = 120;
2086
2087         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_singleusermenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2088         uiBlockSetButmFunc(block, do_view3d_edit_object_singleusermenu, NULL);
2089         
2090         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object|U, 1",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2091         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object & ObData|U, 2",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2092         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object & ObData & Materials+Tex|U, 3",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2093         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials+Tex|U, 4",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2094         
2095         uiBlockSetDirection(block, UI_RIGHT);
2096         uiTextBoundsBlock(block, 60);
2097         return block;
2098 }
2099
2100 static void do_view3d_edit_object_copyattrmenu(void *arg, int event)
2101 {
2102         switch(event) {
2103         case 1:
2104         case 2:
2105         case 3:
2106         case 4:
2107         case 5:
2108         case 6:
2109         case 7:
2110         case 8:
2111         case 9:
2112         case 10:
2113         case 11:
2114         case 17:
2115         case 18:
2116         case 19:
2117         case 20:
2118         case 21:
2119         case 22:
2120         case 23:
2121         case 24:
2122         case 25:
2123         case 26:
2124         case 29:
2125         case 30:
2126                 copy_attr((short)event);
2127                 break;
2128                 }
2129         allqueue(REDRAWVIEW3D, 0);
2130 }
2131
2132 static uiBlock *view3d_edit_object_copyattrmenu(void *arg_unused)
2133 {
2134         Object *ob=NULL;
2135         
2136         uiBlock *block;
2137         short yco = 20, menuwidth = 120;
2138
2139         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_copyattrmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2140         uiBlockSetButmFunc(block, do_view3d_edit_object_copyattrmenu, NULL);
2141         
2142         ob= OBACT;
2143         
2144         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Location|Ctrl C, 1",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2145         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotation|Ctrl C, 2",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2146         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Size|Ctrl C, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2147         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Drawtype|Ctrl C, 4",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2148         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Time Offset|Ctrl C, 5",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2149         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Dupli|Ctrl C, 6",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2150         
2151         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2152         
2153         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mass|Ctrl C, 7",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2154         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Damping|Ctrl C, 8",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
2155         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Properties|Ctrl C, 9",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2156         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Logic Bricks|Ctrl C, 10",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
2157         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Protected Transform |Ctrl C",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 29, "");
2158         
2159         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2160         
2161         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Constraints|Ctrl C",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
2162         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NLA Strips|Ctrl C",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 26, "");
2163         
2164         if (ob) {
2165         
2166                 if ((ob->type == OB_MESH) || (ob->type == OB_CURVE) || (ob->type == OB_SURF) ||
2167                                 (ob->type == OB_FONT) || (ob->type == OB_MBALL)) {
2168                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Texture Space|Ctrl C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
2169                 }       
2170                 
2171                 if(ob->type == OB_FONT) {
2172                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Font Settings|Ctrl C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
2173                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel Settings|Ctrl C",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
2174                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve Resolution|Ctrl C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
2175                 }
2176                 if(ob->type == OB_CURVE) {
2177                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel Settings|Ctrl C",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
2178                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve Resolution|Ctrl C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
2179                 }
2180         
2181                 if(ob->type==OB_MESH) {
2182                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subsurf Settings|Ctrl C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 21, "");
2183                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Modifiers ...|Ctrl C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 24, "");
2184                 }
2185         
2186                 if( give_parteff(ob) ) {
2187                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Particle Settings|Ctrl C",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
2188                 }
2189
2190                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Pass Index|Ctrl C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 30, "");
2191         }
2192         
2193         uiBlockSetDirection(block, UI_RIGHT);
2194         uiTextBoundsBlock(block, 60);
2195         return block;
2196 }
2197
2198
2199 static void do_view3d_edit_object_parentmenu(void *arg, int event)
2200 {
2201         switch(event) {
2202         case 0: /* clear parent */
2203                 clear_parent();
2204                 break;
2205         case 1: /* make parent */
2206                 make_parent();
2207                 break;
2208                 }
2209         allqueue(REDRAWVIEW3D, 0);
2210 }
2211
2212 static uiBlock *view3d_edit_object_parentmenu(void *arg_unused)
2213 {
2214         uiBlock *block;
2215         short yco = 20, menuwidth = 120;
2216
2217         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_parentmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2218         uiBlockSetButmFunc(block, do_view3d_edit_object_parentmenu, NULL);
2219         
2220         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Parent...|Ctrl P",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2221         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Parent...|Alt P",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2222
2223         uiBlockSetDirection(block, UI_RIGHT);
2224         uiTextBoundsBlock(block, 60);
2225         return block;
2226 }
2227
2228 static void do_view3d_edit_object_groupmenu(void *arg, int event)
2229 {
2230         switch(event) {
2231                 case 1:
2232                 case 2:
2233                 case 3:
2234                         group_operation(event);
2235                         break;
2236         }
2237         allqueue(REDRAWVIEW3D, 0);
2238 }
2239
2240 static uiBlock *view3d_edit_object_groupmenu(void *arg_unused)
2241 {
2242         uiBlock *block;
2243         short yco = 20, menuwidth = 120;
2244         
2245         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_groupmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2246         uiBlockSetButmFunc(block, do_view3d_edit_object_groupmenu, NULL);
2247         
2248         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, "");
2249         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, "");
2250         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, "");
2251         
2252         uiBlockSetDirection(block, UI_RIGHT);
2253         uiTextBoundsBlock(block, 60);
2254         return block;
2255 }
2256
2257 static void do_view3d_edit_object_trackmenu(void *arg, int event)
2258 {
2259         switch(event) {
2260         case 0: /* clear track */
2261                 clear_track();
2262                 break;
2263         case 1: /* make track */
2264                 make_track();
2265                 break;
2266                 }
2267         allqueue(REDRAWVIEW3D, 0);
2268 }
2269
2270 static uiBlock *view3d_edit_object_trackmenu(void *arg_unused)
2271 {
2272         uiBlock *block;
2273         short yco = 20, menuwidth = 120;
2274
2275         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_trackmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2276         uiBlockSetButmFunc(block, do_view3d_edit_object_trackmenu, NULL);
2277         
2278         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Track...|Ctrl T",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2279         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Track...|Alt T",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2280         
2281         uiBlockSetDirection(block, UI_RIGHT);
2282         uiTextBoundsBlock(block, 60);
2283         return block;
2284 }
2285
2286 static void do_view3d_edit_object_constraintsmenu(void *arg, int event)
2287 {
2288         switch(event) {
2289         case 1: /* add constraint */
2290                 add_constraint(0);
2291                 break;
2292         case 2: /* clear constraint */
2293                 ob_clear_constraints();
2294                 break;
2295                 }
2296         allqueue(REDRAWVIEW3D, 0);
2297 }
2298
2299 static uiBlock *view3d_edit_object_constraintsmenu(void *arg_unused)
2300 {
2301         uiBlock *block;
2302         short yco = 20, menuwidth = 120;
2303
2304         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_constraintsmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2305         uiBlockSetButmFunc(block, do_view3d_edit_object_constraintsmenu, NULL);
2306         
2307         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Constraint...|Ctrl Alt C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2308         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Constraints",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2309         
2310         uiBlockSetDirection(block, UI_RIGHT);
2311         uiTextBoundsBlock(block, 60);
2312         return block;
2313 }
2314
2315 static void do_view3d_edit_object_showhidemenu(void *arg, int event)
2316 {
2317         
2318         switch(event) {
2319                  
2320         case 0: /* show objects */
2321                 show_objects();
2322                 break;
2323         case 1: /* hide selected objects */
2324                 hide_objects(1);
2325                 break;
2326         case 2: /* hide deselected objects */
2327                 hide_objects(0);
2328                 break;
2329         }
2330         allqueue(REDRAWVIEW3D, 0);
2331 }
2332
2333 static uiBlock *view3d_edit_object_showhidemenu(void *arg_unused)
2334 {
2335         uiBlock *block;
2336         short yco = 20, menuwidth = 120;
2337
2338         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_showhidemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2339         uiBlockSetButmFunc(block, do_view3d_edit_object_showhidemenu, NULL);
2340         
2341         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hidden|Alt H",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2342         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Selected|H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2343         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Deselected|Shift H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2344
2345         uiBlockSetDirection(block, UI_RIGHT);
2346         uiTextBoundsBlock(block, 60);
2347         return block;
2348 }
2349
2350 static void do_view3d_edit_object_scriptsmenu(void *arg, int event)
2351 {
2352         BPY_menu_do_python(PYMENU_OBJECT, event);
2353
2354         allqueue(REDRAWVIEW3D, 0);
2355 }
2356
2357 static uiBlock *view3d_edit_object_scriptsmenu(void *arg_unused)
2358 {
2359         uiBlock *block;
2360         short yco = 20, menuwidth = 120;
2361         BPyMenu *pym;
2362         int i = 0;
2363
2364         block= uiNewBlock(&curarea->uiblocks, "v3d_eobject_pymenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2365         uiBlockSetButmFunc(block, do_view3d_edit_object_scriptsmenu, NULL);
2366
2367         for (pym = BPyMenuTable[PYMENU_OBJECT]; pym; pym = pym->next, i++) {
2368                 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);
2369         }
2370
2371         uiBlockSetDirection(block, UI_RIGHT);
2372         uiTextBoundsBlock(block, 60);
2373
2374         return block;
2375 }
2376
2377 #ifdef WITH_VERSE
2378 extern ListBase session_list;
2379 #endif
2380
2381 static void do_view3d_edit_objectmenu(void *arg, int event)
2382 {
2383         /* needed to check for valid selected objects */
2384         Base *base=NULL;
2385         Object *ob=NULL;
2386 #ifdef WITH_VERSE
2387         struct VerseSession *session=NULL;
2388 #endif
2389
2390         base= BASACT;
2391         if (base) ob= base->object;
2392         
2393         switch(event) {
2394          
2395         case 0: /* transform    properties*/
2396                 mainqenter(NKEY, 1);
2397                 break;
2398         case 1: /* delete */
2399                 delete_context_selected();
2400                 break;
2401         case 2: /* duplicate */
2402                 duplicate_context_selected();
2403                 break;
2404         case 3: /* duplicate linked */
2405                 adduplicate(0, 0);
2406                 break;
2407         case 5: /* make single user */
2408                 single_user();
2409                 break;
2410         case 7: /* boolean operation */
2411                 special_editmenu();
2412                 break;
2413         case 8: /* join objects */
2414                 join_menu();
2415                 break;
2416         case 9: /* convert object type */
2417                 convertmenu();
2418                 break;
2419         case 10: /* move to layer */
2420                 movetolayer();
2421                 break;
2422         case 11: /* insert keyframe */
2423                 common_insertkey();
2424                 break;
2425         case 15: /* Object Panel */
2426                 add_blockhandler(curarea, VIEW3D_HANDLER_OBJECT, UI_PNL_UNSTOW);
2427                 break;
2428 #ifdef WITH_VERSE
2429         case 16: /* Share Object at Verse server */
2430                 if(session_list.first != session_list.last) session = session_menu();
2431                 else session = session_list.first;
2432                 if(session) b_verse_push_object(session, ob);
2433                 break;
2434 #endif
2435         }
2436         allqueue(REDRAWVIEW3D, 0);
2437 }
2438
2439 static uiBlock *view3d_edit_objectmenu(void *arg_unused)
2440 {
2441         uiBlock *block;
2442         short yco= 0, menuwidth=120;
2443         
2444         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_objectmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
2445         uiBlockSetButmFunc(block, do_view3d_edit_objectmenu, NULL);
2446         
2447 #ifdef WITH_VERSE
2448         if(session_list.first != NULL) {
2449                 Base *base = BASACT;
2450                 Object *ob = NULL;
2451                 if (base) ob= base->object;
2452
2453                 if(ob && (ob->type == OB_MESH) && (!ob->vnode)) {
2454                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Share at Verse Server", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
2455                         uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2456                 }
2457         }
2458 #endif
2459         
2460
2461         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties|N",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 15, "");
2462         uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
2463         uiDefIconTextBlockBut(block, view3d_object_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
2464
2465         uiDefIconTextBlockBut(block, view3d_edit_object_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Clear/Apply", 0, yco-=20, 120, 19, "");
2466         uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
2467         
2468         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2469         
2470         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");  
2471         
2472         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2473         
2474         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2475         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate Linked|Alt D",                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2476         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete|X",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2477         
2478         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2479         
2480         uiDefIconTextBlockBut(block, view3d_edit_object_makelinksmenu, NULL, ICON_RIGHTARROW_THIN, "Make Links", 0, yco-=20, 120, 19, "");
2481         uiDefIconTextBlockBut(block, view3d_edit_object_singleusermenu, NULL, ICON_RIGHTARROW_THIN, "Make Single User", 0, yco-=20, 120, 19, "");
2482         uiDefIconTextBlockBut(block, view3d_edit_object_makelocalmenu, NULL, ICON_RIGHTARROW_THIN, "Make Local", 0, yco-=20, 120, 19, "");
2483         uiDefIconTextBlockBut(block, view3d_edit_object_copyattrmenu, NULL, ICON_RIGHTARROW_THIN, "Copy Attributes", 0, yco-=20, 120, 19, "");
2484         
2485         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2486         
2487         uiDefIconTextBlockBut(block, view3d_edit_object_parentmenu, NULL, ICON_RIGHTARROW_THIN, "Parent", 0, yco-=20, 120, 19, "");
2488         uiDefIconTextBlockBut(block, view3d_edit_object_groupmenu, NULL, ICON_RIGHTARROW_THIN, "Group", 0, yco-=20, 120, 19, "");
2489         uiDefIconTextBlockBut(block, view3d_edit_object_trackmenu, NULL, ICON_RIGHTARROW_THIN, "Track", 0, yco-=20, 120, 19, "");
2490         uiDefIconTextBlockBut(block, view3d_edit_object_constraintsmenu, NULL, ICON_RIGHTARROW_THIN, "Constraints", 0, yco-=20, 120, 19, "");
2491         
2492         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2493         
2494         if (OBACT && OBACT->type == OB_MESH) {
2495                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Boolean Operation...|W",                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2496         }
2497         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Join Objects|Ctrl J",                            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
2498         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Object Type...|Alt C",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2499         
2500         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2501         
2502         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move to Layer...|M",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
2503         uiDefIconTextBlockBut(block, view3d_edit_object_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Show/Hide Objects", 0, yco-=20, 120, 19, "");
2504         
2505         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2506         uiDefIconTextBlockBut(block, view3d_edit_object_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, "");
2507
2508                 
2509         if(curarea->headertype==HEADERTOP) {
2510                 uiBlockSetDirection(block, UI_DOWN);
2511         }
2512         else {
2513                 uiBlockSetDirection(block, UI_TOP);
2514                 uiBlockFlipOrder(block);
2515         }
2516
2517         uiTextBoundsBlock(block, 50);
2518         return block;
2519 }
2520
2521
2522 static void do_view3d_edit_propfalloffmenu(void *arg, int event)
2523 {
2524         
2525         G.scene->prop_mode= event;
2526         
2527         allqueue(REDRAWVIEW3D, 1);
2528 }
2529
2530 static uiBlock *view3d_edit_propfalloffmenu(void *arg_unused)
2531 {
2532         uiBlock *block;
2533         short yco = 20, menuwidth = 120;
2534
2535         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_propfalloffmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2536         uiBlockSetButmFunc(block, do_view3d_edit_propfalloffmenu, NULL);
2537         
2538         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, "");
2539         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Smooth|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SMOOTH, "");
2540         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, "");
2541         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Sphere|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SPHERE, "");
2542         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, "");
2543         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Root|Shift O",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_ROOT, "");
2544         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, "");
2545         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Sharp|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SHARP, "");
2546         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, "");
2547         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Linear|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_LIN, "");
2548         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, "");
2549         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Random|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_RANDOM, "");
2550         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, "");
2551         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Constant|Shift O",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_CONST, "");
2552                 
2553         uiBlockSetDirection(block, UI_RIGHT);
2554         uiTextBoundsBlock(block, 60);
2555         return block;
2556 }
2557
2558
2559 void do_view3d_edit_mesh_verticesmenu(void *arg, int event)
2560 {
2561         
2562         switch(event) {
2563         int count; 
2564         
2565         case 0: /* make vertex parent */
2566                 make_parent();
2567                 break;
2568         case 1: /* remove doubles */
2569                 count= removedoublesflag(1, 0, G.scene->toolsettings->doublimit);
2570                 notice("Removed: %d", count);
2571                 if (count) { /* only undo and redraw if an action is taken */
2572                         DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
2573                         BIF_undo_push("Rem Doubles");
2574                 }
2575                 break;
2576         case 2: /* smooth */
2577                 vertexsmooth();
2578                 break;
2579         case 3: /* separate */
2580                 separate_mesh();
2581                 break;
2582         case 4: /*split */
2583                 split_mesh();
2584                 break;
2585         case 5: /*merge */
2586                 mergemenu();
2587                 DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
2588                 break;
2589         case 6: /* add hook */
2590                 add_hook();
2591                 break;
2592         case 7: /* rip */
2593                 mesh_rip();
2594                 break;
2595         }
2596         allqueue(REDRAWVIEW3D, 0);
2597 }
2598
2599 static uiBlock *view3d_edit_mesh_verticesmenu(void *arg_unused)
2600 {
2601         uiBlock *block;
2602         short yco = 20, menuwidth = 120;
2603
2604         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mesh_verticesmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2605         uiBlockSetButmFunc(block, do_view3d_edit_mesh_verticesmenu, NULL);
2606         
2607         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Merge...|Alt M",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2608         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rip|V",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2609         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Split|Y",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2610         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Separate|P",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2611         
2612         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2613         
2614         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Smooth|W, Alt 1",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2615         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remove Doubles|W, 6",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2616         
2617         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2618
2619         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Vertex Parent|Ctrl P",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2620         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Hook|Ctrl H",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2621
2622         uiBlockSetDirection(block, UI_RIGHT);
2623         uiTextBoundsBlock(block, 60);
2624         return block;
2625 }
2626
2627 extern void editmesh_mark_sharp(int set); /* declared in editmesh_mods.c */
2628
2629 void do_view3d_edit_mesh_edgesmenu(void *arg, int event)
2630 {
2631         float fac;
2632         short randfac;
2633
2634         switch(event) {
2635                  
2636         case 0: /* subdivide smooth */
2637                 esubdivideflag(1, 0.0, G.scene->toolsettings->editbutflag | B_SMOOTH,1,0);
2638                 BIF_undo_push("Subdivide Smooth");
2639                 break;
2640         case 1: /*subdivide fractal */
2641                 randfac= 10;
2642                 if(button(&randfac, 1, 100, "Rand fac:")==0) return;
2643                 fac= -( (float)randfac )/100;
2644                 esubdivideflag(1, fac, G.scene->toolsettings->editbutflag,1,0);
2645                 BIF_undo_push("Subdivide Fractal");
2646                 break;
2647         case 2: /* subdivide */
2648                 esubdivideflag(1, 0.0, G.scene->toolsettings->editbutflag,1,0);
2649                 BIF_undo_push("Subdivide");
2650                 break;
2651         case 3: /* knife subdivide */
2652                 KnifeSubdivide(KNIFE_PROMPT);
2653                 break;
2654         case 4: /* Loop subdivide */
2655                 CutEdgeloop(1);
2656                 break;
2657         case 5: /* Make Edge/Face */
2658                 addedgeface_mesh();
2659                 break;
2660         case 6:
2661                 bevel_menu();
2662                 break;
2663         case 7: /* Mark Seam */
2664                 editmesh_mark_seam(0);
2665                 break;
2666         case 8: /* Clear Seam */
2667                 editmesh_mark_seam(1);
2668                 break;
2669         case 9: /* Cease SubSurf */
2670                 if(!multires_level1_test()) {
2671                         initTransform(TFM_CREASE, CTX_EDGE);
2672                         Transform();
2673                 }
2674                 break;
2675         case 10: /* Rotate Edge */
2676                 edge_rotate_selected(2);
2677                 break;
2678         case 11: /* Rotate Edge */
2679                 edge_rotate_selected(1);
2680                 break;
2681         case 12: /* Edgeslide */
2682                 EdgeSlide(0,0.0);
2683                 break;
2684         case 13: /* Edge Loop Delete */
2685                 EdgeLoopDelete();
2686                 break;
2687         case 14: /*Collapse Edges*/
2688                 collapseEdges();
2689                 BIF_undo_push("Collapse");
2690                 break;
2691         case 15:
2692                 editmesh_mark_sharp(1);
2693                 BIF_undo_push("Mark Sharp");
2694                 DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
2695                 break;
2696         case 16:
2697                 editmesh_mark_sharp(0);
2698                 BIF_undo_push("Clear Sharp");
2699                 DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
2700                 break;
2701         }
2702         allqueue(REDRAWVIEW3D, 0);
2703 }
2704
2705 static uiBlock *view3d_edit_mesh_edgesmenu(void *arg_unused)
2706 {
2707         uiBlock *block;
2708         short yco = 20, menuwidth = 120;
2709
2710         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mesh_edgesmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2711         uiBlockSetButmFunc(block, do_view3d_edit_mesh_edgesmenu, NULL);
2712         
2713         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2714         
2715         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2716         
2717         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel|W, Alt 2",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2718         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Loop Subdivide...|Ctrl R",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2719         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Knife Subdivide...|Shift K",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2720         
2721         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2722         
2723         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide|W, 1",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2724         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide Fractal|W, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2725         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide Smooth|W, 4",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2726
2727         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2728
2729         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mark Seam|Ctrl E",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2730         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Seam|Ctrl E",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
2731         
2732         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2733         
2734         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mark Sharp|Ctrl E",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
2735         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Sharp|Ctrl E",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
2736         
2737
2738         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2739         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Crease SubSurf|Shift E",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2740
2741         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2742
2743         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate Edge CW|Ctrl E",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
2744         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate Edge CCW|Ctrl E",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");  
2745
2746         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Slide Edge |Ctrl E",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");  
2747         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Edge Loop|X",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");  
2748
2749         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Collapse",                               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");  
2750         uiBlockSetDirection(block, UI_RIGHT);
2751         uiTextBoundsBlock(block, 60);
2752         return block;
2753 }
2754
2755 void do_view3d_edit_mesh_facesmenu(void *arg, int event)
2756 {
2757         switch(event) {
2758         case 0: /* Fill Faces */
2759                 fill_mesh();
2760                 break;
2761         case 1: /* Beauty Fill Faces */
2762                 beauty_fill();
2763                 break;
2764         case 2: /* Quads to Tris */
2765                 convert_to_triface(0);
2766                 allqueue(REDRAWVIEW3D, 0);
2767                 countall();
2768                 DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
2769                 break;
2770         case 3: /* Tris to Quads */
2771                 join_triangles();
2772                 break;
2773         case 4: /* Flip triangle edges */
2774                 edge_flip();
2775                 break;
2776         case 5: /* Make Edge/Face */
2777                 addedgeface_mesh();
2778                 break;
2779         case 6: /* Set Smooth */
2780                 mesh_set_smooth_faces(1);
2781                 break;
2782         case 7: /* Set Solid */
2783                 mesh_set_smooth_faces(0);
2784                 break;
2785         }
2786         allqueue(REDRAWVIEW3D, 0);
2787 }
2788
2789 static uiBlock *view3d_edit_mesh_facesmenu(void *arg_unused)
2790 {
2791         uiBlock *block;
2792         short yco = 20, menuwidth = 120;
2793
2794         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mesh_facesmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2795         uiBlockSetButmFunc(block, do_view3d_edit_mesh_facesmenu, NULL);
2796         
2797         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2798         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Fill|Shift F",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2799         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Beautify Fill|Alt F",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2800         
2801         
2802         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2803         
2804         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Quads to Triangles|Ctrl T",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2805         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Triangles to Quads|Alt J", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2806         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip Triangle Edges|Ctrl Shift F",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2807         
2808         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2809         
2810         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Smooth|W, Alt 3",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2811         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Solid|W, Alt 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2812         
2813         uiBlockSetDirection(block, UI_RIGHT);
2814         uiTextBoundsBlock(block, 60);
2815         return block;
2816 }
2817
2818 void do_view3d_edit_mesh_normalsmenu(void *arg, int event)
2819 {
2820         switch(event) {
2821         case 0: /* flip */
2822                 flip_editnormals();
2823                 break;
2824         case 1: /* recalculate inside */
2825                 righthandfaces(2);
2826                 break;
2827         case 2: /* recalculate outside */
2828                 righthandfaces(1);
2829                 break;
2830                 }
2831         allqueue(REDRAWVIEW3D, 0);
2832 }
2833
2834 static uiBlock *view3d_edit_mesh_normalsmenu(void *arg_unused)
2835 {
2836         uiBlock *block;
2837         short yco = 20, menuwidth = 120;
2838
2839         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mesh_normalsmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2840         uiBlockSetButmFunc(block, do_view3d_edit_mesh_normalsmenu, NULL);
2841         
2842         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recalculate Outside|Ctrl N",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2843         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recalculate Inside|Ctrl Shift N",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2844         
2845         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2846         
2847         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip|W, 0",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2848         
2849         uiBlockSetDirection(block, UI_RIGHT);
2850         uiTextBoundsBlock(block, 60);
2851         return block;
2852 }
2853
2854 void do_view3d_edit_mirrormenu(void *arg, int event)
2855 {
2856         switch(event) {
2857                 case 1:
2858                 case 2:
2859                 case 3:
2860                 case 4:
2861                 case 5:
2862                 case 6:
2863                 case 7:
2864                 case 8:
2865                 case 9:
2866                         Mirror(event);
2867                         break;
2868         }
2869         allqueue(REDRAWVIEW3D, 0);
2870 }
2871
2872 static uiBlock *view3d_edit_mirrormenu(void *arg_unused)
2873 {
2874         uiBlock *block;
2875         short yco = 20, menuwidth = 120;
2876
2877         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mirrormenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2878         uiBlockSetButmFunc(block, do_view3d_edit_mirrormenu, NULL);
2879         
2880         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|Ctrl M, 1",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2881         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|Ctrl M, 2",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2882         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|Ctrl M, 3",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2883         
2884         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2885         
2886         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|Ctrl M, 4",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2887         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, 5",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2888         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, 6",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2889         
2890         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2891         
2892         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X View|Ctrl M, 7",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2893         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y View|Ctrl M, 8",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
2894         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z View|Ctrl M, 9",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2895
2896         uiBlockSetDirection(block, UI_RIGHT);
2897         uiTextBoundsBlock(block, 60);
2898         return block;
2899 }
2900
2901 static void do_view3d_edit_mesh_showhidemenu(void *arg, int event)
2902 {
2903         
2904         switch(event) {
2905                  
2906         case 0: /* show hidden vertices */
2907                 reveal_mesh();
2908                 break;
2909         case 1: /* hide selected vertices */
2910                 hide_mesh(0);
2911                 break;
2912         case 2: /* hide deselected vertices */
2913                 hide_mesh(1);
2914                 break;
2915         }
2916         allqueue(REDRAWVIEW3D, 0);
2917 }
2918
2919 static uiBlock *view3d_edit_mesh_showhidemenu(void *arg_unused)
2920 {
2921         uiBlock *block;
2922         short yco = 20, menuwidth = 120;
2923
2924         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mesh_showhidemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2925         uiBlockSetButmFunc(block, do_view3d_edit_mesh_showhidemenu, NULL);
2926         
2927         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hidden|Alt H",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2928         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Selected|H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2929         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Deselected|Shift H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2930
2931         uiBlockSetDirection(block, UI_RIGHT);
2932         uiTextBoundsBlock(block, 60);
2933         return block;
2934 }
2935
2936 static void do_view3d_edit_mesh_scriptsmenu(void *arg, int event)
2937 {
2938         BPY_menu_do_python(PYMENU_MESH, event);
2939
2940         allqueue(REDRAWVIEW3D, 0);
2941 }
2942
2943 static uiBlock *view3d_edit_mesh_scriptsmenu(void *arg_unused)
2944 {
2945         uiBlock *block;
2946         short yco = 20, menuwidth = 120;
2947         BPyMenu *pym;
2948         int i = 0;
2949
2950         block= uiNewBlock(&curarea->uiblocks, "v3d_emesh_pymenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2951         uiBlockSetButmFunc(block, do_view3d_edit_mesh_scriptsmenu, NULL);
2952
2953         for (pym = BPyMenuTable[PYMENU_MESH]; pym; pym = pym->next, i++) {
2954                 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);
2955         }
2956
2957         uiBlockSetDirection(block, UI_RIGHT);
2958         uiTextBoundsBlock(block, 60);
2959
2960         return block;
2961 }
2962
2963 static void do_view3d_edit_meshmenu(void *arg, int event)
2964 {
2965 #ifdef WITH_VERSE
2966         struct VerseSession *session;
2967 #endif
2968
2969         switch(event) {
2970         
2971         case 0: /* Undo Editing */
2972                 BIF_undo();
2973                 break;
2974         case 1: /* Redo Editing */
2975                 BIF_redo();
2976                 break;
2977         case 2: /* transform properties */
2978                 add_blockhandler(curarea, VIEW3D_HANDLER_OBJECT, 0);
2979                 break;
2980         case 4: /* insert keyframe */
2981                 common_insertkey();
2982                 break;
2983         case 5: /* Extrude */
2984                 extrude_mesh();
2985                 break;
2986         case 6: /* duplicate */
2987                 duplicate_context_selected();
2988                 break;
2989         case 7: /* make edge face */
2990                 addedgeface_mesh();
2991                 break;
2992         case 8: /* delete */
2993                 delete_context_selected();
2994                 break;
2995         case 9: /* Shrink/Fatten Along Normals */
2996                 initTransform(TFM_SHRINKFATTEN, CTX_NONE);
2997                 Transform();
2998                 break;
2999         case 10: /* Shear */
3000                 initTransform(TFM_SHEAR, CTX_NONE);
3001                 Transform();
3002                 break;
3003         case 11: /* Warp */
3004                 initTransform(TFM_WARP, CTX_NONE);
3005                 Transform();
3006                 break;
3007         case 12: /* proportional edit (toggle) */
3008                 if(G.scene->proportional) G.scene->proportional= 0;
3009                 else G.scene->proportional= 1;
3010                 break;
3011         case 13: /* automerge edit (toggle) */
3012                 if(G.scene->automerge) G.scene->automerge= 0;
3013                 else G.scene->automerge= 1;
3014                 break;
3015 #ifdef WITH_VERSE
3016         case 14:
3017                 if(session_list.first != session_list.last) session = session_menu();
3018                 else session = session_list.first;
3019                 if(session) b_verse_push_object(session, G.obedit);
3020                 break;
3021 #endif
3022         case 15:
3023                 uv_autocalc_tface();
3024                 break;
3025         }
3026         allqueue(REDRAWVIEW3D, 0);
3027 }
3028
3029 static uiBlock *view3d_edit_meshmenu(void *arg_unused)
3030 {
3031
3032         uiBlock *block;
3033         short yco= 0, menuwidth=120;
3034                 
3035         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_meshmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
3036         uiBlockSetButmFunc(block, do_view3d_edit_meshmenu, NULL);
3037
3038 #ifdef WITH_VERSE
3039         if((session_list.first != NULL) && (!G.obedit->vnode)) {
3040                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Share at Verse Server",
3041                                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
3042                 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
3043         }
3044 #endif
3045
3046         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|Ctrl Z",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
3047         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Redo Editing|Ctrl Shift Z",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
3048         uiDefIconTextBlockBut(block, editmode_undohistorymenu, NULL, ICON_RIGHTARROW_THIN, "Undo History", 0, yco-=20, 120, 19, "");
3049         
3050         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
3051         
3052         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties...|N",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
3053         uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
3054         uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, 120, 19, "");
3055         uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
3056         
3057         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
3058         
3059         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
3060         
3061         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
3062         
3063         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "UV Unwrap|U",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
3064         
3065         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
3066         
3067         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extrude|E",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
3068         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
3069         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
3070         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete...|X",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
3071 &n