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