uiBlockBeginAlign(block, 'v'); 'v'= vertical. 'h'=horizontal ..... (button def calls) uiBlockEndAlign(block); this will allow new themes to have buttons nicely drawn together. - added new rounded draw theme, to test & illustrate the above. - only did parts of button code with align... rest for later - fixed 'minimal' theme to make it usable (with some decoration) - put back 'oldskool' theme... but it just looks plain ugly! remove? Lazy people: http://www.blender.org/bf/rt.jpg check the top header, or Nkey menu, to see the meaning of 'align'.
478 lines
14 KiB
C
478 lines
14 KiB
C
/**
|
|
* header_buttonswin.c oct-2003
|
|
*
|
|
* Functions to draw the "Buttons Window" window header
|
|
* and handle user events sent to it.
|
|
*
|
|
* $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 <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include <config.h>
|
|
#endif
|
|
|
|
#ifdef WIN32
|
|
#include "BLI_winstuff.h"
|
|
#endif
|
|
|
|
#include "BMF_Api.h"
|
|
#include "BIF_language.h"
|
|
#ifdef INTERNATIONAL
|
|
#include "FTF_Api.h"
|
|
#endif
|
|
|
|
#include "DNA_ID.h"
|
|
#include "DNA_armature_types.h"
|
|
#include "DNA_lamp_types.h"
|
|
#include "DNA_material_types.h"
|
|
#include "DNA_object_types.h"
|
|
#include "DNA_scene_types.h"
|
|
#include "DNA_screen_types.h"
|
|
#include "DNA_space_types.h"
|
|
#include "DNA_texture_types.h"
|
|
#include "DNA_world_types.h"
|
|
|
|
#include "BIF_editconstraint.h"
|
|
#include "BIF_interface.h"
|
|
#include "BIF_previewrender.h"
|
|
#include "BIF_resources.h"
|
|
#include "BIF_screen.h"
|
|
#include "BIF_space.h"
|
|
#include "BIF_butspace.h"
|
|
|
|
#include "BKE_armature.h"
|
|
#include "BKE_global.h"
|
|
#include "BKE_library.h"
|
|
#include "BKE_main.h"
|
|
#include "BKE_material.h"
|
|
#include "BKE_texture.h"
|
|
#include "BKE_utildefines.h"
|
|
#include "BSE_drawipo.h"
|
|
#include "BSE_headerbuttons.h"
|
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
#include "blendef.h"
|
|
#include "mydevice.h"
|
|
#include "butspace.h"
|
|
|
|
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;
|
|
float dx, dy;
|
|
if(curarea->win==0) return;
|
|
|
|
switch(event) {
|
|
case B_BUTSHOME:
|
|
uiSetPanel_view2d(curarea);
|
|
G.v2d->cur= G.v2d->tot;
|
|
test_view2d(G.v2d, curarea->winx, curarea->winy);
|
|
|
|
/* we always put in left/top */
|
|
dy= G.v2d->tot.ymax - G.v2d->cur.ymax;
|
|
G.v2d->cur.ymin += dy;
|
|
G.v2d->cur.ymax += dy;
|
|
dx= G.v2d->tot.xmin - G.v2d->cur.xmin;
|
|
G.v2d->cur.xmin += dx;
|
|
G.v2d->cur.xmax += dx;
|
|
|
|
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;
|
|
/* free current 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= NULL;
|
|
*idfrom= (ID *)ob;
|
|
|
|
if(G.buts->mainb==CONTEXT_SCENE) {
|
|
int tab= G.buts->tab[CONTEXT_SCENE];
|
|
|
|
if(tab==TAB_SCENE_RENDER) *id= (ID *)G.scene;
|
|
else if(tab==TAB_SCENE_SOUND) {
|
|
ID *search;
|
|
|
|
// validate lockpoin, maybe its not a sound
|
|
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;
|
|
}
|
|
|
|
}
|
|
}
|
|
else if(G.buts->mainb==CONTEXT_SHADING) {
|
|
int tab= G.buts->tab[CONTEXT_SHADING];
|
|
|
|
if(tab==TAB_SHADING_LAMP) {
|
|
if(ob && ob->type==OB_LAMP) {
|
|
*id= ob->data;
|
|
}
|
|
}
|
|
else if(tab==TAB_SHADING_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(tab==TAB_SHADING_WORLD) {
|
|
*id= (ID *)G.scene->world;
|
|
*idfrom= (ID *)G.scene;
|
|
}
|
|
else if(tab==TAB_SHADING_TEX) {
|
|
MTex *mtex;
|
|
|
|
if(G.buts->mainbo==G.buts->mainb && G.buts->tabo!=tab) {
|
|
if(G.buts->tabo==TAB_SHADING_LAMP) G.buts->texfrom= 2;
|
|
else if(G.buts->tabo==TAB_SHADING_WORLD) G.buts->texfrom= 1;
|
|
else if(G.buts->tabo==TAB_SHADING_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(G.buts->mainb==CONTEXT_OBJECT || G.buts->mainb==CONTEXT_LOGIC) {
|
|
if(ob) {
|
|
*idfrom= (ID *)G.scene;
|
|
*id= (ID *)ob;
|
|
}
|
|
}
|
|
else if(G.buts->mainb==CONTEXT_EDITING) {
|
|
if(ob && ob->data) {
|
|
*id= ob->data;
|
|
}
|
|
}
|
|
}
|
|
|
|
#if 0
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
|
|
static uiBlock *sbuts_context_menu(void *arg_unused)
|
|
{
|
|
uiBlock *block;
|
|
short yco = 0;
|
|
|
|
block= uiNewBlock(&curarea->uiblocks, "context_options", UI_EMBOSSP, UI_HELV, curarea->headwin);
|
|
|
|
/* should be branches from tree */
|
|
uiDefIconTextButS(block, BUTM, B_REDR, ICON_SCENE_DEHLT, "Scene|F10", 0, yco-=22, 100, 20, &G.buts->mainb, 0.0, 0.0, 0, 0, "");
|
|
uiDefIconTextButS(block, BUTM, B_REDR, ICON_EDIT, "Editing|F9", 0, yco-=22, 100, 20, &G.buts->mainb, 4.0, 0.0, 0, 0, "");
|
|
uiDefIconTextButS(block, BUTM, B_REDR, ICON_OBJECT, "Object|F6", 0, yco-=22, 100, 20, &G.buts->mainb, 1.0, 0.0, 0, 0, "");
|
|
uiDefIconTextButS(block, BUTM, B_REDR, ICON_MATERIAL_DEHLT, "Shading|F5", 0, yco-=22, 100, 20, &G.buts->mainb, 3.0, 0.0, 0, 0, "");
|
|
uiDefIconTextButS(block, BUTM, B_REDR, ICON_GAME, "Logic|F4", 0, yco-=22, 100, 20, &G.buts->mainb, 6.0, 0.0, 0, 0, "");
|
|
uiDefIconTextButS(block, BUTM, B_REDR, ICON_SCRIPT, "Script", 0, yco-=22, 100, 20, &G.buts->mainb, 5.0, 0.0, 0, 0, "");
|
|
|
|
if(curarea->headertype==HEADERTOP) {
|
|
uiBlockSetDirection(block, UI_DOWN);
|
|
}
|
|
else {
|
|
uiBlockSetDirection(block, UI_TOP);
|
|
uiBlockFlipOrder(block);
|
|
}
|
|
|
|
return block;
|
|
}
|
|
#endif
|
|
|
|
void buts_buttons(void)
|
|
{
|
|
uiBlock *block;
|
|
ID *id, *idfrom;
|
|
short xco, t_base= 0;
|
|
char naam[20];
|
|
|
|
sprintf(naam, "header %d", curarea->headwin);
|
|
block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSS, UI_HELV, curarea->headwin);
|
|
|
|
if(area_is_active_area(curarea)) uiBlockSetCol(block, TH_HEADER);
|
|
else uiBlockSetCol(block, TH_HEADERDESEL);
|
|
|
|
curarea->butspacetype= SPACE_BUTS;
|
|
|
|
xco = 8;
|
|
|
|
uiDefIconTextButC(block, ICONTEXTROW,B_NEWSPACE, ICON_VIEW3D, windowtype_pup(), xco,0,XIC+10,YIC, &(curarea->butspacetype), 1.0, SPACEICONMAX, 0, 0, "Displays Current Window Type. Click for menu of available types.");
|
|
|
|
xco+= XIC+22;
|
|
|
|
/* FULL WINDOW */
|
|
if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Returns to multiple views window (CTRL+Up arrow)");
|
|
else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Makes current window full screen (CTRL+Down arrow)");
|
|
|
|
/* HOME */
|
|
uiDefIconBut(block, BUT, B_BUTSHOME, ICON_HOME, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Zooms window to home view showing all items (HOMEKEY)");
|
|
xco+=XIC;
|
|
|
|
/* mainb menu */
|
|
/* (this could be done later with a dynamic tree and branches, also for python) */
|
|
//{
|
|
// char mainbname[8][12]= {" Scene", " Object", " Types", " Shading", " Editing", " Script", " Logic"};
|
|
// char mainbicon[8]= {ICON_SCENE_DEHLT, ICON_OBJECT, ICON_BBOX, ICON_MATERIAL_DEHLT, ICON_EDIT, ICON_SCRIPT, ICON_GAME};
|
|
// uiBut *but= uiDefIconTextBlockBut(block, sbuts_context_menu, NULL, mainbicon[G.buts->mainb], mainbname[G.buts->mainb], xco, 0, 90, YIC, "Set main context for button panels");
|
|
// uiButClearFlag(but, UI_ICON_RIGHT); // this type has both flags set, and draws icon right.. uhh
|
|
// xco+= 90-XIC+10;
|
|
//}
|
|
uiBlockBeginAlign(block, 'h');
|
|
uiDefIconButS(block, ROW, B_REDR, ICON_GAME, xco+=XIC, 0, XIC, YIC, &(G.buts->mainb), 0.0, (float)CONTEXT_LOGIC, 0, 0, "Logic (F4) ");
|
|
uiDefIconButS(block, ROW, B_REDR, ICON_SCRIPT, xco+=XIC, 0, XIC, YIC, &(G.buts->mainb), 0.0, (float)CONTEXT_SCRIPT, 0, 0, "Script ");
|
|
uiDefIconButS(block, ROW, B_REDR, ICON_MATERIAL_DEHLT,xco+=XIC, 0, XIC, YIC, &(G.buts->mainb), 0.0, (float)CONTEXT_SHADING, 0, 0, "Shading (F5) ");
|
|
uiDefIconButS(block, ROW, B_REDR, ICON_OBJECT, xco+=XIC, 0, XIC, YIC, &(G.buts->mainb), 0.0, (float)CONTEXT_OBJECT, 0, 0, "Object (F7) ");
|
|
uiDefIconButS(block, ROW, B_REDR, ICON_EDIT, xco+=XIC, 0, XIC, YIC, &(G.buts->mainb), 0.0, (float)CONTEXT_EDITING, 0, 0, "Editing (F9) ");
|
|
uiDefIconButS(block, ROW, B_REDR, ICON_SCENE_DEHLT, xco+=XIC, 0, XIC, YIC, &(G.buts->mainb), 0.0, (float)CONTEXT_SCENE, 0, 0, "Scene (F10) ");
|
|
xco+=XIC;
|
|
|
|
// if(curarea->headertype==HEADERTOP) t_base= -3; else t_base= 4;
|
|
|
|
/* select the context to be drawn, per contex/tab the actual context is tested */
|
|
uiBlockSetEmboss(block, UI_EMBOSS); // normal
|
|
switch(G.buts->mainb) {
|
|
case CONTEXT_SCENE:
|
|
uiBlockBeginAlign(block, 'h');
|
|
uiDefIconButC(block, ROW, B_REDR, ICON_SCENE, xco+=XIC, t_base, XIC, YIC, &(G.buts->tab[CONTEXT_SCENE]), 1.0, (float)TAB_SCENE_RENDER, 0, 0, "Render buttons ");
|
|
uiDefIconButC(block, ROW, B_REDR, ICON_ANIM, xco+=XIC, t_base, XIC, YIC, &(G.buts->tab[CONTEXT_SCENE]), 1.0, (float)TAB_SCENE_ANIM, 0, 0, "Anim/playback buttons");
|
|
uiDefIconButC(block, ROW, B_REDR, ICON_SOUND, xco+=XIC, t_base, XIC, YIC, &(G.buts->tab[CONTEXT_SCENE]), 1.0, (float)TAB_SCENE_SOUND, 0, 0, "Sound block buttons");
|
|
|
|
break;
|
|
case CONTEXT_OBJECT:
|
|
|
|
break;
|
|
case CONTEXT_SHADING:
|
|
uiBlockBeginAlign(block, 'h');
|
|
uiDefIconButC(block, ROW, B_BUTSPREVIEW, ICON_LAMP, xco+=XIC, t_base, XIC, YIC, &(G.buts->tab[CONTEXT_SHADING]), 1.0, (float)TAB_SHADING_LAMP, 0, 0, "Lamp buttons");
|
|
uiDefIconButC(block, ROW, B_BUTSPREVIEW, ICON_MATERIAL, xco+=XIC, t_base, XIC, YIC, &(G.buts->tab[CONTEXT_SHADING]), 1.0, (float)TAB_SHADING_MAT, 0, 0, "Material buttons");
|
|
uiDefIconButC(block, ROW, B_BUTSPREVIEW, ICON_TEXTURE, xco+=XIC, t_base, XIC, YIC, &(G.buts->tab[CONTEXT_SHADING]), 1.0, (float)TAB_SHADING_TEX, 0, 0, "Texture buttons");
|
|
uiDefIconButC(block, ROW, B_REDR, ICON_RADIO,xco+=XIC, t_base, XIC, YIC, &(G.buts->tab[CONTEXT_SHADING]), 1.0, (float)TAB_SHADING_RAD, 0, 0, "Radiosity buttons");
|
|
uiDefIconButC(block, ROW, B_BUTSPREVIEW, ICON_WORLD, xco+=XIC, t_base, XIC, YIC, &(G.buts->tab[CONTEXT_SHADING]), 1.0, (float)TAB_SHADING_WORLD, 0, 0, "World buttons");
|
|
|
|
break;
|
|
case CONTEXT_EDITING:
|
|
|
|
break;
|
|
case CONTEXT_SCRIPT:
|
|
|
|
break;
|
|
case CONTEXT_LOGIC:
|
|
|
|
break;
|
|
}
|
|
|
|
uiBlockEndAlign(block);
|
|
|
|
xco+=XIC;
|
|
uiDefButS(block, NUM, B_NEWFRAME, "", (short)(xco+20),0,60,YIC, &(G.scene->r.cfra), 1.0, 18000.0, 0, 0, "Displays Current Frame of animation. Click to change.");
|
|
xco+= 80;
|
|
|
|
buttons_active_id(&id, &idfrom);
|
|
G.buts->lockpoin= id;
|
|
|
|
/* always do as last */
|
|
uiDrawBlock(block);
|
|
curarea->headbutlen= xco;
|
|
}
|