38#include "RNA_prototypes.hh"
61 ListBase anim_data = {
nullptr,
nullptr};
99 ListBase anim_data = {
nullptr,
nullptr};
102 const bool use_upper_stack_evaluation =
RNA_boolean_get(op->
ptr,
"use_upper_stack_evaluation");
129 if (use_upper_stack_evaluation) {
133 adt->
flag &= ~ADT_NLA_EVAL_UPPER_TRACKS;
157 if (ac.
scene && ok) {
178 ot->
name =
"Enter Tweak Mode";
179 ot->
idname =
"NLA_OT_tweakmode_enter";
181 "Enter tweaking mode for the action referenced by the active strip to edit its keyframes";
195 "Enable 'solo' on the NLA Track containing the active strip, "
196 "to edit it without seeing the effects of the NLA stack");
200 "use_upper_stack_evaluation",
202 "Evaluate Upper Stack",
203 "In tweak mode, display the effects of the tracks above the tweak strip");
215 ListBase anim_data = {
nullptr,
nullptr};
288 ot->
name =
"Exit Tweak Mode";
289 ot->
idname =
"NLA_OT_tweakmode_exit";
290 ot->
description =
"Exit tweaking mode for the action referenced by the active strip";
304 "Disable 'solo' on any of the NLA Tracks after exiting tweak mode "
305 "to get things back to normal");
320 ListBase anim_data = {
nullptr,
nullptr};
321 bool found_bounds =
false;
330 *max = -999999999.0f;
333 if (anim_data.
first) {
342 *
min = std::min(*
min, strip->start);
343 *max = std::max(*max, strip->end);
355 if (found_bounds ==
false) {
384 if (ac.
scene ==
nullptr) {
406 ot->
name =
"Set Preview Range to Selected";
407 ot->
idname =
"NLA_OT_previewrange_set";
408 ot->
description =
"Set Preview Range based on extends of selected strips";
433 ListBase anim_data = {
nullptr,
nullptr};
498 if (only_sel ==
false) {
511 float ymid = (ymax - ymin) / 2.0f + ymin;
547 ot->
description =
"Reset viewable area to show full strips range";
560 ot->
name =
"Frame Selected";
561 ot->
idname =
"NLA_OT_view_selected";
562 ot->
description =
"Reset viewable area to show selected strips range";
588 ot->
name =
"Go to Current Frame";
627 ListBase anim_data = {
nullptr,
nullptr};
633 "No active track(s) to add strip to, select an existing track or add one before "
647 ListBase anim_data = {
nullptr,
nullptr};
655 float cfra =
float(scene->r.cfra);
661 if (act ==
nullptr) {
671 "Action '%s' does not specify what data-blocks it can be used on "
672 "(try setting the 'ID Root Type' setting from the data-blocks editor "
673 "for this action to avoid future problems)",
701 "Could not add action '%s' as it cannot be used relative to ID-blocks of type '%s'",
710 "Expecting the owner of an ALE to be the animated ID, not the Action");
711 ID &animated_id = *ale->id;
714 strip->
end += (cfra - strip->
start);
751 ot->
name =
"Add Action Strip";
752 ot->
idname =
"NLA_OT_actionclip_add";
754 "Add an Action-Clip strip (i.e. an NLA Strip referencing an Action) to the active track";
784 ListBase anim_data = {
nullptr,
nullptr};
812 for (; s1 && s2; s1 = s2, s2 = s2->
next) {
836 strip = MEM_cnew<NlaStrip>(
"NlaStrip");
882 "Needs at least a pair of adjacent selected strips with a gap between them");
889 ot->
name =
"Add Transition";
890 ot->
idname =
"NLA_OT_transition_add";
891 ot->
description =
"Add a transition strip between two adjacent selected strips";
912 ListBase anim_data = {
nullptr,
nullptr};
920 int cfra = scene->
r.
cfra;
946 strip->
start += cfra;
979 ot->
name =
"Add Sound Clip";
980 ot->
idname =
"NLA_OT_soundclip_add";
981 ot->
description =
"Add a strip for controlling when speaker plays its sound clip";
1004 ListBase anim_data = {
nullptr,
nullptr};
1054 ot->
name =
"Add Meta-Strips";
1056 ot->
description =
"Add new meta-strips incorporating the selected strips";
1078 ListBase anim_data = {
nullptr,
nullptr};
1119 ot->
name =
"Remove Meta-Strips";
1121 ot->
description =
"Separate out the strips held by the selected meta-strips";
1144 ListBase anim_data = {
nullptr,
nullptr};
1231 ot->
name =
"Duplicate Strips";
1233 ot->
description =
"Duplicate selected NLA-Strips, adding the new strips to new track(s)";
1248 "When duplicating strips, assign new copies of the actions they use");
1263 ListBase anim_data = {
nullptr,
nullptr};
1286 nstrip = strip->
next;
1292 if (ale->adt && ale->adt->actstrip == strip) {
1301 nstrip = nstrip->
next;
1329 ot->
name =
"Delete Strips";
1358 float splitframe, splitaframe;
1363 if ((cfra > strip->
start) && (cfra < strip->end)) {
1378 splitframe = strip->
start + (
len / 2.0f);
1383 splitaframe = strip->
actend;
1399 strip->
end = splitframe;
1400 nstrip->
start = splitframe;
1402 if ((splitaframe > strip->
actstart) && (splitaframe < strip->actend)) {
1404 strip->
actend = splitaframe;
1411 strip->
flag &= ~NLASTRIP_FLAG_SYNC_LENGTH;
1431 ListBase anim_data = {
nullptr,
nullptr};
1460 switch (strip->
type) {
1492 ot->
name =
"Split Strips";
1494 ot->
description =
"Split selected strips at their midpoints";
1518 ListBase anim_data = {
nullptr,
nullptr};
1561 ot->
name =
"Toggle Muting";
1585 ListBase anim_data = {
nullptr,
nullptr};
1601 NlaStrip *strip, *stripN =
nullptr;
1602 NlaStrip *area =
nullptr, *sb =
nullptr;
1632 stripN = strip->
next;
1636 if (area ==
nullptr) {
1640 else if (sb ==
nullptr) {
1656 "Too many clusters of strips selected in NLA Track (%s): needs exactly 2 to be selected",
1659 else if (area ==
nullptr) {
1663 else if (sb ==
nullptr) {
1668 "Too few clusters of strips selected in NLA Track (%s): needs exactly 2 to be selected",
1672 float nsa[2], nsb[2];
1682 nsa[1] = sb->start + (area->end - area->start);
1684 nsb[0] = area->start;
1685 nsb[1] = area->start + (sb->end - sb->start);
1692 area->start = nsa[0];
1702 if (nsb[1] > nsa[0]) {
1705 "Cannot swap selected strips because they will overlap each other in their "
1712 "Cannot swap selected strips as they will not be able to fit in their new places");
1717 "Cannot swap '%s' and '%s' as one or both will not be able to fit in their "
1750 ot->
name =
"Swap Strips";
1752 ot->
description =
"Swap order of selected strips within tracks";
1774 ListBase anim_data = {
nullptr,
nullptr};
1797 if (nltn ==
nullptr) {
1810 stripn = strip->
next;
1841 ot->
name =
"Move Strips Up";
1843 ot->
description =
"Move selected strips up a track if there's room";
1865 ListBase anim_data = {
nullptr,
nullptr};
1888 if (nltp ==
nullptr) {
1901 stripn = strip->
next;
1932 ot->
name =
"Move Strips Down";
1934 ot->
description =
"Move selected strips down a track if there's room";
1956 ListBase anim_data = {
nullptr,
nullptr};
1991 if (strip->act ==
nullptr) {
2016 ot->
name =
"Sync Action Length";
2017 ot->
idname =
"NLA_OT_action_sync_length";
2019 "Synchronize the length of the referenced Action with the length used in the strip";
2032 "Active Strip Only",
2033 "Only sync the active length for the active strip");
2049 ListBase anim_data = {
nullptr,
nullptr};
2050 bool copied =
false;
2072 if (strip->act ==
nullptr) {
2085 strip->act = new_action;
2115 IFACE_(
"Make Selected Strips Single-User"),
2116 IFACE_(
"Linked actions will be duplicated for each selected strip."),
2127 ot->
name =
"Make Single User";
2128 ot->
idname =
"NLA_OT_make_single_user";
2169 ListBase anim_data = {
nullptr,
nullptr};
2170 bool copied =
false;
2199 if (strip->act->id.us > 1) {
2236 strip->scale = 1.0f;
2237 strip->actstart = start;
2238 strip->actend = end;
2263 ot->
name =
"Apply Scale";
2265 ot->
description =
"Apply scaling of selected strips to their referenced Actions";
2287 ListBase anim_data = {
nullptr,
nullptr};
2329 ot->
name =
"Clear Scale";
2357 {0,
nullptr, 0,
nullptr,
nullptr},
2364 ListBase anim_data = {
nullptr,
nullptr};
2384 bool any_added =
false;
2388 ListBase tmp_strips = {
nullptr,
nullptr};
2403 stripn = strip->
next;
2409 start = strip->
start;
2415 strip->start =
float(scene->r.cfra);
2418 strip->start =
floorf(start + 0.5f);
2421 strip->start =
floorf(start / secf + 0.5f) * secf;
2427 strip->start = start;
2432 strip->end = strip->start + (end - start);
2445 stripn = strip->
next;
2492 ot->
name =
"Snap Strips";
2535 if (fmi ==
nullptr) {
2558 ListBase anim_data = {
nullptr,
nullptr};
2613 "Modifier could not be added to (%s : %s) (see console for details)",
2636 ot->
name =
"Add F-Modifier";
2637 ot->
idname =
"NLA_OT_fmodifier_add";
2638 ot->
description =
"Add F-Modifier to the active/selected NLA-Strips";
2657 "Only add a F-Modifier of the specified type to the active strip");
2670 ListBase anim_data = {
nullptr,
nullptr};
2717 ot->
name =
"Copy F-Modifiers";
2718 ot->
idname =
"NLA_OT_fmodifier_copy";
2719 ot->
description =
"Copy the F-Modifier(s) of the active NLA-Strip";
2734 "Copy all the F-Modifiers, instead of just the active one");
2747 ListBase anim_data = {
nullptr,
nullptr};
2810 ot->
name =
"Paste F-Modifiers";
2811 ot->
idname =
"NLA_OT_fmodifier_paste";
2812 ot->
description =
"Add copied F-Modifiers to the selected NLA-Strips";
2823 ot->
srna,
"only_active",
true,
"Only Active",
"Only paste F-Modifiers on active strip");
2831 "Replace existing F-Modifiers, instead of just appending to the end of the existing list");
Functions and classes to work with Actions.
Functions for backward compatibility with the legacy Action API.
bScreen * CTX_wm_screen(const bContext *C)
ScrArea * CTX_wm_area(const bContext *C)
Main * CTX_data_main(const bContext *C)
const FModifierTypeInfo * get_fmodifier_typeinfo(int type)
void BKE_fcurve_handles_recalc(FCurve *fcu)
FModifier * add_fmodifier(ListBase *modifiers, int type, FCurve *owner_fcu)
void set_active_fmodifier(ListBase *modifiers, FModifier *fcm)
ID * BKE_id_copy(Main *bmain, const ID *id)
void BKE_nlameta_flush_transforms(NlaStrip *mstrip)
void BKE_nlastrip_remove_and_free(ListBase *strips, NlaStrip *strip, const bool do_id_user)
bool BKE_nlatrack_add_strip(NlaTrack *nlt, NlaStrip *strip, bool is_liboverride)
void BKE_nlastrips_clear_metastrip(ListBase *strips, NlaStrip *strip)
void BKE_nlastrip_recalculate_bounds_sync_action(NlaStrip *strip)
void BKE_nlastrips_clear_metas(ListBase *strips, bool only_sel, bool only_temp)
void BKE_nla_tweakmode_exit(OwnedAnimData owned_adt)
NlaStrip * BKE_nlastrip_copy(Main *bmain, NlaStrip *strip, bool use_same_action, int flag)
void BKE_nla_validate_state(AnimData *adt)
void BKE_nlatrack_solo_toggle(AnimData *adt, NlaTrack *nlt)
void BKE_nlatrack_set_active(ListBase *tracks, NlaTrack *nlt)
NlaStrip * BKE_nlastrip_new(bAction *act, ID &animated_id)
void BKE_nlatrack_remove_strip(NlaTrack *track, NlaStrip *strip)
NlaTrack * BKE_nlatrack_new_after(ListBase *nla_tracks, NlaTrack *prev, bool is_liboverride)
bool BKE_nlastrips_has_space(ListBase *strips, float start, float end)
NlaTrack * BKE_nlatrack_new_tail(ListBase *nla_tracks, const bool is_liboverride)
NlaTrack * BKE_nlatrack_find_tweaked(AnimData *adt)
bool BKE_nla_tweakmode_enter(OwnedAnimData owned_adt)
bool BKE_nlatrack_has_space(NlaTrack *nlt, float start, float end)
NlaStrip * BKE_nla_add_soundstrip(Main *bmain, Scene *scene, Speaker *speaker)
bool BKE_nlatrack_is_nonlocal_in_liboverride(const ID *id, const NlaTrack *nlt)
void BKE_nlastrip_validate_name(AnimData *adt, NlaStrip *strip)
void BKE_nlastrips_make_metas(ListBase *strips, bool is_temp)
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_report(ReportList *reports, eReportType type, const char *message)
#define BLI_assert_msg(a, msg)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_BACKWARD(type, var, list)
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
BLI_INLINE bool BLI_listbase_count_is_equal_to(const struct ListBase *listbase, const int count_cmp)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE int round_fl_to_int(float a)
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
BLI_INLINE float BLI_rctf_size_x(const struct rctf *rct)
#define BLT_I18NCONTEXT_ID_ACTION
void DEG_relations_tag_update(Main *bmain)
#define ID_IS_EDITABLE(_id)
#define ID_REAL_USERS(id)
#define ID_IS_OVERRIDE_LIBRARY(_id)
@ NLASTRIP_FLAG_TEMP_META
@ NLASTRIP_FLAG_AUTO_BLENDS
@ NLASTRIP_FLAG_SYNC_LENGTH
@ ADT_NLA_EVAL_UPPER_TRACKS
@ NLASTRIP_TYPE_TRANSITION
Object is a sort of wrapper for general info.
#define NLATRACK_FIRST_TOP(ac)
#define NLATRACK_STEP(snla)
@ ACHANNEL_SETTING_SELECT
@ ANIMFILTER_DATA_VISIBLE
@ ANIMFILTER_LIST_VISIBLE
@ ANIMFILTER_LIST_CHANNELS
#define NLATRACK_HEIGHT(snla)
void ED_area_tag_redraw(ScrArea *area)
bool ED_operator_nla_active(bContext *C)
Read Guarded memory(de)allocation.
const EnumPropertyItem * RNA_action_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *prop, bool *r_free)
void UI_view2d_sync(bScreen *screen, ScrArea *area, View2D *v2dcur, int flag)
void UI_view2d_center_get(const View2D *v2d, float *r_x, float *r_y)
void UI_view2d_center_set(View2D *v2d, float x, float y)
const bAnimChannelType * ANIM_channel_get_typeinfo(bAnimListElem *ale)
short ANIM_channel_setting_get(bAnimContext *ac, bAnimListElem *ale, eAnimChannel_Settings setting)
void ANIM_animdata_freelist(ListBase *anim_data)
void ANIM_animdata_update(bAnimContext *ac, ListBase *anim_data)
void ANIM_center_frame(bContext *C, int smooth_viewtx)
bool ANIM_animdata_get_context(const bContext *C, bAnimContext *ac)
size_t ANIM_animdata_filter(bAnimContext *ac, ListBase *anim_data, const eAnimFilter_Flags filter_mode, void *data, const eAnimCont_Types datatype)
int ED_markers_find_nearest_marker_time(ListBase *markers, float x)
float nlastrip_get_frame(NlaStrip *strip, float cframe, short mode)
draw_view in_light_buf[] float
bool ANIM_fmodifiers_paste_from_buf(ListBase *modifiers, bool replace, FCurve *curve)
void ANIM_fmodifiers_copybuf_free()
bool ANIM_fmodifiers_copy_to_buf(ListBase *modifiers, bool active)
short ANIM_animchanneldata_keyframes_loop(KeyframeEditData *ked, bDopeSheet *ads, void *data, int keytype, KeyframeEditFunc key_ok, KeyframeEditFunc key_cb, FcuEditFunc fcu_cb)
bool action_treat_as_legacy(const bAction &action)
void NLA_OT_view_frame(wmOperatorType *ot)
static int nlaedit_snap_exec(bContext *C, wmOperator *op)
static int nlaedit_delete_exec(bContext *C, wmOperator *)
static int nlaedit_add_transition_exec(bContext *C, wmOperator *op)
void NLA_OT_view_all(wmOperatorType *ot)
static int nlaedit_add_sound_exec(bContext *C, wmOperator *)
void NLA_OT_fmodifier_add(wmOperatorType *ot)
static int nlaedit_sync_actlen_exec(bContext *C, wmOperator *op)
void NLA_OT_split(wmOperatorType *ot)
void NLA_OT_tweakmode_exit(wmOperatorType *ot)
static int nla_fmodifier_add_exec(bContext *C, wmOperator *op)
static bool nla_tracks_get_selected_extents(bAnimContext *ac, float *r_min, float *r_max)
void ED_nla_postop_refresh(bAnimContext *ac)
static int nlaedit_viewall(bContext *C, const bool only_sel)
static int nlaedit_viewsel_exec(bContext *C, wmOperator *)
void NLA_OT_soundclip_add(wmOperatorType *ot)
static int nlaedit_apply_scale_exec(bContext *C, wmOperator *)
static int nlaedit_previewrange_exec(bContext *C, wmOperator *)
void NLA_OT_tweakmode_enter(wmOperatorType *ot)
void NLA_OT_clear_scale(wmOperatorType *ot)
void NLA_OT_make_single_user(wmOperatorType *ot)
void NLA_OT_meta_add(wmOperatorType *ot)
static void get_nlastrip_extents(bAnimContext *ac, float *min, float *max, const bool only_sel)
static int nla_fmodifier_paste_exec(bContext *C, wmOperator *op)
void NLA_OT_meta_remove(wmOperatorType *ot)
static int nlaedit_get_editable_tracks(bAnimContext *ac, ListBase *anim_data)
void NLA_OT_snap(wmOperatorType *ot)
static int nlaedit_disable_tweakmode_exec(bContext *C, wmOperator *op)
static int nlaedit_clear_scale_exec(bContext *C, wmOperator *)
static int nlaedit_viewall_exec(bContext *C, wmOperator *)
void NLA_OT_swap(wmOperatorType *ot)
static int nlaedit_toggle_mute_exec(bContext *C, wmOperator *)
static int nlaedit_make_single_user_exec(bContext *C, wmOperator *)
void NLA_OT_mute_toggle(wmOperatorType *ot)
void NLA_OT_move_up(wmOperatorType *ot)
static void nlaedit_split_strip_meta(NlaTrack *nlt, NlaStrip *strip)
void NLA_OT_delete(wmOperatorType *ot)
static int nlaedit_move_down_exec(bContext *C, wmOperator *)
static int nlaedit_make_single_user_invoke(bContext *C, wmOperator *op, const wmEvent *)
void NLA_OT_previewrange_set(wmOperatorType *ot)
void NLA_OT_fmodifier_copy(wmOperatorType *ot)
void NLA_OT_move_down(wmOperatorType *ot)
static int nlaedit_split_exec(bContext *C, wmOperator *)
static int nlaedit_add_actionclip_invoke(bContext *C, wmOperator *op, const wmEvent *event)
void NLA_OT_transition_add(wmOperatorType *ot)
static int nlaedit_viewframe_exec(bContext *C, wmOperator *op)
static const EnumPropertyItem * nla_fmodifier_itemf(bContext *C, PointerRNA *, PropertyRNA *, bool *r_free)
static int nlaedit_duplicate_exec(bContext *C, wmOperator *op)
void NLA_OT_view_selected(wmOperatorType *ot)
static int nlaedit_duplicate_invoke(bContext *C, wmOperator *op, const wmEvent *)
static int nlaedit_enable_tweakmode_exec(bContext *C, wmOperator *op)
static int nlaedit_move_up_exec(bContext *C, wmOperator *)
static int nlaedit_remove_meta_exec(bContext *C, wmOperator *)
void NLA_OT_duplicate(wmOperatorType *ot)
static void nlaedit_split_strip_actclip(Main *bmain, AnimData *adt, NlaTrack *nlt, NlaStrip *strip, float cfra)
bool nlaedit_disable_tweakmode(bAnimContext *ac, bool do_solo)
static int nlaedit_add_actionclip_exec(bContext *C, wmOperator *op)
static int nlaedit_add_meta_exec(bContext *C, wmOperator *)
void NLA_OT_actionclip_add(wmOperatorType *ot)
void NLA_OT_fmodifier_paste(wmOperatorType *ot)
void NLA_OT_action_sync_length(wmOperatorType *ot)
static int nla_fmodifier_copy_exec(bContext *C, wmOperator *op)
static int nlaedit_swap_exec(bContext *C, wmOperator *op)
void NLA_OT_apply_scale(wmOperatorType *ot)
static const EnumPropertyItem prop_nlaedit_snap_types[]
static short bezt_apply_nlamapping(KeyframeEditData *ked, BezTriple *bezt)
bool nlaop_poll_tweakmode_on(bContext *C)
bool nlaop_poll_tweakmode_off(bContext *C)
@ NLAEDIT_SNAP_NEAREST_MARKER
@ NLAEDIT_SNAP_NEAREST_SECOND
@ NLAEDIT_SNAP_NEAREST_FRAME
bool nlaedit_add_tracks_empty(bAnimContext *ac)
void RNA_float_set(PointerRNA *ptr, const char *name, float value)
int RNA_enum_from_value(const EnumPropertyItem *item, const int value)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
void RNA_enum_item_end(EnumPropertyItem **items, int *totitem)
void RNA_enum_item_add(EnumPropertyItem **items, int *totitem, const EnumPropertyItem *item)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_translation_context(PropertyRNA *prop, const char *context)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_enum_funcs(PropertyRNA *prop, EnumPropertyItemFunc itemfunc)
const EnumPropertyItem rna_enum_fmodifier_type_items[]
const EnumPropertyItem rna_enum_dummy_NULL_items[]
bool(* has_setting)(bAnimContext *ac, bAnimListElem *ale, eAnimChannel_Settings setting)
eAnimChannel_Role channel_role
bool(* poll)(bContext *C) ATTR_WARN_UNUSED_RESULT
int(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
int(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
struct ReportList * reports
void WM_main_add_notifier(uint type, void *reference)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
void WM_operator_properties_confirm_or_exec(wmOperatorType *ot)
int WM_menu_invoke(bContext *C, wmOperator *op, const wmEvent *)
int WM_operator_confirm_ex(bContext *C, wmOperator *op, const char *title, const char *message, const char *confirm_text, int icon, bool cancel_default)
int WM_operator_smooth_viewtx_get(const wmOperator *op)
int WM_enum_search_invoke(bContext *C, wmOperator *op, const wmEvent *)