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