在使用awtk制作gui界面时会有很多的重复性代码,控件越多重复写的回调代码越多,为了提高效率编写了一个代码生成脚本。之前尝试过使用python编写,无奈对python理解不够,用起来十分困难,所以弃用python改为shell,一步到位。
如果有大神熟悉python使用python生成代码,欢迎共享一起探讨!!!
cnf.ini
[filename] //要生成的.c文件
set_work.c
[window] //当前窗口名字
set_work
[widget] //控件名字及控件所触发的事件类型
keybuz_sw:evt_value_changed
workbuz_sw:evt_value_changed
clr_headcnta:evt_click
btn_clrhm4hand:evt_click
shell脚本
#########################################################################
# File Name: test.sh
#!/bin/bash
export LANG=C.UTF-8
ini="cnf.ini"
window=
wiget=()
event=()
index=0
#awk 'END{print NR}' test1.sh
#sed -n '$=' test1.sh
row_num=`sed -n '$=' ${ini}`
#取出文件名,窗口名和控件事件名
# for i in $(seq 1 ${row_num})
for((i=1; i<=${row_num}; i++))
do
cnt=$i
name=`awk -vnvar="$cnt" '{if(NR == nvar) {print $1}}' ${ini}`
name=$(echo ${name} | sed 's/\r//')
# echo "------"${name} ${#name} "i: "${i}
if [ -z "${name}" -o "[widget]" = "${name}" ]; then
continue
elif [ "[window]" = ${name} ]; then
i=`expr $i + 1`
window=`awk '{if(NR == '${i}') {print $1}}' ${ini}`
window=$(echo ${window} | sed 's/\r//')
continue
elif [ "[filename]" = ${name} ]; then
i=`expr $i + 1`
filename=`awk '{if(NR == '${i}') {print $1}}' ${ini}`
filename=$(echo ${filename} | sed 's/\r//')
if [ -e ${filename} ]; then
touch ${filename}
fi
echo -e "#include <>" >> ${filename}
echo -e "#include \"\"\n" >> ${filename}
continue
fi
widget[index]=`awk -F: -vnvar="$cnt" '{if(NR == nvar) {print $1}}' ${ini}`
event_t=`awk -F: -vnvar="$cnt" '{if(NR == nvar) {print $2}}' ${ini}`
event[index]=$(echo ${event_t} | sed 's/\r//')
index=${index}+1
done
#控件枚举句柄
echo -e "enum {" >> ${filename}
for((i=0; i<${index}; i++))
do
#转换为大写
declare -u enum
enum="${window}_${widget[i]}"
echo -e "\t${enum}," >> ${filename}
done
declare -u win
win=${window}
echo -e "\tMAX_${win}_WIDGETS\n};\n" >> ${filename}
echo -e "static widget_t *g_widget_all[MAX_${win}_WIDGETS];\n" >> ${filename}
echo ">>>>>>>create enum finish"
#控件回调函数
for((i=0; i<${index}; i++))
do
widget_fc="""
static ret_t on_${widget[index]}(void* ctx, event_t* e)\n
{\n
\treturn RET_OK;\n
}\n
"""
echo -e ${widget_fc} >> ${filename}
done
echo ">>>>>>>create widget callback finish"
#控件遍历函数
callback_func="""
static ret_t ${window}_widget_foreach(void *ctx, const void *data)\n
{\n
\twidget_t* child = WIDGET(data);\n
\twidget_t* win = WIDGET(ctx);\n
\tglobal_t *global = get_global_data();\n
\n
\tif (child->name != NULL) {\n
\t\tconst char* name = child->name;\n
"""
echo -e ${callback_func} >> ${filename}
for((i=0; i<${index}; i++))
do
#转换为大写
declare -u evt
evt=${event[i]}
declare -u child
child=${window}_${widget[i]}
if [ $i == 0 ]; then
event_func="""
\t\tif (tk_str_eq(name, "${widget[i]}")) {\n
\t\t\tg_widget_all[${child}] = child;\n
\t\t\twidget_on(child, ${evt}, on_${widget[i]}, win);\n
\t\t}
"""
else
event_func="""
\t\telse if (tk_str_eq(name, \"${widget[i]}\")) {\n
\t\t\tg_widget_all[${child}] = child;\n
\t\t\twidget_on(child, ${evt}, on_${widget[i]}, win);\n
\t\t}
"""
fi
echo -e ${event_func} >> ${filename}
done
end_func="""
\t}\n
\treturn RET_OK;\n
}\n
"""
echo -e ${end_func} >> ${filename}
echo ">>>>>>>create foreach callback finish"
#foreach 回调设置 , 创建打开窗口函数
window_func="""
static ret_t ${window}_widget_install(widget_t *win)\n
{\n
\twidget_foreach(win, ${window}_widget_foreach, win);\n
\treturn RET_OK;\n
}\n
\n
void open_${window}_window(void)\n
{\n
\tglobal_t *global = get_global_data();\n
\topen_window_v2(global->window.${window}.str, NULL, ${window}_widget_install);\n
}\n
"""
echo -e ${window_func} >> ${filename}
echo ">>>>>>>create open window finish"
echo "--------Create ${filename} file complete----------"