⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plxdyncmenu.c

📁 mtk wap和mms代码。。适应mtk 25。26平台
💻 C
📖 第 1 页 / 共 4 页
字号:
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 + -