mso_confirm.c

来自「ZORAN 962/966 SOURCE CODE,DVD chip」· C语言 代码 · 共 320 行

C
320
字号
/****************************************************************************************************
*  Copyright (c) 2005 ZORAN Corporation, All Rights Reserved
*  THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF ZORAN CORPORATION
*
*  File: o_confirm.c
*
* Description: Project definition of the MSO_CONFIRM
* =========
*
****************************************************************************************************/
#include "Config.h"		// Global Configuration - do not remove!
#include "include\sysdefs.h"	// Global definition - do not remove!

/****************************************************************************************************
*	INCLUDE FILES
****************************************************************************************************/
// Include project specific
#include "gui\menu_system\ms_display.h"
#include "GUI\Menu_system\ms_screen.h"
#include "GUI\Menu_system\ms_component.h"
#include "GUI\Menu_system\osd_rendering.h"
#include "GUI\Menu_system\ms_send_op.h"
#include "GUI\Menu_system\ms_menu.h"
#include "GUI\Menu_system\ms_object.h"
#include "GUI\Menu_system\ms_container.h"
#include "Font\fonts.h"
#include "GUI\Object_class\Button\mso_button.h"
#include "GUI\Object_class\Confirm\mso_confirm.h"
#include "Menu\menu_operation_def.h"

// TODO: Shouldn't include a file from Customer folder to Gui\Object_class
#include "Menu_config\menu_config_common.h"

/****************************************************************************************************
*	DEFINITION: Private named constants
****************************************************************************************************/
#define OSD_MESSAGE_FONT			FONT_0

#define AREA_OSD_MESSAGE_X			12
#define AREA_OSD_MESSAGE_Y			38
#define AREA_OSD_MESSAGE_H			((pFonts[OSD_MESSAGE_FONT])->m_cMaxPixelHeight)
#define AREA_BUTTON_Y			(AREA_OSD_MESSAGE_Y)
#define AREA_BUTTON_W			100
#define AREA_BUTTON_H			32
#define AREA_MESSAGE_WND_X		20
#define AREA_MESSAGE_WND_Y		20
#define AREA_MESSAGE_WND_W		340
#define AREA_MESSAGE_WND_H		(AREA_BUTTON_Y + AREA_BUTTON_H + AREA_OSD_MESSAGE_H)
#define OFFSET_1		1

/****************************************************************************************************
*	DECLARATION: Private (static) functions
****************************************************************************************************/

/**************************************************************************
* 	Display functions
***************************************************************************/

//
// PARAMETER DECLARATIONS
//

/**************************************************************************
* DESCRIPTORS
***************************************************************************/
static CONST OSD_TEXT oYesText =
{	OSDR_GetFormUniStr_OsdMessage,		(UINT32)S_YES	};

// The descriptor for Confirm Yes Button
STATIC CONST MS_DESCRIPTOR_BUTTON oConfirmYesButtonDescriptor =
{// MS_DESCRIPTOR
	{
		{
			sizeof(MSO_BUTTON),
			MS_NAV_TO_ALGINED_Y,
			MS_ATTR_FOCUSABLE | MS_ATTR_OSD_LAYER_0 | MS_ATTR_RADIO_BUTTON,
			{
				0,
				0,
				AREA_BUTTON_W,
				AREA_BUTTON_H
			},
			OBUTTON_Operation,
			OBUTTON_FillOSDSeg,
			mpParamNull
		},
		(MS_X_Y_ALIGN *)&oButtonTextXYAlign,
		(MS_COLOR_SET *)&oButtonTextColorSet,
		(MS_BITMAP_SET *)&oButtonBitmapSet,
		(OSD_TEXT *)&oYesText,
		FONT_0,
		NULL,
		NULL
	},
	MS_OP_BUTTON_YES
};
/**************************************************************************/
// The descriptor for Confirm No Button
static CONST OSD_TEXT oNoText =
{	OSDR_GetFormUniStr_OsdMessage,		(UINT32)S_NO	};

STATIC CONST MS_DESCRIPTOR_BUTTON oConfirmNoButtonDescriptor =
{// MS_DESCRIPTOR
	{
		{
			sizeof(MSO_BUTTON),
			MS_NAV_TO_ALGINED_Y,
			MS_ATTR_FOCUSABLE | MS_ATTR_OSD_LAYER_0 | MS_ATTR_RADIO_BUTTON,
			{
				0,
				0,
				AREA_BUTTON_W,
				AREA_BUTTON_H
			},
			OBUTTON_Operation,
			OBUTTON_FillOSDSeg,
			mpParamNull
		},
		(MS_X_Y_ALIGN *)&oButtonTextXYAlign,
		(MS_COLOR_SET *)&oButtonTextColorSet,
		(MS_BITMAP_SET *)&oButtonBitmapSet,
		(OSD_TEXT *)&oNoText,
		FONT_0,
		NULL,
		NULL
	},
	MS_OP_BUTTON_NO
};

/**************************************************************************/
// The descriptor for Confirm OK Button
static CONST OSD_TEXT oOkText =
{	OSDR_GetFormUniStr_OsdMessage,		(UINT32)S_OK	};

STATIC CONST MS_DESCRIPTOR_BUTTON oConfirmOKButtonDescriptor =
{// MS_DESCRIPTOR
	{
		{
			sizeof(MSO_BUTTON),
			MS_NAV_TO_ALGINED_Y,
			MS_ATTR_FOCUSABLE | MS_ATTR_OSD_LAYER_0 | MS_ATTR_RADIO_BUTTON,
			{
				0,
				0,
				AREA_BUTTON_W,
				AREA_BUTTON_H
			},
			OBUTTON_Operation,
			OBUTTON_FillOSDSeg,
			mpParamNull
		},
		(MS_X_Y_ALIGN *)&oButtonTextXYAlign,
		(MS_COLOR_SET *)&oButtonTextColorSet,
		(MS_BITMAP_SET *)&oButtonBitmapSet,
		(OSD_TEXT *)&oOkText,
		FONT_0,
		NULL,
		NULL
	},
	MS_OP_BUTTON_YES
};

/**************************************************************************
* 	Utility functions
***************************************************************************/

/**************************************************************************
* 	Operation functions
***************************************************************************/

/**************************************************************************
*	Function 	: 	OCONFIRM_Operation
*
*	In		:
*
*	Out		:
*
*	Desc 	:
 ***************************************************************************/
MS_OP OCONFIRM_Operation(MSO_OBJECT __NEAR* pThis, MS_OP MsOp, UINT32 lParam)
{

	if (MS_IS_USER_OP(MsOp))
	{
		switch(MsOp)
		{
			case MS_OP_EJECT:
			case MS_OP_POWER:
			case MS_OP_SETUP:
				return MsOp;
			case MS_OP_RIGHT:
			case MS_OP_LEFT:
			case MS_OP_ENTER:
				break;
			default:
				return MS_OP_NONE;
		}
	}

	switch(MsOp)
	{
// TODO: Use table to add buttons, make CANCEL invisible is MS_IsConfirmOKButtonOnly, let the container set the focus using attributes
		case MS_OP_INIT:
		{
			MSO_OBJECT __NEAR *pObject;
			MS_DESCRIPTOR_CONFIRM* pDescriptor = (MS_DESCRIPTOR_CONFIRM*)pThis->mpDescriptor;
			UINT8 cNbrMessages = pDescriptor->mcNbrMessages;
			UINT16 wWidth = ((MS_DESCRIPTOR*)pDescriptor)->moArea.mwW;

			if (AREA_MESSAGE_WND_W > wWidth)
				wWidth = AREA_MESSAGE_WND_W;
			if (MS_IsConfirmOKButtonOnly(pThis))
			{
				pObject = MS_FindObjectFromDescriptor((MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&oConfirmOKButtonDescriptor);
				if (pObject == NULL)
				{
					pObject = MS_CreateAndAddObject((MS_DESCRIPTOR*)&oConfirmOKButtonDescriptor, (MSO_CONTAINER __NEAR*)pThis);
					MS_ObjectMove(pObject, (wWidth - AREA_BUTTON_W)/2, AREA_BUTTON_Y + (cNbrMessages * AREA_OSD_MESSAGE_H));
				}
			}
			else
			{
				pObject = MS_FindObjectFromDescriptor((MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&oConfirmYesButtonDescriptor);
				if (pObject == NULL)
				{
					pObject = MS_CreateAndAddObject((MS_DESCRIPTOR*)&oConfirmYesButtonDescriptor, (MSO_CONTAINER __NEAR*)pThis);
					MS_ObjectMove(pObject, (wWidth - 2 * AREA_BUTTON_W)/3, AREA_BUTTON_Y + (cNbrMessages * AREA_OSD_MESSAGE_H));
				}

				pObject = MS_FindObjectFromDescriptor((MSO_CONTAINER __NEAR*)pThis, (MS_DESCRIPTOR*)&oConfirmNoButtonDescriptor);
				if (pObject == NULL)
				{
					pObject = MS_CreateAndAddObject((MS_DESCRIPTOR*)&oConfirmNoButtonDescriptor, (MSO_CONTAINER __NEAR*)pThis);
					MS_ObjectMove(pObject, (2 * wWidth - AREA_BUTTON_W)/3, AREA_BUTTON_Y + (cNbrMessages * AREA_OSD_MESSAGE_H));
				}
			}
            MS_ObjectMove(pThis, AREA_MESSAGE_WND_X, AREA_MESSAGE_WND_Y);
			MS_ObjectResize(pThis, wWidth, AREA_MESSAGE_WND_H + (cNbrMessages * AREA_OSD_MESSAGE_H));

			// Set the focus:
			MS_ScreenSetFocusObject(pObject);
		}
			break;

		default:
			break;

	}
	MsOp = MS_ComponentBasicOperation(pThis, MsOp, lParam);
	if (MsOp == MS_OP_BUTTON_YES || MsOp == MS_OP_BUTTON_NO)
	{
		MSO_OBJECT __NEAR *pObject;

		if ((((MS_DESCRIPTOR_CONFIRM*)(pThis->mpDescriptor))->mConfirmAction) != NULL)
			(((MS_DESCRIPTOR_CONFIRM*)(pThis->mpDescriptor))->mConfirmAction)((MsOp == MS_OP_BUTTON_YES));
		//find previously focused object in pThis->mpParent and set focus to it
		pObject = MS_ContainerGetPrevFocusObject((MSO_CONTAINER __NEAR*)pThis->mpParent);
		if (pObject != NULL)
			MS_ScreenSetFocusObject(pObject);

		MS_SetToBeRemoved(pThis);
		MS_DisplayAddObject(pThis);
	}
	return MsOp;

}

/**************************************************************************
* 	Display functions
***************************************************************************/

/**************************************************************************
*	Function 	: 	OCONFIRM_FillOSDSeg
*
*	In		:
*
*	Out		:
*
*	Desc 	:
 ***************************************************************************/
BOOL OCONFIRM_FillOSDSeg(MSO_OBJECT __NEAR* pThis, MS_AREA __NEAR* pAbsArea)
{
	MS_DESCRIPTOR_CONFIRM* pDescriptor = (MS_DESCRIPTOR_CONFIRM*)pThis->mpDescriptor;
	UINT16 wStartY;
	UINT8 cMessageIndex;


	// Search for the index of the subtitle line to display
	for (cMessageIndex = 0; cMessageIndex < pDescriptor->mcNbrMessages; cMessageIndex++)
	{
		wStartY = pAbsArea->msY + AREA_OSD_MESSAGE_Y + (AREA_OSD_MESSAGE_H * cMessageIndex) - AREA_OSD_MESSAGE_H - OFFSET_1;
		if (((goOsdSeg.msAbsY >= wStartY) && (goOsdSeg.msAbsY < (wStartY + AREA_OSD_MESSAGE_H))))
			break;
	}

	OSDR_FillOsdSegBitmapFitArea(pDescriptor->mpBgBmp, pAbsArea);

	if (cMessageIndex < pDescriptor->mcNbrMessages)
	{
		if ((pDescriptor->mpOSDMessages)[cMessageIndex] != NULL && (pDescriptor->mpOSDMessages)[cMessageIndex]->mGetStr != NULL)
		{
			FORMATED_UNICODE_STRING oFormUniStr;
			oFormUniStr.mtFontIndex = FONT_0;
			
			((pDescriptor->mpOSDMessages)[cMessageIndex]->mGetStr)((FORMATED_UNICODE_STRING __NEAR*)&oFormUniStr,
					(pDescriptor->mpOSDMessages)[cMessageIndex]->mParam);

			OSDR_FillOsdSegUniString((FORMATED_UNICODE_STRING __NEAR*)&oFormUniStr,
					pAbsArea,
					AREA_OSD_MESSAGE_X,
					AREA_OSD_MESSAGE_Y + (cMessageIndex * AREA_OSD_MESSAGE_H),
					ALIGN_H_LEFT,
					ALIGN_V_BOTTOM,
					pDescriptor->mwTextColor);
		}
	}

	return FALSE;
}

⌨️ 快捷键说明

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