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