现在的位置: 首页 > 综合 > 正文

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

2013年10月06日 ⁄ 综合 ⁄ 共 3034字 ⁄ 字号 评论关闭
从前面看到,不但窗口和显示板可以通过XML定制,而菜单也可以通过XML文件来定制的,那么菜单的定制又是怎样读取XML文件的呢?到底它又会产生什么样的对象来执行菜单呢?下面就来解决这两个问题,代码如下:
#001 LLMenuGL *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);
 

抱歉!评论已关闭.