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