📄 plxdyncmenu.c
字号:
pixtel_UI_set_text_color(SavedColor);
}
/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*
<> Function GetItemFromLine
<> Purpose given a line number, get the item in the line
<> Params
<> Return
<> Remarks
\*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/
static PDMENUITEM GetItemFromLine(PDMENUOBJ pObj, int* pCount, int line){
PDMENUITEM pItem, pRet;
int i;
pItem = pObj->pItemsMemBlock;
for (i = 0; i < (int)(pObj->wUsedItems); ++ i) {
if (*pCount == line) {
return(pItem);
}
++ *pCount;
if ((pItem->wFlags & MF_POPUP) && (pItem->wFlags & ST_EXPAND)) {
pRet = GetItemFromLine((PDMENUOBJ)pItem->hIDorGroup, pCount, line);
if (pRet != NULL) {
return pRet;
}
}
++ pItem;
}
return NULL;
}
/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*
<> Function GetLineFromItem
<> Purpose get the item line number
<> Params
<> Return
<> Remarks
\*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/
static int GetLineFromItem(int* line, PDMENUOBJ pObj, PDMENUITEM pItem){
PDMENUITEM pMove;
int iRet, i = 0;
pMove = pObj->pItemsMemBlock;
while (1) {
if (pMove == pItem) {
return 0;
}
++ *line;
if ((pMove->wFlags & MF_POPUP) && (pMove->wFlags & ST_EXPAND)) {
iRet = GetLineFromItem(line, (PDMENUOBJ)pMove->hIDorGroup, pItem);
if (0 == iRet) {
return 0;
}
}
++ pMove;
++ i;
if (i >= pObj->wUsedItems)
return -1;
}
return -1;
}
/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*
<> Function ProcessScrollInfo
<> Purpose set the scrollbar
<> Params
<> Return
<> Remarks
\*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/
static void ProcessScrollInfo(void){
pixtel_UI_set_vertical_scrollbar_range(&menuDisp.vScroll, menuDisp.itemCount);
pixtel_UI_set_vertical_scrollbar_value(&menuDisp.vScroll, menuDisp.firstLine );
pixtel_UI_set_vertical_scrollbar_scale(&menuDisp.vScroll, menuDisp.linesInScreen);
pixtel_UI_show_vertical_scrollbar(&menuDisp.vScroll);
pixtel_UI_BLT_double_buffer(menuDisp.rcVScroll.left, menuDisp.rcVScroll.top,
menuDisp.rcVScroll.right, menuDisp.rcVScroll.bottom);
}
/****************************************************************************
* Function OnDMenuNotify
* Purpose
* Params
* Return
* Remarks
\****************************************************************************/
static void OnDMenuNotify( unsigned long id, unsigned long event)
{
if (NULL != menuDisp.NotifyFunc)
{
menuDisp.pMenu->firstLine = menuDisp.firstLine;
menuDisp.pMenu->focuseItem = menuDisp.focuseItem;
MMI_menu_shortcut_number = menuDisp.focuseItem + 1;
reset_menu_shortcut_handler();
MMI_disable_title_shortcut_display = bIsShortcutDisabled;
menuDisp.NotifyFunc((HDMENU)menuDisp.pMenu, id,event);
}
}
/****************************************************************************
* Function
* Purpose
* Params
* Return
* Remarks
\****************************************************************************/
static void OnDMenuCofirm(void){
PDMENUITEM pSelItem;
int count = 0;
pSelItem = GetItemFromLine(menuDisp.pMenu, &count, menuDisp.focuseItem);
if (pSelItem->wFlags & MF_DISABLED)
{
return;
}
if(pSelItem ->wFlags & MF_POPUP)
{
bVirtualKeyPressed = TRUE;
virtualKey = KEY_ENTER;
DMenuProcessKeyEvent();
bVirtualKeyPressed = FALSE;
}
else
{
OnDMenuNotify(pSelItem->hIDorGroup, ENT_OK);
}
}
/****************************************************************************
* Function
* Purpose
* Params
* Return
* Remarks
\****************************************************************************/
static void OnDMenuBack(void)
{
int count = 0;
PDMENUITEM pSelItem;
pSelItem = GetItemFromLine(menuDisp.pMenu, &count, menuDisp.focuseItem);
if(pSelItem)
OnDMenuNotify(0, ENT_BACK);
}
/****************************************************************************
* Function GetCountToDisplay
* Purpose get the items count to display
* Params
* Return
* Remarks
\****************************************************************************/
static unsigned long GetCountToDisplay(PDMENUOBJ pObj)
{
PDMENUITEM pItem;
int i;
unsigned long lRet = 0;
if (NULL == pObj)
{
return 0;
}
lRet += pObj->wUsedItems;
for (pItem = pObj->pItemsMemBlock, i = 0; i < pObj->wUsedItems; ++ i)
{
if (pItem->wFlags & ST_EXPAND)
{
lRet +=GetCountToDisplay((PDMENUOBJ)pItem->hIDorGroup);
}
++ pItem;
}
return lRet;
}
/****************************************************************************
* Function ResetMenuState
* Purpose reset the menu's state
* Params
* Return
* Remarks
\****************************************************************************/
static void ResetMenuState(PDMENUOBJ pObj)
{
PDMENUITEM pItem;
int i;
if (NULL == pObj)
{
return;
}
for (pItem = pObj->pItemsMemBlock, i = 0; i < pObj->wUsedItems; ++ i)
{
if (pItem->wFlags & MF_POPUP)
{
pItem->wFlags &= ~ST_EXPAND;
ResetMenuState((PDMENUOBJ)pItem->hIDorGroup);
}
++ pItem;
}
}
#ifdef __MMI_TOUCH_SCREEN__
/****************************************************************************
* Function OnTouchPenDown
* Purpose
* Params
* Return
* Remarks
\****************************************************************************/
static void OnTouchPenDown(mmi_pen_point_struct pos)
{
mmi_wgui_general_pen_down_hdlr(pos);
if (TRUE == ProcessPenOnScrollbar(pos, MMI_PEN_EVENT_DOWN))
{
return;
}
if (TRUE == ProcessPenOnSoftkey(pos, MMI_PEN_EVENT_DOWN))
{
return;
}
UsePenSelectItem(pos);
}
/****************************************************************************
* Function OnTouchPenMove
* Purpose
* Params
* Return
* Remarks
\****************************************************************************/
static void OnTouchPenMove(mmi_pen_point_struct pos)
{
mmi_wgui_general_pen_move_hdlr(pos);
if (TRUE == ProcessPenOnScrollbar(pos, MMI_PEN_EVENT_MOVE))
{
return;
}
if (TRUE == ProcessPenOnSoftkey(pos, MMI_PEN_EVENT_MOVE))
{
return;
}
if (pos.y < menuDisp.rcList.top)
{
bVirtualKeyPressed = TRUE;
virtualKey = KEY_UP_ARROW;
DMenuProcessKeyEvent();
bVirtualKeyPressed = FALSE;
}
else if (pos.y > menuDisp.rcList.bottom)
{
bVirtualKeyPressed = TRUE;
virtualKey = KEY_DOWN_ARROW;
DMenuProcessKeyEvent();
bVirtualKeyPressed = FALSE;
}
else
{
UsePenSelectItem(pos);
}
}
/****************************************************************************
* Function OnTouchePenUp
* Purpose
* Params
* Return
* Remarks
\****************************************************************************/
static void OnTouchPenUp(mmi_pen_point_struct pos)
{
DM_RC rcTmp;
int i, j;
int line;
mmi_wgui_general_pen_down_hdlr(pos);
if (TRUE == ProcessPenOnScrollbar(pos, MMI_PEN_EVENT_UP))
{
return;
}
if (TRUE == ProcessPenOnSoftkey(pos, MMI_PEN_EVENT_UP))
{
return;
}
rcTmp.left = menuDisp.rcList.left;
rcTmp.top = menuDisp.rcList.top;
rcTmp.right = menuDisp.rcSubIcon.right;
rcTmp.bottom = menuDisp.rcList.bottom;
if (!PenPointInRect(&rcTmp, pos))
{
return; //not mind to dmenu
}
i = (pos.y - menuDisp.rcList.top) / menuDisp.itemHeight;
j = (pos.y - menuDisp.rcList.top) % menuDisp.itemHeight;
line = menuDisp.firstLine + (((j == 0) && (i > 0)) ? (i - 1) : i);
// line = menuDisp.firstLine + (pos.y - menuDisp.rcList.top) / menuDisp.itemHeight;
if (line + 1 > menuDisp.itemCount)
{
return; //no item where the pen down
}
bVirtualKeyPressed = TRUE;
virtualKey = KEY_ENTER;
DMenuProcessKeyEvent();
bVirtualKeyPressed = FALSE;
}
/****************************************************************************
* Function OnTouchPenRepeat
* Purpose
* Params
* Return
* Remarks
\****************************************************************************/
static void OnTouchPenRepeat(mmi_pen_point_struct pos)
{
mmi_wgui_general_pen_repeat_hdlr(pos);
if (TRUE == ProcessPenOnScrollbar(pos, MMI_PEN_EVENT_REPEAT))
{
return;
}
if (TRUE == ProcessPenOnSoftkey(pos, MMI_PEN_EVENT_REPEAT))
{
return;
}
}
/****************************************************************************
* Function ProcessPenOnScrollbar
* Purpose process pen event of scrollbar
* Params
* Return true: the scrollbar event has been processed
* Remarks
\****************************************************************************/
static BOOL ProcessPenOnScrollbar(mmi_pen_point_struct pos, mmi_pen_event_type_enum pen_event)
{
mmi_gui_pen_event_param_struct scrollbar_param;
mmi_gui_scrollbar_pen_enum scrollbar_event;
pixtel_UI_vertical_scrollbar_translate_pen_event(&menuDisp.vScroll, pen_event,
pos.x, pos.y, &scrollbar_event, &scrollbar_param);
if (scrollbar_event == GUI_SCROLLBAR_PEN_JUMP_TO_I)
{
menuDisp.firstLine = scrollbar_param._u.i;
if (menuDisp.focuseItem < menuDisp.firstLine)
{
menuDisp.focuseItem = menuDisp.firstLine;
}
if (menuDisp.firstLine + menuDisp.linesInScreen - 1 <= menuDisp.focuseItem)
{
if (menuDisp.firstLine + menuDisp.linesInScreen >= menuDisp.itemCount)
{
menuDisp.focuseItem = menuDisp.itemCount - 1;
}
else
{
menuDisp.focuseItem = menuDisp.firstLine + menuDisp.linesInScreen - 1;
}
}
ProcessFocusItem();
DrawMenuList(&menuDisp.rcList);
return TRUE;
}
return FALSE;
}
/****************************************************************************
* Function PenPointInRect
* Purpose is the pen point in the rect
* Params
* Return
* Remarks
\****************************************************************************/
static BOOL PenPointInRect(PDM_RC pRc, mmi_pen_point_struct pos)
{
mmi_pen_polygon_area_struct rectDMenu;
mmi_pen_point_struct angles[4];
angles[0].x = (S16)pRc->left;
angles[0].y = (S16)pRc->top;
angles[1].x = (S16)pRc->right;
angles[1].y = (S16)pRc->top;
angles[2].x = (S16)pRc->right;
angles[2].y = (S16)pRc->bottom;
angles[3].x = (S16)pRc->left;
angles[3].y = (S16)pRc->bottom;
rectDMenu.num = 4;
rectDMenu.points = angles;
return mmi_pen_check_inside_polygon(&rectDMenu, pos);
}
/****************************************************************************
* Function UsePenSelectItem
* Purpose through the pos, select menu item
* Params
* Return
* Remarks
\****************************************************************************/
static BOOL UsePenSelectItem(mmi_pen_point_struct pos)
{
DM_RC rcTmp;
int line;
int i, j;
rcTmp.left = menuDisp.rcList.left;
rcTmp.top = menuDisp.rcList.top;
rcTmp.right = menuDisp.rcSubIcon.right;
rcTmp.bottom = menuDisp.rcList.bottom;
if (!PenPointInRect(&rcTmp, pos))
{
return FALSE; //not mind to dmenu
}
/* rcTmp.left= menuDisp.rcList.left;
rcTmp.top =menuDisp.rcTxt.top + (menuDisp.focuseItem - menuDisp.firstLine) * menuDisp.itemHeight;
rcTmp.right = menuDisp.rcList.right;
rcTmp.bottom = rcTmp.top + menuDisp.itemHeight;
if (PenPointInRect(&rcTmp, pos))
{
return FALSE; //pen down in focused item, no change
}
*/
i = (pos.y - menuDisp.rcList.top) / menuDisp.itemHeight;
j = (pos.y - menuDisp.rcList.top) % menuDisp.itemHeight;
line = menuDisp.firstLine + (((j == 0) && (i > 0)) ? (i - 1) : i);
// line = menuDisp.firstLine + (pos.y - menuDisp.rcList.top) / menuDisp.itemHeight;
if (line + 1 > menuDisp.itemCount)
{
return FALSE; //no item where the pen down
}
else
{
menuDisp.focuseItem = line;
if (menuDisp.focuseItem < menuDisp.itemCount - 1 && menuDisp.firstLine + menuDisp.linesInScreen - 1 <= menuDisp.focuseItem)
{
++ menuDisp.firstLine;
}
else if (menuDisp.firstLine > 0 && line == menuDisp.firstLine)
{
-- menuDisp.firstLine;
}
}
ProcessFocusItem();
ProcessScrollInfo();
DrawMenuList(&menuDisp.rcList);
return TRUE;
}
/****************************************************************************
* Function ProcessPenOnSoftkey
* Purpose
* Params
* Return
* Remarks
\****************************************************************************/
extern BOOL translate_softkey_pen_event(WGUI_SOFTKEY_ENUM key, mmi_pen_event_type_enum pen_event, S16 x, S16 y, mmi_gui_button_pen_enum *button_event);
static BOOL ProcessPenOnSoftkey(mmi_pen_point_struct pos, mmi_pen_event_type_enum pen_event)
{
mmi_gui_button_pen_enum button_event;
if (translate_softkey_pen_event(MMI_LEFT_SOFTKEY, pen_event, pos.x, pos.y, &button_event)
&& GUI_BUTTON_PEN_UP_INSIDE == button_event)
{
execute_softkey_function(KEY_EVENT_UP, MMI_LEFT_SOFTKEY);
return TRUE;
}
if (translate_softkey_pen_event(MMI_RIGHT_SOFTKEY, pen_event, pos.x, pos.y, &button_event)
&& GUI_BUTTON_PEN_UP_INSIDE == button_event)
{
execute_softkey_function(KEY_EVENT_UP, MMI_RIGHT_SOFTKEY);
return TRUE;
}
return FALSE;
}
#endif //__MMI_TOUCH_SCREEN__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -