diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-06-04 10:31:30 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-06-04 10:31:30 +0300 |
commit | 44505b38df557a5711703613685a1dec9fc2c3d9 (patch) | |
tree | 3f05bebcc7bfadf56569f2dcca7f95fc56b1b0d0 /source/blender/editors/space_nla | |
parent | 6654e109df952be3a3128fae2508a02c196ae593 (diff) |
Cleanup: strip trailing space in editors
Diffstat (limited to 'source/blender/editors/space_nla')
-rw-r--r-- | source/blender/editors/space_nla/nla_buttons.c | 126 | ||||
-rw-r--r-- | source/blender/editors/space_nla/nla_channels.c | 208 | ||||
-rw-r--r-- | source/blender/editors/space_nla/nla_draw.c | 232 | ||||
-rw-r--r-- | source/blender/editors/space_nla/nla_edit.c | 900 | ||||
-rw-r--r-- | source/blender/editors/space_nla/nla_ops.c | 130 | ||||
-rw-r--r-- | source/blender/editors/space_nla/nla_select.c | 196 | ||||
-rw-r--r-- | source/blender/editors/space_nla/space_nla.c | 124 |
7 files changed, 958 insertions, 958 deletions
diff --git a/source/blender/editors/space_nla/nla_buttons.c b/source/blender/editors/space_nla/nla_buttons.c index c173aac1a26..a26e6b0280e 100644 --- a/source/blender/editors/space_nla/nla_buttons.c +++ b/source/blender/editors/space_nla/nla_buttons.c @@ -87,27 +87,27 @@ bool nla_panel_context(const bContext *C, PointerRNA *adt_ptr, PointerRNA *nlt_p ListBase anim_data = {NULL, NULL}; short found = 0; /* not bool, since we need to indicate "found but not ideal" status */ int filter; - - /* for now, only draw if we could init the anim-context info (necessary for all animation-related tools) + + /* for now, only draw if we could init the anim-context info (necessary for all animation-related tools) * to work correctly is able to be correctly retrieved. There's no point showing empty panels? */ - if (ANIM_animdata_get_context(C, &ac) == 0) + if (ANIM_animdata_get_context(C, &ac) == 0) return false; - - /* extract list of active channel(s), of which we should only take the first one + + /* extract list of active channel(s), of which we should only take the first one * - we need the channels flag to get the active AnimData block when there are no NLA Tracks */ // XXX: double-check active! filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_ACTIVE | ANIMFILTER_LIST_CHANNELS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + for (ale = anim_data.first; ale; ale = ale->next) { switch (ale->type) { case ANIMTYPE_NLATRACK: /* NLA Track - The primary data type which should get caught */ { NlaTrack *nlt = (NlaTrack *)ale->data; AnimData *adt = ale->adt; - + /* found it, now set the pointers */ if (adt_ptr) { /* AnimData pointer */ @@ -122,7 +122,7 @@ bool nla_panel_context(const bContext *C, PointerRNA *adt_ptr, PointerRNA *nlt_p NlaStrip *strip = BKE_nlastrip_find_active(nlt); RNA_pointer_create(ale->id, &RNA_NlaStrip, strip, strip_ptr); } - + found = 1; break; } @@ -149,7 +149,7 @@ bool nla_panel_context(const bContext *C, PointerRNA *adt_ptr, PointerRNA *nlt_p /* for these channels, we only do AnimData */ if (ale->adt && adt_ptr) { ID *id; - + if ((ale->data == NULL) || (ale->type == ANIMTYPE_OBJECT)) { /* ale->data is not an ID block! */ id = ale->id; @@ -158,13 +158,13 @@ bool nla_panel_context(const bContext *C, PointerRNA *adt_ptr, PointerRNA *nlt_p /* ale->data is always the proper ID block we need, but ale->id may not be (i.e. for textures) */ id = (ID *)ale->data; } - + /* AnimData pointer */ if (adt_ptr) { RNA_pointer_create(id, &RNA_AnimData, ale->adt, adt_ptr); } - - /* set found status to -1, since setting to 1 would break the loop + + /* set found status to -1, since setting to 1 would break the loop * and potentially skip an active NLA-Track in some cases... */ found = -1; @@ -172,14 +172,14 @@ bool nla_panel_context(const bContext *C, PointerRNA *adt_ptr, PointerRNA *nlt_p break; } } - + if (found > 0) break; } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - + return (found != 0); } @@ -212,12 +212,12 @@ static int nla_strip_actclip_panel_poll(const bContext *C, PanelType *UNUSED(pt) { PointerRNA ptr; NlaStrip *strip; - + if (!nla_panel_context(C, NULL, NULL, &ptr)) return 0; if (ptr.data == NULL) return 0; - + strip = ptr.data; return (strip->type == NLASTRIP_TYPE_CLIP); } @@ -226,17 +226,17 @@ static int nla_strip_eval_panel_poll(const bContext *C, PanelType *UNUSED(pt)) { PointerRNA ptr; NlaStrip *strip; - + if (!nla_panel_context(C, NULL, NULL, &ptr)) return 0; if (ptr.data == NULL) return 0; - + strip = ptr.data; - + if (strip->type == NLASTRIP_TYPE_SOUND) return 0; - + return 1; } @@ -250,53 +250,53 @@ static void nla_panel_animdata(const bContext *C, Panel *pa) uiLayout *layout = pa->layout; uiLayout *row; uiBlock *block; - + /* check context and also validity of pointer */ if (!nla_panel_context(C, &adt_ptr, NULL, NULL)) return; /* adt = adt_ptr.data; */ - + block = uiLayoutGetBlock(layout); UI_block_func_handle_set(block, do_nla_region_buttons, NULL); - + /* AnimData Source Properties ----------------------------------- */ - - /* icon + id-block name of block where AnimData came from to prevent + + /* icon + id-block name of block where AnimData came from to prevent * accidentally changing the properties of the wrong action */ if (adt_ptr.id.data) { ID *id = adt_ptr.id.data; PointerRNA id_ptr; - + RNA_id_pointer_create(id, &id_ptr); - + /* ID-block name > AnimData */ row = uiLayoutRow(layout, true); uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_LEFT); - + uiItemL(row, id->name + 2, RNA_struct_ui_icon(id_ptr.type)); /* id-block (src) */ uiItemL(row, "", VICO_SMALL_TRI_RIGHT_VEC); /* expander */ uiItemL(row, IFACE_("Animation Data"), ICON_ANIM_DATA); /* animdata */ - + uiItemS(layout); } - + /* Active Action Properties ------------------------------------- */ /* action */ row = uiLayoutRow(layout, true); uiTemplateID( row, (bContext *)C, &adt_ptr, "action", "ACTION_OT_new", NULL, "NLA_OT_action_unlink", UI_TEMPLATE_ID_FILTER_ALL); - + /* extrapolation */ row = uiLayoutRow(layout, true); uiItemR(row, &adt_ptr, "action_extrapolation", 0, NULL, ICON_NONE); - + /* blending */ row = uiLayoutRow(layout, true); uiItemR(row, &adt_ptr, "action_blend_type", 0, NULL, ICON_NONE); - + /* influence */ row = uiLayoutRow(layout, true); uiItemR(row, &adt_ptr, "action_influence", 0, NULL, ICON_NONE); @@ -309,14 +309,14 @@ static void nla_panel_track(const bContext *C, Panel *pa) uiLayout *layout = pa->layout; uiLayout *row; uiBlock *block; - + /* check context and also validity of pointer */ if (!nla_panel_context(C, NULL, &nlt_ptr, NULL)) return; - + block = uiLayoutGetBlock(layout); UI_block_func_handle_set(block, do_nla_region_buttons, NULL); - + /* Info - Active NLA-Context:Track ---------------------- */ row = uiLayoutRow(layout, true); uiItemR(row, &nlt_ptr, "name", 0, NULL, ICON_NLA); @@ -330,41 +330,41 @@ static void nla_panel_properties(const bContext *C, Panel *pa) uiLayout *column, *row, *sub; uiBlock *block; short showEvalProps = 1; - + if (!nla_panel_context(C, NULL, NULL, &strip_ptr)) return; - + block = uiLayoutGetBlock(layout); UI_block_func_handle_set(block, do_nla_region_buttons, NULL); - + /* Strip Properties ------------------------------------- */ /* strip type */ row = uiLayoutColumn(layout, true); uiItemR(row, &strip_ptr, "name", 0, NULL, ICON_NLA); // XXX icon? uiItemR(row, &strip_ptr, "type", 0, NULL, ICON_NONE); - + /* strip extents */ column = uiLayoutColumn(layout, true); uiItemL(column, IFACE_("Strip Extents:"), ICON_NONE); uiItemR(column, &strip_ptr, "frame_start", 0, NULL, ICON_NONE); uiItemR(column, &strip_ptr, "frame_end", 0, NULL, ICON_NONE); - + /* Evaluation-Related Strip Properties ------------------ */ - + /* sound properties strips don't have these settings */ if (RNA_enum_get(&strip_ptr, "type") == NLASTRIP_TYPE_SOUND) showEvalProps = 0; - + /* only show if allowed to... */ if (showEvalProps) { /* extrapolation */ row = uiLayoutRow(layout, true); uiItemR(row, &strip_ptr, "extrapolation", 0, NULL, ICON_NONE); - + /* blending */ row = uiLayoutRow(layout, true); uiItemR(row, &strip_ptr, "blend_type", 0, NULL, ICON_NONE); - + /* blend in/out + autoblending * - blend in/out can only be set when autoblending is off */ @@ -376,7 +376,7 @@ static void nla_panel_properties(const bContext *C, Panel *pa) uiLayoutSetActive(sub, RNA_boolean_get(&strip_ptr, "use_auto_blend") == false); uiItemR(sub, &strip_ptr, "blend_in", 0, NULL, ICON_NONE); uiItemR(sub, &strip_ptr, "blend_out", 0, NULL, ICON_NONE); - + /* settings */ column = uiLayoutColumn(layout, true); uiLayoutSetActive(column, !(RNA_boolean_get(&strip_ptr, "use_animated_influence") || RNA_boolean_get(&strip_ptr, "use_animated_time"))); @@ -398,27 +398,27 @@ static void nla_panel_actclip(const bContext *C, Panel *pa) /* check context and also validity of pointer */ if (!nla_panel_context(C, NULL, NULL, &strip_ptr)) return; - + block = uiLayoutGetBlock(layout); UI_block_func_handle_set(block, do_nla_region_buttons, NULL); - + /* Strip Properties ------------------------------------- */ /* action pointer */ row = uiLayoutRow(layout, true); uiItemR(row, &strip_ptr, "action", 0, NULL, ICON_ACTION); - + /* action extents */ // XXX custom names were used here (to avoid the prefixes)... probably not necessary in future? column = uiLayoutColumn(layout, true); uiItemL(column, IFACE_("Action Extents:"), ICON_NONE); uiItemR(column, &strip_ptr, "action_frame_start", 0, IFACE_("Start Frame"), ICON_NONE); uiItemR(column, &strip_ptr, "action_frame_end", 0, IFACE_("End Frame"), ICON_NONE); - + // XXX: this layout may actually be too abstract and confusing, and may be better using standard column layout row = uiLayoutRow(layout, false); uiItemR(row, &strip_ptr, "use_sync_length", 0, IFACE_("Sync Length"), ICON_NONE); uiItemO(row, IFACE_("Now"), ICON_FILE_REFRESH, "NLA_OT_action_sync_length"); - + /* action usage */ column = uiLayoutColumn(layout, true); uiLayoutSetActive(column, RNA_boolean_get(&strip_ptr, "use_animated_time") == false); @@ -438,13 +438,13 @@ static void nla_panel_evaluation(const bContext *C, Panel *pa) /* check context and also validity of pointer */ if (!nla_panel_context(C, NULL, NULL, &strip_ptr)) return; - + block = uiLayoutGetBlock(layout); UI_block_func_handle_set(block, do_nla_region_buttons, NULL); - + col = uiLayoutColumn(layout, true); uiItemR(col, &strip_ptr, "use_animated_influence", 0, NULL, ICON_NONE); - + sub = uiLayoutColumn(col, true); uiLayoutSetEnabled(sub, RNA_boolean_get(&strip_ptr, "use_animated_influence")); uiItemR(sub, &strip_ptr, "influence", 0, NULL, ICON_NONE); @@ -472,28 +472,28 @@ static void nla_panel_modifiers(const bContext *C, Panel *pa) if (!nla_panel_context(C, NULL, NULL, &strip_ptr)) return; strip = strip_ptr.data; - + block = uiLayoutGetBlock(pa->layout); UI_block_func_handle_set(block, do_nla_region_buttons, NULL); - + /* 'add modifier' button at top of panel */ { row = uiLayoutRow(pa->layout, false); block = uiLayoutGetBlock(row); - + // FIXME: we need to set the only-active property so that this will only add modifiers for the active strip (not all selected) uiItemMenuEnumO(row, (bContext *)C, "NLA_OT_fmodifier_add", "type", IFACE_("Add Modifier"), ICON_NONE); - + /* copy/paste (as sub-row) */ row = uiLayoutRow(row, true); uiItemO(row, "", ICON_COPYDOWN, "NLA_OT_fmodifier_copy"); uiItemO(row, "", ICON_PASTEDOWN, "NLA_OT_fmodifier_paste"); } - + /* draw each modifier */ for (fcm = strip->modifiers.first; fcm; fcm = fcm->next) { col = uiLayoutColumn(pa->layout, true); - + ANIM_uiTemplate_fmodifier_draw(col, strip_ptr.id.data, &strip->modifiers, fcm); } } @@ -565,7 +565,7 @@ static int nla_properties_toggle_exec(bContext *C, wmOperator *UNUSED(op)) { ScrArea *sa = CTX_wm_area(C); ARegion *ar = nla_has_buttons_region(sa); - + if (ar) ED_region_toggle_hidden(C, ar); @@ -577,7 +577,7 @@ void NLA_OT_properties(wmOperatorType *ot) ot->name = "Properties"; ot->idname = "NLA_OT_properties"; ot->description = "Toggle the properties region visibility"; - + ot->exec = nla_properties_toggle_exec; ot->poll = ED_operator_nla_active; diff --git a/source/blender/editors/space_nla/nla_channels.c b/source/blender/editors/space_nla/nla_channels.c index 9ca52764b24..8fdba4ce60d 100644 --- a/source/blender/editors/space_nla/nla_channels.c +++ b/source/blender/editors/space_nla/nla_channels.c @@ -79,26 +79,26 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + View2D *v2d = &ac->ar->v2d; int notifierFlags = 0; - + /* get the channel that was clicked on */ /* filter channels */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_LIST_CHANNELS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); - + /* get channel from index */ ale = BLI_findlink(&anim_data, channel_index); if (ale == NULL) { /* channel not found */ if (G.debug & G_DEBUG) printf("Error: animation channel (index = %d) not found in mouse_anim_channels()\n", channel_index); - + ANIM_animdata_freelist(&anim_data); return 0; } - + /* action to take depends on what channel we've got */ // WARNING: must keep this in sync with the equivalent function in anim_channels_edit.c switch (ale->type) { @@ -106,7 +106,7 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe { Scene *sce = (Scene *)ale->data; AnimData *adt = sce->adt; - + /* set selection status */ if (selectmode == SELECT_INVERT) { /* swap select */ @@ -117,7 +117,7 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe sce->flag |= SCE_DS_SELECTED; if (adt) adt->flag |= ADT_UI_SELECTED; } - + notifierFlags |= (ND_ANIMCHAN | NA_SELECTED); break; } @@ -128,19 +128,19 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe Base *base = (Base *)ale->data; Object *ob = base->object; AnimData *adt = ob->adt; - + if (nlaedit_is_tweakmode_on(ac) == 0 && (ob->restrictflag & OB_RESTRICT_SELECT) == 0) { /* set selection status */ if (selectmode == SELECT_INVERT) { /* swap select */ base->flag ^= SELECT; ob->flag = base->flag; - + if (adt) adt->flag ^= ADT_UI_SELECTED; } else { Base *b; - + /* deselect all */ /* TODO: should this deselect all other types of channels too? */ for (b = sce->base.first; b; b = b->next) { @@ -148,19 +148,19 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe b->object->flag = b->flag; if (b->object->adt) b->object->adt->flag &= ~(ADT_UI_SELECTED | ADT_UI_ACTIVE); } - + /* select object now */ base->flag |= SELECT; ob->flag |= SELECT; if (adt) adt->flag |= ADT_UI_SELECTED; } - + /* change active object - regardless of whether it is now selected [T37883] */ ED_base_object_activate(C, base); /* adds notifier */ - + if ((adt) && (adt->flag & ADT_UI_SELECTED)) adt->flag |= ADT_UI_ACTIVE; - + /* notifiers - channel was selected */ notifierFlags |= (ND_ANIMCHAN | NA_SELECTED); } @@ -197,12 +197,12 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR); ale->adt->flag |= ADT_UI_SELECTED; } - + /* set active? */ if ((ale->adt) && (ale->adt->flag & ADT_UI_SELECTED)) ale->adt->flag |= ADT_UI_ACTIVE; } - + notifierFlags |= (ND_ANIMCHAN | NA_SELECTED); break; } @@ -211,7 +211,7 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe NlaTrack *nlt = (NlaTrack *)ale->data; AnimData *adt = ale->adt; short offset; - + /* offset for start of channel (on LHS of channel-list) */ if (ale->id) { /* special exception for materials and particles */ @@ -222,25 +222,25 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe } else offset = 0; - + if (x >= (v2d->cur.xmax - NLACHANNEL_BUTTON_WIDTH)) { /* toggle protection (only if there's a toggle there) */ nlt->flag ^= NLATRACK_PROTECTED; - + /* notifier flags - channel was edited */ notifierFlags |= (ND_ANIMCHAN | NA_EDITED); } else if (x >= (v2d->cur.xmax - 2 * NLACHANNEL_BUTTON_WIDTH)) { /* toggle mute */ nlt->flag ^= NLATRACK_MUTED; - + /* notifier flags - channel was edited */ notifierFlags |= (ND_ANIMCHAN | NA_EDITED); } else if (x <= ((NLACHANNEL_BUTTON_WIDTH * 2) + offset)) { /* toggle 'solo' */ BKE_nlatrack_solo_toggle(adt, nlt); - + /* notifier flags - channel was edited */ notifierFlags |= (ND_ANIMCHAN | NA_EDITED); } @@ -255,11 +255,11 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR); nlt->flag |= NLATRACK_SELECTED; } - + /* if NLA-Track is selected now, make NLA-Track the 'active' one in the visible list */ if (nlt->flag & NLATRACK_SELECTED) ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, nlt, ANIMTYPE_NLATRACK); - + /* notifier flags - channel was selected */ notifierFlags |= (ND_ANIMCHAN | NA_SELECTED); } @@ -268,7 +268,7 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe case ANIMTYPE_NLAACTION: { AnimData *adt = BKE_animdata_from_id(ale->id); - + /* button region... */ if (x >= (v2d->cur.xmax - NLACHANNEL_BUTTON_WIDTH)) { if (nlaedit_is_tweakmode_on(ac) == 0) { @@ -281,13 +281,13 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe /* when in tweakmode, this button becomes the toggle for mapped editing */ adt->flag ^= ADT_NLA_EDIT_NOMAP; } - + /* changes to NLA-Action occurred */ notifierFlags |= ND_NLA_ACTCHANGE; } /* OR rest of name... */ else { - /* NOTE: rest of NLA-Action name doubles for operating on the AnimData block + /* NOTE: rest of NLA-Action name doubles for operating on the AnimData block * - this is useful when there's no clear divider, and makes more sense in * the case of users trying to use this to change actions * - in tweakmode, clicking here gets us out of tweakmode, as changing selection @@ -298,7 +298,7 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe if (nlaedit_is_tweakmode_on(ac)) { /* exit tweakmode immediately */ nlaedit_disable_tweakmode(ac, true); - + /* changes to NLA-Action occurred */ notifierFlags |= ND_NLA_ACTCHANGE; } @@ -313,11 +313,11 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR); adt->flag |= ADT_UI_SELECTED; } - + /* set active? */ if (adt->flag & ADT_UI_SELECTED) adt->flag |= ADT_UI_ACTIVE; - + notifierFlags |= (ND_ANIMCHAN | NA_SELECTED); } } @@ -328,10 +328,10 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, float x, int channe printf("Error: Invalid channel type in mouse_nla_channels()\n"); break; } - + /* free channels */ ANIM_animdata_freelist(&anim_data); - + /* return the notifier-flags set */ return notifierFlags; } @@ -349,55 +349,55 @@ static int nlachannels_mouseclick_invoke(bContext *C, wmOperator *op, const wmEv int notifierFlags = 0; short selectmode; float x, y; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get useful pointers from animation context data */ snla = (SpaceNla *)ac.sl; ar = ac.ar; v2d = &ar->v2d; - + /* select mode is either replace (deselect all, then add) or add/extend */ if (RNA_boolean_get(op->ptr, "extend")) selectmode = SELECT_INVERT; else selectmode = SELECT_REPLACE; - - /* figure out which channel user clicked in + + /* figure out which channel user clicked in * Note: although channels technically start at y= NLACHANNEL_FIRST, we need to adjust by half a channel's height * so that the tops of channels get caught ok. Since NLACHANNEL_FIRST is really NLACHANNEL_HEIGHT, we simply use * NLACHANNEL_HEIGHT_HALF. */ UI_view2d_region_to_view(v2d, event->mval[0], event->mval[1], &x, &y); UI_view2d_listview_view_to_cell(v2d, NLACHANNEL_NAMEWIDTH, NLACHANNEL_STEP(snla), 0, (float)NLACHANNEL_HEIGHT_HALF(snla), x, y, NULL, &channel_index); - + /* handle mouse-click in the relevant channel then */ notifierFlags = mouse_nla_channels(C, &ac, x, channel_index, selectmode); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | notifierFlags, NULL); - + return OPERATOR_FINISHED; } - + void NLA_OT_channels_click(wmOperatorType *ot) { PropertyRNA *prop; - + /* identifiers */ ot->name = "Mouse Click on NLA Channels"; ot->idname = "NLA_OT_channels_click"; ot->description = "Handle clicks to select NLA channels"; - + /* api callbacks */ ot->invoke = nlachannels_mouseclick_invoke; ot->poll = ED_operator_nla_active; - + /* flags */ ot->flag = OPTYPE_UNDO; - + /* props */ prop = RNA_def_boolean(ot->srna, "extend", 0, "Extend Select", ""); // SHIFTKEY RNA_def_property_flag(prop, PROP_SKIP_SAVE); @@ -413,15 +413,15 @@ static int nlachannels_pushdown_exec(bContext *C, wmOperator *op) bAnimContext ac; AnimData *adt = NULL; int channel_index = RNA_int_get(op->ptr, "channel_index"); - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get anim-channel to use (or more specifically, the animdata block behind it) */ if (channel_index == -1) { PointerRNA adt_ptr = {{NULL}}; - + /* active animdata block */ if (nla_panel_context(C, &adt_ptr, NULL, NULL) == 0 || (adt_ptr.data == NULL)) { BKE_report(op->reports, RPT_ERROR, "No active AnimData block to use " @@ -437,11 +437,11 @@ static int nlachannels_pushdown_exec(bContext *C, wmOperator *op) ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + /* filter channels */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_LIST_CHANNELS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* get channel from index */ ale = BLI_findlink(&anim_data, channel_index); if (ale == NULL) { @@ -454,14 +454,14 @@ static int nlachannels_pushdown_exec(bContext *C, wmOperator *op) ANIM_animdata_freelist(&anim_data); return OPERATOR_CANCELLED; } - + /* grab AnimData from the channel */ adt = ale->adt; - + /* we don't need anything here anymore, so free it all */ ANIM_animdata_freelist(&anim_data); } - + /* double-check that we are free to push down here... */ if (adt == NULL) { BKE_report(op->reports, RPT_WARNING, "Internal Error - AnimData block is not valid"); @@ -480,7 +480,7 @@ static int nlachannels_pushdown_exec(bContext *C, wmOperator *op) /* 'push-down' action - only usable when not in TweakMode */ BKE_nla_action_pushdown(adt); } - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA_ACTCHANGE, NULL); return OPERATOR_FINISHED; @@ -492,14 +492,14 @@ void NLA_OT_action_pushdown(wmOperatorType *ot) ot->name = "Push Down Action"; ot->idname = "NLA_OT_action_pushdown"; ot->description = "Push action down onto the top of the NLA stack as a new strip"; - + /* callbacks */ ot->exec = nlachannels_pushdown_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ ot->prop = RNA_def_int(ot->srna, "channel_index", -1, -1, INT_MAX, "Channel Index", "Index of NLA action channel to perform pushdown operation on", @@ -514,7 +514,7 @@ static int nla_action_unlink_poll(bContext *C) if (ED_operator_nla_active(C)) { return nla_panel_context(C, NULL, NULL, NULL); } - + /* something failed... */ return false; } @@ -523,22 +523,22 @@ static int nla_action_unlink_exec(bContext *C, wmOperator *op) { PointerRNA adt_ptr; AnimData *adt; - + /* check context and also validity of pointer */ if (!nla_panel_context(C, &adt_ptr, NULL, NULL)) return OPERATOR_CANCELLED; - + /* get animdata */ adt = adt_ptr.data; if (adt == NULL) return OPERATOR_CANCELLED; - + /* do unlinking */ if (adt && adt->action) { bool force_delete = RNA_boolean_get(op->ptr, "force_delete"); ED_animedit_unlink_action(C, adt_ptr.id.data, adt, adt->action, op->reports, force_delete); } - + return OPERATOR_FINISHED; } @@ -552,19 +552,19 @@ static int nla_action_unlink_invoke(bContext *C, wmOperator *op, const wmEvent * void NLA_OT_action_unlink(wmOperatorType *ot) { PropertyRNA *prop; - + /* identifiers */ ot->name = "Unlink Action"; ot->idname = "NLA_OT_action_unlink"; ot->description = "Unlink this action from the active action slot (and/or exit Tweak Mode)"; - + /* callbacks */ ot->invoke = nla_action_unlink_invoke; ot->exec = nla_action_unlink_exec; ot->poll = nla_action_unlink_poll; - + /* properties */ - prop = RNA_def_boolean(ot->srna, "force_delete", false, "Force Delete", + prop = RNA_def_boolean(ot->srna, "force_delete", false, "Force Delete", "Clear Fake User and remove copy stashed in this datablock's NLA stack"); RNA_def_property_flag(prop, PROP_SKIP_SAVE); } @@ -580,17 +580,17 @@ bool nlaedit_add_tracks_existing(bAnimContext *ac, bool above_sel) int filter; AnimData *lastAdt = NULL; bool added = false; - + /* get a list of the (selected) NLA Tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); - + /* add tracks... */ for (ale = anim_data.first; ale; ale = ale->next) { if (ale->type == ANIMTYPE_NLATRACK) { NlaTrack *nlt = (NlaTrack *)ale->data; AnimData *adt = ale->adt; - + /* check if just adding a new track above this one, * or whether we're adding a new one to the top of the stack that this one belongs to */ @@ -607,10 +607,10 @@ bool nlaedit_add_tracks_existing(bAnimContext *ac, bool above_sel) } } } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - + return added; } @@ -621,18 +621,18 @@ bool nlaedit_add_tracks_empty(bAnimContext *ac) bAnimListElem *ale; int filter; bool added = false; - + /* get a list of the selected AnimData blocks in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_ANIMDATA | ANIMFILTER_SEL | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); - + /* check if selected AnimData blocks are empty, and add tracks if so... */ for (ale = anim_data.first; ale; ale = ale->next) { AnimData *adt = ale->adt; - + /* sanity check */ BLI_assert(adt->flag & ADT_UI_SELECTED); - + /* ensure it is empty */ if (BLI_listbase_is_empty(&adt->nla_tracks)) { /* add new track to this AnimData block then */ @@ -640,10 +640,10 @@ bool nlaedit_add_tracks_empty(bAnimContext *ac) added = true; } } - + /* cleanup */ ANIM_animdata_freelist(&anim_data); - + return added; } @@ -654,20 +654,20 @@ static int nlaedit_add_tracks_exec(bContext *C, wmOperator *op) bAnimContext ac; bool above_sel = RNA_boolean_get(op->ptr, "above_selected"); bool op_done = false; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* perform adding in two passes - existing first so that we don't double up for empty */ op_done |= nlaedit_add_tracks_existing(&ac, above_sel); op_done |= nlaedit_add_tracks_empty(&ac); - + /* done? */ if (op_done) { /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -675,7 +675,7 @@ static int nlaedit_add_tracks_exec(bContext *C, wmOperator *op) /* failed to add any tracks */ BKE_report(op->reports, RPT_WARNING, "Select an existing NLA Track or an empty action line first"); - + /* not done */ return OPERATOR_CANCELLED; } @@ -687,14 +687,14 @@ void NLA_OT_tracks_add(wmOperatorType *ot) ot->name = "Add Tracks"; ot->idname = "NLA_OT_tracks_add"; ot->description = "Add NLA-Tracks above/after the selected tracks"; - + /* api callbacks */ ot->exec = nlaedit_add_tracks_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ RNA_def_boolean(ot->srna, "above_selected", 0, "Above Selected", "Add a new NLA Track above every existing selected one"); } @@ -705,42 +705,42 @@ void NLA_OT_tracks_add(wmOperatorType *ot) static int nlaedit_delete_tracks_exec(bContext *C, wmOperator *UNUSED(op)) { bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get a list of the AnimData blocks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* delete tracks */ for (ale = anim_data.first; ale; ale = ale->next) { if (ale->type == ANIMTYPE_NLATRACK) { NlaTrack *nlt = (NlaTrack *)ale->data; AnimData *adt = ale->adt; - + /* if track is currently 'solo', then AnimData should have its * 'has solo' flag disabled */ if (nlt->flag & NLATRACK_SOLO) adt->flag &= ~ADT_NLA_SOLO_TRACK; - + /* call delete on this track - deletes all strips too */ BKE_nlatrack_free(&adt->nla_tracks, nlt); } } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -751,11 +751,11 @@ void NLA_OT_tracks_delete(wmOperatorType *ot) ot->name = "Delete Tracks"; ot->idname = "NLA_OT_tracks_delete"; ot->description = "Delete selected NLA-Tracks and the strips they contain"; - + /* api callbacks */ ot->exec = nlaedit_delete_tracks_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -764,7 +764,7 @@ void NLA_OT_tracks_delete(wmOperatorType *ot) /* AnimData Related Operators */ /* ******************** Include Objects Operator ***************************** */ -/* Include selected objects in NLA Editor, by giving them AnimData blocks +/* Include selected objects in NLA Editor, by giving them AnimData blocks * NOTE: This doesn't help for non-object AnimData, where we do not have any effective * selection mechanism in place. Unfortunately, this means that non-object AnimData * once again becomes a second-class citizen here. However, at least for the most @@ -775,28 +775,28 @@ static int nlaedit_objects_add_exec(bContext *C, wmOperator *UNUSED(op)) { bAnimContext ac; SpaceNla *snla; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* ensure that filters are set so that the effect will be immediately visible */ snla = (SpaceNla *)ac.sl; if (snla && snla->ads) { snla->ads->filterflag &= ~ADS_FILTER_NLA_NOACT; } - - /* operate on selected objects... */ + + /* operate on selected objects... */ CTX_DATA_BEGIN (C, Object *, ob, selected_objects) { /* ensure that object has AnimData... that's all */ BKE_animdata_add_id(&ob->id); } CTX_DATA_END; - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -807,11 +807,11 @@ void NLA_OT_selected_objects_add(wmOperatorType *ot) ot->name = "Include Selected Objects"; ot->idname = "NLA_OT_selected_objects_add"; ot->description = "Make selected objects appear in NLA Editor by adding Animation Data"; - + /* api callbacks */ ot->exec = nlaedit_objects_add_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } diff --git a/source/blender/editors/space_nla/nla_draw.c b/source/blender/editors/space_nla/nla_draw.c index 910b8b3c08b..5d138a939de 100644 --- a/source/blender/editors/space_nla/nla_draw.c +++ b/source/blender/editors/space_nla/nla_draw.c @@ -71,7 +71,7 @@ /* Action-Line ---------------------- */ -/* get colors for drawing Action-Line +/* get colors for drawing Action-Line * NOTE: color returned includes fine-tuned alpha! */ void nla_action_get_color(AnimData *adt, bAction *act, float color[4]) @@ -90,7 +90,7 @@ void nla_action_get_color(AnimData *adt, bAction *act, float color[4]) UI_GetThemeColor4fv(TH_ANIM_INACTIVE, color); } } - + /* when an NLA track is tagged "solo", action doesn't contribute, so shouldn't be as prominent */ if (adt && (adt->flag & ADT_NLA_SOLO_TRACK)) color[3] *= 0.15f; @@ -103,44 +103,44 @@ static void nla_action_draw_keyframes(AnimData *adt, bAction *act, View2D *v2d, ActKeyColumn *ak; float xscale, f1, f2; float color[4]; - + /* get a list of the keyframes with NLA-scaling applied */ BLI_dlrbTree_init(&keys); action_to_keylist(adt, act, &keys, NULL); BLI_dlrbTree_linkedlist_sync(&keys); - + if (ELEM(NULL, act, keys.first)) return; - - /* draw a darkened region behind the strips - * - get and reset the background color, this time without the alpha to stand out better + + /* draw a darkened region behind the strips + * - get and reset the background color, this time without the alpha to stand out better * (amplified alpha is used instead) */ nla_action_get_color(adt, act, color); color[3] *= 2.5f; - + glColor4fv(color); /* - draw a rect from the first to the last frame (no extra overlaps for now) * that is slightly stumpier than the track background (hardcoded 2-units here) */ f1 = ((ActKeyColumn *)keys.first)->cfra; f2 = ((ActKeyColumn *)keys.last)->cfra; - + glRectf(f1, ymin + 2, f2, ymax - 2); - - + + /* get View2D scaling factor */ UI_view2d_scale_get(v2d, &xscale, NULL); - + /* for now, color is hardcoded to be black */ glColor3f(0.0f, 0.0f, 0.0f); - - /* just draw each keyframe as a simple dot (regardless of the selection status) + + /* just draw each keyframe as a simple dot (regardless of the selection status) * - size is 3.0f which is smaller than the editable keyframes, so that there is a distinction */ for (ak = keys.first; ak; ak = ak->next) draw_keyframe_shape(ak->cfra, y, xscale, 3.0f, 0, ak->key_type, KEYFRAME_SHAPE_FRAME, 1.0f); - + /* free icons */ BLI_dlrbTree_free(&keys); } @@ -152,14 +152,14 @@ static void nla_actionclip_draw_markers(NlaStrip *strip, float yminc, float ymax { bAction *act = strip->act; TimeMarker *marker; - + if (ELEM(NULL, strip->act, strip->act->markers.first)) return; - + for (marker = act->markers.first; marker; marker = marker->next) { if ((marker->frame > strip->actstart) && (marker->frame < strip->actend)) { float frame = nlastrip_get_frame(strip, marker->frame, NLATIME_CONVERT_MAP); - + /* just a simple line for now */ // XXX: draw a triangle instead... fdrawline(frame, yminc + 1, frame, ymaxc - 1); @@ -171,25 +171,25 @@ static void nla_actionclip_draw_markers(NlaStrip *strip, float yminc, float ymax static void nla_strip_draw_markers(NlaStrip *strip, float yminc, float ymaxc) { glLineWidth(2.0); - + if (strip->type == NLASTRIP_TYPE_CLIP) { /* try not to be too conspicuous, while being visible enough when transforming */ if (strip->flag & NLASTRIP_FLAG_SELECT) UI_ThemeColorShade(TH_STRIP_SELECT, -60); else UI_ThemeColorShade(TH_STRIP_SELECT, -40); - + setlinestyle(3); - + /* just draw the markers in this clip */ nla_actionclip_draw_markers(strip, yminc, ymaxc); - + setlinestyle(0); } else if (strip->flag & NLASTRIP_FLAG_TEMP_META) { /* just a solid color, so that it is very easy to spot */ UI_ThemeColorShade(TH_STRIP_SELECT, 20); - + /* draw the markers in the first level of strips only (if they are actions) */ for (NlaStrip *nls = strip->strips.first; nls; nls = nls->next) { if (nls->type == NLASTRIP_TYPE_CLIP) { @@ -197,7 +197,7 @@ static void nla_strip_draw_markers(NlaStrip *strip, float yminc, float ymaxc) } } } - + glLineWidth(1.0); } @@ -269,25 +269,25 @@ static void nla_strip_get_color_inside(AnimData *adt, NlaStrip *strip, float col static void nla_draw_strip_curves(NlaStrip *strip, float yminc, float ymaxc) { const float yheight = ymaxc - yminc; - + /* drawing color is simply a light-gray */ // TODO: is this color suitable? // XXX nasty hacked color for now... which looks quite bad too... glColor3f(0.7f, 0.7f, 0.7f); - + /* draw with AA'd line */ glEnable(GL_LINE_SMOOTH); glEnable(GL_BLEND); - + /* influence -------------------------- */ if (strip->flag & NLASTRIP_FLAG_USR_INFLUENCE) { FCurve *fcu = list_find_fcurve(&strip->fcurves, "influence", 0); float cfra; - + /* plot the curve (over the strip's main region) */ if (fcu) { glBegin(GL_LINE_STRIP); - + /* sample at 1 frame intervals, and draw * - min y-val is yminc, max is y-maxc, so clamp in those regions */ @@ -296,7 +296,7 @@ static void nla_draw_strip_curves(NlaStrip *strip, float yminc, float ymaxc) CLAMP(y, 0.0f, 1.0f); glVertex2f(cfra, ((y * yheight) + yminc)); } - + glEnd(); // GL_LINE_STRIP } } @@ -311,7 +311,7 @@ static void nla_draw_strip_curves(NlaStrip *strip, float yminc, float ymaxc) } else glVertex2f(strip->start, ymaxc); - + /* end of strip */ if (IS_EQF(strip->blendout, 0.0f) == 0) { glVertex2f(strip->end - strip->blendout, ymaxc); @@ -322,10 +322,10 @@ static void nla_draw_strip_curves(NlaStrip *strip, float yminc, float ymaxc) glEnd(); // GL_LINE_STRIP } } - + /* time -------------------------- */ // XXX do we want to draw this curve? in a different color too? - + /* turn off AA'd lines */ glDisable(GL_LINE_SMOOTH); glDisable(GL_BLEND); @@ -336,10 +336,10 @@ static void nla_draw_strip(SpaceNla *snla, AnimData *adt, NlaTrack *nlt, NlaStri { const bool non_solo = ((adt && (adt->flag & ADT_NLA_SOLO_TRACK)) && (nlt->flag & NLATRACK_SOLO) == 0); float color[3]; - + /* get color of strip */ nla_strip_get_color_inside(adt, strip, color); - + /* draw extrapolation info first (as backdrop) * - but this should only be drawn if track has some contribution */ @@ -347,17 +347,17 @@ static void nla_draw_strip(SpaceNla *snla, AnimData *adt, NlaTrack *nlt, NlaStri /* enable transparency... */ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); - + switch (strip->extendmode) { /* since this does both sides, only do the 'before' side, and leave the rest to the next case */ - case NLASTRIP_EXTEND_HOLD: - /* only need to draw here if there's no strip before since - * it only applies in such a situation + case NLASTRIP_EXTEND_HOLD: + /* only need to draw here if there's no strip before since + * it only applies in such a situation */ if (strip->prev == NULL) { /* set the drawing color to the color of the strip, but with very faint alpha */ glColor4f(color[0], color[1], color[2], 0.15f); - + /* draw the rect to the edge of the screen */ glBegin(GL_QUADS); glVertex2f(v2d->cur.xmin, yminc); @@ -369,17 +369,17 @@ static void nla_draw_strip(SpaceNla *snla, AnimData *adt, NlaTrack *nlt, NlaStri ATTR_FALLTHROUGH; /* this only draws after the strip */ - case NLASTRIP_EXTEND_HOLD_FORWARD: + case NLASTRIP_EXTEND_HOLD_FORWARD: /* only need to try and draw if the next strip doesn't occur immediately after */ if ((strip->next == NULL) || (IS_EQF(strip->next->start, strip->end) == 0)) { /* set the drawing color to the color of the strip, but this time less faint */ glColor4f(color[0], color[1], color[2], 0.3f); - + /* draw the rect to the next strip or the edge of the screen */ glBegin(GL_QUADS); glVertex2f(strip->end, yminc); glVertex2f(strip->end, ymaxc); - + if (strip->next) { glVertex2f(strip->next->start, ymaxc); glVertex2f(strip->next->start, yminc); @@ -392,41 +392,41 @@ static void nla_draw_strip(SpaceNla *snla, AnimData *adt, NlaTrack *nlt, NlaStri } break; } - + glDisable(GL_BLEND); } - - + + /* draw 'inside' of strip itself */ if (non_solo == 0) { /* strip is in normal track */ glColor3fv(color); UI_draw_roundbox_corner_set(UI_CNR_ALL); /* all corners rounded */ - + UI_draw_roundbox_shade_x(GL_POLYGON, strip->start, yminc, strip->end, ymaxc, 0.0, 0.5, 0.1); } else { /* strip is in disabled track - make less visible */ glColor4f(color[0], color[1], color[2], 0.1f); - + glEnable(GL_BLEND); glRectf(strip->start, yminc, strip->end, ymaxc); glDisable(GL_BLEND); } - - + + /* draw strip's control 'curves' * - only if user hasn't hidden them... */ if ((snla->flag & SNLA_NOSTRIPCURVES) == 0) nla_draw_strip_curves(strip, yminc, ymaxc); - - + + /* draw markings indicating locations of local markers (useful for lining up different actions) */ if ((snla->flag & SNLA_NOLOCALMARKERS) == 0) nla_strip_draw_markers(strip, yminc, ymaxc); - - /* draw strip outline + + /* draw strip outline * - color used here is to indicate active vs non-active */ if (strip->flag & NLASTRIP_FLAG_ACTIVE) { @@ -437,25 +437,25 @@ static void nla_draw_strip(SpaceNla *snla, AnimData *adt, NlaTrack *nlt, NlaStri /* strip should appear to stand out, so draw a dark border around it */ glColor3f(0.0f, 0.0f, 0.0f); } - + /* - line style: dotted for muted */ if ((nlt->flag & NLATRACK_MUTED) || (strip->flag & NLASTRIP_FLAG_MUTED)) setlinestyle(4); - + /* draw outline */ UI_draw_roundbox_shade_x(GL_LINE_LOOP, strip->start, yminc, strip->end, ymaxc, 0.0, 0.0, 0.1); - + /* if action-clip strip, draw lines delimiting repeats too (in the same color as outline) */ if ((strip->type == NLASTRIP_TYPE_CLIP) && IS_EQF(strip->repeat, 1.0f) == 0) { float repeatLen = (strip->actend - strip->actstart) * strip->scale; int i; - + /* only draw lines for whole-numbered repeats, starting from the first full-repeat * up to the last full repeat (but not if it lies on the end of the strip) */ for (i = 1; i < strip->repeat; i++) { float repeatPos = strip->start + (repeatLen * i); - + /* don't draw if line would end up on or after the end of the strip */ if (repeatPos < strip->end) fdrawline(repeatPos, yminc + 4, repeatPos, ymaxc - 4); @@ -465,26 +465,26 @@ static void nla_draw_strip(SpaceNla *snla, AnimData *adt, NlaTrack *nlt, NlaStri else if ((strip->type == NLASTRIP_TYPE_META) && (strip->strips.first != strip->strips.last)) { NlaStrip *cs; float y = (ymaxc - yminc) / 2.0f + yminc; - + /* only draw first-level of child-strips, but don't draw any lines on the endpoints */ for (cs = strip->strips.first; cs; cs = cs->next) { - /* draw start-line if not same as end of previous (and only if not the first strip) + /* draw start-line if not same as end of previous (and only if not the first strip) * - on upper half of strip */ if ((cs->prev) && IS_EQF(cs->prev->end, cs->start) == 0) fdrawline(cs->start, y, cs->start, ymaxc); - + /* draw end-line if not the last strip * - on lower half of strip */ - if (cs->next) + if (cs->next) fdrawline(cs->end, yminc, cs->end, y); } } - + /* reset linestyle */ setlinestyle(0); -} +} /* add the relevant text to the cache of text-strings to draw in pixelspace */ static void nla_draw_strip_text( @@ -496,7 +496,7 @@ static void nla_draw_strip_text( size_t str_len; char col[4]; rctf rect; - + /* just print the name and the range */ if (strip->flag & NLASTRIP_FLAG_TEMP_META) { str_len = BLI_snprintf_rlen(str, sizeof(str), "%d) Temp-Meta", index); @@ -504,7 +504,7 @@ static void nla_draw_strip_text( else { str_len = BLI_strncpy_rlen(str, strip->name, sizeof(str)); } - + /* set text color - if colors (see above) are light, draw black text, otherwise draw white */ if (strip->flag & (NLASTRIP_FLAG_ACTIVE | NLASTRIP_FLAG_SELECT | NLASTRIP_FLAG_TWEAKUSER)) { col[0] = col[1] = col[2] = 0; @@ -512,14 +512,14 @@ static void nla_draw_strip_text( else { col[0] = col[1] = col[2] = 255; } - + /* text opacity depends on whether if there's a solo'd track, this isn't it */ if (non_solo == 0) col[3] = 255; else col[3] = 128; - /* set bounding-box for text + /* set bounding-box for text * - padding of 2 'units' on either side */ // TODO: make this centered? @@ -527,7 +527,7 @@ static void nla_draw_strip_text( rect.ymin = yminc; rect.xmax = xmaxc; rect.ymax = ymaxc; - + /* add this string to the cache of texts to draw */ UI_view2d_text_cache_add_rectf(v2d, &rect, str, str_len, col); } @@ -541,18 +541,18 @@ static void nla_draw_strip_frames_text(NlaTrack *UNUSED(nlt), NlaStrip *strip, V const char col[4] = {220, 220, 220, 255}; /* light gray */ char numstr[32]; size_t numstr_len; - - + + /* Always draw times above the strip, whereas sequencer drew below + above. - * However, we should be fine having everything on top, since these tend to be - * quite spaced out. + * However, we should be fine having everything on top, since these tend to be + * quite spaced out. * - 1 dp is compromise between lack of precision (ints only, as per sequencer) * while also preserving some accuracy, since we do use floats */ /* start frame */ numstr_len = BLI_snprintf_rlen(numstr, sizeof(numstr), "%.1f", strip->start); UI_view2d_text_cache_add(v2d, strip->start - 1.0f, ymaxc + ytol, numstr, numstr_len, col); - + /* end frame */ numstr_len = BLI_snprintf_rlen(numstr, sizeof(numstr), "%.1f", strip->end); UI_view2d_text_cache_add(v2d, strip->end, ymaxc + ytol, numstr, numstr_len, col); @@ -565,37 +565,37 @@ void draw_nla_main_data(bAnimContext *ac, SpaceNla *snla, ARegion *ar) ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + View2D *v2d = &ar->v2d; float y = 0.0f; size_t items; int height; const float pixelx = BLI_rctf_size_x(&v2d->cur) / BLI_rcti_size_x(&v2d->mask); const float text_margin_x = (8 * UI_DPI_FAC) * pixelx; - + /* build list of channels to draw */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_LIST_CHANNELS); items = ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); - + /* Update max-extent of channels here (taking into account scrollers): * - this is done to allow the channel list to be scrollable, but must be done here * to avoid regenerating the list again and/or also because channels list is drawn first - * - offset of NLACHANNEL_HEIGHT*2 is added to the height of the channels, as first is for + * - offset of NLACHANNEL_HEIGHT*2 is added to the height of the channels, as first is for * start of list offset, and the second is as a correction for the scrollers. */ height = ((items * NLACHANNEL_STEP(snla)) + (NLACHANNEL_HEIGHT(snla) * 2)); - /* don't use totrect set, as the width stays the same - * (NOTE: this is ok here, the configuration is pretty straightforward) + /* don't use totrect set, as the width stays the same + * (NOTE: this is ok here, the configuration is pretty straightforward) */ v2d->tot.ymin = (float)(-height); - + /* loop through channels, and set up drawing depending on their type */ y = (float)(-NLACHANNEL_HEIGHT(snla)); - + for (ale = anim_data.first; ale; ale = ale->next) { const float yminc = (float)(y - NLACHANNEL_HEIGHT_HALF(snla)); const float ymaxc = (float)(y + NLACHANNEL_HEIGHT_HALF(snla)); - + /* check if visible */ if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) || IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax) ) @@ -608,7 +608,7 @@ void draw_nla_main_data(bAnimContext *ac, SpaceNla *snla, ARegion *ar) NlaTrack *nlt = (NlaTrack *)ale->data; NlaStrip *strip; int index; - + /* draw each strip in the track (if visible) */ for (strip = nlt->strips.first, index = 1; strip; strip = strip->next, index++) { if (BKE_nlastrip_within_bounds(strip, v2d->cur.xmin, v2d->cur.xmax)) { @@ -617,13 +617,13 @@ void draw_nla_main_data(bAnimContext *ac, SpaceNla *snla, ARegion *ar) /* draw the visualization of the strip */ nla_draw_strip(snla, adt, nlt, strip, v2d, yminc, ymaxc); - + /* add the text for this strip to the cache */ if (xminc < xmaxc) { nla_draw_strip_text(adt, nlt, strip, index, v2d, xminc, xmaxc, yminc, ymaxc); } - - /* if transforming strips (only real reason for temp-metas currently), + + /* if transforming strips (only real reason for temp-metas currently), * add to the cache the frame numbers of the strip's extents */ if (strip->flag & NLASTRIP_FLAG_TEMP_META) @@ -636,48 +636,48 @@ void draw_nla_main_data(bAnimContext *ac, SpaceNla *snla, ARegion *ar) { AnimData *adt = ale->adt; float color[4]; - + /* just draw a semi-shaded rect spanning the width of the viewable area if there's data, * and a second darker rect within which we draw keyframe indicator dots if there's data */ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); - + /* get colors for drawing */ nla_action_get_color(adt, ale->data, color); glColor4fv(color); - + /* draw slightly shifted up for greater separation from standard channels, * but also slightly shorter for some more contrast when viewing the strips */ glRectf(v2d->cur.xmin, yminc + NLACHANNEL_SKIP, v2d->cur.xmax, ymaxc - NLACHANNEL_SKIP); - + /* draw keyframes in the action */ nla_action_draw_keyframes(adt, ale->data, v2d, y, yminc + NLACHANNEL_SKIP, ymaxc - NLACHANNEL_SKIP); - + /* draw 'embossed' lines above and below the strip for effect */ /* white base-lines */ glLineWidth(2.0f); glColor4f(1.0f, 1.0f, 1.0f, 0.3); fdrawline(v2d->cur.xmin, yminc + NLACHANNEL_SKIP, v2d->cur.xmax, yminc + NLACHANNEL_SKIP); fdrawline(v2d->cur.xmin, ymaxc - NLACHANNEL_SKIP, v2d->cur.xmax, ymaxc - NLACHANNEL_SKIP); - + /* black top-lines */ glLineWidth(1.0f); glColor3f(0.0f, 0.0f, 0.0f); fdrawline(v2d->cur.xmin, yminc + NLACHANNEL_SKIP, v2d->cur.xmax, yminc + NLACHANNEL_SKIP); fdrawline(v2d->cur.xmin, ymaxc - NLACHANNEL_SKIP, v2d->cur.xmax, ymaxc - NLACHANNEL_SKIP); - + glDisable(GL_BLEND); break; } } } - + /* adjust y-position for next one */ y -= NLACHANNEL_STEP(snla); } - + /* free tempolary channels */ ANIM_animdata_freelist(&anim_data); } @@ -690,41 +690,41 @@ void draw_nla_channel_list(const bContext *C, bAnimContext *ac, ARegion *ar) ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + SpaceNla *snla = (SpaceNla *)ac->sl; View2D *v2d = &ar->v2d; float y = 0.0f; size_t items; int height; - + /* build list of channels to draw */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_LIST_CHANNELS); items = ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); - + /* Update max-extent of channels here (taking into account scrollers): * - this is done to allow the channel list to be scrollable, but must be done here * to avoid regenerating the list again and/or also because channels list is drawn first - * - offset of NLACHANNEL_HEIGHT*2 is added to the height of the channels, as first is for + * - offset of NLACHANNEL_HEIGHT*2 is added to the height of the channels, as first is for * start of list offset, and the second is as a correction for the scrollers. */ height = ((items * NLACHANNEL_STEP(snla)) + (NLACHANNEL_HEIGHT(snla) * 2)); - /* don't use totrect set, as the width stays the same - * (NOTE: this is ok here, the configuration is pretty straightforward) + /* don't use totrect set, as the width stays the same + * (NOTE: this is ok here, the configuration is pretty straightforward) */ v2d->tot.ymin = (float)(-height); /* need to do a view-sync here, so that the keys area doesn't jump around (it must copy this) */ UI_view2d_sync(NULL, ac->sa, v2d, V2D_LOCK_COPY); - + /* draw channels */ { /* first pass: just the standard GL-drawing for backdrop + text */ size_t channel_index = 0; - + y = (float)(-NLACHANNEL_HEIGHT(snla)); - + for (ale = anim_data.first; ale; ale = ale->next) { float yminc = (float)(y - NLACHANNEL_HEIGHT_HALF(snla)); float ymaxc = (float)(y + NLACHANNEL_HEIGHT_HALF(snla)); - + /* check if visible */ if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) || IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax) ) @@ -732,7 +732,7 @@ void draw_nla_channel_list(const bContext *C, bAnimContext *ac, ARegion *ar) /* draw all channels using standard channel-drawing API */ ANIM_channel_draw(ac, ale, yminc, ymaxc, channel_index); } - + /* adjust y-position for next one */ y -= NLACHANNEL_STEP(snla); channel_index++; @@ -741,18 +741,18 @@ void draw_nla_channel_list(const bContext *C, bAnimContext *ac, ARegion *ar) { /* second pass: UI widgets */ uiBlock *block = UI_block_begin(C, ar, __func__, UI_EMBOSS); size_t channel_index = 0; - + y = (float)(-NLACHANNEL_HEIGHT(snla)); - + /* set blending again, as may not be set in previous step */ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); - + /* loop through channels, and set up drawing depending on their type */ for (ale = anim_data.first; ale; ale = ale->next) { const float yminc = (float)(y - NLACHANNEL_HEIGHT_HALF(snla)); const float ymaxc = (float)(y + NLACHANNEL_HEIGHT_HALF(snla)); - + /* check if visible */ if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) || IN_RANGE(ymaxc, v2d->cur.ymin, v2d->cur.ymax) ) @@ -760,18 +760,18 @@ void draw_nla_channel_list(const bContext *C, bAnimContext *ac, ARegion *ar) /* draw all channels using standard channel-drawing API */ ANIM_channel_draw_widgets(C, ac, ale, block, yminc, ymaxc, channel_index); } - + /* adjust y-position for next one */ y -= NLACHANNEL_STEP(snla); channel_index++; } - + UI_block_end(C, block); UI_block_draw(C, block); - + glDisable(GL_BLEND); } - + /* free temporary channels */ ANIM_animdata_freelist(&anim_data); } diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c index 4fabd1ded46..26ac06446c4 100644 --- a/source/blender/editors/space_nla/nla_edit.c +++ b/source/blender/editors/space_nla/nla_edit.c @@ -83,15 +83,15 @@ void ED_nla_postop_refresh(bAnimContext *ac) ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; short filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_ANIMDATA | ANIMFILTER_FOREDIT); - + /* get blocks to work on */ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); - + for (ale = anim_data.first; ale; ale = ale->next) { /* performing auto-blending, extend-mode validation, etc. */ BKE_nla_validate_state(ale->data); } - + /* free temp memory */ ANIM_animdata_freelist(&anim_data); } @@ -100,62 +100,62 @@ void ED_nla_postop_refresh(bAnimContext *ac) /* 'Special' Editing */ /* ******************** Tweak-Mode Operators ***************************** */ -/* 'Tweak mode' allows the action referenced by the active NLA-strip to be edited +/* 'Tweak mode' allows the action referenced by the active NLA-strip to be edited * as if it were the normal Active-Action of its AnimData block. */ static int nlaedit_enable_tweakmode_exec(bContext *C, wmOperator *op) { bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + const bool do_solo = RNA_boolean_get(op->ptr, "isolate_action"); bool ok = false; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get a list of the AnimData blocks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_ANIMDATA); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* if no blocks, popup error? */ if (BLI_listbase_is_empty(&anim_data)) { BKE_report(op->reports, RPT_ERROR, "No AnimData blocks to enter tweak mode for"); return OPERATOR_CANCELLED; } - + /* for each AnimData block with NLA-data, try setting it in tweak-mode */ for (ale = anim_data.first; ale; ale = ale->next) { AnimData *adt = ale->data; - + /* try entering tweakmode if valid */ ok |= BKE_nla_tweakmode_enter(adt); - + /* mark the active track as being "solo"? */ if (do_solo && adt->actstrip) { NlaTrack *nlt = BKE_nlatrack_find_tweaked(adt); - + if (nlt && !(nlt->flag & NLATRACK_SOLO)) { BKE_nlatrack_solo_toggle(adt, nlt); } } } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - - /* if we managed to enter tweakmode on at least one AnimData block, + + /* if we managed to enter tweakmode on at least one AnimData block, * set the flag for this in the active scene and send notifiers */ if (ac.scene && ok) { /* set editing flag */ ac.scene->flag |= SCE_NLA_EDIT_ON; - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA_ACTCHANGE, NULL); } @@ -163,27 +163,27 @@ static int nlaedit_enable_tweakmode_exec(bContext *C, wmOperator *op) BKE_report(op->reports, RPT_ERROR, "No active strip(s) to enter tweak mode on"); return OPERATOR_CANCELLED; } - + /* done */ return OPERATOR_FINISHED; } - + void NLA_OT_tweakmode_enter(wmOperatorType *ot) { PropertyRNA *prop; - + /* identifiers */ ot->name = "Enter Tweak Mode"; ot->idname = "NLA_OT_tweakmode_enter"; ot->description = "Enter tweaking mode for the action referenced by the active strip to edit its keyframes"; - + /* api callbacks */ ot->exec = nlaedit_enable_tweakmode_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ prop = RNA_def_boolean(ot->srna, "isolate_action", 0, "Isolate Action", "Enable 'solo' on the NLA Track containing the active strip, " @@ -198,47 +198,47 @@ bool nlaedit_disable_tweakmode(bAnimContext *ac, bool do_solo) { ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; - int filter; - + int filter; + /* get a list of the AnimData blocks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_ANIMDATA); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); - + /* if no blocks, popup error? */ if (BLI_listbase_is_empty(&anim_data)) { BKE_report(ac->reports, RPT_ERROR, "No AnimData blocks in tweak mode to exit from"); return false; } - + /* for each AnimData block with NLA-data, try exitting tweak-mode */ for (ale = anim_data.first; ale; ale = ale->next) { AnimData *adt = ale->data; - + /* clear solo flags */ if ((do_solo) & (adt->flag & ADT_NLA_SOLO_TRACK) && - (adt->flag & ADT_NLA_EDIT_ON)) + (adt->flag & ADT_NLA_EDIT_ON)) { BKE_nlatrack_solo_toggle(adt, NULL); } - + /* to be sure that we're doing everything right, just exit tweakmode... */ BKE_nla_tweakmode_exit(adt); } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - - /* if we managed to enter tweakmode on at least one AnimData block, + + /* if we managed to enter tweakmode on at least one AnimData block, * set the flag for this in the active scene and send notifiers */ if (ac->scene) { /* clear editing flag */ ac->scene->flag &= ~SCE_NLA_EDIT_ON; - + /* set notifier that things have changed */ WM_main_add_notifier(NC_ANIMATION | ND_NLA_ACTCHANGE, NULL); } - + /* done */ return true; } @@ -247,40 +247,40 @@ bool nlaedit_disable_tweakmode(bAnimContext *ac, bool do_solo) static int nlaedit_disable_tweakmode_exec(bContext *C, wmOperator *op) { bAnimContext ac; - + const bool do_solo = RNA_boolean_get(op->ptr, "isolate_action"); bool ok = false; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* perform operation */ ok = nlaedit_disable_tweakmode(&ac, do_solo); - + /* success? */ if (ok) return OPERATOR_FINISHED; else return OPERATOR_CANCELLED; } - + void NLA_OT_tweakmode_exit(wmOperatorType *ot) { PropertyRNA *prop; - + /* identifiers */ ot->name = "Exit Tweak Mode"; ot->idname = "NLA_OT_tweakmode_exit"; ot->description = "Exit tweaking mode for the action referenced by the active strip"; - + /* api callbacks */ ot->exec = nlaedit_disable_tweakmode_exec; ot->poll = nlaop_poll_tweakmode_on; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ prop = RNA_def_boolean(ot->srna, "isolate_action", 0, "Isolate Action", "Disable 'solo' on any of the NLA Tracks after exiting tweak mode " @@ -300,38 +300,38 @@ static void get_nlastrip_extents(bAnimContext *ac, float *min, float *max, const bAnimListElem *ale; int filter; bool found_bounds = false; - + /* get data to filter */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); - + /* set large values to try to override */ *min = 999999999.0f; *max = -999999999.0f; - + /* check if any channels to set range with */ if (anim_data.first) { /* go through channels, finding max extents */ for (ale = anim_data.first; ale; ale = ale->next) { NlaTrack *nlt = (NlaTrack *)ale->data; NlaStrip *strip; - + for (strip = nlt->strips.first; strip; strip = strip->next) { /* only consider selected strips? */ if ((only_sel == false) || (strip->flag & NLASTRIP_FLAG_SELECT)) { /* extend range if appropriate */ *min = min_ff(*min, strip->start); *max = max_ff(*max, strip->end); - + found_bounds = true; } } } - + /* free memory */ ANIM_animdata_freelist(&anim_data); } - + /* set default range if nothing happened */ if (found_bounds == false) { if (ac->scene) { @@ -352,40 +352,40 @@ static int nlaedit_previewrange_exec(bContext *C, wmOperator *UNUSED(op)) bAnimContext ac; Scene *scene; float min, max; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + if (ac.scene == NULL) return OPERATOR_CANCELLED; else scene = ac.scene; - + /* set the range directly */ get_nlastrip_extents(&ac, &min, &max, true); scene->r.flag |= SCER_PRV_RANGE; scene->r.psfra = round_fl_to_int(min); scene->r.pefra = round_fl_to_int(max); - + /* set notifier that things have changed */ // XXX err... there's nothing for frame ranges yet, but this should do fine too WM_event_add_notifier(C, NC_SCENE | ND_FRAME, ac.scene); - + return OPERATOR_FINISHED; } - + void NLA_OT_previewrange_set(wmOperatorType *ot) { /* identifiers */ ot->name = "Auto-Set Preview Range"; ot->idname = "NLA_OT_previewrange_set"; ot->description = "Automatically set Preview Range based on range of keyframes"; - + /* api callbacks */ ot->exec = nlaedit_previewrange_exec; ot->poll = ED_operator_nla_active; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -404,33 +404,33 @@ static bool nla_channels_get_selected_extents(bAnimContext *ac, float *min, floa ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + SpaceNla *snla = (SpaceNla *)ac->sl; const float half_height = NLACHANNEL_HEIGHT_HALF(snla); short found = 0; /* NOTE: not bool, since we want prioritise individual channels over expanders */ float y; - + /* get all items - we need to do it this way */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_LIST_CHANNELS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); - + /* loop through all channels, finding the first one that's selected */ y = (float)NLACHANNEL_FIRST; - + for (ale = anim_data.first; ale; ale = ale->next) { const bAnimChannelType *acf = ANIM_channel_get_typeinfo(ale); - + /* must be selected... */ - if (acf && acf->has_setting(ac, ale, ACHANNEL_SETTING_SELECT) && + if (acf && acf->has_setting(ac, ale, ACHANNEL_SETTING_SELECT) && ANIM_channel_setting_get(ac, ale, ACHANNEL_SETTING_SELECT)) { /* update best estimate */ *min = (float)(y - half_height); *max = (float)(y + half_height); - + /* is this high enough priority yet? */ found = acf->channel_role; - + /* only stop our search when we've found an actual channel * - datablock expanders get less priority so that we don't abort prematurely */ @@ -438,14 +438,14 @@ static bool nla_channels_get_selected_extents(bAnimContext *ac, float *min, floa break; } } - + /* adjust y-position for next one */ y -= NLACHANNEL_STEP(snla); } - + /* free all temp data */ ANIM_animdata_freelist(&anim_data); - + return (found != 0); } @@ -454,19 +454,19 @@ static int nlaedit_viewall(bContext *C, const bool only_sel) bAnimContext ac; View2D *v2d; float extra; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; v2d = &ac.ar->v2d; - + /* set the horizontal range, with an extra offset so that the extreme keys will be in view */ get_nlastrip_extents(&ac, &v2d->cur.xmin, &v2d->cur.xmax, only_sel); - + extra = 0.1f * BLI_rctf_size_x(&v2d->cur); v2d->cur.xmin -= extra; v2d->cur.xmax += extra; - + /* set vertical range */ if (only_sel == false) { /* view all -> the summary channel is usually the shows everything, and resides right at the top... */ @@ -477,30 +477,30 @@ static int nlaedit_viewall(bContext *C, const bool only_sel) /* locate first selected channel (or the active one), and frame those */ float ymin = v2d->cur.ymin; float ymax = v2d->cur.ymax; - + if (nla_channels_get_selected_extents(&ac, &ymin, &ymax)) { /* recenter the view so that this range is in the middle */ float ymid = (ymax - ymin) / 2.0f + ymin; float x_center; - + UI_view2d_center_get(v2d, &x_center, NULL); UI_view2d_center_set(v2d, x_center, ymid); } } - + /* do View2D syncing */ UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY); - + /* just redraw this view */ ED_area_tag_redraw(CTX_wm_area(C)); - + return OPERATOR_FINISHED; } /* ......... */ static int nlaedit_viewall_exec(bContext *C, wmOperator *UNUSED(op)) -{ +{ /* whole range */ return nlaedit_viewall(C, false); } @@ -510,18 +510,18 @@ static int nlaedit_viewsel_exec(bContext *C, wmOperator *UNUSED(op)) /* only selected */ return nlaedit_viewall(C, true); } - + void NLA_OT_view_all(wmOperatorType *ot) { /* identifiers */ ot->name = "View All"; ot->idname = "NLA_OT_view_all"; ot->description = "Reset viewable area to show full strips range"; - + /* api callbacks */ ot->exec = nlaedit_viewall_exec; ot->poll = ED_operator_nla_active; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -532,11 +532,11 @@ void NLA_OT_view_selected(wmOperatorType *ot) ot->name = "View Selected"; ot->idname = "NLA_OT_view_selected"; ot->description = "Reset viewable area to show selected strips range"; - + /* api callbacks */ ot->exec = nlaedit_viewsel_exec; ot->poll = ED_operator_nla_active; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -556,11 +556,11 @@ void NLA_OT_view_frame(wmOperatorType *ot) ot->name = "View Frame"; ot->idname = "NLA_OT_view_frame"; ot->description = "Reset viewable area to show range around current frame"; - + /* api callbacks */ ot->exec = nlaedit_viewframe_exec; ot->poll = ED_operator_nla_active; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -577,7 +577,7 @@ static int nlaedit_add_actionclip_exec(bContext *C, wmOperator *op) { bAnimContext ac; Scene *scene; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; size_t items; @@ -586,17 +586,17 @@ static int nlaedit_add_actionclip_exec(bContext *C, wmOperator *op) bAction *act; float cfra; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + scene = ac.scene; cfra = (float)CFRA; - + /* get action to use */ act = BLI_findlink(&CTX_data_main(C)->action, RNA_enum_get(op->ptr, "action")); - + if (act == NULL) { BKE_report(op->reports, RPT_ERROR, "No valid action to add"); //printf("Add strip - actname = '%s'\n", actname); @@ -610,68 +610,68 @@ static int nlaedit_add_actionclip_exec(bContext *C, wmOperator *op) "for this action to avoid future problems)", act->id.name + 2); } - + /* add tracks to empty but selected animdata blocks so that strips can be added to those directly * without having to manually add tracks first */ nlaedit_add_tracks_empty(&ac); - + /* get a list of the editable tracks being shown in the NLA - * - this is limited to active ones for now, but could be expanded to + * - this is limited to active ones for now, but could be expanded to */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_ACTIVE | ANIMFILTER_FOREDIT); items = ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + if (items == 0) { - BKE_report(op->reports, RPT_ERROR, + BKE_report(op->reports, RPT_ERROR, "No active track(s) to add strip to, select an existing track or add one before trying again"); return OPERATOR_CANCELLED; } - + /* for every active track, try to add strip to free space in track or to the top of the stack if no space */ for (ale = anim_data.first; ale; ale = ale->next) { NlaTrack *nlt = (NlaTrack *)ale->data; AnimData *adt = ale->adt; NlaStrip *strip = NULL; - - /* sanity check: only apply actions of the right type for this ID + + /* sanity check: only apply actions of the right type for this ID * NOTE: in the case that this hasn't been set, we've already warned the user about this already */ if ((act->idroot) && (act->idroot != GS(ale->id->name))) { - BKE_reportf(op->reports, RPT_ERROR, + BKE_reportf(op->reports, RPT_ERROR, "Could not add action '%s' as it cannot be used relative to ID-blocks of type '%s'", act->id.name + 2, ale->id->name); continue; } - + /* create a new strip, and offset it to start on the current frame */ strip = BKE_nlastrip_new(act); - + strip->end += (cfra - strip->start); strip->start = cfra; - + /* firstly try adding strip to our current track, but if that fails, add to a new track */ if (BKE_nlatrack_add_strip(nlt, strip) == 0) { - /* trying to add to the current failed (no space), + /* trying to add to the current failed (no space), * so add a new track to the stack, and add to that... */ nlt = BKE_nlatrack_add(adt, NULL); BKE_nlatrack_add_strip(nlt, strip); } - + /* auto-name it */ BKE_nlastrip_validate_name(adt, strip); } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - + /* refresh auto strip properties */ ED_nla_postop_refresh(&ac); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -684,15 +684,15 @@ void NLA_OT_actionclip_add(wmOperatorType *ot) ot->name = "Add Action Strip"; ot->idname = "NLA_OT_actionclip_add"; ot->description = "Add an Action-Clip strip (i.e. an NLA Strip referencing an Action) to the active track"; - + /* api callbacks */ ot->invoke = WM_enum_search_invoke; ot->exec = nlaedit_add_actionclip_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* props */ // TODO: this would be nicer as an ID-pointer... prop = RNA_def_enum(ot->srna, "action", DummyRNA_NULL_items, 0, "Action", ""); @@ -707,45 +707,45 @@ void NLA_OT_actionclip_add(wmOperatorType *ot) static int nlaedit_add_transition_exec(bContext *C, wmOperator *op) { bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + bool done = false; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get a list of the editable tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* for each track, find pairs of strips to add transitions to */ for (ale = anim_data.first; ale; ale = ale->next) { NlaTrack *nlt = (NlaTrack *)ale->data; AnimData *adt = ale->adt; NlaStrip *s1, *s2; - + /* get initial pair of strips */ if (ELEM(nlt->strips.first, NULL, nlt->strips.last)) continue; s1 = nlt->strips.first; s2 = s1->next; - + /* loop over strips */ for (; s1 && s2; s1 = s2, s2 = s2->next) { NlaStrip *strip; - + /* check if both are selected */ if (ELEM(0, (s1->flag & NLASTRIP_FLAG_SELECT), (s2->flag & NLASTRIP_FLAG_SELECT))) continue; /* check if there's space between the two */ if (IS_EQF(s1->end, s2->start)) continue; - /* make sure neither one is a transition - * - although this is impossible to create with the standard tools, + /* make sure neither one is a transition + * - although this is impossible to create with the standard tools, * the user may have altered the settings */ if (ELEM(NLASTRIP_TYPE_TRANSITION, s1->type, s2->type)) @@ -753,48 +753,48 @@ static int nlaedit_add_transition_exec(bContext *C, wmOperator *op) /* also make sure neither one is a soundclip */ if (ELEM(NLASTRIP_TYPE_SOUND, s1->type, s2->type)) continue; - + /* allocate new strip */ strip = MEM_callocN(sizeof(NlaStrip), "NlaStrip"); BLI_insertlinkafter(&nlt->strips, s1, strip); - + /* set the type */ strip->type = NLASTRIP_TYPE_TRANSITION; - - /* generic settings + + /* generic settings * - selected flag to highlight this to the user - * - auto-blends to ensure that blend in/out values are automatically + * - auto-blends to ensure that blend in/out values are automatically * determined by overlaps of strips */ strip->flag = NLASTRIP_FLAG_SELECT | NLASTRIP_FLAG_AUTO_BLENDS; - + /* range is simply defined as the endpoints of the adjacent strips */ strip->start = s1->end; strip->end = s2->start; - + /* scale and repeat aren't of any use, but shouldn't ever be 0 */ strip->scale = 1.0f; strip->repeat = 1.0f; - + /* auto-name it */ BKE_nlastrip_validate_name(adt, strip); - + /* make note of this */ done = true; } } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - + /* was anything added? */ if (done) { /* refresh auto strip properties */ ED_nla_postop_refresh(&ac); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -810,11 +810,11 @@ void NLA_OT_transition_add(wmOperatorType *ot) ot->name = "Add Transition"; ot->idname = "NLA_OT_transition_add"; ot->description = "Add a transition strip between two adjacent selected strips"; - + /* api callbacks */ ot->exec = nlaedit_add_transition_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -825,66 +825,66 @@ void NLA_OT_transition_add(wmOperatorType *ot) static int nlaedit_add_sound_exec(bContext *C, wmOperator *UNUSED(op)) { bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + Scene *scene; int cfra; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + scene = ac.scene; cfra = CFRA; - + /* get a list of the editable tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_SEL | ANIMFILTER_FOREDIT); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* for each track, add sound clips if it belongs to a speaker */ // TODO: what happens if there aren't any tracks... well that's a more general problem for later for (ale = anim_data.first; ale; ale = ale->next) { Object *ob = (Object *)ale->id; /* may not be object until we actually check! */ - + AnimData *adt = ale->adt; NlaTrack *nlt = (NlaTrack *)ale->data; NlaStrip *strip; - + /* does this belong to speaker - assumed to live on Object level only */ if ((GS(ale->id->name) != ID_OB) || (ob->type != OB_SPEAKER)) continue; - + /* create a new strip, and offset it to start on the current frame */ strip = BKE_nla_add_soundstrip(ac.scene, ob->data); - + strip->start += cfra; strip->end += cfra; - + /* firstly try adding strip to our current track, but if that fails, add to a new track */ if (BKE_nlatrack_add_strip(nlt, strip) == 0) { - /* trying to add to the current failed (no space), + /* trying to add to the current failed (no space), * so add a new track to the stack, and add to that... */ nlt = BKE_nlatrack_add(adt, NULL); BKE_nlatrack_add_strip(nlt, strip); } - + /* auto-name it */ BKE_nlastrip_validate_name(adt, strip); } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - + /* refresh auto strip properties */ ED_nla_postop_refresh(&ac); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -895,11 +895,11 @@ void NLA_OT_soundclip_add(wmOperatorType *ot) ot->name = "Add Sound Clip"; ot->idname = "NLA_OT_soundclip_add"; ot->description = "Add a strip for controlling when speaker plays its sound clip"; - + /* api callbacks */ ot->exec = nlaedit_add_sound_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -911,28 +911,28 @@ void NLA_OT_soundclip_add(wmOperatorType *ot) static int nlaedit_add_meta_exec(bContext *C, wmOperator *UNUSED(op)) { bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get a list of the editable tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* for each track, find pairs of strips to add transitions to */ for (ale = anim_data.first; ale; ale = ale->next) { NlaTrack *nlt = (NlaTrack *)ale->data; AnimData *adt = ale->adt; NlaStrip *strip; - + /* create meta-strips from the continuous chains of selected strips */ BKE_nlastrips_make_metas(&nlt->strips, 0); - + /* name the metas */ for (strip = nlt->strips.first; strip; strip = strip->next) { /* auto-name this strip if selected (that means it is a meta) */ @@ -940,13 +940,13 @@ static int nlaedit_add_meta_exec(bContext *C, wmOperator *UNUSED(op)) BKE_nlastrip_validate_name(adt, strip); } } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -957,11 +957,11 @@ void NLA_OT_meta_add(wmOperatorType *ot) ot->name = "Add Meta-Strips"; ot->idname = "NLA_OT_meta_add"; ot->description = "Add new meta-strips incorporating the selected strips"; - + /* api callbacks */ ot->exec = nlaedit_add_meta_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -972,33 +972,33 @@ void NLA_OT_meta_add(wmOperatorType *ot) static int nlaedit_remove_meta_exec(bContext *C, wmOperator *UNUSED(op)) { bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get a list of the editable tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* for each track, find pairs of strips to add transitions to */ for (ale = anim_data.first; ale; ale = ale->next) { NlaTrack *nlt = (NlaTrack *)ale->data; - + /* clear all selected meta-strips, regardless of whether they are temporary or not */ BKE_nlastrips_clear_metas(&nlt->strips, 1, 0); } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -1009,11 +1009,11 @@ void NLA_OT_meta_remove(wmOperatorType *ot) ot->name = "Remove Meta-Strips"; ot->idname = "NLA_OT_meta_remove"; ot->description = "Separate out the strips held by the selected meta-strips"; - + /* api callbacks */ ot->exec = nlaedit_remove_meta_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -1022,27 +1022,27 @@ void NLA_OT_meta_remove(wmOperatorType *ot) /* Duplicates the selected NLA-Strips, putting them on new tracks above the one * the originals were housed in. */ - + static int nlaedit_duplicate_exec(bContext *C, wmOperator *op) { bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + bool linked = RNA_boolean_get(op->ptr, "linked"); bool done = false; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get a list of editable tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - - /* duplicate strips in tracks starting from the last one so that we're + + /* duplicate strips in tracks starting from the last one so that we're * less likely to duplicate strips we just duplicated... */ for (ale = anim_data.last; ale; ale = ale->prev) { @@ -1050,46 +1050,46 @@ static int nlaedit_duplicate_exec(bContext *C, wmOperator *op) AnimData *adt = ale->adt; NlaStrip *strip, *nstrip, *next; NlaTrack *track; - + for (strip = nlt->strips.first; strip; strip = next) { next = strip->next; - + /* if selected, split the strip at its midpoint */ if (strip->flag & NLASTRIP_FLAG_SELECT) { /* make a copy (assume that this is possible) */ nstrip = BKE_nlastrip_copy(strip, linked); - + /* in case there's no space in the track above, or we haven't got a reference to it yet, try adding */ if (BKE_nlatrack_add_strip(nlt->next, nstrip) == 0) { /* need to add a new track above the one above the current one - * - if the current one is the last one, nlt->next will be NULL, which defaults to adding + * - if the current one is the last one, nlt->next will be NULL, which defaults to adding * at the top of the stack anyway... */ track = BKE_nlatrack_add(adt, nlt->next); BKE_nlatrack_add_strip(track, nstrip); } - + /* deselect the original and the active flag */ strip->flag &= ~(NLASTRIP_FLAG_SELECT | NLASTRIP_FLAG_ACTIVE); - + /* auto-name newly created strip */ BKE_nlastrip_validate_name(adt, nstrip); - + done = true; } } } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - + if (done) { /* refresh auto strip properties */ ED_nla_postop_refresh(&ac); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -1100,7 +1100,7 @@ static int nlaedit_duplicate_exec(bContext *C, wmOperator *op) static int nlaedit_duplicate_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event)) { nlaedit_duplicate_exec(C, op); - + RNA_enum_set(op->ptr, "mode", TFM_TRANSLATION); WM_operator_name_call(C, "TRANSFORM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr); @@ -1113,18 +1113,18 @@ void NLA_OT_duplicate(wmOperatorType *ot) ot->name = "Duplicate Strips"; ot->idname = "NLA_OT_duplicate"; ot->description = "Duplicate selected NLA-Strips, adding the new strips in new tracks above the originals"; - + /* api callbacks */ ot->invoke = nlaedit_duplicate_invoke; ot->exec = nlaedit_duplicate_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* own properties */ ot->prop = RNA_def_boolean(ot->srna, "linked", false, "Linked", "When duplicating strips, assign new copies of the actions they use"); - + /* to give to transform */ RNA_def_enum(ot->srna, "mode", rna_enum_transform_mode_types, TFM_TRANSLATION, "Mode", ""); } @@ -1135,52 +1135,52 @@ void NLA_OT_duplicate(wmOperatorType *ot) static int nlaedit_delete_exec(bContext *C, wmOperator *UNUSED(op)) { bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get a list of the editable tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* for each NLA-Track, delete all selected strips */ for (ale = anim_data.first; ale; ale = ale->next) { NlaTrack *nlt = (NlaTrack *)ale->data; NlaStrip *strip, *nstrip; - + for (strip = nlt->strips.first; strip; strip = nstrip) { nstrip = strip->next; - + /* if selected, delete */ if (strip->flag & NLASTRIP_FLAG_SELECT) { /* if a strip either side of this was a transition, delete those too */ - if ((strip->prev) && (strip->prev->type == NLASTRIP_TYPE_TRANSITION)) + if ((strip->prev) && (strip->prev->type == NLASTRIP_TYPE_TRANSITION)) BKE_nlastrip_free(&nlt->strips, strip->prev); if ((nstrip) && (nstrip->type == NLASTRIP_TYPE_TRANSITION)) { nstrip = nstrip->next; BKE_nlastrip_free(&nlt->strips, strip->next); } - + /* finally, delete this strip */ BKE_nlastrip_free(&nlt->strips, strip); } } } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - + /* refresh auto strip properties */ ED_nla_postop_refresh(&ac); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -1191,18 +1191,18 @@ void NLA_OT_delete(wmOperatorType *ot) ot->name = "Delete Strips"; ot->idname = "NLA_OT_delete"; ot->description = "Delete selected strips"; - + /* api callbacks */ ot->exec = nlaedit_delete_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } /* ******************** Split Strips Operator ***************************** */ /* Splits the selected NLA-Strips into two strips at the midpoint of the strip */ -// TODO's? +// TODO's? // - multiple splits // - variable-length splits? @@ -1211,9 +1211,9 @@ static void nlaedit_split_strip_actclip(AnimData *adt, NlaTrack *nlt, NlaStrip * { NlaStrip *nstrip; float splitframe, splitaframe; - - /* calculate the frames to do the splitting at - * - use current frame if within extents of strip + + /* calculate the frames to do the splitting at + * - use current frame if within extents of strip */ if ((cfra > strip->start) && (cfra < strip->end)) { /* use the current frame */ @@ -1223,14 +1223,14 @@ static void nlaedit_split_strip_actclip(AnimData *adt, NlaTrack *nlt, NlaStrip * else { /* split in the middle */ float len; - + /* strip extents */ len = strip->end - strip->start; if (IS_EQF(len, 0.0f)) return; else splitframe = strip->start + (len / 2.0f); - + /* action range */ len = strip->actend - strip->actstart; if (IS_EQF(len, 0.0f)) @@ -1238,28 +1238,28 @@ static void nlaedit_split_strip_actclip(AnimData *adt, NlaTrack *nlt, NlaStrip * else splitaframe = strip->actstart + (len / 2.0f); } - + /* make a copy (assume that this is possible) and append * it immediately after the current strip */ nstrip = BKE_nlastrip_copy(strip, true); BLI_insertlinkafter(&nlt->strips, strip, nstrip); - - /* set the endpoint of the first strip and the start of the new strip + + /* set the endpoint of the first strip and the start of the new strip * to the splitframe values calculated above */ strip->end = splitframe; nstrip->start = splitframe; - + if ((splitaframe > strip->actstart) && (splitaframe < strip->actend)) { /* only do this if we're splitting down the middle... */ strip->actend = splitaframe; nstrip->actstart = splitaframe; } - + /* clear the active flag from the copy */ nstrip->flag &= ~NLASTRIP_FLAG_ACTIVE; - + /* auto-name the new strip */ BKE_nlastrip_validate_name(adt, nstrip); } @@ -1276,28 +1276,28 @@ static void nlaedit_split_strip_meta(NlaTrack *nlt, NlaStrip *strip) static int nlaedit_split_exec(bContext *C, wmOperator *UNUSED(op)) { bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get a list of editable tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* for each NLA-Track, split all selected strips into two strips */ for (ale = anim_data.first; ale; ale = ale->next) { NlaTrack *nlt = (NlaTrack *)ale->data; AnimData *adt = ale->adt; NlaStrip *strip, *next; - + for (strip = nlt->strips.first; strip; strip = next) { next = strip->next; - + /* if selected, split the strip at its midpoint */ if (strip->flag & NLASTRIP_FLAG_SELECT) { /* splitting method depends on the type of strip */ @@ -1305,27 +1305,27 @@ static int nlaedit_split_exec(bContext *C, wmOperator *UNUSED(op)) case NLASTRIP_TYPE_CLIP: /* action-clip */ nlaedit_split_strip_actclip(adt, nlt, strip, (float)ac.scene->r.cfra); break; - + case NLASTRIP_TYPE_META: /* meta-strips need special handling */ nlaedit_split_strip_meta(nlt, strip); break; - + default: /* for things like Transitions, do not split! */ break; } } } } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - + /* refresh auto strip properties */ ED_nla_postop_refresh(&ac); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -1336,11 +1336,11 @@ void NLA_OT_split(wmOperatorType *ot) ot->name = "Split Strips"; ot->idname = "NLA_OT_split"; ot->description = "Split selected strips at their midpoints"; - + /* api callbacks */ ot->exec = nlaedit_split_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -1351,34 +1351,34 @@ void NLA_OT_split(wmOperatorType *ot) static int nlaedit_bake_exec(bContext *C, wmOperator *UNUSED(op)) { bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; // int flag = 0; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get a list of the editable tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_ANIMDATA | ANIMFILTER_FOREDIT); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* for each AnimData block, bake strips to animdata... */ for (ale = anim_data.first; ale; ale = ale->next) { //BKE_nla_bake(ac.scene, ale->id, ale->data, flag); } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - + /* refresh auto strip properties */ ED_nla_postop_refresh(&ac); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -1390,11 +1390,11 @@ static void UNUSED_FUNCTION(NLA_OT_bake)(wmOperatorType *ot) ot->name = "Bake Strips"; ot->idname = "NLA_OT_bake"; ot->description = "Bake all strips of selected AnimData blocks"; - + /* api callbacks */ ot->exec = nlaedit_bake_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -1408,44 +1408,44 @@ static void UNUSED_FUNCTION(NLA_OT_bake)(wmOperatorType *ot) static int nlaedit_toggle_mute_exec(bContext *C, wmOperator *UNUSED(op)) { bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get a list of the editable tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* go over all selected strips */ for (ale = anim_data.first; ale; ale = ale->next) { NlaTrack *nlt = (NlaTrack *)ale->data; NlaStrip *strip; - + /* for every selected strip, toggle muting */ for (strip = nlt->strips.first; strip; strip = strip->next) { if (strip->flag & NLASTRIP_FLAG_SELECT) { /* just flip the mute flag for now */ // TODO: have a pre-pass to check if mute all or unmute all? strip->flag ^= NLASTRIP_FLAG_MUTED; - + /* tag AnimData to get recalculated */ ale->update |= ANIM_UPDATE_DEPS; } } } - + /* cleanup */ ANIM_animdata_update(&ac, &anim_data); ANIM_animdata_freelist(&anim_data); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -1456,11 +1456,11 @@ void NLA_OT_mute_toggle(wmOperatorType *ot) ot->name = "Toggle Muting"; ot->idname = "NLA_OT_mute_toggle"; ot->description = "Mute or un-mute selected strips"; - + /* api callbacks */ ot->exec = nlaedit_toggle_mute_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -1471,35 +1471,35 @@ void NLA_OT_mute_toggle(wmOperatorType *ot) static int nlaedit_swap_exec(bContext *C, wmOperator *op) { bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get a list of the editable tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* consider each track in turn */ for (ale = anim_data.first; ale; ale = ale->next) { NlaTrack *nlt = (NlaTrack *)ale->data; - + NlaStrip *strip, *stripN = NULL; NlaStrip *sa = NULL, *sb = NULL; - + /* make temporary metastrips so that entire islands of selections can be moved around */ BKE_nlastrips_make_metas(&nlt->strips, 1); - - /* special case: if there is only 1 island (i.e. temp meta BUT NOT unselected/normal/normal-meta strips) left after this, + + /* special case: if there is only 1 island (i.e. temp meta BUT NOT unselected/normal/normal-meta strips) left after this, * and this island has two strips inside it, then we should be able to just swap these still... */ if (BLI_listbase_is_empty(&nlt->strips) == false) { NlaStrip *mstrip = (NlaStrip *)nlt->strips.first; - + if ((mstrip->flag & NLASTRIP_FLAG_TEMP_META) && (BLI_listbase_count_at_most(&mstrip->strips, 3) == 2)) { @@ -1507,13 +1507,13 @@ static int nlaedit_swap_exec(bContext *C, wmOperator *op) BKE_nlastrips_clear_metas(&nlt->strips, 0, 1); } } - + /* get two selected strips only (these will be metas due to prev step) to operate on * - only allow swapping 2, as with more the context becomes unclear */ for (strip = nlt->strips.first; strip; strip = stripN) { stripN = strip->next; - + if (strip->flag & NLASTRIP_FLAG_SELECT) { /* first or second strip? */ if (sa == NULL) { @@ -1530,10 +1530,10 @@ static int nlaedit_swap_exec(bContext *C, wmOperator *op) } } } - + if (strip) { /* too many selected warning */ - BKE_reportf(op->reports, RPT_WARNING, + BKE_reportf(op->reports, RPT_WARNING, "Too many clusters of strips selected in NLA Track (%s): needs exactly 2 to be selected", nlt->name); } @@ -1548,11 +1548,11 @@ static int nlaedit_swap_exec(bContext *C, wmOperator *op) } else { float nsa[2], nsb[2]; - + /* remove these strips from the track, so that we can test if they can fit in the proposed places */ BLI_remlink(&nlt->strips, sa); BLI_remlink(&nlt->strips, sb); - + /* calculate new extents for strips */ /* a --> b */ nsa[0] = sb->start; @@ -1560,16 +1560,16 @@ static int nlaedit_swap_exec(bContext *C, wmOperator *op) /* b --> a */ nsb[0] = sa->start; nsb[1] = sa->start + (sb->end - sb->start); - + /* check if the track has room for the strips to be swapped */ - if (BKE_nlastrips_has_space(&nlt->strips, nsa[0], nsa[1]) && + if (BKE_nlastrips_has_space(&nlt->strips, nsa[0], nsa[1]) && BKE_nlastrips_has_space(&nlt->strips, nsb[0], nsb[1])) { /* set new extents for strips then */ sa->start = nsa[0]; sa->end = nsa[1]; BKE_nlameta_flush_transforms(sa); - + sb->start = nsb[0]; sb->end = nsb[1]; BKE_nlameta_flush_transforms(sb); @@ -1586,25 +1586,25 @@ static int nlaedit_swap_exec(bContext *C, wmOperator *op) sa->name, sb->name); } } - + /* add strips back to track now */ BKE_nlatrack_add_strip(nlt, sa); BKE_nlatrack_add_strip(nlt, sb); } - + /* clear (temp) metastrips */ BKE_nlastrips_clear_metas(&nlt->strips, 0, 1); } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - + /* refresh auto strip properties */ ED_nla_postop_refresh(&ac); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -1615,11 +1615,11 @@ void NLA_OT_swap(wmOperatorType *ot) ot->name = "Swap Strips"; ot->idname = "NLA_OT_swap"; ot->description = "Swap order of selected strips within tracks"; - + /* api callbacks */ ot->exec = nlaedit_swap_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -1630,19 +1630,19 @@ void NLA_OT_swap(wmOperatorType *ot) static int nlaedit_move_up_exec(bContext *C, wmOperator *UNUSED(op)) { bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get a list of the editable tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* since we're potentially moving strips from lower tracks to higher tracks, we should * loop over the tracks in reverse order to avoid moving earlier strips up multiple tracks */ @@ -1650,15 +1650,15 @@ static int nlaedit_move_up_exec(bContext *C, wmOperator *UNUSED(op)) NlaTrack *nlt = (NlaTrack *)ale->data; NlaTrack *nltn = nlt->next; NlaStrip *strip, *stripn; - + /* if this track has no tracks after it, skip for now... */ if (nltn == NULL) continue; - + /* for every selected strip, try to move */ for (strip = nlt->strips.first; strip; strip = stripn) { stripn = strip->next; - + if (strip->flag & NLASTRIP_FLAG_SELECT) { /* check if the track above has room for this strip */ if (BKE_nlatrack_has_space(nltn, strip->start, strip->end)) { @@ -1669,16 +1669,16 @@ static int nlaedit_move_up_exec(bContext *C, wmOperator *UNUSED(op)) } } } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - + /* refresh auto strip properties */ ED_nla_postop_refresh(&ac); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -1689,11 +1689,11 @@ void NLA_OT_move_up(wmOperatorType *ot) ot->name = "Move Strips Up"; ot->idname = "NLA_OT_move_up"; ot->description = "Move selected strips up a track if there's room"; - + /* api callbacks */ ot->exec = nlaedit_move_up_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -1704,19 +1704,19 @@ void NLA_OT_move_up(wmOperatorType *ot) static int nlaedit_move_down_exec(bContext *C, wmOperator *UNUSED(op)) { bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get a list of the editable tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* loop through the tracks in normal order, since we're pushing strips down, * strips won't get operated on twice */ @@ -1724,15 +1724,15 @@ static int nlaedit_move_down_exec(bContext *C, wmOperator *UNUSED(op)) NlaTrack *nlt = (NlaTrack *)ale->data; NlaTrack *nltp = nlt->prev; NlaStrip *strip, *stripn; - + /* if this track has no tracks before it, skip for now... */ if (nltp == NULL) continue; - + /* for every selected strip, try to move */ for (strip = nlt->strips.first; strip; strip = stripn) { stripn = strip->next; - + if (strip->flag & NLASTRIP_FLAG_SELECT) { /* check if the track below has room for this strip */ if (BKE_nlatrack_has_space(nltp, strip->start, strip->end)) { @@ -1743,16 +1743,16 @@ static int nlaedit_move_down_exec(bContext *C, wmOperator *UNUSED(op)) } } } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - + /* refresh auto strip properties */ ED_nla_postop_refresh(&ac); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -1763,11 +1763,11 @@ void NLA_OT_move_down(wmOperatorType *ot) ot->name = "Move Strips Down"; ot->idname = "NLA_OT_move_down"; ot->description = "Move selected strips down a track if there's room"; - + /* api callbacks */ ot->exec = nlaedit_move_down_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -1778,26 +1778,26 @@ void NLA_OT_move_down(wmOperatorType *ot) static int nlaedit_sync_actlen_exec(bContext *C, wmOperator *op) { bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; const bool active_only = RNA_boolean_get(op->ptr, "active"); - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get a list of the editable tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT); if (active_only) filter |= ANIMFILTER_ACTIVE; ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* for each NLA-Track, apply scale of all selected strips */ for (ale = anim_data.first; ale; ale = ale->next) { NlaTrack *nlt = (NlaTrack *)ale->data; NlaStrip *strip; - + for (strip = nlt->strips.first; strip; strip = strip->next) { /* strip selection/active status check */ if (active_only) { @@ -1808,27 +1808,27 @@ static int nlaedit_sync_actlen_exec(bContext *C, wmOperator *op) if ((strip->flag & NLASTRIP_FLAG_SELECT) == 0) continue; } - + /* must be action-clip only (transitions don't have scale) */ if (strip->type == NLASTRIP_TYPE_CLIP) { - if (strip->act == NULL) + if (strip->act == NULL) continue; - + /* recalculate the length of the action */ calc_action_range(strip->act, &strip->actstart, &strip->actend, 0); - + /* adjust the strip extents in response to this */ BKE_nlastrip_recalculate_bounds(strip); } } } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -1839,14 +1839,14 @@ void NLA_OT_action_sync_length(wmOperatorType *ot) ot->name = "Sync Action Length"; ot->idname = "NLA_OT_action_sync_length"; ot->description = "Synchronize the length of the referenced Action with the length used in the strip"; - + /* api callbacks */ ot->exec = nlaedit_sync_actlen_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ ot->prop = RNA_def_boolean(ot->srna, "active", 1, "Active Strip Only", "Only sync the active length for the active strip"); } @@ -1858,19 +1858,19 @@ static int nlaedit_make_single_user_exec(bContext *C, wmOperator *UNUSED(op)) { Main *bmain = CTX_data_main(C); bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get a list of the editable tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* Ensure that each action used only has a single user * - This is done in reverse order so that the original strips are * likely to still get to keep their action @@ -1878,34 +1878,34 @@ static int nlaedit_make_single_user_exec(bContext *C, wmOperator *UNUSED(op)) for (ale = anim_data.last; ale; ale = ale->prev) { NlaTrack *nlt = (NlaTrack *)ale->data; NlaStrip *strip; - + for (strip = nlt->strips.last; strip; strip = strip->prev) { /* must be action-clip only (as only these have actions) */ if ((strip->flag & NLASTRIP_FLAG_SELECT) && (strip->type == NLASTRIP_TYPE_CLIP)) { - if (strip->act == NULL) + if (strip->act == NULL) continue; - + /* multi-user? */ if (ID_REAL_USERS(strip->act) > 1) { /* make a new copy of the action for us to use (it will have 1 user already) */ bAction *new_action = BKE_action_copy(bmain, strip->act); - + /* decrement user count of our existing action */ id_us_min(&strip->act->id); - + /* switch to the new copy */ strip->act = new_action; } } } } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -1916,12 +1916,12 @@ void NLA_OT_make_single_user(wmOperatorType *ot) ot->name = "Make Single User"; ot->idname = "NLA_OT_make_single_user"; ot->description = "Ensure that each action is only used once in the set of strips selected"; - + /* api callbacks */ ot->invoke = WM_operator_confirm; ot->exec = nlaedit_make_single_user_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -1934,12 +1934,12 @@ static short bezt_apply_nlamapping(KeyframeEditData *ked, BezTriple *bezt) { /* NLA-strip which has this scaling is stored in ked->data */ NlaStrip *strip = (NlaStrip *)ked->data; - + /* adjust all the times */ bezt->vec[0][0] = nlastrip_get_frame(strip, bezt->vec[0][0], NLATIME_CONVERT_MAP); bezt->vec[1][0] = nlastrip_get_frame(strip, bezt->vec[1][0], NLATIME_CONVERT_MAP); bezt->vec[2][0] = nlastrip_get_frame(strip, bezt->vec[2][0], NLATIME_CONVERT_MAP); - + /* nothing to return or else we exit */ return 0; } @@ -1948,61 +1948,61 @@ static int nlaedit_apply_scale_exec(bContext *C, wmOperator *UNUSED(op)) { Main *bmain = CTX_data_main(C); bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + KeyframeEditData ked = {{NULL}}; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get a list of the editable tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* for each NLA-Track, apply scale of all selected strips */ for (ale = anim_data.first; ale; ale = ale->next) { NlaTrack *nlt = (NlaTrack *)ale->data; NlaStrip *strip; - + for (strip = nlt->strips.first; strip; strip = strip->next) { /* strip must be selected, and must be action-clip only (transitions don't have scale) */ if ((strip->flag & NLASTRIP_FLAG_SELECT) && (strip->type == NLASTRIP_TYPE_CLIP)) { /* if the referenced action is used by other strips, make this strip use its own copy */ - if (strip->act == NULL) + if (strip->act == NULL) continue; if (strip->act->id.us > 1) { /* make a copy of the Action to work on */ bAction *act = BKE_action_copy(bmain, strip->act); - + /* set this as the new referenced action, decrementing the users of the old one */ id_us_min(&strip->act->id); strip->act = act; } - + /* setup iterator, and iterate over all the keyframes in the action, applying this scaling */ ked.data = strip; ANIM_animchanneldata_keyframes_loop(&ked, ac.ads, strip->act, ALE_ACT, NULL, bezt_apply_nlamapping, calchandles_fcurve); - + /* clear scale of strip now that it has been applied, * and recalculate the extents of the action now that it has been scaled - * but leave everything else alone + * but leave everything else alone */ strip->scale = 1.0f; calc_action_range(strip->act, &strip->actstart, &strip->actend, 0); } } } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -2013,11 +2013,11 @@ void NLA_OT_apply_scale(wmOperatorType *ot) ot->name = "Apply Scale"; ot->idname = "NLA_OT_apply_scale"; ot->description = "Apply scaling of selected strips to their referenced Actions"; - + /* api callbacks */ ot->exec = nlaedit_apply_scale_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -2028,44 +2028,44 @@ void NLA_OT_apply_scale(wmOperatorType *ot) static int nlaedit_clear_scale_exec(bContext *C, wmOperator *UNUSED(op)) { bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get a list of the editable tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* for each NLA-Track, reset scale of all selected strips */ for (ale = anim_data.first; ale; ale = ale->next) { NlaTrack *nlt = (NlaTrack *)ale->data; NlaStrip *strip; - + for (strip = nlt->strips.first; strip; strip = strip->next) { /* strip must be selected, and must be action-clip only (transitions don't have scale) */ if ((strip->flag & NLASTRIP_FLAG_SELECT) && (strip->type == NLASTRIP_TYPE_CLIP)) { PointerRNA strip_ptr; - + RNA_pointer_create(NULL, &RNA_NlaStrip, strip, &strip_ptr); RNA_float_set(&strip_ptr, "scale", 1.0f); } } } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - + /* refresh auto strip properties */ ED_nla_postop_refresh(&ac); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -2076,11 +2076,11 @@ void NLA_OT_clear_scale(wmOperatorType *ot) ot->name = "Clear Scale"; ot->idname = "NLA_OT_clear_scale"; ot->description = "Reset scaling of selected strips"; - + /* api callbacks */ ot->exec = nlaedit_clear_scale_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } @@ -2100,27 +2100,27 @@ static const EnumPropertyItem prop_nlaedit_snap_types[] = { static int nlaedit_snap_exec(bContext *C, wmOperator *op) { bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + Scene *scene; int mode = RNA_enum_get(op->ptr, "type"); float secf; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get a list of the editable tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* get some necessary vars */ scene = ac.scene; secf = (float)FPS; - + /* since we may add tracks, perform this in reverse order */ for (ale = anim_data.last; ale; ale = ale->prev) { ListBase tmp_strips = {NULL, NULL}; @@ -2128,23 +2128,23 @@ static int nlaedit_snap_exec(bContext *C, wmOperator *op) NlaTrack *nlt = (NlaTrack *)ale->data; NlaStrip *strip, *stripn; NlaTrack *track; - + /* create meta-strips from the continuous chains of selected strips */ BKE_nlastrips_make_metas(&nlt->strips, 1); - + /* apply the snapping to all the temp meta-strips, then put them in a separate list to be added * back to the original only if they still fit */ for (strip = nlt->strips.first; strip; strip = stripn) { stripn = strip->next; - + if (strip->flag & NLASTRIP_FLAG_TEMP_META) { float start, end; - + /* get the existing end-points */ start = strip->start; end = strip->end; - + /* calculate new start position based on snapping mode */ switch (mode) { case NLAEDIT_SNAP_CFRA: /* to current frame */ @@ -2163,54 +2163,54 @@ static int nlaedit_snap_exec(bContext *C, wmOperator *op) strip->start = start; break; } - + /* get new endpoint based on start-point (and old length) */ strip->end = strip->start + (end - start); - + /* apply transforms to meta-strip to its children */ BKE_nlameta_flush_transforms(strip); - + /* remove strip from track, and add to the temp buffer */ BLI_remlink(&nlt->strips, strip); BLI_addtail(&tmp_strips, strip); } } - + /* try adding each meta-strip back to the track one at a time, to make sure they'll fit */ for (strip = tmp_strips.first; strip; strip = stripn) { stripn = strip->next; - + /* remove from temp-strips list */ BLI_remlink(&tmp_strips, strip); - + /* in case there's no space in the current track, try adding */ if (BKE_nlatrack_add_strip(nlt, strip) == 0) { /* need to add a new track above the current one */ track = BKE_nlatrack_add(adt, nlt); BKE_nlatrack_add_strip(track, strip); - + /* clear temp meta-strips on this new track, as we may not be able to get back to it */ BKE_nlastrips_clear_metas(&track->strips, 0, 1); } } - + /* remove the meta-strips now that we're done */ BKE_nlastrips_clear_metas(&nlt->strips, 0, 1); - + /* tag for recalculating the animation */ ale->update |= ANIM_UPDATE_DEPS; } - + /* cleanup */ ANIM_animdata_update(&ac, &anim_data); ANIM_animdata_freelist(&anim_data); - + /* refresh auto strip properties */ ED_nla_postop_refresh(&ac); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } @@ -2221,15 +2221,15 @@ void NLA_OT_snap(wmOperatorType *ot) ot->name = "Snap Strips"; ot->idname = "NLA_OT_snap"; ot->description = "Move start of strips to specified time"; - + /* api callbacks */ ot->invoke = WM_menu_invoke; ot->exec = nlaedit_snap_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ ot->prop = RNA_def_enum(ot->srna, "type", prop_nlaedit_snap_types, 0, "Type", ""); } @@ -2244,31 +2244,31 @@ static const EnumPropertyItem *nla_fmodifier_itemf(bContext *C, PointerRNA *UNUS EnumPropertyItem *item = NULL; int totitem = 0; int i = 0; - + if (C == NULL) { return rna_enum_fmodifier_type_items; } - + /* start from 1 to skip the 'Invalid' modifier type */ for (i = 1; i < FMODIFIER_NUM_TYPES; i++) { const FModifierTypeInfo *fmi = get_fmodifier_typeinfo(i); int index; - + /* check if modifier is valid for this context */ if (fmi == NULL) continue; if (i == FMODIFIER_TYPE_CYCLES) /* we already have repeat... */ continue; - + index = RNA_enum_from_value(rna_enum_fmodifier_type_items, fmi->type); if (index != -1) { /* Not all types are implemented yet... */ RNA_enum_item_add(&item, &totitem, &rna_enum_fmodifier_type_items[index]); } } - + RNA_enum_item_end(&item, &totitem); *r_free = true; - + return item; } @@ -2276,28 +2276,28 @@ static const EnumPropertyItem *nla_fmodifier_itemf(bContext *C, PointerRNA *UNUS static int nla_fmodifier_add_exec(bContext *C, wmOperator *op) { bAnimContext ac; - + ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + FModifier *fcm; int type = RNA_enum_get(op->ptr, "type"); const bool active_only = RNA_boolean_get(op->ptr, "only_active"); - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get a list of the editable tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* for each NLA-Track, add the specified modifier to all selected strips */ for (ale = anim_data.first; ale; ale = ale->next) { NlaTrack *nlt = (NlaTrack *)ale->data; NlaStrip *strip; - + for (strip = nlt->strips.first; strip; strip = strip->next) { /* can F-Modifier be added to the current strip? */ if (active_only) { @@ -2310,14 +2310,14 @@ static int nla_fmodifier_add_exec(bContext *C, wmOperator *op) if ((strip->flag & NLASTRIP_FLAG_SELECT) == 0) continue; } - + /* sound clips are not affected by FModifiers */ if (strip->type == NLASTRIP_TYPE_SOUND) continue; - + /* add F-Modifier of specified type to selected, and make it the active one */ fcm = add_fmodifier(&strip->modifiers, type, NULL); - + if (fcm) { set_active_fmodifier(&strip->modifiers, fcm); ale->update |= ANIM_UPDATE_DEPS; @@ -2329,37 +2329,37 @@ static int nla_fmodifier_add_exec(bContext *C, wmOperator *op) } } } - + /* free temp data */ ANIM_animdata_update(&ac, &anim_data); ANIM_animdata_freelist(&anim_data); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); - + /* done */ return OPERATOR_FINISHED; } - + void NLA_OT_fmodifier_add(wmOperatorType *ot) { /* identifiers */ ot->name = "Add F-Modifier"; ot->idname = "NLA_OT_fmodifier_add"; ot->description = "Add F-Modifier to the active/selected NLA-Strips"; - + /* api callbacks */ ot->invoke = WM_menu_invoke; ot->exec = nla_fmodifier_add_exec; - ot->poll = nlaop_poll_tweakmode_off; - + ot->poll = nlaop_poll_tweakmode_off; + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* id-props */ ot->prop = RNA_def_enum(ot->srna, "type", rna_enum_fmodifier_type_items, 0, "Type", ""); RNA_def_enum_funcs(ot->prop, nla_fmodifier_itemf); - + RNA_def_boolean(ot->srna, "only_active", true, "Only Active", "Only add a F-Modifier of the specified type to the active strip"); } @@ -2372,36 +2372,36 @@ static int nla_fmodifier_copy_exec(bContext *C, wmOperator *op) bAnimListElem *ale; int filter; bool ok = false; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* clear buffer first */ ANIM_fmodifiers_copybuf_free(); - + /* get a list of the editable tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* for each NLA-Track, add the specified modifier to all selected strips */ for (ale = anim_data.first; ale; ale = ale->next) { NlaTrack *nlt = (NlaTrack *)ale->data; NlaStrip *strip; - + for (strip = nlt->strips.first; strip; strip = strip->next) { /* only add F-Modifier if on active strip? */ if ((strip->flag & NLASTRIP_FLAG_ACTIVE) == 0) continue; - + // TODO: when 'active' vs 'all' boolean is added, change last param! ok |= ANIM_fmodifiers_copy_to_buf(&strip->modifiers, 0); } } - + /* free temp data */ ANIM_animdata_freelist(&anim_data); - + /* successful or not? */ if (ok == 0) { BKE_report(op->reports, RPT_ERROR, "No F-Modifiers available to be copied"); @@ -2412,21 +2412,21 @@ static int nla_fmodifier_copy_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } } - + void NLA_OT_fmodifier_copy(wmOperatorType *ot) { /* identifiers */ ot->name = "Copy F-Modifiers"; ot->idname = "NLA_OT_fmodifier_copy"; ot->description = "Copy the F-Modifier(s) of the active NLA-Strip"; - + /* api callbacks */ ot->exec = nla_fmodifier_copy_exec; - ot->poll = nlaop_poll_tweakmode_off; - + ot->poll = nlaop_poll_tweakmode_off; + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* id-props */ //ot->prop = RNA_def_boolean(ot->srna, "all", 1, "All F-Modifiers", "Copy all the F-Modifiers, instead of just the active one"); } @@ -2439,23 +2439,23 @@ static int nla_fmodifier_paste_exec(bContext *C, wmOperator *op) ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter, ok = 0; - + const bool active_only = RNA_boolean_get(op->ptr, "only_active"); const bool replace = RNA_boolean_get(op->ptr, "replace"); - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get a list of the editable tracks being shown in the NLA */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_FOREDIT | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(&ac, &anim_data, filter, ac.data, ac.datatype); - + /* for each NLA-Track, add the specified modifier to all selected strips */ for (ale = anim_data.first; ale; ale = ale->next) { NlaTrack *nlt = (NlaTrack *)ale->data; NlaStrip *strip; - + for (strip = nlt->strips.first; strip; strip = strip->next) { /* can F-Modifier be added to the current strip? */ if (active_only) { @@ -2468,17 +2468,17 @@ static int nla_fmodifier_paste_exec(bContext *C, wmOperator *op) if ((strip->flag & NLASTRIP_FLAG_SELECT) == 0) continue; } - + /* paste FModifiers from buffer */ ok += ANIM_fmodifiers_paste_from_buf(&strip->modifiers, replace, NULL); ale->update |= ANIM_UPDATE_DEPS; } } - + /* clean up */ ANIM_animdata_update(&ac, &anim_data); ANIM_animdata_freelist(&anim_data); - + /* successful or not? */ if (ok) { WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_EDITED, NULL); @@ -2489,24 +2489,24 @@ static int nla_fmodifier_paste_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } } - + void NLA_OT_fmodifier_paste(wmOperatorType *ot) { /* identifiers */ ot->name = "Paste F-Modifiers"; ot->idname = "NLA_OT_fmodifier_paste"; ot->description = "Add copied F-Modifiers to the selected NLA-Strips"; - + /* api callbacks */ ot->exec = nla_fmodifier_paste_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ RNA_def_boolean(ot->srna, "only_active", true, "Only Active", "Only paste F-Modifiers on active strip"); - RNA_def_boolean(ot->srna, "replace", false, "Replace Existing", + RNA_def_boolean(ot->srna, "replace", false, "Replace Existing", "Replace existing F-Modifiers, instead of just appending to the end of the existing list"); } diff --git a/source/blender/editors/space_nla/nla_ops.c b/source/blender/editors/space_nla/nla_ops.c index 921d2e9c088..0c087fa67b9 100644 --- a/source/blender/editors/space_nla/nla_ops.c +++ b/source/blender/editors/space_nla/nla_ops.c @@ -55,21 +55,21 @@ int nlaop_poll_tweakmode_off(bContext *C) { Scene *scene; - - /* for now, we check 2 things: + + /* for now, we check 2 things: * 1) active editor must be NLA - * 2) tweakmode is currently set as a 'per-scene' flag + * 2) tweakmode is currently set as a 'per-scene' flag * so that it will affect entire NLA data-sets, - * but not all AnimData blocks will be in tweakmode for + * but not all AnimData blocks will be in tweakmode for * various reasons */ if (ED_operator_nla_active(C) == 0) return 0; - + scene = CTX_data_scene(C); if ((scene == NULL) || (scene->flag & SCE_NLA_EDIT_ON)) return 0; - + return 1; } @@ -77,21 +77,21 @@ int nlaop_poll_tweakmode_off(bContext *C) int nlaop_poll_tweakmode_on(bContext *C) { Scene *scene; - - /* for now, we check 2 things: + + /* for now, we check 2 things: * 1) active editor must be NLA - * 2) tweakmode is currently set as a 'per-scene' flag + * 2) tweakmode is currently set as a 'per-scene' flag * so that it will affect entire NLA data-sets, - * but not all AnimData blocks will be in tweakmode for + * but not all AnimData blocks will be in tweakmode for * various reasons */ if (ED_operator_nla_active(C) == 0) return 0; - + scene = CTX_data_scene(C); if ((scene == NULL) || !(scene->flag & SCE_NLA_EDIT_ON)) return 0; - + return 1; } @@ -109,61 +109,61 @@ void nla_operatortypes(void) { /* view */ WM_operatortype_append(NLA_OT_properties); - + /* channels */ WM_operatortype_append(NLA_OT_channels_click); - + WM_operatortype_append(NLA_OT_action_pushdown); WM_operatortype_append(NLA_OT_action_unlink); - + WM_operatortype_append(NLA_OT_tracks_add); WM_operatortype_append(NLA_OT_tracks_delete); - + WM_operatortype_append(NLA_OT_selected_objects_add); - + /* select */ WM_operatortype_append(NLA_OT_click_select); WM_operatortype_append(NLA_OT_select_border); WM_operatortype_append(NLA_OT_select_all_toggle); WM_operatortype_append(NLA_OT_select_leftright); - + /* view */ WM_operatortype_append(NLA_OT_view_all); WM_operatortype_append(NLA_OT_view_selected); WM_operatortype_append(NLA_OT_view_frame); - + WM_operatortype_append(NLA_OT_previewrange_set); - + /* edit */ WM_operatortype_append(NLA_OT_tweakmode_enter); WM_operatortype_append(NLA_OT_tweakmode_exit); - + WM_operatortype_append(NLA_OT_actionclip_add); WM_operatortype_append(NLA_OT_transition_add); WM_operatortype_append(NLA_OT_soundclip_add); - + WM_operatortype_append(NLA_OT_meta_add); WM_operatortype_append(NLA_OT_meta_remove); - + WM_operatortype_append(NLA_OT_duplicate); WM_operatortype_append(NLA_OT_delete); WM_operatortype_append(NLA_OT_split); - + WM_operatortype_append(NLA_OT_mute_toggle); - + WM_operatortype_append(NLA_OT_swap); WM_operatortype_append(NLA_OT_move_up); WM_operatortype_append(NLA_OT_move_down); - + WM_operatortype_append(NLA_OT_action_sync_length); - + WM_operatortype_append(NLA_OT_make_single_user); - + WM_operatortype_append(NLA_OT_apply_scale); WM_operatortype_append(NLA_OT_clear_scale); - + WM_operatortype_append(NLA_OT_snap); - + WM_operatortype_append(NLA_OT_fmodifier_add); WM_operatortype_append(NLA_OT_fmodifier_copy); WM_operatortype_append(NLA_OT_fmodifier_paste); @@ -176,7 +176,7 @@ static void nla_keymap_channels(wmKeyMap *keymap) wmKeyMapItem *kmi; /* keymappings here are NLA-specific (different to standard channels keymap) */ - + /* selection --------------------------------------------------------------------- */ /* click-select */ // XXX for now, only leftmouse.... @@ -184,14 +184,14 @@ static void nla_keymap_channels(wmKeyMap *keymap) RNA_boolean_set(kmi->ptr, "extend", false); kmi = WM_keymap_add_item(keymap, "NLA_OT_channels_click", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "extend", true); - + /* channel operations ------------------------------------------------------------ */ /* add tracks */ kmi = WM_keymap_add_item(keymap, "NLA_OT_tracks_add", AKEY, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "above_selected", false); kmi = WM_keymap_add_item(keymap, "NLA_OT_tracks_add", AKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "above_selected", true); - + /* delete tracks */ WM_keymap_add_item(keymap, "NLA_OT_tracks_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "NLA_OT_tracks_delete", DELKEY, KM_PRESS, 0, 0); @@ -200,14 +200,14 @@ static void nla_keymap_channels(wmKeyMap *keymap) static void nla_keymap_main(wmKeyConfig *keyconf, wmKeyMap *keymap) { wmKeyMapItem *kmi; - + /* selection ------------------------------------------------ */ /* click select */ kmi = WM_keymap_add_item(keymap, "NLA_OT_click_select", SELECTMOUSE, KM_PRESS, 0, 0); RNA_boolean_set(kmi->ptr, "extend", false); kmi = WM_keymap_add_item(keymap, "NLA_OT_click_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "extend", true); - + /* select left/right */ kmi = WM_keymap_add_item(keymap, "NLA_OT_select_leftright", SELECTMOUSE, KM_PRESS, KM_CTRL, 0); RNA_boolean_set(kmi->ptr, "extend", false); @@ -215,92 +215,92 @@ static void nla_keymap_main(wmKeyConfig *keyconf, wmKeyMap *keymap) kmi = WM_keymap_add_item(keymap, "NLA_OT_select_leftright", SELECTMOUSE, KM_PRESS, KM_CTRL | KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "extend", true); RNA_enum_set(kmi->ptr, "mode", NLAEDIT_LRSEL_TEST); - + kmi = WM_keymap_add_item(keymap, "NLA_OT_select_leftright", LEFTBRACKETKEY, KM_PRESS, 0, 0); RNA_boolean_set(kmi->ptr, "extend", false); RNA_enum_set(kmi->ptr, "mode", NLAEDIT_LRSEL_LEFT); kmi = WM_keymap_add_item(keymap, "NLA_OT_select_leftright", RIGHTBRACKETKEY, KM_PRESS, 0, 0); RNA_boolean_set(kmi->ptr, "extend", false); RNA_enum_set(kmi->ptr, "mode", NLAEDIT_LRSEL_RIGHT); - - + + /* deselect all */ /* TODO: uniformize with other select_all ops? */ kmi = WM_keymap_add_item(keymap, "NLA_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); RNA_boolean_set(kmi->ptr, "invert", false); kmi = WM_keymap_add_item(keymap, "NLA_OT_select_all_toggle", IKEY, KM_PRESS, KM_CTRL, 0); RNA_boolean_set(kmi->ptr, "invert", true); - + /* borderselect */ kmi = WM_keymap_add_item(keymap, "NLA_OT_select_border", BKEY, KM_PRESS, 0, 0); RNA_boolean_set(kmi->ptr, "axis_range", false); kmi = WM_keymap_add_item(keymap, "NLA_OT_select_border", BKEY, KM_PRESS, KM_ALT, 0); RNA_boolean_set(kmi->ptr, "axis_range", true); - + /* view ---------------------------------------------------- */ /* auto-set range */ WM_keymap_add_item(keymap, "NLA_OT_previewrange_set", PKEY, KM_PRESS, KM_CTRL | KM_ALT, 0); - + WM_keymap_add_item(keymap, "NLA_OT_view_all", HOMEKEY, KM_PRESS, 0, 0); #ifdef WITH_INPUT_NDOF WM_keymap_add_item(keymap, "NLA_OT_view_all", NDOF_BUTTON_FIT, KM_PRESS, 0, 0); #endif WM_keymap_add_item(keymap, "NLA_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "NLA_OT_view_frame", PAD0, KM_PRESS, 0, 0); - + /* editing ------------------------------------------------ */ - + /* add strips */ WM_keymap_add_item(keymap, "NLA_OT_actionclip_add", AKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "NLA_OT_transition_add", TKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "NLA_OT_soundclip_add", KKEY, KM_PRESS, KM_SHIFT, 0); - + /* meta-strips */ WM_keymap_add_item(keymap, "NLA_OT_meta_add", GKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "NLA_OT_meta_remove", GKEY, KM_PRESS, KM_ALT, 0); - + /* duplicate */ kmi = WM_keymap_add_item(keymap, "NLA_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "linked", false); - + kmi = WM_keymap_add_item(keymap, "NLA_OT_duplicate", DKEY, KM_PRESS, KM_ALT, 0); RNA_boolean_set(kmi->ptr, "linked", true); - + /* single user */ WM_keymap_add_item(keymap, "NLA_OT_make_single_user", UKEY, KM_PRESS, 0, 0); - + /* delete */ WM_keymap_add_item(keymap, "NLA_OT_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "NLA_OT_delete", DELKEY, KM_PRESS, 0, 0); /* split */ WM_keymap_add_item(keymap, "NLA_OT_split", YKEY, KM_PRESS, 0, 0); - + /* toggles */ WM_keymap_add_item(keymap, "NLA_OT_mute_toggle", HKEY, KM_PRESS, 0, 0); - + /* swap */ WM_keymap_add_item(keymap, "NLA_OT_swap", FKEY, KM_PRESS, KM_ALT, 0); - + /* move up */ WM_keymap_add_item(keymap, "NLA_OT_move_up", PAGEUPKEY, KM_PRESS, 0, 0); /* move down */ WM_keymap_add_item(keymap, "NLA_OT_move_down", PAGEDOWNKEY, KM_PRESS, 0, 0); - + /* apply scale */ WM_keymap_add_item(keymap, "NLA_OT_apply_scale", AKEY, KM_PRESS, KM_CTRL, 0); /* clear scale */ WM_keymap_add_item(keymap, "NLA_OT_clear_scale", SKEY, KM_PRESS, KM_ALT, 0); - + /* snap */ WM_keymap_add_item(keymap, "NLA_OT_snap", SKEY, KM_PRESS, KM_SHIFT, 0); - + /* add f-modifier */ WM_keymap_add_item(keymap, "NLA_OT_fmodifier_add", MKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0); - + /* transform system */ transform_keymap_for_space(keyconf, keymap, SPACE_NLA); - + /* special markers hotkeys for anim editors: see note in definition of this function */ ED_marker_keymap_animedit_conflictfree(keymap); } @@ -311,35 +311,35 @@ void nla_keymap(wmKeyConfig *keyconf) { wmKeyMap *keymap; wmKeyMapItem *kmi; - + /* keymap for all regions ------------------------------------------- */ keymap = WM_keymap_find(keyconf, "NLA Generic", SPACE_NLA, 0); - + /* region management */ WM_keymap_add_item(keymap, "NLA_OT_properties", NKEY, KM_PRESS, 0, 0); - + /* tweakmode * - enter and exit are separate operators with the same hotkey... * This works as they use different poll()'s */ WM_keymap_add_item(keymap, "NLA_OT_tweakmode_enter", TABKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "NLA_OT_tweakmode_exit", TABKEY, KM_PRESS, 0, 0); - + /* tweakmode for stashed actions * - similar to normal tweakmode, except we mark the tracks as being "solo" * too so that the action can be edited in isolation */ kmi = WM_keymap_add_item(keymap, "NLA_OT_tweakmode_enter", TABKEY, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "isolate_action", true); - + kmi = WM_keymap_add_item(keymap, "NLA_OT_tweakmode_exit", TABKEY, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "isolate_action", true); - + /* find (i.e. a shortcut for setting the name filter) */ WM_keymap_add_item(keymap, "ANIM_OT_channels_find", FKEY, KM_PRESS, KM_CTRL, 0); - + /* channels ---------------------------------------------------------- */ - /* Channels are not directly handled by the NLA Editor module, but are inherited from the Animation module. + /* Channels are not directly handled by the NLA Editor module, but are inherited from the Animation module. * Most of the relevant operations, keymaps, drawing, etc. can therefore all be found in that module instead, as there * are many similarities with the other Animation Editors. * @@ -347,7 +347,7 @@ void nla_keymap(wmKeyConfig *keyconf) */ keymap = WM_keymap_find(keyconf, "NLA Channels", SPACE_NLA, 0); nla_keymap_channels(keymap); - + /* data ------------------------------------------------------------- */ keymap = WM_keymap_find(keyconf, "NLA Editor", SPACE_NLA, 0); nla_keymap_main(keyconf, keymap); diff --git a/source/blender/editors/space_nla/nla_select.c b/source/blender/editors/space_nla/nla_select.c index 2057fe5c022..8c9372f0612 100644 --- a/source/blender/editors/space_nla/nla_select.c +++ b/source/blender/editors/space_nla/nla_select.c @@ -89,7 +89,7 @@ enum { DESELECT_STRIPS_TEST, DESELECT_STRIPS_CLEARACTIVE, } /*eDeselectNlaStrips*/; - + /* Deselects strips in the NLA Editor * - This is called by the deselect all operator, as well as other ones! * @@ -105,20 +105,20 @@ static void deselect_nla_strips(bAnimContext *ac, short test, short sel) bAnimListElem *ale; int filter; short smode; - + /* determine type-based settings */ // FIXME: double check whether ANIMFILTER_LIST_VISIBLE is needed! filter = (ANIMFILTER_DATA_VISIBLE); - + /* filter data */ ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); - + /* See if we should be selecting or deselecting */ if (test == DESELECT_STRIPS_TEST) { for (ale = anim_data.first; ale; ale = ale->next) { NlaTrack *nlt = (NlaTrack *)ale->data; NlaStrip *strip; - + /* if any strip is selected, break out, since we should now be deselecting */ for (strip = nlt->strips.first; strip; strip = strip->next) { if (strip->flag & NLASTRIP_FLAG_SELECT) { @@ -126,32 +126,32 @@ static void deselect_nla_strips(bAnimContext *ac, short test, short sel) break; } } - + if (sel == SELECT_SUBTRACT) break; } } - + /* convert selection modes to selection modes */ smode = selmodes_to_flagmodes(sel); - + /* Now set the flags */ for (ale = anim_data.first; ale; ale = ale->next) { NlaTrack *nlt = (NlaTrack *)ale->data; NlaStrip *strip; - + /* apply same selection to all strips */ for (strip = nlt->strips.first; strip; strip = strip->next) { /* set selection */ if (test != DESELECT_STRIPS_CLEARACTIVE) ACHANNEL_SET_FLAG(strip, smode, NLASTRIP_FLAG_SELECT); - + /* clear active flag */ // TODO: for clear active, do we want to limit this to only doing this on a certain set of tracks though? strip->flag &= ~NLASTRIP_FLAG_ACTIVE; } } - + /* Cleanup */ ANIM_animdata_freelist(&anim_data); } @@ -161,37 +161,37 @@ static void deselect_nla_strips(bAnimContext *ac, short test, short sel) static int nlaedit_deselectall_exec(bContext *C, wmOperator *op) { bAnimContext ac; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* 'standard' behavior - check if selected, then apply relevant selection */ if (RNA_boolean_get(op->ptr, "invert")) deselect_nla_strips(&ac, DESELECT_STRIPS_NOTEST, SELECT_INVERT); else deselect_nla_strips(&ac, DESELECT_STRIPS_TEST, SELECT_ADD); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_SELECTED, NULL); - + return OPERATOR_FINISHED; } - + void NLA_OT_select_all_toggle(wmOperatorType *ot) { /* identifiers */ ot->name = "(De)select All"; ot->idname = "NLA_OT_select_all_toggle"; ot->description = "Select or deselect all NLA-Strips"; - + /* api callbacks */ ot->exec = nlaedit_deselectall_exec; ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER /*|OPTYPE_UNDO*/; - + /* props */ ot->prop = RNA_def_boolean(ot->srna, "invert", 0, "Invert", ""); RNA_def_property_flag(ot->prop, PROP_SKIP_SAVE); @@ -218,27 +218,27 @@ static void borderselect_nla_strips(bAnimContext *ac, rcti rect, short mode, sho ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + SpaceNla *snla = (SpaceNla *)ac->sl; View2D *v2d = &ac->ar->v2d; rctf rectf; float ymin /* =(float)(-NLACHANNEL_HEIGHT(snla)) */ /* UNUSED */, ymax = 0; - + /* convert border-region to view coordinates */ UI_view2d_region_to_view(v2d, rect.xmin, rect.ymin + 2, &rectf.xmin, &rectf.ymin); UI_view2d_region_to_view(v2d, rect.xmax, rect.ymax - 2, &rectf.xmax, &rectf.ymax); - + /* filter data */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_LIST_CHANNELS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); - + /* convert selection modes to selection modes */ selectmode = selmodes_to_flagmodes(selectmode); - + /* loop over data, doing border select */ for (ale = anim_data.first; ale; ale = ale->next) { ymin = ymax - NLACHANNEL_STEP(snla); - + /* perform vertical suitability check (if applicable) */ if ((mode == NLA_BORDERSEL_FRAMERANGE) || !((ymax < rectf.ymin) || (ymin > rectf.ymax))) @@ -247,7 +247,7 @@ static void borderselect_nla_strips(bAnimContext *ac, rcti rect, short mode, sho if (ale->type == ANIMTYPE_NLATRACK) { NlaTrack *nlt = (NlaTrack *)ale->data; NlaStrip *strip; - + /* only select strips if they fall within the required ranges (if applicable) */ for (strip = nlt->strips.first; strip; strip = strip->next) { if ((mode == NLA_BORDERSEL_CHANNELS) || @@ -255,18 +255,18 @@ static void borderselect_nla_strips(bAnimContext *ac, rcti rect, short mode, sho { /* set selection */ ACHANNEL_SET_FLAG(strip, selectmode, NLASTRIP_FLAG_SELECT); - + /* clear active flag */ strip->flag &= ~NLASTRIP_FLAG_ACTIVE; } } } } - + /* set minimum extent to be the maximum of the next channel */ ymax = ymin; } - + /* cleanup */ ANIM_animdata_freelist(&anim_data); } @@ -280,7 +280,7 @@ static int nlaedit_borderselect_exec(bContext *C, wmOperator *op) short mode = 0, selectmode = 0; const bool select = !RNA_boolean_get(op->ptr, "deselect"); const bool extend = RNA_boolean_get(op->ptr, "extend"); - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; @@ -302,7 +302,7 @@ static int nlaedit_borderselect_exec(bContext *C, wmOperator *op) /* selection 'mode' depends on whether borderselect region only matters on one axis */ if (RNA_boolean_get(op->ptr, "axis_range")) { - /* mode depends on which axis of the range is larger to determine which axis to use + /* mode depends on which axis of the range is larger to determine which axis to use * - checking this in region-space is fine, as it's fundamentally still going to be a different rect size * - the frame-range select option is favored over the channel one (x over y), as frame-range one is often * used for tweaking timing when "blocking", while channels is not that useful... @@ -312,17 +312,17 @@ static int nlaedit_borderselect_exec(bContext *C, wmOperator *op) else mode = NLA_BORDERSEL_CHANNELS; } - else + else mode = NLA_BORDERSEL_ALLSTRIPS; - + /* apply borderselect action */ borderselect_nla_strips(&ac, rect, mode, selectmode); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_SELECTED, NULL); - + return OPERATOR_FINISHED; -} +} void NLA_OT_select_border(wmOperatorType *ot) { @@ -330,21 +330,21 @@ void NLA_OT_select_border(wmOperatorType *ot) ot->name = "Border Select"; ot->idname = "NLA_OT_select_border"; ot->description = "Use box selection to grab NLA-Strips"; - + /* api callbacks */ ot->invoke = WM_gesture_border_invoke; ot->exec = nlaedit_borderselect_exec; ot->modal = WM_gesture_border_modal; ot->cancel = WM_gesture_border_cancel; - + ot->poll = nlaop_poll_tweakmode_off; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* rna */ WM_operator_properties_gesture_border_select(ot); - + RNA_def_boolean(ot->srna, "axis_range", 0, "Axis Range", ""); } @@ -366,24 +366,24 @@ static void nlaedit_select_leftright(bContext *C, bAnimContext *ac, short leftri ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; - + Scene *scene = ac->scene; float xmin, xmax; - + /* if currently in tweakmode, exit tweakmode first */ if (scene->flag & SCE_NLA_EDIT_ON) WM_operator_name_call(C, "NLA_OT_tweakmode_exit", WM_OP_EXEC_DEFAULT, NULL); - + /* if select mode is replace, deselect all keyframes (and channels) first */ if (select_mode == SELECT_REPLACE) { select_mode = SELECT_ADD; - + /* - deselect all other keyframes, so that just the newly selected remain * - channels aren't deselected, since we don't re-select any as a consequence */ deselect_nla_strips(ac, 0, SELECT_SUBTRACT); } - + /* get range, and get the right flag-setting mode */ if (leftright == NLAEDIT_LRSEL_LEFT) { xmin = MINAFRAMEF; @@ -393,19 +393,19 @@ static void nlaedit_select_leftright(bContext *C, bAnimContext *ac, short leftri xmin = (float)(CFRA - 0.1f); xmax = MAXFRAMEF; } - + select_mode = selmodes_to_flagmodes(select_mode); - - + + /* filter data */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); - + /* select strips on the side where most data occurs */ for (ale = anim_data.first; ale; ale = ale->next) { NlaTrack *nlt = (NlaTrack *)ale->data; NlaStrip *strip; - + /* check each strip to see if it is appropriate */ for (strip = nlt->strips.first; strip; strip = strip->next) { if (BKE_nlastrip_within_bounds(strip, xmin, xmax)) { @@ -413,7 +413,7 @@ static void nlaedit_select_leftright(bContext *C, bAnimContext *ac, short leftri } } } - + /* Cleanup */ ANIM_animdata_freelist(&anim_data); } @@ -425,28 +425,28 @@ static int nlaedit_select_leftright_exec(bContext *C, wmOperator *op) bAnimContext ac; short leftright = RNA_enum_get(op->ptr, "mode"); short selectmode; - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* select mode is either replace (deselect all, then add) or add/extend */ if (RNA_boolean_get(op->ptr, "extend")) selectmode = SELECT_INVERT; else selectmode = SELECT_REPLACE; - + /* if "test" mode is set, we don't have any info to set this with */ if (leftright == NLAEDIT_LRSEL_TEST) return OPERATOR_CANCELLED; - + /* do the selecting now */ nlaedit_select_leftright(C, &ac, leftright, selectmode); - + /* set notifier that keyframe selection (and channels too) have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_SELECTED, NULL); WM_event_add_notifier(C, NC_ANIMATION | ND_ANIMCHAN | NA_SELECTED, NULL); - + return OPERATOR_FINISHED; } @@ -454,18 +454,18 @@ static int nlaedit_select_leftright_invoke(bContext *C, wmOperator *op, const wm { bAnimContext ac; short leftright = RNA_enum_get(op->ptr, "mode"); - + /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* handle mode-based testing */ if (leftright == NLAEDIT_LRSEL_TEST) { Scene *scene = ac.scene; ARegion *ar = ac.ar; View2D *v2d = &ar->v2d; float x; - + /* determine which side of the current frame mouse is on */ x = UI_view2d_region_to_view_x(v2d, event->mval[0]); if (x < CFRA) @@ -473,7 +473,7 @@ static int nlaedit_select_leftright_invoke(bContext *C, wmOperator *op, const wm else RNA_enum_set(op->ptr, "mode", NLAEDIT_LRSEL_RIGHT); } - + /* perform selection */ return nlaedit_select_leftright_exec(C, op); } @@ -481,24 +481,24 @@ static int nlaedit_select_leftright_invoke(bContext *C, wmOperator *op, const wm void NLA_OT_select_leftright(wmOperatorType *ot) { PropertyRNA *prop; - + /* identifiers */ ot->name = "Select Left/Right"; ot->idname = "NLA_OT_select_leftright"; ot->description = "Select strips to the left or the right of the current frame"; - + /* api callbacks */ ot->invoke = nlaedit_select_leftright_invoke; ot->exec = nlaedit_select_leftright_exec; ot->poll = ED_operator_nla_active; - + /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; - + /* properties */ ot->prop = RNA_def_enum(ot->srna, "mode", prop_nlaedit_leftright_select_types, NLAEDIT_LRSEL_TEST, "Mode", ""); RNA_def_property_flag(ot->prop, PROP_SKIP_SAVE); - + prop = RNA_def_boolean(ot->srna, "extend", 0, "Extend Select", ""); RNA_def_property_flag(prop, PROP_SKIP_SAVE); } @@ -512,7 +512,7 @@ static void mouse_nla_strips(bContext *C, bAnimContext *ac, const int mval[2], s ListBase anim_data = {NULL, NULL}; bAnimListElem *ale = NULL; int filter; - + SpaceNla *snla = (SpaceNla *)ac->sl; View2D *v2d = &ac->ar->v2d; Scene *scene = ac->scene; @@ -520,22 +520,22 @@ static void mouse_nla_strips(bContext *C, bAnimContext *ac, const int mval[2], s int channel_index; float xmin, xmax; float x, y; - - + + /* use View2D to determine the index of the channel (i.e a row in the list) where keyframe was */ UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y); UI_view2d_listview_view_to_cell(v2d, 0, NLACHANNEL_STEP(snla), 0, (float)NLACHANNEL_HEIGHT_HALF(snla), x, y, NULL, &channel_index); - - /* x-range to check is +/- 7 (in screen/region-space) on either side of mouse click - * (that is the size of keyframe icons, so user should be expecting similar tolerances) + + /* x-range to check is +/- 7 (in screen/region-space) on either side of mouse click + * (that is the size of keyframe icons, so user should be expecting similar tolerances) */ xmin = UI_view2d_region_to_view_x(v2d, mval[0] - 7); xmax = UI_view2d_region_to_view_x(v2d, mval[0] + 7); - + /* filter data */ filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_LIST_CHANNELS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); - + /* try to get channel */ ale = BLI_findlink(&anim_data, channel_index); if (ale == NULL) { @@ -548,65 +548,65 @@ static void mouse_nla_strips(bContext *C, bAnimContext *ac, const int mval[2], s /* found some channel - we only really should do somethign when its an Nla-Track */ if (ale->type == ANIMTYPE_NLATRACK) { NlaTrack *nlt = (NlaTrack *)ale->data; - + /* loop over NLA-strips in this track, trying to find one which occurs in the necessary bounds */ for (strip = nlt->strips.first; strip; strip = strip->next) { if (BKE_nlastrip_within_bounds(strip, xmin, xmax)) break; } } - + /* remove active channel from list of channels for separate treatment (since it's needed later on) */ BLI_remlink(&anim_data, ale); - + /* free list of channels, since it's not used anymore */ ANIM_animdata_freelist(&anim_data); } - + /* if currently in tweakmode, exit tweakmode before changing selection states * now that we've found our target... */ if (scene->flag & SCE_NLA_EDIT_ON) WM_operator_name_call(C, "NLA_OT_tweakmode_exit", WM_OP_EXEC_DEFAULT, NULL); - + /* for replacing selection, firstly need to clear existing selection */ if (select_mode == SELECT_REPLACE) { /* reset selection mode for next steps */ select_mode = SELECT_ADD; - + /* deselect all strips */ deselect_nla_strips(ac, 0, SELECT_SUBTRACT); - + /* deselect all other channels first */ ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR); } - + /* only select strip if we clicked on a valid channel and hit something */ if (ale) { /* select the strip accordingly (if a matching one was found) */ if (strip) { select_mode = selmodes_to_flagmodes(select_mode); ACHANNEL_SET_FLAG(strip, select_mode, NLASTRIP_FLAG_SELECT); - + /* if we selected it, we can make it active too - * - we always need to clear the active strip flag though... + * - we always need to clear the active strip flag though... * - as well as selecting its track... */ deselect_nla_strips(ac, DESELECT_STRIPS_CLEARACTIVE, 0); - + if (strip->flag & NLASTRIP_FLAG_SELECT) { strip->flag |= NLASTRIP_FLAG_ACTIVE; - + /* Highlight NLA-Track */ if (ale->type == ANIMTYPE_NLATRACK) { NlaTrack *nlt = (NlaTrack *)ale->data; - + nlt->flag |= NLATRACK_SELECTED; ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, nlt, ANIMTYPE_NLATRACK); } } } - + /* free this channel */ MEM_freeN(ale); } @@ -626,7 +626,7 @@ static int nlaedit_clickselect_invoke(bContext *C, wmOperator *op, const wmEvent /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + /* get useful pointers from animation context data */ /* scene= ac.scene; */ /* UNUSED */ /* ar= ac.ar; */ /* UNUSED */ @@ -637,33 +637,33 @@ static int nlaedit_clickselect_invoke(bContext *C, wmOperator *op, const wmEvent selectmode = SELECT_INVERT; else selectmode = SELECT_REPLACE; - + /* select strips based upon mouse position */ mouse_nla_strips(C, &ac, event->mval, selectmode); - + /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION | ND_NLA | NA_SELECTED, NULL); - + /* for tweak grab to work */ return OPERATOR_FINISHED | OPERATOR_PASS_THROUGH; } - + void NLA_OT_click_select(wmOperatorType *ot) { PropertyRNA *prop; - + /* identifiers */ ot->name = "Mouse Select"; ot->idname = "NLA_OT_click_select"; ot->description = "Handle clicks to select NLA Strips"; - + /* api callbacks - absolutely no exec() this yet... */ ot->invoke = nlaedit_clickselect_invoke; ot->poll = ED_operator_nla_active; - + /* flags */ ot->flag = OPTYPE_UNDO; - + /* properties */ prop = RNA_def_boolean(ot->srna, "extend", 0, "Extend Select", ""); // SHIFTKEY RNA_def_property_flag(prop, PROP_SKIP_SAVE); diff --git a/source/blender/editors/space_nla/space_nla.c b/source/blender/editors/space_nla/space_nla.c index 2df8643f850..88ef4a18142 100644 --- a/source/blender/editors/space_nla/space_nla.c +++ b/source/blender/editors/space_nla/space_nla.c @@ -75,15 +75,15 @@ ARegion *nla_has_buttons_region(ScrArea *sa) /* is error! */ if (ar == NULL) return NULL; - + arnew = MEM_callocN(sizeof(ARegion), "buttons for nla"); - + BLI_insertlinkafter(&sa->regionbase, ar, arnew); arnew->regiontype = RGN_TYPE_UI; arnew->alignment = RGN_ALIGN_RIGHT; - + arnew->flag = RGN_FLAG_HIDDEN; - + return arnew; } @@ -97,58 +97,58 @@ static SpaceLink *nla_new(const bContext *C) ScrArea *sa = CTX_wm_area(C); ARegion *ar; SpaceNla *snla; - + snla = MEM_callocN(sizeof(SpaceNla), "initnla"); snla->spacetype = SPACE_NLA; - + /* allocate DopeSheet data for NLA Editor */ snla->ads = MEM_callocN(sizeof(bDopeSheet), "NlaEdit DopeSheet"); snla->ads->source = (ID *)scene; - + /* set auto-snapping settings */ snla->autosnap = SACTSNAP_FRAME; - + /* header */ ar = MEM_callocN(sizeof(ARegion), "header for nla"); - + BLI_addtail(&snla->regionbase, ar); ar->regiontype = RGN_TYPE_HEADER; ar->alignment = RGN_ALIGN_BOTTOM; - + /* channel list region */ ar = MEM_callocN(sizeof(ARegion), "channel list for nla"); BLI_addtail(&snla->regionbase, ar); ar->regiontype = RGN_TYPE_CHANNELS; ar->alignment = RGN_ALIGN_LEFT; - + /* only need to set these settings since this will use the 'stack' configuration */ ar->v2d.scroll = V2D_SCROLL_BOTTOM; ar->v2d.flag = V2D_VIEWSYNC_AREA_VERTICAL; - + /* ui buttons */ ar = MEM_callocN(sizeof(ARegion), "buttons region for nla"); - + BLI_addtail(&snla->regionbase, ar); ar->regiontype = RGN_TYPE_UI; ar->alignment = RGN_ALIGN_RIGHT; ar->flag = RGN_FLAG_HIDDEN; - + /* main region */ ar = MEM_callocN(sizeof(ARegion), "main region for nla"); - + BLI_addtail(&snla->regionbase, ar); ar->regiontype = RGN_TYPE_WINDOW; - + ar->v2d.tot.xmin = (float)(SFRA - 10); ar->v2d.tot.ymin = (float)(-sa->winy) / 3.0f; ar->v2d.tot.xmax = (float)(EFRA + 10); ar->v2d.tot.ymax = 0.0f; - + ar->v2d.cur = ar->v2d.tot; - + ar->v2d.min[0] = 0.0f; ar->v2d.min[1] = 0.0f; - + ar->v2d.max[0] = MAXFRAMEF; ar->v2d.max[1] = 10000.0f; @@ -160,15 +160,15 @@ static SpaceLink *nla_new(const bContext *C) ar->v2d.keepofs = V2D_KEEPOFS_Y; ar->v2d.align = V2D_ALIGN_NO_POS_Y; ar->v2d.flag = V2D_VIEWSYNC_AREA_VERTICAL; - + return (SpaceLink *)snla; } /* not spacelink itself */ static void nla_free(SpaceLink *sl) -{ +{ SpaceNla *snla = (SpaceNla *) sl; - + if (snla->ads) { BLI_freelistN(&snla->ads->chanbase); MEM_freeN(snla->ads); @@ -180,7 +180,7 @@ static void nla_free(SpaceLink *sl) static void nla_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa) { SpaceNla *snla = (SpaceNla *)sa->spacedata.first; - + /* init dopesheet data if non-existent (i.e. for old files) */ if (snla->ads == NULL) { snla->ads = MEM_callocN(sizeof(bDopeSheet), "NlaEdit DopeSheet"); @@ -193,10 +193,10 @@ static void nla_init(struct wmWindowManager *UNUSED(wm), ScrArea *sa) static SpaceLink *nla_duplicate(SpaceLink *sl) { SpaceNla *snlan = MEM_dupallocN(sl); - + /* clear or remove stuff from old */ snlan->ads = MEM_dupallocN(snlan->ads); - + return (SpaceLink *)snlan; } @@ -204,12 +204,12 @@ static SpaceLink *nla_duplicate(SpaceLink *sl) static void nla_channel_region_init(wmWindowManager *wm, ARegion *ar) { wmKeyMap *keymap; - + /* ensure the 2d view sync works - main region has bottom scroller */ ar->v2d.scroll = V2D_SCROLL_BOTTOM; - + UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_LIST, ar->winx, ar->winy); - + /* own keymap */ /* own channels map first to override some channel keymaps */ keymap = WM_keymap_find(wm->defaultconf, "NLA Channels", SPACE_NLA, 0); @@ -217,7 +217,7 @@ static void nla_channel_region_init(wmWindowManager *wm, ARegion *ar) /* now generic channels map for everything else that can apply */ keymap = WM_keymap_find(wm->defaultconf, "Animation Channels", 0, 0); WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct); - + keymap = WM_keymap_find(wm->defaultconf, "NLA Generic", SPACE_NLA, 0); WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct); } @@ -228,21 +228,21 @@ static void nla_channel_region_draw(const bContext *C, ARegion *ar) bAnimContext ac; View2D *v2d = &ar->v2d; View2DScrollers *scrollers; - + /* clear and setup matrix */ UI_ThemeClearColor(TH_BACK); glClear(GL_COLOR_BUFFER_BIT); - + UI_view2d_view_ortho(v2d); - + /* data */ if (ANIM_animdata_get_context(C, &ac)) { draw_nla_channel_list(C, &ac, ar); } - + /* reset view matrix */ UI_view2d_view_restore(C); - + /* scrollers */ scrollers = UI_view2d_scrollers_calc(C, v2d, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY, V2D_ARG_DUMMY); UI_view2d_scrollers_draw(C, v2d, scrollers); @@ -254,9 +254,9 @@ static void nla_channel_region_draw(const bContext *C, ARegion *ar) static void nla_main_region_init(wmWindowManager *wm, ARegion *ar) { wmKeyMap *keymap; - + UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy); - + /* own keymap */ keymap = WM_keymap_find(wm->defaultconf, "NLA Editor", SPACE_NLA, 0); WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct); @@ -273,52 +273,52 @@ static void nla_main_region_draw(const bContext *C, ARegion *ar) View2DGrid *grid; View2DScrollers *scrollers; short unit = 0, flag = 0; - + /* clear and setup matrix */ UI_ThemeClearColor(TH_BACK); glClear(GL_COLOR_BUFFER_BIT); - + UI_view2d_view_ortho(v2d); - + /* time grid */ unit = (snla->flag & SNLA_DRAWTIME) ? V2D_UNIT_SECONDS : V2D_UNIT_FRAMES; grid = UI_view2d_grid_calc(CTX_data_scene(C), v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY, ar->winx, ar->winy); UI_view2d_grid_draw(v2d, grid, V2D_GRIDLINES_ALL); UI_view2d_grid_free(grid); - + ED_region_draw_cb_draw(C, ar, REGION_DRAW_PRE_VIEW); /* data */ if (ANIM_animdata_get_context(C, &ac)) { /* strips and backdrops */ draw_nla_main_data(&ac, snla, ar); - + /* text draw cached, in pixelspace now */ UI_view2d_text_cache_draw(ar); } - + UI_view2d_view_ortho(v2d); - + /* current frame */ if (snla->flag & SNLA_DRAWTIME) flag |= DRAWCFRA_UNIT_SECONDS; if ((snla->flag & SNLA_NODRAWCFRANUM) == 0) flag |= DRAWCFRA_SHOW_NUMBOX; ANIM_draw_cfra(C, v2d, flag); - + /* markers */ UI_view2d_view_orthoSpecial(ar, v2d, 1); ED_markers_draw(C, DRAW_MARKERS_MARGIN); - + /* preview range */ UI_view2d_view_ortho(v2d); ANIM_draw_previewrange(C, v2d, 0); - + /* callback */ UI_view2d_view_ortho(v2d); ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_VIEW); /* reset view matrix */ UI_view2d_view_restore(C); - + /* scrollers */ scrollers = UI_view2d_scrollers_calc(C, v2d, unit, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY); UI_view2d_scrollers_draw(C, v2d, scrollers); @@ -341,9 +341,9 @@ static void nla_header_region_draw(const bContext *C, ARegion *ar) static void nla_buttons_region_init(wmWindowManager *wm, ARegion *ar) { wmKeyMap *keymap; - + ED_region_panels_init(wm, ar); - + keymap = WM_keymap_find(wm->defaultconf, "NLA Generic", SPACE_NLA, 0); WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct); } @@ -505,7 +505,7 @@ static void nla_listener(bScreen *UNUSED(sc), ScrArea *sa, wmNotifier *wmn) static void nla_id_remap(ScrArea *UNUSED(sa), SpaceLink *slink, ID *old_id, ID *new_id) { SpaceNla *snla = (SpaceNla *)slink; - + if (snla->ads) { if ((ID *)snla->ads->filter_grp == old_id) { snla->ads->filter_grp = (Group *)new_id; @@ -521,10 +521,10 @@ void ED_spacetype_nla(void) { SpaceType *st = MEM_callocN(sizeof(SpaceType), "spacetype nla"); ARegionType *art; - + st->spaceid = SPACE_NLA; strncpy(st->name, "NLA", BKE_ST_MAXNAME); - + st->new = nla_new; st->free = nla_free; st->init = nla_init; @@ -543,30 +543,30 @@ void ED_spacetype_nla(void) art->keymapflag = ED_KEYMAP_VIEW2D | ED_KEYMAP_MARKERS | ED_KEYMAP_ANIMATION | ED_KEYMAP_FRAMES; BLI_addhead(&st->regiontypes, art); - + /* regions: header */ art = MEM_callocN(sizeof(ARegionType), "spacetype nla region"); art->regionid = RGN_TYPE_HEADER; art->prefsizey = HEADERY; art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_VIEW2D | ED_KEYMAP_FRAMES | ED_KEYMAP_HEADER; - + art->init = nla_header_region_init; art->draw = nla_header_region_draw; - + BLI_addhead(&st->regiontypes, art); - + /* regions: channels */ art = MEM_callocN(sizeof(ARegionType), "spacetype nla region"); art->regionid = RGN_TYPE_CHANNELS; art->prefsizex = 200; art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_VIEW2D | ED_KEYMAP_FRAMES; - + art->init = nla_channel_region_init; art->draw = nla_channel_region_draw; art->listener = nla_channel_region_listener; - + BLI_addhead(&st->regiontypes, art); - + /* regions: UI buttons */ art = MEM_callocN(sizeof(ARegionType), "spacetype nla region"); art->regionid = RGN_TYPE_UI; @@ -575,11 +575,11 @@ void ED_spacetype_nla(void) art->listener = nla_region_listener; art->init = nla_buttons_region_init; art->draw = nla_buttons_region_draw; - + BLI_addhead(&st->regiontypes, art); nla_buttons_register(art); - - + + BKE_spacetype_register(st); } |