/* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * The Original Code is Copyright (C) 2021 Blender Foundation. * All rights reserved. */ /** \file * \ingroup edinterface */ #include "BLI_vector.hh" #include "BKE_screen.h" #include "RNA_access.h" #include "ED_screen.h" #include "UI_interface.h" #include "UI_interface.hh" #include "UI_resources.h" #include "WM_api.h" namespace blender::ui { void context_path_add_generic(Vector &path, StructRNA &rna_type, void *ptr, const BIFIconID icon_override) { /* Add the null check here to make calling functions less verbose. */ if (!ptr) { return; } PointerRNA rna_ptr; RNA_pointer_create(nullptr, &rna_type, ptr, &rna_ptr); char name[128]; 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. */ const BIFIconID icon = icon_override == ICON_NONE ? static_cast(RNA_struct_ui_icon(rna_ptr.type)) : icon_override; path.append({name, static_cast(icon)}); } /* -------------------------------------------------------------------- */ /** \name Breadcrumb Template * \{ */ void template_breadcrumbs(uiLayout &layout, Span context_path) { uiLayout *row = uiLayoutRow(&layout, true); uiLayoutSetAlignment(&layout, UI_LAYOUT_ALIGN_LEFT); for (const int i : context_path.index_range()) { uiLayout *sub_row = uiLayoutRow(row, true); uiLayoutSetAlignment(sub_row, UI_LAYOUT_ALIGN_LEFT); if (i > 0) { uiItemL(sub_row, "", ICON_RIGHTARROW_THIN); } uiItemL(sub_row, context_path[i].name.c_str(), context_path[i].icon); } } } // namespace blender::ui /** \} */