AWTK-MVVM学习(一):设计图书管理系统的Model

一、前言

最近要使用MVVM框架实现图书管理系统的AWTK GUI界面,因此需要学习awtk-mvvm,该项目的说明文档非常详尽,本文仅记录学习awtk-mvvm过程中的要点,并不作为教程,更详细且严谨的请参考awtk-mvvm/docs下的md文档,相信各位也会大有所获。

awtk-mvvm仓库:http://github.com/zlgopen/awtk-mvvm

二、什么是MVVM?

MVVM是Model-View-ViewModel的简写。它本质上就是MVC的改进版。MVVM就是将其中的View的状态和行为抽象化,将界面UI和业务逻辑分开,这件事是ViewModel帮我们做的,它可以取出Model的数据,同时帮忙处理View中涉及的业务逻辑(通常是涉及显示内容的处理)。

更多关于MVVM的知识请参考:awtk-mvvm/docs/8.intro.md 中的8.2.3章节

在这里插入图片描述

三、什么是AWTK-MVVM?

AWTK-MVVM是一套用C语言开发的,专门为嵌入式平台优化的MVVM框架。它实现了数据绑定、命令绑定和窗口导航等基本功能,使用AWTK-MVVM开发应用程序,无需学习AWTK本身的API,只需学习绑定规则和模型的实现方式即可。

AWTK-MVVM具备代码小、性能高、易调试和隔离彻底等优势,还支持C语言和JS语言开发,但目前不支持界面元素动态生成,当然这个可以通过传统的开发方式解决。

更多关于AWTK-MVVM的相关说明请参考:awtk-mvvm/docs/8.intro.md 中的8.3章节

四、设计图书管理系统的Model

1、简介

用 AWTK-MVVM 开发应用程序时,开发者的主要工作是编写Model的代码,而ViewModel则由代码产生器自动生成。需要注意的是在编写Model的代码时,要按照固定的规则来编写注释,这些注释的规则在AWTK本身及相关项目中广泛使用,这是重中之重,因为若不按照规则编写注释或者写错、漏写,都会导致自动生成的ViewModel代码有误,影响后续开发。

2、设计需求

此处设计一个图书管理系统的Model,其界面如图所示,需要包含刷新、增删改查、清除、退出功能(函数),并且该界面中需要同步图书列表的行数,因此需要包含一个items属性,用于保存当前界面上图书的总数。

在这里插入图片描述

3、Model代码

图书管理系统的Model命名为book_controller,其头文件为book_controller.h,代码如下:

注意:items属性是写在注释中的,其本体为book_manager_t中动态数组的size,这种属性在awtk-mvvm中被称为合成属性。

//book_controller.h
#ifndef BOOK_CONTROLLER_H
#define BOOK_CONTROLLER_H

#include "tkc/types_def.h"
#include "../../src/book/book_manager.h"

BEGIN_C_DECLS

/**
 * @class book_controller_t
 *
 * @annotation ["model"]
 * 图书管理系统控制器。
 *
 */
typedef struct _book_controller_t {
  /**
   * @property {uint32_t} items
   * @annotation ["fake", "readable"]
   * 图书总数。
   */

  /* private */
  book_manager_t* bm;
} book_controller_t;

/**
 * @method book_controller_create
 * 创建book_controller对象。
 *
 * @annotation ["constructor"]
 * @return {book_controller_t*} 返回book_controller对象。
 */
book_controller_t* book_controller_create(void);

/**
 * @method book_controller_destroy
 * 销毁book_controller对象。
 *
 * @annotation ["destructor"]
 * @param {book_controller_t*} bc book_controller对象。
 *
 * @return {ret_t} 返回RET_OK表示成功,否则表示失败。
 */
ret_t book_controller_destroy(book_controller_t* bc);

/**
 * @method book_controller_get_items
 * 获取图书总数。
 *
 * @param {book_controller_t*} bc book_controller对象。
 *
 * @return {uint32_t} 返回图书总数。
 */
uint32_t book_controller_get_items(book_controller_t* bc);

/**
 * @method book_controller_refresh
 * 刷新图书
 *
 * @annotation ["command"]
 * @param {book_store_t*} bc book_controller对象。
 *
 * @return {ret_t} 返回RET_ITEMS_CHANGED表示模型有变化,View需要刷新;返回其它表示失败。
 */
ret_t book_controller_refresh(book_controller_t* bc);

/**
 * @method book_controller_add
 * 增加一本图书。
 *
 * @annotation ["command"]
 * @param {book_controller_t*} bc book_controller对象。
 *
 * @return {ret_t} 返回RET_ITEMS_CHANGED表示模型有变化,View需要刷新;返回其它表示失败。
 */
ret_t book_controller_add(book_controller_t* bc);

/**
 * @method book_controller_remove
 * 删除指定id的图书。
 *
 * @annotation ["command"]
 * @param {book_controller_t*} bc book_controller对象。
 * @param {int32_t} id 图书id。
 *
 * @return {ret_t} 返回RET_ITEMS_CHANGED表示模型有变化,View需要刷新;返回其它表示失败。
 */
ret_t book_controller_remove(book_controller_t* bc, int32_t id);

/**
 * @method book_controller_update
 * 修改指定id的图书。
 *
 * @annotation ["command"]
 * @param {book_controller_t*} bc book_controller对象。
 * @param {int32_t} id 图书id。
 *
 * @return {ret_t} 返回RET_ITEMS_CHANGED表示模型有变化,View需要刷新;返回其它表示失败。
 */
ret_t book_controller_update(book_controller_t* bc, int32_t id);

/**
 * @method book_controller_find
 * 查找指定id的图书。
 *
 * @annotation ["command"]
 * @param {book_controller_t*} bc book_controller对象。
 * @param {int32_t} id 图书id。
 *
 * @return {ret_t} 返回RET_ITEMS_CHANGED表示模型有变化,View需要刷新;返回其它表示失败。
 */
ret_t book_controller_find(book_controller_t* bc, int32_t id);

/**
 * @method book_controller_clear
 * 清除图书。
 *
 * @annotation ["command"]
 * @param {book_controller_t*} bc book_controller对象。
 *
 * @return {ret_t} 返回RET_ITEMS_CHANGED表示模型有变化,View需要刷新;返回其它表示失败。
 */
ret_t book_controller_clear(book_controller_t* bc);

/**
 * @method book_controller_quit
 * 退出。
 *
 * @annotation ["command"]
 * @param {book_controller_t*} bc book_controller对象。
 *
 * @return {ret_t} 返回RET_OK表示成功,否则表示失败。
 */
ret_t book_controller_quit(book_controller_t* bc);

END_C_DECLS

#endif /*BOOK_CONTROLLER_H*/

仔细观察代码注释中的 annotation 参数,具体说明如下:

属性/函数注释 annotation 参数说明
属性readable可读的(需实现get函数)
属性writable可写的(需实现set函数)
属性fake合成属性(即该属性由其他属性合成)
函数constructor构造函数
函数destructor析构函数
函数command命令函数

更多关于AWTK-MVVM框架Model代码注释规则和函数命名方式的知识请查阅:awtk-mvvm/docs/model.md

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AWTK开发手册-AWTK开发实践指南-中文手册.pdf AWTK = Toolkit AnyWhere 随着手机、智能手表等便携式设备的普及,用户对 GUI 的要求越来越高,嵌入式系统对高性能、高可靠性、低功耗、美观炫酷的 GUI 的需求也越来越迫切,ZLG开源 GUI 引擎 AWTK 应运而生。AWTK 全称为 Toolkit AnyWhere,是 ZLG 倾心打造的一套基于 C 语言开发的 GUI 框架。旨在为用户提供一个功能强大、高效可靠、简单易用、可轻松做出炫酷效果的 GUI 引擎,并支持跨平台同步开发,一次编程,终生使用。 最终目标: 支持开发嵌入式软件。 支持开发Linux应用程序。 支持开发MacOS应用程序。 支持开发Windows应用程序。 支持开发Android应用程序。 支持开发iOS应用程序。 支持开发2D游戏。 其主要特色有: 小巧。在精简配置下,不依赖第三方软件包,仅需要32K RAM + 256K FLASH即可开发一些简单的图形应用程序。 高效。采用脏矩形裁剪算法,每次只绘制和更新变化的部分,极大提高运行效率和能源利用率。 稳定。通过良好的架构设计和编程风格、单元测试、动态(valgrind)检查和Code Review保证其运行的稳定性。 丰富的GUI组件。提供窗口、对话框和各种常用的组件(用户可以配置自己需要的组件,降低对运行环境的要求)。 支持多种字体格式。内置位图字体(并提供转换工具),也可以使用stb_truetype或freetype加载ttf字体。 支持多种图片格式。内置位图图片(并提供转换工具),也可以使用stb_image加载png/jpg等格式的图片。 紧凑的二进制界面描述格式。可以手工编辑的XML格式的界面描述文件,也可以使用Qt Designer设计界面,然后转换成紧凑的二进制界面描述格式,提高运行效率,减小内存开销。 支持主题并采用紧凑的二进制格式。开发时使用XML格式描述主题,然后转换成紧凑的二进制格式,提高运行效率,减小内存开销。 支持裸系统,无需OS和文件系统。字体、图片、主题和界面描述数据都编译到代码中,以常量数据的形式存放,运行时无需加载到内存。 内置nanovg实现高质量的矢量动画,并支持SVG矢量图。 支持窗口动画、控件动画、滑动动画和高清LCD等现代GUI常见特性。 支持国际化(Unicode、字符串翻译和输入法等)。 可移植。支持移植到各种RTOS和嵌入式Linux系统,并通过SDL在各种流行的PC/手机系统上运行。 脚本化。从API注释中提取API的描述信息,通过这些信息可以自动生成各种脚本的绑定代码。 支持硬件2D加速(目前支持STM32的DMA2D和NXP的PXP)和GPU加速(OpenGL/OpenGLES/DirectX/Metal),充分挖掘硬件潜能。 丰富的文档和示例代码。 采用LGPL协议开源发布,在商业软件中使用时无需付费。 目前核心功能已经完成,内部开始在实际项目中使用了,欢迎有兴趣的朋友评估和尝试,期待您的反馈。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值