Keep highlight on the current highlight menu if form auto exit, not exit by user input.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Eric Dong <eric.dong@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15234 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@ -1478,6 +1478,7 @@ FindTopMenu (
|
|||||||
UI_MENU_OPTION *SavedMenuOption;
|
UI_MENU_OPTION *SavedMenuOption;
|
||||||
UINTN TmpValue;
|
UINTN TmpValue;
|
||||||
|
|
||||||
|
TmpValue = 0;
|
||||||
TopRow = gStatementDimensions.TopRow + SCROLL_ARROW_HEIGHT;
|
TopRow = gStatementDimensions.TopRow + SCROLL_ARROW_HEIGHT;
|
||||||
BottomRow = gStatementDimensions.BottomRow - SCROLL_ARROW_HEIGHT;
|
BottomRow = gStatementDimensions.BottomRow - SCROLL_ARROW_HEIGHT;
|
||||||
|
|
||||||
@ -1521,19 +1522,37 @@ FindTopMenu (
|
|||||||
UpdateOptionSkipLines (SavedMenuOption);
|
UpdateOptionSkipLines (SavedMenuOption);
|
||||||
|
|
||||||
//
|
//
|
||||||
// If highlight opcode is date/time, keep the highlight row info not change.
|
// FormRefreshEvent != NULL means this form will auto exit at an interval, display engine
|
||||||
|
// will try to keep highlight on the current position after this form exit and re-enter.
|
||||||
//
|
//
|
||||||
if ((SavedMenuOption->ThisTag->OpCode->OpCode == EFI_IFR_DATE_OP || SavedMenuOption->ThisTag->OpCode->OpCode == EFI_IFR_TIME_OP) &&
|
// HiiHandle + QuestionId can find the only one question in the system.
|
||||||
(gHighligthMenuInfo.QuestionId != 0) &&
|
|
||||||
(gHighligthMenuInfo.QuestionId == GetQuestionIdInfo(SavedMenuOption->ThisTag->OpCode))) {
|
|
||||||
//
|
//
|
||||||
// Still show the highlight menu before exit from display engine.
|
// If this question has question id, save the question id info to find the question.
|
||||||
|
// else save the opcode buffer to find it.
|
||||||
//
|
//
|
||||||
|
if (gFormData->FormRefreshEvent != NULL && gFormData->HiiHandle == gHighligthMenuInfo.HiiHandle) {
|
||||||
|
if (gHighligthMenuInfo.QuestionId != 0) {
|
||||||
|
if (gHighligthMenuInfo.QuestionId == GetQuestionIdInfo(SavedMenuOption->ThisTag->OpCode)) {
|
||||||
BottomRow = gHighligthMenuInfo.DisplayRow + SavedMenuOption->Skip;
|
BottomRow = gHighligthMenuInfo.DisplayRow + SavedMenuOption->Skip;
|
||||||
|
//
|
||||||
|
// SkipValue only used for menu at the top of the form.
|
||||||
|
// If Highlight menu is not at the top, this value will be update later.
|
||||||
|
//
|
||||||
|
TmpValue = gHighligthMenuInfo.SkipValue;
|
||||||
|
}
|
||||||
|
} else if (gHighligthMenuInfo.OpCode != NULL){
|
||||||
|
if (!CompareMem (gHighligthMenuInfo.OpCode, SavedMenuOption->ThisTag->OpCode, gHighligthMenuInfo.OpCode->Length)) {
|
||||||
|
BottomRow = gHighligthMenuInfo.DisplayRow + SavedMenuOption->Skip;
|
||||||
|
//
|
||||||
|
// SkipValue only used for menu at the top of the form.
|
||||||
|
// If Highlight menu is not at the top, this value will be update later.
|
||||||
|
//
|
||||||
|
TmpValue = gHighligthMenuInfo.SkipValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SavedMenuOption->Skip >= BottomRow - TopRow) {
|
if (SavedMenuOption->Skip >= BottomRow - TopRow) {
|
||||||
TmpValue = 0;
|
|
||||||
*TopOfScreen = NewPos;
|
*TopOfScreen = NewPos;
|
||||||
} else {
|
} else {
|
||||||
*TopOfScreen = FindTopOfScreenMenu(NewPos, BottomRow - TopRow - SavedMenuOption->Skip, &TmpValue);
|
*TopOfScreen = FindTopOfScreenMenu(NewPos, BottomRow - TopRow - SavedMenuOption->Skip, &TmpValue);
|
||||||
@ -1547,11 +1566,14 @@ FindTopMenu (
|
|||||||
Update highlight menu info.
|
Update highlight menu info.
|
||||||
|
|
||||||
@param MenuOption The menu opton which is highlight.
|
@param MenuOption The menu opton which is highlight.
|
||||||
|
@param SkipValue The skipvalue info for this menu.
|
||||||
|
SkipValue only used for the menu at the top of the form.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
UpdateHighlightMenuInfo (
|
UpdateHighlightMenuInfo (
|
||||||
IN UI_MENU_OPTION *MenuOption
|
IN UI_MENU_OPTION *MenuOption,
|
||||||
|
IN UINTN SkipValue
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
FORM_DISPLAY_ENGINE_STATEMENT *Statement;
|
FORM_DISPLAY_ENGINE_STATEMENT *Statement;
|
||||||
@ -1568,14 +1590,39 @@ UpdateHighlightMenuInfo (
|
|||||||
gSequence = (UINT16) MenuOption->Sequence;
|
gSequence = (UINT16) MenuOption->Sequence;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Record highlight row info for date/time opcode.
|
// FormRefreshEvent != NULL means this form will auto exit at an interval, display engine
|
||||||
|
// will try to keep highlight on the current position after this form exit and re-enter.
|
||||||
//
|
//
|
||||||
if (Statement->OpCode->OpCode == EFI_IFR_DATE_OP || Statement->OpCode->OpCode == EFI_IFR_TIME_OP) {
|
// HiiHandle + QuestionId can find the only one question in the system.
|
||||||
|
//
|
||||||
|
// If this question has question id, base on the question id info to find the question.
|
||||||
|
// else base on the opcode buffer to find it.
|
||||||
|
//
|
||||||
|
if (gFormData->FormRefreshEvent != NULL) {
|
||||||
|
gHighligthMenuInfo.HiiHandle = gFormData->HiiHandle;
|
||||||
gHighligthMenuInfo.QuestionId = GetQuestionIdInfo(Statement->OpCode);
|
gHighligthMenuInfo.QuestionId = GetQuestionIdInfo(Statement->OpCode);
|
||||||
|
|
||||||
|
//
|
||||||
|
// if question id == 0, save the opcode buffer for later use.
|
||||||
|
//
|
||||||
|
if (gHighligthMenuInfo.QuestionId == 0) {
|
||||||
|
if (gHighligthMenuInfo.OpCode != NULL) {
|
||||||
|
FreePool (gHighligthMenuInfo.OpCode);
|
||||||
|
}
|
||||||
|
gHighligthMenuInfo.OpCode = AllocateCopyPool (Statement->OpCode->Length, Statement->OpCode);
|
||||||
|
ASSERT (gHighligthMenuInfo.OpCode != NULL);
|
||||||
|
}
|
||||||
gHighligthMenuInfo.DisplayRow = (UINT16) MenuOption->Row;
|
gHighligthMenuInfo.DisplayRow = (UINT16) MenuOption->Row;
|
||||||
|
gHighligthMenuInfo.SkipValue = (UINT16) SkipValue;
|
||||||
} else {
|
} else {
|
||||||
|
gHighligthMenuInfo.HiiHandle = NULL;
|
||||||
gHighligthMenuInfo.QuestionId = 0;
|
gHighligthMenuInfo.QuestionId = 0;
|
||||||
|
if (gHighligthMenuInfo.OpCode != NULL) {
|
||||||
|
FreePool (gHighligthMenuInfo.OpCode);
|
||||||
|
gHighligthMenuInfo.OpCode = NULL;
|
||||||
|
}
|
||||||
gHighligthMenuInfo.DisplayRow = 0;
|
gHighligthMenuInfo.DisplayRow = 0;
|
||||||
|
gHighligthMenuInfo.SkipValue = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
RefreshKeyHelp(gFormData, Statement, FALSE);
|
RefreshKeyHelp(gFormData, Statement, FALSE);
|
||||||
@ -2252,7 +2299,7 @@ UiDisplayMenu (
|
|||||||
if (SkipHighLight) {
|
if (SkipHighLight) {
|
||||||
MenuOption = SavedMenuOption;
|
MenuOption = SavedMenuOption;
|
||||||
SkipHighLight = FALSE;
|
SkipHighLight = FALSE;
|
||||||
UpdateHighlightMenuInfo (MenuOption);
|
UpdateHighlightMenuInfo (MenuOption, TopOfScreen == &MenuOption->Link ? SkipValue : 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2296,7 +2343,7 @@ UiDisplayMenu (
|
|||||||
MenuOption = MENU_OPTION_FROM_LINK (NewPos);
|
MenuOption = MENU_OPTION_FROM_LINK (NewPos);
|
||||||
Statement = MenuOption->ThisTag;
|
Statement = MenuOption->ThisTag;
|
||||||
|
|
||||||
UpdateHighlightMenuInfo (MenuOption);
|
UpdateHighlightMenuInfo (MenuOption, Temp2);
|
||||||
|
|
||||||
if (!IsSelectable (MenuOption)) {
|
if (!IsSelectable (MenuOption)) {
|
||||||
break;
|
break;
|
||||||
@ -3393,5 +3440,9 @@ UnloadDisplayEngine (
|
|||||||
|
|
||||||
FreeDisplayStrings ();
|
FreeDisplayStrings ();
|
||||||
|
|
||||||
|
if (gHighligthMenuInfo.OpCode != NULL) {
|
||||||
|
FreePool (gHighligthMenuInfo.OpCode);
|
||||||
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/** @file
|
/** @file
|
||||||
FormDiplay protocol to show Form
|
FormDiplay protocol to show Form
|
||||||
|
|
||||||
Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials are licensed and made available under
|
This program and the accompanying materials are licensed and made available under
|
||||||
the terms and conditions of the BSD License that accompanies this distribution.
|
the terms and conditions of the BSD License that accompanies this distribution.
|
||||||
The full text of the license may be found at
|
The full text of the license may be found at
|
||||||
@ -194,8 +194,11 @@ typedef struct {
|
|||||||
} SCREEN_OPERATION_T0_CONTROL_FLAG;
|
} SCREEN_OPERATION_T0_CONTROL_FLAG;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
EFI_HII_HANDLE HiiHandle;
|
||||||
EFI_QUESTION_ID QuestionId;
|
EFI_QUESTION_ID QuestionId;
|
||||||
|
EFI_IFR_OP_HEADER *OpCode;
|
||||||
UINT16 DisplayRow;
|
UINT16 DisplayRow;
|
||||||
|
UINT16 SkipValue;
|
||||||
} DISPLAY_HIGHLIGHT_MENU_INFO;
|
} DISPLAY_HIGHLIGHT_MENU_INFO;
|
||||||
|
|
||||||
#define UI_MENU_OPTION_SIGNATURE SIGNATURE_32 ('u', 'i', 'm', 'm')
|
#define UI_MENU_OPTION_SIGNATURE SIGNATURE_32 ('u', 'i', 'm', 'm')
|
||||||
|
Reference in New Issue
Block a user