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