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

📄 listmenu.c

📁 brew一些源码
💻 C
字号:
/*===========================================================================
列表控制
FILE: ListMenu.c
===========================================================================*/
#include "ListMenu.h"
CListMenu*	CListMenu_New(AEEApplet* pme , AEERect* pRect , CFrameImage* pFramIcon)
{	
	CListMenu*	pListMenuRet;
	if(NULL == pme || NULL == pRect)
		return	NULL;
	pListMenuRet = NULL;
	pListMenuRet = MALLOC(sizeof(CListMenu));
	if(NULL == pListMenuRet)
		return NULL;

	pListMenuRet->m_pme = pme;
	pListMenuRet->m_bIsScroll = FALSE;	//关闭滚动显示
	pListMenuRet->m_bIsActive = FALSE;	//默认为非激活
	pListMenuRet->m_pRect = pRect;
	pListMenuRet->m_eMfont = AEE_FONT_NORMAL;
	pListMenuRet->m_nSep = BETWEEN_LIST;
	pListMenuRet->m_pImageFrame = pFramIcon;//图标资源
	pListMenuRet->m_nCurPage = 0;		//当前页索引
	pListMenuRet->m_nItemCount = 0;		//节点个数
	pListMenuRet->m_nCurIndex = 0;		//当前项索引

	pListMenuRet->m_nPageSize = pListMenuRet->m_pRect->dy / pListMenuRet->m_nSep;//计算能显示的页数
	pListMenuRet->m_pCurPage = NULL;
	pListMenuRet->m_pCurItem = NULL;
	pListMenuRet->m_pListHead = NULL;
	pListMenuRet->m_pListLast = NULL;


	return pListMenuRet;
}

void CListMenu_Release(CListMenu** pFree)
{
	if(pFree && *pFree)
	{
		CListItem* pTemp;
		CListItem* pTempFree;
		ISHELL_CancelTimer((*pFree)->m_pme->m_pIShell, (PFNNOTIFY)ScrollText , (void*)(*pFree));
		(*pFree)->m_bIsScroll = FALSE;
		pTempFree = (*pFree)->m_pListHead;
		if(NULL == pTempFree)
		{
			FREEIF(*pFree);
			*pFree = NULL;
			return;
		}
		pTemp = pTempFree->m_pNext;
		while(pTemp)
		{
			ITEM_FREE(pTempFree);
			pTempFree = pTemp;
			pTemp = pTemp->m_pNext;
		}
		ITEM_FREE(pTempFree);
		FREEIF(*pFree);
		*pFree = NULL;
	}
}

boolean CListMenu_ADDItem(CListMenu* pMenu , AECHAR* pAECname , void* pData , uint16 nIcon , uint16 nID , uint32 nFlag)
{
	CListItem*	pItem;
	if(NULL == pMenu)
		return FALSE;

	pItem = CListItem_NewEx(pAECname , pData , nIcon , nID , nFlag);
	if(NULL == pItem)
		return FALSE;

	pMenu->m_nItemCount++;
	if(NULL == pMenu->m_pListHead)//添加到链表中
	{
		pItem->m_pPrev = NULL;
		pItem->m_pNext = NULL;
		pMenu->m_pListHead = pItem;
		pMenu->m_pCurPage = pItem;
		pMenu->m_pCurItem = pItem;
	}
	else
	{
		pItem->m_pPrev = pMenu->m_pListLast;
		pMenu->m_pListLast->m_pNext = pItem;
		pItem->m_pNext = NULL;
	}
	pMenu->m_pListLast = pItem;
	//程序至此添加一个节点到链表结构为 head - prev - next - last
	return TRUE;
}

AECHAR*	CListMenu_GetIndexName(CListMenu* pMenu)
{
	if(NULL == pMenu)
		return NULL;
	return pMenu->m_pCurItem->m_pAECname;
}

void* CListMenu_GetIndexData(CListMenu* pMenu)
{
	if(NULL == pMenu)
		return NULL;
	return pMenu->m_pCurItem->m_pData;
}
uint16 CListMenu_GetIndexID(CListMenu* pMenu)
{
	if(NULL == pMenu)
		return 0;
	return pMenu->m_pCurItem->m_nNodID;
}
uint32 CListMenu_GetIndexFlag(CListMenu* pMenu)
{
	if(NULL == pMenu)
		return 0;
	return pMenu->m_pCurItem->m_nData;
}

boolean	CListMenu_HandleEvent(CListMenu* pMenu , AEEEvent eCode , uint16 wParam , uint32 dwParam)
{
	if(FALSE == pMenu->m_bIsActive)
		return FALSE;
	if(EVT_KEY == eCode)
	{
		switch(wParam)
		{
			case AVK_UP:
			{
				CListMenu_GoTo(pMenu , (uint16)(pMenu->m_nCurIndex - 1));
				return TRUE;
			}
			case AVK_DOWN:
			{
				CListMenu_GoTo(pMenu , (uint16)(pMenu->m_nCurIndex + 1));
				return TRUE;
			}
			case AVK_LEFT:
			{

				if(pMenu->m_nCurIndex < pMenu->m_nPageSize)
					CListMenu_GoTo(pMenu , 0);
				else
					CListMenu_GoTo(pMenu , (uint16)(pMenu->m_nCurIndex - pMenu->m_nPageSize));
				return TRUE;
			}
			case AVK_RIGHT:
			{
				if((pMenu->m_nCurIndex + pMenu->m_nPageSize) > (pMenu->m_nItemCount - 1))
					CListMenu_GoTo(pMenu , (uint16)(pMenu->m_nItemCount - 1));
				else
					CListMenu_GoTo(pMenu , (uint16)(pMenu->m_nCurIndex + pMenu->m_nPageSize));
				return TRUE;
			}
			case AVK_SOFT2:
			case AVK_SELECT:
			{
				ISHELL_PostEvent(pMenu->m_pme->m_pIShell , pMenu->m_pme->clsID , MENU_COMMAND , (word)pMenu->m_pCurItem->m_nNodID , NULL);
				return TRUE;
			}
		}//end switch
	}
	return FALSE;
}

CListItem* CListMenu_GoTo(CListMenu* pMenu , uint16 nIndex)//※※
{ 
	uint16      nMoveCount;
	uint16      i;
	if(NULL == pMenu)
		return NULL;
	if(0 == pMenu->m_nItemCount || 0 == pMenu->m_nPageSize)
		return NULL;
	if(nIndex == pMenu->m_nItemCount)
		nIndex = 0;
	else if(nIndex > pMenu->m_nItemCount)
		nIndex = pMenu->m_nItemCount - 1;
		

	if(pMenu->m_nCurIndex > nIndex)//
	{
		nMoveCount = pMenu->m_nCurIndex - nIndex;
		for(i = 0 ; i < nMoveCount ; i++)
		{
			if(pMenu->m_pCurItem == pMenu->m_pCurPage)
			{	
				pMenu->m_pCurPage = pMenu->m_pCurItem->m_pPrev; 
				pMenu->m_nCurPage--;
			}
			pMenu->m_pCurItem = pMenu->m_pCurItem->m_pPrev;
			pMenu->m_nCurIndex--;
		}
	}
	else if(pMenu->m_nCurIndex < nIndex)
	{
		nMoveCount = nIndex - pMenu->m_nCurIndex;
		for(i = 0 ; i < nMoveCount ; i++)
		{
			if((pMenu->m_nCurIndex - pMenu->m_nCurPage) >= pMenu->m_nPageSize - 1)
			{	
				pMenu->m_pCurPage = pMenu->m_pCurPage->m_pNext;
				pMenu->m_nCurPage++;
			}
			pMenu->m_pCurItem = pMenu->m_pCurItem->m_pNext;
			pMenu->m_nCurIndex++;
		}
	}
	return pMenu->m_pCurItem;
}
boolean CListMenu_DelItem(CListMenu* pMenu)//删除当前项//如果最后一项返回false
{
	if(NULL == pMenu)
		return FALSE;
	if(0 >= pMenu->m_nItemCount)
		return FALSE;
	ISHELL_CancelTimer(pMenu->m_pme->m_pIShell, (PFNNOTIFY)ScrollText , (void*)pMenu);
	pMenu->m_bIsScroll = FALSE;
	pMenu->m_nItemCount--;
	if(NULL == pMenu->m_pCurItem->m_pPrev)//当前节点的m_pPrev = NULL说明是第一项
		pMenu->m_pListHead = pMenu->m_pCurItem->m_pNext;
	else
		pMenu->m_pCurItem->m_pPrev->m_pNext = pMenu->m_pCurItem->m_pNext; 
	
	if(NULL == pMenu->m_pCurItem->m_pNext)//尾节点
		pMenu->m_pListLast = pMenu->m_pCurItem->m_pPrev;
	else
		pMenu->m_pCurItem->m_pNext->m_pPrev = pMenu->m_pCurItem->m_pPrev;
	ITEM_FREE(pMenu->m_pCurItem);
	pMenu->m_pCurItem = pMenu->m_pListHead;
	if(0 >= pMenu->m_nItemCount)
	{
		pMenu->m_pCurPage = NULL;
		pMenu->m_pCurItem = NULL;
		pMenu->m_nCurPage = 0;
		pMenu->m_nCurIndex = 0;
		return FALSE;
	}
	else
	{
		pMenu->m_pCurPage = pMenu->m_pListHead;
		pMenu->m_pCurItem = pMenu->m_pListHead;
		pMenu->m_nCurPage = 0;
		pMenu->m_nCurIndex = 0;
		return TRUE;
	}
}
void CListMenu_Draw(CListMenu* pMenu)
{
	if(NULL != pMenu && pMenu->m_bIsActive)
		CListMenu_Redraw(pMenu);
}
void CListMenu_Redraw(CListMenu* pMenu)
{
	uint16 nPageSize;
	uint16 nIndex;
	CListItem* pIndex;
	AEERect* pRect;
	uint16 x , y;
	if(NULL == pMenu)
		return;

	nPageSize = pMenu->m_nPageSize;
	pIndex = pMenu->m_pCurPage;
	pRect = pMenu->m_pRect;
	x = pRect->x;
	y = pRect->y;

	if(NULL == pMenu->m_pCurPage || NULL == pMenu->m_pCurItem)
		return;
	//绘制菜单项
	for(nIndex = 0 ; nIndex < nPageSize ; nIndex++)
	{
		y = nIndex * pMenu->m_nSep + pRect->y;
		CFrameImage_Draw(pMenu->m_pImageFrame , (uint32)pIndex->m_nIcon , x , y);
		if(pIndex == pMenu->m_pCurItem)
		{
			pMenu->m_SelectRect.x = x + ICON_WIDTH;
			pMenu->m_SelectRect.y = y;
			if(pMenu->m_nPageSize < pMenu->m_nItemCount)
				pMenu->m_SelectRect.dx = pRect->dx - ICON_WIDTH - SCROLLBAR_WIDTH;
			else
				pMenu->m_SelectRect.dx = pRect->dx - ICON_WIDTH;
			pMenu->m_SelectRect.dy = BETWEEN_LIST; 
			IDISPLAY_DrawRect(pMenu->m_pme->m_pIDisplay , &pMenu->m_SelectRect , SELECT_COLOR , SELECT_FILL , IDF_RECT_FRAME | IDF_RECT_FILL);
			//IDISPLAY_FillRect(pMenu->m_pme->m_pIDisplay , &pMenu->m_SelectRect , SELECT_COLOR);
			pMenu->m_bIsScroll = FALSE;
			ISHELL_CancelTimer(pMenu->m_pme->m_pIShell, (PFNNOTIFY)ScrollText , (void*)pMenu);
			if(NULL != pIndex->m_pAECname)
			{
				int nWidth;
				nWidth = IDISPLAY_MeasureText(pMenu->m_pme->m_pIDisplay , pMenu->m_eMfont , pIndex->m_pAECname);
				if((pRect->dx - ICON_WIDTH) >= nWidth)//判断是否需要滚屏显示
				{
					pMenu->m_bIsScroll = FALSE;
					IDISPLAY_SetColor(pMenu->m_pme->m_pIDisplay, CLR_USER_TEXT, SELECT_TEXT_COLOR);
					IDISPLAY_DrawText(pMenu->m_pme->m_pIDisplay ,
							  pMenu->m_eMfont ,
							  pIndex->m_pAECname , 
							  -1 ,
							  x + ICON_WIDTH ,
							  y + TEXT_TOPHIGH ,
							  NULL ,
							  IDF_TEXT_TRANSPARENT);
				}
				else
				{
					pMenu->m_x = x + ICON_WIDTH;
					pMenu->m_y = y + TEXT_TOPHIGH;
					pMenu->m_bIsScroll = TRUE;
					pMenu->m_nTextLenPix = nWidth;
					ScrollText(pMenu);
				}
			}//if(NULL != pIndex->m_pAECname)
		}//if(pIndex == pMenu->m_pCurItem)
		else if(NULL != pIndex->m_pAECname)//&& pIndex != pMenu->m_pCurItem
		{
			AEERect rectTemp;
			rectTemp.x = x;
			rectTemp.y = y;
			rectTemp.dx = pRect->dx;
			rectTemp.dy = BETWEEN_LIST;
			IDISPLAY_SetColor(pMenu->m_pme->m_pIDisplay, CLR_USER_TEXT, TEXT_COLOR);
			IDISPLAY_DrawText(pMenu->m_pme->m_pIDisplay ,
							  pMenu->m_eMfont ,
							  pIndex->m_pAECname , 
							  -1 ,
							  x + ICON_WIDTH ,
							  y + TEXT_TOPHIGH ,
							  &rectTemp ,
							  IDF_TEXT_TRANSPARENT);
		}
		pIndex = pIndex->m_pNext;
		if(NULL == pIndex)
			break;
	}
	//绘制滚动条
	if(pMenu->m_nPageSize < pMenu->m_nItemCount)
	{
		AEERect tagRect;
		tagRect.x = pMenu->m_pRect->dx + pMenu->m_pRect->x - SCROLLBAR_WIDTH;
		tagRect.dx = SCROLLBAR_WIDTH;		
		tagRect.y = pMenu->m_pRect->y;
		tagRect.dy = pMenu->m_pRect->dy;
		IDISPLAY_DrawRect(pMenu->m_pme->m_pIDisplay , &tagRect , SCROLL_COLOR , SCROLL_BACK , IDF_RECT_FRAME | IDF_RECT_FILL);
		tagRect.y = pMenu->m_pRect->y + (pMenu->m_nCurPage * pMenu->m_pRect->dy) / pMenu->m_nItemCount;
		tagRect.dy = (pMenu->m_nPageSize * pMenu->m_pRect->dy) / pMenu->m_nItemCount;
		IDISPLAY_FillRect(pMenu->m_pme->m_pIDisplay , &tagRect , SCROLL_FILL);
	}
	IDISPLAY_Update(pMenu->m_pme->m_pIDisplay);
}

void ScrollText(CListMenu* pMenu)
{
	//RGBVAL	rgb;
	if(NULL == pMenu)
		return;
	if(FALSE == pMenu->m_bIsScroll)
		return;
	IDISPLAY_DrawRect(pMenu->m_pme->m_pIDisplay , &pMenu->m_SelectRect , SELECT_COLOR , SELECT_FILL , IDF_RECT_FRAME | IDF_RECT_FILL);
	//IDISPLAY_FillRect(pMenu->m_pme->m_pIDisplay , &pMenu->m_SelectRect , SELECT_COLOR);
	IDISPLAY_SetColor(pMenu->m_pme->m_pIDisplay, CLR_USER_TEXT, SELECT_TEXT_COLOR);
	IDISPLAY_DrawText(pMenu->m_pme->m_pIDisplay ,
					  pMenu->m_eMfont ,
					  pMenu->m_pCurItem->m_pAECname, 
					  -1 ,
					  pMenu->m_x ,
					  pMenu->m_y ,
					  &pMenu->m_SelectRect ,
					  IDF_TEXT_TRANSPARENT);
	//IDISPLAY_SetColor(pMenu->m_pme->m_pIDisplay, CLR_USER_TEXT, rgb);
	IDISPLAY_Update(pMenu->m_pme->m_pIDisplay);
	pMenu->m_x -= 2;
	if((pMenu->m_x + pMenu->m_nTextLenPix) < (pMenu->m_SelectRect.x + pMenu->m_SelectRect.dx))
		pMenu->m_x = pMenu->m_SelectRect.x;
		
	if(pMenu->m_bIsActive)
	{
		if(pMenu->m_x == pMenu->m_SelectRect.x)
			ISHELL_SetTimer(pMenu->m_pme->m_pIShell , SCROLL_LONGTIME , (PFNNOTIFY)ScrollText , (void*)pMenu);
		else
			ISHELL_SetTimer(pMenu->m_pme->m_pIShell , SCROLL_TIME , (PFNNOTIFY)ScrollText , (void*)pMenu);
	}
}

void CListMenu_SetActive(CListMenu* pMenu , boolean bActive)
{
	if(NULL == pMenu)
		return;
	if(FALSE == bActive)
	{
		ISHELL_CancelTimer(pMenu->m_pme->m_pIShell, (PFNNOTIFY)ScrollText , (void*)pMenu);
		pMenu->m_bIsScroll = FALSE;
	}
	pMenu->m_bIsActive = bActive;
}


//ClistItem
CListItem*	CListItem_New()
{
	CListItem*	pListItemRet;
	pListItemRet = NULL;
	pListItemRet = MALLOC(sizeof(CListItem));
	if(NULL == pListItemRet)
		return NULL;
	
	MEMSET(pListItemRet , 0 , sizeof(CListItem));
	return pListItemRet;
}

void CListItem_SetItem(CListItem* pItem , AECHAR* pAECname , void* pData , uint16 nIcon , uint16 nID , uint32 nFlag)
{
	FREEIF(pItem->m_pAECname);
	FREEIF(pItem->m_pData);
	pItem->m_pAECname = pAECname;
	pItem->m_pData = pData;
	pItem->m_nIcon = nIcon;
	pItem->m_nNodID = nID;
	pItem->m_nData = nFlag;
}

CListItem*	CListItem_NewEx(AECHAR*	pAECname , void* pData , uint16 nIcon , uint16 nID , uint32 nFlag)
{
	CListItem*	pListItemRet;
	pListItemRet = CListItem_New();
	if(NULL == pListItemRet)
		return NULL;
	pListItemRet->m_pAECname = pAECname;
	pListItemRet->m_pData = pData;
	pListItemRet->m_nIcon = nIcon;
	pListItemRet->m_nNodID = nID;
	pListItemRet->m_nData = nFlag;

	return pListItemRet;
}

void CListItem_Release(CListItem** pFree)
{
	if(pFree && *pFree)
	{
		FREEIF((*pFree)->m_pAECname);
		FREEIF((*pFree)->m_pData);
		FREEIF(*pFree);
		*pFree = NULL;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -