Patch #4955, Joshua Leung (aligorith)
[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 non-manifold */
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 sharp edges */
889                         select_sharp_edges();
890                         break;
891                 case 15: /* select linked flat faces */
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                 case 7: /* select/deselect first */
1022                         selectends_nurb(1);
1023                         break;
1024                 case 8: /* select/deselect last */ 
1025                         selectends_nurb(0);
1026                         break;
1027                 case 9: /* select more */
1028                         select_more_nurb();
1029                         break;
1030                 case 10: /* select less */
1031                         select_less_nurb();
1032                         break;
1033                 case 11: /* select next */
1034                         select_next_nurb();
1035                         break;
1036                 case 12: /* select previous */
1037                         select_prev_nurb();
1038                         break;
1039         }
1040         allqueue(REDRAWVIEW3D, 0);
1041 }
1042
1043
1044 static uiBlock *view3d_select_curvemenu(void *arg_unused)
1045 {
1046         uiBlock *block;
1047         short yco= 0, menuwidth=120;
1048         
1049         block= uiNewBlock(&curarea->uiblocks, "view3d_select_curvemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1050         uiBlockSetButmFunc(block, do_view3d_select_curvemenu, NULL);
1051         
1052         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1053         
1054         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1055         
1056         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1057         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1058         
1059         if (OBACT->type == OB_SURF) {
1060                 uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1061                 
1062                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Control Point Row|Shift R",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1063         }
1064         else {
1065                 uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1066                 
1067                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect First",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1068                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect Last",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
1069                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Next",                            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
1070                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Previous",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
1071         }
1072         
1073         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1074         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "More|Ctrl NumPad +",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
1075         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Less|Ctrl NumPad -",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
1076         
1077         /* commented out because it seems to only like the LKEY method - based on mouse pointer position :( */
1078         /*uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Connected Control Points|Ctrl L",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");*/
1079                 
1080         if(curarea->headertype==HEADERTOP) {
1081                 uiBlockSetDirection(block, UI_DOWN);
1082         }
1083         else {
1084                 uiBlockSetDirection(block, UI_TOP);
1085                 uiBlockFlipOrder(block);
1086         }
1087         
1088         uiTextBoundsBlock(block, 50);
1089         return block;
1090 }
1091
1092 static void do_view3d_select_metaballmenu(void *arg, int event)
1093 {
1094
1095         switch(event) {
1096                 case 0: /* border select */
1097                         borderselect();
1098                         break;
1099                 case 2: /* Select/Deselect all */
1100                         deselectall_mball();
1101                         break;
1102         }
1103         allqueue(REDRAWVIEW3D, 0);
1104 }
1105
1106
1107 static uiBlock *view3d_select_metaballmenu(void *arg_unused)
1108 {
1109         uiBlock *block;
1110         short yco= 0, menuwidth=120;
1111         
1112         block= uiNewBlock(&curarea->uiblocks, "view3d_select_metaballmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1113         uiBlockSetButmFunc(block, do_view3d_select_metaballmenu, NULL);
1114         
1115         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1116         
1117         uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1118         
1119         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1120                 
1121         if(curarea->headertype==HEADERTOP) {
1122                 uiBlockSetDirection(block, UI_DOWN);
1123         }
1124         else {
1125                 uiBlockSetDirection(block, UI_TOP);
1126                 uiBlockFlipOrder(block);
1127         }
1128
1129         uiTextBoundsBlock(block, 50);
1130         return block;
1131 }
1132
1133 static void do_view3d_select_latticemenu(void *arg, int event)
1134 {
1135 /*      extern void borderselect(void);*/
1136         
1137         switch(event) {
1138                         case 0: /* border select */
1139                         borderselect();
1140                         break;
1141                 case 2: /* Select/Deselect all */
1142                         deselectall_Latt();
1143                         break;
1144         }
1145         allqueue(REDRAWVIEW3D, 0);
1146 }
1147
1148 static uiBlock *view3d_select_latticemenu(void *arg_unused)
1149 {
1150         uiBlock *block;
1151         short yco= 0, menuwidth=120;
1152         
1153         block= uiNewBlock(&curarea->uiblocks, "view3d_select_latticemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1154         uiBlockSetButmFunc(block, do_view3d_select_latticemenu, NULL);
1155         
1156         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1157         
1158         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1159         
1160         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1161
1162         if(curarea->headertype==HEADERTOP) {
1163                 uiBlockSetDirection(block, UI_DOWN);
1164         }
1165         else {
1166                 uiBlockSetDirection(block, UI_TOP);
1167                 uiBlockFlipOrder(block);
1168         }
1169
1170         uiTextBoundsBlock(block, 50);
1171         return block;
1172 }
1173
1174 static void do_view3d_select_armaturemenu(void *arg, int event)
1175 {
1176 /*      extern void borderselect(void);*/
1177
1178         switch(event) {
1179                 case 0: /* border select */
1180                         borderselect();
1181                         break;
1182                 case 2: /* Select/Deselect all */
1183                         deselectall_armature(1);
1184                         break;
1185                 case 3: /* Select Parent(s) */  
1186                         select_bone_parent();
1187                         break;
1188         }
1189         allqueue(REDRAWVIEW3D, 0);
1190 }
1191
1192 static uiBlock *view3d_select_armaturemenu(void *arg_unused)
1193 {
1194         uiBlock *block;
1195         short yco= 0, menuwidth=120;
1196         
1197         block= uiNewBlock(&curarea->uiblocks, "view3d_select_armaturemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1198         uiBlockSetButmFunc(block, do_view3d_select_armaturemenu, NULL);
1199         
1200         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1201         
1202         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1203         
1204         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1205         
1206         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Parent(s)|P",                                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1207
1208         if(curarea->headertype==HEADERTOP) {
1209                 uiBlockSetDirection(block, UI_DOWN);
1210         }
1211         else {
1212                 uiBlockSetDirection(block, UI_TOP);
1213                 uiBlockFlipOrder(block);
1214         }
1215
1216         uiTextBoundsBlock(block, 50);
1217         return block;
1218 }
1219
1220 static void do_view3d_select_pose_armaturemenu(void *arg, int event)
1221 {
1222 /*      extern void borderselect(void);*/
1223         
1224         switch(event) {
1225         case 0: /* border select */
1226                 borderselect();
1227                 break;
1228         case 2: /* Select/Deselect all */
1229                 deselectall_posearmature(OBACT, 1);
1230                 break;
1231         case 3:
1232                 pose_select_constraint_target();
1233                 break;
1234         case 4:
1235                 select_bone_parent();
1236                 break;
1237         }
1238         allqueue(REDRAWVIEW3D, 0);
1239 }
1240
1241 static uiBlock *view3d_select_pose_armaturemenu(void *arg_unused)
1242 {
1243         uiBlock *block;
1244         short yco= 0, menuwidth=120;
1245         
1246         block= uiNewBlock(&curarea->uiblocks, "view3d_select_pose_armaturemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1247         uiBlockSetButmFunc(block, do_view3d_select_pose_armaturemenu, NULL);
1248         
1249         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1250         
1251         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1252         
1253         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1254         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Constraint Target|W",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1255         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Parent(s)|P",                                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1256
1257         if(curarea->headertype==HEADERTOP) {
1258                 uiBlockSetDirection(block, UI_DOWN);
1259         }
1260         else {
1261                 uiBlockSetDirection(block, UI_TOP);
1262                 uiBlockFlipOrder(block);
1263         }
1264
1265         uiTextBoundsBlock(block, 50);
1266         return block;
1267 }
1268
1269 void do_view3d_select_faceselmenu(void *arg, int event)
1270 {
1271         /* events >= 6 are registered bpython scripts */
1272         if (event >= 6) BPY_menu_do_python(PYMENU_FACESELECT, event - 6);
1273
1274         switch(event) {
1275                 case 0: /* border select */
1276                         borderselect();
1277                         break;
1278                 case 2: /* Select/Deselect all */
1279                         deselectall_tface();
1280                         break;
1281                 case 3: /* Select Inverse */
1282                         selectswap_tface();
1283                         break;
1284                 case 4: /* Select Same UV */
1285                         get_same_uv();
1286                         break;
1287                 case 5: /* Select Linked */
1288                         select_linked_tfaces(2);
1289                         break;
1290         }
1291         allqueue(REDRAWVIEW3D, 0);
1292 }
1293
1294 static uiBlock *view3d_select_faceselmenu(void *arg_unused)
1295 {
1296         uiBlock *block;
1297         short yco= 0, menuwidth=120;
1298         BPyMenu *pym;
1299         int i = 0;
1300
1301         block= uiNewBlock(&curarea->uiblocks, "view3d_select_faceselmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1302         uiBlockSetButmFunc(block, do_view3d_select_faceselmenu, NULL);
1303         
1304         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1305         
1306         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1307         
1308         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1309         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1310         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Same UV",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1311
1312         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1313         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Linked Faces|Ctrl L",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1314
1315         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1316
1317         /* note that we account for the 6 previous entries with i+6: */
1318         for (pym = BPyMenuTable[PYMENU_FACESELECT]; pym; pym = pym->next, i++) {
1319                 uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20,
1320                         menuwidth, 19, NULL, 0.0, 0.0, 1, i+6,
1321                         pym->tooltip?pym->tooltip:pym->filename);
1322         }
1323
1324         if(curarea->headertype==HEADERTOP) {
1325                 uiBlockSetDirection(block, UI_DOWN);
1326         }
1327         else {
1328                 uiBlockSetDirection(block, UI_TOP);
1329                 uiBlockFlipOrder(block);
1330         }
1331
1332         uiTextBoundsBlock(block, 50);
1333         return block;
1334 }
1335
1336 void do_view3d_edit_snapmenu(void *arg, int event)
1337 {
1338         switch(event) {
1339         case 1: /* Selection to grid */
1340             snap_sel_to_grid();
1341             break;
1342         case 2: /* Selection to cursor */
1343             snap_sel_to_curs();
1344             break;          
1345         case 3: /* Cursor to grid */
1346             snap_curs_to_grid();
1347             break;
1348         case 4: /* Cursor to selection */
1349             snap_curs_to_sel();
1350             break;
1351         case 5: /* Selection to center of selection*/
1352             snap_to_center();
1353             break;
1354         }
1355         allqueue(REDRAWVIEW3D, 0);
1356 }
1357
1358 static uiBlock *view3d_edit_snapmenu(void *arg_unused)
1359 {
1360         uiBlock *block;
1361         short yco = 20, menuwidth = 120;
1362
1363         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_snapmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1364         uiBlockSetButmFunc(block, do_view3d_edit_snapmenu, NULL);
1365         
1366         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selection -> Grid|Shift S, 1",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1367         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selection -> Cursor|Shift S, 2",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1368         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cursor -> Grid|Shift S, 3",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1369         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cursor -> Selection|Shift S, 4",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1370         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selection -> Center|Shift S, 5",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1371         
1372         
1373         uiBlockSetDirection(block, UI_RIGHT);
1374         uiTextBoundsBlock(block, 60);
1375         return block;
1376 }
1377
1378 void do_view3d_transform_moveaxismenu(void *arg, int event)
1379 {
1380         float mat[3][3];
1381         
1382         Mat3One(mat);
1383         
1384         switch(event)
1385         {
1386             case 0: /* X Global */
1387                         initTransform(TFM_TRANSLATION, CTX_NONE);
1388                         BIF_setSingleAxisConstraint(mat[0], " X");
1389                         Transform();
1390                         break;
1391                 case 1: /* Y Global */
1392                         initTransform(TFM_TRANSLATION, CTX_NONE);
1393                         BIF_setSingleAxisConstraint(mat[1], " Y");
1394                         Transform();
1395                         break;
1396                 case 2: /* Z Global */
1397                         initTransform(TFM_TRANSLATION, CTX_NONE);
1398                         BIF_setSingleAxisConstraint(mat[2], " Z");
1399                         Transform();
1400                         break;
1401                 case 3: /* X Local */
1402                         initTransform(TFM_TRANSLATION, CTX_NONE);
1403                         BIF_setLocalAxisConstraint('X', " X");
1404                         Transform();
1405                         break;
1406                 case 4: /* Y Local */
1407                         initTransform(TFM_TRANSLATION, CTX_NONE);
1408                         BIF_setLocalAxisConstraint('Y', " Y");
1409                         Transform();
1410                         break;
1411                 case 5: /* Z Local */
1412                         initTransform(TFM_TRANSLATION, CTX_NONE);
1413                         BIF_setLocalAxisConstraint('Z', " Z");
1414                         Transform();
1415                         break;
1416         }
1417         allqueue(REDRAWVIEW3D, 0);
1418 }
1419
1420 static uiBlock *view3d_transform_moveaxismenu(void *arg_unused)
1421 {
1422         uiBlock *block;
1423         short yco = 20, menuwidth = 120;
1424
1425         block= uiNewBlock(&curarea->uiblocks, "view3d_transform_moveaxismenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1426         uiBlockSetButmFunc(block, do_view3d_transform_moveaxismenu, NULL);
1427
1428         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|G, X",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1429         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|G, Y",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1430         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|G, Z",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1431         
1432         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1433         
1434         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|G, X, X",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1435         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|G, Y, Y",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1436         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|G, Z, Z",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1437         
1438         
1439         uiBlockSetDirection(block, UI_RIGHT);
1440         uiTextBoundsBlock(block, 60);
1441         return block;
1442 }
1443
1444 void do_view3d_transform_rotateaxismenu(void *arg, int event)
1445 {
1446         float mat[3][3];
1447         
1448         Mat3One(mat);
1449         
1450         switch(event)
1451         {
1452             case 0: /* X Global */
1453                         initTransform(TFM_ROTATION, CTX_NONE);
1454                         BIF_setSingleAxisConstraint(mat[0], " X");
1455                         Transform();
1456                         break;
1457                 case 1: /* Y Global */
1458                         initTransform(TFM_ROTATION, CTX_NONE);
1459                         BIF_setSingleAxisConstraint(mat[1], " Y");
1460                         Transform();
1461                         break;
1462                 case 2: /* Z Global */
1463                         initTransform(TFM_ROTATION, CTX_NONE);
1464                         BIF_setSingleAxisConstraint(mat[2], " Z");
1465                         Transform();
1466                         break;
1467                 case 3: /* X Local */
1468                         initTransform(TFM_ROTATION, CTX_NONE);
1469                         BIF_setLocalAxisConstraint('X', " X");
1470                         Transform();
1471                         break;
1472                 case 4: /* Y Local */
1473                         initTransform(TFM_ROTATION, CTX_NONE);
1474                         BIF_setLocalAxisConstraint('Y', " Y");
1475                         Transform();
1476                         break;
1477                 case 5: /* Z Local */
1478                         initTransform(TFM_ROTATION, CTX_NONE);
1479                         BIF_setLocalAxisConstraint('Z', " Z");
1480                         Transform();
1481                         break;
1482         }
1483         allqueue(REDRAWVIEW3D, 0);
1484 }
1485
1486 static uiBlock *view3d_transform_rotateaxismenu(void *arg_unused)
1487 {
1488         uiBlock *block;
1489         short yco = 20, menuwidth = 120;
1490
1491         block= uiNewBlock(&curarea->uiblocks, "view3d_transform_rotateaxismenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1492         uiBlockSetButmFunc(block, do_view3d_transform_rotateaxismenu, NULL);
1493
1494         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|R, X",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1495         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|R, Y",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1496         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|R, Z",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1497         
1498         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1499         
1500         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|R, X, X",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1501         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|R, Y, Y",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1502         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|R, Z, Z",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1503         
1504         
1505         uiBlockSetDirection(block, UI_RIGHT);
1506         uiTextBoundsBlock(block, 60);
1507         return block;
1508 }
1509
1510 void do_view3d_transform_scaleaxismenu(void *arg, int event)
1511 {
1512         float mat[3][3];
1513         
1514         Mat3One(mat);
1515         
1516         switch(event)
1517         {
1518             case 0: /* X Global */
1519                         initTransform(TFM_RESIZE, CTX_NONE);
1520                         BIF_setSingleAxisConstraint(mat[0], " X");
1521                         Transform();
1522                         break;
1523                 case 1: /* Y Global */
1524                         initTransform(TFM_RESIZE, CTX_NONE);
1525                         BIF_setSingleAxisConstraint(mat[1], " Y");
1526                         Transform();
1527                         break;
1528                 case 2: /* Z Global */
1529                         initTransform(TFM_RESIZE, CTX_NONE);
1530                         BIF_setSingleAxisConstraint(mat[2], " Z");
1531                         Transform();
1532                         break;
1533                 case 3: /* X Local */
1534                         initTransform(TFM_RESIZE, CTX_NONE);
1535                         BIF_setLocalAxisConstraint('X', " X");
1536                         Transform();
1537                         break;
1538                 case 4: /* Y Local */
1539                         initTransform(TFM_RESIZE, CTX_NONE);
1540                         BIF_setLocalAxisConstraint('X', " X");
1541                         Transform();
1542                         break;
1543                 case 5: /* Z Local */
1544                         initTransform(TFM_RESIZE, CTX_NONE);
1545                         BIF_setLocalAxisConstraint('X', " X");
1546                         Transform();
1547                         break;
1548         }
1549         allqueue(REDRAWVIEW3D, 0);
1550 }
1551
1552 static uiBlock *view3d_transform_scaleaxismenu(void *arg_unused)
1553 {
1554         uiBlock *block;
1555         short yco = 20, menuwidth = 120;
1556
1557         block= uiNewBlock(&curarea->uiblocks, "view3d_transform_scaleaxismenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1558         uiBlockSetButmFunc(block, do_view3d_transform_scaleaxismenu, NULL);
1559
1560         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|S, X",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1561         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|S, Y",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1562         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|S, Z",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1563         
1564         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1565         
1566         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|S, X, X",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1567         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|S, Y, Y",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1568         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|S, Z, Z",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1569         
1570         
1571         uiBlockSetDirection(block, UI_RIGHT);
1572         uiTextBoundsBlock(block, 60);
1573         return block;
1574 }
1575
1576 static void do_view3d_transformmenu(void *arg, int event)
1577 {
1578         switch(event) {
1579         case 1:
1580                 initTransform(TFM_TRANSLATION, CTX_NONE);
1581                 Transform();
1582                 break;
1583         case 2:
1584                 initTransform(TFM_ROTATION, CTX_NONE);
1585                 Transform();
1586                 break;
1587         case 3:
1588                 initTransform(TFM_RESIZE, CTX_NONE);
1589                 Transform();
1590                 break;
1591         case 4:
1592                 image_aspect();
1593                 break;
1594         case 5:
1595                 initTransform(TFM_TOSPHERE, CTX_NONE);
1596                 Transform();
1597                 break;
1598         case 6:
1599                 initTransform(TFM_SHEAR, CTX_NONE);
1600                 Transform();
1601                 break;
1602         case 7:
1603                 initTransform(TFM_WARP, CTX_NONE);
1604                 Transform();
1605                 break;
1606         case 8:
1607                 initTransform(TFM_PUSHPULL, CTX_NONE);
1608                 Transform();
1609                 break;
1610         case 9:
1611                 if (G.obedit) {
1612                         if (G.obedit->type == OB_MESH)
1613                                 initTransform(TFM_SHRINKFATTEN, CTX_NONE);
1614                                 Transform();
1615                 } else error("Only meshes can be shrinked/fattened");
1616                 break;
1617         case 10:
1618                 docentre(0);
1619                 break;
1620         case 11:
1621                 docentre_new();
1622                 break;
1623         case 12:
1624                 docentre_cursor();
1625                 break;
1626         case 13:
1627                 initTransform(TFM_TILT, CTX_NONE);
1628                 Transform();
1629                 break;
1630         case 14:
1631                 initTransform(TFM_CURVE_SHRINKFATTEN, CTX_NONE);
1632                 Transform();
1633                 break;
1634         }
1635         allqueue(REDRAWVIEW3D, 0);
1636 }
1637
1638 static uiBlock *view3d_transformmenu(void *arg_unused)
1639 {
1640         uiBlock *block;
1641         short yco = 20, menuwidth = 120;
1642
1643         block= uiNewBlock(&curarea->uiblocks, "view3d_transformmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1644         uiBlockSetButmFunc(block, do_view3d_transformmenu, NULL);
1645
1646         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move|G",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1647         uiDefIconTextBlockBut(block, view3d_transform_moveaxismenu, NULL, ICON_RIGHTARROW_THIN, "Grab/Move on Axis", 0, yco-=20, 120, 19, "");
1648                 
1649         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate|R",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1650         uiDefIconTextBlockBut(block, view3d_transform_rotateaxismenu, NULL, ICON_RIGHTARROW_THIN, "Rotate on Axis", 0, yco-=20, 120, 19, "");
1651
1652         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale|S",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1653         uiDefIconTextBlockBut(block, view3d_transform_scaleaxismenu, NULL, ICON_RIGHTARROW_THIN, "Scale on Axis", 0, yco-=20, 120, 19, "");
1654
1655         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1656         
1657         if (G.obedit) {
1658                 if (G.obedit->type == OB_MESH)
1659                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shrink/Fatten Along Normals|Alt S",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
1660                 else if (G.obedit->type == OB_CURVE) {
1661                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Tilt|T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
1662                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shrink/Fatten Radius|Alt S",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
1663                 }
1664         }
1665         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "To Sphere|Ctrl Shift S",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1666         if (G.obedit) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl S",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1667         else uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl Shift Alt S",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1668         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Warp|Shift W",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1669         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Push/Pull|Shift P",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
1670         
1671         if (!G.obedit) {
1672                 uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1673                 
1674                 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, "");
1675         }
1676         
1677         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1678
1679         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "ObData to Center",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
1680         if (!G.obedit) {
1681                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center New",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
1682                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center Cursor",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
1683         }
1684         
1685         uiBlockSetDirection(block, UI_RIGHT);
1686         uiTextBoundsBlock(block, 60);
1687         return block;
1688 }
1689
1690 void do_view3d_object_mirrormenu(void *arg, int event)
1691 {
1692         switch(event) {
1693                 case 1:
1694                 case 2:
1695                 case 3:
1696                         Mirror(event + 3); /* + 3 because the first three modes are global*/
1697                         break;
1698         }
1699         allqueue(REDRAWVIEW3D, 0);
1700 }
1701
1702 static uiBlock *view3d_object_mirrormenu(void *arg_unused)
1703 {
1704         uiBlock *block;
1705         short yco = 20, menuwidth = 120;
1706
1707         block= uiNewBlock(&curarea->uiblocks, "view3d_object_mirrormenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1708         uiBlockSetButmFunc(block, do_view3d_object_mirrormenu, NULL);
1709         
1710         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|Ctrl M, 1",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1711         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, 2",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1712         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, 3",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1713
1714         uiBlockSetDirection(block, UI_RIGHT);
1715         uiTextBoundsBlock(block, 60);
1716         return block;
1717 }
1718
1719 static void do_view3d_edit_object_transformmenu(void *arg, int event)
1720 {
1721         switch(event) {
1722         case 0: /*      clear origin */
1723                 clear_object('o');
1724                 break;
1725         case 1: /* clear scale */
1726                 clear_object('s');
1727                 break;
1728         case 2: /* clear rotation */
1729                 clear_object('r');
1730                 break;
1731         case 3: /* clear location */
1732                 clear_object('g');
1733                 break;
1734         case 4:
1735                 if(OBACT) object_apply_deform(OBACT);
1736                 break;
1737         case 5: /* make duplis real */
1738                 make_duplilist_real();
1739                 break;
1740         case 6: /* apply scale/rotation or deformation */
1741                 apply_object();
1742                 break;  
1743         }
1744         allqueue(REDRAWVIEW3D, 0);
1745 }
1746
1747 static uiBlock *view3d_edit_object_transformmenu(void *arg_unused)
1748 {
1749         uiBlock *block;
1750         short yco = 20, menuwidth = 120;
1751
1752         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_transformmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1753         uiBlockSetButmFunc(block, do_view3d_edit_object_transformmenu, NULL);
1754         
1755         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Scale/Rotation|Ctrl A",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1756         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Deformation|Ctrl Shift A",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1757         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Duplicates Real|Ctrl Shift A",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1758         
1759         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1760         
1761         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Location|Alt G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1762         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Rotation|Alt R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1763         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Scale|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1764         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Origin|Alt O",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1765         
1766         uiBlockSetDirection(block, UI_RIGHT);
1767         uiTextBoundsBlock(block, 60);
1768         return block;
1769 }
1770
1771 static void do_view3d_edit_object_makelocalmenu(void *arg, int event)
1772 {
1773         switch(event) {
1774                 case 1:
1775                 case 2:
1776                 case 3:
1777                         make_local(event);
1778                         break;
1779         }
1780 }
1781
1782 static uiBlock *view3d_edit_object_makelocalmenu(void *arg_unused)
1783 {       
1784         uiBlock *block;
1785         short yco = 20, menuwidth = 120;
1786         
1787         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_makelocalmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1788         uiBlockSetButmFunc(block, do_view3d_edit_object_makelocalmenu, NULL);
1789         
1790         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selected Objects|L, 1",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1791         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selected Objects and Data|L, 2",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1792         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "All|L, 3",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1793         
1794         uiBlockSetDirection(block, UI_RIGHT);
1795         uiTextBoundsBlock(block, 60);
1796         return block;
1797 }
1798
1799 static void do_view3d_edit_object_makelinksmenu(void *arg, int event)
1800 {
1801         switch(event) {
1802         case 1:
1803         case 2:
1804         case 3:
1805         case 4:
1806                 make_links((short)event);
1807                 break;
1808                 }
1809         allqueue(REDRAWVIEW3D, 0);
1810 }
1811
1812 static uiBlock *view3d_edit_object_makelinksmenu(void *arg_unused)
1813 {
1814         Object *ob=NULL;
1815         
1816         uiBlock *block;
1817         short yco = 20, menuwidth = 120;
1818
1819         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_makelinksmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1820         uiBlockSetButmFunc(block, do_view3d_edit_object_makelinksmenu, NULL);
1821         
1822         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "To Scene...|Ctrl L, 1",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1823         
1824         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1825         
1826         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Ipo|Ctrl L, 2",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1827         
1828         if ((ob=OBACT)) {
1829         
1830                 if(ob->type==OB_MESH) {
1831                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mesh Data|Ctrl L, 3",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1832                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1833                 } else if(ob->type==OB_CURVE) {
1834                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve Data|Ctrl L, 3",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1835                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1836                 } else if(ob->type==OB_FONT) {
1837                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Text Data|Ctrl L, 3",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1838                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1839                 } else if(ob->type==OB_SURF) {
1840                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Surface Data|Ctrl L, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1841                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1842                 } else if(ob->type==OB_MBALL) {
1843                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1844                 } else if(ob->type==OB_CAMERA) {
1845                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera Data|Ctrl L, 3",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1846                 } else if(ob->type==OB_LAMP) {
1847                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lamp Data|Ctrl L, 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1848                 } else if(ob->type==OB_LATTICE) {
1849                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lattice Data|Ctrl L, 3",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1850                 } else if(ob->type==OB_ARMATURE) {
1851                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Armature Data|Ctrl L, 3",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1852                 }
1853         }
1854         
1855         uiBlockSetDirection(block, UI_RIGHT);
1856         uiTextBoundsBlock(block, 60);
1857         return block;
1858 }
1859
1860 static void do_view3d_edit_object_singleusermenu(void *arg, int event)
1861 {
1862         switch(event) {
1863         case 1: /* Object */
1864                 single_object_users(1);
1865                 break;
1866         case 2: /* Object & ObData */ 
1867                 single_object_users(1);
1868                 single_obdata_users(1);
1869                 break;
1870         case 3: /* Object & ObData & Materials+Tex */
1871                 single_object_users(1);
1872                 single_obdata_users(1);
1873                 single_mat_users(1); /* also tex */
1874                 break;
1875         case 4: /* Materials+Tex */
1876                 single_mat_users(1);
1877                 break;
1878         }
1879         
1880         clear_id_newpoins();
1881         countall();
1882         
1883         allqueue(REDRAWALL, 0);
1884 }
1885
1886 static uiBlock *view3d_edit_object_singleusermenu(void *arg_unused)
1887 {
1888
1889         uiBlock *block;
1890         short yco = 20, menuwidth = 120;
1891
1892         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_singleusermenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1893         uiBlockSetButmFunc(block, do_view3d_edit_object_singleusermenu, NULL);
1894         
1895         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object|U, 1",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1896         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object & ObData|U, 2",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1897         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object & ObData & Materials+Tex|U, 3",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1898         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials+Tex|U, 4",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1899         
1900         uiBlockSetDirection(block, UI_RIGHT);
1901         uiTextBoundsBlock(block, 60);
1902         return block;
1903 }
1904
1905 static void do_view3d_edit_object_copyattrmenu(void *arg, int event)
1906 {
1907         switch(event) {
1908         case 1:
1909         case 2:
1910         case 3:
1911         case 4:
1912         case 5:
1913         case 6:
1914         case 7:
1915         case 8:
1916         case 9:
1917         case 10:
1918         case 11:
1919         case 17:
1920         case 18:
1921         case 19:
1922         case 20:
1923         case 21:
1924         case 22:
1925         case 23:
1926         case 24:
1927         case 25:
1928         case 26:
1929                 copy_attr((short)event);
1930                 break;
1931                 }
1932         allqueue(REDRAWVIEW3D, 0);
1933 }
1934
1935 static uiBlock *view3d_edit_object_copyattrmenu(void *arg_unused)
1936 {
1937         Object *ob=NULL;
1938         
1939         uiBlock *block;
1940         short yco = 20, menuwidth = 120;
1941
1942         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_copyattrmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1943         uiBlockSetButmFunc(block, do_view3d_edit_object_copyattrmenu, NULL);
1944         
1945         ob= OBACT;
1946         
1947         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Location|Ctrl C, 1",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1948         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotation|Ctrl C, 2",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1949         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Size|Ctrl C, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1950         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Drawtype|Ctrl C, 4",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1951         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Time Offset|Ctrl C, 5",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1952         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Dupli|Ctrl C, 6",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1953         
1954         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1955         
1956         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mass|Ctrl C, 7",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1957         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Damping|Ctrl C, 8",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
1958         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Properties|Ctrl C, 9",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
1959         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Logic Bricks|Ctrl C, 10",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
1960         
1961         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1962         
1963         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Constraints|Ctrl C",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
1964         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NLA Strips|Ctrl C",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 26, "");
1965         
1966         if (ob) {
1967         
1968                 if ((ob->type == OB_MESH) || (ob->type == OB_CURVE) || (ob->type == OB_SURF) ||
1969                                 (ob->type == OB_FONT) || (ob->type == OB_MBALL)) {
1970                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Texture Space|Ctrl C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
1971                 }       
1972                 
1973                 if(ob->type == OB_FONT) {
1974                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Font Settings|Ctrl C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
1975                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel Settings|Ctrl C",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1976                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve Resolution|Ctrl C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
1977                 }
1978                 if(ob->type == OB_CURVE) {
1979                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel Settings|Ctrl C",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1980                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve Resolution|Ctrl C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
1981                 }
1982         
1983                 if(ob->type==OB_MESH) {
1984                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdiv|Ctrl C",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 21, "");
1985                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Modifiers ...|Ctrl C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 24, "");
1986                 }
1987         
1988                 if( give_parteff(ob) ) {
1989                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Particle Settings|Ctrl C",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
1990                 }
1991         }
1992         
1993         uiBlockSetDirection(block, UI_RIGHT);
1994         uiTextBoundsBlock(block, 60);
1995         return block;
1996 }
1997
1998
1999 static void do_view3d_edit_object_parentmenu(void *arg, int event)
2000 {
2001         switch(event) {
2002         case 0: /* clear parent */
2003                 clear_parent();
2004                 break;
2005         case 1: /* make parent */
2006                 make_parent();
2007                 break;
2008                 }
2009         allqueue(REDRAWVIEW3D, 0);
2010 }
2011
2012 static uiBlock *view3d_edit_object_parentmenu(void *arg_unused)
2013 {
2014         uiBlock *block;
2015         short yco = 20, menuwidth = 120;
2016
2017         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_parentmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2018         uiBlockSetButmFunc(block, do_view3d_edit_object_parentmenu, NULL);
2019         
2020         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Parent...|Ctrl P",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2021         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Parent...|Alt P",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2022
2023         uiBlockSetDirection(block, UI_RIGHT);
2024         uiTextBoundsBlock(block, 60);
2025         return block;
2026 }
2027
2028 static void do_view3d_edit_object_groupmenu(void *arg, int event)
2029 {
2030         switch(event) {
2031                 case 1:
2032                 case 2:
2033                 case 3:
2034                         group_operation(event);
2035                         break;
2036         }
2037         allqueue(REDRAWVIEW3D, 0);
2038 }
2039
2040 static uiBlock *view3d_edit_object_groupmenu(void *arg_unused)
2041 {
2042         uiBlock *block;
2043         short yco = 20, menuwidth = 120;
2044         
2045         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_groupmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2046         uiBlockSetButmFunc(block, do_view3d_edit_object_groupmenu, NULL);
2047         
2048         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, "");
2049         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, "");
2050         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, "");
2051         
2052         uiBlockSetDirection(block, UI_RIGHT);
2053         uiTextBoundsBlock(block, 60);
2054         return block;
2055 }
2056
2057 static void do_view3d_edit_object_trackmenu(void *arg, int event)
2058 {
2059         switch(event) {
2060         case 0: /* clear track */
2061                 clear_track();
2062                 break;
2063         case 1: /* make track */
2064                 make_track();
2065                 break;
2066                 }
2067         allqueue(REDRAWVIEW3D, 0);
2068 }
2069
2070 static uiBlock *view3d_edit_object_trackmenu(void *arg_unused)
2071 {
2072         uiBlock *block;
2073         short yco = 20, menuwidth = 120;
2074
2075         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_trackmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2076         uiBlockSetButmFunc(block, do_view3d_edit_object_trackmenu, NULL);
2077         
2078         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Track...|Ctrl T",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2079         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Track...|Alt T",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2080         
2081         uiBlockSetDirection(block, UI_RIGHT);
2082         uiTextBoundsBlock(block, 60);
2083         return block;
2084 }
2085
2086 static void do_view3d_edit_object_constraintsmenu(void *arg, int event)
2087 {
2088         switch(event) {
2089         case 1: /* add constraint */
2090                 add_constraint(0);
2091                 break;
2092         case 2: /* clear constraint */
2093                 ob_clear_constraints();
2094                 break;
2095                 }
2096         allqueue(REDRAWVIEW3D, 0);
2097 }
2098
2099 static uiBlock *view3d_edit_object_constraintsmenu(void *arg_unused)
2100 {
2101         uiBlock *block;
2102         short yco = 20, menuwidth = 120;
2103
2104         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_constraintsmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2105         uiBlockSetButmFunc(block, do_view3d_edit_object_constraintsmenu, NULL);
2106         
2107         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Constraint...|Ctrl Alt C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2108         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Constraints",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2109         
2110         uiBlockSetDirection(block, UI_RIGHT);
2111         uiTextBoundsBlock(block, 60);
2112         return block;
2113 }
2114
2115 static void do_view3d_edit_object_scriptsmenu(void *arg, int event)
2116 {
2117         BPY_menu_do_python(PYMENU_OBJECT, event);
2118
2119         allqueue(REDRAWVIEW3D, 0);
2120 }
2121
2122 static uiBlock *view3d_edit_object_scriptsmenu(void *arg_unused)
2123 {
2124         uiBlock *block;
2125         short yco = 20, menuwidth = 120;
2126         BPyMenu *pym;
2127         int i = 0;
2128
2129         block= uiNewBlock(&curarea->uiblocks, "v3d_eobject_pymenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2130         uiBlockSetButmFunc(block, do_view3d_edit_object_scriptsmenu, NULL);
2131
2132         for (pym = BPyMenuTable[PYMENU_OBJECT]; pym; pym = pym->next, i++) {
2133                 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);
2134         }
2135
2136         uiBlockSetDirection(block, UI_RIGHT);
2137         uiTextBoundsBlock(block, 60);
2138
2139         return block;
2140 }
2141
2142 #ifdef WITH_VERSE
2143 extern ListBase session_list;
2144 #endif
2145
2146 static void do_view3d_edit_objectmenu(void *arg, int event)
2147 {
2148         /* needed to check for valid selected objects */
2149         Base *base=NULL;
2150         Object *ob=NULL;
2151 #ifdef WITH_VERSE
2152         struct VerseSession *session=NULL;
2153 #endif
2154
2155         base= BASACT;
2156         if (base) ob= base->object;
2157         
2158         switch(event) {
2159          
2160         case 0: /* transform    properties*/
2161                 mainqenter(NKEY, 1);
2162                 break;
2163         case 1: /* delete */
2164                 delete_context_selected();
2165                 break;
2166         case 2: /* duplicate */
2167                 duplicate_context_selected();
2168                 break;
2169         case 3: /* duplicate linked */
2170                 adduplicate(0, 0);
2171                 break;
2172         case 5: /* make single user */
2173                 single_user();
2174                 break;
2175         case 7: /* boolean operation */
2176                 special_editmenu();
2177                 break;
2178         case 8: /* join objects */
2179                 join_menu();
2180                 break;
2181         case 9: /* convert object type */
2182                 convertmenu();
2183                 break;
2184         case 10: /* move to layer */
2185                 movetolayer();
2186                 break;
2187         case 11: /* insert keyframe */
2188                 common_insertkey();
2189                 break;
2190         case 15: /* Object Panel */
2191                 add_blockhandler(curarea, VIEW3D_HANDLER_OBJECT, UI_PNL_UNSTOW);
2192                 break;
2193 #ifdef WITH_VERSE
2194         case 16: /* Share Object at Verse server */
2195                 if(session_list.first != session_list.last) session = session_menu();
2196                 else session = session_list.first;
2197                 if(session) b_verse_push_object(session, ob);
2198                 break;
2199 #endif
2200         case 17: /* Transform snap to grid */
2201                 G.vd->flag2 ^= V3D_TRANSFORM_SNAP;
2202                 break;
2203         case 18:
2204                 add_blockhandler(curarea, VIEW3D_HANDLER_MULTIRES, 0);
2205                 break;
2206         }
2207         allqueue(REDRAWVIEW3D, 0);
2208 }
2209
2210 static uiBlock *view3d_edit_objectmenu(void *arg_unused)
2211 {
2212         uiBlock *block;
2213         short yco= 0, menuwidth=120;
2214         
2215         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_objectmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
2216         uiBlockSetButmFunc(block, do_view3d_edit_objectmenu, NULL);
2217         
2218 #ifdef WITH_VERSE
2219         if(session_list.first != NULL) {
2220                 Base *base = BASACT;
2221                 Object *ob = NULL;
2222                 if (base) ob= base->object;
2223
2224                 if(ob && (ob->type == OB_MESH) && (!ob->vnode)) {
2225                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Share at Verse Server", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
2226                         uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2227                 }
2228         }
2229 #endif
2230
2231         if (G.vd->flag2 & V3D_TRANSFORM_SNAP)
2232                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Transform Snap",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
2233         else
2234                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Transform Snap",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
2235         
2236
2237         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties|N",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 15, "");
2238         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Multires Properties",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 18, "");
2239         uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
2240         uiDefIconTextBlockBut(block, view3d_object_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
2241
2242         uiDefIconTextBlockBut(block, view3d_edit_object_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Clear/Apply", 0, yco-=20, 120, 19, "");
2243         uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
2244         
2245         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2246         
2247         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");  
2248         
2249         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2250         
2251         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2252         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate Linked|Alt D",                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2253         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete|X",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2254         
2255         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2256         
2257         uiDefIconTextBlockBut(block, view3d_edit_object_makelinksmenu, NULL, ICON_RIGHTARROW_THIN, "Make Links", 0, yco-=20, 120, 19, "");
2258         uiDefIconTextBlockBut(block, view3d_edit_object_singleusermenu, NULL, ICON_RIGHTARROW_THIN, "Make Single User", 0, yco-=20, 120, 19, "");
2259         uiDefIconTextBlockBut(block, view3d_edit_object_makelocalmenu, NULL, ICON_RIGHTARROW_THIN, "Make Local", 0, yco-=20, 120, 19, "");
2260         uiDefIconTextBlockBut(block, view3d_edit_object_copyattrmenu, NULL, ICON_RIGHTARROW_THIN, "Copy Attributes", 0, yco-=20, 120, 19, "");
2261         
2262         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2263         
2264         uiDefIconTextBlockBut(block, view3d_edit_object_parentmenu, NULL, ICON_RIGHTARROW_THIN, "Parent", 0, yco-=20, 120, 19, "");
2265         uiDefIconTextBlockBut(block, view3d_edit_object_groupmenu, NULL, ICON_RIGHTARROW_THIN, "Group", 0, yco-=20, 120, 19, "");
2266         uiDefIconTextBlockBut(block, view3d_edit_object_trackmenu, NULL, ICON_RIGHTARROW_THIN, "Track", 0, yco-=20, 120, 19, "");
2267         uiDefIconTextBlockBut(block, view3d_edit_object_constraintsmenu, NULL, ICON_RIGHTARROW_THIN, "Constraints", 0, yco-=20, 120, 19, "");
2268         
2269         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2270         
2271         if (OBACT && OBACT->type == OB_MESH) {
2272                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Boolean Operation...|W",                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2273         }
2274         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Join Objects|Ctrl J",                            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
2275         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Object Type...|Alt C",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2276         
2277         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2278         
2279         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move to Layer...|M",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
2280
2281         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2282         uiDefIconTextBlockBut(block, view3d_edit_object_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, "");
2283
2284                 
2285         if(curarea->headertype==HEADERTOP) {
2286                 uiBlockSetDirection(block, UI_DOWN);
2287         }
2288         else {
2289                 uiBlockSetDirection(block, UI_TOP);
2290                 uiBlockFlipOrder(block);
2291         }
2292
2293         uiTextBoundsBlock(block, 50);
2294         return block;
2295 }
2296
2297
2298 static void do_view3d_edit_propfalloffmenu(void *arg, int event)
2299 {
2300         
2301         G.scene->prop_mode= event;
2302         
2303         allqueue(REDRAWVIEW3D, 1);
2304 }
2305
2306 static uiBlock *view3d_edit_propfalloffmenu(void *arg_unused)
2307 {
2308         uiBlock *block;
2309         short yco = 20, menuwidth = 120;
2310
2311         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_propfalloffmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2312         uiBlockSetButmFunc(block, do_view3d_edit_propfalloffmenu, NULL);
2313         
2314         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, "");
2315         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Smooth|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SMOOTH, "");
2316         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, "");
2317         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Sphere|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SPHERE, "");
2318         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, "");
2319         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Root|Shift O",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_ROOT, "");
2320         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, "");
2321         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Sharp|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SHARP, "");
2322         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, "");
2323         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Linear|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_LIN, "");
2324         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, "");
2325         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Random|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_RANDOM, "");
2326         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, "");
2327         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Constant|Shift O",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_CONST, "");
2328                 
2329         uiBlockSetDirection(block, UI_RIGHT);
2330         uiTextBoundsBlock(block, 60);
2331         return block;
2332 }
2333
2334
2335 void do_view3d_edit_mesh_verticesmenu(void *arg, int event)
2336 {
2337         
2338         switch(event) {
2339         int count; 
2340         
2341         case 0: /* make vertex parent */
2342                 make_parent();
2343                 break;
2344         case 1: /* remove doubles */
2345                 count= removedoublesflag(1, G.scene->toolsettings->doublimit);
2346                 notice("Removed: %d", count);
2347                 if (count) { /* only undo and redraw if an action is taken */
2348                         DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
2349                         BIF_undo_push("Rem Doubles");
2350                 }
2351                 break;
2352         case 2: /* smooth */
2353                 vertexsmooth();
2354                 break;
2355         case 3: /* separate */
2356                 separate_mesh();
2357                 break;
2358         case 4: /*split */
2359                 split_mesh();
2360                 break;
2361         case 5: /*merge */
2362                 mergemenu();
2363                 break;
2364         case 6: /* add hook */
2365                 add_hook();
2366                 break;
2367         case 7: /* rip */
2368                 mesh_rip();
2369                 break;
2370         }
2371         allqueue(REDRAWVIEW3D, 0);
2372 }
2373
2374 static uiBlock *view3d_edit_mesh_verticesmenu(void *arg_unused)
2375 {
2376         uiBlock *block;
2377         short yco = 20, menuwidth = 120;
2378
2379         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mesh_verticesmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2380         uiBlockSetButmFunc(block, do_view3d_edit_mesh_verticesmenu, NULL);
2381         
2382         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Merge...|Alt M",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2383         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rip|V",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2384         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Split|Y",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2385         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Separate|P",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2386         
2387         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2388         
2389         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Smooth|W, Alt 1",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2390         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remove Doubles|W, 6",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2391         
2392         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2393
2394         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Vertex Parent|Ctrl P",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2395         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Hook|Ctrl H",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2396
2397         uiBlockSetDirection(block, UI_RIGHT);
2398         uiTextBoundsBlock(block, 60);
2399         return block;
2400 }
2401
2402 void do_view3d_edit_mesh_edgesmenu(void *arg, int event)
2403 {
2404         float fac;
2405         short randfac;
2406
2407         switch(event) {
2408                  
2409         case 0: /* subdivide smooth */
2410                 esubdivideflag(1, 0.0, G.scene->toolsettings->editbutflag | B_SMOOTH,1,0);
2411                 BIF_undo_push("Subdivide Smooth");
2412                 break;
2413         case 1: /*subdivide fractal */
2414                 randfac= 10;
2415                 if(button(&randfac, 1, 100, "Rand fac:")==0) return;
2416                 fac= -( (float)randfac )/100;
2417                 esubdivideflag(1, fac, G.scene->toolsettings->editbutflag,1,0);
2418                 BIF_undo_push("Subdivide Fractal");
2419                 break;
2420         case 2: /* subdivide */
2421                 esubdivideflag(1, 0.0, G.scene->toolsettings->editbutflag,1,0);
2422                 BIF_undo_push("Subdivide");
2423                 break;
2424         case 3: /* knife subdivide */
2425                 KnifeSubdivide(KNIFE_PROMPT);
2426                 break;
2427         case 4: /* Loop subdivide */
2428                 CutEdgeloop(1);
2429                 break;
2430         case 5: /* Make Edge/Face */
2431                 addedgeface_mesh();
2432                 break;
2433         case 6:
2434                 bevel_menu();
2435                 break;
2436         case 7: /* Mark Seam */
2437                 editmesh_mark_seam(0);
2438                 break;
2439         case 8: /* Clear Seam */
2440                 editmesh_mark_seam(1);
2441                 break;
2442         case 9: /* Cease SubSurf */
2443                 initTransform(TFM_CREASE, CTX_EDGE);
2444                 Transform();
2445                 break;
2446         case 10: /* Rotate Edge */
2447                 edge_rotate_selected(2);
2448                 break;
2449         case 11: /* Rotate Edge */
2450                 edge_rotate_selected(1);
2451                 break;
2452         case 12: /* Edgeslide */
2453                 EdgeSlide(0,0.0);
2454                 break;
2455         case 13: /* Edge Loop Delete */
2456                 EdgeLoopDelete();
2457                 break;
2458         case 14: /*Collapse Edges*/
2459                 collapseEdges();
2460                 BIF_undo_push("Collapse");
2461                 break;
2462         }
2463         allqueue(REDRAWVIEW3D, 0);
2464 }
2465
2466 static uiBlock *view3d_edit_mesh_edgesmenu(void *arg_unused)
2467 {
2468         uiBlock *block;
2469         short yco = 20, menuwidth = 120;
2470
2471         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mesh_edgesmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2472         uiBlockSetButmFunc(block, do_view3d_edit_mesh_edgesmenu, NULL);
2473         
2474         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2475         
2476         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2477         
2478         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel|W, Alt 2",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2479         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Loop Subdivide...|Ctrl R",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2480         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Knife Subdivide...|Shift K",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2481         
2482         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2483         
2484         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide|W, 1",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2485         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide Fractal|W, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2486         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide Smooth|W, 4",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2487
2488         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2489
2490         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mark Seam|Ctrl E",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2491         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Seam|Ctrl E",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
2492
2493         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2494         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Crease SubSurf|Shift E",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2495
2496         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2497
2498         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate Edge CW|Ctrl E",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
2499         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate Edge CCW|Ctrl E",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");  
2500
2501         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Slide Edge |Ctrl E",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");  
2502         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Edge Loop|X",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");  
2503
2504         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Collapse",                               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");  
2505         uiBlockSetDirection(block, UI_RIGHT);
2506         uiTextBoundsBlock(block, 60);
2507         return block;
2508 }
2509
2510 void do_view3d_edit_mesh_facesmenu(void *arg, int event)
2511 {
2512         switch(event) {
2513         case 0: /* Fill Faces */
2514                 fill_mesh();
2515                 break;
2516         case 1: /* Beauty Fill Faces */
2517                 beauty_fill();
2518                 break;
2519         case 2: /* Quads to Tris */
2520                 convert_to_triface(0);
2521                 allqueue(REDRAWVIEW3D, 0);
2522                 countall();
2523                 DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
2524                 break;
2525         case 3: /* Tris to Quads */
2526                 join_triangles();
2527                 break;
2528         case 4: /* Flip triangle edges */
2529                 edge_flip();
2530                 break;
2531         case 5: /* Make Edge/Face */
2532                 addedgeface_mesh();
2533                 break;
2534         case 6: /* Set Smooth */
2535                 mesh_set_smooth_faces(1);
2536                 break;
2537         case 7: /* Set Solid */
2538                 mesh_set_smooth_faces(0);
2539                 break;
2540         }
2541         allqueue(REDRAWVIEW3D, 0);
2542 }
2543
2544 static uiBlock *view3d_edit_mesh_facesmenu(void *arg_unused)
2545 {
2546         uiBlock *block;
2547         short yco = 20, menuwidth = 120;
2548
2549         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mesh_facesmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2550         uiBlockSetButmFunc(block, do_view3d_edit_mesh_facesmenu, NULL);
2551         
2552         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2553         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Fill|Shift F",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2554         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Beautify Fill|Alt F",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2555         
2556         
2557         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2558         
2559         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Quads to Triangles|Ctrl T",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2560         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Triangles to Quads|Alt J", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2561         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip Triangle Edges|Ctrl F",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2562         
2563         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2564         
2565         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Smooth|W, Alt 3",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2566         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Solid|W, Alt 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2567         
2568         uiBlockSetDirection(block, UI_RIGHT);
2569         uiTextBoundsBlock(block, 60);
2570         return block;
2571 }
2572
2573 void do_view3d_edit_mesh_normalsmenu(void *arg, int event)
2574 {
2575         switch(event) {
2576         case 0: /* flip */
2577                 flip_editnormals();
2578                 break;
2579         case 1: /* recalculate inside */
2580                 righthandfaces(2);
2581                 break;
2582         case 2: /* recalculate outside */
2583                 righthandfaces(1);
2584                 break;
2585                 }
2586         allqueue(REDRAWVIEW3D, 0);
2587 }
2588
2589 static uiBlock *view3d_edit_mesh_normalsmenu(void *arg_unused)
2590 {
2591         uiBlock *block;
2592         short yco = 20, menuwidth = 120;
2593
2594         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mesh_normalsmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2595         uiBlockSetButmFunc(block, do_view3d_edit_mesh_normalsmenu, NULL);
2596         
2597         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recalculate Outside|Ctrl N",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2598         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recalculate Inside|Ctrl Shift N",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2599         
2600         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2601         
2602         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip|W, 0",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2603         
2604         uiBlockSetDirection(block, UI_RIGHT);
2605         uiTextBoundsBlock(block, 60);
2606         return block;
2607 }
2608
2609 void do_view3d_edit_mirrormenu(void *arg, int event)
2610 {
2611         switch(event) {
2612                 case 1:
2613                 case 2:
2614                 case 3:
2615                 case 4:
2616                 case 5:
2617                 case 6:
2618                 case 7:
2619                 case 8:
2620                 case 9:
2621                         Mirror(event);
2622                         break;
2623         }
2624         allqueue(REDRAWVIEW3D, 0);
2625 }
2626
2627 static uiBlock *view3d_edit_mirrormenu(void *arg_unused)
2628 {
2629         uiBlock *block;
2630         short yco = 20, menuwidth = 120;
2631
2632         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mirrormenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2633         uiBlockSetButmFunc(block, do_view3d_edit_mirrormenu, NULL);
2634         
2635         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|Ctrl M, 1",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2636         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|Ctrl M, 2",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2637         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|Ctrl M, 3",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2638         
2639         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2640         
2641         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|Ctrl M, 4",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2642         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, 5",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2643         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, 6",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2644         
2645         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2646         
2647         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X View|Ctrl M, 7",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2648         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y View|Ctrl M, 8",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
2649         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z View|Ctrl M, 9",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2650
2651         uiBlockSetDirection(block, UI_RIGHT);
2652         uiTextBoundsBlock(block, 60);
2653         return block;
2654 }
2655
2656 static void do_view3d_edit_mesh_showhidemenu(void *arg, int event)
2657 {
2658         
2659         switch(event) {
2660                  
2661         case 0: /* show hidden vertices */
2662                 reveal_mesh();
2663                 break;
2664         case 1: /* hide selected vertices */
2665                 hide_mesh(0);
2666                 break;
2667         case 2: /* hide deselected vertices */
2668                 hide_mesh(1);
2669                 break;
2670         }
2671         allqueue(REDRAWVIEW3D, 0);
2672 }
2673
2674 static uiBlock *view3d_edit_mesh_showhidemenu(void *arg_unused)
2675 {
2676         uiBlock *block;
2677         short yco = 20, menuwidth = 120;
2678
2679         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mesh_showhidemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2680         uiBlockSetButmFunc(block, do_view3d_edit_mesh_showhidemenu, NULL);
2681         
2682         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hidden|Alt H",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2683         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Selected|H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2684         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Deselected|Shift H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2685
2686         uiBlockSetDirection(block, UI_RIGHT);
2687         uiTextBoundsBlock(block, 60);
2688         return block;
2689 }
2690
2691 static void do_view3d_edit_mesh_scriptsmenu(void *arg, int event)
2692 {
2693         BPY_menu_do_python(PYMENU_MESH, event);
2694
2695         allqueue(REDRAWVIEW3D, 0);
2696 }
2697
2698 static uiBlock *view3d_edit_mesh_scriptsmenu(void *arg_unused)
2699 {
2700         uiBlock *block;
2701         short yco = 20, menuwidth = 120;
2702         BPyMenu *pym;
2703         int i = 0;
2704
2705         block= uiNewBlock(&curarea->uiblocks, "v3d_emesh_pymenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2706         uiBlockSetButmFunc(block, do_view3d_edit_mesh_scriptsmenu, NULL);
2707
2708         for (pym = BPyMenuTable[PYMENU_MESH]; pym; pym = pym->next, i++) {
2709                 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);
2710         }
2711
2712         uiBlockSetDirection(block, UI_RIGHT);
2713         uiTextBoundsBlock(block, 60);
2714
2715         return block;
2716 }
2717
2718 static void do_view3d_edit_meshmenu(void *arg, int event)
2719 {
2720 #ifdef WITH_VERSE
2721         struct VerseSession *session;
2722 #endif
2723
2724         switch(event) {
2725         
2726         case 0: /* Undo Editing */
2727                 BIF_undo();
2728                 break;
2729         case 1: /* Redo Editing */
2730                 BIF_redo();
2731                 break;
2732         case 2: /* transform properties */
2733                 add_blockhandler(curarea, VIEW3D_HANDLER_OBJECT, 0);
2734                 break;
2735         case 4: /* insert keyframe */
2736                 common_insertkey();
2737                 break;
2738         case 5: /* Extrude */
2739                 extrude_mesh();
2740                 break;
2741         case 6: /* duplicate */
2742                 duplicate_context_selected();
2743                 break;
2744         case 7: /* make edge face */
2745                 addedgeface_mesh();
2746                 break;
2747         case 8: /* delete */
2748                 delete_context_selected();
2749                 break;
2750         case 9: /* Shrink/Fatten Along Normals */
2751                 initTransform(TFM_SHRINKFATTEN, CTX_NONE);
2752                 Transform();
2753                 break;
2754         case 10: /* Shear */
2755                 initTransform(TFM_SHEAR, CTX_NONE);
2756                 Transform();
2757                 break;
2758         case 11: /* Warp */
2759                 initTransform(TFM_WARP, CTX_NONE);
2760                 Transform();
2761                 break;
2762         case 12: /* proportional edit (toggle) */
2763                 if(G.scene->proportional) G.scene->proportional= 0;
2764                 else G.scene->proportional= 1;
2765                 break;
2766 #ifdef WITH_VERSE
2767         case 13:
2768                 if(session_list.first != session_list.last) session = session_menu();
2769                 else session = session_list.first;
2770                 if(session) b_verse_push_object(session, G.obedit);
2771                 break;
2772 #endif
2773         case 14:
2774                 add_blockhandler(curarea, VIEW3D_HANDLER_MULTIRES, 0);
2775                 break;
2776         case 17: /* Transform snap to grid */
2777                 G.vd->flag2 ^= V3D_TRANSFORM_SNAP;
2778                 break;
2779         }
2780         allqueue(REDRAWVIEW3D, 0);
2781 }
2782
2783 static uiBlock *view3d_edit_meshmenu(void *arg_unused)
2784 {
2785
2786         uiBlock *block;
2787         short yco= 0, menuwidth=120;
2788                 
2789         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_meshmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
2790         uiBlockSetButmFunc(block, do_view3d_edit_meshmenu, NULL);
2791
2792 #ifdef WITH_VERSE
2793         if((session_list.first != NULL) && (!G.obedit->vnode)) {
2794                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Share at Verse Server",
2795                                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
2796                 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2797         }
2798 #endif
2799
2800         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|U",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2801         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Redo Editing|Shift U",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2802         uiDefIconTextBlockBut(block, editmode_undohistorymenu, NULL, ICON_RIGHTARROW_THIN, "Undo History", 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.vd->flag2 & V3D_TRANSFORM_SNAP)
2807                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Transform Snap",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
2808         else
2809                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Transform Snap",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
2810
2811         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties...|N",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2812         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Multires Properties...",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
2813         uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
2814         uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, 120, 19, "");
2815         uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
2816         
2817         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2818         
2819         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2820         
2821         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2822         
2823         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extrude|E",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2824         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2825         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2826         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete...|X",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
2827         
2828         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2829         
2830         uiDefIconTextBlockBut(block, view3d_edit_mesh_verticesmenu, NULL, ICON_RIGHTARROW_THIN, "Vertices", 0, yco-=20, 120, 19, "");
2831         uiDefIconTextBlockBut(block, view3d_edit_mesh_edgesmenu, NULL, ICON_RIGHTARROW_THIN, "Edges", 0, yco-=20, 120, 19, "");
2832         uiDefIconTextBlockBut(block, view3d_edit_mesh_facesmenu, NULL, ICON_RIGHTARROW_THIN, "Faces", 0, yco-=20, 120, 19, "");
2833         uiDefIconTextBlockBut(block, view3d_edit_mesh_normalsmenu, NULL, ICON_RIGHTARROW_THIN, "Normals", 0, yco-=20, 120, 19, "");
2834         
2835         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2836                 
2837         if(G.scene->proportional) {
2838                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
2839         } else {
2840                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
2841         }
2842         uiDefIconTextBlockBut(block, view3d_edit_propfalloffmenu, NULL, ICON_RIGHTARROW_THIN, "Proportional Falloff", 0, yco-=20, 120, 19, "");
2843         
2844         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2845         
2846         uiDefIconTextBlockBut(block, view3d_edit_mesh_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Show/Hide Vertices", 0, yco-=20, 120, 19, "");
2847
2848         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2849         uiDefIconTextBlockBut(block, view3d_edit_mesh_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, "");
2850         
2851         if(curarea->headertype==HEADERTOP) {
2852                 uiBlockSetDirection(block, UI_DOWN);
2853         }
2854         else {
2855                 uiBlockSetDirection(block, UI_TOP);
2856                 uiBlockFlipOrder(block);
2857         }
2858
2859         uiTextBoundsBlock(block, 50);
2860         return block;
2861 }
2862
2863 static void do_view3d_edit_curve_controlpointsmenu(void *arg, int event)
2864 {
2865         switch(event) {
2866         case 0: /* tilt */
2867                 initTransform(TFM_TILT, CTX_NONE);
2868                 Transform();
2869                 break;
2870         case 1: /* clear tilt */
2871                 clear_tilt();
2872                 break;
2873         case 2: /* Free */
2874                 sethandlesNurb(3);
2875                 DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
2876                 break;
2877         case 3: /* vector */
2878                 sethandlesNurb(2);
2879                 DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
2880                 break;
2881         case 4: /* smooth */
2882                 sethandlesNurb(1);
2883                 DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
2884                 break;
2885         case 5: /* make vertex parent */
2886                 make_parent();
2887                 break;
2888         case 6: /* add hook */
2889                 add_hook();
2890                 break;
2891         case 7:
2892                 separate_nurb();
2893                 break;
2894         }
2895         allqueue(REDRAWVIEW3D, 0);
2896 }
2897
2898 static uiBlock *view3d_edit_curve_controlpointsmenu(void *arg_unused)
2899 {
2900         uiBlock *block;
2901         short yco = 20, menuwidth = 120;
2902
2903         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_curve_controlpointsmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2904         uiBlockSetButmFunc(block, do_view3d_edit_curve_controlpointsmenu, NULL);
2905         
2906         if (OBACT->type == OB_CURVE) {
2907                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Tilt|T",                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2908                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Tilt|Alt T",                               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2909                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Separate|P",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2910                 
2911                 uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2912                 
2913                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Automatic|Shift H",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2914                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Toggle Free/Aligned|H",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2915                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Vector|V",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2916
2917                 uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");             
2918         }
2919         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Vertex Parent|Ctrl P",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2920         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Hook|Ctrl H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2921         
2922         uiBlockSetDirection(block, UI_RIGHT);
2923         uiTextBoundsBlock(block, 60);
2924         return block;
2925 }
2926
2927 void do_view3d_edit_curve_segmentsmenu(void *arg, int event)
2928 {
2929         switch(event) {
2930         case 0: /* subdivide */
2931                 subdivideNurb();
2932                 break;
2933         case 1: /* switch direction */
2934                 switchdirectionNurb2();
2935                 break;
2936                 }
2937         allqueue(REDRAWVIEW3D, 0);
2938 }
2939
2940 static uiBlock *view3d_edit_curve_segmentsmenu(void *arg_unused)
2941 {
2942         uiBlock *block;
2943         short yco = 20, menuwidth = 120;
2944
2945         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_curve_segmentsmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2946         uiBlockSetButmFunc(block, do_view3d_edit_curve_segmentsmenu, NULL);
2947         
2948         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2949         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Switch Direction",                               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2950
2951         uiBlockSetDirection(block, UI_RIGHT);
2952         uiTextBoundsBlock(block, 60);
2953         return block;
2954 }
2955
2956 void do_view3d_edit_curve_showhidemenu(void *arg, int event)
2957 {
2958         switch(event) {
2959         case 10: /* show hidden control points */
2960                 revealNurb();
2961                 break;
2962         case 11: /* hide selected control points */
2963                 hideNurb(0);
2964                 break;
2965         case 12: /* hide deselected control points */
2966                 hideNurb(1);
2967                 break;
2968                 }
2969         allqueue(REDRAWVIEW3D, 0);
2970 }
2971
2972 static uiBlock *view3d_edit_curve_showhidemenu(void *arg_unused)
2973 {
2974         uiBlock *block;
2975         short yco = 20, menuwidth = 120;
2976
2977         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_curve_showhidemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2978         uiBlockSetButmFunc(block, do_view3d_edit_curve_showhidemenu, NULL);
2979         
2980         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hidden|Alt H",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
2981         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Selected|H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
2982         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, "");
2983         
2984
2985         uiBlockSetDirection(block, UI_RIGHT);
2986         uiTextBoundsBlock(block, 60);
2987         return block;
2988 }
2989 static void do_view3d_edit_curvemenu(void *arg, int event)
2990 {
2991         switch(event) {
2992         
2993         case 0: /* Undo Editing */
2994                 remake_editNurb();
2995                 break;
2996         case 1: /* transformation properties */
2997                 mainqenter(NKEY, 1);
2998                 break;
2999         case 2: /* insert keyframe */
3000                 common_insertkey();
3001                 break;
3002         case 4: /* extrude */
3003                 if (OBACT->type == OB_CURVE) {
3004                         addvert_Nurb('e');
3005                 } else if (OBACT->type == OB_SURF) {
3006                         extrude_nurb();
3007                 }
3008                 break;
3009         case 5: /* duplicate */
3010                 duplicate_context_selected();
3011                 break;
3012         case 6: /* make segment */
3013                 addsegment_nurb();
3014                 break;
3015         case 7: /* toggle cyclic */
3016                 makecyclicNurb();
3017                 DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
3018                 break;
3019         case 8: /* delete */
3020                 delete_context_selected();
3021                 break;
3022         case 9: /* proportional edit (toggle) */
3023                 if(G.scene->proportional) G.scene->proportional= 0;
3024                 else G.scene->proportional= 1;
3025                 break;
3026         case 13: /* Shear */
3027                 initTransform(TFM_SHEAR, CTX_NONE);
3028                 Transform();
3029                 break;
3030         case 14: /* Warp */
3031                 initTransform(TFM_WARP, CTX_NONE);
3032                 Transform();
3033                 break;
3034         }
3035         allqueue(REDRAWVIEW3D, 0);
3036 }
3037
3038 static uiBlock *view3d_edit_curvemenu(void *arg_unused)
3039 {
3040         uiBlock *block;
3041         short yco= 0, menuwidth=120;
3042
3043         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_curvemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
3044         uiBlockSetButmFunc(block, do_view3d_edit_curvemenu, NULL);
3045         
3046         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reload Original|U",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
3047         
3048         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
3049         
3050         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties...|N",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
3051         uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
3052         uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");      
3053         uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
3054         
3055         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
3056         
3057         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
3058         
3059         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
3060         
3061         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extrude|E",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
3062         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
3063         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Segment|F",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
3064         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Toggle Cyclic|C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
3065         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete...|X",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
3066         
3067         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
3068         
3069         uiDefIconTextBlockBut(block, view3d_edit_curve_controlpointsmenu, NULL, ICON_RIGHTARROW_THIN, "Control Points", 0, yco-=20, menuwidth, 19, "");
3070         uiDefIconTextBlockBut(block, view3d_edit_curve_segmentsmenu, NULL, ICON_RIGHTARROW_THIN, "Segments", 0, yco-=20, menuwidth, 19, "");
3071         
3072         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
3073         
3074         if(G.scene->proportional) {
3075                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
3076         } else {
3077                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
3078         }
3079         uiDefIconTextBlockBut(block, view3d_edit_propfalloffmenu, NULL, ICON_RIGHTARROW_THIN, "Proportional Falloff", 0, yco-=20, menuwidth, 19, "");
3080         
3081         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
3082         
3083         uiDefIconTextBlockBut(block, view3d_edit_curve_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Show/Hide Control Points", 0, yco-=20, menuwidth, 19, "");
3084         
3085         if(curarea->headertype==HEADERTOP) {
3086                 uiBlockSetDirection(block, UI_DOWN);
3087         }
3088         else {
3089                 uiBlockSetDirection(block, UI_TOP);
3090                 uiBlockFlipOrder(block);
3091         }
3092
3093         uiTextBoundsBlock(block, 50);
3094         return block;
3095 }
3096
3097 static void do_view3d_edit_mball_showhidemenu(void *arg, int event)
3098 {
3099         switch(event) {
3100         case 10: /* show hidden control points */
3101                 reveal_mball();
3102                 break;
3103         case 11: /* hide selected control points */
3104                 hide_mball(0);
3105                 break;
3106         case 12: /* hide deselected control points */
3107                 hide_mball(1);
3108                 break;
3109                 }
3110         allqueue(REDRAWVIEW3D, 0);
3111 }
3112
3113 static uiBlock *view3d_edit_mball_showhidemenu(void *arg_unused)