diff options
author | Joshua Leung <aligorith@gmail.com> | 2009-04-08 16:35:38 +0400 |
---|---|---|
committer | Joshua Leung <aligorith@gmail.com> | 2009-04-08 16:35:38 +0400 |
commit | 4b2072bec302c9e0b38337eebd0ba9ad9933841a (patch) | |
tree | 9e111858ee0b9c099cd2f7c2d730366878a1d893 /source | |
parent | 0f4a07afb9b97e3c929caf9812cc78108a9937fd (diff) |
Animation Editors: Restored operators to expand and collapse channels
There are two operators: one for expanding channels and one for collapsing them. These operators each have a property, "All", which specifies if they should expand/collapse all channels regardless of selection.
TODO:
* A few of the sub-object channel types still needs to be supported by this.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/animation/anim_channels.c | 170 |
1 files changed, 141 insertions, 29 deletions
diff --git a/source/blender/editors/animation/anim_channels.c b/source/blender/editors/animation/anim_channels.c index ff9876bf715..dfe093641c1 100644 --- a/source/blender/editors/animation/anim_channels.c +++ b/source/blender/editors/animation/anim_channels.c @@ -695,6 +695,7 @@ enum { ACHANNEL_SETTING_PROTECT = 1, ACHANNEL_SETTING_MUTE, ACHANNEL_SETTING_VISIBLE, + ACHANNEL_SETTING_EXPAND, } eAnimChannel_Settings; /* defines for setting animation-channel flags */ @@ -718,27 +719,46 @@ EnumPropertyItem prop_animchannel_settings_types[] = { /* Set/clear a particular flag (setting) for all selected + visible channels * setting: the setting to modify * mode: eAnimChannels_SetFlag + * onlysel: only selected channels get the flag set */ -static void setflag_anim_channels (bAnimContext *ac, short setting, short mode) +static void setflag_anim_channels (bAnimContext *ac, short setting, short mode, short onlysel) { ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; int filter; /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CHANNELS | ANIMFILTER_SEL); + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CHANNELS); + if (onlysel) filter |= ANIMFILTER_SEL; ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); /* affect selected channels */ for (ale= anim_data.first; ale; ale= ale->next) { switch (ale->type) { + case ANIMTYPE_OBJECT: + { + Base *base= (Base *)ale->data; + Object *ob= base->object; + + if (setting == ACHANNEL_SETTING_EXPAND) { + // XXX - settings should really be moved out of ob->nlaflag + if (mode == ACHANNEL_SETFLAG_TOGGLE) ob->nlaflag ^= OB_ADS_COLLAPSED; + else if (mode == ACHANNEL_SETFLAG_ADD) ob->nlaflag &= ~OB_ADS_COLLAPSED; + else ob->nlaflag |= OB_ADS_COLLAPSED; + } + } + break; case ANIMTYPE_GROUP: { bActionGroup *agrp= (bActionGroup *)ale->data; - /* only 'protect' is available */ - if (setting == ACHANNEL_SETTING_PROTECT) { - ACHANNEL_SET_FLAG(agrp, mode, AGRP_PROTECTED); + switch (setting) { + case ACHANNEL_SETTING_PROTECT: + ACHANNEL_SET_FLAG(agrp, mode, AGRP_PROTECTED); + break; + case ACHANNEL_SETTING_EXPAND: + ACHANNEL_SET_FLAG(agrp, mode, AGRP_EXPANDED); + break; } } break; @@ -746,15 +766,16 @@ static void setflag_anim_channels (bAnimContext *ac, short setting, short mode) { FCurve *fcu= (FCurve *)ale->data; - /* mute */ - if (setting == ACHANNEL_SETTING_MUTE) { - ACHANNEL_SET_FLAG(fcu, mode, FCURVE_MUTED); - } - else if (setting == ACHANNEL_SETTING_PROTECT) { - ACHANNEL_SET_FLAG(fcu, mode, FCURVE_PROTECTED); - } - else if (setting == ACHANNEL_SETTING_VISIBLE) { - ACHANNEL_SET_FLAG(fcu, mode, FCURVE_VISIBLE); + switch (setting) { + case ACHANNEL_SETTING_MUTE: + ACHANNEL_SET_FLAG(fcu, mode, FCURVE_MUTED); + break; + case ACHANNEL_SETTING_PROTECT: + ACHANNEL_SET_FLAG(fcu, mode, FCURVE_PROTECTED); + break; + case ACHANNEL_SETTING_VISIBLE: + ACHANNEL_SET_FLAG(fcu, mode, FCURVE_VISIBLE); + break; } } break; @@ -762,14 +783,13 @@ static void setflag_anim_channels (bAnimContext *ac, short setting, short mode) { bGPDlayer *gpl= (bGPDlayer *)ale->data; - /* 'protect' and 'mute' */ - if (setting == ACHANNEL_SETTING_MUTE) { - /* mute */ - ACHANNEL_SET_FLAG(gpl, mode, GP_LAYER_HIDE); - } - else if (setting == ACHANNEL_SETTING_PROTECT) { - /* protected */ - ACHANNEL_SET_FLAG(gpl, mode, GP_LAYER_LOCKED); + switch (setting) { + case ACHANNEL_SETTING_MUTE: + ACHANNEL_SET_FLAG(gpl, mode, GP_LAYER_HIDE); + break; + case ACHANNEL_SETTING_PROTECT: + ACHANNEL_SET_FLAG(gpl, mode, GP_LAYER_LOCKED); + break; } } break; @@ -795,7 +815,7 @@ static int animchannels_setflag_exec(bContext *C, wmOperator *op) setting= RNA_enum_get(op->ptr, "type"); /* modify setting */ - setflag_anim_channels(&ac, setting, mode); + setflag_anim_channels(&ac, setting, mode, 1); /* set notifier tha things have changed */ ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_CHANNELS); @@ -888,6 +908,88 @@ void ANIM_OT_channels_editable_toggle (wmOperatorType *ot) RNA_def_enum(ot->srna, "type", prop_animchannel_settings_types, ACHANNEL_SETTING_PROTECT, "Type", ""); } +/* ********************** Expand Channels Operator *********************** */ + +static int animchannels_expand_exec (bContext *C, wmOperator *op) +{ + bAnimContext ac; + short onlysel= 1; + + /* get editor data */ + if (ANIM_animdata_get_context(C, &ac) == 0) + return OPERATOR_CANCELLED; + + /* only affect selected channels? */ + if (RNA_boolean_get(op->ptr, "all")) + onlysel= 0; + + /* modify setting */ + setflag_anim_channels(&ac, ACHANNEL_SETTING_EXPAND, ACHANNEL_SETFLAG_ADD, onlysel); + + /* set notifier that things have changed */ + ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_CHANNELS); + + return OPERATOR_FINISHED; +} + +void ANIM_OT_channels_expand (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Expand Channels"; + ot->idname= "ANIM_OT_channels_expand"; + + /* api callbacks */ + ot->exec= animchannels_expand_exec; + ot->poll= ED_operator_areaactive; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* props */ + RNA_def_boolean(ot->srna, "all", 0, "All", "Expand all channels (not just selected ones)"); +} + +/* ********************** Collapse Channels Operator *********************** */ + +static int animchannels_collapse_exec (bContext *C, wmOperator *op) +{ + bAnimContext ac; + short onlysel= 1; + + /* get editor data */ + if (ANIM_animdata_get_context(C, &ac) == 0) + return OPERATOR_CANCELLED; + + /* only affect selected channels? */ + if (RNA_boolean_get(op->ptr, "all")) + onlysel= 0; + + /* modify setting */ + setflag_anim_channels(&ac, ACHANNEL_SETTING_EXPAND, ACHANNEL_SETFLAG_CLEAR, onlysel); + + /* set notifier that things have changed */ + ANIM_animdata_send_notifiers(C, &ac, ANIM_CHANGED_CHANNELS); + + return OPERATOR_FINISHED; +} + +void ANIM_OT_channels_collapse (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Collapse Channels"; + ot->idname= "ANIM_OT_channels_collapse"; + + /* api callbacks */ + ot->exec= animchannels_collapse_exec; + ot->poll= ED_operator_areaactive; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* props */ + RNA_def_boolean(ot->srna, "all", 0, "All", "Collapse all channels (not just selected ones)"); +} + /* ********************** Select All Operator *********************** */ static int animchannels_deselectall_exec(bContext *C, wmOperator *op) @@ -1389,11 +1491,11 @@ static int animchannels_mouseclick_invoke(bContext *C, wmOperator *op, wmEvent * return OPERATOR_FINISHED; } -void ANIM_OT_channels_mouseclick (wmOperatorType *ot) +void ANIM_OT_channels_click (wmOperatorType *ot) { /* identifiers */ ot->name= "Mouse Click on Channels"; - ot->idname= "ANIM_OT_channels_mouseclick"; + ot->idname= "ANIM_OT_channels_click"; /* api callbacks */ ot->invoke= animchannels_mouseclick_invoke; @@ -1414,7 +1516,7 @@ void ED_operatortypes_animchannels(void) { WM_operatortype_append(ANIM_OT_channels_select_all_toggle); WM_operatortype_append(ANIM_OT_channels_select_border); - WM_operatortype_append(ANIM_OT_channels_mouseclick); + WM_operatortype_append(ANIM_OT_channels_click); WM_operatortype_append(ANIM_OT_channels_setting_enable); WM_operatortype_append(ANIM_OT_channels_setting_disable); @@ -1429,6 +1531,9 @@ void ED_operatortypes_animchannels(void) //WM_operatortype_append(ANIM_OT_channels_move_top); //WM_operatortype_append(ANIM_OT_channels_move_bottom); + WM_operatortype_append(ANIM_OT_channels_expand); + WM_operatortype_append(ANIM_OT_channels_collapse); + WM_operatortype_append(ANIM_OT_channels_visibility_toggle); } @@ -1439,9 +1544,9 @@ void ED_keymap_animchannels(wmWindowManager *wm) /* selection */ /* click-select */ // XXX for now, only leftmouse.... - WM_keymap_add_item(keymap, "ANIM_OT_channels_mouseclick", LEFTMOUSE, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_mouseclick", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", 1); - RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_mouseclick", LEFTMOUSE, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "children_only", 1); + WM_keymap_add_item(keymap, "ANIM_OT_channels_click", LEFTMOUSE, KM_PRESS, 0, 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_click", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", 1); + RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_click", LEFTMOUSE, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "children_only", 1); /* deselect all */ WM_keymap_add_item(keymap, "ANIM_OT_channels_select_all_toggle", AKEY, KM_PRESS, 0, 0); @@ -1458,6 +1563,13 @@ void ED_keymap_animchannels(wmWindowManager *wm) /* settings - specialised hotkeys */ WM_keymap_add_item(keymap, "ANIM_OT_channels_editable_toggle", TABKEY, KM_PRESS, 0, 0); + /* expand/collapse */ + WM_keymap_add_item(keymap, "ANIM_OT_channels_expand", PADPLUSKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "ANIM_OT_channels_collapse", PADMINUS, KM_PRESS, 0, 0); + + RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_expand", PADPLUSKEY, KM_PRESS, KM_CTRL, 0)->ptr, "all", 1); + RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_collapse", PADMINUS, KM_PRESS, KM_CTRL, 0)->ptr, "all", 1); + /* rearranging - actions only */ //WM_keymap_add_item(keymap, "ANIM_OT_channels_move_up", PAGEUPKEY, KM_PRESS, KM_SHIFT, 0); //WM_keymap_add_item(keymap, "ANIM_OT_channels_move_down", PAGEDOWNKEY, KM_PRESS, KM_SHIFT, 0); |