llinspectremoteobject.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:6k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llinspectremoteobject.cpp
  3.  *
  4.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  5.  * 
  6.  * Copyright (c) 2009-2010, Linden Research, Inc.
  7.  * 
  8.  * Second Life Viewer Source Code
  9.  * The source code in this file ("Source Code") is provided by Linden Lab
  10.  * to you under the terms of the GNU General Public License, version 2.0
  11.  * ("GPL"), unless you have obtained a separate licensing agreement
  12.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  13.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  14.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  15.  * 
  16.  * There are special exceptions to the terms and conditions of the GPL as
  17.  * it is applied to this Source Code. View the full text of the exception
  18.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  19.  * online at
  20.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  21.  * 
  22.  * By copying, modifying or distributing this software, you acknowledge
  23.  * that you have read and understood your obligations described above,
  24.  * and agree to abide by those obligations.
  25.  * 
  26.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  27.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  28.  * COMPLETENESS OR PERFORMANCE.
  29.  * $/LicenseInfo$
  30.  */
  31. #include "llviewerprecompiledheaders.h"
  32. #include "llfloaterreg.h"
  33. #include "llinspectremoteobject.h"
  34. #include "llinspect.h"
  35. #include "llmutelist.h"
  36. #include "llpanelblockedlist.h"
  37. #include "llslurl.h"
  38. #include "lltrans.h"
  39. #include "llui.h"
  40. #include "lluictrl.h"
  41. #include "llurlaction.h"
  42. //////////////////////////////////////////////////////////////////////////////
  43. // LLInspectRemoteObject
  44. //////////////////////////////////////////////////////////////////////////////
  45. // Remote Object Inspector, a small information window used to
  46. // display information about potentially-remote objects. Used
  47. // to display details about objects sending messages to the user.
  48. class LLInspectRemoteObject : public LLInspect
  49. {
  50. friend class LLFloaterReg;
  51. public:
  52. LLInspectRemoteObject(const LLSD& object_id);
  53. virtual ~LLInspectRemoteObject() {};
  54. /*virtual*/ BOOL postBuild(void);
  55. /*virtual*/ void onOpen(const LLSD& avatar_id);
  56. void onClickMap();
  57. void onClickBlock();
  58. void onClickClose();
  59. private:
  60. void update();
  61. static void nameCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data);
  62. private:
  63. LLUUID  mObjectID;
  64. LLUUID  mOwnerID;
  65. std::string  mOwner;
  66. std::string  mSLurl;
  67. std::string  mName;
  68. bool         mGroupOwned;
  69. };
  70. LLInspectRemoteObject::LLInspectRemoteObject(const LLSD& sd) :
  71. LLInspect(LLSD()),
  72. mObjectID(NULL),
  73. mOwnerID(NULL),
  74. mOwner(""),
  75. mSLurl(""),
  76. mName(""),
  77. mGroupOwned(false)
  78. {
  79. }
  80. /*virtual*/
  81. BOOL LLInspectRemoteObject::postBuild(void)
  82. {
  83. // hook up the inspector's buttons
  84. getChild<LLUICtrl>("map_btn")->setCommitCallback(
  85. boost::bind(&LLInspectRemoteObject::onClickMap, this));
  86. getChild<LLUICtrl>("block_btn")->setCommitCallback(
  87. boost::bind(&LLInspectRemoteObject::onClickBlock, this));
  88. getChild<LLUICtrl>("close_btn")->setCommitCallback(
  89. boost::bind(&LLInspectRemoteObject::onClickClose, this));
  90. return TRUE;
  91. }
  92. /*virtual*/
  93. void LLInspectRemoteObject::onOpen(const LLSD& data)
  94. {
  95. // Start animation
  96. LLInspect::onOpen(data);
  97. // Extract appropriate object information from input LLSD
  98. // (Eventually, it might be nice to query server for details
  99. // rather than require caller to pass in the information.)
  100. mObjectID   = data["object_id"].asUUID();
  101. mName       = data["name"].asString();
  102. mOwnerID    = data["owner_id"].asUUID();
  103. mGroupOwned = data["group_owned"].asBoolean();
  104. mSLurl      = data["slurl"].asString();
  105. // work out the owner's name
  106. mOwner = "";
  107. if (gCacheName)
  108. {
  109. gCacheName->get(mOwnerID, mGroupOwned, nameCallback, this);
  110. }
  111. // update the inspector with the current object state
  112. update();
  113. // Position the inspector relative to the mouse cursor
  114. LLUI::positionViewNearMouse(this);
  115. }
  116. void LLInspectRemoteObject::onClickMap()
  117. {
  118. std::string url = "secondlife://" + mSLurl;
  119. LLUrlAction::showLocationOnMap(url);
  120. closeFloater();
  121. }
  122. void LLInspectRemoteObject::onClickBlock()
  123. {
  124. LLMute::EType mute_type = mGroupOwned ? LLMute::GROUP : LLMute::AGENT;
  125. LLMute mute(mOwnerID, mOwner, mute_type);
  126. LLMuteList::getInstance()->add(mute);
  127. LLPanelBlockedList::showPanelAndSelect(mute.mID);
  128. closeFloater();
  129. }
  130. void LLInspectRemoteObject::onClickClose()
  131. {
  132. closeFloater();
  133. }
  134. //static 
  135. void LLInspectRemoteObject::nameCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data)
  136. {
  137. LLInspectRemoteObject *self = (LLInspectRemoteObject*)data;
  138. self->mOwner = first;
  139. if (!last.empty())
  140. {
  141. self->mOwner += " " + last;
  142. }
  143. self->update();
  144. }
  145. void LLInspectRemoteObject::update()
  146. {
  147. // show the object name as the inspector's title
  148. // (don't hyperlink URLs in object names)
  149. getChild<LLUICtrl>("object_name")->setValue("<nolink>" + mName + "</nolink>");
  150. // show the object's owner - click it to show profile
  151. std::string owner = mOwner;
  152. if (! mOwnerID.isNull())
  153. {
  154. if (mGroupOwned)
  155. {
  156. owner = LLSLURL::buildCommand("group", mOwnerID, "about");
  157. }
  158. else
  159. {
  160. owner = LLSLURL::buildCommand("agent", mOwnerID, "about");
  161. }
  162. }
  163. else
  164. {
  165. owner = LLTrans::getString("Unknown");
  166. }
  167. getChild<LLUICtrl>("object_owner")->setValue(owner);
  168. // display the object's SLurl - click it to teleport
  169. std::string url;
  170. if (! mSLurl.empty())
  171. {
  172. url = "secondlife:///app/teleport/" + mSLurl;
  173. }
  174. getChild<LLUICtrl>("object_slurl")->setValue(url);
  175. // disable the Map button if we don't have a SLurl
  176. getChild<LLUICtrl>("map_btn")->setEnabled(! mSLurl.empty());
  177. // disable the Block button if we don't have the owner ID
  178. getChild<LLUICtrl>("block_btn")->setEnabled(! mOwnerID.isNull());
  179. }
  180. //////////////////////////////////////////////////////////////////////////////
  181. // LLInspectRemoteObjectUtil
  182. //////////////////////////////////////////////////////////////////////////////
  183. void LLInspectRemoteObjectUtil::registerFloater()
  184. {
  185. LLFloaterReg::add("inspect_remote_object", "inspect_remote_object.xml",
  186.   &LLFloaterReg::build<LLInspectRemoteObject>);
  187. }