45#include "RNA_prototypes.hh"
79 if (elem ==
nullptr) {
150 sub = &
col->column(
true);
160 sub = &
col->column(
true);
161 sub->
op(
"GRAPH_OT_frame_jump",
IFACE_(
"Cursor to Selection"), ICON_NONE);
162 sub->
op(
"GRAPH_OT_snap_cursor_value",
IFACE_(
"Cursor Value to Selection"), ICON_NONE);
193 icon = *optional_icon;
207 if (acf && acf->
name) {
229 col->prop(&fcu_ptr,
"array_index",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
258 *r_bezt = *r_prevbezt =
nullptr;
268 *r_bezt = &fcu->
bezt[active_keyframe_index];
270 const int prev_index =
max_ii(active_keyframe_index - 1, 0);
271 *r_prevbezt = &fcu->
bezt[prev_index];
315 const char f1 = bezt->
f1;
316 const char f3 = bezt->
f3;
334 const char f1 = bezt->
f1;
335 const char f3 = bezt->
f3;
360 const int but_max_width = region->
winx;
368 block = layout->
block();
395 split->label(
IFACE_(
"None for Enum/Boolean"), ICON_IPO_CONSTANT);
398 col->prop(&bezt_ptr,
"interpolation",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
414 col->prop(&bezt_ptr,
"amplitude",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
482 "Type of left handle");
540 "Type of right handle");
582 layout->
label(
RPT_(
"F-Curve only has F-Modifiers"), ICON_NONE);
583 layout->
label(
RPT_(
"See Modifiers panel below"), ICON_INFO);
587 layout->
label(
RPT_(
"F-Curve does not have any keyframes as it only contains sampled points"),
591 layout->
label(
RPT_(
"No active keyframe on F-Curve"), ICON_NONE);
604#define B_IPO_DEPCHANGE 10
626 ID *
id =
static_cast<ID *
>(id_v);
632 if (adt !=
nullptr) {
633 if (adt->
action !=
nullptr) {
636 if (adt->
tmpact !=
nullptr) {
680 layout->
label(
RPT_(
"It cannot be left blank"), ICON_ERROR);
683 layout->
label(
RPT_(
"It cannot start with a number"), ICON_ERROR);
686 layout->
label(
RPT_(
"It cannot start with a special character,"
687 " including '$', '@', '!', '~', '+', '-', '_', '.', or ' '"),
691 layout->
label(
RPT_(
"It cannot contain spaces (e.g. 'a space')"), ICON_ERROR);
694 layout->
label(
RPT_(
"It cannot contain dots (e.g. 'a.dot')"), ICON_ERROR);
697 layout->
label(
RPT_(
"It cannot contain special (non-alphabetical/numeric) characters"),
701 layout->
label(
RPT_(
"It cannot be a reserved keyword in Python"), ICON_INFO);
737 row->
prop(dtar_ptr,
"fallback_value",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
740 layout->
prop(dtar_ptr,
"use_fallback_value",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
754 row = &layout->
row(
false);
798 col->prop_search(&dtar_ptr,
"bone_target", &tar_ptr,
"bones",
"", ICON_BONE_DATA);
808 col->prop_search(&dtar2_ptr,
"bone_target", &tar_ptr,
"bones",
"", ICON_BONE_DATA);
832 col->prop_search(&dtar_ptr,
"bone_target", &tar_ptr,
"bones",
IFACE_(
"Bone"), ICON_BONE_DATA);
836 col->red_alert_set(
false);
838 col->prop(&dtar_ptr,
"transform_space",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
847 col->prop_search(&dtar2_ptr,
"bone_target", &tar_ptr,
"bones",
IFACE_(
"Bone"), ICON_BONE_DATA);
851 col->red_alert_set(
false);
853 col->prop(&dtar2_ptr,
"transform_space",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
873 col->prop_search(&dtar_ptr,
"bone_target", &tar_ptr,
"bones",
IFACE_(
"Bone"), ICON_BONE_DATA);
876 sub = &layout->
column(
true);
877 sub->
prop(&dtar_ptr,
"transform_type",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
902 row->
prop(&dtar_ptr,
"context_property",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
945 TIP_(
"Let the driver determine this property's value"));
969 icon = *optional_icon;
976 row = &layout->
row(
true);
985 row->
label(
"", ICON_RIGHTARROW);
993 const bool is_popover)
1002 block = layout->
block();
1009 block =
col->block();
1010 col->prop(&driver_ptr,
"type",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
1016 row = &
col->row(
true);
1019 row->
label(valBuf, ICON_NONE);
1028 bool bpy_data_expr_error = (strstr(driver->
expression,
"bpy.data.") !=
nullptr);
1029 bool bpy_ctx_expr_error = (strstr(driver->
expression,
"bpy.context.") !=
nullptr);
1034 block =
col->block();
1036 col->label(
IFACE_(
"Expression:"), ICON_NONE);
1038 col->prop(&driver_ptr,
"use_self",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
1042 block =
col->block();
1046 col->label(
RPT_(
"Python restricted for security"), ICON_ERROR);
1047 col->label(
RPT_(
"Slow Python expression"), ICON_INFO);
1050 col->label(
RPT_(
"ERROR: Invalid Python expression"), ICON_CANCEL);
1053 col->label(
RPT_(
"Slow Python expression"), ICON_INFO);
1058 if (bpy_data_expr_error || bpy_ctx_expr_error) {
1059 col->label(
RPT_(
"WARNING: Driver expression may not work correctly"), ICON_HELP);
1061 if (bpy_data_expr_error) {
1062 col->label(
RPT_(
"TIP: Use variables instead of bpy.data paths (see below)"), ICON_ERROR);
1064 if (bpy_ctx_expr_error) {
1065 col->label(
RPT_(
"TIP: bpy.context is not safe for renderfarm usage"), ICON_ERROR);
1072 block =
col->block();
1075 col->label(
RPT_(
"ERROR: Invalid target channel(s)"), ICON_ERROR);
1085 col->label(
RPT_(
"ERROR: Driver is useless without any inputs"), ICON_ERROR);
1088 col->label(
RPT_(
"TIP: Use F-Curves for procedural animation instead"), ICON_INFO);
1089 col->label(
RPT_(
"F-Modifiers can generate curves for those too"), ICON_INFO);
1097 row_outer = &layout->
row(
false);
1100 row = &row_outer->
row(
true);
1101 block = row->
block();
1107 IFACE_(
"Add Input Variable"),
1113 TIP_(
"Add a Driver Variable to keep track of an input used by the driver"));
1119 row->
op(
"UI_OT_eyedropper_driver",
"", ICON_EYEDROPPER);
1123 row = &row_outer->
row(
true);
1124 block = row->
block();
1126 row->
op(
"GRAPH_OT_driver_variables_copy",
"", ICON_COPYDOWN);
1127 row->
op(
"GRAPH_OT_driver_variables_paste",
"", ICON_PASTEDOWN);
1141 row = &box->
row(
false);
1142 block = row->
block();
1145 subrow = &row->
row(
true);
1151 sub = &subrow->
row(
true);
1161 sub = &subrow->
row(
true);
1182 TIP_(
"Invalid variable name, click here for details"));
1198 TIP_(
"Delete target variable"));
1205 switch (dvar->type) {
1228 row = &box->
row(
true);
1233 ELEM(dvar->targets[0].transChan,
1249 row->
label(valBuf, ICON_NONE);
1260 row = &layout->
row(
true);
1261 block = row->
block();
1267 IFACE_(
"Update Dependencies"),
1273 TIP_(
"Force updates of dependencies - Only use this if drivers are not updating correctly"));
1330 uiBut *but =
nullptr;
1336 bool driven, special;
1339 (
bContext *)
C, &
ptr, prop, index,
nullptr,
nullptr, &driven, &special);
1348 if (fcu && fcu->
driver) {
1349 ID *
id =
ptr.owner_id;
1355 layout->
label(
IFACE_(
"Driven Property:"), ICON_NONE);
1369 layout->
op(
"SCREEN_OT_drivers_editor_show",
IFACE_(
"Show in Drivers Editor"), ICON_DRIVER);
1380#define B_FMODIFIER_REDRAW 20
1382#define GRAPH_FMODIFIER_PANEL_PREFIX "GRAPH"
1431 row->
op_menu_enum(
C,
"GRAPH_OT_fmodifier_add",
"type",
IFACE_(
"Add Modifier"), ICON_NONE);
1434 row = &row->
row(
true);
1435 row->
op(
"GRAPH_OT_fmodifier_copy",
"", ICON_COPYDOWN);
1436 row->
op(
"GRAPH_OT_fmodifier_paste",
"", ICON_PASTEDOWN);
AnimData * BKE_animdata_from_id(const ID *id)
SpaceGraph * CTX_wm_space_graph(const bContext *C)
bScreen * CTX_wm_screen(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Main * CTX_data_main(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
void BKE_nurb_bezt_handle_test(BezTriple *bezt, eBezTriple_Flag__Alias sel_flag, const eNurbHandleTest_Mode handle_mode, bool use_around_local)
const FModifierTypeInfo * get_fmodifier_typeinfo(int type)
int BKE_fcurve_active_keyframe_index(const FCurve *fcu)
void BKE_fcurve_handles_recalc(FCurve *fcu)
FCurve * BKE_fcurve_find_by_rna_context_ui(bContext *C, const PointerRNA *ptr, PropertyRNA *prop, int rnaindex, AnimData **r_animdata, bAction **r_action, bool *r_driven, bool *r_special)
void sort_time_fcurve(FCurve *fcu)
struct DriverVar * driver_add_new_variable(struct ChannelDriver *driver)
bool BKE_driver_has_simple_expression(struct ChannelDriver *driver)
void driver_free_variable_ex(struct ChannelDriver *driver, struct DriverVar *dvar)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE int max_ii(int a, int b)
size_t size_t size_t BLI_snprintf_utf8(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
#define SNPRINTF_UTF8(dst, format,...)
#define STRNCPY_UTF8(dst, src)
#define BLI_STR_UTF8_DEGREE_SIGN
#define CTX_IFACE_(context, msgid)
#define BLT_I18NCONTEXT_OPERATOR_DEFAULT
#define BLT_I18NCONTEXT_DEFAULT_BPYRNA
#define BLT_I18NCONTEXT_EDITOR_FILEBROWSER
void DEG_relations_tag_update(Main *bmain)
@ DTAR_OPTION_USE_FALLBACK
@ DVAR_TYPE_TRANSFORM_CHAN
@ DTAR_ROTMODE_QUATERNION
@ DTAR_FLAG_FALLBACK_USED
@ DRIVER_FLAG_PYTHON_BLOCKED
#define FCURVE_ACTIVE_KEYFRAME_NONE
@ DVAR_FLAG_INVALID_START_CHAR
@ DVAR_FLAG_INVALID_EMPTY
@ DVAR_FLAG_INVALID_START_NUM
@ DVAR_FLAG_INVALID_HAS_SPACE
@ DVAR_FLAG_INVALID_HAS_DOT
@ DVAR_FLAG_INVALID_HAS_SPECIAL
@ DVAR_FLAG_INVALID_PY_KEYWORD
#define BEZT_ISSEL_ANY(bezt)
Object is a sort of wrapper for general info.
bool ED_operator_graphedit_active(bContext *C)
void ED_undo_push(bContext *C, const char *str)
static void split(const char *text, const char *seps, char ***str, int *count)
Read Guarded memory(de)allocation.
StructRNA * ID_code_to_RNA_type(short idcode)
#define RNA_SUBTYPE_UNIT(subtype)
void UI_but_func_set(uiBut *but, std::function< void(bContext &)> func)
uiBut * uiDefIconTextBut(uiBlock *block, uiButTypeWithPointerType but_and_ptr_type, int retval, int icon, blender::StringRef str, int x, int y, short width, short height, void *poin, std::optional< blender::StringRef > tip)
uiBut * uiDefButR(uiBlock *block, ButType type, int retval, std::optional< blender::StringRef > str, int x, int y, short width, short height, PointerRNA *ptr, blender::StringRefNull propname, int index, float min, float max, std::optional< blender::StringRef > tip)
void UI_block_emboss_set(uiBlock *block, blender::ui::EmbossType emboss)
uiBut * uiDefIconBut(uiBlock *block, uiButTypeWithPointerType but_and_ptr_type, int retval, int icon, int x, int y, short width, short height, void *poin, float min, float max, std::optional< blender::StringRef > tip)
void UI_popup_menu_end(bContext *C, uiPopupMenu *pup)
void uiTemplateAnyID(uiLayout *layout, PointerRNA *ptr, blender::StringRefNull propname, blender::StringRefNull proptypename, std::optional< blender::StringRef > text)
void UI_block_func_handle_set(uiBlock *block, uiBlockHandleFunc func, void *arg)
uiPopupMenu * UI_popup_menu_begin(bContext *C, const char *title, int icon) ATTR_NONNULL()
uiLayout * UI_popup_menu_layout(uiPopupMenu *pup)
void uiTemplatePathBuilder(uiLayout *layout, PointerRNA *ptr, blender::StringRefNull propname, PointerRNA *root_ptr, std::optional< blender::StringRefNull > text)
uiBut * UI_region_active_but_prop_get(const ARegion *region, PointerRNA *r_ptr, PropertyRNA **r_prop, int *r_index)
void UI_but_unit_type_set(uiBut *but, int unit_type)
uiLayout * uiItemL_respect_property_split(uiLayout *layout, blender::StringRef text, int icon)
const bAnimChannelType * ANIM_channel_get_typeinfo(const bAnimListElem *ale)
bool ANIM_animdata_get_context(const bContext *C, bAnimContext *ac)
std::optional< int > getname_anim_fcurve(char *name, ID *id, FCurve *fcu)
#define B_FMODIFIER_REDRAW
void ANIM_modifier_panels_register_graph_only(ARegionType *region_type, const char *modifier_panel_prefix, PanelTypePollFn poll_function)
void ANIM_modifier_panels_register_graph_and_NLA(ARegionType *region_type, const char *modifier_panel_prefix, PanelTypePollFn poll_function)
void ANIM_fmodifier_panels(const bContext *C, ID *owner_id, ListBase *fmodifiers, uiListPanelIDFromDataFunc panel_id_fn)
bAnimListElem * get_active_fcurve_channel(bAnimContext *ac)
DEG_id_tag_update_ex(cb_data->bmain, cb_data->owner_id, ID_RECALC_TAG_FOR_UNDO|ID_RECALC_SYNC_TO_EVAL)
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
int RNA_struct_ui_icon(const StructRNA *type)
PropertySubType RNA_property_subtype(PropertyRNA *prop)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
PointerRNA RNA_id_pointer_create(ID *id)
bool RNA_path_resolve_property(const PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop)
void(* draw)(const bContext *C, Panel *panel)
char idname[BKE_ST_MAXNAME]
bool(* poll)(const bContext *C, PanelType *pt)
char translation_context[BKE_ST_MAXNAME]
char category[BKE_ST_MAXNAME]
char label[BKE_ST_MAXNAME]
void(* draw_header)(const bContext *C, Panel *panel)
void(* name)(bAnimListElem *ale, char *name)
PointerRNA op_menu_enum(const bContext *C, wmOperatorType *ot, blender::StringRefNull propname, std::optional< blender::StringRefNull > name, int icon)
void use_property_decorate_set(bool is_sep)
void alignment_set(blender::ui::LayoutAlign alignment)
void label(blender::StringRef name, int icon)
uiLayout & column(bool align)
void red_alert_set(bool red_alert)
void separator(float factor=1.0f, LayoutSeparatorType type=LayoutSeparatorType::Auto)
void context_ptr_set(blender::StringRef name, const PointerRNA *ptr)
uiLayout & row(bool align)
void context_set_from_but(const uiBut *but)
PointerRNA op(wmOperatorType *ot, std::optional< blender::StringRef > name, int icon, blender::wm::OpCallContext context, eUI_Item_Flag flag)
void use_property_split_set(bool value)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
bool WM_paneltype_add(PanelType *pt)