awtk界面回调代码生成脚本

在使用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----------"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值