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