在第二人生里,
UI部分主要有三种大组件组成:显示板、浮动窗口、菜单。显示板是固定在窗口里面,上面可以放浮动的窗口。像登录的界面,就是一个显示板组成,那么它是怎么样实现的呢?现在就分析下面这段代码,如下:
#001 BOOL LLUICtrlFactory::buildPanel(LLPanel* panelp, const LLString &filename,
#002
const LLCallbackMap::map_t*
#003 factory_map)
#004 {
#005
BOOL didPost = FALSE;
#006
LLXMLNodePtr root;
#007
下面读取
XML描述文件,然后通过前面介绍的XML类来分析XML文件,生成所有节点数据返回。
#008
if (!LLUICtrlFactory::getLayeredXMLNode(filename, root))
#009
{
#010
return didPost;
#011
}
#012
判断这个
XML文件里是否有panel定义,也就是判断它是否用来构造显示板的。
#013
// root must be called panel
#014
if( !root->hasName("panel" ) )
#015
{
#016
llwarns << "Root node should be named panel in : " << filename << llendl;
#017
return didPost;
#018
}
#019
保存这个工厂图到工厂栈里。
#020
if (factory_map)
#021
{
#022
mFactoryStack.push_front(factory_map);
#023
}
#024
根据
XML里的数据节点来生成显示板。
#025
didPost = panelp->initPanelXML(root, NULL, this);
#026
设置显示板的提示文件名称。
#027
if (LLUI::sShowXUINames)
#028
{
#029
panelp->setToolTip(filename);
#030
}
#031
获取显示板的句柄。
#032
LLHandle<LLPanel> handle = panelp->getHandle();
把构造的显示板和
XML文件关联起来。
#033
mBuiltPanels[handle] = filename;
#034
弹出
factory_map对象。
#035
if (factory_map)
#036
{
#037
mFactoryStack.pop_front();
#038
}
#039
#040
return didPost;
#041 }
在这个函数里,主要通过
XML文件生成XML的节点数据,然后调用函数initPanelXML从XML的节点数据里生成显示板的组件。
下面再来仔细地看一下显示板的
XML数据是怎么样的,如下:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel bottom="0" follows="left|top|right|bottom" height="600" left="0"
mouse_opaque="true" name="panel_login" width="800">
<web_browser border_visible="false" bottom="0" follows="top|left|bottom|right" left="0"
name="login_html" right="-1"
start_url="data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody bgcolor=%22#000000%22 text=%22ffffff%22%3E%3Ch1%3E%3Ctt%3Eloading...%3C/tt%3E%3C/h1%3E %3C/body%3E %3C/html%3E"
top="-1" />
<string name="real_url">
http://secondlife.com/app/login/
</string>
<string name="forgot_password_url">
http://secondlife.com/account/request.php
</string>
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="54" drop_shadow_visible="true" follows="left|bottom"
font="SansSerif" h_pad="0" halign="left" height="16" hidden="false"
left="32" mouse_opaque="true" name="first_name_text" v_pad="0" width="120">
First Name:
</text>
<line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-24"
follows="left|bottom" font="SansSerif" handle_edit_keys_directly="true"
height="20" hidden="false" left="32" max_length="31" mouse_opaque="true"
name="first_name_edit" select_all_on_focus_received="true" width="120" />
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="54" drop_shadow_visible="true" follows="left|bottom"
font="SansSerif" h_pad="0" halign="left" height="16" hidden="false"
left="164" mouse_opaque="true" name="last_name_text" v_pad="0" width="120">
Last Name:
</text>
<line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-24"
follows="left|bottom" font="SansSerif" handle_edit_keys_directly="true"
height="20" hidden="false" left="164" max_length="31" mouse_opaque="true"
name="last_name_edit" select_all_on_focus_received="true" width="120" />
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="54" drop_shadow_visible="true" follows="left|bottom"
font="SansSerif" h_pad="0" halign="left" height="16" hidden="false"
left="296" mouse_opaque="true" name="password_text" v_pad="0" width="120">
Password:
</text>
<line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-24"
follows="left|bottom" font="SansSerif" handle_edit_keys_directly="true"
height="20" hidden="false" left="296" max_length="16" mouse_opaque="true"
name="password_edit" select_all_on_focus_received="true" width="120" />
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="10" drop_shadow_visible="true" follows="left|bottom"
font="SansSerif" h_pad="0" halign="left" height="16" hidden="false"
left="32" mouse_opaque="true" name="start_location_text" v_pad="0"
width="95">
Start Location:
</text>
<combo_box allow_text_entry="true" bottom="8" follows="left|bottom" height="18"
hidden="false" left_delta="97" max_chars="128" mouse_opaque="true"
name="start_location_combo" width="155">
<combo_item name="MyHome" value="My Home">
My Home
</combo_item>
<combo_item name="MyLastLocation" value="My Last Location">
My Last Location
</combo_item>
<combo_item name="Typeregionname" value="<Type region name>">
<Type region name>
</combo_item>
</combo_box>
<check_box bottom="10" follows="left|bottom" font="SansSerifSmall" height="16"
hidden="false" initial_value="false" label="Remember password"
left_delta="165" mouse_opaque="true" name="remember_check" width="138" />
<button bottom="28" follows="left|bottom" font="SansSerif" halign="center" height="24"
hidden="false" label="Connect" label_selected="Connect" left="440"
mouse_opaque="true" name="connect_btn" scale_image="TRUE" width="120" />
<button bottom="28" follows="left|bottom" font="SansSerif" halign="center" height="24"
hidden="false" label="Quit" label_selected="Quit" left="572"
mouse_opaque="true" name="quit_btn" scale_image="TRUE" width="120" />
<combo_box allow_text_entry="true" bottom="32" follows="left|bottom" height="18"
hidden="false" left_delta="135" max_chars="20" mouse_opaque="true"
name="server_combo" width="120" />
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="30" drop_shadow_visible="true" follows="right|bottom"
font="SansSerifSmall" h_pad="0" halign="right" height="12" hidden="false"
hover="true" left="-202" mouse_opaque="true" name="channel_text" v_pad="0"
width="200">
[Viewer Channel Name]
</text>
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="18" drop_shadow_visible="true" follows="right|bottom"
font="SansSerifSmall" h_pad="0" halign="right" height="12" hidden="false"
hover="true" left="-102" mouse_opaque="true" name="version_text" v_pad="0"
width="100">
1.23.4 (5)
</text>
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="2" drop_shadow_visible="true" follows="right|bottom"
font="SansSerifSmall" h_pad="0" halign="right" height="12" hidden="false"
hover="true" left="-172" mouse_opaque="true" name="forgot_password_text"
v_pad="0" width="170">
Forgot your password?
</text>
</panel>