40#include "RNA_prototypes.hh"
52#define USE_KEYMAP_ADD_HACK
67 if (!final_data_path.has_value()) {
94 if (*r_prop ==
nullptr) {
97 return "WM_OT_context_toggle";
102 if (*r_prop ==
nullptr) {
105 return "WM_OT_context_menu_enum";
113 return "WM_OT_call_menu";
120 return "WM_OT_call_asset_shelf_popover";
127 return "WM_OT_call_panel";
147 if (idname ==
nullptr) {
181 U.runtime.is_dirty =
true;
213#ifdef USE_KEYMAP_ADD_HACK
234 const int kmi_id = kmi->
id;
241 U.runtime.is_dirty =
true;
268#ifdef USE_KEYMAP_ADD_HACK
282#ifdef USE_KEYMAP_ADD_HACK
287 int kmi_id = WM_key_event_operator_id(
C, idname, but->
opcontext, prop,
true, &km);
312 U.runtime.is_dirty =
true;
327 if (data_path.has_value()) {
355 if (
UNLIKELY(!member_id_data_path.has_value())) {
365 &um->
items, member_id_data_path->c_str(), prop_id.c_str(), but->
rnaindex);
395 if (drawstr[0] ==
'\0') {
402 const char *expr_imports[] = {
"bpy",
"bl_ui",
nullptr};
405 "bl_ui.space_toolsystem_common.item_from_id("
407 "bpy.context.space_data.type, "
410 char *expr_result =
nullptr;
412 drawstr = expr_result;
441 if (!member_id_data_path.has_value()) {
452 &um->
items,
"", member_id_data_path->c_str(), prop_id.c_str(), but->
rnaindex);
488 props_ptr = layout->
op(
ot,
502 props_ptr = layout->
op(
ot,
569 const bool is_array_component = (is_array && but->
rnaindex != -1);
570 const bool is_whole_array = (is_array && but->
rnaindex == -1);
583 if (is_array_component) {
585 "ANIM_OT_keyframe_insert_button",
590 "ANIM_OT_keyframe_insert_button",
594 op_ptr = layout->
op(
"ANIM_OT_keyframe_delete_button",
598 op_ptr = layout->
op(
"ANIM_OT_keyframe_delete_button",
605 "ANIM_OT_keyframe_insert_button",
609 op_ptr = layout->
op(
"ANIM_OT_keyframe_delete_button",
622 if (is_array_component) {
624 "ANIM_OT_keyframe_insert_button",
628 op_ptr = layout->
op(
"ANIM_OT_keyframe_insert_button",
635 "ANIM_OT_keyframe_insert_button",
643 if (is_array_component) {
645 "ANIM_OT_keyframe_clear_button",
649 op_ptr = layout->
op(
"ANIM_OT_keyframe_clear_button",
656 "ANIM_OT_keyframe_clear_button",
665 if (is_array_component) {
690 op_ptr = layout->
op(
ot,
703 if (is_array_component) {
705 "ANIM_OT_driver_button_remove",
709 op_ptr = layout->
op(
"ANIM_OT_driver_button_remove",
716 "ANIM_OT_driver_button_remove",
722 if (is_whole_array) {
724 "UI_OT_copy_driver_to_selected_button",
730 layout->
op(
"ANIM_OT_copy_driver_button",
734 layout->
op(
"ANIM_OT_paste_driver_button",
739 "UI_OT_copy_driver_to_selected_button",
743 if (is_array_component) {
745 "UI_OT_copy_driver_to_selected_button",
751 layout->
op(
"ANIM_OT_driver_button_edit",
756 layout->
op(
"SCREEN_OT_drivers_editor_show",
766 layout->
op(
"ANIM_OT_driver_button_add",
770 if (!is_whole_array) {
772 layout->
op(
"ANIM_OT_paste_driver_button",
778 layout->
op(
"SCREEN_OT_drivers_editor_show",
788 if (is_array_component) {
790 "ANIM_OT_keyingset_button_add",
795 "ANIM_OT_keyingset_button_add",
799 layout->
op(
"ANIM_OT_keyingset_button_remove",
805 "ANIM_OT_keyingset_button_add",
809 layout->
op(
"ANIM_OT_keyingset_button_remove",
815 if (is_overridable) {
822 if (is_array_component) {
824 "UI_OT_override_remove_button",
829 "UI_OT_override_remove_button",
836 "UI_OT_override_remove_button",
844 if (is_array_component) {
845 op_ptr = layout->
op(
ot,
851 op_ptr = layout->
op(
ot,
859 op_ptr = layout->
op(
ot,
876 if (is_array_component) {
878 "UI_OT_reset_default_button",
883 "UI_OT_reset_default_button",
890 "UI_OT_reset_default_button",
897 layout->
op(
"UI_OT_assign_default_button",
904 if (is_array_component) {
906 "UI_OT_copy_to_selected_button",
910 op_ptr = layout->
op(
"UI_OT_copy_to_selected_button",
917 "UI_OT_copy_to_selected_button",
923 layout->
op(
"UI_OT_copy_data_path_button",
927 "UI_OT_copy_data_path_button",
932 if (
ptr->owner_id && !is_whole_array &&
935 layout->
op(
"UI_OT_copy_as_driver_button",
963 props_ptr = layout->
op(
ot,
1010 sub->
op(
"ASSET_OT_mark_single",
1012 ICON_ASSET_MANAGER);
1013 sub = &layout->
column(
true);
1015 sub->
op(
"ASSET_OT_clear_single",
1022 if (mt_idtemplate_liboverride && mt_idtemplate_liboverride->
poll(
C, mt_idtemplate_liboverride))
1024 layout->
menu(mt_idtemplate_liboverride,
IFACE_(
"Library Override"), ICON_NONE);
1038 layout->
op(
"UI_OT_jump_to_target_button",
1048 const int w = layout->
width();
1049 bool item_found =
false;
1053 for (
int um_index = 0; um_index < um_array_len; um_index++) {
1055 if (um ==
nullptr) {
1059 if (umi !=
nullptr) {
1074 U.runtime.is_dirty =
true;
1095 TIP_(
"Add to a user defined context menu (stored in the user preferences)"));
1098 U.runtime.is_dirty =
true;
1109 if (idname !=
nullptr) {
1111 const int w = layout->
width();
1154 IFACE_(
"Non-Keyboard Shortcut"),
1160 TIP_(
"Only keyboard shortcuts can be edited that way, "
1161 "please use User Preferences otherwise"));
1209 layout->
op(
"WM_OT_doc_view_manual_ui_context",
1214 ptr_props = layout->
op(
1226 layout->
op(
"UI_OT_copy_python_command_button", std::nullopt, ICON_NONE);
1232 layout->
op(
"UI_OT_editsource",
1265 const bool is_inside_listrow = is_inside_listbox ?
1268 if (is_inside_listrow) {
1297 const bool any_item_visible = has_panel_category;
1299 if (!any_item_visible) {
1314 if (has_panel_category) {
bScreen * CTX_wm_screen(const bContext *C)
ARegion * CTX_wm_region_popup(const bContext *C)
PointerRNA CTX_data_pointer_get_type(const bContext *C, const char *member, StructRNA *type)
ScrArea * CTX_wm_area(const bContext *C)
Main * CTX_data_main(const bContext *C)
const bContextStore * CTX_store_get(const bContext *C)
void CTX_store_set(bContext *C, const bContextStore *store)
ARegion * CTX_wm_region(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
void IDP_FreeProperty(IDProperty *prop)
bool IDP_AddToGroup(IDProperty *group, IDProperty *prop) ATTR_NONNULL()
IDProperty * IDP_CopyProperty(const IDProperty *prop) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
#define BLI_assert_unreachable()
File and directory operations.
int BLI_exists(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
bool BLI_is_file(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BLI_path_split_dir_file(const char *filepath, char *dir, size_t dir_maxncpy, char *file, size_t file_maxncpy) ATTR_NONNULL(1
void void BLI_path_split_dir_part(const char *filepath, char *dir, size_t dir_maxncpy) ATTR_NONNULL(1
int BLI_path_slash_ensure(char *path, size_t path_maxncpy) ATTR_NONNULL(1)
#define SNPRINTF_UTF8(dst, format,...)
#define UNUSED_VARS_NDEBUG(...)
#define CTX_IFACE_(context, msgid)
#define BLT_I18NCONTEXT_OPERATOR_DEFAULT
bool bool bool bool BPY_run_string_as_string(bContext *C, const char *imports[], const char *expr, BPy_RunErrInfo *err_info, char **r_value) ATTR_NONNULL(1
void ED_screen_user_menu_item_add_operator(ListBase *lb, const char *ui_name, const wmOperatorType *ot, const IDProperty *prop, const char *op_prop_enum, blender::wm::OpCallContext opcontext)
bUserMenu * ED_screen_user_menu_ensure(bContext *C)
bUserMenuItem_Op * ED_screen_user_menu_item_find_operator(ListBase *lb, const wmOperatorType *ot, IDProperty *prop, const char *op_prop_enum, blender::wm::OpCallContext opcontext)
void ED_screens_footer_tools_menu_create(bContext *C, uiLayout *layout, void *arg)
bUserMenu ** ED_screen_user_menus_find(const bContext *C, uint *r_len)
bUserMenuItem_Prop * ED_screen_user_menu_item_find_prop(ListBase *lb, const char *context_data_path, const char *prop_id, int prop_index)
void ED_screen_user_menu_item_add_prop(ListBase *lb, const char *ui_name, const char *context_data_path, const char *prop_id, int prop_index)
void ED_screen_user_menu_item_add_menu(ListBase *lb, const char *ui_name, const MenuType *mt)
void ED_screens_header_tools_menu_create(bContext *C, uiLayout *layout, void *arg)
void ED_screen_user_menu_item_remove(ListBase *lb, bUserMenuItem *umi)
bUserMenuItem_Menu * ED_screen_user_menu_item_find_menu(ListBase *lb, const MenuType *mt)
Read Guarded memory(de)allocation.
@ RNA_OVERRIDE_STATUS_OVERRIDABLE
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)
@ UI_BLOCK_MOVEMOUSE_QUIT
bool UI_panel_can_be_pinned(const Panel *panel)
uiBlock * UI_block_begin(const bContext *C, ARegion *region, std::string name, blender::ui::EmbossType emboss)
void UI_block_bounds_set_popup(uiBlock *block, int addval, const int bounds_offset[2])
void UI_popup_block_invoke(bContext *C, uiBlockCreateFunc func, void *arg, uiFreeArgFunc arg_free)
MenuType * UI_but_menutype_get(const uiBut *but)
const uiStyle * UI_style_get_dpi()
bool UI_panel_category_is_visible(const ARegion *region)
void UI_popup_block_ex(bContext *C, uiBlockCreateFunc func, uiBlockHandleFunc popup_func, uiBlockCancelFunc cancel_func, void *arg, wmOperator *op)
void UI_popup_menu_end(bContext *C, uiPopupMenu *pup)
std::string UI_but_context_menu_title_from_button(uiBut &but)
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()
uiBut * uiDefBlockBut(uiBlock *block, uiBlockCreateFunc func, void *arg, blender::StringRef str, int x, int y, short width, short height, std::optional< blender::StringRef > tip)
std::optional< std::string > UI_but_online_manual_id(const uiBut *but) ATTR_WARN_UNUSED_RESULT
uiLayout * UI_popup_menu_layout(uiPopupMenu *pup)
PanelType * UI_but_paneltype_get(const uiBut *but)
bool UI_popup_menu_end_or_cancel(bContext *C, uiPopupMenu *pup)
void UI_block_direction_set(uiBlock *block, char direction)
void UI_block_flag_enable(uiBlock *block, int flag)
bool UI_but_is_tool(const uiBut *but)
void UI_but_flag_enable(uiBut *but, int flag)
std::optional< blender::StringRefNull > UI_but_asset_shelf_type_idname_get(const uiBut *but)
wmOperatorType * UI_but_operatortype_get_from_enum_menu(uiBut *but, PropertyRNA **r_prop)
void UI_menutype_draw(bContext *C, MenuType *mt, uiLayout *layout)
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
const T & last(const int64_t n=0) const
virtual void build_context_menu(bContext &C, uiLayout &column) const
bool ANIM_driver_can_paste()
void ui_but_add_shortcut(uiBut *but, const char *shortcut_str, const bool do_strip)
uiBut * ui_view_item_find_mouse_over(const ARegion *region, const int xy[2]) ATTR_NONNULL(1
bool ui_jump_to_target_button_poll(bContext *C)
bool ui_block_is_popup_any(const uiBlock *block) ATTR_WARN_UNUSED_RESULT
bool ui_block_is_menu(const uiBlock *block) ATTR_WARN_UNUSED_RESULT
uiBut * ui_list_find_mouse_over(const ARegion *region, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
blender::StringRef ui_but_drawstr_without_sep_char(const uiBut *but) ATTR_NONNULL()
uiBut * ui_list_row_find_mouse_over(const ARegion *region, const int xy[2]) ATTR_NONNULL(1
void ui_rna_collection_search_update_fn(const bContext *C, void *arg, const char *str, uiSearchItems *items, bool is_first)
void MEM_freeN(void *vmemh)
std::unique_ptr< IDProperty, IDPropertyDeleter > create(StringRef prop_name, int32_t value, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_INT, set its name and value.
std::unique_ptr< IDProperty, IDPropertyDeleter > create_group(StringRef prop_name, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_GROUP.
bool can_mark_single_from_context(const bContext *C)
uiLayout & block_layout(uiBlock *block, LayoutDirection direction, LayoutType type, int x, int y, int size, int em, int padding, const uiStyle *style)
bool RNA_property_path_from_ID_check(PointerRNA *ptr, PropertyRNA *prop)
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
void RNA_boolean_set(PointerRNA *ptr, const char *name, bool value)
PropertyType RNA_property_type(PropertyRNA *prop)
bool RNA_property_anim_editable(const PointerRNA *ptr, PropertyRNA *prop_orig)
std::string RNA_string_get(PointerRNA *ptr, const char *name)
int RNA_property_array_length(PointerRNA *ptr, PropertyRNA *prop)
bool RNA_property_is_idprop(const PropertyRNA *prop)
std::string RNA_property_string_get(PointerRNA *ptr, PropertyRNA *prop)
PropertySubType RNA_property_subtype(PropertyRNA *prop)
bool RNA_struct_property_is_set(PointerRNA *ptr, const char *identifier)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
const char * RNA_property_identifier(const PropertyRNA *prop)
eRNAOverrideStatus RNA_property_override_library_status(Main *bmain, PointerRNA *ptr, PropertyRNA *prop, const int index)
std::string RNA_path_property_py(const PointerRNA *ptr, PropertyRNA *prop, int index)
struct AssetMetaData * asset_data
blender::Vector< std::unique_ptr< uiBut > > buttons
blender::ui::AbstractViewItem * view_item
std::function< void(bContext &)> apply_func
std::function< std::string(const uiBut *)> tip_quick_func
uiMenuCreateFunc menu_create_func
blender::wm::OpCallContext opcontext
const bContextStore * context
bContextStore * context_store() const
void operator_context_set(blender::wm::OpCallContext opcontext)
void label(blender::StringRef name, int icon)
uiLayout & column(bool align)
void separator(float factor=1.0f, LayoutSeparatorType type=LayoutSeparatorType::Auto)
void enabled_set(bool enabled)
void menu_fn(blender::StringRefNull name, int icon, uiMenuCreateFunc func, void *arg)
void context_copy(const bContextStore *context)
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 menu(MenuType *mt, std::optional< blender::StringRef > name, int icon)
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)
#define EVT_TYPE_MASK_HOTKEY_INCLUDE
#define ISNDOF_BUTTON(event_type)
#define ISKEYBOARD(event_type)
#define EVT_TYPE_MASK_HOTKEY_EXCLUDE
#define EVT_TYPE_MASK_ALL
std::optional< std::string > WM_key_event_operator_string(const bContext *C, const char *opname, blender::wm::OpCallContext opcontext, IDProperty *properties, const bool is_strict)
void WM_keyconfig_update(wmWindowManager *wm)
wmKeyMapItem * WM_keymap_item_find_id(wmKeyMap *keymap, int id)
void WM_keymap_item_properties_reset(wmKeyMapItem *kmi, IDProperty *properties)
wmKeyMapItem * WM_keymap_add_item(wmKeyMap *keymap, const char *idname, const KeyMapItem_Params *params)
void WM_keymap_remove_item(wmKeyMap *keymap, wmKeyMapItem *kmi)
wmKeyMapItem * WM_key_event_operator(const bContext *C, const char *opname, blender::wm::OpCallContext opcontext, IDProperty *properties, const short include_mask, const short exclude_mask, wmKeyMap **r_keymap)
wmKeyMap * WM_keymap_guess_opname(const bContext *C, const char *opname)
std::string WM_operatortype_name(wmOperatorType *ot, PointerRNA *properties)
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)
std::optional< std::string > WM_context_path_resolve_property_full(const bContext *C, const PointerRNA *ptr, PropertyRNA *prop, int index)
std::optional< std::string > WM_context_path_resolve_full(bContext *C, const PointerRNA *ptr)