📄 listmenu.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 + -