Breadcrumb 路径导航条,显示当前层级位置,支持可点击项、自定义分隔符、图标分隔符。
Breadcrumb 水平排列路径节点:
• Item:每个节点有文本、可点击标志、关联值
• Separator:节点间分隔符(文本 "/" 或图标)
• Click:点击可跳转层级(最后一项通常不可点击)
• 常用于文件管理器地址栏、设置层级导航
| 函数 | 说明 |
|---|---|
int xuiBreadcrumbCreate(xui_context pCtx, xui_widget* ppW, const xui_breadcrumb_desc_t* pDesc) | 创建面包屑 |
int xuiBreadcrumbAddItem(xui_widget pW, const char* sText, int bClickable, int iValue) | 添加项 |
int xuiBreadcrumbSetItems(xui_widget pW, const xui_breadcrumb_item_t* pItems, int iCount) | 批量设置 |
int xuiBreadcrumbClearItems(xui_widget pW) | 清空 |
int xuiBreadcrumbSetSeparator(xui_widget pW, const char* sSep) | 文本分隔符 |
int xuiBreadcrumbSetSeparatorIcon(xui_widget pW, xui_surface pSurf, xui_rect_t tSrc, float fSize) | 图标分隔符 |
int xuiBreadcrumbSetClick(xui_widget pW, onClick, void* pUser) | 点击回调 |
int xuiBreadcrumbSetTextColors(xui_widget pW, uint32_t iN, uint32_t iH, uint32_t iA, uint32_t iD) | 文本颜色 |
int xuiBreadcrumbSetMetrics(xui_widget pW, float fGap, float fPadX, float fPadY) | 间距 |
int xuiBreadcrumbGetHoverIndex(xui_widget pW) | 悬停索引 |
gcc -O2 -I. -o ch153.exe ch153_main.c src\xui_*.c build\xge.lib -lm -lws2_32 -liphlpapi -lgdi32 -luser32 -lshell32 -lopengl32 -lole32 -lwinmm -lavrt
.\ch153.exe
xui_breadcrumb_desc_t desc = { 0 };
xui_widget pCrumb;
xuiBreadcrumbCreate(pCtx, &pCrumb, &desc);
// 添加路径节点
xuiBreadcrumbAddItem(pCrumb, "C:", 1, 0);
xuiBreadcrumbAddItem(pCrumb, "Users", 1, 1);
xuiBreadcrumbAddItem(pCrumb, "Admin", 1, 2);
xuiBreadcrumbAddItem(pCrumb, "Desktop", 0, 3); // 当前目录不可点击
// 分隔符
xuiBreadcrumbSetSeparator(pCrumb, "›");
// 点击回调:导航到对应层级
xuiBreadcrumbSetClick(pCrumb, OnCrumbClick, NULL);
xuiWidgetAddChild(pToolbar, pCrumb);
static void OnCrumbClick(xui_widget pW, int iIndex, int iValue, void* pUser) {
// 截断路径到 iIndex 层级
NavigateToLevel(iValue);
}将以下代码保存为 ch153_main.c,编译后运行即可看到面包屑导航效果:
#include "xge.h"
#include "xui.h"
#include <stdio.h>
static xui_context g_pCtx;
static void onCrumb(xui_widget pW, int iIdx, int iVal, void* p) {
(void)pW; (void)p;
printf("导航到层级 %d (value=%d)\n", iIdx, iVal);
}
static int onFrame(void* pUser) {
(void)pUser;
xgeClear(0x081114FF);
float mx, my;
xgeMouseGet(&mx, &my);
xuiInputPointerMove(g_pCtx, mx, my);
if (xgeMouseDown(XGE_MOUSE_LEFT))
xuiInputPointerDown(g_pCtx, 0);
else
xuiInputPointerUp(g_pCtx, 0);
xuiUpdate(g_pCtx, xgeGetDelta());
xuiLayout(g_pCtx);
xuiRender(g_pCtx, NULL, NULL, 0);
return XGE_OK;
}
int main(void) {
xge_desc_t d = { 0 };
d.iWidth = 800; d.iHeight = 600;
d.sTitle = "ch153 - Breadcrumb";
d.iFlags = XGE_INIT_VSYNC;
xgeInit(&d);
xuiCreate(&g_pCtx);
extern const xui_proxy_t tXgeProxy;
xui_proxy_t tXgeProxy = xuiProxyXge();
xuiSetProxy(g_pCtx, &tXgeProxy);
xuiSetViewportSize(g_pCtx, 800, 600);
xui_widget pRoot;
xuiWidgetCreate(g_pCtx, &pRoot);
xuiWidgetSetLayoutType(pRoot, XUI_LAYOUT_COLUMN);
xuiWidgetSetRect(pRoot, (xui_rect_t){0, 0, 800, 600});
xuiWidgetSetPadding(pRoot, 40, 40, 40, 40);
/* 间距:用内联样式或子控件布局参数设置 */
xuiSetRootWidget(g_pCtx, pRoot);
/* 创建面包屑 */
xui_breadcrumb_desc_t bd = { 0 };
xui_widget pCrumb;
xuiBreadcrumbCreate(g_pCtx, &pCrumb, &bd);
xuiBreadcrumbSetSeparator(pCrumb, "\xE2\x80\xBA");
xuiBreadcrumbSetClick(pCrumb, onCrumb, NULL);
xuiWidgetAddChild(pRoot, pCrumb);
/* 添加路径节点 */
xuiBreadcrumbAddItem(pCrumb, "C:", 1, 0);
xuiBreadcrumbAddItem(pCrumb, "Users", 1, 1);
xuiBreadcrumbAddItem(pCrumb, "Admin", 1, 2);
xuiBreadcrumbAddItem(pCrumb, "Desktop", 0, 3);
xgeRun(onFrame, NULL);
xuiDestroy(g_pCtx);
xgeUnit();
return 0;
}