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