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