123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- /** @~english
- @page pg-mv-model Model-View framework
- @brief A overview of the Model-View framework
- @section Glossary
- @li view: widget dedicated to show the data. It could be a graph, list etc.
- @li model: abstraction and combination of data.
- @li data: things that needed to be delivered or shown. It could be a array of
- votage values which is sampled from a AD in an interval. Or it could be the
- attributes of all the files in a folder.
- @section Design considerations and implementations
- @li one model can respond to more than one views. one view can connect to
- more than one models.
- @li It is guaranteed that the change events of a model will be sent to all
- the registered views.
- @li Because there are so many formats of data, Model-View neither specify the
- format data is stored nor try to abstract them. The only thing stored in
- model is a pointer to the underlaying data. It is the responsibility of
- inherited classed to implement the boxing/un-boxing operations.
- @li Data can be multi-dimensional. The "dimension" does not only means
- dimension geometry. It can also means attributes. For example, a folder could
- have two attributes which are name and icon. So it's two-dimensional. If take
- the size into consideration, it will be three-dimensional. The size of
- dimension is saved in model. Each dimension is correspond to a pointer to some
- sort of data. Model can save many of them. As above, model does not make
- assumptions on the underlaying data structure. It only provide mechanism, not
- policy and leave that to the inherited classes.
- @section Events
- @li model has a record of registered views. When data changes, model notify
- views the change by sending events. The event contains the id of the model,
- the id of target view, the scope of changed data.
- @li views can handle the event by retrieve data from model, and update
- themselves according to the scope that data has changed. The connected model
- views should have the same presentation of data structure. Views should also
- restore all the models it interested. In the case of repainting, it should
- re-retrieve data from those models.
- @li model send events by rtgui_send. So it's suitable for the synchronization
- between threads and even could be used in ISR.
- */
- /** @~chinese
- @page pg-mv-model Model-View 框架
- @brief 对于 Model-View 框架的简介
- @section 名词解释
- @li view:用于显示数据的控件。可以是诸如图表控件、列表控件的控件。
- @li model:对于数据的组合和抽象。
- @li 数据:需要显示或传递的数据。它可以是每隔一段时间就从AD读取的电压值,也可
- 以是一个目录下所有文件的属性列表。
- @section 设计原则和实现
- @li 一个 model 可以对应多个view。一个view可以对应多个 model。
- @li 保证 model 的更新事件会同时发送到所有注册的 view 上。
- @li 因为数据的形式与内容千差万别,所以 Model-View 不规定数据的存储形式,也不对其进
- 行抽象。只在 model 中保留指向第一个数据的指针。打包/解包由从m odel/view 派生出
- 的子类实现。
- @li 数据源可以是多维的。这里的维度指的不只是几何的维度,而且可以是属性。比如
- 一个目录,它可以有名称、图标两个属性,那么它就是两维的。如果加入大小这个属性
- ,就是三维的。 model 内部存储数据的维度大小。一个维度对应一个数据首地址的指针
- 。model 中可以存储多个数据首地址。model 对底层数据结构不作假设。只提供机制,不
- 提供策略。只保证能够多维,但把具体的实现方式留给子类实现。
- @subsection 事件
- @li model 内部记录对自己感兴趣的 view。在数据变化时,用事件通知所有相关 view。事
- 件内容包含:自己的 id;目标 view 的 id;所变化数据的 index 范围。
- @li view 收到事件之后通过 model id 拿到数据并根据事件中的变化范围更新自己。对于
- 指针的数据类型转换需要自己实现并保证和 model 一致。view 内部保存与自己相关的
- model id,在需要重绘的时候要从所有相关 model 提取数据。
- @li model 通过 rtgui_send 给 view 发送事件。使得这个模型适用于线程间同步,也
- 可以在中断上下文里通知事件的发生。
- */
|