2 * header_info.c oct-2003
4 * Functions to draw the "User Preferences" window header
5 * and handle user events sent to it.
8 * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2
13 * of the License, or (at your option) any later version. The Blender
14 * Foundation also sells licenses for use in proprietary software under
15 * the Blender License. See http://www.blender.org/BL/ for information
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software Foundation,
25 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
28 * All rights reserved.
30 * The Original Code is: all of this file.
32 * Contributor(s): none yet.
34 * ***** END GPL/BL DUAL LICENSE BLOCK *****
45 #include "DNA_group_types.h"
47 #include "DNA_image_types.h"
48 #include "DNA_lamp_types.h"
49 #include "DNA_object_types.h"
50 #include "DNA_packedFile_types.h"
51 #include "DNA_scene_types.h"
52 #include "DNA_screen_types.h"
53 #include "DNA_space_types.h"
54 #include "DNA_userdef_types.h"
55 #include "DNA_world_types.h"
57 #include "BDR_editcurve.h"
58 #include "BDR_editmball.h"
59 #include "BDR_editobject.h"
60 #include "BDR_editface.h"
61 #include "BDR_vpaint.h"
63 #include "BIF_editarmature.h"
64 #include "BIF_editfont.h"
65 #include "BIF_editmesh.h"
67 #include "BIF_interface.h"
68 #include "BIF_language.h"
69 #include "BIF_mainqueue.h"
70 #include "BIF_meshtools.h"
71 #include "BIF_previewrender.h"
72 #include "BIF_renderwin.h"
73 #include "BIF_resources.h"
74 #include "BIF_screen.h"
75 #include "BIF_space.h"
76 #include "BIF_toets.h"
77 #include "BIF_toolbox.h"
78 #include "BIF_usiblender.h"
79 #include "BIF_writeimage.h"
80 #include "BIF_drawscene.h"
82 #include "BIF_verse.h"
85 #include "BKE_blender.h"
86 #include "BKE_depsgraph.h"
87 #include "BKE_exotic.h"
88 #include "BKE_global.h"
89 #include "BKE_image.h"
90 #include "BKE_library.h"
93 #include "BKE_packedFile.h"
94 #include "BKE_scene.h"
95 #include "BKE_world.h"
98 #include "BKE_verse.h"
101 #include "BLI_arithb.h"
102 #include "BLI_blenlib.h"
103 #include "BLI_bpath.h"
104 #include "BLO_writefile.h"
106 #include "BSE_editipo.h"
107 #include "BSE_filesel.h"
108 #include "BIF_imasel.h"
109 #include "BSE_headerbuttons.h"
110 #include "BSE_node.h"
111 #include "BSE_sequence.h"
112 #include "BSE_edit.h"
114 #include "IMB_imbuf_types.h"
116 #include "MEM_guardedalloc.h"
118 #include "BPY_extern.h"
119 #include "BPY_menus.h"
122 #include "interface.h"
123 #include "mydevice.h"
125 extern char versionstr[]; /* from blender.c */
127 /*----------------------------------*/
128 /* Progress bar vars and functions: */
130 /* strubi shamelessly abused the status line as a progress bar...
131 * feel free to kill him after release */
133 static int g_progress_bar = 0;
134 static char *g_progress_info = 0;
137 int start_progress_bar(void)
140 return 1; // we never fail (yet)
143 void end_progress_bar(void)
148 static void update_progress_bar(float done, char *info)
151 g_progress_info = info;
155 'done': a value between 0.0 and 1.0, showing progress
156 'info': a info text what is currently being done
158 Make sure that the progress bar is always called with:
161 done = 1.0 last -- or alternatively use:
164 do_stuff_and_callback_progress_bar();
168 int progress_bar(float done, char *busy_info)
173 /* User break (ESC) */
175 if (extern_qread(&val) == ESCKEY)
179 start_progress_bar();
180 } else if (done > 0.99) {
184 sa= G.curscreen->areabase.first;
186 if (sa->spacetype == SPACE_INFO) {
187 update_progress_bar(done, busy_info);
191 scrarea_do_headdraw(curarea);
192 areawinset(curarea->win);
193 sa->head_swap= WIN_BACK_OK;
194 screen_swapbuffers();
200 /* -- End of progress bar definitions ------- */
202 extern char temp_dir[]; /* XXXXX BAD BAD BAD from exotic.c */
207 error("Can't save VRML. Press TAB to leave EditMode");
210 if(temp_dir[0]==0) strcpy(temp_dir, G.sce);
212 activate_fileselect(FILE_SPECIAL, "Export VRML 1.0", temp_dir, write_vrml);
219 error("Can't save DXF. Press TAB to leave EditMode");
223 if(temp_dir[0]==0) strcpy(temp_dir, G.sce);
225 activate_fileselect(FILE_SPECIAL, "Export DXF", temp_dir, write_dxf);
232 error("Can't save STL. Press TAB to leave EditMode");
236 if(temp_dir[0]==0) strcpy(temp_dir, G.sce);
238 activate_fileselect(FILE_SPECIAL, "Export STL", temp_dir, write_stl);
243 int buttons_do_unpack()
248 int ret_value = RET_OK, count = 0;
250 count = countPackedFiles();
253 pupmenu("No packed files. Autopack disabled");
257 line += sprintf(line, "Unpack 1 file%%t");
259 line += sprintf(line, "Unpack %d files%%t", count);
261 line += sprintf(line, "|Use files in current directory (create when necessary)%%x%d", PF_USE_LOCAL);
262 line += sprintf(line, "|Write files to current directory (overwrite existing files)%%x%d", PF_WRITE_LOCAL);
263 line += sprintf(line, "|%%l|Use files in original location (create when necessary)%%x%d", PF_USE_ORIGINAL);
264 line += sprintf(line, "|Write files to original location (overwrite existing files)%%x%d", PF_WRITE_ORIGINAL);
265 line += sprintf(line, "|%%l|Disable AutoPack, keep all packed files %%x%d", PF_KEEP);
266 line += sprintf(line, "|Ask for each file %%x%d", PF_ASK);
271 ret_value = RET_CANCEL;
273 if (how != PF_KEEP) unpackAll(how);
274 G.fileflags &= ~G_AUTOPACK;
280 /* here, because of all creator stuff */
282 Scene *copy_scene(Scene *sce, int level)
284 /* level 0: al objects shared
285 * level 1: al object-data shared
292 scen= copy_libblock(sce);
293 duplicatelist(&(scen->base), &(sce->base));
297 id_us_plus((ID *)scen->world);
298 id_us_plus((ID *)scen->set);
303 scen->toolsettings= MEM_dupallocN(sce->toolsettings);
305 duplicatelist(&(scen->markers), &(sce->markers));
306 duplicatelist(&(scen->r.layers), &(sce->r.layers));
308 scen->nodetree= ntreeCopyTree(sce->nodetree, 0);
310 obase= sce->base.first;
311 base= scen->base.first;
313 id_us_plus(&base->object->id);
314 if(obase==sce->basact) scen->basact= base;
320 if(level==0) return scen;
325 single_object_users(0);
328 ID_NEW(G.scene->camera);
333 id_us_plus(&scen->world->id);
334 scen->world= copy_world(scen->world);
336 single_obdata_users(0);
337 single_mat_users_expand();
338 single_tex_users_expand();
340 scen->radio= MEM_dupallocN(sce->radio);
346 BPY_copy_scriptlink(&sce->scriptlink);
347 // make a private copy of the avicodecdata
349 if (sce->r.avicodecdata) {
351 scen->r.avicodecdata = MEM_dupallocN(sce->r.avicodecdata);
352 scen->r.avicodecdata->lpFormat = MEM_dupallocN(scen->r.avicodecdata->lpFormat);
353 scen->r.avicodecdata->lpParms = MEM_dupallocN(scen->r.avicodecdata->lpParms);
356 // make a private copy of the qtcodecdata
358 if (sce->r.qtcodecdata) {
359 scen->r.qtcodecdata = MEM_dupallocN(sce->r.qtcodecdata);
360 scen->r.qtcodecdata->cdParms = MEM_dupallocN(scen->r.qtcodecdata->cdParms);
366 void do_info_buttons(unsigned short event)
368 bScreen *sc, *oldscreen;
374 case B_INFOSCR: /* menu select screen */
376 if( G.curscreen->screennr== -2) {
377 if(curarea->winy <50) {
378 sa= closest_bigger_area();
381 activate_databrowse((ID *)G.curscreen, ID_SCR, 0, B_INFOSCR,
382 &G.curscreen->screennr, do_info_buttons);
385 if( G.curscreen->screennr < 0) return;
387 sc= G.main->screen.first;
390 if(nr==G.curscreen->screennr) {
391 if(is_allowed_to_change_screen(sc)) setscreen(sc);
392 else error("Unable to perform function in EditMode");
398 /* last item: NEW SCREEN */
400 nr= pupmenu("New Screen%t|Empty%x1|Duplicate%x2");
402 if(nr==1) default_twosplit();
403 if(nr==2) duplicate_screen();
407 /*do this event only with buttons, so it can never be called with full-window*/
409 if(G.curscreen->id.prev) sc= G.curscreen->id.prev;
410 else if(G.curscreen->id.next) sc= G.curscreen->id.next;
412 if(okee("Delete current screen")) {
413 /* find new G.curscreen */
415 oldscreen= G.curscreen;
416 setscreen(sc); /* this test if sc has a full */
417 unlink_screen(oldscreen);
418 free_libblock(&G.main->screen, oldscreen);
420 scrarea_queue_headredraw(curarea);
423 case B_INFOSCE: /* menu select scene */
425 if( G.curscreen->scenenr== -2) {
426 if(curarea->winy <50) {
427 sa= closest_bigger_area();
430 activate_databrowse((ID *)G.scene, ID_SCE, 0, B_INFOSCE,
431 &G.curscreen->scenenr, do_info_buttons);
434 if( G.curscreen->scenenr < 0) return;
436 sce= G.main->scene.first;
439 if(nr==G.curscreen->scenenr) {
440 if(sce!=G.scene) set_scene(sce);
446 /* last item: NEW SCENE */
448 nr= pupmenu("Add scene%t|Empty|Link Objects|Link ObData|Full Copy");
453 sce= add_scene(G.scene->id.name+2);
454 /* pretty bad ass copying here. we should use copy_scene to do all (ton) */
459 if (sce->r.avicodecdata) {
460 sce->r.avicodecdata = MEM_dupallocN(G.scene->r.avicodecdata);
461 sce->r.avicodecdata->lpFormat = MEM_dupallocN(G.scene->r.avicodecdata->lpFormat);
462 sce->r.avicodecdata->lpParms = MEM_dupallocN(G.scene->r.avicodecdata->lpParms);
465 #ifdef WITH_QUICKTIME
466 if (sce->r.qtcodecdata) {
467 sce->r.qtcodecdata = MEM_dupallocN(G.scene->r.qtcodecdata);
468 sce->r.qtcodecdata->cdParms = MEM_dupallocN(G.scene->r.qtcodecdata->cdParms);
472 else sce= copy_scene(G.scene, nr-2);
477 BIF_preview_changed(ID_TE);
482 if(G.scene->id.prev) sce= G.scene->id.prev;
483 else if(G.scene->id.next) sce= G.scene->id.next;
485 if(okee("Delete current scene")) {
486 /* Note, anything besides free_libblock needs to be added in
487 * Python Scene.c for Blender.Scene.Unlink() */
490 /* exit modes... could become single call once */
491 exit_editmode(EM_FREEDATA|EM_WAITCURSOR);
495 for (sce1= G.main->scene.first; sce1; sce1= sce1->id.next) {
496 if(sce1->set == G.scene) sce1->set= 0;
499 /* check all sequences */
500 clear_scene_in_allseqs(G.scene);
502 /* check render layer nodes in other scenes */
503 clear_scene_in_nodes(G.scene);
507 for (sc= G.main->screen.first; sc; sc= sc->id.next ) {
508 if(sc->scene == G.scene) sc->scene= sce;
510 free_libblock(&G.main->scene, G.scene);
519 static void check_packAll()
521 // first check for dirty images
524 for(ima = G.main->image.first; ima; ima= ima->id.next) {
525 if (ima->ibufs.first) { /* XXX FIX */
526 ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
528 if (ibuf && (ibuf->userflags &= IB_BITMAPDIRTY))
533 if (ima == NULL || okee("Some images are painted on. These changes will be lost. Continue ?")) {
535 G.fileflags |= G_AUTOPACK;
539 static int write_runtime(char *str, char *exename)
551 if (ext && (!BLI_testextensie(str, ext))) {
552 freestr= MEM_mallocN(strlen(str) + strlen(ext) + 1, "write_runtime_check");
553 sprintf(freestr,"%s%s", str, ext);
557 if (!BLI_exists(str) || saveover(str))
558 BLO_write_runtime(str, exename);
566 static void write_runtime_check_dynamic(char *str)
568 write_runtime(str, "blenderdynplayer.exe");
571 static void write_runtime_check(char *str)
575 strcpy(player, "blenderplayer");
578 strcat(player, ".exe");
582 strcat(player, ".app");
585 write_runtime(str, player);
587 /* end keyed functions */
589 /************************** MAIN MENU *****************************/
590 /************************** FILE *****************************/
593 static void do_info_file_importmenu(void *arg, int event)
597 if(curarea->spacetype==SPACE_INFO) {
598 sa= find_biggest_area_of_type(SPACE_SCRIPT);
599 if (!sa) sa= closest_bigger_area();
603 /* events >=3 are registered bpython scripts */
605 BPY_menu_do_python(PYMENU_IMPORT, event - 3);
606 BIF_undo_push("Import file");
612 activate_fileselect(FILE_BLENDER, "Import DXF", G.sce, BIF_read_file);
614 case 1: /* VRML 1.0 */
615 activate_fileselect(FILE_BLENDER, "Import VRML 1.0", G.sce, BIF_read_file);
618 activate_fileselect(FILE_BLENDER, "Import STL", G.sce, BIF_read_file);
623 allqueue(REDRAWINFO, 0);
626 static uiBlock *info_file_importmenu(void *arg_unused)
629 short yco = 20, menuwidth = 120;
633 block= uiNewBlock(&curarea->uiblocks, "importmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
634 uiBlockSetButmFunc(block, do_info_file_importmenu, NULL);
635 //uiBlockSetXOfs(block, -50); // offset to parent button
637 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "VRML 1.0...",
638 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 1, "");
639 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "DXF...",
640 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 0, "");
641 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "STL...",
642 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 2, "");
644 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
646 for (pym = BPyMenuTable[PYMENU_IMPORT]; pym; pym = pym->next, i++) {
647 uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i+3, pym->tooltip?pym->tooltip:pym->filename);
650 uiBlockSetDirection(block, UI_RIGHT);
651 uiTextBoundsBlock(block, 60);
656 static void do_info_file_exportmenu(void *arg, int event)
660 if(curarea->spacetype==SPACE_INFO) {
661 sa= find_biggest_area_of_type(SPACE_SCRIPT);
662 if (!sa) sa= closest_bigger_area();
666 /* events >=3 are registered bpython scripts */
667 if (event >= 3) BPY_menu_do_python(PYMENU_EXPORT, event - 3);
681 allqueue(REDRAWINFO, 0);
684 static uiBlock *info_file_exportmenu(void *arg_unused)
687 short yco = 20, menuwidth = 120;
691 block= uiNewBlock(&curarea->uiblocks, "exportmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
692 uiBlockSetButmFunc(block, do_info_file_exportmenu, NULL);
693 //uiBlockSetXOfs(block, -50); // offset to parent button
695 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "VRML 1.0...|Ctrl F2",
696 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 0, "");
697 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "DXF...|Shift F2",
698 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 1, "");
699 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "STL...",
700 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 2, "");
702 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
704 /* note that we acount for the 3 previous entries with i+3: */
705 for (pym = BPyMenuTable[PYMENU_EXPORT]; pym; pym = pym->next, i++) {
706 uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19,
707 NULL, 0.0, 0.0, 1, i+3,
708 pym->tooltip?pym->tooltip:pym->filename);
712 uiBlockSetDirection(block, UI_RIGHT);
713 uiTextBoundsBlock(block, 60);
720 extern ListBase session_list;
722 static void do_verse_filemenu(void *arg, int event)
724 char address[64]; /* lenght of domain name is 63 characters or less */
725 VerseSession *session = NULL;
728 if(curarea->spacetype==SPACE_INFO) {
729 sa= closest_bigger_area();
736 printf("Connecting to localhost!\n");
737 b_verse_connect("localhost");
742 if(sbutton(address, 0, 63, "Server:")) {
744 printf("Connecting to %s\n", address);
745 b_verse_connect(address);
750 session = session_menu();
752 printf("Disconnecting session: %s!\n", session->address);
753 end_verse_session(session);
757 printf("Disconnecting all sessions!\n");
758 end_all_verse_sessions();
761 printf("sending get to master server\n");
767 static uiBlock *verse_filemenu(void *unusedargs)
770 short yco = 20, menuwidth = 120;
772 block= uiNewBlock(&curarea->uiblocks, "verse_filemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
773 uiBlockSetButmFunc(block, do_verse_filemenu, NULL);
775 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Connect to localhost", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
776 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Connect ...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
777 if(session_list.first != NULL) {
778 if(session_list.first != session_list.last) {
779 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Disconnect ...",
780 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
781 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Disconnect all",
782 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
785 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Disconnect",
786 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
790 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Get Servers", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
792 uiBlockSetDirection(block, UI_RIGHT);
793 uiTextBoundsBlock(block, 60);
799 static void do_info_filemenu(void *arg, int event)
802 char dir[FILE_MAXDIR];
804 if(curarea->spacetype==SPACE_INFO) {
805 sa= closest_bigger_area();
809 /* these are no defines, easier this way, the codes are in the function below */
812 if (okee("Erase All")) {
813 if (!BIF_read_homefile(0))
814 error("No file ~/.B.blend");
818 activate_fileselect(FILE_BLENDER, "Open", G.sce, BIF_read_file);
821 activate_fileselect(FILE_LOADLIB, "Load Library", G.lib, 0);
826 activate_fileselect(FILE_BLENDER, "Save As", dir, BIF_write_file);
831 activate_fileselect(FILE_BLENDER, "Save As", dir, BIF_write_file);
833 /* do NOT ask everytime for overwriting... */
836 free_filesel_spec(dir);
839 case 6: /* save image */
840 BIF_save_rendered_image_fs();
843 activate_imageselect(FILE_LOADLIB, "Load Library", G.lib, 0);
845 case 22: /* save runtime */
846 activate_fileselect(FILE_SPECIAL, "Save Runtime", "", write_runtime_check);
848 case 23: /* save dynamic runtime */
849 activate_fileselect(FILE_SPECIAL, "Save Dynamic Runtime", "", write_runtime_check_dynamic);
860 case 15: /* recover previous session */
862 extern short winqueue_break; /* editscreen.c */
864 char str[FILE_MAXDIR+FILE_MAXFILE];
865 char scestr[FILE_MAXDIR+FILE_MAXFILE];
867 strcpy(scestr, G.sce); /* temporal store */
868 save_over = G.save_over;
869 BLI_make_file_string("/", str, U.tempdir, "quit.blend");
870 BKE_read_file(str, NULL);
871 G.save_over = save_over;
872 strcpy(G.sce, scestr);
874 winqueue_break= 1; /* leave queues everywhere */
877 BKE_write_undo("original"); /* save current state */
878 refresh_interface_font();
881 case 31: /* save default settings */
882 BIF_write_homefile();
885 if (okee("Erase All")) {
886 if (!BIF_read_homefile(1))
887 error("Can't read data from memory!");
890 case 35: /* compress toggle */
891 U.flag ^= (USER_FILECOMPRESS);
895 allqueue(REDRAWINFO, 0);
898 static void do_info_operecentmenu(void *arg, int event)
900 struct RecentFile *recent;
902 if(event==0 && G.sce[0]) {
903 BIF_read_file(G.sce);
906 recent = BLI_findlink(&(G.recent_files), event-1);
907 BIF_read_file(recent->filename);
911 static uiBlock *info_openrecentmenu(void *arg_unused)
914 short yco = 20, menuwidth = 120, i;
915 struct RecentFile *recent;
917 block= uiNewBlock(&curarea->uiblocks, "info_openrecentmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
918 uiBlockSetButmFunc(block, do_info_operecentmenu, NULL);
921 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, G.sce, 0, yco-=20,
922 menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
925 for (recent = G.recent_files.first, i=0; i<U.recent_files && recent; recent = recent->next, i++) {
926 if (strcmp(recent->filename, G.sce)!=0) {
927 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, recent->filename, 0, yco-=20,
928 menuwidth, 19, NULL, 0.0, 0.0, 1, i+1, "");
932 uiBlockSetDirection(block, UI_RIGHT);
933 uiTextBoundsBlock(block, 60);
937 static void do_info_externalfiles(void *arg, int event)
941 case 1: /* pack data */
945 case 2: /* unpack to current dir */
946 unpackAll(PF_WRITE_LOCAL);
947 G.fileflags &= ~G_AUTOPACK;
950 case 3: /* unpack data */
951 if (buttons_do_unpack() != RET_CANCEL) {
952 /* Clear autopack bit only if user selected one of the unpack options */
953 G.fileflags &= ~G_AUTOPACK;
956 case 10: /* make all paths relative */
957 if (G.relbase_valid) {
958 int tot,changed,failed,linked;
960 char txtname[24]; /* text block name */
962 makeFilesRelative(txtname, &tot, &changed, &failed, &linked);
963 if (failed) sprintf(str, "Make Relative%%t|Total files %i|Changed %i|Failed %i, See Text \"%s\"|Linked %i", tot, changed, failed, txtname, linked);
964 else sprintf(str, "Make Relative%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
967 pupmenu("Can't set relative paths with an unsaved blend file");
970 case 11: /* make all paths relative */
972 int tot,changed,failed,linked;
974 char txtname[24]; /* text block name */
976 makeFilesAbsolute(txtname, &tot, &changed, &failed, &linked);
977 sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
978 if (failed) sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i, See Text \"%s\"|Linked %i", tot, changed, failed, txtname, linked);
979 else sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
984 case 12: /* check images exist */
986 char txtname[24]; /* text block name */
989 /* run the missing file check */
990 checkMissingFiles( txtname );
992 if (txtname[0] == '\0') {
993 okee("No external files missing");
996 sprintf(str, "Missing files listed in Text \"%s\"", txtname );
1001 case 13: /* search for referenced files that are not available */
1002 if(curarea->spacetype==SPACE_INFO) {
1004 sa= closest_bigger_area();
1005 areawinset(sa->win);
1007 activate_fileselect(FILE_SPECIAL, "Find Missing Files", "", findMissingFiles);
1011 allqueue(REDRAWINFO, 0);
1014 static uiBlock *info_externalfiles(void *arg_unused)
1017 short yco = 20, menuwidth = 120;
1019 block= uiNewBlock(&curarea->uiblocks, "info_externalfiles", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1020 uiBlockSetButmFunc(block, do_info_externalfiles, NULL);
1022 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pack into Blend", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1024 uiDefBut(block, BUTM, 1, "Unpack Data to current dir", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "Removes all packed files from the project and saves them to the current directory");
1026 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Unpack into Files...", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1028 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1030 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make all Paths Relative", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 10, "");
1031 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make all Paths Absolute", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 11, "");
1032 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Report Missing Files", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 12, "");
1033 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Find Missing Files", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 13, "");
1035 uiBlockSetDirection(block, UI_RIGHT);
1036 uiTextBoundsBlock(block, 60);
1040 static uiBlock *info_filemenu(void *arg_unused)
1044 short menuwidth=120;
1046 block= uiNewBlock(&curarea->uiblocks, "info_filemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1047 uiBlockSetButmFunc(block, do_info_filemenu, NULL);
1049 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "New|Ctrl X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1050 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Open...|F1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1052 uiDefIconTextBlockBut(block, verse_filemenu, NULL, ICON_RIGHTARROW_THIN, "Verse", 0, yco-=20, menuwidth, 19, "");
1054 uiDefIconTextBlockBut(block, info_openrecentmenu, NULL, ICON_RIGHTARROW_THIN, "Open Recent",0, yco-=20, 120, 19, "");
1055 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recover Last Session", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
1057 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1059 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save|Ctrl W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1060 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save As...|F2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1062 if(U.flag & USER_FILECOMPRESS) {
1063 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Compress File", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 35, "Enable file compression");
1065 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Compress File", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 35, "Enable file compression");
1068 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1070 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Rendered Image...|F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1071 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Screenshot Subwindow|Ctrl F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 24, "");
1072 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Screenshot All|Ctrl Shift F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
1073 #if GAMEBLENDER == 1
1074 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Runtime...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
1076 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Dynamic Runtime...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 23, "");
1079 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1081 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Default Settings|Ctrl U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 31, "");
1082 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Load Factory Settings", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 32, "");
1085 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1087 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append or Link|Shift F1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1088 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append or Link (Image Browser)|Ctrl F1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1089 uiDefIconTextBlockBut(block, info_file_importmenu, NULL, ICON_RIGHTARROW_THIN, "Import", 0, yco-=20, menuwidth, 19, "");
1090 uiDefIconTextBlockBut(block, info_file_exportmenu, NULL, ICON_RIGHTARROW_THIN, "Export", 0, yco-=20, menuwidth, 19, "");
1092 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1094 uiDefIconTextBlockBut(block, info_externalfiles, NULL, ICON_RIGHTARROW_THIN, "External Data",0, yco-=20, 120, 19, "");
1096 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1098 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Quit Blender|Ctrl Q", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
1100 uiBlockSetDirection(block, UI_DOWN);
1101 uiTextBoundsBlock(block, 80);
1106 /**************************** ADD ******************************/
1108 void do_info_add_meshmenu(void *arg, int event)
1111 BPY_menu_do_python(PYMENU_ADDMESH, event - 20);
1116 add_primitiveMesh(0);
1120 add_primitiveMesh(1);
1124 add_primitiveMesh(4);
1128 add_primitiveMesh(11);
1132 add_primitiveMesh(12);
1136 add_primitiveMesh(5);
1140 add_primitiveMesh(7);
1144 add_primitiveMesh(10);
1148 add_primitiveMesh(13);
1154 allqueue(REDRAWINFO, 0);
1157 static uiBlock *info_add_meshmenu(void *arg_unused)
1159 /* static short tog=0; */
1167 block= uiNewBlock(&curarea->uiblocks, "add_meshmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1168 uiBlockSetButmFunc(block, do_info_add_meshmenu, NULL);
1170 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Plane|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1171 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cube|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1172 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Circle|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1173 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "UVsphere", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1174 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "IcoSphere|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1175 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cylinder|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "");
1176 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cone|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 7, "");
1177 uiDefIconTextBut(block, SEPR, 0, ICON_BLANK1, "", 0, yco-=6, 160, 6, NULL, 0.0, 0.0, 0, 0, "");
1178 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grid|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 8, "");
1179 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Monkey|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 9, "");
1182 pym = BPyMenuTable[PYMENU_ADDMESH];
1184 uiDefIconTextBut(block, SEPR, 0, ICON_BLANK1, "", 0, yco-=6, 160, 6, NULL, 0.0, 0.0, 0, 0, "");
1186 for (; pym; pym = pym->next, i++) {
1187 uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, i+20, pym->tooltip?pym->tooltip:pym->filename);
1191 uiBlockSetDirection(block, UI_RIGHT);
1192 uiTextBoundsBlock(block, 50);
1197 void do_info_add_curvemenu(void *arg, int event)
1203 add_primitiveCurve(10);
1207 add_primitiveCurve(11);
1211 add_primitiveCurve(40);
1215 add_primitiveCurve(41);
1219 add_primitiveCurve(46);
1224 allqueue(REDRAWINFO, 0);
1227 static uiBlock *info_add_curvemenu(void *arg_unused)
1229 /* static short tog=0; */
1233 block= uiNewBlock(&curarea->uiblocks, "add_curvemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1234 uiBlockSetButmFunc(block, do_info_add_curvemenu, NULL);
1236 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bezier Curve|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1237 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bezier Circle|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1238 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Curve|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1239 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Circle", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1240 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Path|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1242 uiBlockSetDirection(block, UI_RIGHT);
1243 uiTextBoundsBlock(block, 50);
1249 void do_info_add_surfacemenu(void *arg, int event)
1255 add_primitiveNurb(0);
1259 add_primitiveNurb(1);
1263 add_primitiveNurb(2);
1267 add_primitiveNurb(3);
1271 add_primitiveNurb(4);
1275 add_primitiveNurb(5);
1280 allqueue(REDRAWINFO, 0);
1283 static uiBlock *info_add_surfacemenu(void *arg_unused)
1285 /* static short tog=0; */
1289 block= uiNewBlock(&curarea->uiblocks, "add_surfacemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1290 uiBlockSetButmFunc(block, do_info_add_surfacemenu, NULL);
1292 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Curve|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1293 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Circle|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1294 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Surface|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1295 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Tube", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1296 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Sphere|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1297 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Donut|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "");
1298 uiBlockSetDirection(block, UI_RIGHT);
1299 uiTextBoundsBlock(block, 50);
1304 void do_info_add_metamenu(void *arg, int event)
1310 add_primitiveMball(1);
1314 add_primitiveMball(2);
1318 add_primitiveMball(3);
1322 add_primitiveMball(4);
1326 add_primitiveMball(5);
1331 allqueue(REDRAWINFO, 0);
1335 static uiBlock *info_add_metamenu(void *arg_unused)
1337 /* static short tog=0; */
1341 block= uiNewBlock(&curarea->uiblocks, "add_metamenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1342 uiBlockSetButmFunc(block, do_info_add_metamenu, NULL);
1344 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,"Meta Ball|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1345 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Tube|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1346 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Plane|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1347 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Ellipsoid|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1348 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Cube|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1350 uiBlockSetDirection(block, UI_RIGHT);
1351 uiTextBoundsBlock(block, 50);
1356 void do_info_add_lampmenu(void *arg, int event)
1361 add_objectLamp(LA_LOCAL);
1364 add_objectLamp(LA_SUN);
1367 add_objectLamp(LA_SPOT);
1370 add_objectLamp(LA_HEMI);
1373 add_objectLamp(LA_AREA);
1375 case 5: /* YafRay photon lamp */
1376 if (G.scene->r.renderer==R_YAFRAY)
1377 add_objectLamp(LA_YF_PHOTON);
1382 allqueue(REDRAWINFO, 0);
1385 static uiBlock *info_add_lampmenu(void *arg_unused)
1387 /* static short tog=0; */
1391 block= uiNewBlock(&curarea->uiblocks, "add_lampmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1392 uiBlockSetButmFunc(block, do_info_add_lampmenu, NULL);
1394 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lamp|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1395 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Sun|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1396 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Spot|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1397 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hemi|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1398 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Area|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1399 if (G.scene->r.renderer==R_YAFRAY)
1400 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Photon|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "");
1402 uiBlockSetDirection(block, UI_RIGHT);
1403 uiTextBoundsBlock(block, 50);
1408 static void do_info_add_groupmenu(void *arg, int event)
1412 add_object_draw(OB_EMPTY);
1415 ob->dup_group= BLI_findlink(&G.main->group, event);
1417 id_us_plus((ID *)ob->dup_group);
1418 ob->transflag |= OB_DUPLIGROUP;
1419 DAG_scene_sort(G.scene);
1424 static uiBlock *info_add_groupmenu(void *arg_unused)
1431 block= uiNewBlock(&curarea->uiblocks, "add_groupmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1432 uiBlockSetButmFunc(block, do_info_add_groupmenu, NULL);
1434 for(a=0, group= G.main->group.first; group; group= group->id.next, a++) {
1435 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, group->id.name+2, 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, a, "");
1438 uiBlockSetDirection(block, UI_RIGHT);
1439 uiTextBoundsBlock(block, 50);
1444 void do_info_addmenu(void *arg, int event)
1460 /* Text (argument is discarded) */
1461 add_primitiveFont(event);
1465 add_object_draw(OB_EMPTY);
1469 add_object_draw(OB_CAMERA);
1473 add_primitiveArmature(OB_ARMATURE);
1477 add_object_draw(OB_LATTICE);
1480 /* group instance not yet */
1485 allqueue(REDRAWINFO, 0);
1489 static uiBlock *info_addmenu(void *arg_unused)
1491 /* static short tog=0; */
1495 block= uiNewBlock(&curarea->uiblocks, "addmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1496 uiBlockSetButmFunc(block, do_info_addmenu, NULL);
1498 uiDefIconTextBlockBut(block, info_add_meshmenu, NULL, ICON_RIGHTARROW_THIN, "Mesh", 0, yco-=20, 120, 19, "");
1499 uiDefIconTextBlockBut(block, info_add_curvemenu, NULL, ICON_RIGHTARROW_THIN, "Curve", 0, yco-=20, 120, 19, "");
1500 uiDefIconTextBlockBut(block, info_add_surfacemenu, NULL, ICON_RIGHTARROW_THIN, "Surface", 0, yco-=20, 120, 19, "");
1501 uiDefIconTextBlockBut(block, info_add_metamenu, NULL, ICON_RIGHTARROW_THIN, "Meta", 0, yco-=20, 120, 19, "");
1502 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Text", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 4, "");
1503 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Empty", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 5, "");
1505 uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
1507 uiDefIconTextBlockBut(block, info_add_groupmenu, NULL, ICON_RIGHTARROW_THIN, "Group", 0, yco-=20, 120, 19, "");
1509 uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
1511 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 6, "");
1512 uiDefIconTextBlockBut(block, info_add_lampmenu, NULL, ICON_RIGHTARROW_THIN, "Lamp", 0, yco-=20, 120, 19, "");
1514 uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
1516 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Armature", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 8, "");
1517 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lattice", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 9, "");
1519 uiBlockSetDirection(block, UI_DOWN);
1520 uiTextBoundsBlock(block, 80);
1525 /************************** GAME *****************************/
1528 static void do_info_gamemenu(void *arg, int event)
1531 case G_FILE_ENABLE_ALL_FRAMES:
1532 case G_FILE_DIAPLAY_LISTS:
1533 case G_FILE_SHOW_FRAMERATE:
1534 case G_FILE_SHOW_DEBUG_PROPS:
1535 case G_FILE_AUTOPLAY:
1536 case G_FILE_GAME_TO_IPO:
1537 case G_FILE_GAME_MAT:
1538 case G_FILE_SHOW_PHYSICS:
1539 G.fileflags ^= event;
1542 ; /* ignore the rest */
1546 static uiBlock *info_gamemenu(void *arg_unused)
1548 /* static short tog=0; */
1551 short menuwidth=120;
1553 block= uiNewBlock(&curarea->uiblocks, "gamemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1554 uiBlockSetButmFunc(block, do_info_gamemenu, NULL);
1556 uiDefIconTextBut(block, BUTM, B_STARTGAME, ICON_BLANK1, "Start Game|P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
1558 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 1, 0, "");
1561 if(G.fileflags & G_FILE_ENABLE_ALL_FRAMES) {
1562 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, "");
1564 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, "");
1567 if(G.fileflags & G_FILE_GAME_TO_IPO) {
1568 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Record Game Physics to IPO", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GAME_TO_IPO, "");
1571 if(G.fileflags & G_FILE_DIAPLAY_LISTS) {
1572 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Generate Display Lists", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_DIAPLAY_LISTS, "");
1574 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Generate Display Lists", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_DIAPLAY_LISTS, "");
1576 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Record Game Physics to IPO", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GAME_TO_IPO, "");
1579 if(G.fileflags & G_FILE_GAME_MAT) {
1580 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Use Blender Materials", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GAME_MAT, "");
1582 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Use Blender Materials", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GAME_MAT, "");
1587 if(G.fileflags & G_FILE_SHOW_FRAMERATE) {
1588 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, "");
1590 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, "");
1594 if(G.fileflags & G_FILE_SHOW_PHYSICS) {
1595 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Show Physics Visualization", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_SHOW_PHYSICS, "");
1597 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Show Physics Visualization", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_SHOW_PHYSICS, "");
1600 if(G.fileflags & G_FILE_SHOW_DEBUG_PROPS) {
1601 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, "");
1603 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, "");
1606 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 1, 0, "");
1608 if(G.fileflags & G_FILE_AUTOPLAY) {
1609 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Autostart", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_AUTOPLAY, "");
1611 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Autostart", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_AUTOPLAY, "");
1614 uiBlockSetDirection(block, UI_DOWN);
1615 uiTextBoundsBlock(block, 70);
1619 /************************** TIMELINE *****************************/
1621 static void do_info_timelinemenu(void *arg, int event)
1623 /* needed to check for valid selected objects */
1626 //char file[FILE_MAXDIR+FILE_MAXFILE];
1629 if (base) ob= base->object;
1633 /* Show Keyframes */
1634 if (!ob) error("Select an object before showing its keyframes");
1635 else set_ob_ipoflags();
1638 /* Show and select Keyframes */
1639 if (!ob) error("Select an object before showing and selecting its keyframes");
1640 else select_select_keys();
1643 /* select next keyframe */
1644 if (!ob) error("Select an object before selecting its next keyframe");
1645 else nextkey_obipo(1);
1648 /* select previous keyframe */
1649 if (!ob) error("Select an object before selecting its previous keyframe");
1650 else nextkey_obipo(-1);
1654 if (!ob) error("Select an object before going to its next keyframe");
1655 else movekey_obipo(1);
1658 /* previous keyframe */
1659 if (!ob) error("Select an object before going to its previous keyframe");
1660 else movekey_obipo(-1);
1665 update_for_newframe();
1668 /* previous frame */
1671 update_for_newframe();
1674 /* forward 10 frames */
1676 update_for_newframe();
1679 /* back 10 frames */
1682 update_for_newframe();
1687 update_for_newframe();
1692 update_for_newframe();
1695 allqueue(REDRAWINFO, 0);
1698 static uiBlock *info_timelinemenu(void *arg_unused)
1700 /* static short tog=0; */
1704 short menuwidth=120;
1706 block= uiNewBlock(&curarea->uiblocks, "timelinemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1707 uiBlockSetButmFunc(block, do_info_timelinemenu, NULL);
1709 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Keyframes|K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1710 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show and Select Keyframes|Shift K",0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1711 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Next Keyframe|PageUp", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1712 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Previous Keyframe|PageDown", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1714 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1716 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Next Keyframe|Ctrl PageUp", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1717 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Previous Keyframe|Ctrl PageDown", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1719 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1721 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Next Frame|RightArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1722 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Previous Frame|LeftArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
1724 sprintf(str, "Forward %d Frames|UpArrow", G.scene->jumpframe);
1725 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, str, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
1726 sprintf(str, "Back %d Frames|DownArrow", G.scene->jumpframe);
1727 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, str, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
1729 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1731 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "End Frame|Shift RightArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
1732 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Start Frame|Shift LeftArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
1734 uiBlockSetDirection(block, UI_DOWN);
1735 uiTextBoundsBlock(block, 80);
1740 /************************** RENDER *****************************/
1742 void do_info_render_bakemenu(void *arg, int event)
1745 case R_BAKE_TO_ACTIVE:
1746 G.scene->r.bake_flag ^= event;
1749 objects_bake_render(event);
1752 allqueue(REDRAWINFO, 0);
1755 static uiBlock *info_render_bakemenu(void *arg_unused)
1758 short yco= 0, menuwidth=160;
1760 block= uiNewBlock(&curarea->uiblocks, "render_bakemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1761 uiBlockSetButmFunc(block, do_info_render_bakemenu, NULL);
1763 if(G.scene->r.bake_flag & R_BAKE_TO_ACTIVE) {
1764 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Selected to Active", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, R_BAKE_TO_ACTIVE, "");
1766 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Selected to Active", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, R_BAKE_TO_ACTIVE, "");
1769 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1771 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Full Render|Ctrl Alt B, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1772 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Ambient Occlusion|Ctrl Alt B, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1773 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Normals|Ctrl Alt B, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1774 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Texture Only|Ctrl Alt B, 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1775 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Displacement|Ctrl Alt B, 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1777 uiBlockSetDirection(block, UI_RIGHT);
1778 uiTextBoundsBlock(block, 50);
1783 static void do_info_rendermenu(void *arg, int event)
1786 extern void playback_anim();
1788 /* events >=10 are registered bpython scripts */
1790 if(curarea->spacetype==SPACE_INFO) {
1791 sa= find_biggest_area_of_type(SPACE_SCRIPT);
1792 if (!sa) sa= closest_bigger_area();
1793 areawinset(sa->win);
1796 BPY_menu_do_python(PYMENU_RENDER, event - 10);
1797 BIF_undo_push("Rendering Script");
1809 /* note: dont use select_area() for setting active areas for opengl render */
1810 /* its hackish and instable... code here was removed */
1813 BIF_toggle_render_display();
1819 /* dodgy hack turning on SHIFT key to do a proper render border select
1820 set_render_border(); only works when 3d window active
1822 This code copied from toolbox.c, only works when 3d window is cameraview */
1824 if(select_area(SPACE_VIEW3D)) {
1825 mainqenter(LEFTSHIFTKEY, 1);
1826 mainqenter(BKEY, 1);
1827 mainqenter(BKEY, 0);
1828 mainqenter(EXECUTE, 1);
1829 mainqenter(LEFTSHIFTKEY, 0);
1835 extern_set_butspace(F10KEY, 0);
1839 allqueue(REDRAWINFO, 0);
1842 static uiBlock *info_rendermenu(void *arg_unused)
1847 short menuwidth=120;
1850 block= uiNewBlock(&curarea->uiblocks, "rendermenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1851 uiBlockSetButmFunc(block, do_info_rendermenu, NULL);
1853 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Current Frame|F12", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1854 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Animation|Ctrl F12", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1856 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1858 uiDefIconTextBlockBut(block, info_render_bakemenu, NULL, ICON_RIGHTARROW_THIN, "Bake Render Meshes", 0, yco-=20, 120, 19, "");
1860 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1862 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Render Buffer|F11", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1863 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Rendered Animation|Ctrl F11", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1865 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1867 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Render Border|Shift B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1869 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1871 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Settings|F10", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1873 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1875 for (pym = BPyMenuTable[PYMENU_RENDER]; pym; pym = pym->next, i++) {
1876 uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i+10, pym->tooltip?pym->tooltip:pym->filename);
1879 uiBlockSetDirection(block, UI_DOWN);
1880 uiTextBoundsBlock(block, 80);
1885 /************************** HELP *****************************/
1887 static void do_info_help_websitesmenu(void *arg, int event)
1889 BPY_menu_do_python(PYMENU_HELPWEBSITES, event);
1891 allqueue(REDRAWVIEW3D, 0);
1895 static uiBlock *info_help_websitesmenu(void *arg_unused)
1899 short yco = 20, menuwidth = 120;
1902 block= uiNewBlock(&curarea->uiblocks, "info_help_websitesmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1903 uiBlockSetButmFunc(block, do_info_help_websitesmenu, NULL);
1905 for (pym = BPyMenuTable[PYMENU_HELPWEBSITES]; pym; pym = pym->next, i++) {
1906 uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i, pym->tooltip?pym->tooltip:pym->filename);
1909 uiBlockSetDirection(block, UI_RIGHT);
1910 uiTextBoundsBlock(block, 60);
1915 static void do_info_help_systemmenu(void *arg, int event)
1917 /* events >=10 are registered bpython scripts */
1918 if (event >= 10) BPY_menu_do_python(PYMENU_HELPSYSTEM, event - 10);
1922 case 1: /* Benchmark */
1923 /* dodgy hack turning on CTRL ALT SHIFT key to do a benchmark
1924 * rather than copying lines and lines of code from toets.c :(
1927 if(select_area(SPACE_VIEW3D)) {
1928 mainqenter(LEFTSHIFTKEY, 1);
1929 mainqenter(LEFTCTRLKEY, 1);
1930 mainqenter(LEFTALTKEY, 1);
1931 mainqenter(TKEY, 1);
1932 mainqenter(TKEY, 0);
1933 mainqenter(EXECUTE, 1);
1934 mainqenter(LEFTSHIFTKEY, 0);
1935 mainqenter(LEFTCTRLKEY, 0);
1936 mainqenter(LEFTALTKEY, 0);
1942 allqueue(REDRAWVIEW3D, 0);
1946 static uiBlock *info_help_systemmenu(void *arg_unused)
1950 short yco = 20, menuwidth = 120;
1953 block= uiNewBlock(&curarea->uiblocks, "info_help_systemmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1954 uiBlockSetButmFunc(block, do_info_help_systemmenu, NULL);
1956 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Benchmark", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1958 for (pym = BPyMenuTable[PYMENU_HELPSYSTEM]; pym; pym = pym->next, i++) {
1959 uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i+10, pym->tooltip?pym->tooltip:pym->filename);
1962 uiBlockSetDirection(block, UI_RIGHT);
1963 uiTextBoundsBlock(block, 60);
1968 static void do_info_helpmenu(void *arg, int event)
1972 if(curarea->spacetype==SPACE_INFO) {
1973 sa= find_biggest_area_of_type(SPACE_SCRIPT);
1974 if (!sa) sa= closest_bigger_area();
1975 areawinset(sa->win);
1978 /* events >=10 are registered bpython scripts */
1979 if (event >= 10) BPY_menu_do_python(PYMENU_HELP, event - 10);
1983 case 0: /* About Blender */
1988 allqueue(REDRAWINFO, 0);
1991 static uiBlock *info_helpmenu(void *arg_unused)
1993 /* static short tog=0; */
1996 short menuwidth=120;
2000 block= uiNewBlock(&curarea->uiblocks, "info_helpmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
2001 uiBlockSetButmFunc(block, do_info_helpmenu, NULL);
2003 uiDefIconTextBut(block, BUTM, B_SHOWSPLASH, ICON_BLANK1, "About Blender...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2005 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2007 for (pym = BPyMenuTable[PYMENU_HELP]; pym; pym = pym->next, i++) {
2008 uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i+10, pym->tooltip?pym->tooltip:pym->filename);
2011 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2013 uiDefIconTextBlockBut(block, info_help_websitesmenu, NULL, ICON_RIGHTARROW_THIN, "Websites", 0, yco-=20, 120, 19, "");
2015 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2017 uiDefIconTextBlockBut(block, info_help_systemmenu, NULL, ICON_RIGHTARROW_THIN, "System", 0, yco-=20, 120, 19, "");
2019 uiBlockSetDirection(block, UI_DOWN);
2020 uiTextBoundsBlock(block, 80);
2025 /************************** END MAIN MENU *****************************/
2026 /* ugly global yes, for renderwin.c to write to */
2027 char info_time_str[32]="";
2029 static void info_text(int x, int y)
2032 extern float hashvectf[];
2033 extern unsigned long mem_in_use, mmap_in_use;
2034 unsigned int swatch_color;
2035 float fac1, fac2, fac3;
2036 char infostr[300], memstr[64];
2037 char *headerstr, *s;
2040 s= memstr + sprintf(memstr," | Mem:%.2fM ", ((mem_in_use-mmap_in_use)>>10)/1024.0);
2042 sprintf(s,"(%.2fM) ", ((mmap_in_use)>>10)/1024.0);
2048 s+= sprintf(s, "%s", G.editModeTitleExtra);
2049 if(G.obedit->type==OB_MESH) {
2050 if(G.scene->selectmode & SCE_SELECT_VERTEX)
2051 s+= sprintf(s,"Ve:%d-%d | Ed:%d-%d | Fa:%d-%d",
2052 G.totvertsel, G.totvert, G.totedgesel, G.totedge, G.totfacesel, G.totface);
2053 else if(G.scene->selectmode & SCE_SELECT_EDGE)
2054 s+= sprintf(s,"Ed:%d-%d | Fa:%d-%d",
2055 G.totedgesel, G.totedge, G.totfacesel, G.totface);
2057 s+= sprintf(s,"Fa:%d-%d", G.totfacesel, G.totface);
2059 else if(G.obedit->type==OB_ARMATURE) {
2060 s+= sprintf(s,"Ve:%d-%d | Bo:%d-%d", G.totvertsel, G.totvert, G.totbonesel, G.totbone);
2063 s+= sprintf(s,"Ve:%d-%d", G.totvertsel, G.totvert);
2068 else if(ob && (ob->flag & OB_POSEMODE)) {
2069 sprintf(infostr,"Bo:%d-%d %s",
2070 G.totbonesel, G.totbone, memstr);
2073 sprintf(infostr,"Ve:%d | Fa:%d | Ob:%d-%d | La:%d %s | Time:%s | ",
2074 G.totvert, G.totface, G.totobj, G.totobjsel, G.totlamp, memstr, info_time_str);
2077 strcat(infostr, ob->id.name+2);
2080 if (g_progress_bar && g_progress_info) {
2081 headerstr= g_progress_info;
2083 headerstr= versionstr;
2086 if (g_progress_bar) {
2087 hsize = 4 + (138.0 * g_done);
2088 fac1 = 0.5 * g_done; /* do some rainbow colors on progress */
2092 hsize= 30+BIF_GetStringWidth(G.font, headerstr, (U.transopts & USER_TR_BUTTONS));
2094 /* promise! Never change these lines again! (zr & ton did!) */
2095 fac1= fabs(hashvectf[ 2*G.version+4]);
2096 fac2= 0.5+0.1*hashvectf[ G.version+3];
2100 swatch_color= hsv_to_cpack(fac1, fac2, fac3);
2102 cpack( swatch_color );
2103 glRecti(x-24, y-6, x-30+hsize, y+14);
2105 glColor3ub(0, 0, 0); /* makes text black colored rect */
2107 glRasterPos2i(x, y);
2108 BIF_RasterPos(x, y);
2110 BIF_DrawString(G.font, headerstr, (U.transopts & USER_TR_MENUS));
2111 hsize= BIF_GetStringWidth(G.font, headerstr, (U.transopts & USER_TR_BUTTONS));
2113 BIF_ThemeColor(TH_MENU_TEXT); /* makes text readable on dark theme */
2115 glRasterPos2i(x+hsize+10, y);
2116 BIF_RasterPos(x+hsize+10, y);
2118 BIF_DrawString(G.font, infostr, (U.transopts & USER_TR_MENUS));
2121 void info_buttons(void)
2127 block= uiNewBlock(&curarea->uiblocks, "header info", UI_EMBOSSN, UI_HELV, curarea->headwin);
2129 if(area_is_active_area(curarea)) uiBlockSetCol(block, TH_HEADER);
2130 else uiBlockSetCol(block, TH_HEADERDESEL);
2132 if(curarea->flag & HEADER_NO_PULLDOWN) {
2133 uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_RIGHT,
2135 &(curarea->flag), 0, 0, 0, 0, "Enables display of pulldown menus");
2137 uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_DOWN,
2139 &(curarea->flag), 0, 0, 0, 0, "Hides pulldown menus");
2143 if((curarea->flag & HEADER_NO_PULLDOWN)==0) {
2145 uiBlockSetEmboss(block, UI_EMBOSSP);
2147 /* the 'xmax - 3' rather than xmax is to prevent some weird flickering where the highlighted
2148 * menu is drawn wider than it should be. The ypos of -1 is to make it properly fill the
2149 * height of the header */
2150 xmax= GetButStringLength("File");
2151 uiDefPulldownBut(block, info_filemenu, NULL, "File", xco, -1, xmax-3, 22, "");
2154 xmax= GetButStringLength("Add");
2155 uiDefPulldownBut(block, info_addmenu, NULL, "Add", xco, -1, xmax-3, 22, "");
2158 xmax= GetButStringLength("Timeline");
2159 uiDefPulldownBut(block, info_timelinemenu, NULL, "Timeline", xco, -1, xmax-3, 22, "");
2162 xmax= GetButStringLength("Game");
2163 uiDefPulldownBut(block, info_gamemenu, NULL, "Game", xco, -1, xmax-3, 22, "");
2166 xmax= GetButStringLength("Render");
2167 uiDefPulldownBut(block, info_rendermenu, NULL, "Render", xco, -1, xmax-3, 22, "");
2170 xmax= GetButStringLength("Help");
2171 uiDefPulldownBut(block, info_helpmenu, NULL, "Help", xco, -1, xmax-3, 22, "");
2176 /* pack icon indicates a packed file */
2178 if (G.fileflags & G_AUTOPACK) {
2179 uiBlockSetEmboss(block, UI_EMBOSSN);
2180 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.");
2184 if (curarea->full == 0) {
2185 curarea->butspacetype= SPACE_INFO;
2186 uiBlockSetEmboss(block, UI_EMBOSS);
2187 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.");
2189 /* STD SCREEN BUTTONS */
2190 xco= std_libbuttons(block, xco, 0, 0, NULL, B_INFOSCR, ID_SCR, 0, (ID *)G.curscreen, 0, &G.curscreen->screennr, 1, 1, B_INFODELSCR, 0, 0);
2194 /* STD SCENE BUTTONS */
2195 xco= std_libbuttons(block, xco, 0, 0, NULL, B_INFOSCE, ID_SCE, 0, (ID *)G.scene, 0, &G.curscreen->scenenr, 1, 1, B_INFODELSCE, 0, 0);
2199 BIF_SetScale(block->aspect);
2200 info_text(xco+24, 6);
2202 uiBlockSetEmboss(block, UI_EMBOSSN);
2203 uiDefIconBut(block, BUT, B_SHOWSPLASH, ICON_BLENDER, xco+2, 0,XIC,YIC, 0, 0, 0, 0, 0, "Click to display Splash Screen");
2205 /* always do as last */
2206 curarea->headbutlen= xco+2*XIC;
2209 // #ifdef _WIN32 // FULLSCREEN
2210 if(U.uiflag & USER_FLIPFULLSCREEN) {
2211 uiDefIconBut(block, BUT, B_FLIPFULLSCREEN, ICON_WINDOW_WINDOW,
2212 (short)(curarea->winx-XIC-5), 0,XIC,YIC,
2213 0, 0, 0, 0, 0, "Toggles Blender to fullscreen mode");/* dir */
2215 uiDefIconBut(block, BUT, B_FLIPFULLSCREEN, ICON_WINDOW_FULLSCREEN,
2216 (short)(curarea->winx-XIC-5), 0,XIC,YIC,
2217 0, 0, 0, 0, 0, "Toggles Blender to fullscreen mode");/* dir */