Checked every instance of testbase to see this dosnt break anything, also changed TESTBASE and TESTBASELIB, both were used incorrectly in places. added error_libdata() for library error messages that are everywhere. added object_data_is_libdata to test if the object and its data's are from a library. fixed 2 crashs in adding Curve points to a library object (remember to check, verify_ipocurve returns NULL!) made duplicating and making dupli's real for lib objects possible, disabled joining into lib armatures and meshes.
1339 lines
38 KiB
C
1339 lines
38 KiB
C
/**
|
|
* header_ipo.c oct-2003
|
|
*
|
|
* Functions to draw the "Ipo Curve Editor" 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>
|
|
#include <stdio.h>
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include <config.h>
|
|
#endif
|
|
|
|
#include "DNA_action_types.h"
|
|
#include "DNA_camera_types.h"
|
|
#include "DNA_curve_types.h"
|
|
#include "DNA_constraint_types.h"
|
|
#include "DNA_ID.h"
|
|
#include "DNA_ipo_types.h"
|
|
#include "DNA_key_types.h"
|
|
#include "DNA_lamp_types.h"
|
|
#include "DNA_material_types.h"
|
|
#include "DNA_object_types.h"
|
|
#include "DNA_object_fluidsim.h"
|
|
#include "DNA_scene_types.h"
|
|
#include "DNA_screen_types.h"
|
|
#include "DNA_texture_types.h"
|
|
#include "DNA_space_types.h"
|
|
#include "DNA_sequence_types.h"
|
|
#include "DNA_sound_types.h"
|
|
#include "DNA_world_types.h"
|
|
|
|
#include "BKE_action.h"
|
|
#include "BKE_constraint.h"
|
|
#include "BKE_global.h"
|
|
#include "BKE_ipo.h"
|
|
#include "BKE_key.h"
|
|
#include "BKE_main.h"
|
|
#include "BKE_material.h"
|
|
#include "BKE_texture.h"
|
|
#include "BKE_utildefines.h"
|
|
|
|
#include "BLI_blenlib.h"
|
|
|
|
#include "BSE_drawipo.h"
|
|
#include "BSE_editipo_types.h"
|
|
#include "BSE_edit.h"
|
|
#include "BSE_editipo.h"
|
|
#include "BSE_headerbuttons.h"
|
|
#include "BSE_time.h"
|
|
|
|
#include "BIF_editaction.h"
|
|
#include "BIF_interface.h"
|
|
#include "BIF_mainqueue.h"
|
|
#include "BIF_resources.h"
|
|
#include "BIF_screen.h"
|
|
#include "BIF_space.h"
|
|
#include "BIF_toolbox.h"
|
|
|
|
#include "nla.h"
|
|
|
|
#include "blendef.h"
|
|
#include "mydevice.h"
|
|
|
|
static int viewmovetemp = 0;
|
|
extern int totipo_edit, totipo_sel;
|
|
|
|
/* headerbutton call, assuming full context is set */
|
|
/* it aligns with editipo.c, verify_ipo */
|
|
void spaceipo_assign_ipo(SpaceIpo *si, Ipo *ipo)
|
|
{
|
|
if(si->from==NULL || si->from->lib) return;
|
|
|
|
if(ipo) ipo->id.us++;
|
|
|
|
/* first check action ipos */
|
|
if(si->actname && si->actname[0]) {
|
|
Object *ob= (Object *)si->from;
|
|
bActionChannel *achan;
|
|
|
|
if(ob->action) {
|
|
achan= verify_action_channel(ob->action, si->actname);
|
|
|
|
if(achan) {
|
|
/* constraint exception */
|
|
if(si->blocktype==ID_CO) {
|
|
bConstraintChannel *conchan= get_constraint_channel(&achan->constraintChannels, si->constname);
|
|
if(conchan) {
|
|
if(conchan->ipo)
|
|
conchan->ipo->id.us--;
|
|
conchan->ipo= ipo;
|
|
}
|
|
}
|
|
else {
|
|
if(achan->ipo)
|
|
achan->ipo->id.us--;
|
|
achan->ipo= ipo;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
switch(GS(si->from->name)) {
|
|
case ID_OB:
|
|
{
|
|
Object *ob= (Object *)si->from;
|
|
/* constraint exception */
|
|
if(si->blocktype==ID_CO) {
|
|
bConstraintChannel *conchan= get_constraint_channel(&ob->constraintChannels, si->constname);
|
|
if(conchan) {
|
|
if(conchan->ipo)
|
|
conchan->ipo->id.us--;
|
|
conchan->ipo= ipo;
|
|
}
|
|
}
|
|
else if(si->blocktype==ID_FLUIDSIM) { // NT
|
|
if( (ob->fluidsimSettings) &&
|
|
(ob->fluidsimSettings->ipo) ) {
|
|
// decrement users counter
|
|
ob->fluidsimSettings->ipo->id.us--;
|
|
}
|
|
ob->fluidsimSettings->ipo = ipo;
|
|
}
|
|
else if(si->blocktype==ID_OB) {
|
|
if(ob->ipo)
|
|
ob->ipo->id.us--;
|
|
ob->ipo= ipo;
|
|
}
|
|
}
|
|
break;
|
|
case ID_MA:
|
|
{
|
|
Material *ma= (Material *)si->from;
|
|
|
|
if(ma->ipo)
|
|
ma->ipo->id.us--;
|
|
ma->ipo= ipo;
|
|
}
|
|
break;
|
|
case ID_TE:
|
|
{
|
|
Tex *tex= (Tex *)si->from;
|
|
|
|
if(tex->ipo)
|
|
tex->ipo->id.us--;
|
|
tex->ipo= ipo;
|
|
}
|
|
break;
|
|
case ID_SEQ:
|
|
{
|
|
Sequence *seq= (Sequence *)si->from; /* note, sequence is mimicing Id */
|
|
|
|
if((seq->type & SEQ_EFFECT)
|
|
|| (seq->type == SEQ_RAM_SOUND)
|
|
|| (seq->type == SEQ_HD_SOUND)) {
|
|
if(seq->ipo)
|
|
seq->ipo->id.us--;
|
|
seq->ipo= ipo;
|
|
}
|
|
}
|
|
break;
|
|
case ID_CU:
|
|
{
|
|
Curve *cu= (Curve *)si->from;
|
|
|
|
if(cu->ipo)
|
|
cu->ipo->id.us--;
|
|
cu->ipo= ipo;
|
|
}
|
|
break;
|
|
case ID_KE:
|
|
{
|
|
Key *key= (Key *)si->from;
|
|
|
|
if(key->ipo)
|
|
key->ipo->id.us--;
|
|
key->ipo= ipo;
|
|
}
|
|
break;
|
|
case ID_WO:
|
|
{
|
|
World *wo= (World *)si->from;
|
|
|
|
if(wo->ipo)
|
|
wo->ipo->id.us--;
|
|
wo->ipo= ipo;
|
|
}
|
|
break;
|
|
case ID_LA:
|
|
{
|
|
Lamp *la= (Lamp *)si->from;
|
|
|
|
if(la->ipo)
|
|
la->ipo->id.us--;
|
|
la->ipo= ipo;
|
|
}
|
|
break;
|
|
case ID_CA:
|
|
{
|
|
Camera *ca= (Camera *)si->from;
|
|
|
|
if(ca->ipo)
|
|
ca->ipo->id.us--;
|
|
ca->ipo= ipo;
|
|
}
|
|
break;
|
|
case ID_SO:
|
|
{
|
|
bSound *snd= (bSound *)si->from;
|
|
|
|
if(snd->ipo)
|
|
snd->ipo->id.us--;
|
|
snd->ipo= ipo;
|
|
}
|
|
}
|
|
}
|
|
|
|
allqueue(REDRAWVIEW3D, 0);
|
|
allqueue(REDRAWIPO, 0);
|
|
allqueue(REDRAWACTION, 0);
|
|
allqueue(REDRAWNLA, 0);
|
|
allqueue(REDRAWBUTSALL, 0);
|
|
|
|
}
|
|
|
|
|
|
static void do_ipo_editmenu_transformmenu(void *arg, int event)
|
|
{
|
|
switch(event)
|
|
{
|
|
case 0: /* grab/move */
|
|
transform_ipo('g');
|
|
break;
|
|
case 1: /* scale */
|
|
transform_ipo('s');
|
|
break;
|
|
}
|
|
}
|
|
|
|
static uiBlock *ipo_editmenu_transformmenu(void *arg_unused)
|
|
{
|
|
uiBlock *block;
|
|
short yco= 0, menuwidth=120;
|
|
|
|
block= uiNewBlock(&curarea->uiblocks, "ipo_editmenu_transformmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
|
|
uiBlockSetButmFunc(block, do_ipo_editmenu_transformmenu, NULL);
|
|
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move|G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale|S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
|
|
|
|
uiBlockSetDirection(block, UI_RIGHT);
|
|
uiTextBoundsBlock(block, 60);
|
|
|
|
return block;
|
|
}
|
|
|
|
static void do_ipo_editmenu_snapmenu(void *arg, int event)
|
|
{
|
|
switch(event) {
|
|
case 1: /* Horizontal */
|
|
case 2: /* To Next */
|
|
case 3: /* To Frame */
|
|
case 4: /* To Current Frame */
|
|
ipo_snap(event);
|
|
break;
|
|
}
|
|
allqueue(REDRAWVIEW3D, 0);
|
|
}
|
|
|
|
static uiBlock *ipo_editmenu_snapmenu(void *arg_unused)
|
|
{
|
|
uiBlock *block;
|
|
short yco = 20, menuwidth = 120;
|
|
|
|
block= uiNewBlock(&curarea->uiblocks, "ipo_editmenu_snapmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
|
|
uiBlockSetButmFunc(block, do_ipo_editmenu_snapmenu, NULL);
|
|
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Horizontal|Shift S, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "To Next|Shift S, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "To Frame|Shift S, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "To Current Frame|Shift S, 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
|
|
|
|
uiBlockSetDirection(block, UI_RIGHT);
|
|
uiTextBoundsBlock(block, 60);
|
|
return block;
|
|
}
|
|
|
|
static void do_ipo_editmenu_mirrormenu(void *arg, int event)
|
|
{
|
|
switch(event) {
|
|
case 1: /* mirror over current frame */
|
|
case 2: /* mirror over frame 0 */
|
|
case 3: /* mirror over horizontal axis */
|
|
ipo_mirror(event);
|
|
break;
|
|
}
|
|
allqueue(REDRAWVIEW3D, 0);
|
|
}
|
|
|
|
static uiBlock *ipo_editmenu_mirrormenu(void *arg_unused)
|
|
{
|
|
uiBlock *block;
|
|
short yco = 20, menuwidth = 120;
|
|
|
|
block= uiNewBlock(&curarea->uiblocks, "ipo_editmenu_mirrormenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
|
|
uiBlockSetButmFunc(block, do_ipo_editmenu_mirrormenu, NULL);
|
|
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Over Current Frame|Shift M, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Over Vertical Axis|Shift M, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Over Horizontal Axis|Shift M, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
|
|
|
|
uiBlockSetDirection(block, UI_RIGHT);
|
|
uiTextBoundsBlock(block, 60);
|
|
return block;
|
|
}
|
|
|
|
static void do_ipo_editmenu_joinmenu(void *arg, int event)
|
|
{
|
|
switch(event) {
|
|
case 1: /* All Selected */
|
|
case 2: /* Selected Doubles */
|
|
join_ipo(event);
|
|
break;
|
|
}
|
|
allqueue(REDRAWVIEW3D, 0);
|
|
}
|
|
|
|
static uiBlock *ipo_editmenu_joinmenu(void *arg_unused)
|
|
{
|
|
uiBlock *block;
|
|
short yco = 20, menuwidth = 120;
|
|
|
|
block= uiNewBlock(&curarea->uiblocks, "ipo_editmenu_joinmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
|
|
uiBlockSetButmFunc(block, do_ipo_editmenu_joinmenu, NULL);
|
|
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "All Selected|Ctrl J, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selected Doubles|Ctrl J, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
|
|
|
|
uiBlockSetDirection(block, UI_RIGHT);
|
|
uiTextBoundsBlock(block, 60);
|
|
return block;
|
|
}
|
|
|
|
static void do_ipo_editmenu_keymenu(void *arg, int event)
|
|
{
|
|
Key *key;
|
|
KeyBlock *kb;
|
|
Object *ob= OBACT;
|
|
|
|
if(G.sipo->blocktype==ID_KE && totipo_edit==0 && totipo_sel==0) {
|
|
key= ob_get_key((Object *)G.sipo->from);
|
|
if(key==NULL) return;
|
|
|
|
kb= BLI_findlink(&key->block, ob->shapenr-1);
|
|
kb->type= 0;
|
|
switch(event){
|
|
case 0:
|
|
kb->type= KEY_LINEAR;
|
|
break;
|
|
case 1:
|
|
kb->type= KEY_CARDINAL;
|
|
break;
|
|
case 2:
|
|
kb->type= KEY_BSPLINE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
static uiBlock *ipo_editmenu_keymenu(void *arg_unused)
|
|
{
|
|
uiBlock *block;
|
|
short yco= 0, menuwidth=120;
|
|
|
|
block= uiNewBlock(&curarea->uiblocks, "ipo_editmenu_keymenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
|
|
uiBlockSetButmFunc(block, do_ipo_editmenu_keymenu, NULL);
|
|
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Linear|T, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cardinal|T, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "BSpline|T, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
|
|
|
|
uiBlockSetDirection(block, UI_RIGHT);
|
|
uiTextBoundsBlock(block, 60);
|
|
|
|
return block;
|
|
|
|
}
|
|
|
|
static void do_ipo_editmenu_handlemenu(void *arg, int event)
|
|
{
|
|
switch(event){
|
|
case 0:
|
|
sethandles_ipo(HD_AUTO);
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
sethandles_ipo(HD_ALIGN);
|
|
break;
|
|
case 3:
|
|
sethandles_ipo(HD_VECT);
|
|
break;
|
|
case 4:
|
|
sethandles_ipo(HD_AUTO_ANIM);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static uiBlock *ipo_editmenu_handlemenu(void *arg_unused)
|
|
{
|
|
uiBlock *block;
|
|
short yco= 0, menuwidth=120;
|
|
|
|
block= uiNewBlock(&curarea->uiblocks, "ipo_editmenu_handlemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
|
|
uiBlockSetButmFunc(block, do_ipo_editmenu_handlemenu, NULL);
|
|
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Auto|Shift H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Auto Clamped|Alt H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Aligned|H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Free|H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Vector|V", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
|
|
|
|
uiBlockSetDirection(block, UI_RIGHT);
|
|
uiTextBoundsBlock(block, 60);
|
|
|
|
return block;
|
|
}
|
|
|
|
static void do_ipo_editmenu_intpolmenu(void *arg, int event)
|
|
{
|
|
EditIpo *ei;
|
|
int a;
|
|
|
|
get_status_editipo();
|
|
|
|
ei = G.sipo->editipo;
|
|
|
|
switch(event)
|
|
{
|
|
case 0:
|
|
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
|
if ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_SELECT, icu) {
|
|
ei->icu->ipo= IPO_CONST;
|
|
}
|
|
}
|
|
break;
|
|
case 1:
|
|
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
|
if ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_SELECT, icu) {
|
|
ei->icu->ipo= IPO_LIN;
|
|
}
|
|
}
|
|
break;
|
|
case 2:
|
|
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
|
if ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_SELECT, icu) {
|
|
ei->icu->ipo= IPO_BEZ;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
scrarea_queue_winredraw(curarea);
|
|
}
|
|
|
|
static uiBlock *ipo_editmenu_intpolmenu(void *arg_unused)
|
|
{
|
|
uiBlock *block;
|
|
short yco= 0, menuwidth=120;
|
|
|
|
block= uiNewBlock(&curarea->uiblocks, "ipo_editmenu_intpolmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
|
|
uiBlockSetButmFunc(block, do_ipo_editmenu_intpolmenu, NULL);
|
|
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Constant|T, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Linear|T, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bezier|T, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
|
|
|
|
uiBlockSetDirection(block, UI_RIGHT);
|
|
uiTextBoundsBlock(block, 60);
|
|
|
|
return block;
|
|
}
|
|
|
|
static void do_ipo_editmenu_extendmenu(void *arg, int event)
|
|
{
|
|
switch(event)
|
|
{
|
|
case 0:
|
|
do_ipo_buttons(B_IPOCONT);
|
|
break;
|
|
case 1:
|
|
do_ipo_buttons(B_IPOEXTRAP);
|
|
break;
|
|
case 2:
|
|
do_ipo_buttons(B_IPOCYCLIC);
|
|
break;
|
|
case 3:
|
|
do_ipo_buttons(B_IPOCYCLICX);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static uiBlock *ipo_editmenu_extendmenu(void *arg_unused)
|
|
{
|
|
uiBlock *block;
|
|
short yco= 0, menuwidth=120;
|
|
|
|
block= uiNewBlock(&curarea->uiblocks, "ipo_editmenu_extendmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
|
|
uiBlockSetButmFunc(block, do_ipo_editmenu_extendmenu, NULL);
|
|
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Constant", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extrapolation", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cyclic", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cyclic Extrapolation", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
|
|
|
|
uiBlockSetDirection(block, UI_RIGHT);
|
|
uiTextBoundsBlock(block, 60);
|
|
|
|
return block;
|
|
}
|
|
|
|
|
|
static void do_ipo_editmenu(void *arg, int event)
|
|
{
|
|
switch(event)
|
|
{
|
|
case 0:
|
|
del_ipo(1);
|
|
break;
|
|
case 1:
|
|
add_duplicate_editipo();
|
|
break;
|
|
case 2:
|
|
ipo_record();
|
|
break;
|
|
case 3:
|
|
mainqenter(IKEY, 1);
|
|
break;
|
|
case 4 :
|
|
add_blockhandler(curarea, IPO_HANDLER_PROPERTIES, UI_PNL_UNSTOW);
|
|
break;
|
|
case 5:
|
|
//join_ipo();
|
|
break;
|
|
case 6:
|
|
/*IPO Editmode*/
|
|
set_editflag_editipo();
|
|
break;
|
|
case 7:
|
|
sethandles_ipo(HD_AUTO_ANIM);
|
|
break;
|
|
case 8: /* clean ipo */
|
|
clean_ipo();
|
|
break;
|
|
case 9: /* smooth ipo */
|
|
smooth_ipo();
|
|
break;
|
|
}
|
|
}
|
|
|
|
static uiBlock *ipo_editmenu(void *arg_unused)
|
|
{
|
|
uiBlock *block;
|
|
EditIpo *ei;
|
|
short yco= 0, menuwidth=120;
|
|
int a,isedit = 0;
|
|
|
|
get_status_editipo();
|
|
|
|
ei = G.sipo->editipo;
|
|
|
|
block= uiNewBlock(&curarea->uiblocks, "ipo_editmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
|
|
uiBlockSetButmFunc(block, do_ipo_editmenu, NULL);
|
|
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
|
|
|
|
uiDefIconTextBlockBut(block, ipo_editmenu_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
|
|
|
|
uiDefIconTextBlockBut(block, ipo_editmenu_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
|
|
|
|
uiDefIconTextBlockBut(block, ipo_editmenu_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, 120, 19, "");
|
|
|
|
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
|
|
|
/*Look to see if any ipos are being edited, so there can be a check next to the menu option*/
|
|
for(a=0; a<G.sipo->totipo; a++, ei++) {
|
|
if(ei->icu) {
|
|
if(ei->flag & IPO_VISIBLE) {
|
|
if(totipo_edit && (ei->flag & IPO_EDIT)) {
|
|
isedit = 1;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if(isedit)
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Edit Selected|TAB", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
|
|
else
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Edit Selected|TAB", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
|
|
|
|
ei = get_active_editipo();
|
|
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
|
|
|
if(ei && ei->icu && ei->icu->driver)
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert 1:1 Curve...|I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
|
|
else
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe...|I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
|
|
|
|
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
|
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Record Mouse Movement|R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clean IPO Curves|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Smooth IPO Curves|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
|
|
uiDefIconTextBlockBut(block, ipo_editmenu_joinmenu, NULL, ICON_RIGHTARROW_THIN, "Join", 0, yco-=20, 120, 19, "");
|
|
|
|
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Auto Clamped Handles|Alt H", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
|
|
|
|
if (!G.sipo->showkey){
|
|
uiDefIconTextBlockBut(block, ipo_editmenu_extendmenu, NULL, ICON_RIGHTARROW_THIN, "Extend Mode", 0, yco-=20, 120, 19, "");
|
|
uiDefIconTextBlockBut(block, ipo_editmenu_intpolmenu, NULL, ICON_RIGHTARROW_THIN, "Interpolation Mode ", 0, yco-=20, 120, 20, "");
|
|
if(ei != NULL && (ei->flag & IPO_EDIT))
|
|
uiDefIconTextBlockBut(block, ipo_editmenu_handlemenu, NULL, ICON_RIGHTARROW_THIN, "Handle Type", 0, yco-=20, 120, 19, "");
|
|
if(G.sipo->blocktype==ID_KE && totipo_edit==0 && totipo_sel==0)
|
|
uiDefIconTextBlockBut(block, ipo_editmenu_keymenu, NULL, ICON_RIGHTARROW_THIN, "Key Type", 0, yco-=20, 120, 19, "");
|
|
}
|
|
|
|
|
|
if(curarea->headertype==HEADERTOP) {
|
|
uiBlockSetDirection(block, UI_DOWN);
|
|
}
|
|
else {
|
|
uiBlockSetDirection(block, UI_TOP);
|
|
uiBlockFlipOrder(block);
|
|
}
|
|
|
|
uiTextBoundsBlock(block, 50);
|
|
|
|
return block;
|
|
}
|
|
|
|
static void do_ipo_viewmenu(void *arg, int event)
|
|
{
|
|
extern int play_anim(int mode);
|
|
|
|
switch(event)
|
|
{
|
|
case 1:
|
|
do_ipo_buttons(B_IPOHOME);
|
|
break;
|
|
case 2:
|
|
ipo_toggle_showkey();
|
|
scrarea_queue_headredraw(curarea);
|
|
scrarea_queue_winredraw(curarea);
|
|
allqueue(REDRAWVIEW3D, 0);
|
|
break;
|
|
case 3:
|
|
move_to_frame();
|
|
break;
|
|
case 4:
|
|
mainqenter(PADPLUSKEY,1);
|
|
break;
|
|
case 5:
|
|
mainqenter(PADMINUS,1);
|
|
break;
|
|
case 6: /* Play Animation */
|
|
play_anim(0);
|
|
break;
|
|
case 7: /* Play Animation in All */
|
|
play_anim(1);
|
|
break;
|
|
case 8:
|
|
add_blockhandler(curarea, IPO_HANDLER_PROPERTIES, UI_PNL_UNSTOW);
|
|
break;
|
|
case 9:
|
|
G.v2d->flag ^= V2D_VIEWLOCK;
|
|
if(G.v2d->flag & V2D_VIEWLOCK)
|
|
view2d_do_locks(curarea, 0);
|
|
break;
|
|
case 10: /* center view to current frame */
|
|
center_currframe();
|
|
scrarea_queue_winredraw(curarea);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static uiBlock *ipo_viewmenu(void *arg_unused)
|
|
{
|
|
uiBlock *block;
|
|
EditIpo *ei;
|
|
short yco= 0, menuwidth=120;
|
|
|
|
ei = get_active_editipo();
|
|
|
|
block= uiNewBlock(&curarea->uiblocks, "ipo_viewmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
|
|
uiBlockSetButmFunc(block, do_ipo_viewmenu, NULL);
|
|
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Channel Properties|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
|
|
|
|
if (G.sipo->showkey)
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Show Keys|K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
|
|
else
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Show Keys|K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
|
|
|
|
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
|
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom Out|NumPad -", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom In|NumPad +", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
|
|
|
|
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
|
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Animation|Alt A", 0, yco-=20,
|
|
menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Animation in 3D View|Alt Shift A", 0, yco-=20,
|
|
menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
|
|
|
|
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
|
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View All|Home", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center on Current Frame|Shift C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 10, "");
|
|
uiDefIconTextBut(block, BUTM, 1, (G.v2d->flag & V2D_VIEWLOCK)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
|
|
"Lock Time to Other Windows|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
|
|
|
|
if (ei != NULL && (ei->flag & IPO_EDIT)) {
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move Current Frame to Selected|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
|
|
}
|
|
|
|
if(!curarea->full) uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Maximize Window|Ctrl UpArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,20, "");
|
|
else uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Tile Window|Ctrl DownArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 20, "");
|
|
|
|
if(curarea->headertype==HEADERTOP) {
|
|
uiBlockSetDirection(block, UI_DOWN);
|
|
}
|
|
else {
|
|
uiBlockSetDirection(block, UI_TOP);
|
|
uiBlockFlipOrder(block);
|
|
}
|
|
|
|
uiTextBoundsBlock(block, 50);
|
|
|
|
return block;
|
|
}
|
|
|
|
static void do_ipo_selectmenu(void *arg, int event)
|
|
{
|
|
switch(event)
|
|
{
|
|
case 0:
|
|
borderselect_ipo();
|
|
break;
|
|
case 1:
|
|
swap_selectall_editipo();
|
|
break;
|
|
case 2:
|
|
borderselect_markers();
|
|
break;
|
|
case 3:
|
|
deselect_markers(1, 0);
|
|
allqueue(REDRAWTIME, 0);
|
|
allqueue(REDRAWIPO, 0);
|
|
allqueue(REDRAWACTION, 0);
|
|
allqueue(REDRAWNLA, 0);
|
|
allqueue(REDRAWSOUND, 0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static uiBlock *ipo_selectmenu(void *arg_unused)
|
|
{
|
|
uiBlock *block;
|
|
short yco= 0, menuwidth=120;
|
|
|
|
block= uiNewBlock(&curarea->uiblocks, "ipo_selectmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
|
|
uiBlockSetButmFunc(block, do_ipo_selectmenu, NULL);
|
|
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select Markers|Ctrl B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
|
|
|
|
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
|
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All Markers|Ctrl A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
|
|
|
|
if(curarea->headertype==HEADERTOP) {
|
|
uiBlockSetDirection(block, UI_DOWN);
|
|
}
|
|
else {
|
|
uiBlockSetDirection(block, UI_TOP);
|
|
uiBlockFlipOrder(block);
|
|
}
|
|
|
|
uiTextBoundsBlock(block, 50);
|
|
|
|
return block;
|
|
}
|
|
|
|
static void do_ipo_markermenu(void *arg, int event)
|
|
{
|
|
switch(event)
|
|
{
|
|
case 1:
|
|
add_marker(CFRA);
|
|
break;
|
|
case 2:
|
|
duplicate_marker();
|
|
break;
|
|
case 3:
|
|
remove_marker();
|
|
break;
|
|
case 4:
|
|
rename_marker();
|
|
break;
|
|
case 5:
|
|
transform_markers('g', 0);
|
|
break;
|
|
}
|
|
|
|
allqueue(REDRAWTIME, 0);
|
|
allqueue(REDRAWIPO, 0);
|
|
allqueue(REDRAWACTION, 0);
|
|
allqueue(REDRAWNLA, 0);
|
|
allqueue(REDRAWSOUND, 0);
|
|
}
|
|
|
|
static uiBlock *ipo_markermenu(void *arg_unused)
|
|
{
|
|
uiBlock *block;
|
|
short yco= 0, menuwidth=120;
|
|
|
|
block= uiNewBlock(&curarea->uiblocks, "ipo_markermenu",
|
|
UI_EMBOSSP, UI_HELV, curarea->headwin);
|
|
uiBlockSetButmFunc(block, do_ipo_markermenu, NULL);
|
|
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Marker|M", 0, yco-=20,
|
|
menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate Marker|Ctrl Shift D", 0, yco-=20,
|
|
menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Marker|X", 0, yco-=20,
|
|
menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
|
|
|
|
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
|
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "(Re)Name Marker|Ctrl M", 0, yco-=20,
|
|
menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
|
|
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move Marker|Ctrl G", 0, yco-=20,
|
|
menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
|
|
|
|
if(curarea->headertype==HEADERTOP) {
|
|
uiBlockSetDirection(block, UI_DOWN);
|
|
}
|
|
else {
|
|
uiBlockSetDirection(block, UI_TOP);
|
|
uiBlockFlipOrder(block);
|
|
}
|
|
|
|
uiTextBoundsBlock(block, 50);
|
|
|
|
return block;
|
|
}
|
|
|
|
static char *ipo_modeselect_pup(void)
|
|
{
|
|
Object *ob= OBACT;
|
|
static char formatstring[] = "|%s %%x%d %%i%d";
|
|
static char string[1024];
|
|
char *str = string;
|
|
|
|
str += sprintf(str, "Ipo type: %%t");
|
|
|
|
if(ob)
|
|
str += sprintf(str,formatstring, "Object",ID_OB, ICON_OBJECT);
|
|
|
|
if(ob && give_current_material(ob, ob->actcol)) // check for material
|
|
str += sprintf(str,formatstring, "Material",ID_MA, ICON_MATERIAL);
|
|
|
|
if(G.scene->world)
|
|
str += sprintf(str,formatstring, "World",ID_WO, ICON_WORLD);
|
|
|
|
if(ob && ob->type==OB_CURVE)
|
|
str += sprintf(str,formatstring, "Path",ID_CU, ICON_CURVE);
|
|
|
|
if(ob && ob->type==OB_CAMERA)
|
|
str += sprintf(str,formatstring, "Camera",ID_CA, ICON_CAMERA);
|
|
|
|
if(ob && ob->type==OB_LAMP)
|
|
str += sprintf(str,formatstring, "Lamp",ID_LA, ICON_LAMP);
|
|
|
|
if(ob && give_current_texture(ob, ob->actcol))
|
|
str += sprintf(str,formatstring, "Texture",ID_TE, ICON_TEXTURE);
|
|
|
|
if(ob){
|
|
if ELEM4(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_LATTICE)
|
|
str += sprintf(str,formatstring, "Shape",ID_KE, ICON_EDIT);
|
|
if (ob->type==OB_ARMATURE)
|
|
str += sprintf(str,formatstring, "Pose",ID_PO, ICON_POSE_HLT);
|
|
#ifdef __CON_IPO
|
|
str += sprintf(str,formatstring, "Constraint",ID_CO, ICON_CONSTRAINT);
|
|
#endif
|
|
if(ob->fluidsimFlag & OB_FLUIDSIM_ENABLE) {
|
|
str += sprintf(str,formatstring,"Fluidsim",ID_FLUIDSIM, ICON_WORLD);
|
|
}
|
|
}
|
|
|
|
str += sprintf(str,formatstring, "Sequence",ID_SEQ, ICON_SEQUENCE);
|
|
|
|
return (string);
|
|
}
|
|
|
|
void do_ipo_buttons(short event)
|
|
{
|
|
EditIpo *ei;
|
|
View2D *v2d;
|
|
rcti rect;
|
|
Object *ob= OBACT;
|
|
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;
|
|
}
|
|
|
|
/* zoom out a bit */
|
|
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);
|
|
view2d_do_locks(curarea, V2D_LOCK_COPY);
|
|
if(G.sipo->ipo) G.sipo->ipo->cur = G.v2d->cur;
|
|
|
|
scrarea_queue_winredraw(curarea);
|
|
break;
|
|
case B_IPOBORDER:
|
|
val= get_border(&rect, 3);
|
|
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);
|
|
view2d_do_locks(curarea, V2D_LOCK_COPY);
|
|
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:
|
|
/* pass 1 to enforce a refresh when there's no Ipo */
|
|
test_editipo(1);
|
|
scrarea_queue_winredraw(curarea);
|
|
scrarea_queue_headredraw(curarea);
|
|
if(ob) ob->ipowin= G.sipo->blocktype;
|
|
break;
|
|
case B_IPOSHOWKEY:
|
|
/* reverse value because of winqread */
|
|
G.sipo->showkey= 1-G.sipo->showkey;
|
|
ipo_toggle_showkey();
|
|
scrarea_queue_headredraw(curarea);
|
|
scrarea_queue_winredraw(curarea);
|
|
allqueue(REDRAWVIEW3D, 0);
|
|
break;
|
|
case B_VIEW2DZOOM:
|
|
viewmovetemp= 0;
|
|
view2dzoom(event);
|
|
scrarea_queue_headredraw(curarea);
|
|
break;
|
|
case B_IPO_ACTION_OB:
|
|
if(ob && G.sipo->from && G.sipo->pin==0) {
|
|
if(ob->ipoflag & OB_ACTION_OB) { /* check if channel exists, and flip ipo link */
|
|
bActionChannel *achan;
|
|
|
|
if(has_ipo_code(ob->ipo, OB_LAY))
|
|
notice("Note: Layer Ipo doesn't work in Actions");
|
|
|
|
if(ob->action==NULL)
|
|
ob->action= add_empty_action("ObAction");
|
|
achan= verify_action_channel(ob->action, "Object");
|
|
if(achan->ipo==NULL && ob->ipo) {
|
|
achan->ipo= ob->ipo;
|
|
ob->ipo= NULL;
|
|
}
|
|
|
|
/* object constraints */
|
|
if(ob->constraintChannels.first) {
|
|
free_constraint_channels(&achan->constraintChannels);
|
|
achan->constraintChannels= ob->constraintChannels;
|
|
ob->constraintChannels.first= ob->constraintChannels.last= NULL;
|
|
}
|
|
}
|
|
else if(ob->action) {
|
|
bActionChannel *achan= get_action_channel(ob->action, "Object");
|
|
if(achan) {
|
|
|
|
if(achan->ipo && ob->ipo==NULL) {
|
|
ob->ipo= achan->ipo;
|
|
achan->ipo= NULL;
|
|
}
|
|
|
|
/* object constraints */
|
|
if(achan->constraintChannels.first) {
|
|
free_constraint_channels(&ob->constraintChannels);
|
|
ob->constraintChannels= achan->constraintChannels;
|
|
achan->constraintChannels.first= achan->constraintChannels.last= NULL;
|
|
}
|
|
}
|
|
}
|
|
allqueue(REDRAWVIEW3D, 0);
|
|
allqueue(REDRAWIPO, 0);
|
|
allqueue(REDRAWACTION, 0);
|
|
allqueue(REDRAWOOPS, 0);
|
|
allqueue(REDRAWNLA, 0);
|
|
}
|
|
break;
|
|
|
|
case B_IPO_ACTION_KEY:
|
|
if(ob && G.sipo->from && G.sipo->pin==0) {
|
|
Key *key= ob_get_key(ob);
|
|
if(key) {
|
|
if(ob->ipoflag & OB_ACTION_KEY) { /* check if channel exists, and flip ipo link */
|
|
bActionChannel *achan;
|
|
|
|
if(ob->action==NULL)
|
|
ob->action= add_empty_action("ShapeAction");
|
|
achan= verify_action_channel(ob->action, "Shape");
|
|
if(achan->ipo==NULL && key->ipo) {
|
|
achan->ipo= key->ipo;
|
|
key->ipo= NULL;
|
|
}
|
|
}
|
|
else if(ob->action) {
|
|
bActionChannel *achan= get_action_channel(ob->action, "Shape");
|
|
if(achan) {
|
|
if(achan->ipo && key->ipo==NULL) {
|
|
key->ipo= achan->ipo;
|
|
achan->ipo= NULL;
|
|
}
|
|
}
|
|
}
|
|
allqueue(REDRAWVIEW3D, 0);
|
|
allqueue(REDRAWIPO, 0);
|
|
allqueue(REDRAWACTION, 0);
|
|
allqueue(REDRAWOOPS, 0);
|
|
allqueue(REDRAWNLA, 0);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void ipo_buttons(void)
|
|
{
|
|
Object *ob;
|
|
EditIpo *ei;
|
|
uiBlock *block;
|
|
short xco,xmax;
|
|
char naam[20];
|
|
int icon=0, allow_pin= B_IPOPIN;
|
|
|
|
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_IPO;
|
|
|
|
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+14;
|
|
|
|
test_editipo(0); /* test if current editipo is OK, make_editipo sets v2d->cur */
|
|
|
|
uiBlockSetEmboss(block, UI_EMBOSSN);
|
|
if(curarea->flag & HEADER_NO_PULLDOWN) {
|
|
uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_RIGHT,
|
|
xco,2,XIC,YIC-2,
|
|
&(curarea->flag), 0, 0, 0, 0, "Enables display of pulldown menus");
|
|
} else {
|
|
uiDefIconButBitS(block, TOG, HEADER_NO_PULLDOWN, B_FLIPINFOMENU, ICON_DISCLOSURE_TRI_DOWN,
|
|
xco,2,XIC,YIC-2,
|
|
&(curarea->flag), 0, 0, 0, 0, "Hides pulldown menus");
|
|
}
|
|
uiBlockSetEmboss(block, UI_EMBOSS);
|
|
xco+=XIC;
|
|
|
|
/* pull down menus */
|
|
if((curarea->flag & HEADER_NO_PULLDOWN)==0) {
|
|
uiBlockSetEmboss(block, UI_EMBOSSP);
|
|
|
|
ei = get_active_editipo();
|
|
|
|
xmax= GetButStringLength("View");
|
|
uiDefPulldownBut(block,ipo_viewmenu, NULL, "View", xco, -2, xmax-3, 24, "");
|
|
xco+=xmax;
|
|
|
|
xmax= GetButStringLength("Select");
|
|
uiDefPulldownBut(block,ipo_selectmenu, NULL, "Select", xco, -2, xmax-3, 24, "");
|
|
xco+=xmax;
|
|
|
|
xmax= GetButStringLength("Marker");
|
|
uiDefPulldownBut(block,ipo_markermenu, NULL, "Marker", xco, -2, xmax-3, 24, "");
|
|
xco+=xmax;
|
|
|
|
if (G.sipo->showkey) {
|
|
xmax= GetButStringLength("Key");
|
|
uiDefPulldownBut(block,ipo_editmenu, NULL, "Key", xco, -2, xmax-3, 24, "");
|
|
}
|
|
else if(ei != NULL && (ei->flag & IPO_EDIT)) {
|
|
xmax= GetButStringLength("Point");
|
|
uiDefPulldownBut(block,ipo_editmenu, NULL, "Point", xco, -2, xmax-3, 24, "");
|
|
}
|
|
else {
|
|
xmax= GetButStringLength("Curve");
|
|
uiDefPulldownBut(block,ipo_editmenu, NULL, "Curve", xco, -2, xmax-3, 24, "");
|
|
}
|
|
xco+=xmax;
|
|
}
|
|
|
|
/* end of pull down menus */
|
|
uiBlockSetEmboss(block, UI_EMBOSS);
|
|
|
|
ob= OBACT;
|
|
|
|
/* action switch option, only when active object is there and no pin */
|
|
uiSetButLock(G.sipo->pin, "Can't change because of pinned data");
|
|
|
|
/* define whether ipos are on Object or on action */
|
|
if(ob) {
|
|
static short fake1= 1;
|
|
|
|
uiBlockBeginAlign(block);
|
|
|
|
if(G.sipo->blocktype==ID_OB) {
|
|
uiDefIconButBitS(block, TOG, OB_ACTION_OB, B_IPO_ACTION_OB, ICON_ACTION, xco,0,XIC,YIC, &(ob->ipoflag), 0, 0, 0, 0, "Sets Ipo to be included in an Action or not");
|
|
xco+= XIC;
|
|
}
|
|
else if(G.sipo->blocktype==ID_KE) {
|
|
uiDefIconButBitS(block, TOG, OB_ACTION_KEY, B_IPO_ACTION_KEY, ICON_ACTION, xco,0,XIC,YIC, &(ob->ipoflag), 0, 0, 0, 0, "Sets Ipo to be included in an Action or not");
|
|
xco+= XIC;
|
|
}
|
|
else if(G.sipo->blocktype==ID_CO) {
|
|
|
|
if(G.sipo->from && G.sipo->actname[0]==0)
|
|
uiDefIconButBitS(block, TOG, OB_ACTION_OB, B_IPO_ACTION_OB, ICON_ACTION, xco,0,XIC,YIC, &(ob->ipoflag), 0, 0, 0, 0, "Sets Ipo to be included in an Action or not");
|
|
else {
|
|
uiSetButLock(1, "Pose Constraint Ipo cannot be switched");
|
|
uiDefIconButS(block, TOG, 1, ICON_ACTION, xco,0,XIC,YIC, &fake1, 0, 0, 0, 0, "Ipo is connected to Pose Action");
|
|
}
|
|
xco+= XIC;
|
|
}
|
|
else if(G.sipo->blocktype==ID_PO) { /* only to indicate we have action ipos */
|
|
uiSetButLock(1, "Pose Action Ipo cannot be switched");
|
|
uiDefIconButS(block, TOG, 1, ICON_ACTION, xco,0,XIC,YIC, &fake1, 0, 0, 0, 0, "Ipo is connected to Pose Action");
|
|
xco+= XIC;
|
|
}
|
|
uiClearButLock();
|
|
}
|
|
|
|
/* mainmenu, only when data is there and no pin */
|
|
uiSetButLock(G.sipo->pin, "Can't change because of pinned data");
|
|
|
|
if (G.sipo->blocktype == ID_OB)
|
|
icon = ICON_OBJECT;
|
|
else if (G.sipo->blocktype == ID_MA)
|
|
icon = ICON_MATERIAL;
|
|
else if (G.sipo->blocktype == ID_WO)
|
|
icon = ICON_WORLD;
|
|
else if (G.sipo->blocktype == ID_CU)
|
|
icon = ICON_ANIM;
|
|
else if (G.sipo->blocktype == ID_CA)
|
|
icon = ICON_CAMERA;
|
|
else if (G.sipo->blocktype == ID_LA)
|
|
icon = ICON_LAMP;
|
|
else if (G.sipo->blocktype == ID_KE)
|
|
icon = ICON_EDIT;
|
|
else if (G.sipo->blocktype == ID_PO)
|
|
icon = ICON_POSE_HLT;
|
|
else if (G.sipo->blocktype == ID_CO)
|
|
icon = ICON_CONSTRAINT;
|
|
else if (G.sipo->blocktype == ID_SEQ)
|
|
icon = ICON_SEQUENCE;
|
|
else if(G.sipo->blocktype == ID_TE)
|
|
icon = ICON_TEXTURE;
|
|
else if(G.sipo->blocktype == ID_FLUIDSIM)
|
|
icon = ICON_WORLD;
|
|
|
|
uiDefIconTextButS(block, MENU, B_IPOMAIN, icon, ipo_modeselect_pup(), xco,0,100,20, &(G.sipo->blocktype), 0, 0, 0, 0, "Show IPO type");
|
|
|
|
xco += 85;
|
|
|
|
if(G.sipo->blocktype==ID_MA) {
|
|
uiDefButS(block, NUM, B_IPOMAIN, "", xco+=XIC,0,XIC-4,YIC, &G.sipo->channel, 0.0, MAX_MTEX-1.0, 0, 0, "Channel Number of the active Material texture.");
|
|
xco-= 4;
|
|
}
|
|
if(G.sipo->blocktype==ID_WO) {
|
|
uiDefButS(block, NUM, B_IPOMAIN, "", xco+=XIC,0,XIC-4,YIC, &G.sipo->channel, 0.0, MAX_MTEX-1.0, 0, 0, "Channel Number of the active World texture.");
|
|
xco-= 4;
|
|
}
|
|
|
|
if(G.sipo->blocktype==ID_LA) {
|
|
uiDefButS(block, NUM, B_IPOMAIN, "", xco+=XIC,0,XIC-4,YIC, &G.sipo->channel, 0.0, MAX_MTEX-1.0, 0, 0, "Channel Number of the active Lamp texture. ");
|
|
xco-= 4;
|
|
}
|
|
|
|
uiBlockEndAlign(block);
|
|
|
|
uiClearButLock();
|
|
|
|
/* if(G.sipo->blocktype==ID_SEQ)
|
|
allow_pin= 0; */
|
|
xco= std_libbuttons(block, (short)(xco+1.5*XIC), 0, allow_pin, &G.sipo->pin, B_IPOBROWSE, ID_IP,
|
|
G.sipo->blocktype, (ID*)G.sipo->ipo, G.sipo->from, &(G.sipo->menunr), B_IPOALONE, B_IPOLOCAL, B_IPODELETE, 0, B_KEEPDATA);
|
|
|
|
/* COPY PASTE */
|
|
xco-= XIC/2;
|
|
uiBlockBeginAlign(block);
|
|
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(G.sipo->ipo && G.sipo->ipo->id.lib, ERROR_LIBDATA_MESSAGE);
|
|
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(G.sipo->ipo && G.sipo->ipo->id.lib, ERROR_LIBDATA_MESSAGE);
|
|
uiDefIconBut(block, BUT, B_IPOPASTE, ICON_PASTEDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the curves from the buffer");
|
|
}
|
|
uiBlockEndAlign(block);
|
|
xco+=XIC/2;
|
|
|
|
uiClearButLock();
|
|
|
|
/* ZOOMBORDER */
|
|
uiDefIconBut(block, BUT, B_IPOBORDER, ICON_BORDERMOVE, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Zooms view to area");
|
|
|
|
xco+=XIC/2;
|
|
|
|
/* draw LOCK */
|
|
uiDefIconButS(block, ICONTOG, 1, ICON_UNLOCKED, xco+=XIC,0,XIC,YIC, &(G.sipo->lock), 0, 0, 0, 0, "Toggles forced redraw of other windows to reflect changes in real time");
|
|
|
|
/* always do as last */
|
|
curarea->headbutlen= xco+2*XIC;
|
|
|
|
uiDrawBlock(block);
|
|
}
|