📄 plxdyncmenu.c
字号:
void PlxSetDMenuDispInfo(U16 title, U16 title_icon, U16 left_softkey, U16 left_softkey_icon, U16 right_softkey, U16 right_softkey_icon)
{
nDMTitleID = title;
nDMTitleIconID = title_icon;
nDMLeftKey = left_softkey;
nDMLeftKeyIcon = left_softkey_icon;
nDMRightKey = right_softkey;
nDMRightKeyIcon = right_softkey_icon;
}
/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*
<> Function PlxShowDMenu
<> Purpose Show a dynamic menu
<> Params
<> Return
<> Remarks
\*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/
void dm_reset_context (void);
int PlxShowDMenu(HDMENU hMenu, int screenID, unsigned long title, DMENUNOTIFY NotifyFunc, FuncPtr DMenuEntry){
PDMENUOBJ pObj;
s32 txtWidth;
if (0 == hMenu) {
return -1; //invalid menu handle
}
pObj = (PDMENUOBJ)hMenu;
if (pObj->wFlags & MF_POPUP) {
return -2; //cant display a sub menu
}
#ifdef __MMI_TOUCH_SCREEN__
MMI_status_bar_height = MMI_STATUS_BAR_HEIGHT;
MMI_content_x = MMI_CONTENT_X;
MMI_content_y = MMI_CONTENT_Y;
#if defined(__MMI_PLUTO_LISTBOX__)
MMI_content_height = MMI_CONTENT_HEIGHT - 2;
MMI_content_width = MMI_CONTENT_WIDTH - 2;
#else
MMI_content_height = MMI_CONTENT_HEIGHT;
MMI_content_width = MMI_CONTENT_WIDTH;
#endif
MMI_title_height = MMI_TITLE_HEIGHT;
MMI_title_width = MMI_TITLE_WIDTH;
MMI_title_x = MMI_TITLE_X;
MMI_title_y = MMI_TITLE_Y;
MMI_button_bar_height = MMI_BUTTON_BAR_HEIGHT;
#endif
txtWidth = pixtel_UI_get_string_height((UI_string_type)"T\x00\x00\x00") ;
menuDisp.pMenu = pObj;
menuDisp.screenID = screenID;
menuDisp.title = title;
menuDisp.NotifyFunc = NotifyFunc;
menuDisp.rcList.left = MMI_content_x;// + 1;
menuDisp.rcList.right = MMI_content_width ;
menuDisp.rcList.top = MMI_content_y;
menuDisp.rcList.bottom = MMI_content_y + MMI_content_height - 1;
menuDisp.rcOrderIcon.left = menuDisp.rcList.left + 1;
menuDisp.rcOrderIcon.top = menuDisp.rcList.top;
menuDisp.rcOrderIcon.right = menuDisp.rcOrderIcon.left + OD_ICON_WIDTH;
menuDisp.rcOrderIcon.bottom = menuDisp.rcList.bottom ;
menuDisp.rcVScroll.right = menuDisp.rcList.right;
menuDisp.rcVScroll.top = menuDisp.rcList.top;
menuDisp.rcVScroll.bottom = menuDisp.rcList.bottom;
menuDisp.rcVScroll.left = menuDisp.rcVScroll.right - current_MMI_theme->scrollbar_size;
menuDisp.rcSubIcon.right = menuDisp.rcVScroll.left - 1;
menuDisp.rcSubIcon.top = menuDisp.rcList.top;
menuDisp.rcSubIcon.bottom = menuDisp.rcList.bottom;
menuDisp.rcSubIcon.left = menuDisp.rcSubIcon.right - SUB_ICON_WIDTH -1;
menuDisp.rcTxt.left = menuDisp.rcOrderIcon.right + SPACE_IN_ICON_AND_TEXT;
menuDisp.rcTxt.top = menuDisp.rcList.top + 1 ;
menuDisp.rcTxt.right = menuDisp.rcSubIcon.left - 1;
menuDisp.rcTxt.bottom = menuDisp.rcList.bottom;
if(FALSE == CheckIsBackHistory())
{
ResetMenuState(pObj);
menuDisp.focuseItem = 0;
menuDisp.firstLine = 0;
menuDisp.pMenu->firstLine = 0;
menuDisp.pMenu->focuseItem = 0;
}
else
{
menuDisp.firstLine = menuDisp.pMenu->firstLine;
menuDisp.focuseItem = menuDisp.pMenu->focuseItem;
}
MMI_menu_shortcut_number = menuDisp.focuseItem + 1;
menuDisp.itemCount = GetCountToDisplay(pObj);
EntryOfDyncMenuScreen(DMenuEntry);
return 0;
}
/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*
<> Function EntryOfDyncMenuScreen
<> Purpose entry of dynamic menu screen
<> Params
<> Return
<> Remarks
\*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/
void EntryOfDyncMenuScreen(FuncPtr DMenuEntry)
{
EntryNewScreen(menuDisp.screenID, ExitOfDyncMenuScreen, DMenuEntry, NULL);
DrawDyncMenuScreen();
SetGroupKeyHandler(DMenuProcessKeyEvent, keyNeeded, sizeof(keyNeeded)/sizeof(U16), KEY_EVENT_UP);
ClearKeyHandler(KEY_LEFT_ARROW, KEY_EVENT_UP);
ClearKeyHandler(KEY_RIGHT_ARROW, KEY_EVENT_UP);
SetKeyHandler(DMenuProcessKeyEvent,KEY_LEFT_ARROW,KEY_EVENT_DOWN);
SetKeyHandler(DMenuProcessKeyEvent,KEY_RIGHT_ARROW,KEY_EVENT_DOWN);
SetLeftSoftkeyFunction(OnDMenuCofirm, KEY_EVENT_UP);
SetRightSoftkeyFunction(OnDMenuBack, KEY_EVENT_UP);
}
/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*
<> Function DMenuProcessKeyEvent
<> Purpose process the key event
<> Params
<> Return
<> Remarks
\*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/
void DMenuProcessKeyEvent(void){
U16 keyCode, keyType;
PDMENUITEM pOldFocus, pParent;
PDMENUOBJ pObj;
int count = 0, oldLine;
pOldFocus = GetItemFromLine(menuDisp.pMenu, &count, menuDisp.focuseItem);
if(TRUE == bVirtualKeyPressed)
keyCode = virtualKey;
else
GetkeyInfo(&keyCode, &keyType);
switch(keyCode) {
case KEY_VOL_UP:
case KEY_UP_ARROW:
oldLine = menuDisp.focuseItem;
if (menuDisp.focuseItem == 0)
{
if (bVirtualKeyPressed)
{
return;
}
menuDisp.focuseItem = menuDisp.itemCount - 1;
MMI_menu_shortcut_number = menuDisp.focuseItem + 1;
if (menuDisp.itemCount > menuDisp.linesInScreen)
{
menuDisp.firstLine = menuDisp.focuseItem - menuDisp.linesInScreen + 1;
}
else
{
menuDisp.firstLine = 0;
count = 0;
ProcessFocusItem();
ProcessScrollInfo();
DrawMenuList(&menuDisp.rcList);
return;
}
}
else
{
-- menuDisp.focuseItem;
MMI_menu_shortcut_number = menuDisp.focuseItem + 1;
if (menuDisp.focuseItem == menuDisp.firstLine)
{
if (menuDisp.firstLine > 0)
{
-- menuDisp.firstLine;
}
}
}
ProcessFocusItem();
ProcessScrollInfo();
DrawMenuList(&menuDisp.rcList);
break;
case KEY_VOL_DOWN:
case KEY_DOWN_ARROW:
oldLine = menuDisp.focuseItem;
if (menuDisp.focuseItem + 1 >= menuDisp.itemCount)
{
if (bVirtualKeyPressed)
{
return;
}
menuDisp.focuseItem = 0;
menuDisp.firstLine = 0;
}
else
{
++ menuDisp.focuseItem;
if (menuDisp.focuseItem == menuDisp.itemCount - 1)
{
if (menuDisp.focuseItem - menuDisp.firstLine + 1 > menuDisp.linesInScreen)
++ menuDisp.firstLine;
}
else
{
if (menuDisp.focuseItem - menuDisp.firstLine + 1 >= menuDisp.linesInScreen)
{
++ menuDisp.firstLine;
}
}
}
MMI_menu_shortcut_number = menuDisp.focuseItem + 1;
ProcessFocusItem();
ProcessScrollInfo();
DrawMenuList(&menuDisp.rcList);
break;
case KEY_ENTER:
if (pOldFocus->wFlags & MF_DISABLED)
{
return;
}
if (!(pOldFocus->wFlags & MF_POPUP))
{
OnDMenuNotify(pOldFocus->hIDorGroup, ENT_OK);
break;
}
case KEY_LEFT_ARROW:
pObj = pOldFocus->pOwner;
if(KEY_ENTER != keyCode || (KEY_ENTER == keyCode && ( pOldFocus->wFlags & ST_EXPAND)))
{
if ((pOldFocus->wFlags & ST_EXPAND) && (pOldFocus->wFlags & MF_POPUP))
{
pOldFocus->wFlags &= ~ST_EXPAND;
menuDisp.itemCount -= ((PDMENUOBJ)pOldFocus->hIDorGroup)->wUsedItems;
count = 0;
if (-1 != GetLineFromItem(&count, menuDisp.pMenu, pOldFocus))
{
menuDisp.focuseItem = count;
MMI_menu_shortcut_number = menuDisp.focuseItem + 1;
if (menuDisp.itemCount - menuDisp.firstLine < menuDisp.linesInScreen)
{
menuDisp.firstLine = menuDisp.focuseItem - menuDisp.linesInScreen + 1 >= 0 ?
menuDisp.focuseItem - menuDisp.linesInScreen + 1 : 0;
}
ProcessFocusItem();
ProcessScrollInfo();
DrawMenuList(&menuDisp.rcList);
}
break;
}
pParent = pObj->hParent;
if (NULL == pParent)
{
OnDMenuNotify(0, ENT_LEFT);
break;
}
if ((pParent->wFlags & ST_EXPAND) && (pParent->wFlags & MF_POPUP))
{
pParent->wFlags &= ~ST_EXPAND;
}
else
{
OnDMenuNotify(0, ENT_LEFT);
break;
}
menuDisp.itemCount -= ((PDMENUOBJ)pParent->hIDorGroup)->wUsedItems;
set_menu_item_count(menuDisp.itemCount);
count = 0;
if (-1 != GetLineFromItem(&count, menuDisp.pMenu, pParent))
{
menuDisp.focuseItem = count;
MMI_menu_shortcut_number = menuDisp.focuseItem + 1;
if (menuDisp.itemCount - menuDisp.firstLine < menuDisp.linesInScreen)
{
menuDisp.firstLine = menuDisp.focuseItem - menuDisp.linesInScreen + 1 >= 0 ?
menuDisp.focuseItem - menuDisp.linesInScreen + 1 : 0;
}
ProcessFocusItem();
ProcessScrollInfo();
DrawMenuList(&menuDisp.rcList);
}
break;
}
case KEY_RIGHT_ARROW:
if ((pOldFocus->wFlags & MF_POPUP) && !(pOldFocus->wFlags & MF_DISABLED) && !(pOldFocus->wFlags & ST_EXPAND))
{
pOldFocus->wFlags |= ST_EXPAND;
}
else
{
if (pOldFocus->wFlags & MF_DISABLED)
break;
OnDMenuNotify(pOldFocus->hIDorGroup, ENT_RIGHT);
break;
}
++ menuDisp.focuseItem;
MMI_menu_shortcut_number = menuDisp.focuseItem + 1;
menuDisp.itemCount += ((PDMENUOBJ)pOldFocus->hIDorGroup)->wUsedItems;
set_menu_item_count(menuDisp.itemCount);
if (menuDisp.focuseItem - menuDisp.firstLine >= menuDisp.linesInScreen)
{
if (menuDisp.focuseItem < menuDisp.itemCount - 1)
{
menuDisp.firstLine += 2;
}
else
{
++ menuDisp.firstLine;
}
}
ProcessFocusItem();
ProcessScrollInfo();
DrawMenuList(&menuDisp.rcList);
break;
case KEY_END:
GoBackHistory();
ExecuteCurrKeyHandler(KEY_END, (S16)keyType);
break;
default:
return;
}
}
/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*
<> Function ProcessFocusItem
<> Purpose process the focused item
<> Params
<> Return
<> Remarks
\*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/
static void ProcessFocusItem(void){
PDMENUITEM pItem;
PDMENUOBJ pObj;
int count = 0;
StopTimer(TIMER_ID);
menuDisp.rollStr.nRollCount = 0;
pItem = GetItemFromLine(menuDisp.pMenu, &count, menuDisp.focuseItem);
pObj = pItem->pOwner;
if (NULL == pItem) {
return;
}
menuDisp.rollStr.strWidth = pixtel_UI_get_string_width((UI_string_type)pItem->pStr);
if (((pItem->wFlags & MF_POPUP) && ((menuDisp.rcTxt.right - (pObj->level * INDENT_VALUE + menuDisp.rcTxt.left)) < menuDisp.rollStr.strWidth)) ||
((menuDisp.rcSubIcon.right - 2 - (pObj->level * INDENT_VALUE + menuDisp.rcTxt.left)) <= menuDisp.rollStr.strWidth) )
{
menuDisp.rollStr.bEnable = 1;
menuDisp.rollStr.startX = pObj->level * INDENT_VALUE + menuDisp.rcTxt.left;
menuDisp.rollStr.restartX = menuDisp.rollStr.startX + menuDisp.rollStr.strWidth +DF_FOCUSITEM_ROLL_SPACE_INTERVAL;
StartTimer(TIMER_ID, TIMER_DELAY, RollTimerFunc);
}
else{
menuDisp.rollStr.bEnable = 0;
}
mmi_gui_redraw_menu_shortcut();
}
/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*
<> Function RollTimerFunc
<> Purpose roll the focused item's string
<> Params
<> Return
<> Remarks
\*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/
static void RollTimerFunc(void){
PDMENUITEM pItem;
int count = 0;
int y1;
int y2;
DM_RC rcTxt;
PDMENUOBJ pObj;
if(menuDisp.rollStr.nRollCount <= 2)
{
StopTimer(TIMER_ID);
StartTimer(TIMER_ID, TIMER_DELAY, RollTimerFunc);
menuDisp.rollStr.nRollCount ++;
return;
}
pItem = GetItemFromLine(menuDisp.pMenu, &count, menuDisp.focuseItem);
if (NULL == pItem) {
return;
}
if (menuDisp.rollStr.startX + menuDisp.rollStr.strWidth + DF_FOCUSITEM_ROLL_SPACE_INTERVAL< menuDisp.rcTxt.left &&
menuDisp.rollStr.restartX + menuDisp.rollStr.strWidth + DF_FOCUSITEM_ROLL_SPACE_INTERVAL>= menuDisp.rcTxt.left )
{
menuDisp.rollStr.startX = menuDisp.rollStr.restartX + menuDisp.rollStr.strWidth + DF_FOCUSITEM_ROLL_SPACE_INTERVAL;
}
else if (menuDisp.rollStr.startX + menuDisp.rollStr.strWidth + DF_FOCUSITEM_ROLL_SPACE_INTERVAL>= menuDisp.rcTxt.left &&
menuDisp.rollStr.restartX + menuDisp.rollStr.strWidth + DF_FOCUSITEM_ROLL_SPACE_INTERVAL< menuDisp.rcTxt.left )
{
menuDisp.rollStr.restartX = menuDisp.rollStr.startX + menuDisp.rollStr.strWidth + DF_FOCUSITEM_ROLL_SPACE_INTERVAL;
}
menuDisp.rollStr.restartX -= ONCE_ROLL_VALUE;
menuDisp.rollStr.startX -= ONCE_ROLL_VALUE;
y1 = menuDisp.rcTxt.top + (menuDisp.focuseItem - menuDisp.firstLine) * menuDisp.itemHeight;
y2 = y1 + menuDisp.itemHeight;
pObj = pItem->pOwner;
rcTxt.left = menuDisp.rcTxt.left + pObj->level * INDENT_VALUE;
rcTxt.top = y1;
rcTxt.right = menuDisp.rcTxt.right;
rcTxt.bottom = y2;
pixtel_UI_lock_double_buffer();
pixtel_UI_push_clip();
pixtel_UI_set_clip(menuDisp.rcList.left, y1, menuDisp.rcSubIcon.right, y2);
pixtel_UI_push_text_clip();
if(pItem->wFlags & MF_POPUP)
pixtel_UI_set_text_clip(rcTxt.left, rcTxt.top, rcTxt.right, rcTxt.bottom);
else
pixtel_UI_set_text_clip(rcTxt.left, rcTxt.top, menuDisp.rcSubIcon.right-1, rcTxt.bottom);
DrawOneLine(menuDisp.focuseItem, pItem);
pixtel_UI_pop_text_clip();
pixtel_UI_pop_clip();
pixtel_UI_unlock_double_buffer();
pixtel_UI_BLT_double_buffer(menuDisp.rcList.left, y1, menuDisp.rcSubIcon.right, y2);
StopTimer(TIMER_ID);
StartTimer(TIMER_ID, TIMER_DELAY, RollTimerFunc);
}
/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*
<> Function ExitOfDyncMenuScreen
<> Purpose exit of dynamic menu screen
<> Params
<> Return
<> Remarks
\*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/
void ExitOfDyncMenuScreen(void){
StopTimer(TIMER_ID);
MMI_disable_title_shortcut_display = bIsShortcutDisabled;
reset_menu_shortcut_handler();
}
/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*
<> Function ExitDyncMenuScreen
<> Purpose
<> Params
<> Return
<> Remarks
\*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/
void ExitDyncMenuScreen(void)
{
reset_softkeys();
#if defined (__MMI_UI_TRANSPARENT_EFFECT__) || defined (__MMI_UI_LIST_HIGHLIGHT_EFFECTS__)
pixtel_UI_reset_transparent_source_layer();
#endif
ExitCategoryFunction=MMI_dummy_function;
RedrawCategoryFunction=MMI_dummy_function;
GetCategoryHistory=dummy_get_history;
GetCategoryHistorySize=dummy_get_history_size;
}
/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*
<> Function DrawDyncMenuScreen
<> Purpose draw the dynamic menu screen
<> Params
<> Return
<> Remarks
\*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/
#ifdef __MMI_WALLPAPER_ON_BOTTOM__
extern UI_image_ID_type idle_screen_wallpaper_ID;
extern gdi_handle wgui_base_layer;
extern gdi_handle wgui_layer_1;
#endif
static void DrawDyncMenuScreen(void){
UI_font_type pFont = &MMI_default_font;
int shortcut_width;
MMI_disable_title_shortcut_display = 0; //show shortcut
pixtel_UI_lock_double_buffer();
#ifdef __MMI_WALLPAPER_ON_BOTTOM__
wgui_set_wallpaper_on_bottom(MMI_TRUE);
/* 053005 Calvin added */
#ifdef __MMI_DRAW_MANAGER__
dm_set_scr_bg_redraw(MMI_TRUE);
#endif
pixtel_UI_reset_clip();
gdi_layer_multi_layer_enable();
gdi_layer_get_base_handle(&wgui_base_layer);
pixtel_UI_layer_transparent(wgui_base_layer, UI_SUBMENU_OPACITY_BASED_LAYER,
0, 0, UI_device_width-1, UI_device_height-1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -