GUILIST_ITEM_INFO_T *item_info_ptr
│
├─void* ctrl_ptr[GUIITEM_CONTENT_MAX_NUM]; //每个元素都可能内嵌控件
├─MMI_STRING_T text_buffer; //使用大内存管理所有buffer
└─GUILIST_ITEM_T item; //用户传入的item
│
├─GUIITEM_STYLE_E item_style; // item风格,可以指示出列表项是几行的,
│ // 每行有几项内容及内容的类型(图片或文字)
│ // 根据这个风格的指示,可以从s_item_style_table中
│ // 取出风格所对应的GUIITEM_STYLE_T
├─GUIITEM_STATE_T item_state; // item状态
├─GUILIST_ITEM_DATA_T* item_data_ptr; // item数据
│ │
│ ├─MMI_TEXT_ID_T softkey_id[GUISOFTKEY_BUTTON_NUM]; // softkey对应的文字资源id
│ └─GUIITEM_CONTENT_T item_content[GUIITEM_CONTENT_MAX_NUM]; // item的content,
│ │ // 最多支持双行5/6个content
│ │
│ ├─GUIITEM_DATA_TYPE_E item_data_type; // content数据类型,文字或图片
│ └─GUIITEM_DATA_U item_data; // content数据结构,存放具体的文字/图片的ID或指针
│
└─uint32 user_data; /*!< 用户自定义数据*/
GUIITEM_STYLE_T
│
├─GUIITEM_THEME_ID_E content_theme_id[GUIITEM_CONTENT_MAX_NUM]; // 列表item中各content的主题
├─GUIITEM_CONTENT_STATE_T content_state[GUIITEM_CONTENT_MAX_NUM]; //item content state
├─GUIITEM_LAYOUT_ID_E layout_id; //item layout id
└─uint16 main_index; //item main index, use for scroll
GUIITEM_LAYOUT_DATA_T
│
├─uint16 item_height; //item height
├─GUI_RECT_T item_content_rect[GUIITEM_CONTENT_MAX_NUM]; //item content rect
├─GUI_RECT_T item_select_icon_rect; //item selected icon rect
└─GUI_RECT_T item_num_icon_rect; //item num icon rect
画ListItem的基本流程
DrawListItem
├─GetItemInfoPtr 获取项数据的指针 item_info_ptr
├─若列表控件需要在窗口中插入项数据,而且当前项数据的指针为空,则SendNotify到窗口函数
├─MMITHEME_GetItemStyle 获取item_style_ptr GUIITEM_STYLE_T
├─GetItemThemeState 判断列表项的主题状态,如正常、高亮、无效、高亮无效
├─GetSelectIconId
├─GetNumberIconId
├─根据主题状态和GUIITEM_STYLE_T中的layout_id,从s_item_layout_id_table中提取合适的GUIITEM_LAYOUT_DATA_T
├─若整个item仅作为分隔符,则画出分隔符的背景
├─若item需要分隔线,则画分隔线
├─若需要画数字图标,则画出图标
├─画出item中的所有content
│ │
│ ├─根据列表item的主题状态和当前content的主题,来获取当前content的主题数据,如字体、颜色、字符间隔
│ ├─从GUIITEM_LAYOUT_DATA_T中提取content的区域,这个区域是相对于item区域而言的
│ ├─根据显示方向(左向右或者右向左),调整content的区域为相对于屏幕的区域
│ └─根据content数据的类型(文字或图片)进行显示
│
└─若需要画选择图标,则画出图标