svn merge -r 23528:23646 https://svn.blender.org/svnroot/bf-blender/trunk/blender
[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_paint.h"
65 #include "BKE_particle.h"
66 #include "BKE_screen.h"
67 #include "BKE_utildefines.h" /* for VECCOPY */
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 #include "RNA_enum_types.h"
84
85 #include "BIF_gl.h"
86 #include "BIF_glutil.h"
87
88 #include "BLI_arithb.h"
89 #include "BLI_blenlib.h"
90 #include "BLI_editVert.h"
91
92 #include "UI_interface.h"
93 #include "UI_interface_icons.h"
94 #include "UI_resources.h"
95 #include "UI_view2d.h"
96
97 #include "view3d_intern.h"
98
99
100 /* View3d->modeselect 
101  * This is a bit of a dodgy hack to enable a 'mode' menu with icons+labels
102  * rather than those buttons.
103  * I know the implementation's not good - it's an experiment to see if this
104  * approach would work well
105  *
106  * This can be cleaned when I make some new 'mode' icons.
107  */
108
109 #define TEST_EDITMESH   if(obedit==0) return; \
110                                                 if( (v3d->lay & obedit->lay)==0 ) return;
111
112 /* XXX port over */     
113 static void countall(void) {}
114 extern void borderselect();
115 static int retopo_mesh_paint_check() {return 0;}
116
117 /* view3d handler codes */
118 #define VIEW3D_HANDLER_BACKGROUND       1
119 #define VIEW3D_HANDLER_PROPERTIES       2
120 #define VIEW3D_HANDLER_OBJECT           3
121 #define VIEW3D_HANDLER_PREVIEW          4
122 #define VIEW3D_HANDLER_MULTIRES         5
123 #define VIEW3D_HANDLER_TRANSFORM        6
124 #define VIEW3D_HANDLER_GREASEPENCIL 7
125 #define VIEW3D_HANDLER_BONESKETCH       8
126
127 /* end XXX ************* */
128
129 static void do_view3d_header_buttons(bContext *C, void *arg, int event);
130
131 #define B_SCENELOCK 101
132 #define B_FULL          102
133 #define B_HOME          103
134 #define B_VIEWBUT       104
135 #define B_PERSP         105
136 #define B_VIEWRENDER    106
137 #define B_STARTGAME     107
138 #define B_MODESELECT 108
139 #define B_AROUND        109
140 #define B_SEL_VERT      110
141 #define B_SEL_EDGE      111
142 #define B_SEL_FACE      112
143 #define B_SEL_PATH      113
144 #define B_SEL_POINT     114
145 #define B_SEL_END       115
146 #define B_MAN_TRANS     116
147 #define B_MAN_ROT       117
148 #define B_MAN_SCALE     118
149 #define B_NDOF          119     
150 #define B_MAN_MODE      120
151 #define B_VIEW_BUTSEDIT 121
152 #define B_REDR          122
153 #define B_NOP           123
154 #define B_ACTCOPY       124
155 #define B_ACTPASTE      125
156 #define B_ACTPASTEFLIP 126
157
158 #define B_LAY           201
159
160
161 static RegionView3D *wm_region_view3d(const bContext *C)
162 {
163         ScrArea *sa= CTX_wm_area(C);
164         ARegion *ar;
165         /* XXX handle foursplit? */
166         for(ar= sa->regionbase.first; ar; ar= ar->next)
167                 if(ar->regiontype==RGN_TYPE_WINDOW)
168                         return ar->regiondata;
169         return NULL;
170 }
171
172 // XXX quickly ported across
173 static void handle_view3d_lock(bContext *C) 
174 {
175         Scene *scene= CTX_data_scene(C);
176         ScrArea *sa= CTX_wm_area(C);
177         View3D *v3d= CTX_wm_view3d(C);
178         
179         if (v3d != NULL && sa != NULL) {
180                 if(v3d->localvd==NULL && v3d->scenelock && sa->spacetype==SPACE_VIEW3D) {
181                         
182                         /* copy to scene */
183                         scene->lay= v3d->lay;
184                         scene->camera= v3d->camera;
185                         
186                         //copy_view3d_lock(REDRAW);
187                 }
188         }
189 }
190
191 static int layers_exec(bContext *C, wmOperator *op)
192 {
193         Scene *scene= CTX_data_scene(C);
194         ScrArea *sa= CTX_wm_area(C);
195         View3D *v3d= sa->spacedata.first;
196         int nr= RNA_int_get(op->ptr, "nr");
197         
198         if(nr < 0)
199                 return OPERATOR_CANCELLED;
200         
201         
202         if(nr == 0) {
203                 /* all layers */
204                 v3d->lay |= (1<<20)-1;
205
206                 if(!v3d->layact)
207                         v3d->layact= 1;
208         }
209         else {
210                 nr--;
211
212                 if(RNA_boolean_get(op->ptr, "extend"))
213                         v3d->lay |= (1<<nr);
214                 else
215                         v3d->lay = (1<<nr);
216                 
217                 /* set active layer, ensure to always have one */
218                 if(v3d->lay & (1<<nr))
219                    v3d->layact= 1<<nr;
220                 else if((v3d->lay & v3d->layact)==0) {
221                         int bit= 0;
222
223                         while(bit<32) {
224                                 if(v3d->lay & (1<<bit)) {
225                                         v3d->layact= 1<<bit;
226                                         break;
227                                 }
228                                 bit++;
229                         }
230                 }
231         }
232         
233         if(v3d->scenelock) handle_view3d_lock(C);
234         
235         /* new layers might need unflushed events events */
236         DAG_scene_update_flags(scene, v3d->lay);        /* tags all that moves and flushes */
237
238         ED_area_tag_redraw(sa);
239         
240         return OPERATOR_FINISHED;
241 }
242
243 /* applies shift and alt, lazy coding or ok? :) */
244 /* the local per-keymap-entry keymap will solve it */
245 static int layers_invoke(bContext *C, wmOperator *op, wmEvent *event)
246 {
247         if(event->ctrl || event->oskey)
248                 return OPERATOR_PASS_THROUGH;
249         
250         if(event->shift)
251                 RNA_boolean_set(op->ptr, "extend", 1);
252         
253         if(event->alt) {
254                 int nr= RNA_int_get(op->ptr, "nr") + 10;
255                 RNA_int_set(op->ptr, "nr", nr);
256         }
257         layers_exec(C, op);
258         
259         return OPERATOR_FINISHED;
260 }
261
262 void VIEW3D_OT_layers(wmOperatorType *ot)
263 {
264         /* identifiers */
265         ot->name= "Layers";
266         ot->description= "Toggle layer(s) visibility.";
267         ot->idname= "VIEW3D_OT_layers";
268         
269         /* api callbacks */
270         ot->invoke= layers_invoke;
271         ot->exec= layers_exec;
272         ot->poll= ED_operator_view3d_active;
273         
274         /* flags */
275         ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
276         
277         RNA_def_int(ot->srna, "nr", 1, 0, 20, "Number", "The layer number to set, zero for all layers", 0, 20);
278         RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Add this layer to the current view layers");
279 }
280
281 #if 0
282 void do_view3d_select_object_typemenu(bContext *C, void *arg, int event)
283 {
284
285         extern void selectall_type(short obtype);
286         
287         switch(event) {
288         case 1: /* Mesh */
289                 selectall_type(OB_MESH);
290                 break;
291         case 2: /* Curve */
292                 selectall_type(OB_CURVE);
293                 break;
294         case 3: /* Surface */
295                 selectall_type(OB_SURF);
296                 break;
297         case 4: /* Meta */
298                 selectall_type(OB_MBALL);
299                 break;
300         case 5: /* Armature */
301                 selectall_type(OB_ARMATURE);
302                 break;
303         case 6: /* Lattice */
304                 selectall_type(OB_LATTICE);
305                 break;
306         case 7: /* Text */
307                 selectall_type(OB_FONT);
308                 break;
309         case 8: /* Empty */
310                 selectall_type(OB_EMPTY);
311                 break;
312         case 9: /* Camera */
313                 selectall_type(OB_CAMERA);
314                 break;
315         case 10: /* Lamp */
316                 selectall_type(OB_LAMP);
317                 break;
318         case 20:
319                 do_layer_buttons(C, -2);
320                 break;
321         }
322 }
323
324 static uiBlock *view3d_select_object_typemenu(bContext *C, ARegion *ar, void *arg_unused)
325 {
326         uiBlock *block;
327         short yco = 20, menuwidth = 120;
328
329         block= uiBeginBlock(C, ar, "view3d_select_object_typemenu", UI_EMBOSSP);
330         uiBlockSetButmFunc(block, do_view3d_select_object_typemenu, NULL);
331
332         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mesh",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
333         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
334         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Surface",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
335         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
336         
337         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
338         
339         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Armature",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
340         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lattice",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
341         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Text",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
342         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Empty",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
343         
344         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
345         
346         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
347         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lamp",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
348         
349         uiBlockSetDirection(block, UI_RIGHT);
350         uiTextBoundsBlock(block, 60);
351         return block;
352 }
353
354
355 void do_view3d_select_object_layermenu(bContext *C, void *arg, int event)
356 {
357 // XXX  extern void selectall_layer(unsigned int layernum);
358         
359         switch(event) {
360         case 0:
361         case 1:
362         case 2:
363         case 3:
364         case 4:
365         case 5:
366         case 6:
367         case 7:
368         case 8:
369         case 9:
370         case 10:
371         case 11:
372         case 12:
373         case 13:
374         case 14:
375         case 15:
376         case 16:
377         case 17:
378         case 18:
379         case 19:
380         case 20:
381 // XXX          selectall_layer(event);
382                 break;
383         }
384 }
385
386 static uiBlock *view3d_select_object_layermenu(bContext *C, ARegion *ar, void *arg_unused)
387 {
388         uiBlock *block;
389         short xco= 0, yco = 20, menuwidth = 22;
390
391         block= uiBeginBlock(C, ar, "view3d_select_object_layermenu", UI_EMBOSSP);
392         uiBlockSetButmFunc(block, do_view3d_select_object_layermenu, NULL);
393
394         uiDefBut(block, BUTM, 1, "1",           xco, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
395         uiDefBut(block, BUTM, 1, "2",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
396         uiDefBut(block, BUTM, 1, "3",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
397         uiDefBut(block, BUTM, 1, "4",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
398         uiDefBut(block, BUTM, 1, "5",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
399         xco += 6;
400         uiDefBut(block, BUTM, 1, "6",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
401         uiDefBut(block, BUTM, 1, "7",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
402         uiDefBut(block, BUTM, 1, "8",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
403         uiDefBut(block, BUTM, 1, "9",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
404         uiDefBut(block, BUTM, 1, "10",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
405         xco = 0;
406         uiDefBut(block, BUTM, 1, "11",          xco, yco-=24, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
407         uiDefBut(block, BUTM, 1, "12",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
408         uiDefBut(block, BUTM, 1, "13",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
409         uiDefBut(block, BUTM, 1, "14",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
410         uiDefBut(block, BUTM, 1, "15",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
411         xco += 6;
412         uiDefBut(block, BUTM, 1, "16",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
413         uiDefBut(block, BUTM, 1, "17",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
414         uiDefBut(block, BUTM, 1, "18",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
415         uiDefBut(block, BUTM, 1, "19",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
416         uiDefBut(block, BUTM, 1, "20",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
417         
418         uiBlockSetDirection(block, UI_RIGHT);
419         /*uiTextBoundsBlock(block, 100);*/
420         return block;
421 }
422
423 void do_view3d_select_object_linkedmenu(bContext *C, void *arg, int event)
424 {
425         switch(event) {
426         case 1: /* Object Ipo */
427         case 2: /* ObData */
428         case 3: /* Current Material */
429         case 4: /* Current Texture */
430                 selectlinks(event);
431                 break;
432         }
433         countall();
434 }
435
436 static uiBlock *view3d_select_object_linkedmenu(bContext *C, ARegion *ar, void *arg_unused)
437 {
438         uiBlock *block;
439         short yco = 20, menuwidth = 120;
440
441         block= uiBeginBlock(C, ar, "view3d_select_object_linkedmenu", UI_EMBOSSP);
442         uiBlockSetButmFunc(block, do_view3d_select_object_linkedmenu, NULL);
443
444         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Ipo|Shift L, 1",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
445         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "ObData|Shift L, 2",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
446         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Material|Shift L, 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
447         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Texture|Shift L, 4",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
448         
449         uiBlockSetDirection(block, UI_RIGHT);
450         uiTextBoundsBlock(block, 60);
451         return block;
452 }
453
454 void do_view3d_select_object_groupedmenu(bContext *C, void *arg, int event)
455 {
456
457         switch(event) {
458         case 1: /* Children */
459         case 2: /* Immediate Children */
460         case 3: /* Parent */
461         case 4: /* Siblings */
462         case 5: /* Type */
463         case 6: /* Objects on Shared Layers */
464         case 7: /* Objects in Same Group */
465         case 8: /* Object Hooks*/
466         case 9: /* Object PassIndex*/
467         case 10: /* Object Color*/
468         case 11: /* Game Properties*/
469                 select_object_grouped((short)event);
470                 break;
471         }
472 }
473
474 static uiBlock *view3d_select_object_groupedmenu(bContext *C, ARegion *ar, void *arg_unused)
475 {
476         uiBlock *block;
477         short yco = 20, menuwidth = 120;
478
479         block= uiBeginBlock(C, ar, "view3d_select_object_groupedmenu", UI_EMBOSSP);
480         uiBlockSetButmFunc(block, do_view3d_select_object_groupedmenu, NULL);
481
482         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Children|Shift G, 1",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
483         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Immediate Children|Shift G, 2",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
484         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Parent|Shift G, 3",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
485         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Siblings (Shared Parent)|Shift G, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
486         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, "");
487         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, "");
488         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, "");
489         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Hooks|Shift G, 8",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
490         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object PassIndex|Shift G, 9",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
491         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Color|Shift G, 0",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");  
492         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Game Properties|Shift G, Alt+1",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");  
493
494         uiBlockSetDirection(block, UI_RIGHT);
495         uiTextBoundsBlock(block, 60);
496         return block;
497 }
498
499 #endif
500
501 void do_view3d_select_faceselmenu(bContext *C, void *arg, int event)
502 {
503 #if 0
504         /* events >= 6 are registered bpython scripts */
505 #ifndef DISABLE_PYTHON
506         if (event >= 6) BPY_menu_do_python(PYMENU_FACESELECT, event - 6);
507 #endif
508         
509         switch(event) {
510                 case 0: /* border select */
511                         borderselect();
512                         break;
513                 case 2: /* Select/Deselect all */
514                         deselectall_tface();
515                         break;
516                 case 3: /* Select Inverse */
517                         selectswap_tface();
518                         break;
519                 case 4: /* Select Linked */
520                         select_linked_tfaces(2);
521                         break;
522         }
523 #endif
524 }
525
526 static uiBlock *view3d_select_faceselmenu(bContext *C, ARegion *ar, void *arg_unused)
527 {
528         uiBlock *block;
529         short yco= 0, menuwidth=120;
530 #ifndef DISABLE_PYTHON
531 // XXX  BPyMenu *pym;
532 //      int i = 0;
533 #endif
534
535         block= uiBeginBlock(C, ar, "view3d_select_faceselmenu", UI_EMBOSSP);
536         uiBlockSetButmFunc(block, do_view3d_select_faceselmenu, NULL);
537         
538         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
539         
540         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
541         
542         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
543         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
544
545         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
546         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Linked Faces|Ctrl L",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
547
548 #ifndef DISABLE_PYTHON
549 //      uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
550
551         /* note that we account for the 6 previous entries with i+6: */
552 //      for (pym = BPyMenuTable[PYMENU_FACESELECT]; pym; pym = pym->next, i++) {
553 //              uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20,
554 //                      menuwidth, 19, NULL, 0.0, 0.0, 1, i+6,
555 //                      pym->tooltip?pym->tooltip:pym->filename);
556 //      }
557 #endif
558         
559         if(ar->alignment==RGN_ALIGN_TOP) {
560                 uiBlockSetDirection(block, UI_DOWN);
561         }
562         else {
563                 uiBlockSetDirection(block, UI_TOP);
564                 uiBlockFlipOrder(block);
565         }
566
567         uiTextBoundsBlock(block, 50);
568         return block;
569 }
570
571 /* wrapper for python layouts */
572 void uiTemplate_view3d_select_faceselmenu(uiLayout *layout, bContext *C)
573 {
574         void *arg_unused = NULL;
575         ARegion *ar= CTX_wm_region(C);
576         view3d_select_faceselmenu(C, ar, arg_unused);
577 }
578
579 #if 0
580 void do_view3d_transform_moveaxismenu(bContext *C, void *arg, int event)
581 {
582 #if 0
583         float mat[3][3];
584         
585         Mat3One(mat);
586         
587         switch(event)
588         {
589             case 0: /* X Global */
590                         initTransform(TFM_TRANSLATION, CTX_NONE);
591                         BIF_setSingleAxisConstraint(mat[0], " X");
592                         Transform();
593                         break;
594                 case 1: /* Y Global */
595                         initTransform(TFM_TRANSLATION, CTX_NONE);
596                         BIF_setSingleAxisConstraint(mat[1], " Y");
597                         Transform();
598                         break;
599                 case 2: /* Z Global */
600                         initTransform(TFM_TRANSLATION, CTX_NONE);
601                         BIF_setSingleAxisConstraint(mat[2], " Z");
602                         Transform();
603                         break;
604                 case 3: /* X Local */
605                         initTransform(TFM_TRANSLATION, CTX_NONE);
606                         BIF_setLocalAxisConstraint('X', " X");
607                         Transform();
608                         break;
609                 case 4: /* Y Local */
610                         initTransform(TFM_TRANSLATION, CTX_NONE);
611                         BIF_setLocalAxisConstraint('Y', " Y");
612                         Transform();
613                         break;
614                 case 5: /* Z Local */
615                         initTransform(TFM_TRANSLATION, CTX_NONE);
616                         BIF_setLocalAxisConstraint('Z', " Z");
617                         Transform();
618                         break;
619         }
620 #endif
621 }
622
623 static uiBlock *view3d_transform_moveaxismenu(bContext *C, ARegion *ar, void *arg_unused)
624 {
625         uiBlock *block;
626         short yco = 20, menuwidth = 120;
627
628         block= uiBeginBlock(C, ar, "view3d_transform_moveaxismenu", UI_EMBOSSP);
629         uiBlockSetButmFunc(block, do_view3d_transform_moveaxismenu, NULL);
630
631         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|G, X",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
632         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|G, Y",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
633         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|G, Z",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
634         
635         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
636         
637         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|G, X, X",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
638         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|G, Y, Y",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
639         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|G, Z, Z",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
640         
641         
642         uiBlockSetDirection(block, UI_RIGHT);
643         uiTextBoundsBlock(block, 60);
644         return block;
645 }
646
647 void do_view3d_transform_rotateaxismenu(bContext *C, void *arg, int event)
648 {
649 #if 0
650         float mat[3][3];
651         
652         Mat3One(mat);
653         
654         switch(event)
655         {
656             case 0: /* X Global */
657                         initTransform(TFM_ROTATION, CTX_NONE);
658                         BIF_setSingleAxisConstraint(mat[0], " X");
659                         Transform();
660                         break;
661                 case 1: /* Y Global */
662                         initTransform(TFM_ROTATION, CTX_NONE);
663                         BIF_setSingleAxisConstraint(mat[1], " Y");
664                         Transform();
665                         break;
666                 case 2: /* Z Global */
667                         initTransform(TFM_ROTATION, CTX_NONE);
668                         BIF_setSingleAxisConstraint(mat[2], " Z");
669                         Transform();
670                         break;
671                 case 3: /* X Local */
672                         initTransform(TFM_ROTATION, CTX_NONE);
673                         BIF_setLocalAxisConstraint('X', " X");
674                         Transform();
675                         break;
676                 case 4: /* Y Local */
677                         initTransform(TFM_ROTATION, CTX_NONE);
678                         BIF_setLocalAxisConstraint('Y', " Y");
679                         Transform();
680                         break;
681                 case 5: /* Z Local */
682                         initTransform(TFM_ROTATION, CTX_NONE);
683                         BIF_setLocalAxisConstraint('Z', " Z");
684                         Transform();
685                         break;
686         }
687 #endif
688 }
689
690 static uiBlock *view3d_transform_rotateaxismenu(bContext *C, ARegion *ar, void *arg_unused)
691 {
692         uiBlock *block;
693         short yco = 20, menuwidth = 120;
694
695         block= uiBeginBlock(C, ar, "view3d_transform_rotateaxismenu", UI_EMBOSSP);
696         uiBlockSetButmFunc(block, do_view3d_transform_rotateaxismenu, NULL);
697
698         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|R, X",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
699         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|R, Y",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
700         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|R, Z",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
701         
702         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
703         
704         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|R, X, X",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
705         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|R, Y, Y",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
706         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|R, Z, Z",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
707         
708         
709         uiBlockSetDirection(block, UI_RIGHT);
710         uiTextBoundsBlock(block, 60);
711         return block;
712 }
713
714 void do_view3d_transform_scaleaxismenu(bContext *C, void *arg, int event)
715 {
716 #if 0
717         float mat[3][3];
718         
719         Mat3One(mat);
720         
721         switch(event)
722         {
723             case 0: /* X Global */
724                         initTransform(TFM_RESIZE, CTX_NONE);
725                         BIF_setSingleAxisConstraint(mat[0], " X");
726                         Transform();
727                         break;
728                 case 1: /* Y Global */
729                         initTransform(TFM_RESIZE, CTX_NONE);
730                         BIF_setSingleAxisConstraint(mat[1], " Y");
731                         Transform();
732                         break;
733                 case 2: /* Z Global */
734                         initTransform(TFM_RESIZE, CTX_NONE);
735                         BIF_setSingleAxisConstraint(mat[2], " Z");
736                         Transform();
737                         break;
738                 case 3: /* X Local */
739                         initTransform(TFM_RESIZE, CTX_NONE);
740                         BIF_setLocalAxisConstraint('X', " X");
741                         Transform();
742                         break;
743                 case 4: /* Y Local */
744                         initTransform(TFM_RESIZE, CTX_NONE);
745                         BIF_setLocalAxisConstraint('X', " X");
746                         Transform();
747                         break;
748                 case 5: /* Z Local */
749                         initTransform(TFM_RESIZE, CTX_NONE);
750                         BIF_setLocalAxisConstraint('X', " X");
751                         Transform();
752                         break;
753         }
754 #endif
755 }
756
757 static uiBlock *view3d_transform_scaleaxismenu(bContext *C, ARegion *ar, void *arg_unused)
758 {
759         uiBlock *block;
760         short yco = 20, menuwidth = 120;
761
762         block= uiBeginBlock(C, ar, "view3d_transform_scaleaxismenu", UI_EMBOSSP);
763         uiBlockSetButmFunc(block, do_view3d_transform_scaleaxismenu, NULL);
764
765         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|S, X",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
766         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|S, Y",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
767         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|S, Z",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
768         
769         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
770         
771         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|S, X, X",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
772         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|S, Y, Y",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
773         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|S, Z, Z",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
774         
775         
776         uiBlockSetDirection(block, UI_RIGHT);
777         uiTextBoundsBlock(block, 60);
778         return block;
779 }
780 #endif
781
782 #if 0
783 static void do_view3d_transformmenu(bContext *C, void *arg, int event)
784 {
785 #if 0
786         Scene *scene= CTX_data_scene(C);
787         ToolSettings *ts= CTX_data_tool_settings(C);
788         
789         switch(event) {
790         case 1:
791                 initTransform(TFM_TRANSLATION, CTX_NONE);
792                 Transform();
793                 break;
794         case 2:
795                 initTransform(TFM_ROTATION, CTX_NONE);
796                 Transform();
797                 break;
798         case 3:
799                 initTransform(TFM_RESIZE, CTX_NONE);
800                 Transform();
801                 break;
802         case 4:
803                 image_aspect();
804                 break;
805         case 5:
806                 initTransform(TFM_TOSPHERE, CTX_NONE);
807                 Transform();
808                 break;
809         case 6:
810                 initTransform(TFM_SHEAR, CTX_NONE);
811                 Transform();
812                 break;
813         case 7:
814                 initTransform(TFM_WARP, CTX_NONE);
815                 Transform();
816                 break;
817         case 8:
818                 initTransform(TFM_PUSHPULL, CTX_NONE);
819                 Transform();
820                 break;
821         case 9:
822                 if (obedit) {
823                         if (obedit->type == OB_MESH)
824                                 initTransform(TFM_SHRINKFATTEN, CTX_NONE);
825                                 Transform();
826                 } else error("Only meshes can be shrinked/fattened");
827                 break;
828         case 10:
829                 docenter(0);
830                 break;
831         case 11:
832                 docenter_new();
833                 break;
834         case 12:
835                 docenter_cursor();
836                 break;
837         case 13:
838                 initTransform(TFM_TILT, CTX_NONE);
839                 Transform();
840                 break;
841         case 14:
842                 initTransform(TFM_CURVE_SHRINKFATTEN, CTX_NONE);
843                 Transform();
844                 break;
845         case 15:
846                 ts->snap_flag &= ~SCE_SNAP;
847                 break;
848         case 16:
849                 ts->snap_flag |= SCE_SNAP;
850                 break;
851         case 17:
852                 ts->snap_target = SCE_SNAP_TARGET_CLOSEST;
853                 break;
854         case 18:
855                 ts->snap_target = SCE_SNAP_TARGET_CENTER;
856                 break;
857         case 19:
858                 ts->snap_target = SCE_SNAP_TARGET_MEDIAN;
859                 break;
860         case 20:
861                 ts->snap_target = SCE_SNAP_TARGET_ACTIVE;
862                 break;
863         case 21:
864                 alignmenu();
865                 break;
866         }
867 #endif
868 }
869
870 static uiBlock *view3d_transformmenu(bContext *C, ARegion *ar, void *arg_unused)
871 {
872         ToolSettings *ts= CTX_data_tool_settings(C);
873         Object *obedit = CTX_data_edit_object(C);
874         uiBlock *block;
875         short yco = 20, menuwidth = 120;
876
877         block= uiBeginBlock(C, ar, "view3d_transformmenu", UI_EMBOSSP);
878         uiBlockSetButmFunc(block, do_view3d_transformmenu, NULL);
879
880         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move|G",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
881         uiDefIconTextBlockBut(block, view3d_transform_moveaxismenu, NULL, ICON_RIGHTARROW_THIN, "Grab/Move on Axis", 0, yco-=20, 120, 19, "");
882                 
883         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate|R",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
884         uiDefIconTextBlockBut(block, view3d_transform_rotateaxismenu, NULL, ICON_RIGHTARROW_THIN, "Rotate on Axis", 0, yco-=20, 120, 19, "");
885
886         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale|S",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
887         uiDefIconTextBlockBut(block, view3d_transform_scaleaxismenu, NULL, ICON_RIGHTARROW_THIN, "Scale on Axis", 0, yco-=20, 120, 19, "");
888
889         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
890         
891         if (obedit) {
892                 if (obedit->type == OB_MESH)
893                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shrink/Fatten Along Normals|Alt S",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
894                 else if (obedit->type == OB_CURVE) {
895                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Tilt|T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
896                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shrink/Fatten Radius|Alt S",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
897                 }
898         }
899         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "To Sphere|Ctrl Shift S",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
900         if (obedit) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl S",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
901         else uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl Shift Alt S",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
902         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Warp|Shift W",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
903         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Push/Pull|Shift P",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
904         
905         if (!obedit) {
906                 uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
907                 
908                 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, "");
909         }
910         
911         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
912
913         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "ObData to Center",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
914         if (!obedit) {
915                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center New",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
916                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center Cursor",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
917                 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, "");
918         }
919         
920         if (BIF_snappingSupported(obedit))
921         {
922                 uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
923         
924                 if (ts->snap_flag & SCE_SNAP)
925                 {
926                         uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Grid",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
927                         uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
928                 }
929                 else
930                 {
931                         uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Grid",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
932                         uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
933                 }
934                         
935                 uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
936
937                 switch(ts->snap_target)
938                 {
939                         case SCE_SNAP_TARGET_CLOSEST:
940                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Closest",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
941                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Center",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
942                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Median",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
943                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Active",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
944                                 break;
945                         case SCE_SNAP_TARGET_CENTER:
946                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Closest",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
947                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Center",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
948                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Median",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
949                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Active",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
950                                 break;
951                         case SCE_SNAP_TARGET_MEDIAN:
952                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Closest",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
953                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Center",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
954                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Median",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
955                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Active",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
956                                 break;
957                         case SCE_SNAP_TARGET_ACTIVE:
958                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Closest",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
959                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Center",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
960                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Median",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
961                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Active",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
962                                 break;
963                 }
964         }
965
966         uiBlockSetDirection(block, UI_RIGHT);
967         uiTextBoundsBlock(block, 60);
968         return block;
969 }
970
971 #if 0
972 void do_view3d_object_mirrormenu(bContext *C, void *arg, int event)
973 {
974 #if 0
975         switch(event) {
976                 case 0:
977                         initTransform(TFM_MIRROR, CTX_NO_PET);
978                         Transform();
979                         break;
980                 case 1:
981                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
982                         BIF_setLocalAxisConstraint('X', " on X axis");
983                         Transform();
984                         break;
985                 case 2:
986                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
987                         BIF_setLocalAxisConstraint('Y', " on Y axis");
988                         Transform();
989                         break;
990                 case 3:
991                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
992                         BIF_setLocalAxisConstraint('Z', " on Z axis");
993                         Transform();
994                         break;
995         }
996 #endif
997 }
998
999 static uiBlock *view3d_object_mirrormenu(bContext *C, ARegion *ar, void *arg_unused)
1000 {
1001         uiBlock *block;
1002         short yco = 20, menuwidth = 120;
1003
1004         block= uiBeginBlock(C, ar, "view3d_object_mirrormenu", UI_EMBOSSP);
1005         uiBlockSetButmFunc(block, do_view3d_object_mirrormenu, NULL);
1006         
1007         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Interactive Mirror|Ctrl M",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1008         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1009         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|Ctrl M, X",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1010         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, Y",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1011         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, Z",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1012
1013         uiBlockSetDirection(block, UI_RIGHT);
1014         uiTextBoundsBlock(block, 60);
1015         return block;
1016 }
1017 #endif
1018 #endif
1019
1020 #if 0
1021 static void view3d_edit_object_transformmenu(bContext *C, uiLayout *layout, void *arg_unused)
1022 {
1023 #if 0 // XXX not used anymore
1024         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, "");
1025         apply_objects_locrot();
1026         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Visual Transform|Ctrl A, 2",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1027         apply_objects_visual_tx();
1028         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Deformation|Ctrl Shift A",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1029         if(OBACT) object_apply_deform(OBACT);
1030 #endif
1031         uiItemO(layout, NULL, 0, "OBJECT_OT_duplicates_make_real");
1032
1033         uiItemS(layout);
1034
1035         uiItemO(layout, NULL, 0, "OBJECT_OT_location_clear");
1036         uiItemO(layout, NULL, 0, "OBJECT_OT_rotation_clear");
1037         uiItemO(layout, NULL, 0, "OBJECT_OT_scale_clear");
1038         uiItemO(layout, NULL, 0, "OBJECT_OT_origin_clear");
1039 }
1040 #endif 
1041
1042 #if 0
1043 static void do_view3d_edit_object_makelocalmenu(bContext *C, void *arg, int event)
1044 {
1045 #if 0
1046         switch(event) {
1047                 case 1:
1048                 case 2:
1049                 case 3:
1050                         make_local(event);
1051                         break;
1052         }
1053 #endif
1054 }
1055
1056 static uiBlock *view3d_edit_object_makelocalmenu(bContext *C, ARegion *ar, void *arg_unused)
1057 {       
1058         uiBlock *block;
1059         short yco = 20, menuwidth = 120;
1060         
1061         block= uiBeginBlock(C, ar, "view3d_edit_object_makelocalmenu", UI_EMBOSSP);
1062         uiBlockSetButmFunc(block, do_view3d_edit_object_makelocalmenu, NULL);
1063         
1064         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selected Objects|L, 1",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1065         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selected Objects and Data|L, 2",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1066         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "All|L, 3",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1067         
1068         uiBlockSetDirection(block, UI_RIGHT);
1069         uiTextBoundsBlock(block, 60);
1070         return block;
1071 }
1072
1073 static void do_view3d_edit_object_makelinksmenu(bContext *C, void *arg, int event)
1074 {
1075 #if 0
1076         switch(event) {
1077         case 1:
1078         case 2:
1079         case 3:
1080         case 4:
1081                 make_links((short)event);
1082                 break;
1083                 }
1084 #endif
1085 }
1086
1087 static uiBlock *view3d_edit_object_makelinksmenu(bContext *C, ARegion *ar, void *arg_unused)
1088 {
1089         Scene *scene= CTX_data_scene(C);
1090         Object *ob=NULL;
1091         
1092         uiBlock *block;
1093         short yco = 20, menuwidth = 120;
1094
1095         block= uiBeginBlock(C, ar, "view3d_edit_object_makelinksmenu", UI_EMBOSSP);
1096         uiBlockSetButmFunc(block, do_view3d_edit_object_makelinksmenu, NULL);
1097         
1098         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "To Scene...|Ctrl L, 1",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1099         
1100         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1101         
1102         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Ipo|Ctrl L, 2",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1103         
1104         if ((ob=OBACT)) {
1105         
1106                 if(ob->type==OB_MESH) {
1107                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mesh Data|Ctrl L, 3",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1108                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1109                 } else if(ob->type==OB_CURVE) {
1110                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve Data|Ctrl L, 3",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1111                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1112                 } else if(ob->type==OB_FONT) {
1113                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Text Data|Ctrl L, 3",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1114                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1115                 } else if(ob->type==OB_SURF) {
1116                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Surface Data|Ctrl L, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1117                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1118                 } else if(ob->type==OB_MBALL) {
1119                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1120                 } else if(ob->type==OB_CAMERA) {
1121                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera Data|Ctrl L, 3",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1122                 } else if(ob->type==OB_LAMP) {
1123                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lamp Data|Ctrl L, 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1124                 } else if(ob->type==OB_LATTICE) {
1125                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lattice Data|Ctrl L, 3",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1126                 } else if(ob->type==OB_ARMATURE) {
1127                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Armature Data|Ctrl L, 3",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1128                 }
1129         }
1130         
1131         uiBlockSetDirection(block, UI_RIGHT);
1132         uiTextBoundsBlock(block, 60);
1133         return block;
1134 }
1135
1136 static void do_view3d_edit_object_singleusermenu(bContext *C, void *arg, int event)
1137 {
1138 #if 0
1139         switch(event) {
1140         case 1: /* Object */
1141                 single_object_users(1);
1142                 break;
1143         case 2: /* Object & ObData */ 
1144                 single_object_users(1);
1145                 single_obdata_users(1);
1146                 break;
1147         case 3: /* Object & ObData & Materials+Tex */
1148                 single_object_users(1);
1149                 single_obdata_users(1);
1150                 single_mat_users(1); /* also tex */
1151                 break;
1152         case 4: /* Materials+Tex */
1153                 single_mat_users(1);
1154                 break;
1155         case 5: /* Ipo */
1156                 single_ipo_users(1);
1157                 break;
1158         }
1159         
1160         clear_id_newpoins();
1161         countall();
1162         
1163 #endif
1164 }
1165
1166 static uiBlock *view3d_edit_object_singleusermenu(bContext *C, ARegion *ar, void *arg_unused)
1167 {
1168
1169         uiBlock *block;
1170         short yco = 20, menuwidth = 120;
1171
1172         block= uiBeginBlock(C, ar, "view3d_edit_object_singleusermenu", UI_EMBOSSP);
1173         uiBlockSetButmFunc(block, do_view3d_edit_object_singleusermenu, NULL);
1174         
1175         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object|U, 1",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1176         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object & ObData|U, 2",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1177         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object & ObData & Materials+Tex|U, 3",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1178         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials+Tex|U, 4",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1179         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Ipos|U, 5",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1180         
1181         uiBlockSetDirection(block, UI_RIGHT);
1182         uiTextBoundsBlock(block, 60);
1183         return block;
1184 }
1185
1186 static void do_view3d_edit_object_copyattrmenu(bContext *C, void *arg, int event)
1187 {
1188         switch(event) {
1189         case 1:
1190         case 2:
1191         case 3:
1192         case 4:
1193         case 5:
1194         case 6:
1195         case 7:
1196         case 8:
1197         case 9:
1198         case 10:
1199         case 11:
1200         case 17:
1201         case 18:
1202         case 19:
1203         case 20:
1204         case 21:
1205         case 22:
1206         case 23:
1207         case 24:
1208         case 25:
1209         case 26:
1210         case 29:
1211         case 30:
1212 // XXX          copy_attr((short)event);
1213                 break;
1214                 }
1215 }
1216
1217 static uiBlock *view3d_edit_object_copyattrmenu(bContext *C, ARegion *ar, void *arg_unused)
1218 {
1219         Scene *scene= CTX_data_scene(C);
1220         Object *ob=NULL;
1221         
1222         uiBlock *block;
1223         short yco = 20, menuwidth = 120;
1224
1225         block= uiBeginBlock(C, ar, "view3d_edit_object_copyattrmenu", UI_EMBOSSP);
1226         uiBlockSetButmFunc(block, do_view3d_edit_object_copyattrmenu, NULL);
1227         
1228         ob= OBACT;
1229         
1230         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Location|Ctrl C, 1",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1231         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotation|Ctrl C, 2",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1232         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Size|Ctrl C, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1233         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Drawtype|Ctrl C, 4",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1234         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Time Offset|Ctrl C, 5",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1235         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Dupli|Ctrl C, 6",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1236         
1237         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1238         
1239         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mass|Ctrl C, 7",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1240         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Damping|Ctrl C, 8",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
1241         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "All Physical Attributes|Ctrl C, 11",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
1242         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Properties|Ctrl C, 9",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
1243         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Logic Bricks|Ctrl C, 10",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
1244         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Protected Transform |Ctrl C",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 29, "");
1245         
1246         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1247         
1248         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Constraints|Ctrl C",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
1249         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NLA Strips|Ctrl C",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 26, "");
1250         
1251         if (ob) {
1252         
1253                 if ((ob->type == OB_MESH) || (ob->type == OB_CURVE) || (ob->type == OB_SURF) ||
1254                                 (ob->type == OB_FONT) || (ob->type == OB_MBALL)) {
1255                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Texture Space|Ctrl C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
1256                 }       
1257                 
1258                 if(ob->type == OB_FONT) {
1259                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Font Settings|Ctrl C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
1260                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel Settings|Ctrl C",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1261                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve Resolution|Ctrl C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
1262                 }
1263                 if(ob->type == OB_CURVE) {
1264                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel Settings|Ctrl C",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1265                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve Resolution|Ctrl C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
1266                 }
1267         
1268                 if(ob->type==OB_MESH) {
1269                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subsurf Settings|Ctrl C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 21, "");
1270                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Modifiers ...|Ctrl C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 24, "");
1271                 }
1272                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Pass Index|Ctrl C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 30, "");
1273         }
1274         
1275         uiBlockSetDirection(block, UI_RIGHT);
1276         uiTextBoundsBlock(block, 60);
1277         return block;
1278 }
1279 #endif
1280
1281 #if 0
1282 #ifndef DISABLE_PYTHON
1283 static void do_view3d_edit_object_scriptsmenu(bContext *C, void *arg, int event)
1284 {
1285 #if 0
1286         BPY_menu_do_python(PYMENU_OBJECT, event);
1287
1288 #endif
1289 }
1290
1291 static uiBlock *view3d_edit_object_scriptsmenu(bContext *C, ARegion *ar, void *arg_unused)
1292 {
1293         uiBlock *block;
1294 //      short yco = 20, menuwidth = 120;
1295 // XXX  BPyMenu *pym;
1296 //      int i = 0;
1297
1298         block= uiBeginBlock(C, ar, "v3d_eobject_pymenu", UI_EMBOSSP);
1299         uiBlockSetButmFunc(block, do_view3d_edit_object_scriptsmenu, NULL);
1300
1301 //      for (pym = BPyMenuTable[PYMENU_OBJECT]; pym; pym = pym->next, i++) {
1302 //              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);
1303 //      }
1304
1305         uiBlockSetDirection(block, UI_RIGHT);
1306         uiTextBoundsBlock(block, 60);
1307
1308         return block;
1309 }
1310 #endif /* DISABLE_PYTHON */
1311 #endif
1312
1313
1314 #if 0
1315 static void do_view3d_edit_objectmenu(bContext *C, void *arg, int event)
1316 {
1317         Scene *scene= CTX_data_scene(C);
1318         ScrArea *sa= CTX_wm_area(C);
1319         View3D *v3d= sa->spacedata.first;
1320         
1321         switch(event) {
1322          
1323         case 0: /* transform    properties*/
1324 // XXX          mainqenter(NKEY, 1);
1325                 break;
1326         case 5: /* make single user */
1327                 single_user();
1328                 break;
1329         case 7: /* boolean operation */
1330                 special_editmenu();
1331                 break;
1332         case 8: /* join objects */
1333                 join_menu();
1334                 break;
1335         case 9: /* convert object type */
1336                 convertmenu();
1337                 break;
1338         case 10: /* move to layer */
1339                 movetolayer();
1340                 break;
1341         case 11: /* insert keyframe */
1342                 common_insertkey();
1343                 break;
1344         case 16: /* make proxy object*/
1345                 make_proxy();
1346                 break;
1347         case 18: /* delete keyframe */
1348                 common_deletekey();
1349                 break; 
1350         }
1351 }
1352 #endif
1353
1354
1355 /* texture paint menu (placeholder, no items yet??) */
1356 static void do_view3d_tpaintmenu(bContext *C, void *arg, int event)
1357 {
1358 #if 0
1359         switch(event) {
1360         case 0: /* undo image painting */
1361                 undo_imagepaint_step(1);
1362                 break;
1363         }
1364
1365 #endif
1366 }
1367
1368 static uiBlock *view3d_tpaintmenu(bContext *C, ARegion *ar, void *arg_unused)
1369 {
1370         uiBlock *block;
1371         short yco= 0, menuwidth=120;
1372         
1373         block= uiBeginBlock(C, ar, "view3d_paintmenu", UI_EMBOSSP);
1374         uiBlockSetButmFunc(block, do_view3d_tpaintmenu, NULL);
1375         
1376         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Texture Painting|U",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1377         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1378         
1379         if(ar->alignment==RGN_ALIGN_TOP) {
1380                 uiBlockSetDirection(block, UI_DOWN);
1381         }
1382         else {
1383                 uiBlockSetDirection(block, UI_TOP);
1384                 uiBlockFlipOrder(block);
1385         }
1386
1387         uiTextBoundsBlock(block, 50);
1388         return block;
1389 }
1390
1391
1392 static void do_view3d_wpaintmenu(bContext *C, void *arg, int event)
1393 {
1394 #if 0
1395         Object *ob= OBACT;
1396         
1397         /* events >= 3 are registered bpython scripts */
1398 #ifndef DISABLE_PYTHON
1399         if (event >= 4) BPY_menu_do_python(PYMENU_WEIGHTPAINT, event - 4);
1400 #endif  
1401         switch(event) {
1402         case 0: /* undo weight painting */
1403                 BIF_undo();
1404                 break;
1405         case 1: /* set vertex colors/weight */
1406                 clear_wpaint_selectedfaces();
1407                 break;
1408         case 2: /* vgroups from envelopes */
1409                 pose_adds_vgroups(ob, 0);
1410                 break;
1411         case 3: /* vgroups from bone heat */
1412                 pose_adds_vgroups(ob, 1);
1413                 break;
1414         }
1415 #endif
1416 }
1417
1418 static uiBlock *view3d_wpaintmenu(bContext *C, ARegion *ar, void *arg_unused)
1419 {
1420         uiBlock *block;
1421         short yco= 0, menuwidth=120, menunr=1;
1422 #ifndef DISABLE_PYTHON
1423 // XXX  BPyMenu *pym;
1424 //      int i=0;
1425 #endif
1426                 
1427         block= uiBeginBlock(C, ar, "view3d_paintmenu", UI_EMBOSSP);
1428         uiBlockSetButmFunc(block, do_view3d_wpaintmenu, NULL);
1429         
1430         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Weight Painting|U",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1431
1432         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1433
1434         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, "");
1435         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, "");
1436         
1437         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1438         
1439         if (paint_facesel_test(CTX_data_active_object(C))) {
1440                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Weight|Shift K",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1441                 uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1442                 menunr++;
1443         }
1444
1445 #ifndef DISABLE_PYTHON
1446         /* note that we account for the 4 previous entries with i+4:
1447         even if the last item isnt displayed, it dosent matter */
1448 //      for (pym = BPyMenuTable[PYMENU_WEIGHTPAINT]; pym; pym = pym->next, i++) {
1449 //              uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20,
1450 //                      menuwidth, 19, NULL, 0.0, 0.0, 1, i+4,
1451 //                      pym->tooltip?pym->tooltip:pym->filename);
1452 //      }
1453 #endif
1454
1455         if(ar->alignment==RGN_ALIGN_TOP) {
1456                 uiBlockSetDirection(block, UI_DOWN);
1457         }
1458         else {
1459                 uiBlockSetDirection(block, UI_TOP);
1460                 uiBlockFlipOrder(block);
1461         }
1462
1463         uiTextBoundsBlock(block, 50);
1464         return block;
1465 }
1466
1467 static void do_view3d_facesel_showhidemenu(bContext *C, void *arg, int event)
1468 {
1469 #if 0
1470         switch(event) {
1471         case 4: /* show hidden faces */
1472                 reveal_tface();
1473                 break;
1474         case 5: /* hide selected faces */
1475                 hide_tface();
1476                 break;
1477         case 6: /* XXX hide deselected faces */
1478 //              G.qual |= LR_SHIFTKEY;
1479                 hide_tface();
1480 //              G.qual &= ~LR_SHIFTKEY;
1481                 break;
1482                 }
1483 #endif
1484 }
1485
1486 static uiBlock *view3d_facesel_showhidemenu(bContext *C, ARegion *ar, void *arg_unused)
1487 {
1488         uiBlock *block;
1489         short yco = 20, menuwidth = 120;
1490
1491         block= uiBeginBlock(C, ar, "view3d_facesel_showhidemenu", UI_EMBOSSP);
1492         uiBlockSetButmFunc(block, do_view3d_facesel_showhidemenu, NULL);
1493         
1494         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hidden Faces|Alt H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1495         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Selected Faces|H",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1496         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Unselected Faces|Shift H",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1497
1498         uiBlockSetDirection(block, UI_RIGHT);
1499         uiTextBoundsBlock(block, 60);
1500         return block;
1501 }
1502
1503 static void do_view3d_faceselmenu(bContext *C, void *arg, int event)
1504 {
1505 #if 0
1506         switch(event) {
1507         case 0: /* set vertex colors */
1508                 clear_vpaint_selectedfaces();
1509                 break;
1510         case 1: /* mark border seam */
1511                 seam_mark_clear_tface(1);
1512                 break;
1513         case 2: /* clear seam */
1514                 seam_mark_clear_tface(2);
1515                 break;
1516         }
1517 #endif
1518 }
1519
1520 static uiBlock *view3d_faceselmenu(bContext *C, ARegion *ar, void *arg_unused)
1521 {
1522         uiBlock *block;
1523         short yco= 0, menuwidth=120;
1524         
1525         block= uiBeginBlock(C, ar, "view3d_faceselmenu", UI_EMBOSSP);
1526         uiBlockSetButmFunc(block, do_view3d_faceselmenu, NULL);
1527
1528         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Vertex Colors|Shift K",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1529         
1530         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1531         
1532         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Seam|Ctrl E",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1533         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mark Border Seam|Ctrl E",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1534
1535         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1536
1537         uiDefIconTextBlockBut(block, view3d_facesel_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Show/Hide Faces", 0, yco-=20, 120, 19, "");
1538
1539         if(ar->alignment==RGN_ALIGN_TOP) {
1540                 uiBlockSetDirection(block, UI_DOWN);
1541         }
1542         else {
1543                 uiBlockSetDirection(block, UI_TOP);
1544                 uiBlockFlipOrder(block);
1545         }
1546
1547         uiTextBoundsBlock(block, 50);
1548         return block;
1549 }
1550
1551 static char *view3d_modeselect_pup(Scene *scene)
1552 {
1553         Object *ob= OBACT;
1554         static char string[1024];
1555         static char formatstr[] = "|%s %%x%d %%i%d";
1556         char *str = string;
1557
1558         str += sprintf(str, "Mode: %%t");
1559         
1560         str += sprintf(str, formatstr, "Object Mode", OB_MODE_OBJECT, ICON_OBJECT_DATA);
1561         
1562         if(ob==NULL) return string;
1563         
1564         /* if active object is editable */
1565         if ( ((ob->type == OB_MESH)
1566                 || (ob->type == OB_CURVE) || (ob->type == OB_SURF) || (ob->type == OB_FONT)
1567                 || (ob->type == OB_MBALL) || (ob->type == OB_LATTICE))) {
1568                 
1569                 str += sprintf(str, formatstr, "Edit Mode", OB_MODE_EDIT, ICON_EDITMODE_HLT);
1570         }
1571         else if (ob->type == OB_ARMATURE) {
1572                 if (ob->mode & OB_MODE_POSE)
1573                         str += sprintf(str, formatstr, "Edit Mode", OB_MODE_EDIT|OB_MODE_POSE, ICON_EDITMODE_HLT);
1574                 else
1575                         str += sprintf(str, formatstr, "Edit Mode", OB_MODE_EDIT, ICON_EDITMODE_HLT);
1576         }
1577
1578         if (ob->type == OB_MESH) {
1579
1580                 str += sprintf(str, formatstr, "Sculpt Mode", OB_MODE_SCULPT, ICON_SCULPTMODE_HLT);
1581                 str += sprintf(str, formatstr, "Vertex Paint", OB_MODE_VERTEX_PAINT, ICON_VPAINT_HLT);
1582                 str += sprintf(str, formatstr, "Texture Paint", OB_MODE_TEXTURE_PAINT, ICON_TPAINT_HLT);
1583                 str += sprintf(str, formatstr, "Weight Paint", OB_MODE_WEIGHT_PAINT, ICON_WPAINT_HLT);
1584         }
1585
1586         
1587         /* if active object is an armature */
1588         if (ob->type==OB_ARMATURE) {
1589                 str += sprintf(str, formatstr, "Pose Mode", OB_MODE_POSE, ICON_POSE_HLT);
1590         }
1591
1592         if (ob->particlesystem.first || modifiers_findByType(ob, eModifierType_Cloth) || modifiers_findByType(ob, eModifierType_Softbody)) {
1593                 str += sprintf(str, formatstr, "Particle Mode", OB_MODE_PARTICLE_EDIT, ICON_PARTICLEMODE);
1594         }
1595
1596         return (string);
1597 }
1598
1599
1600 static char *drawtype_pup(void)
1601 {
1602         static char string[512];
1603         char *str = string;
1604         
1605         str += sprintf(str, "%s", "Draw type: %t"); 
1606         str += sprintf(str, "%s", "|Bounding Box %x1"); 
1607         str += sprintf(str, "%s", "|Wireframe %x2");
1608         str += sprintf(str, "%s", "|Solid %x3");
1609         str += sprintf(str, "%s", "|Shaded %x4");
1610         str += sprintf(str, "%s", "|Textured %x5");
1611         return string;
1612 }
1613 static char *around_pup(const bContext *C)
1614 {
1615         Object *obedit = CTX_data_edit_object(C);
1616         static char string[512];
1617         char *str = string;
1618
1619         str += sprintf(str, "%s", "Pivot: %t"); 
1620         str += sprintf(str, "%s", "|Bounding Box Center %x0"); 
1621         str += sprintf(str, "%s", "|Median Point %x3");
1622         str += sprintf(str, "%s", "|3D Cursor %x1");
1623         str += sprintf(str, "%s", "|Individual Centers %x2");
1624         if ((obedit) && (obedit->type == OB_MESH))
1625                 str += sprintf(str, "%s", "|Active Vert/Edge/Face %x4");
1626         else
1627                 str += sprintf(str, "%s", "|Active Object %x4");
1628         return string;
1629 }
1630
1631 static char *ndof_pup(void)
1632 {
1633         static char string[512];
1634         char *str = string;
1635
1636         str += sprintf(str, "%s", "ndof mode: %t"); 
1637         str += sprintf(str, "%s", "|turntable %x0"); 
1638         str += sprintf(str, "%s", "|fly %x1");
1639         str += sprintf(str, "%s", "|transform %x2");
1640         return string;
1641 }
1642
1643
1644 static char *snapmode_pup(void)
1645 {
1646         static char string[512];
1647         char *str = string;
1648         
1649         str += sprintf(str, "%s", "Snap Element: %t"); 
1650         str += sprintf(str, "%s", "|Vertex%x0");
1651         str += sprintf(str, "%s", "|Edge%x1");
1652         str += sprintf(str, "%s", "|Face%x2"); 
1653         str += sprintf(str, "%s", "|Volume%x3"); 
1654         return string;
1655 }
1656
1657 static char *propfalloff_pup(void)
1658 {
1659         static char string[512];
1660         char *str = string;
1661         
1662         str += sprintf(str, "%s", "Falloff: %t"); 
1663         str += sprintf(str, "%s", "|Smooth Falloff%x0");
1664         str += sprintf(str, "%s", "|Sphere Falloff%x1");
1665         str += sprintf(str, "%s", "|Root Falloff%x2"); 
1666         str += sprintf(str, "%s", "|Sharp Falloff%x3"); 
1667         str += sprintf(str, "%s", "|Linear Falloff%x4");
1668         str += sprintf(str, "%s", "|Random Falloff%x6");
1669         str += sprintf(str, "%s", "|Constant, No Falloff%x5");
1670         return string;
1671 }
1672
1673
1674 static void do_view3d_header_buttons(bContext *C, void *arg, int event)
1675 {
1676         wmWindow *win= CTX_wm_window(C);
1677         Scene *scene= CTX_data_scene(C);
1678         ToolSettings *ts= CTX_data_tool_settings(C);
1679         ScrArea *sa= CTX_wm_area(C);
1680         View3D *v3d= sa->spacedata.first;
1681         Object *obedit = CTX_data_edit_object(C);
1682         Object *ob = CTX_data_active_object(C);
1683         EditMesh *em= NULL;
1684         int bit, ctrl= win->eventstate->ctrl, shift= win->eventstate->shift;
1685         PointerRNA props_ptr;
1686         
1687         if(obedit && obedit->type==OB_MESH) {
1688                 em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
1689         }
1690         /* watch it: if sa->win does not exist, check that when calling direct drawing routines */
1691
1692         switch(event) {
1693         case B_HOME:
1694                 WM_operator_name_call(C, "VIEW3D_OT_view_all", WM_OP_EXEC_REGION_WIN, NULL);
1695                 break;
1696         case B_REDR:
1697                 ED_area_tag_redraw(sa);
1698                 break;
1699         case B_SCENELOCK:
1700                 if(v3d->scenelock) {
1701                         v3d->lay= scene->lay;
1702                         /* seek for layact */
1703                         bit= 0;
1704                         while(bit<32) {
1705                                 if(v3d->lay & (1<<bit)) {
1706                                         v3d->layact= 1<<bit;
1707                                         break;
1708                                 }
1709                                 bit++;
1710                         }
1711                         v3d->camera= scene->camera;
1712                         ED_area_tag_redraw(sa);
1713                 }
1714                 break;
1715                 
1716         case B_VIEWBUT:
1717         
1718
1719         case B_PERSP:
1720         
1721                 
1722                 break;
1723         case B_VIEWRENDER:
1724                 if (sa->spacetype==SPACE_VIEW3D) {
1725 // XXX                  BIF_do_ogl_render(v3d, shift);
1726                 }
1727                 break;
1728         case B_STARTGAME:
1729 // XXX          start_game();
1730                 break;
1731         case B_MODESELECT:
1732                 WM_operator_properties_create(&props_ptr, "OBJECT_OT_mode_set");
1733                 RNA_enum_set(&props_ptr, "mode", v3d->modeselect);
1734                 WM_operator_name_call(C, "OBJECT_OT_mode_set", WM_OP_EXEC_REGION_WIN, &props_ptr);
1735                 WM_operator_properties_free(&props_ptr);
1736                 break;          
1737         case B_AROUND:
1738 // XXX          handle_view3d_around(); /* copies to other 3d windows */
1739                 break;
1740                 
1741         case B_SEL_VERT:
1742                 if(em) {
1743                         if(shift==0 || em->selectmode==0)
1744                                 em->selectmode= SCE_SELECT_VERTEX;
1745                         ts->selectmode= em->selectmode;
1746                         EM_selectmode_set(em);
1747                         WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
1748                         ED_undo_push(C, "Selectmode Set: Vertex");
1749                 }
1750                 break;
1751         case B_SEL_EDGE:
1752                 if(em) {
1753                         if(shift==0 || em->selectmode==0){
1754                                 if( (em->selectmode ^ SCE_SELECT_EDGE) == SCE_SELECT_VERTEX){
1755                                         if(ctrl) EM_convertsel(em, SCE_SELECT_VERTEX,SCE_SELECT_EDGE); 
1756                                 }
1757                                 em->selectmode = SCE_SELECT_EDGE;
1758                         }
1759                         ts->selectmode= em->selectmode;
1760                         EM_selectmode_set(em);
1761                         WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
1762                         ED_undo_push(C, "Selectmode Set: Edge");
1763                 }
1764                 break;
1765         case B_SEL_FACE:
1766                 if(em) {
1767                         if( shift==0 || em->selectmode==0){
1768                                 if( ((ts->selectmode ^ SCE_SELECT_FACE) == SCE_SELECT_VERTEX) || ((ts->selectmode ^ SCE_SELECT_FACE) == SCE_SELECT_EDGE)){
1769                                         if(ctrl) EM_convertsel(em, (ts->selectmode ^ SCE_SELECT_FACE),SCE_SELECT_FACE);
1770                                 }
1771                                 em->selectmode = SCE_SELECT_FACE;
1772                         }
1773                         ts->selectmode= em->selectmode;
1774                         EM_selectmode_set(em);
1775                         WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
1776                         ED_undo_push(C, "Selectmode Set: Face");
1777                 }
1778                 break;  
1779
1780         case B_SEL_PATH:
1781                 ts->particle.selectmode= SCE_SELECT_PATH;
1782                 WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
1783                 ED_undo_push(C, "Selectmode Set: Path");
1784                 break;
1785         case B_SEL_POINT:
1786                 ts->particle.selectmode = SCE_SELECT_POINT;
1787                 WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
1788                 ED_undo_push(C, "Selectmode Set: Point");
1789                 break;
1790         case B_SEL_END:
1791                 ts->particle.selectmode = SCE_SELECT_END;
1792                 WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
1793                 ED_undo_push(C, "Selectmode Set: End point");
1794                 break;  
1795         
1796         case B_MAN_TRANS:
1797                 if( shift==0 || v3d->twtype==0) {
1798                         v3d->twtype= V3D_MANIP_TRANSLATE;
1799                 }
1800         ED_area_tag_redraw(sa);
1801         break;
1802         case B_MAN_ROT:
1803                 if( shift==0 || v3d->twtype==0) {
1804             v3d->twtype= V3D_MANIP_ROTATE;
1805                 }
1806         ED_area_tag_redraw(sa);
1807                 break;
1808         case B_MAN_SCALE:
1809                 if( shift==0 || v3d->twtype==0) {
1810             v3d->twtype= V3D_MANIP_SCALE;
1811                 }
1812         ED_area_tag_redraw(sa);
1813                 break;
1814         case B_NDOF:
1815         ED_area_tag_redraw(sa);
1816                 break;
1817         case B_MAN_MODE:
1818         ED_area_tag_redraw(sa);
1819                 break;          
1820         case B_VIEW_BUTSEDIT:
1821                 break;
1822                 
1823         default:
1824
1825                 if(event>=B_LAY && event<B_LAY+31) {
1826                         if(v3d->lay!=0 && shift) {
1827                                 
1828                                 /* but do find active layer */
1829                                 
1830                                 bit= event-B_LAY;
1831                                 if( v3d->lay & (1<<bit)) v3d->layact= 1<<bit;
1832                                 else {
1833                                         if( (v3d->lay & v3d->layact) == 0) {
1834                                                 bit= 0;
1835                                                 while(bit<32) {
1836                                                         if(v3d->lay & (1<<bit)) {
1837                                                                 v3d->layact= 1<<bit;
1838                                                                 break;
1839                                                         }
1840                                                         bit++;
1841                                                 }
1842                                         }
1843                                 }
1844                         }
1845                         else {
1846                                 bit= event-B_LAY;
1847                                 v3d->lay= 1<<bit;
1848                                 v3d->layact= v3d->lay;
1849                         }
1850                         
1851                         if(v3d->scenelock) handle_view3d_lock(C);
1852                         
1853                         ED_area_tag_redraw(sa);
1854                         countall();
1855                         
1856                         /* new layers might need unflushed events events */
1857                         DAG_scene_update_flags(scene, v3d->lay);        /* tags all that moves and flushes */
1858
1859                 }
1860                 break;
1861         }
1862
1863         if(obedit && obedit->type==OB_MESH)
1864                 BKE_mesh_end_editmesh(obedit->data, em);
1865 }
1866
1867 static void view3d_header_pulldowns(const bContext *C, uiBlock *block, Object *ob, int *xcoord, int yco)
1868 {
1869         Object *obedit = CTX_data_edit_object(C);
1870         RegionView3D *rv3d= wm_region_view3d(C);
1871         short xmax, xco= *xcoord;
1872         
1873         /* compensate for local mode when setting up the viewing menu/iconrow values */
1874         if(rv3d->view==7) rv3d->viewbut= 1;
1875         else if(rv3d->view==1) rv3d->viewbut= 2;
1876         else if(rv3d->view==3) rv3d->viewbut= 3;
1877         else rv3d->viewbut= 0;
1878         
1879         /* the 'xmax - 3' rather than xmax is to prevent some weird flickering where the highlighted
1880          * menu is drawn wider than it should be. The ypos of -2 is to make it properly fill the
1881          * height of the header */
1882         
1883         xmax= GetButStringLength("Select");
1884
1885         xco+= xmax;
1886         
1887         if (obedit) {
1888         }
1889         else if (ob && ob->mode & OB_MODE_WEIGHT_PAINT) {
1890                 xmax= GetButStringLength("Paint");
1891                 uiDefPulldownBut(block, view3d_wpaintmenu, NULL, "Paint", xco,yco, xmax-3, 20, "");
1892                 xco+= xmax;
1893         }
1894         else if (ob && ob->mode & OB_MODE_TEXTURE_PAINT) {
1895                 xmax= GetButStringLength("Paint");
1896                 uiDefPulldownBut(block, view3d_tpaintmenu, NULL, "Paint", xco,yco, xmax-3, 20, "");
1897                 xco+= xmax;
1898         }
1899         else if (paint_facesel_test(ob)) {
1900                 if (ob && ob->type == OB_MESH) {
1901                         xmax= GetButStringLength("Face");
1902                         uiDefPulldownBut(block, view3d_faceselmenu, NULL, "Face",       xco,yco, xmax-3, 20, "");
1903                         xco+= xmax;
1904                 }
1905         }
1906         else if(ob && ob->mode & OB_MODE_PARTICLE_EDIT) {
1907                 /* ported to python */
1908         }
1909         else {
1910                 if (ob && (ob->mode & OB_MODE_POSE)) {
1911                 /* ported to python */
1912                 }
1913         }
1914
1915         *xcoord= xco;
1916 }
1917
1918 static int view3d_layer_icon(int but_lay, int ob_lay, int used_lay)
1919 {
1920         if (but_lay & ob_lay)
1921                 return ICON_LAYER_ACTIVE;
1922         else if (but_lay & used_lay)
1923                 return ICON_LAYER_USED;
1924         else
1925                 return ICON_BLANK1;
1926 }
1927
1928 static void header_xco_step(ARegion *ar, int *xco, int *yco, int *maxco, int step)
1929 {
1930         *xco += step;
1931         if(*maxco < *xco) *maxco = *xco;
1932         
1933         if(ar->winy > *yco + 44) {
1934                 if(*xco > ar->winrct.xmax) {
1935                         *xco= 8;
1936                         *yco+= 22;
1937                 }
1938         }
1939 }
1940
1941 /* Returns the icon associated with an object mode */
1942 static int object_mode_icon(int mode)
1943 {
1944         EnumPropertyItem *item = object_mode_items;
1945         
1946         while(item->name != NULL) {
1947                 if(item->value == mode)
1948                         return item->icon;
1949                 ++item;
1950         }
1951
1952         return ICON_OBJECT_DATAMODE;
1953 }
1954
1955 void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
1956 {
1957         ARegion *ar= CTX_wm_region(C);
1958         ScrArea *sa= CTX_wm_area(C);
1959         View3D *v3d= sa->spacedata.first;
1960         Scene *scene= CTX_data_scene(C);
1961         ToolSettings *ts= CTX_data_tool_settings(C);
1962         Object *ob= OBACT;
1963         Object *obedit = CTX_data_edit_object(C);
1964         uiBlock *block;
1965         int a, xco=0, maxco=0, yco= 0;
1966         
1967         block= uiLayoutFreeBlock(layout);
1968         uiBlockSetHandleFunc(block, do_view3d_header_buttons, NULL);
1969         
1970         if((sa->flag & HEADER_NO_PULLDOWN)==0) 
1971                 view3d_header_pulldowns(C, block, ob, &xco, yco);
1972
1973         /* other buttons: */
1974         uiBlockSetEmboss(block, UI_EMBOSS);
1975         
1976         /* mode */
1977         if(ob)
1978                 v3d->modeselect = ob->mode;
1979         else
1980                 v3d->modeselect = OB_MODE_OBJECT;
1981                 
1982         v3d->flag &= ~V3D_MODE;
1983         
1984         /* not sure what the v3d->flag is useful for now... modeselect is confusing */
1985         if(obedit) v3d->flag |= V3D_EDITMODE;
1986         if(ob && (ob->mode & OB_MODE_POSE)) v3d->flag |= V3D_POSEMODE;
1987         if(ob && (ob->mode & OB_MODE_VERTEX_PAINT)) v3d->flag |= V3D_VERTEXPAINT;
1988         if(ob && (ob->mode & OB_MODE_WEIGHT_PAINT)) v3d->flag |= V3D_WEIGHTPAINT;
1989         if(ob && (ob->mode & OB_MODE_TEXTURE_PAINT)) v3d->flag |= V3D_TEXTUREPAINT;
1990         if(paint_facesel_test(ob)) v3d->flag |= V3D_FACESELECT;
1991
1992         uiDefIconTextButS(block, MENU, B_MODESELECT, object_mode_icon(v3d->modeselect), view3d_modeselect_pup(scene) , 
1993                           xco,yco,126,20, &(v3d->modeselect), 0, 0, 0, 0, "Mode (Hotkeys: Tab, V, Ctrl Tab)");
1994         header_xco_step(ar, &xco, &yco, &maxco, 126+8);
1995         
1996         /* DRAWTYPE */
1997         uiDefIconTextButS(block, ICONTEXTROW,B_REDR, ICON_BBOX, drawtype_pup(), xco,yco,XIC+10,YIC, &(v3d->drawtype), 1.0, 5.0, 0, 0, "Viewport Shading (Hotkeys: Z, Shift Z, Alt Z)");
1998
1999         header_xco_step(ar, &xco, &yco, &maxco, XIC+18);
2000
2001         uiBlockBeginAlign(block);
2002
2003         if(retopo_mesh_paint_check()) {
2004                 void *rpd= NULL; // XXX RetopoPaintData *rpd= get_retopo_paint_data();
2005                 if(rpd) {
2006                         ToolSettings *ts= scene->toolsettings;
2007                         
2008                         uiDefButC(block,ROW,B_REDR,"Pen",xco,yco,40,20,&ts->retopo_paint_tool,6.0,RETOPO_PEN,0,0,"");
2009                         xco+= 40;
2010                         uiDefButC(block,ROW,B_REDR,"Line",xco,yco,40,20,&ts->retopo_paint_tool,6.0,RETOPO_LINE,0,0,"");
2011                         xco+= 40;
2012                         uiDefButC(block,ROW,B_REDR,"Ellipse",xco,yco,60,20,&ts->retopo_paint_tool,6.0,RETOPO_ELLIPSE,0,0,"");
2013                         xco+= 65;
2014                         
2015                         uiBlockBeginAlign(block);
2016                         if(ts->retopo_paint_tool == RETOPO_PEN) {
2017                                 uiDefButC(block,TOG,B_NOP,"Hotspot",xco,yco,60,20, &ts->retopo_hotspot, 0,0,0,0,"Show hotspots at line ends to allow line continuation");
2018                                 xco+= 80;
2019                         }
2020                         else if(ts->retopo_paint_tool == RETOPO_LINE) {
2021                                 uiDefButC(block,NUM,B_NOP,"LineDiv",xco,yco,80,20,&ts->line_div,1,50,0,0,"Subdivisions per retopo line");
2022                                 xco+= 80;
2023                         }
2024                         else if(ts->retopo_paint_tool == RETOPO_ELLIPSE) {
2025                                 uiDefButC(block,NUM,B_NOP,"EllDiv",xco,yco,80,20,&ts->ellipse_div,3,50,0,0,"Subdivisions per retopo ellipse");
2026                                 xco+= 80;
2027                         }
2028                         header_xco_step(ar, &xco, &yco, &maxco, 5);
2029                         
2030                         uiBlockEndAlign(block);
2031                 }
2032         } else {
2033                 if (obedit==NULL && ((ob && ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT)))) {
2034                         uiDefIconButBitI(block, TOG, G_FACESELECT, B_VIEW_BUTSEDIT, ICON_FACESEL_HLT,xco,yco,XIC,YIC, &G.f, 0, 0, 0, 0, "Painting Mask (FKey)");
2035                         header_xco_step(ar, &xco, &yco, &maxco, XIC+10);
2036                 } else {
2037                         /* Manipulators aren't used in weight paint mode */
2038                         char *str_menu;
2039                         uiDefIconTextButS(block, ICONTEXTROW,B_AROUND, ICON_ROTATE, around_pup(C), xco,yco,XIC+10,YIC, &(v3d->around), 0, 3.0, 0, 0, "Rotation/Scaling Pivot (Hotkeys: Comma, Shift Comma, Period, Ctrl Period, Alt Period)");
2040                         xco+= XIC+10;
2041                 
2042                         uiDefIconButBitS(block, TOG, V3D_ALIGN, B_AROUND, ICON_ALIGN,
2043                                          xco,yco,XIC,YIC,
2044                                          &v3d->flag, 0, 0, 0, 0, "Move object centers only");   
2045                         uiBlockEndAlign(block);
2046                 
2047                         header_xco_step(ar, &xco, &yco, &maxco, XIC+8);
2048         
2049                         uiBlockBeginAlign(block);
2050
2051                         /* NDOF */
2052                         if (G.ndofdevice ==0 ) {
2053                                 uiDefIconTextButC(block, ICONTEXTROW,B_NDOF, ICON_NDOF_TURN, ndof_pup(), xco,yco,XIC+10,YIC, &(v3d->ndofmode), 0, 3.0, 0, 0, "Ndof mode");
2054                                 xco+= XIC+10;
2055                 
2056                                 uiDefIconButC(block, TOG, B_NDOF,  ICON_NDOF_DOM,
2057                                          xco,yco,XIC,YIC,
2058                                          &v3d->ndoffilter, 0, 1, 0, 0, "dominant axis");        
2059                                 uiBlockEndAlign(block);
2060                 
2061                                 header_xco_step(ar, &xco, &yco, &maxco, XIC+8);
2062                         }
2063                         uiBlockEndAlign(block);
2064
2065                         /* Transform widget / manipulators */
2066                         uiBlockBeginAlign(block);
2067                         uiDefIconButBitS(block, TOG, V3D_USE_MANIPULATOR, B_REDR, ICON_MANIPUL,xco,yco,XIC,YIC, &v3d->twflag, 0, 0, 0, 0, "Use 3d transform manipulator (Ctrl Space)"); 
2068                         xco+= XIC;
2069                 
2070                         if(v3d->twflag & V3D_USE_MANIPULATOR) {
2071                                 uiDefIconButBitS(block, TOG, V3D_MANIP_TRANSLATE, B_MAN_TRANS, ICON_MAN_TRANS, xco,yco,XIC,YIC, &v3d->twtype, 1.0, 0.0, 0, 0, "Translate manipulator mode (Ctrl Alt G)");
2072                                 xco+= XIC;
2073                                 uiDefIconButBitS(block, TOG, V3D_MANIP_ROTATE, B_MAN_ROT, ICON_MAN_ROT, xco,yco,XIC,YIC, &v3d->twtype, 1.0, 0.0, 0, 0, "Rotate manipulator mode (Ctrl Alt R)");
2074                                 xco+= XIC;
2075                                 uiDefIconButBitS(block, TOG, V3D_MANIP_SCALE, B_MAN_SCALE, ICON_MAN_SCALE, xco,yco,XIC,YIC, &v3d->twtype, 1.0, 0.0, 0, 0, "Scale manipulator mode (Ctrl Alt S)");
2076                                 xco+= XIC;
2077                         }
2078                         
2079                         if (v3d->twmode > (BIF_countTransformOrientation(C) - 1) + V3D_MANIP_CUSTOM) {
2080                                 v3d->twmode = 0;
2081                         }
2082                         
2083                         str_menu = BIF_menustringTransformOrientation(C, "Orientation");
2084                         uiDefButS(block, MENU, B_MAN_MODE, str_menu,xco,yco,70,YIC, &v3d->twmode, 0, 0, 0, 0, "Transform Orientation (ALT+Space)");
2085                         MEM_freeN(str_menu);
2086                         
2087                         header_xco_step(ar, &xco, &yco, &maxco, 78);
2088                         uiBlockEndAlign(block);
2089                 }
2090                 
2091                 /* LAYERS */
2092                 if(obedit==NULL && v3d->localvd==NULL) {
2093                         int ob_lay = ob ? ob->lay : 0;
2094                         uiBlockBeginAlign(block);
2095                         for(a=0; a<5; a++) {
2096                                 uiDefIconButBitI(block, TOG, 1<<a, B_LAY+a, view3d_layer_icon(1<<a, ob_lay, v3d->lay_used), (short)(xco+a*(XIC/2)), yco+(short)(YIC/2),(short)(XIC/2),(short)(YIC/2), &(v3d->lay), 0, 0, 0, 0, "Toggles Layer visibility (Alt Num, Alt Shift Num)");
2097                         }
2098                         for(a=0; a<5; a++) {
2099                                 uiDefIconButBitI(block, TOG, 1<<(a+10), B_LAY+10+a, view3d_layer_icon(1<<(a+10), ob_lay, v3d->lay_used), (short)(xco+a*(XIC/2)), yco,                   XIC/2, (YIC)/2, &(v3d->lay), 0, 0, 0, 0, "Toggles Layer visibility (Alt Num, Alt Shift Num)");
2100                         }
2101                         xco+= 5;
2102                         uiBlockBeginAlign(block);
2103                         for(a=5; a<10; a++) {
2104                                 uiDefIconButBitI(block, TOG, 1<<a, B_LAY+a, view3d_layer_icon(1<<a, ob_lay, v3d->lay_used), (short)(xco+a*(XIC/2)), yco+(short)(YIC/2),(short)(XIC/2),(short)(YIC/2), &(v3d->lay), 0, 0, 0, 0, "Toggles Layer visibility (Alt Num, Alt Shift Num)");
2105                         }
2106                         for(a=5; a<10; a++) {
2107                                 uiDefIconButBitI(block, TOG, 1<<(a+10), B_LAY+10+a, view3d_layer_icon(1<<(a+10), ob_lay, v3d->lay_used), (short)(xco+a*(XIC/2)), yco, XIC/2, (YIC)/2, &(v3d->lay), 0, 0, 0, 0, "Toggles Layer visibility (Alt Num, Alt Shift Num)");
2108                         }
2109                         uiBlockEndAlign(block);
2110                 
2111                         xco+= (a-2)*(XIC/2)+3;
2112
2113                         /* LOCK */
2114                         uiDefIconButS(block, ICONTOG, B_SCENELOCK, ICON_LOCKVIEW_OFF, xco+=XIC,yco,XIC,YIC, &(v3d->scenelock), 0, 0, 0, 0, "Locks Active Camera and layers to Scene (Ctrl `)");
2115                         header_xco_step(ar, &xco, &yco, &maxco, XIC+10);
2116
2117                 }
2118         
2119                 /* proportional falloff */
2120                 if((obedit && (obedit->type == OB_MESH || obedit->type == OB_CURVE || obedit->type == OB_SURF || obedit->type == OB_LATTICE)) || (ob && ob->mode & OB_MODE_PARTICLE_EDIT)) {
2121                 
2122                         uiBlockBeginAlign(block);
2123                         uiDefIconTextButS(block, ICONTEXTROW,B_REDR, ICON_PROP_OFF, "Proportional %t|Off %x0|On %x1|Connected %x2", xco,yco,XIC+10,YIC, &(ts->proportional), 0, 1.0, 0, 0, "Proportional Edit Falloff (Hotkeys: O, Alt O) ");
2124                         xco+= XIC+10;
2125                 
2126                         if(ts->proportional) {
2127                                 uiDefIconTextButS(block, ICONTEXTROW,B_REDR, ICON_SMOOTHCURVE, propfalloff_pup(), xco,yco,XIC+10,YIC, &(ts->prop_mode), 0.0, 0.0, 0, 0, "Proportional Edit Falloff (Hotkey: Shift O) ");
2128                                 xco+= XIC+10;
2129                         }
2130                         uiBlockEndAlign(block);
2131                         header_xco_step(ar, &xco, &yco, &maxco, 10);
2132                 }
2133
2134                 /* Snap */
2135                 if (BIF_snappingSupported(obedit)) {
2136                         uiBlockBeginAlign(block);
2137
2138                         if (ts->snap_flag & SCE_SNAP) {
2139                                 uiDefIconButBitS(block, TOG, SCE_SNAP, B_REDR, ICON_SNAP_GEO,xco,yco,XIC,YIC, &ts->snap_flag, 0, 0, 0, 0, "Snap while Ctrl is held during transform (Shift Tab)");
2140                                 xco+= XIC;
2141                                 uiDefIconButBitS(block, TOG, SCE_SNAP_ROTATE, B_REDR, ICON_SNAP_NORMAL,xco,yco,XIC,YIC, &ts->snap_flag, 0, 0, 0, 0, "Align rotation with the snapping target"); 
2142                                 xco+= XIC;
2143                                 if (ts->snap_mode == SCE_SNAP_MODE_VOLUME) {
2144                                         uiDefIconButBitS(block, TOG, SCE_SNAP_PEEL_OBJECT, B_REDR, ICON_SNAP_PEEL_OBJECT,xco,yco,XIC,YIC, &ts->snap_flag, 0, 0, 0, 0, "Consider objects as whole when finding volume center");  
2145                                         xco+= XIC;
2146                                 }
2147                                 uiDefIconTextButS(block, ICONTEXTROW,B_REDR, ICON_SNAP_VERTEX, snapmode_pup(), xco,yco,XIC+10,YIC, &(ts->snap_mode), 0.0, 0.0, 0, 0, "Snapping mode");
2148                                 xco+= XIC + 10;
2149                                 uiDefButS(block, MENU, B_NOP, "Snap Mode%t|Closest%x0|Center%x1|Median%x2|Active%x3",xco,yco,70,YIC, &ts->snap_target, 0, 0, 0, 0, "Snap Target Mode");
2150                                 xco+= 70;
2151                         } else {
2152                                 uiDefIconButBitS(block, TOG, SCE_SNAP, B_REDR, ICON_SNAP_GEAR,xco,yco,XIC,YIC, &ts->snap_flag, 0, 0, 0, 0, "Snap while Ctrl is held during transform (Shift Tab)");     
2153                                 xco+= XIC;
2154                         }
2155
2156                         uiBlockEndAlign(block);
2157                         header_xco_step(ar, &xco, &yco, &maxco, 10);
2158                 }
2159
2160                 /* selection modus */
2161                 if(obedit && (obedit->type == OB_MESH)) {
2162                         EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
2163
2164                         uiBlockBeginAlign(block);
2165                         uiDefIconButBitS(block, TOG, SCE_SELECT_VERTEX, B_SEL_VERT, ICON_VERTEXSEL, xco,yco,XIC,YIC, &em->selectmode, 1.0, 0.0, 0, 0, "Vertex select mode (Ctrl Tab 1)");
2166                         xco+= XIC;
2167                         uiDefIconButBitS(block, TOG, SCE_SELECT_EDGE, B_SEL_EDGE, ICON_EDGESEL, xco,yco,XIC,YIC, &em->selectmode, 1.0, 0.0, 0, 0, "Edge select mode (Ctrl Tab 2)");
2168                         xco+= XIC;
2169                         uiDefIconButBitS(block, TOG, SCE_SELECT_FACE, B_SEL_FACE, ICON_FACESEL, xco,yco,XIC,YIC, &em->selectmode, 1.0, 0.0, 0, 0, "Face select mode (Ctrl Tab 3)");
2170                         xco+= XIC;
2171                         uiBlockEndAlign(block);
2172                         header_xco_step(ar, &xco, &yco, &maxco, 10);
2173                         if(v3d->drawtype > OB_WIRE) {
2174                                 uiDefIconButBitS(block, TOG, V3D_ZBUF_SELECT, B_REDR, ICON_ORTHO, xco,yco,XIC,YIC, &v3d->flag, 1.0, 0.0, 0, 0, "Occlude background geometry");
2175                         }
2176                         xco+= XIC;
2177                         uiBlockEndAlign(block);
2178                         header_xco_step(ar, &xco, &yco, &maxco, XIC);
2179
2180                         BKE_mesh_end_editmesh(obedit->data, em);
2181                 }
2182                 else if(ob && ob->mode & OB_MODE_PARTICLE_EDIT) {
2183                         uiBlockBeginAlign(block);
2184                         uiDefIconButBitI(block, TOG, SCE_SELECT_PATH, B_SEL_PATH, ICON_EDGESEL, xco,yco,XIC,YIC, &ts->particle.selectmode, 1.0, 0.0, 0, 0, "Path edit mode");
2185                         xco+= XIC;
2186                         uiDefIconButBitI(block, TOG, SCE_SELECT_POINT, B_SEL_POINT, ICON_VERTEXSEL, xco,yco,XIC,YIC, &ts->particle.selectmode, 1.0, 0.0, 0, 0, "Point select mode");
2187                         xco+= XIC;
2188                         uiDefIconButBitI(block, TOG, SCE_SELECT_END, B_SEL_END, ICON_FACESEL, xco,yco,XIC,YIC, &ts->particle.selectmode, 1.0, 0.0, 0, 0, "Tip select mode");
2189                         xco+= XIC;
2190                         uiBlockEndAlign(block);
2191                         
2192                         if(v3d->drawtype > OB_WIRE) {
2193                                 uiDefIconButBitS(block, TOG, V3D_ZBUF_SELECT, B_REDR, ICON_ORTHO, xco,yco,XIC,YIC, &v3d->flag, 1.0, 0.0, 0, 0, "Limit selection to visible (clipped with depth buffer)");
2194                                 xco+= XIC;
2195                         }
2196                         uiBlockEndAlign(block);
2197                         header_xco_step(ar, &xco, &yco, &maxco, XIC);
2198                 }
2199
2200                 uiDefIconBut(block, BUT, B_VIEWRENDER, ICON_SCENE, xco,yco,XIC,YIC, NULL, 0, 1.0, 0, 0, "Render this window (Ctrl Click for anim)");
2201                 
2202                 if (ob && (ob->mode & OB_MODE_POSE)) {
2203                         xco+= XIC*2;
2204                         uiBlockBeginAlign(block);
2205                         
2206                         uiDefIconButO(block, BUT, "POSE_OT_copy", WM_OP_INVOKE_REGION_WIN, ICON_COPYDOWN, xco,yco,XIC,YIC, NULL);
2207                         uiBlockSetButLock(block, object_data_is_libdata(ob), "Can't edit external libdata");
2208                         xco+= XIC;
2209                         
2210                         uiDefIconButO(block, BUT, "POSE_OT_paste", WM_OP_INVOKE_REGION_WIN, ICON_PASTEDOWN, xco,yco,XIC,YIC, NULL);
2211                         xco+= XIC;
2212                                 // FIXME: this needs an extra arg...
2213                         uiDefIconButO(block, BUT, "POSE_OT_paste", WM_OP_INVOKE_REGION_WIN, ICON_PASTEFLIPDOWN, xco,yco,XIC,YIC, NULL);
2214                         uiBlockEndAlign(block);
2215                         header_xco_step(ar, &xco, &yco, &maxco, XIC);
2216
2217                 }
2218         }
2219 }
2220