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