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