Bug fix #1935
[blender.git] / source / blender / src / header_view3d.c
1 /**
2  * header_view3d.c oct-2003
3  *
4  * Functions to draw the "3D Viewport" window header
5  * and handle user events sent to it.
6  * 
7  * $Id$
8  *
9  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License
13  * as published by the Free Software Foundation; either version 2
14  * of the License, or (at your option) any later version. The Blender
15  * Foundation also sells licenses for use in proprietary software under
16  * the Blender License.  See http://www.blender.org/BL/ for information
17  * about this.
18  *
19  * This program is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU General Public License
25  * along with this program; if not, write to the Free Software Foundation,
26  * Inc., 59 Temple Place - Suite 330, Boston, MA        02111-1307, USA.
27  *
28  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
29  * All rights reserved.
30  *
31  * The Original Code is: all of this file.
32  *
33  * Contributor(s): none yet.
34  *
35  * ***** END GPL/BL DUAL LICENSE BLOCK *****
36  */
37
38 #include <stdlib.h>
39 #include <string.h>
40
41 #ifdef HAVE_CONFIG_H
42 #include <config.h>
43 #endif
44
45 #ifdef WIN32
46 #include "BLI_winstuff.h"
47 #endif
48
49 #include "BMF_Api.h"
50 #include "BIF_language.h"
51 #ifdef INTERNATIONAL
52 #include "FTF_Api.h"
53 #endif
54
55 #include "MEM_guardedalloc.h"
56
57 #include "DNA_ID.h"
58 #include "DNA_mesh_types.h"
59 #include "DNA_object_types.h"
60 #include "DNA_scene_types.h"
61 #include "DNA_screen_types.h"
62 #include "DNA_space_types.h"
63 #include "DNA_view3d_types.h"
64 #include "DNA_image_types.h"
65 #include "DNA_texture_types.h"
66
67 #include "BKE_library.h"
68 #include "BKE_curve.h"
69 #include "BKE_displist.h"
70 #include "BKE_effect.h"
71 #include "BKE_global.h"
72 #include "BKE_main.h"
73 #include "BKE_mesh.h"
74 #include "BKE_image.h"
75
76 #include "BLI_blenlib.h"
77
78 #include "BSE_edit.h"
79 #include "BSE_editaction.h"
80 #include "BSE_editipo.h"
81 #include "BSE_headerbuttons.h"
82 #include "BSE_view.h"
83
84
85 #include "BDR_editcurve.h"
86 #include "BDR_editface.h"
87 #include "BDR_editmball.h"
88 #include "BDR_editobject.h"
89 #include "BDR_vpaint.h"
90
91 #include "BIF_editlattice.h"
92 #include "BIF_editarmature.h"
93 #include "BIF_editdeform.h"
94 #include "BIF_editfont.h"
95 #include "BIF_editmesh.h"
96 #include "BIF_editmode_undo.h"
97 #include "BIF_editview.h"
98 #include "BIF_interface.h"
99 #include "BIF_mainqueue.h"
100 #include "BIF_meshtools.h"
101 #include "BIF_poseobject.h"
102 #include "BIF_renderwin.h"
103 #include "BIF_resources.h"
104 #include "BIF_screen.h"
105 #include "BIF_space.h"
106 #include "BIF_toets.h"
107 #include "BIF_toolbox.h"
108 #include "BIF_gl.h"
109
110 #include "BPY_extern.h"
111 #include "BPY_menus.h"
112
113 #include "blendef.h"
114 #include "mydevice.h"
115 #include "butspace.h"
116
117 #include "BIF_poseobject.h"
118
119 #include "TPT_DependKludge.h"
120
121 /* View3d->modeselect 
122  * This is a bit of a dodgy hack to enable a 'mode' menu with icons+labels
123  * rather than those buttons.
124  * I know the implementation's not good - it's an experiment to see if this
125  * approach would work well
126  *
127  * This can be cleaned when I make some new 'mode' icons.
128  */
129
130 #define V3D_OBJECTMODE_SEL                              ICON_OBJECT
131 #define V3D_EDITMODE_SEL                                ICON_EDITMODE_HLT
132 #define V3D_FACESELECTMODE_SEL          ICON_FACESEL_HLT
133 #define V3D_VERTEXPAINTMODE_SEL         ICON_VPAINT_HLT
134 #define V3D_TEXTUREPAINTMODE_SEL        ICON_TPAINT_HLT
135 #define V3D_WEIGHTPAINTMODE_SEL         ICON_WPAINT_HLT
136 #define V3D_POSEMODE_SEL                                        ICON_POSE_HLT
137
138 #define TEST_EDITMESH   if(G.obedit==0) return; \
139                                                 if( (G.vd->lay & G.obedit->lay)==0 ) return;
140
141 static int viewmovetemp = 0;
142
143 void do_layer_buttons(short event)
144 {
145         static int oldlay= 1;
146         
147         if(G.vd==0) return;
148         if(G.vd->localview) return;
149         
150         if(event==-1 && (G.qual & LR_CTRLKEY)) {
151                 G.vd->scenelock= !G.vd->scenelock;
152                 do_view3d_buttons(B_SCENELOCK);
153         } else if (event==-1) {
154                 if(G.vd->lay== (2<<20)-1) {
155                         if(G.qual & LR_SHIFTKEY) G.vd->lay= oldlay;
156                 }
157                 else {
158                         oldlay= G.vd->lay;
159                         G.vd->lay= (2<<20)-1;
160                 }
161                 
162                 if(G.vd->scenelock) handle_view3d_lock();
163                 scrarea_queue_winredraw(curarea);
164         }
165         else {
166                 if(G.qual & LR_ALTKEY) {
167                         if(event<11) event+= 10;
168                 }
169                 if(G.qual & LR_SHIFTKEY) {
170                         if(G.vd->lay & (1<<event)) G.vd->lay -= (1<<event);
171                         else    G.vd->lay += (1<<event);
172                 }
173                 do_view3d_buttons(event+B_LAY);
174         }
175         /* redraw seems double: but the queue nicely handles that */
176         scrarea_queue_headredraw(curarea);
177         
178         if(curarea->spacetype==SPACE_OOPS) allqueue(REDRAWVIEW3D, 1); /* 1==also do headwin */
179         if(G.vd->drawtype == OB_SHADED) reshadeall_displist();  
180 }
181
182 static void do_view3d_view_cameracontrolsmenu(void *arg, int event)
183 {
184         switch(event) {
185         case 0: /* Orbit Left */
186                 persptoetsen(PAD4);
187                 break;
188         case 1: /* Orbit Right */
189                 persptoetsen(PAD6);
190                 break;
191         case 2: /* Orbit Up */
192                 persptoetsen(PAD8);
193                 break;
194         case 3: /* Orbit Down */
195                 persptoetsen(PAD2);
196                 break;
197         case 4: /* Pan left */
198                 /* ugly hack alert */
199                 G.qual |= LR_CTRLKEY;
200                 persptoetsen(PAD4);
201                 G.qual &= ~LR_CTRLKEY;
202                 break;
203         case 5: /* Pan right */
204                 /* ugly hack alert */
205                 G.qual |= LR_CTRLKEY;
206                 persptoetsen(PAD6);
207                 G.qual &= ~LR_CTRLKEY;
208                 break;
209         case 6: /* Pan up */
210                 /* ugly hack alert */
211                 G.qual |= LR_CTRLKEY;
212                 persptoetsen(PAD8);
213                 G.qual &= ~LR_CTRLKEY;
214                 break;
215         case 7: /* Pan down */
216                 /* ugly hack alert */
217                 G.qual |= LR_CTRLKEY;
218                 persptoetsen(PAD2);
219                 G.qual &= ~LR_CTRLKEY;
220                 break;
221         case 8: /* Zoom In */
222                 persptoetsen(PADPLUSKEY);
223                 break;
224         case 9: /* Zoom Out */
225                 persptoetsen(PADMINUS);
226                 break;
227         case 10: /* Reset Zoom */
228                 persptoetsen(PADENTER);
229                 break;
230         }
231         allqueue(REDRAWVIEW3D, 0);
232 }
233
234 static uiBlock *view3d_view_cameracontrolsmenu(void *arg_unused)
235 {
236 /*              static short tog=0; */
237         uiBlock *block;
238         short yco= 0, menuwidth=120;
239         
240         block= uiNewBlock(&curarea->uiblocks, "view3d_view_cameracontrolsmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
241         uiBlockSetButmFunc(block, do_view3d_view_cameracontrolsmenu, NULL);
242         
243         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Orbit Left|NumPad 4",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
244         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Orbit Right|NumPad 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
245         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Orbit Up|NumPad 8",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
246         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Orbit Down|NumPad 2",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
247         
248         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
249         
250         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pan Left|Ctrl NumPad 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
251         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pan Right|Ctrl NumPad 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
252         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pan Up|Ctrl NumPad 8",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
253         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pan Down|Ctrl NumPad 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
254         
255         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
256         
257         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom In|NumPad +", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
258         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom Out|NumPad -",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
259         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Zoom|NumPad Enter",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 10, "");
260
261         uiBlockSetDirection(block, UI_RIGHT);
262         uiTextBoundsBlock(block, 50);
263         return block;
264 }
265
266 static void do_view3d_view_alignviewmenu(void *arg, int event)
267 {
268         View3D *v3d= curarea->spacedata.first;
269         float *curs;
270         
271         switch(event) {
272
273         case 0: /* Align View to Selected (edit/faceselect mode) */
274         case 1:
275         case 2:
276                 if ((G.obedit) && (G.obedit->type == OB_MESH)) {
277                         editmesh_align_view_to_selected(v3d, event);
278                 } else if (G.f & G_FACESELECT) {
279                         Object *obact= OBACT;
280                         if (obact && obact->type==OB_MESH) {
281                                 Mesh *me= obact->data;
282
283                                 if (me->tface) {
284                                         faceselect_align_view_to_selected(v3d, me, event);
285                                         addqueue(v3d->area->win, REDRAW, 1);
286                                 }
287                         }
288                 }
289                 break;
290         case 3: /* Center View to Cursor */
291                 curs= give_cursor();
292                 G.vd->ofs[0]= -curs[0];
293                 G.vd->ofs[1]= -curs[1];
294                 G.vd->ofs[2]= -curs[2];
295                 scrarea_queue_winredraw(curarea);
296                 break;
297         case 4: /* Align Active Camera to View */
298                 /* This ugly hack is a symptom of the nasty persptoetsen function, 
299                  * but at least it works for now.
300                  */
301                 G.qual |= LR_CTRLKEY|LR_ALTKEY;
302                 persptoetsen(PAD0);
303                 G.qual &= ~(LR_CTRLKEY|LR_ALTKEY);
304                 break;
305         case 5: /* Align View to Selected (object mode) */
306                 mainqenter(PADASTERKEY, 1);
307                 break;
308         case 6: /* Center View and Cursor to Origin */
309                 view3d_home(1);
310                 curs= give_cursor();
311                 curs[0]=curs[1]=curs[2]= 0.0;
312                 break;
313         }
314         allqueue(REDRAWVIEW3D, 0);
315 }
316
317 static uiBlock *view3d_view_alignviewmenu(void *arg_unused)
318 {
319 /*              static short tog=0; */
320         uiBlock *block;
321         short yco= 0, menuwidth=120;
322         
323         block= uiNewBlock(&curarea->uiblocks, "view3d_view_alignviewmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
324         uiBlockSetButmFunc(block, do_view3d_view_alignviewmenu, NULL);
325
326         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center View to Cursor|C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
327         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center Cursor and View All|Shift C",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
328         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align Active Camera to View|Ctrl Alt NumPad 0",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");   
329
330         if (((G.obedit) && (G.obedit->type == OB_MESH)) || (G.f & G_FACESELECT)) {
331                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected (Top)|Shift V",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
332                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected (Front)|Shift V",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
333                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected (Side)|Shift V",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
334         } else {
335                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected|NumPad *",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
336         }
337         
338         uiBlockSetDirection(block, UI_RIGHT);
339         uiTextBoundsBlock(block, 50);
340         return block;
341 }
342
343 static void do_view3d_viewmenu(void *arg, int event)
344 {
345         extern int play_anim(int mode);
346         
347         switch(event) {
348         case 0: /* User */
349                 G.vd->viewbut = 0;
350                 G.vd->persp = 1;
351                 break;
352         case 1: /* Camera */
353                 persptoetsen(PAD0);
354                 break;
355         case 2: /* Top */
356                 persptoetsen(PAD7);
357                 break;
358         case 3: /* Front */
359                 persptoetsen(PAD1);
360                 break;
361         case 4: /* Side */
362                 persptoetsen(PAD3);
363                 break;
364         case 5: /* Perspective */
365                 G.vd->persp=1;
366                 break;
367         case 6: /* Orthographic */
368                 G.vd->persp=0;
369                 break;
370         case 7: /* Local View */
371                 G.vd->localview= 1;
372                 initlocalview();
373                 break;
374         case 8: /* Global View */
375                 G.vd->localview= 0;
376                 endlocalview(curarea);
377                 break;
378         case 9: /* View All (Home) */
379                 view3d_home(0);
380                 break;
381         case 11: /* View Selected */
382                 centreview();
383                 break;
384         case 13: /* Play Back Animation */
385                 play_anim(0);
386                 break;
387         case 15: /* Background Image... */
388                 add_blockhandler(curarea, VIEW3D_HANDLER_BACKGROUND, UI_PNL_UNSTOW);
389                 break;
390         case 16: /* View  Panel */
391                 add_blockhandler(curarea, VIEW3D_HANDLER_PROPERTIES, UI_PNL_UNSTOW);
392                 break;
393         }
394         allqueue(REDRAWVIEW3D, 1);
395 }
396
397 static uiBlock *view3d_viewmenu(void *arg_unused)
398 {
399 /*              static short tog=0; */
400         uiBlock *block;
401         short yco= 0, menuwidth=120;
402         
403         block= uiNewBlock(&curarea->uiblocks, "view3d_viewmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
404         uiBlockSetButmFunc(block, do_view3d_viewmenu, NULL);
405         
406         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "View Properties...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 16, "");
407         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Background Image...",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 15, "");
408         
409         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
410         
411         if ((G.vd->viewbut == 0) && !(G.vd->persp == 2)) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "User",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
412         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "User",                                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
413         if (G.vd->persp == 2) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Camera|NumPad 0",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
414         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Camera|NumPad 0",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
415         if (G.vd->viewbut == 1) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Top|NumPad 7",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
416         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Top|NumPad 7",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
417         if (G.vd->viewbut == 2) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Front|NumPad 1",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
418         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Front|NumPad 1",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
419         if (G.vd->viewbut == 3) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Side|NumPad 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
420         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Side|NumPad 3",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
421         
422         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
423         
424         if(G.vd->persp==1) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Perspective|NumPad 5",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
425         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Perspective|NumPad 5",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
426         if(G.vd->persp==0) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Orthographic|NumPad 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
427         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Orthographic|NumPad 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
428         
429         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
430         
431         if(G.vd->localview) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Local View|NumPad /",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
432         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Local View|NumPad /", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
433         if(!G.vd->localview) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Global View|NumPad /",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
434         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Global View|NumPad /",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
435         
436         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
437         
438         uiDefIconTextBlockBut(block, view3d_view_cameracontrolsmenu, NULL, ICON_RIGHTARROW_THIN, "View Navigation", 0, yco-=20, 120, 19, "");
439         uiDefIconTextBlockBut(block, view3d_view_alignviewmenu, NULL, ICON_RIGHTARROW_THIN, "Align View", 0, yco-=20, 120, 19, "");
440         
441         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
442         
443         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View Selected|NumPad .",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
444         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View All|Home",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
445         if(!curarea->full) uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Maximize Window|Ctrl UpArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 99, "");
446         else uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Tile Window|Ctrl DownArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 99, "");
447
448         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
449         
450         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Animation|Alt A",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 13, "");
451
452         if(curarea->headertype==HEADERTOP) {
453                 uiBlockSetDirection(block, UI_DOWN);
454         }
455         else {
456                 uiBlockSetDirection(block, UI_TOP);
457                 uiBlockFlipOrder(block);
458         }
459
460         uiTextBoundsBlock(block, 50);
461         
462         return block;
463 }
464
465 void do_view3d_select_object_typemenu(void *arg, int event)
466 {
467
468         extern void selectall_type(short obtype);
469         
470         switch(event) {
471         case 1: /* Mesh */
472                 selectall_type(OB_MESH);
473                 break;
474         case 2: /* Curve */
475                 selectall_type(OB_CURVE);
476                 break;
477         case 3: /* Surface */
478                 selectall_type(OB_SURF);
479                 break;
480         case 4: /* Meta */
481                 selectall_type(OB_MBALL);
482                 break;
483         case 5: /* Armature */
484                 selectall_type(OB_ARMATURE);
485                 break;
486         case 6: /* Lattice */
487                 selectall_type(OB_LATTICE);
488                 break;
489         case 7: /* Text */
490                 selectall_type(OB_FONT);
491                 break;
492         case 8: /* Empty */
493                 selectall_type(OB_EMPTY);
494                 break;
495         case 9: /* Camera */
496                 selectall_type(OB_CAMERA);
497                 break;
498         case 10: /* Lamp */
499                 selectall_type(OB_LAMP);
500                 break;
501         }
502         allqueue(REDRAWVIEW3D, 0);
503 }
504
505 static uiBlock *view3d_select_object_typemenu(void *arg_unused)
506 {
507         uiBlock *block;
508         short yco = 20, menuwidth = 120;
509
510         block= uiNewBlock(&curarea->uiblocks, "view3d_select_object_typemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
511         uiBlockSetButmFunc(block, do_view3d_select_object_typemenu, NULL);
512
513         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mesh",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
514         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
515         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Surface",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
516         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
517         
518         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
519         
520         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Armature",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
521         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lattice",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
522         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Text",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
523         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Empty",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
524         
525         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
526         
527         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
528         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lamp",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
529         
530         uiBlockSetDirection(block, UI_RIGHT);
531         uiTextBoundsBlock(block, 60);
532         return block;
533 }
534
535 void do_view3d_select_object_layermenu(void *arg, int event)
536 {
537         extern void selectall_layer(int layernum);
538         
539         switch(event) {
540         case 0:
541         case 1:
542         case 2:
543         case 3:
544         case 4:
545         case 5:
546         case 6:
547         case 7:
548         case 8:
549         case 9:
550         case 10:
551         case 11:
552         case 12:
553         case 13:
554         case 14:
555         case 15:
556         case 16:
557         case 17:
558         case 18:
559         case 19:
560         case 20:
561                 selectall_layer(event);
562                 break;
563         }
564         allqueue(REDRAWVIEW3D, 0);
565 }
566
567 static uiBlock *view3d_select_object_layermenu(void *arg_unused)
568 {
569         uiBlock *block;
570         short xco= 0, yco = 20, menuwidth = 22;
571
572         block= uiNewBlock(&curarea->uiblocks, "view3d_select_object_layermenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
573         uiBlockSetButmFunc(block, do_view3d_select_object_layermenu, NULL);
574
575         uiDefBut(block, BUTM, 1, "1",           xco, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
576         uiDefBut(block, BUTM, 1, "2",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
577         uiDefBut(block, BUTM, 1, "3",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
578         uiDefBut(block, BUTM, 1, "4",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
579         uiDefBut(block, BUTM, 1, "5",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
580         xco += 6;
581         uiDefBut(block, BUTM, 1, "6",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
582         uiDefBut(block, BUTM, 1, "7",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
583         uiDefBut(block, BUTM, 1, "8",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
584         uiDefBut(block, BUTM, 1, "9",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
585         uiDefBut(block, BUTM, 1, "10",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
586         xco = 0;
587         uiDefBut(block, BUTM, 1, "11",          xco, yco-=24, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
588         uiDefBut(block, BUTM, 1, "12",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
589         uiDefBut(block, BUTM, 1, "13",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
590         uiDefBut(block, BUTM, 1, "14",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
591         uiDefBut(block, BUTM, 1, "15",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
592         xco += 6;
593         uiDefBut(block, BUTM, 1, "16",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
594         uiDefBut(block, BUTM, 1, "17",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
595         uiDefBut(block, BUTM, 1, "18",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
596         uiDefBut(block, BUTM, 1, "19",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
597         uiDefBut(block, BUTM, 1, "20",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
598         
599         uiBlockSetDirection(block, UI_RIGHT);
600         //uiTextBoundsBlock(block, 100);
601         return block;
602 }
603
604 void do_view3d_select_object_linkedmenu(void *arg, int event)
605 {
606         switch(event) {
607         case 1: /* Object Ipo */
608         case 2: /* ObData */
609         case 3: /* Current Material */
610         case 4: /* Current Texture */
611                 selectlinks(event);
612                 break;
613         }
614         allqueue(REDRAWVIEW3D, 0);
615 }
616
617 static uiBlock *view3d_select_object_linkedmenu(void *arg_unused)
618 {
619         uiBlock *block;
620         short yco = 20, menuwidth = 120;
621
622         block= uiNewBlock(&curarea->uiblocks, "view3d_select_object_linkedmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
623         uiBlockSetButmFunc(block, do_view3d_select_object_linkedmenu, NULL);
624
625         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Ipo|Shift L, 1",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
626         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "ObData|Shift L, 2",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
627         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Material|Shift L, 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
628         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Texture|Shift L, 4",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
629         
630         uiBlockSetDirection(block, UI_RIGHT);
631         uiTextBoundsBlock(block, 60);
632         return block;
633 }
634
635 void do_view3d_select_object_groupedmenu(void *arg, int event)
636 {
637         switch(event) {
638         case 1: /* Children */
639         case 2: /* Immediate Children */
640         case 3: /* Parent */
641         case 4: /* Objects on Shared Layers */
642                 select_group((short)event);
643                 break;
644         }
645         allqueue(REDRAWVIEW3D, 0);
646 }
647
648 static uiBlock *view3d_select_object_groupedmenu(void *arg_unused)
649 {
650         uiBlock *block;
651         short yco = 20, menuwidth = 120;
652
653         block= uiNewBlock(&curarea->uiblocks, "view3d_select_object_groupedmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
654         uiBlockSetButmFunc(block, do_view3d_select_object_groupedmenu, NULL);
655
656         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Children|Shift G, 1",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
657         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Immediate Children|Shift G, 2",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
658         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Parent|Shift G, 3",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
659         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Objects on Shared Layers|Shift G, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
660         
661         uiBlockSetDirection(block, UI_RIGHT);
662         uiTextBoundsBlock(block, 60);
663         return block;
664 }
665
666 static void do_view3d_select_objectmenu(void *arg, int event)
667 {
668         switch(event) {
669         
670         case 0: /* border select */
671                 borderselect();
672                 break;
673         case 1: /* Select/Deselect All */
674                 deselectall();
675                 break;
676         }
677         allqueue(REDRAWVIEW3D, 0);
678 }
679
680 static uiBlock *view3d_select_objectmenu(void *arg_unused)
681 {
682         uiBlock *block;
683         short yco= 0, menuwidth=120;
684         
685         block= uiNewBlock(&curarea->uiblocks, "view3d_select_objectmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
686         uiBlockSetButmFunc(block, do_view3d_select_objectmenu, NULL);
687         
688         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
689         
690         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
691         
692         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
693         uiDefIconTextBlockBut(block, view3d_select_object_layermenu, NULL, ICON_RIGHTARROW_THIN, "Select All by Layer", 0, yco-=20, 120, 19, "");
694         uiDefIconTextBlockBut(block, view3d_select_object_typemenu, NULL, ICON_RIGHTARROW_THIN, "Select All by Type", 0, yco-=20, 120, 19, "");
695                 
696         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
697         
698         uiDefIconTextBlockBut(block, view3d_select_object_linkedmenu, NULL, ICON_RIGHTARROW_THIN, "Linked", 0, yco-=20, 120, 19, "");
699         uiDefIconTextBlockBut(block, view3d_select_object_groupedmenu, NULL, ICON_RIGHTARROW_THIN, "Grouped", 0, yco-=20, 120, 19, "");
700
701         if(curarea->headertype==HEADERTOP) {
702                 uiBlockSetDirection(block, UI_DOWN);
703         }
704         else {
705                 uiBlockSetDirection(block, UI_TOP);
706                 uiBlockFlipOrder(block);
707         }
708         
709         uiTextBoundsBlock(block, 50);
710         return block;
711 }
712
713 void do_view3d_select_meshmenu(void *arg, int event)
714 {
715 //      extern void borderselect(void);
716
717         switch(event) {
718         
719                 case 0: /* border select */
720                         borderselect();
721                         break;
722                 case 2: /* Select/Deselect all */
723                         deselectall_mesh();
724                         break;
725                 case 3: /* Inverse */
726                         selectswap_mesh();
727                         break;
728                 case 4: /* select linked vertices */
729                         selectconnected_mesh(LR_CTRLKEY);
730                         break;
731                 case 5: /* select random */
732                         selectrandom_mesh();
733                         break;
734                 case 6: /* select Faceloop */
735                         loopoperations(LOOP_SELECT);
736                         break;
737                 case 7: /* select more */
738                         select_more();
739                         break;
740                 case 8: /* select less */
741                         select_less();
742                         break;
743                 case 9: /* select less */
744                         select_non_manifold();
745                         break;
746                 case 10: /* select vertexloop */
747                         vertex_loop_select();
748                         break;
749         }
750         allqueue(REDRAWVIEW3D, 0);
751 }
752
753
754 static uiBlock *view3d_select_meshmenu(void *arg_unused)
755 {
756         uiBlock *block;
757         short yco= 0, menuwidth=120;
758         
759         block= uiNewBlock(&curarea->uiblocks, "view3d_select_meshmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
760         uiBlockSetButmFunc(block, do_view3d_select_meshmenu, NULL);
761         
762         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
763         
764         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
765         
766         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
767         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
768         
769         uiDefBut(block, SEPR, 0, "", 0, yco-=6, 
770                          menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
771         
772         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Random...",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
773         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, 
774                                          "Non-Manifold|Ctrl Alt Shift M", 
775                                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
776         
777         uiDefBut(block, SEPR, 0, "", 0, yco-=6, 
778                          menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
779
780         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "More|Ctrl NumPad +",
781                                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
782         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Less|Ctrl NumPad -",
783                                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
784
785         uiDefBut(block, SEPR, 0, "", 0, yco-=6, 
786                          menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
787
788         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Face Loop...|Shift R",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
789         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Vertex Loop|Alt B",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
790         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Linked Vertices|Ctrl L",                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
791                 
792         if(curarea->headertype==HEADERTOP) {
793                 uiBlockSetDirection(block, UI_DOWN);
794         }
795         else {
796                 uiBlockSetDirection(block, UI_TOP);
797                 uiBlockFlipOrder(block);
798         }
799
800         uiTextBoundsBlock(block, 50);
801         return block;
802 }
803
804 void do_view3d_select_curvemenu(void *arg, int event)
805 {
806 //      extern void borderselect(void);
807
808         switch(event) {
809                 case 0: /* border select */
810                         borderselect();
811                         break;
812                 case 2: /* Select/Deselect all */
813                         deselectall_nurb();
814                         break;
815                 case 3: /* Inverse */
816                         selectswapNurb();
817                         break;
818                 //case 4: /* select connected control points */
819                         //G.qual |= LR_CTRLKEY;
820                         //selectconnected_nurb();
821                         //G.qual &= ~LR_CTRLKEY;
822                         //break;
823                 case 5: /* select row (nurb) */
824                         selectrow_nurb();
825                         break;
826         }
827         allqueue(REDRAWVIEW3D, 0);
828 }
829
830
831 static uiBlock *view3d_select_curvemenu(void *arg_unused)
832 {
833         uiBlock *block;
834         short yco= 0, menuwidth=120;
835         
836         block= uiNewBlock(&curarea->uiblocks, "view3d_select_curvemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
837         uiBlockSetButmFunc(block, do_view3d_select_curvemenu, NULL);
838         
839         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
840         
841         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
842         
843         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
844         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
845         
846         if (OBACT->type == OB_SURF) {
847                 uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
848                 
849                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Control Point Row|Shift R",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
850         }
851         /* commented out because it seems to only like the LKEY method - based on mouse pointer position :( */
852         //uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Connected Control Points|Ctrl L",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
853                 
854         if(curarea->headertype==HEADERTOP) {
855                 uiBlockSetDirection(block, UI_DOWN);
856         }
857         else {
858                 uiBlockSetDirection(block, UI_TOP);
859                 uiBlockFlipOrder(block);
860         }
861         
862         uiTextBoundsBlock(block, 50);
863         return block;
864 }
865
866 static void do_view3d_select_metaballmenu(void *arg, int event)
867 {
868
869         switch(event) {
870                 case 0: /* border select */
871                         borderselect();
872                         break;
873                 case 2: /* Select/Deselect all */
874                         deselectall_mball();
875                         break;
876         }
877         allqueue(REDRAWVIEW3D, 0);
878 }
879
880
881 static uiBlock *view3d_select_metaballmenu(void *arg_unused)
882 {
883         uiBlock *block;
884         short yco= 0, menuwidth=120;
885         
886         block= uiNewBlock(&curarea->uiblocks, "view3d_select_metaballmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
887         uiBlockSetButmFunc(block, do_view3d_select_metaballmenu, NULL);
888         
889         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
890         
891         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
892         
893         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
894                 
895         if(curarea->headertype==HEADERTOP) {
896                 uiBlockSetDirection(block, UI_DOWN);
897         }
898         else {
899                 uiBlockSetDirection(block, UI_TOP);
900                 uiBlockFlipOrder(block);
901         }
902
903         uiTextBoundsBlock(block, 50);
904         return block;
905 }
906
907 static void do_view3d_select_latticemenu(void *arg, int event)
908 {
909 //      extern void borderselect(void);
910         
911         switch(event) {
912                         case 0: /* border select */
913                         borderselect();
914                         break;
915                 case 2: /* Select/Deselect all */
916                         deselectall_Latt();
917                         break;
918         }
919         allqueue(REDRAWVIEW3D, 0);
920 }
921
922 static uiBlock *view3d_select_latticemenu(void *arg_unused)
923 {
924         uiBlock *block;
925         short yco= 0, menuwidth=120;
926         
927         block= uiNewBlock(&curarea->uiblocks, "view3d_select_latticemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
928         uiBlockSetButmFunc(block, do_view3d_select_latticemenu, NULL);
929         
930         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
931         
932         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
933         
934         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
935
936         if(curarea->headertype==HEADERTOP) {
937                 uiBlockSetDirection(block, UI_DOWN);
938         }
939         else {
940                 uiBlockSetDirection(block, UI_TOP);
941                 uiBlockFlipOrder(block);
942         }
943
944         uiTextBoundsBlock(block, 50);
945         return block;
946 }
947
948 static void do_view3d_select_armaturemenu(void *arg, int event)
949 {
950 //      extern void borderselect(void);
951
952         switch(event) {
953                         case 0: /* border select */
954                         borderselect();
955                         break;
956                 case 2: /* Select/Deselect all */
957                         deselectall_armature();
958                         break;
959         }
960         allqueue(REDRAWVIEW3D, 0);
961 }
962
963 static uiBlock *view3d_select_armaturemenu(void *arg_unused)
964 {
965         uiBlock *block;
966         short yco= 0, menuwidth=120;
967         
968         block= uiNewBlock(&curarea->uiblocks, "view3d_select_armaturemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
969         uiBlockSetButmFunc(block, do_view3d_select_armaturemenu, NULL);
970         
971         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
972         
973         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
974         
975         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
976
977         if(curarea->headertype==HEADERTOP) {
978                 uiBlockSetDirection(block, UI_DOWN);
979         }
980         else {
981                 uiBlockSetDirection(block, UI_TOP);
982                 uiBlockFlipOrder(block);
983         }
984
985         uiTextBoundsBlock(block, 50);
986         return block;
987 }
988
989 static void do_view3d_select_pose_armaturemenu(void *arg, int event)
990 {
991 //      extern void borderselect(void);
992         
993         switch(event) {
994                         case 0: /* border select */
995                         borderselect();
996                         break;
997                 case 2: /* Select/Deselect all */
998                         deselectall_posearmature(1);
999                         break;
1000         }
1001         allqueue(REDRAWVIEW3D, 0);
1002 }
1003
1004 static uiBlock *view3d_select_pose_armaturemenu(void *arg_unused)
1005 {
1006         uiBlock *block;
1007         short yco= 0, menuwidth=120;
1008         
1009         block= uiNewBlock(&curarea->uiblocks, "view3d_select_pose_armaturemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1010         uiBlockSetButmFunc(block, do_view3d_select_pose_armaturemenu, NULL);
1011         
1012         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1013         
1014         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1015         
1016         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1017
1018         if(curarea->headertype==HEADERTOP) {
1019                 uiBlockSetDirection(block, UI_DOWN);
1020         }
1021         else {
1022                 uiBlockSetDirection(block, UI_TOP);
1023                 uiBlockFlipOrder(block);
1024         }
1025
1026         uiTextBoundsBlock(block, 50);
1027         return block;
1028 }
1029
1030 static void do_view3d_select_faceselmenu(void *arg, int event)
1031 {
1032 //      extern void borderselect(void);
1033         
1034         switch(event) {
1035                         case 0: /* border select */
1036                         borderselect();
1037                         break;
1038                 case 2: /* Select/Deselect all */
1039                         deselectall_tface();
1040                         break;
1041                 case 3: /* Select Inverse */
1042                         selectswap_tface();
1043                         break;
1044                 case 4: /* Select Same UV */
1045                         get_same_uv();
1046                         break;
1047         }
1048         allqueue(REDRAWVIEW3D, 0);
1049 }
1050
1051 static uiBlock *view3d_select_faceselmenu(void *arg_unused)
1052 {
1053         uiBlock *block;
1054         short yco= 0, menuwidth=120;
1055         
1056         block= uiNewBlock(&curarea->uiblocks, "view3d_select_faceselmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1057         uiBlockSetButmFunc(block, do_view3d_select_faceselmenu, NULL);
1058         
1059         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1060         
1061         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1062         
1063         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1064         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1065         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Same UV",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1066
1067         if(curarea->headertype==HEADERTOP) {
1068                 uiBlockSetDirection(block, UI_DOWN);
1069         }
1070         else {
1071                 uiBlockSetDirection(block, UI_TOP);
1072                 uiBlockFlipOrder(block);
1073         }
1074
1075         uiTextBoundsBlock(block, 50);
1076         return block;
1077 }
1078
1079 void do_view3d_edit_snapmenu(void *arg, int event)
1080 {
1081         switch(event) {
1082         case 1: /* Selection to grid */
1083             snap_sel_to_grid();
1084             break;
1085         case 2: /* Selection to cursor */
1086             snap_sel_to_curs();
1087             break;          
1088         case 3: /* Cursor to grid */
1089             snap_curs_to_grid();
1090             break;
1091         case 4: /* Cursor to selection */
1092             snap_curs_to_sel();
1093             break;
1094         case 5: /* Selection to center of selection*/
1095             snap_to_center();
1096             break;
1097         }
1098         allqueue(REDRAWVIEW3D, 0);
1099 }
1100
1101 static uiBlock *view3d_edit_snapmenu(void *arg_unused)
1102 {
1103         uiBlock *block;
1104         short yco = 20, menuwidth = 120;
1105
1106         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_snapmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1107         uiBlockSetButmFunc(block, do_view3d_edit_snapmenu, NULL);
1108         
1109         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selection -> Grid|Shift S, 1",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1110         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selection -> Cursor|Shift S, 2",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1111         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cursor -> Grid|Shift S, 3",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1112         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cursor -> Selection|Shift S, 4",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1113         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selection -> Center|Shift S, 5",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1114         
1115         
1116         uiBlockSetDirection(block, UI_RIGHT);
1117         uiTextBoundsBlock(block, 60);
1118         return block;
1119 }
1120
1121 void do_view3d_transform_moveaxismenu(void *arg, int event)
1122 {
1123         switch(event)
1124         {
1125             case 0: /* X Global */
1126                     transform('g'*'X');
1127                         break;
1128                 case 1: /* Y Global */
1129                         transform('g'*'Y');
1130                         break;
1131                 case 2: /* Z Global */
1132                         transform('g'*'Z');
1133                         break;
1134                 case 3: /* X Local */
1135                         transform('g'*'x');
1136                         break;
1137                 case 4: /* Y Local */
1138                         transform('g'*'y');
1139                         break;
1140                 case 5: /* Z Local */
1141                         transform('g'*'z');
1142                         break;
1143         }
1144         allqueue(REDRAWVIEW3D, 0);
1145 }
1146
1147 static uiBlock *view3d_transform_moveaxismenu(void *arg_unused)
1148 {
1149         uiBlock *block;
1150         short yco = 20, menuwidth = 120;
1151
1152         block= uiNewBlock(&curarea->uiblocks, "view3d_transform_moveaxismenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1153         uiBlockSetButmFunc(block, do_view3d_transform_moveaxismenu, NULL);
1154
1155         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|G, X",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1156         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|G, Y",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1157         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|G, Z",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1158         
1159         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1160         
1161         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|G, X, X",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1162         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|G, Y, Y",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1163         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|G, Z, Z",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1164         
1165         
1166         uiBlockSetDirection(block, UI_RIGHT);
1167         uiTextBoundsBlock(block, 60);
1168         return block;
1169 }
1170
1171 void do_view3d_transform_rotateaxismenu(void *arg, int event)
1172 {
1173         switch(event)
1174         {
1175             case 0: /* X Global */
1176                     transform('r'*'X');
1177                         break;
1178                 case 1: /* Y Global */
1179                         transform('r'*'Y');
1180                         break;
1181                 case 2: /* Z Global */
1182                         transform('r'*'Z');
1183                         break;
1184                 case 3: /* X Local */
1185                         transform('r'*'x');
1186                         break;
1187                 case 4: /* Y Local */
1188                         transform('r'*'y');
1189                         break;
1190                 case 5: /* Z Local */
1191                         transform('r'*'z');
1192                         break;
1193         }
1194         allqueue(REDRAWVIEW3D, 0);
1195 }
1196
1197 static uiBlock *view3d_transform_rotateaxismenu(void *arg_unused)
1198 {
1199         uiBlock *block;
1200         short yco = 20, menuwidth = 120;
1201
1202         block= uiNewBlock(&curarea->uiblocks, "view3d_transform_rotateaxismenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1203         uiBlockSetButmFunc(block, do_view3d_transform_rotateaxismenu, NULL);
1204
1205         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|R, X",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1206         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|R, Y",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1207         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|R, Z",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1208         
1209         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1210         
1211         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|R, X, X",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1212         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|R, Y, Y",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1213         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|R, Z, Z",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1214         
1215         
1216         uiBlockSetDirection(block, UI_RIGHT);
1217         uiTextBoundsBlock(block, 60);
1218         return block;
1219 }
1220
1221 void do_view3d_transform_scaleaxismenu(void *arg, int event)
1222 {
1223         switch(event)
1224         {
1225             case 0: /* X Global */
1226                     transform('s'*'X');
1227                         break;
1228                 case 1: /* Y Global */
1229                         transform('s'*'Y');
1230                         break;
1231                 case 2: /* Z Global */
1232                         transform('s'*'Z');
1233                         break;
1234                 case 3: /* X Local */
1235                         transform('s'*'x');
1236                         break;
1237                 case 4: /* Y Local */
1238                         transform('s'*'y');
1239                         break;
1240                 case 5: /* Z Local */
1241                         transform('s'*'z');
1242                         break;
1243         }
1244         allqueue(REDRAWVIEW3D, 0);
1245 }
1246
1247 static uiBlock *view3d_transform_scaleaxismenu(void *arg_unused)
1248 {
1249         uiBlock *block;
1250         short yco = 20, menuwidth = 120;
1251
1252         block= uiNewBlock(&curarea->uiblocks, "view3d_transform_scaleaxismenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1253         uiBlockSetButmFunc(block, do_view3d_transform_scaleaxismenu, NULL);
1254
1255         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|S, X",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1256         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|S, Y",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1257         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|S, Z",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1258         
1259         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1260         
1261         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|S, X, X",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1262         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|S, Y, Y",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1263         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|S, Z, Z",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1264         
1265         
1266         uiBlockSetDirection(block, UI_RIGHT);
1267         uiTextBoundsBlock(block, 60);
1268         return block;
1269 }
1270
1271 void do_view3d_transformmenu(void *arg, int event)
1272 {
1273         switch(event) {
1274         case 1:
1275                 transform('g');
1276                 break;
1277         case 2:
1278                 transform('r');
1279                 break;
1280         case 3:
1281                 transform('s');
1282                 break;
1283         }
1284         allqueue(REDRAWVIEW3D, 0);
1285 }
1286
1287 static uiBlock *view3d_transformmenu(void *arg_unused)
1288 {
1289         uiBlock *block;
1290         short yco = 20, menuwidth = 120;
1291
1292         block= uiNewBlock(&curarea->uiblocks, "view3d_transformmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1293         uiBlockSetButmFunc(block, do_view3d_transformmenu, NULL);
1294
1295         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move|G",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1296         uiDefIconTextBlockBut(block, view3d_transform_moveaxismenu, NULL, ICON_RIGHTARROW_THIN, "Grab/Move on Axis", 0, yco-=20, 120, 19, "");
1297                 
1298         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate|R",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1299         uiDefIconTextBlockBut(block, view3d_transform_rotateaxismenu, NULL, ICON_RIGHTARROW_THIN, "Rotate on Axis", 0, yco-=20, 120, 19, "");
1300
1301         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale|S",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1302         uiDefIconTextBlockBut(block, view3d_transform_scaleaxismenu, NULL, ICON_RIGHTARROW_THIN, "Scale on Axis", 0, yco-=20, 120, 19, "");
1303
1304         uiBlockSetDirection(block, UI_RIGHT);
1305         uiTextBoundsBlock(block, 60);
1306         return block;
1307 }
1308
1309 void do_view3d_object_mirrormenu(void *arg, int event)
1310 {
1311         switch(event) {
1312                 case 1:
1313                 case 2:
1314                 case 3:
1315                         mirror_object(event);
1316                         break;
1317         }
1318         allqueue(REDRAWVIEW3D, 0);
1319 }
1320
1321 static uiBlock *view3d_object_mirrormenu(void *arg_unused)
1322 {
1323         uiBlock *block;
1324         short yco = 20, menuwidth = 120;
1325
1326         block= uiNewBlock(&curarea->uiblocks, "view3d_object_mirrormenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1327         uiBlockSetButmFunc(block, do_view3d_object_mirrormenu, NULL);
1328         
1329         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|Ctrl M, 1",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1330         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, 2",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1331         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, 3",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1332
1333         uiBlockSetDirection(block, UI_RIGHT);
1334         uiTextBoundsBlock(block, 60);
1335         return block;
1336 }
1337
1338 static void do_view3d_edit_object_transformmenu(void *arg, int event)
1339 {
1340         switch(event) {
1341         case 0: /*      clear origin */
1342                 clear_object('o');
1343                 break;
1344         case 1: /* clear size */
1345                 clear_object('s');
1346                 break;
1347         case 2: /* clear rotation */
1348                 clear_object('r');
1349                 break;
1350         case 3: /* clear location */
1351                 clear_object('g');
1352                 break;
1353         case 4:
1354                 object_apply_deform(OBACT);
1355                 break;
1356         case 5: /* make duplis real */
1357                 make_duplilist_real();
1358                 break;
1359         case 6: /* apply size/rotation or deformation */
1360                 apply_object();
1361                 break;  
1362         }
1363         allqueue(REDRAWVIEW3D, 0);
1364 }
1365
1366 static uiBlock *view3d_edit_object_transformmenu(void *arg_unused)
1367 {
1368         uiBlock *block;
1369         short yco = 20, menuwidth = 120;
1370
1371         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_transformmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1372         uiBlockSetButmFunc(block, do_view3d_edit_object_transformmenu, NULL);
1373         
1374         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Size/Rotation|Ctrl A",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1375         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Deformation|Ctrl Shift A",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1376         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Duplicates Real|Ctrl Shift A",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1377         
1378         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1379         
1380         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Location|Alt G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1381         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Rotation|Alt R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1382         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Size|Alt S",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1383         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Origin|Alt O",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1384         
1385         uiBlockSetDirection(block, UI_RIGHT);
1386         uiTextBoundsBlock(block, 60);
1387         return block;
1388 }
1389
1390 static void do_view3d_edit_object_makelinksmenu(void *arg, int event)
1391 {
1392         switch(event) {
1393         case 1:
1394         case 2:
1395         case 3:
1396         case 4:
1397                 make_links((short)event);
1398                 break;
1399                 }
1400         allqueue(REDRAWVIEW3D, 0);
1401 }
1402
1403 static uiBlock *view3d_edit_object_makelinksmenu(void *arg_unused)
1404 {
1405         Object *ob=NULL;
1406         
1407         uiBlock *block;
1408         short yco = 20, menuwidth = 120;
1409
1410         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_makelinksmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1411         uiBlockSetButmFunc(block, do_view3d_edit_object_makelinksmenu, NULL);
1412         
1413         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "To Scene...|Ctrl L, 1",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1414         
1415         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1416         
1417         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Ipo|Ctrl L, 2",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1418         
1419         if ((ob=OBACT)) {
1420         
1421                 if(ob->type==OB_MESH) {
1422                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mesh Data|Ctrl L, 3",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1423                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1424                 } else if(ob->type==OB_CURVE) {
1425                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve Data|Ctrl L, 3",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1426                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1427                 } else if(ob->type==OB_FONT) {
1428                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Text Data|Ctrl L, 3",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1429                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1430                 } else if(ob->type==OB_SURF) {
1431                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Surface Data|Ctrl L, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1432                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1433                 } else if(ob->type==OB_MBALL) {
1434                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1435                 } else if(ob->type==OB_CAMERA) {
1436                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera Data|Ctrl L, 3",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1437                 } else if(ob->type==OB_LAMP) {
1438                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lamp Data|Ctrl L, 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1439                 } else if(ob->type==OB_LATTICE) {
1440                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lattice Data|Ctrl L, 3",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1441                 } else if(ob->type==OB_ARMATURE) {
1442                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Armature Data|Ctrl L, 3",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1443                 }
1444         }
1445         
1446         uiBlockSetDirection(block, UI_RIGHT);
1447         uiTextBoundsBlock(block, 60);
1448         return block;
1449 }
1450
1451 static void do_view3d_edit_object_singleusermenu(void *arg, int event)
1452 {
1453         switch(event) {
1454         case 1: /* Object */
1455                 single_object_users(1);
1456                 break;
1457         case 2: /* Object & ObData */ 
1458                 single_object_users(1);
1459                 single_obdata_users(1);
1460                 break;
1461         case 3: /* Object & ObData & Materials+Tex */
1462                 single_object_users(1);
1463                 single_obdata_users(1);
1464                 single_mat_users(1); /* also tex */
1465                 break;
1466         case 4: /* Materials+Tex */
1467                 single_mat_users(1);
1468                 break;
1469         }
1470         
1471         clear_id_newpoins();
1472         countall();
1473         
1474         allqueue(REDRAWALL, 0);
1475 }
1476
1477 static uiBlock *view3d_edit_object_singleusermenu(void *arg_unused)
1478 {
1479
1480         uiBlock *block;
1481         short yco = 20, menuwidth = 120;
1482
1483         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_singleusermenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1484         uiBlockSetButmFunc(block, do_view3d_edit_object_singleusermenu, NULL);
1485         
1486         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object|U, 1",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1487         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object & ObData|U, 2",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1488         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object & ObData & Materials+Tex|U, 3",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1489         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials+Tex|U, 4",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1490         
1491         uiBlockSetDirection(block, UI_RIGHT);
1492         uiTextBoundsBlock(block, 60);
1493         return block;
1494 }
1495
1496 static void do_view3d_edit_object_copyattrmenu(void *arg, int event)
1497 {
1498         switch(event) {
1499         case 1:
1500         case 2:
1501         case 3:
1502         case 4:
1503         case 5:
1504         case 6:
1505         case 7:
1506         case 8:
1507         case 9:
1508         case 10:
1509         case 11:
1510         case 17:
1511         case 18:
1512         case 19:
1513         case 20:
1514         case 21:
1515         case 22:
1516                 copy_attr((short)event);
1517                 break;
1518                 }
1519         allqueue(REDRAWVIEW3D, 0);
1520 }
1521
1522 static uiBlock *view3d_edit_object_copyattrmenu(void *arg_unused)
1523 {
1524         Object *ob=NULL;
1525         
1526         uiBlock *block;
1527         short yco = 20, menuwidth = 120;
1528
1529         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_copyattrmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1530         uiBlockSetButmFunc(block, do_view3d_edit_object_copyattrmenu, NULL);
1531         
1532         ob= OBACT;
1533         
1534         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Location|Ctrl C, 1",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1535         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotation|Ctrl C, 2",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1536         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Size|Ctrl C, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1537         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Drawtype|Ctrl C, 4",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1538         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Time Offset|Ctrl C, 5",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1539         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Dupli|Ctrl C, 6",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1540         
1541         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1542         
1543         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mass|Ctrl C, 7",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1544         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Damping|Ctrl C, 8",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
1545         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Properties|Ctrl C, 9",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
1546         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Logic Bricks|Ctrl C, 10",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
1547         
1548         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1549         
1550         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Constraints|Ctrl C, 11",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
1551         
1552         if (ob) {
1553         
1554                 if ((ob->type == OB_MESH) || (ob->type == OB_CURVE) || (ob->type == OB_SURF) ||
1555                                 (ob->type == OB_FONT) || (ob->type == OB_MBALL)) {
1556                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Texture Space|Ctrl C, 12",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
1557                 }       
1558                 
1559                 if(ob->type == OB_FONT) {
1560                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Font Settings|Ctrl C, 13",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
1561                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel Settings|Ctrl C, 14",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1562                 }
1563                 if(ob->type == OB_CURVE) {
1564                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel Settings|Ctrl C, 13",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1565                 }
1566         
1567                 if(ob->type==OB_MESH) {
1568                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdiv|Ctrl C, 13",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 21, "");
1569                 }
1570         
1571                 if( give_parteff(ob) ) {
1572                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Particle Settings|Ctrl C, 14",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
1573                 }
1574         }
1575         
1576         uiBlockSetDirection(block, UI_RIGHT);
1577         uiTextBoundsBlock(block, 60);
1578         return block;
1579 }
1580
1581
1582 static void do_view3d_edit_object_parentmenu(void *arg, int event)
1583 {
1584         switch(event) {
1585         case 0: /* clear parent */
1586                 clear_parent();
1587                 break;
1588         case 1: /* make parent */
1589                 make_parent();
1590                 break;
1591                 }
1592         allqueue(REDRAWVIEW3D, 0);
1593 }
1594
1595 static uiBlock *view3d_edit_object_parentmenu(void *arg_unused)
1596 {
1597         uiBlock *block;
1598         short yco = 20, menuwidth = 120;
1599
1600         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_parentmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1601         uiBlockSetButmFunc(block, do_view3d_edit_object_parentmenu, NULL);
1602         
1603         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Parent...|Ctrl P",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1604         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Parent...|Alt P",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1605
1606         uiBlockSetDirection(block, UI_RIGHT);
1607         uiTextBoundsBlock(block, 60);
1608         return block;
1609 }
1610
1611 static void do_view3d_edit_object_trackmenu(void *arg, int event)
1612 {
1613         switch(event) {
1614         case 0: /* clear track */
1615                 clear_track();
1616                 break;
1617         case 1: /* make track */
1618                 make_track();
1619                 break;
1620                 }
1621         allqueue(REDRAWVIEW3D, 0);
1622 }
1623
1624 static uiBlock *view3d_edit_object_trackmenu(void *arg_unused)
1625 {
1626         uiBlock *block;
1627         short yco = 20, menuwidth = 120;
1628
1629         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_object_trackmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1630         uiBlockSetButmFunc(block, do_view3d_edit_object_trackmenu, NULL);
1631         
1632         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Track...|Ctrl T",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1633         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Track...|Alt T",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1634         
1635         uiBlockSetDirection(block, UI_RIGHT);
1636         uiTextBoundsBlock(block, 60);
1637         return block;
1638 }
1639
1640 static void do_view3d_edit_object_scriptsmenu(void *arg, int event)
1641 {
1642         BPY_menu_do_python(PYMENU_OBJECT, event);
1643
1644         allqueue(REDRAWVIEW3D, 0);
1645 }
1646
1647 static uiBlock *view3d_edit_object_scriptsmenu(void *arg_unused)
1648 {
1649         uiBlock *block;
1650         short yco = 20, menuwidth = 120;
1651         BPyMenu *pym;
1652         int i = 0;
1653
1654         block= uiNewBlock(&curarea->uiblocks, "v3d_eobject_pymenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1655         uiBlockSetButmFunc(block, do_view3d_edit_object_scriptsmenu, NULL);
1656
1657         for (pym = BPyMenuTable[PYMENU_OBJECT]; pym; pym = pym->next, i++) {
1658                 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);
1659         }
1660
1661         uiBlockSetDirection(block, UI_RIGHT);
1662         uiTextBoundsBlock(block, 60);
1663
1664         return block;
1665 }
1666
1667 static void do_view3d_edit_objectmenu(void *arg, int event)
1668 {
1669         /* needed to check for valid selected objects */
1670         Base *base=NULL;
1671         Object *ob=NULL;
1672
1673         base= BASACT;
1674         if (base) ob= base->object;
1675         
1676         switch(event) {
1677          
1678         case 0: /* transform    properties*/
1679                 mainqenter(NKEY, 1);
1680                 break;
1681         case 1: /* delete */
1682                 delete_context_selected();
1683                 break;
1684         case 2: /* duplicate */
1685                 duplicate_context_selected();
1686                 break;
1687         case 3: /* duplicate linked */
1688                 G.qual |= LR_ALTKEY;
1689                 adduplicate(0);
1690                 G.qual &= ~LR_ALTKEY;
1691                 break;
1692         case 5: /* make single user */
1693                 single_user();
1694                 break;
1695         case 7: /* boolean operation */
1696                 special_editmenu();
1697                 break;
1698         case 8: /* join objects */
1699                 if( (ob= OBACT) ) {
1700                         if(ob->type == OB_MESH) join_mesh();
1701                         else if(ob->type == OB_CURVE) join_curve(OB_CURVE);
1702                         else if(ob->type == OB_SURF) join_curve(OB_SURF);
1703                         else if(ob->type == OB_ARMATURE) join_armature();
1704                 }
1705                 break;
1706         case 9: /* convert object type */
1707                 convertmenu();
1708                 break;
1709         case 10: /* move to layer */
1710                 movetolayer();
1711                 break;
1712         case 11: /* insert keyframe */
1713                 common_insertkey();
1714                 break;
1715         case 15: /* Object Panel */
1716                 add_blockhandler(curarea, VIEW3D_HANDLER_OBJECT, UI_PNL_UNSTOW);
1717                 break;
1718         }
1719         allqueue(REDRAWVIEW3D, 0);
1720 }
1721
1722 static uiBlock *view3d_edit_objectmenu(void *arg_unused)
1723 {
1724         uiBlock *block;
1725         short yco= 0, menuwidth=120;
1726         
1727         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_objectmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1728         uiBlockSetButmFunc(block, do_view3d_edit_objectmenu, NULL);
1729         
1730         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties|N",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 15, "");
1731         uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
1732         uiDefIconTextBlockBut(block, view3d_object_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
1733
1734         uiDefIconTextBlockBut(block, view3d_edit_object_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Clear/Apply", 0, yco-=20, 120, 19, "");
1735         uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
1736         
1737         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1738         
1739         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");  
1740         
1741         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1742         
1743         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1744         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate Linked|Alt D",                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1745         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete|X",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1746         
1747         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1748         
1749         uiDefIconTextBlockBut(block, view3d_edit_object_makelinksmenu, NULL, ICON_RIGHTARROW_THIN, "Make Links", 0, yco-=20, 120, 19, "");
1750         uiDefIconTextBlockBut(block, view3d_edit_object_singleusermenu, NULL, ICON_RIGHTARROW_THIN, "Make Single User", 0, yco-=20, 120, 19, "");
1751         uiDefIconTextBlockBut(block, view3d_edit_object_copyattrmenu, NULL, ICON_RIGHTARROW_THIN, "Copy Attributes", 0, yco-=20, 120, 19, "");
1752         
1753         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1754         
1755         uiDefIconTextBlockBut(block, view3d_edit_object_parentmenu, NULL, ICON_RIGHTARROW_THIN, "Parent", 0, yco-=20, 120, 19, "");
1756         uiDefIconTextBlockBut(block, view3d_edit_object_trackmenu, NULL, ICON_RIGHTARROW_THIN, "Track", 0, yco-=20, 120, 19, "");
1757         
1758         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1759         
1760         if (OBACT && OBACT->type == OB_MESH) {
1761                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Boolean Operation...|W",                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1762         }
1763         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Join Objects|Ctrl J",                            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
1764         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Object Type...|Alt C",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
1765         
1766         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1767         
1768         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move to Layer...|M",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
1769
1770         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1771         uiDefIconTextBlockBut(block, view3d_edit_object_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, "");
1772
1773                 
1774         if(curarea->headertype==HEADERTOP) {
1775                 uiBlockSetDirection(block, UI_DOWN);
1776         }
1777         else {
1778                 uiBlockSetDirection(block, UI_TOP);
1779                 uiBlockFlipOrder(block);
1780         }
1781
1782         uiTextBoundsBlock(block, 50);
1783         return block;
1784 }
1785
1786
1787 static void do_view3d_edit_propfalloffmenu(void *arg, int event)
1788 {
1789         extern int prop_mode;
1790         
1791         switch(event) {
1792         case 0: /* proportional edit - sharp*/
1793                 prop_mode = 0;
1794                 break;
1795         case 1: /* proportional edit - smooth*/
1796                 prop_mode = 1;
1797                 break;
1798                 }
1799         allqueue(REDRAWVIEW3D, 1);
1800 }
1801
1802 static uiBlock *view3d_edit_propfalloffmenu(void *arg_unused)
1803 {
1804         uiBlock *block;
1805         short yco = 20, menuwidth = 120;
1806         extern int prop_mode;
1807
1808         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_propfalloffmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1809         uiBlockSetButmFunc(block, do_view3d_edit_propfalloffmenu, NULL);
1810         
1811         if (prop_mode==0) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Sharp|Shift O",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1812         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Sharp|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1813         if (prop_mode==1) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Smooth|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1814         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Smooth|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1815                 
1816         uiBlockSetDirection(block, UI_RIGHT);
1817         uiTextBoundsBlock(block, 60);
1818         return block;
1819 }
1820
1821
1822 void do_view3d_edit_mesh_verticesmenu(void *arg, int event)
1823 {
1824         extern float doublimit;
1825         
1826         switch(event) {
1827                  
1828         case 0: /* make vertex parent */
1829                 make_parent();
1830                 break;
1831         case 1: /* remove doubles */
1832                 notice("Removed: %d", removedoublesflag(1, doublimit));
1833                 break;
1834         case 2: /* smooth */
1835                 vertexsmooth();
1836                 break;
1837         case 3: /* separate */
1838                 separate_mesh();
1839                 break;
1840         case 4: /*split */
1841                 split_mesh();
1842                 break;
1843         case 5: /*merge */
1844                 mergemenu();
1845                 break;
1846         case 6: /* add hook */
1847                 add_hook();
1848                 break;
1849         }
1850         allqueue(REDRAWVIEW3D, 0);
1851 }
1852
1853 static uiBlock *view3d_edit_mesh_verticesmenu(void *arg_unused)
1854 {
1855         uiBlock *block;
1856         short yco = 20, menuwidth = 120;
1857
1858         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mesh_verticesmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1859         uiBlockSetButmFunc(block, do_view3d_edit_mesh_verticesmenu, NULL);
1860         
1861         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Merge...|Alt M",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1862         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Split|Y",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1863         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Separate|P",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1864         
1865         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1866         
1867         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Smooth|W, 0",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1868         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remove Doubles|W, 5",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1869         
1870         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1871
1872         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Vertex Parent|Ctrl P",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1873         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Hook|Ctrl H",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1874
1875         uiBlockSetDirection(block, UI_RIGHT);
1876         uiTextBoundsBlock(block, 60);
1877         return block;
1878 }
1879
1880 void do_view3d_edit_mesh_edgesmenu(void *arg, int event)
1881 {
1882         extern short editbutflag;
1883         float fac;
1884         short randfac;
1885
1886         switch(event) {
1887                  
1888         case 0: /* subdivide smooth */
1889                 subdivideflag(1, 0.0, editbutflag | B_SMOOTH);
1890                 BIF_undo_push("Subdivide Smooth");
1891                 break;
1892         case 1: /*subdivide fractal */
1893                 randfac= 10;
1894                 if(button(&randfac, 1, 100, "Rand fac:")==0) return;
1895                 fac= -( (float)randfac )/100;
1896                 subdivideflag(1, fac, editbutflag);
1897                 BIF_undo_push("Subdivide Fractal");
1898                 break;
1899         case 2: /* subdivide */
1900                 subdivideflag(1, 0.0, editbutflag);
1901                 BIF_undo_push("Subdivide");
1902                 break;
1903         case 3: /* knife subdivide */
1904                 KnifeSubdivide(KNIFE_PROMPT);
1905                 break;
1906         case 4: /* Loop subdivide */
1907                 loopoperations(LOOP_CUT);
1908                 break;
1909         case 5: /* Make Edge/Face */
1910                 addedgeface_mesh();
1911                 break;
1912         case 6:
1913                 bevel_menu();
1914                 break;
1915         case 7: /* Mark Seam */
1916                 editmesh_mark_seam(0);
1917                 break;
1918         case 8: /* Clear Seam */
1919                 editmesh_mark_seam(1);
1920                 break;
1921         case 9: /* Cease SubSurf */
1922                 transform('e');
1923                 break;
1924         case 10: /* Rotate Edge */
1925                 edge_rotate_selected();
1926                 break;
1927         }
1928         allqueue(REDRAWVIEW3D, 0);
1929 }
1930
1931 static uiBlock *view3d_edit_mesh_edgesmenu(void *arg_unused)
1932 {
1933         uiBlock *block;
1934         short yco = 20, menuwidth = 120;
1935         
1936         Mesh *me= get_mesh(OBACT);
1937
1938         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mesh_edgesmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1939         uiBlockSetButmFunc(block, do_view3d_edit_mesh_edgesmenu, NULL);
1940         
1941         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1942         
1943         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1944         
1945         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel|W, Alt 1",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1946         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Loop Subdivide...|Ctrl R",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1947         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Knife Subdivide...|Shift K",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1948         
1949         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1950         
1951         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide|W, 1",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1952         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide Fractal|W, 2",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1953         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide Smooth|W, 3",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1954
1955         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1956
1957         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mark Seam|Ctrl E",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1958         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Seam|Ctrl E",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
1959
1960         if (me->flag & ME_SUBSURF) {
1961                 uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1962                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Crease SubSurf|Shift E",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
1963         }
1964         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1965
1966         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate Edge|Ctrl E",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
1967         
1968         uiBlockSetDirection(block, UI_RIGHT);
1969         uiTextBoundsBlock(block, 60);
1970         return block;
1971 }
1972
1973 static void do_view3d_edit_mesh_facesmenu(void *arg, int event)
1974 {
1975         switch(event) {
1976         case 0: /* Fill Faces */
1977                 fill_mesh();
1978                 break;
1979         case 1: /* Beauty Fill Faces */
1980                 beauty_fill();
1981                 break;
1982         case 2: /* Quads to Tris */
1983                 convert_to_triface(0);
1984                 allqueue(REDRAWVIEW3D, 0);
1985                 countall();
1986                 makeDispList(G.obedit);
1987                 break;
1988         case 3: /* Tris to Quads */
1989                 join_triangles();
1990                 break;
1991         case 4: /* Flip triangle edges */
1992                 edge_flip();
1993                 break;
1994         case 5: /* Make Edge/Face */
1995                 addedgeface_mesh();
1996                 break;
1997         }
1998         allqueue(REDRAWVIEW3D, 0);
1999 }
2000
2001 static uiBlock *view3d_edit_mesh_facesmenu(void *arg_unused)
2002 {
2003         uiBlock *block;
2004         short yco = 20, menuwidth = 120;
2005
2006         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mesh_facesmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2007         uiBlockSetButmFunc(block, do_view3d_edit_mesh_facesmenu, NULL);
2008         
2009         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2010         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Fill|Shift F",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2011         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Beautify Fill|Alt F",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2012         
2013         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2014         
2015         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Quads to Triangles|Ctrl T",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2016         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Triangles to Quads|Alt J", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2017         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip Triangle Edges|Ctrl F",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2018         
2019         uiBlockSetDirection(block, UI_RIGHT);
2020         uiTextBoundsBlock(block, 60);
2021         return block;
2022 }
2023
2024 void do_view3d_edit_mesh_normalsmenu(void *arg, int event)
2025 {
2026         switch(event) {
2027         case 0: /* flip */
2028                 flip_editnormals();
2029                 break;
2030         case 1: /* recalculate inside */
2031                 righthandfaces(2);
2032                 break;
2033         case 2: /* recalculate outside */
2034                 righthandfaces(1);
2035                 break;
2036                 }
2037         allqueue(REDRAWVIEW3D, 0);
2038 }
2039
2040 static uiBlock *view3d_edit_mesh_normalsmenu(void *arg_unused)
2041 {
2042         uiBlock *block;
2043         short yco = 20, menuwidth = 120;
2044
2045         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mesh_normalsmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2046         uiBlockSetButmFunc(block, do_view3d_edit_mesh_normalsmenu, NULL);
2047         
2048         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recalculate Outside|Ctrl N",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2049         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recalculate Inside|Ctrl Shift N",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2050         
2051         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2052         
2053         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip|W, 9",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2054         
2055         uiBlockSetDirection(block, UI_RIGHT);
2056         uiTextBoundsBlock(block, 60);
2057         return block;
2058 }
2059
2060 void do_view3d_edit_mirrormenu(void *arg, int event)
2061 {
2062         switch(event) {
2063                 case 1:
2064                 case 2:
2065                 case 3:
2066                 case 4:
2067                 case 5:
2068                 case 6:
2069                 case 7:
2070                 case 8:
2071                 case 9:
2072                         mirror_edit(event);
2073                         break;
2074         }
2075         allqueue(REDRAWVIEW3D, 0);
2076 }
2077
2078 static uiBlock *view3d_edit_mirrormenu(void *arg_unused)
2079 {
2080         uiBlock *block;
2081         short yco = 20, menuwidth = 120;
2082
2083         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mirrormenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2084         uiBlockSetButmFunc(block, do_view3d_edit_mirrormenu, NULL);
2085         
2086         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|Ctrl M, 1",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2087         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|Ctrl M, 2",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2088         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|Ctrl M, 3",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2089         
2090         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2091         
2092         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|Ctrl M, 4",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2093         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, 5",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2094         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, 6",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2095         
2096         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2097         
2098         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X View|Ctrl M, 7",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2099         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y View|Ctrl M, 8",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
2100         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z View|Ctrl M, 9",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2101
2102         uiBlockSetDirection(block, UI_RIGHT);
2103         uiTextBoundsBlock(block, 60);
2104         return block;
2105 }
2106
2107 static void do_view3d_edit_mesh_showhidemenu(void *arg, int event)
2108 {
2109         
2110         switch(event) {
2111                  
2112         case 0: /* show hidden vertices */
2113                 reveal_mesh();
2114                 break;
2115         case 1: /* hide selected vertices */
2116                 hide_mesh(0);
2117                 break;
2118         case 2: /* hide deselected vertices */
2119                 hide_mesh(1);
2120                 break;
2121         }
2122         allqueue(REDRAWVIEW3D, 0);
2123 }
2124
2125 static uiBlock *view3d_edit_mesh_showhidemenu(void *arg_unused)
2126 {
2127         uiBlock *block;
2128         short yco = 20, menuwidth = 120;
2129
2130         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_mesh_showhidemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2131         uiBlockSetButmFunc(block, do_view3d_edit_mesh_showhidemenu, NULL);
2132         
2133         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hidden|Alt H",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2134         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Selected|H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2135         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Deselected|Shift H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2136
2137         uiBlockSetDirection(block, UI_RIGHT);
2138         uiTextBoundsBlock(block, 60);
2139         return block;
2140 }
2141
2142 static void do_view3d_edit_mesh_scriptsmenu(void *arg, int event)
2143 {
2144         BPY_menu_do_python(PYMENU_MESH, event);
2145
2146         allqueue(REDRAWVIEW3D, 0);
2147 }
2148
2149 static uiBlock *view3d_edit_mesh_scriptsmenu(void *arg_unused)
2150 {
2151         uiBlock *block;
2152         short yco = 20, menuwidth = 120;
2153         BPyMenu *pym;
2154         int i = 0;
2155
2156         block= uiNewBlock(&curarea->uiblocks, "v3d_emesh_pymenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2157         uiBlockSetButmFunc(block, do_view3d_edit_mesh_scriptsmenu, NULL);
2158
2159         for (pym = BPyMenuTable[PYMENU_MESH]; pym; pym = pym->next, i++) {
2160                 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);
2161         }
2162
2163         uiBlockSetDirection(block, UI_RIGHT);
2164         uiTextBoundsBlock(block, 60);
2165
2166         return block;
2167 }
2168
2169 static void do_view3d_edit_meshmenu(void *arg, int event)
2170 {
2171         switch(event) {
2172         
2173         case 0: /* Undo Editing */
2174                 BIF_undo();
2175                 break;
2176         case 1: /* Redo Editing */
2177                 BIF_redo();
2178                 break;
2179         case 2: /* transform properties */
2180                 add_blockhandler(curarea, VIEW3D_HANDLER_OBJECT, 0);
2181                 break;
2182         case 4: /* insert keyframe */
2183                 common_insertkey();
2184                 break;
2185         case 5: /* Extrude */
2186                 extrude_mesh();
2187                 break;
2188         case 6: /* duplicate */
2189                 duplicate_context_selected();
2190                 break;
2191         case 7: /* make edge face */
2192                 addedgeface_mesh();
2193                 break;
2194         case 8: /* delete */
2195                 delete_context_selected();
2196                 break;
2197         case 9: /* Shrink/Fatten Along Normals */
2198                 transform('N');
2199                 break;
2200         case 10: /* Shear */
2201                 transform('S');
2202                 break;
2203         case 11: /* Warp */
2204                 transform('w');
2205                 break;
2206         case 12: /* proportional edit (toggle) */
2207                 if(G.f & G_PROPORTIONAL) G.f &= ~G_PROPORTIONAL;
2208                 else G.f |= G_PROPORTIONAL;
2209                 break;
2210         }
2211         allqueue(REDRAWVIEW3D, 0);
2212 }
2213
2214 static uiBlock *view3d_edit_meshmenu(void *arg_unused)
2215 {
2216
2217         uiBlock *block;
2218         short yco= 0, menuwidth=120;
2219                 
2220         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_meshmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
2221         uiBlockSetButmFunc(block, do_view3d_edit_meshmenu, NULL);
2222                 
2223         /*
2224         uiDefIconTextBlockBut(block, view3d_edit_mesh_facesmenu, NULL, ICON_RIGHTARROW_THIN, "Move", 0, yco-=20, 120, 19, "");
2225         uiDefIconTextBlockBut(block, view3d_edit_mesh_facesmenu, NULL, ICON_RIGHTARROW_THIN, "Rotate", 0, yco-=20, 120, 19, "");
2226         uiDefIconTextBlockBut(block, view3d_edit_mesh_facesmenu, NULL, ICON_RIGHTARROW_THIN, "Scale", 0, yco-=20, 120, 19, "");
2227         */
2228         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|U",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2229         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Redo Editing|Shift U",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2230         uiDefIconTextBlockBut(block, editmode_undohistorymenu, NULL, ICON_RIGHTARROW_THIN, "Undo History", 0, yco-=20, 120, 19, "");
2231         
2232         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2233         
2234         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties...|N",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2235         uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
2236         uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
2237         
2238         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2239         
2240         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2241         
2242         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2243         
2244         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extrude|E",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2245         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2246         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2247         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete...|X",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
2248         
2249         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2250         
2251         uiDefIconTextBlockBut(block, view3d_edit_mesh_verticesmenu, NULL, ICON_RIGHTARROW_THIN, "Vertices", 0, yco-=20, 120, 19, "");
2252         uiDefIconTextBlockBut(block, view3d_edit_mesh_edgesmenu, NULL, ICON_RIGHTARROW_THIN, "Edges", 0, yco-=20, 120, 19, "");
2253         uiDefIconTextBlockBut(block, view3d_edit_mesh_facesmenu, NULL, ICON_RIGHTARROW_THIN, "Faces", 0, yco-=20, 120, 19, "");
2254         uiDefIconTextBlockBut(block, view3d_edit_mesh_normalsmenu, NULL, ICON_RIGHTARROW_THIN, "Normals", 0, yco-=20, 120, 19, "");
2255         
2256         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2257         
2258         uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, 120, 19, "");
2259         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shrink/Fatten Along Normals|Alt S",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2260         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl S",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
2261         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Warp|Shift W",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
2262         
2263         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2264         
2265         if(G.f & G_PROPORTIONAL) {
2266                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
2267         } else {
2268                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
2269         }
2270         uiDefIconTextBlockBut(block, view3d_edit_propfalloffmenu, NULL, ICON_RIGHTARROW_THIN, "Proportional Falloff", 0, yco-=20, 120, 19, "");
2271         
2272         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2273         
2274         uiDefIconTextBlockBut(block, view3d_edit_mesh_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Show/Hide Vertices", 0, yco-=20, 120, 19, "");
2275
2276         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2277         uiDefIconTextBlockBut(block, view3d_edit_mesh_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, "");
2278         
2279         if(curarea->headertype==HEADERTOP) {
2280                 uiBlockSetDirection(block, UI_DOWN);
2281         }
2282         else {
2283                 uiBlockSetDirection(block, UI_TOP);
2284                 uiBlockFlipOrder(block);
2285         }
2286
2287         uiTextBoundsBlock(block, 50);
2288         return block;
2289 }
2290
2291 static void do_view3d_edit_curve_controlpointsmenu(void *arg, int event)
2292 {
2293         switch(event) {
2294         case 0: /* tilt */
2295                 transform('t');
2296                 break;
2297         case 1: /* clear tilt */
2298                 clear_tilt();
2299                 break;
2300         case 2: /* Free */
2301                 sethandlesNurb(3);
2302                 makeDispList(G.obedit);
2303                 break;
2304         case 3: /* vector */
2305                 sethandlesNurb(2);
2306                 makeDispList(G.obedit);
2307                 break;
2308         case 4: /* smooth */
2309                 sethandlesNurb(1);
2310                 makeDispList(G.obedit);
2311                 break;
2312         case 5: /* make vertex parent */
2313                 make_parent();
2314                 break;
2315         case 6: /* add hook */
2316                 add_hook();
2317                 break;
2318         }
2319         allqueue(REDRAWVIEW3D, 0);
2320 }
2321
2322 static uiBlock *view3d_edit_curve_controlpointsmenu(void *arg_unused)
2323 {
2324         uiBlock *block;
2325         short yco = 20, menuwidth = 120;
2326
2327         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_curve_controlpointsmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2328         uiBlockSetButmFunc(block, do_view3d_edit_curve_controlpointsmenu, NULL);
2329         
2330         if (OBACT->type == OB_CURVE) {
2331                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Tilt|T",                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2332                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Tilt|Alt T",                               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2333                 
2334                 uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2335                 
2336                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Automatic|Shift H",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2337                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Toggle Free/Aligned|H",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2338                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Vector|V",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2339                 
2340         }
2341         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Vertex Parent|Ctrl P",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2342         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Hook|Ctrl H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2343         
2344         uiBlockSetDirection(block, UI_RIGHT);
2345         uiTextBoundsBlock(block, 60);
2346         return block;
2347 }
2348
2349 void do_view3d_edit_curve_segmentsmenu(void *arg, int event)
2350 {
2351         switch(event) {
2352         case 0: /* subdivide */
2353                 subdivideNurb();
2354                 break;
2355         case 1: /* switch direction */
2356                 switchdirectionNurb2();
2357                 break;
2358                 }
2359         allqueue(REDRAWVIEW3D, 0);
2360 }
2361
2362 static uiBlock *view3d_edit_curve_segmentsmenu(void *arg_unused)
2363 {
2364         uiBlock *block;
2365         short yco = 20, menuwidth = 120;
2366
2367         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_curve_segmentsmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2368         uiBlockSetButmFunc(block, do_view3d_edit_curve_segmentsmenu, NULL);
2369         
2370         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2371         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Switch Direction",                               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2372
2373         uiBlockSetDirection(block, UI_RIGHT);
2374         uiTextBoundsBlock(block, 60);
2375         return block;
2376 }
2377
2378 void do_view3d_edit_curve_showhidemenu(void *arg, int event)
2379 {
2380         switch(event) {
2381         case 10: /* show hidden control points */
2382                 revealNurb();
2383                 break;
2384         case 11: /* hide selected control points */
2385                 hideNurb(0);
2386                 break;
2387         case 12: /* hide deselected control points */
2388                 hideNurb(1);
2389                 break;
2390                 }
2391         allqueue(REDRAWVIEW3D, 0);
2392 }
2393
2394 static uiBlock *view3d_edit_curve_showhidemenu(void *arg_unused)
2395 {
2396         uiBlock *block;
2397         short yco = 20, menuwidth = 120;
2398
2399         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_curve_showhidemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2400         uiBlockSetButmFunc(block, do_view3d_edit_curve_showhidemenu, NULL);
2401         
2402         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hidden|Alt H",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
2403         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Selected|H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
2404         if (OBACT->type == OB_SURF) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Deselected Control Points|Shift H",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
2405         
2406
2407         uiBlockSetDirection(block, UI_RIGHT);
2408         uiTextBoundsBlock(block, 60);
2409         return block;
2410 }
2411 static void do_view3d_edit_curvemenu(void *arg, int event)
2412 {
2413         switch(event) {
2414         
2415         case 0: /* Undo Editing */
2416                 remake_editNurb();
2417                 break;
2418         case 1: /* transformation properties */
2419                 mainqenter(NKEY, 1);
2420                 break;
2421         case 2: /* insert keyframe */
2422                 common_insertkey();
2423                 break;
2424         case 4: /* extrude */
2425                 if (OBACT->type == OB_CURVE) {
2426                         addvert_Nurb('e');
2427                 } else if (OBACT->type == OB_SURF) {
2428                         extrude_nurb();
2429                 }
2430                 break;
2431         case 5: /* duplicate */
2432                 duplicate_context_selected();
2433                 break;
2434         case 6: /* make segment */
2435                 addsegment_nurb();
2436                 break;
2437         case 7: /* toggle cyclic */
2438                 makecyclicNurb();
2439                 makeDispList(G.obedit);
2440                 break;
2441         case 8: /* delete */
2442                 delete_context_selected();
2443                 break;
2444         case 9: /* proportional edit (toggle) */
2445                 if(G.f & G_PROPORTIONAL) G.f &= ~G_PROPORTIONAL;
2446                 else G.f |= G_PROPORTIONAL;
2447                 break;
2448         case 13: /* Shear */
2449                 transform('S');
2450                 break;
2451         case 14: /* Warp */
2452                 transform('w');
2453                 break;
2454         }
2455         allqueue(REDRAWVIEW3D, 0);
2456 }
2457
2458 static uiBlock *view3d_edit_curvemenu(void *arg_unused)
2459 {
2460         uiBlock *block;
2461         short yco= 0, menuwidth=120;
2462
2463         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_curvemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
2464         uiBlockSetButmFunc(block, do_view3d_edit_curvemenu, NULL);
2465         
2466         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reload Original|U",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2467         
2468         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2469         
2470         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties...|N",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2471         uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
2472         uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
2473         
2474         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2475         
2476         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2477         
2478         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2479         
2480         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extrude|E",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2481         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2482         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Segment|F",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2483         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Toggle Cyclic|C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2484         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete...|X",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
2485         
2486         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2487         
2488         uiDefIconTextBlockBut(block, view3d_edit_curve_controlpointsmenu, NULL, ICON_RIGHTARROW_THIN, "Control Points", 0, yco-=20, menuwidth, 19, "");
2489         uiDefIconTextBlockBut(block, view3d_edit_curve_segmentsmenu, NULL, ICON_RIGHTARROW_THIN, "Segments", 0, yco-=20, menuwidth, 19, "");
2490         
2491         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2492         
2493         uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");      
2494         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl S",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
2495         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Warp|Shift W",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
2496
2497         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2498         
2499         if(G.f & G_PROPORTIONAL) {
2500                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2501         } else {
2502                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2503         }
2504         uiDefIconTextBlockBut(block, view3d_edit_propfalloffmenu, NULL, ICON_RIGHTARROW_THIN, "Proportional Falloff", 0, yco-=20, menuwidth, 19, "");
2505         
2506         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2507         
2508         uiDefIconTextBlockBut(block, view3d_edit_curve_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Show/Hide Control Points", 0, yco-=20, menuwidth, 19, "");
2509         
2510         if(curarea->headertype==HEADERTOP) {
2511                 uiBlockSetDirection(block, UI_DOWN);
2512         }
2513         else {
2514                 uiBlockSetDirection(block, UI_TOP);
2515                 uiBlockFlipOrder(block);
2516         }
2517
2518         uiTextBoundsBlock(block, 50);
2519         return block;
2520 }
2521
2522 static void do_view3d_edit_metaballmenu(void *arg, int event)
2523 {
2524         switch(event) {
2525         case 1: /* undo */
2526                 BIF_undo();
2527                 break;
2528         case 2: /* redo */
2529                 BIF_redo();
2530                 break;
2531         case 3: /* duplicate */
2532                 duplicate_context_selected();
2533                 break;
2534         case 4: /* delete */
2535                 delete_context_selected();
2536                 break;
2537         case 5: /* Shear */
2538                 transform('S');
2539                 break;
2540         case 6: /* Warp */
2541                 transform('w');
2542                 break;
2543         }
2544         allqueue(REDRAWVIEW3D, 0);
2545 }
2546
2547 static uiBlock *view3d_edit_metaballmenu(void *arg_unused)
2548 {
2549         uiBlock *block;
2550         short yco= 0, menuwidth=120;
2551                 
2552         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_metaballmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
2553         uiBlockSetButmFunc(block, do_view3d_edit_metaballmenu, NULL);
2554
2555         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|Ctrl Z",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2556         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Redo Editing|Shift Ctrl Z",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2557         uiDefIconTextBlockBut(block, editmode_undohistorymenu, NULL, ICON_RIGHTARROW_THIN, "Undo History", 0, yco-=20, 120, 19, "");
2558         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2559         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2560         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete...|X",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2561         
2562         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2563         
2564         uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
2565         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl S",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2566         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Warp|Shift W",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2567
2568         if(curarea->headertype==HEADERTOP) {
2569                 uiBlockSetDirection(block, UI_DOWN);
2570         }
2571         else {
2572                 uiBlockSetDirection(block, UI_TOP);
2573                 uiBlockFlipOrder(block);
2574         }
2575
2576         uiTextBoundsBlock(block, 50);
2577         return block;
2578 }
2579
2580 static void do_view3d_edit_text_charsmenu(void *arg, int event)
2581 {
2582         switch(event) {
2583         case 0: /* copyright */
2584                 do_textedit(0,0,169);
2585                 break;
2586         case 1: /* registered trademark */
2587                 do_textedit(0,0,174);
2588                 break;
2589         case 2: /* degree sign */
2590                 do_textedit(0,0,176);
2591                 break;
2592         case 3: /* Multiplication Sign */
2593                 do_textedit(0,0,215);
2594                 break;
2595         case 4: /* Circle */
2596                 do_textedit(0,0,138);
2597                 break;
2598         case 5: /* superscript 1 */
2599                 do_textedit(0,0,185);
2600                 break;
2601         case 6: /* superscript 2 */
2602                 do_textedit(0,0,178);
2603                 break;
2604         case 7: /* superscript 3 */
2605                 do_textedit(0,0,179);
2606                 break;
2607         case 8: /* double >> */
2608                 do_textedit(0,0,187);
2609                 break;
2610         case 9: /* double << */
2611                 do_textedit(0,0,171);
2612                 break;
2613         case 10: /* Promillage */
2614                 do_textedit(0,0,139);
2615                 break;
2616         case 11: /* dutch florin */
2617                 do_textedit(0,0,164);
2618                 break;
2619         case 12: /* british pound */
2620                 do_textedit(0,0,163);
2621                 break;
2622         case 13: /* japanese yen*/
2623                 do_textedit(0,0,165);
2624                 break;
2625         case 14: /* german S */
2626                 do_textedit(0,0,223);
2627                 break;
2628         case 15: /* spanish question mark */
2629                 do_textedit(0,0,191);
2630                 break;
2631         case 16: /* spanish exclamation mark */
2632                 do_textedit(0,0,161);
2633                 break;
2634                 }
2635         allqueue(REDRAWVIEW3D, 0);
2636 }
2637
2638 static uiBlock *view3d_edit_text_charsmenu(void *arg_unused)
2639 {
2640         uiBlock *block;
2641         short yco = 20, menuwidth = 120;
2642
2643         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_text_charsmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2644         uiBlockSetButmFunc(block, do_view3d_edit_text_charsmenu, NULL);
2645         
2646         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Copyright|Alt C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2647         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Registered Trademark|Alt R",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2648         
2649         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2650         
2651         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Degree Sign|Alt G",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2652         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Multiplication Sign|Alt x",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2653         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Circle|Alt .",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2654         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Superscript 1|Alt 1",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2655         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Superscript 2|Alt 2",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2656         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Superscript 3|Alt 3",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2657         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Double >>|Alt >",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
2658         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Double <<|Alt <",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2659         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Promillage|Alt %",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
2660         
2661         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2662         
2663         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Dutch Florin|Alt F",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
2664         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "British Pound|Alt L",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
2665         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Japanese Yen|Alt Y",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
2666         
2667         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2668         
2669         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "German S|Alt S",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
2670         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Spanish Question Mark|Alt ?",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
2671         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Spanish Exclamation Mark|Alt !",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
2672                 
2673         uiBlockSetDirection(block, UI_RIGHT);
2674         uiTextBoundsBlock(block, 60);
2675                 
2676         return block;
2677 }
2678
2679 static void do_view3d_edit_textmenu(void *arg, int event)
2680 {
2681         switch(event) {
2682                                                                         
2683         case 0: /* Undo Editing */
2684                 remake_editText();
2685                 break;
2686         case 1: /* paste from file buffer */
2687                 paste_editText();
2688                 break;
2689         }
2690         allqueue(REDRAWVIEW3D, 0);
2691 }
2692
2693 static uiBlock *view3d_edit_textmenu(void *arg_unused)
2694 {
2695         uiBlock *block;
2696         short yco= 0, menuwidth=120;
2697         
2698         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_textmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
2699         uiBlockSetButmFunc(block, do_view3d_edit_textmenu, NULL);
2700         
2701         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|U",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2702         
2703         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2704         
2705         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Paste From Buffer File|Alt V",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2706         
2707         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2708         
2709         uiDefIconTextBlockBut(block, view3d_edit_text_charsmenu, NULL, ICON_RIGHTARROW_THIN, "Special Characters", 0, yco-=20, 120, 19, "");
2710
2711         if(curarea->headertype==HEADERTOP) {
2712                 uiBlockSetDirection(block, UI_DOWN);
2713         }
2714         else {
2715                 uiBlockSetDirection(block, UI_TOP);
2716                 uiBlockFlipOrder(block);
2717         }
2718
2719         uiTextBoundsBlock(block, 50);
2720         return block;
2721 }
2722
2723 static void do_view3d_edit_latticemenu(void *arg, int event)
2724 {
2725         switch(event) {
2726                                                                         
2727         case 0: /* Undo Editing */
2728                 remake_editLatt();
2729                 break;
2730         case 2: /* insert keyframe */
2731                 common_insertkey();
2732                 break;
2733         case 3: /* Shear */
2734                 transform('S');
2735                 break;
2736         case 4: /* Warp */
2737                 transform('w');
2738                 break;
2739         case 5: /* proportional edit (toggle) */
2740                 if(G.f & G_PROPORTIONAL) G.f &= ~G_PROPORTIONAL;
2741                 else G.f |= G_PROPORTIONAL;
2742                 break;
2743         }
2744         allqueue(REDRAWVIEW3D, 0);
2745 }
2746
2747 static uiBlock *view3d_edit_latticemenu(void *arg_unused)
2748 {
2749         uiBlock *block;
2750         short yco= 0, menuwidth=120;
2751                 
2752         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_latticemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
2753         uiBlockSetButmFunc(block, do_view3d_edit_latticemenu, NULL);
2754         
2755         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|U",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2756         
2757         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2758         
2759         uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
2760         
2761         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2762         
2763         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2764         
2765         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2766
2767         uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");      
2768         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl S",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2769         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Warp|Shift W",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2770         
2771         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2772         
2773         if(G.f & G_PROPORTIONAL) {
2774                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2775         } else {
2776                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2777         }
2778         uiDefIconTextBlockBut(block, view3d_edit_propfalloffmenu, NULL, ICON_RIGHTARROW_THIN, "Proportional Falloff", 0, yco-=20, 120, 19, "");
2779
2780         if(curarea->headertype==HEADERTOP) {
2781                 uiBlockSetDirection(block, UI_DOWN);
2782         }
2783         else {
2784                 uiBlockSetDirection(block, UI_TOP);
2785                 uiBlockFlipOrder(block);
2786         }
2787
2788         uiTextBoundsBlock(block, 50);
2789         return block;
2790 }
2791
2792 static void do_view3d_edit_armaturemenu(void *arg, int event)
2793 {
2794         switch(event) {
2795         
2796         case 0: /* Undo Editing */
2797                 remake_editArmature();
2798                 break;
2799         case 1: /* transformation properties */
2800                 mainqenter(NKEY, 1);
2801                 break;
2802         case 3: /* extrude */
2803                 extrude_armature();
2804                 break;
2805         case 4: /* duplicate */
2806                 duplicate_context_selected();
2807                 break;
2808         case 5: /* delete */
2809                 delete_context_selected();
2810                 break;
2811         case 6: /* Shear */
2812                 transform('S');
2813                 break;
2814         case 7: /* Warp */
2815                 transform('w');
2816                 break;
2817         }
2818         allqueue(REDRAWVIEW3D, 0);
2819 }
2820
2821 static uiBlock *view3d_edit_armaturemenu(void *arg_unused)
2822 {
2823         uiBlock *block;
2824         short yco= 0, menuwidth=120;
2825         
2826         block= uiNewBlock(&curarea->uiblocks, "view3d_edit_armaturemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
2827         uiBlockSetButmFunc(block, do_view3d_edit_armaturemenu, NULL);
2828         
2829         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|U",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2830         
2831         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2832         
2833         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2834         uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
2835         uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
2836         
2837         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2838
2839         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extrude|E",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2840         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2841         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete|X",                               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2842         
2843         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2844
2845         uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");      
2846         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl S",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2847         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Warp|Shift W",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2848
2849         if(curarea->headertype==HEADERTOP) {
2850                 uiBlockSetDirection(block, UI_DOWN);
2851         }
2852         else {
2853                 uiBlockSetDirection(block, UI_TOP);
2854                 uiBlockFlipOrder(block);
2855         }
2856
2857         uiTextBoundsBlock(block, 50);
2858         
2859         return block;
2860 }
2861
2862 static void do_view3d_pose_armature_transformmenu(void *arg, int event)
2863 {
2864         switch(event) {
2865         case 0: /*      clear origin */
2866                 clear_object('o');
2867                 break;
2868         case 1: /* clear size */
2869                 clear_object('s');
2870                 break;
2871         case 2: /* clear rotation */
2872                 clear_object('r');
2873                 break;
2874         case 3: /* clear location */
2875                 clear_object('g');
2876                 break;
2877         }
2878         allqueue(REDRAWVIEW3D, 0);
2879 }
2880
2881 static uiBlock *view3d_pose_armature_transformmenu(void *arg_unused)
2882 {
2883         uiBlock *block;
2884         short yco = 20, menuwidth = 120;
2885
2886         block= uiNewBlock(&curarea->uiblocks, "view3d_pose_armature_transformmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2887         uiBlockSetButmFunc(block, do_view3d_pose_armature_transformmenu, NULL);
2888         
2889         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Location|Alt G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2890         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Rotation|Alt R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2891         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Size|Alt S",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2892         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Origin|Alt O",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2893         
2894         uiBlockSetDirection(block, UI_RIGHT);
2895         uiTextBoundsBlock(block, 60);
2896         return block;
2897 }
2898
2899 static void do_view3d_pose_armaturemenu(void *arg, int event)
2900 {
2901         switch(event) {
2902         
2903         case 0: /* transform properties */
2904                 mainqenter(NKEY, 1);
2905                 break;
2906         case 1: /* copy current pose */
2907                 copy_posebuf();
2908                 break;
2909         case 2: /* paste pose */
2910                 paste_posebuf(0);
2911                 break;
2912         case 3: /* paste flipped pose */
2913                 paste_posebuf(1);
2914                 break;
2915         case 4: /* insert keyframe */
2916                 common_insertkey();
2917                 break;
2918         }
2919         allqueue(REDRAWVIEW3D, 0);
2920 }
2921
2922 static void do_view3d_pose_armature_showhidemenu(void *arg, int event)
2923 {
2924         
2925         switch(event) {
2926                  
2927         case 0: /* show hidden bones */
2928                 show_all_pose_bones();
2929                 break;
2930         case 1: /* hide selected bones */
2931                 hide_selected_pose_bones();
2932                 break;
2933         case 2: /* hide deselected bones */
2934                 hide_unselected_pose_bones();
2935                 break;
2936         }
2937         allqueue(REDRAWVIEW3D, 0);
2938 }
2939
2940 static uiBlock *view3d_pose_armature_showhidemenu(void *arg_unused)
2941 {
2942         uiBlock *block;
2943         short yco = 20, menuwidth = 120;
2944
2945         block= uiNewBlock(&curarea->uiblocks, "view3d_pose_armature_showhidemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2946         uiBlockSetButmFunc(block, do_view3d_pose_armature_showhidemenu, NULL);
2947         
2948         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hidden|Alt H",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2949         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Selected|H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2950         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Deselected|Shift H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2951
2952         uiBlockSetDirection(block, UI_RIGHT);
2953         uiTextBoundsBlock(block, 60);
2954         return block;
2955 }
2956
2957 static uiBlock *view3d_pose_armaturemenu(void *arg_unused)
2958 {
2959         uiBlock *block;
2960         short yco= 0, menuwidth=120;
2961         
2962         block= uiNewBlock(&curarea->uiblocks, "view3d_pose_armaturemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
2963         uiBlockSetButmFunc(block, do_view3d_pose_armaturemenu, NULL);
2964         
2965         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2966         uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
2967         uiDefIconTextBlockBut(block, view3d_pose_armature_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Clear Transform", 0, yco-=20, 120, 19, "");
2968         
2969         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2970         
2971         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2972         
2973         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2974
2975         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Copy Current Pose",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2976         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Paste Pose",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2977         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Paste Flipped Pose",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");   
2978
2979         uiDefBut(block, SEPR, 0, "", 0, yco-=6, 
2980                          menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2981         
2982         uiDefIconTextBlockBut(block, view3d_pose_armature_showhidemenu, 
2983                                                   NULL, ICON_RIGHTARROW_THIN, 
2984                                                   "Show/Hide Bones", 0, yco-=20, 120, 19, "");
2985
2986         if(curarea->headertype==HEADERTOP) {
2987                 uiBlockSetDirection(block, UI_DOWN);
2988         }
2989         else {
2990                 uiBlockSetDirection(block, UI_TOP);
2991                 uiBlockFlipOrder(block);
2992         }
2993
2994         uiTextBoundsBlock(block, 50);
2995         
2996         return block;
2997 }
2998
2999
3000 static void do_view3d_paintmenu(void *arg, int event)
3001 {
3002         switch(event) {
3003         case 0: /* undo vertex painting */
3004                 vpaint_undo();
3005                 break;
3006         case 1: /* undo weight painting */
3007                 wpaint_undo();
3008                 break;
3009         case 2: /* clear vertex colors */
3010                 clear_vpaint();
3011                 break;
3012         }
3013         allqueue(REDRAWVIEW3D, 0);
3014 }
3015
3016 static uiBlock *view3d_paintmenu(void *arg_unused)
3017 {
3018         uiBlock *block;
3019         short yco= 0, menuwidth=120;
3020         
3021         block= uiNewBlock(&curarea->uiblocks, "view3d_paintmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
3022         uiBlockSetButmFunc(block, do_view3d_paintmenu, NULL);
3023         
3024         if (G.f & G_VERTEXPAINT) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Vertex Painting|U",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
3025         if (G.f & G_WEIGHTPAINT) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Weight Painting|U",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
3026         if (G.f & G_TEXTUREPAINT) uiDefBut(block, SEPR, 0, "",                          0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
3027         
3028         if (G.f & G_VERTEXPAINT) {
3029                 uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
3030                 
3031                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Vertex Colors|Shift K",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
3032         }
3033                 
3034         if(curarea->headertype==HEADERTOP) {
3035                 uiBlockSetDirection(block, UI_DOWN);
3036         }
3037         else {
3038                 uiBlockSetDirection(block, UI_TOP);
3039                 uiBlockFlipOrder(block);
3040         }
3041
3042         uiTextBoundsBlock(block, 50);
3043         return block;
3044 }
3045
3046 static void do_view3d_facesel_propertiesmenu(void *arg, int event)
3047 {
3048         extern TFace *lasttface;
3049         set_lasttface();
3050         
3051         switch(event) {
3052         case 0: /*      textured */
3053                 lasttface->mode ^= TF_TEX;
3054                 break;
3055         case 1: /* tiled*/
3056                 lasttface->mode ^= TF_TILES;
3057                 break;
3058         case 2: /* light */
3059                 lasttface->mode ^= TF_LIGHT;
3060                 break;
3061         case 3: /* invisible */
3062                 lasttface->mode ^= TF_INVISIBLE;
3063                 break;
3064         case 4: /* collision */
3065                 lasttface->mode ^= TF_DYNAMIC;
3066                 break;
3067         case 5: /* shared vertex colors */
3068                 lasttface->mode ^= TF_SHAREDCOL;
3069                 break;
3070         case 6: /* two sided */
3071                 lasttface->mode ^= TF_TWOSIDE;
3072                 break;
3073         case 7: /* use object color */
3074                 lasttface->mode ^= TF_OBCOL;
3075                 break;
3076         case 8: /* halo */
3077                 lasttface->mode ^= TF_BILLBOARD;
3078                 break;
3079         case 9: /* billboard */
3080                 lasttface->mode ^= TF_BILLBOARD2;
3081                 break;
3082         case 10: /* shadow */
3083                 lasttface->mode ^= TF_SHADOW;
3084                 break;
3085         case 11: /* text */
3086                 lasttface->mode ^= TF_BMFONT;
3087                 break;
3088         case 12: /* opaque blend mode */
3089                 lasttface->transp = TF_SOLID;
3090                 break;
3091         case 13: /* additive blend mode */
3092                 lasttface->transp |= TF_ADD;
3093                 break;
3094         case 14: /* alpha blend mode */
3095                 lasttface->transp = TF_ALPHA;
3096                 break;
3097         }
3098         allqueue(REDRAWVIEW3D, 0);
3099         allqueue(REDRAWBUTSEDIT, 0);
3100 }
3101
3102 static uiBlock *view3d_facesel_propertiesmenu(void *arg_unused)
3103 {
3104         extern TFace *lasttface;
3105         uiBlock *block;
3106         short yco = 20, menuwidth = 120;
3107
3108         /* to display ticks/crosses depending on face properties */
3109         set_lasttface();
3110
3111         block= uiNewBlock(&curarea->uiblocks, "view3d_facesel_propertiesmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
3112         uiBlockSetButmFunc(block, do_view3d_facesel_propertiesmenu, NULL);
3113         
3114         if (lasttface->mode & TF_TEX) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Textured",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
3115         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Textured",                                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
3116         
3117         if (lasttface->mode & TF_TILES) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Tiled",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
3118         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Tiled",                                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
3119         
3120         if (lasttface->mode & TF_LIGHT) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Light",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
3121         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Light",                                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
3122         
3123         if (lasttface->mode & TF_INVISIBLE) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Invisible",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
3124         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Invisible",                                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
3125         
3126         if (lasttface->mode & TF_DYNAMIC) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Collision",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
3127         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Collision",                                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
3128         
3129         if (lasttface->mode & TF_SHAREDCOL) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Shared Vertex Colors",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
3130         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Shared Vertex Colors",                                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
3131         
3132         if (lasttface->mode & TF_TWOSIDE) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Two Sided",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
3133         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Two Sided",                                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
3134         
3135         if (lasttface->mode & TF_OBCOL) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Use Object Color",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
3136         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Use Object Color",                                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
3137         
3138         if (lasttface->mode & TF_BILLBOARD) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Halo",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
3139         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Halo",                                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
3140