Big Commit.
Now time-markers work in all time-related spaces (i.e. Ipo, Action Editor, NLA editor, TimeLine, Sound). The hotkeys and functionality set should be the same for each of these modes (with a few exceptions still). I've had to change a few hotkeys here and there, so hopefully they aren't too bad. Marker Operations: MKEY - Add Marker SHIFT MKEY - Rename marker (was CTRL MKEY) XKEY - Delete Marker PAGE UP - Jump to next marker PAGE DOWN - Jump to previous marker CTRL A - Select all markers SHIFT G - Transform markers (NLA, IPO, Action) G - Transform markers (Sound, Timeline) CTRL SHIFT D - Duplicate markers (NLA, IPO, Action) SHIFT D - Duplicate markers (Sound, Timeline) BKEY - select markers and other keyframes (if any) I've also made a few little tool additions to NLA and Action editors: * NLA editor - Snap To Frame. Now with the option to offset strip so that it starts at the current frame. Added menus for this. * Action editor - Snap To Frame A few new menus for this too
This commit is contained in:
@@ -78,24 +78,14 @@ void transform_actionchannel_keys(int mode, int dummy);
|
||||
void transform_meshchannel_keys(char mode, struct Key *key);
|
||||
struct Key *get_action_mesh_key(void);
|
||||
int get_nearest_key_num(struct Key *key, short *mval, float *x);
|
||||
void snap_keys_to_frame(void);
|
||||
void snap_keys_to_frame(int snap_mode);
|
||||
void clean_shapekeys(struct Key *key);
|
||||
void clean_actionchannels(struct bAction *act);
|
||||
|
||||
/* Marker Operations */
|
||||
struct ListBase *get_saction_markers(struct SpaceAction *saction);
|
||||
struct TimeMarker *find_nearest_saction_marker(struct ListBase *markers);
|
||||
void get_minmax_saction_markers(struct ListBase *markers, float *first, float *last);
|
||||
void add_saction_marker(struct ListBase *markers, int frame);
|
||||
void duplicate_saction_markers(struct ListBase *markers);
|
||||
void remove_saction_markers(struct ListBase *markers);
|
||||
void rename_saction_markers(struct ListBase *markers);
|
||||
void transform_saction_markers(int mode, int smode);
|
||||
void deselect_saction_markers(struct ListBase *markers, short test, short sel);
|
||||
void borderselect_saction_markers(struct ListBase *markers, float xmin, float xmax, int selectmode);
|
||||
void nextprev_saction_markers(ListBase *markers, short dir);
|
||||
void selectkeys_columns_markers(struct ListBase *markers);
|
||||
void selectkeys_between_markers(struct ListBase *markers);
|
||||
void get_minmax_saction_markers(float *first, float *last);
|
||||
void selectkeys_columns_markers(void);
|
||||
void selectkeys_between_markers(void);
|
||||
|
||||
/* channel/strip operations */
|
||||
void up_sel_action(void);
|
||||
|
||||
@@ -52,7 +52,7 @@ void shift_nlastrips_up(void);
|
||||
void shift_nlastrips_down(void);
|
||||
void reset_action_strips(int val);
|
||||
void synchronize_action_strips(void);
|
||||
void snap_action_strips(void);
|
||||
void snap_action_strips(int snap_mode);
|
||||
void add_nlablock(void);
|
||||
void copy_action_modifiers(void);
|
||||
|
||||
|
||||
@@ -106,7 +106,7 @@ void sethandles_ipo(int code);
|
||||
void select_ipo_bezier_keys(struct Ipo *ipo, int selectmode);
|
||||
void set_ipotype(void);
|
||||
void borderselect_ipo(void);
|
||||
void del_ipo(void);
|
||||
void del_ipo(int need_check);
|
||||
void del_ipoCurve ( struct IpoCurve * icu );
|
||||
void free_ipocopybuf(void);
|
||||
void copy_editipo(void);
|
||||
|
||||
@@ -33,19 +33,28 @@
|
||||
#ifndef BSE_TIME_H
|
||||
#define BSE_TIME_H
|
||||
|
||||
struct SpaceAction;
|
||||
struct View2D;
|
||||
|
||||
/* ******** Markers ********* */
|
||||
void add_timeline_marker(int frame);
|
||||
void duplicate_timeline_marker(void);
|
||||
void remove_timeline_marker(void);
|
||||
void rename_timeline_marker(void);
|
||||
void select_timeline_markers(void);
|
||||
/* ******** Markers - General Api ********* */
|
||||
void add_marker(int frame);
|
||||
void duplicate_marker(void);
|
||||
void remove_marker(void);
|
||||
void rename_marker(void);
|
||||
void transform_markers(int mode, int smode);
|
||||
void deselect_markers(short test, short sel);
|
||||
void borderselect_markers(float xmin, float xmax, int selectmode);
|
||||
struct TimeMarker *find_nearest_marker(int clip_y);
|
||||
void nextprev_marker(short dir);
|
||||
|
||||
/* ******** Markers - Space Specific ************* */
|
||||
/* TimeLine Marker Stuff ----------------------------------- */
|
||||
void borderselect_timeline_markers(void);
|
||||
/* Other Space Marker Stuff ----------------------------- */
|
||||
void draw_markers_timespace(struct View2D *v2d);
|
||||
|
||||
/* *********** TimeLine Specific ***************/
|
||||
void timeline_frame_to_center(void);
|
||||
void nextprev_timeline_key(short dir);
|
||||
void nextprev_timeline_marker(short dir);
|
||||
void timeline_grab(int mode, int smode);
|
||||
void draw_markers_action(struct SpaceAction *sact);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -300,6 +300,9 @@ int BoneSize(TransInfo *t, short mval[2]);
|
||||
void initBoneEnvelope(TransInfo *t);
|
||||
int BoneEnvelope(TransInfo *t, short mval[2]);
|
||||
|
||||
void initBoneRoll(TransInfo *t);
|
||||
int BoneRoll(TransInfo *t, short mval[2]);
|
||||
|
||||
/*********************** transform_conversions.c ********** */
|
||||
struct ListBase;
|
||||
void flushTransUVs(TransInfo *t);
|
||||
|
||||
@@ -697,7 +697,7 @@ void drawactionspace(ScrArea *sa, void *spacedata)
|
||||
draw_cfra_action();
|
||||
|
||||
/* Draw markers */
|
||||
draw_markers_action(G.saction);
|
||||
draw_markers_timespace(&(G.saction->v2d));
|
||||
|
||||
/* Draw scroll */
|
||||
mywinset(curarea->win); // reset scissor too
|
||||
|
||||
@@ -85,6 +85,7 @@
|
||||
#include "BSE_editipo.h"
|
||||
#include "BSE_editipo_types.h"
|
||||
#include "BSE_editnla_types.h"
|
||||
#include "BSE_time.h"
|
||||
|
||||
#include "BPY_extern.h"
|
||||
|
||||
@@ -2136,6 +2137,9 @@ void drawipospace(ScrArea *sa, void *spacedata)
|
||||
draw_ipohandles(1);
|
||||
draw_ipovertices(1);
|
||||
|
||||
/* draw markers */
|
||||
draw_markers_timespace(&(sipo->v2d));
|
||||
|
||||
/* restore viewport */
|
||||
mywinset(sa->win);
|
||||
|
||||
|
||||
@@ -66,6 +66,7 @@
|
||||
#include "BSE_drawipo.h"
|
||||
#include "BSE_editnla_types.h"
|
||||
#include "BSE_headerbuttons.h"
|
||||
#include "BSE_time.h"
|
||||
|
||||
#include "BIF_editnla.h"
|
||||
#include "BIF_gl.h"
|
||||
@@ -644,6 +645,7 @@ static void nla_blockhandlers(ScrArea *sa)
|
||||
|
||||
void drawnlaspace(ScrArea *sa, void *spacedata)
|
||||
{
|
||||
SpaceNla *snla= G.snla;
|
||||
float col[3];
|
||||
short ofsx = 0, ofsy = 0;
|
||||
|
||||
@@ -687,6 +689,9 @@ void drawnlaspace(ScrArea *sa, void *spacedata)
|
||||
glScissor(ofsx+G.v2d->mask.xmin, ofsy+G.v2d->mask.ymin, ( ofsx+G.v2d->mask.xmax-1)-(ofsx+G.v2d->mask.xmin)+1, ( ofsy+G.v2d->mask.ymax-1)-( ofsy+G.v2d->mask.ymin)+1);
|
||||
myortho2 (G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax);
|
||||
draw_cfra_action();
|
||||
|
||||
/* draw markers */
|
||||
draw_markers_timespace(&(snla->v2d));
|
||||
|
||||
/* Draw scroll */
|
||||
mywinset(curarea->win); // reset scissor too
|
||||
|
||||
@@ -55,6 +55,7 @@
|
||||
#include "BIF_resources.h"
|
||||
|
||||
#include "BSE_drawipo.h"
|
||||
#include "BSE_time.h"
|
||||
#include "BMF_Api.h"
|
||||
|
||||
/* local */
|
||||
@@ -188,6 +189,7 @@ static void draw_cfra_sound(SpaceSound *ssound)
|
||||
|
||||
void drawsoundspace(ScrArea *sa, void *spacedata)
|
||||
{
|
||||
SpaceSound *ssound;
|
||||
float col[3];
|
||||
short ofsx, ofsy;
|
||||
|
||||
@@ -217,7 +219,9 @@ void drawsoundspace(ScrArea *sa, void *spacedata)
|
||||
draw_sample(G.ssound->sound->sample);
|
||||
}
|
||||
|
||||
draw_cfra_sound(spacedata);
|
||||
ssound= spacedata;
|
||||
draw_cfra_sound(ssound);
|
||||
draw_markers_timespace(&(ssound->v2d));
|
||||
|
||||
/* restore viewport */
|
||||
mywinset(curarea->win);
|
||||
|
||||
@@ -45,6 +45,8 @@
|
||||
#include "DNA_scene_types.h"
|
||||
#include "DNA_space_types.h"
|
||||
#include "DNA_screen_types.h"
|
||||
#include "DNA_sound_types.h"
|
||||
#include "DNA_view2d_types.h"
|
||||
|
||||
#include "BKE_ipo.h"
|
||||
#include "BKE_object.h"
|
||||
@@ -162,7 +164,7 @@ static void draw_marker(TimeMarker *marker)
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_markers_time( void )
|
||||
static void draw_markers_time(void)
|
||||
{
|
||||
TimeMarker *marker;
|
||||
|
||||
@@ -179,17 +181,17 @@ static void draw_markers_time( void )
|
||||
}
|
||||
}
|
||||
|
||||
void draw_markers_action(SpaceAction *sact)
|
||||
void draw_markers_timespace(View2D *v2d)
|
||||
{
|
||||
TimeMarker *marker;
|
||||
float yspace, ypixels;
|
||||
|
||||
/* move ortho view to align with slider in bottom */
|
||||
glTranslatef(0.0f, sact->v2d.cur.ymin, 0.0f);
|
||||
glTranslatef(0.0f, v2d->cur.ymin, 0.0f);
|
||||
|
||||
/* bad hacks in drawing markers... inverse correct that as well */
|
||||
yspace= sact->v2d.cur.ymax - sact->v2d.cur.ymin;
|
||||
ypixels= sact->v2d.mask.ymax - sact->v2d.mask.ymin;
|
||||
yspace= v2d->cur.ymax - v2d->cur.ymin;
|
||||
ypixels= v2d->mask.ymax - v2d->mask.ymin;
|
||||
glTranslatef(0.0f, -11.0*yspace/ypixels, 0.0f);
|
||||
|
||||
/* unselected markers are drawn at the first time */
|
||||
@@ -203,12 +205,11 @@ void draw_markers_action(SpaceAction *sact)
|
||||
if(marker->flag & SELECT) draw_marker(marker);
|
||||
}
|
||||
|
||||
glTranslatef(0.0f, -sact->v2d.cur.ymin, 0.0f);
|
||||
glTranslatef(0.0f, -v2d->cur.ymin, 0.0f);
|
||||
glTranslatef(0.0f, 11.0*yspace/ypixels, 0.0f);
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void draw_sfra_efra()
|
||||
{
|
||||
BIF_ThemeColorShade(TH_BACK, -25);
|
||||
|
||||
@@ -3278,7 +3278,7 @@ int play_anim(int mode)
|
||||
}
|
||||
}
|
||||
else if(event==MKEY) {
|
||||
if(val) add_timeline_marker(CFRA-1);
|
||||
if(val) add_marker(CFRA-1);
|
||||
}
|
||||
}
|
||||
if(ELEM3(event, ESCKEY, SPACEKEY, RIGHTMOUSE)) break;
|
||||
|
||||
@@ -85,6 +85,7 @@
|
||||
#include "BSE_drawipo.h"
|
||||
#include "BSE_headerbuttons.h"
|
||||
#include "BSE_editipo.h"
|
||||
#include "BSE_time.h"
|
||||
#include "BSE_trans_types.h"
|
||||
|
||||
#include "BDR_editobject.h"
|
||||
@@ -601,18 +602,16 @@ static void mouse_action(int selectmode)
|
||||
bActionChannel *chan;
|
||||
bConstraintChannel *conchan;
|
||||
TimeMarker *marker;
|
||||
ListBase *markers;
|
||||
short mval[2];
|
||||
|
||||
act=G.saction->action;
|
||||
if (!act)
|
||||
return;
|
||||
markers= get_saction_markers(G.saction);
|
||||
|
||||
getmouseco_areawin (mval);
|
||||
|
||||
chan=get_nearest_actionchannel_key(&selx, &sel, &conchan);
|
||||
marker=find_nearest_saction_marker(markers);
|
||||
marker=find_nearest_marker(1);
|
||||
|
||||
if (chan){
|
||||
if (selectmode == SELECT_REPLACE) {
|
||||
@@ -644,7 +643,7 @@ static void mouse_action(int selectmode)
|
||||
else if (marker) {
|
||||
/* not channel, so maybe marker */
|
||||
if (selectmode == SELECT_REPLACE) {
|
||||
deselect_saction_markers(markers, 0, 0);
|
||||
deselect_markers(0, 0);
|
||||
marker->flag |= SELECT;
|
||||
}
|
||||
else if (selectmode == SELECT_INVERT) {
|
||||
@@ -658,10 +657,13 @@ static void mouse_action(int selectmode)
|
||||
else if (selectmode == SELECT_SUBTRACT)
|
||||
marker->flag &= ~SELECT;
|
||||
|
||||
std_rmouse_transform(transform_saction_markers);
|
||||
std_rmouse_transform(transform_markers);
|
||||
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -673,7 +675,6 @@ static void mouse_mesh_action(int selectmode, Key *key)
|
||||
|
||||
IpoCurve *icu;
|
||||
TimeMarker *marker;
|
||||
ListBase *markers;
|
||||
short sel;
|
||||
float selx;
|
||||
short mval[2];
|
||||
@@ -685,8 +686,7 @@ static void mouse_mesh_action(int selectmode, Key *key)
|
||||
* data, etc)
|
||||
*/
|
||||
|
||||
markers= get_saction_markers(G.saction);
|
||||
marker= find_nearest_saction_marker(markers);
|
||||
marker= find_nearest_marker(1);
|
||||
|
||||
/* get the click location, and the cooresponding
|
||||
* ipo curve and selection time value
|
||||
@@ -729,7 +729,7 @@ static void mouse_mesh_action(int selectmode, Key *key)
|
||||
else if (marker) {
|
||||
/* not channel, so maybe marker */
|
||||
if (selectmode == SELECT_REPLACE) {
|
||||
deselect_saction_markers(markers, 0, 0);
|
||||
deselect_markers(0, 0);
|
||||
marker->flag |= SELECT;
|
||||
}
|
||||
else if (selectmode == SELECT_INVERT) {
|
||||
@@ -743,10 +743,13 @@ static void mouse_mesh_action(int selectmode, Key *key)
|
||||
else if (selectmode == SELECT_SUBTRACT)
|
||||
marker->flag &= ~SELECT;
|
||||
|
||||
std_rmouse_transform(transform_saction_markers);
|
||||
std_rmouse_transform(transform_markers);
|
||||
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -759,22 +762,19 @@ void borderselect_action(void)
|
||||
bActionChannel *chan;
|
||||
bConstraintChannel *conchan;
|
||||
bAction *act;
|
||||
ListBase *markers;
|
||||
float ymin, ymax;
|
||||
|
||||
act=G.saction->action;
|
||||
|
||||
if (!act)
|
||||
return;
|
||||
|
||||
markers = get_saction_markers(G.saction);
|
||||
|
||||
if ( (val = get_border(&rect, 3)) ){
|
||||
if (val == LEFTMOUSE)
|
||||
selectmode = SELECT_ADD;
|
||||
else
|
||||
selectmode = SELECT_SUBTRACT;
|
||||
|
||||
|
||||
mval[0]= rect.xmin;
|
||||
mval[1]= rect.ymin+2;
|
||||
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmin, &rectf.ymin);
|
||||
@@ -782,6 +782,9 @@ void borderselect_action(void)
|
||||
mval[1]= rect.ymax-2;
|
||||
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
|
||||
|
||||
/* do markers first */
|
||||
borderselect_markers(rectf.xmin, rectf.xmax, selectmode);
|
||||
|
||||
/* if action is mapped in NLA, it returns a correction */
|
||||
if(G.saction->pin==0 && OBACT) {
|
||||
rectf.xmin= get_action_frame(OBACT, rectf.xmin);
|
||||
@@ -814,22 +817,17 @@ void borderselect_action(void)
|
||||
}
|
||||
}
|
||||
|
||||
/* do markers first */
|
||||
if (markers != NULL)
|
||||
borderselect_saction_markers(markers, rectf.xmin, rectf.xmax, selectmode);
|
||||
|
||||
|
||||
BIF_undo_push("Border Select Action");
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
if (markers != NULL) allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void borderselect_mesh(Key *key)
|
||||
{
|
||||
ListBase *markers;
|
||||
rcti rect;
|
||||
int val, adrcodemax, adrcodemin;
|
||||
short mval[2];
|
||||
@@ -838,7 +836,6 @@ void borderselect_mesh(Key *key)
|
||||
int (*select_function)(BezTriple *);
|
||||
IpoCurve *icu;
|
||||
|
||||
markers = get_saction_markers(G.saction);
|
||||
|
||||
if ( (val = get_border(&rect, 3)) ){
|
||||
/* set the selection function based on what
|
||||
@@ -852,8 +849,8 @@ void borderselect_mesh(Key *key)
|
||||
else {
|
||||
selectmode = SELECT_SUBTRACT;
|
||||
select_function = select_bezier_subtract;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* get the minimum and maximum adrcode numbers
|
||||
* for the IpoCurves (this is the number that
|
||||
* relates an IpoCurve to the keyblock it
|
||||
@@ -868,7 +865,10 @@ void borderselect_mesh(Key *key)
|
||||
mval[1]= rect.ymax-2;
|
||||
adrcodemin = get_nearest_key_num(key, mval, &xmax);
|
||||
adrcodemin = (adrcodemin < 1) ? 1 : adrcodemin;
|
||||
|
||||
|
||||
/* do markers first */
|
||||
borderselect_markers(rect.xmin, rect.xmax, selectmode);
|
||||
|
||||
/* Lets loop throug the IpoCurves and do borderselect
|
||||
* on the curves with adrcodes in our selected range.
|
||||
*/
|
||||
@@ -884,16 +884,13 @@ void borderselect_mesh(Key *key)
|
||||
}
|
||||
}
|
||||
|
||||
/* do markers too if any */
|
||||
if (markers != NULL)
|
||||
borderselect_saction_markers(markers, xmin, xmax, selectmode);
|
||||
|
||||
/* redraw stuff */
|
||||
BIF_undo_push("Border select Action Key");
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
if (markers != NULL) allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2089,7 +2086,7 @@ static void set_snap_meshchannels(Key *key, short snaptype)
|
||||
}
|
||||
|
||||
|
||||
void snap_keys_to_frame()
|
||||
void snap_keys_to_frame(int snap_mode)
|
||||
{
|
||||
/* This function is the generic entry-point for snapping keyframes
|
||||
* to a frame(s). It passes the work off to sub-functions for the
|
||||
@@ -2099,26 +2096,20 @@ void snap_keys_to_frame()
|
||||
SpaceAction *saction;
|
||||
bAction *act;
|
||||
Key *key;
|
||||
short event;
|
||||
|
||||
/* get data */
|
||||
saction= curarea->spacedata.first;
|
||||
if (!saction) return;
|
||||
act = saction->action;
|
||||
key = get_action_mesh_key();
|
||||
|
||||
/* find the type of snapping to do */
|
||||
if (act || key)
|
||||
event = pupmenu("Snap Frames To%t|Nearest Frame%x1|Current Frame%x2");
|
||||
else return;
|
||||
|
||||
|
||||
/* handle events */
|
||||
switch (event) {
|
||||
switch (snap_mode) {
|
||||
case 1: /* snap to nearest frame */
|
||||
if (act)
|
||||
set_snap_actionchannels(act, event);
|
||||
set_snap_actionchannels(act, snap_mode);
|
||||
else
|
||||
set_snap_meshchannels(key, event);
|
||||
set_snap_meshchannels(key, snap_mode);
|
||||
|
||||
/* Clean up and redraw stuff */
|
||||
remake_action_ipos (act);
|
||||
@@ -2131,9 +2122,9 @@ void snap_keys_to_frame()
|
||||
break;
|
||||
case 2: /* snap to current frame */
|
||||
if (act)
|
||||
set_snap_actionchannels(act, event);
|
||||
set_snap_actionchannels(act, snap_mode);
|
||||
else
|
||||
set_snap_meshchannels(key, event);
|
||||
set_snap_meshchannels(key, snap_mode);
|
||||
|
||||
/* Clean up and redraw stuff */
|
||||
remake_action_ipos (act);
|
||||
@@ -2435,12 +2426,12 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
extern void do_actionbuts(unsigned short event); // drawaction.c
|
||||
SpaceAction *saction;
|
||||
bAction *act;
|
||||
ListBase *markers;
|
||||
Key *key;
|
||||
float dx,dy;
|
||||
int doredraw= 0;
|
||||
int cfra;
|
||||
short mval[2];
|
||||
short nr;
|
||||
unsigned short event= evt->event;
|
||||
short val= evt->val;
|
||||
short mousebut = L_MOUSE;
|
||||
@@ -2450,8 +2441,6 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
saction= curarea->spacedata.first;
|
||||
if (!saction)
|
||||
return;
|
||||
|
||||
markers = get_saction_markers(saction);
|
||||
|
||||
act=saction->action;
|
||||
if(val) {
|
||||
@@ -2489,9 +2478,12 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
}
|
||||
else {
|
||||
if (G.qual == LR_CTRLKEY) {
|
||||
deselect_saction_markers(markers, 1, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
deselect_markers(1, 0);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
else {
|
||||
deselect_meshchannel_keys(key, 1);
|
||||
@@ -2511,9 +2503,12 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
}
|
||||
else if (mval[0]>ACTWIDTH) {
|
||||
if (G.qual == LR_CTRLKEY) {
|
||||
deselect_saction_markers(markers, 1, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
deselect_markers (1, 0);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
else {
|
||||
deselect_actionchannel_keys (act, 1);
|
||||
@@ -2579,26 +2574,34 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
break;
|
||||
|
||||
case DKEY:
|
||||
if (key) {
|
||||
if (G.qual & LR_SHIFTKEY && mval[0]>ACTWIDTH) {
|
||||
duplicate_meshchannel_keys(key);
|
||||
if (mval[0]>ACTWIDTH) {
|
||||
if (G.qual == (LR_CTRLKEY|LR_SHIFTKEY)) {
|
||||
duplicate_marker();
|
||||
}
|
||||
}
|
||||
else if (act) {
|
||||
if (G.qual & LR_SHIFTKEY && mval[0]>ACTWIDTH){
|
||||
duplicate_actionchannel_keys();
|
||||
remake_action_ipos(act);
|
||||
else if (G.qual == LR_SHIFTKEY) {
|
||||
if (key) {
|
||||
duplicate_meshchannel_keys(key);
|
||||
}
|
||||
else if (act) {
|
||||
duplicate_actionchannel_keys();
|
||||
remake_action_ipos(act);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case GKEY:
|
||||
if (mval[0]>=ACTWIDTH) {
|
||||
if (key) {
|
||||
transform_meshchannel_keys('g', key);
|
||||
}
|
||||
else if (act) {
|
||||
transform_actionchannel_keys ('g', 0);
|
||||
if (G.qual & LR_SHIFTKEY) {
|
||||
transform_markers('g', 0);
|
||||
}
|
||||
else {
|
||||
if (mval[0]>=ACTWIDTH) {
|
||||
if (key) {
|
||||
transform_meshchannel_keys('g', key);
|
||||
}
|
||||
else if (act) {
|
||||
transform_actionchannel_keys ('g', 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -2636,25 +2639,17 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
|
||||
case MKEY:
|
||||
/* marker operations */
|
||||
if (markers != NULL) {
|
||||
if (G.qual == 0)
|
||||
add_saction_marker(markers, CFRA);
|
||||
else if (G.qual == LR_ALTKEY) {
|
||||
if( okee("Erase selected markers")==0 )
|
||||
break;
|
||||
remove_saction_markers(markers);
|
||||
}
|
||||
else if (G.qual == LR_CTRLKEY)
|
||||
rename_saction_markers(markers);
|
||||
else if (G.qual == LR_SHIFTKEY)
|
||||
transform_saction_markers('g', 0);
|
||||
else if (G.qual == (LR_CTRLKEY|LR_SHIFTKEY))
|
||||
duplicate_saction_markers(markers);
|
||||
else
|
||||
break;
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
}
|
||||
if (G.qual == 0)
|
||||
add_marker(CFRA);
|
||||
else if (G.qual == LR_SHIFTKEY)
|
||||
rename_marker();
|
||||
else
|
||||
break;
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
break;
|
||||
|
||||
case NKEY:
|
||||
@@ -2677,7 +2672,8 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
case SKEY:
|
||||
if (mval[0]>=ACTWIDTH) {
|
||||
if(G.qual & LR_SHIFTKEY) {
|
||||
snap_keys_to_frame();
|
||||
val = pupmenu("Snap Keys To%t|Nearest Frame%x1|Current Frame%x2");
|
||||
snap_keys_to_frame(val);
|
||||
}
|
||||
else {
|
||||
if (key)
|
||||
@@ -2713,7 +2709,7 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
case PAGEUPKEY:
|
||||
if (key) {
|
||||
/* only jump to markers possible (key channels can't be moved yet) */
|
||||
nextprev_saction_markers(markers, 1);
|
||||
nextprev_marker(1);
|
||||
}
|
||||
else {
|
||||
if(G.qual & LR_SHIFTKEY)
|
||||
@@ -2721,13 +2717,13 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
else if (G.qual & LR_CTRLKEY)
|
||||
up_sel_action();
|
||||
else
|
||||
nextprev_saction_markers(markers, 1);
|
||||
nextprev_marker(1);
|
||||
}
|
||||
break;
|
||||
case PAGEDOWNKEY:
|
||||
if (key) {
|
||||
/* only jump to markers possible (key channels can't be moved yet) */
|
||||
nextprev_saction_markers(markers, -1);
|
||||
nextprev_marker(-1);
|
||||
}
|
||||
else {
|
||||
if(G.qual & LR_SHIFTKEY)
|
||||
@@ -2735,19 +2731,33 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
else if (G.qual & LR_CTRLKEY)
|
||||
down_sel_action();
|
||||
else
|
||||
nextprev_saction_markers(markers, -1);
|
||||
nextprev_marker(-1);
|
||||
}
|
||||
break;
|
||||
case DELKEY:
|
||||
case XKEY:
|
||||
if (key) {
|
||||
delete_meshchannel_keys(key);
|
||||
}
|
||||
else {
|
||||
if (mval[0]<NAMEWIDTH)
|
||||
delete_actionchannels ();
|
||||
else
|
||||
delete_actionchannel_keys ();
|
||||
nr= pupmenu("Erase selected%t|Keys %x1|Markers %x2|Both %x3");
|
||||
if (nr>0) {
|
||||
if (nr==1||nr==3) {
|
||||
if (key) {
|
||||
delete_meshchannel_keys(key);
|
||||
}
|
||||
else {
|
||||
if (mval[0]<NAMEWIDTH)
|
||||
delete_actionchannels();
|
||||
else
|
||||
delete_actionchannel_keys();
|
||||
}
|
||||
}
|
||||
if (nr==2) {
|
||||
remove_marker();
|
||||
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
/* LEFTMOUSE and RIGHTMOUSE event codes can be swapped above,
|
||||
@@ -2913,351 +2923,14 @@ int get_nearest_key_num(Key *key, short *mval, float *x) {
|
||||
}
|
||||
|
||||
/* ************************************* Action Editor Markers ************************************* */
|
||||
|
||||
/* returns the current active markers */
|
||||
ListBase *get_saction_markers (SpaceAction *saction)
|
||||
void get_minmax_saction_markers(float *first, float *last)
|
||||
{
|
||||
TimeMarker *marker;
|
||||
ListBase *markers;
|
||||
|
||||
// if (saction->markert == SACTION_SCMARKERS)
|
||||
markers = &(G.scene->markers);
|
||||
// else if ((saction->markert == SACTION_ACMARKERS) && (saction->action != NULL))
|
||||
// markers = &(saction->action->markers);
|
||||
// else
|
||||
// markers = NULL;
|
||||
|
||||
return markers;
|
||||
}
|
||||
|
||||
/* add a TimeMarker - code basically taken from edittime.c */
|
||||
void add_saction_marker (ListBase *markers, int frame)
|
||||
{
|
||||
TimeMarker *marker;
|
||||
|
||||
if (markers == NULL)
|
||||
return;
|
||||
|
||||
/* two markers can't be at the same place */
|
||||
for(marker= markers->first; marker; marker= marker->next)
|
||||
if(marker->frame == frame) return;
|
||||
/* deselect all */
|
||||
for(marker= markers->first; marker; marker= marker->next)
|
||||
marker->flag &= ~SELECT;
|
||||
|
||||
marker = MEM_callocN(sizeof(TimeMarker), "TimeMarker");
|
||||
marker->flag= SELECT;
|
||||
marker->frame= frame;
|
||||
BLI_addtail(markers, marker);
|
||||
|
||||
BIF_undo_push("Add Marker");
|
||||
}
|
||||
|
||||
/* remove a TimeMarker - code basically taken from edittime.c */
|
||||
void remove_saction_markers(ListBase *markers)
|
||||
{
|
||||
TimeMarker *marker;
|
||||
|
||||
if (markers == NULL)
|
||||
return;
|
||||
|
||||
for(marker= markers->first; marker; marker= marker->next) {
|
||||
if(marker->flag & SELECT){
|
||||
BLI_freelinkN(markers, marker);
|
||||
}
|
||||
}
|
||||
|
||||
BIF_undo_push("Remove Marker");
|
||||
}
|
||||
|
||||
/* rename a TimeMarker - code basically taken from edittime.c */
|
||||
void rename_saction_markers(ListBase *markers)
|
||||
{
|
||||
TimeMarker *marker;
|
||||
char name[64];
|
||||
|
||||
if (markers == NULL)
|
||||
return;
|
||||
|
||||
for(marker= markers->first; marker; marker= marker->next) {
|
||||
if(marker->flag & SELECT) {
|
||||
sprintf(name, marker->name);
|
||||
if (sbutton(name, 0, sizeof(name)-1, "Name: "))
|
||||
BLI_strncpy(marker->name, name, sizeof(marker->name));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
BIF_undo_push("Rename Marker");
|
||||
}
|
||||
|
||||
/* duplicate selected TimeMarkers - code basically taken from edittime.c */
|
||||
void duplicate_saction_markers(ListBase *markers)
|
||||
{
|
||||
TimeMarker *marker, *newmarker;
|
||||
|
||||
if (markers == NULL)
|
||||
return;
|
||||
|
||||
/* go through the list of markers, duplicate selected markers and add duplicated copies
|
||||
* to the begining of the list (unselect original markers) */
|
||||
for(marker= markers->first; marker; marker= marker->next) {
|
||||
if(marker->flag & SELECT){
|
||||
/* unselect selected marker */
|
||||
marker->flag &= ~SELECT;
|
||||
/* create and set up new marker */
|
||||
newmarker = MEM_callocN(sizeof(TimeMarker), "TimeMarker");
|
||||
newmarker->flag= SELECT;
|
||||
newmarker->frame= marker->frame;
|
||||
BLI_strncpy(newmarker->name, marker->name, sizeof(marker->name));
|
||||
/* new marker is added to the begining of list */
|
||||
BLI_addhead(markers, newmarker);
|
||||
}
|
||||
}
|
||||
|
||||
transform_saction_markers('g', 0);
|
||||
}
|
||||
|
||||
void transform_saction_markers(int mode, int smode) // mode and smode unused here, for callback
|
||||
{
|
||||
SpaceAction *saction= curarea->spacedata.first;
|
||||
TimeMarker *marker, *selmarker=NULL;
|
||||
ListBase *markers;
|
||||
float dx, fac;
|
||||
int a, ret_val= 0, totmark=0, *oldframe, offs, firsttime=1;
|
||||
unsigned short event;
|
||||
short val, pmval[2], mval[2], mvalo[2];
|
||||
char str[32];
|
||||
|
||||
markers= get_saction_markers(saction);
|
||||
if (markers == NULL) return;
|
||||
|
||||
for(marker= markers->first; marker; marker= marker->next) {
|
||||
if(marker->flag & SELECT) totmark++;
|
||||
}
|
||||
if(totmark==0) return;
|
||||
|
||||
oldframe= MEM_mallocN(totmark*sizeof(int), "marker array");
|
||||
for(a=0, marker= markers->first; marker; marker= marker->next) {
|
||||
if(marker->flag & SELECT) {
|
||||
oldframe[a]= marker->frame;
|
||||
selmarker= marker; // used for hederprint
|
||||
a++;
|
||||
}
|
||||
}
|
||||
|
||||
dx= G.v2d->mask.xmax-G.v2d->mask.xmin;
|
||||
dx= (G.v2d->cur.xmax-G.v2d->cur.xmin)/dx;
|
||||
|
||||
getmouseco_areawin(pmval);
|
||||
mvalo[0]= pmval[0];
|
||||
|
||||
while(ret_val == 0) {
|
||||
|
||||
getmouseco_areawin(mval);
|
||||
|
||||
if (mval[0] != mvalo[0] || firsttime) {
|
||||
mvalo[0]= mval[0];
|
||||
firsttime= 0;
|
||||
|
||||
fac= (((float)(mval[0] - pmval[0]))*dx);
|
||||
|
||||
apply_keyb_grid(&fac, 0.0, 1.0, 0.1, U.flag & USER_AUTOGRABGRID);
|
||||
offs= (int)fac;
|
||||
|
||||
for(a=0, marker= markers->first; marker; marker= marker->next) {
|
||||
if(marker->flag & SELECT) {
|
||||
marker->frame= oldframe[a] + offs;
|
||||
a++;
|
||||
}
|
||||
}
|
||||
|
||||
if(totmark==1) // we print current marker value
|
||||
sprintf(str, "Marker %.2f offset %.2f", (double)(selmarker->frame), (double)(offs));
|
||||
else
|
||||
sprintf(str, "Marker offset %.2f ", (double)(offs));
|
||||
|
||||
headerprint(str);
|
||||
|
||||
force_draw(0); // areas identical to this, 0 = no header
|
||||
}
|
||||
else PIL_sleep_ms(10); // idle
|
||||
|
||||
/* emptying queue and reading events */
|
||||
while( qtest() ) {
|
||||
event= extern_qread(&val);
|
||||
|
||||
if(val) {
|
||||
if(event==ESCKEY || event==RIGHTMOUSE) ret_val= 2;
|
||||
else if(event==LEFTMOUSE || event==RETKEY || event==SPACEKEY) ret_val= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* restore? */
|
||||
if(ret_val==2) {
|
||||
for(a=0, marker= markers->first; marker; marker= marker->next) {
|
||||
if(marker->flag & SELECT) {
|
||||
marker->frame= oldframe[a];
|
||||
a++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
BIF_undo_push("Move Markers");
|
||||
}
|
||||
MEM_freeN(oldframe);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
}
|
||||
|
||||
TimeMarker *find_nearest_saction_marker(ListBase *markers)
|
||||
{
|
||||
TimeMarker *marker;
|
||||
float xmin, xmax;
|
||||
rctf rectf;
|
||||
short mval[2];
|
||||
|
||||
if (markers == NULL)
|
||||
return NULL;
|
||||
|
||||
getmouseco_areawin (mval);
|
||||
|
||||
/* first clip selection in Y */
|
||||
if(mval[1] > 30)
|
||||
return NULL;
|
||||
|
||||
mval[0]-=7;
|
||||
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmin, &rectf.ymin);
|
||||
mval[0]+=14;
|
||||
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
|
||||
|
||||
xmin= rectf.xmin;
|
||||
xmax= rectf.xmax;
|
||||
|
||||
for(marker= markers->first; marker; marker= marker->next) {
|
||||
if ((marker->frame > xmin) && (marker->frame <= xmax)) {
|
||||
return marker;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* select next/previous marker */
|
||||
void nextprev_saction_markers(ListBase *markers, short dir)
|
||||
{
|
||||
TimeMarker *marker, *cur=NULL, *first, *last;
|
||||
int mindist= MAXFRAME, dist;
|
||||
|
||||
if (markers == NULL)
|
||||
return;
|
||||
|
||||
first= last= markers->first;
|
||||
for(marker= markers->first; marker; marker= marker->next) {
|
||||
/* find closest to current frame first */
|
||||
dist= (marker->frame/G.scene->r.framelen) - CFRA;
|
||||
if(dir==1 && dist>0 && dist<mindist) {
|
||||
mindist= dist;
|
||||
cur= marker;
|
||||
}
|
||||
else if(dir==-1 && dist<0 && -dist<mindist) {
|
||||
mindist= -dist;
|
||||
cur= marker;
|
||||
}
|
||||
/* find first/last */
|
||||
if(marker->frame > last->frame) last= marker;
|
||||
if(marker->frame < first->frame) first= marker;
|
||||
}
|
||||
|
||||
if(cur==NULL) {
|
||||
if(dir==1) cur= first;
|
||||
else cur= last;
|
||||
}
|
||||
if(cur) {
|
||||
CFRA= cur->frame/G.scene->r.framelen;
|
||||
update_for_newframe();
|
||||
allqueue(REDRAWALL, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* select/deselect all TimeMarkers */
|
||||
void deselect_saction_markers(ListBase *markers, short test, short sel)
|
||||
{
|
||||
TimeMarker *marker;
|
||||
|
||||
if (markers == NULL)
|
||||
return;
|
||||
|
||||
/* check if need to find out whether to how to select markers */
|
||||
if (test) {
|
||||
/* dependant on existing selection */
|
||||
/* determine if select all or deselect all */
|
||||
sel = 1;
|
||||
for (marker= markers->first; marker; marker= marker->next) {
|
||||
if (marker->flag & SELECT) {
|
||||
sel = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* do selection */
|
||||
for (marker= markers->first; marker; marker= marker->next) {
|
||||
if (sel) {
|
||||
if ((marker->flag & SELECT)==0)
|
||||
marker->flag |= SELECT;
|
||||
}
|
||||
else {
|
||||
if (marker->flag & SELECT)
|
||||
marker->flag &= ~SELECT;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* not dependant on existing selection */
|
||||
for (marker= markers->first; marker; marker= marker->next) {
|
||||
if (sel) {
|
||||
if ((marker->flag & SELECT)==0)
|
||||
marker->flag |= SELECT;
|
||||
}
|
||||
else {
|
||||
if (marker->flag & SELECT)
|
||||
marker->flag &= ~SELECT;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void borderselect_saction_markers(ListBase *markers, float xmin, float xmax, int selectmode)
|
||||
{
|
||||
TimeMarker *marker;
|
||||
|
||||
if (markers == NULL)
|
||||
return;
|
||||
|
||||
for(marker= markers->first; marker; marker= marker->next) {
|
||||
if ((marker->frame > xmin) && (marker->frame <= xmax)) {
|
||||
switch (selectmode) {
|
||||
case SELECT_ADD:
|
||||
if ((marker->flag & SELECT) == 0)
|
||||
marker->flag |= SELECT;
|
||||
break;
|
||||
case SELECT_SUBTRACT:
|
||||
if (marker->flag & SELECT)
|
||||
marker->flag &= ~SELECT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void get_minmax_saction_markers(ListBase *markers, float *first, float *last)
|
||||
{
|
||||
TimeMarker *marker;
|
||||
float min, max;
|
||||
|
||||
if (!markers)
|
||||
return;
|
||||
|
||||
markers= &(G.scene->markers);
|
||||
|
||||
min= ((TimeMarker *)markers->first)->frame;
|
||||
max= ((TimeMarker *)markers->last)->frame;
|
||||
|
||||
|
||||
@@ -111,6 +111,7 @@
|
||||
#include "BSE_headerbuttons.h"
|
||||
#include "BSE_node.h"
|
||||
#include "BSE_sequence.h"
|
||||
#include "BSE_time.h"
|
||||
|
||||
#include "blendef.h"
|
||||
#include "mydevice.h"
|
||||
@@ -1360,6 +1361,7 @@ void mouse_select_ipo(void)
|
||||
IpoCurve *icu;
|
||||
IpoKey *ik, *actik;
|
||||
BezTriple *bezt;
|
||||
TimeMarker *marker;
|
||||
float x, y, dist, mindist;
|
||||
int a, oldflag = 0, hand, ok;
|
||||
short mval[2], xo, yo;
|
||||
@@ -1367,6 +1369,7 @@ void mouse_select_ipo(void)
|
||||
if(G.sipo->editipo==0) return;
|
||||
|
||||
get_status_editipo();
|
||||
marker=find_nearest_marker(1);
|
||||
|
||||
if(G.sipo->showkey) {
|
||||
getmouseco_areawin(mval);
|
||||
@@ -1435,6 +1438,21 @@ void mouse_select_ipo(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (marker) {
|
||||
/* select timeline marker */
|
||||
if ((G.qual & LR_SHIFTKEY)==0) {
|
||||
oldflag= marker->flag;
|
||||
deselect_markers(0, 0);
|
||||
|
||||
if (oldflag & SELECT)
|
||||
marker->flag &= ~SELECT;
|
||||
else
|
||||
marker->flag |= SELECT;
|
||||
}
|
||||
else {
|
||||
marker->flag |= SELECT;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
/* vertex keys ? */
|
||||
@@ -1532,8 +1550,13 @@ void mouse_select_ipo(void)
|
||||
getmouseco_areawin(mval);
|
||||
if(abs(mval[0]-xo)+abs(mval[1]-yo) > 4) {
|
||||
|
||||
if(actkb) move_keys(OBACT);
|
||||
else transform_ipo('g');
|
||||
if (marker) {
|
||||
transform_markers('g', 0);
|
||||
}
|
||||
else {
|
||||
if(actkb) move_keys(OBACT);
|
||||
else transform_ipo('g');
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -3581,7 +3604,7 @@ void del_ipoCurve ( IpoCurve * icu )
|
||||
}
|
||||
}
|
||||
|
||||
void del_ipo(void)
|
||||
void del_ipo(int need_check)
|
||||
{
|
||||
EditIpo *ei;
|
||||
BezTriple *bezt, *bezt1;
|
||||
@@ -3592,12 +3615,17 @@ void del_ipo(void)
|
||||
if(G.sipo->ipo && G.sipo->ipo->id.lib) return;
|
||||
|
||||
if(totipo_edit==0 && totipo_sel==0 && totipo_vertsel==0) {
|
||||
if(okee("Erase selected keys"))
|
||||
delete_key(OBACT);
|
||||
if (need_check) {
|
||||
if(okee("Erase selected keys"))
|
||||
delete_key(OBACT);
|
||||
}
|
||||
else
|
||||
delete_key(OBACT);
|
||||
return;
|
||||
}
|
||||
|
||||
if( okee("Erase selected")==0 ) return;
|
||||
if (need_check)
|
||||
if( okee("Erase selected")==0 ) return;
|
||||
|
||||
// first round, can we delete entire parts?
|
||||
ei= G.sipo->editipo;
|
||||
|
||||
@@ -67,6 +67,7 @@
|
||||
#include "BSE_editipo.h"
|
||||
#include "BSE_drawipo.h"
|
||||
#include "BSE_trans_types.h"
|
||||
#include "BSE_time.h"
|
||||
|
||||
#include "BDR_drawobject.h"
|
||||
|
||||
@@ -771,7 +772,10 @@ void borderselect_ipo(void)
|
||||
mval[0]= rect.xmax;
|
||||
mval[1]= rect.ymax;
|
||||
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
|
||||
|
||||
|
||||
/* do markers first */
|
||||
borderselect_markers(rectf.xmin, rectf.xmax, val);
|
||||
|
||||
if(G.sipo->showkey) {
|
||||
ik= G.sipo->ipokey.first;
|
||||
while(ik) {
|
||||
@@ -812,7 +816,11 @@ void borderselect_ipo(void)
|
||||
}
|
||||
}
|
||||
BIF_undo_push("Border select Ipo");
|
||||
scrarea_queue_winredraw(curarea);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -81,6 +81,7 @@
|
||||
#include "BSE_filesel.h"
|
||||
#include "BDR_editobject.h"
|
||||
#include "BSE_drawnla.h"
|
||||
#include "BSE_time.h"
|
||||
|
||||
#include "blendef.h"
|
||||
#include "mydevice.h"
|
||||
@@ -229,7 +230,7 @@ void reset_action_strips(int val)
|
||||
allqueue (REDRAWNLA, 0);
|
||||
}
|
||||
|
||||
void snap_action_strips(void)
|
||||
void snap_action_strips(int snap_mode)
|
||||
{
|
||||
Base *base;
|
||||
bActionStrip *strip;
|
||||
@@ -237,8 +238,25 @@ void snap_action_strips(void)
|
||||
for (base=G.scene->base.first; base; base=base->next) {
|
||||
for (strip = base->object->nlastrips.last; strip; strip=strip->prev) {
|
||||
if (strip->flag & ACTSTRIP_SELECT) {
|
||||
strip->start= floor(strip->start+0.5);
|
||||
strip->end= floor(strip->end+0.5);
|
||||
if (snap_mode==1) {
|
||||
/* nearest frame */
|
||||
strip->start= floor(strip->start+0.5);
|
||||
strip->end= floor(strip->end+0.5);
|
||||
}
|
||||
else if (snap_mode==2) {
|
||||
/* current frame */
|
||||
float diff;
|
||||
if (CFRA < strip->start) {
|
||||
diff = (strip->start - CFRA);
|
||||
strip->start -= diff;
|
||||
strip->end -= diff;
|
||||
}
|
||||
else {
|
||||
diff = (CFRA - strip->start);
|
||||
strip->start += diff;
|
||||
strip->end += diff;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -953,10 +971,7 @@ void delete_nlachannel_keys(void)
|
||||
bActionChannel *chan;
|
||||
bConstraintChannel *conchan;
|
||||
bActionStrip *strip, *nextstrip;
|
||||
|
||||
if (!okee("Erase selected strips and/or keys"))
|
||||
return;
|
||||
|
||||
|
||||
for (base = G.scene->base.first; base; base=base->next){
|
||||
|
||||
/* Delete object ipos */
|
||||
@@ -1059,11 +1074,11 @@ void borderselect_nla(void)
|
||||
bConstraintChannel *conchan;
|
||||
|
||||
if ( (val = get_border (&rect, 3)) ){
|
||||
if (val == LEFTMOUSE)
|
||||
selectmode = SELECT_ADD;
|
||||
else
|
||||
selectmode = SELECT_SUBTRACT;
|
||||
|
||||
if (val == LEFTMOUSE)
|
||||
selectmode = SELECT_ADD;
|
||||
else
|
||||
selectmode = SELECT_SUBTRACT;
|
||||
|
||||
mval[0]= rect.xmin;
|
||||
mval[1]= rect.ymin+2;
|
||||
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmin, &rectf.ymin);
|
||||
@@ -1071,6 +1086,9 @@ void borderselect_nla(void)
|
||||
mval[1]= rect.ymax-2;
|
||||
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
|
||||
|
||||
/* do markers first */
|
||||
borderselect_markers(rectf.xmin, rectf.xmax, selectmode);
|
||||
|
||||
ymax = count_nla_levels();
|
||||
ymax*= (NLACHANNELHEIGHT+NLACHANNELSKIP);
|
||||
ymax+= (NLACHANNELHEIGHT+NLACHANNELSKIP)/2;
|
||||
@@ -1136,9 +1154,11 @@ void borderselect_nla(void)
|
||||
}
|
||||
}
|
||||
BIF_undo_push("Border select NLA");
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1150,6 +1170,7 @@ static void mouse_nla(int selectmode)
|
||||
bActionChannel *chan;
|
||||
bActionStrip *rstrip;
|
||||
bConstraintChannel *conchan;
|
||||
TimeMarker *marker;
|
||||
float selx;
|
||||
short mval[2];
|
||||
short sel, isdone=0;
|
||||
@@ -1158,6 +1179,7 @@ static void mouse_nla(int selectmode)
|
||||
|
||||
/* Try object ipo or ob-constraint ipo selection */
|
||||
base= get_nearest_nlachannel_ob_key(&selx, &sel);
|
||||
marker=find_nearest_marker(1);
|
||||
if (base) {
|
||||
isdone= 1;
|
||||
|
||||
@@ -1172,6 +1194,31 @@ static void mouse_nla(int selectmode)
|
||||
for (conchan=base->object->constraintChannels.first; conchan; conchan=conchan->next)
|
||||
select_ipo_key(conchan->ipo, selx, selectmode);
|
||||
}
|
||||
else if (marker) {
|
||||
/* marker */
|
||||
if (selectmode == SELECT_REPLACE) {
|
||||
deselect_markers(0, 0);
|
||||
marker->flag |= SELECT;
|
||||
}
|
||||
else if (selectmode == SELECT_INVERT) {
|
||||
if (marker->flag & SELECT)
|
||||
marker->flag &= ~SELECT;
|
||||
else
|
||||
marker->flag |= SELECT;
|
||||
}
|
||||
else if (selectmode == SELECT_ADD)
|
||||
marker->flag |= SELECT;
|
||||
else if (selectmode == SELECT_SUBTRACT)
|
||||
marker->flag &= ~SELECT;
|
||||
|
||||
std_rmouse_transform(transform_markers);
|
||||
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
else {
|
||||
/* Try action ipo selection */
|
||||
act= get_nearest_nlachannel_ac_key(&selx, &sel);
|
||||
@@ -1606,21 +1653,53 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
break;
|
||||
|
||||
case EQUALKEY:
|
||||
case PAGEUPKEY:
|
||||
shift_nlastrips_up();
|
||||
break;
|
||||
|
||||
case PAGEUPKEY:
|
||||
if (G.qual & LR_CTRLKEY)
|
||||
shift_nlastrips_up();
|
||||
else {
|
||||
nextprev_marker(1);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
break;
|
||||
|
||||
case MINUSKEY:
|
||||
case PAGEDOWNKEY:
|
||||
shift_nlastrips_down();
|
||||
break;
|
||||
|
||||
case PAGEDOWNKEY:
|
||||
if (G.qual & LR_CTRLKEY)
|
||||
shift_nlastrips_down();
|
||||
else {
|
||||
nextprev_marker(-1);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
break;
|
||||
|
||||
case AKEY:
|
||||
if (G.qual & LR_SHIFTKEY){
|
||||
add_nlablock();
|
||||
allqueue (REDRAWNLA, 0);
|
||||
allqueue (REDRAWVIEW3D, 0);
|
||||
}
|
||||
else if (G.qual & LR_CTRLKEY) {
|
||||
deselect_markers(1, 0);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
else{
|
||||
if (mval[0]>=NLAWIDTH)
|
||||
deselect_nlachannel_keys(1);
|
||||
@@ -1656,18 +1735,48 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
break;
|
||||
|
||||
case DKEY:
|
||||
if (G.qual & LR_SHIFTKEY && mval[0]>=NLAWIDTH){
|
||||
if (G.qual == (LR_CTRLKEY|LR_SHIFTKEY) && mval[0]>=NLAWIDTH) {
|
||||
duplicate_marker();
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
else if (G.qual & LR_SHIFTKEY && mval[0]>=NLAWIDTH){
|
||||
duplicate_nlachannel_keys();
|
||||
update_for_newframe_muted();
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case GKEY:
|
||||
if (mval[0]>=NLAWIDTH)
|
||||
transform_nlachannel_keys ('g', 0);
|
||||
update_for_newframe_muted();
|
||||
if (mval[0]>=NLAWIDTH) {
|
||||
if (G.qual & LR_SHIFTKEY) {
|
||||
transform_markers('g', 0);
|
||||
}
|
||||
else {
|
||||
transform_nlachannel_keys ('g', 0);
|
||||
update_for_newframe_muted();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case MKEY:
|
||||
/* marker operations */
|
||||
if (G.qual == 0)
|
||||
add_marker(CFRA);
|
||||
else if (G.qual == LR_SHIFTKEY)
|
||||
rename_marker();
|
||||
else
|
||||
break;
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
break;
|
||||
|
||||
case NKEY:
|
||||
if(G.qual==0) {
|
||||
toggle_blockhandler(curarea, NLA_HANDLER_PROPERTIES, UI_PNL_TO_MOUSE);
|
||||
@@ -1687,8 +1796,9 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
reset_action_strips(2);
|
||||
}
|
||||
else if(G.qual & LR_SHIFTKEY) {
|
||||
if(okee("Snap Strips to Frame"))
|
||||
snap_action_strips();
|
||||
val= pupmenu("Snap To%t|Nearest Frame%x1|Current Frame%x2");
|
||||
if (val==1 || val==2)
|
||||
snap_action_strips(val);
|
||||
}
|
||||
else {
|
||||
if (mval[0]>=NLAWIDTH)
|
||||
@@ -1699,10 +1809,22 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
|
||||
case DELKEY:
|
||||
case XKEY:
|
||||
if (mval[0]>=NLAWIDTH)
|
||||
delete_nlachannel_keys ();
|
||||
|
||||
update_for_newframe_muted();
|
||||
if (mval[0]>=NLAWIDTH) {
|
||||
val= pupmenu("Erase selected%t|Strips and/or Keys%x1|Markers%x2");
|
||||
if (val==1) {
|
||||
delete_nlachannel_keys();
|
||||
update_for_newframe_muted();
|
||||
}
|
||||
else if (val==2) {
|
||||
remove_marker();
|
||||
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
/* LEFTMOUSE and RIGHTMOUSE event codes can be swapped above,
|
||||
|
||||
@@ -73,9 +73,13 @@
|
||||
#include "BIF_interface.h"
|
||||
#include "BIF_editsound.h"
|
||||
#include "BIF_mywindow.h"
|
||||
#include "BIF_toolbox.h"
|
||||
|
||||
#include "BSE_drawipo.h"
|
||||
#include "BSE_headerbuttons.h"
|
||||
#include "BSE_time.h"
|
||||
|
||||
#include "BDR_editobject.h"
|
||||
|
||||
#include "blendef.h"
|
||||
|
||||
@@ -163,14 +167,28 @@ void winqreadsoundspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
view2dmove(event); /* in drawipo.c */
|
||||
break;
|
||||
case RIGHTMOUSE:
|
||||
nr= pupmenu("Time value%t|Frames %x1|Seconds%x2");
|
||||
if (nr>0) {
|
||||
if(nr==1) ssound->flag |= SND_DRAWFRAMES;
|
||||
else ssound->flag &= ~SND_DRAWFRAMES;
|
||||
doredraw= 1;
|
||||
}
|
||||
{
|
||||
TimeMarker *marker;
|
||||
|
||||
getmouseco_areawin(mval);
|
||||
areamouseco_to_ipoco(G.v2d, mval, &dx, &dy);
|
||||
|
||||
marker = find_nearest_marker(0);
|
||||
if (marker) {
|
||||
if ((G.qual & LR_SHIFTKEY)==0)
|
||||
deselect_markers(0, 0);
|
||||
|
||||
if (marker->flag & SELECT)
|
||||
marker->flag &= ~SELECT;
|
||||
else
|
||||
marker->flag |= SELECT;
|
||||
}
|
||||
|
||||
force_draw(0);
|
||||
std_rmouse_transform(transform_markers);
|
||||
}
|
||||
break;
|
||||
|
||||
case PADPLUSKEY:
|
||||
dx= (float)(0.1154*(G.v2d->cur.xmax-G.v2d->cur.xmin));
|
||||
G.v2d->cur.xmin+= dx;
|
||||
@@ -190,6 +208,85 @@ void winqreadsoundspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
case HOMEKEY:
|
||||
do_sound_buttons(B_SOUNDHOME);
|
||||
break;
|
||||
|
||||
case PAGEUPKEY: /* cfra to next marker */
|
||||
nextprev_marker(1);
|
||||
break;
|
||||
case PAGEDOWNKEY: /* cfra to prev marker */
|
||||
nextprev_marker(-1);
|
||||
break;
|
||||
|
||||
case AKEY: /* select/deselect all */
|
||||
deselect_markers(1, 0);
|
||||
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
break;
|
||||
|
||||
case BKEY: /* borderselect markers */
|
||||
borderselect_timeline_markers();
|
||||
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
break;
|
||||
|
||||
case DKEY: /* duplicate selected marker(s) */
|
||||
if (G.qual & LR_SHIFTKEY) {
|
||||
duplicate_marker();
|
||||
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
break;
|
||||
|
||||
case GKEY:
|
||||
transform_markers('g', 0);
|
||||
break;
|
||||
|
||||
case MKEY: /* add marker or rename first selected */
|
||||
if (G.qual & LR_SHIFTKEY)
|
||||
rename_marker();
|
||||
else
|
||||
add_marker(CFRA);
|
||||
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
break;
|
||||
|
||||
case TKEY: /* toggle time display */
|
||||
nr= pupmenu("Time value%t|Frames %x1|Seconds%x2");
|
||||
if (nr>0) {
|
||||
if(nr==1) ssound->flag |= SND_DRAWFRAMES;
|
||||
else ssound->flag &= ~SND_DRAWFRAMES;
|
||||
doredraw= 1;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case DELKEY: /* delete selected markers */
|
||||
case XKEY:
|
||||
if (okee("Erase selected")) {
|
||||
remove_marker();
|
||||
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -63,8 +63,10 @@
|
||||
#include "BIF_interface.h"
|
||||
#include "BIF_toolbox.h"
|
||||
#include "BIF_mywindow.h"
|
||||
#include "BIF_editaction.h"
|
||||
|
||||
#include "BSE_drawipo.h"
|
||||
#include "BSE_edit.h"
|
||||
#include "BSE_headerbuttons.h"
|
||||
#include "BSE_time.h"
|
||||
|
||||
@@ -79,10 +81,10 @@
|
||||
/* declarations */
|
||||
void winqreadtimespace(ScrArea *, void *, BWinEvent *);
|
||||
|
||||
/* ************* Timeline marker code **************** */
|
||||
/* ************* Marker API **************** */
|
||||
|
||||
/* add TimeMarker at curent frame */
|
||||
void add_timeline_marker(int frame)
|
||||
void add_marker(int frame)
|
||||
{
|
||||
TimeMarker *marker;
|
||||
|
||||
@@ -98,29 +100,29 @@ void add_timeline_marker(int frame)
|
||||
marker->frame= frame;
|
||||
BLI_addtail(&(G.scene->markers), marker);
|
||||
|
||||
BIF_undo_push("Add Timeline Marker");
|
||||
BIF_undo_push("Add Marker");
|
||||
}
|
||||
|
||||
/* remove TimeMarker */
|
||||
void remove_timeline_marker(void)
|
||||
/* remove selected TimeMarkers */
|
||||
void remove_marker(void)
|
||||
{
|
||||
TimeMarker *marker;
|
||||
|
||||
|
||||
for(marker= G.scene->markers.first; marker; marker= marker->next) {
|
||||
if(marker->flag & SELECT){
|
||||
BLI_freelinkN(&G.scene->markers, marker);
|
||||
BLI_freelinkN(&(G.scene->markers), marker);
|
||||
}
|
||||
}
|
||||
|
||||
BIF_undo_push("Remove Timeline Marker");
|
||||
BIF_undo_push("Remove Marker");
|
||||
}
|
||||
|
||||
/* rename first selected TimeMarker */
|
||||
void rename_timeline_marker(void)
|
||||
void rename_marker(void)
|
||||
{
|
||||
TimeMarker *marker;
|
||||
char name[64];
|
||||
|
||||
|
||||
for(marker= G.scene->markers.first; marker; marker= marker->next) {
|
||||
if(marker->flag & SELECT) {
|
||||
sprintf(name, marker->name);
|
||||
@@ -130,14 +132,14 @@ void rename_timeline_marker(void)
|
||||
}
|
||||
}
|
||||
|
||||
BIF_undo_push("Rename Timeline Marker");
|
||||
BIF_undo_push("Rename Marker");
|
||||
}
|
||||
|
||||
/* duplicate selected TimeMarkers */
|
||||
void duplicate_timeline_marker(void)
|
||||
void duplicate_marker(void)
|
||||
{
|
||||
TimeMarker *marker, *newmarker;
|
||||
|
||||
|
||||
/* go through the list of markers, duplicate selected markers and add duplicated copies
|
||||
* to the begining of the list (unselect original markers) */
|
||||
for(marker= G.scene->markers.first; marker; marker= marker->next) {
|
||||
@@ -154,12 +156,288 @@ void duplicate_timeline_marker(void)
|
||||
}
|
||||
}
|
||||
|
||||
timeline_grab('g', 0);
|
||||
transform_markers('g', 0);
|
||||
}
|
||||
|
||||
void transform_markers(int mode, int smode) // mode and smode unused here, for callback
|
||||
{
|
||||
SpaceLink *slink= curarea->spacedata.first;
|
||||
SpaceTime *stime= curarea->spacedata.first;
|
||||
TimeMarker *marker, *selmarker=NULL;
|
||||
float dx, fac;
|
||||
int a, ret_val= 0, totmark=0, *oldframe, offs, firsttime=1;
|
||||
unsigned short event;
|
||||
short val, pmval[2], mval[2], mvalo[2];
|
||||
char str[32];
|
||||
|
||||
for(marker= G.scene->markers.first; marker; marker= marker->next) {
|
||||
if(marker->flag & SELECT) totmark++;
|
||||
}
|
||||
if(totmark==0) return;
|
||||
|
||||
oldframe= MEM_mallocN(totmark*sizeof(int), "marker array");
|
||||
for(a=0, marker= G.scene->markers.first; marker; marker= marker->next) {
|
||||
if(marker->flag & SELECT) {
|
||||
oldframe[a]= marker->frame;
|
||||
selmarker= marker; // used for hederprint
|
||||
a++;
|
||||
}
|
||||
}
|
||||
|
||||
dx= G.v2d->mask.xmax-G.v2d->mask.xmin;
|
||||
dx= (G.v2d->cur.xmax-G.v2d->cur.xmin)/dx;
|
||||
|
||||
getmouseco_areawin(pmval);
|
||||
mvalo[0]= pmval[0];
|
||||
|
||||
while(ret_val == 0) {
|
||||
|
||||
getmouseco_areawin(mval);
|
||||
|
||||
if (mval[0] != mvalo[0] || firsttime) {
|
||||
mvalo[0]= mval[0];
|
||||
firsttime= 0;
|
||||
|
||||
fac= (((float)(mval[0] - pmval[0]))*dx);
|
||||
|
||||
if (ELEM(slink->spacetype, SPACE_TIME, SPACE_SOUND))
|
||||
apply_keyb_grid(&fac, 0.0, (float)G.scene->r.frs_sec, 0.1*(float)G.scene->r.frs_sec, 0);
|
||||
else
|
||||
apply_keyb_grid(&fac, 0.0, 1.0, 0.1, U.flag & USER_AUTOGRABGRID);
|
||||
offs= (int)fac;
|
||||
|
||||
for(a=0, marker= G.scene->markers.first; marker; marker= marker->next) {
|
||||
if(marker->flag & SELECT) {
|
||||
marker->frame= oldframe[a] + offs;
|
||||
a++;
|
||||
}
|
||||
}
|
||||
|
||||
if(totmark==1) { // we print current marker value
|
||||
if (ELEM(slink->spacetype, SPACE_TIME, SPACE_SOUND)) {
|
||||
if(stime->flag & TIME_DRAWFRAMES)
|
||||
sprintf(str, "Marker %d offset %d", selmarker->frame, offs);
|
||||
else
|
||||
sprintf(str, "Marker %.2f offset %.2f", (selmarker->frame/(float)G.scene->r.frs_sec), (offs/(float)G.scene->r.frs_sec));
|
||||
}
|
||||
else {
|
||||
sprintf(str, "Marker %.2f offset %.2f", (double)(selmarker->frame), (double)(offs));
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (ELEM(slink->spacetype, SPACE_TIME, SPACE_SOUND)) {
|
||||
if(stime->flag & TIME_DRAWFRAMES)
|
||||
sprintf(str, "Marker offset %d ", offs);
|
||||
else
|
||||
sprintf(str, "Marker offset %.2f ", (offs/(float)G.scene->r.frs_sec));
|
||||
}
|
||||
else {
|
||||
sprintf(str, "Marker offset %.2f ", (double)(offs));
|
||||
}
|
||||
}
|
||||
headerprint(str);
|
||||
|
||||
force_draw(0); // areas identical to this, 0 = no header
|
||||
}
|
||||
else PIL_sleep_ms(10); // idle
|
||||
|
||||
/* emptying queue and reading events */
|
||||
while( qtest() ) {
|
||||
event= extern_qread(&val);
|
||||
|
||||
if(val) {
|
||||
if(event==ESCKEY || event==RIGHTMOUSE) ret_val= 2;
|
||||
else if(event==LEFTMOUSE || event==RETKEY || event==SPACEKEY) ret_val= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* restore? */
|
||||
if(ret_val==2) {
|
||||
for(a=0, marker= G.scene->markers.first; marker; marker= marker->next) {
|
||||
if(marker->flag & SELECT) {
|
||||
marker->frame= oldframe[a];
|
||||
a++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
BIF_undo_push("Move Markers");
|
||||
}
|
||||
MEM_freeN(oldframe);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
|
||||
/* select/deselect all TimeMarkers
|
||||
* test - based on current selections?
|
||||
* sel - selection status to set all markers to if blanket apply status
|
||||
*/
|
||||
void deselect_markers(short test, short sel)
|
||||
{
|
||||
TimeMarker *marker;
|
||||
|
||||
/* check if need to find out whether to how to select markers */
|
||||
if (test) {
|
||||
/* dependant on existing selection */
|
||||
/* determine if select all or deselect all */
|
||||
sel = 1;
|
||||
for (marker= G.scene->markers.first; marker; marker= marker->next) {
|
||||
if (marker->flag & SELECT) {
|
||||
sel = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* do selection */
|
||||
for (marker= G.scene->markers.first; marker; marker= marker->next) {
|
||||
if (sel) {
|
||||
if ((marker->flag & SELECT)==0)
|
||||
marker->flag |= SELECT;
|
||||
}
|
||||
else {
|
||||
if (marker->flag & SELECT)
|
||||
marker->flag &= ~SELECT;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* not dependant on existing selection */
|
||||
for (marker= G.scene->markers.first; marker; marker= marker->next) {
|
||||
if (sel) {
|
||||
if ((marker->flag & SELECT)==0)
|
||||
marker->flag |= SELECT;
|
||||
}
|
||||
else {
|
||||
if (marker->flag & SELECT)
|
||||
marker->flag &= ~SELECT;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int find_nearest_marker(float dx)
|
||||
void borderselect_markers(float xmin, float xmax, int selectmode)
|
||||
{
|
||||
TimeMarker *marker;
|
||||
|
||||
for(marker= G.scene->markers.first; marker; marker= marker->next) {
|
||||
if ((marker->frame > xmin) && (marker->frame <= xmax)) {
|
||||
switch (selectmode) {
|
||||
case SELECT_ADD:
|
||||
if ((marker->flag & SELECT) == 0)
|
||||
marker->flag |= SELECT;
|
||||
break;
|
||||
case SELECT_SUBTRACT:
|
||||
if (marker->flag & SELECT)
|
||||
marker->flag &= ~SELECT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void nextprev_marker(short dir)
|
||||
{
|
||||
TimeMarker *marker, *cur=NULL, *first, *last;
|
||||
int mindist= MAXFRAME, dist;
|
||||
|
||||
first= last= G.scene->markers.first;
|
||||
for(marker= G.scene->markers.first; marker; marker= marker->next) {
|
||||
/* find closest to current frame first */
|
||||
dist= (marker->frame/G.scene->r.framelen) - CFRA;
|
||||
if(dir==1 && dist>0 && dist<mindist) {
|
||||
mindist= dist;
|
||||
cur= marker;
|
||||
}
|
||||
else if(dir==-1 && dist<0 && -dist<mindist) {
|
||||
mindist= -dist;
|
||||
cur= marker;
|
||||
}
|
||||
/* find first/last */
|
||||
if(marker->frame > last->frame) last= marker;
|
||||
if(marker->frame < first->frame) first= marker;
|
||||
}
|
||||
|
||||
if(cur==NULL) {
|
||||
if(dir==1) cur= first;
|
||||
else cur= last;
|
||||
}
|
||||
if(cur) {
|
||||
CFRA= cur->frame/G.scene->r.framelen;
|
||||
update_for_newframe();
|
||||
allqueue(REDRAWALL, 0);
|
||||
}
|
||||
}
|
||||
|
||||
TimeMarker *find_nearest_marker(int clip_y)
|
||||
{
|
||||
TimeMarker *marker;
|
||||
float xmin, xmax;
|
||||
rctf rectf;
|
||||
short mval[2];
|
||||
|
||||
getmouseco_areawin (mval);
|
||||
|
||||
/* first clip selection in Y */
|
||||
if((clip_y) && (mval[1] > 30))
|
||||
return NULL;
|
||||
|
||||
mval[0]-=7;
|
||||
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmin, &rectf.ymin);
|
||||
mval[0]+=14;
|
||||
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
|
||||
|
||||
xmin= rectf.xmin;
|
||||
xmax= rectf.xmax;
|
||||
|
||||
for(marker= G.scene->markers.first; marker; marker= marker->next) {
|
||||
if ((marker->frame > xmin) && (marker->frame <= xmax)) {
|
||||
return marker;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* *********** End Markers - Markers API *************** */
|
||||
|
||||
/* border-select markers */
|
||||
void borderselect_timeline_markers(void)
|
||||
{
|
||||
rcti rect;
|
||||
rctf rectf;
|
||||
int val, selectmode;
|
||||
short mval[2];
|
||||
|
||||
if ( (val = get_border(&rect, 3)) ){
|
||||
if (val == LEFTMOUSE)
|
||||
selectmode = SELECT_ADD;
|
||||
else
|
||||
selectmode = SELECT_SUBTRACT;
|
||||
|
||||
mval[0]= rect.xmin;
|
||||
mval[1]= rect.ymin+2;
|
||||
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmin, &rectf.ymin);
|
||||
mval[0]= rect.xmax;
|
||||
mval[1]= rect.ymax-2;
|
||||
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
|
||||
|
||||
/* do markers */
|
||||
borderselect_markers(rectf.xmin, rectf.xmax, selectmode);
|
||||
|
||||
BIF_undo_push("Border Select TimeLine");
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static int find_nearest_timeline_marker(float dx)
|
||||
{
|
||||
TimeMarker *marker, *nearest= NULL;
|
||||
float dist, min_dist= 1000000;
|
||||
@@ -196,59 +474,7 @@ static void select_timeline_marker_frame(int frame, unsigned char shift)
|
||||
}
|
||||
}
|
||||
|
||||
/* select/deselect all TimeMarkers */
|
||||
void select_timeline_markers(void)
|
||||
{
|
||||
TimeMarker *marker;
|
||||
char any_selected= 0;
|
||||
|
||||
for(marker= G.scene->markers.first; marker; marker= marker->next) {
|
||||
if(marker->flag & SELECT) any_selected= 1;
|
||||
marker->flag &= ~SELECT;
|
||||
}
|
||||
|
||||
/* no TimeMarker selected, then select all TimeMarkers */
|
||||
if(!any_selected){
|
||||
for(marker= G.scene->markers.first; marker; marker= marker->next) {
|
||||
marker->flag |= SELECT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void nextprev_timeline_marker(short dir)
|
||||
{
|
||||
TimeMarker *marker, *cur=NULL, *first, *last;
|
||||
int mindist= MAXFRAME, dist;
|
||||
|
||||
first= last= G.scene->markers.first;
|
||||
for(marker= G.scene->markers.first; marker; marker= marker->next) {
|
||||
/* find closest to current frame first */
|
||||
dist= (marker->frame/G.scene->r.framelen) - CFRA;
|
||||
if(dir==1 && dist>0 && dist<mindist) {
|
||||
mindist= dist;
|
||||
cur= marker;
|
||||
}
|
||||
else if(dir==-1 && dist<0 && -dist<mindist) {
|
||||
mindist= -dist;
|
||||
cur= marker;
|
||||
}
|
||||
/* find first/last */
|
||||
if(marker->frame > last->frame) last= marker;
|
||||
if(marker->frame < first->frame) first= marker;
|
||||
}
|
||||
|
||||
if(cur==NULL) {
|
||||
if(dir==1) cur= first;
|
||||
else cur= last;
|
||||
}
|
||||
if(cur) {
|
||||
CFRA= cur->frame/G.scene->r.framelen;
|
||||
update_for_newframe();
|
||||
allqueue(REDRAWALL, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* *********** end Markers *************** */
|
||||
/* *********** end Markers - TimeLine *************** */
|
||||
|
||||
static int float_to_frame(float frame)
|
||||
{
|
||||
@@ -359,102 +585,6 @@ void timeline_frame_to_center(void)
|
||||
scrarea_queue_winredraw(curarea);
|
||||
}
|
||||
|
||||
void timeline_grab(int mode, int smode) // mode and smode unused here, for callback
|
||||
{
|
||||
SpaceTime *stime= curarea->spacedata.first;
|
||||
TimeMarker *marker, *selmarker=NULL;
|
||||
float dx, fac;
|
||||
int a, ret_val= 0, totmark=0, *oldframe, offs, firsttime=1;
|
||||
unsigned short event;
|
||||
short val, pmval[2], mval[2], mvalo[2];
|
||||
char str[32];
|
||||
|
||||
for(marker= G.scene->markers.first; marker; marker= marker->next) {
|
||||
if(marker->flag & SELECT) totmark++;
|
||||
}
|
||||
if(totmark==0) return;
|
||||
|
||||
oldframe= MEM_mallocN(totmark*sizeof(int), "marker array");
|
||||
for(a=0, marker= G.scene->markers.first; marker; marker= marker->next) {
|
||||
if(marker->flag & SELECT) {
|
||||
oldframe[a]= marker->frame;
|
||||
selmarker= marker; // used for hederprint
|
||||
a++;
|
||||
}
|
||||
}
|
||||
|
||||
dx= G.v2d->mask.xmax-G.v2d->mask.xmin;
|
||||
dx= (G.v2d->cur.xmax-G.v2d->cur.xmin)/dx;
|
||||
|
||||
getmouseco_areawin(pmval);
|
||||
mvalo[0]= pmval[0];
|
||||
|
||||
while(ret_val == 0) {
|
||||
|
||||
getmouseco_areawin(mval);
|
||||
|
||||
if (mval[0] != mvalo[0] || firsttime) {
|
||||
mvalo[0]= mval[0];
|
||||
firsttime= 0;
|
||||
|
||||
fac= (((float)(mval[0] - pmval[0]))*dx);
|
||||
|
||||
apply_keyb_grid(&fac, 0.0, (float)G.scene->r.frs_sec, 0.1*(float)G.scene->r.frs_sec, 0);
|
||||
offs= (int)fac;
|
||||
|
||||
for(a=0, marker= G.scene->markers.first; marker; marker= marker->next) {
|
||||
if(marker->flag & SELECT) {
|
||||
marker->frame= oldframe[a] + offs;
|
||||
a++;
|
||||
}
|
||||
}
|
||||
|
||||
if(totmark==1) { // we print current marker value
|
||||
if(stime->flag & TIME_DRAWFRAMES)
|
||||
sprintf(str, "Marker %d offset %d", selmarker->frame, offs);
|
||||
else
|
||||
sprintf(str, "Marker %.2f offset %.2f", (selmarker->frame/(float)G.scene->r.frs_sec), (offs/(float)G.scene->r.frs_sec));
|
||||
}
|
||||
else {
|
||||
if(stime->flag & TIME_DRAWFRAMES)
|
||||
sprintf(str, "Marker offset %d ", offs);
|
||||
else
|
||||
sprintf(str, "Marker offset %.2f ", (offs/(float)G.scene->r.frs_sec));
|
||||
}
|
||||
headerprint(str);
|
||||
|
||||
force_draw(0); // areas identical to this, 0 = no header
|
||||
}
|
||||
else PIL_sleep_ms(10); // idle
|
||||
|
||||
/* emptying queue and reading events */
|
||||
while( qtest() ) {
|
||||
event= extern_qread(&val);
|
||||
|
||||
if(val) {
|
||||
if(event==ESCKEY || event==RIGHTMOUSE) ret_val= 2;
|
||||
else if(event==LEFTMOUSE || event==RETKEY || event==SPACEKEY) ret_val= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* restore? */
|
||||
if(ret_val==2) {
|
||||
for(a=0, marker= G.scene->markers.first; marker; marker= marker->next) {
|
||||
if(marker->flag & SELECT) {
|
||||
marker->frame= oldframe[a];
|
||||
a++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
BIF_undo_push("Move Markers");
|
||||
}
|
||||
MEM_freeN(oldframe);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
}
|
||||
|
||||
/* copy of this is actually in editscreen.c, but event based */
|
||||
static void timeline_force_draw(short val)
|
||||
{
|
||||
@@ -564,7 +694,7 @@ void winqreadtimespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
getmouseco_areawin(mval);
|
||||
areamouseco_to_ipoco(G.v2d, mval, &dx, &dy);
|
||||
|
||||
cfra= find_nearest_marker(dx);
|
||||
cfra= find_nearest_timeline_marker(dx);
|
||||
|
||||
if (G.qual && LR_SHIFTKEY)
|
||||
select_timeline_marker_frame(cfra, 1);
|
||||
@@ -572,7 +702,7 @@ void winqreadtimespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
select_timeline_marker_frame(cfra, 0);
|
||||
|
||||
force_draw(0);
|
||||
std_rmouse_transform(timeline_grab);
|
||||
std_rmouse_transform(transform_markers);
|
||||
|
||||
break;
|
||||
case MIDDLEMOUSE:
|
||||
@@ -608,29 +738,37 @@ void winqreadtimespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
if(G.qual==LR_CTRLKEY)
|
||||
nextprev_timeline_key(1);
|
||||
else
|
||||
nextprev_timeline_marker(1);
|
||||
nextprev_marker(1);
|
||||
break;
|
||||
case PAGEDOWNKEY: /* prev keyframe */
|
||||
if(G.qual==LR_CTRLKEY)
|
||||
nextprev_timeline_key(-1);
|
||||
else
|
||||
nextprev_timeline_marker(-1);
|
||||
nextprev_marker(-1);
|
||||
break;
|
||||
|
||||
case AKEY:
|
||||
/* deselect all TimeMarkers */
|
||||
select_timeline_markers();
|
||||
doredraw= 1;
|
||||
deselect_markers(1, 0);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
break;
|
||||
case BKEY:
|
||||
/* borderselect markers */
|
||||
borderselect_timeline_markers();
|
||||
break;
|
||||
case DKEY:
|
||||
if(G.qual==LR_SHIFTKEY)
|
||||
duplicate_timeline_marker();
|
||||
duplicate_marker();
|
||||
break;
|
||||
case CKEY:
|
||||
timeline_frame_to_center();
|
||||
break;
|
||||
case GKEY: /* move marker */
|
||||
timeline_grab('g', 0);
|
||||
transform_markers('g', 0);
|
||||
break;
|
||||
case EKEY: /* set end frame */
|
||||
G.scene->r.efra = CFRA;
|
||||
@@ -638,12 +776,15 @@ void winqreadtimespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
allqueue(REDRAWTIME, 1);
|
||||
break;
|
||||
case MKEY: /* add, rename marker */
|
||||
if (G.qual & LR_CTRLKEY)
|
||||
rename_timeline_marker();
|
||||
if (G.qual & LR_SHIFTKEY)
|
||||
rename_marker();
|
||||
else
|
||||
add_timeline_marker(CFRA);
|
||||
add_marker(CFRA);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
break;
|
||||
case SKEY: /* set start frame */
|
||||
G.scene->r.sfra = CFRA;
|
||||
@@ -662,9 +803,12 @@ void winqreadtimespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
case XKEY:
|
||||
if( okee("Erase selected")==0 ) break;
|
||||
|
||||
remove_timeline_marker();
|
||||
remove_marker();
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,6 +70,7 @@
|
||||
|
||||
#include "BSE_drawipo.h"
|
||||
#include "BSE_headerbuttons.h"
|
||||
#include "BSE_time.h"
|
||||
|
||||
#include "nla.h"
|
||||
|
||||
@@ -84,6 +85,9 @@
|
||||
#define ACTMENU_VIEW_MAXIMIZE 5
|
||||
#define ACTMENU_VIEW_LOCK 6
|
||||
#define ACTMENU_VIEW_SLIDERS 7
|
||||
#define ACTMENU_VIEW_NEXTMARKER 8
|
||||
#define ACTMENU_VIEW_PREVMARKER 9
|
||||
|
||||
|
||||
#define ACTMENU_SEL_BORDER 0
|
||||
#define ACTMENU_SEL_ALL_KEYS 1
|
||||
@@ -96,8 +100,8 @@
|
||||
#define ACTMENU_KEY_DUPLICATE 0
|
||||
#define ACTMENU_KEY_DELETE 1
|
||||
#define ACTMENU_KEY_BAKE 2
|
||||
#define ACTMENU_KEY_SNAP 3
|
||||
#define ACTMENU_KEY_CLEAN 4
|
||||
#define ACTMENU_KEY_CLEAN 3
|
||||
#define ACTMENU_KEY_MIRROR 4
|
||||
|
||||
#define ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_UP 0
|
||||
#define ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_DOWN 1
|
||||
@@ -122,6 +126,9 @@
|
||||
#define ACTMENU_KEY_EXTEND_CYCLIC 2
|
||||
#define ACTMENU_KEY_EXTEND_CYCLICEXTRAPOLATION 3
|
||||
|
||||
#define ACTMENU_KEY_SNAP_NEARFRAME 0
|
||||
#define ACTMENU_KEY_SNAP_CURFRAME 1
|
||||
|
||||
#define ACTMENU_MARKERS_ADD 0
|
||||
#define ACTMENU_MARKERS_DUPLICATE 1
|
||||
#define ACTMENU_MARKERS_DELETE 2
|
||||
@@ -250,6 +257,12 @@ static void do_action_viewmenu(void *arg, int event)
|
||||
case ACTMENU_VIEW_MAXIMIZE: /* Maximize Window */
|
||||
/* using event B_FULL */
|
||||
break;
|
||||
case ACTMENU_VIEW_NEXTMARKER: /* jump to next marker */
|
||||
nextprev_marker(1);
|
||||
break;
|
||||
case ACTMENU_VIEW_PREVMARKER: /* jump to previous marker */
|
||||
nextprev_marker(-1);
|
||||
break;
|
||||
}
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
}
|
||||
@@ -267,14 +280,6 @@ static uiBlock *action_viewmenu(void *arg_unused)
|
||||
"Center View to Current Frame|C", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1,
|
||||
ACTMENU_VIEW_CENTERVIEW, "");
|
||||
|
||||
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
|
||||
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
||||
|
||||
uiDefIconTextBut(block, BUTM, 1, BTST(G.saction->lock, 0)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
|
||||
"Update Automatically|", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1,
|
||||
ACTMENU_VIEW_AUTOUPDATE, "");
|
||||
|
||||
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
|
||||
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
||||
@@ -283,10 +288,30 @@ static uiBlock *action_viewmenu(void *arg_unused)
|
||||
"Show Sliders|", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1,
|
||||
ACTMENU_VIEW_SLIDERS, "");
|
||||
|
||||
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,
|
||||
ACTMENU_VIEW_LOCK, "");
|
||||
|
||||
uiDefIconTextBut(block, BUTM, 1, BTST(G.saction->lock, 0)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
|
||||
"Update Automatically|", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1,
|
||||
ACTMENU_VIEW_AUTOUPDATE, "");
|
||||
|
||||
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
|
||||
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
||||
|
||||
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
|
||||
"Jump To Next Marker|PageUp", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_VIEW_NEXTMARKER, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
|
||||
"Jump To Prev Marker|PageDown", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_VIEW_PREVMARKER, "");
|
||||
|
||||
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
|
||||
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
||||
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
|
||||
"Play Back Animation|Alt A", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1,
|
||||
@@ -303,11 +328,6 @@ static uiBlock *action_viewmenu(void *arg_unused)
|
||||
"View All|Home", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1,
|
||||
ACTMENU_VIEW_ALL, "");
|
||||
|
||||
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,
|
||||
ACTMENU_VIEW_LOCK, "");
|
||||
|
||||
if (!curarea->full)
|
||||
uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1,
|
||||
@@ -338,7 +358,6 @@ static void do_action_selectmenu(void *arg, int event)
|
||||
SpaceAction *saction;
|
||||
bAction *act;
|
||||
Key *key;
|
||||
ListBase *markers;
|
||||
|
||||
saction = curarea->spacedata.first;
|
||||
if (!saction)
|
||||
@@ -346,7 +365,6 @@ static void do_action_selectmenu(void *arg, int event)
|
||||
|
||||
act = saction->action;
|
||||
key = get_action_mesh_key();
|
||||
markers = get_saction_markers(saction);
|
||||
|
||||
switch(event)
|
||||
{
|
||||
@@ -383,11 +401,12 @@ static void do_action_selectmenu(void *arg, int event)
|
||||
break;
|
||||
|
||||
case ACTMENU_SEL_ALL_MARKERS: /* select/deselect all markers */
|
||||
if (markers != NULL) {
|
||||
deselect_saction_markers(markers, 1, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
}
|
||||
deselect_markers(1, 0);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
break;
|
||||
|
||||
case ACTMENU_SEL_COLUMN: /* select column */
|
||||
@@ -800,6 +819,45 @@ static uiBlock *action_keymenu_chanposmenu(void *arg_unused)
|
||||
return block;
|
||||
}
|
||||
|
||||
static void do_action_keymenu_snapmenu(void *arg, int event)
|
||||
{
|
||||
switch(event)
|
||||
{
|
||||
case ACTMENU_KEY_SNAP_NEARFRAME:
|
||||
snap_keys_to_frame(1);
|
||||
break;
|
||||
case ACTMENU_KEY_SNAP_CURFRAME:
|
||||
snap_keys_to_frame(2);
|
||||
break;
|
||||
}
|
||||
|
||||
scrarea_queue_winredraw(curarea);
|
||||
}
|
||||
|
||||
static uiBlock *action_keymenu_snapmenu(void *arg_unused)
|
||||
{
|
||||
uiBlock *block;
|
||||
short yco= 0, menuwidth=120;
|
||||
|
||||
block= uiNewBlock(&curarea->uiblocks, "action_keymenu_snapmenu",
|
||||
UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
|
||||
uiBlockSetButmFunc(block, do_action_keymenu_snapmenu, NULL);
|
||||
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
|
||||
"Nearest Frame|Shift S, 1", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 0,
|
||||
ACTMENU_KEY_SNAP_NEARFRAME, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
|
||||
"Current Frame|Shift S, 2", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 0,
|
||||
ACTMENU_KEY_SNAP_CURFRAME, "");
|
||||
|
||||
uiBlockSetDirection(block, UI_RIGHT);
|
||||
uiTextBoundsBlock(block, 60);
|
||||
|
||||
return block;
|
||||
}
|
||||
|
||||
static void do_action_keymenu(void *arg, int event)
|
||||
{
|
||||
SpaceAction *saction;
|
||||
@@ -836,9 +894,6 @@ static void do_action_keymenu(void *arg, int event)
|
||||
case ACTMENU_KEY_BAKE:
|
||||
bake_action_with_client (G.saction->action, OBACT, 0.01);
|
||||
break;
|
||||
case ACTMENU_KEY_SNAP:
|
||||
snap_keys_to_frame();
|
||||
break;
|
||||
case ACTMENU_KEY_CLEAN:
|
||||
if (key)
|
||||
clean_shapekeys(key);
|
||||
@@ -860,9 +915,8 @@ static uiBlock *action_keymenu(void *arg_unused)
|
||||
uiDefIconTextBlockBut(block, action_keymenu_transformmenu,
|
||||
NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 20, "");
|
||||
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
|
||||
"Snap to Frame|Shift S", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 0, ACTMENU_KEY_SNAP, "");
|
||||
uiDefIconTextBlockBut(block, action_keymenu_snapmenu,
|
||||
NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 20, "");
|
||||
|
||||
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
|
||||
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
||||
@@ -926,39 +980,30 @@ static uiBlock *action_keymenu(void *arg_unused)
|
||||
|
||||
static void do_action_markermenu(void *arg, int event)
|
||||
{
|
||||
SpaceAction *saction;
|
||||
ListBase *markers = NULL;
|
||||
|
||||
saction= curarea->spacedata.first;
|
||||
if (!saction)
|
||||
return;
|
||||
|
||||
/* get set of markers */
|
||||
markers= get_saction_markers(saction);
|
||||
if (markers == NULL)
|
||||
return;
|
||||
|
||||
switch(event)
|
||||
{
|
||||
case ACTMENU_MARKERS_ADD:
|
||||
add_saction_marker(markers, CFRA);
|
||||
add_marker(CFRA);
|
||||
break;
|
||||
case ACTMENU_MARKERS_DUPLICATE:
|
||||
duplicate_saction_markers(markers);
|
||||
duplicate_marker();
|
||||
break;
|
||||
case ACTMENU_MARKERS_DELETE:
|
||||
remove_saction_markers(markers);
|
||||
remove_marker();
|
||||
break;
|
||||
case ACTMENU_MARKERS_NAME:
|
||||
rename_saction_markers(markers);
|
||||
rename_marker();
|
||||
break;
|
||||
case ACTMENU_MARKERS_MOVE:
|
||||
transform_saction_markers('g', 0);
|
||||
transform_markers('g', 0);
|
||||
break;
|
||||
}
|
||||
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
|
||||
static uiBlock *action_markermenu(void *arg_unused)
|
||||
@@ -972,16 +1017,16 @@ static uiBlock *action_markermenu(void *arg_unused)
|
||||
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Marker|M", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_ADD, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate Marker(s)|Ctrl Shift M", 0, yco-=20,
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate Marker|Ctrl Shift D", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_DUPLICATE, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Marker(s)|Alt M", 0, yco-=20,
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Marker|X", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_DELETE, "");
|
||||
|
||||
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(s)|Ctrl M", 0, yco-=20,
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "(Re)Name Marker|Shift M", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_NAME, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move Marker(s)|Shift M", 0, yco-=20,
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move Marker|Shift G", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1, ACTMENU_MARKERS_MOVE, "");
|
||||
|
||||
|
||||
@@ -1069,19 +1114,16 @@ void action_buttons(void)
|
||||
uiDefPulldownBut(block, action_selectmenu, NULL,
|
||||
"Select", xco, -2, xmax-3, 24, "");
|
||||
xco+= xmax;
|
||||
|
||||
|
||||
xmax= GetButStringLength("Marker");
|
||||
uiDefPulldownBut(block, action_markermenu, NULL,
|
||||
"Marker", xco, -2, xmax-3, 24, "");
|
||||
xco+= xmax;
|
||||
|
||||
xmax= GetButStringLength("Key");
|
||||
uiDefPulldownBut(block, action_keymenu, NULL,
|
||||
"Key", xco, -2, xmax-3, 24, "");
|
||||
xco+= xmax;
|
||||
|
||||
//if ((G.saction->markert != SACTION_NOMARKERS) &&
|
||||
// (G.saction->action != NULL)) {
|
||||
xmax= GetButStringLength("Marker");
|
||||
uiDefPulldownBut(block, action_markermenu, NULL,
|
||||
"Marker", xco, -2, xmax-3, 24, "");
|
||||
xco+= xmax;
|
||||
//}
|
||||
}
|
||||
|
||||
uiBlockSetEmboss(block, UI_EMBOSS);
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
#include "BSE_edit.h"
|
||||
#include "BSE_editipo.h"
|
||||
#include "BSE_headerbuttons.h"
|
||||
#include "BSE_time.h"
|
||||
|
||||
#include "BIF_editaction.h"
|
||||
#include "BIF_interface.h"
|
||||
@@ -336,9 +337,9 @@ static uiBlock *ipo_editmenu_mirrormenu(void *arg_unused)
|
||||
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|M, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Over Vertical Axis|M, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Over Horizontal Axis|M, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Over Current Frame|Ctrl M, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Over Vertical Axis|Ctrl M, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Over Horizontal Axis|Ctrl M, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
|
||||
|
||||
uiBlockSetDirection(block, UI_RIGHT);
|
||||
uiTextBoundsBlock(block, 60);
|
||||
@@ -555,7 +556,7 @@ static void do_ipo_editmenu(void *arg, int event)
|
||||
switch(event)
|
||||
{
|
||||
case 0:
|
||||
del_ipo();
|
||||
del_ipo(1);
|
||||
break;
|
||||
case 1:
|
||||
add_duplicate_editipo();
|
||||
@@ -813,6 +814,69 @@ static uiBlock *ipo_selectmenu(void *arg_unused)
|
||||
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|Shift M", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move Marker|Shift 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)
|
||||
{
|
||||
@@ -1113,7 +1177,11 @@ void ipo_buttons(void)
|
||||
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, "");
|
||||
@@ -1126,7 +1194,6 @@ void ipo_buttons(void)
|
||||
xmax= GetButStringLength("Curve");
|
||||
uiDefPulldownBut(block,ipo_editmenu, NULL, "Curve", xco, -2, xmax-3, 24, "");
|
||||
}
|
||||
|
||||
xco+=xmax;
|
||||
}
|
||||
|
||||
|
||||
@@ -58,9 +58,12 @@
|
||||
#include "BIF_screen.h"
|
||||
#include "BIF_space.h"
|
||||
#include "BIF_editnla.h"
|
||||
#include "BIF_editaction.h"
|
||||
#include "BIF_toolbox.h"
|
||||
|
||||
#include "BSE_drawipo.h"
|
||||
#include "BSE_headerbuttons.h"
|
||||
#include "BSE_time.h"
|
||||
|
||||
//#include "nla.h"
|
||||
|
||||
@@ -180,6 +183,14 @@ static void do_nla_selectmenu(void *arg, int event)
|
||||
allqueue (REDRAWNLA, 0);
|
||||
allqueue (REDRAWIPO, 0);
|
||||
break;
|
||||
case 3: /* Select/Deselect All Markers */
|
||||
deselect_markers(1, 0);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -197,6 +208,7 @@ static uiBlock *nla_selectmenu(void *arg_unused)
|
||||
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All Keys|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All Channels", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
|
||||
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);
|
||||
@@ -211,6 +223,31 @@ static uiBlock *nla_selectmenu(void *arg_unused)
|
||||
return block;
|
||||
}
|
||||
|
||||
static void do_nla_strip_snapmenu(void *arg, int event)
|
||||
{
|
||||
snap_action_strips(event);
|
||||
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
}
|
||||
|
||||
static uiBlock *nla_strip_snapmenu(void *arg_unused)
|
||||
{
|
||||
uiBlock *block;
|
||||
short yco = 20, menuwidth = 120;
|
||||
|
||||
block= uiNewBlock(&curarea->uiblocks, "nla_strip_snapmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
|
||||
uiBlockSetButmFunc(block, do_nla_strip_snapmenu, NULL);
|
||||
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Nearest Frame|Shift S, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Current Frame|Shift S, 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_nla_strip_transformmenu(void *arg, int event)
|
||||
{
|
||||
switch(event) {
|
||||
@@ -257,8 +294,10 @@ static void do_nla_stripmenu(void *arg, int event)
|
||||
update_for_newframe_muted();
|
||||
break;
|
||||
case 3: /* Delete Strips */
|
||||
delete_nlachannel_keys ();
|
||||
update_for_newframe_muted();
|
||||
if (okee("Erase selected strips and/or keys")) {
|
||||
delete_nlachannel_keys ();
|
||||
update_for_newframe_muted();
|
||||
}
|
||||
break;
|
||||
case 5: /* Convert Action to NLA Strip */
|
||||
break;
|
||||
@@ -274,9 +313,6 @@ static void do_nla_stripmenu(void *arg, int event)
|
||||
case 9: /* reset start/end of action */
|
||||
reset_action_strips(2);
|
||||
break;
|
||||
case 10: /* snap to frame */
|
||||
snap_action_strips();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -292,7 +328,7 @@ static uiBlock *nla_stripmenu(void *arg_unused)
|
||||
uiDefIconTextBlockBut(block, nla_strip_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 20, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Strip Size|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Action Start/End|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Snap to Frame|Shift S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 10, "");
|
||||
uiDefIconTextBlockBut(block, nla_strip_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap To Frame", 0, yco-=20, 120, 20, "");
|
||||
|
||||
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
||||
|
||||
@@ -302,8 +338,8 @@ static uiBlock *nla_stripmenu(void *arg_unused)
|
||||
|
||||
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
||||
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move Down|Page Down", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move Up|Page Up", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move Down|Ctrl Page Down", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move Up|Ctrl Page Up", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
|
||||
|
||||
// uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Action to NLA Strip|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
|
||||
|
||||
@@ -320,6 +356,70 @@ static uiBlock *nla_stripmenu(void *arg_unused)
|
||||
return block;
|
||||
}
|
||||
|
||||
static void do_nla_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 *nla_markermenu(void *arg_unused)
|
||||
{
|
||||
uiBlock *block;
|
||||
short yco= 0, menuwidth=120;
|
||||
|
||||
block= uiNewBlock(&curarea->uiblocks, "nla_markermenu",
|
||||
UI_EMBOSSP, UI_HELV, curarea->headwin);
|
||||
uiBlockSetButmFunc(block, do_nla_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|Shift M", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move Marker|Shift 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;
|
||||
}
|
||||
|
||||
void nla_buttons(void)
|
||||
{
|
||||
SpaceNla *snla;
|
||||
@@ -367,11 +467,16 @@ void nla_buttons(void)
|
||||
xmax= GetButStringLength("Select");
|
||||
uiDefPulldownBut(block, nla_selectmenu, NULL, "Select", xco, -2, xmax-3, 24, "");
|
||||
xco+= xmax;
|
||||
|
||||
|
||||
xmax= GetButStringLength("Marker");
|
||||
uiDefPulldownBut(block, nla_markermenu, NULL, "Marker", xco, -2, xmax-3, 24, "");
|
||||
xco+= xmax;
|
||||
|
||||
xmax= GetButStringLength("Strip");
|
||||
uiDefPulldownBut(block, nla_stripmenu, NULL, "Strip", xco, -2, xmax-3, 24, "");
|
||||
xco+= xmax;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
uiBlockSetEmboss(block, UI_EMBOSS);
|
||||
|
||||
@@ -70,6 +70,7 @@
|
||||
#include "BSE_drawipo.h"
|
||||
#include "BSE_filesel.h"
|
||||
#include "BSE_headerbuttons.h"
|
||||
#include "BSE_time.h"
|
||||
|
||||
#include "blendef.h"
|
||||
#include "mydevice.h"
|
||||
@@ -186,6 +187,12 @@ static void do_sound_viewmenu(void *arg, int event)
|
||||
case 4: /* Maximize Window */
|
||||
/* using event B_FULL */
|
||||
break;
|
||||
case 5: /* jump to next marker */
|
||||
nextprev_marker(1);
|
||||
break;
|
||||
case 6: /* jump to previous marker */
|
||||
nextprev_marker(-1);
|
||||
break;
|
||||
}
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
}
|
||||
@@ -199,6 +206,13 @@ static uiBlock *sound_viewmenu(void *arg_unused)
|
||||
UI_EMBOSSP, UI_HELV, curarea->headwin);
|
||||
uiBlockSetButmFunc(block, do_sound_viewmenu, NULL);
|
||||
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Jump To Next Marker|PageUp", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Jump To Prev Marker|PageDown", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
|
||||
|
||||
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
||||
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Animation|Alt A", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Animation in 3D View|Alt Shift A", 0, yco-=20,
|
||||
@@ -226,6 +240,72 @@ static uiBlock *sound_viewmenu(void *arg_unused)
|
||||
return block;
|
||||
}
|
||||
|
||||
static void do_sound_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 *sound_markermenu(void *arg_unused)
|
||||
{
|
||||
uiBlock *block;
|
||||
short yco= 0, menuwidth=120;
|
||||
|
||||
block= uiNewBlock(&curarea->uiblocks, "sound_markermenu",
|
||||
UI_EMBOSSP, UI_HELV, curarea->headwin);
|
||||
uiBlockSetButmFunc(block, do_sound_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|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|Shift M", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move Marker|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;
|
||||
}
|
||||
|
||||
|
||||
void sound_buttons(void)
|
||||
{
|
||||
uiBlock *block;
|
||||
@@ -278,6 +358,10 @@ void sound_buttons(void)
|
||||
"View", xco, -2, xmax-3, 24, "");
|
||||
xco+= xmax;
|
||||
|
||||
xmax= GetButStringLength("Marker");
|
||||
uiDefPulldownBut(block, sound_markermenu, NULL,
|
||||
"Marker", xco, -2, xmax-3, 24, "");
|
||||
xco+= xmax;
|
||||
}
|
||||
|
||||
uiBlockSetEmboss(block, UI_EMBOSS);
|
||||
|
||||
@@ -203,10 +203,10 @@ static void do_time_viewmenu(void *arg, int event)
|
||||
stime->flag ^= TIME_DRAWFRAMES;
|
||||
break;
|
||||
case 6:
|
||||
nextprev_timeline_marker(1);
|
||||
nextprev_marker(1);
|
||||
break;
|
||||
case 7:
|
||||
nextprev_timeline_marker(-1);
|
||||
nextprev_marker(-1);
|
||||
break;
|
||||
case 8:
|
||||
nextprev_timeline_key(1);
|
||||
@@ -290,22 +290,26 @@ static void do_time_framemenu(void *arg, int event)
|
||||
allqueue(REDRAWALL, 1);
|
||||
break;
|
||||
case 3: /* Add Marker */
|
||||
add_timeline_marker(CFRA);
|
||||
add_marker(CFRA);
|
||||
break;
|
||||
case 4: /* Remove Marker */
|
||||
remove_timeline_marker();
|
||||
remove_marker();
|
||||
break;
|
||||
case 5: /* Rename Marker */
|
||||
rename_timeline_marker();
|
||||
rename_marker();
|
||||
break;
|
||||
case 6: /* Grab Marker */
|
||||
timeline_grab('g', 0);
|
||||
transform_markers('g', 0);
|
||||
break;
|
||||
case 7: /* duplicate marker */
|
||||
duplicate_timeline_marker();
|
||||
duplicate_marker();
|
||||
break;
|
||||
}
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
|
||||
static uiBlock *time_framemenu(void *arg_unused)
|
||||
@@ -319,14 +323,14 @@ static uiBlock *time_framemenu(void *arg_unused)
|
||||
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Marker|M", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate Marker|M", 0, yco-=20,
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate Marker|Shift D", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Marker|X", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
|
||||
|
||||
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
|
||||
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Name Marker|Ctrl M", 0, yco-=20,
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Name Marker|Shift M", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
|
||||
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move Marker|G", 0, yco-=20,
|
||||
menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
|
||||
|
||||
@@ -135,6 +135,7 @@
|
||||
#include "BSE_filesel.h"
|
||||
#include "BSE_headerbuttons.h"
|
||||
#include "BSE_editnla_types.h"
|
||||
#include "BSE_time.h"
|
||||
|
||||
#include "BDR_vpaint.h"
|
||||
#include "BDR_editmball.h"
|
||||
@@ -1871,9 +1872,14 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
selectrow_nurb();
|
||||
}
|
||||
else if(G.qual==LR_CTRLKEY) {
|
||||
if (G.obedit->type==OB_MESH)
|
||||
if (G.obedit->type==OB_MESH) {
|
||||
CutEdgeloop(1);
|
||||
BIF_undo_push("Cut Edgeloop");
|
||||
}
|
||||
//else if (G.obedit->type==OB_ARMATURE) {
|
||||
// initTransform(TFM_BONE_ROLL, CTX_NONE);
|
||||
// Transform();
|
||||
//}
|
||||
}
|
||||
else if((G.qual==0)) {
|
||||
initTransform(TFM_ROTATION, CTX_NONE);
|
||||
@@ -2342,8 +2348,11 @@ static void winqreadipospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
break;
|
||||
case RIGHTMOUSE:
|
||||
mouse_select_ipo();
|
||||
allqueue (REDRAWACTION, 0);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
break;
|
||||
case MIDDLEMOUSE:
|
||||
if(in_ipo_buttons()) {
|
||||
@@ -2364,16 +2373,20 @@ static void winqreadipospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
doredraw= 1;
|
||||
break;
|
||||
case PAGEUPKEY:
|
||||
if(G.qual==LR_CTRLKEY)
|
||||
if(G.qual & LR_CTRLKEY)
|
||||
movekey_ipo(1);
|
||||
else if((G.qual==0))
|
||||
else if(G.qual & LR_SHIFTKEY)
|
||||
nextkey_ipo(1);
|
||||
else
|
||||
nextprev_marker(1);
|
||||
break;
|
||||
case PAGEDOWNKEY:
|
||||
if(G.qual==LR_CTRLKEY)
|
||||
if(G.qual & LR_CTRLKEY)
|
||||
movekey_ipo(-1);
|
||||
else if((G.qual==0))
|
||||
else if(G.qual & LR_SHIFTKEY)
|
||||
nextkey_ipo(-1);
|
||||
else
|
||||
nextprev_marker(-1);
|
||||
break;
|
||||
case HOMEKEY:
|
||||
if((G.qual==0))
|
||||
@@ -2381,7 +2394,15 @@ static void winqreadipospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
break;
|
||||
|
||||
case AKEY:
|
||||
if((G.qual==0)) {
|
||||
if (G.qual & LR_CTRLKEY) {
|
||||
deselect_markers(1, 0);
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
else if (G.qual==0) {
|
||||
if(in_ipo_buttons()) {
|
||||
swap_visible_editipo();
|
||||
}
|
||||
@@ -2392,37 +2413,42 @@ static void winqreadipospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
allqueue (REDRAWNLA, 0);
|
||||
allqueue (REDRAWACTION, 0);
|
||||
}
|
||||
|
||||
break;
|
||||
case BKEY:
|
||||
if((G.qual==0))
|
||||
if (G.qual==0)
|
||||
borderselect_ipo();
|
||||
break;
|
||||
case CKEY:
|
||||
if((G.qual==0))
|
||||
if (G.qual==0)
|
||||
move_to_frame();
|
||||
break;
|
||||
case DKEY:
|
||||
if((G.qual==LR_SHIFTKEY))
|
||||
if (G.qual==LR_SHIFTKEY)
|
||||
add_duplicate_editipo();
|
||||
else if (G.qual == (LR_CTRLKEY|LR_SHIFTKEY))
|
||||
duplicate_marker();
|
||||
break;
|
||||
case GKEY:
|
||||
if((G.qual==0))
|
||||
if (G.qual & LR_SHIFTKEY)
|
||||
transform_markers('g', 0);
|
||||
else if (G.qual==0)
|
||||
transform_ipo('g');
|
||||
break;
|
||||
case HKEY:
|
||||
if(G.qual==LR_ALTKEY)
|
||||
if (G.qual==LR_ALTKEY)
|
||||
sethandles_ipo(HD_AUTO_ANIM);
|
||||
if(G.qual==LR_SHIFTKEY)
|
||||
if (G.qual==LR_SHIFTKEY)
|
||||
sethandles_ipo(HD_AUTO);
|
||||
else if(G.qual==0)
|
||||
else if (G.qual==0)
|
||||
sethandles_ipo(HD_ALIGN);
|
||||
break;
|
||||
case JKEY:
|
||||
if((G.qual==LR_CTRLKEY))
|
||||
if (G.qual==LR_CTRLKEY)
|
||||
join_ipo_menu();
|
||||
break;
|
||||
case KKEY:
|
||||
if((G.qual==0)) {
|
||||
if (G.qual==0) {
|
||||
ipo_toggle_showkey();
|
||||
scrarea_queue_headredraw(curarea);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
@@ -2430,40 +2456,64 @@ static void winqreadipospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
|
||||
}
|
||||
break;
|
||||
case MKEY:
|
||||
if((G.qual==0))
|
||||
if (G.qual==LR_CTRLKEY) {
|
||||
ipo_mirror_menu();
|
||||
break;
|
||||
}
|
||||
if (G.qual == 0)
|
||||
add_marker(CFRA);
|
||||
else if (G.qual == LR_SHIFTKEY)
|
||||
rename_marker();
|
||||
else
|
||||
break;
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
break;
|
||||
case NKEY:
|
||||
toggle_blockhandler(sa, IPO_HANDLER_PROPERTIES, UI_PNL_TO_MOUSE);
|
||||
doredraw= 1;
|
||||
break;
|
||||
case OKEY:
|
||||
if(G.qual==LR_SHIFTKEY)
|
||||
if (G.qual==LR_SHIFTKEY)
|
||||
smooth_ipo();
|
||||
else
|
||||
clean_ipo(sipo->ipo, 1);
|
||||
break;
|
||||
case RKEY:
|
||||
if((G.qual==0))
|
||||
if (G.qual==0)
|
||||
ipo_record();
|
||||
break;
|
||||
case SKEY:
|
||||
if((G.qual==LR_SHIFTKEY)) {
|
||||
if (G.qual==LR_SHIFTKEY) {
|
||||
ipo_snap_menu();
|
||||
} else if((G.qual==0))
|
||||
}
|
||||
else if (G.qual==0)
|
||||
transform_ipo('s');
|
||||
break;
|
||||
case TKEY:
|
||||
if((G.qual==0))
|
||||
if (G.qual==0)
|
||||
set_ipotype();
|
||||
break;
|
||||
case VKEY:
|
||||
if((G.qual==0))
|
||||
if (G.qual==0)
|
||||
sethandles_ipo(HD_VECT);
|
||||
break;
|
||||
case XKEY:
|
||||
case DELKEY:
|
||||
del_ipo();
|
||||
val= pupmenu("Erase selected%t|Keys %x1|Markers %x2");
|
||||
if (val == 1)
|
||||
del_ipo(0);
|
||||
else if (val == 2) {
|
||||
remove_marker();
|
||||
allqueue(REDRAWTIME, 0);
|
||||
allqueue(REDRAWIPO, 0);
|
||||
allqueue(REDRAWACTION, 0);
|
||||
allqueue(REDRAWNLA, 0);
|
||||
allqueue(REDRAWSOUND, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user