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