Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/include/BIF_editaction.h8
-rw-r--r--source/blender/src/editaction.c131
-rw-r--r--source/blender/src/header_action.c27
3 files changed, 121 insertions, 45 deletions
diff --git a/source/blender/include/BIF_editaction.h b/source/blender/include/BIF_editaction.h
index ce744b2b3b3..459884df704 100644
--- a/source/blender/include/BIF_editaction.h
+++ b/source/blender/include/BIF_editaction.h
@@ -85,15 +85,17 @@ 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, int test, int sel);
+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 selectkeyscolumns_saction_markers(struct ListBase *markers);
-void selectkeysbetween_saction_markers(struct ListBase *markers);
+void nextprev_saction_markers(ListBase *markers, short dir);
+void selectkeys_columns_markers(struct ListBase *markers);
+void selectkeys_between_markers(struct ListBase *markers);
/* channel/strip operations */
void up_sel_action(void);
diff --git a/source/blender/src/editaction.c b/source/blender/src/editaction.c
index 921478971e0..80bb0483eba 100644
--- a/source/blender/src/editaction.c
+++ b/source/blender/src/editaction.c
@@ -2636,23 +2636,25 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case MKEY:
/* marker operations */
- if (G.qual == 0)
- add_saction_marker(markers, CFRA);
- else if (G.qual == LR_ALTKEY) {
- if( okee("Erase selected markers")==0 )
+ 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;
- 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);
+ allqueue(REDRAWACTION, 0);
+ allqueue(REDRAWTIME, 0);
+ }
break;
case NKEY:
@@ -2710,30 +2712,30 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case PAGEUPKEY:
if (key) {
- /* to do */
+ /* only jump to markers possible (key channels can't be moved yet) */
+ nextprev_saction_markers(markers, 1);
}
else {
- if(G.qual & LR_SHIFTKEY) {
+ if(G.qual & LR_SHIFTKEY)
top_sel_action();
- }
- else
- {
+ else if (G.qual & LR_CTRLKEY)
up_sel_action();
- }
-
+ else
+ nextprev_saction_markers(markers, 1);
}
break;
case PAGEDOWNKEY:
if (key) {
- /* to do */
+ /* only jump to markers possible (key channels can't be moved yet) */
+ nextprev_saction_markers(markers, -1);
}
else {
- if(G.qual & LR_SHIFTKEY) {
+ if(G.qual & LR_SHIFTKEY)
bottom_sel_action();
- }
+ else if (G.qual & LR_CTRLKEY)
+ down_sel_action();
else
- down_sel_action();
-
+ nextprev_saction_markers(markers, -1);
}
break;
case DELKEY:
@@ -2955,6 +2957,9 @@ 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);
@@ -2970,6 +2975,9 @@ 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);
@@ -3131,11 +3139,51 @@ TimeMarker *find_nearest_saction_marker(ListBase *markers)
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, int test, int sel)
+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 */
@@ -3179,6 +3227,9 @@ void borderselect_saction_markers(ListBase *markers, float xmin, float xmax, int
{
TimeMarker *marker;
+ if (markers == NULL)
+ return;
+
for(marker= markers->first; marker; marker= marker->next) {
if ((marker->frame > xmin) && (marker->frame <= xmax)) {
switch (selectmode) {
@@ -3195,6 +3246,28 @@ void borderselect_saction_markers(ListBase *markers, float xmin, float xmax, int
}
}
+void get_minmax_saction_markers(ListBase *markers, float *first, float *last)
+{
+ TimeMarker *marker;
+ float min, max;
+
+ if (!markers)
+ return;
+
+ min= ((TimeMarker *)markers->first)->frame;
+ max= ((TimeMarker *)markers->last)->frame;
+
+ for (marker= markers->first; marker; marker= marker->next) {
+ if (marker->frame < min)
+ min= marker->frame;
+ else if (marker->frame > max)
+ max= marker->frame;
+ }
+
+ *first= min;
+ *last= max;
+}
+
/* ************************************* Action Channel Ordering *********************************** */
void top_sel_action()
diff --git a/source/blender/src/header_action.c b/source/blender/src/header_action.c
index eecfcda1359..27893184c24 100644
--- a/source/blender/src/header_action.c
+++ b/source/blender/src/header_action.c
@@ -439,8 +439,8 @@ static uiBlock *action_selectmenu(void *arg_unused)
"Select Keys Column|K", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 0,
ACTMENU_SEL_COLUMN, "");
-
- /*
+
+/*
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
"Select Keys At Markers|CTRL K", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 0,
@@ -450,7 +450,7 @@ static uiBlock *action_selectmenu(void *arg_unused)
"Select Keys Between Markers|SHIFT K", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 0,
ACTMENU_SEL_MARKERS_KEYSBETWEEN, "");
- */
+*/
if(curarea->headertype==HEADERTOP) {
uiBlockSetDirection(block, UI_DOWN);
@@ -774,11 +774,11 @@ static uiBlock *action_keymenu_chanposmenu(void *arg_unused)
uiBlockSetButmFunc(block, do_action_keymenu_chanposmenu, NULL);
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Move Up|Page Up", 0, yco-=20,
+ "Move Up|Ctrl Page Up", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 0,
ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_UP, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Move Down|Page Down", 0, yco-=20,
+ "Move Down|Ctrl Page Down", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 0,
ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_DOWN, "");
@@ -927,30 +927,30 @@ static uiBlock *action_keymenu(void *arg_unused)
static void do_action_markermenu(void *arg, int event)
{
SpaceAction *saction;
- ListBase *lb = NULL;
+ ListBase *markers = NULL;
saction= curarea->spacedata.first;
if (!saction)
return;
/* get set of markers */
- lb= get_saction_markers(saction);
- if (lb == NULL)
+ markers= get_saction_markers(saction);
+ if (markers == NULL)
return;
switch(event)
{
case ACTMENU_MARKERS_ADD:
- add_saction_marker(lb, CFRA);
+ add_saction_marker(markers, CFRA);
break;
case ACTMENU_MARKERS_DUPLICATE:
- duplicate_saction_markers(lb);
+ duplicate_saction_markers(markers);
break;
case ACTMENU_MARKERS_DELETE:
- remove_saction_markers(lb);
+ remove_saction_markers(markers);
break;
case ACTMENU_MARKERS_NAME:
- rename_saction_markers(lb);
+ rename_saction_markers(markers);
break;
case ACTMENU_MARKERS_MOVE:
transform_saction_markers('g', 0);
@@ -1075,7 +1075,8 @@ void action_buttons(void)
"Key", xco, -2, xmax-3, 24, "");
xco+= xmax;
- if (G.saction->markert != SACTION_NOMARKERS) {
+ if ((G.saction->markert != SACTION_NOMARKERS) &&
+ (G.saction->action != NULL)) {
xmax= GetButStringLength("Marker");
uiDefPulldownBut(block, action_markermenu, NULL,
"Marker", xco, -2, xmax-3, 24, "");