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