Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/interface/interface_context_path.cc
| Show All 11 Lines | |||||
| #include "RNA_access.h" | #include "RNA_access.h" | ||||
| #include "ED_screen.h" | #include "ED_screen.h" | ||||
| #include "UI_interface.h" | #include "UI_interface.h" | ||||
| #include "UI_interface.hh" | #include "UI_interface.hh" | ||||
| #include "UI_resources.h" | #include "UI_resources.h" | ||||
| #include "RNA_prototypes.h" | |||||
| #include "WM_api.h" | #include "WM_api.h" | ||||
| namespace blender::ui { | namespace blender::ui { | ||||
| void context_path_add_generic(Vector<ContextPathItem> &path, | void context_path_add_generic(Vector<ContextPathItem> &path, | ||||
| StructRNA &rna_type, | StructRNA &rna_type, | ||||
| void *ptr, | void *ptr, | ||||
| const BIFIconID icon_override) | const BIFIconID icon_override) | ||||
| { | { | ||||
| /* Add the null check here to make calling functions less verbose. */ | /* Add the null check here to make calling functions less verbose. */ | ||||
| if (!ptr) { | if (!ptr) { | ||||
| return; | return; | ||||
| } | } | ||||
| PointerRNA rna_ptr; | PointerRNA rna_ptr; | ||||
| RNA_pointer_create(nullptr, &rna_type, ptr, &rna_ptr); | RNA_pointer_create(nullptr, &rna_type, ptr, &rna_ptr); | ||||
| char name[128]; | char name[128]; | ||||
| RNA_struct_name_get_alloc(&rna_ptr, name, sizeof(name), nullptr); | RNA_struct_name_get_alloc(&rna_ptr, name, sizeof(name), nullptr); | ||||
| /* Use a blank icon by default to check whether to retrieve it automatically from the type. */ | /* Use a blank icon by default to check whether to retrieve it automatically from the type. */ | ||||
| const BIFIconID icon = icon_override == ICON_NONE ? | const BIFIconID icon = icon_override == ICON_NONE ? | ||||
| static_cast<BIFIconID>(RNA_struct_ui_icon(rna_ptr.type)) : | static_cast<BIFIconID>(RNA_struct_ui_icon(rna_ptr.type)) : | ||||
| icon_override; | icon_override; | ||||
| path.append({name, int(icon)}); | if (&rna_type == &RNA_NodeTree) { | ||||
| ID *id = (ID *)ptr; | |||||
| path.append({name, int(icon), id->us}); | |||||
| } | |||||
| else { | |||||
| path.append({name, int(icon), 1}); | |||||
| } | |||||
| } | } | ||||
| /* -------------------------------------------------------------------- */ | /* -------------------------------------------------------------------- */ | ||||
| /** \name Breadcrumb Template | /** \name Breadcrumb Template | ||||
| * \{ */ | * \{ */ | ||||
| void template_breadcrumbs(uiLayout &layout, Span<ContextPathItem> context_path) | void template_breadcrumbs(uiLayout &layout, Span<ContextPathItem> context_path) | ||||
| { | { | ||||
| uiLayout *row = uiLayoutRow(&layout, true); | uiLayout *row = uiLayoutRow(&layout, true); | ||||
| uiLayoutSetAlignment(&layout, UI_LAYOUT_ALIGN_LEFT); | uiLayoutSetAlignment(&layout, UI_LAYOUT_ALIGN_LEFT); | ||||
| for (const int i : context_path.index_range()) { | for (const int i : context_path.index_range()) { | ||||
| uiLayout *sub_row = uiLayoutRow(row, true); | uiLayout *sub_row = uiLayoutRow(row, true); | ||||
| uiLayoutSetAlignment(sub_row, UI_LAYOUT_ALIGN_LEFT); | uiLayoutSetAlignment(sub_row, UI_LAYOUT_ALIGN_LEFT); | ||||
| if (i > 0) { | if (i > 0) { | ||||
| uiItemL(sub_row, "", ICON_RIGHTARROW_THIN); | uiItemL(sub_row, "", ICON_RIGHTARROW_THIN); | ||||
| } | } | ||||
| uiItemL(sub_row, context_path[i].name.c_str(), context_path[i].icon); | uiBut *but = uiItemL_ex( | ||||
| sub_row, context_path[i].name.c_str(), context_path[i].icon, false, false); | |||||
| UI_but_icon_indicator_number_set(but, context_path[i].icon_indicator_number); | |||||
| } | } | ||||
| } | } | ||||
| /** \} */ | /** \} */ | ||||
| } // namespace blender::ui | } // namespace blender::ui | ||||