📄 mfw_mnu.c
字号:
attr = attr->items[mnu->lCursor[lvl]].menu;
lvl++;
}
mnu->curAttr = attr;
mnuUpdate(mnu);
}
else
{
mnu->flags |= E_MNU_ESCAPE;
if( mnu->handler )
if( mnu->mask & E_MNU_ESCAPE )
mnu->handler(E_MNU_ESCAPE,mnu);
}
dspl_Enable(uMode);//NM
return MfwResOk;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : mnuDone |
+--------------------------------------------------------------------+
PURPOSE : reset menu
*/
MfwRes mnuDone (MfwHnd m)
{
MfwMnu *mnu;
if( (mnu = mfwControl(m)) == 0 )
return MfwResIllHnd;
mnu->curAttr = mnu->attr;
mnu->level = 0;
memset(mnu->lCursor,UNUSED,sizeof(mnu->lCursor));
memset(mnu->lShift,1,sizeof(mnu->lShift));
mnu->lCursor[0] = 0;
return MfwResOk;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : mnuKeyAction |
+--------------------------------------------------------------------+
PURPOSE : perform direct jumping if there was pressed KCD_1
through KCD_9; in this case function returns 1;
otherwise function returns 0
*/
MfwRes mnuKeyAction (MfwHnd m, U8 keycode)
{
MfwMnu *mnu;
U8 directAccess;
if( (mnu = mfwControl(m)) == 0 )
return MfwResIllHnd;
switch( keycode )
{
case KCD_1: directAccess = 0; break;
case KCD_2: directAccess = 1; break;
case KCD_3: directAccess = 2; break;
case KCD_4: directAccess = 3; break;
case KCD_5: directAccess = 4; break;
case KCD_6: directAccess = 5; break;
case KCD_7: directAccess = 6; break;
case KCD_8: directAccess = 7; break;
case KCD_9: directAccess = 8; break;
default: return 0;
}
if( directAccess >= mnu->curAttr->nItems )
return 0;
//disabled hided menu key action
if( mnu->curAttr->items[directAccess].flagFunc(mnu,mnu->curAttr,&(mnu->curAttr->items[directAccess])) & MNU_ITEM_HIDE )
return 0;
mnu->lCursor[mnu->level] = directAccess;
MenuBrowseAction=BrowseNew; //xsf add 2003.03.13
mnuShow(m);
//mnuSelect(m); xsf remarked it 2003.02.18
return 1;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : mnuChooseItem |
+--------------------------------------------------------------------+
PURPOSE : Chooses the nItemst Item.
*/
MfwRes mnuChooseVisibleItem(MfwHnd m,U8 nItem)
{
MfwMnu *mnu;
int i;
if( (mnu = mfwControl(m)) == 0 )
return MfwResIllHnd;
if( (int)nItem<0 )
return MfwResIllHnd;
for( i = 0; i < mnu->curAttr->nItems; i++ )
{
if( !(mnu->curAttr->items[i].flagFunc(mnu,
mnu->curAttr,
&(mnu->curAttr->items[i]))==FLAGFUNC_GRAY)//zy change for flagFunction retun vlaue
& MNU_ITEM_HIDE )
{
if( !nItem )
{
mnu->lCursor[mnu->level] = i;
MenuBrowseAction=BrowseNew; //ganchh 2002/9/13
mnuUpdate(mnu);
return MfwResOk;
}
else
nItem--;
}
}
return MfwResIllHnd;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : menuIsEmpty |
+--------------------------------------------------------------------+
PURPOSE : check for empty submenu
*/
static int menuIsEmpty (MfwMnu *m, MfwMnuAttr *ma)
{
int i;
for( i = 0; i < ma->nItems; i++ )
if( !(ma->items[i].flagFunc(m,ma,&(ma->items[i]))==FLAGFUNC_GRAY)//zy change for flagFunction retun vlaue
& MNU_ITEM_HIDE )
return 0;
return 1;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : countVisible |
+--------------------------------------------------------------------+
PURPOSE : count visible items up to current item
*/
static int countVisible (MfwMnu *m, MfwMnuAttr *ma, int start)
{
int i, count;
for( i = 0, count = 0; i < start; i++ )
{
if( !(ma->items[i].flagFunc(m,ma,&(ma->items[i]))==FLAGFUNC_GRAY)//zy change for flagFunction retun vlaue
& MNU_ITEM_HIDE )
count++;
}
return count;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : countVisible |
+--------------------------------------------------------------------+
PURPOSE : search the last be visible line
*/
static int MenuVisibleLastCursor (MfwMnu *m, MfwMnuAttr *ma, int end)
{
int i, count;
for( i =end ; i >=0; i-- )
{
if( !(ma->items[i].flagFunc(m,ma,&(ma->items[i]))==FLAGFUNC_GRAY)//zy change for flagFunction retun vlaue
& MNU_ITEM_HIDE )
{
count=i;
i=-1;
}
}
return count;
}
/*****************************************
$Function:
$Description:search the visible item by specied step forword or backwork
*****************************************************/
U8 getVisibleByStep(MfwMnu *m, MfwMnuAttr *ma,int start,int step)
{
U8 i;
for( i = start; i< ma->nItems && i>=0; i+=step )
{
if( !(ma->items[i].flagFunc(m,ma,&(ma->items[i]))==FLAGFUNC_GRAY)
& MNU_ITEM_HIDE )
return i;
}
return 0xff;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : countVisibleItems |
+--------------------------------------------------------------------+
PURPOSE : count visible items in the current branch
*/
U8 mnuCountVisibleItems (MfwHnd m)
{
MfwMnu *mnu;
if( (mnu = mfwControl(m)) == 0 )
return 0;
return(U8)countVisible(mnu, mnu->curAttr,mnu->curAttr->nItems);
}
/*
+--------------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : countCurrentVisibleItem |
+--------------------------------------------------------------------------+
PURPOSE : returns the position of the current Item
*/
#if 0
U8 mnuCountCurrentVisibleItem(MfwMnu* mnu)
{
U8 i;
U8 pos=0;
for( i = 0; i < mnu->curAttr->nItems; i++ )
{
if( (mnu->lCursor[mnu->level]) == i )
return pos;
if( !(mnu->curAttr->items[i].flagFunc(mnu,
mnu->curAttr,
&(mnu->curAttr->items[i]))==FLAGFUNC_GRAY)//zy change for flagFunction retun vlaue
& MNU_ITEM_HIDE )
pos++;
}
return pos;
}
#endif
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : checkPredraw |
+--------------------------------------------------------------------+
PURPOSE : check / generate predraw event
*/
static int checkPredraw (MfwMnu *mnu, MfwMnuItem *mi,
char **t, MfwIcnAttr **icn)
{
int res = 0;
if( (mi->flagFunc(mnu,mnu->curAttr,mi)==FLAGFUNC_GRAY)& MNU_ITEM_NOTIFY )//zy change for flagFunction retun vlaue
{
mnu->flags |= E_MNU_PREDRAW;
if( mnu->handler )
if( mnu->mask & E_MNU_PREDRAW )
{
if( mi->exta )
{
((MfwItmExtPredraw*)(mi->exta))->str = *t;
((MfwItmExtPredraw*)(mi->exta))->icon = *icn;
}
res = mnu->handler(E_MNU_PREDRAW,mi);
if( mi->exta )
{
*t = ((MfwItmExtPredraw*)(mi->exta))->str;
*icn = ((MfwItmExtPredraw*)(mi->exta))->icon;
}
}
mnu->flags &= ~E_MNU_PREDRAW;
}
return res;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : checkPostdraw |
+--------------------------------------------------------------------+
PURPOSE : check / generate postdraw event
*/
static int checkPostdraw (MfwMnu *mnu, MfwMnuItem *mi)
{
int res = 0;
if( (mi->flagFunc(mnu,mnu->curAttr,mi)==FLAGFUNC_GRAY) & MNU_ITEM_NOTIFY )//zy change for flagFunction retun vlaue
{
mnu->flags |= E_MNU_POSTDRAW;
if( mnu->handler )
if( mnu->mask & E_MNU_POSTDRAW )
res = mnu->handler(E_MNU_POSTDRAW,mi);
mnu->flags &= ~E_MNU_POSTDRAW;
}
return res;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : checkStatus |
+--------------------------------------------------------------------+
PURPOSE : check / insert item status (string MUST be in RAM)
*/
static int checkStatus (MfwMnu *m, MfwMnuAttr *ma, MfwMnuItem *mi,
char *p)
{
char *e; /* ES!! UNICODE */
if( !(mi->flagFunc(m,ma,mi)==FLAGFUNC_GRAY)& MNU_ITEM_STATED )//zy change for flagFunction retun vlaue
return 0;
e = mi->exta;
if( !e )
return 0;
while( *p )
{
if( *p == '%' ) /* ES!! : UNICODE */
{
switch( *(p+1) )
{
case 'c': /* single char */
strcpy(p+1,p+2);
*p = *e;
e++;
break;
}
}
p++;
}
return 1;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_MNU |
| STATE : code ROUTINE : drawPageMenu |
+--------------------------------------------------------------------+
PURPOSE : draws menu in page mode
GW 05/10/01 - Changed single value 'lng' to 2 values indicating if ID's should be
used (useStrID) and if the strings are ascii or unicode (uesDefLang).
*/
static void drawPageMenu (MfwMnu *mnu)
{
MfwMnuAttr *ma; /* menu attributes */
U16 th, tw, tl; /* text height, width, len */
U16 ax, ay, aw, ah, x; /* menu area dimensions */
int tLines; /* lines in item text */
int nLines; /* lines in menu area */
char *txt, *t2, save; /* item text & clip saver */
MfwIcnAttr * icn; /* item icon */
U8 oldFont = -1; /* save previous font */
MfwMnuItem *mi; /* current item */
char tt [64], *t; /* temp item string */
int i,currentTheme;
ma = mnu->curAttr;
if( ma->font != (U8) -1 )
oldFont = dspl_SelectFontbyID(ma->font); /* setup font */
ax = ma->area->px; ay = ma->area->py;
aw = ma->area->sx; ah = ma->area->sy;
th = dspl_GetFontHeight();
currentTheme=FlashSettingData.theme;
mi = ma->items + mnu->lCursor[mnu->level];
icn = mi->icon;
txt = mi->str;
if( mnu->useStrID ) /* use language handler */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -