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