CodeEdit 代码编辑器控件,采用文档/视图/边栏分离架构,支持多语言、主题、Provider 扩展。
CodeEdit 是专业代码编辑器,核心架构分层:
• Document:文本存储(xui_code_document),管理行/偏移/Undo
• Selection:选区模型(xui_code_selection_model),多光标
• Theme:语法着色主题(xui_code_theme)
• Margin:边栏(行号/标记/折叠/诊断)
• Provider:补全/悬停/签名/命令扩展
• CommandMap:快捷键→命令映射
| 函数 | 说明 |
|---|---|
int xuiCodeEditCreate(xui_context pCtx, xui_widget* ppW, const xui_code_edit_desc_t* pDesc) | 创建编辑器 |
xui_code_document xuiCodeEditGetDocument(xui_widget pW) | 获取文档 |
xui_code_selection_model xuiCodeEditGetSelection(xui_widget pW) | 获取选区 |
int xuiCodeEditSetTheme(xui_widget pW, xui_code_theme pTheme) | 设置主题 |
int xuiCodeEditSetLanguage(xui_widget pW, const char* sLanguage) | 设置语言 |
int xuiCodeEditSetText(xui_widget pW, const char* sText) | 设置文本 |
int xuiCodeEditLoadTextFile(xui_widget pW, const char* sPath, int iCharset) | 加载文件 |
int xuiCodeEditSetFont(xui_widget pW, xui_font pFont) | 字体 |
xui_code_margin_model xuiCodeEditGetMargins(xui_widget pW) | 边栏模型 |
xui_code_provider_set xuiCodeEditGetProviders(xui_widget pW) | Provider 集 |
xui_code_command_map xuiCodeEditGetCommandMap(xui_widget pW) | 快捷键映射 |
gcc -O2 -I. -o ch173.exe ch173_main.c src\xui_*.c build\xge.lib -lm -lws2_32 -liphlpapi -lgdi32 -luser32 -lshell32 -lopengl32 -lole32 -lwinmm -lavrt
.\ch173.exe
xui_code_edit_desc_t desc = { 0 };
xui_widget pEditor;
xuiCodeEditCreate(pCtx, &pEditor, &desc);
// 设置等宽字体
xuiCodeEditSetFont(pEditor, pMonoFont);
// 默认边栏:行号 + 折叠
xuiCodeEditSetDefaultMargins(pEditor, 1, 0, 1, 0);
// 设置语言
xuiCodeEditSetLanguage(pEditor, "c");
// 加载文件
xuiCodeEditLoadTextFile(pEditor, "main.c", 0);
// Tab 设置
xuiCodeEditSetTabColumns(pEditor, 4);
xuiCodeEditSetExpandTabs(pEditor, 1);
xuiWidgetAddChild(pCenterDock, pEditor);将以下代码保存为 ch173_main.c,编译后运行即可看到一个带行号和折叠栏的代码编辑器:
#include "xge.h"
#include "xui.h"
static xui_context g_pCtx;
static int onFrame(void* pUser) {
(void)pUser;
xgeClear(0x1E1E1EFF);
xui_vec2_t pos;
xgeMouseGet(&pos.x, &pos.y);
xuiInputPointerMove(g_pCtx, pos.x, pos.y);
if (xgeMouseDown(XGE_MOUSE_LEFT))
xuiInputPointerDown(g_pCtx, pos.x, pos.y, 0);
else
xuiInputPointerUp(g_pCtx, pos.x, pos.y, 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 = 900; d.iHeight = 640;
d.sTitle = "ch173 - CodeEdit";
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, 900, 640);
// 创建代码编辑器
xui_code_edit_desc_t desc = { 0 };
xui_widget pEditor;
xuiCodeEditCreate(g_pCtx, &pEditor, &desc);
// 行号 + 折叠边栏
xuiCodeEditSetDefaultMargins(pEditor, 1, 0, 1, 0);
// C 语言高亮
xuiCodeEditSetLanguage(pEditor, "c");
// 设置示例文本
const char* sCode =
"#include <stdio.h>\n"
"\n"
"int main(void) {\n"
" printf(\"Hello XGE!\\n\");\n"
" return 0;\n"
"}\n";
xuiCodeEditSetText(pEditor, sCode);
// Tab = 4 空格
xuiCodeEditSetTabColumns(pEditor, 4);
xuiCodeEditSetExpandTabs(pEditor, 1);
// 加入控件树
xui_widget pRoot = xuiGetRootWidget(g_pCtx);
xuiWidgetAddChild(pRoot, pEditor);
xuiWidgetSetRect(pEditor, (xui_rect_t){0, 0, 900, 640});
xgeRun(onFrame, NULL);
xuiDestroy(g_pCtx);
xgeUnit();
return 0;
}