This repository has been archived on 2023-10-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-archive/source/blender/src/headerbuttons.c
Kent Mein cd4a60f536 sgefants patch to remove the License Key stuff.
(I noticed its not completely gone yet from the blender/source dir)
But its a big step in the right direction if it doesn't enable
all of the functionatlity already...

(Using cscope for LICENSE_KEY_VALID still turns up some stuff)

Kent
--
mein@cs.umn.edu
2002-12-06 19:48:37 +00:00

5574 lines
150 KiB
C

/**
* $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 HAVE_CONFIG_H
#include <config.h>
#endif
#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"
/* 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"
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:
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)
{
struct twostrings twostrings;
twostrings.outname = str;
twostrings.exename = "blenderdynplayer.exe";
make_beautiful_animation((void *) &twostrings);
}
static void write_runtime_check(char *str)
{
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
make_beautiful_animation((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");
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);
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, 1.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_NONE2, 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);
}