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