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