menu.c

来自「基于h323协议的软phone」· C语言 代码 · 共 301 行

C
301
字号
/***************************************************************************
*
*  Module:         menu.c
*
*  Description:    
*
*  Author:         chenjian
*
*  Copyright 1999, BEP Technologies, Inc., All rights reserved
*
*
*  Change Log:
*
*  Date          By              Description
*  ==========    ===========     ==========================================
*  10/20/2003    chenjian        Created
*
***************************************************************************/

#include "menu.h"
#include "pgi_api.h"
#include "pgi_lcd.h"
#include <stdlib.h>

void initPoint(s_point* p)
{
	p->up = NULL;
	p->down = NULL;
	p->father = NULL;
	p->son = NULL;
	p->menu = NULL;
}

void clearMenuMen(s_menu* pMenu)
{
	if (pMenu->pRoot != NULL)
	{
		clearPointMem(pMenu->pRoot);
		pMenu->pRoot = NULL;
	}

	pMenu->pCur = NULL;
}

void clearPointMem(s_point* p)
{
	if (p != NULL)
	{
		clearPointMem(p->down);
		clearPointMem(p->son);

		if (p->menu != NULL)
		{
			free(p->menu);
		}

		free(p);
	}
}

void resetMenu(s_menu* pMenu)
{
	pMenu->pCur = pMenu->pRoot;
	pMenu->iDis = 0;
	pMenu->iShow= FALSE;
}

void checkDis(s_menu* pMenu)
{
	if (pMenu->iDis < 0)
	{
		pMenu->iDis = 0;
	}
	else if (pMenu->iDis >= LCD_ROW_NUM)
	{
		pMenu->iDis = LCD_ROW_NUM - 1;
	}
}

void showMenu(s_menu* pMenu)
{
	int i = LCD_ROW_NUM - 1, j = 0;
	s_point* psPoint = pMenu->pCur;
	
	checkDis(pMenu);
	
	while (i > pMenu->iDis && psPoint->down != NULL)
	{
		psPoint = psPoint->down;
		i--;
	}
	
	pMenu->iDis = i;
	psPoint = pMenu->pCur;
	for (i = 0; i < pMenu->iDis; i++)
	{
		if (psPoint->up != NULL)
		{
			psPoint= psPoint->up;
		}
		else
		{
			pMenu->iDis = i;
			break;
		}
	}
	
	ClearLcd();
	for (i = 0; i < pMenu->iDis; i++)
	{
		/*printf(" %s\n", psPoint->menu->strName);*/
		WriteLcd(" ", j, 0);
		WriteLcd(psPoint->menu->strName, j++, 1);
		psPoint = psPoint->down;
	}
	
	/*printf("*%s\n", psPoint->menu->strName);*/
#ifdef GXM16032
	WriteLcd("\x1a", j, 0);
#else
	WriteLcd("\x7E", j, 0);
#endif
	WriteLcd(psPoint->menu->strName, j++, 1);

	for (i = 0; i < LCD_ROW_NUM - pMenu->iDis - 1; i++)
	{
		if (psPoint->down == NULL)
		{
			break;
		}

		psPoint = psPoint->down;
		/*printf(" %s\n", psPoint->menu->strName);*/
		WriteLcd(" ", j, 0);
		WriteLcd(psPoint->menu->strName, j++, 1);
	}
}

int menuControl(s_event* psEvent, s_task* psTask)
{
	int iEvent = null_event, i;
	s_menu* psMenu = (s_menu*)psTask->pData;

	if (!psMenu->iShow)
	{
		if (psEvent->iEvent == ok_key_event)
		{
			psMenu->iShow = TRUE;
			showMenu(psMenu);
		}

		return iEvent;
	}

	switch (psEvent->iEvent)
	{
	case ok_key_event:
		{
			if (psMenu->pCur->son != NULL)
			{
				psMenu->pCur = psMenu->pCur->son;
				psMenu->iDis = 0;
				showMenu(psMenu);
			}
			else
			{
				iEvent = psMenu->pCur->menu->funcAction(psTask);
			}

			break;
		}		
	case cancel_key_event:
		{
			if (psMenu->pCur->father == NULL || psMenu->pCur->father->son == psMenu->pRoot)
			{
				iEvent = reset_event;
			}
			else
			{
				psMenu->pCur = psMenu->pCur->father;
				psMenu->iDis = 0;
				showMenu(psMenu);
			}

			break;
		}
	case left_key_event:
		{
			if (psMenu->pCur->up != NULL)
			{
				psMenu->pCur = psMenu->pCur->up;
				if (psMenu->iDis > 0)
				{
					psMenu->iDis--;
				}
			}
			else
			{
				i = 0;
				while (psMenu->pCur->down != NULL)
				{
					i++;
					psMenu->pCur = psMenu->pCur->down;
				}
				
				psMenu->iDis = (i < LCD_ROW_NUM) ? i : LCD_ROW_NUM - 1;
			}

			showMenu(psMenu);
			break;
		}
	case right_key_event:
		{
			if (psMenu->pCur->down != NULL)
			{
				psMenu->pCur = psMenu->pCur->down;
				if (psMenu->iDis < LCD_ROW_NUM - 1)
				{
					psMenu->iDis++;
				}
			}
			else
			{
				i = 0;
				while (psMenu->pCur->up != NULL)
				{
					i++;
					psMenu->pCur = psMenu->pCur->up;
				}
				
				psMenu->iDis = 0;
			}

			showMenu(psMenu);
			break;
		}
		
	}

	return iEvent;
}


int resetMenuAct(s_task* psTask)
{
	resetMenu((s_menu*)psTask->pData);
	return null_event;
}

int clearMenuAct(s_task* psTask)
{
	if (psTask != NULL)
	{
		s_menu* psMenu = (s_menu*)psTask->pData;
		clearMenuMen(psMenu);
		free(psMenu);
		if (psTask->psTask != NULL)
		{
			psTask->psTask->fClear(psTask->psTask);
		}
		free(psTask);
	}
	return null_event;
}

int menuAction(s_event* psEvent, s_task* psTask)
{	
	int iEvent = null_event;
	s_event sEvent;

	if (psEvent->iEvent == reset_event)
	{
		resetTask(psTask);
		return return_event;
	}
	else if (psEvent->iEvent == return_event)
	{
		clearSonTask(psTask);
		showMenu((s_menu*)psTask->pData);
		return null_event;
	}

	if (psTask->psTask != NULL)
	{
		iEvent = psTask->psTask->fAction(psEvent, psTask->psTask);
	}
	else
	{
		iEvent = menuControl(psEvent, psTask);
	}
	/*
	if (iEvent != null_event)
	{
		sEvent.iEvent = iEvent;
		iEvent = menuAction(&sEvent, psTask);
	}
	*/
	return iEvent;
}

⌨️ 快捷键说明

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