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