* Edited and consistent-ified the File->Import menu item labels and fileselect button...
[blender.git] / source / blender / src / header_info.c
1 /**
2  * header_info.c oct-2003
3  *
4  * Functions to draw the "User Preferences" 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 <math.h>
39 #include <stdlib.h>
40 #include <string.h>
41
42 #ifdef HAVE_CONFIG_H
43 #include <config.h>
44 #endif
45
46 #ifdef WIN32
47 #include "BLI_winstuff.h"
48 #endif
49
50 #include "BMF_Api.h"
51 #include "BIF_language.h"
52 #ifdef INTERNATIONAL
53 #include "FTF_Api.h"
54 #endif
55
56 #include "DNA_ID.h"
57 #include "DNA_image_types.h"
58 #include "DNA_object_types.h"
59 #include "DNA_packedFile_types.h"
60 #include "DNA_scene_types.h"
61 #include "DNA_screen_types.h"
62 #include "DNA_space_types.h"
63 #include "DNA_userdef_types.h"
64 #include "DNA_world_types.h"
65
66 #include "BDR_editcurve.h"
67 #include "BDR_editmball.h"
68 #include "BDR_editobject.h"
69
70 #include "BIF_editarmature.h"
71 #include "BIF_editfont.h"
72 #include "BIF_editmesh.h"
73 #include "BIF_gl.h"
74 #include "BIF_interface.h"
75 #include "BIF_language.h"
76 #include "BIF_mainqueue.h"
77 #include "BIF_previewrender.h"
78 #include "BIF_renderwin.h"
79 #include "BIF_resources.h"
80 #include "BIF_screen.h"
81 #include "BIF_space.h"
82 #include "BIF_toets.h"
83 #include "BIF_toolbox.h"
84 #include "BIF_usiblender.h"
85 #include "BIF_drawscene.h"
86
87 #include "BKE_blender.h"
88 #include "BKE_exotic.h"
89 #include "BKE_global.h"
90 #include "BKE_image.h"
91 #include "BKE_library.h"
92 #include "BKE_main.h"
93 #include "BKE_packedFile.h"
94 #include "BKE_scene.h"
95 #include "BKE_world.h"
96
97 #include "BLI_arithb.h"
98 #include "BLI_blenlib.h"
99 #include "BLO_writefile.h"
100
101 #include "BSE_editipo.h"
102 #include "BSE_filesel.h"
103 #include "BSE_headerbuttons.h"
104 #include "BSE_sequence.h"
105
106 #include "IMB_imbuf_types.h"
107
108 #include "MEM_guardedalloc.h"
109
110 #include "BPY_extern.h"
111 #include "BPY_menus.h"
112
113 #include "render.h" // for R - should use BKE_bad_level_calls.h instead?
114
115 #include "blendef.h"
116 #include "mydevice.h"
117
118 extern char versionstr[]; /* from blender.c */
119
120 /*----------------------------------*/
121 /* Progress bar vars and functions: */
122
123 /* strubi shamelessly abused the status line as a progress bar...
124  * feel free to kill him after release */
125
126 static int g_progress_bar = 0;
127 static char *g_progress_info = 0;
128 static float g_done;
129
130 int start_progress_bar(void)
131 {
132         g_progress_bar = 1;
133         return 1;               // we never fail (yet)
134 }
135
136 void end_progress_bar(void)
137 {
138         g_progress_bar = 0;
139 }
140
141 static void update_progress_bar(float done, char *info)
142 {
143         g_done = done;
144         g_progress_info = info;
145 }
146
147 /** Progress bar
148         'done': a value between 0.0 and 1.0, showing progress
149         'info': a info text what is currently being done
150
151         Make sure that the progress bar is always called with:
152         done = 0.0 first
153                 and
154         done = 1.0 last -- or alternatively use:
155
156         start_progressbar();
157         do_stuff_and_callback_progress_bar();
158         end_progressbar();
159 */
160
161 int progress_bar(float done, char *busy_info)
162 {
163         ScrArea *sa;
164         short val; 
165
166         /* User break (ESC) */
167         while (qtest()) {
168                 if (extern_qread(&val) == ESCKEY) 
169                         return 0;
170         }
171         if (done == 0.0) {
172                 start_progress_bar();
173         } else if (done > 0.99) {
174                 end_progress_bar();
175         }
176
177         sa= G.curscreen->areabase.first;
178         while(sa) {
179                 if (sa->spacetype == SPACE_INFO) {
180                         update_progress_bar(done, busy_info);
181
182                         curarea = sa;
183
184                         scrarea_do_headdraw(curarea);
185                         areawinset(curarea->win);
186                         sa->head_swap= WIN_BACK_OK;
187                         screen_swapbuffers();
188                 }
189                 sa = sa->next;
190         }
191         return 1;
192 }
193 /* -- End of progress bar definitions ------- */
194
195 extern char videosc_dir[];      /* exotic.c */
196
197 void write_videoscape_fs()
198 {
199         if(G.obedit) {
200                 error("Can't save Videoscape. Press TAB to leave EditMode");
201         }
202         else {
203                 if(videosc_dir[0]==0) strcpy(videosc_dir, G.sce);
204                 activate_fileselect(FILE_SPECIAL, "Export Videoscape", videosc_dir,
205                                                                                 write_videoscape);
206         }
207 }
208
209 void write_vrml_fs()
210 {
211         if(G.obedit) {
212                 error("Can't save VRML. Press TAB to leave EditMode");
213         }
214         else {
215                 if(videosc_dir[0]==0) strcpy(videosc_dir, G.sce);
216         
217                 activate_fileselect(FILE_SPECIAL, "Export VRML 1.0", videosc_dir, write_vrml);
218         }  
219 }
220
221 void write_dxf_fs()
222 {
223         if(G.obedit) {
224                 error("Can't save DXF. Press TAB to leave EditMode");
225         }
226         else {
227
228                 if(videosc_dir[0]==0) strcpy(videosc_dir, G.sce);
229
230                 activate_fileselect(FILE_SPECIAL, "Export DXF", videosc_dir, write_dxf);        
231         }
232 }
233
234 void write_stl_fs()
235 {
236         if(G.obedit) {
237                 error("Can't save STL. Press TAB to leave EditMode");
238         }
239         else {
240
241                 if(videosc_dir[0]==0) strcpy(videosc_dir, G.sce);
242
243                 activate_fileselect(FILE_SPECIAL, "Export STL", videosc_dir, write_stl);
244         }
245 }
246 /* ------------ */
247
248 int buttons_do_unpack()
249 {
250         int how;
251         char menu[2048];
252         char line[128];
253         int ret_value = RET_OK, count = 0;
254
255         count = countPackedFiles();
256
257         if (count) {
258                 if (count == 1) {
259                         sprintf(menu, "Unpack 1 file%%t");
260                 } else {
261                         sprintf(menu, "Unpack %d files%%t", count);
262                 }
263                 
264                 sprintf(line, "|Use files in current directory (create when necessary)%%x%d", PF_USE_LOCAL);
265                 strcat(menu, line);
266         
267                 sprintf(line, "|Write files to current directory (overwrite existing files)%%x%d", PF_WRITE_LOCAL);
268                 strcat(menu, line);
269         
270                 sprintf(line, "|%%l|Use files in original location (create when necessary)%%x%d", PF_USE_ORIGINAL);
271                 strcat(menu, line);
272         
273                 sprintf(line, "|Write files to original location (overwrite existing files)%%x%d", PF_WRITE_ORIGINAL);
274                 strcat(menu, line);
275         
276                 sprintf(line, "|%%l|Disable AutoPack, keep all packed files %%x%d", PF_KEEP);
277                 strcat(menu, line);
278         
279                 sprintf(line, "|Ask for each file %%x%d", PF_ASK);
280                 strcat(menu, line);
281                 
282                 how = pupmenu(menu);
283                 
284                 if(how != -1) {
285                         if (how != PF_KEEP) {
286                                 unpackAll(how);
287                         }
288                         G.fileflags &= ~G_AUTOPACK;
289                 } else {
290                         ret_value = RET_CANCEL;
291                 }
292         } else {
293                 pupmenu("No packed files. Autopack disabled");
294         }
295         
296         return (ret_value);
297 }
298
299 /* here, because of all creator stuff */
300
301 Scene *copy_scene(Scene *sce, int level)
302 {
303         /* level 0: al objects shared
304          * level 1: al object-data shared
305          * level 2: full copy
306          */
307         Scene *scen;
308         Base *base, *obase;
309
310         /* level 0 */
311         scen= copy_libblock(sce);
312         duplicatelist(&(scen->base), &(sce->base));
313         
314         clear_id_newpoins();
315         
316         id_us_plus((ID *)scen->world);
317         id_us_plus((ID *)scen->set);
318
319         scen->ed= 0;
320         scen->radio= 0;
321
322         obase= sce->base.first;
323         base= scen->base.first;
324         while(base) {
325                 base->object->id.us++;
326                 if(obase==sce->basact) scen->basact= base;
327
328                 obase= obase->next;
329                 base= base->next;
330         }
331
332         if(level==0) return scen;
333
334         /* level 1 */
335         G.scene= scen;
336         single_object_users(0);
337
338         /*      camera */
339         ID_NEW(G.scene->camera);
340
341         /* level 2 */
342         if(level>=2) {
343                 if(scen->world) {
344                         scen->world->id.us--;
345                         scen->world= copy_world(scen->world);
346                 }
347                 single_obdata_users(0);
348                 single_mat_users_expand();
349                 single_tex_users_expand();
350         }
351
352         clear_id_newpoins();
353
354         BPY_copy_scriptlink(&sce->scriptlink);
355
356         // make a private copy of the avicodecdata
357
358         if (sce->r.avicodecdata) {
359
360                 scen->r.avicodecdata = MEM_dupallocN(sce->r.avicodecdata);
361                 scen->r.avicodecdata->lpFormat = MEM_dupallocN(scen->r.avicodecdata->lpFormat);
362                 scen->r.avicodecdata->lpParms = MEM_dupallocN(scen->r.avicodecdata->lpParms);
363         }
364
365         // make a private copy of the qtcodecdata
366
367         if (sce->r.qtcodecdata) {
368                 scen->r.qtcodecdata = MEM_dupallocN(sce->r.qtcodecdata);
369                 scen->r.qtcodecdata->cdParms = MEM_dupallocN(scen->r.qtcodecdata->cdParms);
370         }
371
372         return scen;
373 }
374
375 void do_info_buttons(unsigned short event)
376 {
377         bScreen *sc, *oldscreen;
378         Scene *sce, *sce1;
379         ScrArea *sa;
380         int nr;
381
382         switch(event) {
383
384         case B_INFOSCR:         /* menu select screen */
385
386                 if( G.curscreen->screennr== -2) {
387                         if(curarea->winy <50) {
388                                 sa= closest_bigger_area();
389                                 areawinset(sa->win);
390                         }
391                         activate_databrowse((ID *)G.curscreen, ID_SCR, 0, B_INFOSCR,
392                                                                                         &G.curscreen->screennr, do_info_buttons);
393                         return;
394                 }
395                 if( G.curscreen->screennr < 0) return;
396
397                 sc= G.main->screen.first;
398                 nr= 1;
399                 while(sc) {
400                         if(nr==G.curscreen->screennr) {
401                                 if(is_allowed_to_change_screen(sc)) setscreen(sc);
402                                 else error("Unable to perform function in EditMode");
403                                 break;
404                         }
405                         nr++;
406                         sc= sc->id.next;
407                 }
408                 /* last item: NEW SCREEN */
409                 if(sc==0) {
410                         duplicate_screen();
411                 }
412                 break;
413         case B_INFODELSCR:
414 /*do this event only with buttons, so it can never be called with full-window*/
415
416                 if(G.curscreen->id.prev) sc= G.curscreen->id.prev;
417                 else if(G.curscreen->id.next) sc= G.curscreen->id.next;
418                 else return;
419                 if(okee("Delete current screen")) {
420                         /* find new G.curscreen */
421
422                         oldscreen= G.curscreen;
423                         setscreen(sc);          /* this test if sc has a full */
424                         unlink_screen(oldscreen);
425                         free_libblock(&G.main->screen, oldscreen);
426                 }
427                 scrarea_queue_headredraw(curarea);
428
429                 break;
430         case B_INFOSCE:         /* menu select scene */
431
432                 if( G.obedit) {
433                         error("Unable to perform function in EditMode");
434                         return;
435                 }
436                 if( G.curscreen->scenenr== -2) {
437                         if(curarea->winy <50) {
438                                 sa= closest_bigger_area();
439                                 areawinset(sa->win);
440                         }
441                         activate_databrowse((ID *)G.scene, ID_SCE, 0, B_INFOSCE,
442                                                                                         &G.curscreen->scenenr, do_info_buttons);
443                         return;
444                 }
445                 if( G.curscreen->scenenr < 0) return;
446
447                 sce= G.main->scene.first;
448                 nr= 1;
449                 while(sce) {
450                         if(nr==G.curscreen->scenenr) {
451                                 if(sce!=G.scene) set_scene(sce);
452                                 break;
453                         }
454                         nr++;
455                         sce= sce->id.next;
456                 }
457                 /* last item: NEW SCENE */
458                 if(sce==0) {
459                         nr= pupmenu("Add scene%t|Empty|Link Objects|Link ObData|Full Copy");
460                         if(nr<= 0) return;
461                         if(nr==1) {
462                                 sce= add_scene(G.scene->id.name+2);
463                                 sce->r= G.scene->r;
464 #ifdef _WIN32
465                                 if (sce->r.avicodecdata) {
466                                         sce->r.avicodecdata = MEM_dupallocN(G.scene->r.avicodecdata);
467                                         sce->r.avicodecdata->lpFormat = MEM_dupallocN(G.scene->r.avicodecdata->lpFormat);
468                                         sce->r.avicodecdata->lpParms = MEM_dupallocN(G.scene->r.avicodecdata->lpParms);
469                                 }
470 #endif
471 #ifdef WITH_QUICKTIME
472                                 if (sce->r.qtcodecdata) {
473                                         sce->r.qtcodecdata = MEM_dupallocN(G.scene->r.qtcodecdata);
474                                         sce->r.qtcodecdata->cdParms = MEM_dupallocN(G.scene->r.qtcodecdata->cdParms);
475                                 }
476 #endif
477                         }
478                         else sce= copy_scene(G.scene, nr-2);
479
480                         set_scene(sce);
481                 }
482                 BIF_preview_changed(G.buts);
483
484                 break;
485         case B_INFODELSCE:
486
487                 if(G.scene->id.prev) sce= G.scene->id.prev;
488                 else if(G.scene->id.next) sce= G.scene->id.next;
489                 else return;
490                 if(okee("Delete current scene")) {
491
492                         /* check all sets */
493                         sce1= G.main->scene.first;
494                         while(sce1) {
495                                 if(sce1->set == G.scene) sce1->set= 0;
496                                 sce1= sce1->id.next;
497                         }
498
499                         /* check all sequences */
500                         clear_scene_in_allseqs(G.scene);
501
502                         /* al screens */
503                         sc= G.main->screen.first;
504                         while(sc) {
505                                 if(sc->scene == G.scene) sc->scene= sce;
506                                 sc= sc->id.next;
507                         }
508                         free_libblock(&G.main->scene, G.scene);
509                         set_scene(sce);
510                 }
511
512                 break;
513         }
514 }
515
516 static void check_packAll()
517 {
518         // first check for dirty images
519         Image *ima;
520
521         ima = G.main->image.first;
522         while (ima) {
523                 if (ima->ibuf && (ima->ibuf->userflags &= IB_BITMAPDIRTY)) {
524                         break;
525                 }
526                 ima= ima->id.next;
527                 }
528         
529         if (ima == 0 || okee("Some images are painted on. These changes will be lost. Continue ?")) {
530                 packAll();
531                 G.fileflags |= G_AUTOPACK;
532         }
533 }
534
535 int write_runtime(char *str, char *exename)
536 {
537         char *freestr= NULL;
538         char *ext = 0;
539
540 #ifdef _WIN32
541         ext = ".exe";
542 #endif
543
544 #ifdef __APPLE__
545         ext = ".app";
546 #endif
547         if (ext && (!BLI_testextensie(str, ext))) {
548                 freestr= MEM_mallocN(strlen(str) + strlen(ext) + 1, "write_runtime_check");
549                 strcpy(freestr, str);
550                 strcat(freestr, ext);
551                 str= freestr;
552         }
553
554         if (!BLI_exists(str) || saveover(str))
555                 BLO_write_runtime(str, exename);
556
557         if (freestr)
558                 MEM_freeN(freestr);
559  
560         return 0;
561 }
562
563 static void write_runtime_check_dynamic(char *str) 
564 {
565         write_runtime(str, "blenderdynplayer.exe");
566 }
567
568 static void write_runtime_check(char *str) 
569 {
570         char player[128];
571
572         strcpy(player, "blenderplayer");
573
574 #ifdef _WIN32
575         strcat(player, ".exe");
576 #endif
577
578 #ifdef __APPLE__
579         strcat(player, ".app");
580 #endif
581
582         write_runtime(str, player);
583 }
584 /* end keyed functions */
585
586 /************************** MAIN MENU *****************************/
587 /************************** FILE *****************************/
588
589 void do_info_file_optionsmenu(void *arg, int event)
590 {
591         G.fileflags ^= (1 << event);
592
593         // allqueue(REDRAWINFO, 0);
594 }
595
596 #if GAMEBLENDER == 1
597 static uiBlock *info_file_optionsmenu(void *arg_unused)
598 {
599         uiBlock *block;
600         short yco= 0, xco = 20;
601
602         block= uiNewBlock(&curarea->uiblocks, "runtime_options", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
603         uiBlockSetButmFunc(block, do_info_file_optionsmenu, NULL);
604         uiBlockSetXOfs(block,-40);      // offset to parent button
605         
606         /* flags are case-values */
607         uiDefBut(block, BUTM, 1, "Compress File",       xco, yco-=20, 100, 19, NULL, 0.0, 0.0, 0, G_FILE_COMPRESS_BIT, "Enables file compression");
608 /*
609         uiDefBut(block, BUTM, 1, "Sign File",   xco, yco-=20, 100, 19, NULL, 0.0, 0.0, 0, G_FILE_SIGN_BIT, "Add signature to file");
610         uiDefBut(block, BUTM, 1, "Lock File",   xco, yco-=20, 100, 19, NULL, 0.0, 0.0, 0, G_FILE_LOCK_BIT, "Protect the file from editing by others");
611 */
612         uiTextBoundsBlock(block, 50);
613
614         /* Toggle buttons */
615         
616         yco= 0;
617         xco -= 20;
618         uiBlockSetEmboss(block, UI_EMBOSSM);
619         uiBlockSetButmFunc(block, NULL, NULL);
620         /* flags are defines */
621         uiDefIconButI(block, ICONTOG|BIT|G_FILE_COMPRESS_BIT, 0, ICON_CHECKBOX_DEHLT, xco, yco-=20, 19, 19, &G.fileflags, 0.0, 0.0, 0, 0, "");
622 /*
623         uiDefIconButI(block, ICONTOG|BIT|G_FILE_SIGN_BIT, 0, ICON_CHECKBOX_DEHLT, xco, yco-=20, 19, 19, &G.fileflags, 0.0, 0.0, 0, 0, "");
624         uiDefIconButI(block, ICONTOG|BIT|G_FILE_LOCK_BIT, 0, ICON_CHECKBOX_DEHLT, xco, yco-=20, 19, 19, &G.fileflags, 0.0, 0.0, 0, 0, "");
625 */
626         uiBlockSetDirection(block, UI_RIGHT);
627                 
628         return block;
629 }
630
631 static uiBlock *info_runtime_optionsmenu(void *arg_unused)
632 {
633         uiBlock *block;
634         short yco= 0, xco = 20;
635
636         block= uiNewBlock(&curarea->uiblocks, "add_surfacemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
637         uiBlockSetXOfs(block, -40);  // offset to parent button
638         uiBlockSetEmboss(block, UI_EMBOSSM);
639
640         uiDefBut(block, LABEL, 0, "Size options:",              xco, yco-=20, 114, 19, 0, 0.0, 0.0, 0, 0, "");
641         uiDefButS(block, NUM, 0, "X:",          xco+19, yco-=20, 95, 19,                &G.scene->r.xplay, 10.0, 2000.0, 0, 0, "Displays current X screen/window resolution. Click to change.");
642         uiDefButS(block, NUM, 0, "Y:",          xco+19, yco-=20, 95, 19, &G.scene->r.yplay, 10.0, 2000.0, 0, 0, "Displays current Y screen/window resolution. Click to change.");
643
644         uiDefBut(block, SEPR, 0, "",            xco, yco-=4, 114, 4, NULL, 0.0, 0.0, 0, 0, "");
645
646         uiDefBut(block, LABEL, 0, "Fullscreen options:",                xco, yco-=20, 114, 19, 0, 0.0, 0.0, 0, 0, "");
647         uiDefButS(block, TOG, 0, "Fullscreen", xco + 19, yco-=20, 95, 19, &G.scene->r.fullscreen, 0.0, 0.0, 0, 0, "Starts player in a new fullscreen display");
648         uiDefButS(block, NUM, 0, "Freq:",       xco+19, yco-=20, 95, 19, &G.scene->r.freqplay, 10.0, 120.0, 0, 0, "Displays clock frequency of fullscreen display. Click to change.");
649         uiDefButS(block, NUM, 0, "Bits:",       xco+19, yco-=20, 95, 19, &G.scene->r.depth, 1.0, 32.0, 0, 0, "Displays bit depth of full screen display. Click to change.");
650
651         uiDefBut(block, SEPR, 0, "",            xco, yco-=4, 114, 4, NULL, 0.0, 0.0, 0, 0, "");
652
653         /* stereo settings */
654         /* can't use any definition from the game engine here so hardcode it. Change it here when it changes there!
655          * RAS_IRasterizer has definitions:
656          * RAS_STEREO_NOSTEREO           1
657          * RAS_STEREO_QUADBUFFERED 2
658          * RAS_STEREO_ABOVEBELOW         3
659          * RAS_STEREO_INTERLACED         4       future
660          */
661         uiDefBut(block, LABEL, 0, "Stereo options", xco, yco-=20, 114, 19, 0, 0.0, 0.0, 0, 0, "");
662         uiDefButS(block, ROW, 0, "no stereo", xco+19, yco-=20, 95, 19, &(G.scene->r.stereomode), 6.0, 1.0, 0, 0, "Disables stereo");
663         uiDefButS(block, ROW, 0, "h/w pageflip", xco+19, yco-=20, 95, 19, &(G.scene->r.stereomode), 6.0, 2.0, 0, 0, "Enables hardware pageflip stereo method");
664         uiDefButS(block, ROW, 0, "syncdoubling", xco+19, yco-=20, 95, 19, &(G.scene->r.stereomode), 6.0, 3.0, 0, 0, "Enables syncdoubling stereo method");
665
666         uiBlockSetDirection(block, UI_RIGHT);
667         uiTextBoundsBlock(block, 50);
668                 
669         return block;
670 }
671 #endif
672
673 static void do_info_file_importmenu(void *arg, int event)
674 {
675         extern int BPY_menu_do_python(short menutype, int event);       // BPY_interface.c
676         ScrArea *sa;
677
678         if(curarea->spacetype==SPACE_INFO) {
679                 sa= find_biggest_area_of_type(SPACE_SCRIPT);
680                 if (!sa) sa= closest_bigger_area();
681                 areawinset(sa->win);
682         }
683
684         /* events >=4 are registered bpython scripts */
685         if (event >= 4) BPY_menu_do_python(PYMENU_IMPORT, event - 4);
686
687         else switch(event) {
688                                                                         
689         case 0: /* DXF */
690                 activate_fileselect(FILE_BLENDER, "Import DXF", G.sce, BIF_read_file);
691                 break;
692         case 1: /* VRML 1.0 */
693                 activate_fileselect(FILE_BLENDER, "Import VRML 1.0", G.sce, BIF_read_file);
694                 break;
695         case 2: /* VideoScape */
696                 activate_fileselect(FILE_BLENDER, "Import VideoScape", G.sce, BIF_read_file);
697                 break;
698         case 3: /* STL */
699                 activate_fileselect(FILE_BLENDER, "Import STL", G.sce, BIF_read_file);
700                 break;
701
702         }
703
704         allqueue(REDRAWINFO, 0);
705 }
706
707 static uiBlock *info_file_importmenu(void *arg_unused)
708 {
709         uiBlock *block;
710         short yco = 20, menuwidth = 120;
711         BPyMenu *pym;
712         int i = 0;
713
714         block= uiNewBlock(&curarea->uiblocks, "importmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
715         uiBlockSetButmFunc(block, do_info_file_importmenu, NULL);
716         //uiBlockSetXOfs(block, -50);  // offset to parent button
717         
718         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "VRML 1.0...|Ctrl F2",
719                          0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 0, "");
720         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "DXF...|Shift F2",
721                          0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 1, "");
722         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "VideoScape...|Alt W",
723                          0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 2, "");
724         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "STL...",
725                          0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 3, "");
726
727         uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
728
729         for (pym = BPyMenuTable[PYMENU_IMPORT]; pym; pym = pym->next, i++) {
730                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i+4, pym->tooltip?pym->tooltip:pym->filename);
731         }
732
733         uiBlockSetDirection(block, UI_RIGHT);
734         uiTextBoundsBlock(block, 60);
735
736         return block;
737 }
738
739 static void do_info_file_exportmenu(void *arg, int event)
740 {
741         extern int BPY_menu_do_python(short menutype, int event);       // BPY_interface.c
742         ScrArea *sa;
743
744         if(curarea->spacetype==SPACE_INFO) {
745                 sa= find_biggest_area_of_type(SPACE_SCRIPT);
746                 if (!sa) sa= closest_bigger_area();
747                 areawinset(sa->win);
748         }
749
750         /* events >=4 are registered bpython scripts */
751         if (event >= 4) BPY_menu_do_python(PYMENU_EXPORT, event - 4);
752
753         else switch(event) {
754                                                                         
755         case 0:
756                 write_vrml_fs();
757                 break;
758         case 1:
759                 write_dxf_fs();
760                 break;
761         case 2:
762                 write_videoscape_fs();
763                 break;
764         case 3:
765                 write_stl_fs();
766                 break;
767         }
768         allqueue(REDRAWINFO, 0);
769 }
770
771 static uiBlock *info_file_exportmenu(void *arg_unused)
772 {
773         uiBlock *block;
774         short yco = 20, menuwidth = 120;
775         BPyMenu *pym;
776         int i = 0;
777
778         block= uiNewBlock(&curarea->uiblocks, "exportmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
779         uiBlockSetButmFunc(block, do_info_file_exportmenu, NULL);
780         //uiBlockSetXOfs(block, -50);  // offset to parent button
781
782         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "VRML 1.0...|Ctrl F2",
783                          0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 0, "");
784         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "DXF...|Shift F2",
785                          0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 1, "");
786         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Videoscape...|Alt W",
787                          0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 2, "");
788         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "STL...",
789                          0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 3, "");
790
791         uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
792
793         /* note that we acount for the 3 previous entries with i+3: */
794         for (pym = BPyMenuTable[PYMENU_EXPORT]; pym; pym = pym->next, i++) {
795                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, pym->name, 0, yco-=20, menuwidth, 19, 
796                                  NULL, 0.0, 0.0, 1, i+4, 
797                                  pym->tooltip?pym->tooltip:pym->filename);
798         }
799
800
801         uiBlockSetDirection(block, UI_RIGHT);
802         uiTextBoundsBlock(block, 60);
803
804         return block;
805 }
806
807 static void do_info_filemenu(void *arg, int event)
808 {
809         ScrArea *sa;
810         char dir[FILE_MAXDIR];
811         
812         if(curarea->spacetype==SPACE_INFO) {
813                 sa= closest_bigger_area();
814                 areawinset(sa->win);
815         }
816
817         /* these are no defines, easier this way, the codes are in the function below */
818         switch(event) {
819         case 0:
820                 if (okee("Erase All")) {
821                         if (!BIF_read_homefile())
822                                 error("No file ~/.B.blend");
823                 }
824                 break;
825         case 1: /* open */
826                 activate_fileselect(FILE_BLENDER, "Open", G.sce, BIF_read_file);
827                 break;
828         case 2: /* reopen last */
829                 {
830                         char *s= MEM_mallocN(strlen(G.sce) + 11 + 1, "okee_reload");
831                         strcpy(s, "Open file: ");
832                         strcat(s, G.sce);
833                         if (okee(s)) BIF_read_file(G.sce);
834                         MEM_freeN(s);
835                 }
836                 break;
837         case 3: /* append */
838                 activate_fileselect(FILE_LOADLIB, "Load Library", G.lib, 0);
839                 break;
840         case 4: /* save */
841                 strcpy(dir, G.sce);
842                 untitled(dir);
843                 activate_fileselect(FILE_BLENDER, "Save As", dir, BIF_write_file);
844                 break;
845         case 5:
846                 strcpy(dir, G.sce);
847                 if (untitled(dir)) {
848                         activate_fileselect(FILE_BLENDER, "Save As", dir, BIF_write_file);
849                 } else {
850                         BIF_write_file(dir);
851                         free_filesel_spec(dir);
852                 }
853                 break;
854         case 6: /* save image */
855                 mainqenter(F3KEY, 1);
856                 break;
857 /*
858         case 20:
859                 strcpy(dir, G.sce);
860                 activate_fileselect(FILE_SPECIAL, "INSTALL LICENSE KEY", dir, loadKeyboard);
861                 break;
862         case 21:
863                 SHOW_LICENSE_KEY();
864                 break;
865 */
866         case 22: /* save runtime */
867                 activate_fileselect(FILE_SPECIAL, "Save Runtime", "", write_runtime_check);
868                 break;
869         case 23: /* save dynamic runtime */
870                 activate_fileselect(FILE_SPECIAL, "Save Dynamic Runtime", "", write_runtime_check_dynamic);
871                 break;
872         case 10: /* pack data */
873                 check_packAll();
874                 break;
875         case 11: /* unpack to current dir */
876                 unpackAll(PF_WRITE_LOCAL);
877                 G.fileflags &= ~G_AUTOPACK;
878                 break;
879         case 12: /* unpack data */
880                 if (buttons_do_unpack() != RET_CANCEL) {
881                         /* Clear autopack bit only if user selected one of the unpack options */
882                         G.fileflags &= ~G_AUTOPACK;
883                 }
884                 break;
885         case 13:
886                 exit_usiblender();
887                 break;
888         case 31: /* save default settings */
889                 BIF_write_homefile();
890                 break;
891         }
892         allqueue(REDRAWINFO, 0);
893 }
894 static uiBlock *info_filemenu(void *arg_unused)
895 {
896         uiBlock *block;
897         short yco=0;
898         short menuwidth=120;
899
900         block= uiNewBlock(&curarea->uiblocks, "info_filemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
901         uiBlockSetButmFunc(block, do_info_filemenu, NULL);
902         
903         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "New|Ctrl X",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
904         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Open...|F1",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
905         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reopen Last|Ctrl O",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
906
907         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
908
909         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save|Ctrl W",                            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
910         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save As...|F2",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
911
912         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
913
914         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Image...|F3",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
915 #if GAMEBLENDER == 1
916         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Runtime...",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
917 #ifdef _WIN32
918         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Dynamic Runtime...",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 23, "");
919 #endif
920 #endif
921         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
922
923         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Default Settings|Ctrl U",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 31, "");
924
925         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
926
927         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append...|Shift F1",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
928         uiDefIconTextBlockBut(block, info_file_importmenu, NULL, ICON_RIGHTARROW_THIN, "Import", 0, yco-=20, menuwidth, 19, "");
929         uiDefIconTextBlockBut(block, info_file_exportmenu, NULL, ICON_RIGHTARROW_THIN, "Export", 0, yco-=20, menuwidth, 19, "");
930         
931         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
932
933         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pack Data",                              0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 10, "");
934 //      uiDefBut(block, BUTM, 1, "Unpack Data to current dir",          0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 11, "Removes all packed files from the project and saves them to the current directory");
935         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Unpack Data...",                         0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 12, "");
936
937         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
938
939         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Quit Blender| Q",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
940
941         uiBlockSetDirection(block, UI_DOWN);
942         uiTextBoundsBlock(block, 80);
943
944         return block;
945 }
946
947 /**************************** ADD ******************************/
948
949 void do_info_add_meshmenu(void *arg, int event)
950 {
951
952         switch(event) {         
953                 case 0:
954                         /* Plane */
955                         add_primitiveMesh(0);
956                         break;
957                 case 1:
958                         /* Cube */
959                         add_primitiveMesh(1);
960                         break;
961                 case 2:
962                         /* Circle */
963                         add_primitiveMesh(4);
964                         break;
965                 case 3:
966                         /* UVsphere */
967                         add_primitiveMesh(11);
968                         break;
969                 case 4:
970                         /* IcoSphere */
971                         add_primitiveMesh(12);
972                         break;
973                 case 5:
974                         /* Cylinder */
975                         add_primitiveMesh(5);
976                         break;
977                 case 6:
978                         /* Tube */
979                         add_primitiveMesh(6);
980                         break;
981                 case 7:
982                         /* Cone */
983                         add_primitiveMesh(7);
984                         break;
985                 case 8:
986                         /* Grid */
987                         add_primitiveMesh(10);
988                         break;
989                 case 9:
990                         /* Monkey */
991                         add_primitiveMesh(13);
992                         break;
993                 default:
994                         break;
995         }
996         allqueue(REDRAWINFO, 0);
997 }
998
999 static uiBlock *info_add_meshmenu(void *arg_unused)
1000 {
1001 /*              static short tog=0; */
1002         uiBlock *block;
1003         short yco= 0;
1004         
1005         block= uiNewBlock(&curarea->uiblocks, "add_meshmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1006         uiBlockSetButmFunc(block, do_info_add_meshmenu, NULL);
1007         
1008         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Plane|",                         0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1009         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cube|",                          0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1010         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Circle|",                                0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1011         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "UVsphere",                       0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1012         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "IcoSphere|",                     0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1013         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cylinder|",                      0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "");
1014         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Tube|",                          0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 6, "");
1015         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cone|",                          0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 7, "");
1016         uiDefIconTextBut(block, SEPR, 0, ICON_BLANK1, "",                                       0, yco-=6,      160, 6,  NULL, 0.0, 0.0, 0, 0, "");
1017         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grid|",                          0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 8, "");
1018         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Monkey|",                        0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 9, "");
1019
1020         uiBlockSetDirection(block, UI_RIGHT);
1021         uiTextBoundsBlock(block, 50);
1022                 
1023         return block;
1024 }
1025
1026 void do_info_add_curvemenu(void *arg, int event)
1027 {
1028
1029         switch(event) {         
1030                 case 0:
1031                         /* Bezier Curve */
1032                         add_primitiveCurve(10);
1033                         break;
1034                 case 1:
1035                         /* Bezier Circle */
1036                         add_primitiveCurve(11);
1037                         break;
1038                 case 2:
1039                         /* NURB Curve */
1040                         add_primitiveCurve(40);
1041                         break;
1042                 case 3:
1043                         /* NURB Circle */
1044                         add_primitiveCurve(41);
1045                         break;
1046                 case 4:
1047                         /* Path */
1048                         add_primitiveCurve(46);
1049                         break;
1050                 default:
1051                         break;
1052         }
1053         allqueue(REDRAWINFO, 0);
1054 }
1055
1056 static uiBlock *info_add_curvemenu(void *arg_unused)
1057 {
1058 /*              static short tog=0; */
1059         uiBlock *block;
1060         short yco= 0;
1061         
1062         block= uiNewBlock(&curarea->uiblocks, "add_curvemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1063         uiBlockSetButmFunc(block, do_info_add_curvemenu, NULL);
1064         
1065         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bezier Curve|",  0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1066         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bezier Circle|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1067         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Curve|",           0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1068         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Circle",           0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1069         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Path|",                  0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1070
1071         uiBlockSetDirection(block, UI_RIGHT);
1072         uiTextBoundsBlock(block, 50);
1073                 
1074         return block;
1075 }
1076
1077
1078 void do_info_add_surfacemenu(void *arg, int event)
1079 {
1080
1081         switch(event) {         
1082                 case 0:
1083                         /* Curve */
1084                         add_primitiveNurb(0);
1085                         break;
1086                 case 1:
1087                         /* Circle */
1088                         add_primitiveNurb(1);
1089                         break;
1090                 case 2:
1091                         /* Surface */
1092                         add_primitiveNurb(2);
1093                         break;
1094                 case 3:
1095                         /* Tube */
1096                         add_primitiveNurb(3);
1097                         break;
1098                 case 4:
1099                         /* Sphere */
1100                         add_primitiveNurb(4);
1101                         break;
1102                 case 5:
1103                         /* Donut */
1104                         add_primitiveNurb(5);
1105                         break;
1106                 default:
1107                         break;
1108         }
1109         allqueue(REDRAWINFO, 0);
1110 }
1111
1112 static uiBlock *info_add_surfacemenu(void *arg_unused)
1113 {
1114 /*              static short tog=0; */
1115         uiBlock *block;
1116         short yco= 0;
1117         
1118         block= uiNewBlock(&curarea->uiblocks, "add_surfacemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1119         uiBlockSetButmFunc(block, do_info_add_surfacemenu, NULL);
1120         
1121         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Curve|",           0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1122         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Circle|",          0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1123         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Surface|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1124         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Tube",             0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1125         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Sphere|",          0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1126         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Donut|",           0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "");
1127         uiBlockSetDirection(block, UI_RIGHT);
1128         uiTextBoundsBlock(block, 50);
1129                 
1130         return block;
1131 }
1132
1133 void do_info_add_metamenu(void *arg, int event)
1134 {
1135
1136         switch(event) {         
1137                 case 0:
1138                         /* Ball */
1139                         add_primitiveMball(1);
1140                         break;
1141                 case 1:
1142                         /* Tube */
1143                         add_primitiveMball(2);
1144                         break;
1145                 case 2:
1146                         /* Plane */
1147                         add_primitiveMball(3);
1148                         break;
1149                 case 3:
1150                         /* Elipsoid */
1151                         add_primitiveMball(4);
1152                         break;
1153                 case 4:
1154                         /* Cube */
1155                         add_primitiveMball(5);
1156                         break;
1157                 default:
1158                         break;
1159         }
1160         allqueue(REDRAWINFO, 0);
1161 }
1162
1163
1164 static uiBlock *info_add_metamenu(void *arg_unused)
1165 {
1166 /*              static short tog=0; */
1167         uiBlock *block;
1168         short xco= 0;
1169         
1170         block= uiNewBlock(&curarea->uiblocks, "add_metamenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1171         uiBlockSetButmFunc(block, do_info_add_metamenu, NULL);
1172         
1173         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,"Meta Ball|",              0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1174         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Tube|",             0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1175         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Plane|",            0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1176         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Ellipsoid|",        0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1177         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Cube|",             0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1178
1179         uiBlockSetDirection(block, UI_RIGHT);
1180         uiTextBoundsBlock(block, 50);
1181                 
1182         return block;
1183 }
1184
1185
1186 void do_info_addmenu(void *arg, int event)
1187 {
1188         switch(event) {         
1189                 case 0:
1190                         /* Mesh */
1191                         break;
1192                 case 1:
1193                         /* Curve */
1194                         break;
1195                 case 2:
1196                         /* Surface */
1197                         break;
1198                 case 3:
1199                         /* Metaball */
1200                         break;
1201                 case 4:
1202                         /* Text (argument is discarded) */
1203                         add_primitiveFont(event);
1204                         break;
1205                 case 5:
1206                         /* Empty */
1207                         add_object_draw(OB_EMPTY);
1208                         break;
1209                 case 6:
1210                         /* Camera */
1211                         add_object_draw(OB_CAMERA);
1212                         break;
1213                 case 7:
1214                         /* Lamp */
1215                         add_object_draw(OB_LAMP);
1216                         break;
1217                 case 8:
1218                         /* Armature */
1219                         add_primitiveArmature(OB_ARMATURE);
1220                         break;
1221                 case 9:
1222                         /* Lattice */
1223                         add_object_draw(OB_LATTICE);
1224                         break;
1225                 default:
1226                         break;
1227         }
1228         allqueue(REDRAWINFO, 0);
1229 }
1230
1231
1232 static uiBlock *info_addmenu(void *arg_unused)
1233 {
1234 /*              static short tog=0; */
1235         uiBlock *block;
1236         short yco= 0;
1237
1238         block= uiNewBlock(&curarea->uiblocks, "addmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1239         uiBlockSetButmFunc(block, do_info_addmenu, NULL);
1240         
1241         uiDefIconTextBlockBut(block, info_add_meshmenu, NULL, ICON_RIGHTARROW_THIN, "Mesh", 0, yco-=20, 120, 19, "");
1242         uiDefIconTextBlockBut(block, info_add_curvemenu, NULL, ICON_RIGHTARROW_THIN, "Curve", 0, yco-=20, 120, 19, "");
1243         uiDefIconTextBlockBut(block, info_add_surfacemenu, NULL, ICON_RIGHTARROW_THIN, "Surface", 0, yco-=20, 120, 19, "");
1244         uiDefIconTextBlockBut(block, info_add_metamenu, NULL, ICON_RIGHTARROW_THIN, "Meta", 0, yco-=20, 120, 19, "");
1245         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Text",                           0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 4, "");
1246         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Empty",                          0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 5, "");
1247         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
1248         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera",                         0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 6, "");
1249         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lamp",                           0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 7, "");
1250         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
1251         /* armature needs 3d window to draw */
1252         //uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Armature",                     0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 8, "");
1253         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lattice",                        0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 9, "");
1254
1255         uiBlockSetDirection(block, UI_DOWN);
1256         uiTextBoundsBlock(block, 80);
1257                 
1258         return block;
1259 }
1260
1261 /************************** GAME *****************************/
1262
1263 static void do_info_gamemenu(void *arg, int event)
1264 {
1265         switch (event) {
1266         case G_FILE_ENABLE_ALL_FRAMES_BIT:
1267         case G_FILE_SHOW_FRAMERATE_BIT:
1268         case G_FILE_SHOW_DEBUG_PROPS_BIT:
1269         case G_FILE_AUTOPLAY_BIT:
1270                 G.fileflags ^= (1 << event);
1271                 break;
1272         default:
1273                 ; /* ignore the rest */
1274         }
1275 }
1276
1277 static uiBlock *info_gamemenu(void *arg_unused)
1278 {
1279 /*              static short tog=0; */
1280         uiBlock *block;
1281         short yco= 0;
1282         short menuwidth=120;
1283         
1284         block= uiNewBlock(&curarea->uiblocks, "gamemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1285         uiBlockSetButmFunc(block, do_info_gamemenu, NULL);
1286         
1287         uiDefIconTextBut(block, BUTM, B_STARTGAME, ICON_BLANK1, "Start Game|P",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
1288         
1289         uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 1, 0, "");
1290
1291
1292         if(G.fileflags & (1 << G_FILE_ENABLE_ALL_FRAMES_BIT)) {
1293                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Enable All Frames",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_ENABLE_ALL_FRAMES_BIT, "");
1294         } else {
1295                                         uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Enable All Frames",       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_ENABLE_ALL_FRAMES_BIT, "");
1296         }
1297
1298         if(G.fileflags & (1 << G_FILE_SHOW_FRAMERATE_BIT)) {
1299                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Show Framerate and Profile",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_SHOW_FRAMERATE_BIT, "");
1300         } else {
1301                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Show Framerate and Profile",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_SHOW_FRAMERATE_BIT, "");
1302         }
1303
1304         if(G.fileflags & (1 << G_FILE_SHOW_DEBUG_PROPS_BIT)) {
1305                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Show Debug Properties",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_SHOW_DEBUG_PROPS_BIT, "");
1306         } else {
1307                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Show Debug Properties",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_SHOW_DEBUG_PROPS_BIT, "");
1308         }
1309         
1310         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 1, 0, "");
1311
1312         if(G.fileflags & (1 << G_FILE_AUTOPLAY_BIT)) {
1313                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Autostart",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_AUTOPLAY_BIT, "");
1314         } else {
1315                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Autostart",       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_AUTOPLAY_BIT, "");
1316         }
1317
1318         uiBlockSetDirection(block, UI_DOWN);
1319         uiTextBoundsBlock(block, 50);
1320         
1321         return block;
1322 }
1323 /************************** TIMELINE *****************************/
1324
1325 static void do_info_timelinemenu(void *arg, int event)
1326 {
1327         /* needed to check for valid selected objects */
1328         Base *base=NULL;
1329         Object *ob=NULL;
1330         //char file[FILE_MAXDIR+FILE_MAXFILE];
1331
1332         base= BASACT;
1333         if (base) ob= base->object;
1334
1335         switch(event) {
1336         case 1:
1337                 /* Show Keyframes */
1338                 if (!ob) error("Select an object before showing its keyframes");
1339                 else set_ob_ipoflags();
1340                 break;
1341         case 2:
1342                 /* Show and select Keyframes */
1343                 if (!ob) error("Select an object before showing and selecting its keyframes");
1344                 else select_select_keys();
1345                         break;
1346                 case 3:
1347                 /* select next keyframe */
1348                 if (!ob) error("Select an object before selecting its next keyframe");
1349                 else nextkey_obipo(1);
1350                         break;
1351                 case 4:
1352                 /* select previous keyframe */
1353                 if (!ob) error("Select an object before selecting its previous keyframe");
1354                 else nextkey_obipo(-1);
1355                 break;
1356                 case 5:
1357                 /* next keyframe */
1358                 if (!ob) error("Select an object before going to its next keyframe");
1359                 else movekey_obipo(1);
1360                         break;
1361                 case 6:
1362                 /* previous keyframe */
1363                 if (!ob) error("Select an object before going to its previous keyframe");
1364                 else movekey_obipo(-1);
1365                 break;
1366         case 7:
1367                 /* next frame */
1368                 CFRA++;
1369                 update_for_newframe();
1370                 break;
1371                 case 8:
1372                 /* previous frame */
1373                 CFRA--;
1374                 if(CFRA<1) CFRA=1;
1375                 update_for_newframe();
1376                 break;
1377         case 9:
1378                 /* forward 10 frames */
1379                 CFRA+= 10;
1380                 update_for_newframe();
1381                 break;
1382         case 10:
1383                 /* back 10 frames */
1384                 CFRA-= 10;
1385                 if(CFRA<1) CFRA=1;
1386                 update_for_newframe();
1387                 break;
1388         case 11:
1389                 /* end frame */
1390                 CFRA= EFRA;
1391                 update_for_newframe();
1392                 break;
1393         case 12:
1394                 /* start frame */
1395                 CFRA= SFRA;
1396                 update_for_newframe();
1397                 break;
1398         }
1399         allqueue(REDRAWINFO, 0);
1400 }
1401
1402 static uiBlock *info_timelinemenu(void *arg_unused)
1403 {
1404 /*              static short tog=0; */
1405         uiBlock *block;
1406         short yco= 0;
1407         short menuwidth=120;
1408
1409         block= uiNewBlock(&curarea->uiblocks, "timelinemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1410         uiBlockSetButmFunc(block, do_info_timelinemenu, NULL);
1411         
1412         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Keyframes|K",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1413         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show and Select Keyframes|Shift K",0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1414         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Next Keyframe|PageUp",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1415         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Previous Keyframe|PageDown",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1416
1417         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1418
1419         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Next Keyframe|Ctrl PageUp",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1420         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Previous Keyframe|Ctrl PageDown",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1421
1422         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1423
1424         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Next Frame|RightArrow",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1425         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Previous Frame|LeftArrow",       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
1426         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Forward 10 Frames|UpArrow",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
1427         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Back 10 Frames|DownArrow",       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
1428
1429         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1430
1431         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "End Frame|Shift RightArrow",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
1432         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Start Frame|Shift LeftArrow",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
1433
1434         uiBlockSetDirection(block, UI_DOWN);
1435         uiTextBoundsBlock(block, 80);
1436
1437         return block;
1438 }
1439
1440 /************************** RENDER *****************************/
1441
1442 /* copied from buttons.c. .. probably not such a good idea!? */
1443 static void run_playanim(char *file)
1444 {
1445         extern char bprogname[];        /* usiblender.c */
1446         char str[FILE_MAXDIR+FILE_MAXFILE];
1447         int pos[2], size[2];
1448
1449         calc_renderwin_rectangle(R.winpos, pos, size);
1450
1451         sprintf(str, "%s -a -p %d %d \"%s\"", bprogname, pos[0], pos[1], file);
1452         system(str);
1453 }
1454
1455 static void do_info_rendermenu(void *arg, int event)
1456 {
1457         char file[FILE_MAXDIR+FILE_MAXFILE];
1458
1459         extern void makeavistring(char *string);
1460         extern void makeqtstring (char *string);
1461
1462         switch(event) {
1463                 
1464         case 0:
1465                 BIF_do_render(0);
1466                 break;
1467         case 1:
1468                 BIF_do_render(1);
1469                 break;
1470
1471                 /* note: dont use select_area() for setting active areas for opengl render */
1472                 /* its hackish and instable... code here was removed */
1473         
1474         case 4:
1475                 BIF_toggle_render_display();
1476                 break;
1477         case 5:
1478 #ifdef WITH_QUICKTIME
1479                 if(G.scene->r.imtype == R_QUICKTIME)
1480                         makeqtstring(file);
1481                 else
1482 #endif
1483                         makeavistring(file);
1484                 if(BLI_exist(file)) {
1485                         run_playanim(file);
1486                 }
1487                 else {
1488                         makepicstring(file, G.scene->r.sfra);
1489                         if(BLI_exist(file)) {
1490                                 run_playanim(file);
1491                         }
1492                         else error("Can't find image: %s", file);
1493                 }
1494                 break;
1495         case 6:
1496                 /* dodgy hack turning on SHIFT key to do a proper render border select
1497                 set_render_border(); only works when 3d window active
1498                 
1499                 This code copied from toolbox.c, only works when 3d window is cameraview */
1500
1501                 if(select_area(SPACE_VIEW3D)) {
1502                         mainqenter(LEFTSHIFTKEY, 1);
1503                         mainqenter(BKEY, 1);
1504                         mainqenter(BKEY, 0);
1505                         mainqenter(EXECUTE, 1);
1506                         mainqenter(LEFTSHIFTKEY, 0);
1507                 }
1508
1509                 break;
1510
1511                 case 7:
1512                 extern_set_butspace(F10KEY);
1513                 break;
1514         }
1515         allqueue(REDRAWINFO, 0);
1516 }
1517
1518 static uiBlock *info_rendermenu(void *arg_unused)
1519 {
1520 /*              static short tog=0; */
1521         uiBlock *block;
1522         short yco= 0;
1523         short menuwidth=120;
1524         
1525         block= uiNewBlock(&curarea->uiblocks, "rendermenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1526         uiBlockSetButmFunc(block, do_info_rendermenu, NULL);
1527         
1528         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Current Frame|F12",       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1529         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Animation",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1530
1531         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1532
1533         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Render Buffer|F11",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1534         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Rendered Animation",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1535
1536         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1537
1538         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Render Border|Shift B",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1539
1540         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1541
1542         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Settings|F10",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1543
1544         uiBlockSetDirection(block, UI_DOWN);
1545         uiTextBoundsBlock(block, 80);
1546
1547         return block;
1548 }
1549
1550 /************************** HELP *****************************/
1551
1552 static void do_info_help_websitesmenu(void *arg, int event)
1553 {
1554         /* these are no defines, easier this way, the codes are in the function below */
1555         switch(event) {
1556         case 0: /*      */
1557
1558                 break;
1559                 }
1560         allqueue(REDRAWVIEW3D, 0);
1561 }
1562
1563
1564 static uiBlock *info_help_websitesmenu(void *arg_unused)
1565 {
1566         uiBlock *block;
1567         short yco = 20, menuwidth = 120;
1568
1569         block= uiNewBlock(&curarea->uiblocks, "info_help_websitesmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1570         uiBlockSetButmFunc(block, do_info_help_websitesmenu, NULL);
1571         
1572         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Blender Website *",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1573         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Blender E-shop *",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1574         
1575         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1576         
1577         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Development Community *",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1578         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "User Community *",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1579         
1580         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1581         
1582         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "...? *",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1583         
1584         uiBlockSetDirection(block, UI_RIGHT);
1585         uiTextBoundsBlock(block, 60);
1586                 
1587         return block;
1588 }
1589
1590
1591 static void do_info_helpmenu(void *arg, int event)
1592 {
1593         switch(event) {
1594                 
1595         case 0:
1596                 break;
1597         case 1:
1598                 /* dodgy hack turning on CTRL ALT SHIFT key to do a benchmark 
1599                  *      rather than copying lines and lines of code from toets.c :( 
1600                  */
1601
1602                 if(select_area(SPACE_VIEW3D)) {
1603                         mainqenter(LEFTSHIFTKEY, 1);
1604                         mainqenter(LEFTCTRLKEY, 1);
1605                         mainqenter(LEFTALTKEY, 1);
1606                         mainqenter(TKEY, 1);
1607                         mainqenter(TKEY, 0);
1608                         mainqenter(EXECUTE, 1);
1609                         mainqenter(LEFTSHIFTKEY, 0);
1610                         mainqenter(LEFTCTRLKEY, 0);
1611                         mainqenter(LEFTALTKEY, 0);
1612                 }
1613                 break;
1614         }
1615         allqueue(REDRAWINFO, 0);
1616 }
1617
1618 static uiBlock *info_helpmenu(void *arg_unused)
1619 {
1620 /*              static short tog=0; */
1621         uiBlock *block;
1622         short yco= 0;
1623         short menuwidth=120;
1624         
1625         block= uiNewBlock(&curarea->uiblocks, "info_helpmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1626         uiBlockSetButmFunc(block, do_info_helpmenu, NULL);
1627         
1628         uiDefIconTextBut(block, BUTM, B_SHOWSPLASH, ICON_BLANK1, "About Blender...",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1629         
1630         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1631         
1632         /*      uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "-- Placeholders only --",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1633         
1634         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1635         
1636         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Tutorials *",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1637         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "User Manual *",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1638         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Python Scripting Reference *",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1639         
1640         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1641         
1642         uiDefIconTextBlockBut(block, info_help_websitesmenu, NULL, ICON_RIGHTARROW_THIN, "Websites", 0, yco-=20, 120, 19, "");
1643
1644         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1645 */
1646         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Benchmark",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1647         
1648 /*      uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1649
1650         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Release Notes *",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1651 */
1652         uiBlockSetDirection(block, UI_DOWN);
1653         uiTextBoundsBlock(block, 80);
1654
1655         return block;
1656 }
1657
1658 /************************** END MAIN MENU *****************************/
1659
1660 static void info_text(int x, int y)
1661 {
1662         Object *ob;
1663         extern float hashvectf[];
1664         extern int mem_in_use;
1665         unsigned int swatch_color;
1666         float fac1, fac2, fac3;
1667         char infostr[300];
1668         char *headerstr;
1669         int hsize;
1670
1671
1672         if(G.obedit) {
1673                 sprintf(infostr,"Ve:%d-%d | Fa:%d-%d | Mem:%.2fM ",
1674                 G.totvertsel, G.totvert, G.totfacesel, G.totface,
1675                 (mem_in_use>>10)/1024.0);
1676         }
1677         else {
1678                 sprintf(infostr,"Ve:%d | Fa:%d | Ob:%d-%d | La:%d | Mem:%.2fM | ",
1679                         G.totvert, G.totface, G.totobj, G.totobjsel, G.totlamp,  (mem_in_use>>10)/1024.0);
1680         }
1681         ob= OBACT;
1682         if(ob) {
1683                 strcat(infostr, ob->id.name+2);
1684         }
1685
1686         if      (g_progress_bar) {
1687                 hsize = 4 + (138.0 * g_done);
1688                 fac1 = 0.5 * g_done; // do some rainbow colours on progress
1689                 fac2 = 1.0;
1690                 fac3 = 0.9;
1691         } else {
1692                 hsize = 142;
1693                 /* promise! Never change these lines again! (zr & ton did!) */
1694                 fac1= fabs(hashvectf[ 2*G.version+4]);
1695                 fac2= 0.5+0.1*hashvectf[ G.version+3];
1696                 fac3= 0.7;
1697         }
1698
1699         if (g_progress_bar && g_progress_info) {
1700                 headerstr= g_progress_info;
1701         } else {
1702                 headerstr= versionstr; 
1703         }
1704         
1705         swatch_color= hsv_to_cpack(fac1, fac2, fac3);
1706
1707         cpack( swatch_color );
1708         glRecti(x-24,  y-6,  x-22+hsize,        y+14);
1709
1710         glColor3ub(0, 0, 0);
1711
1712         glRasterPos2i(x, y);
1713
1714         BIF_DrawString(G.font, headerstr, (U.transopts & USER_TR_MENUS));
1715                 
1716         glRasterPos2i(x+122,    y);
1717
1718         BIF_DrawString(G.font, infostr, (U.transopts & USER_TR_MENUS));
1719 }
1720
1721 void info_buttons(void)
1722 {
1723         uiBlock *block;
1724         short xco= 42;
1725         int xmax;
1726
1727         block= uiNewBlock(&curarea->uiblocks, "header info", UI_EMBOSSN, UI_HELV, curarea->headwin);
1728
1729         if(area_is_active_area(curarea)) uiBlockSetCol(block, TH_HEADER);
1730         else uiBlockSetCol(block, TH_HEADERDESEL);
1731         
1732         if(curarea->flag & HEADER_NO_PULLDOWN) {
1733                 uiDefIconButS(block, TOG|BIT|0, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_RIGHT,
1734                                 xco,2,XIC,YIC-2,
1735                                 &(curarea->flag), 0, 0, 0, 0, "Enables display of pulldown menus");
1736         } else {
1737                 uiDefIconButS(block, TOG|BIT|0, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_DOWN,
1738                                 xco,2,XIC,YIC-2,
1739                                 &(curarea->flag), 0, 0, 0, 0, "Hides pulldown menus");
1740         }
1741         xco+=XIC;
1742
1743         if((curarea->flag & HEADER_NO_PULLDOWN)==0) {
1744         
1745                 uiBlockSetEmboss(block, UI_EMBOSSP);
1746
1747                 /* the 'xmax - 3' rather than xmax is to prevent some weird flickering where the highlighted
1748                  * menu is drawn wider than it should be. The ypos of -1 is to make it properly fill the
1749                  * height of the header */
1750                 xmax= GetButStringLength("File");
1751                 uiDefBlockBut(block, info_filemenu, NULL, "File",       xco, -1, xmax-3, 22, "");
1752                 xco+= xmax;
1753
1754                 xmax= GetButStringLength("Add");
1755                 uiDefBlockBut(block, info_addmenu, NULL, "Add", xco, -1, xmax-3, 22, "");
1756                 xco+= xmax;
1757
1758                 xmax= GetButStringLength("Timeline");
1759                 uiDefBlockBut(block, info_timelinemenu, NULL, "Timeline",       xco, -1, xmax-3, 22, "");
1760                 xco+= xmax;
1761
1762                 xmax= GetButStringLength("Game");
1763                 uiDefBlockBut(block, info_gamemenu, NULL, "Game",       xco, -1, xmax-3, 22, "");
1764                 xco+= xmax;
1765
1766                 xmax= GetButStringLength("Render");
1767                 uiDefBlockBut(block, info_rendermenu, NULL, "Render",   xco, -1, xmax-3, 22, "");
1768                 xco+= xmax;
1769
1770                 xmax= GetButStringLength("Help");
1771                 uiDefBlockBut(block, info_helpmenu, NULL, "Help",       xco, -1, xmax-3, 22, "");
1772                 xco+= xmax;
1773
1774         }
1775
1776         /* pack icon indicates a packed file */
1777         
1778         if (G.fileflags & G_AUTOPACK) {
1779                 uiBlockSetEmboss(block, UI_EMBOSSN);
1780                 uiDefIconBut(block, LABEL, 0, ICON_PACKAGE, xco, 0, XIC, YIC, &G.fileflags, 0.0, 0.0, 0, 0, "Indicates this is a Packed file. See File menu.");
1781                 xco += XIC;
1782         }
1783
1784         if (curarea->full == 0) {
1785                 curarea->butspacetype= SPACE_INFO;
1786                 uiBlockSetEmboss(block, UI_EMBOSS);
1787                 uiDefIconTextButC(block, ICONTEXTROW,B_NEWSPACE, ICON_VIEW3D, windowtype_pup(), 8,0,XIC+10,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Displays Current Window Type. Click for menu of available types.");
1788                 
1789                 /* STD SCREEN BUTTONS */
1790                 xco= std_libbuttons(block, xco, 0, 0, NULL, B_INFOSCR, (ID *)G.curscreen, 0, &G.curscreen->screennr, 1, 1, B_INFODELSCR, 0, 0);
1791                 
1792                 xco +=8;
1793         
1794                 /* STD SCENE BUTTONS */
1795                 xco= std_libbuttons(block, xco, 0, 0, NULL, B_INFOSCE, (ID *)G.scene, 0, &G.curscreen->scenenr, 1, 1, B_INFODELSCE, 0, 0);
1796         }
1797         else xco= 430;
1798         
1799         info_text(xco+24, 6);
1800         
1801         uiBlockSetEmboss(block, UI_EMBOSSN);
1802         uiDefIconBut(block, BUT, B_SHOWSPLASH, ICON_BLENDER, xco+2, 0,XIC,YIC, 0, 0, 0, 0, 0, "Click to display Splash Screen");
1803
1804         /* always do as last */
1805         curarea->headbutlen= xco+2*XIC;
1806
1807 #ifdef _WIN32   // FULLSCREEN
1808         if(U.uiflag & USER_FLIPFULLSCREEN) {
1809                 uiDefIconBut(block, BUT, B_FLIPFULLSCREEN, ICON_WINDOW_WINDOW,
1810                                 (short)(curarea->winx-XIC-5), 0,XIC,YIC,
1811                                 0, 0, 0, 0, 0, "Toggles Blender to fullscreen mode");/* dir             */
1812         } else {
1813                 uiDefIconBut(block, BUT, B_FLIPFULLSCREEN, ICON_WINDOW_FULLSCREEN,
1814                                 (short)(curarea->winx-XIC-5), 0,XIC,YIC,
1815                                 0, 0, 0, 0, 0, "Toggles Blender to fullscreen mode");/* dir             */
1816         }
1817 #endif
1818         
1819         uiDrawBlock(block);
1820 }