从前面看到,不但窗口和显示板可以通过
XML定制,而菜单也可以通过XML文件来定制的,那么菜单的定制又是怎样读取XML文件的呢?到底它又会产生什么样的对象来执行菜单呢?下面就来解决这两个问题,代码如下:
#001LLMenuGL *LLUICtrlFactory::buildMenu(const LLString &filename, LLView* parentp)
#002{
#003
// TomY TODO: Break this function into buildMenu and buildMenuBar
#004
LLXMLNodePtr root;
#005
LLMenuGL* menu;
#006
下面通过分析
XML文件,获取XML文件里定制菜单的数据。
#007
if (!LLUICtrlFactory::getLayeredXMLNode(filename, root))
#008
{
#009
return NULL;
#010
}
#011
判断这个
XML文件是否定义菜单的。
#012
// root must be called panel
#013
if( !root->hasName( "menu_bar" ) && !root->hasName( "menu" ))
#014
{
#015
llwarns << "Root node should be named menu bar or menu in : " << filename << llendl;
#016
return NULL;
#017
}
#018
如果
XML文件里定义有menu,说明它是类LLMenuGL里创制菜单,否则它是从类LLMenuBarGL里创建菜单。
#019
if (root->hasName("menu"))
#020
{
#021
menu = (LLMenuGL*)LLMenuGL::fromXML(root, parentp, this);
#022
}
#023
else
#024
{
#025
menu = (LLMenuGL*)LLMenuBarGL::fromXML(root, parentp, this);
#026
}
#027
设置菜单类提示的信息是
XML文件名称。
#028
if (LLUI::sShowXUINames)
#029
{
#030
menu->setToolTip(filename);
#031
}
#032
#033
return menu;
#034}
#035
上面的代码通过分析
XML文件,然后根据XML文件来创建LLMenuGL对象来表示菜单,因此这里是使用类LLMenuGL来执行显示菜单的。下面再来看一下菜单定义的XML是什么样子的,如下:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<menu_bar bottom="-18" drop_shadow="false" enabled="true" follows="left|top|right"
height="18" left="0" mouse_opaque="true" name="Login Menu" opaque="true"
tear_off="false" width="802">
<menu bottom="273" create_jump_keys="true" drop_shadow="true" enabled="true"
height="263" label="File" left="0" mouse_opaque="false" name="File"
opaque="true" tear_off="false" width="243">
<menu_item_call bottom="-29" enabled="true" height="19" label="Quit" left="0"
mouse_opaque="true" name="Quit" shortcut="control|Q" width="243">
<on_click function="File.Quit" userdata="" />
</menu_item_call>
</menu>
<menu bottom="97" create_jump_keys="true" drop_shadow="true" enabled="true"
height="439" label="Edit" left="38" mouse_opaque="false" name="Edit"
opaque="true" tear_off="false" width="153">
<menu_item_call bottom="-29" enabled="true" height="19" label="Preferences..." left="0"
mouse_opaque="true" name="Preferences..." shortcut="control|P" width="153">
<on_click function="ShowFloater" userdata="preferences" />
</menu_item_call>
</menu>
<menu bottom="219" create_jump_keys="true" drop_shadow="true" enabled="true"
height="317" label="Help" left="80" mouse_opaque="false" name="Help"
opaque="true" tear_off="falsoe" width="166">
<menu_item_call bottom="-29" enabled="true" height="19" label="Second Life Help" left="0"
mouse_opaque="true" name="Second Life Help" shortcut="F1" width="166">
<on_click function="ShowFloater" userdata="help f1" />
</menu_item_call>
<menu_item_call bottom="-48" enabled="true" height="19" label="About Second Life..." left="0"
mouse_opaque="true" name="About Second Life..." width="166">
<on_click function="ShowFloater" userdata="about" />
</menu_item_call>
</menu>
</menu_bar>
最后是通过下面这样子来调用这个函数的:
gLoginMenuBarView = (LLMenuBarGL*)gUICtrlFactory->buildMenu("menu_login.xml", gMenuHolder);