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 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.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software Foundation,
22 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
25 * All rights reserved.
27 * The Original Code is: all of this file.
29 * Contributor(s): none yet.
31 * ***** END GPL LICENSE BLOCK *****
42 #include "DNA_group_types.h"
44 #include "DNA_image_types.h"
45 #include "DNA_lamp_types.h"
46 #include "DNA_object_types.h"
47 #include "DNA_packedFile_types.h"
48 #include "DNA_scene_types.h"
49 #include "DNA_screen_types.h"
50 #include "DNA_space_types.h"
51 #include "DNA_userdef_types.h"
52 #include "DNA_world_types.h"
54 #include "BDR_editcurve.h"
55 #include "BDR_editmball.h"
56 #include "BDR_editobject.h"
57 #include "BDR_editface.h"
58 #include "BDR_vpaint.h"
60 #include "BIF_editarmature.h"
61 #include "BIF_editfont.h"
62 #include "BIF_editmesh.h"
64 #include "BIF_interface.h"
65 #include "BIF_language.h"
66 #include "BIF_mainqueue.h"
67 #include "BIF_meshtools.h"
68 #include "BIF_previewrender.h"
69 #include "BIF_renderwin.h"
70 #include "BIF_resources.h"
71 #include "BIF_screen.h"
72 #include "BIF_space.h"
73 #include "BIF_toets.h"
74 #include "BIF_toolbox.h"
75 #include "BIF_usiblender.h"
76 #include "BIF_writeimage.h"
77 #include "BIF_drawscene.h"
80 #include "BIF_verse.h"
83 #include "BKE_blender.h"
84 #include "BKE_colortools.h"
85 #include "BKE_depsgraph.h"
86 #include "BKE_exotic.h"
87 #include "BKE_global.h"
88 #include "BKE_image.h"
89 #include "BKE_library.h"
92 #include "BKE_packedFile.h"
93 #include "BKE_scene.h"
94 #include "BKE_world.h"
97 #include "BKE_verse.h"
100 #include "BLI_arithb.h"
101 #include "BLI_blenlib.h"
102 #include "BLI_bpath.h"
103 #include "BLO_writefile.h"
105 #include "BSE_editipo.h"
106 #include "BSE_filesel.h"
107 #include "BIF_imasel.h"
108 #include "BSE_headerbuttons.h"
109 #include "BSE_node.h"
110 #include "BSE_sequence.h"
111 #include "BSE_edit.h"
112 #include "BSE_time.h"
114 #include "IMB_imbuf_types.h"
116 #include "MEM_guardedalloc.h"
118 #ifndef DISABLE_PYTHON
119 #include "BPY_extern.h"
120 #include "BPY_menus.h"
123 #include "GPU_extensions.h"
124 #include "GPU_material.h"
127 #include "interface.h"
128 #include "mydevice.h"
130 extern char versionstr[]; /* from blender.c */
132 /*----------------------------------*/
133 /* Progress bar vars and functions: */
135 /* strubi shamelessly abused the status line as a progress bar...
136 * feel free to kill him after release */
138 static int g_progress_bar = 0;
139 static char *g_progress_info = 0;
142 int start_progress_bar(void)
145 return 1; // we never fail (yet)
148 void end_progress_bar(void)
153 static void update_progress_bar(float done, char *info)
156 g_progress_info = info;
160 'done': a value between 0.0 and 1.0, showing progress
161 'info': a info text what is currently being done
163 Make sure that the progress bar is always called with:
166 done = 1.0 last -- or alternatively use:
169 do_stuff_and_callback_progress_bar();
173 int progress_bar(float done, char *busy_info)
178 /* User break (ESC) */
180 if (extern_qread(&val) == ESCKEY)
184 start_progress_bar();
185 } else if (done > 0.99) {
189 sa= G.curscreen->areabase.first;
191 if (sa->spacetype == SPACE_INFO) {
192 update_progress_bar(done, busy_info);
196 scrarea_do_headdraw(curarea);
197 areawinset(curarea->win);
198 sa->head_swap= WIN_BACK_OK;
199 screen_swapbuffers();
205 /* -- End of progress bar definitions ------- */
207 extern char temp_dir[]; /* XXXXX BAD BAD BAD from exotic.c */
212 error("Can't save VRML. Press TAB to leave EditMode");
215 if(temp_dir[0]==0) strcpy(temp_dir, G.sce);
217 activate_fileselect(FILE_SPECIAL, "Export VRML 1.0", temp_dir, write_vrml);
224 error("Can't save DXF. Press TAB to leave EditMode");
228 if(temp_dir[0]==0) strcpy(temp_dir, G.sce);
230 activate_fileselect(FILE_SPECIAL, "Export DXF", temp_dir, write_dxf);
237 error("Can't save STL. Press TAB to leave EditMode");
241 if(temp_dir[0]==0) strcpy(temp_dir, G.sce);
243 activate_fileselect(FILE_SPECIAL, "Export STL", temp_dir, write_stl);
248 int buttons_do_unpack()
253 int ret_value = RET_OK, count = 0;
255 count = countPackedFiles();
258 pupmenu("No packed files. Autopack disabled");
262 line += sprintf(line, "Unpack 1 file%%t");
264 line += sprintf(line, "Unpack %d files%%t", count);
266 line += sprintf(line, "|Use files in current directory (create when necessary)%%x%d", PF_USE_LOCAL);
267 line += sprintf(line, "|Write files to current directory (overwrite existing files)%%x%d", PF_WRITE_LOCAL);
268 line += sprintf(line, "|%%l|Use files in original location (create when necessary)%%x%d", PF_USE_ORIGINAL);
269 line += sprintf(line, "|Write files to original location (overwrite existing files)%%x%d", PF_WRITE_ORIGINAL);
270 line += sprintf(line, "|%%l|Disable AutoPack, keep all packed files %%x%d", PF_KEEP);
271 line += sprintf(line, "|Ask for each file %%x%d", PF_ASK);
276 ret_value = RET_CANCEL;
278 if (how != PF_KEEP) unpackAll(how);
279 G.fileflags &= ~G_AUTOPACK;
285 /* here, because of all creator stuff */
287 Scene *copy_scene(Scene *sce, int level)
290 * level 0: empty, only copy minimal stuff
291 * level 1: all objects shared
292 * level 2: all object-data shared
299 if (level==0) { /* Add Empty, minimal copy */
301 scen= add_scene(sce->id.name+2);
308 /* level 1+, but not level 0 */
309 scen= copy_libblock(sce);
310 duplicatelist(&(scen->base), &(sce->base));
314 id_us_plus((ID *)scen->world);
315 id_us_plus((ID *)scen->set);
320 scen->toolsettings= MEM_dupallocN(sce->toolsettings);
322 duplicatelist(&(scen->markers), &(sce->markers));
323 duplicatelist(&(scen->transform_spaces), &(sce->transform_spaces));
324 duplicatelist(&(scen->r.layers), &(sce->r.layers));
326 scen->nodetree= ntreeCopyTree(sce->nodetree, 0);
328 obase= sce->base.first;
329 base= scen->base.first;
331 id_us_plus(&base->object->id);
332 if(obase==sce->basact) scen->basact= base;
337 #ifndef DISABLE_PYTHON
338 BPY_copy_scriptlink(&sce->scriptlink);
341 sce->sculptdata.session = NULL;
342 if (sce->sculptdata.cumap) {
344 scen->sculptdata.cumap = curvemapping_copy(sce->sculptdata.cumap);
345 scen->sculptdata.session = NULL; /* this is only for temp data storage anyway */
346 for(a=0; a<MAX_MTEX; ++a) {
347 if (sce->sculptdata.mtex[a]) {
348 scen->sculptdata.mtex[a]= MEM_dupallocN(sce->sculptdata.mtex[a]);
354 // make a private copy of the avicodecdata
356 if (sce->r.avicodecdata) {
358 scen->r.avicodecdata = MEM_dupallocN(sce->r.avicodecdata);
359 scen->r.avicodecdata->lpFormat = MEM_dupallocN(scen->r.avicodecdata->lpFormat);
360 scen->r.avicodecdata->lpParms = MEM_dupallocN(scen->r.avicodecdata->lpParms);
363 // make a private copy of the qtcodecdata
365 if (sce->r.qtcodecdata) {
366 scen->r.qtcodecdata = MEM_dupallocN(sce->r.qtcodecdata);
367 scen->r.qtcodecdata->cdParms = MEM_dupallocN(scen->r.qtcodecdata->cdParms);
371 if(level==0 || level==1) return scen;
376 single_object_users(0);
379 ID_NEW(G.scene->camera);
384 id_us_plus(&scen->world->id);
385 scen->world= copy_world(scen->world);
387 single_obdata_users(0);
388 single_mat_users_expand();
389 single_tex_users_expand();
391 scen->radio= MEM_dupallocN(sce->radio);
399 void do_info_buttons(unsigned short event)
401 bScreen *sc, *oldscreen;
407 case B_INFOSCR: /* menu select screen */
409 if( G.curscreen->screennr== -2) {
410 if(curarea->winy <50) {
411 sa= closest_bigger_area();
414 activate_databrowse((ID *)G.curscreen, ID_SCR, 0, B_INFOSCR,
415 &G.curscreen->screennr, do_info_buttons);
418 if( G.curscreen->screennr < 0) return;
420 sc= G.main->screen.first;
423 if(nr==G.curscreen->screennr) {
424 if(is_allowed_to_change_screen(sc)) setscreen(sc);
425 else error("Unable to perform function in EditMode");
431 /* last item: NEW SCREEN */
433 nr= pupmenu("New Screen%t|Empty%x1|Duplicate%x2");
435 if(nr==1) default_twosplit();
436 if(nr==2) duplicate_screen();
440 /*do this event only with buttons, so it can never be called with full-window*/
442 if(G.curscreen->id.prev) sc= G.curscreen->id.prev;
443 else if(G.curscreen->id.next) sc= G.curscreen->id.next;
445 if(okee("Delete current screen")) {
446 /* find new G.curscreen */
448 oldscreen= G.curscreen;
449 setscreen(sc); /* this test if sc has a full */
450 unlink_screen(oldscreen);
451 free_libblock(&G.main->screen, oldscreen);
453 scrarea_queue_headredraw(curarea);
456 case B_INFOSCE: /* menu select scene */
458 if( G.curscreen->scenenr== -2) {
459 if(curarea->winy <50) {
460 sa= closest_bigger_area();
463 activate_databrowse((ID *)G.scene, ID_SCE, 0, B_INFOSCE,
464 &G.curscreen->scenenr, do_info_buttons);
467 if( G.curscreen->scenenr < 0) return;
469 sce= G.main->scene.first;
472 if(nr==G.curscreen->scenenr) {
473 if(sce!=G.scene) set_scene(sce);
479 /* last item: NEW SCENE */
481 nr= pupmenu("Add scene%t|Empty%x0|Link Objects%x1|Link ObData%x2|Full Copy%x3");
483 sce= copy_scene(G.scene, nr);
487 BIF_preview_changed(ID_TE);
492 if(G.scene->id.prev) sce= G.scene->id.prev;
493 else if(G.scene->id.next) sce= G.scene->id.next;
495 if(okee("Delete current scene")) {
496 /* Note, anything besides free_libblock needs to be added in
497 * Python Scene.c for Blender.Scene.Unlink() */
500 /* exit modes... could become single call once */
501 exit_editmode(EM_FREEDATA|EM_WAITCURSOR);
505 for (sce1= G.main->scene.first; sce1; sce1= sce1->id.next) {
506 if(sce1->set == G.scene) sce1->set= 0;
509 /* check all sequences */
510 clear_scene_in_allseqs(G.scene);
512 /* check render layer nodes in other scenes */
513 clear_scene_in_nodes(G.scene);
517 for (sc= G.main->screen.first; sc; sc= sc->id.next ) {
518 if(sc->scene == G.scene) sc->scene= sce;
520 free_libblock(&G.main->scene, G.scene);
529 static void check_packAll()
531 // first check for dirty images
534 for(ima = G.main->image.first; ima; ima= ima->id.next) {
535 if (ima->ibufs.first) { /* XXX FIX */
536 ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
538 if (ibuf && (ibuf->userflags &= IB_BITMAPDIRTY))
543 if (ima == NULL || okee("Some images are painted on. These changes will be lost. Continue ?")) {
545 G.fileflags |= G_AUTOPACK;
550 static void copy_game_dll(char *dll_filename, char *source_dir, char *dest_dir)
552 char source_filename[FILE_MAX];
553 char dest_filename[FILE_MAX];
555 strcpy( source_filename, source_dir );
556 strcat( source_filename, dll_filename );
558 strcpy( dest_filename, dest_dir );
559 strcat( dest_filename, dll_filename );
561 if(!BLI_exists(dest_filename)) {
562 BLI_copy_fileops( source_filename, dest_filename );
566 static void copy_all_game_dlls(char *str)
568 #define GAME_DLL_COUNT 7
569 char *game_dll_list[GAME_DLL_COUNT]={"gnu_gettext.dll", "libpng.dll", "libtiff.dll", "pthreadVC2.dll", "python25.dll", "SDL.dll", "zlib.dll"};
571 char dest_dir[FILE_MAX];
572 char source_dir[FILE_MAX];
575 strcpy(source_dir, get_install_dir());
576 strcat(source_dir, "\\");
577 BLI_split_dirfile_basic(str, dest_dir, NULL);
579 for (i= 0; i< GAME_DLL_COUNT; i++) {
580 copy_game_dll(game_dll_list[i], source_dir, dest_dir );
585 static int write_runtime(char *str, char *exename)
597 if (ext && (!BLI_testextensie(str, ext))) {
598 freestr= MEM_mallocN(strlen(str) + strlen(ext) + 1, "write_runtime_check");
599 sprintf(freestr,"%s%s", str, ext);
603 if (!BLI_exists(str) || saveover(str))
604 BLO_write_runtime(str, exename);
612 static void write_runtime_check_dynamic(char *str)
614 write_runtime(str, "blenderdynplayer.exe");
617 static void write_runtime_check(char *str)
621 strcpy(player, "blenderplayer");
624 strcat(player, ".exe");
628 strcat(player, ".app");
631 write_runtime(str, player);
634 // get a list of the .DLLs in the Blender folder and copy all of these to the destination folder if they don't exist
635 copy_all_game_dlls(str);
640 /* end keyed functions */
642 /************************** MAIN MENU *****************************/
643 /************************** FILE *****************************/
646 static void do_info_file_importmenu(void *arg, int event)
650 if(curarea->spacetype==SPACE_INFO) {
651 sa= find_biggest_area_of_type(SPACE_SCRIPT);
652 if (!sa) sa= closest_bigger_area();
656 #ifndef DISABLE_PYTHON
657 /* events >=3 are registered bpython scripts */
659 BPY_menu_do_python(PYMENU_IMPORT, event - 3);
660 BIF_undo_push("Import file");
667 activate_fileselect(FILE_BLENDER, "Import DXF", G.sce, BIF_read_file);
669 case 1: /* VRML 1.0 */
670 activate_fileselect(FILE_BLENDER, "Import VRML 1.0", G.sce, BIF_read_file);
673 activate_fileselect(FILE_BLENDER, "Import STL", G.sce, BIF_read_file);
678 allqueue(REDRAWINFO, 0);
681 static uiBlock *info_file_importmenu(void *arg_unused)
684 short yco = 20, menuwidth = 120;
685 #ifndef DISABLE_PYTHON
690 block= uiNewBlock(&curarea->uiblocks, "importmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
691 uiBlockSetButmFunc(block, do_info_file_importmenu, NULL);
692 //uiBlockSetXOfs(block, -50); // offset to parent button
694 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "VRML 1.0...",
695 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 1, "");
696 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "DXF...",
697 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 0, "");
698 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "STL...",
699 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 2, "");
700 #ifndef DISABLE_PYTHON
701 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
703 for (pym = BPyMenuTable[PYMENU_IMPORT]; pym; pym = pym->next, i++) {
704 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);
707 uiBlockSetDirection(block, UI_RIGHT);
708 uiTextBoundsBlock(block, 60);
713 static void do_info_file_exportmenu(void *arg, int event)
717 if(curarea->spacetype==SPACE_INFO) {
718 sa= find_biggest_area_of_type(SPACE_SCRIPT);
719 if (!sa) sa= closest_bigger_area();
722 #ifndef DISABLE_PYTHON
723 /* events >=3 are registered bpython scripts */
724 if (event >= 3) BPY_menu_do_python(PYMENU_EXPORT, event - 3);
739 allqueue(REDRAWINFO, 0);
742 static uiBlock *info_file_exportmenu(void *arg_unused)
745 short yco = 20, menuwidth = 120;
746 #ifndef DISABLE_PYTHON
751 block= uiNewBlock(&curarea->uiblocks, "exportmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
752 uiBlockSetButmFunc(block, do_info_file_exportmenu, NULL);
753 //uiBlockSetXOfs(block, -50); // offset to parent button
755 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "VRML 1.0...|Ctrl F2",
756 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 0, "");
757 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "DXF...|Shift F2",
758 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 1, "");
759 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "STL...",
760 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 2, "");
762 #ifndef DISABLE_PYTHON
763 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
765 /* note that we acount for the 3 previous entries with i+3: */
766 for (pym = BPyMenuTable[PYMENU_EXPORT]; pym; pym = pym->next, i++) {
767 uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19,
768 NULL, 0.0, 0.0, 1, i+3,
769 pym->tooltip?pym->tooltip:pym->filename);
773 uiBlockSetDirection(block, UI_RIGHT);
774 uiTextBoundsBlock(block, 60);
781 extern ListBase session_list;
783 static void do_verse_filemenu(void *arg, int event)
785 char address[64]; /* lenght of domain name is 63 characters or less */
786 VerseSession *session = NULL;
789 if(curarea->spacetype==SPACE_INFO) {
790 sa= closest_bigger_area();
797 printf("Connecting to localhost!\n");
798 b_verse_connect("localhost");
803 if(sbutton(address, 0, 63, "Server:")) {
805 printf("Connecting to %s\n", address);
806 b_verse_connect(address);
811 session = session_menu();
813 printf("Disconnecting session: %s!\n", session->address);
814 end_verse_session(session);
818 printf("Disconnecting all sessions!\n");
819 end_all_verse_sessions();
822 printf("sending get to master server\n");
828 static uiBlock *verse_filemenu(void *unusedargs)
831 short yco = 20, menuwidth = 120;
833 block= uiNewBlock(&curarea->uiblocks, "verse_filemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
834 uiBlockSetButmFunc(block, do_verse_filemenu, NULL);
836 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Connect to localhost", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
837 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Connect ...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
838 if(session_list.first != NULL) {
839 if(session_list.first != session_list.last) {
840 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Disconnect ...",
841 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
842 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Disconnect all",
843 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
846 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Disconnect",
847 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
851 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Get Servers", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
853 uiBlockSetDirection(block, UI_RIGHT);
854 uiTextBoundsBlock(block, 60);
860 static void do_info_filemenu(void *arg, int event)
865 if(curarea->spacetype==SPACE_INFO) {
866 sa= closest_bigger_area();
870 /* these are no defines, easier this way, the codes are in the function below */
873 if (okee("Erase All")) {
874 if (!BIF_read_homefile(0))
875 error("No file ~/.B.blend");
879 activate_fileselect(FILE_BLENDER, "Open", G.sce, BIF_read_file);
882 activate_fileselect(FILE_LOADLIB, "Load Library", G.lib, 0);
885 BLI_strncpy(dir, G.sce, FILE_MAX);
887 activate_fileselect(FILE_BLENDER, "Save As", dir, BIF_write_file);
890 BLI_strncpy(dir, G.sce, FILE_MAX);
892 activate_fileselect(FILE_BLENDER, "Save As", dir, BIF_write_file);
895 free_filesel_spec(dir);
898 case 6: /* save image */
899 BIF_save_rendered_image_fs();
902 activate_imageselect(FILE_LOADLIB, "Load Library", G.lib, 0);
904 case 22: /* save runtime */
905 activate_fileselect(FILE_SPECIAL, "Save Runtime", "", write_runtime_check);
907 case 23: /* save dynamic runtime */
908 activate_fileselect(FILE_SPECIAL, "Save Dynamic Runtime", "", write_runtime_check_dynamic);
919 case 15: /* recover previous session */
921 extern short winqueue_break; /* editscreen.c */
922 int save_over, retval = 0;
924 char scestr[FILE_MAX];
926 BLI_strncpy(scestr, G.sce, FILE_MAX); /* temporal store */
927 save_over = G.save_over;
928 BLI_make_file_string("/", str, btempdir, "quit.blend");
929 retval = BKE_read_file(str, NULL);
931 /*we successfully loaded a blend file, get sure that
933 if (retval!=0) G.relbase_valid = 1;
935 G.save_over = save_over;
936 strcpy(G.sce, scestr);
938 winqueue_break= 1; /* leave queues everywhere */
941 BKE_write_undo("Original"); /* save current state */
942 refresh_interface_font();
945 case 31: /* save default settings */
946 BIF_write_homefile();
949 if (okee("Erase All")) {
950 if (!BIF_read_homefile(1))
951 error("Can't read data from memory!");
954 case 35: /* compress toggle */
955 U.flag ^= (USER_FILECOMPRESS);
959 allqueue(REDRAWINFO, 0);
962 static void do_info_operecentmenu(void *arg, int event)
964 struct RecentFile *recent;
966 if(event==0 && G.sce[0]) {
967 BIF_read_file(G.sce);
970 recent = BLI_findlink(&(G.recent_files), event-1);
971 BIF_read_file(recent->filename);
975 static uiBlock *info_openrecentmenu(void *arg_unused)
978 short yco = 20, menuwidth = 120, i;
979 struct RecentFile *recent;
981 block= uiNewBlock(&curarea->uiblocks, "info_openrecentmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
982 uiBlockSetButmFunc(block, do_info_operecentmenu, NULL);
985 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, G.sce, 0, yco-=20,
986 menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
989 for (recent = G.recent_files.first, i=0; i<U.recent_files && recent; recent = recent->next, i++) {
990 if (strcmp(recent->filename, G.sce)!=0) {
991 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, recent->filename, 0, yco-=20,
992 menuwidth, 19, NULL, 0.0, 0.0, 1, i+1, "");
996 uiBlockSetDirection(block, UI_RIGHT);
997 uiTextBoundsBlock(block, 60);
1001 static void do_info_externalfiles(void *arg, int event)
1005 case 1: /* pack data */
1009 case 2: /* unpack to current dir */
1010 unpackAll(PF_WRITE_LOCAL);
1011 G.fileflags &= ~G_AUTOPACK;
1014 case 3: /* unpack data */
1015 if (buttons_do_unpack() != RET_CANCEL) {
1016 /* Clear autopack bit only if user selected one of the unpack options */
1017 G.fileflags &= ~G_AUTOPACK;
1020 case 10: /* make all paths relative */
1021 if (G.relbase_valid) {
1022 int tot,changed,failed,linked;
1024 char txtname[24]; /* text block name */
1026 makeFilesRelative(txtname, &tot, &changed, &failed, &linked);
1027 if (failed) sprintf(str, "Make Relative%%t|Total files %i|Changed %i|Failed %i, See Text \"%s\"|Linked %i", tot, changed, failed, txtname, linked);
1028 else sprintf(str, "Make Relative%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
1031 pupmenu("Can't set relative paths with an unsaved blend file");
1034 case 11: /* make all paths absolute */
1036 int tot,changed,failed,linked;
1038 char txtname[24]; /* text block name */
1040 makeFilesAbsolute(txtname, &tot, &changed, &failed, &linked);
1041 sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
1042 if (failed) sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i, See Text \"%s\"|Linked %i", tot, changed, failed, txtname, linked);
1043 else sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
1048 case 12: /* check images exist */
1050 char txtname[24]; /* text block name */
1053 /* run the missing file check */
1054 checkMissingFiles( txtname );
1056 if (txtname[0] == '\0') {
1057 okee("No external files missing");
1060 sprintf(str, "Missing files listed in Text \"%s\"", txtname );
1065 case 13: /* search for referenced files that are not available */
1066 if(curarea->spacetype==SPACE_INFO) {
1068 sa= closest_bigger_area();
1069 areawinset(sa->win);
1071 activate_fileselect(FILE_SPECIAL, "Find Missing Files", "", findMissingFiles);
1075 allqueue(REDRAWINFO, 0);
1078 static uiBlock *info_externalfiles(void *arg_unused)
1081 short yco = 20, menuwidth = 120;
1083 block= uiNewBlock(&curarea->uiblocks, "info_externalfiles", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1084 uiBlockSetButmFunc(block, do_info_externalfiles, NULL);
1086 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pack into .blend file", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1088 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");
1090 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Unpack into Files...", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1092 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1094 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make all Paths Relative", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 10, "");
1095 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make all Paths Absolute", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 11, "");
1096 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Report Missing Files...", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 12, "");
1097 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Find Missing Files...", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 13, "");
1099 uiBlockSetDirection(block, UI_RIGHT);
1100 uiTextBoundsBlock(block, 60);
1104 static uiBlock *info_filemenu(void *arg_unused)
1108 short menuwidth=120;
1110 block= uiNewBlock(&curarea->uiblocks, "info_filemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1111 uiBlockSetButmFunc(block, do_info_filemenu, NULL);
1113 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "New|Ctrl X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1114 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Open...|F1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1116 uiDefIconTextBlockBut(block, verse_filemenu, NULL, ICON_RIGHTARROW_THIN, "Verse", 0, yco-=20, menuwidth, 19, "");
1118 uiDefIconTextBlockBut(block, info_openrecentmenu, NULL, ICON_RIGHTARROW_THIN, "Open Recent",0, yco-=20, 120, 19, "");
1119 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recover Last Session", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
1121 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1123 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save|Ctrl W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1124 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save As...|F2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1126 if(U.flag & USER_FILECOMPRESS) {
1127 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Compress File", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 35, "Enable file compression");
1129 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Compress File", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 35, "Enable file compression");
1132 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1134 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Rendered Image...|F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1135 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Screenshot Subwindow|Ctrl F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 24, "");
1136 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Screenshot All|Ctrl Shift F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
1137 #if GAMEBLENDER == 1
1138 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Game As Runtime...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
1140 // uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Dynamic Runtime...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 23, "");
1143 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1145 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Default Settings|Ctrl U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 31, "");
1146 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Load Factory Settings", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 32, "");
1149 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1151 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append or Link|Shift F1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1152 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, "");
1153 uiDefIconTextBlockBut(block, info_file_importmenu, NULL, ICON_RIGHTARROW_THIN, "Import", 0, yco-=20, menuwidth, 19, "");
1154 uiDefIconTextBlockBut(block, info_file_exportmenu, NULL, ICON_RIGHTARROW_THIN, "Export", 0, yco-=20, menuwidth, 19, "");
1156 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1158 uiDefIconTextBlockBut(block, info_externalfiles, NULL, ICON_RIGHTARROW_THIN, "External Data",0, yco-=20, 120, 19, "");
1160 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1162 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Quit Blender|Ctrl Q", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
1164 uiBlockSetDirection(block, UI_DOWN);
1165 uiTextBoundsBlock(block, 80);
1170 /**************************** ADD ******************************/
1172 void do_info_add_meshmenu(void *arg, int event)
1174 #ifndef DISABLE_PYTHON
1176 BPY_menu_do_python(PYMENU_ADDMESH, event - 20);
1183 add_primitiveMesh(0);
1187 add_primitiveMesh(1);
1191 add_primitiveMesh(4);
1195 add_primitiveMesh(11);
1199 add_primitiveMesh(12);
1203 add_primitiveMesh(5);
1207 add_primitiveMesh(7);
1211 add_primitiveMesh(10);
1215 add_primitiveMesh(13);
1221 allqueue(REDRAWINFO, 0);
1224 static uiBlock *info_add_meshmenu(void *arg_unused)
1226 /* static short tog=0; */
1231 #ifndef DISABLE_PYTHON
1236 block= uiNewBlock(&curarea->uiblocks, "add_meshmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1237 uiBlockSetButmFunc(block, do_info_add_meshmenu, NULL);
1239 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Plane|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1240 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cube|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1241 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Circle|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1242 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "UVsphere", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1243 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "IcoSphere|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1244 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cylinder|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "");
1245 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cone|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 7, "");
1246 uiDefIconTextBut(block, SEPR, 0, ICON_BLANK1, "", 0, yco-=6, 160, 6, NULL, 0.0, 0.0, 0, 0, "");
1247 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grid|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 8, "");
1248 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Monkey|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 9, "");
1250 #ifndef DISABLE_PYTHON
1251 pym = BPyMenuTable[PYMENU_ADDMESH];
1253 uiDefIconTextBut(block, SEPR, 0, ICON_BLANK1, "", 0, yco-=6, 160, 6, NULL, 0.0, 0.0, 0, 0, "");
1255 for (; pym; pym = pym->next, i++) {
1256 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);
1261 uiBlockSetDirection(block, UI_RIGHT);
1262 uiTextBoundsBlock(block, 50);
1267 void do_info_add_curvemenu(void *arg, int event)
1273 add_primitiveCurve(10);
1277 add_primitiveCurve(11);
1281 add_primitiveCurve(40);
1285 add_primitiveCurve(41);
1289 add_primitiveCurve(46);
1294 allqueue(REDRAWINFO, 0);
1297 static uiBlock *info_add_curvemenu(void *arg_unused)
1299 /* static short tog=0; */
1303 block= uiNewBlock(&curarea->uiblocks, "add_curvemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1304 uiBlockSetButmFunc(block, do_info_add_curvemenu, NULL);
1306 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bezier Curve|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1307 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bezier Circle|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1308 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Curve|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1309 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Circle", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1310 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Path|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1312 uiBlockSetDirection(block, UI_RIGHT);
1313 uiTextBoundsBlock(block, 50);
1319 void do_info_add_surfacemenu(void *arg, int event)
1325 add_primitiveNurb(0);
1329 add_primitiveNurb(1);
1333 add_primitiveNurb(2);
1337 add_primitiveNurb(3);
1341 add_primitiveNurb(4);
1345 add_primitiveNurb(5);
1350 allqueue(REDRAWINFO, 0);
1353 static uiBlock *info_add_surfacemenu(void *arg_unused)
1355 /* static short tog=0; */
1359 block= uiNewBlock(&curarea->uiblocks, "add_surfacemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1360 uiBlockSetButmFunc(block, do_info_add_surfacemenu, NULL);
1362 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Curve|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1363 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Circle|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1364 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Surface|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1365 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Tube", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1366 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Sphere|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1367 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Donut|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "");
1368 uiBlockSetDirection(block, UI_RIGHT);
1369 uiTextBoundsBlock(block, 50);
1374 void do_info_add_metamenu(void *arg, int event)
1380 add_primitiveMball(1);
1384 add_primitiveMball(2);
1388 add_primitiveMball(3);
1392 add_primitiveMball(4);
1396 add_primitiveMball(5);
1401 allqueue(REDRAWINFO, 0);
1405 static uiBlock *info_add_metamenu(void *arg_unused)
1407 /* static short tog=0; */
1411 block= uiNewBlock(&curarea->uiblocks, "add_metamenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1412 uiBlockSetButmFunc(block, do_info_add_metamenu, NULL);
1414 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,"Meta Ball|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1415 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Tube|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1416 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Plane|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1417 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Ellipsoid|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1418 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Cube|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1420 uiBlockSetDirection(block, UI_RIGHT);
1421 uiTextBoundsBlock(block, 50);
1426 void do_info_add_lampmenu(void *arg, int event)
1431 add_objectLamp(LA_LOCAL);
1434 add_objectLamp(LA_SUN);
1437 add_objectLamp(LA_SPOT);
1440 add_objectLamp(LA_HEMI);
1443 add_objectLamp(LA_AREA);
1445 case 5: /* YafRay photon lamp */
1446 if (G.scene->r.renderer==R_YAFRAY)
1447 add_objectLamp(LA_YF_PHOTON);
1452 allqueue(REDRAWINFO, 0);
1455 static uiBlock *info_add_lampmenu(void *arg_unused)
1457 /* static short tog=0; */
1461 block= uiNewBlock(&curarea->uiblocks, "add_lampmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1462 uiBlockSetButmFunc(block, do_info_add_lampmenu, NULL);
1464 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lamp|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1465 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Sun|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1466 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Spot|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1467 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hemi|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1468 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Area|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1469 if (G.scene->r.renderer==R_YAFRAY)
1470 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Photon|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "");
1472 uiBlockSetDirection(block, UI_RIGHT);
1473 uiTextBoundsBlock(block, 50);
1478 static void do_info_add_groupmenu(void *arg, int event)
1482 add_object_draw(OB_EMPTY);
1485 ob->dup_group= BLI_findlink(&G.main->group, event);
1487 id_us_plus((ID *)ob->dup_group);
1488 ob->transflag |= OB_DUPLIGROUP;
1489 DAG_scene_sort(G.scene);
1494 static uiBlock *info_add_groupmenu(void *arg_unused)
1501 block= uiNewBlock(&curarea->uiblocks, "add_groupmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1502 uiBlockSetButmFunc(block, do_info_add_groupmenu, NULL);
1504 for(a=0, group= G.main->group.first; group; group= group->id.next, a++) {
1505 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, group->id.name+2, 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, a, "");
1508 uiBlockSetDirection(block, UI_RIGHT);
1509 uiTextBoundsBlock(block, 50);
1514 void do_info_addmenu(void *arg, int event)
1516 #ifndef DISABLE_PYTHON
1518 BPY_menu_do_python(PYMENU_ADD, event - 20);
1536 /* Text (argument is discarded) */
1537 add_primitiveFont(event);
1541 add_object_draw(OB_EMPTY);
1545 add_object_draw(OB_CAMERA);
1549 add_primitiveArmature(OB_ARMATURE);
1553 add_object_draw(OB_LATTICE);
1556 /* group instance not yet */
1562 allqueue(REDRAWINFO, 0);
1566 static uiBlock *info_addmenu(void *arg_unused)
1568 /* static short tog=0; */
1570 #ifndef DISABLE_PYTHON
1576 block= uiNewBlock(&curarea->uiblocks, "addmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1577 uiBlockSetButmFunc(block, do_info_addmenu, NULL);
1579 uiDefIconTextBlockBut(block, info_add_meshmenu, NULL, ICON_RIGHTARROW_THIN, "Mesh", 0, yco-=20, 120, 19, "");
1580 uiDefIconTextBlockBut(block, info_add_curvemenu, NULL, ICON_RIGHTARROW_THIN, "Curve", 0, yco-=20, 120, 19, "");
1581 uiDefIconTextBlockBut(block, info_add_surfacemenu, NULL, ICON_RIGHTARROW_THIN, "Surface", 0, yco-=20, 120, 19, "");
1582 uiDefIconTextBlockBut(block, info_add_metamenu, NULL, ICON_RIGHTARROW_THIN, "Meta", 0, yco-=20, 120, 19, "");
1583 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Text", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 4, "");
1584 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Empty", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 5, "");
1586 uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
1588 uiDefIconTextBlockBut(block, info_add_groupmenu, NULL, ICON_RIGHTARROW_THIN, "Group", 0, yco-=20, 120, 19, "");
1590 uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
1592 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 6, "");
1593 uiDefIconTextBlockBut(block, info_add_lampmenu, NULL, ICON_RIGHTARROW_THIN, "Lamp", 0, yco-=20, 120, 19, "");
1595 uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
1597 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Armature", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 8, "");
1598 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lattice", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 9, "");
1600 #ifndef DISABLE_PYTHON
1601 pym = BPyMenuTable[PYMENU_ADD];
1603 uiDefIconTextBut(block, SEPR, 0, ICON_BLANK1, "", 0, yco-=6, 1620, 6, NULL, 0.0, 0.0, 0, 0, "");
1605 for (; pym; pym = pym->next, i++) {
1606 uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, i+20, pym->tooltip?pym->tooltip:pym->filename);
1611 uiBlockSetDirection(block, UI_DOWN);
1612 uiTextBoundsBlock(block, 80);
1617 /************************** GAME *****************************/
1619 void do_info_game_glslmenu(void *arg, int event)
1622 case G_FILE_GLSL_NO_LIGHTS:
1623 case G_FILE_GLSL_NO_SHADERS:
1624 case G_FILE_GLSL_NO_SHADOWS:
1625 case G_FILE_GLSL_NO_RAMPS:
1626 case G_FILE_GLSL_NO_NODES:
1627 case G_FILE_GLSL_NO_EXTRA_TEX:
1628 G.fileflags ^= event;
1629 GPU_materials_free();
1630 allqueue(REDRAWINFO, 0);
1631 allqueue(REDRAWVIEW3D, 0);
1638 static uiBlock *info_game_glslmenu(void *arg_unused)
1641 short yco= 0, menuwidth=160;
1644 block= uiNewBlock(&curarea->uiblocks, "game_glslmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1645 uiBlockSetButmFunc(block, do_info_game_glslmenu, NULL);
1647 check = (G.fileflags & G_FILE_GLSL_NO_LIGHTS)? ICON_CHECKBOX_DEHLT: ICON_CHECKBOX_HLT;
1648 uiDefIconTextBut(block, BUTM, 1, check, "Enable Lights", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GLSL_NO_LIGHTS,
1649 "Enable using lights in GLSL materials.");
1650 check = (G.fileflags & G_FILE_GLSL_NO_SHADERS)? ICON_CHECKBOX_DEHLT: ICON_CHECKBOX_HLT;
1651 uiDefIconTextBut(block, BUTM, 1, check, "Enable Shaders", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GLSL_NO_SHADERS,
1652 "Enable using shaders other than Lambert in GLSL materials");
1653 check = (G.fileflags & G_FILE_GLSL_NO_SHADOWS)? ICON_CHECKBOX_DEHLT: ICON_CHECKBOX_HLT;
1654 uiDefIconTextBut(block, BUTM, 1, check, "Enable Shadows", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GLSL_NO_SHADOWS,
1655 "Enable using shadows in GLSL materials");
1656 check = (G.fileflags & G_FILE_GLSL_NO_RAMPS)? ICON_CHECKBOX_DEHLT: ICON_CHECKBOX_HLT;
1657 uiDefIconTextBut(block, BUTM, 1, check, "Enable Ramps", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GLSL_NO_RAMPS,
1658 "Enable using ramps in GLSL materials");
1659 check = (G.fileflags & G_FILE_GLSL_NO_NODES)? ICON_CHECKBOX_DEHLT: ICON_CHECKBOX_HLT;
1660 uiDefIconTextBut(block, BUTM, 1, check, "Enable Nodes", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GLSL_NO_NODES,
1661 "Enable using nodes in GLSL materials.");
1662 check = (G.fileflags & G_FILE_GLSL_NO_EXTRA_TEX)? ICON_CHECKBOX_DEHLT: ICON_CHECKBOX_HLT;
1663 uiDefIconTextBut(block, BUTM, 1, check, "Enable Extra Textures", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GLSL_NO_EXTRA_TEX,
1664 "Enable using texture channels other than Col and Alpha in GLSL materials.");
1666 uiBlockSetDirection(block, UI_RIGHT);
1667 uiTextBoundsBlock(block, 50);
1672 static void do_info_gamemenu(void *arg, int event)
1675 case G_FILE_ENABLE_ALL_FRAMES:
1676 case G_FILE_DISPLAY_LISTS:
1677 case G_FILE_SHOW_FRAMERATE:
1678 case G_FILE_SHOW_DEBUG_PROPS:
1679 case G_FILE_AUTOPLAY:
1680 case G_FILE_GAME_TO_IPO:
1681 case G_FILE_SHOW_PHYSICS:
1682 G.fileflags ^= event;
1684 case G_FILE_GAME_MAT|G_FILE_GAME_MAT_GLSL:
1685 G.fileflags &= ~(G_FILE_GAME_MAT|G_FILE_GAME_MAT_GLSL);
1687 case G_FILE_GAME_MAT:
1688 G.fileflags |= G_FILE_GAME_MAT;
1689 G.fileflags &= ~G_FILE_GAME_MAT_GLSL;
1691 case G_FILE_GAME_MAT_GLSL:
1692 if(!GPU_extensions_minimum_support())
1693 error("GLSL not supported with this graphics card or driver.");
1694 G.fileflags |= (G_FILE_GAME_MAT|G_FILE_GAME_MAT_GLSL);
1697 ; /* ignore the rest */
1701 static uiBlock *info_gamemenu(void *arg_unused)
1703 /* static short tog=0; */
1706 short menuwidth=120;
1708 block= uiNewBlock(&curarea->uiblocks, "gamemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1709 uiBlockSetButmFunc(block, do_info_gamemenu, NULL);
1711 uiDefIconTextBut(block, BUTM, B_STARTGAME, ICON_BLANK1, "Start Game|P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
1713 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 1, 0, "");
1716 if(G.fileflags & G_FILE_ENABLE_ALL_FRAMES) {
1717 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, "");
1719 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, "");
1722 if(G.fileflags & G_FILE_GAME_TO_IPO) {
1723 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, "");
1726 if(G.fileflags & G_FILE_DISPLAY_LISTS) {
1727 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Generate Display Lists", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_DISPLAY_LISTS, "");
1729 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Generate Display Lists", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_DISPLAY_LISTS, "");
1731 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, "");
1734 if(G.fileflags & G_FILE_SHOW_FRAMERATE) {
1735 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, "");
1737 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, "");
1741 if(G.fileflags & G_FILE_SHOW_PHYSICS) {
1742 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, "");
1744 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, "");
1747 if(G.fileflags & G_FILE_SHOW_DEBUG_PROPS) {
1748 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, "");
1750 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, "");
1753 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 1, 0, "");
1755 if(!(G.fileflags & G_FILE_GAME_MAT)) {
1756 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Texture Face Materials", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1758 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Texture Face Materials", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GAME_MAT|G_FILE_GAME_MAT_GLSL, "");
1761 if((G.fileflags & G_FILE_GAME_MAT) && !(G.fileflags & G_FILE_GAME_MAT_GLSL)) {
1762 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Blender Multitexture Materials", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1764 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Blender Multitexture Materials", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GAME_MAT, "");
1767 if((G.fileflags & G_FILE_GAME_MAT) && (G.fileflags & G_FILE_GAME_MAT_GLSL)) {
1768 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Blender GLSL Materials", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1770 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Blender GLSL Materials", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GAME_MAT_GLSL, "");
1773 uiDefIconTextBlockBut(block, info_game_glslmenu, NULL, ICON_RIGHTARROW_THIN, "GLSL Material Settings", 0, yco-=20, menuwidth, 19, "");
1775 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 1, 0, "");
1777 if(G.fileflags & G_FILE_AUTOPLAY) {
1778 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Autostart", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_AUTOPLAY, "");
1780 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Autostart", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_AUTOPLAY, "");
1783 uiBlockSetDirection(block, UI_DOWN);
1784 uiTextBoundsBlock(block, 70);
1788 /************************** TIMELINE *****************************/
1790 static void do_info_timelinemenu(void *arg, int event)
1792 /* needed to check for valid selected objects */
1795 //char file[FILE_MAXDIR+FILE_MAXFILE];
1798 if (base) ob= base->object;
1802 /* Show Keyframes */
1803 if (!ob) error("Select an object before showing its keyframes");
1804 else set_ob_ipoflags();
1807 /* Show and select Keyframes */
1808 if (!ob) error("Select an object before showing and selecting its keyframes");
1809 else select_select_keys();
1812 /* select next keyframe */
1813 if (!ob) error("Select an object before selecting its next keyframe");
1814 else nextkey_obipo(1);
1817 /* select previous keyframe */
1818 if (!ob) error("Select an object before selecting its previous keyframe");
1819 else nextkey_obipo(-1);
1823 if (!ob) error("Select an object before going to its next keyframe");
1824 else movekey_obipo(1);
1827 /* previous keyframe */
1828 if (!ob) error("Select an object before going to its previous keyframe");
1829 else movekey_obipo(-1);
1834 update_for_newframe();
1837 /* previous frame */
1840 update_for_newframe();
1843 /* forward 10 frames */
1845 update_for_newframe();
1848 /* back 10 frames */
1851 update_for_newframe();
1856 update_for_newframe();
1861 update_for_newframe();
1864 /* previous keyframe */
1865 nextprev_timeline_key(-1);
1869 nextprev_timeline_key(1);
1872 allqueue(REDRAWINFO, 0);
1875 static uiBlock *info_timelinemenu(void *arg_unused)
1877 /* static short tog=0; */
1881 short menuwidth=120;
1883 block= uiNewBlock(&curarea->uiblocks, "timelinemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1884 uiBlockSetButmFunc(block, do_info_timelinemenu, NULL);
1886 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Keyframes|K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1887 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show and Select Keyframes|Shift K",0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1888 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Next Keyframe|PageUp", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1889 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Previous Keyframe|PageDown", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1891 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1893 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Next Ob-Keyframe|Shift PageUp", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1894 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Previous Ob-Keyframe|Shift PageDown", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1896 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Next Keyframe|Ctrl PageUp", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
1897 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Previous Keyframe|Ctrl PageDown", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
1899 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1901 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Next Frame|RightArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1902 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Previous Frame|LeftArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
1904 sprintf(str, "Forward %d Frames|UpArrow", G.scene->jumpframe);
1905 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, str, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
1906 sprintf(str, "Back %d Frames|DownArrow", G.scene->jumpframe);
1907 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, str, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
1909 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1911 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "End Frame|Shift RightArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
1912 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Start Frame|Shift LeftArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
1914 uiBlockSetDirection(block, UI_DOWN);
1915 uiTextBoundsBlock(block, 80);
1920 /************************** RENDER *****************************/
1922 void do_info_render_bakemenu(void *arg, int event)
1926 G.scene->r.bake_flag ^= event;
1929 objects_bake_render_ui(event);
1932 allqueue(REDRAWINFO, 0);
1935 static uiBlock *info_render_bakemenu(void *arg_unused)
1938 short yco= 0, menuwidth=160;
1940 block= uiNewBlock(&curarea->uiblocks, "render_bakemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1941 uiBlockSetButmFunc(block, do_info_render_bakemenu, NULL);
1943 if(G.scene->r.bake_flag & R_BAKE_TO_ACTIVE) {
1944 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Selected to Active", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1946 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Selected to Active", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1949 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1951 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Full Render|Ctrl Alt B, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1952 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Ambient Occlusion|Ctrl Alt B, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1953 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Normals|Ctrl Alt B, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1954 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Texture Only|Ctrl Alt B, 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1955 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Displacement|Ctrl Alt B, 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1957 uiBlockSetDirection(block, UI_RIGHT);
1958 uiTextBoundsBlock(block, 50);
1963 static void do_info_rendermenu(void *arg, int event)
1966 extern void playback_anim();
1968 /* events >=10 are registered bpython scripts */
1970 if(curarea->spacetype==SPACE_INFO) {
1971 sa= find_biggest_area_of_type(SPACE_SCRIPT);
1972 if (!sa) sa= closest_bigger_area();
1973 areawinset(sa->win);
1975 #ifndef DISABLE_PYTHON
1976 BPY_menu_do_python(PYMENU_RENDER, event - 10);
1977 BIF_undo_push("Rendering Script");
1990 /* note: dont use select_area() for setting active areas for opengl render */
1991 /* its hackish and instable... code here was removed */
1994 BIF_toggle_render_display();
2000 /* dodgy hack turning on SHIFT key to do a proper render border select
2001 set_render_border(); only works when 3d window active
2003 This code copied from toolbox.c, only works when 3d window is cameraview */
2005 if(select_area(SPACE_VIEW3D)) {
2006 mainqenter(LEFTSHIFTKEY, 1);
2007 mainqenter(BKEY, 1);
2008 mainqenter(BKEY, 0);
2009 mainqenter(EXECUTE, 1);
2010 mainqenter(LEFTSHIFTKEY, 0);
2016 extern_set_butspace(F10KEY, 0);
2020 allqueue(REDRAWINFO, 0);
2023 static uiBlock *info_rendermenu(void *arg_unused)
2026 #ifndef DISABLE_PYTHON
2030 short menuwidth=120;
2033 block= uiNewBlock(&curarea->uiblocks, "rendermenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
2034 uiBlockSetButmFunc(block, do_info_rendermenu, NULL);
2036 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Current Frame|F12", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2037 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Animation|Ctrl F12", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2039 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2041 uiDefIconTextBlockBut(block, info_render_bakemenu, NULL, ICON_RIGHTARROW_THIN, "Bake Render Meshes", 0, yco-=20, 120, 19, "");
2043 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2045 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Render Buffer|F11", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2046 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Rendered Animation|Ctrl F11", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2048 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2050 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Render Border|Shift B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2052 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2054 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Settings|F10", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2056 #ifndef DISABLE_PYTHON
2057 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2059 for (pym = BPyMenuTable[PYMENU_RENDER]; pym; pym = pym->next, i++) {
2060 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);
2064 uiBlockSetDirection(block, UI_DOWN);
2065 uiTextBoundsBlock(block, 80);
2070 /************************** HELP *****************************/
2072 static void do_info_help_websitesmenu(void *arg, int event)
2074 #ifndef DISABLE_PYTHON
2075 BPY_menu_do_python(PYMENU_HELPWEBSITES, event);
2077 allqueue(REDRAWVIEW3D, 0);
2081 static uiBlock *info_help_websitesmenu(void *arg_unused)
2084 #ifndef DISABLE_PYTHON
2087 short yco = 20, menuwidth = 120;
2090 block= uiNewBlock(&curarea->uiblocks, "info_help_websitesmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2091 uiBlockSetButmFunc(block, do_info_help_websitesmenu, NULL);
2092 #ifndef DISABLE_PYTHON
2093 for (pym = BPyMenuTable[PYMENU_HELPWEBSITES]; pym; pym = pym->next, i++) {
2094 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);
2097 uiBlockSetDirection(block, UI_RIGHT);
2098 uiTextBoundsBlock(block, 60);
2103 static void do_info_help_systemmenu(void *arg, int event)
2105 /* events >=10 are registered bpython scripts */
2106 #ifndef DISABLE_PYTHON
2107 if (event >= 10) BPY_menu_do_python(PYMENU_HELPSYSTEM, event - 10);
2113 case 1: /* Benchmark */
2114 /* dodgy hack turning on CTRL ALT SHIFT key to do a benchmark
2115 * rather than copying lines and lines of code from toets.c :(
2118 if(select_area(SPACE_VIEW3D)) {
2119 mainqenter(LEFTSHIFTKEY, 1);
2120 mainqenter(LEFTCTRLKEY, 1);
2121 mainqenter(LEFTALTKEY, 1);
2122 mainqenter(TKEY, 1);
2123 mainqenter(TKEY, 0);
2124 mainqenter(EXECUTE, 1);
2125 mainqenter(LEFTSHIFTKEY, 0);
2126 mainqenter(LEFTCTRLKEY, 0);
2127 mainqenter(LEFTALTKEY, 0);
2133 allqueue(REDRAWVIEW3D, 0);
2137 static uiBlock *info_help_systemmenu(void *arg_unused)
2140 #ifndef DISABLE_PYTHON
2143 short yco = 20, menuwidth = 120;
2146 block= uiNewBlock(&curarea->uiblocks, "info_help_systemmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2147 uiBlockSetButmFunc(block, do_info_help_systemmenu, NULL);
2149 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Benchmark", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2150 #ifndef DISABLE_PYTHON
2151 for (pym = BPyMenuTable[PYMENU_HELPSYSTEM]; pym; pym = pym->next, i++) {
2152 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);
2155 uiBlockSetDirection(block, UI_RIGHT);
2156 uiTextBoundsBlock(block, 60);
2161 static void do_info_helpmenu(void *arg, int event)
2165 if(curarea->spacetype==SPACE_INFO) {
2166 sa= find_biggest_area_of_type(SPACE_SCRIPT);
2167 if (!sa) sa= closest_bigger_area();
2168 areawinset(sa->win);
2171 /* events >=10 are registered bpython scripts */
2172 #ifndef DISABLE_PYTHON
2173 if (event >= 10) BPY_menu_do_python(PYMENU_HELP, event - 10);
2179 case 0: /* About Blender */
2184 allqueue(REDRAWINFO, 0);
2187 static uiBlock *info_helpmenu(void *arg_unused)
2189 /* static short tog=0; */
2192 short menuwidth=120;
2193 #ifndef DISABLE_PYTHON
2198 block= uiNewBlock(&curarea->uiblocks, "info_helpmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
2199 uiBlockSetButmFunc(block, do_info_helpmenu, NULL);
2201 uiDefIconTextBut(block, BUTM, B_SHOWSPLASH, ICON_BLANK1, "About Blender...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2202 #ifndef DISABLE_PYTHON
2203 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2205 for (pym = BPyMenuTable[PYMENU_HELP]; pym; pym = pym->next, i++) {
2206 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);
2209 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2211 uiDefIconTextBlockBut(block, info_help_websitesmenu, NULL, ICON_RIGHTARROW_THIN, "Websites", 0, yco-=20, 120, 19, "");
2213 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2215 uiDefIconTextBlockBut(block, info_help_systemmenu, NULL, ICON_RIGHTARROW_THIN, "System", 0, yco-=20, 120, 19, "");
2217 uiBlockSetDirection(block, UI_DOWN);
2218 uiTextBoundsBlock(block, 80);
2223 /************************** END MAIN MENU *****************************/
2224 /* ugly global yes, for renderwin.c to write to */
2225 char info_time_str[32]="";
2227 static void info_text(int x, int y)
2230 extern float hashvectf[];
2231 uintptr_t mem_in_use, mmap_in_use;
2232 unsigned int swatch_color;
2233 float fac1, fac2, fac3;
2234 char infostr[300], memstr[64];
2235 char *headerstr, *s;
2238 mem_in_use= MEM_get_memory_in_use();
2239 mmap_in_use= MEM_get_mapped_memory_in_use();
2241 s= memstr + sprintf(memstr," | Mem:%.2fM ", ((mem_in_use-mmap_in_use)>>10)/1024.0);
2243 sprintf(s,"(%.2fM) ", ((mmap_in_use)>>10)/1024.0);
2249 s+= sprintf(s, "%s", G.editModeTitleExtra);
2250 if(G.obedit->type==OB_MESH) {
2251 if(G.scene->selectmode & SCE_SELECT_VERTEX)
2252 s+= sprintf(s,"Ve:%d-%d | Ed:%d-%d | Fa:%d-%d",
2253 G.totvertsel, G.totvert, G.totedgesel, G.totedge, G.totfacesel, G.totface);
2254 else if(G.scene->selectmode & SCE_SELECT_EDGE)
2255 s+= sprintf(s,"Ed:%d-%d | Fa:%d-%d",
2256 G.totedgesel, G.totedge, G.totfacesel, G.totface);
2258 s+= sprintf(s,"Fa:%d-%d", G.totfacesel, G.totface);
2260 else if(G.obedit->type==OB_ARMATURE) {
2261 s+= sprintf(s,"Ve:%d-%d | Bo:%d-%d", G.totvertsel, G.totvert, G.totbonesel, G.totbone);
2264 s+= sprintf(s,"Ve:%d-%d", G.totvertsel, G.totvert);
2269 else if(ob && (ob->flag & OB_POSEMODE)) {
2270 sprintf(infostr,"Bo:%d-%d %s",
2271 G.totbonesel, G.totbone, memstr);
2274 sprintf(infostr,"Ve:%d | Fa:%d | Ob:%d-%d | La:%d %s | Time:%s | ",
2275 G.totvert, G.totface, G.totobj, G.totobjsel, G.totlamp, memstr, info_time_str);
2278 strcat(infostr, ob->id.name+2);
2281 if (g_progress_bar && g_progress_info) {
2282 headerstr= g_progress_info;
2284 headerstr= versionstr;
2287 if (g_progress_bar) {
2288 hsize = 4 + (138.0 * g_done);
2289 fac1 = 0.5 * g_done; /* do some rainbow colors on progress */
2293 hsize= 30+BIF_GetStringWidth(G.font, headerstr, (U.transopts & USER_TR_BUTTONS));
2295 /* promise! Never change these lines again! (zr & ton did!) */
2296 fac1= fabs(hashvectf[ 2*G.version+4]);
2297 fac2= 0.5+0.1*hashvectf[ G.version+3];
2301 swatch_color= hsv_to_cpack(fac1, fac2, fac3);
2303 cpack( swatch_color );
2304 glRecti(x-24, y-6, x-30+hsize, y+14);
2306 glColor3ub(0, 0, 0); /* makes text black colored rect */
2308 glRasterPos2i(x, y);
2309 BIF_RasterPos(x, y);
2311 BIF_DrawString(G.font, headerstr, (U.transopts & USER_TR_MENUS));
2312 hsize= BIF_GetStringWidth(G.font, headerstr, (U.transopts & USER_TR_BUTTONS));
2314 BIF_ThemeColor(TH_MENU_TEXT); /* makes text readable on dark theme */
2316 glRasterPos2i(x+hsize+10, y);
2317 BIF_RasterPos(x+hsize+10, y);
2319 BIF_DrawString(G.font, infostr, (U.transopts & USER_TR_MENUS));
2322 void info_buttons(void)
2328 block= uiNewBlock(&curarea->uiblocks, "header info", UI_EMBOSSN, UI_HELV, curarea->headwin);
2330 if(area_is_active_area(curarea)) uiBlockSetCol(block, TH_HEADER);
2331 else uiBlockSetCol(block, TH_HEADERDESEL);
2333 if(curarea->flag & HEADER_NO_PULLDOWN) {
2334 uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_RIGHT,
2336 &(curarea->flag), 0, 0, 0, 0, "Enables display of pulldown menus");
2338 uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_DOWN,
2340 &(curarea->flag), 0, 0, 0, 0, "Hides pulldown menus");
2344 if((curarea->flag & HEADER_NO_PULLDOWN)==0) {
2346 uiBlockSetEmboss(block, UI_EMBOSSP);
2348 /* the 'xmax - 3' rather than xmax is to prevent some weird flickering where the highlighted
2349 * menu is drawn wider than it should be. The ypos of -1 is to make it properly fill the
2350 * height of the header */
2351 xmax= GetButStringLength("File");
2352 uiDefPulldownBut(block, info_filemenu, NULL, "File", xco, -1, xmax-3, 22, "");
2355 xmax= GetButStringLength("Add");
2356 uiDefPulldownBut(block, info_addmenu, NULL, "Add", xco, -1, xmax-3, 22, "");
2359 xmax= GetButStringLength("Timeline");
2360 uiDefPulldownBut(block, info_timelinemenu, NULL, "Timeline", xco, -1, xmax-3, 22, "");
2363 xmax= GetButStringLength("Game");
2364 uiDefPulldownBut(block, info_gamemenu, NULL, "Game", xco, -1, xmax-3, 22, "");
2367 xmax= GetButStringLength("Render");
2368 uiDefPulldownBut(block, info_rendermenu, NULL, "Render", xco, -1, xmax-3, 22, "");
2371 xmax= GetButStringLength("Help");
2372 uiDefPulldownBut(block, info_helpmenu, NULL, "Help", xco, -1, xmax-3, 22, "");
2377 /* pack icon indicates a packed file */
2379 if (G.fileflags & G_AUTOPACK) {
2380 uiBlockSetEmboss(block, UI_EMBOSSN);
2381 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.");
2385 if (curarea->full == 0) {
2386 curarea->butspacetype= SPACE_INFO;
2387 uiBlockSetEmboss(block, UI_EMBOSS);
2388 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.");
2390 /* STD SCREEN BUTTONS */
2391 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);
2395 /* STD SCENE BUTTONS */
2396 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);
2400 BIF_SetScale(block->aspect);
2401 info_text(xco+24, 6);
2403 uiBlockSetEmboss(block, UI_EMBOSSN);
2404 uiDefIconBut(block, BUT, B_SHOWSPLASH, ICON_BLENDER, xco+2, 0,XIC,YIC, 0, 0, 0, 0, 0, "Click to display Splash Screen");
2406 /* always do as last */
2407 curarea->headbutlen= xco+2*XIC;
2410 // #ifdef _WIN32 // FULLSCREEN
2411 if(U.uiflag & USER_FLIPFULLSCREEN) {
2412 uiDefIconBut(block, BUT, B_FLIPFULLSCREEN, ICON_WINDOW_WINDOW,
2413 (short)(curarea->winx-XIC-5), 0,XIC,YIC,
2414 0, 0, 0, 0, 0, "Toggles Blender to fullscreen mode");/* dir */
2416 uiDefIconBut(block, BUT, B_FLIPFULLSCREEN, ICON_WINDOW_FULLSCREEN,
2417 (short)(curarea->winx-XIC-5), 0,XIC,YIC,
2418 0, 0, 0, 0, 0, "Toggles Blender to fullscreen mode");/* dir */