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