📄 guiimectrl.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 + -