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