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

游戏引擎

开发平台:

C++ Builder

  1. /**
  2.  * @file llpanelplaceinfo.cpp
  3.  * @brief Base class for place information in Side Tray.
  4.  *
  5.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2009-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. #include "llpanelplaceinfo.h"
  34. #include "llsdutil.h"
  35. #include "llsdutil_math.h"
  36. #include "llregionhandle.h"
  37. #include "lliconctrl.h"
  38. #include "lltextbox.h"
  39. #include "lltrans.h"
  40. #include "llagent.h"
  41. #include "llexpandabletextbox.h"
  42. #include "llpanelpick.h"
  43. #include "lltexturectrl.h"
  44. #include "llviewerregion.h"
  45. LLPanelPlaceInfo::LLPanelPlaceInfo()
  46. : LLPanel(),
  47. mParcelID(),
  48. mRequestedID(),
  49. mPosRegion(),
  50. mScrollingPanelMinHeight(0),
  51. mScrollingPanelWidth(0),
  52. mInfoType(UNKNOWN),
  53. mScrollingPanel(NULL),
  54. mScrollContainer(NULL)
  55. {}
  56. //virtual
  57. LLPanelPlaceInfo::~LLPanelPlaceInfo()
  58. {
  59. if (mParcelID.notNull())
  60. {
  61. LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mParcelID, this);
  62. }
  63. }
  64. //virtual
  65. BOOL LLPanelPlaceInfo::postBuild()
  66. {
  67. mTitle = getChild<LLTextBox>("title");
  68. mCurrentTitle = mTitle->getText();
  69. mSnapshotCtrl = getChild<LLTextureCtrl>("logo");
  70. mRegionName = getChild<LLTextBox>("region_title");
  71. mParcelName = getChild<LLTextBox>("parcel_title");
  72. mDescEditor = getChild<LLExpandableTextBox>("description");
  73. mMaturityRatingIcon = getChild<LLIconCtrl>("maturity_icon");
  74. mMaturityRatingText = getChild<LLTextBox>("maturity_value");
  75. mScrollingPanel = getChild<LLPanel>("scrolling_panel");
  76. mScrollContainer = getChild<LLScrollContainer>("place_scroll");
  77. mScrollingPanelMinHeight = mScrollContainer->getScrolledViewRect().getHeight();
  78. mScrollingPanelWidth = mScrollingPanel->getRect().getWidth();
  79. return TRUE;
  80. }
  81. //virtual
  82. void LLPanelPlaceInfo::resetLocation()
  83. {
  84. mParcelID.setNull();
  85. mRequestedID.setNull();
  86. mPosRegion.clearVec();
  87. std::string loading = LLTrans::getString("LoadingData");
  88. mMaturityRatingIcon->setValue(loading);
  89. mMaturityRatingText->setValue(loading);
  90. mRegionName->setText(loading);
  91. mParcelName->setText(loading);
  92. mDescEditor->setText(loading);
  93. mSnapshotCtrl->setImageAssetID(LLUUID::null);
  94. mSnapshotCtrl->setFallbackImageName("default_land_picture.j2c");
  95. }
  96. //virtual
  97. void LLPanelPlaceInfo::setParcelID(const LLUUID& parcel_id)
  98. {
  99. mParcelID = parcel_id;
  100. sendParcelInfoRequest();
  101. }
  102. //virtual
  103. void LLPanelPlaceInfo::setInfoType(EInfoType type)
  104. {
  105. mTitle->setText(mCurrentTitle);
  106. mInfoType = type;
  107. }
  108. void LLPanelPlaceInfo::sendParcelInfoRequest()
  109. {
  110. if (mParcelID != mRequestedID)
  111. {
  112. LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelID, this);
  113. LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelID);
  114. mRequestedID = mParcelID;
  115. }
  116. }
  117. void LLPanelPlaceInfo::displayParcelInfo(const LLUUID& region_id,
  118.  const LLVector3d& pos_global)
  119. {
  120. LLViewerRegion* region = gAgent.getRegion();
  121. if (!region)
  122. return;
  123. mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
  124.   (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
  125.   (F32)pos_global.mdV[VZ]);
  126. LLSD body;
  127. std::string url = region->getCapability("RemoteParcelRequest");
  128. if (!url.empty())
  129. {
  130. body["location"] = ll_sd_from_vector3(mPosRegion);
  131. if (!region_id.isNull())
  132. {
  133. body["region_id"] = region_id;
  134. }
  135. if (!pos_global.isExactlyZero())
  136. {
  137. U64 region_handle = to_region_handle(pos_global);
  138. body["region_handle"] = ll_sd_from_U64(region_handle);
  139. }
  140. LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle()));
  141. }
  142. else
  143. {
  144. mDescEditor->setText(getString("server_update_text"));
  145. }
  146. }
  147. // virtual
  148. void LLPanelPlaceInfo::setErrorStatus(U32 status, const std::string& reason)
  149. {
  150. // We only really handle 404 and 499 errors
  151. std::string error_text;
  152. if(status == 404)
  153. {
  154. error_text = getString("server_error_text");
  155. }
  156. else if(status == 499)
  157. {
  158. error_text = getString("server_forbidden_text");
  159. }
  160. mDescEditor->setText(error_text);
  161. }
  162. // virtual
  163. void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data)
  164. {
  165. if(parcel_data.snapshot_id.notNull())
  166. {
  167. mSnapshotCtrl->setImageAssetID(parcel_data.snapshot_id);
  168. }
  169. if(!parcel_data.sim_name.empty())
  170. {
  171. mRegionName->setText(parcel_data.sim_name);
  172. }
  173. else
  174. {
  175. mRegionName->setText(LLStringUtil::null);
  176. }
  177. if(!parcel_data.desc.empty())
  178. {
  179. mDescEditor->setText(parcel_data.desc);
  180. }
  181. else
  182. {
  183. mDescEditor->setText(getString("not_available"));
  184. }
  185. S32 region_x;
  186. S32 region_y;
  187. S32 region_z;
  188. // If the region position is zero, grab position from the global
  189. if(mPosRegion.isExactlyZero())
  190. {
  191. region_x = llround(parcel_data.global_x) % REGION_WIDTH_UNITS;
  192. region_y = llround(parcel_data.global_y) % REGION_WIDTH_UNITS;
  193. region_z = llround(parcel_data.global_z);
  194. }
  195. else
  196. {
  197. region_x = llround(mPosRegion.mV[VX]);
  198. region_y = llround(mPosRegion.mV[VY]);
  199. region_z = llround(mPosRegion.mV[VZ]);
  200. }
  201. if (!parcel_data.name.empty())
  202. {
  203. mParcelTitle = parcel_data.name;
  204. mParcelName->setText(llformat("%s (%d, %d, %d)",
  205.  mParcelTitle.c_str(), region_x, region_y, region_z));
  206. }
  207. else
  208. {
  209. mParcelName->setText(getString("not_available"));
  210. }
  211. }
  212. // virtual
  213. void LLPanelPlaceInfo::reshape(S32 width, S32 height, BOOL called_from_parent)
  214. {
  215. LLPanel::reshape(width, height, called_from_parent);
  216. if (!mScrollContainer || !mScrollingPanel)
  217. return;
  218. static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
  219. S32 scroll_height = mScrollContainer->getRect().getHeight();
  220. if (mScrollingPanelMinHeight >= scroll_height)
  221. {
  222. mScrollingPanel->reshape(mScrollingPanelWidth, mScrollingPanelMinHeight);
  223. }
  224. else
  225. {
  226. mScrollingPanel->reshape(mScrollingPanelWidth + scrollbar_size, scroll_height);
  227. }
  228. }
  229. void LLPanelPlaceInfo::createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel)
  230. {
  231. std::string region_name = mRegionName->getText();
  232. LLPickData data;
  233. data.pos_global = pos_global;
  234. data.name = mParcelTitle.empty() ? region_name : mParcelTitle;
  235. data.sim_name = region_name;
  236. data.desc = mDescEditor->getText();
  237. data.snapshot_id = mSnapshotCtrl->getImageAssetID();
  238. data.parcel_id = mParcelID;
  239. pick_panel->setPickData(&data);
  240. }
  241. // static
  242. void LLPanelPlaceInfo::nameUpdatedCallback(LLTextBox* text,
  243.    const std::string& first,
  244.    const std::string& last)
  245. {
  246. text->setText(first + " " + last);
  247. }