merge with 2.5 (not trunk, last merge message said that on accident) at r22252
[blender.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 #include "BKE_tessmesh.h"
68
69 #include "ED_armature.h"
70 #include "ED_particle.h"
71 #include "ED_object.h"
72 #include "ED_mesh.h"
73 #include "ED_util.h"
74 #include "ED_screen.h"
75 #include "ED_transform.h"
76 #include "ED_types.h"
77
78 #include "WM_api.h"
79 #include "WM_types.h"
80
81 #include "RNA_access.h"
82 #include "RNA_define.h"
83
84 #include "BIF_gl.h"
85 #include "BIF_glutil.h"
86
87 #include "BLI_arithb.h"
88 #include "BLI_blenlib.h"
89 #include "BLI_editVert.h"
90
91 #include "UI_interface.h"
92 #include "UI_interface_icons.h"
93 #include "UI_resources.h"
94 #include "UI_view2d.h"
95
96 #include "view3d_intern.h"
97
98
99 /* View3d->modeselect 
100  * This is a bit of a dodgy hack to enable a 'mode' menu with icons+labels
101  * rather than those buttons.
102  * I know the implementation's not good - it's an experiment to see if this
103  * approach would work well
104  *
105  * This can be cleaned when I make some new 'mode' icons.
106  */
107
108 #define V3D_OBJECTMODE_SEL                      ICON_OBJECT_DATA
109 #define V3D_EDITMODE_SEL                        ICON_EDITMODE_HLT
110 #define V3D_SCULPTMODE_SEL                      ICON_SCULPTMODE_HLT
111 #define V3D_FACESELECT_SEL                      ICON_FACESEL_HLT        /* this is not a mode anymore - just a switch */
112 #define V3D_VERTEXPAINTMODE_SEL         ICON_VPAINT_HLT
113 #define V3D_TEXTUREPAINTMODE_SEL        ICON_TPAINT_HLT
114 #define V3D_WEIGHTPAINTMODE_SEL         ICON_WPAINT_HLT
115 #define V3D_POSEMODE_SEL                        ICON_POSE_HLT
116 #define V3D_PARTICLEEDITMODE_SEL        ICON_ANIM
117
118 #define TEST_EDITMESH   if(obedit==0) return; \
119                                                 if( (v3d->lay & obedit->lay)==0 ) return;
120
121 /* XXX port over */     
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 #define VIEW3D_HANDLER_BONESKETCH       8
135
136 /* end XXX ************* */
137
138
139 /* well... in this file a lot of view mode manipulation happens, so let's have it defined here */
140 void ED_view3d_exit_paint_modes(bContext *C)
141 {
142         if(G.f & G_TEXTUREPAINT)
143                 WM_operator_name_call(C, "PAINT_OT_texture_paint_toggle", WM_OP_EXEC_REGION_WIN, NULL);
144         if(G.f & G_VERTEXPAINT)
145                 WM_operator_name_call(C, "PAINT_OT_vertex_paint_toggle", WM_OP_EXEC_REGION_WIN, NULL);
146         else if(G.f & G_WEIGHTPAINT)
147                 WM_operator_name_call(C, "PAINT_OT_weight_paint_toggle", WM_OP_EXEC_REGION_WIN, NULL);
148
149         if(G.f & G_SCULPTMODE)
150                 WM_operator_name_call(C, "SCULPT_OT_sculptmode_toggle", WM_OP_EXEC_REGION_WIN, NULL);
151         if(G.f & G_PARTICLEEDIT)
152                 WM_operator_name_call(C, "PARTICLE_OT_particle_edit_toggle", WM_OP_EXEC_REGION_WIN, NULL);
153         
154         G.f &= ~(G_VERTEXPAINT+G_TEXTUREPAINT+G_WEIGHTPAINT+G_SCULPTMODE+G_PARTICLEEDIT);
155 }
156
157
158
159
160
161 static void do_view3d_header_buttons(bContext *C, void *arg, int event);
162
163 #define B_SCENELOCK 101
164 #define B_FULL          102
165 #define B_HOME          103
166 #define B_VIEWBUT       104
167 #define B_PERSP         105
168 #define B_VIEWRENDER    106
169 #define B_STARTGAME     107
170 #define B_MODESELECT 108
171 #define B_AROUND        109
172 #define B_SEL_VERT      110
173 #define B_SEL_EDGE      111
174 #define B_SEL_FACE      112
175 #define B_SEL_PATH      113
176 #define B_SEL_POINT     114
177 #define B_SEL_END       115
178 #define B_MAN_TRANS     116
179 #define B_MAN_ROT       117
180 #define B_MAN_SCALE     118
181 #define B_NDOF          119     
182 #define B_MAN_MODE      120
183 #define B_VIEW_BUTSEDIT 121
184 #define B_REDR          122
185 #define B_NOP           123
186 #define B_ACTCOPY       124
187 #define B_ACTPASTE      125
188 #define B_ACTPASTEFLIP 126
189
190 #define B_LAY           201
191
192
193 static RegionView3D *wm_region_view3d(const bContext *C)
194 {
195         ScrArea *sa= CTX_wm_area(C);
196         ARegion *ar;
197         /* XXX handle foursplit? */
198         for(ar= sa->regionbase.first; ar; ar= ar->next)
199                 if(ar->regiontype==RGN_TYPE_WINDOW)
200                         return ar->regiondata;
201         return NULL;
202 }
203
204 // XXX quickly ported across
205 static void handle_view3d_lock(bContext *C) 
206 {
207         Scene *scene= CTX_data_scene(C);
208         ScrArea *sa= CTX_wm_area(C);
209         View3D *v3d= CTX_wm_view3d(C);
210         
211         if (v3d != NULL && sa != NULL) {
212                 if(v3d->localview==0 && v3d->scenelock && sa->spacetype==SPACE_VIEW3D) {
213                         
214                         /* copy to scene */
215                         scene->lay= v3d->lay;
216                         scene->camera= v3d->camera;
217                         
218                         //copy_view3d_lock(REDRAW);
219                 }
220         }
221 }
222
223 /* XXX; all this context stuff...  should become operator */
224 void do_layer_buttons(bContext *C, short event)
225 {
226         wmWindow *win= CTX_wm_window(C);
227         Scene *scene= CTX_data_scene(C);
228         ScrArea *sa= CTX_wm_area(C);
229         View3D *v3d= sa->spacedata.first;
230         static int oldlay= 1;
231         short shift, alt, ctrl;
232         
233         shift= win->eventstate->shift;
234         alt= win->eventstate->alt;
235         ctrl= win->eventstate->ctrl;
236         
237         if(v3d==0) return;
238         if(v3d->localview) return;
239         
240         if(event==-1 && ctrl) {
241                 v3d->scenelock= !v3d->scenelock;
242                 do_view3d_header_buttons(C, NULL, B_SCENELOCK);
243         } else if (event<0) {
244                 if(v3d->lay== (1<<20)-1) {
245                         if(event==-2 || shift) v3d->lay= oldlay;
246                 }
247                 else {
248                         oldlay= v3d->lay;
249                         v3d->lay= (1<<20)-1;
250                 }
251                 
252                 if(v3d->scenelock) handle_view3d_lock(C);
253                 
254                 /* new layers might need unflushed events events */
255                 DAG_scene_update_flags(scene, v3d->lay);        /* tags all that moves and flushes */
256         }
257         else {
258                 if(alt) {
259                         if(event<11) event+= 10;
260                 }
261                 if(shift) {
262                         if(v3d->lay & (1<<event)) v3d->lay -= (1<<event);
263                         else    v3d->lay += (1<<event);
264                 }
265                 do_view3d_header_buttons(C, NULL, event+B_LAY);
266         }
267         ED_area_tag_redraw(sa);
268         
269         if(v3d->drawtype == OB_SHADED) reshadeall_displist(scene);
270 }
271
272 static int layers_exec(bContext *C, wmOperator *op)
273 {
274         Scene *scene= CTX_data_scene(C);
275         ScrArea *sa= CTX_wm_area(C);
276         View3D *v3d= sa->spacedata.first;
277         int nr= RNA_int_get(op->ptr, "nr");
278         
279         if(nr<=0)
280                 return OPERATOR_CANCELLED;
281         nr--;
282         
283         if(RNA_boolean_get(op->ptr, "extend"))
284                 v3d->lay |= (1<<nr);
285         else 
286                 v3d->lay = (1<<nr);
287         
288         /* set active layer, ensure to always have one */
289         if(v3d->lay & (1<<nr))
290            v3d->layact= 1<<nr;
291         else if((v3d->lay & v3d->layact)==0) {
292                 int bit= 0;
293                 
294                 while(bit<32) {
295                         if(v3d->lay & (1<<bit)) {
296                                 v3d->layact= 1<<bit;
297                                 break;
298                         }
299                         bit++;
300                 }
301         }
302         
303         if(v3d->scenelock) handle_view3d_lock(C);
304         
305         /* new layers might need unflushed events events */
306         DAG_scene_update_flags(scene, v3d->lay);        /* tags all that moves and flushes */
307
308         ED_area_tag_redraw(sa);
309         
310         return OPERATOR_FINISHED;
311 }
312
313 /* applies shift and alt, lazy coding or ok? :) */
314 /* the local per-keymap-entry keymap will solve it */
315 static int layers_invoke(bContext *C, wmOperator *op, wmEvent *event)
316 {
317         if(event->ctrl || event->oskey)
318                 return OPERATOR_PASS_THROUGH;
319         
320         if(event->shift)
321                 RNA_boolean_set(op->ptr, "extend", 1);
322         
323         if(event->alt) {
324                 int nr= RNA_int_get(op->ptr, "nr") + 10;
325                 RNA_int_set(op->ptr, "nr", nr);
326         }
327         layers_exec(C, op);
328         
329         return OPERATOR_FINISHED;
330 }
331
332 void VIEW3D_OT_layers(wmOperatorType *ot)
333 {
334         /* identifiers */
335         ot->name= "Layers";
336         ot->idname= "VIEW3D_OT_layers";
337         
338         /* api callbacks */
339         ot->invoke= layers_invoke;
340         ot->exec= layers_exec;
341         ot->poll= ED_operator_view3d_active;
342         
343         /* flags */
344         ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
345         
346         RNA_def_int(ot->srna, "nr", 1, 0, 20, "Number", "", 0, 20);
347         RNA_def_boolean(ot->srna, "extend", 0, "Extend", "");
348 }
349
350
351 #if 0
352 static void do_view3d_view_camerasmenu(bContext *C, void *arg, int event)
353 {
354         Scene *scene= CTX_data_scene(C);
355         Base *base;
356         int i=1;
357         
358         if (event == 1) {
359                 /* Set Active Object as Active Camera */
360                 /* XXX ugly hack alert */
361 //              G.qual |= LR_CTRLKEY;
362 //              persptoetsen(PAD0);
363 //              G.qual &= ~LR_CTRLKEY;
364         } else {
365
366                 for( base = FIRSTBASE; base; base = base->next ) {
367                         if (base->object->type == OB_CAMERA) {
368                                 i++;
369                                 
370                                 if (event==i) {
371                                         /* XXX use api call! */
372                                         
373                                         break;
374                                 }
375                         }
376                 }
377         }
378         
379 }
380
381
382 static uiBlock *view3d_view_camerasmenu(bContext *C, ARegion *ar, void *arg_unused)
383 {
384         Scene *scene= CTX_data_scene(C);
385         Base *base;
386         uiBlock *block;
387         short yco= 0, menuwidth=120;
388         int i=1;
389         char camname[48];
390         
391         block= uiBeginBlock(C, ar, "view3d_view_camerasmenu", UI_EMBOSSP);
392         uiBlockSetButmFunc(block, do_view3d_view_camerasmenu, NULL);
393
394         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, "");
395
396         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
397         
398         for( base = FIRSTBASE; base; base = base->next ) {
399                 if (base->object->type == OB_CAMERA) {
400                         i++;
401                         
402                         strcpy(camname, base->object->id.name+2);
403                         if (base->object == scene->camera) strcat(camname, " (Active)");
404                         
405                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, camname,  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,  i, "");
406                 }
407         }
408         
409         uiBlockSetDirection(block, UI_RIGHT);
410         uiTextBoundsBlock(block, 50);
411         return block;
412 }
413 #endif
414
415 #if 0
416 static void do_view3d_view_cameracontrolsmenu(bContext *C, void *arg, int event)
417 {
418         switch(event) {
419         case 0: /* Orbit Left */
420                 persptoetsen(PAD4);
421                 break;
422         case 1: /* Orbit Right */
423                 persptoetsen(PAD6);
424                 break;
425         case 2: /* Orbit Up */
426                 persptoetsen(PAD8);
427                 break;
428         case 3: /* Orbit Down */
429                 persptoetsen(PAD2);
430                 break;
431         case 4: /* Pan left */
432                 /* XXX ugly hack alert */
433 //              G.qual |= LR_CTRLKEY;
434                 persptoetsen(PAD4);
435 //              G.qual &= ~LR_CTRLKEY;
436                 break;
437         case 5: /* Pan right */
438                 /* XXX ugly hack alert */
439 //              G.qual |= LR_CTRLKEY;
440                 persptoetsen(PAD6);
441 //              G.qual &= ~LR_CTRLKEY;
442                 break;
443         case 6: /* Pan up */
444                 /* ugly hack alert */
445 //              G.qual |= LR_CTRLKEY;
446                 persptoetsen(PAD8);
447 //              G.qual &= ~LR_CTRLKEY;
448                 break;
449         case 7: /* Pan down */
450                 /* ugly hack alert */
451 //              G.qual |= LR_CTRLKEY;
452                 persptoetsen(PAD2);
453 //              G.qual &= ~LR_CTRLKEY;
454                 break;
455         case 8: /* Zoom In */
456                 persptoetsen(PADPLUSKEY);
457                 break;
458         case 9: /* Zoom Out */
459                 persptoetsen(PADMINUS);
460                 break;
461         case 10: /* Reset Zoom */
462                 persptoetsen(PADENTER);
463                 break;
464         case 11: /* Camera Fly mode */
465                 fly();
466                 break;
467         }
468 }
469
470
471 static uiBlock *view3d_view_cameracontrolsmenu(bContext *C, ARegion *ar, void *arg_unused)
472 {
473 /*              static short tog=0; */
474         uiBlock *block;
475         short yco= 0, menuwidth=120;
476         
477         block= uiBeginBlock(C, ar, "view3d_view_cameracontrolsmenu", UI_EMBOSSP);
478         uiBlockSetButmFunc(block, do_view3d_view_cameracontrolsmenu, NULL);
479
480         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera Fly Mode|Shift F",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
481         
482         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
483         
484         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Orbit Left|NumPad 4",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
485         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Orbit Right|NumPad 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
486         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Orbit Up|NumPad 8",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
487         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Orbit Down|NumPad 2",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
488         
489         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
490         
491         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pan Left|Ctrl NumPad 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
492         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pan Right|Ctrl NumPad 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
493         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pan Up|Ctrl NumPad 8",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
494         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pan Down|Ctrl NumPad 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
495         
496         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
497         
498         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom In|NumPad +", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
499         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom Out|NumPad -",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
500         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Zoom|NumPad Enter",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 10, "");
501
502         uiBlockSetDirection(block, UI_RIGHT);
503         uiTextBoundsBlock(block, 50);
504         return block;
505 }
506
507 static void do_view3d_view_alignviewmenu(bContext *C, void *arg, int event)
508 {
509         Scene *scene= CTX_data_scene(C);
510         ScrArea *sa= CTX_wm_area(C);
511         View3D *v3d= sa->spacedata.first;
512         Object *obedit = CTX_data_edit_object(C);
513         float *curs;
514         
515         switch(event) {
516
517         case 0: /* Align View to Selected (edit/faceselect mode) */
518         case 1:
519         case 2:
520                 if ((obedit) && (obedit->type == OB_MESH)) {
521                         editmesh_align_view_to_selected(v3d, event + 1);
522                 } 
523                 else if (FACESEL_PAINT_TEST) {
524                         Object *obact= OBACT;
525                         if (obact && obact->type==OB_MESH) {
526                                 Mesh *me= obact->data;
527
528                                 if (me->mtface) {
529 // XXX                                  faceselect_align_view_to_selected(v3d, me, event + 1);
530                                         ED_area_tag_redraw(sa);
531                                 }
532                         }
533                 }
534                 break;
535         case 3: /* Center View to Cursor */
536                 curs= give_cursor(scene, v3d);
537                 v3d->ofs[0]= -curs[0];
538                 v3d->ofs[1]= -curs[1];
539                 v3d->ofs[2]= -curs[2];
540                 ED_area_tag_redraw(sa);
541                 break;
542         case 4: /* Align Active Camera to View */
543                 /* XXX This ugly hack is a symptom of the nasty persptoetsen function, 
544                  * but at least it works for now.
545                  */
546 //              G.qual |= LR_CTRLKEY|LR_ALTKEY;
547                 persptoetsen(PAD0);
548 //              G.qual &= ~(LR_CTRLKEY|LR_ALTKEY);
549                 break;
550         case 5: /* Align View to Selected (object mode) */
551 // XXX          mainqenter(PADASTERKEY, 1);
552                 break;
553         case 6: /* Center View and Cursor to Origin */
554                 WM_operator_name_call(C, "VIEW3D_OT_view_center", WM_OP_EXEC_REGION_WIN, NULL);
555                 curs= give_cursor(scene, v3d);
556                 curs[0]=curs[1]=curs[2]= 0.0;
557                 break;
558         }
559 }
560
561 static uiBlock *view3d_view_alignviewmenu(bContext *C, ARegion *ar, void *arg_unused)
562 {
563 /*              static short tog=0; */
564         uiBlock *block;
565         Object *obedit = CTX_data_edit_object(C);
566         short yco= 0, menuwidth=120;
567         
568         block= uiBeginBlock(C, ar, "view3d_view_alignviewmenu", UI_EMBOSSP);
569         uiBlockSetButmFunc(block, do_view3d_view_alignviewmenu, NULL);
570
571         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center View to Cursor|C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
572         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, "");
573         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, "");   
574
575         if (((obedit) && (obedit->type == OB_MESH)) || (FACESEL_PAINT_TEST)) {
576                 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, "");
577                 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, "");
578                 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, "");
579         } else {
580                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected|NumPad *",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
581         }
582         
583         uiBlockSetDirection(block, UI_RIGHT);
584         uiTextBoundsBlock(block, 50);
585         return block;
586 }
587 #endif
588
589 #if 0
590 static uiBlock *view3d_view_spacehandlers(bContext *C, ARegion *ar, void *arg_unused)
591 {
592         /* XXX */
593         return NULL;
594 }
595
596
597 static void do_view3d_viewmenu(bContext *C, void *arg, int event)
598 {
599         
600         switch(event) {
601         case 0: /* User */
602                 break;
603         case 1: /* Camera */
604                 break;
605         case 2: /* Top */
606                 break;
607         case 3: /* Front */
608                 break;
609         case 4: /* Side */
610                 break;
611         case 5: /* Perspective */
612                 break;
613         case 6: /* Orthographic */
614                 break;
615         case 7: /* Local View */
616                 break;
617         case 8: /* Global View */
618                 break;
619         case 9: /* View All (Home) */
620                 WM_operator_name_call(C, "VIEW3D_OT_view_all", WM_OP_EXEC_REGION_WIN, NULL);
621                 break;
622         case 11: /* View Selected */
623                 WM_operator_name_call(C, "VIEW3D_OT_view_center", WM_OP_EXEC_REGION_WIN, NULL);
624                 break;
625         case 13: /* Play Back Animation */
626                 break;
627         case 15: /* Background Image... */
628 //              add_blockhandler(sa, VIEW3D_HANDLER_BACKGROUND, UI_PNL_UNSTOW);
629                 break;
630         case 16: /* View  Panel */
631 //              add_blockhandler(sa, VIEW3D_HANDLER_PROPERTIES, UI_PNL_UNSTOW);
632                 break;
633         case 17: /* Set Clipping Border */
634                 WM_operator_name_call(C, "VIEW3D_OT_clip_border", WM_OP_INVOKE_REGION_WIN, NULL);
635                 break;
636         case 18: /* render preview */
637 //              toggle_blockhandler(sa, VIEW3D_HANDLER_PREVIEW, 0);
638                 break;
639         case 19: /* zoom within border */
640 //              view3d_border_zoom();
641                 break;
642         case 20: /* Transform  Space Panel */
643 //              add_blockhandler(sa, VIEW3D_HANDLER_TRANSFORM, UI_PNL_UNSTOW);
644                 break;  
645         case 21: /* Grease Pencil */
646 //              add_blockhandler(sa, VIEW3D_HANDLER_GREASEPENCIL, UI_PNL_UNSTOW);
647                 break;          
648         case 22: /* View all layers */
649                 do_layer_buttons(C, -2);
650                 break;
651         }
652 }
653 #endif
654
655 #if 0
656 static uiBlock *view3d_viewmenu(bContext *C, ARegion *ar, void *arg_unused)
657 {
658         ScrArea *sa= CTX_wm_area(C);
659         View3D *v3d= sa->spacedata.first;
660         RegionView3D *rv3d= wm_region_view3d(C);
661         uiBlock *block;
662         short yco= 0, menuwidth=120;
663         
664         block= uiBeginBlock(C, ar, "view3d_viewmenu", UI_EMBOSSP);
665         uiBlockSetButmFunc(block, do_view3d_viewmenu, NULL);
666         
667         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Orientations...",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 20, "");
668         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Render Preview...|Shift P",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 18, "");
669         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "View Properties...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 16, "");
670         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Background Image...",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 15, "");
671         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Grease Pencil...",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 21, "");
672         
673         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
674         
675         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, "");
676         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "User",                                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
677         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, "");
678         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Camera|NumPad 0",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
679         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, "");
680         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Top|NumPad 7",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
681         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, "");
682         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Front|NumPad 1",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
683         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, "");
684         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Side|NumPad 3",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
685         
686         uiDefIconTextBlockBut(block, view3d_view_camerasmenu, NULL, ICON_RIGHTARROW_THIN, "Cameras", 0, yco-=20, 120, 19, "");
687         
688         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
689         
690         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, "");
691         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Perspective|NumPad 5",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
692         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, "");
693         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Orthographic|NumPad 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
694         
695         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
696         
697         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, "");
698         else uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show All Layers| ~", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 22, "");
699         
700         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
701         
702         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, "");
703         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Local View|NumPad /", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
704         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, "");
705         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Global View|NumPad /",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
706         
707         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
708         
709         uiDefIconTextBlockBut(block, view3d_view_cameracontrolsmenu, NULL, ICON_RIGHTARROW_THIN, "View Navigation", 0, yco-=20, 120, 19, "");
710         uiDefIconTextBlockBut(block, view3d_view_alignviewmenu, NULL, ICON_RIGHTARROW_THIN, "Align View", 0, yco-=20, 120, 19, "");
711         
712         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
713         
714         if(rv3d->rflag & RV3D_CLIPPING)
715                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Clipping Border|Alt B",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 17, "");
716         else
717                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Clipping Border|Alt B",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 17, "");
718         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, "");
719         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View Selected|NumPad .",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
720         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View All|Home",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
721         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, "");
722         else uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Tile Window|Ctrl DownArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 99, "");
723
724         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
725         
726         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Animation|Alt A",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 13, "");
727
728 #ifndef DISABLE_PYTHON
729         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
730         uiDefIconTextBlockBut(block, view3d_view_spacehandlers, NULL, ICON_RIGHTARROW_THIN, "Space Handler Scripts", 0, yco-=20, 120, 19, "");
731 #endif
732
733         if(ar->alignment==RGN_ALIGN_TOP) {
734                 uiBlockSetDirection(block, UI_DOWN);
735         }
736         else {
737                 uiBlockSetDirection(block, UI_TOP);
738                 uiBlockFlipOrder(block);
739         }
740
741         uiTextBoundsBlock(block, 50);
742         
743         return block;
744 }
745 #endif
746
747 #if 0
748 void do_view3d_select_object_typemenu(bContext *C, void *arg, int event)
749 {
750
751         extern void selectall_type(short obtype);
752         
753         switch(event) {
754         case 1: /* Mesh */
755                 selectall_type(OB_MESH);
756                 break;
757         case 2: /* Curve */
758                 selectall_type(OB_CURVE);
759                 break;
760         case 3: /* Surface */
761                 selectall_type(OB_SURF);
762                 break;
763         case 4: /* Meta */
764                 selectall_type(OB_MBALL);
765                 break;
766         case 5: /* Armature */
767                 selectall_type(OB_ARMATURE);
768                 break;
769         case 6: /* Lattice */
770                 selectall_type(OB_LATTICE);
771                 break;
772         case 7: /* Text */
773                 selectall_type(OB_FONT);
774                 break;
775         case 8: /* Empty */
776                 selectall_type(OB_EMPTY);
777                 break;
778         case 9: /* Camera */
779                 selectall_type(OB_CAMERA);
780                 break;
781         case 10: /* Lamp */
782                 selectall_type(OB_LAMP);
783                 break;
784         case 20:
785                 do_layer_buttons(C, -2);
786                 break;
787         }
788 }
789
790 static uiBlock *view3d_select_object_typemenu(bContext *C, ARegion *ar, void *arg_unused)
791 {
792         uiBlock *block;
793         short yco = 20, menuwidth = 120;
794
795         block= uiBeginBlock(C, ar, "view3d_select_object_typemenu", UI_EMBOSSP);
796         uiBlockSetButmFunc(block, do_view3d_select_object_typemenu, NULL);
797
798         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mesh",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
799         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
800         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Surface",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
801         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
802         
803         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
804         
805         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Armature",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
806         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lattice",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
807         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Text",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
808         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Empty",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
809         
810         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
811         
812         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
813         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lamp",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
814         
815         uiBlockSetDirection(block, UI_RIGHT);
816         uiTextBoundsBlock(block, 60);
817         return block;
818 }
819
820
821 void do_view3d_select_object_layermenu(bContext *C, void *arg, int event)
822 {
823 // XXX  extern void selectall_layer(unsigned int layernum);
824         
825         switch(event) {
826         case 0:
827         case 1:
828         case 2:
829         case 3:
830         case 4:
831         case 5:
832         case 6:
833         case 7:
834         case 8:
835         case 9:
836         case 10:
837         case 11:
838         case 12:
839         case 13:
840         case 14:
841         case 15:
842         case 16:
843         case 17:
844         case 18:
845         case 19:
846         case 20:
847 // XXX          selectall_layer(event);
848                 break;
849         }
850 }
851
852 static uiBlock *view3d_select_object_layermenu(bContext *C, ARegion *ar, void *arg_unused)
853 {
854         uiBlock *block;
855         short xco= 0, yco = 20, menuwidth = 22;
856
857         block= uiBeginBlock(C, ar, "view3d_select_object_layermenu", UI_EMBOSSP);
858         uiBlockSetButmFunc(block, do_view3d_select_object_layermenu, NULL);
859
860         uiDefBut(block, BUTM, 1, "1",           xco, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
861         uiDefBut(block, BUTM, 1, "2",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
862         uiDefBut(block, BUTM, 1, "3",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
863         uiDefBut(block, BUTM, 1, "4",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
864         uiDefBut(block, BUTM, 1, "5",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
865         xco += 6;
866         uiDefBut(block, BUTM, 1, "6",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
867         uiDefBut(block, BUTM, 1, "7",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
868         uiDefBut(block, BUTM, 1, "8",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
869         uiDefBut(block, BUTM, 1, "9",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
870         uiDefBut(block, BUTM, 1, "10",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
871         xco = 0;
872         uiDefBut(block, BUTM, 1, "11",          xco, yco-=24, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
873         uiDefBut(block, BUTM, 1, "12",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
874         uiDefBut(block, BUTM, 1, "13",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
875         uiDefBut(block, BUTM, 1, "14",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
876         uiDefBut(block, BUTM, 1, "15",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
877         xco += 6;
878         uiDefBut(block, BUTM, 1, "16",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
879         uiDefBut(block, BUTM, 1, "17",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
880         uiDefBut(block, BUTM, 1, "18",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
881         uiDefBut(block, BUTM, 1, "19",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
882         uiDefBut(block, BUTM, 1, "20",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
883         
884         uiBlockSetDirection(block, UI_RIGHT);
885         /*uiTextBoundsBlock(block, 100);*/
886         return block;
887 }
888
889 void do_view3d_select_object_linkedmenu(bContext *C, void *arg, int event)
890 {
891         switch(event) {
892         case 1: /* Object Ipo */
893         case 2: /* ObData */
894         case 3: /* Current Material */
895         case 4: /* Current Texture */
896                 selectlinks(event);
897                 break;
898         }
899         countall();
900 }
901
902 static uiBlock *view3d_select_object_linkedmenu(bContext *C, ARegion *ar, void *arg_unused)
903 {
904         uiBlock *block;
905         short yco = 20, menuwidth = 120;
906
907         block= uiBeginBlock(C, ar, "view3d_select_object_linkedmenu", UI_EMBOSSP);
908         uiBlockSetButmFunc(block, do_view3d_select_object_linkedmenu, NULL);
909
910         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Ipo|Shift L, 1",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
911         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "ObData|Shift L, 2",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
912         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Material|Shift L, 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
913         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Texture|Shift L, 4",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
914         
915         uiBlockSetDirection(block, UI_RIGHT);
916         uiTextBoundsBlock(block, 60);
917         return block;
918 }
919
920 void do_view3d_select_object_groupedmenu(bContext *C, void *arg, int event)
921 {
922
923         switch(event) {
924         case 1: /* Children */
925         case 2: /* Immediate Children */
926         case 3: /* Parent */
927         case 4: /* Siblings */
928         case 5: /* Type */
929         case 6: /* Objects on Shared Layers */
930         case 7: /* Objects in Same Group */
931         case 8: /* Object Hooks*/
932         case 9: /* Object PassIndex*/
933         case 10: /* Object Color*/
934         case 11: /* Game Properties*/
935                 select_object_grouped((short)event);
936                 break;
937         }
938 }
939
940 static uiBlock *view3d_select_object_groupedmenu(bContext *C, ARegion *ar, void *arg_unused)
941 {
942         uiBlock *block;
943         short yco = 20, menuwidth = 120;
944
945         block= uiBeginBlock(C, ar, "view3d_select_object_groupedmenu", UI_EMBOSSP);
946         uiBlockSetButmFunc(block, do_view3d_select_object_groupedmenu, NULL);
947
948         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Children|Shift G, 1",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
949         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Immediate Children|Shift G, 2",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
950         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Parent|Shift G, 3",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
951         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Siblings (Shared Parent)|Shift G, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
952         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, "");
953         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, "");
954         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, "");
955         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Hooks|Shift G, 8",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
956         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object PassIndex|Shift G, 9",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
957         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Color|Shift G, 0",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");  
958         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Game Properties|Shift G, Alt+1",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");  
959
960         uiBlockSetDirection(block, UI_RIGHT);
961         uiTextBoundsBlock(block, 60);
962         return block;
963 }
964
965 #endif
966
967 static void view3d_select_objectmenu(bContext *C, uiLayout *layout, void *arg_unused)
968 {
969         uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border");
970
971         uiItemS(layout);
972
973         uiItemO(layout, "Select/Deselect All", 0, "OBJECT_OT_select_all_toggle");
974         uiItemO(layout, "Inverse", 0, "OBJECT_OT_select_inverse");
975         uiItemO(layout, "Random", 0, "OBJECT_OT_select_random");
976         uiItemO(layout, "Select All by Layer", 0, "OBJECT_OT_select_by_layer");
977         uiItemMenuEnumO(layout, "Select All by Type", 0, "OBJECT_OT_select_by_type", "type");
978         uiItemMenuEnumO(layout, "Select Grouped", 0, "OBJECT_OT_select_grouped", "type");
979
980 #if 0
981         uiDefIconTextBlockBut(block, view3d_select_object_layermenu, NULL, ICON_RIGHTARROW_THIN, "Select All by Layer", 0, yco-=20, 120, 19, "");
982         uiDefIconTextBlockBut(block, view3d_select_object_typemenu, NULL, ICON_RIGHTARROW_THIN, "Select All by Type", 0, yco-=20, 120, 19, "");
983
984         uiItemS(layout);
985
986         uiDefIconTextBlockBut(block, view3d_select_object_linkedmenu, NULL, ICON_RIGHTARROW_THIN, "Linked", 0, yco-=20, 120, 19, "");
987         uiDefIconTextBlockBut(block, view3d_select_object_groupedmenu, NULL, ICON_RIGHTARROW_THIN, "Grouped", 0, yco-=20, 120, 19, "");
988 #endif
989 }
990
991 static void view3d_select_meshmenu(bContext *C, uiLayout *layout, void *arg_unused)
992 {
993         uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border");
994
995         uiItemS(layout);
996
997         uiItemO(layout, "Select/Deselect All", 0, "MESH_OT_select_all_toggle");
998         uiItemO(layout, "Inverse", 0, "MESH_OT_select_inverse");
999
1000         uiItemS(layout);
1001
1002         uiItemO(layout, "Random...", 0, "MESH_OT_select_random"); // Random...
1003         uiItemO(layout, "Sharp Edges", 0, "MESH_OT_edges_select_sharp");
1004         uiItemO(layout, "Linked Flat Faces", 0, "MESH_OT_faces_select_linked_flat");
1005
1006         uiItemS(layout);
1007
1008         uiItemEnumO(layout, "Triangles", 0, "MESH_OT_select_by_number_vertices", "type", 3); // Ctrl Alt Shift 3
1009         uiItemEnumO(layout, "Quads", 0, "MESH_OT_select_by_number_vertices", "type", 4); // Ctrl Alt Shift 4
1010         uiItemEnumO(layout, "Loose Verts/Edges", 0, "MESH_OT_select_by_number_vertices", "type", 5); // Ctrl Alt Shift 5
1011         uiItemO(layout, "Similar...", 0, "MESH_OT_select_similar");
1012
1013         uiItemS(layout);
1014
1015         uiItemO(layout, "Less", 0, "MESH_OT_select_more");
1016         uiItemO(layout, "More", 0, "MESH_OT_select_less");
1017
1018         uiItemS(layout);
1019
1020         uiItemO(layout, "Linked", 0, "MESH_OT_select_linked");
1021         uiItemO(layout, "Vertex Path", 0, "MESH_OT_select_vertex_path"); // W, Alt 7
1022         uiItemO(layout, "Edge Loop", 0, "MESH_OT_loop_multi_select");
1023         uiItemBooleanO(layout, "Edge Ring", 0, "MESH_OT_loop_multi_select", "ring", 1);
1024
1025         uiItemS(layout);
1026
1027         uiItemO(layout, NULL, 0, "MESH_OT_loop_to_region"); // Ctrl E 8
1028         uiItemO(layout, NULL, 0, "MESH_OT_region_to_loop"); // Ctrl E 9
1029 }
1030
1031 static void view3d_select_curvemenu(bContext *C, uiLayout *layout, void *arg_unused)
1032 {
1033         Object *obedit= CTX_data_edit_object(C);
1034
1035         uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border");
1036         uiItemO(layout, NULL, 0, "VIEW3D_OT_select_circle");
1037
1038         uiItemS(layout);
1039
1040         uiItemO(layout, NULL, 0, "CURVE_OT_select_all_toggle");
1041         uiItemO(layout, NULL, 0, "CURVE_OT_select_inverse");
1042         uiItemO(layout, NULL, 0, "CURVE_OT_select_random"); // Random...
1043         uiItemO(layout, NULL, 0, "CURVE_OT_select_every_nth"); // Every Nth..
1044
1045         uiItemS(layout);
1046
1047         if(obedit->type == OB_SURF) {
1048                 uiItemO(layout, NULL, 0, "CURVE_OT_select_row");
1049         }
1050         else {
1051                 uiItemO(layout, NULL, 0, "CURVE_OT_de_select_first");
1052                 uiItemO(layout, NULL, 0, "CURVE_OT_de_select_last");
1053                 uiItemO(layout, NULL, 0, "CURVE_OT_select_next");
1054                 uiItemO(layout, NULL, 0, "CURVE_OT_select_previous");
1055         }
1056
1057         uiItemS(layout);
1058
1059         uiItemO(layout, NULL, 0, "CURVE_OT_select_more");
1060         uiItemO(layout, NULL, 0, "CURVE_OT_select_less");
1061
1062         /* commented out because it seems to only like the LKEY method - based on mouse pointer position :( */
1063         /* uiItemO(layout, NULL, 0, "CURVE_OT_select_linked"); */
1064
1065 #if 0
1066         G.qual |= LR_CTRLKEY;
1067         select_connected_nurb();
1068         G.qual &= ~LR_CTRLKEY;
1069         break;*/
1070 #endif
1071 }
1072
1073 static void view3d_select_metaballmenu(bContext *C, uiLayout *layout, void *arg_unused)
1074 {
1075         uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border");
1076         uiItemS(layout);
1077         uiItemO(layout, NULL, 0, "MBALL_OT_select_deselect_all_metaelems");
1078         uiItemO(layout, NULL, 0, "MBALL_OT_select_inverse_metaelems");
1079         uiItemS(layout);
1080         uiItemO(layout, NULL, 0, "MBALL_OT_select_random_metaelems");
1081 }
1082
1083 static void view3d_select_latticemenu(bContext *C, uiLayout *layout, void *arg_unused)
1084 {
1085         uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border");
1086         uiItemS(layout);
1087         uiItemO(layout, NULL, 0, "LATTICE_OT_select_all_toggle");
1088 }
1089
1090 static void view3d_select_armaturemenu(bContext *C, uiLayout *layout, void *arg_unused)
1091 {
1092         PointerRNA ptr;
1093
1094         uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border");
1095
1096         uiItemS(layout);
1097
1098         uiItemO(layout, "Select/Deselect All", 0, "ARMATURE_OT_select_all_toggle");
1099         uiItemO(layout, "Inverse", 0, "ARMATURE_OT_select_inverse");
1100
1101         uiItemS(layout);
1102
1103         uiItemEnumO(layout, "Parent", 0, "ARMATURE_OT_select_hierarchy", "direction", BONE_SELECT_PARENT);
1104         uiItemEnumO(layout, "Child", 0, "ARMATURE_OT_select_hierarchy", "direction", BONE_SELECT_CHILD);
1105
1106         uiItemS(layout);
1107
1108         WM_operator_properties_create(&ptr, "ARMATURE_OT_select_hierarchy");
1109         RNA_boolean_set(&ptr, "extend", 1);
1110         RNA_enum_set(&ptr, "direction", BONE_SELECT_PARENT);
1111         uiItemFullO(layout, "Extend Parent", 0, "ARMATURE_OT_select_hierarchy", ptr.data, WM_OP_EXEC_REGION_WIN);
1112
1113         WM_operator_properties_create(&ptr, "ARMATURE_OT_select_hierarchy");
1114         RNA_boolean_set(&ptr, "extend", 1);
1115         RNA_enum_set(&ptr, "direction", BONE_SELECT_CHILD);
1116         uiItemFullO(layout, "Extend Child", 0, "ARMATURE_OT_select_hierarchy", ptr.data, WM_OP_EXEC_REGION_WIN);
1117 }
1118
1119 static void view3d_select_posemenu(bContext *C, uiLayout *layout, void *arg_unused)
1120 {
1121         PointerRNA ptr;
1122
1123         uiItemO(layout, NULL, 0, "VIEW3D_OT_select_border");
1124
1125         uiItemS(layout);
1126
1127         uiItemO(layout, "Select/Deselect All", 0, "POSE_OT_select_all_toggle");
1128         uiItemO(layout, "Inverse", 0, "POSE_OT_select_inverse");
1129         uiItemO(layout, "Constraint Target", 0, "POSE_OT_select_constraint_target");
1130
1131         uiItemS(layout);
1132
1133         uiItemEnumO(layout, "Parent", 0, "POSE_OT_select_hierarchy", "direction", BONE_SELECT_PARENT);
1134         uiItemEnumO(layout, "Child", 0, "POSE_OT_select_hierarchy", "direction", BONE_SELECT_CHILD);
1135
1136         uiItemS(layout);
1137
1138         WM_operator_properties_create(&ptr, "POSE_OT_select_hierarchy");
1139         RNA_boolean_set(&ptr, "extend", 1);
1140         RNA_enum_set(&ptr, "direction", BONE_SELECT_PARENT);
1141         uiItemFullO(layout, "Extend Parent", 0, "POSE_OT_select_hierarchy", ptr.data, WM_OP_EXEC_REGION_WIN);
1142
1143         WM_operator_properties_create(&ptr, "POSE_OT_select_hierarchy");
1144         RNA_boolean_set(&ptr, "extend", 1);
1145         RNA_enum_set(&ptr, "direction", BONE_SELECT_CHILD);
1146         uiItemFullO(layout, "Extend Child", 0, "POSE_OT_select_hierarchy", ptr.data, WM_OP_EXEC_REGION_WIN);
1147 }
1148
1149 void do_view3d_select_faceselmenu(bContext *C, void *arg, int event)
1150 {
1151 #if 0
1152         /* events >= 6 are registered bpython scripts */
1153 #ifndef DISABLE_PYTHON
1154         if (event >= 6) BPY_menu_do_python(PYMENU_FACESELECT, event - 6);
1155 #endif
1156         
1157         switch(event) {
1158                 case 0: /* border select */
1159                         borderselect();
1160                         break;
1161                 case 2: /* Select/Deselect all */
1162                         deselectall_tface();
1163                         break;
1164                 case 3: /* Select Inverse */
1165                         selectswap_tface();
1166                         break;
1167                 case 4: /* Select Linked */
1168                         select_linked_tfaces(2);
1169                         break;
1170         }
1171 #endif
1172 }
1173
1174 static uiBlock *view3d_select_faceselmenu(bContext *C, ARegion *ar, void *arg_unused)
1175 {
1176         uiBlock *block;
1177         short yco= 0, menuwidth=120;
1178 #ifndef DISABLE_PYTHON
1179 // XXX  BPyMenu *pym;
1180 //      int i = 0;
1181 #endif
1182
1183         block= uiBeginBlock(C, ar, "view3d_select_faceselmenu", UI_EMBOSSP);
1184         uiBlockSetButmFunc(block, do_view3d_select_faceselmenu, NULL);
1185         
1186         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1187         
1188         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1189         
1190         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1191         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1192
1193         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1194         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Linked Faces|Ctrl L",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1195
1196 #ifndef DISABLE_PYTHON
1197 //      uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1198
1199         /* note that we account for the 6 previous entries with i+6: */
1200 //      for (pym = BPyMenuTable[PYMENU_FACESELECT]; pym; pym = pym->next, i++) {
1201 //              uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20,
1202 //                      menuwidth, 19, NULL, 0.0, 0.0, 1, i+6,
1203 //                      pym->tooltip?pym->tooltip:pym->filename);
1204 //      }
1205 #endif
1206         
1207         if(ar->alignment==RGN_ALIGN_TOP) {
1208                 uiBlockSetDirection(block, UI_DOWN);
1209         }
1210         else {
1211                 uiBlockSetDirection(block, UI_TOP);
1212                 uiBlockFlipOrder(block);
1213         }
1214
1215         uiTextBoundsBlock(block, 50);
1216         return block;
1217 }
1218
1219 static void view3d_edit_snapmenu(bContext *C, uiLayout *layout, void *arg_unused)
1220 {
1221         uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_selected_to_grid");
1222         uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_selected_to_cursor");
1223         uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_selected_to_center");
1224
1225         uiItemS(layout);
1226
1227         uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_cursor_to_selected");
1228         uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_cursor_to_grid");
1229         uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_cursor_to_active");
1230 }
1231
1232 void do_view3d_transform_moveaxismenu(bContext *C, void *arg, int event)
1233 {
1234 #if 0
1235         float mat[3][3];
1236         
1237         Mat3One(mat);
1238         
1239         switch(event)
1240         {
1241             case 0: /* X Global */
1242                         initTransform(TFM_TRANSLATION, CTX_NONE);
1243                         BIF_setSingleAxisConstraint(mat[0], " X");
1244                         Transform();
1245                         break;
1246                 case 1: /* Y Global */
1247                         initTransform(TFM_TRANSLATION, CTX_NONE);
1248                         BIF_setSingleAxisConstraint(mat[1], " Y");
1249                         Transform();
1250                         break;
1251                 case 2: /* Z Global */
1252                         initTransform(TFM_TRANSLATION, CTX_NONE);
1253                         BIF_setSingleAxisConstraint(mat[2], " Z");
1254                         Transform();
1255                         break;
1256                 case 3: /* X Local */
1257                         initTransform(TFM_TRANSLATION, CTX_NONE);
1258                         BIF_setLocalAxisConstraint('X', " X");
1259                         Transform();
1260                         break;
1261                 case 4: /* Y Local */
1262                         initTransform(TFM_TRANSLATION, CTX_NONE);
1263                         BIF_setLocalAxisConstraint('Y', " Y");
1264                         Transform();
1265                         break;
1266                 case 5: /* Z Local */
1267                         initTransform(TFM_TRANSLATION, CTX_NONE);
1268                         BIF_setLocalAxisConstraint('Z', " Z");
1269                         Transform();
1270                         break;
1271         }
1272 #endif
1273 }
1274
1275 static uiBlock *view3d_transform_moveaxismenu(bContext *C, ARegion *ar, void *arg_unused)
1276 {
1277         uiBlock *block;
1278         short yco = 20, menuwidth = 120;
1279
1280         block= uiBeginBlock(C, ar, "view3d_transform_moveaxismenu", UI_EMBOSSP);
1281         uiBlockSetButmFunc(block, do_view3d_transform_moveaxismenu, NULL);
1282
1283         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|G, X",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1284         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|G, Y",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1285         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|G, Z",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1286         
1287         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1288         
1289         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|G, X, X",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1290         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|G, Y, Y",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1291         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|G, Z, Z",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1292         
1293         
1294         uiBlockSetDirection(block, UI_RIGHT);
1295         uiTextBoundsBlock(block, 60);
1296         return block;
1297 }
1298
1299 void do_view3d_transform_rotateaxismenu(bContext *C, void *arg, int event)
1300 {
1301 #if 0
1302         float mat[3][3];
1303         
1304         Mat3One(mat);
1305         
1306         switch(event)
1307         {
1308             case 0: /* X Global */
1309                         initTransform(TFM_ROTATION, CTX_NONE);
1310                         BIF_setSingleAxisConstraint(mat[0], " X");
1311                         Transform();
1312                         break;
1313                 case 1: /* Y Global */
1314                         initTransform(TFM_ROTATION, CTX_NONE);
1315                         BIF_setSingleAxisConstraint(mat[1], " Y");
1316                         Transform();
1317                         break;
1318                 case 2: /* Z Global */
1319                         initTransform(TFM_ROTATION, CTX_NONE);
1320                         BIF_setSingleAxisConstraint(mat[2], " Z");
1321                         Transform();
1322                         break;
1323                 case 3: /* X Local */
1324                         initTransform(TFM_ROTATION, CTX_NONE);
1325                         BIF_setLocalAxisConstraint('X', " X");
1326                         Transform();
1327                         break;
1328                 case 4: /* Y Local */
1329                         initTransform(TFM_ROTATION, CTX_NONE);
1330                         BIF_setLocalAxisConstraint('Y', " Y");
1331                         Transform();
1332                         break;
1333                 case 5: /* Z Local */
1334                         initTransform(TFM_ROTATION, CTX_NONE);
1335                         BIF_setLocalAxisConstraint('Z', " Z");
1336                         Transform();
1337                         break;
1338         }
1339 #endif
1340 }
1341
1342 static uiBlock *view3d_transform_rotateaxismenu(bContext *C, ARegion *ar, void *arg_unused)
1343 {
1344         uiBlock *block;
1345         short yco = 20, menuwidth = 120;
1346
1347         block= uiBeginBlock(C, ar, "view3d_transform_rotateaxismenu", UI_EMBOSSP);
1348         uiBlockSetButmFunc(block, do_view3d_transform_rotateaxismenu, NULL);
1349
1350         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|R, X",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1351         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|R, Y",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1352         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|R, Z",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1353         
1354         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1355         
1356         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|R, X, X",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1357         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|R, Y, Y",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1358         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|R, Z, Z",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1359         
1360         
1361         uiBlockSetDirection(block, UI_RIGHT);
1362         uiTextBoundsBlock(block, 60);
1363         return block;
1364 }
1365
1366 void do_view3d_transform_scaleaxismenu(bContext *C, void *arg, int event)
1367 {
1368 #if 0
1369         float mat[3][3];
1370         
1371         Mat3One(mat);
1372         
1373         switch(event)
1374         {
1375             case 0: /* X Global */
1376                         initTransform(TFM_RESIZE, CTX_NONE);
1377                         BIF_setSingleAxisConstraint(mat[0], " X");
1378                         Transform();
1379                         break;
1380                 case 1: /* Y Global */
1381                         initTransform(TFM_RESIZE, CTX_NONE);
1382                         BIF_setSingleAxisConstraint(mat[1], " Y");
1383                         Transform();
1384                         break;
1385                 case 2: /* Z Global */
1386                         initTransform(TFM_RESIZE, CTX_NONE);
1387                         BIF_setSingleAxisConstraint(mat[2], " Z");
1388                         Transform();
1389                         break;
1390                 case 3: /* X Local */
1391                         initTransform(TFM_RESIZE, CTX_NONE);
1392                         BIF_setLocalAxisConstraint('X', " X");
1393                         Transform();
1394                         break;
1395                 case 4: /* Y Local */
1396                         initTransform(TFM_RESIZE, CTX_NONE);
1397                         BIF_setLocalAxisConstraint('X', " X");
1398                         Transform();
1399                         break;
1400                 case 5: /* Z Local */
1401                         initTransform(TFM_RESIZE, CTX_NONE);
1402                         BIF_setLocalAxisConstraint('X', " X");
1403                         Transform();
1404                         break;
1405         }
1406 #endif
1407 }
1408
1409 static uiBlock *view3d_transform_scaleaxismenu(bContext *C, ARegion *ar, void *arg_unused)
1410 {
1411         uiBlock *block;
1412         short yco = 20, menuwidth = 120;
1413
1414         block= uiBeginBlock(C, ar, "view3d_transform_scaleaxismenu", UI_EMBOSSP);
1415         uiBlockSetButmFunc(block, do_view3d_transform_scaleaxismenu, NULL);
1416
1417         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|S, X",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1418         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|S, Y",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1419         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|S, Z",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1420         
1421         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1422         
1423         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|S, X, X",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1424         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|S, Y, Y",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1425         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|S, Z, Z",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1426         
1427         
1428         uiBlockSetDirection(block, UI_RIGHT);
1429         uiTextBoundsBlock(block, 60);
1430         return block;
1431 }
1432
1433 static void do_view3d_transformmenu(bContext *C, void *arg, int event)
1434 {
1435 #if 0
1436         Scene *scene= CTX_data_scene(C);
1437         ToolSettings *ts= CTX_data_tool_settings(C);
1438         
1439         switch(event) {
1440         case 1:
1441                 initTransform(TFM_TRANSLATION, CTX_NONE);
1442                 Transform();
1443                 break;
1444         case 2:
1445                 initTransform(TFM_ROTATION, CTX_NONE);
1446                 Transform();
1447                 break;
1448         case 3:
1449                 initTransform(TFM_RESIZE, CTX_NONE);
1450                 Transform();
1451                 break;
1452         case 4:
1453                 image_aspect();
1454                 break;
1455         case 5:
1456                 initTransform(TFM_TOSPHERE, CTX_NONE);
1457                 Transform();
1458                 break;
1459         case 6:
1460                 initTransform(TFM_SHEAR, CTX_NONE);
1461                 Transform();
1462                 break;
1463         case 7:
1464                 initTransform(TFM_WARP, CTX_NONE);
1465                 Transform();
1466                 break;
1467         case 8:
1468                 initTransform(TFM_PUSHPULL, CTX_NONE);
1469                 Transform();
1470                 break;
1471         case 9:
1472                 if (obedit) {
1473                         if (obedit->type == OB_MESH)
1474                                 initTransform(TFM_SHRINKFATTEN, CTX_NONE);
1475                                 Transform();
1476                 } else error("Only meshes can be shrinked/fattened");
1477                 break;
1478         case 10:
1479                 docenter(0);
1480                 break;
1481         case 11:
1482                 docenter_new();
1483                 break;
1484         case 12:
1485                 docenter_cursor();
1486                 break;
1487         case 13:
1488                 initTransform(TFM_TILT, CTX_NONE);
1489                 Transform();
1490                 break;
1491         case 14:
1492                 initTransform(TFM_CURVE_SHRINKFATTEN, CTX_NONE);
1493                 Transform();
1494                 break;
1495         case 15:
1496                 ts->snap_flag &= ~SCE_SNAP;
1497                 break;
1498         case 16:
1499                 ts->snap_flag |= SCE_SNAP;
1500                 break;
1501         case 17:
1502                 ts->snap_target = SCE_SNAP_TARGET_CLOSEST;
1503                 break;
1504         case 18:
1505                 ts->snap_target = SCE_SNAP_TARGET_CENTER;
1506                 break;
1507         case 19:
1508                 ts->snap_target = SCE_SNAP_TARGET_MEDIAN;
1509                 break;
1510         case 20:
1511                 ts->snap_target = SCE_SNAP_TARGET_ACTIVE;
1512                 break;
1513         case 21:
1514                 alignmenu();
1515                 break;
1516         }
1517 #endif
1518 }
1519
1520 static uiBlock *view3d_transformmenu(bContext *C, ARegion *ar, void *arg_unused)
1521 {
1522         ToolSettings *ts= CTX_data_tool_settings(C);
1523         Object *obedit = CTX_data_edit_object(C);
1524         uiBlock *block;
1525         short yco = 20, menuwidth = 120;
1526
1527         block= uiBeginBlock(C, ar, "view3d_transformmenu", UI_EMBOSSP);
1528         uiBlockSetButmFunc(block, do_view3d_transformmenu, NULL);
1529
1530         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move|G",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1531         uiDefIconTextBlockBut(block, view3d_transform_moveaxismenu, NULL, ICON_RIGHTARROW_THIN, "Grab/Move on Axis", 0, yco-=20, 120, 19, "");
1532                 
1533         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate|R",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1534         uiDefIconTextBlockBut(block, view3d_transform_rotateaxismenu, NULL, ICON_RIGHTARROW_THIN, "Rotate on Axis", 0, yco-=20, 120, 19, "");
1535
1536         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale|S",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1537         uiDefIconTextBlockBut(block, view3d_transform_scaleaxismenu, NULL, ICON_RIGHTARROW_THIN, "Scale on Axis", 0, yco-=20, 120, 19, "");
1538
1539         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1540         
1541         if (obedit) {
1542                 if (obedit->type == OB_MESH)
1543                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shrink/Fatten Along Normals|Alt S",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
1544                 else if (obedit->type == OB_CURVE) {
1545                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Tilt|T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
1546                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shrink/Fatten Radius|Alt S",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
1547                 }
1548         }
1549         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "To Sphere|Ctrl Shift S",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1550         if (obedit) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl S",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1551         else uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl Shift Alt S",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1552         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Warp|Shift W",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1553         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Push/Pull|Shift P",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
1554         
1555         if (!obedit) {
1556                 uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1557                 
1558                 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, "");
1559         }
1560         
1561         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1562
1563         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "ObData to Center",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
1564         if (!obedit) {
1565                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center New",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
1566                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center Cursor",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
1567                 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, "");
1568         }
1569         
1570         if (BIF_snappingSupported(obedit))
1571         {
1572                 uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1573         
1574                 if (ts->snap_flag & SCE_SNAP)
1575                 {
1576                         uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Grid",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
1577                         uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
1578                 }
1579                 else
1580                 {
1581                         uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Grid",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
1582                         uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
1583                 }
1584                         
1585                 uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1586
1587                 switch(ts->snap_target)
1588                 {
1589                         case SCE_SNAP_TARGET_CLOSEST:
1590                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Closest",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
1591                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Center",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
1592                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Median",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1593                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Active",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
1594                                 break;
1595                         case SCE_SNAP_TARGET_CENTER:
1596                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Closest",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
1597                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Center",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
1598                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Median",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1599                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Active",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
1600                                 break;
1601                         case SCE_SNAP_TARGET_MEDIAN:
1602                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Closest",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
1603                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Center",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
1604                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Median",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1605                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Active",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
1606                                 break;
1607                         case SCE_SNAP_TARGET_ACTIVE:
1608                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Closest",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
1609                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Center",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
1610                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Median",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1611                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Active",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
1612                                 break;
1613                 }
1614         }
1615
1616         uiBlockSetDirection(block, UI_RIGHT);
1617         uiTextBoundsBlock(block, 60);
1618         return block;
1619 }
1620
1621 #if 0
1622 void do_view3d_object_mirrormenu(bContext *C, void *arg, int event)
1623 {
1624 #if 0
1625         switch(event) {
1626                 case 0:
1627                         initTransform(TFM_MIRROR, CTX_NO_PET);
1628                         Transform();
1629                         break;
1630                 case 1:
1631                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
1632                         BIF_setLocalAxisConstraint('X', " on X axis");
1633                         Transform();
1634                         break;
1635                 case 2:
1636                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
1637                         BIF_setLocalAxisConstraint('Y', " on Y axis");
1638                         Transform();
1639                         break;
1640                 case 3:
1641                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
1642                         BIF_setLocalAxisConstraint('Z', " on Z axis");
1643                         Transform();
1644                         break;
1645         }
1646 #endif
1647 }
1648
1649 static uiBlock *view3d_object_mirrormenu(bContext *C, ARegion *ar, void *arg_unused)
1650 {
1651         uiBlock *block;
1652         short yco = 20, menuwidth = 120;
1653
1654         block= uiBeginBlock(C, ar, "view3d_object_mirrormenu", UI_EMBOSSP);
1655         uiBlockSetButmFunc(block, do_view3d_object_mirrormenu, NULL);
1656         
1657         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Interactive Mirror|Ctrl M",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1658         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1659         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|Ctrl M, X",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1660         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, Y",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1661         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, Z",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1662
1663         uiBlockSetDirection(block, UI_RIGHT);
1664         uiTextBoundsBlock(block, 60);
1665         return block;
1666 }
1667 #endif
1668
1669 static void view3d_edit_object_transformmenu(bContext *C, uiLayout *layout, void *arg_unused)
1670 {
1671 #if 0
1672         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, "");
1673         apply_objects_locrot();
1674         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Visual Transform|Ctrl A, 2",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1675         apply_objects_visual_tx();
1676         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Deformation|Ctrl Shift A",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1677         if(OBACT) object_apply_deform(OBACT);
1678 #endif
1679         uiItemO(layout, NULL, 0, "OBJECT_OT_duplicates_make_real");
1680
1681         uiItemS(layout);
1682
1683         uiItemO(layout, NULL, 0, "OBJECT_OT_location_clear");
1684         uiItemO(layout, NULL, 0, "OBJECT_OT_rotation_clear");
1685         uiItemO(layout, NULL, 0, "OBJECT_OT_scale_clear");
1686         uiItemO(layout, NULL, 0, "OBJECT_OT_origin_clear");
1687 }
1688
1689 #if 0
1690 static void do_view3d_edit_object_makelocalmenu(bContext *C, void *arg, int event)
1691 {
1692 #if 0
1693         switch(event) {
1694                 case 1:
1695                 case 2:
1696                 case 3:
1697                         make_local(event);
1698                         break;
1699         }
1700 #endif
1701 }
1702
1703 static uiBlock *view3d_edit_object_makelocalmenu(bContext *C, ARegion *ar, void *arg_unused)
1704 {       
1705         uiBlock *block;
1706         short yco = 20, menuwidth = 120;
1707         
1708         block= uiBeginBlock(C, ar, "view3d_edit_object_makelocalmenu", UI_EMBOSSP);
1709         uiBlockSetButmFunc(block, do_view3d_edit_object_makelocalmenu, NULL);
1710         
1711         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selected Objects|L, 1",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1712         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selected Objects and Data|L, 2",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1713         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "All|L, 3",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1714         
1715         uiBlockSetDirection(block, UI_RIGHT);
1716         uiTextBoundsBlock(block, 60);
1717         return block;
1718 }
1719
1720 static void do_view3d_edit_object_makelinksmenu(bContext *C, void *arg, int event)
1721 {
1722 #if 0
1723         switch(event) {
1724         case 1:
1725         case 2:
1726         case 3:
1727         case 4:
1728                 make_links((short)event);
1729                 break;
1730                 }
1731 #endif
1732 }
1733
1734 static uiBlock *view3d_edit_object_makelinksmenu(bContext *C, ARegion *ar, void *arg_unused)
1735 {
1736         Scene *scene= CTX_data_scene(C);
1737         Object *ob=NULL;
1738         
1739         uiBlock *block;
1740         short yco = 20, menuwidth = 120;
1741
1742         block= uiBeginBlock(C, ar, "view3d_edit_object_makelinksmenu", UI_EMBOSSP);
1743         uiBlockSetButmFunc(block, do_view3d_edit_object_makelinksmenu, NULL);
1744         
1745         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "To Scene...|Ctrl L, 1",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1746         
1747         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1748         
1749         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Ipo|Ctrl L, 2",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1750         
1751         if ((ob=OBACT)) {
1752         
1753                 if(ob->type==OB_MESH) {
1754                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mesh Data|Ctrl L, 3",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1755                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1756                 } else if(ob->type==OB_CURVE) {
1757                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve Data|Ctrl L, 3",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1758                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1759                 } else if(ob->type==OB_FONT) {
1760                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Text Data|Ctrl L, 3",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1761                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1762                 } else if(ob->type==OB_SURF) {
1763                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Surface Data|Ctrl L, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1764                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1765                 } else if(ob->type==OB_MBALL) {
1766                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1767                 } else if(ob->type==OB_CAMERA) {
1768                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera Data|Ctrl L, 3",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1769                 } else if(ob->type==OB_LAMP) {
1770                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lamp Data|Ctrl L, 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1771                 } else if(ob->type==OB_LATTICE) {
1772                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lattice Data|Ctrl L, 3",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1773                 } else if(ob->type==OB_ARMATURE) {
1774                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Armature Data|Ctrl L, 3",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1775                 }
1776         }
1777         
1778         uiBlockSetDirection(block, UI_RIGHT);
1779         uiTextBoundsBlock(block, 60);
1780         return block;
1781 }
1782
1783 static void do_view3d_edit_object_singleusermenu(bContext *C, void *arg, int event)
1784 {
1785 #if 0
1786         switch(event) {
1787         case 1: /* Object */
1788                 single_object_users(1);
1789                 break;
1790         case 2: /* Object & ObData */ 
1791                 single_object_users(1);
1792                 single_obdata_users(1);
1793                 break;
1794         case 3: /* Object & ObData & Materials+Tex */
1795                 single_object_users(1);
1796                 single_obdata_users(1);
1797                 single_mat_users(1); /* also tex */
1798                 break;
1799         case 4: /* Materials+Tex */
1800                 single_mat_users(1);
1801                 break;
1802         case 5: /* Ipo */
1803                 single_ipo_users(1);
1804                 break;
1805         }
1806         
1807         clear_id_newpoins();
1808         countall();
1809         
1810 #endif
1811 }
1812
1813 static uiBlock *view3d_edit_object_singleusermenu(bContext *C, ARegion *ar, void *arg_unused)
1814 {
1815
1816         uiBlock *block;
1817         short yco = 20, menuwidth = 120;
1818
1819         block= uiBeginBlock(C, ar, "view3d_edit_object_singleusermenu", UI_EMBOSSP);
1820         uiBlockSetButmFunc(block, do_view3d_edit_object_singleusermenu, NULL);
1821         
1822         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object|U, 1",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1823         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object & ObData|U, 2",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1824         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object & ObData & Materials+Tex|U, 3",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1825         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials+Tex|U, 4",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1826         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Ipos|U, 5",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1827         
1828         uiBlockSetDirection(block, UI_RIGHT);
1829         uiTextBoundsBlock(block, 60);
1830         return block;
1831 }
1832
1833 static void do_view3d_edit_object_copyattrmenu(bContext *C, void *arg, int event)
1834 {
1835         switch(event) {
1836         case 1:
1837         case 2:
1838         case 3:
1839         case 4:
1840         case 5:
1841         case 6:
1842         case 7:
1843         case 8:
1844         case 9:
1845         case 10:
1846         case 11:
1847         case 17:
1848         case 18:
1849         case 19:
1850         case 20:
1851         case 21:
1852         case 22:
1853         case 23:
1854         case 24:
1855         case 25:
1856         case 26:
1857         case 29:
1858         case 30:
1859 // XXX          copy_attr((short)event);
1860                 break;
1861                 }
1862 }
1863
1864 static uiBlock *view3d_edit_object_copyattrmenu(bContext *C, ARegion *ar, void *arg_unused)
1865 {
1866         Scene *scene= CTX_data_scene(C);
1867         Object *ob=NULL;
1868         
1869         uiBlock *block;
1870         short yco = 20, menuwidth = 120;
1871
1872         block= uiBeginBlock(C, ar, "view3d_edit_object_copyattrmenu", UI_EMBOSSP);
1873         uiBlockSetButmFunc(block, do_view3d_edit_object_copyattrmenu, NULL);
1874         
1875         ob= OBACT;
1876         
1877         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Location|Ctrl C, 1",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1878         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotation|Ctrl C, 2",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1879         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Size|Ctrl C, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1880         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Drawtype|Ctrl C, 4",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1881         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Time Offset|Ctrl C, 5",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1882         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Dupli|Ctrl C, 6",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1883         
1884         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1885         
1886         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mass|Ctrl C, 7",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1887         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Damping|Ctrl C, 8",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
1888         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "All Physical Attributes|Ctrl C, 11",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
1889         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Properties|Ctrl C, 9",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
1890         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Logic Bricks|Ctrl C, 10",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
1891         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Protected Transform |Ctrl C",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 29, "");
1892         
1893         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1894         
1895         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Constraints|Ctrl C",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
1896         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NLA Strips|Ctrl C",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 26, "");
1897         
1898         if (ob) {
1899         
1900                 if ((ob->type == OB_MESH) || (ob->type == OB_CURVE) || (ob->type == OB_SURF) ||
1901                                 (ob->type == OB_FONT) || (ob->type == OB_MBALL)) {
1902                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Texture Space|Ctrl C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
1903                 }       
1904                 
1905                 if(ob->type == OB_FONT) {
1906                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Font Settings|Ctrl C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
1907                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel Settings|Ctrl C",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1908                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve Resolution|Ctrl C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
1909                 }
1910                 if(ob->type == OB_CURVE) {
1911                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel Settings|Ctrl C",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1912                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve Resolution|Ctrl C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
1913                 }
1914         
1915                 if(ob->type==OB_MESH) {
1916                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subsurf Settings|Ctrl C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 21, "");
1917                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Modifiers ...|Ctrl C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 24, "");
1918                 }
1919                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Pass Index|Ctrl C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 30, "");
1920         }
1921         
1922         uiBlockSetDirection(block, UI_RIGHT);
1923         uiTextBoundsBlock(block, 60);
1924         return block;
1925 }
1926 #endif
1927
1928 static void view3d_edit_object_parentmenu(bContext *C, uiLayout *layout, void *arg_unused)
1929 {
1930         uiItemO(layout, "Make Parent...", 0, "OBJECT_OT_parent_set");
1931         uiItemO(layout, "Clear Parent...", 0, "OBJECT_OT_parent_clear");
1932 }
1933
1934 static void view3d_edit_object_groupmenu(bContext *C, uiLayout *layout, void *arg_unused)
1935 {
1936         uiItemO(layout, NULL, 0, "GROUP_OT_group_create");
1937         uiItemO(layout, NULL, 0, "GROUP_OT_objects_remove");
1938
1939         uiItemS(layout);
1940
1941         uiItemO(layout, NULL, 0, "GROUP_OT_objects_add_active");
1942         uiItemO(layout, NULL, 0, "GROUP_OT_objects_remove_active");
1943 }
1944
1945 static void view3d_edit_object_trackmenu(bContext *C, uiLayout *layout, void *arg_unused)
1946 {
1947         uiItemO(layout, "Make Track...", 0, "OBJECT_OT_track_set");
1948         uiItemO(layout, "Clear Track...", 0, "OBJECT_OT_track_clear");
1949 }
1950
1951 static void view3d_edit_object_constraintsmenu(bContext *C, uiLayout *layout, void *arg_unused)
1952 {
1953         uiItemO(layout, NULL, 0, "OBJECT_OT_constraint_add_with_targets");
1954         uiItemO(layout, NULL, 0, "OBJECT_OT_constraints_clear");
1955 }
1956
1957 static void view3d_edit_object_showhidemenu(bContext *C, uiLayout *layout, void *arg_unused)
1958 {
1959         uiItemO(layout, "Show Hidden", 0, "OBJECT_OT_restrictview_clear");
1960         uiItemO(layout, "Hide Selected", 0, "OBJECT_OT_restrictview_set");
1961         uiItemBooleanO(layout, "Hide Unselected", 0, "OBJECT_OT_restrictview_set", "unselected", 1);
1962 }
1963
1964 #if 0
1965 #ifndef DISABLE_PYTHON
1966 static void do_view3d_edit_object_scriptsmenu(bContext *C, void *arg, int event)
1967 {
1968 #if 0
1969         BPY_menu_do_python(PYMENU_OBJECT, event);
1970
1971 #endif
1972 }
1973
1974 static uiBlock *view3d_edit_object_scriptsmenu(bContext *C, ARegion *ar, void *arg_unused)
1975 {
1976         uiBlock *block;
1977 //      short yco = 20, menuwidth = 120;
1978 // XXX  BPyMenu *pym;
1979 //      int i = 0;
1980
1981         block= uiBeginBlock(C, ar, "v3d_eobject_pymenu", UI_EMBOSSP);
1982         uiBlockSetButmFunc(block, do_view3d_edit_object_scriptsmenu, NULL);
1983
1984 //      for (pym = BPyMenuTable[PYMENU_OBJECT]; pym; pym = pym->next, i++) {
1985 //              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);
1986 //      }
1987
1988         uiBlockSetDirection(block, UI_RIGHT);
1989         uiTextBoundsBlock(block, 60);
1990
1991         return block;
1992 }
1993 #endif /* DISABLE_PYTHON */
1994 #endif
1995
1996
1997 #if 0
1998 static void do_view3d_edit_objectmenu(bContext *C, void *arg, int event)
1999 {
2000         Scene *scene= CTX_data_scene(C);
2001         ScrArea *sa= CTX_wm_area(C);
2002         View3D *v3d= sa->spacedata.first;
2003         
2004         switch(event) {
2005          
2006         case 0: /* transform    properties*/
2007 // XXX          mainqenter(NKEY, 1);
2008                 break;
2009         case 5: /* make single user */
2010                 single_user();
2011                 break;
2012         case 7: /* boolean operation */
2013                 special_editmenu();
2014                 break;
2015         case 8: /* join objects */
2016                 join_menu();
2017                 break;
2018         case 9: /* convert object type */
2019                 convertmenu();
2020                 break;
2021         case 10: /* move to layer */
2022                 movetolayer();
2023                 break;
2024         case 11: /* insert keyframe */
2025                 common_insertkey();
2026                 break;
2027         case 16: /* make proxy object*/
2028                 make_proxy();
2029                 break;
2030         case 18: /* delete keyframe */
2031                 common_deletekey();
2032                 break; 
2033         }
2034 }
2035 #endif
2036
2037 static void view3d_edit_objectmenu(bContext *C, uiLayout *layout, void *arg_unused)
2038 {
2039 #if 0
2040         Object *ob= CTX_data_active_object(C);
2041
2042         uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
2043         uiDefIconTextBlockBut(block, view3d_object_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
2044 #endif
2045
2046         uiItemMenuF(layout, "Clear/Apply", 0, view3d_edit_object_transformmenu);
2047         uiItemMenuF(layout, "Snap", 0, view3d_edit_snapmenu);
2048
2049         uiItemS(layout);
2050
2051         // TODO: these operators may get renamed
2052         uiItemO(layout, NULL, 0, "ANIM_OT_insert_keyframe_menu");
2053         uiItemO(layout, NULL, 0, "ANIM_OT_delete_keyframe_v3d");
2054         
2055         uiItemS(layout);
2056         
2057         uiItemO(layout, NULL, 0, "OBJECT_OT_duplicate");
2058         uiItemBooleanO(layout, "Duplicate Linked", 0, "OBJECT_OT_duplicate", "linked", 1);
2059         uiItemO(layout, NULL, 0, "OBJECT_OT_delete");
2060         
2061         uiItemO(layout, NULL, 0, "OBJECT_OT_proxy_make");
2062 #if 0
2063         uiDefIconTextBlockBut(block, view3d_edit_object_makelinksmenu, NULL, ICON_RIGHTARROW_THIN, "Make Links", 0, yco-=20, 120, 19, "");
2064         uiDefIconTextBlockBut(block, view3d_edit_object_singleusermenu, NULL, ICON_RIGHTARROW_THIN, "Make Single User", 0, yco-=20, 120, 19, "");
2065         uiDefIconTextBlockBut(block, view3d_edit_object_makelocalmenu, NULL, ICON_RIGHTARROW_THIN, "Make Local", 0, yco-=20, 120, 19, "");
2066         uiDefIconTextBlockBut(block, view3d_edit_object_copyattrmenu, NULL, ICON_RIGHTARROW_THIN, "Copy Attributes", 0, yco-=20, 120, 19, "");
2067 #endif
2068         
2069         uiItemS(layout);
2070         
2071         uiItemMenuF(layout, "Parent", 0, view3d_edit_object_parentmenu);
2072         uiItemMenuF(layout, "Track", 0, view3d_edit_object_trackmenu);
2073         uiItemMenuF(layout, "Group", 0, view3d_edit_object_groupmenu);
2074         uiItemMenuF(layout, "Constraints", 0, view3d_edit_object_constraintsmenu);
2075
2076 #if 0
2077         if(ob && ob->type == OB_MESH) {
2078                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Boolean Operation...|W",                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2079         }
2080         
2081         // join... (added already)
2082         
2083         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Object Type...|Alt C",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2084 #endif
2085         uiItemS(layout);
2086         
2087         uiItemO(layout, NULL, 0, "OBJECT_OT_join");
2088
2089         uiItemS(layout);
2090         
2091 #if 0
2092         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move to Layer...|M",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
2093 #endif
2094
2095         uiItemMenuF(layout, "Show/Hide", 0, view3d_edit_object_showhidemenu);
2096         
2097 #if 0
2098 #ifndef DISABLE_PYTHON
2099         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2100         uiDefIconTextBlockBut(block, view3d_edit_object_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, "");
2101 #endif
2102 #endif
2103 }
2104
2105 static void view3d_edit_mesh_verticesmenu(bContext *C, uiLayout *layout, void *arg_unused)
2106 {
2107         uiItemO(layout, "Merge...", 0, "MESH_OT_merge");
2108         uiItemO(layout, "Rip", 0, "MESH_OT_rip");
2109         uiItemO(layout, "Split", 0, "MESH_OT_split");
2110         uiItemO(layout, "Separate", 0, "MESH_OT_separate");
2111
2112         uiItemS(layout);
2113
2114         uiItemO(layout, "Smooth", 0, "MESH_OT_vertices_smooth");
2115         uiItemO(layout, "Remove Doubles", 0, "MESH_OT_remove_doubles");
2116
2117 #if 0
2118         uiItemS(layout);
2119
2120         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Vertex Parent|Ctrl P",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, ""); // add_hook_menu();
2121         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Hook|Ctrl H",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, ""); // make_parent();
2122 #endif
2123 }
2124
2125 void do_view3d_edit_mesh_edgesmenu(bContext *C, void *arg, int event)
2126 {
2127 #if 0
2128         Scene *scene= CTX_data_scene(C);
2129         float fac;
2130         short randfac;
2131
2132         switch(event) {
2133         case 9: /* Crease SubSurf */
2134                 if(!multires_level1_test()) {
2135                         initTransform(TFM_CREASE, CTX_EDGE);
2136                         Transform();
2137                 }
2138                 break;
2139         case 12: /* Edgeslide */
2140                 EdgeSlide(0,0.0);
2141                 break;
2142         case 13: /* Edge Loop Delete */
2143                 if(EdgeLoopDelete()) {
2144                         countall();
2145                         ED_undo_push(C, "Erase Edge Loop");
2146                         DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
2147                 }
2148                 break;
2149         case 14: /*Collapse Edges*/
2150                 collapseEdges();
2151                 ED_undo_push(C, "Collapse");
2152                 break;
2153         case 17: /* Adjust Bevel Weight */
2154                 if(!multires_level1_test()) {
2155                         initTransform(TFM_BWEIGHT, CTX_EDGE);
2156                         Transform();
2157                 }
2158                 break;
2159         }
2160 #endif
2161 }
2162
2163 static void view3d_edit_mesh_edgesmenu(bContext *C, uiLayout *layout, void *arg_unused)
2164 {
2165         uiItemO(layout, NULL, 0, "MESH_OT_edge_face_add");
2166
2167 #if 0
2168         uiItemO(layout, "Bevel", 0, "MESH_OT_bevel"); // bevelmenu(em)
2169         uiItemO(layout, "Loop Subdivide...", 0, "MESH_OT_loop_subdivide"); // Ctr R, CutEdgeloop(1);
2170         uiItemO(layout, "Knife Subdivide...", 0, "MESH_OT_loop_subdivide"); // Shift K, KnifeSubdivide(KNIFE_PROMPT);
2171
2172         uiItemS(layout);
2173 #endif
2174
2175         uiItemO(layout, "Subdivide", 0, "MESH_OT_subdivide");
2176         uiItemFloatO(layout, "Subdivide Smooth", 0, "MESH_OT_subdivide", "smoothness", 1.0f);
2177
2178         uiItemS(layout);
2179
2180         uiItemO(layout, "Mark Seam", 0, "MESH_OT_mark_seam");
2181         uiItemBooleanO(layout, "Clear Seam", 0, "MESH_OT_mark_seam", "clear", 1);
2182
2183         uiItemS(layout);
2184
2185         uiItemO(layout, "Mark Sharp", 0, "MESH_OT_mark_sharp");
2186         uiItemBooleanO(layout, "Clear Sharp", 0, "MESH_OT_mark_sharp", "clear", 1);
2187
2188 #if 0
2189         uiItemS(layout);
2190         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2191         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Adjust Bevel Weight|Ctrl Shift E",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
2192
2193         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2194         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Crease SubSurf|Shift E",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2195 #endif
2196
2197         uiItemS(layout);
2198
2199         uiItemEnumO(layout, "Rotate Edge CW", 0, "MESH_OT_edge_rotate", "direction", 1);
2200         uiItemEnumO(layout, "Rotate Edge CCW", 0, "MESH_OT_edge_rotate", "direction", 2);
2201
2202 #if 0
2203         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Slide Edge |Ctrl E",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");  
2204         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Edge Loop|X",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");  
2205
2206         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Collapse",                               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");  
2207 #endif
2208 }
2209
2210 static void view3d_edit_mesh_facesmenu(bContext *C, uiLayout *layout, void *arg_unused)
2211 {
2212         uiItemO(layout, NULL, 0, "MESH_OT_edge_face_add");
2213         uiItemO(layout, NULL, 0, "MESH_OT_fill");
2214         uiItemO(layout, NULL, 0, "MESH_OT_beauty_fill");
2215
2216         uiItemS(layout);
2217
2218         uiItemO(layout, NULL, 0, "MESH_OT_quads_convert_to_tris");
2219         uiItemO(layout, NULL, 0, "MESH_OT_tris_convert_to_quads");
2220         uiItemO(layout, NULL, 0, "MESH_OT_edge_flip");
2221
2222         uiItemS(layout);
2223
2224         uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_smooth");
2225         uiItemO(layout, NULL, 0, "MESH_OT_faces_shade_flat");
2226 }
2227
2228 static void view3d_edit_mesh_normalsmenu(bContext *C, uiLayout *layout, void *arg_unused)
2229 {
2230         uiItemO(layout, "Recalculate Outside", 0, "MESH_OT_normals_make_consistent");
2231         uiItemBooleanO(layout, "Recalculate Inside", 0, "MESH_OT_normals_make_consistent", "inside", 1);
2232
2233         uiItemS(layout);
2234
2235         uiItemO(layout, NULL, 0, "MESH_OT_flip_normals");
2236 }
2237
2238 void do_view3d_edit_mirrormenu(bContext *C, void *arg, int event)
2239 {
2240 #if 0
2241         float mat[3][3];
2242         
2243         Mat3One(mat);
2244         
2245         switch(event) {
2246                 case 0:
2247                         initTransform(TFM_MIRROR, CTX_NO_PET);
2248                         Transform();
2249                         break;
2250                 case 1:
2251                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
2252                         BIF_setSingleAxisConstraint(mat[0], " on global X axis");
2253                         Transform();
2254                         break;
2255                 case 2:
2256                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
2257                         BIF_setSingleAxisConstraint(mat[1], " on global Y axis");
2258                         Transform();
2259                         break;
2260                 case 3:
2261                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
2262                         BIF_setSingleAxisConstraint(mat[2], "on global Z axis");
2263                         Transform();
2264                         break;
2265                 case 4:
2266                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
2267                         BIF_setLocalAxisConstraint('X', " on local X axis");
2268                         Transform();
2269                         break;
2270                 case 5:
2271                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
2272                         BIF_setLocalAxisConstraint('Y', " on local Y axis");
2273                         Transform();
2274                         break;
2275                 case 6:
2276                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
2277                         BIF_setLocalAxisConstraint('Z', " on local Z axis");
2278                         Transform();
2279                         break;
2280         }
2281 #endif
2282 }
2283
2284 static uiBlock *view3d_edit_mirrormenu(bContext *C, ARegion *ar, void *arg_unused)
2285 {
2286         uiBlock *block;
2287         short yco = 20, menuwidth = 120;
2288
2289         block= uiBeginBlock(C, ar, "view3d_edit_mirrormenu", UI_EMBOSSP);
2290         uiBlockSetButmFunc(block, do_view3d_edit_mirrormenu, NULL);
2291         
2292         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Interactive Mirror|Ctrl M",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2293
2294         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2295         
2296         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|Ctrl M, X",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2297         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|Ctrl M, Y",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2298         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|Ctrl M, Z",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2299         
2300         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2301         
2302         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|Ctrl M, X X",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2303         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, Y Y",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2304         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, Z Z",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2305
2306         uiBlockSetDirection(block, UI_RIGHT);
2307         uiTextBoundsBlock(block, 60);
2308         return block;
2309 }
2310
2311 static void view3d_edit_mesh_showhidemenu(bContext *C, uiLayout *layout, void *arg_unused)
2312 {
2313         uiItemO(layout, NULL, 0, "MESH_OT_reveal");
2314         uiItemO(layout, NULL, 0, "MESH_OT_hide");
2315         uiItemBooleanO(layout, "Hide Unselected", 0, "MESH_OT_hide", "unselected", 1);
2316 }
2317
2318 #ifndef DISABLE_PYTHON
2319 #if 0
2320 static void do_view3d_edit_mesh_scriptsmenu(bContext *C, void *arg, int event)
2321 {
2322         BPY_menu_do_python(PYMENU_MESH, event);
2323 }
2324
2325 static uiBlock *view3d_edit_mesh_scriptsmenu(bContext *C, ARegion *ar, void *arg_unused)
2326 {
2327         uiBlock *block;
2328 //      short yco = 20, menuwidth = 120;
2329 // XXX  BPyMenu *pym;
2330 //      int i = 0;
2331
2332         block= uiBeginBlock(C, ar, "v3d_emesh_pymenu", UI_EMBOSSP);
2333         uiBlockSetButmFunc(block, do_view3d_edit_mesh_scriptsmenu, NULL);
2334
2335 //      for (pym = BPyMenuTable[PYMENU_MESH]; pym; pym = pym->next, i++) {
2336 //              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);
2337 //      }
2338
2339         uiBlockSetDirection(block, UI_RIGHT);
2340         uiTextBoundsBlock(block, 60);
2341
2342         return block;
2343 }
2344 #endif
2345 #endif /* DISABLE_PYTHON */
2346
2347 #if 0
2348 static void do_view3d_edit_meshmenu(bContext *C, void *arg, int event)
2349 {
2350         ScrArea *sa= CTX_wm_area(C);
2351         
2352         switch(event) {
2353         
2354         case 2: /* transform properties */
2355                 add_blockhandler(sa, VIEW3D_HANDLER_OBJECT, 0);
2356                 break;
2357         case 4: /* insert keyframe */
2358                 common_insertkey();
2359                 break;
2360         case 16: /* delete keyframe */
2361                 common_deletekey();
2362                 break;
2363         }
2364 }
2365 #endif
2366
2367 static void view3d_edit_meshmenu(bContext *C, uiLayout *layout, void *arg_unused)
2368 {
2369         Scene *scene= CTX_data_scene(C);
2370         ToolSettings *ts= CTX_data_tool_settings(C);
2371         PointerRNA tsptr;
2372         
2373         RNA_pointer_create(&scene->id, &RNA_ToolSettings, ts, &tsptr);
2374
2375         uiItemO(layout, "Undo Editing", 0, "ED_OT_undo");
2376         uiItemO(layout, "Redo Editing", 0, "ED_OT_redo");
2377
2378 #if 0
2379         uiDefIconTextBlockBut(block, editmode_undohistorymenu, NULL, ICON_RIGHTARROW_THIN, "Undo History", 0, yco-=20, 120, 19, "");
2380 #endif
2381
2382         uiItemS(layout);
2383         
2384 #if 0
2385         uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
2386         uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, 120, 19, "");
2387         uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
2388 #endif
2389
2390         uiItemMenuF(layout, "Snap", 0, view3d_edit_snapmenu);
2391
2392         uiItemS(layout);
2393
2394 #if 0
2395         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2396         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Keyframe|Alt I",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
2397                 
2398         uiItemS(layout);
2399 #endif
2400
2401         uiItemO(layout, NULL, 0, "UV_OT_mapping_menu");
2402
2403         uiItemS(layout);
2404
2405         uiItemO(layout, NULL, 0, "MESH_OT_extrude");
2406         uiItemO(layout, NULL, 0, "MESH_OT_duplicate");
2407         uiItemO(layout, "Delete...", 0, "MESH_OT_delete");
2408
2409         uiItemS(layout);
2410
2411         uiItemMenuF(layout, "Vertices", 0, view3d_edit_mesh_verticesmenu);
2412         uiItemMenuF(layout, "Edges", 0, view3d_edit_mesh_edgesmenu);
2413         uiItemMenuF(layout, "Faces", 0, view3d_edit_mesh_facesmenu);
2414         uiItemMenuF(layout, "Normals", 0, view3d_edit_mesh_normalsmenu);
2415
2416         uiItemS(layout);
2417
2418         uiItemR(layout, NULL, 0, &tsptr, "automerge_editing", 0, 0, 0);
2419         uiItemR(layout, NULL, 0, &tsptr, "proportional_editing", 0, 0, 0); // |O
2420         uiItemMenuEnumR(layout, NULL, 0, &tsptr, "proportional_editing_falloff"); // |Shift O
2421
2422         uiItemS(layout);
2423
2424         uiItemMenuF(layout, "Show/Hide", 0, view3d_edit_mesh_showhidemenu);
2425
2426 #if 0
2427 #ifndef DISABLE_PYTHON
2428         uiItemS(layout);
2429         uiDefIconTextBlockBut(block, view3d_edit_mesh_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, "");
2430 #endif
2431 #endif
2432 }
2433
2434 static void view3d_edit_curve_controlpointsmenu(bContext *C, uiLayout *layout, void *arg_unused)
2435 {
2436         Object *obedit= CTX_data_edit_object(C);
2437
2438         if(obedit->type == OB_CURVE) {
2439                 uiItemEnumO(layout, NULL, 0, "TFM_OT_transform", "mode", TFM_TILT);
2440                 uiItemO(layout, NULL, 0, "CURVE_OT_tilt_clear");
2441                 uiItemO(layout, NULL, 0, "CURVE_OT_separate");
2442                 
2443                 uiItemS(layout);
2444
2445                 uiItemEnumO(layout, NULL, 0, "CURVE_OT_handle_type_set", "type", 1);
2446                 uiItemEnumO(layout, NULL, 0, "CURVE_OT_handle_type_set", "type", 3);
2447                 uiItemEnumO(layout, NULL, 0, "CURVE_OT_handle_type_set", "type", 2);
2448
2449                 uiItemS(layout);
2450         }
2451
2452         // XXX uiItemO(layout, NULL, 0, "OBJECT_OT_make_vertex_parent"); Make VertexParent|Ctrl P
2453         // make_parent()
2454         // XXX uiItemO(layout, NULL, 0, "OBJECT_OT_add_hook"); Add Hook| Ctrl H
2455         // add_hook_menu()
2456 }
2457
2458 static void view3d_edit_curve_segmentsmenu(bContext *C, uiLayout *layout, void *arg_unused)
2459 {
2460         uiItemO(layout, NULL, 0, "CURVE_OT_subdivide");
2461         uiItemO(layout, NULL, 0, "CURVE_OT_switch_direction");
2462 }
2463
2464 static void view3d_edit_curve_showhidemenu(bContext *C, uiLayout *layout, void *arg_unused)
2465 {
2466         uiItemO(layout, NULL, 0, "CURVE_OT_reveal");
2467         uiItemO(layout, NULL, 0, "CURVE_OT_hide");
2468         uiItemBooleanO(layout, "Hide Unselected", 0, "CURVE_OT_hide", "unselected", 1);
2469 }
2470
2471 static void view3d_edit_curvemenu(bContext *C, uiLayout *layout, void *arg_unused)
2472 {
2473         Scene *scene= CTX_data_scene(C);
2474         ToolSettings *ts= CTX_data_tool_settings(C);
2475         PointerRNA tsptr;
2476         
2477         RNA_pointer_create(&scene->id, &RNA_ToolSettings, ts, &tsptr);
2478
2479 #if 0
2480         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties...|N",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2481         uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
2482         uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");      
2483 #endif
2484
2485         uiItemMenuF(layout, "Snap", 0, view3d_edit_snapmenu);
2486
2487         uiItemS(layout);
2488         
2489         // XXX uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I",                               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2490         // common_insertkey();
2491         // XXX uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Keyframe|Alt I",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
2492         // common_deletekey();
2493
2494
2495         uiItemO(layout, NULL, 0, "CURVE_OT_extrude");
2496         uiItemO(layout, NULL, 0, "CURVE_OT_duplicate");
2497         uiItemO(layout, NULL, 0, "CURVE_OT_separate");
2498         uiItemO(layout, NULL, 0, "CURVE_OT_make_segment");
2499         uiItemO(layout, NULL, 0, "CURVE_OT_cyclic_toggle");
2500         uiItemO(layout, NULL, 0, "CURVE_OT_delete"); // Delete...
2501
2502         uiItemS(layout);
2503
2504         uiItemMenuF(layout, "Control Points", 0, view3d_edit_curve_controlpointsmenu);
2505         uiItemMenuF(layout, "Segments", 0, view3d_edit_curve_segmentsmenu);
2506
2507         uiItemS(layout);
2508
2509         uiItemR(layout, NULL, 0, &tsptr, "proportional_editing", 0, 0, 0); // |O
2510         uiItemMenuEnumR(layout, NULL, 0, &tsptr, "proportional_editing_falloff"); // |Shift O
2511
2512         uiItemS(layout);
2513
2514         uiItemMenuF(layout, "Show/Hide Control Points", 0, view3d_edit_curve_showhidemenu);
2515 }
2516
2517 static void view3d_edit_metaball_showhidemenu(bContext *C, uiLayout *layout, void *arg_unused)
2518 {
2519         uiItemO(layout, NULL, 0, "MBALL_OT_hide_metaelems");
2520         uiItemO(layout, NULL, 0, "MBALL_OT_reveal_metaelems");
2521         uiItemBooleanO(layout, "Hide Unselected", 0, "MBALL_OT_hide_metaelems", "unselected", 1);
2522 }
2523
2524 static void view3d_edit_metaballmenu(bContext *C, uiLayout *layout, void *arg_unused)
2525 {
2526         Scene *scene= CTX_data_scene(C);
2527         ToolSettings *ts= CTX_data_tool_settings(C);
2528         PointerRNA tsptr;
2529         
2530         RNA_pointer_create(&scene->id, &RNA_ToolSettings, ts, &tsptr);
2531
2532         uiItemO(layout, "Undo Editing", 0, "ED_OT_undo");
2533         uiItemO(layout, "Redo Editing", 0, "ED_OT_redo");
2534
2535         uiItemS(layout);
2536
2537         uiItemMenuF(layout, "Snap", 0, view3d_edit_snapmenu);
2538         
2539         uiItemS(layout);
2540         
2541         uiItemO(layout, NULL, 0, "MBALL_OT_delete_metaelems");
2542         uiItemO(layout, NULL, 0, "MBALL_OT_duplicate_metaelems");
2543         
2544         uiItemS(layout);
2545         
2546         uiItemR(layout, NULL, 0, &tsptr, "proportional_editing", 0, 0, 0); // |O
2547         uiItemMenuEnumR(layout, NULL, 0, &tsptr, "proportional_editing_falloff"); // |Shift O
2548         
2549         uiItemS(layout);
2550         
2551         uiItemMenuF(layout, "Show/Hide Control Points", 0, view3d_edit_metaball_showhidemenu);
2552 }
2553
2554 static void view3d_edit_text_charsmenu(bContext *C, uiLayout *layout, void *arg_unused)
2555 {
2556         /* the character codes are specified in UTF-8 */
2557
2558         uiItemStringO(layout, "Copyright|Alt C", 0, "FONT_OT_text_insert", "text", "\xC2\xA9");
2559         uiItemStringO(layout, "Registered Trademark|Alt R", 0, "FONT_OT_text_insert", "text", "\xC2\xAE");
2560
2561         uiItemS(layout);
2562
2563         uiItemStringO(layout, "Degree Sign|Alt G", 0, "FONT_OT_text_insert", "text", "\xC2\xB0");
2564         uiItemStringO(layout, "Multiplication Sign|Alt x", 0, "FONT_OT_text_insert", "text", "\xC3\x97");
2565         uiItemStringO(layout, "Circle|Alt .", 0, "FONT_OT_text_insert", "text", "\xC2\x8A");
2566         uiItemStringO(layout, "Superscript 1|Alt 1", 0, "FONT_OT_text_insert", "text", "\xC2\xB9");
2567         uiItemStringO(layout, "Superscript 2|Alt 2", 0, "FONT_OT_text_insert", "text", "\xC2\xB2");
2568         uiItemStringO(layout, "Superscript 3|Alt 3", 0, "FONT_OT_text_insert", "text", "\xC2\xB3");
2569         uiItemStringO(layout, "Double >>|Alt >", 0, "FONT_OT_text_insert", "text", "\xC2\xBB");
2570         uiItemStringO(layout, "Double <<|Alt <", 0, "FONT_OT_text_insert", "text", "\xC2\xAB");
2571         uiItemStringO(layout, "Promillage|Alt %", 0, "FONT_OT_text_insert", "text", "\xE2\x80\xB0");
2572         
2573         uiItemS(layout);
2574         
2575         uiItemStringO(layout, "Dutch Florin|Alt F", 0, "FONT_OT_text_insert", "text", "\xC2\xA4");
2576         uiItemStringO(layout, "British Pound|Alt L", 0, "FONT_OT_text_insert", "text", "\xC2\xA3");
2577         uiItemStringO(layout, "Japanese Yen|Alt Y", 0, "FONT_OT_text_insert", "text", "\xC2\xA5");
2578         
2579         uiItemS(layout);
2580         
2581         uiItemStringO(layout, "German S|Alt S", 0, "FONT_OT_text_insert", "text", "\xC3\x9F");
2582         uiItemStringO(layout, "Spanish Question Mark|Alt ?", 0, "FONT_OT_text_insert", "text", "\xC2\xBF");
2583         uiItemStringO(layout, "Spanish Exclamation Mark|Alt !", 0, "FONT_OT_text_insert", "text", "\xC2\xA1");
2584 }
2585
2586 static void view3d_edit_textmenu(bContext *C, uiLayout *layout, void *arg_unused)
2587 {
2588         uiItemO(layout, NULL, 0, "FONT_OT_file_paste");
2589         uiItemS(layout);
2590         uiItemMenuF(layout, "Special Characters", 0, view3d_edit_text_charsmenu);
2591 }
2592
2593 static void view3d_edit_latticemenu(bContext *C, uiLayout *layout, void *arg_unused)
2594 {
2595         Scene *scene= CTX_data_scene(C);
2596         ToolSettings *ts= CTX_data_tool_settings(C);
2597         PointerRNA tsptr;
2598         
2599         RNA_pointer_create(&scene->id, &RNA_ToolSettings, ts, &tsptr);
2600
2601 #if 0
2602         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|U",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2603         
2604         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2605         
2606         uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
2607         uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");              
2608 #endif
2609
2610         uiItemMenuF(layout, "Snap", 0, view3d_edit_snapmenu);
2611
2612         uiItemS(layout);
2613
2614         // XXX uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I",                               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2615         // common_insertkey();
2616         // XXX uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Keyframe|Alt I",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
2617         // common_deletekey();
2618         
2619         uiItemO(layout, NULL, 0, "LATTICE_OT_make_regular");
2620
2621         uiItemS(layout);
2622
2623         uiItemR(layout, NULL, 0, &tsptr, "proportional_editing", 0, 0, 0); // |O
2624         uiItemMenuEnumR(layout, NULL, 0, &tsptr, "proportional_editing_falloff"); // |Shift O
2625 }
2626
2627
2628 static void view3d_edit_armature_parentmenu(bContext *C, uiLayout *layout, void *arg_unused)
2629 {
2630         uiItemO(layout, NULL, 0, "ARMATURE_OT_parent_set");
2631         uiItemO(layout, NULL, 0, "ARMATURE_OT_parent_clear");
2632 }
2633
2634 static void view3d_edit_armature_rollmenu(bContext *C, uiLayout *layout, void *arg_unused)
2635 {
2636         /* 0 = 'Global', 1 = 'Cursor' */
2637         // TODO: keep these in sync...
2638         uiItemEnumO(layout, "Clear Roll (Z-Axis Up)", 0, "ARMATURE_OT_calculate_roll", "type", 0);
2639         uiItemEnumO(layout, "Roll to Cursor", 0, "ARMATURE_OT_calculate_roll", "type", 1);
2640         
2641         uiItemS(layout);
2642         
2643         uiItemEnumO(layout, "Set Roll", 0, "TFM_OT_transform", "mode", TFM_BONE_ROLL);
2644 }
2645
2646 static void view3d_edit_armature_settingsmenu(bContext *C, uiLayout *layout, void *arg_unused)
2647 {
2648         uiItemEnumO(layout, "Toggle a Setting", 0, "ARMATURE_OT_flags_set", "mode", 2);
2649         uiItemEnumO(layout, "Enable a Setting", 0, "ARMATURE_OT_flags_set", "mode", 1);
2650         uiItemEnumO(layout, "Disable a Setting", 0, "ARMATURE_OT_flags_set", "mode", 0);
2651 }
2652
2653 #if 0
2654 static void do_view3d_edit_armaturemenu(bContext *C, void *arg, int event)
2655 {
2656         static short numcuts= 2;
2657
2658         switch(event) {
2659         case 0: /* Undo Editing */
2660                 remake_editArmature();
2661                 break;
2662         
2663         case 6: /* Shear */
2664                 initTransform(TFM_SHEAR, CTX_NONE);
2665                 Transform();
2666                 break;
2667         case 7: /* Warp */
2668                 initTransform(TFM_WARP, CTX_NONE);
2669                 Transform();
2670         case 23: /* bone sketching panel */
2671                 add_blockhandler(curarea, VIEW3D_HANDLER_BONESKETCH, UI_PNL_UNSTOW);
2672                 break;
2673         }
2674 }
2675 #endif
2676
2677 static void view3d_edit_armaturemenu(bContext *C, uiLayout *layout, void *arg_unused)
2678 {
2679         Object *obedit = CTX_data_edit_object(C);
2680         bArmature *arm= obedit->data;
2681         
2682 #if 0
2683         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|U",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2684         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Bone Sketching|P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 23, "");
2685         uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
2686         uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
2687 #endif
2688         uiItemMenuF(layout, "Snap", 0, view3d_edit_snapmenu);
2689         uiItemMenuF(layout, "Bone Roll", 0, view3d_edit_armature_rollmenu);
2690         
2691         if (arm->drawtype == ARM_ENVELOPE)
2692                 uiItemEnumO(layout, "Scale Envelope Distance", 0, "TFM_OT_transform", "mode", TFM_BONESIZE);
2693         else
2694                 uiItemEnumO(layout, "Scale B-Bone Width", 0, "TFM_OT_transform", "mode", TFM_BONESIZE);
2695         
2696         uiItemS(layout);
2697         
2698         uiItemO(layout, "Extrude", 0, "ARMATURE_OT_extrude");
2699         if (arm->flag & ARM_MIRROR_EDIT)
2700                 uiItemBooleanO(layout, "Extrude Forked", 0, "ARMATURE_OT_extrude", "forked", 1);
2701         
2702         uiItemO(layout, NULL, 0, "ARMATURE_OT_duplicate");
2703         uiItemO(layout, NULL, 0, "ARMATURE_OT_merge");
2704         uiItemO(layout, NULL, 0, "ARMATURE_OT_fill");
2705         uiItemO(layout, NULL, 0, "ARMATURE_OT_delete");
2706         uiItemO(layout, NULL, 0, "ARMATURE_OT_separate");
2707         
2708         uiItemS(layout);
2709         
2710         uiItemO(layout, NULL, 0, "ARMATURE_OT_subdivide_simple");
2711         uiItemO(layout, NULL, 0, "ARMATURE_OT_subdivide_multi");
2712         
2713         uiItemEnumO(layout, "AutoName Left/Right", 0, "ARMATURE_OT_autoside_names", "axis", 0);
2714         uiItemEnumO(layout, "AutoName Front/Back", 0, "ARMATURE_OT_autoside_names", "axis", 1);
2715         uiItemEnumO(layout, "AutoName Top/Bottom", 0, "ARMATURE_OT_autoside_names", "axis", 2);
2716         
2717         uiItemO(layout, "Flip Left/Right Names", 0, "ARMATURE_OT_flip_names");
2718         
2719         uiItemS(layout);
2720         
2721         uiItemO(layout, NULL, 0, "ARMATURE_OT_armature_layers");
2722         uiItemO(layout, NULL, 0, "ARMATURE_OT_bone_layers");
2723         
2724         uiItemS(layout);
2725         
2726         uiItemMenuF(layout, "Parent", 0, view3d_edit_armature_parentmenu);
2727         
2728         uiItemS(layout);
2729         
2730         uiItemMenuF(layout, "Bone Settings ", 0, view3d_edit_armature_settingsmenu);
2731 }
2732
2733
2734 static void view3d_pose_armature_transformmenu(bContext *C, uiLayout *layout, void *arg_unused)
2735 {
2736         //uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear User Transform|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2737                 //used: clear_user_transform(scene, ob);
2738         //uiDefBut(block, SEPR, 0, "",                          0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2739         
2740         uiItemO(layout, NULL, 0, "POSE_OT_loc_clear");
2741         uiItemO(layout, NULL, 0, "POSE_OT_rot_clear");
2742         uiItemO(layout, NULL, 0, "POSE_OT_scale_clear");
2743         
2744         // ???
2745         //uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Origin|Alt O",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2746                 //used:clear_object('o');
2747 }
2748
2749 static void view3d_pose_armature_showhidemenu(bContext *C, uiLayout *layout, void *arg_unused)
2750 {
2751         uiItemO(layout, "Show Hidden", 0, "POSE_OT_reveal");
2752         
2753         uiItemO(layout, "Hide Selected", 0, "POSE_OT_hide");
2754         uiItemBooleanO(layout, "Hide Unselected", 0, "POSE_OT_hide", "unselected", 1);
2755 }
2756
2757 static void view3d_pose_armature_ikmenu(bContext *C, uiLayout *layout, void *arg_unused)
2758 {
2759         uiItemO(layout, NULL, 0, "POSE_OT_ik_add");
2760         uiItemO(layout, NULL, 0, "POSE_OT_ik_clear");
2761 }
2762
2763 static void view3d_pose_armature_constraintsmenu(bContext *C, uiLayout *layout, void *arg_unused)
2764 {
2765         uiItemO(layout, NULL, 0, "POSE_OT_constraint_add_with_targets");
2766         uiItemO(layout, NULL, 0, "POSE_OT_constraints_clear");
2767 }
2768
2769 static void view3d_pose_armature_groupmenu(bContext *C, uiLayout *layout, void *arg_unused)
2770 {
2771         uiItemO(layout, "Add Selected to Active Group", 0, "POSE_OT_group_assign");
2772         //uiItemO(layout, "Add Selected to Group", 0, "POSE_OT_group_assign");
2773         
2774         uiItemO(layout, "Add New Group", 0, "POSE_OT_group_add");
2775         
2776         uiItemO(layout, "Remove from All Groups", 0, "POSE_OT_group_unassign");
2777         uiItemO(layout, "Remove Active Group", 0, "POSE_OT_group_remove");
2778 }
2779
2780 static void view3d_pose_armature_motionpathsmenu(bContext *C, uiLayout *layout, void *arg_unused)
2781 {
2782         uiItemO(layout, NULL, 0, "POSE_OT_paths_calculate");
2783         uiItemO(layout, NULL, 0, "POSE_OT_paths_clear");
2784 }
2785
2786 static void view3d_pose_armature_poselibmenu(bContext *C, uiLayout *layout, void *arg_unused)
2787 {
2788         uiItemO(layout, NULL, 0, "POSELIB_OT_browse_interactive");
2789         
2790         uiItemS(layout);
2791         
2792         uiItemO(layout, NULL, 0, "POSELIB_OT_pose_add");
2793         uiItemO(layout, NULL, 0, "POSELIB_OT_pose_rename");
2794         uiItemO(layout, NULL, 0, "POSELIB_OT_pose_remove");
2795 }
2796
2797 static void view3d_pose_armature_settingsmenu(bContext *C, uiLayout *layout, void *arg_unused)
2798 {
2799         uiItemEnumO(layout, "Toggle a Setting", 0, "POSE_OT_flags_set", "mode", 2);
2800         uiItemEnumO(layout, "Enable a Setting", 0, "POSE_OT_flags_set", "mode", 1);
2801         uiItemEnumO(layout, "Disable a Setting", 0, "POSE_OT_flags_set", "mode", 0);
2802 }
2803
2804 #if 0
2805 static void do_view3d_pose_armaturemenu(bContext *C, void *arg, int event)
2806 {
2807         Object *ob;
2808         ob=OBACT;
2809         
2810         switch(event) {
2811         case 5:
2812                 pose_copy_menu();
2813                 break;
2814         case 15:
2815                 pose_relax();
2816                 break;
2817         }
2818 }
2819 #endif
2820
2821 static void view3d_pose_armaturemenu(bContext *C, uiLayout *layout, void *arg_unused)
2822 {       
2823         Object *ob = CTX_data_active_object(C);
2824         bArmature *arm= ob->data;
2825         
2826 #if 0 // XXX to be ported, using uiItemMenuF(layout, "<Name>", 0, view3d_pose_armature_<category>menu);
2827         uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
2828 #endif 
2829         if ( (arm) && ((arm->drawtype == ARM_B_BONE) || (arm->drawtype == ARM_ENVELOPE)) )
2830                 uiItemEnumO(layout, "Scale Envelope Distance", 0, "TFM_OT_transform", "mode", TFM_BONESIZE);
2831         uiItemMenuF(layout, "Clear Transform", 0, view3d_pose_armature_transformmenu);
2832         
2833         uiItemS(layout);
2834         
2835         // TODO: these operators may get renamed
2836         uiItemO(layout, NULL, 0, "ANIM_OT_insert_keyframe_menu");
2837         uiItemO(layout, NULL, 0, "ANIM_OT_delete_keyframe_v3d");
2838
2839         uiItemS(layout);
2840         
2841 #if 0
2842         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Relax Pose|W",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
2843 #endif
2844         uiItemO(layout, NULL, 0, "POSE_OT_apply");
2845         
2846         uiItemS(layout);
2847         
2848         uiItemO(layout, "Copy Current Pose", 0, "POSE_OT_copy");
2849         uiItemO(layout, "Paste Pose", 0, "POSE_OT_paste");
2850         uiItemBooleanO(layout, "Paste X-Flipped Pose", 0, "POSE_OT_paste", "flipped", 1);
2851         
2852         uiItemS(layout);
2853
2854         uiItemMenuF(layout, "Pose Library", 0, view3d_pose_armature_poselibmenu);
2855         uiItemMenuF(layout, "Motion Paths", 0, view3d_pose_armature_motionpathsmenu);
2856         uiItemMenuF(layout, "Bone Groups", 0, view3d_pose_armature_groupmenu);
2857         
2858         uiItemS(layout);
2859         
2860         uiItemMenuF(layout, "Inverse Kinematics", 0, view3d_pose_armature_ikmenu);
2861         uiItemMenuF(layout, "Constraints", 0, view3d_pose_armature_constraintsmenu);
2862         
2863         uiItemS(layout);
2864         
2865         uiItemEnumO(layout, "AutoName Left/Right", 0, "POSE_OT_autoside_names", "axis", 0);
2866         uiItemEnumO(layout, "AutoName Front/Back", 0, "POSE_OT_autoside_names", "axis", 1);
2867         uiItemEnumO(layout, "AutoName Top/Bottom", 0, "POSE_OT_autoside_names", "axis", 2);
2868         
2869         uiItemO(layout, "Flip Left/Right Names", 0, "POSE_OT_flip_names");
2870         
2871         uiItemS(layout);
2872         
2873         uiItemO(layout, NULL, 0, "POSE_OT_armature_layers");
2874         uiItemO(layout, NULL, 0, "POSE_OT_bone_layers");
2875         
2876         uiItemS(layout);
2877         
2878         uiItemMenuF(layout, "Show/Hide Bones", 0, view3d_pose_armature_showhidemenu);
2879         uiItemMenuF(layout, "Bone Settings", 0, view3d_pose_armature_settingsmenu);
2880         
2881 #if 0
2882         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Copy Attributes...|Ctrl C",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2883 #endif
2884 }
2885
2886
2887 /* vertex paint menu */
2888 static void do_view3d_vpaintmenu(bContext *C, void *arg, int event)
2889 {
2890 #if 0
2891         /* events >= 3 are registered bpython scripts */
2892 #ifndef DISABLE_PYTHON
2893         if (event >= 3) BPY_menu_do_python(PYMENU_VERTEXPAINT, event - 3);
2894 #endif
2895         switch(event) {
2896         case 0: /* undo vertex painting */
2897                 BIF_undo();
2898                 break;
2899         case 1: /* set vertex colors/weight */
2900                 if(FACESEL_PAINT_TEST)
2901                         clear_vpaint_selectedfaces();
2902                 else /* we know were in vertex paint mode */
2903                         clear_vpaint();
2904                 break;
2905         case 2:
2906                 make_vertexcol(1);
2907                 break;
2908         }
2909 #endif
2910 }
2911
2912 static uiBlock *view3d_vpaintmenu(bContext *C, ARegion *ar, void *arg_unused)
2913 {
2914         uiBlock *block;
2915         short yco= 0, menuwidth=120;
2916 #ifndef DISABLE_PYTHON
2917 // XXX  BPyMenu *pym;
2918 //      int i=0;
2919 #endif
2920         
2921         block= uiBeginBlock(C, ar, "view3d_paintmenu", UI_EMBOSSP);
2922         uiBlockSetButmFunc(block, do_view3d_vpaintmenu, NULL);
2923         
2924         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Vertex Painting|U",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2925         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Vertex Colors|Shift K",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2926         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Shaded Vertex Colors",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2927         
2928 #ifndef DISABLE_PYTHON
2929         /* note that we account for the 3 previous entries with i+3:
2930         even if the last item isnt displayed, it dosent matter */
2931 //      for (pym = BPyMenuTable[PYMENU_VERTEXPAINT]; pym; pym = pym->next, i++) {
2932 //              uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20,
2933 //                      menuwidth, 19, NULL, 0.0, 0.0, 1, i+3,
2934 //                      pym->tooltip?pym->tooltip:pym->filename);
2935 //      }
2936 #endif
2937
2938         if(ar->alignment==RGN_ALIGN_TOP) {
2939                 uiBlockSetDirection(block, UI_DOWN);
2940         }
2941         else {
2942                 uiBlockSetDirection(block, UI_TOP);
2943                 uiBlockFlipOrder(block);
2944         }
2945
2946         uiTextBoundsBlock(block, 50);
2947         return block;
2948 }
2949
2950
2951 /* texture paint menu (placeholder, no items yet??) */
2952 static void do_view3d_tpaintmenu(bContext *C, void *arg, int event)
2953 {
2954 #if 0
2955         switch(event) {
2956         case 0: /* undo image painting */
2957                 undo_imagepaint_step(1);
2958                 break;
2959         }
2960
2961 #endif
2962 }
2963
2964 static uiBlock *view3d_tpaintmenu(bContext *C, ARegion *ar, void *arg_unused)
2965 {
2966         uiBlock *block;
2967         short yco= 0, menuwidth=120;
2968         
2969         block= uiBeginBlock(C, ar, "view3d_paintmenu", UI_EMBOSSP);
2970         uiBlockSetButmFunc(block, do_view3d_tpaintmenu, NULL);
2971         
2972         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Texture Painting|U",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2973         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2974         
2975         if(ar->alignment==RGN_ALIGN_TOP) {
2976                 uiBlockSetDirection(block, UI_DOWN);
2977         }
2978         else {
2979                 uiBlockSetDirection(block, UI_TOP);
2980                 uiBlockFlipOrder(block);
2981         }
2982
2983         uiTextBoundsBlock(block, 50);
2984         return block;
2985 }
2986
2987
2988 static void do_view3d_wpaintmenu(bContext *C, void *arg, int event)
2989 {
2990 #if 0
2991         Object *ob= OBACT;
2992         
2993         /* events >= 3 are registered bpython scripts */
2994 #ifndef DISABLE_PYTHON
2995         if (event >= 4) BPY_menu_do_python(PYMENU_WEIGHTPAINT, event - 4);
2996 #endif  
2997         switch(event) {
2998         case 0: /* undo weight painting */
2999                 BIF_undo();
3000                 break;
3001         case 1: /* set vertex colors/weight */
3002                 clear_wpaint_selectedfaces();
3003                 break;
3004         case 2: /* vgroups from envelopes */
3005                 pose_adds_vgroups(ob, 0);
3006                 break;
3007         case 3: /* vgroups from bone heat */
3008                 pose_adds_vgroups(ob, 1);
3009                 break;
3010         }
3011 #endif
3012 }
3013
3014 static uiBlock *view3d_wpaintmenu(bContext *C, ARegion *ar, void *arg_unused)
3015 {
3016         uiBlock *block;
3017         short yco= 0, menuwidth=120, menunr=1;
3018 #ifndef DISABLE_PYTHON
3019 // XXX  BPyMenu *pym;
3020 //      int i=0;
3021 #endif
3022                 
3023         block= uiBeginBlock(C, ar, "view3d_paintmenu", UI_EMBOSSP);
3024         uiBlockSetButmFunc(block, do_view3d_wpaintmenu, NULL);
3025         
3026         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Weight Painting|U",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
3027
3028         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
3029
3030         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Bone Heat Weights to Vertex Groups|W, 2",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
3031         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Bone Envelopes to Vertex Groups|W, 1",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
3032         
3033         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
3034         
3035         if (FACESEL_PAINT_TEST) {
3036                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Weight|Shift K",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
3037                 uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
3038                 menunr++;
3039         }
3040
3041 #ifndef DISABLE_PYTHON
3042         /* note that we account for the 4 previous entries with i+4:
3043         even if the last item isnt displayed, it dosent matter */
3044 //      for (pym = BPyMenuTable[PYMENU_WEIGHTPAINT]; pym; pym = pym->next, i++) {
3045 //              uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20,
3046 //                      menuwidth, 19, NULL, 0.0, 0.0, 1, i+4,
3047 //                      pym->tooltip?pym->tooltip:pym->filename);
3048 //      }
3049 #endif
3050
3051         if(ar->alignment==RGN_ALIGN_TOP) {
3052                 uiBlockSetDirection(block, UI_DOWN);
3053         }
3054         else {
3055                 uiBlockSetDirection(block, UI_TOP);
3056                 uiBlockFlipOrder(block);
3057         }
3058
3059         uiTextBoundsBlock(block, 50);
3060         return block;
3061 }
3062
3063 void do_view3d_sculpt_inputmenu(bContext *C, void *arg, int event)
3064 {
3065 #if 0
3066         Scene *scene= CTX_data_scene(C);
3067         SculptData *sd= &scene->sculptdata;
3068         short val;
3069         
3070         switch(event) {
3071         case 0:
3072                 sd->flags ^= SCULPT_INPUT_SMOOTH;
3073                 ED_undo_push(C, "Smooth stroke");
3074                 break;
3075         case 1:
3076                 val= sd->tablet_size;
3077                 if(button(&val,0,10,"Tablet Size:")==0) return;
3078                 sd->tablet_size= val;
3079                 ED_undo_push(C, "Tablet size");
3080                 break;
3081         case 2:
3082                 val= sd->tablet_strength;
3083                 if(button(&val,0,10,"Tablet Strength:")==0) return;
3084                 sd->tablet_strength= val;
3085                 ED_undo_push(C, "Tablet strength");
3086                 break;
3087         }
3088         
3089 #endif
3090 }
3091
3092 void do_view3d_sculptmenu(bContext *C, void *arg, int event)
3093 {