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