⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 guiimectrl.cc

📁 五行MMORPG引擎系统V1.0
💻 CC
字号:
//-----------------------------------------------------------------------------
// guiIMECtrl.cc
// 输入法界面
// 李亦编写 2005.11.20
//
//
//这是输入界面,需要与g_pIME配合使用
//可以通过控制台定义使用
//-----------------------------------------------------------------------------

#include "console/console.h"
#include "console/consoleTypes.h"
#include "dgl/dgl.h"
#include "game/game.h"
//#include "game/gameconnection.h"
#include "gui/utility/guiIMECtrl.h"
#include "gui/controls/guiMLTextCtrl.h"
//#include "gui/controls/guiTextCtrl.h"
#include "gui/core/guiCanvas.h"
#include "gui/controls/guiButtonCtrl.h"
#include "gui/controls/guiTextEditCtrl.h"
#include "platform/platformIME.h"
#include "rpg/RPGTextParse.h"


#define C_SHAPRE	 "IMECtrlSharp"
#define C_SYMBOL	 "IMECtrlSymbol"
#define C_NEXT		 "IMECtrlNext"
#define C_TOGGLE	 "IMECtrlToggle"
#define C_INPUT	 "IMECtrlInput"
#define C_INPUT2	 "IMECtrlInput2"
#define C_LIST		 "IMECtrlList"
#define IME_CTRL	 "IMEPanelGui"

static StringTableEntry s_szCtrlName[]=
	{
		C_SHAPRE,
		C_SYMBOL,
		C_NEXT,
		C_TOGGLE,
		C_INPUT,
		C_INPUT2,
		C_LIST,
	};

static StringTableEntry s_szCommand[]=
	{
		"SharpIME();",
		"SymbolIME();",
		"NextIME();",
		"ToggleIME();"
	};

StringTableEntry GuiIMECtrl::s_szSymbol[] = 
{
	"■",
	"●",
	"→",
	"★"
};

StringTableEntry GuiIMECtrl::s_szSymbol2[] = 
{
	"▲",
	"◎",
	"→",
	"☆"
};


//GuiIMECtrl* g_pGuiIMEPanel = NULL;

IMPLEMENT_CONOBJECT(GuiIMECtrl);

GuiIMECtrl::GuiIMECtrl(void)
{
	//m_pProxyTop		= NULL;
	//m_pContainer	= NULL;
	m_bDefault = false;
	U32	n;
	for(n = 0; n<E_MAX;n++)
		m_arCtrls[n] = NULL;

	if(g_pIME)
		g_pIME->AttachIMECtrl(this);
	//m_pTxtInput		= NULL;
	//m_pTxtInput2	= NULL;
	//m_pTxtList		= NULL;
	//g_pGuiIMEPanel = this;
}

GuiIMECtrl::~GuiIMECtrl()
{
	//清0,以免错误调用
	U32	n;
	for(n = 0; n<E_MAX;n++)
		m_arCtrls[n] = NULL;

	if(g_pIME)
		g_pIME->DetachIMECtrl(this);
	//g_pGuiIMEPanel = NULL;
}


void GuiIMECtrl::initPersistFields()
{
   Parent::initPersistFields();

   removeField("autosize");
   removeField("command");
   removeField("altcommand");

   removeField("canMaximize");
   removeField("minSize");
   removeField("resizeWidth");
   removeField("resizeHeight");

	//addField("arCtrls",			TypeGuiControlPtr, Offset(m_arCtrls,GuiIMECtrl),E_MAX);
	//addField("txtInput",		TypeGuiControlPtr, Offset(m_pTxtInput,GuiIMECtrl));
	//addField("txtInput2",	TypeGuiControlPtr, Offset(m_pTxtInput2,GuiIMECtrl));
	//addField("txtList",		TypeGuiControlPtr, Offset(m_pTxtL,GuiIMECtrl));

}


//bool GuiIMECtrl::onAdd()
//{
//   return true;
//}

bool GuiIMECtrl::onWake()
{
	//setField("closeCommand","HideIME();");
	////setField("profile","GuiToolWindowProfile");
	//setField("profile","GuiToolWindowModelessProfile");
	//setField("canMaximize",false);
	//setField("resizeHeight",false);
	//setField("resizeWidth",false);

   if (! Parent::onWake())
      return false;
   FitControl();

   setActive(true);
   return true;
}

//void GuiIMECtrl::onSleep()
//{
//   Parent::onSleep();
//}




void GuiIMECtrl::OnToggleIME(bool bSet)
{
	if(m_bDefault)
		ToggleCtrl(E_TOGGLE,bSet);
}


void GuiIMECtrl::ToggleCtrl(EConstants eType,bool bSet)
{
	if(m_arCtrls[eType])
		m_arCtrls[eType]->setField("text",bSet?s_szSymbol[eType]:s_szSymbol2[eType]);
}


void GuiIMECtrl::AddNewText(U32 eType)
{
	// create the name ctrl
	//GuiTextCtrl * nameCtrl = new GuiTextCtrl();

	//nameCtrl->setField("profile", "GuiTextProfile");
	//GuiMLTextCtrl * nameCtrl = new GuiMLTextCtrl();

	//nameCtrl->setField("profile", "GuiMLTextProfile");
	//nameCtrl->registerObject(s_szCtrlName[eType]);
	//addObject(nameCtrl);


	//m_arCtrls[eType] = nameCtrl;
}


void GuiIMECtrl::SetIMEButton(U32 eType)
{
	// button
	GuiButtonCtrl * button = static_cast<GuiButtonCtrl*>(m_arCtrls[eType]);//new GuiButtonCtrl();
	if(!button)
		return;

	//button->setField("profile", "GuiButtonProfile");
	button->setField("text", s_szSymbol[eType]);
	button->setField("command", s_szCommand[eType]);

	//button->registerObject(s_szCtrlName[eType]);

	//设置高度
	S32 textWidth = button->mProfile->mFont->getStrWidth(s_szSymbol[eType]) + 2;
	S32 textH = button->mProfile->mFont->getHeight() + 2;
	button->mBounds.extent = Point2I(textWidth, textH);

	//addObject(button);

	//m_arCtrls[eType] = button;
}


void GuiIMECtrl::DestroyDefaultIME(GuiIMECtrl* pCtrl)
{
	if(pCtrl)
		pCtrl->deleteObject();
	//if(pCtrl && pCtrl->m_bDefault)
	//{
	//	delete(pCtrl->m_pContainer);
	//}
}


void GuiIMECtrl::InitDefaultIME()
{
	if(m_bDefault)
		return;
	m_bDefault = true;



	//SetIMEButton(E_SHARP);
	//SetIMEButton(E_SYMBOL);
	//SetIMEButton(E_NEXT);
	//SetIMEButton(E_TOGGLE);

	//AddNewText(E_LIST);
	//AddNewText(E_INPUT);
	//AddNewText(E_INPUT2);


	//m_pContainer = new GuiControl();
	//m_pContainer->setField("profile", "GuiModelessDialogProfile");//GuiDefaultProfile");
	//m_pContainer->setField("horizSizing", "width");
	//m_pContainer->setField("vertSizing", "height");
	//m_pContainer->setField("extent", "640 480");
	//m_pContainer->registerObject(IME_CTRL);
	//m_pContainer->addObject(this);


	//CalcDefaultPos();
}


#define IME_WIDTH		450
#define IME_HEIGHT		100
#define INPUT_MINW		100
#define INPUT2_MINW		100
#define TITLE_MINW		100
#define INPUT_MINH		20

#define MARGIN_X		3
#define MARGIN_Y		3
#define SPACE_X			3
#define SPACE_Y			3

void GuiIMECtrl::CalcDefaultPos()
{
	if(m_bDefault != true)
		return;

	S32 nPosX,nPosY;
	S32 nOffsetX,nOffsetX2,nOffsetY;
	S32 nWidth;
	U32 n;

	//设置窗口宽高
	mBounds.extent = Point2I(IME_WIDTH, IME_HEIGHT);
	mBounds.point = Point2I(0, 0);

	//列表输出框
	nOffsetY = GetTitleHeight() + INPUT_MINH + 2*SPACE_Y + MARGIN_Y;
	m_arCtrls[E_LIST]->mBounds.point	= Point2I(MARGIN_X, nOffsetY);
	m_arCtrls[E_LIST]->mBounds.extent	= Point2I(IME_WIDTH-2*MARGIN_X, IME_HEIGHT - (nOffsetY + MARGIN_Y));

	//设置Button事件
	nOffsetX = 0;
	for(n = E_SHARP; n<=E_TOGGLE;n++)
	{
		nOffsetX += m_arCtrls[n]->mBounds.extent.x;
		m_arCtrls[n]->mBounds.point	= Point2I(IME_WIDTH - MARGIN_X - nOffsetX, MARGIN_Y);
		nOffsetX += SPACE_X;
	}
	
	//设置INPUT2
	nOffsetX2 = /*TITLE_MINW+*/ MARGIN_X + SPACE_X;
	nWidth = (IME_WIDTH - nOffsetX2 - nOffsetX - SPACE_X ) /2;
	for(n = E_INPUT; n<=E_INPUT2;n++)
	{
		m_arCtrls[n]->mBounds.point	= Point2I(nOffsetX2, GetTitleHeight()+MARGIN_Y);
		m_arCtrls[n]->mBounds.extent= Point2I(nWidth, INPUT_MINH + SPACE_Y);
		nOffsetX2 += nWidth + SPACE_X;
	}

}



void GuiIMECtrl::SetIMEText(U32 eType,CSTR sText)
{
	if(eType >= E_MAX)
		return;
	GuiMLTextCtrl* pText = static_cast<GuiMLTextCtrl*>(m_arCtrls[eType]);
	if(!pText)
		return;

	if(!RPG::g_pRPGTextParse)
	{	
		pText->setText(sText, -1);
		return;
	}

	CSTR sStr;

	if(eType == E_LIST)
		sStr = RPG::g_pRPGTextParse->ParseText(Con::getVariable("$RPG::IMEStyle"));
	else
		sStr = RPG::g_pRPGTextParse->ParseText(Con::getVariable("$RPG::IMEInputStyle"));
	pText->setText(sStr, -1);

	sStr = RPG::g_pRPGTextParse->ParseText(sText);
	pText->addText(sStr, -1,true);
}



void GuiIMECtrl::FitPosByCursor(S32 nCursorPos)
{
	S32	nLeft;
	S32	nBottom;

	GuiTextEditCtrl* pFocus = static_cast<GuiTextEditCtrl*>(Canvas->getFirstResponder());
	if(!pFocus)
		return;

	Point2I pos			= pFocus->getGlobalPos();
	Point2I cursorPos	= pFocus->getCursorOffset();

	//先考虑在Focus下面,左对齐
	nBottom = pos.y + pFocus->getHeight();
	if(nBottom + getHeight() >= Canvas->getHeight())
		setBottom(pos.y);
	else
		setTop(nBottom);

	nLeft = pos.x + cursorPos.x;
	if(nLeft + getWidth() > Canvas->getWidth())
		setRight(Canvas->getWidth());
	else
		setLeft(nLeft);
}


void GuiIMECtrl::FitControl()
{
	if(m_bDefault)
		return;

	iterator i;
	U32	n;
	for(n = 0; n<E_MAX;n++)
	{
		for(i = begin(); i != end(); i++)
		{
			GuiControl *ctrl = static_cast<GuiControl *>(*i);
			if (/*m_arCtrls[n]==NULL &&*/ dStrcmp(ctrl->getName(),s_szCtrlName[n]) == 0)
			{
				m_arCtrls[n] = ctrl;
				break;
			}
		}//for
	}

	//设置Button事件
	for(n = E_SHARP; n<=E_TOGGLE;n++)
	{
		SetIMEButton(n);
	}
		//if(m_arCtrls[n])
		//	m_arCtrls[n]->setField("command", s_szCommand[n]);


	//SetIMEButton(E_SHARP);
	//SetIMEButton(E_SYMBOL);
	//SetIMEButton(E_NEXT);
	//SetIMEButton(E_TOGGLE);

}





//
//
//void GuiIMECtrl::onRender(Point2I offset, const RectI &updateRect)
//{
//    renderChildControls(offset, updateRect);
//}
//


⌨️ 快捷键说明

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