feat: 引入 Lua 配置系统实现 UI 参数热更新

- 添加 Lua 5.5 库支持,包含头文件和动态链接库
- 新增 lua_config 模块,提供配置初始化、获取字符串/整型值等功能
- 创建 config.lua 配置文件,集中管理所有 UI 文本、尺寸和布局参数
- 移除原有的硬编码 config.h,将 UI 常量迁移至 Lua 配置
- 修改主窗口、对话框和回调函数,动态读取 Lua 配置值
- 更新 CMakeLists.txt,添加 Lua 库依赖和 DLL 复制步骤
- 删除过时的 Makefile,统一使用 CMake 构建
This commit is contained in:
2026-03-25 19:18:23 +08:00
parent bd1b05be55
commit ce232cb024
17 changed files with 2017 additions and 147 deletions
+42 -41
View File
@@ -1,6 +1,6 @@
#include "ui/main_window.h"
#include "controller/callbacks.h"
#include "config.h"
#include "core/lua_config.h"
#include <stddef.h>
// 创建路径列表控件
@@ -9,8 +9,8 @@ static Ihandle *create_path_list(const char *name)
Ihandle *list = IupFlatList();
IupSetAttribute(list, "NAME", name);
IupSetAttribute(list, "EXPAND", "YES");
IupSetAttribute(list, "ITEMPADDING", UI_LIST_ITEM_PADDING);
IupSetAttribute(list, "BACKCOLOR", UI_LIST_BACKCOLOR);
IupSetAttribute(list, "ITEMPADDING", lua_config_get_string("list", "item_padding"));
IupSetAttribute(list, "BACKCOLOR", lua_config_get_string("list", "backcolor"));
IupSetAttribute(list, "BORDER", "YES");
IupSetAttribute(list, "CANFOCUS", "YES");
IupSetAttribute(list, "HLINE", "NO");
@@ -21,7 +21,7 @@ static Ihandle *create_path_list(const char *name)
}
// 创建主窗口
Ihandle* create_main_window(void)
Ihandle *create_main_window(void)
{
// 创建系统路径列表
Ihandle *list_sys = create_path_list("LIST_SYS");
@@ -32,7 +32,7 @@ Ihandle* create_main_window(void)
Ihandle *txt_search = IupText(NULL);
IupSetAttribute(txt_search, "NAME", "TXT_SEARCH");
IupSetAttribute(txt_search, "EXPAND", "HORIZONTAL");
IupSetAttribute(txt_search, "CUEBANNER", "输入关键词搜索...");
IupSetAttribute(txt_search, "CUEBANNER", lua_config_get_string("label", "search_placeholder"));
IupSetCallback(txt_search, "VALUECHANGED_CB", (Icallback)txt_search_cb);
// 创建选项卡
@@ -41,24 +41,24 @@ Ihandle* create_main_window(void)
IupVbox(list_user, NULL),
NULL);
IupSetAttribute(tabs_main, "NAME", "TABS_MAIN");
IupSetAttribute(tabs_main, "TABTITLE0", "系统变量 (System)");
IupSetAttribute(tabs_main, "TABTITLE1", "用户变量 (User)");
IupSetAttribute(tabs_main, "TABTITLE0", lua_config_get_string("label", "tab_sys"));
IupSetAttribute(tabs_main, "TABTITLE1", lua_config_get_string("label", "tab_user"));
IupSetAttribute(tabs_main, "TABTYPE", "TOP");
// 创建操作按钮
Ihandle *btn_new = IupButton("新建(N)", NULL);
Ihandle *btn_new = IupButton(lua_config_get_string("button", "new"), NULL);
IupSetAttribute(btn_new, "NAME", "BTN_NEW");
Ihandle *btn_edit = IupButton("编辑(E)", NULL);
Ihandle *btn_edit = IupButton(lua_config_get_string("button", "edit"), NULL);
IupSetAttribute(btn_edit, "NAME", "BTN_EDIT");
Ihandle *btn_browse = IupButton("浏览(B)...", NULL);
Ihandle *btn_browse = IupButton(lua_config_get_string("button", "browse"), NULL);
IupSetAttribute(btn_browse, "NAME", "BTN_BROWSE");
Ihandle *btn_del = IupButton("删除(D)", NULL);
Ihandle *btn_del = IupButton(lua_config_get_string("button", "del"), NULL);
IupSetAttribute(btn_del, "NAME", "BTN_DEL");
Ihandle *btn_up = IupButton("上移(U)", NULL);
Ihandle *btn_up = IupButton(lua_config_get_string("button", "up"), NULL);
IupSetAttribute(btn_up, "NAME", "BTN_UP");
Ihandle *btn_down = IupButton("下移(O)", NULL);
Ihandle *btn_down = IupButton(lua_config_get_string("button", "down"), NULL);
IupSetAttribute(btn_down, "NAME", "BTN_DOWN");
Ihandle *btn_clean = IupButton("一键清理", NULL);
Ihandle *btn_clean = IupButton(lua_config_get_string("button", "clean"), NULL);
IupSetAttribute(btn_clean, "NAME", "BTN_CLEAN");
// 设置按钮回调
@@ -71,13 +71,14 @@ Ihandle* create_main_window(void)
IupSetCallback(btn_clean, "ACTION", (Icallback)btn_clean_cb);
// 设置按钮大小
IupSetAttribute(btn_new, "RASTERSIZE", UI_BTN_RASTERSIZE);
IupSetAttribute(btn_edit, "RASTERSIZE", UI_BTN_RASTERSIZE);
IupSetAttribute(btn_browse, "RASTERSIZE", UI_BTN_RASTERSIZE);
IupSetAttribute(btn_del, "RASTERSIZE", UI_BTN_RASTERSIZE);
IupSetAttribute(btn_up, "RASTERSIZE", UI_BTN_RASTERSIZE);
IupSetAttribute(btn_down, "RASTERSIZE", UI_BTN_RASTERSIZE);
IupSetAttribute(btn_clean, "RASTERSIZE", UI_BTN_RASTERSIZE);
const char *btn_size = lua_config_get_string("button", "rastersize");
IupSetAttribute(btn_new, "RASTERSIZE", btn_size);
IupSetAttribute(btn_edit, "RASTERSIZE", btn_size);
IupSetAttribute(btn_browse, "RASTERSIZE", btn_size);
IupSetAttribute(btn_del, "RASTERSIZE", btn_size);
IupSetAttribute(btn_up, "RASTERSIZE", btn_size);
IupSetAttribute(btn_down, "RASTERSIZE", btn_size);
IupSetAttribute(btn_clean, "RASTERSIZE", btn_size);
// 创建操作按钮垂直布局
Ihandle *vbox_btns = IupVbox(
@@ -87,25 +88,25 @@ Ihandle* create_main_window(void)
IupFill(),
btn_up, btn_down,
NULL);
IupSetAttribute(vbox_btns, "GAP", UI_VBOX_GAP);
IupSetAttribute(vbox_btns, "MARGIN", UI_VBOX_MARGIN);
IupSetAttribute(vbox_btns, "GAP", lua_config_get_string("layout", "vbox_gap"));
IupSetAttribute(vbox_btns, "MARGIN", lua_config_get_string("layout", "vbox_margin"));
// 创建主窗口水平布局
Ihandle *hbox_main = IupHbox(tabs_main, vbox_btns, NULL);
IupSetAttribute(hbox_main, "GAP", UI_HBOX_GAP);
IupSetAttribute(hbox_main, "MARGIN", UI_HBOX_MARGIN);
IupSetAttribute(hbox_main, "GAP", lua_config_get_string("layout", "hbox_gap"));
IupSetAttribute(hbox_main, "MARGIN", lua_config_get_string("layout", "hbox_margin"));
// 创建状态标签
Ihandle *lbl_status = IupLabel("状态: 就绪");
Ihandle *lbl_status = IupLabel(lua_config_get_string("status", "normal"));
IupSetAttribute(lbl_status, "NAME", "LBL_STATUS");
IupSetAttribute(lbl_status, "EXPAND", "HORIZONTAL");
// 创建底部按钮
Ihandle *btn_ok = IupButton("确定", NULL);
Ihandle *btn_ok = IupButton(lua_config_get_string("button", "ok"), NULL);
IupSetAttribute(btn_ok, "NAME", "BTN_OK");
Ihandle *btn_cancel = IupButton("取消", NULL);
Ihandle *btn_cancel = IupButton(lua_config_get_string("button", "cancel"), NULL);
IupSetAttribute(btn_cancel, "NAME", "BTN_CANCEL");
Ihandle *btn_help = IupButton("帮助(?)", NULL);
Ihandle *btn_help = IupButton(lua_config_get_string("button", "help"), NULL);
IupSetAttribute(btn_help, "NAME", "BTN_HELP");
// 设置底部按钮回调
@@ -114,31 +115,31 @@ Ihandle* create_main_window(void)
IupSetCallback(btn_help, "ACTION", (Icallback)btn_help_cb);
// 设置底部按钮大小
IupSetAttribute(btn_ok, "RASTERSIZE", UI_BTN_RASTERSIZE);
IupSetAttribute(btn_cancel, "RASTERSIZE", UI_BTN_RASTERSIZE);
IupSetAttribute(btn_help, "RASTERSIZE", UI_BTN_RASTERSIZE);
IupSetAttribute(btn_ok, "RASTERSIZE", btn_size);
IupSetAttribute(btn_cancel, "RASTERSIZE", btn_size);
IupSetAttribute(btn_help, "RASTERSIZE", btn_size);
// 创建底部按钮水平布局
Ihandle *hbox_bottom = IupHbox(lbl_status, IupFill(), btn_help, btn_ok, btn_cancel, NULL);
IupSetAttribute(hbox_bottom, "GAP", UI_HBOX_GAP);
IupSetAttribute(hbox_bottom, "MARGIN", UI_HBOX_MARGIN);
IupSetAttribute(hbox_bottom, "ALIGNMENT", UI_HBOX_ALIGNMENT);
IupSetAttribute(hbox_bottom, "GAP", lua_config_get_string("layout", "hbox_gap"));
IupSetAttribute(hbox_bottom, "MARGIN", lua_config_get_string("layout", "hbox_margin"));
IupSetAttribute(hbox_bottom, "ALIGNMENT", lua_config_get_string("layout", "hbox_alignment"));
// 创建主窗口垂直布局
Ihandle *vbox_all = IupVbox(
IupLabel("环境变量编辑器:"),
IupLabel(lua_config_get_string("label", "title")),
txt_search,
hbox_main,
hbox_bottom,
NULL);
IupSetAttribute(vbox_all, "MARGIN", UI_VBOX_ALL_MARGIN);
IupSetAttribute(vbox_all, "GAP", UI_VBOX_ALL_GAP);
IupSetAttribute(vbox_all, "MARGIN", lua_config_get_string("layout", "vbox_all_margin"));
IupSetAttribute(vbox_all, "GAP", lua_config_get_string("layout", "vbox_all_gap"));
// 创建主窗口对话框
Ihandle *dlg = IupDialog(vbox_all);
IupSetAttribute(dlg, "TITLE", APP_NAME);
IupSetAttribute(dlg, "RASTERSIZE", UI_DLG_SIZE);
IupSetAttribute(dlg, "MINSIZE", UI_DLG_MINSIZE);
IupSetAttribute(dlg, "TITLE", lua_config_get_string("app", "name"));
IupSetAttribute(dlg, "RASTERSIZE", lua_config_get_string("dialog", "size"));
IupSetAttribute(dlg, "MINSIZE", lua_config_get_string("dialog", "minsize"));
IupSetAttribute(dlg, "MINBOX", "NO");
IupSetAttribute(dlg, "MAXBOX", "NO");