diff options
Diffstat (limited to 'source/blender/src/headerbuttons.c')
-rw-r--r-- | source/blender/src/headerbuttons.c | 5577 |
1 files changed, 5577 insertions, 0 deletions
diff --git a/source/blender/src/headerbuttons.c b/source/blender/src/headerbuttons.c new file mode 100644 index 00000000000..71cbac51dea --- /dev/null +++ b/source/blender/src/headerbuttons.c @@ -0,0 +1,5577 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#include <string.h> +#include <math.h> + +#include <sys/types.h> + +#ifdef WIN32 +#include "BLI_winstuff.h" +#endif + +#include "MEM_guardedalloc.h" + +#include "BMF_Api.h" + +#include "BLI_blenlib.h" +#include "BLI_arithb.h" +#include "BLI_editVert.h" +#include "BLI_storage_types.h" + +#include "IMB_imbuf_types.h" +#include "IMB_imbuf.h" + +#include "DNA_ID.h" +#include "DNA_action_types.h" +#include "DNA_armature_types.h" +#include "DNA_camera_types.h" +#include "DNA_curve_types.h" +#include "DNA_group_types.h" +#include "DNA_image_types.h" +#include "DNA_ipo_types.h" +#include "DNA_key_types.h" +#include "DNA_lamp_types.h" +#include "DNA_lattice_types.h" +#include "DNA_material_types.h" +#include "DNA_mesh_types.h" +#include "DNA_meta_types.h" +#include "DNA_object_types.h" +#include "DNA_oops_types.h" +#include "DNA_packedFile_types.h" +#include "DNA_scene_types.h" +#include "DNA_screen_types.h" +#include "DNA_sequence_types.h" +#include "DNA_sound_types.h" +#include "DNA_space_types.h" +#include "DNA_texture_types.h" +#include "DNA_text_types.h" +#include "DNA_userdef_types.h" +#include "DNA_view2d_types.h" +#include "DNA_view3d_types.h" +#include "DNA_world_types.h" +#include "DNA_constraint_types.h" + +#include "BKE_utildefines.h" + +#include "BKE_constraint.h" +#include "BKE_action.h" +#include "BKE_armature.h" +#include "BKE_blender.h" +#include "BKE_curve.h" +#include "BKE_displist.h" +#include "BKE_exotic.h" +#include "BKE_global.h" +#include "BKE_image.h" +#include "BKE_ika.h" +#include "BKE_ipo.h" +#include "BKE_key.h" +#include "BKE_lattice.h" +#include "BKE_library.h" +#include "BKE_main.h" +#include "BKE_material.h" +#include "BKE_mball.h" +#include "BKE_mesh.h" +#include "BKE_object.h" +#include "BKE_packedFile.h" +#include "BKE_sca.h" +#include "BKE_scene.h" +#include "BKE_texture.h" +#include "BKE_text.h" +#include "BKE_world.h" + +#include "BLO_readfile.h" +#include "BLO_writefile.h" + +#include "BIF_drawimage.h" +#include "BIF_drawoops.h" +#include "BIF_drawscene.h" +#include "BIF_drawtext.h" +#include "BIF_editarmature.h" +#include "BIF_editfont.h" +#include "BIF_editlattice.h" +#include "BIF_editconstraint.h" +#include "BIF_editmesh.h" +#include "BIF_editmesh.h" +#include "BIF_editsima.h" +#include "BIF_editsound.h" +#include "BIF_editsound.h" +#include "BIF_gl.h" +#include "BIF_imasel.h" +#include "BIF_interface.h" +#include "BIF_mainqueue.h" +#include "BIF_mywindow.h" +#include "BIF_poseobject.h" +#include "BIF_renderwin.h" +#include "BIF_resources.h" +#include "BIF_screen.h" +#include "BIF_space.h" +#include "BIF_toets.h" +#include "BIF_toets.h" +#include "BIF_toolbox.h" +#include "BIF_usiblender.h" +#include "BIF_previewrender.h" +#include "BIF_writeimage.h" + +#include "BSE_edit.h" +#include "BSE_filesel.h" +#include "BSE_headerbuttons.h" +#include "BSE_view.h" +#include "BSE_sequence.h" +#include "BSE_editaction.h" +#include "BSE_editaction_types.h" +#include "BSE_editipo.h" +#include "BSE_drawipo.h" + +#include "BDR_drawmesh.h" +#include "BDR_vpaint.h" +#include "BDR_editface.h" +#include "BDR_editobject.h" +#include "BDR_editcurve.h" +#include "BDR_editmball.h" + +#include "BPY_extern.h" // Blender Python library + +#include "interface.h" +#include "mydevice.h" +#include "blendef.h" +#include "render.h" +#include "ipo.h" +#include "nla.h" /* __NLA : To be removed later */ + +#include "TPT_DependKludge.h" + +/* these are needed to hide functions behind function tables, + which are initialized by the python key code */ +#include "keyed_functions.h" +#include "license_key.h" + +/* local (?) functions */ +void do_file_buttons(short event); +void do_text_buttons(unsigned short event); +void load_space_sound(char *str); +void load_sound_buttons(char *str); +void load_space_image(char *str); +void image_replace(Image *old, Image *new); +void replace_space_image(char *str); +void do_image_buttons(unsigned short event); +void do_imasel_buttons(short event); +static void check_packAll(void); +static void unique_bone_name(Bone *bone, bArmature *arm); +static void validate_bonebutton(void *data1, void *data2); +static int bonename_exists(Bone *orig, char *name, ListBase *list); + +static void test_idbutton_cb(void *namev, void *arg2_unused) +{ + char *name= namev; + test_idbutton(name+2); +} + +#define SPACEICONMAX 13 /* See release/datafiles/blenderbuttons */ + +#include "BIF_poseobject.h" + +#include "SYS_System.h" + +#include "license_key.h" +static int std_libbuttons(uiBlock *block, + int xco, int pin, short *pinpoin, + int browse, ID *id, ID *parid, + short *menupoin, int users, + int lib, int del, int autobut); + + +extern char versionstr[]; /* from blender.c */ +/* extern void add_text_fs(char *file); *//* from text.c, BIF_text.h*/ + + /* LET OP: alle headerbuttons voor zelfde window steeds zelfde naam + * event B_REDR is standaard redraw + * + */ + + +/* + * The next define turns the newest menu structure on. + * There are some loose ends here at the moment so leave this undefined for now. + */ +/* #define EXPERIMENTAL_MENUS */ + + +#define XIC 20 +#define YIC 20 + +static int viewmovetemp=0; + +/* extern void info_buttons(); in BSE_headerbuttons.c */ + +extern char videosc_dir[]; /* exotic.c */ + +/* *********************************************************************** */ + +void write_videoscape_fs() +{ + if(G.obedit) { + error("Can't save Videoscape. Press TAB to leave EditMode"); + } + else { + if(videosc_dir[0]==0) strcpy(videosc_dir, G.sce); + activate_fileselect(FILE_SPECIAL, "SAVE VIDEOSCAPE", videosc_dir, write_videoscape); + } +} + +void write_vrml_fs() +{ + if(G.obedit) { + error("Can't save VRML. Press TAB to leave EditMode"); + } + else { + if(videosc_dir[0]==0) strcpy(videosc_dir, G.sce); + + activate_fileselect(FILE_SPECIAL, "SAVE VRML1", videosc_dir, write_vrml); + } + +} + +void write_dxf_fs() +{ + if(G.obedit) { + error("Can't save DXF. Press TAB to leave EditMode"); + } + else { + + if(videosc_dir[0]==0) strcpy(videosc_dir, G.sce); + + activate_fileselect(FILE_SPECIAL, "SAVE DXF", videosc_dir, write_dxf); + } +} + +/* ********************** GLOBAL ****************************** */ + +static int std_libbuttons(uiBlock *block, int xco, int pin, short *pinpoin, int browse, ID *id, ID *parid, short *menupoin, int users, int lib, int del, int autobut) +{ + ListBase *lb; + Object *ob; + Ipo *ipo; + uiBut *but; + int len, idwasnul=0, idtype, oldcol; + char *str=NULL, str1[10]; + + oldcol= uiBlockGetCol(block); + + if(id && pin) { + uiDefIconButS(block, ICONTOG, pin, ICON_PIN_DEHLT, (short)xco,0,XIC,YIC, pinpoin, 0, 0, 0, 0, "Pin this data block; no update according Object selection"); + xco+= XIC; + } + if(browse) { + if(id==0) { + idwasnul= 1; + /* alleen de browse button */ + ob= OBACT; + if(curarea->spacetype==SPACE_IMAGE) { + id= G.main->image.first; + } + else if(curarea->spacetype==SPACE_SOUND) { + id= G.main->sound.first; + } + else if(curarea->spacetype==SPACE_ACTION) { + id= G.main->action.first; + } + else if(curarea->spacetype==SPACE_NLA) { + id=NULL; + } + else if(curarea->spacetype==SPACE_IPO) { + id= G.main->ipo.first; + /* testen op ipotype */ + while(id) { + ipo= (Ipo *)id; + if(G.sipo->blocktype==ipo->blocktype) break; + id= id->next; + } + } + else if(curarea->spacetype==SPACE_BUTS) { + if(browse==B_WORLDBROWSE) { + id= G.main->world.first; + } + else if(ob && ob->type && (ob->type<OB_LAMP)) { + if(G.buts->mainb==BUTS_MAT) id= G.main->mat.first; + else if(G.buts->mainb==BUTS_TEX) id= G.main->tex.first; + } + } + else if(curarea->spacetype==SPACE_TEXT) { + id= G.main->text.first; + } + } + if(id) { + char *extrastr= NULL; + + idtype= GS(id->name); + lb= wich_libbase(G.main, GS(id->name)); + + if(idwasnul) id= NULL; + else if(id->us>1) uiBlockSetCol(block, BUTDBLUE); + + if (pin && *pinpoin) { + uiBlockSetCol(block, BUTDPINK); + } + + if ELEM7( idtype, ID_SCE, ID_SCR, ID_MA, ID_TE, ID_WO, ID_IP, ID_AC) extrastr= "ADD NEW %x 32767"; + else if (idtype==ID_TXT) extrastr= "OPEN NEW %x 32766 |ADD NEW %x 32767"; + else if (idtype==ID_SO) extrastr= "OPEN NEW %x 32766"; + + uiSetButLock(G.scene->id.lib!=0, "Can't edit library data"); + if( idtype==ID_SCE || idtype==ID_SCR ) uiClearButLock(); + + if(curarea->spacetype==SPACE_BUTS) + uiSetButLock(idtype!=ID_SCR && G.obedit!=0 && G.buts->mainb==BUTS_EDIT, NULL); + + if(parid) uiSetButLock(parid->lib!=0, "Can't edit library data"); + + if (lb) { + if( idtype==ID_IP) + IPOnames_to_pupstring(&str, NULL, extrastr, lb, id, menupoin, G.sipo->blocktype); + else + IDnames_to_pupstring(&str, NULL, extrastr, lb, id, menupoin); + } + + uiDefButS(block, MENU, browse, str, (short)xco,0,XIC,YIC, menupoin, 0, 0, 0, 0, "Browse Datablock or Add NEW"); + + uiClearButLock(); + + MEM_freeN(str); + xco+= XIC; + } + else if(curarea->spacetype==SPACE_BUTS) { + if ELEM3(G.buts->mainb, BUTS_MAT, BUTS_TEX, BUTS_WORLD) { + uiSetButLock(G.scene->id.lib!=0, "Can't edit library data"); + if(parid) uiSetButLock(parid->lib!=0, "Can't edit library data"); + uiDefButS(block, MENU, browse, "ADD NEW %x 32767",(short) xco,0,XIC,YIC, menupoin, 0, 0, 0, 0, "Browse Datablock"); + uiClearButLock(); + } else if (G.buts->mainb == BUTS_SOUND) { + uiDefButS(block, MENU, browse, "OPEN NEW %x 32766",(short) xco,0,XIC,YIC, menupoin, 0, 0, 0, 0, "Browse Datablock"); + } + } + else if(curarea->spacetype==SPACE_TEXT) { + uiDefButS(block, MENU, browse, "OPEN NEW %x 32766 | ADD NEW %x 32767", (short)xco,0,XIC,YIC, menupoin, 0, 0, 0, 0, "Browse Datablock"); + } + else if(curarea->spacetype==SPACE_SOUND) { + uiDefButS(block, MENU, browse, "OPEN NEW %x 32766",(short)xco,0,XIC,YIC, menupoin, 0, 0, 0, 0, "Browse Datablock"); + } + else if(curarea->spacetype==SPACE_NLA) { + } + else if(curarea->spacetype==SPACE_ACTION) { + uiSetButLock(G.scene->id.lib!=0, "Can't edit library data"); + if(parid) uiSetButLock(parid->lib!=0, "Can't edit library data"); + + uiDefButS(block, MENU, browse, "ADD NEW %x 32767", xco,0,XIC,YIC, menupoin, 0, 0, 0, 0, "Browse Datablock"); + uiClearButLock(); + } + else if(curarea->spacetype==SPACE_IPO) { + uiSetButLock(G.scene->id.lib!=0, "Can't edit library data"); + if(parid) uiSetButLock(parid->lib!=0, "Can't edit library data"); + + uiDefButS(block, MENU, browse, "ADD NEW %x 32767", (short)xco,0,XIC,YIC, menupoin, 0, 0, 0, 0, "Browse Datablock"); + uiClearButLock(); + } + } + + + uiBlockSetCol(block, oldcol); + + if(id) { + + /* name */ + if(id->us>1) uiBlockSetCol(block, BUTDBLUE); + /* Pinned data ? */ + if (pin && *pinpoin) { + uiBlockSetCol(block, BUTDPINK); + } + /* Redalert overrides pin color */ + if(id->us<=0) uiBlockSetCol(block, REDALERT); + + uiSetButLock(id->lib!=0, "Can't edit library data"); + + str1[0]= id->name[0]; + str1[1]= id->name[1]; + str1[2]= ':'; + str1[3]= 0; + if(strcmp(str1, "SC:")==0) strcpy(str1, "SCE:"); + else if(strcmp(str1, "SR:")==0) strcpy(str1, "SCR:"); + + if( GS(id->name)==ID_IP) len= 110; + else len= 120; + + but= uiDefBut(block, TEX, B_IDNAME, str1,(short)xco, 0, (short)len, YIC, id->name+2, 0.0, 19.0, 0, 0, "Datablock name"); + uiButSetFunc(but, test_idbutton_cb, id->name, NULL); + + uiClearButLock(); + + xco+= len; + + if(id->lib) { + + if(parid && parid->lib) uiDefIconBut(block, BUT, 0, ICON_DATALIB,(short)xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Indirect Library Datablock"); + else uiDefIconBut(block, BUT, lib, ICON_PARLIB, (short)xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Library DataBlock, press to make local"); + + xco+= XIC; + } + + + if(users && id->us>1) { + uiSetButLock (pin && *pinpoin, "Can't make pinned data single-user"); + + sprintf(str1, "%d", id->us); + if(id->us<100) { + + uiDefBut(block, BUT, users, str1, (short)xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Number of users, press to make single-user"); + xco+= XIC; + } + else { + uiDefBut(block, BUT, users, str1, (short)xco, 0, XIC+10, YIC, 0, 0, 0, 0, 0, "Number of users, press to make single-user"); + xco+= XIC+10; + } + + uiClearButLock(); + + } + + if(del) { + + uiSetButLock (pin && *pinpoin, "Can't unlink pinned data"); + if(parid && parid->lib); + else { + uiDefIconBut(block, BUT, del, ICON_X, (short)xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Delete link to this Datablock"); + xco+= XIC; + } + + uiClearButLock(); + } + + if(autobut) { + if(parid && parid->lib); + else { + uiDefIconBut(block, BUT, autobut, ICON_AUTO,(short)xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Automatic name"); + xco+= XIC; + } + + + } + } + else xco+=XIC; + + uiBlockSetCol(block, oldcol); + + return xco; +} + +void update_for_newframe(void) +{ + allqueue(REDRAWVIEW3D, 0); + allqueue(REDRAWACTION,0); + allqueue(REDRAWNLA,0); + allqueue(REDRAWIPO, 0); + allqueue(REDRAWINFO, 1); + allqueue(REDRAWSEQ, 1); + allqueue(REDRAWSOUND, 1); + allqueue(REDRAWBUTSHEAD, 1); + allqueue(REDRAWBUTSMAT, 1); + allqueue(REDRAWBUTSLAMP, 1); + + /* layers/materials, object ipos are calculted in where_is_object (too) */ + do_all_ipos(); + BPY_do_all_scripts(SCRIPT_FRAMECHANGED); + do_all_keys(); + do_all_actions(); + do_all_ikas(); + + test_all_displists(); +} + +static void show_splash(void) +{ + extern char datatoc_splash_jpg[]; + extern int datatoc_splash_jpg_size; + char *string = NULL; + +#ifdef NAN_BUILDINFO + char buffer[1024]; + extern char * build_date; + extern char * build_time; + extern char * build_platform; + extern char * build_type; + + string = &buffer[0]; + sprintf(string,"Built on %s %s Version %s %s", build_date, build_time, build_platform, build_type); +#endif + + splash((void *)datatoc_splash_jpg, datatoc_splash_jpg_size, string); +} + +void do_global_buttons(unsigned short event) +{ + ListBase *lb; + Object *ob; + Material *ma; + MTex *mtex; + Ipo *ipo; + Lamp *la; + World *wrld; + Sequence *seq; + bAction *act; + ID *id, *idtest, *from; + int nr= 1; + + ob= OBACT; + + id= 0; /* id op nul voor texbrowse */ + + switch(event) { + + case B_NEWFRAME: + scrarea_queue_winredraw(curarea); + scrarea_queue_headredraw(curarea); + + update_for_newframe(); + break; + case B_REDR: + scrarea_queue_winredraw(curarea); + scrarea_queue_headredraw(curarea); + break; + case B_EDITBROWSE: + if(ob==0) return; + if(ob->id.lib) return; + id= ob->data; + if(id==0) return; + + if(G.buts->menunr== -2) { + activate_databrowse((ID *)G.buts->lockpoin, GS(id->name), 0, B_EDITBROWSE, &G.buts->menunr, do_global_buttons); + return; + } + if(G.buts->menunr < 0) return; + + lb= wich_libbase(G.main, GS(id->name)); + idtest= lb->first; + while(idtest) { + if(nr==G.buts->menunr) { + if(idtest!=id) { + id->us--; + id_us_plus(idtest); + + ob->data= idtest; + + test_object_materials(idtest); + + if( GS(idtest->name)==ID_CU ) { + test_curve_type(ob); + allqueue(REDRAWBUTSEDIT, 0); + makeDispList(ob); + } + else if( ob->type==OB_MESH ) { + makeDispList(ob); + } + + allqueue(REDRAWBUTSEDIT, 0); + allqueue(REDRAWVIEW3D, 0); + allqueue(REDRAWACTION,0); + allqueue(REDRAWIPO, 0); + allqueue(REDRAWNLA,0); + } + break; + } + nr++; + idtest= idtest->next; + } + + break; + case B_MESHBROWSE: + if(ob==0) return; + if(ob->id.lib) return; + + id= ob->data; + if(id==0) id= G.main->mesh.first; + if(id==0) return; + + if(G.buts->menunr== -2) { + activate_databrowse((ID *)G.buts->lockpoin, GS(id->name), 0, B_MESHBROWSE, &G.buts->menunr, do_global_buttons); + return; + } + if(G.buts->menunr < 0) return; + + + idtest= G.main->mesh.first; + while(idtest) { + if(nr==G.buts->menunr) { + + set_mesh(ob, (Mesh *)idtest); + + allqueue(REDRAWBUTSEDIT, 0); + allqueue(REDRAWVIEW3D, 0); + allqueue(REDRAWACTION,0); + allqueue(REDRAWIPO, 0); + + break; + } + nr++; + idtest= idtest->next; + } + + break; + case B_MATBROWSE: + if(G.buts->menunr== -2) { + activate_databrowse((ID *)G.buts->lockpoin, ID_MA, 0, B_MATBROWSE, &G.buts->menunr, do_global_buttons); + return; + } + + if(G.buts->menunr < 0) return; + + if(G.buts->pin) { + + } + else { + + ma= give_current_material(ob, ob->actcol); + nr= 1; + + id= (ID *)ma; + + idtest= G.main->mat.first; + while(idtest) { + if(nr==G.buts->menunr) { + break; + } + nr++; + idtest= idtest->next; + } + if(idtest==0) { /* new mat */ + if(id) idtest= (ID *)copy_material((Material *)id); + else { + idtest= (ID *)add_material("Material"); + } + idtest->us--; + } + if(idtest!=id) { + assign_material(ob, (Material *)idtest, ob->actcol); + + allqueue(REDRAWBUTSHEAD, 0); + allqueue(REDRAWBUTSMAT, 0); + allqueue(REDRAWIPO, 0); + BIF_preview_changed(G.buts); + } + + } + break; + case B_MATDELETE: + if(G.buts->pin) { + + } + else { + ma= give_current_material(ob, ob->actcol); + if(ma) { + assign_material(ob, 0, ob->actcol); + allqueue(REDRAWBUTSHEAD, 0); + allqueue(REDRAWBUTSMAT, 0); + allqueue(REDRAWIPO, 0); + BIF_preview_changed(G.buts); + } + } + break; + case B_TEXDELETE: + if(G.buts->pin) { + + } + else { + if(G.buts->texfrom==0) { /* from mat */ + ma= give_current_material(ob, ob->actcol); + if(ma) { + mtex= ma->mtex[ ma->texact ]; + if(mtex) { + if(mtex->tex) mtex->tex->id.us--; + MEM_freeN(mtex); + ma->mtex[ ma->texact ]= 0; + allqueue(REDRAWBUTSTEX, 0); + allqueue(REDRAWIPO, 0); + BIF_preview_changed(G.buts); + } + } + } + else if(G.buts->texfrom==1) { /* from world */ + wrld= G.scene->world; + if(wrld) { + mtex= wrld->mtex[ wrld->texact ]; + if(mtex) { + if(mtex->tex) mtex->tex->id.us--; + MEM_freeN(mtex); + wrld->mtex[ wrld->texact ]= 0; + allqueue(REDRAWBUTSTEX, 0); + allqueue(REDRAWIPO, 0); + BIF_preview_changed(G.buts); + } + } + } + else { /* from lamp */ + la= ob->data; + if(la && ob->type==OB_LAMP) { /* voor zekerheid */ + mtex= la->mtex[ la->texact ]; + if(mtex) { + if(mtex->tex) mtex->tex->id.us--; + MEM_freeN(mtex); + la->mtex[ la->texact ]= 0; + allqueue(REDRAWBUTSTEX, 0); + allqueue(REDRAWIPO, 0); + BIF_preview_changed(G.buts); + } + } + } + } + break; + case B_EXTEXBROWSE: + case B_TEXBROWSE: + + if(G.buts->texnr== -2) { + + id= G.buts->lockpoin; + if(event==B_EXTEXBROWSE) { + id= 0; + ma= give_current_material(ob, ob->actcol); + if(ma) { + mtex= ma->mtex[ ma->texact ]; + if(mtex) id= (ID *)mtex->tex; + } + } + + activate_databrowse(id, ID_TE, 0, B_TEXBROWSE, &G.buts->texnr, do_global_buttons); + return; + } + if(G.buts->texnr < 0) break; + + if(G.buts->pin) { + + } + else { + id= 0; + + ma= give_current_material(ob, ob->actcol); + if(ma) { + mtex= ma->mtex[ ma->texact ]; + if(mtex) id= (ID *)mtex->tex; + } + + idtest= G.main->tex.first; + while(idtest) { + if(nr==G.buts->texnr) { + break; + } + nr++; + idtest= idtest->next; + } + if(idtest==0) { /* new tex */ + if(id) idtest= (ID *)copy_texture((Tex *)id); + else idtest= (ID *)add_texture("Tex"); + idtest->us--; + } + if(idtest!=id && ma) { + + if( ma->mtex[ma->texact]==0) ma->mtex[ma->texact]= add_mtex(); + + ma->mtex[ ma->texact ]->tex= (Tex *)idtest; + id_us_plus(idtest); + if(id) id->us--; + + allqueue(REDRAWBUTSHEAD, 0); + allqueue(REDRAWBUTSTEX, 0); + allqueue(REDRAWBUTSMAT, 0); + allqueue(REDRAWIPO, 0); + BIF_preview_changed(G.buts); + } + } + break; + case B_ACTIONDELETE: + act=ob->action; + + if (act) + act->id.us--; + ob->action=NULL; + allqueue(REDRAWACTION, 0); + allqueue(REDRAWNLA, 0); + allqueue(REDRAWIPO, 0); + break; + case B_ACTIONBROWSE: + if (!ob) + break; + act=ob->action; + id= (ID *)act; + + if (G.saction->actnr== -2){ + activate_databrowse((ID *)G.saction->action, ID_AC, 0, B_ACTIONBROWSE, &G.saction->actnr, do_global_buttons); + return; + } + + if(G.saction->actnr < 0) break; + + /* See if we have selected a valid action */ + for (idtest= G.main->action.first; idtest; idtest= idtest->next) { + if(nr==G.saction->actnr) { + break; + } + nr++; + + } + + if(G.saction->pin) { + G.saction->action= (bAction *)idtest; + allqueue(REDRAWACTION, 0); + } + else { + + /* Store current action */ + if (!idtest){ + if (act) + idtest= (ID *)copy_action(act); + else + idtest=(ID *)add_empty_action(); + idtest->us--; + } + + + if(idtest!=id && ob) { + act= (bAction *)idtest; + + ob->action= act; + ob->activecon=NULL; + id_us_plus(idtest); + + if(id) id->us--; + + // Update everything + do_global_buttons (B_NEWFRAME); + allqueue(REDRAWVIEW3D, 0); + allqueue(REDRAWNLA, 0); + allqueue(REDRAWACTION, 0); + allqueue(REDRAWHEADERS, 0); + } + } + + break; + case B_IPOBROWSE: + + ipo= get_ipo_to_edit(&from); + id= (ID *)ipo; + if(from==0) return; + + if(G.sipo->menunr== -2) { + activate_databrowse((ID *)G.sipo->ipo, ID_IP, GS(from->name), B_IPOBROWSE, &G.sipo->menunr, do_global_buttons); + return; + } + + if(G.sipo->menunr < 0) break; + + idtest= G.main->ipo.first; + while(idtest) { + if( ((Ipo *)idtest)->blocktype == G.sipo->blocktype) { + if(nr==G.sipo->menunr) { + break; + } + nr++; + } + idtest= idtest->next; + } + + if(G.sipo->pin) { + if(idtest) { + G.sipo->ipo= (Ipo *)idtest; + allspace(REMAKEIPO, 0); // in fact it should only do this one, but there is no function for it + } + } + else { + // assign the ipo to ... + + if(idtest==0) { + if(ipo) idtest= (ID *)copy_ipo(ipo); + else { + nr= GS(from->name); + if(nr==ID_OB){ + if (G.sipo->blocktype==IPO_CO) + idtest= (ID *)add_ipo("CoIpo", IPO_CO); /* BLEARGH! */ + else + idtest= (ID *)add_ipo("ObIpo", nr); + } + else if(nr==ID_MA) idtest= (ID *)add_ipo("MatIpo", nr); + else if(nr==ID_SEQ) idtest= (ID *)add_ipo("MatSeq", nr); + else if(nr==ID_CU) idtest= (ID *)add_ipo("CuIpo", nr); + else if(nr==ID_KE) idtest= (ID *)add_ipo("KeyIpo", nr); + else if(nr==ID_WO) idtest= (ID *)add_ipo("WoIpo", nr); + else if(nr==ID_LA) idtest= (ID *)add_ipo("LaIpo", nr); + else if(nr==ID_CA) idtest= (ID *)add_ipo("CaIpo", nr); + else if(nr==ID_SO) idtest= (ID *)add_ipo("SndIpo", nr); + else if(nr==ID_AC) idtest= (ID *)add_ipo("ActIpo", nr); + else error("Warn bugs@blender.nl!"); + } + idtest->us--; + } + if(idtest!=id && from) { + ipo= (Ipo *)idtest; + + if (ipo->blocktype==IPO_CO){ + ((Object*)from)->activecon->ipo = ipo; + id_us_plus(idtest); + allqueue(REDRAWVIEW3D, 0); + allqueue(REDRAWACTION, 0); + allqueue(REDRAWNLA, 0); + } + else if(ipo->blocktype==ID_OB) { + ( (Object *)from)->ipo= ipo; + id_us_plus(idtest); + allqueue(REDRAWVIEW3D, 0); + } + else if(ipo->blocktype==ID_AC) { + bActionChannel *chan; + chan = get_hilighted_action_channel ((bAction*)from); + if (!chan){ + error ("Create an action channel first"); + return; + } + chan->ipo=ipo; + id_us_plus(idtest); + allqueue(REDRAWNLA, 0); + allqueue(REDRAWACTION, 0); + } + else if(ipo->blocktype==ID_MA) { + ( (Material *)from)->ipo= ipo; + id_us_plus(idtest); + allqueue(REDRAWBUTSMAT, 0); + } + else if(ipo->blocktype==ID_SEQ) { + seq= (Sequence *)from; + if(seq->type & SEQ_EFFECT) { + id_us_plus(idtest); + seq->ipo= ipo; + } + } + else if(ipo->blocktype==ID_CU) { + ( (Curve *)from)->ipo= ipo; + id_us_plus(idtest); + allqueue(REDRAWVIEW3D, 0); + } + else if(ipo->blocktype==ID_KE) { + ( (Key *)from)->ipo= ipo; + + id_us_plus(idtest); + allqueue(REDRAWVIEW3D, 0); + + } + else if(ipo->blocktype==ID_WO) { + ( (World *)from)->ipo= ipo; + id_us_plus(idtest); + allqueue(REDRAWBUTSWORLD, 0); + } + else if(ipo->blocktype==ID_LA) { + ( (Lamp *)from)->ipo= ipo; + id_us_plus(idtest); + allqueue(REDRAWBUTSLAMP, 0); + } + else if(ipo->blocktype==ID_CA) { + ( (Camera *)from)->ipo= ipo; + id_us_plus(idtest); + allqueue(REDRAWBUTSEDIT, 0); + } + else if(ipo->blocktype==ID_SO) { + ( (bSound *)from)->ipo= ipo; + id_us_plus(idtest); + allqueue(REDRAWBUTSEDIT, 0); + } + else + printf("error in browse ipo \n"); + + if(id) id->us--; + + scrarea_queue_winredraw(curarea); + scrarea_queue_headredraw(curarea); + allqueue(REDRAWIPO, 0); + } + } + break; + case B_IPODELETE: + ipo= get_ipo_to_edit(&from); + if(from==0) return; + + ipo->id.us--; + + if(ipo->blocktype==ID_OB) ( (Object *)from)->ipo= 0; + else if(ipo->blocktype==ID_MA) ( (Material *)from)->ipo= 0; + else if(ipo->blocktype==ID_SEQ) ( (Sequence *)from)->ipo= 0; + else if(ipo->blocktype==ID_CU) ( (Curve *)from)->ipo= 0; + else if(ipo->blocktype==ID_KE) ( (Key *)from)->ipo= 0; + else if(ipo->blocktype==ID_WO) ( (World *)from)->ipo= 0; + else if(ipo->blocktype==ID_LA) ( (Lamp *)from)->ipo= 0; + else if(ipo->blocktype==ID_WO) ( (World *)from)->ipo= 0; + else if(ipo->blocktype==ID_CA) ( (Camera *)from)->ipo= 0; + else if(ipo->blocktype==ID_SO) ( (bSound *)from)->ipo= 0; + else if(ipo->blocktype==ID_AC) get_hilighted_action_channel((bAction*)from)->ipo= 0; + else if(ipo->blocktype==IPO_CO) ((Object *)from)->activecon->ipo= 0; + + else error("Warn bugs@blender.nl!"); + + editipo_changed(G.sipo, 1); /* doredraw */ + allqueue(REDRAWIPO, 0); + allqueue(REDRAWNLA, 0); + allqueue (REDRAWACTION, 0); + + break; + case B_WORLDBROWSE: + + if(G.buts->menunr==-2) { + activate_databrowse((ID *)G.scene->world, ID_WO, 0, B_WORLDBROWSE, &G.buts->menunr, do_global_buttons); + break; + } + + if(G.buts->menunr < 0) break; + /* geen lock */ + + wrld= G.scene->world; + nr= 1; + + id= (ID *)wrld; + + idtest= G.main->world.first; + while(idtest) { + if(nr==G.buts->menunr) { + break; + } + nr++; + idtest= idtest->next; + } + if(idtest==0) { /* new world */ + if(id) idtest= (ID *)copy_world((World *)id); + else idtest= (ID *)add_world("World"); + idtest->us--; + } + if(idtest!=id) { + G.scene->world= (World *)idtest; + id_us_plus(idtest); + if(id) id->us--; + + allqueue(REDRAWBUTSHEAD, 0); + allqueue(REDRAWBUTSWORLD, 0); + allqueue(REDRAWIPO, 0); + BIF_preview_changed(G.buts); + } + break; + case B_WORLDDELETE: + if(G.scene->world) { + G.scene->world->id.us--; + G.scene->world= 0; + allqueue(REDRAWBUTSWORLD, 0); + allqueue(REDRAWIPO, 0); + } + + break; + case B_WTEXBROWSE: + + if(G.buts->texnr== -2) { + id= 0; + wrld= G.scene->world; + if(wrld) { + mtex= wrld->mtex[ wrld->texact ]; + if(mtex) id= (ID *)mtex->tex; + } + + activate_databrowse((ID *)id, ID_TE, 0, B_WTEXBROWSE, &G.buts->texnr, do_global_buttons); + return; + } + if(G.buts->texnr < 0) break; + + if(G.buts->pin) { + + } + else { + id= 0; + + wrld= G.scene->world; + if(wrld) { + mtex= wrld->mtex[ wrld->texact ]; + if(mtex) id= (ID *)mtex->tex; + } + + idtest= G.main->tex.first; + while(idtest) { + if(nr==G.buts->texnr) { + break; + } + nr++; + idtest= idtest->next; + } + if(idtest==0) { /* new tex */ + if(id) idtest= (ID *)copy_texture((Tex *)id); + else idtest= (ID *)add_texture("Tex"); + idtest->us--; + } + if(idtest!=id && wrld) { + + if( wrld->mtex[wrld->texact]==0) { + wrld->mtex[wrld->texact]= add_mtex(); + wrld->mtex[wrld->texact]->texco= TEXCO_VIEW; + } + wrld->mtex[ wrld->texact ]->tex= (Tex *)idtest; + id_us_plus(idtest); + if(id) id->us--; + + allqueue(REDRAWBUTSHEAD, 0); + allqueue(REDRAWBUTSTEX, 0); + allqueue(REDRAWBUTSWORLD, 0); + allqueue(REDRAWIPO, 0); + BIF_preview_changed(G.buts); + } + } + break; + case B_LAMPBROWSE: + /* geen lock */ + if(ob==0) return; + if(ob->type!=OB_LAMP) return; + + if(G.buts->menunr== -2) { + activate_databrowse((ID *)G.buts->lockpoin, ID_LA, 0, B_LAMPBROWSE, &G.buts->menunr, do_global_buttons); + return; + } + if(G.buts->menunr < 0) break; + + la= ob->data; + nr= 1; + id= (ID *)la; + + idtest= G.main->lamp.first; + while(idtest) { + if(nr==G.buts->menunr) { + break; + } + nr++; + idtest= idtest->next; + } + if(idtest==0) { /* geen new lamp */ + return; + } + if(idtest!=id) { + ob->data= (Lamp *)idtest; + id_us_plus(idtest); + if(id) id->us--; + + allqueue(REDRAWBUTSHEAD, 0); + allqueue(REDRAWBUTSLAMP, 0); + allqueue(REDRAWVIEW3D, 0); + allqueue(REDRAWIPO, 0); + BIF_preview_changed(G.buts); + } + break; + + case B_LTEXBROWSE: + + if(ob==0) return; + if(ob->type!=OB_LAMP) return; + + if(G.buts->texnr== -2) { + id= 0; + la= ob->data; + mtex= la->mtex[ la->texact ]; + if(mtex) id= (ID *)mtex->tex; + + activate_databrowse(id, ID_TE, 0, B_LTEXBROWSE, &G.buts->texnr, do_global_buttons); + return; + } + if(G.buts->texnr < 0) break; + + if(G.buts->pin) { + + } + else { + id= 0; + + la= ob->data; + mtex= la->mtex[ la->texact ]; + if(mtex) id= (ID *)mtex->tex; + + idtest= G.main->tex.first; + while(idtest) { + if(nr==G.buts->texnr) { + break; + } + nr++; + idtest= idtest->next; + } + if(idtest==0) { /* new tex */ + if(id) idtest= (ID *)copy_texture((Tex *)id); + else idtest= (ID *)add_texture("Tex"); + idtest->us--; + } + if(idtest!=id && la) { + + if( la->mtex[la->texact]==0) { + la->mtex[la->texact]= add_mtex(); + la->mtex[la->texact]->texco= TEXCO_GLOB; + } + la->mtex[ la->texact ]->tex= (Tex *)idtest; + id_us_plus(idtest); + if(id) id->us--; + + allqueue(REDRAWBUTSHEAD, 0); + allqueue(REDRAWBUTSTEX, 0); + allqueue(REDRAWBUTSLAMP, 0); + allqueue(REDRAWIPO, 0); + BIF_preview_changed(G.buts); + } + } + break; + + case B_IMAGEDELETE: + G.sima->image= 0; + image_changed(G.sima, 0); + allqueue(REDRAWIMAGE, 0); + break; + + case B_AUTOMATNAME: + automatname(G.buts->lockpoin); + allqueue(REDRAWBUTSHEAD, 0); + break; + case B_AUTOTEXNAME: + if(G.buts->mainb==BUTS_TEX) { + autotexname(G.buts->lockpoin); + allqueue(REDRAWBUTSHEAD, 0); + allqueue(REDRAWBUTSTEX, 0); + } + else if(G.buts->mainb==BUTS_MAT) { + ma= G.buts->lockpoin; + if(ma->mtex[ ma->texact]) autotexname(ma->mtex[ma->texact]->tex); + allqueue(REDRAWBUTSMAT, 0); + } + else if(G.buts->mainb==BUTS_WORLD) { + wrld= G.buts->lockpoin; + if(wrld->mtex[ wrld->texact]) autotexname(wrld->mtex[wrld->texact]->tex); + allqueue(REDRAWBUTSWORLD, 0); + } + else if(G.buts->mainb==BUTS_LAMP) { + la= G.buts->lockpoin; + if(la->mtex[ la->texact]) autotexname(la->mtex[la->texact]->tex); + allqueue(REDRAWBUTSLAMP, 0); + } + break; + + case B_RESETAUTOSAVE: + reset_autosave(); + break; + case B_SOUNDTOGGLE: + SYS_WriteCommandLineInt(SYS_GetSystem(), "noaudio", (U.gameflags & USERDEF_DISABLE_SOUND)); + break; + case B_SHOWSPLASH: + if ((LICENSE_KEY_VALID) && ((G.qual & LR_SHIFTKEY) == 0)) { + SHOW_LICENSE_KEY(); + } else { + show_splash(); + } + break; + case B_MIPMAPCHANGED: + set_mipmap(!(U.gameflags & USERDEF_DISABLE_SOUND)); + allqueue(REDRAWVIEW3D, 0); + break; + case B_NEWSPACE: + newspace(curarea, curarea->butspacetype); + break; + case B_LOADTEMP: /* is button uit space.c */ + BIF_read_autosavefile(); + break; + case B_FULL: + if(curarea->spacetype!=SPACE_INFO) { + area_fullscreen(); + } + break; + + case B_IDNAME: + /* changing a metaballs name, sadly enough, + * can require it to be updated because its + * basis might have changed... -zr + */ + if (OBACT && OBACT->type==OB_MBALL) + makeDispList(OBACT); + + /* redraw omdat naam veranderd is: nieuwe pup */ + scrarea_queue_headredraw(curarea); + allqueue(REDRAWBUTSHEAD, 0); + allqueue(REDRAWINFO, 1); + allqueue(REDRAWOOPS, 1); + /* naam scene ook in set PUPmenu */ + if ELEM(curarea->spacetype, SPACE_BUTS, SPACE_INFO) allqueue(REDRAWBUTSALL, 0); + + allqueue(REDRAWHEADERS, 0); + + break; + } +} + + +void do_global_buttons2(short event) +{ + Base *base; + Object *ob; + Material *ma; + MTex *mtex; + Mesh *me; + Curve *cu; + MetaBall *mb; + Ipo *ipo; + Lamp *la; + Lattice *lt; + World *wrld; + ID *idfrom; + bAction *act; + + /* algemeen: Single User mag als from==LOCAL + * Make Local mag als (from==LOCAL && id==LIB) + */ + + ob= OBACT; + + switch(event) { + + case B_LAMPALONE: + if(ob && ob->id.lib==0) { + la= ob->data; + if(la->id.us>1) { + if(okee("Single user")) { + ob->data= copy_lamp(la); + la->id.us--; + } + } + } + break; + case B_LAMPLOCAL: + if(ob && ob->id.lib==0) { + la= ob->data; + if(la->id.lib) { + if(okee("Make local")) { + make_local_lamp(la); + } + } + } + break; + + case B_ARMLOCAL: + if (ob&&ob->id.lib==0){ + bArmature *arm=ob->data; + if (arm->id.lib){ + if(okee("Make local")) { + make_local_armature(arm); + } + } + } + break; + case B_ARMALONE: + if(ob && ob->id.lib==0) { + bArmature *arm=ob->data; + if(arm->id.us>1) { + if(okee("Single user")) { + ob->data= copy_armature(arm); + arm->id.us--; + } + } + } + break; + case B_ACTLOCAL: + if(ob && ob->id.lib==0) { + act= ob->action; + if(act->id.lib) { + if(okee("Make local")) { + make_local_action(act); + allqueue(REDRAWACTION,0); + } + } + } + break; + case B_ACTALONE: + if (ob) + act= ob->action; + + if(ob && ob->id.lib==0) { + if(act->id.us>1) { + if(okee("Single user")) { + ob->action=copy_action(act); + ob->activecon=NULL; + act->id.us--; + allqueue(REDRAWACTION, 0); + } + } + } + break; + + case B_CAMERAALONE: + if(ob && ob->id.lib==0) { + Camera *ca= ob->data; + if(ca->id.us>1) { + if(okee("Single user")) { + ob->data= copy_camera(ca); + ca->id.us--; + } + } + } + break; + case B_CAMERALOCAL: + if(ob && ob->id.lib==0) { + Camera *ca= ob->data; + if(ca->id.lib) { + if(okee("Make local")) { + make_local_camera(ca); + } + } + } + break; + case B_WORLDALONE: + wrld= G.scene->world; + if(wrld->id.us>1) { + if(okee("Single user")) { + G.scene->world= copy_world(wrld); + wrld->id.us--; + } + } + break; + case B_WORLDLOCAL: + wrld= G.scene->world; + if(wrld && wrld->id.lib) { + if(okee("Make local")) { + make_local_world(wrld); + } + } + break; + + case B_LATTALONE: + if(ob && ob->id.lib==0) { + lt= ob->data; + if(lt->id.us>1) { + if(okee("Single user")) { + ob->data= copy_lattice(lt); + lt->id.us--; + } + } + } + break; + case B_LATTLOCAL: + if(ob && ob->id.lib==0) { + lt= ob->data; + if(lt->id.lib) { + if(okee("Make local")) { + make_local_lattice(lt); + } + } + } + break; + + case B_MATALONE: + if(ob==0) return; + ma= give_current_material(ob, ob->actcol); + idfrom= material_from(ob, ob->actcol); + if(idfrom && idfrom->lib==0) { + if(ma->id.us>1) { + if(okee("Single user")) { + ma= copy_material(ma); + ma->id.us= 0; + assign_material(ob, ma, ob->actcol); + } + } + } + break; + case B_MATLOCAL: + if(ob==0) return; + idfrom= material_from(ob, ob->actcol); + if(idfrom->lib==0) { + ma= give_current_material(ob, ob->actcol); + if(ma && ma->id.lib) { + if(okee("Make local")) { + make_local_material(ma); + } + } + } + break; + + case B_MESHLOCAL: + if(ob && ob->id.lib==0) { + me= ob->data; + if(me && me->id.lib) { + if(okee("Make local")) { + make_local_mesh(me); + make_local_key( me->key ); + } + } + } + break; + + case B_MBALLALONE: + if(ob && ob->id.lib==0) { + mb= ob->data; + if(mb->id.us>1) { + if(okee("Single user")) { + ob->data= copy_mball(mb); + mb->id.us--; + if(ob==G.obedit) allqueue(REDRAWVIEW3D, 0); + } + } + } + break; + case B_MBALLLOCAL: + if(ob && ob->id.lib==0) { + mb= ob->data; + if(mb->id.lib) { + if(okee("Make local")) { + make_local_mball(mb); + } + } + } + break; + + case B_CURVEALONE: + if(ob && ob->id.lib==0) { + cu= ob->data; + if(cu->id.us>1) { + if(okee("Single user")) { + ob->data= copy_curve(cu); + cu->id.us--; + makeDispList(ob); + if(ob==G.obedit) allqueue(REDRAWVIEW3D, 0); + } + } + } + break; + case B_CURVELOCAL: + if(ob && ob->id.lib==0) { + cu= ob->data; + if(cu->id.lib) { + if(okee("Make local")) { + make_local_curve(cu); + make_local_key( cu->key ); + makeDispList(ob); + } + } + } + break; + + case B_TEXALONE: + if(G.buts->texfrom==0) { /* from mat */ + if(ob==0) return; + ma= give_current_material(ob, ob->actcol); + if(ma && ma->id.lib==0) { + mtex= ma->mtex[ ma->texact ]; + if(mtex->tex && mtex->tex->id.us>1) { + if(okee("Single user")) { + mtex->tex->id.us--; + mtex->tex= copy_texture(mtex->tex); + } + } + } + } + else if(G.buts->texfrom==1) { /* from world */ + wrld= G.scene->world; + if(wrld->id.lib==0) { + mtex= wrld->mtex[ wrld->texact ]; + if(mtex->tex && mtex->tex->id.us>1) { + if(okee("Single user")) { + mtex->tex->id.us--; + mtex->tex= copy_texture(mtex->tex); + } + } + } + } + else if(G.buts->texfrom==2) { /* from lamp */ + if(ob==0 || ob->type!=OB_LAMP) return; + la= ob->data; + if(la->id.lib==0) { + mtex= la->mtex[ la->texact ]; + if(mtex->tex && mtex->tex->id.us>1) { + if(okee("Single user")) { + mtex->tex->id.us--; + mtex->tex= copy_texture(mtex->tex); + } + } + } + } + break; + case B_TEXLOCAL: + if(G.buts->texfrom==0) { /* from mat */ + if(ob==0) return; + ma= give_current_material(ob, ob->actcol); + if(ma && ma->id.lib==0) { + mtex= ma->mtex[ ma->texact ]; + if(mtex->tex && mtex->tex->id.lib) { + if(okee("Make local")) { + make_local_texture(mtex->tex); + } + } + } + } + else if(G.buts->texfrom==1) { /* from world */ + wrld= G.scene->world; + if(wrld->id.lib==0) { + mtex= wrld->mtex[ wrld->texact ]; + if(mtex->tex && mtex->tex->id.lib) { + if(okee("Make local")) { + make_local_texture(mtex->tex); + } + } + } + } + else if(G.buts->texfrom==2) { /* from lamp */ + if(ob==0 || ob->type!=OB_LAMP) return; + la= ob->data; + if(la->id.lib==0) { + mtex= la->mtex[ la->texact ]; + if(mtex->tex && mtex->tex->id.lib) { + if(okee("Make local")) { + make_local_texture(mtex->tex); + } + } + } + } + break; + + case B_IPOALONE: + ipo= get_ipo_to_edit(&idfrom); + + if(idfrom && idfrom->lib==0) { + if(ipo->id.us>1) { + if(okee("Single user")) { + if(ipo->blocktype==ID_OB) ((Object *)idfrom)->ipo= copy_ipo(ipo); + else if(ipo->blocktype==ID_MA) ((Material *)idfrom)->ipo= copy_ipo(ipo); + else if(ipo->blocktype==ID_SEQ) ((Sequence *)idfrom)->ipo= copy_ipo(ipo); + else if(ipo->blocktype==ID_CU) ((Curve *)idfrom)->ipo= copy_ipo(ipo); + else if(ipo->blocktype==ID_KE) ((Key *)idfrom)->ipo= copy_ipo(ipo); + else if(ipo->blocktype==ID_LA) ((Lamp *)idfrom)->ipo= copy_ipo(ipo); + else if(ipo->blocktype==ID_WO) ((World *)idfrom)->ipo= copy_ipo(ipo); + else if(ipo->blocktype==ID_CA) ((Camera *)idfrom)->ipo= copy_ipo(ipo); + else if(ipo->blocktype==ID_SO) ((bSound *)idfrom)->ipo= copy_ipo(ipo); + else if(ipo->blocktype==ID_AC) get_hilighted_action_channel((bAction *)idfrom)->ipo= copy_ipo(ipo); + else if(ipo->blocktype==IPO_CO) ((Object *)idfrom)->activecon->ipo= copy_ipo(ipo); + else error("Warn ton!"); + + ipo->id.us--; + allqueue(REDRAWIPO, 0); + } + } + } + break; + case B_IPOLOCAL: + ipo= get_ipo_to_edit(&idfrom); + + if(idfrom && idfrom->lib==0) { + if(ipo->id.lib) { + if(okee("Make local")) { + make_local_ipo(ipo); + allqueue(REDRAWIPO, 0); + } + } + } + break; + + case B_OBALONE: + if(G.scene->id.lib==0) { + if(ob->id.us>1) { + if(okee("Single user")) { + base= FIRSTBASE; + while(base) { + if(base->object==ob) { + base->object= copy_object(ob); + ob->id.us--; + allqueue(REDRAWVIEW3D, 0); + break; + } + base= base->next; + } + } + } + } + break; + case B_OBLOCAL: + if(G.scene->id.lib==0) { + if(ob->id.lib) { + if(okee("Make local")) { + make_local_object(ob); + allqueue(REDRAWVIEW3D, 0); + } + } + } + break; + case B_MESHALONE: + if(ob && ob->id.lib==0) { + + me= ob->data; + + if(me && me->id.us>1) { + if(okee("Single user")) { + Mesh *men= copy_mesh(me); + men->id.us= 0; + + set_mesh(ob, men); + + if(ob==G.obedit) allqueue(REDRAWVIEW3D, 0); + } + } + } + break; + } + + allqueue(REDRAWBUTSALL, 0); + allqueue(REDRAWOOPS, 0); +} + +/* ********************** EMPTY ****************************** */ +/* ********************** INFO ****************************** */ + +int buttons_do_unpack() +{ + int how; + char menu[2048]; + char line[128]; + int ret_value = RET_OK, count = 0; + + count = countPackedFiles(); + + if (count) { + if (count == 1) { + sprintf(menu, "Unpack 1 file%%t"); + } else { + sprintf(menu, "Unpack %d files%%t", count); + } + + sprintf(line, "|Use files in current directory (create when necessary)%%x%d", PF_USE_LOCAL); + strcat(menu, line); + + sprintf(line, "|Write files to current directory (overwrite existing files)%%x%d", PF_WRITE_LOCAL); + strcat(menu, line); + + sprintf(line, "|%%l|Use files in original location (create when necessary)%%x%d", PF_USE_ORIGINAL); + strcat(menu, line); + + sprintf(line, "|Write files to original location (overwrite existing files)%%x%d", PF_WRITE_ORIGINAL); + strcat(menu, line); + + sprintf(line, "|%%l|Disable AutoPack, keep all packed files %%x%d", PF_KEEP); + strcat(menu, line); + + sprintf(line, "|Ask for each file %%x%d", PF_ASK); + strcat(menu, line); + + how = pupmenu(menu); + + if(how != -1) { + if (how != PF_KEEP) { + unpackAll(how); + } + G.fileflags &= ~G_AUTOPACK; + } else { + ret_value = RET_CANCEL; + } + } else { + pupmenu("No packed files. Autopack disabled"); + } + + return (ret_value); +} + +/* here, because of all creator stuff */ + +Scene *copy_scene(Scene *sce, int level) +{ + /* level 0: alle objects shared + * level 1: alle objectdata shared + * level 2: volledige kopie + */ + Scene *scen; + Base *base, *obase; + + + /* level 0 */ + scen= copy_libblock(sce); + duplicatelist(&(scen->base), &(sce->base)); + + clear_id_newpoins(); + + id_us_plus((ID *)scen->world); + id_us_plus((ID *)scen->set); + + scen->ed= 0; + scen->radio= 0; + + obase= sce->base.first; + base= scen->base.first; + while(base) { + base->object->id.us++; + if(obase==sce->basact) scen->basact= base; + + obase= obase->next; + base= base->next; + } + + if(level==0) return scen; + + /* level 1 */ + G.scene= scen; + single_object_users(0); + + /* camera */ + ID_NEW(G.scene->camera); + + /* level 2 */ + if(level>=2) { + if(scen->world) { + scen->world->id.us--; + scen->world= copy_world(scen->world); + } + single_obdata_users(0); + single_mat_users_expand(); + single_tex_users_expand(); + } + + clear_id_newpoins(); + + BPY_copy_scriptlink(&sce->scriptlink); + + + + // make a private copy of the avicodecdata + + if (sce->r.avicodecdata) { + + scen->r.avicodecdata = MEM_dupallocN(sce->r.avicodecdata); + + scen->r.avicodecdata->lpFormat = MEM_dupallocN(scen->r.avicodecdata->lpFormat); + + scen->r.avicodecdata->lpParms = MEM_dupallocN(scen->r.avicodecdata->lpParms); + + } + + return scen; +} + +void do_info_buttons(unsigned short event) +{ + bScreen *sc, *oldscreen; + Scene *sce, *sce1; + ScrArea *sa; + int nr; + + switch(event) { + + case B_INFOSCR: /* menu select screen */ + + if( G.curscreen->screennr== -2) { + if(curarea->winy <50) { + sa= closest_bigger_area(); + areawinset(sa->win); + } + activate_databrowse((ID *)G.curscreen, ID_SCR, 0, B_INFOSCR, &G.curscreen->screennr, do_info_buttons); + return; + } + if( G.curscreen->screennr < 0) return; + + sc= G.main->screen.first; + nr= 1; + while(sc) { + if(nr==G.curscreen->screennr) { + if(is_allowed_to_change_screen(sc)) setscreen(sc); + else error("Unable to perform function in EditMode"); + break; + } + nr++; + sc= sc->id.next; + } + /* laatste item: NEW SCREEN */ + if(sc==0) { + duplicate_screen(); + } + break; + case B_INFODELSCR: + /* dit event alleen met buttons doen, zodoende nooit vanuit full aanroepbaar */ + + if(G.curscreen->id.prev) sc= G.curscreen->id.prev; + else if(G.curscreen->id.next) sc= G.curscreen->id.next; + else return; + if(okee("Delete current screen")) { + /* vind nieuwe G.curscreen */ + + oldscreen= G.curscreen; + setscreen(sc); /* deze test of sc een full heeft */ + unlink_screen(oldscreen); + free_libblock(&G.main->screen, oldscreen); + } + scrarea_queue_headredraw(curarea); + + break; + case B_INFOSCE: /* menu select scene */ + + if( G.obedit) { + error("Unable to perform function in EditMode"); + return; + } + if( G.curscreen->scenenr== -2) { + if(curarea->winy <50) { + sa= closest_bigger_area(); + areawinset(sa->win); + } + activate_databrowse((ID *)G.scene, ID_SCE, 0, B_INFOSCE, &G.curscreen->scenenr, do_info_buttons); + return; + } + if( G.curscreen->scenenr < 0) return; + + sce= G.main->scene.first; + nr= 1; + while(sce) { + if(nr==G.curscreen->scenenr) { + if(sce!=G.scene) set_scene(sce); + break; + } + nr++; + sce= sce->id.next; + } + /* laatste item: NEW SCENE */ + if(sce==0) { + nr= pupmenu("Add scene%t|Empty|Link Objects|Link ObData|Full Copy"); + if(nr<= 0) return; + if(nr==1) { + sce= add_scene(G.scene->id.name+2); + sce->r= G.scene->r; + } + else sce= copy_scene(G.scene, nr-2); + + set_scene(sce); + } + + break; + case B_INFODELSCE: + + if(G.scene->id.prev) sce= G.scene->id.prev; + else if(G.scene->id.next) sce= G.scene->id.next; + else return; + if(okee("Delete current scene")) { + + /* alle sets aflopen */ + sce1= G.main->scene.first; + while(sce1) { + if(sce1->set == G.scene) sce1->set= 0; + sce1= sce1->id.next; + } + + /* alle sequences aflopen */ + clear_scene_in_allseqs(G.scene); + + /* alle schermen */ + sc= G.main->screen.first; + while(sc) { + if(sc->scene == G.scene) sc->scene= sce; + sc= sc->id.next; + } + free_libblock(&G.main->scene, G.scene); + set_scene(sce); + } + + break; + case B_FILEMENU: + tbox_setmain(9); + toolbox(); + break; + } +} + +/* strubi shamelessly abused the status line as a progress bar... + feel free to kill him after release */ + +static int g_progress_bar = 0; +static char *g_progress_info = 0; +static float g_done; + +int start_progress_bar(void) +{ + g_progress_bar = 1; + return 1; // we never fail (yet) +} + +void end_progress_bar(void) +{ + g_progress_bar = 0; +} + +static void update_progress_bar(float done, char *info) +{ + g_done = done; + g_progress_info = info; +} + +/** Progress bar + 'done': a value between 0.0 and 1.0, showing progress + 'info': a info text what is currently being done + + Make sure that the progress bar is always called with: + done = 0.0 first + and + done = 1.0 last -- or alternatively use: + + start_progressbar(); + do_stuff_and_callback_progress_bar(); + end_progressbar(); +*/ +int progress_bar(float done, char *busy_info) +{ + ScrArea *sa; + short val; + + /* User break (ESC) */ + while (qtest()) { + if (extern_qread(&val) == ESCKEY) + return 0; + } + if (done == 0.0) { + start_progress_bar(); + } else if (done > 0.99) { + end_progress_bar(); + } + + sa= G.curscreen->areabase.first; + while(sa) { + if (sa->spacetype == SPACE_INFO) { + update_progress_bar(done, busy_info); + + curarea = sa; + + scrarea_do_headdraw(curarea); + areawinset(curarea->win); + sa->head_swap= WIN_BACK_OK; + screen_swapbuffers(); + } + sa = sa->next; + } + return 1; +} + + +static void check_packAll() +{ + // first check for dirty images + Image *ima; + + ima = G.main->image.first; + while (ima) { + if (ima->ibuf && (ima->ibuf->userflags &= IB_BITMAPDIRTY)) { + break; + } + ima= ima->id.next; + } + + if (ima == 0 || okee("Some images are painted on. These changes will be lost. Continue ?")) { + packAll(); + G.fileflags |= G_AUTOPACK; + } +} + + +/* KEYED FUNCTIONS + --------------- */ + +/* this function name is meaningless and only called that way for some + obscurity + It is called by a function table from the license_key; + see include/keyed_functions.h +*/ + +struct twostrings +{ + char *outname; + char *exename; +}; + +/** This function is called for writing runtimes. + * It's locked behind the key and called through a function table + * which is initialized properly by the Python key code (if valid) + */ +int make_beautiful_animation(void *vp) +{ + char *freestr= NULL; + struct twostrings *twostrings = (struct twostrings *) vp; + char *str = twostrings->outname; + char *ext = 0; + +#ifdef _WIN32 + ext = ".exe"; +#endif + +#ifdef __APPLE__ + ext = ".app"; +#endif + if (ext && (!BLI_testextensie(str, ext))) { + freestr= MEM_mallocN(strlen(str) + strlen(ext) + 1, "write_runtime_check"); + strcpy(freestr, str); + strcat(freestr, ext); + str= freestr; + } + + if (!BLI_exists(str) || saveover(str)) + BLO_write_runtime(str, twostrings->exename); + + if (freestr) + MEM_freeN(freestr); + + return 0; +} + +int make_nice_software(void) +{ + Fptr f = KEY_RETURN_TRUE; + if (f) return f(0); + else return 0; +} + +static void write_runtime_check_dynamic(char *str) +{ + Fptr f = KEY_WRITE_RUNTIME; + struct twostrings twostrings; + + twostrings.outname = str; + twostrings.exename = "blenderdynplayer.exe"; + + if (f) f((void *) &twostrings); +} + +static void write_runtime_check(char *str) +{ + Fptr f = KEY_WRITE_RUNTIME; + struct twostrings twostrings; + char player[128]; + + twostrings.outname = str; + twostrings.exename = player; + + strcpy(player, "blenderplayer"); + +#ifdef _WIN32 + strcat(player, ".exe"); +#endif + +#ifdef __APPLE__ + strcat(player, ".app"); +#endif + + if (f) f((void *) &twostrings); +} +/* end keyed functions */ + + +static void do_info_filemenu(void *arg, int event) +{ + ScrArea *sa; + char dir[FILE_MAXDIR]; + + if(curarea->spacetype==SPACE_INFO) { + sa= closest_bigger_area(); + areawinset(sa->win); + } + + /* these are no defines, easier this way, the codes are in the function below */ + switch(event) { + case 0: + if (okee("ERASE ALL")) { + if (!BIF_read_homefile()) + error("No file ~/.B.blend"); + } + break; + case 1: + activate_fileselect(FILE_BLENDER, "LOAD FILE", G.sce, BIF_read_file); + break; + case 2: + { + char *s= MEM_mallocN(strlen(G.sce) + 11 + 1, "okee_reload"); + strcpy(s, "Open file: "); + strcat(s, G.sce); + if (okee(s)) + BIF_read_file(G.sce); + MEM_freeN(s); + } + break; + case 3: + activate_fileselect(FILE_LOADLIB, "LOAD LIBRARY", G.lib, 0); + break; + case 4: + strcpy(dir, G.sce); + untitled(dir); + activate_fileselect(FILE_BLENDER, "SAVE FILE", dir, BIF_write_file); + break; + case 5: + strcpy(dir, G.sce); + if (untitled(dir)) { + activate_fileselect(FILE_BLENDER, "SAVE FILE", dir, BIF_write_file); + } else { + BIF_write_file(dir); + free_filesel_spec(dir); + } + break; + case 6: + mainqenter(F3KEY, 1); + break; + case 7: + write_vrml_fs(); + break; + case 8: + write_dxf_fs(); + break; + case 9: + write_videoscape_fs(); + break; + case 20: + strcpy(dir, G.sce); + activate_fileselect(FILE_SPECIAL, "INSTALL LICENSE KEY", dir, loadKeyboard); + break; + case 21: + SHOW_LICENSE_KEY(); + break; + case 22: + activate_fileselect(FILE_SPECIAL, "WRITE RUNTIME", "", write_runtime_check); + break; + case 23: + activate_fileselect(FILE_SPECIAL, "WRITE DYNAMIC RUNTIME", "", write_runtime_check_dynamic); + break; + case 30: + // import menu, no handling + break; + +#ifdef EXPERIMENTAL_MENUS + case 10: + check_packAll(); + break; + case 11: + unpackAll(PF_WRITE_LOCAL); + G.fileflags &= ~G_AUTOPACK; + break; + case 12: + if (buttons_do_unpack() != RET_CANCEL) { + /* Clear autopack bit only if user selected one of the unpack options */ + G.fileflags &= ~G_AUTOPACK; + } + break; + case 13: +#else /* EXPERIMENTAL_MENUS */ + case 10: +#endif /* EXPERIMENTAL_MENUS */ + exit_usiblender(); + break; + } + allqueue(REDRAWINFO, 0); +} + +void do_info_file_optionsmenu(void *arg, int event) +{ + G.fileflags ^= (1 << event); + + // allqueue(REDRAWINFO, 0); +} + + +static uiBlock *info_file_optionsmenu(void *arg_unused) +{ + uiBlock *block; + short yco= 0, xco = 20; + + block= uiNewBlock(&curarea->uiblocks, "runtime_options", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); + uiBlockSetButmFunc(block, do_info_file_optionsmenu, NULL); + uiBlockSetXOfs(block,-40); // offset to parent button + + /* flags are case-values */ + uiDefBut(block, BUTM, 1, "Compress File", xco, yco-=20, 100, 19, NULL, 0.0, 0.0, 0, G_FILE_COMPRESS_BIT, "Use file compression"); + uiDefBut(block, BUTM, 1, "Sign File", xco, yco-=20, 100, 19, NULL, 0.0, 0.0, 0, G_FILE_SIGN_BIT, "Add signature to file"); + uiDefBut(block, BUTM, 1, "Lock File", xco, yco-=20, 100, 19, NULL, 0.0, 0.0, 0, G_FILE_LOCK_BIT, "Protect the file from editing by others"); + + /* Toggle buttons */ + + yco= 0; + xco -= 20; + uiBlockSetEmboss(block, UI_EMBOSSW); + uiBlockSetButmFunc(block, NULL, NULL); + /* flags are defines */ + uiDefIconButI(block, ICONTOG|BIT|G_FILE_COMPRESS_BIT, 0, ICON_CHECKBOX_DEHLT, xco, yco-=20, 19, 19, &G.fileflags, 0.0, 0.0, 0, 0, ""); + uiDefIconButI(block, ICONTOG|BIT|G_FILE_SIGN_BIT, 0, ICON_CHECKBOX_DEHLT, xco, yco-=20, 19, 19, &G.fileflags, 0.0, 0.0, 0, 0, ""); + uiDefIconButI(block, ICONTOG|BIT|G_FILE_LOCK_BIT, 0, ICON_CHECKBOX_DEHLT, xco, yco-=20, 19, 19, &G.fileflags, 0.0, 0.0, 0, 0, ""); + + uiBlockSetDirection(block, UI_RIGHT); + + return block; +} + +static uiBlock *info_runtime_optionsmenu(void *arg_unused) +{ + uiBlock *block; + short yco= 0, xco = 20; + + block= uiNewBlock(&curarea->uiblocks, "add_surfacemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); + uiBlockSetXOfs(block, -40); // offset to parent button + + uiBlockSetEmboss(block, UI_EMBOSSW); + + uiDefBut(block, LABEL, 0, "Size options:", xco, yco-=20, 114, 19, 0, 0.0, 0.0, 0, 0, ""); + uiDefButS(block, NUM, 0, "X:", xco+19, yco-=20, 95, 19, &G.scene->r.xplay, 10.0, 2000.0, 0, 0, "X screen/window resolution"); + uiDefButS(block, NUM, 0, "Y:", xco+19, yco-=20, 95, 19, &G.scene->r.yplay, 10.0, 2000.0, 0, 0, "Y screen/window resolution"); + + uiDefBut(block, SEPR, 0, "", xco, yco-=4, 114, 4, NULL, 0.0, 0.0, 0, 0, ""); + + uiDefBut(block, LABEL, 0, "Fullscreen options:", xco, yco-=20, 114, 19, 0, 0.0, 0.0, 0, 0, ""); + uiDefButS(block, TOG, 0, "Fullscreen", xco + 19, yco-=20, 95, 19, &G.scene->r.fullscreen, 0.0, 0.0, 0, 0, "Starts player in a new fullscreen display"); + uiDefButS(block, NUM, 0, "Freq:", xco+19, yco-=20, 95, 19, &G.scene->r.freqplay, 10.0, 120.0, 0, 0, "Clock frequency of fullscreen display"); + uiDefButS(block, NUM, 0, "Bits:", xco+19, yco-=20, 95, 19, &G.scene->r.depth, 1.0, 32.0, 0, 0, "Bit depth of full screen disply"); + + uiDefBut(block, SEPR, 0, "", xco, yco-=4, 114, 4, NULL, 0.0, 0.0, 0, 0, ""); + + /* stereo settings */ + /* can't use any definition from the game engine here so hardcode it. Change it here when it changes there! + * RAS_IRasterizer has definitions: + * RAS_STEREO_NOSTEREO 1 + * RAS_STEREO_QUADBUFFERED 2 + * RAS_STEREO_ABOVEBELOW 3 + * RAS_STEREO_INTERLACED 4 future + */ + uiDefBut(block, LABEL, 0, "Stereo options", xco, yco-=20, 114, 19, 0, 0.0, 0.0, 0, 0, ""); + uiDefButS(block, ROW, 0, "no stereo", xco+19, yco-=20, 95, 19, &(G.scene->r.stereomode), 6.0, 1.0, 0, 0, "Disables stereo"); + uiDefButS(block, ROW, 0, "h/w pageflip", xco+19, yco-=20, 95, 19, &(G.scene->r.stereomode), 6.0, 2.0, 0, 0, "Enables h/w pageflip stereo method"); + uiDefButS(block, ROW, 0, "syncdoubling", xco+19, yco-=20, 95, 19, &(G.scene->r.stereomode), 6.0, 3.0, 0, 0, "Enables syncdoubling stereo method"); +#if 0 + // future + uiDefButS(block, ROW, 0, "syncdoubling", xco+19, yco, 95, 19, &(G.scene->r.stereomode), 5.0, 4.0, 0, 0, "Enables interlaced stereo method"); +#endif + + uiBlockSetDirection(block, UI_RIGHT); + + return block; +} + +static uiBlock *info_file_importmenu(void *arg_unused) +{ + uiBlock *block; + short yco= 0, xco = 20; + + block= uiNewBlock(&curarea->uiblocks, "importmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); + uiBlockSetXOfs(block, -40); // offset to parent button + + uiBlockSetEmboss(block, UI_EMBOSSW); + + /* flags are defines */ + uiDefBut(block, LABEL, 0, "VRML 2.0 options", xco, yco, 125, 19, NULL, 0.0, 0.0, 0, 0, ""); + uiDefButS(block, TOG|BIT|0, 0, "SepLayers", xco, yco-=20, 75, 19, &U.vrmlflag, 0.0, 0.0, 0, 0, "Separate Empties, Lamps, etc. into Layers"); + uiDefButS(block, TOG|BIT|1, 0, "Scale 1/100", xco, yco-=20, 75, 19, &U.vrmlflag, 0.0, 0.0, 0, 0, "Scale scene by 1/100 (3DS VRML)"); + uiDefButS(block, TOG|BIT|2, 0, "Two Sided", xco, yco-=20, 75, 19, &U.vrmlflag, 0.0, 0.0, 0, 0, "Import two sided faces"); + + uiBlockSetDirection(block, UI_RIGHT); + + return block; +} + +static uiBlock *info_filemenu(void *arg_unused) +{ + uiBlock *block; + short xco=0; + + block= uiNewBlock(&curarea->uiblocks, "filemenu", UI_EMBOSSP, UI_HELV, curarea->headwin); + uiBlockSetButmFunc(block, do_info_filemenu, NULL); + + uiDefBut(block, BUTM, 1, "New|Ctrl X", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "Start a new project (and delete the current)"); + uiDefBut(block, BUTM, 1, "Open|F1", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "Open a new file"); + uiDefBut(block, BUTM, 1, "Reopen Last|Ctrl O", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "Revert to the last version saved to file"); + uiDefBut(block, BUTM, 1, "Append|Shift F1", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "Append contents of a file to the current project"); + uiDefBlockBut(block, info_file_importmenu, NULL, "Import Settings|>>", 0, xco-=20, 160, 19, ""); + + uiDefBut(block, SEPR, 0, "", 0, xco-=6, 160, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiDefBut(block, BUTM, 1, "Save As|F2", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "Save to a new file"); + uiDefBut(block, BUTM, 1, "Save|Ctrl W", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "Save to the current file"); + + if (LICENSE_KEY_VALID && make_nice_software()) { + uiDefBlockBut(block, info_file_optionsmenu, NULL, "File options|>>", 0, xco-=20, 160, 19, "Click to open the File Options menu"); + + uiDefBut(block, SEPR, 0, "", 0, xco-=6, 160, 6, NULL, 0.0, 0.0, 0, 0, ""); + + uiDefBut(block, BUTM, 1, "Save Runtime", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 22, "Create a runtime executable with the current project"); +#ifdef _WIN32 + uiDefBut(block, BUTM, 1, "Save dynamic Runtime", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 23, "Create a dynamic runtime executable with the current project (requieres extenal python20.dll)"); +#endif + uiDefBlockBut(block, info_runtime_optionsmenu, NULL, "Runtime options|>>", 0, xco-=20, 160, 19, "Click to open the File Options menu"); + } + + uiDefBut(block, SEPR, 0, "", 0, xco-=6, 160, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiDefBut(block, BUTM, 1, "Save Image|F3", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 6, "Save the image in the render buffer to a file"); + uiDefBut(block, BUTM, 1, "Save VRML 1.0|Ctrl F2", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 7, "Save the current scene to a file in VRML 1.0 format"); + uiDefBut(block, BUTM, 1, "Save DXF|Shift F2", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 8, "Save the current scene to a file in DXF format"); + uiDefBut(block, BUTM, 1, "Save VideoScape|Alt W", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 9, "Save the current scene to a file in VideoScape format"); + + + if (LICENSE_KEY_VALID) { + uiDefBut(block, SEPR, 0, "", 0, xco-=6, 160, 6, NULL, 0.0, 0.0, 1, 0, ""); + uiDefBut(block, BUTM, 1, "Show License Key", 0, xco-=20, 140, 19, NULL, 0.0, 0.0, 1, 21, "Show the personal information stored in your Blender License Key"); + uiDefIconBut(block, BUTM, 1, ICON_PUBLISHER, 141,xco, 19, 19, NULL, 0.0, 0.0, 1, 21, "Show the personal information stored in your Blender License Key"); + } else if (I_AM_PUBLISHER) { + uiDefBut(block, SEPR, 0, "", 0, xco-=6, 160, 6, NULL, 0.0, 0.0, 1, 0, ""); + uiDefBut(block, BUTM, 1, "Install License Key", 0, xco-=20, 140, 19, NULL, 0.0, 0.0, 1, 20, "Install your Blender License Key"); + uiDefIconBut(block, BUTM, 1, ICON_PUBLISHER, 141,xco, 19, 19, NULL, 0.0, 0.0, 1, 20, "Install your Blender License Key"); + } + + + uiDefBut(block, SEPR, 0, "", 0, xco-=6, 160, 6, NULL, 0.0, 0.0, 1, 0, ""); + +#ifdef EXPERIMENTAL_MENUS + uiDefBut(block, BUTM, 1, "Pack Data", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 10, ""); + uiDefBut(block, BUTM, 1, "Unpack Data to current dir", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 11, ""); + uiDefBut(block, BUTM, 1, "Advanced Unpack", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 12, ""); + uiDefBut(block, SEPR, 0, "", 0, xco-=6, 160, 6, NULL, 0.0, 0.0, 1, 0, ""); + uiDefBut(block, BUTM, 1, "Quit | Q", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 13, "Quit Blender immediately"); +#else /* EXPERIMENTAL_MENUS */ + uiDefBut(block, BUTM, 1, "Quit | Q", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 10, "Quit Blender immediately"); +#endif /* EXPERIMENTAL_MENUS */ + uiBlockSetDirection(block, UI_DOWN); + + + return block; +} + +static void do_info_editmenu(void *arg, int event) +{ + int oldqual; + + switch(event) { + + case 0: + /* (De)Select All */ + if(select_area(SPACE_VIEW3D)) mainqenter(AKEY, 1); + break; + /* Border Select */ + case 1: + if(select_area(SPACE_VIEW3D)) mainqenter(BKEY, 1); + break; + case 2: + /* Circle Select */ + /*if(select_area(SPACE_VIEW3D)) { + winqread3d(BKEY, 1, 0); + winqread3d(BKEY, 1, 0); + }*/ + break; + case 3: + /* Duplicate */ + if(select_area(SPACE_VIEW3D)) { + oldqual = G.qual; + G.qual = LR_SHIFTKEY; + winqread3d(DKEY, 1, 0); + G.qual = oldqual; + } + break; + case 4: + /* Delete */ + if(select_area(SPACE_VIEW3D)) { + winqread3d(XKEY, 1, 0); + } + break; + case 5: + /* Edit Mode */ + if(select_area(SPACE_VIEW3D)) { + blenderqread(TABKEY, 1); + } + break; + case 6: + /* Grabber */ + if(select_area(SPACE_VIEW3D)) { + transform('g'); + } + break; + case 7: + /* Rotate */ + if(select_area(SPACE_VIEW3D)) { + transform('r'); + } + break; + case 8: + /* Scale */ + if(select_area(SPACE_VIEW3D)) { + transform('s'); + } + break; + case 9: + /* Shear */ + if (!G.obedit) { + enter_editmode(); + /* ### put these into a deselectall_gen() */ + if(G.obedit->type==OB_MESH) deselectall_mesh(); + else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) deselectall_nurb(); + else if(G.obedit->type==OB_MBALL) deselectall_mball(); + else if(G.obedit->type==OB_LATTICE) deselectall_Latt(); + /* ### */ + } + if(select_area(SPACE_VIEW3D)) { + transform('S'); + } + break; + case 10: + /* Warp/Bend */ + if (!G.obedit) { + enter_editmode(); + /* ### put these into a deselectall_gen() */ + if(G.obedit->type==OB_MESH) deselectall_mesh(); + else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) deselectall_nurb(); + else if(G.obedit->type==OB_MBALL) deselectall_mball(); + else if(G.obedit->type==OB_LATTICE) deselectall_Latt(); + /* ### */ + } + if(select_area(SPACE_VIEW3D)) { + oldqual = G.qual; + G.qual = LR_SHIFTKEY; + winqread3d(WKEY, 1, 0); + G.qual = oldqual; + } + break; + case 11: + /* Snap */ + if(select_area(SPACE_VIEW3D)) { + oldqual = G.qual; + G.qual = LR_SHIFTKEY; + winqread3d(SKEY, 1, 0); + G.qual = oldqual; + } + break; + } + allqueue(REDRAWINFO, 0); +} + + +static uiBlock *info_editmenu(void *arg_unused) +{ +/* static short tog=0; */ + uiBlock *block; + short xco= 0; + + block= uiNewBlock(&curarea->uiblocks, "editmenu", UI_EMBOSSP, UI_HELV, curarea->headwin); + uiBlockSetButmFunc(block, do_info_editmenu, NULL); + + uiDefBut(block, BUTM, 1, "(De)Select All|A", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 0, "Select all objects in the scene or empty the selection"); + uiDefBut(block, BUTM, 1, "Border Select|B", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 1, "Select objects in a rectangular area (press B again to activate circle select in edit mode)"); + + /* uiDefBut(block, BUTM, 1, "Circle Select", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 2, "Select objects in a circular area"); */ + uiDefBut(block, SEPR, 0, "", 0, xco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiDefBut(block, BUTM, 1, "Duplicate|Shift D", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 3, "Duplicate the selected object(s)"); + uiDefBut(block, BUTM, 1, "Delete|X", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 4, "Delete the selected object(s)"); + uiDefBut(block, BUTM, 1, "Edit Mode|Tab", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 5, "Toggle between object and edit mode"); + uiDefBut(block, SEPR, 0, "", 0, xco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiDefBut(block, BUTM, 1, "Grabber|G", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 6, "Move the selected object(s)"); + uiDefBut(block, BUTM, 1, "Rotate|R", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 7, "Rotate the selected object(s)"); + uiDefBut(block, BUTM, 1, "Scale|S", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 8, "Scale the selected object(s)"); + uiDefBut(block, SEPR, 0, "", 0, xco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiDefBut(block, BUTM, 1, "Shear|Ctrl S", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 9, "Shear the selected object(s)"); + uiDefBut(block, BUTM, 1, "Warp/Bend|Shift W", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 10, "Warp or bend the selected objects"); + uiDefBut(block, BUTM, 1, "Snap Menu|Shift S", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 11, "Activate the snap menu"); + + uiBlockSetDirection(block, UI_DOWN); + + return block; +} + +static void do_info_add_meshmenu(void *arg, int event) +{ + + switch(event) { +#ifdef EXPERIMENTAL_MENUS + /* Maarten's proposal for a new Add Mesh menu */ + case 0: + /* Line */ + //add_primitiveMesh(4); + break; + case 1: + /* Circle */ + if(select_area(SPACE_VIEW3D)) { + add_primitiveMesh(4); + } + break; + case 2: + /* Plane */ + add_primitiveMesh(0); + break; + case 3: + /* Cube */ + add_primitiveMesh(1); + break; + case 4: + /* UVsphere */ + add_primitiveMesh(11); + break; + case 5: + /* IcoSphere */ + add_primitiveMesh(12); + break; + case 6: + /* Cylinder */ + add_primitiveMesh(5); + break; + case 7: + /* Tube */ + add_primitiveMesh(6); + break; + case 8: + /* Cone */ + add_primitiveMesh(7); + break; + case 9: + /* Grid */ + add_primitiveMesh(10); + break; +#else /* EXPERIMENTAL_MENUS*/ + case 0: + /* Plane */ + add_primitiveMesh(0); + break; + case 1: + /* Cube */ + add_primitiveMesh(1); + break; + case 2: + /* Circle */ + add_primitiveMesh(4); + break; + case 3: + /* UVsphere */ + add_primitiveMesh(11); + break; + case 4: + /* IcoSphere */ + add_primitiveMesh(12); + break; + case 5: + /* Cylinder */ + add_primitiveMesh(5); + break; + case 6: + /* Tube */ + add_primitiveMesh(6); + break; + case 7: + /* Cone */ + add_primitiveMesh(7); + break; + case 8: + /* Grid */ + add_primitiveMesh(10); + break; +#endif /* EXPERIMENTAL_MENUS */ + default: + break; + } + allqueue(REDRAWINFO, 0); +} + +static uiBlock *info_add_meshmenu(void *arg_unused) +{ +/* static short tog=0; */ + uiBlock *block; + short xco= 0; + + block= uiNewBlock(&curarea->uiblocks, "add_meshmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); + uiBlockSetButmFunc(block, do_info_add_meshmenu, NULL); + +#ifdef EXPERIMENTAL_MENUS + /* Maarten's proposal for a new Add Mesh menu */ + uiDefBut(block, BUTM, 1, "Line|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "Add a Mesh Line"); + uiDefBut(block, BUTM, 1, "Circle|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "Add a Mesh Circle"); + uiDefBut(block, SEPR, 0, "", 0, xco-=6, 160, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiDefBut(block, BUTM, 1, "Plane|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "Add a Mesh Plane"); + uiDefBut(block, BUTM, 1, "Cube|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "Add a Mesh Cube"); + uiDefBut(block, BUTM, 1, "UVsphere", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "Add a Mesh Sphere"); + uiDefBut(block, BUTM, 1, "IcoSphere|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "Add a Mesh Isocohedron Sphere"); + uiDefBut(block, BUTM, 1, "Cylinder With Caps|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 6, "Add a Mesh Cylinder with caps"); + uiDefBut(block, BUTM, 1, "Cylinder Without Caps|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 7, "Add a Mesh Cylinder without caps"); + uiDefBut(block, BUTM, 1, "Cone|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 8, "Add a Mesh Cone"); + uiDefBut(block, BUTM, 1, "Grid|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 9, "Add a Mesh Grid"); +#else /* EXPERIMENTAL_MENUS */ + uiDefBut(block, BUTM, 1, "Plane|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "Add a Mesh Plane"); + uiDefBut(block, BUTM, 1, "Cube|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "Add a Mesh Cube"); + uiDefBut(block, BUTM, 1, "Circle|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "Add a Mesh Circle"); + uiDefBut(block, BUTM, 1, "UVsphere", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "Add a Mesh Sphere"); + uiDefBut(block, BUTM, 1, "IcoSphere|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "Add a Mesh Isocohedron Sphere"); + uiDefBut(block, BUTM, 1, "Cylinder|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "Add a Mesh Cylinder"); + uiDefBut(block, BUTM, 1, "Tube|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 6, "Add a Mesh Tube"); + uiDefBut(block, BUTM, 1, "Cone|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 7, "Add a Mesh Cone"); + uiDefBut(block, SEPR, 0, "", 0, xco-=6, 160, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiDefBut(block, BUTM, 1, "Grid|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 8, "Add a Mesh Grid"); +#endif /* EXPERIMENTAL_MENUS */ + + uiBlockSetDirection(block, UI_RIGHT); + + return block; +} + +static void do_info_add_curvemenu(void *arg, int event) +{ + + switch(event) { + case 0: + /* Bezier Curve */ + add_primitiveCurve(10); + break; + case 1: + /* Bezier Circle */ + add_primitiveCurve(11); + break; + case 2: + /* NURB Curve */ + add_primitiveCurve(40); + break; + case 3: + /* NURB Circle */ + add_primitiveCurve(41); + break; + case 4: + /* Path */ + add_primitiveCurve(46); + break; + default: + break; + } + allqueue(REDRAWINFO, 0); +} + +static uiBlock *info_add_curvemenu(void *arg_unused) +{ +/* static short tog=0; */ + uiBlock *block; + short xco= 0; + + block= uiNewBlock(&curarea->uiblocks, "add_curvemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); + uiBlockSetButmFunc(block, do_info_add_curvemenu, NULL); + + uiDefBut(block, BUTM, 1, "Bezier Curve|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "Add a Bezier curve"); + uiDefBut(block, BUTM, 1, "Bezier Circle|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "Add a Bezier circle"); + uiDefBut(block, BUTM, 1, "NURBS Curve|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "Add a NURB curve"); + uiDefBut(block, BUTM, 1, "NURBS Circle", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "Add a NURB circle"); + uiDefBut(block, BUTM, 1, "Path|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "Add a path"); + + uiBlockSetDirection(block, UI_RIGHT); + + return block; +} + + +static void do_info_add_surfacemenu(void *arg, int event) +{ + + switch(event) { + case 0: + /* Curve */ + add_primitiveNurb(0); + break; + case 1: + /* Circle */ + add_primitiveNurb(1); + break; + case 2: + /* Surface */ + add_primitiveNurb(2); + break; + case 3: + /* Tube */ + add_primitiveNurb(3); + break; + case 4: + /* Sphere */ + add_primitiveNurb(4); + break; + case 5: + /* Donut */ + add_primitiveNurb(5); + break; + default: + break; + } + allqueue(REDRAWINFO, 0); +} + +static uiBlock *info_add_surfacemenu(void *arg_unused) +{ +/* static short tog=0; */ + uiBlock *block; + short xco= 0; + + block= uiNewBlock(&curarea->uiblocks, "add_surfacemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin); + uiBlockSetButmFunc(block, do_info_add_surfacemenu, NULL); + + uiDefBut(block, BUTM, 1, "NURBS Curve|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "Add a curve"); + uiDefBut(block, BUTM, 1, "NURBS Circle|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, "Add a circle"); + uiDefBut(block, BUTM, 1, "NURBS Surface|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, "Add a surface"); + uiDefBut(block, BUTM, 1, "NURBS Tube", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 3, "Add a tube"); + uiDefBut(block, BUTM, 1, "NURBS Sphere|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 4, "Add a sphere"); + uiDefBut(block, BUTM, 1, "NURBS Donut|", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 5, "Add a donut"); + + uiBlockSetDirection(block, UI_RIGHT); + + return block; +} + +static void do_info_addmenu(void *arg, int event) +{ + + switch(event) { + case 0: + /* Mesh */ + break; + case 1: + /* Curve */ + break; + case 2: + /* Surface */ + break; + case 3: + /* Text (argument is discarded) */ + add_primitiveFont(event); + break; + case 4: + /* Metaball (argument is discarded) */ + add_primitiveMball(event); + break; + case 5: + /* Empty */ + add_object_draw(OB_EMPTY); + break; + case 6: + /* Camera */ + add_object_draw(OB_CAMERA); + break; + case 7: + /* Lamp */ + add_object_draw(OB_LAMP); + break; + case 8: + /* Armature */ + add_primitiveArmature(OB_ARMATURE); + break; + case 9: + /* Lattice */ + add_object_draw(OB_LATTICE); + break; + default: + break; + } + allqueue(REDRAWINFO, 0); +} + + +static uiBlock *info_addmenu(void *arg_unused) +{ +/* static short tog=0; */ + uiBlock *block; + short xco= 0; + + block= uiNewBlock(&curarea->uiblocks, "addmenu", UI_EMBOSSP, UI_HELV, curarea->headwin); + uiBlockSetButmFunc(block, do_info_addmenu, NULL); + + uiDefBlockBut(block, info_add_meshmenu, NULL, "Mesh|>>", 0, xco-=20, 120, 19, "Click to open the Add Mesh menu"); + uiDefBlockBut(block, info_add_curvemenu, NULL, "Curve|>>", 0, xco-=20, 120, 19, "Click to open the Add Curve menu"); + uiDefBlockBut(block, info_add_surfacemenu, NULL, "Surface|>>", 0, xco-=20, 120, 19, "Click to open the Add Surface menu"); + + uiDefBut(block, SEPR, 0, "", 0, xco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiDefBut(block, BUTM, 1, "Text|", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 3, ""); + uiDefBut(block, BUTM, 1, "Metaball|", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 4, ""); + uiDefBut(block, BUTM, 1, "Empty|", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 5, ""); + uiDefBut(block, SEPR, 0, "", 0, xco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiDefBut(block, BUTM, 1, "Camera|", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 6, ""); + uiDefBut(block, BUTM, 1, "Lamp|", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 7, ""); +// uiDefBut(block, BUTM, 1, "Armature|", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 8, ""); + uiDefBut(block, SEPR, 0, "", 0, xco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiDefBut(block, BUTM, 1, "Lattice|", 0, xco-=20, 120, 19, NULL, 0.0, 0.0, 1, 9, ""); + + uiBlockSetDirection(block, UI_DOWN); + + return block; +} + +static void do_info_viewmenu(void *arg, int event) +{ + switch(event) { + case 0: + if(select_area(SPACE_VIEW3D)) mainqenter(PAD1, 1); + break; + case 1: + if(select_area(SPACE_VIEW3D)) mainqenter(PAD3, 1); + break; + case 2: + if(select_area(SPACE_VIEW3D)) mainqenter(PAD7, 1); + break; + case 3: + if(select_area(SPACE_VIEW3D)) mainqenter(PAD0, 1); + break; + case 4: + if(select_area(SPACE_VIEW3D)) mainqenter(PADPLUSKEY, 1); + break; + case 5: + if(select_area(SPACE_VIEW3D)) mainqenter(PADMINUS, 1); + break; + case 6: + if(select_area(SPACE_VIEW3D)) mainqenter(CKEY, 1); + break; + case 7: + if(select_area(SPACE_VIEW3D)) mainqenter(HOMEKEY, 1); + break; + } + allqueue(REDRAWINFO, 0); +} + +static uiBlock *info_viewmenu(void *arg_unused) +{ +/* static short tog=0; */ + uiBlock *block; + short xco= 0; + + block= uiNewBlock(&curarea->uiblocks, "filemenu", UI_EMBOSSP, UI_HELV, curarea->headwin); + uiBlockSetButmFunc(block, do_info_viewmenu, NULL); + + // uiBlockSetCol(block, BUTBLUE); + + uiDefBut(block, BUTM, 1, "Front|NumPad 1", 0, xco-=20, 140, 19, NULL, 0.0, 0.0, 0, 0, ""); + uiDefBut(block, BUTM, 1, "Right|NumPad 3", 0, xco-=20, 140, 19, NULL, 0.0, 0.0, 0, 1, ""); + uiDefBut(block, BUTM, 1, "Top|NumPad 7", 0, xco-=20, 140, 19, NULL, 0.0, 0.0, 0, 2, ""); + uiDefBut(block, BUTM, 1, "Camera|NumPad 0", 0, xco-=20, 140, 19, NULL, 0.0, 0.0, 0, 3, ""); + + uiDefBut(block, SEPR, 0, "", 0, xco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiDefBut(block, BUTM, 1, "Zoom In|NumPad +", 0, xco-=20, 140, 19, NULL, 0.0, 0.0, 0, 4, ""); + uiDefBut(block, BUTM, 1, "Zoom Out|NumPad -", 0, xco-=20, 140, 19, NULL, 0.0, 0.0, 0, 5, ""); + + uiDefBut(block, SEPR, 0, "", 0, xco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiDefBut(block, BUTM, 1, "Center|C", 0, xco-=20, 140, 19, NULL, 0.0, 0.0, 0, 6, ""); + uiDefBut(block, BUTM, 1, "View All|Home", 0, xco-=20, 140, 19, NULL, 0.0, 0.0, 0, 7, ""); + + uiBlockSetDirection(block, UI_DOWN); + + return block; +} + +static void do_game_menu(void *arg, int event) +{ + switch (event) { + case G_FILE_ENABLE_ALL_FRAMES_BIT: + case G_FILE_SHOW_FRAMERATE_BIT: + case G_FILE_SHOW_DEBUG_PROPS_BIT: + case G_FILE_AUTOPLAY_BIT: + G.fileflags ^= (1 << event); + break; + default: + ; /* ignore the rest */ + } +} + + +static uiBlock *info_gamemenu(void *arg_unused) +{ + uiBlock *block; + short yco= 0; + + block= uiNewBlock(&curarea->uiblocks, "gamemenu", UI_EMBOSSP, UI_HELV, curarea->headwin); + uiBlockSetCol(block, BUTBLUE); + uiBlockSetDirection(block, UI_DOWN); + + uiDefBut(block, BUTM, B_STARTGAME, "Start Game|P", + 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 0, 0, + "Start the game (press the Escape key to stop)"); + uiDefBut(block, SEPR, 0, "", + -20, yco-=6, 180, 6, NULL, 0.0, 0.0, 1, 0, ""); + + /* flags are case-values */ + uiBlockSetButmFunc(block, do_game_menu, NULL); + uiDefBut(block, BUTM, 1, "Enable All Frames", + 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, G_FILE_ENABLE_ALL_FRAMES_BIT, + "Toggle between draw all frames on (no frames dropped) and off (full speed)"); + uiDefBut(block, BUTM, 1, "Show framerate and profile", + 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, G_FILE_SHOW_FRAMERATE_BIT, + "Toggle between showing and not showing the framerate and profile"); + uiDefBut(block, BUTM, 1, "Show debug properties", + 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, G_FILE_SHOW_DEBUG_PROPS_BIT, + "Toggle between showing and not showing debug properties"); + uiDefBut(block, SEPR, 0, "", -20, yco-=6, 180, 6, NULL, 0.0, 0.0, 1, 0, ""); + uiDefBut(block, BUTM, 1, "Autostart", + 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, G_FILE_AUTOPLAY_BIT, + "Toggle between automatic game start on and off"); + + /* Toggle buttons */ + yco= -26; + uiBlockSetEmboss(block, UI_EMBOSSW); + /* flags are defines */ + + uiBlockSetButmFunc(block, NULL, NULL); // to prevent it from calling the menu function + uiDefIconButI(block, ICONTOG|BIT|G_FILE_ENABLE_ALL_FRAMES_BIT, + 0, ICON_CHECKBOX_DEHLT, -20, yco-=20, 19, 19, + &G.fileflags, 0.0, 0.0, 0, 0, ""); + uiDefIconButI(block, ICONTOG|BIT|G_FILE_SHOW_FRAMERATE_BIT, + 0, ICON_CHECKBOX_DEHLT, -20, yco-=20, 19, 19, + &G.fileflags, 0.0, 0.0, 0, 0, ""); + uiDefIconButI(block, ICONTOG|BIT|G_FILE_SHOW_DEBUG_PROPS_BIT, + 0, ICON_CHECKBOX_DEHLT, -20, yco-=20, 19, 19, + &G.fileflags, 0.0, 0.0, 0, 0, ""); + yco-=6; + uiDefIconButI(block, ICONTOG|BIT|G_FILE_AUTOPLAY_BIT, + 0, ICON_CHECKBOX_DEHLT, -20, yco-=20, 19, 19, + &G.fileflags, 0.0, 0.0, 0, 0, ""); + + return block; +} + +#ifndef EXPERIMENTAL_MENUS +/* In the Maarten's new menu structure proposal, the tools menu moved to the file menu */ +static void do_info_toolsmenu(void *arg, int event) +{ + + switch(event) { + case 0: + check_packAll(); + break; + case 1: + unpackAll(PF_WRITE_LOCAL); + G.fileflags &= ~G_AUTOPACK; + break; + case 2: + if (buttons_do_unpack() != RET_CANCEL) { + // clear autopack bit only if + // user selected one of the unpack options + G.fileflags &= ~G_AUTOPACK; + } + break; + } + allqueue(REDRAWINFO, 0); +} + +static uiBlock *info_toolsmenu(void *arg_unused) +{ +/* static short tog=0; */ + uiBlock *block; + short xco= 0; + + block= uiNewBlock(&curarea->uiblocks, "toolsmenu", UI_EMBOSSP, UI_HELV, curarea->headwin); + uiBlockSetButmFunc(block, do_info_toolsmenu, NULL); + // uiBlockSetCol(block, BUTBLUE); + + uiDefBut(block, BUTM, 1, "Pack Data", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, ""); + uiDefBut(block, BUTM, 1, "Unpack Data to current dir", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 1, ""); + uiDefBut(block, BUTM, 1, "Advanced Unpack", 0, xco-=20, 160, 19, NULL, 0.0, 0.0, 1, 2, ""); + uiBlockSetDirection(block, UI_DOWN); + + return block; +} +#endif /* EXPERIMENTAL_MENUS */ + + +static void info_text(int x, int y) +{ + Object *ob; + extern float hashvectf[]; + extern int mem_in_use; + unsigned int swatch_color; + float fac1, fac2, fac3; + char infostr[300]; + char *headerstr; + int hsize; + + + if(G.obedit) { + sprintf(infostr,"Ve:%d-%d Fa:%d-%d Mem:%.2fM ", + G.totvertsel, G.totvert, G.totfacesel, G.totface, + (mem_in_use>>10)/1024.0); + } + else { + sprintf(infostr,"Ve:%d Fa:%d Ob:%d-%d La:%d Mem:%.2fM ", + G.totvert, G.totface, G.totobj, G.totobjsel, G.totlamp, (mem_in_use>>10)/1024.0); + } + ob= OBACT; + if(ob) { + strcat(infostr, ob->id.name+2); + } + + if (g_progress_bar) { + hsize = 4 + (120.0 * g_done); + fac1 = 0.5 * g_done; // do some rainbow colours on progress + fac2 = 1.0; + fac3 = 0.9; + } else { + hsize = 124; + /* promise! Never change these lines again! */ + fac1= fabs(hashvectf[ 2*G.version+4]); + fac2= 0.5+0.1*hashvectf[ G.version+3]; + fac3= 0.7; + } + + if (g_progress_bar && g_progress_info) { + headerstr= g_progress_info; + } else { + headerstr= versionstr; + } + + swatch_color= hsv_to_cpack(fac1, fac2, fac3); + + cpack( swatch_color ); + glRecti(x-24, y-4, x-24+hsize, y+13); + + glColor3ub(0, 0, 0); + + glRasterPos2i(x, y); + BMF_DrawString(G.fonts, headerstr); + + glRasterPos2i(x+120, y); + BMF_DrawString(G.fonts, infostr); +} + +void info_buttons(void) +{ + uiBlock *block; + short xco= 32; + char naam[20]; + + sprintf(naam, "header %d", curarea->headwin); + block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSM, UI_HELV, curarea->headwin); + uiBlockSetCol(block, BUTGREY); + + uiDefBlockBut(block, info_filemenu, NULL, "File", xco, 3, 40, 15, ""); + xco+= 40; + uiDefBlockBut(block, info_editmenu, NULL, "Edit", xco, 3, 40, 15, ""); + xco+= 40; + + uiDefBlockBut(block, info_addmenu, NULL, "Add", xco, 3, 40, 15, ""); + xco+= 40; + + uiDefBlockBut(block, info_viewmenu, NULL, "View", xco, 3, 40, 15, ""); + xco+= 40; + uiDefBlockBut(block, info_gamemenu, NULL, "Game", xco, 3, 40, 15, ""); + xco+= 40; + +#ifndef EXPERIMENTAL_MENUS + /* In the Maarten's new menu structure proposal, the tools menu moved to the file menu */ + uiDefBlockBut(block, info_toolsmenu, NULL, "Tools", xco, 3, 40, 15, ""); + xco+= 40; +#endif /* EXPERIMENTAL_MENUS */ + + /* pack icon indicates a packed file */ + + if (G.fileflags & G_AUTOPACK) { + uiBlockSetEmboss(block, UI_EMBOSSN); + uiDefIconBut(block, LABEL, 0, ICON_PACKAGE, xco, 0, XIC, YIC, &G.fileflags, 0.0, 0.0, 0, 0, "This is a Packed file. See File menu."); + xco += 24; + uiBlockSetEmboss(block, UI_EMBOSSX); + } + + uiBlockSetEmboss(block, UI_EMBOSSX); + + if (curarea->full == 0) { + curarea->butspacetype= SPACE_INFO; + uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type "); + + /* STD SCREEN BUTTONS */ + xco+= XIC; + xco= std_libbuttons(block, xco, 0, NULL, B_INFOSCR, (ID *)G.curscreen, 0, &G.curscreen->screennr, 1, 1, B_INFODELSCR, 0); + + /* STD SCENE BUTTONS */ + xco+= 5; + xco= std_libbuttons(block, xco, 0, NULL, B_INFOSCE, (ID *)G.scene, 0, &G.curscreen->scenenr, 1, 1, B_INFODELSCE, 0); + } + else xco= 430; + + info_text(xco+24, 6); + + uiBlockSetEmboss(block, UI_EMBOSSN); + uiDefIconBut(block, BUT, B_SHOWSPLASH, ICON_BLENDER, xco+1, 0,XIC,YIC, 0, 0, 0, 0, 0, ""); + uiBlockSetEmboss(block, UI_EMBOSSX); + + if (LICENSE_KEY_VALID) { + uiBlockSetEmboss(block, UI_EMBOSSN); + uiDefIconBut(block, LABEL, 0, ICON_PUBLISHER, xco+125, 0,XIC,YIC, 0, 0, 0, 0, 0, ""); + uiBlockSetEmboss(block, UI_EMBOSSX); + } + + /* altijd als laatste doen */ + curarea->headbutlen= xco+2*XIC; + + if(curarea->headbutlen + 4*XIC < curarea->winx) { + uiDefIconBut(block, BUT, B_FILEMENU, ICON_HELP, (short)(curarea->winx-XIC-2), 0,XIC,YIC, 0, 0, 0, 0, 0, "Toolbox menu, hotkey: SPACE"); + } + + uiDrawBlock(block); +} + +/* ********************** END INFO ****************************** */ +/* ********************** SEQUENCE ****************************** */ + +void do_seq_buttons(short event) +{ + Editing *ed; + + ed= G.scene->ed; + if(ed==0) return; + + switch(event) { + case B_SEQHOME: + G.v2d->cur= G.v2d->tot; + test_view2d(G.v2d, curarea->winx, curarea->winy); + scrarea_queue_winredraw(curarea); + break; + case B_SEQCLEAR: + free_imbuf_seq(); + allqueue(REDRAWSEQ, 1); + break; + } + +} + +void seq_buttons() +{ + SpaceSeq *sseq; + short xco; + char naam[20]; + uiBlock *block; + + sseq= curarea->spacedata.first; + + sprintf(naam, "header %d", curarea->headwin); + block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin); + uiBlockSetCol(block, BUTPURPLE); + + curarea->butspacetype= SPACE_SEQ; + uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type "); + + /* FULL WINDOW */ + xco= 25; + if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)"); + else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)"); + + /* HOME */ + uiDefIconBut(block, BUT, B_SEQHOME, ICON_HOME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Home (HOMEKEY)"); + xco+= XIC; + + /* IMAGE */ + uiDefIconButS(block, TOG, B_REDR, ICON_IMAGE_COL, xco+=XIC,0,XIC,YIC, &sseq->mainb, 0, 0, 0, 0, "Toggles image display"); + + /* ZOOM en BORDER */ + xco+= XIC; + uiDefIconButI(block, TOG, B_VIEW2DZOOM, ICON_VIEWZOOM, xco+=XIC,0,XIC,YIC, &viewmovetemp, 0, 0, 0, 0, "Zoom view (CTRL+MiddleMouse)"); + uiDefIconBut(block, BUT, B_IPOBORDER, ICON_BORDERMOVE, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Translate view (MiddleMouse)"); + + /* CLEAR MEM */ + xco+= XIC; + uiDefBut(block, BUT, B_SEQCLEAR, "Clear", xco+=XIC,0,2*XIC,YIC, 0, 0, 0, 0, 0, "Forces a clear of all buffered images in memory"); + + uiDrawBlock(block); +} + +/* ********************** END SEQ ****************************** */ +/* ********************** VIEW3D ****************************** */ + +void do_view3d_buttons(short event) +{ + int bit; + + /* pas op: als curarea->win niet bestaat, afvangen als direkt tekenroutines worden aangeroepen */ + + switch(event) { + case B_HOME: + view3d_home(0); + break; + case B_SCENELOCK: + if(G.vd->scenelock) { + G.vd->lay= G.scene->lay; + /* layact zoeken */ + bit= 0; + while(bit<32) { + if(G.vd->lay & (1<<bit)) { + G.vd->layact= 1<<bit; + break; + } + bit++; + } + G.vd->camera= G.scene->camera; + scrarea_queue_winredraw(curarea); + scrarea_queue_headredraw(curarea); + } + break; + case B_LOCALVIEW: + if(G.vd->localview) initlocalview(); + else endlocalview(curarea); + scrarea_queue_headredraw(curarea); + break; + case B_EDITMODE: + if (G.f & G_VERTEXPAINT) { + /* Switch off vertex paint */ + G.f &= ~G_VERTEXPAINT; + } + if (G.f & G_WEIGHTPAINT){ + /* Switch off weight paint */ + G.f &= ~G_WEIGHTPAINT; + } +#ifdef NAN_TPT + if (G.f & G_TEXTUREPAINT) { + /* Switch off texture paint */ + G.f &= ~G_TEXTUREPAINT; + } +#endif /* NAN_VPT */ + if(G.obedit==0) enter_editmode(); + else exit_editmode(1); + scrarea_queue_headredraw(curarea); + break; + case B_POSEMODE: + /* if (G.obedit){ + error("Unable to perform function in EditMode"); + G.vd->flag &= ~V3D_POSEMODE; + scrarea_queue_headredraw(curarea); + } + else{ + */ + if (G.obpose==NULL) enter_posemode(); + else exit_posemode(1); + + allqueue(REDRAWHEADERS, 0); + + break; + case B_WPAINT: + if (G.f & G_VERTEXPAINT) { + /* Switch off vertex paint */ + G.f &= ~G_VERTEXPAINT; + } +#ifdef NAN_TPT + if ((!(G.f & G_WEIGHTPAINT)) && (G.f & G_TEXTUREPAINT)) { + /* Switch off texture paint */ + G.f &= ~G_TEXTUREPAINT; + } +#endif /* NAN_VPT */ + if(G.obedit) { + error("Unable to perform function in EditMode"); + G.vd->flag &= ~V3D_WEIGHTPAINT; + scrarea_queue_headredraw(curarea); + } + else if(G.obpose) { + error("Unable to perform function in PoseMode"); + G.vd->flag &= ~V3D_WEIGHTPAINT; + scrarea_queue_headredraw(curarea); + } + else set_wpaint(); + break; + case B_VPAINT: + if ((!(G.f & G_VERTEXPAINT)) && (G.f & G_WEIGHTPAINT)) { + G.f &= ~G_WEIGHTPAINT; + } +#ifdef NAN_TPT + if ((!(G.f & G_VERTEXPAINT)) && (G.f & G_TEXTUREPAINT)) { + /* Switch off texture paint */ + G.f &= ~G_TEXTUREPAINT; + } +#endif /* NAN_VPT */ + if(G.obedit) { + error("Unable to perform function in EditMode"); + G.vd->flag &= ~V3D_VERTEXPAINT; + scrarea_queue_headredraw(curarea); + } + else if(G.obpose) { + error("Unable to perform function in PoseMode"); + G.vd->flag &= ~V3D_VERTEXPAINT; + scrarea_queue_headredraw(curarea); + } + else set_vpaint(); + break; + +#ifdef NAN_TPT + case B_TEXTUREPAINT: + if (G.f & G_TEXTUREPAINT) { + G.f &= ~G_TEXTUREPAINT; + } + else { + if (G.obedit) { + error("Unable to perform function in EditMode"); + G.vd->flag &= ~V3D_TEXTUREPAINT; + } + else { + if (G.f & G_WEIGHTPAINT){ + /* Switch off weight paint */ + G.f &= ~G_WEIGHTPAINT; + } + if (G.f & G_VERTEXPAINT) { + /* Switch off vertex paint */ + G.f &= ~G_VERTEXPAINT; + } + if (G.f & G_FACESELECT) { + /* Switch off face select */ + G.f &= ~G_FACESELECT; + } + G.f |= G_TEXTUREPAINT; + scrarea_queue_headredraw(curarea); + } + } + break; +#endif /* NAN_TPT */ + + case B_FACESEL: + if(G.obedit) { + error("Unable to perform function in EditMode"); + G.vd->flag &= ~V3D_FACESELECT; + scrarea_queue_headredraw(curarea); + } + else if(G.obpose) { + error("Unable to perform function in PoseMode"); + G.vd->flag &= ~V3D_FACESELECT; + scrarea_queue_headredraw(curarea); + } + else set_faceselect(); + break; + + case B_VIEWBUT: + + if(G.vd->viewbut==1) persptoetsen(PAD7); + else if(G.vd->viewbut==2) persptoetsen(PAD1); + else if(G.vd->viewbut==3) persptoetsen(PAD3); + break; + + case B_PERSP: + + if(G.vd->persp==2) persptoetsen(PAD0); + else { + G.vd->persp= 1-G.vd->persp; + persptoetsen(PAD5); + } + + break; + case B_PROPTOOL: + allqueue(REDRAWHEADERS, 0); + break; + case B_VIEWRENDER: + if (curarea->spacetype==SPACE_VIEW3D) { + BIF_do_ogl_render(curarea->spacedata.first, G.qual!=0 ); + } + break; + case B_STARTGAME: + if (select_area(SPACE_VIEW3D)) { + start_game(); + } + break; + case B_VIEWZOOM: + viewmovetemp= 0; + viewmove(2); + scrarea_queue_headredraw(curarea); + break; + case B_VIEWTRANS: + viewmovetemp= 0; + viewmove(1); + scrarea_queue_headredraw(curarea); + break; + + default: + + if(event>=B_LAY && event<B_LAY+31) { + if(G.vd->lay!=0 && (G.qual & LR_SHIFTKEY)) { + + /* wel actieve layer zoeken */ + + bit= event-B_LAY; + if( G.vd->lay & (1<<bit)) G.vd->layact= 1<<bit; + else { + if( (G.vd->lay & G.vd->layact) == 0) { + bit= 0; + while(bit<32) { + if(G.vd->lay & (1<<bit)) { + G.vd->layact= 1<<bit; + break; + } + bit++; + } + } + } + } + else { + bit= event-B_LAY; + G.vd->lay= 1<<bit; + G.vd->layact= G.vd->lay; + scrarea_queue_headredraw(curarea); + } + scrarea_queue_winredraw(curarea); + countall(); + + if(G.vd->scenelock) handle_view3d_lock(); + allqueue(REDRAWOOPS, 0); + } + break; + } +} + +void do_layer_buttons(short event) +{ + static int oldlay= 1; + + if(G.vd==0) return; + if(G.vd->localview) return; + + if(event==-1 && (G.qual & LR_CTRLKEY)) { + G.vd->scenelock= !G.vd->scenelock; + do_view3d_buttons(B_SCENELOCK); + } else if (event==-1) { + if(G.vd->lay== (2<<20)-1) { + if(G.qual & LR_SHIFTKEY) G.vd->lay= oldlay; + } + else { + oldlay= G.vd->lay; + G.vd->lay= (2<<20)-1; + } + + if(G.vd->scenelock) handle_view3d_lock(); + scrarea_queue_winredraw(curarea); + } + else { + if(G.qual & LR_ALTKEY) { + if(event<11) event+= 10; + } + if(G.qual & LR_SHIFTKEY) { + if(G.vd->lay & (1<<event)) G.vd->lay -= (1<<event); + else G.vd->lay += (1<<event); + } + do_view3d_buttons(event+B_LAY); + } + /* redraw lijkt dubbelop: wordt in queue netjes afgehandeld */ + scrarea_queue_headredraw(curarea); + + if(curarea->spacetype==SPACE_OOPS) allqueue(REDRAWVIEW3D, 1); /* 1==ook headwin */ + +} + +void do_nla_buttons(unsigned short event) +{ + View2D *v2d; + + switch(event){ + case B_NLAHOME: + // Find X extents + v2d= &(G.snla->v2d); + + v2d->cur.xmin = G.scene->r.sfra; + v2d->cur.ymin=-SCROLLB; + +// if (!G.saction->action){ + v2d->cur.xmax=G.scene->r.efra; +// } +// else +// { +// v2d->cur.xmax=calc_action_length(G.saction->action)+1; +// } + + test_view2d(G.v2d, curarea->winx, curarea->winy); + addqueue (curarea->win, REDRAW, 1); + break; + } +} + +void nla_buttons(void) +{ + SpaceNla *snla; + short xco; + char naam[20]; + uiBlock *block; + + snla= curarea->spacedata.first; + + sprintf(naam, "header %d", curarea->headwin); + block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin); + uiBlockSetCol(block, BUTCHOKE); + + curarea->butspacetype= SPACE_NLA; + uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type "); + + /* FULL WINDOW */ + xco= 25; + if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)"); + else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)"); + + /* HOME */ + uiDefIconBut(block, BUT, B_NLAHOME, ICON_HOME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Home (HOMEKEY)"); + xco+= XIC; + + /* IMAGE */ +// uiDefIconButS(block, TOG, B_REDR, ICON_IMAGE_COL, xco+=XIC,0,XIC,YIC, &sseq->mainb, 0, 0, 0, 0, "Toggles image display"); + + /* ZOOM en BORDER */ +// xco+= XIC; +// uiDefIconButI(block, TOG, B_VIEW2DZOOM, ICON_VIEWZOOM, xco+=XIC,0,XIC,YIC, &viewmovetemp, 0, 0, 0, 0, "Zoom view (CTRL+MiddleMouse)"); +// uiDefIconBut(block, BUT, B_NLABORDER, ICON_BORDERMOVE, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Translate view (MiddleMouse)"); + + /* draw LOCK */ + xco+= XIC/2; + uiDefIconButI(block, ICONTOG, 1, ICON_UNLOCKED, xco+=XIC,0,XIC,YIC, &(G.snla->lock), 0, 0, 0, 0, "Lock redraw of other windows while editing"); + + uiDrawBlock(block);} + +void action_buttons(void) +{ + uiBlock *block; + short xco; + char naam[256]; + Object *ob; + ID *from; + + if (!G.saction) + return; + + // copy from drawactionspace.... + if (!G.saction->pin) { + if (OBACT) + G.saction->action = OBACT->action; + else + G.saction->action=NULL; + } + + sprintf(naam, "header %d", curarea->headwin); + block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin); + uiBlockSetCol(block, BUTPINK); + + curarea->butspacetype= SPACE_ACTION; + uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type"); + + /* FULL WINDOW */ + xco= 25; + if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)"); + else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)"); + uiDefIconBut(block, BUT, B_ACTHOME, ICON_HOME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Home (HOMEKEY)"); + + + /* NAME ETC */ + ob=OBACT; + from = (ID*) ob; + + xco= std_libbuttons(block, xco+1.5*XIC, B_ACTPIN, &G.saction->pin, B_ACTIONBROWSE, (ID*)G.saction->action, from, &(G.saction->actnr), B_ACTALONE, B_ACTLOCAL, B_ACTIONDELETE, 0); + +#ifdef __NLA_BAKE + /* Draw action baker */ + uiDefBut(block, BUT, B_ACTBAKE, "Bake", xco+=XIC, 0, 64, YIC, 0, 0, 0, 0, 0, "Generate an action with the constraint effects converted into ipo keys"); + xco+=64; +#endif + uiClearButLock(); + + /* draw LOCK */ + xco+= XIC/2; + uiDefIconButS(block, ICONTOG, 1, ICON_UNLOCKED, xco+=XIC,0,XIC,YIC, &(G.saction->lock), 0, 0, 0, 0, "Lock redraw of other windows while editing"); + + + /* always as last */ + curarea->headbutlen= xco+2*XIC; + + uiDrawBlock(block); +} + +void view3d_buttons(void) +{ + uiBlock *block; + int a; + short xco; + char naam[20]; + + sprintf(naam, "header %d", curarea->headwin); + block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin); + uiBlockSetCol(block, BUTBLUE); + + curarea->butspacetype= SPACE_VIEW3D; + uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type "); + + + /* FULL WINDOW */ + xco= 25; + if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)"); + else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)"); + + /* HOME */ + uiDefIconBut(block, BUT, B_HOME, ICON_HOME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Home (HOMEKEY)"); + + xco+= XIC+8; + if(G.vd->localview==0) { + /* LAYERS */ + for(a=0; a<10; a++) { + uiDefButI(block, TOG|BIT|(a+10), B_LAY+10+a, "",(short)(xco+a*(XIC/2)), 0, XIC/2, (YIC)/2, &(G.vd->lay), 0, 0, 0, 0, "Layers"); + uiDefButI(block, TOG|BIT|a, B_LAY+a, "", (short)(xco+a*(XIC/2)), (short)(YIC/2),(short)(XIC/2),(short)(YIC/2), &(G.vd->lay), 0, 0, 0, 0, "Layers"); + if(a==4) xco+= 5; + } + xco+= (a-2)*(XIC/2)+5; + + /* LOCK */ + uiDefIconButS(block, ICONTOG, B_SCENELOCK, ICON_UNLOCKED, xco+=XIC,0,XIC,YIC, &(G.vd->scenelock), 0, 0, 0, 0, "Lock layers and used Camera to Scene"); + xco+= XIC; + + } + else xco+= (10+2)*(XIC/2)+10; + + /* LOCALVIEW */ + uiDefIconButS(block, ICONROW, B_LOCALVIEW, ICON_LOCALVIEW, xco+=XIC,0,XIC,YIC, &(G.vd->localview), 0.0, 2.0, 0, 0, "Local View (NumPad /)"); + + /* PERSP */ + xco+= XIC/2; + uiDefIconButS(block, ICONROW, B_PERSP, ICON_ORTHO, xco+=XIC,0,XIC,YIC, &(G.vd->persp), 0.0, 2.0, 0, 0, "Perspective mode (NumPad 5, Numpad 0)"); + + xco+= XIC/2; + /* AANZICHT */ + + if(G.vd->view==7) G.vd->viewbut= 1; + else if(G.vd->view==1) G.vd->viewbut= 2; + else if(G.vd->view==3) G.vd->viewbut= 3; + else G.vd->viewbut= 0; + + uiDefIconButS(block, ICONROW, B_VIEWBUT, ICON_VIEW_AXIS_NONE, xco+=XIC,0,XIC,YIC, &G.vd->viewbut, 0.0, 3.0, 0, 0, "Top/Front or Side views (Numpad 7, 1, 3)"); + + /* DRAWTYPE */ + xco+= XIC/2; + uiDefIconButS(block, ICONROW, B_REDR, ICON_BBOX, xco+=XIC,0,XIC,YIC, &(G.vd->drawtype), 1.0, 5.0, 0, 0, "Drawtype: boundbox/wire/solid/shaded (ZKEY, SHIFT+Z)"); + + /* VIEWMOVE */ + xco+= XIC/2; + uiDefIconButI(block, TOG, B_VIEWTRANS, ICON_VIEWMOVE, xco+=XIC,0,XIC,YIC, &viewmovetemp, 0, 0, 0, 0, "Translate view (SHIFT+MiddleMouse)"); + uiDefIconButI(block, TOG, B_VIEWZOOM, ICON_VIEWZOOM, xco+=XIC,0,XIC,YIC, &viewmovetemp, 0, 0, 0, 0, "Zoom view (CTRL+MiddleMouse)"); + + /* around */ + xco+= XIC/2; + uiDefIconButS(block, ROW, 1, ICON_ROTATE, xco+=XIC,0,XIC,YIC, &G.vd->around, 3.0, 0.0, 0, 0, "Rotation/Scaling around boundbox center (COMMAKEY)"); + uiDefIconButS(block, ROW, 1, ICON_ROTATECENTER, xco+=XIC,0,XIC,YIC, &G.vd->around, 3.0, 3.0, 0, 0, "Rotation/Scaling around median point"); + uiDefIconButS(block, ROW, 1, ICON_CURSOR, xco+=XIC,0,XIC,YIC, &G.vd->around, 3.0, 1.0, 0, 0, "Rotation/Scaling around cursor (DOTKEY)"); + uiDefIconButS(block, ROW, 1, ICON_ROTATECOLLECTION, xco+=XIC,0,XIC,YIC, &G.vd->around, 3.0, 2.0, 0, 0, "Rotation/Scaling around individual centers"); + + /* mode */ + G.vd->flag &= ~V3D_MODE; + if(G.obedit) G.vd->flag |= V3D_EDITMODE; + if(G.f & G_VERTEXPAINT) G.vd->flag |= V3D_VERTEXPAINT; + if(G.f & G_WEIGHTPAINT) G.vd->flag |= V3D_WEIGHTPAINT; +#ifdef NAN_TPT + if (G.f & G_TEXTUREPAINT) G.vd->flag |= V3D_TEXTUREPAINT; +#endif /* NAN_TPT */ + if(G.f & G_FACESELECT) G.vd->flag |= V3D_FACESELECT; + if(G.obpose){ + G.vd->flag |= V3D_POSEMODE; + } + + xco+= XIC/2; + /* If there is a posable object hilighted & selected, display this button */ + if (OBACT){ + if (OBACT->type==OB_ARMATURE){ + uiDefIconButS(block, ICONTOG|BIT|7, B_POSEMODE, ICON_POSE_DEHLT, xco+=XIC,0,XIC,YIC, &G.vd->flag, 0, 0, 0, 0, "PoseMode (CTRL+TAB)"); + } + } + uiDefIconButS(block, ICONTOG|BIT|4, B_EDITMODE, ICON_EDITMODE_DEHLT, xco+=XIC,0,XIC,YIC, &G.vd->flag, 0, 0, 0, 0, "EditMode (TAB)"); + if (!G.obpose && !G.obedit) + { + xco+= XIC/2; + /* Only if mesh is selected */ + if (OBACT && OBACT->type == OB_MESH){ + uiDefIconButS(block, ICONTOG|BIT|5, B_VPAINT, ICON_VPAINT_DEHLT, xco+=XIC,0,XIC,YIC, &G.vd->flag, 0, 0, 0, 0, "VertexPaint Mode (VKEY)"); + /* Only if deformable mesh is selected */ + if ((((Mesh*)(OBACT->data))->dvert)) + uiDefIconButS(block, ICONTOG|BIT|9, B_WPAINT, ICON_WPAINT_DEHLT, xco+=XIC,0,XIC,YIC, &G.vd->flag, 0, 0, 0, 0, "WeightPaint Mode"); +#ifdef NAN_TPT + uiDefIconButS(block, ICONTOG|BIT|8, B_TEXTUREPAINT, ICON_TPAINT_DEHLT, xco+=XIC,0,XIC,YIC, &G.vd->flag, 0, 0, 0, 0, "TexturePaint Mode"); +#endif /* NAN_TPT */ + uiDefIconButS(block, ICONTOG|BIT|6, B_FACESEL, ICON_FACESEL_DEHLT, xco+=XIC,0,XIC,YIC, &G.vd->flag, 0, 0, 0, 0, "FaceSelect Mode (FKEY)"); + } + } + if (G.obpose){ + /* Copy paste - WAS in action window */ + xco+= XIC/2; + // xco-= XIC/2; // Used in action window + if(curarea->headertype==HEADERTOP) { + uiDefIconBut(block, BUT, B_ACTCOPY, ICON_COPYUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the current pose to the buffer"); + uiSetButLock(G.obpose->id.lib!=0, "Can't edit library data"); + uiDefIconBut(block, BUT, B_ACTPASTE, ICON_PASTEUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the pose from the buffer"); + uiDefIconBut(block, BUT, B_ACTPASTEFLIP, ICON_PASTEFLIPUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the flipped pose from the buffer"); + } + else { + uiDefIconBut(block, BUT, B_ACTCOPY, ICON_COPYDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the current pose to the buffer"); + uiSetButLock(G.obpose->id.lib!=0, "Can't edit library data"); + uiDefIconBut(block, BUT, B_ACTPASTE, ICON_PASTEDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the pose from the buffer"); + uiDefIconBut(block, BUT, B_ACTPASTEFLIP, ICON_PASTEFLIPDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the flipped pose from the buffer"); + } +// xco+=XIC/2; // Used in action window + } + if(G.vd->bgpic) { + xco+= XIC/2; + uiDefIconButS(block, TOG|BIT|1, B_REDR, ICON_IMAGE_COL, xco+=XIC,0,XIC,YIC, &G.vd->flag, 0, 0, 0, 0, "Display Background picture"); + } + if(G.obedit) { + extern int prop_mode; + xco+= XIC/2; + uiDefIconButI(block, ICONTOG|BIT|14, B_PROPTOOL, ICON_GRID, xco+=XIC,0,XIC,YIC, &G.f, 0, 0, 0, 0, "Proportional vertex editing (OKEY)"); + if(G.f & G_PROPORTIONAL) { + uiDefIconButI(block, ROW, 0, ICON_SHARPCURVE, xco+=XIC,0,XIC,YIC, &prop_mode, 4.0, 0.0, 0, 0, "Sharp falloff (SHIFT+OKEY)"); + uiDefIconButI(block, ROW, 0, ICON_SMOOTHCURVE, xco+=XIC,0,XIC,YIC, &prop_mode, 4.0, 1.0, 0, 0, "Smooth falloff (SHIFT+OKEY)"); + } + } + + xco+=XIC; + uiDefIconBut(block, BUT, B_VIEWRENDER, ICON_SCENE, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Render this view. (Hold SHIFT for Anim render)"); + xco+=XIC; + uiDefIconBut(block, BUT, B_STARTGAME, ICON_GAME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Start game (PKEY)"); + + + /* Always do this last */ + curarea->headbutlen= xco+2*XIC; + + uiDrawBlock(block); +} + +/* ********************** VIEW3D ****************************** */ +/* ********************** IPO ****************************** */ + +void do_ipo_buttons(short event) +{ + EditIpo *ei; + View2D *v2d; + rcti rect; + float xmin, ymin, dx, dy; + int a, val, first; + short mval[2]; + + if(curarea->win==0) return; + + switch(event) { + case B_IPOHOME: + + /* boundbox */ + + v2d= &(G.sipo->v2d); + first= 1; + + ei= G.sipo->editipo; + if(ei==0) return; + for(a=0; a<G.sipo->totipo; a++, ei++) { + if ISPOIN(ei, flag & IPO_VISIBLE, icu) { + + boundbox_ipocurve(ei->icu); + + if(first) { + v2d->tot= ei->icu->totrct; + first= 0; + } + else BLI_union_rctf(&(v2d->tot), &(ei->icu->totrct)); + } + } + + /* speciale home */ + if(G.qual & LR_SHIFTKEY) { + v2d->tot.xmin= SFRA; + v2d->tot.xmax= EFRA; + } + + /* beetje uitzoomen */ + dx= 0.10*(v2d->tot.xmax-v2d->tot.xmin); + dy= 0.10*(v2d->tot.ymax-v2d->tot.ymin); + + if(dx<v2d->min[0]) dx= v2d->min[0]; + if(dy<v2d->min[1]) dy= v2d->min[1]; + + v2d->cur.xmin= v2d->tot.xmin- dx; + v2d->cur.xmax= v2d->tot.xmax+ dx; + v2d->cur.ymin= v2d->tot.ymin- dy; + v2d->cur.ymax= v2d->tot.ymax+ dy; + + test_view2d(G.v2d, curarea->winx, curarea->winy); + scrarea_queue_winredraw(curarea); + break; + case B_IPOBORDER: + val= get_border(&rect, 2); + if(val) { + mval[0]= rect.xmin; + mval[1]= rect.ymin; + areamouseco_to_ipoco(G.v2d, mval, &xmin, &ymin); + mval[0]= rect.xmax; + mval[1]= rect.ymax; + areamouseco_to_ipoco(G.v2d, mval, &(G.v2d->cur.xmax), &(G.v2d->cur.ymax)); + G.v2d->cur.xmin= xmin; + G.v2d->cur.ymin= ymin; + + test_view2d(G.v2d, curarea->winx, curarea->winy); + scrarea_queue_winredraw(curarea); + } + break; + + case B_IPOPIN: + allqueue (REDRAWIPO, 0); + break; + + case B_IPOCOPY: + copy_editipo(); + break; + case B_IPOPASTE: + paste_editipo(); + break; + case B_IPOCONT: + set_exprap_ipo(IPO_HORIZ); + break; + case B_IPOEXTRAP: + set_exprap_ipo(IPO_DIR); + break; + case B_IPOCYCLIC: + set_exprap_ipo(IPO_CYCL); + break; + case B_IPOCYCLICX: + set_exprap_ipo(IPO_CYCLX); + break; + case B_IPOMAIN: + make_editipo(); + scrarea_queue_winredraw(curarea); + scrarea_queue_headredraw(curarea); + + break; + case B_IPOSHOWKEY: + /* waarde omkeren vanwege winqread */ + G.sipo->showkey= 1-G.sipo->showkey; + winqreadipo(KKEY, 1, 0); + break; + case B_VIEW2DZOOM: + viewmovetemp= 0; + view2dzoom(); + scrarea_queue_headredraw(curarea); + break; + + } +} + +void ipo_buttons(void) +{ + Object *ob; + ID *id, *from; + uiBlock *block; + short xco; + char naam[20]; + + sprintf(naam, "header %d", curarea->headwin); + block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin); + uiBlockSetCol(block, BUTSALMON); + + curarea->butspacetype= SPACE_IPO; + uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type "); + + test_editipo(); /* test of huidige editipo klopt, make_editipo zet de v2d->cur */ + + /* FULL WINDOW en HOME */ + xco= 25; + if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)"); + else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)"); + uiDefIconBut(block, BUT, B_IPOHOME, ICON_HOME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Home (HOMEKEY)"); + uiDefIconButS(block, ICONTOG, B_IPOSHOWKEY, ICON_KEY_DEHLT, xco+=XIC,0,XIC,YIC, &G.sipo->showkey, 0, 0, 0, 0, "Toggles curve/key display (KKEY)"); + + /* mainmenu, only when data is there and no pin */ + uiSetButLock(G.sipo->pin, "Can't change because of pinned data"); + + ob= OBACT; + xco+= XIC/2; + uiDefIconButS(block, ROW, B_IPOMAIN, ICON_OBJECT, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)ID_OB, 0, 0, "Display Object Ipos "); + + if(ob && give_current_material(ob, ob->actcol)) { + uiDefIconButS(block, ROW, B_IPOMAIN, ICON_MATERIAL, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)ID_MA, 0, 0, "Display Material Ipos "); + if(G.sipo->blocktype==ID_MA) { + uiDefButS(block, NUM, B_IPOMAIN, "", xco+=XIC,0,XIC-4,YIC, &G.sipo->channel, 0.0, 7.0, 0, 0, "Channel Number of the active Material texture"); + xco-= 4; + } + } + if(G.scene->world) { + uiDefIconButS(block, ROW, B_IPOMAIN, ICON_WORLD, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)ID_WO, 0, 0, "Display World Ipos"); + if(G.sipo->blocktype==ID_WO) { + uiDefButS(block, NUM, B_IPOMAIN, "", xco+=XIC,0,XIC-4,YIC, &G.sipo->channel, 0.0, 7.0, 0, 0, "Channel Number of the active World texture"); + xco-= 4; + } + } + + if(ob && ob->type==OB_CURVE) + uiDefIconButS(block, ROW, B_IPOMAIN, ICON_ANIM, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)ID_CU, 0, 0, "Display Curve Ipos"); + + if(ob && ob->type==OB_CAMERA) + uiDefIconButS(block, ROW, B_IPOMAIN, ICON_CAMERA, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)ID_CA, 0, 0, "Display Camera Ipos"); + + if(ob && ob->type==OB_LAMP) { + uiDefIconButS(block, ROW, B_IPOMAIN, ICON_LAMP, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)ID_LA, 0, 0, "Display Lamp Ipos"); + if(G.sipo->blocktype==ID_LA) { + uiDefButS(block, NUM, B_IPOMAIN, "", xco+=XIC,0,XIC-4,YIC, &G.sipo->channel, 0.0, 7.0, 0, 0, "Channel Number of the active Lamp texture"); + xco-= 4; + } + } + + if(ob) { + if ELEM4(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_LATTICE) + uiDefIconButS(block, ROW, B_IPOMAIN, ICON_EDIT, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)ID_KE, 0, 0, "Display VertexKeys Ipos"); + if (ob->action) + uiDefIconButS(block, ROW, B_IPOMAIN, ICON_ACTION, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)ID_AC, 0, 0, "Display Action Ipos"); +#ifdef __CON_IPO + uiDefIconButS(block, ROW, B_IPOMAIN, ICON_CONSTRAINT, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)IPO_CO, 0, 0, "Display Constraint Ipos"); +#endif + } + uiDefIconButS(block, ROW, B_IPOMAIN, ICON_SEQUENCE, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)ID_SEQ, 0, 0, "Display Sequence Ipos"); + + if(G.buts && G.buts->mainb == BUTS_SOUND && G.buts->lockpoin) + uiDefIconButS(block, ROW, B_IPOMAIN, ICON_SOUND, xco+=XIC,0,XIC,YIC, &G.sipo->blocktype, 1.0, (float)ID_SO, 0, 0, "Display Sound Ipos"); + + + uiClearButLock(); + + /* NAME ETC */ + id= (ID *)get_ipo_to_edit(&from); + + xco= std_libbuttons(block, (short)(xco+1.5*XIC), B_IPOPIN, &G.sipo->pin, B_IPOBROWSE, (ID*)G.sipo->ipo, from, &(G.sipo->menunr), B_IPOALONE, B_IPOLOCAL, B_IPODELETE, 0); + + uiSetButLock(id && id->lib, "Can't edit library data"); + + /* COPY PASTE */ + xco-= XIC/2; + if(curarea->headertype==HEADERTOP) { + uiDefIconBut(block, BUT, B_IPOCOPY, ICON_COPYUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the selected curves to the buffer"); + uiSetButLock(id && id->lib, "Can't edit library data"); + uiDefIconBut(block, BUT, B_IPOPASTE, ICON_PASTEUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the curves from the buffer"); + } + else { + uiDefIconBut(block, BUT, B_IPOCOPY, ICON_COPYDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the selected curves to the buffer"); + uiSetButLock(id && id->lib, "Can't edit library data"); + uiDefIconBut(block, BUT, B_IPOPASTE, ICON_PASTEDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the curves from the buffer"); + } + xco+=XIC/2; + + /* EXTRAP */ + uiDefIconBut(block, BUT, B_IPOCONT, ICON_CONSTANT, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Sets the extend mode to constant"); + uiDefIconBut(block, BUT, B_IPOEXTRAP, ICON_LINEAR, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Sets the extend mode to extrapolation"); + uiDefIconBut(block, BUT, B_IPOCYCLIC, ICON_CYCLICLINEAR, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Sets the extend mode to cyclic"); + uiDefIconBut(block, BUT, B_IPOCYCLICX, ICON_CYCLIC, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Sets the extend mode to cyclic extrapolation"); + xco+= XIC/2; + + uiClearButLock(); + /* ZOOM en BORDER */ + uiDefIconButI(block, TOG, B_VIEW2DZOOM, ICON_VIEWZOOM, xco+=XIC,0,XIC,YIC, &viewmovetemp, 0, 0, 0, 0, "Zoom view (CTRL+MiddleMouse)"); + uiDefIconBut(block, BUT, B_IPOBORDER, ICON_BORDERMOVE, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Translate view (MiddleMouse)"); + + /* draw LOCK */ + uiDefIconButS(block, ICONTOG, 1, ICON_UNLOCKED, xco+=XIC,0,XIC,YIC, &(G.sipo->lock), 0, 0, 0, 0, "Lock redraw of other windows while editing"); + + /* altijd als laatste doen */ + curarea->headbutlen= xco+2*XIC; + + uiDrawBlock(block); +} + +/* ********************** IPO ****************************** */ +/* ********************** BUTS ****************************** */ + +Material matcopybuf; + +void clear_matcopybuf(void) +{ + memset(&matcopybuf, 0, sizeof(Material)); +} + +void free_matcopybuf(void) +{ + extern MTex mtexcopybuf; /* buttons.c */ + int a; + + for(a=0; a<8; a++) { + if(matcopybuf.mtex[a]) { + MEM_freeN(matcopybuf.mtex[a]); + matcopybuf.mtex[a]= 0; + } + } + + default_mtex(&mtexcopybuf); +} + +void do_buts_buttons(short event) +{ + static short matcopied=0; + MTex *mtex; + Material *ma; + ID id; + int a; + + if(curarea->win==0) return; + + switch(event) { + case B_BUTSHOME: + G.v2d->cur= G.v2d->tot; + test_view2d(G.v2d, curarea->winx, curarea->winy); + scrarea_queue_winredraw(curarea); + break; + case B_BUTSPREVIEW: + BIF_preview_changed(G.buts); + scrarea_queue_headredraw(curarea); + scrarea_queue_winredraw(curarea); + break; + case B_MATCOPY: + if(G.buts->lockpoin) { + + if(matcopied) free_matcopybuf(); + + memcpy(&matcopybuf, G.buts->lockpoin, sizeof(Material)); + for(a=0; a<8; a++) { + mtex= matcopybuf.mtex[a]; + if(mtex) { + matcopybuf.mtex[a]= MEM_dupallocN(mtex); + } + } + matcopied= 1; + } + break; + case B_MATPASTE: + if(matcopied && G.buts->lockpoin) { + ma= G.buts->lockpoin; + /* vrijgeven huidige mat */ + for(a=0; a<8; a++) { + mtex= ma->mtex[a]; + if(mtex && mtex->tex) mtex->tex->id.us--; + if(mtex) MEM_freeN(mtex); + } + + id= (ma->id); + memcpy(G.buts->lockpoin, &matcopybuf, sizeof(Material)); + (ma->id)= id; + + for(a=0; a<8; a++) { + mtex= ma->mtex[a]; + if(mtex) { + ma->mtex[a]= MEM_dupallocN(mtex); + if(mtex->tex) id_us_plus((ID *)mtex->tex); + } + } + BIF_preview_changed(G.buts); + scrarea_queue_winredraw(curarea); + } + break; + case B_MESHTYPE: + allqueue(REDRAWBUTSEDIT, 0); + allqueue(REDRAWVIEW3D, 0); + break; + } +} + +void buttons_active_id(ID **id, ID **idfrom) +{ + Object *ob= OBACT; + Material *ma; + ID * search; + + *id= NULL; + *idfrom= (ID *)ob; + + if(G.buts->mainb==BUTS_LAMP) { + if(ob && ob->type==OB_LAMP) { + *id= ob->data; + } + } + else if(G.buts->mainb==BUTS_MAT) { + if(ob && (ob->type<OB_LAMP) && ob->type) { + *id= (ID *)give_current_material(ob, ob->actcol); + *idfrom= material_from(ob, ob->actcol); + } + } + else if(G.buts->mainb==BUTS_TEX) { + MTex *mtex; + + if(G.buts->mainbo != G.buts->mainb) { + if(G.buts->mainbo==BUTS_LAMP) G.buts->texfrom= 2; + else if(G.buts->mainbo==BUTS_WORLD) G.buts->texfrom= 1; + else if(G.buts->mainbo==BUTS_MAT) G.buts->texfrom= 0; + } + + if(G.buts->texfrom==0) { + if(ob && ob->type<OB_LAMP && ob->type) { + ma= give_current_material(ob, ob->actcol); + *idfrom= (ID *)ma; + if(ma) { + mtex= ma->mtex[ ma->texact ]; + if(mtex) *id= (ID *)mtex->tex; + } + } + } + else if(G.buts->texfrom==1) { + World *wrld= G.scene->world; + *idfrom= (ID *)wrld; + if(wrld) { + mtex= wrld->mtex[ wrld->texact]; + if(mtex) *id= (ID *)mtex->tex; + } + } + else if(G.buts->texfrom==2) { + Lamp *la; + if(ob && ob->type==OB_LAMP) { + la= ob->data; + *idfrom= (ID *)la; + mtex= la->mtex[ la->texact]; + if(mtex) *id= (ID *)mtex->tex; + } + } + } + else if ELEM3(G.buts->mainb, BUTS_ANIM, BUTS_GAME, BUTS_CONSTRAINT) { + if(ob) { + *idfrom= (ID *)G.scene; + *id= (ID *)ob; + } + } + else if(G.buts->mainb==BUTS_WORLD) { + *id= (ID *)G.scene->world; + *idfrom= (ID *)G.scene; + } + else if(G.buts->mainb==BUTS_RENDER) { + *id= (ID *)G.scene; + + } + else if(G.buts->mainb==BUTS_EDIT) { + if(ob && ob->data) { + *id= ob->data; + } + } + else if (G.buts->mainb == BUTS_SOUND) { + // printf("lockp: %d\n", G.buts->lockpoin); + + if (G.buts->lockpoin) { + search = G.main->sound.first; + while (search) { + if (search == G.buts->lockpoin) { + break; + } + search = search->next; + } + if (search == NULL) { + *id = G.main->sound.first; + } else { + *id = search; + } + } else { + *id = G.main->sound.first; + } + // printf("id: %d\n\n", *id); + } +} + +static void validate_bonebutton(void *bonev, void *data2_unused){ + Bone *bone= bonev; + bArmature *arm; + + arm = get_armature(G.obpose); + unique_bone_name(bone, arm); +} + + +static int bonename_exists(Bone *orig, char *name, ListBase *list) +{ + Bone *curbone; + + for (curbone=list->first; curbone; curbone=curbone->next){ + /* Check this bone */ + if (orig!=curbone){ + if (!strcmp(curbone->name, name)) + return 1; + } + + /* Check Children */ + if (bonename_exists(orig, name, &curbone->childbase)) + return 1; + } + + return 0; + +} + +static void unique_bone_name (Bone *bone, bArmature *arm) +{ + char tempname[64]; + char oldname[64]; + int number; + char *dot; + + if (!arm) + return; + + strcpy(oldname, bone->name); + + /* See if we even need to do this */ + if (!bonename_exists(bone, bone->name, &arm->bonebase)) + return; + + /* Strip off the suffix */ + dot=strchr(bone->name, '.'); + if (dot) + *dot=0; + + for (number = 1; number <=999; number++){ + sprintf (tempname, "%s.%03d", bone->name, number); + + if (!bonename_exists(bone, tempname, &arm->bonebase)){ + strcpy (bone->name, tempname); + return; + } + } +} + +void buts_buttons(void) +{ + ID *id, *idfrom; + Object *ob; + uiBlock *block; + uiBut *but; + short xco; + int alone, local, browse; + char naam[20]; + short type; + void *data=NULL; + char str[256]; + + sprintf(naam, "header %d", curarea->headwin); + block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin); + uiBlockSetCol(block, BUTGREY); + + curarea->butspacetype= SPACE_BUTS; + uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type "); + + /* FULL WINDOW */ + xco= 25; + if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)"); + else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)"); + + /* HOME */ + uiDefIconBut(block, BUT, B_BUTSHOME, ICON_HOME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Home (HOMEKEY)"); + + /* keuzemenu */ + xco+= 2*XIC; + uiDefIconButS(block, ROW, B_REDR, ICON_EYE, xco+=XIC, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_VIEW, 0, 0, "View buttons"); + uiDefIconButS(block, ROW, B_BUTSPREVIEW, ICON_LAMP, xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_LAMP, 0, 0, "Lamp buttons (F4)"); + uiDefIconButS(block, ROW, B_BUTSPREVIEW, ICON_MATERIAL, xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_MAT, 0, 0, "Material buttons (F5)"); + uiDefIconButS(block, ROW, B_BUTSPREVIEW, ICON_TEXTURE, xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_TEX, 0, 0, "Texture buttons (F6)"); + uiDefIconButS(block, ROW, B_REDR, ICON_ANIM, xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_ANIM, 0, 0, "Animation buttons (F7)"); + uiDefIconButS(block, ROW, B_REDR, ICON_GAME, xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_GAME, 0, 0, "Realtime buttons (F8)"); + uiDefIconButS(block, ROW, B_REDR, ICON_EDIT, xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_EDIT, 0, 0, "Edit buttons (F9)"); + uiDefIconButS(block, ROW, B_REDR, ICON_CONSTRAINT,xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_CONSTRAINT, 0, 0, "Constraint buttons"); + uiDefIconButS(block, ROW, B_REDR, ICON_SPEAKER,xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_SOUND, 0, 0, "Sound buttons"); + uiDefIconButS(block, ROW, B_BUTSPREVIEW, ICON_WORLD, xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_WORLD, 0, 0, "World buttons"); + uiDefIconButS(block, ROW, B_REDR, ICON_PAINT,xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_FPAINT, 0, 0, "Paint buttons"); + uiDefIconButS(block, ROW, B_REDR, ICON_RADIO,xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_RADIO, 0, 0, "Radiosity buttons"); + uiDefIconButS(block, ROW, B_REDR, ICON_SCRIPT,xco+=30, 0, 30, YIC, &(G.buts->mainb), 1.0, (float)BUTS_SCRIPT, 0, 0, "Script buttons"); + uiDefIconButS(block, ROW, B_REDR, ICON_SCENE, xco+=30, 0, 50, YIC, &(G.buts->mainb), 1.0, (float)BUTS_RENDER, 0, 0, "Display buttons (F10)"); + xco+= 80; + + ob= OBACT; + + buttons_active_id(&id, &idfrom); + + G.buts->lockpoin= id; + + if(G.buts->mainb==BUTS_LAMP) { + if(id) { + xco= std_libbuttons(block, xco, 0, NULL, B_LAMPBROWSE, id, (ID *)ob, &(G.buts->menunr), B_LAMPALONE, B_LAMPLOCAL, 0, 0); + } + } + else if(G.buts->mainb==BUTS_MAT) { + if(ob && (ob->type<OB_LAMP) && ob->type) { + xco= std_libbuttons(block, xco, 0, NULL, B_MATBROWSE, id, idfrom, &(G.buts->menunr), B_MATALONE, B_MATLOCAL, B_MATDELETE, B_AUTOMATNAME); + } + + /* COPY PASTE */ + if(curarea->headertype==HEADERTOP) { + uiDefIconBut(block, BUT, B_MATCOPY, ICON_COPYUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Copy Material to the buffer"); + uiSetButLock(id && id->lib, "Can't edit library data"); + uiDefIconBut(block, BUT, B_MATPASTE, ICON_PASTEUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Paste Material from the buffer"); + } + else { + uiDefIconBut(block, BUT, B_MATCOPY, ICON_COPYDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Copy Material to the buffer"); + uiSetButLock(id && id->lib, "Can't edit library data"); + uiDefIconBut(block, BUT, B_MATPASTE, ICON_PASTEDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Paste Material from the buffer"); + } + xco+=XIC; + + } + else if(G.buts->mainb==BUTS_TEX) { + if(G.buts->texfrom==0) { + if(idfrom) { + xco= std_libbuttons(block, xco, 0, NULL, B_TEXBROWSE, id, idfrom, &(G.buts->texnr), B_TEXALONE, B_TEXLOCAL, B_TEXDELETE, B_AUTOTEXNAME); + } + } + else if(G.buts->texfrom==1) { + if(idfrom) { + xco= std_libbuttons(block, xco, 0, NULL, B_WTEXBROWSE, id, idfrom, &(G.buts->texnr), B_TEXALONE, B_TEXLOCAL, B_TEXDELETE, B_AUTOTEXNAME); + } + } + else if(G.buts->texfrom==2) { + if(idfrom) { + xco= std_libbuttons(block, xco, 0, NULL, B_LTEXBROWSE, id, idfrom, &(G.buts->texnr), B_TEXALONE, B_TEXLOCAL, B_TEXDELETE, B_AUTOTEXNAME); + } + } + } + else if(G.buts->mainb==BUTS_ANIM) { + if(id) { + xco= std_libbuttons(block, xco, 0, NULL, 0, id, idfrom, &(G.buts->menunr), B_OBALONE, B_OBLOCAL, 0, 0); + + if(G.scene->group) { + Group *group= G.scene->group; + but= uiDefBut(block, TEX, B_IDNAME, "GR:", xco, 0, 135, YIC, group->id.name+2, 0.0, 19.0, 0, 0, "Active Group name"); + uiButSetFunc(but, test_idbutton_cb, group->id.name, NULL); + xco+= 135; + } + } + } + else if(G.buts->mainb==BUTS_GAME) { + if(id) { + xco= std_libbuttons(block, xco, 0, NULL, 0, id, idfrom, &(G.buts->menunr), B_OBALONE, B_OBLOCAL, 0, 0); + } + } + else if(G.buts->mainb==BUTS_WORLD) { + xco= std_libbuttons(block, xco, 0, NULL, B_WORLDBROWSE, id, idfrom, &(G.buts->menunr), B_WORLDALONE, B_WORLDLOCAL, B_WORLDDELETE, 0); + } + else if (G.buts->mainb==BUTS_SOUND) { + xco= std_libbuttons(block, xco, 0, NULL, B_SOUNDBROWSE2, id, idfrom, &(G.buts->texnr), 1, 0, 0, 0); + } + + else if(G.buts->mainb==BUTS_RENDER) { + xco= std_libbuttons(block, xco, 0, NULL, B_INFOSCE, (ID *)G.scene, 0, &(G.curscreen->scenenr), 1, 1, B_INFODELSCE, 0); + } + else if(G.buts->mainb==BUTS_EDIT) { + if(id) { + + alone= 0; + local= 0; + browse= B_EDITBROWSE; + xco+= 10; + + if(ob->type==OB_MESH) { + browse= B_MESHBROWSE; + alone= B_MESHALONE; + local= B_MESHLOCAL; + uiSetButLock(G.obedit!=0, "Unable to perform function in EditMode"); + } + else if(ob->type==OB_MBALL) { + alone= B_MBALLALONE; + local= B_MBALLLOCAL; + } + else if ELEM3(ob->type, OB_CURVE, OB_FONT, OB_SURF) { + alone= B_CURVEALONE; + local= B_CURVELOCAL; + } + else if(ob->type==OB_CAMERA) { + alone= B_CAMERAALONE; + local= B_CAMERALOCAL; + } + else if(ob->type==OB_LAMP) { + alone= B_LAMPALONE; + local= B_LAMPLOCAL; + } + else if (ob->type==OB_ARMATURE){ + alone = B_ARMALONE; + local = B_ARMLOCAL; + } + else if(ob->type==OB_LATTICE) { + alone= B_LATTALONE; + local= B_LATTLOCAL; + } + + xco= std_libbuttons(block, xco, 0, NULL, browse, id, idfrom, &(G.buts->menunr), alone, local, 0, 0); + + xco+= XIC; + } + if(ob) { + but= uiDefBut(block, TEX, B_IDNAME, "OB:", xco, 0, 135, YIC, ob->id.name+2, 0.0, 19.0, 0, 0, "Active Object name"); + uiButSetFunc(but, test_idbutton_cb, ob->id.name, NULL); + xco+= 135; + } + } + else if(G.buts->mainb==BUTS_CONSTRAINT){ + if(id) { + + + xco= std_libbuttons(block, xco, 0, NULL, 0, id, idfrom, &(G.buts->menunr), B_OBALONE, B_OBLOCAL, 0, 0); + + get_constraint_client(NULL, &type, &data); + if (data && type==TARGET_BONE){ + sprintf(str, "BO:%s", ((Bone*)data)->name); +#if 0 + /* XXXXX, not idname... but check redrawing */ + but= uiDefBut(block, TEX, 1, "BO:", xco, 0, 135, YIC, ((Bone*)data)->name, 0.0, 19.0, 0, 0, "Active Bone name"); + uiButSetFunc(but, validate_bonebutton, data, NULL); +#else + but= uiDefBut(block, LABEL, 1, str, xco, 0, 135, YIC, ((Bone*)data)->name, 0.0, 19.0, 0, 0, "Active Bone name"); +#endif + xco+= 135; + } + } + } + else if(G.buts->mainb==BUTS_SCRIPT) { + if(ob) + uiDefIconButS(block, ROW, B_REDR, ICON_OBJECT, xco,0,XIC,YIC, &G.buts->scriptblock, 2.0, (float)ID_OB, 0, 0, "Display Object script links"); + + if(ob && give_current_material(ob, ob->actcol)) + uiDefIconButS(block, ROW, B_REDR, ICON_MATERIAL, xco+=XIC,0,XIC,YIC, &G.buts->scriptblock, 2.0, (float)ID_MA, 0, 0, "Display Material script links "); + + if(G.scene->world) + uiDefIconButS(block, ROW, B_REDR, ICON_WORLD, xco+=XIC,0,XIC,YIC, &G.buts->scriptblock, 2.0, (float)ID_WO, 0, 0, "Display World script links"); + + if(ob && ob->type==OB_CAMERA) + uiDefIconButS(block, ROW, B_REDR, ICON_CAMERA, xco+=XIC,0,XIC,YIC, &G.buts->scriptblock, 2.0, (float)ID_CA, 0, 0, "Display Camera script links"); + + if(ob && ob->type==OB_LAMP) + uiDefIconButS(block, ROW, B_REDR, ICON_LAMP, xco+=XIC,0,XIC,YIC, &G.buts->scriptblock, 2.0, (float)ID_LA, 0, 0, "Display Lamp script links"); + + xco+= 20; + } + + uiDefButS(block, NUM, B_NEWFRAME, "", (short)(xco+20),0,60,YIC, &(G.scene->r.cfra), 1.0, 18000.0, 0, 0, "Current Frame"); + xco+= 80; + + G.buts->mainbo= G.buts->mainb; + + /* altijd als laatste doen */ + uiDrawBlock(block); + curarea->headbutlen= xco; +} + +/* ********************** BUTS ****************************** */ +/* ******************** FILE ********************** */ + +void do_file_buttons(short event) +{ + SpaceFile *sfile; + + if(curarea->win==0) return; + sfile= curarea->spacedata.first; + + switch(event) { + case B_SORTFILELIST: + sort_filelist(sfile); + scrarea_queue_winredraw(curarea); + break; + case B_RELOADDIR: + freefilelist(sfile); + scrarea_queue_winredraw(curarea); + break; + } + +} + +void file_buttons(void) +{ + SpaceFile *sfile; + uiBlock *block; + float df, totlen, sellen; + short xco; + int totfile, selfile; + char naam[256]; + + sfile= curarea->spacedata.first; + + sprintf(naam, "header %d", curarea->headwin); + block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin); + uiBlockSetCol(block, BUTGREY); + + curarea->butspacetype= SPACE_FILE; + uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type"); + + /* FULL WINDOW */ + xco= 25; + if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)"); + else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)"); + + /* SORT TYPE */ + xco+=XIC; + uiDefIconButS(block, ROW, B_SORTFILELIST, ICON_SORTALPHA, xco+=XIC,0,XIC,YIC, &sfile->sort, 1.0, 0.0, 0, 0, "Sort files alphabetically"); + uiDefIconButS(block, ROW, B_SORTFILELIST, ICON_SORTTIME, xco+=XIC,0,XIC,YIC, &sfile->sort, 1.0, 1.0, 0, 0, "Sort files by time"); + uiDefIconButS(block, ROW, B_SORTFILELIST, ICON_SORTSIZE, xco+=XIC,0,XIC,YIC, &sfile->sort, 1.0, 2.0, 0, 0, "Sort files by size"); + + cpack(0x0); + glRasterPos2i(xco+=XIC+10, 5); + BMF_DrawString(uiBlockGetCurFont(block), sfile->title); + + xco+= BMF_GetStringWidth(G.font, sfile->title); + + uiDefIconButS(block, ICONTOG|BIT|0, B_SORTFILELIST, ICON_LONGDISPLAY,xco+=XIC,0,XIC,YIC, &sfile->flag, 0, 0, 0, 0, "Toggle long info"); + uiDefIconButS(block, TOG|BIT|3, B_RELOADDIR, ICON_GHOST,xco+=XIC,0,XIC,YIC, &sfile->flag, 0, 0, 0, 0, "Hide dot files"); + + xco+=XIC+10; + + if(sfile->type==FILE_LOADLIB) { + uiDefButS(block, TOGN|BIT|2, B_REDR, "Append", xco+=XIC,0,100,YIC, &sfile->flag, 0, 0, 0, 0, "Causes selected data to be copied into current file"); + uiDefButS(block, TOG|BIT|2, B_REDR, "Link", xco+=100,0,100,YIC, &sfile->flag, 0, 0, 0, 0, "Causes selected data to be linked by current file"); + } + + if(sfile->type==FILE_UNIX) { + df= BLI_diskfree(sfile->dir)/(1048576.0); + + filesel_statistics(sfile, &totfile, &selfile, &totlen, &sellen); + + sprintf(naam, "Free: %.3f Mb Files: (%d) %d (%.3f) %.3f Mb", + df, selfile,totfile, sellen, totlen); + + cpack(0x0); + glRasterPos2i(xco, 5); + BMF_DrawString(uiBlockGetCurFont(block), naam); + } + /* altijd als laatste doen */ + curarea->headbutlen= xco+2*XIC; + + uiDrawBlock(block); +} + + +/* ********************** FILE ****************************** */ +/* ******************** OOPS ********************** */ + +void do_oops_buttons(short event) +{ + float dx, dy; + + if(curarea->win==0) return; + + switch(event) { + case B_OOPSHOME: + boundbox_oops(); + G.v2d->cur= G.v2d->tot; + dx= 0.15*(G.v2d->cur.xmax-G.v2d->cur.xmin); + dy= 0.15*(G.v2d->cur.ymax-G.v2d->cur.ymin); + G.v2d->cur.xmin-= dx; + G.v2d->cur.xmax+= dx; + G.v2d->cur.ymin-= dy; + G.v2d->cur.ymax+= dy; + test_view2d(G.v2d, curarea->winx, curarea->winy); + scrarea_queue_winredraw(curarea); + break; + + case B_NEWOOPS: + scrarea_queue_winredraw(curarea); + scrarea_queue_headredraw(curarea); + G.soops->lockpoin= 0; + break; + } + +} + +void oops_buttons(void) +{ + SpaceOops *soops; + Oops *oops; + uiBlock *block; + short xco; + char naam[256]; + + soops= curarea->spacedata.first; + + sprintf(naam, "header %d", curarea->headwin); + block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin); + uiBlockSetCol(block, BUTGREEN); + + curarea->butspacetype= SPACE_OOPS; + uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type"); + + /* FULL WINDOW */ + xco= 25; + if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)"); + else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, (short)(xco+=XIC),0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)"); + + /* HOME */ + uiDefIconBut(block, BUT, B_OOPSHOME, ICON_HOME, (short)(xco+=XIC),0,XIC,YIC, 0, 0, 0, 0, 0, "Home (HOMEKEY)"); + xco+= XIC; + + /* ZOOM en BORDER */ + xco+= XIC; + uiDefIconButI(block, TOG, B_VIEW2DZOOM, ICON_VIEWZOOM, (short)(xco+=XIC),0,XIC,YIC, &viewmovetemp, 0, 0, 0, 0, "Zoom view (CTRL+MiddleMouse)"); + uiDefIconBut(block, BUT, B_OOPSBORDER, ICON_BORDERMOVE, (short)(xco+=XIC),0,XIC,YIC, 0, 0, 0, 0, 0, "Translate view (MiddleMouse)"); + + /* VISIBLE */ + xco+= XIC; + uiDefButS(block, TOG|BIT|10,B_NEWOOPS, "lay", (short)(xco+=XIC),0,XIC+10,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Objects based on layer"); + uiDefIconButS(block, TOG|BIT|0, B_NEWOOPS, ICON_SCENE_HLT, (short)(xco+=XIC+10),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Scene data"); + uiDefIconButS(block, TOG|BIT|1, B_NEWOOPS, ICON_OBJECT_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Object data"); + uiDefIconButS(block, TOG|BIT|2, B_NEWOOPS, ICON_MESH_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Mesh data"); + uiDefIconButS(block, TOG|BIT|3, B_NEWOOPS, ICON_CURVE_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Curve/Surface/Font data"); + uiDefIconButS(block, TOG|BIT|4, B_NEWOOPS, ICON_MBALL_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Metaball data"); + uiDefIconButS(block, TOG|BIT|5, B_NEWOOPS, ICON_LATTICE_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Lattice data"); + uiDefIconButS(block, TOG|BIT|6, B_NEWOOPS, ICON_LAMP_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Lamp data"); + uiDefIconButS(block, TOG|BIT|7, B_NEWOOPS, ICON_MATERIAL_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Material data"); + uiDefIconButS(block, TOG|BIT|8, B_NEWOOPS, ICON_TEXTURE_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Texture data"); + uiDefIconButS(block, TOG|BIT|9, B_NEWOOPS, ICON_IPO_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Ipo data"); + uiDefIconButS(block, TOG|BIT|12, B_NEWOOPS, ICON_IMAGE_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Image data"); + uiDefIconButS(block, TOG|BIT|11, B_NEWOOPS, ICON_LIBRARY_HLT, (short)(xco+=XIC),0,XIC,YIC, &soops->visiflag, 0, 0, 0, 0, "Display Library data"); + + /* naam */ + if(G.soops->lockpoin) { + oops= G.soops->lockpoin; + if(oops->type==ID_LI) strcpy(naam, ((Library *)oops->id)->name); + else strcpy(naam, oops->id->name); + + cpack(0x0); + glRasterPos2i(xco+=XIC+10, 5); + BMF_DrawString(uiBlockGetCurFont(block), naam); + + } + + /* altijd als laatste doen */ + curarea->headbutlen= xco+2*XIC; + + uiDrawBlock(block); +} + + +/* ********************** OOPS ****************************** */ +/* ********************** TEXT ****************************** */ + +void do_text_buttons(unsigned short event) +{ + SpaceText *st= curarea->spacedata.first; + ID *id, *idtest; + int nr= 1; + Text *text; + + if (!st) return; + if (st->spacetype != SPACE_TEXT) return; + + switch (event) { + case B_TEXTBROWSE: + if (st->menunr==-2) { + activate_databrowse((ID *)st->text, ID_TXT, 0, B_TEXTBROWSE, &st->menunr, do_text_buttons); + break; + } + if(st->menunr < 0) break; + + text= st->text; + + nr= 1; + id= (ID *)text; + + if (st->menunr==32767) { + st->text= (Text *)add_empty_text(); + + st->top= 0; + + allqueue(REDRAWTEXT, 0); + allqueue(REDRAWHEADERS, 0); + } + else if (st->menunr==32766) { + activate_fileselect(FILE_SPECIAL, "LOAD TEXT FILE", G.sce, add_text_fs); + return; + } + else { + idtest= G.main->text.first; + while(idtest) { + if(nr==st->menunr) { + break; + } + nr++; + idtest= idtest->next; + } + if(idtest==0) { /* new text */ + activate_fileselect(FILE_SPECIAL, "LOAD TEXT FILE", G.sce, add_text_fs); + return; + } + if(idtest!=id) { + st->text= (Text *)idtest; + st->top= 0; + + pop_space_text(st); + + allqueue(REDRAWTEXT, 0); + allqueue(REDRAWHEADERS, 0); + } + } + break; + + case B_TEXTDELETE: + if(!okee("Really delete text?")) return; + + text= st->text; + if (!text) return; + + BPY_clear_bad_scriptlinks(text); + free_text_controllers(text); + + unlink_text(text); + free_libblock(&G.main->text, text); + + break; + +/* + case B_TEXTSTORE: + st->text->flags ^= TXT_ISEXT; + + allqueue(REDRAWHEADERS, 0); + break; +*/ + case B_TEXTFONT: + switch(st->font_id) { + case 0: + st->lheight= 12; break; + case 1: + st->lheight= 15; break; + } + + allqueue(REDRAWTEXT, 0); + allqueue(REDRAWHEADERS, 0); + + break; + } +} + +void text_buttons(void) +{ + uiBlock *block; + SpaceText *st= curarea->spacedata.first; + short xco; + char naam[256]; + + if (!st || st->spacetype != SPACE_TEXT) return; + + sprintf(naam, "header %d", curarea->headwin); + block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin); + uiBlockSetCol(block, BUTGREY); + + curarea->butspacetype= SPACE_TEXT; + uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type"); + + /* FULL WINDOW */ + xco= 25; + if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)"); + else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)"); + + + /* STD TEXT BUTTONS */ + if (!BPY_spacetext_is_pywin(st)) { + xco+= 2*XIC; + xco= std_libbuttons(block, xco, 0, NULL, B_TEXTBROWSE, (ID*)st->text, 0, &(st->menunr), 0, 0, B_TEXTDELETE, 0); + + /* + if (st->text) { + if (st->text->flags & TXT_ISDIRTY && (st->text->flags & TXT_ISEXT || !(st->text->flags & TXT_ISMEM))) + uiDefIconBut(block, BUT,0, ICON_ERROR, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "The text has been changed"); + if (st->text->flags & TXT_ISEXT) + uiDefBut(block, BUT,B_TEXTSTORE, ICON(), xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Store text in .blend file"); + else + uiDefBut(block, BUT,B_TEXTSTORE, ICON(), xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Don't store text in .blend file"); + xco+=10; + } + */ + + xco+=XIC; + if(st->font_id>1) st->font_id= 0; + uiDefButI(block, MENU, B_TEXTFONT, "Screen 12 %x0|Screen 15%x1", xco,0,100,YIC, &st->font_id, 0, 0, 0, 0, "Font display menu"); + xco+=100; + } + + /* always as last */ + curarea->headbutlen= xco+2*XIC; + + uiDrawBlock(block); +} + + + +/* ******************** TEXT ********************** */ +/* ******************** SOUND ********************** */ + +void load_space_sound(char *str) /* called from fileselect */ +{ + bSound *sound; + + sound= sound_new_sound(str); + if (sound) { + if (G.ssound) { + G.ssound->sound= sound; + } + } else { + error("Not a valid sample: %s", str); + } + + allqueue(REDRAWSOUND, 0); + allqueue(REDRAWBUTSGAME, 0); +} + + +void load_sound_buttons(char *str) /* called from fileselect */ +{ + bSound *sound; + + sound= sound_new_sound(str); + if (sound) { + if (curarea && curarea->spacetype==SPACE_BUTS) { + if (G.buts->mainb == BUTS_SOUND) { + G.buts->lockpoin = sound; + } + } + } else { + error("Not a valid sample: %s", str); + } + + allqueue(REDRAWBUTSSOUND, 0); +} + +void do_action_buttons(unsigned short event) +{ + View2D *v2d; + + switch(event){ +#ifdef __NLA_BAKE + case B_ACTBAKE: + bake_action_with_client (G.saction->action, OBACT, 0.01); + break; +#endif + case B_ACTCONT: + set_exprap_action(IPO_HORIZ); + break; +// case B_ACTEXTRAP: +// set_exprap_ipo(IPO_DIR); +// break; + case B_ACTCYCLIC: + set_exprap_action(IPO_CYCL); + break; +// case B_ACTCYCLICX: +// set_exprap_ipo(IPO_CYCLX); +// break; + case B_ACTHOME: + // Find X extents + v2d= &(G.saction->v2d); + +// v2d->cur.xmin = 0; + v2d->cur.ymin=-SCROLLB; + + if (!G.saction->action){ + v2d->cur.xmax=100; + } + else + { + v2d->cur.xmin=calc_action_start(G.saction->action)-1; + v2d->cur.xmax=calc_action_end(G.saction->action)+1; + } + + +// G.v2d->cur= G.v2d->tot; + test_view2d(G.v2d, curarea->winx, curarea->winy); + addqueue (curarea->win, REDRAW, 1); + break; + case B_ACTCOPY: + copy_posebuf(); + allqueue(REDRAWVIEW3D, 1); + break; + case B_ACTPASTE: + paste_posebuf(0); + allqueue(REDRAWVIEW3D, 1); + break; + case B_ACTPASTEFLIP: + paste_posebuf(1); + allqueue(REDRAWVIEW3D, 1); + break; + + case B_ACTPIN: /* __PINFAKE */ +/* if (G.saction->flag & SACTION_PIN){ + if (G.saction->action) + G.saction->action->id.us ++; + + } + else { + if (G.saction->action) + G.saction->action->id.us --; + } +*/ /* end PINFAKE */ + allqueue(REDRAWACTION, 1); + break; + + } +} + +void do_sound_buttons(unsigned short event) +{ + ID *id, *idtest; + int nr; + char name[256]; + + switch(event) { + + case B_SOUNDBROWSE: + if(G.ssound->sndnr== -2) { + activate_databrowse((ID *)G.ssound->sound, ID_SO, 0, B_SOUNDBROWSE, &G.ssound->sndnr, do_sound_buttons); + return; + } + if (G.ssound->sndnr < 0) break; + if (G.ssound->sndnr == 32766) { + if (G.ssound && G.ssound->sound) strcpy(name, G.ssound->sound->name); + else strcpy(name, U.sounddir); + activate_fileselect(FILE_SPECIAL, "SELECT WAV FILE", name, load_space_sound); + } else { + nr= 1; + id= (ID *)G.ssound->sound; + + idtest= G.main->sound.first; + while(idtest) { + if(nr==G.ssound->sndnr) { + break; + } + nr++; + idtest= idtest->next; + } + + if(idtest==0) { /* geen new */ + return; + } + + if(idtest!=id) { + G.ssound->sound= (bSound *)idtest; + if(idtest->us==0) idtest->us= 1; + allqueue(REDRAWSOUND, 0); + } + } + + break; + case B_SOUNDBROWSE2: + id = (ID *)G.buts->lockpoin; + if(G.buts->texnr == -2) { + activate_databrowse(id, ID_SO, 0, B_SOUNDBROWSE2, &G.buts->texnr, do_sound_buttons); + return; + } + if (G.buts->texnr < 0) break; + if (G.buts->texnr == 32766) { + if (id) strcpy(name, ((bSound *)id)->name); + else strcpy(name, U.sounddir); + activate_fileselect(FILE_SPECIAL, "SELECT WAV FILE", name, load_sound_buttons); + } else { + nr= 1; + + idtest= G.main->sound.first; + while (idtest) { + if(nr == G.buts->texnr) { + break; + } + nr++; + idtest = idtest->next; + } + + if (idtest == 0) { /* geen new */ + return; + } + + if (idtest != id) { + G.buts->lockpoin = (bSound *)idtest; + if(idtest->us==0) idtest->us= 1; + allqueue(REDRAWBUTSSOUND, 0); + BIF_preview_changed(G.buts); + } + } + + break; + case B_SOUNDHOME: + + G.v2d->cur= G.v2d->tot; + test_view2d(G.v2d, curarea->winx, curarea->winy); + scrarea_queue_winredraw(curarea); + break; + } +} + +void sound_buttons(void) +{ + uiBlock *block; + short xco; + char naam[256]; + char ch[20]; + + sprintf(naam, "header %d", curarea->headwin); + block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin); + uiBlockSetCol(block, BUTYELLOW); + + curarea->butspacetype= SPACE_SOUND; + uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type"); + + /* FULL WINDOW */ + xco= 25; + if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)"); + else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)"); + uiDefIconBut(block, BUT, B_SOUNDHOME, ICON_HOME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Home (HOMEKEY)"); + + xco= std_libbuttons(block, xco+40, 0, NULL, B_SOUNDBROWSE, (ID *)G.ssound->sound, 0, &(G.ssound->sndnr), 1, 0, 0, 0); + + if(G.ssound->sound) { + bSound *sound= G.ssound->sound; + + if (sound->sample && sound->sample->len) + { + if (sound->sample->channels == 1) + strcpy(ch, "Mono"); + else if (sound->sample->channels == 2) + strcpy(ch, "Stereo"); + else + strcpy(ch, "Unknown"); + + sprintf(naam, "Sample: %s, %d bit, %d Hz, %d samples", ch, sound->sample->bits, sound->sample->rate, sound->sample->len); + cpack(0x0); + glRasterPos2i(xco+10, 5); + BMF_DrawString(uiBlockGetCurFont(block), naam); + } + else + { + sprintf(naam, "No sample info available."); + cpack(0x0); + glRasterPos2i(xco+10, 5); + BMF_DrawString(uiBlockGetCurFont(block), naam); + } + + } + + /* always as last */ + curarea->headbutlen= xco+2*XIC; + + uiDrawBlock(block); +} + + +/* ******************** SOUND ********************** */ +/* ******************** IMAGE ********************** */ + +void load_space_image(char *str) /* aangeroepen vanuit fileselect */ +{ + Image *ima=0; + + if(G.obedit) { + error("Can't perfom this in editmode"); + return; + } + + ima= add_image(str); + if(ima) { + + G.sima->image= ima; + + free_image_buffers(ima); /* forceer opnieuw inlezen */ + ima->ok= 1; + image_changed(G.sima, 0); + + } + + allqueue(REDRAWIMAGE, 0); +} + +void image_replace(Image *old, Image *new) +{ + TFace *tface; + Mesh *me; + int a, rep=0; + + new->tpageflag= old->tpageflag; + new->twsta= old->twsta; + new->twend= old->twend; + new->xrep= old->xrep; + new->yrep= old->yrep; + + me= G.main->mesh.first; + while(me) { + + if(me->tface) { + tface= me->tface; + a= me->totface; + while(a--) { + if(tface->tpage==old) { + tface->tpage= new; + rep++; + } + tface++; + } + } + me= me->id.next; + + } + if(rep) { + if(new->id.us==0) new->id.us= 1; + } + else error("Nothing replaced"); +} + +void replace_space_image(char *str) /* aangeroepen vanuit fileselect */ +{ + Image *ima=0; + + if(G.obedit) { + error("Can't perfom this in editmode"); + return; + } + + ima= add_image(str); + if(ima) { + + if(G.sima->image != ima) { + image_replace(G.sima->image, ima); + } + + G.sima->image= ima; + + free_image_buffers(ima); /* forceer opnieuw inlezen */ + ima->ok= 1; + /* replace kent ook toe: */ + image_changed(G.sima, 0); + + } + allqueue(REDRAWIMAGE, 0); +} + +void save_paint(char *name) +{ + char str[FILE_MAXDIR+FILE_MAXFILE]; + Image *ima = G.sima->image; + ImBuf *ibuf; + + if (ima && ima->ibuf) { + BLI_strncpy(str, name, sizeof(str)); + + BLI_convertstringcode(str, G.sce, G.scene->r.cfra); + + if (saveover(str)) { + ibuf = IMB_dupImBuf(ima->ibuf); + + if (ibuf) { + if (BIF_write_ibuf(ibuf, str)) { + BLI_strncpy(ima->name, name, sizeof(ima->name)); + ima->ibuf->userflags &= ~IB_BITMAPDIRTY; + allqueue(REDRAWHEADERS, 0); + allqueue(REDRAWBUTSTEX, 0); + } else { + error("Couldn't write image: %s", str); + } + + IMB_freeImBuf(ibuf); + } + } + } +} + + +void do_image_buttons(unsigned short event) +{ + Image *ima; + ID *id, *idtest; + int nr; + char name[256], str[256]; + + if(curarea->win==0) return; + + switch(event) { + case B_SIMAGEHOME: + image_home(); + break; + + case B_SIMABROWSE: + if(G.sima->imanr== -2) { + activate_databrowse((ID *)G.sima->image, ID_IM, 0, B_SIMABROWSE, &G.sima->imanr, do_image_buttons); + return; + } + if(G.sima->imanr < 0) break; + + nr= 1; + id= (ID *)G.sima->image; + + idtest= G.main->image.first; + while(idtest) { + if(nr==G.sima->imanr) { + break; + } + nr++; + idtest= idtest->next; + } + if(idtest==0) { /* geen new */ + return; + } + + if(idtest!=id) { + G.sima->image= (Image *)idtest; + if(idtest->us==0) idtest->us= 1; + allqueue(REDRAWIMAGE, 0); + } + image_changed(G.sima, 0); /* ook als image gelijk is: assign! 0==geen tileflag */ + + break; + case B_SIMAGELOAD: + case B_SIMAGELOAD1: + + if(G.sima->image) strcpy(name, G.sima->image->name); + else strcpy(name, U.textudir); + + if(event==B_SIMAGELOAD) + activate_imageselect(FILE_SPECIAL, "SELECT IMAGE", name, load_space_image); + else + activate_fileselect(FILE_SPECIAL, "SELECT IMAGE", name, load_space_image); + break; + case B_SIMAGEREPLACE: + case B_SIMAGEREPLACE1: + + if(G.sima->image) strcpy(name, G.sima->image->name); + else strcpy(name, U.textudir); + + if(event==B_SIMAGEREPLACE) + activate_imageselect(FILE_SPECIAL, "REPLACE IMAGE", name, replace_space_image); + else + activate_fileselect(FILE_SPECIAL, "REPLACE IMAGE", name, replace_space_image); + break; + case B_SIMAGEDRAW: + + if(G.f & G_FACESELECT) { + make_repbind(G.sima->image); + image_changed(G.sima, 1); + } + allqueue(REDRAWVIEW3D, 0); + allqueue(REDRAWIMAGE, 0); + break; + + case B_SIMAGEDRAW1: + image_changed(G.sima, 2); /* 2: alleen tileflag */ + allqueue(REDRAWVIEW3D, 0); + allqueue(REDRAWIMAGE, 0); + break; + + case B_TWINANIM: + ima = G.sima->image; + if (ima) { + if(ima->flag & IMA_TWINANIM) { + nr= ima->xrep*ima->yrep; + if(ima->twsta>=nr) ima->twsta= 1; + if(ima->twend>=nr) ima->twend= nr-1; + if(ima->twsta>ima->twend) ima->twsta= 1; + allqueue(REDRAWIMAGE, 0); + } + } + break; + + case B_CLIP_UV: + tface_do_clip(); + allqueue(REDRAWIMAGE, 0); + allqueue(REDRAWVIEW3D, 0); + break; + + case B_SIMAGEPAINTTOOL: + // check for packed file here + allqueue(REDRAWIMAGE, 0); + allqueue(REDRAWVIEW3D, 0); + break; + case B_SIMAPACKIMA: + ima = G.sima->image; + if (ima) { + if (ima->packedfile) { + if (G.fileflags & G_AUTOPACK) { + if (okee("Disable AutoPack ?")) { + G.fileflags &= ~G_AUTOPACK; + } + } + + if ((G.fileflags & G_AUTOPACK) == 0) { + unpackImage(ima, PF_ASK); + } + } else { + if (ima->ibuf && (ima->ibuf->userflags & IB_BITMAPDIRTY)) { + error("Can't pack painted image. Save image first."); + } else { + ima->packedfile = newPackedFile(ima->name); + } + } + allqueue(REDRAWBUTSTEX, 0); + allqueue(REDRAWHEADERS, 0); + } + break; + case B_SIMAGESAVE: + ima = G.sima->image; + if (ima) { + strcpy(name, ima->name); + if (ima->ibuf) { + save_image_filesel_str(str); + activate_fileselect(FILE_SPECIAL, str, name, save_paint); + } + } + break; + } +} + +/* This should not be a stack var! */ +static int headerbuttons_packdummy; +void image_buttons(void) +{ + uiBlock *block; + short xco; + char naam[256]; + headerbuttons_packdummy = 0; + + sprintf(naam, "header %d", curarea->headwin); + block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin); + uiBlockSetCol(block, BUTBLUE); + + what_image(G.sima); + + curarea->butspacetype= SPACE_IMAGE; + uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type "); + + /* FULL WINDOW */ + xco= 25; + if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Restore smaller windows (CTRL+Up arrow)"); + else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Make fullscreen window (CTRL+Down arrow)"); + + /* HOME*/ + uiDefIconBut(block, BUT, B_SIMAGEHOME, ICON_HOME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Home (HOMEKEY)"); + uiDefIconButS(block, TOG|BIT|0, B_BE_SQUARE, ICON_KEEPRECT, xco+=XIC,0,XIC,YIC, &G.sima->flag, 0, 0, 0, 0, "Keep UV polygons square while editing"); + uiDefIconButS(block, ICONTOG|BIT|2, B_CLIP_UV, ICON_CLIPUV_DEHLT,xco+=XIC,0,XIC,YIC, &G.sima->flag, 0, 0, 0, 0, "Clip UV with image size"); + + xco= std_libbuttons(block, xco+40, 0, NULL, B_SIMABROWSE, (ID *)G.sima->image, 0, &(G.sima->imanr), 0, 0, B_IMAGEDELETE, 0); + + if (G.sima->image) { + if (G.sima->image->packedfile) { + headerbuttons_packdummy = 1; + } + uiDefIconButI(block, TOG|BIT|0, B_SIMAPACKIMA, ICON_PACKAGE, xco,0,XIC,YIC, &headerbuttons_packdummy, 0, 0, 0, 0, "Pack/Unpack this Image"); + xco += XIC; + } + + uiBlockSetCol(block, BUTSALMON); + uiDefBut(block, BUT, B_SIMAGELOAD, "Load", xco+=XIC,0,2*XIC,YIC, 0, 0, 0, 0, 0, "Load image - thumbnail view"); + + uiBlockSetCol(block, BUTGREY); + uiDefBut(block, BUT, B_SIMAGELOAD1, "", (short)(xco+=2*XIC+2),0,10,YIC, 0, 0, 0, 0, 0, "Load image - file select view"); + xco+=XIC/2; + + if (G.sima->image) { + uiBlockSetCol(block, BUTSALMON); + uiDefBut(block, BUT, B_SIMAGEREPLACE, "Replace",xco+=XIC,0,(short)(3*XIC),YIC, 0, 0, 0, 0, 0, "Replace current image - thumbnail view"); + + uiBlockSetCol(block, BUTGREY); + uiDefBut(block, BUT, B_SIMAGEREPLACE1, "", (short)(xco+=3*XIC+2),0,10,YIC, 0, 0, 0, 0, 0, "Replace current image - file select view"); + xco+=XIC/2; + + uiDefIconButS(block, TOG|BIT|4, 0, ICON_ENVMAP, xco+=XIC,0,XIC,YIC, &G.sima->image->flag, 0, 0, 0, 0, "Use this image as a reflection map (UV coordinates are ignored)"); + xco+=XIC/2; + + uiDefIconButS(block, TOG|BIT|0, B_SIMAGEDRAW1, ICON_GRID, xco+=XIC,0,XIC,YIC, &G.sima->image->flag, 0, 0, 0, 0, ""); + uiDefButS(block, NUM, B_SIMAGEDRAW, "", xco+=XIC,0,XIC,YIC, &G.sima->image->xrep, 1.0, 16.0, 0, 0, ""); + uiDefButS(block, NUM, B_SIMAGEDRAW, "", xco+=XIC,0,XIC,YIC, &G.sima->image->yrep, 1.0, 16.0, 0, 0, ""); + + uiDefButS(block, TOG|BIT|1, B_TWINANIM, "Anim", xco+=XIC,0,(short)(2*XIC),YIC, &G.sima->image->tpageflag, 0, 0, 0, 0, ""); + uiDefButS(block, NUM, B_TWINANIM, "", (short)(xco+=2*XIC),0,XIC,YIC, &G.sima->image->twsta, 0.0, 128.0, 0, 0, ""); + uiDefButS(block, NUM, B_TWINANIM, "", xco+=XIC,0,XIC,YIC, &G.sima->image->twend, 0.0, 128.0, 0, 0, ""); +// uiDefButS(block, TOG|BIT|2, 0, "Cycle", xco+=XIC,0,2*XIC,YIC, &G.sima->image->tpageflag, 0, 0, 0, 0, ""); + uiDefButS(block, NUM, 0, "Speed", xco+=(2*XIC),0,4*XIC,YIC, &G.sima->image->animspeed, 1.0, 100.0, 0, 0, "Speed of the animation in frames per second"); + +#ifdef NAN_TPT + xco+= 4*XIC; + uiDefIconButS(block, ICONTOG|BIT|3, B_SIMAGEPAINTTOOL, ICON_TPAINT_DEHLT, xco+=XIC,0,XIC,YIC, &G.sima->flag, 0, 0, 0, 0, "TexturePaint Mode"); + if (G.sima->image && G.sima->image->ibuf && (G.sima->image->ibuf->userflags & IB_BITMAPDIRTY)) { + uiDefBut(block, BUT, B_SIMAGESAVE, "Save", xco+=XIC,0,2*XIC,YIC, 0, 0, 0, 0, 0, "Save image"); + xco += XIC; + } +#endif /* NAN_TPT */ + xco+= XIC; + } + + /* draw LOCK */ + xco+= XIC/2; + uiDefIconButS(block, ICONTOG, 0, ICON_UNLOCKED, (short)(xco+=XIC),0,XIC,YIC, &(G.sima->lock), 0, 0, 0, 0, "Lock redraw of other windows while editing"); + + + /* Always do this last */ + curarea->headbutlen= xco+2*XIC; + + uiDrawBlock(block); +} + + +/* ********************** IMAGE ****************************** */ +/* ******************** IMASEL ********************** */ + +void do_imasel_buttons(short event) +{ + SpaceImaSel *simasel; + char name[256]; + + simasel= curarea->spacedata.first; + + if(curarea->win==0) return; + + switch(event) { + case B_IMASELHOME: + break; + + case B_IMASELREMOVEBIP: + + if(bitset(simasel->fase, IMS_FOUND_BIP)){ + + strcpy(name, simasel->dir); + strcat(name, ".Bpib"); + + remove(name); + + simasel->fase &= ~ IMS_FOUND_BIP; + } + break; + } +} + +void imasel_buttons(void) +{ + SpaceImaSel *simasel; + uiBlock *block; + short xco; + char naam[256]; + + simasel= curarea->spacedata.first; + + sprintf(naam, "header %d", curarea->headwin); + block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSSX, UI_HELV, curarea->headwin); + uiBlockSetCol(block, BUTBLUE); + + curarea->butspacetype= SPACE_IMASEL; + uiDefIconButC(block, ICONROW,B_NEWSPACE, ICON_VIEW3D, 6,0,XIC,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Current window type"); + + /* FULL WINDOW */ + xco= 25; + if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, ""); + else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, ""); + + xco+=XIC; + if (simasel->title){ + xco+=25; + glRasterPos2i(xco, 4); + BMF_DrawString(G.font, simasel->title); + xco+=BMF_GetStringWidth(G.fonts, simasel->title); + xco+=25; + } + uiDefIconBut(block, BUT, B_IMASELREMOVEBIP, ICON_BPIBFOLDER_X, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "");/* remove */ + + uiDefIconButS(block, TOG|BIT|0, B_REDR, ICON_BPIBFOLDERGREY, xco+=XIC,0,XIC,YIC, &simasel->mode, 0, 0, 0, 0, "");/* dir */ + uiDefIconButS(block, TOG|BIT|1, B_REDR, ICON_INFO, xco+=XIC,0,XIC,YIC, &simasel->mode, 0, 0, 0, 0, "");/* info */ + uiDefIconButS(block, TOG|BIT|2, B_REDR, ICON_IMAGE_COL, xco+=XIC,0,XIC,YIC, &simasel->mode, 0, 0, 0, 0, "");/* image */ + uiDefIconButS(block, TOG|BIT|3, B_REDR, ICON_MAGNIFY, xco+=XIC,0,XIC,YIC, &simasel->mode, 0, 0, 0, 0, "");/* loep */ + + /* altijd als laatste doen */ + curarea->headbutlen= xco+2*XIC; + + uiDrawBlock(block); +} + +/* ********************** IMASEL ****************************** */ + +/* ******************** ALGEMEEN ********************** */ + +void do_headerbuttons(short event) +{ + + if(event<=50) do_global_buttons2(event); + else if(event<=100) do_global_buttons(event); + else if(event<200) do_view3d_buttons(event); + else if(event<250) do_ipo_buttons(event); + else if(event<300) do_oops_buttons(event); + else if(event<350) do_info_buttons(event); + else if(event<400) do_image_buttons(event); + else if(event<450) do_buts_buttons(event); + else if(event<500) do_imasel_buttons(event); + else if(event<550) do_text_buttons(event); + else if(event<600) do_file_buttons(event); + else if(event<650) do_seq_buttons(event); + else if(event<700) do_sound_buttons(event); + else if(event<800) do_action_buttons(event); + else if(event<900) do_nla_buttons(event); +} + |