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