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 #include "BPY_extern.h"
119 #include "BPY_menus.h"
121 #include "GPU_extensions.h"
122 #include "GPU_material.h"
125 #include "interface.h"
126 #include "mydevice.h"
128 extern char versionstr[]; /* from blender.c */
130 /*----------------------------------*/
131 /* Progress bar vars and functions: */
133 /* strubi shamelessly abused the status line as a progress bar...
134 * feel free to kill him after release */
136 static int g_progress_bar = 0;
137 static char *g_progress_info = 0;
140 int start_progress_bar(void)
143 return 1; // we never fail (yet)
146 void end_progress_bar(void)
151 static void update_progress_bar(float done, char *info)
154 g_progress_info = info;
158 'done': a value between 0.0 and 1.0, showing progress
159 'info': a info text what is currently being done
161 Make sure that the progress bar is always called with:
164 done = 1.0 last -- or alternatively use:
167 do_stuff_and_callback_progress_bar();
171 int progress_bar(float done, char *busy_info)
176 /* User break (ESC) */
178 if (extern_qread(&val) == ESCKEY)
182 start_progress_bar();
183 } else if (done > 0.99) {
187 sa= G.curscreen->areabase.first;
189 if (sa->spacetype == SPACE_INFO) {
190 update_progress_bar(done, busy_info);
194 scrarea_do_headdraw(curarea);
195 areawinset(curarea->win);
196 sa->head_swap= WIN_BACK_OK;
197 screen_swapbuffers();
203 /* -- End of progress bar definitions ------- */
205 extern char temp_dir[]; /* XXXXX BAD BAD BAD from exotic.c */
210 error("Can't save VRML. Press TAB to leave EditMode");
213 if(temp_dir[0]==0) strcpy(temp_dir, G.sce);
215 activate_fileselect(FILE_SPECIAL, "Export VRML 1.0", temp_dir, write_vrml);
222 error("Can't save DXF. Press TAB to leave EditMode");
226 if(temp_dir[0]==0) strcpy(temp_dir, G.sce);
228 activate_fileselect(FILE_SPECIAL, "Export DXF", temp_dir, write_dxf);
235 error("Can't save STL. Press TAB to leave EditMode");
239 if(temp_dir[0]==0) strcpy(temp_dir, G.sce);
241 activate_fileselect(FILE_SPECIAL, "Export STL", temp_dir, write_stl);
246 int buttons_do_unpack()
251 int ret_value = RET_OK, count = 0;
253 count = countPackedFiles();
256 pupmenu("No packed files. Autopack disabled");
260 line += sprintf(line, "Unpack 1 file%%t");
262 line += sprintf(line, "Unpack %d files%%t", count);
264 line += sprintf(line, "|Use files in current directory (create when necessary)%%x%d", PF_USE_LOCAL);
265 line += sprintf(line, "|Write files to current directory (overwrite existing files)%%x%d", PF_WRITE_LOCAL);
266 line += sprintf(line, "|%%l|Use files in original location (create when necessary)%%x%d", PF_USE_ORIGINAL);
267 line += sprintf(line, "|Write files to original location (overwrite existing files)%%x%d", PF_WRITE_ORIGINAL);
268 line += sprintf(line, "|%%l|Disable AutoPack, keep all packed files %%x%d", PF_KEEP);
269 line += sprintf(line, "|Ask for each file %%x%d", PF_ASK);
274 ret_value = RET_CANCEL;
276 if (how != PF_KEEP) unpackAll(how);
277 G.fileflags &= ~G_AUTOPACK;
283 /* here, because of all creator stuff */
285 Scene *copy_scene(Scene *sce, int level)
288 * level 0: empty, only copy minimal stuff
289 * level 1: all objects shared
290 * level 2: all object-data shared
297 if (level==0) { /* Add Empty, minimal copy */
299 scen= add_scene(sce->id.name+2);
306 /* level 1+, but not level 0 */
307 scen= copy_libblock(sce);
308 duplicatelist(&(scen->base), &(sce->base));
312 id_us_plus((ID *)scen->world);
313 id_us_plus((ID *)scen->set);
318 scen->toolsettings= MEM_dupallocN(sce->toolsettings);
320 duplicatelist(&(scen->markers), &(sce->markers));
321 duplicatelist(&(scen->transform_spaces), &(sce->transform_spaces));
322 duplicatelist(&(scen->r.layers), &(sce->r.layers));
324 scen->nodetree= ntreeCopyTree(sce->nodetree, 0);
326 obase= sce->base.first;
327 base= scen->base.first;
329 id_us_plus(&base->object->id);
330 if(obase==sce->basact) scen->basact= base;
335 BPY_copy_scriptlink(&sce->scriptlink);
338 sce->sculptdata.session = NULL;
339 if (sce->sculptdata.cumap) {
341 scen->sculptdata.cumap = curvemapping_copy(sce->sculptdata.cumap);
342 scen->sculptdata.session = NULL; /* this is only for temp data storage anyway */
343 for(a=0; a<MAX_MTEX; ++a) {
344 if (sce->sculptdata.mtex[a]) {
345 scen->sculptdata.mtex[a]= MEM_dupallocN(sce->sculptdata.mtex[a]);
351 // make a private copy of the avicodecdata
353 if (sce->r.avicodecdata) {
355 scen->r.avicodecdata = MEM_dupallocN(sce->r.avicodecdata);
356 scen->r.avicodecdata->lpFormat = MEM_dupallocN(scen->r.avicodecdata->lpFormat);
357 scen->r.avicodecdata->lpParms = MEM_dupallocN(scen->r.avicodecdata->lpParms);
360 // make a private copy of the qtcodecdata
362 if (sce->r.qtcodecdata) {
363 scen->r.qtcodecdata = MEM_dupallocN(sce->r.qtcodecdata);
364 scen->r.qtcodecdata->cdParms = MEM_dupallocN(scen->r.qtcodecdata->cdParms);
368 if(level==0 || level==1) return scen;
373 single_object_users(0);
376 ID_NEW(G.scene->camera);
381 id_us_plus(&scen->world->id);
382 scen->world= copy_world(scen->world);
384 single_obdata_users(0);
385 single_mat_users_expand();
386 single_tex_users_expand();
388 scen->radio= MEM_dupallocN(sce->radio);
396 void do_info_buttons(unsigned short event)
398 bScreen *sc, *oldscreen;
404 case B_INFOSCR: /* menu select screen */
406 if( G.curscreen->screennr== -2) {
407 if(curarea->winy <50) {
408 sa= closest_bigger_area();
411 activate_databrowse((ID *)G.curscreen, ID_SCR, 0, B_INFOSCR,
412 &G.curscreen->screennr, do_info_buttons);
415 if( G.curscreen->screennr < 0) return;
417 sc= G.main->screen.first;
420 if(nr==G.curscreen->screennr) {
421 if(is_allowed_to_change_screen(sc)) setscreen(sc);
422 else error("Unable to perform function in EditMode");
428 /* last item: NEW SCREEN */
430 nr= pupmenu("New Screen%t|Empty%x1|Duplicate%x2");
432 if(nr==1) default_twosplit();
433 if(nr==2) duplicate_screen();
437 /*do this event only with buttons, so it can never be called with full-window*/
439 if(G.curscreen->id.prev) sc= G.curscreen->id.prev;
440 else if(G.curscreen->id.next) sc= G.curscreen->id.next;
442 if(okee("Delete current screen")) {
443 /* find new G.curscreen */
445 oldscreen= G.curscreen;
446 setscreen(sc); /* this test if sc has a full */
447 unlink_screen(oldscreen);
448 free_libblock(&G.main->screen, oldscreen);
450 scrarea_queue_headredraw(curarea);
453 case B_INFOSCE: /* menu select scene */
455 if( G.curscreen->scenenr== -2) {
456 if(curarea->winy <50) {
457 sa= closest_bigger_area();
460 activate_databrowse((ID *)G.scene, ID_SCE, 0, B_INFOSCE,
461 &G.curscreen->scenenr, do_info_buttons);
464 if( G.curscreen->scenenr < 0) return;
466 sce= G.main->scene.first;
469 if(nr==G.curscreen->scenenr) {
470 if(sce!=G.scene) set_scene(sce);
476 /* last item: NEW SCENE */
478 nr= pupmenu("Add scene%t|Empty%x0|Link Objects%x1|Link ObData%x2|Full Copy%x3");
480 sce= copy_scene(G.scene, nr);
484 BIF_preview_changed(ID_TE);
489 if(G.scene->id.prev) sce= G.scene->id.prev;
490 else if(G.scene->id.next) sce= G.scene->id.next;
492 if(okee("Delete current scene")) {
493 /* Note, anything besides free_libblock needs to be added in
494 * Python Scene.c for Blender.Scene.Unlink() */
497 /* exit modes... could become single call once */
498 exit_editmode(EM_FREEDATA|EM_WAITCURSOR);
502 for (sce1= G.main->scene.first; sce1; sce1= sce1->id.next) {
503 if(sce1->set == G.scene) sce1->set= 0;
506 /* check all sequences */
507 clear_scene_in_allseqs(G.scene);
509 /* check render layer nodes in other scenes */
510 clear_scene_in_nodes(G.scene);
514 for (sc= G.main->screen.first; sc; sc= sc->id.next ) {
515 if(sc->scene == G.scene) sc->scene= sce;
517 free_libblock(&G.main->scene, G.scene);
526 static void check_packAll()
528 // first check for dirty images
531 for(ima = G.main->image.first; ima; ima= ima->id.next) {
532 if (ima->ibufs.first) { /* XXX FIX */
533 ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
535 if (ibuf && (ibuf->userflags &= IB_BITMAPDIRTY))
540 if (ima == NULL || okee("Some images are painted on. These changes will be lost. Continue ?")) {
542 G.fileflags |= G_AUTOPACK;
547 static void copy_game_dll(char *dll_filename, char *source_dir, char *dest_dir)
549 char source_filename[FILE_MAX];
550 char dest_filename[FILE_MAX];
552 strcpy( source_filename, source_dir );
553 strcat( source_filename, dll_filename );
555 strcpy( dest_filename, dest_dir );
556 strcat( dest_filename, dll_filename );
558 if(!BLI_exists(dest_filename)) {
559 BLI_copy_fileops( source_filename, dest_filename );
563 static void copy_all_game_dlls(char *str)
565 #define GAME_DLL_COUNT 7
566 char *game_dll_list[GAME_DLL_COUNT]={"gnu_gettext.dll", "libpng.dll", "libtiff.dll", "pthreadVC2.dll", "python25.dll", "SDL.dll", "zlib.dll"};
568 char dest_dir[FILE_MAX];
569 char source_dir[FILE_MAX];
572 strcpy(source_dir, get_install_dir());
573 strcat(source_dir, "\\");
574 BLI_split_dirfile_basic(str, dest_dir, NULL);
576 for (i= 0; i< GAME_DLL_COUNT; i++) {
577 copy_game_dll(game_dll_list[i], source_dir, dest_dir );
582 static int write_runtime(char *str, char *exename)
594 if (ext && (!BLI_testextensie(str, ext))) {
595 freestr= MEM_mallocN(strlen(str) + strlen(ext) + 1, "write_runtime_check");
596 sprintf(freestr,"%s%s", str, ext);
600 if (!BLI_exists(str) || saveover(str))
601 BLO_write_runtime(str, exename);
609 static void write_runtime_check_dynamic(char *str)
611 write_runtime(str, "blenderdynplayer.exe");
614 static void write_runtime_check(char *str)
618 strcpy(player, "blenderplayer");
621 strcat(player, ".exe");
625 strcat(player, ".app");
628 write_runtime(str, player);
631 // get a list of the .DLLs in the Blender folder and copy all of these to the destination folder if they don't exist
632 copy_all_game_dlls(str);
637 /* end keyed functions */
639 /************************** MAIN MENU *****************************/
640 /************************** FILE *****************************/
643 static void do_info_file_importmenu(void *arg, int event)
647 if(curarea->spacetype==SPACE_INFO) {
648 sa= find_biggest_area_of_type(SPACE_SCRIPT);
649 if (!sa) sa= closest_bigger_area();
653 /* events >=3 are registered bpython scripts */
655 BPY_menu_do_python(PYMENU_IMPORT, event - 3);
656 BIF_undo_push("Import file");
662 activate_fileselect(FILE_BLENDER, "Import DXF", G.sce, BIF_read_file);
664 case 1: /* VRML 1.0 */
665 activate_fileselect(FILE_BLENDER, "Import VRML 1.0", G.sce, BIF_read_file);
668 activate_fileselect(FILE_BLENDER, "Import STL", G.sce, BIF_read_file);
673 allqueue(REDRAWINFO, 0);
676 static uiBlock *info_file_importmenu(void *arg_unused)
679 short yco = 20, menuwidth = 120;
683 block= uiNewBlock(&curarea->uiblocks, "importmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
684 uiBlockSetButmFunc(block, do_info_file_importmenu, NULL);
685 //uiBlockSetXOfs(block, -50); // offset to parent button
687 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "VRML 1.0...",
688 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 1, "");
689 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "DXF...",
690 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 0, "");
691 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "STL...",
692 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 2, "");
694 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
696 for (pym = BPyMenuTable[PYMENU_IMPORT]; pym; pym = pym->next, i++) {
697 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);
700 uiBlockSetDirection(block, UI_RIGHT);
701 uiTextBoundsBlock(block, 60);
706 static void do_info_file_exportmenu(void *arg, int event)
710 if(curarea->spacetype==SPACE_INFO) {
711 sa= find_biggest_area_of_type(SPACE_SCRIPT);
712 if (!sa) sa= closest_bigger_area();
716 /* events >=3 are registered bpython scripts */
717 if (event >= 3) BPY_menu_do_python(PYMENU_EXPORT, event - 3);
731 allqueue(REDRAWINFO, 0);
734 static uiBlock *info_file_exportmenu(void *arg_unused)
737 short yco = 20, menuwidth = 120;
741 block= uiNewBlock(&curarea->uiblocks, "exportmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
742 uiBlockSetButmFunc(block, do_info_file_exportmenu, NULL);
743 //uiBlockSetXOfs(block, -50); // offset to parent button
745 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "VRML 1.0...|Ctrl F2",
746 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 0, "");
747 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "DXF...|Shift F2",
748 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 1, "");
749 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "STL...",
750 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 2, "");
752 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
754 /* note that we acount for the 3 previous entries with i+3: */
755 for (pym = BPyMenuTable[PYMENU_EXPORT]; pym; pym = pym->next, i++) {
756 uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19,
757 NULL, 0.0, 0.0, 1, i+3,
758 pym->tooltip?pym->tooltip:pym->filename);
762 uiBlockSetDirection(block, UI_RIGHT);
763 uiTextBoundsBlock(block, 60);
770 extern ListBase session_list;
772 static void do_verse_filemenu(void *arg, int event)
774 char address[64]; /* lenght of domain name is 63 characters or less */
775 VerseSession *session = NULL;
778 if(curarea->spacetype==SPACE_INFO) {
779 sa= closest_bigger_area();
786 printf("Connecting to localhost!\n");
787 b_verse_connect("localhost");
792 if(sbutton(address, 0, 63, "Server:")) {
794 printf("Connecting to %s\n", address);
795 b_verse_connect(address);
800 session = session_menu();
802 printf("Disconnecting session: %s!\n", session->address);
803 end_verse_session(session);
807 printf("Disconnecting all sessions!\n");
808 end_all_verse_sessions();
811 printf("sending get to master server\n");
817 static uiBlock *verse_filemenu(void *unusedargs)
820 short yco = 20, menuwidth = 120;
822 block= uiNewBlock(&curarea->uiblocks, "verse_filemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
823 uiBlockSetButmFunc(block, do_verse_filemenu, NULL);
825 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Connect to localhost", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
826 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Connect ...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
827 if(session_list.first != NULL) {
828 if(session_list.first != session_list.last) {
829 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Disconnect ...",
830 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
831 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Disconnect all",
832 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
835 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Disconnect",
836 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
840 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Get Servers", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
842 uiBlockSetDirection(block, UI_RIGHT);
843 uiTextBoundsBlock(block, 60);
849 static void do_info_filemenu(void *arg, int event)
854 if(curarea->spacetype==SPACE_INFO) {
855 sa= closest_bigger_area();
859 /* these are no defines, easier this way, the codes are in the function below */
862 if (okee("Erase All")) {
863 if (!BIF_read_homefile(0))
864 error("No file ~/.B.blend");
868 activate_fileselect(FILE_BLENDER, "Open", G.sce, BIF_read_file);
871 activate_fileselect(FILE_LOADLIB, "Load Library", G.lib, 0);
874 BLI_strncpy(dir, G.sce, FILE_MAX);
876 activate_fileselect(FILE_BLENDER, "Save As", dir, BIF_write_file);
879 BLI_strncpy(dir, G.sce, FILE_MAX);
881 activate_fileselect(FILE_BLENDER, "Save As", dir, BIF_write_file);
884 free_filesel_spec(dir);
887 case 6: /* save image */
888 BIF_save_rendered_image_fs();
891 activate_imageselect(FILE_LOADLIB, "Load Library", G.lib, 0);
893 case 22: /* save runtime */
894 activate_fileselect(FILE_SPECIAL, "Save Runtime", "", write_runtime_check);
896 case 23: /* save dynamic runtime */
897 activate_fileselect(FILE_SPECIAL, "Save Dynamic Runtime", "", write_runtime_check_dynamic);
908 case 15: /* recover previous session */
910 extern short winqueue_break; /* editscreen.c */
911 int save_over, retval = 0;
913 char scestr[FILE_MAX];
915 BLI_strncpy(scestr, G.sce, FILE_MAX); /* temporal store */
916 save_over = G.save_over;
917 BLI_make_file_string("/", str, btempdir, "quit.blend");
918 retval = BKE_read_file(str, NULL);
920 /*we successfully loaded a blend file, get sure that
922 if (retval!=0) G.relbase_valid = 1;
924 G.save_over = save_over;
925 strcpy(G.sce, scestr);
927 winqueue_break= 1; /* leave queues everywhere */
930 BKE_write_undo("Original"); /* save current state */
931 refresh_interface_font();
934 case 31: /* save default settings */
935 BIF_write_homefile();
938 if (okee("Erase All")) {
939 if (!BIF_read_homefile(1))
940 error("Can't read data from memory!");
943 case 35: /* compress toggle */
944 U.flag ^= (USER_FILECOMPRESS);
948 allqueue(REDRAWINFO, 0);
951 static void do_info_operecentmenu(void *arg, int event)
953 struct RecentFile *recent;
955 if(event==0 && G.sce[0]) {
956 BIF_read_file(G.sce);
959 recent = BLI_findlink(&(G.recent_files), event-1);
960 BIF_read_file(recent->filename);
964 static uiBlock *info_openrecentmenu(void *arg_unused)
967 short yco = 20, menuwidth = 120, i;
968 struct RecentFile *recent;
970 block= uiNewBlock(&curarea->uiblocks, "info_openrecentmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
971 uiBlockSetButmFunc(block, do_info_operecentmenu, NULL);
974 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, G.sce, 0, yco-=20,
975 menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
978 for (recent = G.recent_files.first, i=0; i<U.recent_files && recent; recent = recent->next, i++) {
979 if (strcmp(recent->filename, G.sce)!=0) {
980 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, recent->filename, 0, yco-=20,
981 menuwidth, 19, NULL, 0.0, 0.0, 1, i+1, "");
985 uiBlockSetDirection(block, UI_RIGHT);
986 uiTextBoundsBlock(block, 60);
990 static void do_info_externalfiles(void *arg, int event)
994 case 1: /* pack data */
998 case 2: /* unpack to current dir */
999 unpackAll(PF_WRITE_LOCAL);
1000 G.fileflags &= ~G_AUTOPACK;
1003 case 3: /* unpack data */
1004 if (buttons_do_unpack() != RET_CANCEL) {
1005 /* Clear autopack bit only if user selected one of the unpack options */
1006 G.fileflags &= ~G_AUTOPACK;
1009 case 10: /* make all paths relative */
1010 if (G.relbase_valid) {
1011 int tot,changed,failed,linked;
1013 char txtname[24]; /* text block name */
1015 makeFilesRelative(txtname, &tot, &changed, &failed, &linked);
1016 if (failed) sprintf(str, "Make Relative%%t|Total files %i|Changed %i|Failed %i, See Text \"%s\"|Linked %i", tot, changed, failed, txtname, linked);
1017 else sprintf(str, "Make Relative%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
1020 pupmenu("Can't set relative paths with an unsaved blend file");
1023 case 11: /* make all paths absolute */
1025 int tot,changed,failed,linked;
1027 char txtname[24]; /* text block name */
1029 makeFilesAbsolute(txtname, &tot, &changed, &failed, &linked);
1030 sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
1031 if (failed) sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i, See Text \"%s\"|Linked %i", tot, changed, failed, txtname, linked);
1032 else sprintf(str, "Make Absolute%%t|Total files %i|Changed %i|Failed %i|Linked %i", tot, changed, failed, linked);
1037 case 12: /* check images exist */
1039 char txtname[24]; /* text block name */
1042 /* run the missing file check */
1043 checkMissingFiles( txtname );
1045 if (txtname[0] == '\0') {
1046 okee("No external files missing");
1049 sprintf(str, "Missing files listed in Text \"%s\"", txtname );
1054 case 13: /* search for referenced files that are not available */
1055 if(curarea->spacetype==SPACE_INFO) {
1057 sa= closest_bigger_area();
1058 areawinset(sa->win);
1060 activate_fileselect(FILE_SPECIAL, "Find Missing Files", "", findMissingFiles);
1064 allqueue(REDRAWINFO, 0);
1067 static uiBlock *info_externalfiles(void *arg_unused)
1070 short yco = 20, menuwidth = 120;
1072 block= uiNewBlock(&curarea->uiblocks, "info_externalfiles", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1073 uiBlockSetButmFunc(block, do_info_externalfiles, NULL);
1075 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pack into .blend file", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1077 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");
1079 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Unpack into Files...", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1081 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1083 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make all Paths Relative", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 10, "");
1084 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make all Paths Absolute", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 11, "");
1085 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Report Missing Files...", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 12, "");
1086 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Find Missing Files...", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 13, "");
1088 uiBlockSetDirection(block, UI_RIGHT);
1089 uiTextBoundsBlock(block, 60);
1093 static uiBlock *info_filemenu(void *arg_unused)
1097 short menuwidth=120;
1099 block= uiNewBlock(&curarea->uiblocks, "info_filemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1100 uiBlockSetButmFunc(block, do_info_filemenu, NULL);
1102 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "New|Ctrl X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1103 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Open...|F1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1105 uiDefIconTextBlockBut(block, verse_filemenu, NULL, ICON_RIGHTARROW_THIN, "Verse", 0, yco-=20, menuwidth, 19, "");
1107 uiDefIconTextBlockBut(block, info_openrecentmenu, NULL, ICON_RIGHTARROW_THIN, "Open Recent",0, yco-=20, 120, 19, "");
1108 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Recover Last Session", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
1110 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1112 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save|Ctrl W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1113 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save As...|F2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1115 if(U.flag & USER_FILECOMPRESS) {
1116 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Compress File", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 35, "Enable file compression");
1118 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Compress File", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 35, "Enable file compression");
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 Rendered Image...|F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1124 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Screenshot Subwindow|Ctrl F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 24, "");
1125 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Screenshot All|Ctrl Shift F3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
1126 #if GAMEBLENDER == 1
1127 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Game As Runtime...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
1129 // uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save Dynamic Runtime...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 23, "");
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 Default Settings|Ctrl U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 31, "");
1135 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Load Factory Settings", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 32, "");
1138 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1140 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append or Link|Shift F1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1141 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, "");
1142 uiDefIconTextBlockBut(block, info_file_importmenu, NULL, ICON_RIGHTARROW_THIN, "Import", 0, yco-=20, menuwidth, 19, "");
1143 uiDefIconTextBlockBut(block, info_file_exportmenu, NULL, ICON_RIGHTARROW_THIN, "Export", 0, yco-=20, menuwidth, 19, "");
1145 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1147 uiDefIconTextBlockBut(block, info_externalfiles, NULL, ICON_RIGHTARROW_THIN, "External Data",0, yco-=20, 120, 19, "");
1149 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1151 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Quit Blender|Ctrl Q", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
1153 uiBlockSetDirection(block, UI_DOWN);
1154 uiTextBoundsBlock(block, 80);
1159 /**************************** ADD ******************************/
1161 void do_info_add_meshmenu(void *arg, int event)
1164 BPY_menu_do_python(PYMENU_ADDMESH, event - 20);
1169 add_primitiveMesh(0);
1173 add_primitiveMesh(1);
1177 add_primitiveMesh(4);
1181 add_primitiveMesh(11);
1185 add_primitiveMesh(12);
1189 add_primitiveMesh(5);
1193 add_primitiveMesh(7);
1197 add_primitiveMesh(10);
1201 add_primitiveMesh(13);
1207 allqueue(REDRAWINFO, 0);
1210 static uiBlock *info_add_meshmenu(void *arg_unused)
1212 /* static short tog=0; */
1220 block= uiNewBlock(&curarea->uiblocks, "add_meshmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1221 uiBlockSetButmFunc(block, do_info_add_meshmenu, NULL);
1223 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Plane|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1224 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cube|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1225 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Circle|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1226 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "UVsphere", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1227 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "IcoSphere|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1228 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cylinder|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "");
1229 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cone|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 7, "");
1230 uiDefIconTextBut(block, SEPR, 0, ICON_BLANK1, "", 0, yco-=6, 160, 6, NULL, 0.0, 0.0, 0, 0, "");
1231 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grid|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 8, "");
1232 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Monkey|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 9, "");
1235 pym = BPyMenuTable[PYMENU_ADDMESH];
1237 uiDefIconTextBut(block, SEPR, 0, ICON_BLANK1, "", 0, yco-=6, 160, 6, NULL, 0.0, 0.0, 0, 0, "");
1239 for (; pym; pym = pym->next, i++) {
1240 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);
1244 uiBlockSetDirection(block, UI_RIGHT);
1245 uiTextBoundsBlock(block, 50);
1250 void do_info_add_curvemenu(void *arg, int event)
1256 add_primitiveCurve(10);
1260 add_primitiveCurve(11);
1264 add_primitiveCurve(40);
1268 add_primitiveCurve(41);
1272 add_primitiveCurve(46);
1277 allqueue(REDRAWINFO, 0);
1280 static uiBlock *info_add_curvemenu(void *arg_unused)
1282 /* static short tog=0; */
1286 block= uiNewBlock(&curarea->uiblocks, "add_curvemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1287 uiBlockSetButmFunc(block, do_info_add_curvemenu, NULL);
1289 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bezier Curve|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1290 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bezier Circle|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1291 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Curve|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1292 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Circle", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1293 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Path|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1295 uiBlockSetDirection(block, UI_RIGHT);
1296 uiTextBoundsBlock(block, 50);
1302 void do_info_add_surfacemenu(void *arg, int event)
1308 add_primitiveNurb(0);
1312 add_primitiveNurb(1);
1316 add_primitiveNurb(2);
1320 add_primitiveNurb(3);
1324 add_primitiveNurb(4);
1328 add_primitiveNurb(5);
1333 allqueue(REDRAWINFO, 0);
1336 static uiBlock *info_add_surfacemenu(void *arg_unused)
1338 /* static short tog=0; */
1342 block= uiNewBlock(&curarea->uiblocks, "add_surfacemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1343 uiBlockSetButmFunc(block, do_info_add_surfacemenu, NULL);
1345 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Curve|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1346 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Circle|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1347 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Surface|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1348 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Tube", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1349 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Sphere|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1350 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NURBS Donut|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "");
1351 uiBlockSetDirection(block, UI_RIGHT);
1352 uiTextBoundsBlock(block, 50);
1357 void do_info_add_metamenu(void *arg, int event)
1363 add_primitiveMball(1);
1367 add_primitiveMball(2);
1371 add_primitiveMball(3);
1375 add_primitiveMball(4);
1379 add_primitiveMball(5);
1384 allqueue(REDRAWINFO, 0);
1388 static uiBlock *info_add_metamenu(void *arg_unused)
1390 /* static short tog=0; */
1394 block= uiNewBlock(&curarea->uiblocks, "add_metamenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1395 uiBlockSetButmFunc(block, do_info_add_metamenu, NULL);
1397 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,"Meta Ball|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1398 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Tube|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1399 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Plane|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1400 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Ellipsoid|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1401 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta Cube|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1403 uiBlockSetDirection(block, UI_RIGHT);
1404 uiTextBoundsBlock(block, 50);
1409 void do_info_add_lampmenu(void *arg, int event)
1414 add_objectLamp(LA_LOCAL);
1417 add_objectLamp(LA_SUN);
1420 add_objectLamp(LA_SPOT);
1423 add_objectLamp(LA_HEMI);
1426 add_objectLamp(LA_AREA);
1428 case 5: /* YafRay photon lamp */
1429 if (G.scene->r.renderer==R_YAFRAY)
1430 add_objectLamp(LA_YF_PHOTON);
1435 allqueue(REDRAWINFO, 0);
1438 static uiBlock *info_add_lampmenu(void *arg_unused)
1440 /* static short tog=0; */
1444 block= uiNewBlock(&curarea->uiblocks, "add_lampmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1445 uiBlockSetButmFunc(block, do_info_add_lampmenu, NULL);
1447 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lamp|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
1448 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Sun|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "");
1449 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Spot|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "");
1450 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hemi|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "");
1451 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Area|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "");
1452 if (G.scene->r.renderer==R_YAFRAY)
1453 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Photon|", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "");
1455 uiBlockSetDirection(block, UI_RIGHT);
1456 uiTextBoundsBlock(block, 50);
1461 static void do_info_add_groupmenu(void *arg, int event)
1465 add_object_draw(OB_EMPTY);
1468 ob->dup_group= BLI_findlink(&G.main->group, event);
1470 id_us_plus((ID *)ob->dup_group);
1471 ob->transflag |= OB_DUPLIGROUP;
1472 DAG_scene_sort(G.scene);
1477 static uiBlock *info_add_groupmenu(void *arg_unused)
1484 block= uiNewBlock(&curarea->uiblocks, "add_groupmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1485 uiBlockSetButmFunc(block, do_info_add_groupmenu, NULL);
1487 for(a=0, group= G.main->group.first; group; group= group->id.next, a++) {
1488 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, group->id.name+2, 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, a, "");
1491 uiBlockSetDirection(block, UI_RIGHT);
1492 uiTextBoundsBlock(block, 50);
1497 void do_info_addmenu(void *arg, int event)
1500 BPY_menu_do_python(PYMENU_ADD, event - 20);
1516 /* Text (argument is discarded) */
1517 add_primitiveFont(event);
1521 add_object_draw(OB_EMPTY);
1525 add_object_draw(OB_CAMERA);
1529 add_primitiveArmature(OB_ARMATURE);
1533 add_object_draw(OB_LATTICE);
1536 /* group instance not yet */
1542 allqueue(REDRAWINFO, 0);
1546 static uiBlock *info_addmenu(void *arg_unused)
1548 /* static short tog=0; */
1554 block= uiNewBlock(&curarea->uiblocks, "addmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1555 uiBlockSetButmFunc(block, do_info_addmenu, NULL);
1557 uiDefIconTextBlockBut(block, info_add_meshmenu, NULL, ICON_RIGHTARROW_THIN, "Mesh", 0, yco-=20, 120, 19, "");
1558 uiDefIconTextBlockBut(block, info_add_curvemenu, NULL, ICON_RIGHTARROW_THIN, "Curve", 0, yco-=20, 120, 19, "");
1559 uiDefIconTextBlockBut(block, info_add_surfacemenu, NULL, ICON_RIGHTARROW_THIN, "Surface", 0, yco-=20, 120, 19, "");
1560 uiDefIconTextBlockBut(block, info_add_metamenu, NULL, ICON_RIGHTARROW_THIN, "Meta", 0, yco-=20, 120, 19, "");
1561 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Text", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 4, "");
1562 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Empty", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 5, "");
1564 uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
1566 uiDefIconTextBlockBut(block, info_add_groupmenu, NULL, ICON_RIGHTARROW_THIN, "Group", 0, yco-=20, 120, 19, "");
1568 uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
1570 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 6, "");
1571 uiDefIconTextBlockBut(block, info_add_lampmenu, NULL, ICON_RIGHTARROW_THIN, "Lamp", 0, yco-=20, 120, 19, "");
1573 uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
1575 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Armature", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 8, "");
1576 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lattice", 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 9, "");
1578 pym = BPyMenuTable[PYMENU_ADD];
1580 uiDefIconTextBut(block, SEPR, 0, ICON_BLANK1, "", 0, yco-=6, 1620, 6, NULL, 0.0, 0.0, 0, 0, "");
1582 for (; pym; pym = pym->next, i++) {
1583 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);
1587 uiBlockSetDirection(block, UI_DOWN);
1588 uiTextBoundsBlock(block, 80);
1593 /************************** GAME *****************************/
1595 void do_info_game_glslmenu(void *arg, int event)
1598 case G_FILE_GLSL_NO_LIGHTS:
1599 case G_FILE_GLSL_NO_SHADERS:
1600 case G_FILE_GLSL_NO_SHADOWS:
1601 case G_FILE_GLSL_NO_RAMPS:
1602 case G_FILE_GLSL_NO_NODES:
1603 case G_FILE_GLSL_NO_EXTRA_TEX:
1604 G.fileflags ^= event;
1605 GPU_materials_free();
1606 allqueue(REDRAWINFO, 0);
1607 allqueue(REDRAWVIEW3D, 0);
1614 static uiBlock *info_game_glslmenu(void *arg_unused)
1617 short yco= 0, menuwidth=160;
1620 block= uiNewBlock(&curarea->uiblocks, "game_glslmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1621 uiBlockSetButmFunc(block, do_info_game_glslmenu, NULL);
1623 check = (G.fileflags & G_FILE_GLSL_NO_LIGHTS)? ICON_CHECKBOX_DEHLT: ICON_CHECKBOX_HLT;
1624 uiDefIconTextBut(block, BUTM, 1, check, "Enable Lights", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GLSL_NO_LIGHTS,
1625 "Enable using lights in GLSL materials.");
1626 check = (G.fileflags & G_FILE_GLSL_NO_SHADERS)? ICON_CHECKBOX_DEHLT: ICON_CHECKBOX_HLT;
1627 uiDefIconTextBut(block, BUTM, 1, check, "Enable Shaders", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GLSL_NO_SHADERS,
1628 "Enable using shaders other than Lambert in GLSL materials");
1629 check = (G.fileflags & G_FILE_GLSL_NO_SHADOWS)? ICON_CHECKBOX_DEHLT: ICON_CHECKBOX_HLT;
1630 uiDefIconTextBut(block, BUTM, 1, check, "Enable Shadows", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GLSL_NO_SHADOWS,
1631 "Enable using shadows in GLSL materials");
1632 check = (G.fileflags & G_FILE_GLSL_NO_RAMPS)? ICON_CHECKBOX_DEHLT: ICON_CHECKBOX_HLT;
1633 uiDefIconTextBut(block, BUTM, 1, check, "Enable Ramps", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GLSL_NO_RAMPS,
1634 "Enable using ramps in GLSL materials");
1635 check = (G.fileflags & G_FILE_GLSL_NO_NODES)? ICON_CHECKBOX_DEHLT: ICON_CHECKBOX_HLT;
1636 uiDefIconTextBut(block, BUTM, 1, check, "Enable Nodes", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_GLSL_NO_NODES,
1637 "Enable using nodes in GLSL materials.");
1638 check = (G.fileflags & G_FILE_GLSL_NO_EXTRA_TEX)? ICON_CHECKBOX_DEHLT: ICON_CHECKBOX_HLT;
1639 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,
1640 "Enable using texture channels other than Col and Alpha in GLSL materials.");
1642 uiBlockSetDirection(block, UI_RIGHT);
1643 uiTextBoundsBlock(block, 50);
1648 static void do_info_gamemenu(void *arg, int event)
1651 case G_FILE_ENABLE_ALL_FRAMES:
1652 case G_FILE_DISPLAY_LISTS:
1653 case G_FILE_SHOW_FRAMERATE:
1654 case G_FILE_SHOW_DEBUG_PROPS:
1655 case G_FILE_AUTOPLAY:
1656 case G_FILE_GAME_TO_IPO:
1657 case G_FILE_SHOW_PHYSICS:
1658 G.fileflags ^= event;
1660 case G_FILE_GAME_MAT|G_FILE_GAME_MAT_GLSL:
1661 G.fileflags &= ~(G_FILE_GAME_MAT|G_FILE_GAME_MAT_GLSL);
1663 case G_FILE_GAME_MAT:
1664 G.fileflags |= G_FILE_GAME_MAT;
1665 G.fileflags &= ~G_FILE_GAME_MAT_GLSL;
1667 case G_FILE_GAME_MAT_GLSL:
1668 if(!GPU_extensions_minimum_support())
1669 error("GLSL not supported with this graphics card or driver.");
1670 G.fileflags |= (G_FILE_GAME_MAT|G_FILE_GAME_MAT_GLSL);
1673 ; /* ignore the rest */
1677 static uiBlock *info_gamemenu(void *arg_unused)
1679 /* static short tog=0; */
1682 short menuwidth=120;
1684 block= uiNewBlock(&curarea->uiblocks, "gamemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1685 uiBlockSetButmFunc(block, do_info_gamemenu, NULL);
1687 uiDefIconTextBut(block, BUTM, B_STARTGAME, ICON_BLANK1, "Start Game|P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
1689 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 1, 0, "");
1692 if(G.fileflags & G_FILE_ENABLE_ALL_FRAMES) {
1693 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, "");
1695 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, "");
1698 if(G.fileflags & G_FILE_GAME_TO_IPO) {
1699 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, "");
1702 if(G.fileflags & G_FILE_DISPLAY_LISTS) {
1703 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, "");
1705 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, "");
1707 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, "");
1710 if(G.fileflags & G_FILE_SHOW_FRAMERATE) {
1711 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, "");
1713 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, "");
1717 if(G.fileflags & G_FILE_SHOW_PHYSICS) {
1718 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, "");
1720 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, "");
1723 if(G.fileflags & G_FILE_SHOW_DEBUG_PROPS) {
1724 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, "");
1726 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, "");
1729 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 1, 0, "");
1731 if(!(G.fileflags & G_FILE_GAME_MAT)) {
1732 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Texture Face Materials", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1734 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, "");
1737 if((G.fileflags & G_FILE_GAME_MAT) && !(G.fileflags & G_FILE_GAME_MAT_GLSL)) {
1738 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Blender Multitexture Materials", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1740 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, "");
1743 if((G.fileflags & G_FILE_GAME_MAT) && (G.fileflags & G_FILE_GAME_MAT_GLSL)) {
1744 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Blender GLSL Materials", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1746 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, "");
1749 uiDefIconTextBlockBut(block, info_game_glslmenu, NULL, ICON_RIGHTARROW_THIN, "GLSL Material Settings", 0, yco-=20, menuwidth, 19, "");
1751 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 1, 0, "");
1753 if(G.fileflags & G_FILE_AUTOPLAY) {
1754 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Autostart", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_AUTOPLAY, "");
1756 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Autostart", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, G_FILE_AUTOPLAY, "");
1759 uiBlockSetDirection(block, UI_DOWN);
1760 uiTextBoundsBlock(block, 70);
1764 /************************** TIMELINE *****************************/
1766 static void do_info_timelinemenu(void *arg, int event)
1768 /* needed to check for valid selected objects */
1771 //char file[FILE_MAXDIR+FILE_MAXFILE];
1774 if (base) ob= base->object;
1778 /* Show Keyframes */
1779 if (!ob) error("Select an object before showing its keyframes");
1780 else set_ob_ipoflags();
1783 /* Show and select Keyframes */
1784 if (!ob) error("Select an object before showing and selecting its keyframes");
1785 else select_select_keys();
1788 /* select next keyframe */
1789 if (!ob) error("Select an object before selecting its next keyframe");
1790 else nextkey_obipo(1);
1793 /* select previous keyframe */
1794 if (!ob) error("Select an object before selecting its previous keyframe");
1795 else nextkey_obipo(-1);
1799 if (!ob) error("Select an object before going to its next keyframe");
1800 else movekey_obipo(1);
1803 /* previous keyframe */
1804 if (!ob) error("Select an object before going to its previous keyframe");
1805 else movekey_obipo(-1);
1810 update_for_newframe();
1813 /* previous frame */
1816 update_for_newframe();
1819 /* forward 10 frames */
1821 update_for_newframe();
1824 /* back 10 frames */
1827 update_for_newframe();
1832 update_for_newframe();
1837 update_for_newframe();
1840 /* previous keyframe */
1841 nextprev_timeline_key(-1);
1845 nextprev_timeline_key(1);
1848 allqueue(REDRAWINFO, 0);
1851 static uiBlock *info_timelinemenu(void *arg_unused)
1853 /* static short tog=0; */
1857 short menuwidth=120;
1859 block= uiNewBlock(&curarea->uiblocks, "timelinemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
1860 uiBlockSetButmFunc(block, do_info_timelinemenu, NULL);
1862 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Keyframes|K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1863 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show and Select Keyframes|Shift K",0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1864 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Next Keyframe|PageUp", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1865 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Previous Keyframe|PageDown", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1867 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1869 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Next Ob-Keyframe|Shift PageUp", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1870 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Previous Ob-Keyframe|Shift PageDown", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1872 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Next Keyframe|Ctrl PageUp", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
1873 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Previous Keyframe|Ctrl PageDown", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
1875 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1877 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Next Frame|RightArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1878 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Previous Frame|LeftArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
1880 sprintf(str, "Forward %d Frames|UpArrow", G.scene->jumpframe);
1881 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, str, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
1882 sprintf(str, "Back %d Frames|DownArrow", G.scene->jumpframe);
1883 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, str, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
1885 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1887 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "End Frame|Shift RightArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
1888 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Start Frame|Shift LeftArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
1890 uiBlockSetDirection(block, UI_DOWN);
1891 uiTextBoundsBlock(block, 80);
1896 /************************** RENDER *****************************/
1898 void do_info_render_bakemenu(void *arg, int event)
1902 G.scene->r.bake_flag ^= event;
1905 objects_bake_render_ui(event);
1908 allqueue(REDRAWINFO, 0);
1911 static uiBlock *info_render_bakemenu(void *arg_unused)
1914 short yco= 0, menuwidth=160;
1916 block= uiNewBlock(&curarea->uiblocks, "render_bakemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
1917 uiBlockSetButmFunc(block, do_info_render_bakemenu, NULL);
1919 if(G.scene->r.bake_flag & R_BAKE_TO_ACTIVE) {
1920 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Selected to Active", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1922 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Selected to Active", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1925 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1927 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Full Render|Ctrl Alt B, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1928 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Ambient Occlusion|Ctrl Alt B, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1929 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Normals|Ctrl Alt B, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1930 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Texture Only|Ctrl Alt B, 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1931 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Displacement|Ctrl Alt B, 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1933 uiBlockSetDirection(block, UI_RIGHT);
1934 uiTextBoundsBlock(block, 50);
1939 static void do_info_rendermenu(void *arg, int event)
1942 extern void playback_anim();
1944 /* events >=10 are registered bpython scripts */
1946 if(curarea->spacetype==SPACE_INFO) {
1947 sa= find_biggest_area_of_type(SPACE_SCRIPT);
1948 if (!sa) sa= closest_bigger_area();
1949 areawinset(sa->win);
1952 BPY_menu_do_python(PYMENU_RENDER, event - 10);
1953 BIF_undo_push("Rendering Script");
1965 /* note: dont use select_area() for setting active areas for opengl render */
1966 /* its hackish and instable... code here was removed */
1969 BIF_toggle_render_display();
1975 /* dodgy hack turning on SHIFT key to do a proper render border select
1976 set_render_border(); only works when 3d window active
1978 This code copied from toolbox.c, only works when 3d window is cameraview */
1980 if(select_area(SPACE_VIEW3D)) {
1981 mainqenter(LEFTSHIFTKEY, 1);
1982 mainqenter(BKEY, 1);
1983 mainqenter(BKEY, 0);
1984 mainqenter(EXECUTE, 1);
1985 mainqenter(LEFTSHIFTKEY, 0);
1991 extern_set_butspace(F10KEY, 0);
1995 allqueue(REDRAWINFO, 0);
1998 static uiBlock *info_rendermenu(void *arg_unused)
2003 short menuwidth=120;
2006 block= uiNewBlock(&curarea->uiblocks, "rendermenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
2007 uiBlockSetButmFunc(block, do_info_rendermenu, NULL);
2009 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Current Frame|F12", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2010 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Animation|Ctrl F12", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2012 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2014 uiDefIconTextBlockBut(block, info_render_bakemenu, NULL, ICON_RIGHTARROW_THIN, "Bake Render Meshes", 0, yco-=20, 120, 19, "");
2016 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2018 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Render Buffer|F11", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2019 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Rendered Animation|Ctrl F11", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2021 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2023 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Render Border|Shift B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2025 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2027 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Render Settings|F10", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2029 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2031 for (pym = BPyMenuTable[PYMENU_RENDER]; pym; pym = pym->next, i++) {
2032 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);
2035 uiBlockSetDirection(block, UI_DOWN);
2036 uiTextBoundsBlock(block, 80);
2041 /************************** HELP *****************************/
2043 static void do_info_help_websitesmenu(void *arg, int event)
2045 BPY_menu_do_python(PYMENU_HELPWEBSITES, event);
2047 allqueue(REDRAWVIEW3D, 0);
2051 static uiBlock *info_help_websitesmenu(void *arg_unused)
2055 short yco = 20, menuwidth = 120;
2058 block= uiNewBlock(&curarea->uiblocks, "info_help_websitesmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2059 uiBlockSetButmFunc(block, do_info_help_websitesmenu, NULL);
2061 for (pym = BPyMenuTable[PYMENU_HELPWEBSITES]; pym; pym = pym->next, i++) {
2062 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);
2065 uiBlockSetDirection(block, UI_RIGHT);
2066 uiTextBoundsBlock(block, 60);
2071 static void do_info_help_systemmenu(void *arg, int event)
2073 /* events >=10 are registered bpython scripts */
2074 if (event >= 10) BPY_menu_do_python(PYMENU_HELPSYSTEM, event - 10);
2078 case 1: /* Benchmark */
2079 /* dodgy hack turning on CTRL ALT SHIFT key to do a benchmark
2080 * rather than copying lines and lines of code from toets.c :(
2083 if(select_area(SPACE_VIEW3D)) {
2084 mainqenter(LEFTSHIFTKEY, 1);
2085 mainqenter(LEFTCTRLKEY, 1);
2086 mainqenter(LEFTALTKEY, 1);
2087 mainqenter(TKEY, 1);
2088 mainqenter(TKEY, 0);
2089 mainqenter(EXECUTE, 1);
2090 mainqenter(LEFTSHIFTKEY, 0);
2091 mainqenter(LEFTCTRLKEY, 0);
2092 mainqenter(LEFTALTKEY, 0);
2098 allqueue(REDRAWVIEW3D, 0);
2102 static uiBlock *info_help_systemmenu(void *arg_unused)
2106 short yco = 20, menuwidth = 120;
2109 block= uiNewBlock(&curarea->uiblocks, "info_help_systemmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
2110 uiBlockSetButmFunc(block, do_info_help_systemmenu, NULL);
2112 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Benchmark", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2114 for (pym = BPyMenuTable[PYMENU_HELPSYSTEM]; pym; pym = pym->next, i++) {
2115 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);
2118 uiBlockSetDirection(block, UI_RIGHT);
2119 uiTextBoundsBlock(block, 60);
2124 static void do_info_helpmenu(void *arg, int event)
2128 if(curarea->spacetype==SPACE_INFO) {
2129 sa= find_biggest_area_of_type(SPACE_SCRIPT);
2130 if (!sa) sa= closest_bigger_area();
2131 areawinset(sa->win);
2134 /* events >=10 are registered bpython scripts */
2135 if (event >= 10) BPY_menu_do_python(PYMENU_HELP, event - 10);
2139 case 0: /* About Blender */
2144 allqueue(REDRAWINFO, 0);
2147 static uiBlock *info_helpmenu(void *arg_unused)
2149 /* static short tog=0; */
2152 short menuwidth=120;
2156 block= uiNewBlock(&curarea->uiblocks, "info_helpmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
2157 uiBlockSetButmFunc(block, do_info_helpmenu, NULL);
2159 uiDefIconTextBut(block, BUTM, B_SHOWSPLASH, ICON_BLANK1, "About Blender...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2161 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2163 for (pym = BPyMenuTable[PYMENU_HELP]; pym; pym = pym->next, i++) {
2164 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);
2167 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2169 uiDefIconTextBlockBut(block, info_help_websitesmenu, NULL, ICON_RIGHTARROW_THIN, "Websites", 0, yco-=20, 120, 19, "");
2171 uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2173 uiDefIconTextBlockBut(block, info_help_systemmenu, NULL, ICON_RIGHTARROW_THIN, "System", 0, yco-=20, 120, 19, "");
2175 uiBlockSetDirection(block, UI_DOWN);
2176 uiTextBoundsBlock(block, 80);
2181 /************************** END MAIN MENU *****************************/
2182 /* ugly global yes, for renderwin.c to write to */
2183 char info_time_str[32]="";
2185 static void info_text(int x, int y)
2188 extern float hashvectf[];
2189 uintptr_t mem_in_use, mmap_in_use;
2190 unsigned int swatch_color;
2191 float fac1, fac2, fac3;
2192 char infostr[300], memstr[64];
2193 char *headerstr, *s;
2196 mem_in_use= MEM_get_memory_in_use();
2197 mmap_in_use= MEM_get_mapped_memory_in_use();
2199 s= memstr + sprintf(memstr," | Mem:%.2fM ", ((mem_in_use-mmap_in_use)>>10)/1024.0);
2201 sprintf(s,"(%.2fM) ", ((mmap_in_use)>>10)/1024.0);
2207 s+= sprintf(s, "%s", G.editModeTitleExtra);
2208 if(G.obedit->type==OB_MESH) {
2209 if(G.scene->selectmode & SCE_SELECT_VERTEX)
2210 s+= sprintf(s,"Ve:%d-%d | Ed:%d-%d | Fa:%d-%d",
2211 G.totvertsel, G.totvert, G.totedgesel, G.totedge, G.totfacesel, G.totface);
2212 else if(G.scene->selectmode & SCE_SELECT_EDGE)
2213 s+= sprintf(s,"Ed:%d-%d | Fa:%d-%d",
2214 G.totedgesel, G.totedge, G.totfacesel, G.totface);
2216 s+= sprintf(s,"Fa:%d-%d", G.totfacesel, G.totface);
2218 else if(G.obedit->type==OB_ARMATURE) {
2219 s+= sprintf(s,"Ve:%d-%d | Bo:%d-%d", G.totvertsel, G.totvert, G.totbonesel, G.totbone);
2222 s+= sprintf(s,"Ve:%d-%d", G.totvertsel, G.totvert);
2227 else if(ob && (ob->flag & OB_POSEMODE)) {
2228 sprintf(infostr,"Bo:%d-%d %s",
2229 G.totbonesel, G.totbone, memstr);
2232 sprintf(infostr,"Ve:%d | Fa:%d | Ob:%d-%d | La:%d %s | Time:%s | ",
2233 G.totvert, G.totface, G.totobj, G.totobjsel, G.totlamp, memstr, info_time_str);
2236 strcat(infostr, ob->id.name+2);
2239 if (g_progress_bar && g_progress_info) {
2240 headerstr= g_progress_info;
2242 headerstr= versionstr;
2245 if (g_progress_bar) {
2246 hsize = 4 + (138.0 * g_done);
2247 fac1 = 0.5 * g_done; /* do some rainbow colors on progress */
2251 hsize= 30+BIF_GetStringWidth(G.font, headerstr, (U.transopts & USER_TR_BUTTONS));
2253 /* promise! Never change these lines again! (zr & ton did!) */
2254 fac1= fabs(hashvectf[ 2*G.version+4]);
2255 fac2= 0.5+0.1*hashvectf[ G.version+3];
2259 swatch_color= hsv_to_cpack(fac1, fac2, fac3);
2261 cpack( swatch_color );
2262 glRecti(x-24, y-6, x-30+hsize, y+14);
2264 glColor3ub(0, 0, 0); /* makes text black colored rect */
2266 glRasterPos2i(x, y);
2267 BIF_RasterPos(x, y);
2269 BIF_DrawString(G.font, headerstr, (U.transopts & USER_TR_MENUS));
2270 hsize= BIF_GetStringWidth(G.font, headerstr, (U.transopts & USER_TR_BUTTONS));
2272 BIF_ThemeColor(TH_MENU_TEXT); /* makes text readable on dark theme */
2274 glRasterPos2i(x+hsize+10, y);
2275 BIF_RasterPos(x+hsize+10, y);
2277 BIF_DrawString(G.font, infostr, (U.transopts & USER_TR_MENUS));
2280 void info_buttons(void)
2286 block= uiNewBlock(&curarea->uiblocks, "header info", UI_EMBOSSN, UI_HELV, curarea->headwin);
2288 if(area_is_active_area(curarea)) uiBlockSetCol(block, TH_HEADER);
2289 else uiBlockSetCol(block, TH_HEADERDESEL);
2291 if(curarea->flag & HEADER_NO_PULLDOWN) {
2292 uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_RIGHT,
2294 &(curarea->flag), 0, 0, 0, 0, "Enables display of pulldown menus");
2296 uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_DOWN,
2298 &(curarea->flag), 0, 0, 0, 0, "Hides pulldown menus");
2302 if((curarea->flag & HEADER_NO_PULLDOWN)==0) {
2304 uiBlockSetEmboss(block, UI_EMBOSSP);
2306 /* the 'xmax - 3' rather than xmax is to prevent some weird flickering where the highlighted
2307 * menu is drawn wider than it should be. The ypos of -1 is to make it properly fill the
2308 * height of the header */
2309 xmax= GetButStringLength("File");
2310 uiDefPulldownBut(block, info_filemenu, NULL, "File", xco, -1, xmax-3, 22, "");
2313 xmax= GetButStringLength("Add");
2314 uiDefPulldownBut(block, info_addmenu, NULL, "Add", xco, -1, xmax-3, 22, "");
2317 xmax= GetButStringLength("Timeline");
2318 uiDefPulldownBut(block, info_timelinemenu, NULL, "Timeline", xco, -1, xmax-3, 22, "");
2321 xmax= GetButStringLength("Game");
2322 uiDefPulldownBut(block, info_gamemenu, NULL, "Game", xco, -1, xmax-3, 22, "");
2325 xmax= GetButStringLength("Render");
2326 uiDefPulldownBut(block, info_rendermenu, NULL, "Render", xco, -1, xmax-3, 22, "");
2329 xmax= GetButStringLength("Help");
2330 uiDefPulldownBut(block, info_helpmenu, NULL, "Help", xco, -1, xmax-3, 22, "");
2335 /* pack icon indicates a packed file */
2337 if (G.fileflags & G_AUTOPACK) {
2338 uiBlockSetEmboss(block, UI_EMBOSSN);
2339 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.");
2343 if (curarea->full == 0) {
2344 curarea->butspacetype= SPACE_INFO;
2345 uiBlockSetEmboss(block, UI_EMBOSS);
2346 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.");
2348 /* STD SCREEN BUTTONS */
2349 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);
2353 /* STD SCENE BUTTONS */
2354 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);
2358 BIF_SetScale(block->aspect);
2359 info_text(xco+24, 6);
2361 uiBlockSetEmboss(block, UI_EMBOSSN);
2362 uiDefIconBut(block, BUT, B_SHOWSPLASH, ICON_BLENDER, xco+2, 0,XIC,YIC, 0, 0, 0, 0, 0, "Click to display Splash Screen");
2364 /* always do as last */
2365 curarea->headbutlen= xco+2*XIC;
2368 // #ifdef _WIN32 // FULLSCREEN
2369 if(U.uiflag & USER_FLIPFULLSCREEN) {
2370 uiDefIconBut(block, BUT, B_FLIPFULLSCREEN, ICON_WINDOW_WINDOW,
2371 (short)(curarea->winx-XIC-5), 0,XIC,YIC,
2372 0, 0, 0, 0, 0, "Toggles Blender to fullscreen mode");/* dir */
2374 uiDefIconBut(block, BUT, B_FLIPFULLSCREEN, ICON_WINDOW_FULLSCREEN,
2375 (short)(curarea->winx-XIC-5), 0,XIC,YIC,
2376 0, 0, 0, 0, 0, "Toggles Blender to fullscreen mode");/* dir */