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