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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llinspectgroup.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 "llinspectgroup.h"
  33. // viewer files
  34. #include "llgroupactions.h"
  35. #include "llgroupmgr.h"
  36. #include "llinspect.h"
  37. #include "llstartup.h"
  38. // Linden libraries
  39. #include "llcontrol.h" // LLCachedControl
  40. #include "llfloater.h"
  41. #include "llfloaterreg.h"
  42. #include "llresmgr.h" // getMonetaryString()
  43. #include "lltooltip.h" // positionViewNearMouse()
  44. #include "lltrans.h"
  45. #include "lluictrl.h"
  46. class LLFetchGroupData;
  47. //////////////////////////////////////////////////////////////////////////////
  48. // LLInspectGroup
  49. //////////////////////////////////////////////////////////////////////////////
  50. /// Group Inspector, a small information window used when clicking
  51. /// on group names in the 2D UI
  52. class LLInspectGroup : public LLInspect
  53. {
  54. friend class LLFloaterReg;
  55. public:
  56. // key["group_id"] - Group ID for which to show information
  57. // Inspector will be positioned relative to current mouse position
  58. LLInspectGroup(const LLSD& key);
  59. virtual ~LLInspectGroup();
  60. // Because floater is single instance, need to re-parse data on each spawn
  61. // (for example, inspector about same group but in different position)
  62. /*virtual*/ void onOpen(const LLSD& group_id);
  63. // When closing they should close their gear menu 
  64. /*virtual*/ void onClose(bool app_quitting);
  65. // Update view based on information from group manager
  66. void processGroupData();
  67. // Make network requests for all the data to display in this view.
  68. // Used on construction and if avatar id changes.
  69. void requestUpdate();
  70. // Callback for gCacheName to look up group name
  71. // Faster than waiting for group properties to return
  72. void nameUpdatedCallback(const LLUUID& id,
  73.  const std::string& first,
  74.  const std::string& last,
  75.  BOOL is_group);
  76. // Button/menu callbacks
  77. void onClickViewProfile();
  78. void onClickJoin();
  79. void onClickLeave();
  80. private:
  81. LLUUID mGroupID;
  82. // an in-flight network request for group properties 
  83. // is represented by this object
  84. LLFetchGroupData* mPropertiesRequest;
  85. };
  86. //////////////////////////////////////////////////////////////////////////////
  87. // LLFetchGroupData
  88. //////////////////////////////////////////////////////////////////////////////
  89. // This object represents a pending request for avatar properties information
  90. class LLFetchGroupData : public LLGroupMgrObserver
  91. {
  92. public:
  93. // If the inspector closes it will delete the pending request object, so the
  94. // inspector pointer will be valid for the lifetime of this object
  95. LLFetchGroupData(const LLUUID& group_id, LLInspectGroup* inspector)
  96. : LLGroupMgrObserver(group_id),
  97. mInspector(inspector)
  98. {
  99. LLGroupMgr* mgr = LLGroupMgr::getInstance();
  100. // register ourselves as an observer
  101. mgr->addObserver(this);
  102. // send a request
  103. mgr->sendGroupPropertiesRequest(group_id);
  104. }
  105. ~LLFetchGroupData()
  106. {
  107. // remove ourselves as an observer
  108. LLGroupMgr::getInstance()->removeObserver(this);
  109. }
  110. void changed(LLGroupChange gc)
  111. {
  112. if (gc == GC_PROPERTIES)
  113. {
  114. mInspector->processGroupData();
  115. }
  116. }
  117. LLInspectGroup* mInspector;
  118. };
  119. LLInspectGroup::LLInspectGroup(const LLSD& sd)
  120. : LLInspect( LLSD() ), // single_instance, doesn't really need key
  121. mGroupID(), // set in onOpen()
  122. mPropertiesRequest(NULL)
  123. {
  124. mCommitCallbackRegistrar.add("InspectGroup.ViewProfile",
  125. boost::bind(&LLInspectGroup::onClickViewProfile, this));
  126. mCommitCallbackRegistrar.add("InspectGroup.Join",
  127. boost::bind(&LLInspectGroup::onClickJoin, this));
  128. mCommitCallbackRegistrar.add("InspectGroup.Leave",
  129. boost::bind(&LLInspectGroup::onClickLeave, this));
  130. // can't make the properties request until the widgets are constructed
  131. // as it might return immediately, so do it in postBuild.
  132. }
  133. LLInspectGroup::~LLInspectGroup()
  134. {
  135. // clean up any pending requests so they don't call back into a deleted
  136. // view
  137. delete mPropertiesRequest;
  138. mPropertiesRequest = NULL;
  139. }
  140. // Multiple calls to showInstance("inspect_avatar", foo) will provide different
  141. // LLSD for foo, which we will catch here.
  142. //virtual
  143. void LLInspectGroup::onOpen(const LLSD& data)
  144. {
  145. // start fade animation
  146. LLInspect::onOpen(data);
  147. mGroupID = data["group_id"];
  148. // Position the inspector relative to the mouse cursor
  149. // Similar to how tooltips are positioned
  150. // See LLToolTipMgr::createToolTip
  151. if (data.has("pos"))
  152. {
  153. LLUI::positionViewNearMouse(this, data["pos"]["x"].asInteger(), data["pos"]["y"].asInteger());
  154. }
  155. else
  156. {
  157. LLUI::positionViewNearMouse(this);
  158. }
  159. // can't call from constructor as widgets are not built yet
  160. requestUpdate();
  161. }
  162. // virtual
  163. void LLInspectGroup::onClose(bool app_quitting)
  164. {
  165. // *TODO: If we add a gear menu, close it here
  166. }
  167. void LLInspectGroup::requestUpdate()
  168. {
  169. // Don't make network requests when spawning from the debug menu at the
  170. // login screen (which is useful to work on the layout).
  171. if (mGroupID.isNull())
  172. {
  173. if (LLStartUp::getStartupState() >= STATE_STARTED)
  174. {
  175. // once we're running we don't want to show the test floater
  176. // for bogus LLUUID::null links
  177. closeFloater();
  178. }
  179. return;
  180. }
  181. // Clear out old data so it doesn't flash between old and new
  182. getChild<LLUICtrl>("group_name")->setValue("");
  183. getChild<LLUICtrl>("group_subtitle")->setValue("");
  184. getChild<LLUICtrl>("group_details")->setValue("");
  185. getChild<LLUICtrl>("group_cost")->setValue("");
  186. // Must have a visible button so the inspector can take focus
  187. getChild<LLUICtrl>("view_profile_btn")->setVisible(true);
  188. getChild<LLUICtrl>("leave_btn")->setVisible(false);
  189. getChild<LLUICtrl>("join_btn")->setVisible(false);
  190. // Make a new request for properties
  191. delete mPropertiesRequest;
  192. mPropertiesRequest = new LLFetchGroupData(mGroupID, this);
  193. // Name lookup will be faster out of cache, use that
  194. gCacheName->get(mGroupID, TRUE,
  195. boost::bind(&LLInspectGroup::nameUpdatedCallback,
  196. this, _1, _2, _3, _4));
  197. }
  198. void LLInspectGroup::nameUpdatedCallback(
  199. const LLUUID& id,
  200. const std::string& first,
  201. const std::string& last,
  202. BOOL is_group)
  203. {
  204. if (id == mGroupID)
  205. {
  206. // group names are returned as a first name
  207. childSetValue("group_name", LLSD(first) );
  208. }
  209. // Otherwise possibly a request for an older inspector, ignore it
  210. }
  211. void LLInspectGroup::processGroupData()
  212. {
  213. LLGroupMgrGroupData* data =
  214. LLGroupMgr::getInstance()->getGroupData(mGroupID);
  215. if (data)
  216. {
  217. // Noun pluralization depends on language
  218. std::string lang = LLUI::getLanguage();
  219. std::string members =
  220. LLTrans::getCountString(lang, "GroupMembers", data->mMemberCount);
  221. getChild<LLUICtrl>("group_subtitle")->setValue( LLSD(members) );
  222. getChild<LLUICtrl>("group_details")->setValue( LLSD(data->mCharter) );
  223. getChild<LLUICtrl>("group_icon")->setValue( LLSD(data->mInsigniaID) );
  224. std::string cost;
  225. bool is_member = LLGroupActions::isInGroup(mGroupID);
  226. if (is_member)
  227. {
  228. cost = getString("YouAreMember");
  229. }
  230. else if (data->mOpenEnrollment)
  231. {
  232. if (data->mMembershipFee == 0)
  233. {
  234. cost = getString("FreeToJoin");
  235. }
  236. else
  237. {
  238. std::string amount =
  239. LLResMgr::getInstance()->getMonetaryString(
  240. data->mMembershipFee);
  241. LLStringUtil::format_map_t args;
  242. args["[AMOUNT]"] = amount;
  243. cost = getString("CostToJoin", args);
  244. }
  245. }
  246. else
  247. {
  248. cost = getString("PrivateGroup");
  249. }
  250. getChild<LLUICtrl>("group_cost")->setValue(cost);
  251. getChild<LLUICtrl>("join_btn")->setVisible(!is_member);
  252. getChild<LLUICtrl>("leave_btn")->setVisible(is_member);
  253. // Only enable join button if you are allowed to join
  254. bool can_join = !is_member && data->mOpenEnrollment;
  255. getChild<LLUICtrl>("join_btn")->setEnabled(can_join);
  256. }
  257. // Delete the request object as it has been satisfied
  258. delete mPropertiesRequest;
  259. mPropertiesRequest = NULL;
  260. }
  261. void LLInspectGroup::onClickViewProfile()
  262. {
  263. closeFloater();
  264. LLGroupActions::show(mGroupID);
  265. }
  266. void LLInspectGroup::onClickJoin()
  267. {
  268. closeFloater();
  269. LLGroupActions::join(mGroupID);
  270. }
  271. void LLInspectGroup::onClickLeave()
  272. {
  273. closeFloater();
  274. LLGroupActions::leave(mGroupID);
  275. }
  276. //////////////////////////////////////////////////////////////////////////////
  277. // LLInspectGroupUtil
  278. //////////////////////////////////////////////////////////////////////////////
  279. void LLInspectGroupUtil::registerFloater()
  280. {
  281. LLFloaterReg::add("inspect_group", "inspect_group.xml",
  282.   &LLFloaterReg::build<LLInspectGroup>);
  283. }