44#include "RNA_prototypes.hh"
77 if (elem ==
nullptr) {
148 sub = &
col->column(
true);
158 sub = &
col->column(
true);
159 sub->
op(
"GRAPH_OT_frame_jump",
IFACE_(
"Cursor to Selection"), ICON_NONE);
160 sub->
op(
"GRAPH_OT_snap_cursor_value",
IFACE_(
"Cursor Value to Selection"), ICON_NONE);
191 icon = *optional_icon;
205 if (acf && acf->
name) {
206 acf->
name(ale, name);
218 col->label(name, icon);
227 col->prop(&fcu_ptr,
"array_index",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
256 *r_bezt = *r_prevbezt =
nullptr;
266 *r_bezt = &fcu->
bezt[active_keyframe_index];
268 const int prev_index =
max_ii(active_keyframe_index - 1, 0);
269 *r_prevbezt = &fcu->
bezt[prev_index];
313 const char f1 = bezt->
f1;
314 const char f3 = bezt->
f3;
332 const char f1 = bezt->
f1;
333 const char f3 = bezt->
f3;
358 const int but_max_width = region->
winx;
393 split->label(
IFACE_(
"None for Enum/Boolean"), ICON_IPO_CONSTANT);
396 col->prop(&bezt_ptr,
"interpolation",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
412 col->prop(&bezt_ptr,
"amplitude",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
480 "Type of left handle");
538 "Type of right handle");
580 layout->
label(
RPT_(
"F-Curve only has F-Modifiers"), ICON_NONE);
581 layout->
label(
RPT_(
"See Modifiers panel below"), ICON_INFO);
585 layout->
label(
RPT_(
"F-Curve doesn't have any keyframes as it only contains sampled points"),
589 layout->
label(
RPT_(
"No active keyframe on F-Curve"), ICON_NONE);
602#define B_IPO_DEPCHANGE 10
624 ID *
id =
static_cast<ID *
>(id_v);
630 if (adt !=
nullptr) {
631 if (adt->
action !=
nullptr) {
634 if (adt->
tmpact !=
nullptr) {
678 layout->
label(
RPT_(
"It cannot be left blank"), ICON_ERROR);
681 layout->
label(
RPT_(
"It cannot start with a number"), ICON_ERROR);
684 layout->
label(
RPT_(
"It cannot start with a special character,"
685 " including '$', '@', '!', '~', '+', '-', '_', '.', or ' '"),
689 layout->
label(
RPT_(
"It cannot contain spaces (e.g. 'a space')"), ICON_ERROR);
692 layout->
label(
RPT_(
"It cannot contain dots (e.g. 'a.dot')"), ICON_ERROR);
695 layout->
label(
RPT_(
"It cannot contain special (non-alphabetical/numeric) characters"),
699 layout->
label(
RPT_(
"It cannot be a reserved keyword in Python"), ICON_INFO);
735 row->
prop(dtar_ptr,
"fallback_value",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
738 layout->
prop(dtar_ptr,
"use_fallback_value",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
752 row = &layout->
row(
false);
796 uiItemPointerR(
col, &dtar_ptr,
"bone_target", &tar_ptr,
"bones",
"", ICON_BONE_DATA);
806 uiItemPointerR(
col, &dtar2_ptr,
"bone_target", &tar_ptr,
"bones",
"", ICON_BONE_DATA);
831 col, &dtar_ptr,
"bone_target", &tar_ptr,
"bones",
IFACE_(
"Bone"), ICON_BONE_DATA);
837 col->prop(&dtar_ptr,
"transform_space",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
847 col, &dtar2_ptr,
"bone_target", &tar_ptr,
"bones",
IFACE_(
"Bone"), ICON_BONE_DATA);
853 col->prop(&dtar2_ptr,
"transform_space",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
874 col, &dtar_ptr,
"bone_target", &tar_ptr,
"bones",
IFACE_(
"Bone"), ICON_BONE_DATA);
877 sub = &layout->
column(
true);
878 sub->
prop(&dtar_ptr,
"transform_type",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
903 row->
prop(&dtar_ptr,
"context_property",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
946 TIP_(
"Let the driver determine this property's value"));
970 icon = *optional_icon;
977 row = &layout->
row(
true);
986 row->
label(
"", ICON_RIGHTARROW);
987 row->
label(name, ICON_RNA);
994 const bool is_popover)
1011 col->prop(&driver_ptr,
"type",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
1017 row = &
col->row(
true);
1020 row->
label(valBuf, ICON_NONE);
1029 bool bpy_data_expr_error = (strstr(driver->
expression,
"bpy.data.") !=
nullptr);
1030 bool bpy_ctx_expr_error = (strstr(driver->
expression,
"bpy.context.") !=
nullptr);
1037 col->label(
IFACE_(
"Expression:"), ICON_NONE);
1039 col->prop(&driver_ptr,
"use_self",
UI_ITEM_NONE, std::nullopt, ICON_NONE);
1047 col->label(
RPT_(
"Python restricted for security"), ICON_ERROR);
1048 col->label(
RPT_(
"Slow Python expression"), ICON_INFO);
1051 col->label(
RPT_(
"ERROR: Invalid Python expression"), ICON_CANCEL);
1054 col->label(
RPT_(
"Slow Python expression"), ICON_INFO);
1059 if (bpy_data_expr_error || bpy_ctx_expr_error) {
1060 col->label(
RPT_(
"WARNING: Driver expression may not work correctly"), ICON_HELP);
1062 if (bpy_data_expr_error) {
1063 col->label(
RPT_(
"TIP: Use variables instead of bpy.data paths (see below)"), ICON_ERROR);
1065 if (bpy_ctx_expr_error) {
1066 col->label(
RPT_(
"TIP: bpy.context is not safe for renderfarm usage"), ICON_ERROR);
1076 col->label(
RPT_(
"ERROR: Invalid target channel(s)"), ICON_ERROR);
1086 col->label(
RPT_(
"ERROR: Driver is useless without any inputs"), ICON_ERROR);
1089 col->label(
RPT_(
"TIP: Use F-Curves for procedural animation instead"), ICON_INFO);
1090 col->label(
RPT_(
"F-Modifiers can generate curves for those too"), ICON_INFO);
1098 row_outer = &layout->
row(
false);
1101 row = &row_outer->
row(
true);
1108 IFACE_(
"Add Input Variable"),
1116 TIP_(
"Add a Driver Variable to keep track of an input used by the driver"));
1122 row->
op(
"UI_OT_eyedropper_driver",
"", ICON_EYEDROPPER);
1126 row = &row_outer->
row(
true);
1129 row->
op(
"GRAPH_OT_driver_variables_copy",
"", ICON_COPYDOWN);
1130 row->
op(
"GRAPH_OT_driver_variables_paste",
"", ICON_PASTEDOWN);
1144 row = &box->
row(
false);
1148 subrow = &row->
row(
true);
1154 sub = &subrow->
row(
true);
1164 sub = &subrow->
row(
true);
1185 TIP_(
"Invalid variable name, click here for details"));
1201 TIP_(
"Delete target variable"));
1208 switch (dvar->type) {
1231 row = &box->
row(
true);
1236 ELEM(dvar->targets[0].transChan,
1249 SNPRINTF(valBuf,
"%.3f", dvar->curval);
1252 row->
label(valBuf, ICON_NONE);
1263 row = &layout->
row(
true);
1270 IFACE_(
"Update Dependencies"),
1278 TIP_(
"Force updates of dependencies - Only use this if drivers are not updating correctly"));
1335 uiBut *but =
nullptr;
1341 bool driven, special;
1344 (
bContext *)
C, &
ptr, prop, index,
nullptr,
nullptr, &driven, &special);
1353 if (fcu && fcu->
driver) {
1354 ID *
id =
ptr.owner_id;
1360 layout->
label(
IFACE_(
"Driven Property:"), ICON_NONE);
1374 layout->
op(
"SCREEN_OT_drivers_editor_show",
IFACE_(
"Show in Drivers Editor"), ICON_DRIVER);
1385#define B_FMODIFIER_REDRAW 20
1387#define GRAPH_FMODIFIER_PANEL_PREFIX "GRAPH"
1439 row = &row->
row(
true);
1440 row->
op(
"GRAPH_OT_fmodifier_copy",
"", ICON_COPYDOWN);
1441 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)
#define SNPRINTF(dst, format,...)
char * STRNCPY(char(&dst)[N], const char *src)
size_t BLI_snprintf(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
#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, int type, int retval, int icon, blender::StringRef str, int x, int y, short width, short height, void *poin, float min, float max, std::optional< blender::StringRef > tip)
void UI_block_emboss_set(uiBlock *block, blender::ui::EmbossType emboss)
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)
uiBut * uiDefIconBut(uiBlock *block, int 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 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)
uiBut * uiDefButR(uiBlock *block, int 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_but_unit_type_set(uiBut *but, int unit_type)
void uiLayoutSetContextPointer(uiLayout *layout, blender::StringRef name, PointerRNA *ptr)
void uiLayoutSetActive(uiLayout *layout, bool active)
void uiLayoutSetEnabled(uiLayout *layout, bool enabled)
void uiItemPointerR(uiLayout *layout, PointerRNA *ptr, blender::StringRefNull propname, PointerRNA *searchptr, blender::StringRefNull searchpropname, std::optional< blender::StringRefNull > name, int icon)
uiLayout * uiItemL_respect_property_split(uiLayout *layout, blender::StringRef text, int icon)
void uiLayoutSetRedAlert(uiLayout *layout, bool redalert)
uiBlock * uiLayoutGetBlock(uiLayout *layout)
void uiLayoutSetAlignment(uiLayout *layout, char alignment)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemMenuEnumO(uiLayout *layout, const bContext *C, blender::StringRefNull opname, blender::StringRefNull propname, blender::StringRefNull name, int icon)
void uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep)
void uiLayoutSetContextFromBut(uiLayout *layout, uiBut *but)
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(wmOperatorType *ot, std::optional< blender::StringRef > name, int icon, wmOperatorCallContext context, eUI_Item_Flag flag)
void label(blender::StringRef name, int icon)
uiLayout & column(bool align)
void separator(float factor=1.0f, LayoutSeparatorType type=LayoutSeparatorType::Auto)
uiLayout & row(bool align)
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)