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