第二人生的源码分析(八十三)创建UI的菜单

从前面看到,不但窗口和显示板可以通过 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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值