📄 im_gui.c
字号:
// TODO: must consider scrollbar absence
if (((S8)r2lMMIFlag))
{
*x += m->vbar.width + GUI_MENUITEM_X2_GAP;
}
if (item_index <= m->first_displayed_item)
{
*y = total_height;
return;
}
for (i = m->first_displayed_item; i <= m->last_displayed_item; i++)
{
IM_current_fixed_list_display_index = i;
m->item_measure_function(m->items[i], m->common_item_data, &iwidth, &iheight);
total_height += iheight;
if (i + 1 == item_index)
{
*y = total_height;
return;
}
}
*y = total_height;
}
/*****************************************************************************
* FUNCTION
* IM_gui_fixed_list_menu_scroll_by_pen
* DESCRIPTION
* Scroll the menu by pen.
* PARAMETERS
* m [IN] fixed list menu object
* first_displayed [IN] first displayed item index
* menu_event [OUT] pen event result
* RETURNS
* void
*****************************************************************************/
static void IM_gui_fixed_list_menu_scroll_by_pen(fixed_list_menu *m, S32 first_displayed, gui_list_pen_enum *menu_event)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
S32 total_height = 0, i;
S32 iwidth, iheight;
S32 last_displayed = m->n_items - 1;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
if (first_displayed > m->highlighted_item)
{
m->flags |= UI_LIST_MENU_FIRST_SHIFT_HIGHLIGHTED_ITEM;
IM_gui_fixed_list_menu_goto_item(m, first_displayed);
m->flags &= ~UI_LIST_MENU_FIRST_SHIFT_HIGHLIGHTED_ITEM;
*menu_event = GUI_LIST_PEN_HIGHLIGHT_CHANGED;
}
else
{
for (i = first_displayed; i < m->n_items; i++)
{
IM_current_fixed_list_display_index = i;
m->item_measure_function(m->items[i], m->common_item_data, &iwidth, &iheight);
total_height += iheight;
if (total_height > m->height + 1)
{
last_displayed = i - 1;
break;
}
}
if (i == m->n_items)
{
last_displayed = m->n_items - 1;
}
if (last_displayed < m->highlighted_item)
{
m->flags |= UI_LIST_MENU_LAST_SHIFT_HIGHLIGHTED_ITEM;
IM_gui_fixed_list_menu_goto_item(m, last_displayed);
m->flags &= ~UI_LIST_MENU_LAST_SHIFT_HIGHLIGHTED_ITEM;
*menu_event = GUI_LIST_PEN_HIGHLIGHT_CHANGED;
}
else
{
m->first_displayed_item = first_displayed;
m->last_displayed_item = last_displayed;
*menu_event = GUI_LIST_PEN_NEED_REDRAW;
}
}
}
/*****************************************************************************
* FUNCTION
* IM_gui_fixed_list_menu_translate_pen_event
* DESCRIPTION
* Pen event handler of the fixed list menu.
* PARAMETERS
* m [IN] fixed list menu object
* pen_event [IN] pen event type
* x [IN] pen x
* y [IN] pen y
* menu_event [OUT] pen event result
* RETURNS
* Return MMI_TRUE if the pen event is handled; otherwise, MMI_FALSE.
*****************************************************************************/
BOOL IM_gui_fixed_list_menu_translate_pen_event(
fixed_list_menu *m,
mmi_pen_event_type_enum pen_event,
S16 x,
S16 y,
gui_list_pen_enum *menu_event)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
BOOL ret;
gui_list_pen_state_struct *pen_state;
gui_scrollbar_pen_enum scrollbar_event;
gui_pen_event_param_struct scrollbar_param;
gui_list_pen_enum menuitem_event;
gui_pen_event_param_struct menuitem_param;
S32 item_index;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
pen_state = &m->pen_state;
ret = MMI_TRUE;
GUI_PEN_EVENT_PARAM_SET_INTEGER2((&menuitem_param), 0, GUI_LIST_PEN_NONE);
*menu_event = GUI_LIST_PEN_NONE;
if (m->flags & UI_LIST_MENU_DISABLE_PEN)
{
return MMI_FALSE;
}
if (pen_event != MMI_PEN_EVENT_DOWN && pen_state->pen_on_scrollbar)
{
gui_vertical_scrollbar_translate_pen_event(&m->vbar, pen_event, x, y, &scrollbar_event, &scrollbar_param);
if (scrollbar_event == GUI_SCROLLBAR_PEN_JUMP_TO_I)
{
IM_gui_fixed_list_menu_scroll_by_pen(m, scrollbar_param._u.i, menu_event);
}
}
else if (pen_event != MMI_PEN_EVENT_DOWN && pen_state->handled_by_menu_item)
{
/* For example, tap down on checkbox of two-state menuitem, the subsequent move/up events are discarded */
S32 item_x, item_y;
IM_gui_fixed_list_menu_get_menuitem_position(m, m->highlighted_item, &item_x, &item_y);
GUI_PEN_EVENT_PARAM_SET_INTEGER2((&menuitem_param), m->highlighted_item, GUI_LIST_PEN_NONE);
m->item_pen_function(
m->items[m->highlighted_item],
m->common_item_data,
item_x,
item_y,
pen_event,
x,
y,
&menuitem_event,
&menuitem_param);
if (menuitem_event == GUI_TWOSTATE_PEN_TOGGLE)
{
menuitem_event = GUI_LIST_PEN_ITEM_SELECTED;
}
*menu_event = menuitem_event;
}
else
{
switch (pen_event)
{
case MMI_PEN_EVENT_DOWN:
if (PEN_CHECK_BOUND(x, y, m->x, m->y, m->width, m->height))
{
pen_state->handled_by_menu_item = 0;
pen_state->pen_on_scrollbar = 0;
if (m->n_items <= 0)
{
/* In current design, scrollbar is hidden if m->n_items == 0 */
ret = MMI_FALSE;
}
else if (!(m->flags & UI_LIST_MENU_DISABLE_SCROLLBAR) &&
gui_vertical_scrollbar_translate_pen_event(
&m->vbar,
MMI_PEN_EVENT_DOWN,
x,
y,
&scrollbar_event,
&scrollbar_param))
{
pen_state->pen_on_scrollbar = 1;
if (scrollbar_event == GUI_SCROLLBAR_PEN_JUMP_TO_I)
{
IM_gui_fixed_list_menu_scroll_by_pen(m, scrollbar_param._u.i, menu_event);
}
}
else
{
if (IM_gui_fixed_list_menu_translate_pen_position(m, y, &item_index))
{
S32 item_x, item_y;
pen_state->first_highlighed_item = m->highlighted_item;
pen_state->highlight_changed = 0;
if (item_index != m->highlighted_item)
{
IM_gui_fixed_list_menu_goto_item(m, item_index);
*menu_event = GUI_LIST_PEN_HIGHLIGHT_CHANGED;
GUI_PEN_EVENT_PARAM_SET_INTEGER2((&menuitem_param), item_index, GUI_LIST_PEN_HIGHLIGHT_CHANGED);
}
/* Even if highlight is changed, we still need to invoke menuitem pen handler */
IM_gui_fixed_list_menu_get_menuitem_position(m, item_index, &item_x, &item_y);
if (m->item_pen_function(
m->items[item_index],
m->common_item_data,
item_x,
item_y,
MMI_PEN_EVENT_DOWN,
x,
y,
&menuitem_event,
&menuitem_param))
{
if (menuitem_event == GUI_TWOSTATE_PEN_TOGGLE)
{
menuitem_event = GUI_LIST_PEN_ITEM_SELECTED;
}
/* original menu_event could be GUI_LIST_PEN_HIGHLIGHT_CHANGED */
if (menuitem_event != GUI_LIST_PEN_NONE)
{
*menu_event = menuitem_event;
}
pen_state->handled_by_menu_item = 1;
}
}
else
{
/* # of menu items < # of displayable menu items */
ret = MMI_FALSE;
}
}
}
else
{
ret = MMI_FALSE;
}
break;
case MMI_PEN_EVENT_LONG_TAP:
/* FALLTHROUGH no break */
case MMI_PEN_EVENT_REPEAT:
/* FALLTHROUGH no break */
case MMI_PEN_EVENT_MOVE:
if (!m->disable_move_highlight)
{
IM_gui_fixed_list_menu_translate_pen_position(m, y, &item_index);
if (item_index != m->highlighted_item)
{
IM_gui_fixed_list_menu_goto_item(m, item_index);
*menu_event = GUI_LIST_PEN_HIGHLIGHT_CHANGED;
}
}
break;
case MMI_PEN_EVENT_UP:
if (!m->disable_up_select)
{
if (PEN_CHECK_BOUND(x, y, m->x, m->y, m->width, m->height))
{
/*IM_gui_fixed_list_menu_translate_pen_position(m, y, &item_index);
if (item_index != m->highlighted_item)
{
if (!m->disable_move_highlight)
{
IM_gui_fixed_list_menu_goto_item(m, item_index);
*menu_event = GUI_LIST_PEN_HIGHLIGHT_CHANGED;
}
}
else */if (pen_state->highlight_changed)
{
*menu_event = GUI_LIST_PEN_NONE;
}
else
{
*menu_event = GUI_LIST_PEN_ITEM_SELECTED;
}
}
}
break;
case MMI_PEN_EVENT_ABORT:
/* Do nothing */
break;
default:
MMI_ASSERT(0);
}
}
if (ret)
{
if (pen_state->first_highlighed_item != m->highlighted_item)
{
pen_state->highlight_changed = 1;
}
}
return ret;
}
U8 IM_pen_statusbar_hdlr(mmi_pen_point_struct point, mmi_pen_event_type_enum pen_event)
{
if (PEN_CHECK_BOUND(point.x, point.y, statusbar_scrolling_text.x, statusbar_scrolling_text.y,
statusbar_scrolling_text.width, statusbar_scrolling_text.height))
{
if (pen_event == MMI_PEN_EVENT_DOWN)
{
IM_statusbar_pen_down_hdlr();
return MMI_TRUE;
}
}
return MMI_FALSE;
}
U8 IM_pen_list_item_hdlr(mmi_pen_point_struct point, mmi_pen_event_type_enum pen_event)
{
im_app_struct * app = IM_get_active_app_from_ui();
im_common_obj_struct* item = NULL;
if (app == NULL)
{
return FALSE;
}
item = (im_common_obj_struct*)IM_ui_get_active_item(app);
if (item == NULL || item->obj_func->item_pen_function == NULL)
{
return FALSE;
}
if (item->obj_func->item_pen_function)
{
return item->obj_func->item_pen_function(item, point, pen_event);
}
return FALSE;
}
#endif /* __MMI_TOUCH_SCREEN__ */
/*****************************************************************************
* FUNCTION
* IM_show_fixed_list
* DESCRIPTION
* Show th
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -