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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llfloaterbuy.cpp
  3.  * @author James Cook
  4.  * @brief LLFloaterBuy class implementation
  5.  *
  6.  * $LicenseInfo:firstyear=2004&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2004-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  */
  33. /**
  34.  * Floater that appears when buying an object, giving a preview
  35.  * of its contents and their permissions.
  36.  */
  37. #include "llviewerprecompiledheaders.h"
  38. #include "llfloaterbuy.h"
  39. #include "llagent.h" // for agent id
  40. #include "llinventorymodel.h" // for gInventory
  41. #include "llfloaterreg.h"
  42. #include "llfloaterinventory.h" // for get_item_icon
  43. #include "llinventoryfunctions.h"
  44. #include "llnotificationsutil.h"
  45. #include "llselectmgr.h"
  46. #include "llscrolllistctrl.h"
  47. #include "llviewerobject.h"
  48. #include "lluictrlfactory.h"
  49. #include "llviewerwindow.h"
  50. #include "lltrans.h"
  51. LLFloaterBuy::LLFloaterBuy(const LLSD& key)
  52. : LLFloater(key)
  53. {
  54. //  LLUICtrlFactory::getInstance()->buildFloater(this, "floater_buy_object.xml");
  55. }
  56. BOOL LLFloaterBuy::postBuild()
  57. {
  58. childDisable("object_list");
  59. childDisable("item_list");
  60. getChild<LLUICtrl>("cancel_btn")->setCommitCallback( boost::bind(&LLFloaterBuy::onClickCancel, this));
  61. getChild<LLUICtrl>("buy_btn")->setCommitCallback( boost::bind(&LLFloaterBuy::onClickBuy, this));
  62. setDefaultBtn("cancel_btn"); // to avoid accidental buy (SL-43130)
  63. // Always center the dialog.  User can change the size,
  64. // but purchases are important and should be center screen.
  65. // This also avoids problems where the user resizes the application window
  66. // mid-session and the saved rect is off-center.
  67. center();
  68. return TRUE;
  69. }
  70. LLFloaterBuy::~LLFloaterBuy()
  71. {
  72. mObjectSelection = NULL;
  73. }
  74. void LLFloaterBuy::reset()
  75. {
  76. LLScrollListCtrl* object_list = getChild<LLScrollListCtrl>("object_list");
  77. if (object_list) object_list->deleteAllItems();
  78. LLScrollListCtrl* item_list = getChild<LLScrollListCtrl>("item_list");
  79. if (item_list) item_list->deleteAllItems();
  80. }
  81. // static
  82. void LLFloaterBuy::show(const LLSaleInfo& sale_info)
  83. {
  84. LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
  85. if (selection->getRootObjectCount() != 1)
  86. {
  87. LLNotificationsUtil::add("BuyOneObjectOnly");
  88. return;
  89. }
  90. LLFloaterBuy* floater = LLFloaterReg::showTypedInstance<LLFloaterBuy>("buy_object");
  91. if (!floater)
  92. return;
  93. // Clean up the lists...
  94. floater->reset();
  95. floater->mSaleInfo = sale_info;
  96. floater->mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
  97. LLSelectNode* node = selection->getFirstRootNode();
  98. if (!node)
  99. return;
  100. // Set title based on sale type
  101. LLUIString title;
  102. switch (sale_info.getSaleType())
  103. {
  104.   case LLSaleInfo::FS_ORIGINAL:
  105. title = floater->getString("title_buy_text");
  106. break;
  107.   case LLSaleInfo::FS_COPY:
  108.   default:
  109. title = floater->getString("title_buy_copy_text");
  110. break;
  111. }
  112. title.setArg("[NAME]", node->mName);
  113. floater->setTitle(title);
  114. LLUUID owner_id;
  115. std::string owner_name;
  116. BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name);
  117. if (!owners_identical)
  118. {
  119. LLNotificationsUtil::add("BuyObjectOneOwner");
  120. return;
  121. }
  122. LLCtrlListInterface *object_list = floater->childGetListInterface("object_list");
  123. if (!object_list)
  124. {
  125. return;
  126. }
  127. // Update the display
  128. // Display next owner permissions
  129. LLSD row;
  130. // Compute icon for this item
  131. std::string icon_name = get_item_icon_name(LLAssetType::AT_OBJECT, 
  132.  LLInventoryType::IT_OBJECT,
  133.  0x0, FALSE);
  134. row["columns"][0]["column"] = "icon";
  135. row["columns"][0]["type"] = "icon";
  136. row["columns"][0]["value"] = icon_name;
  137. // Append the permissions that you will acquire (not the current
  138. // permissions).
  139. U32 next_owner_mask = node->mPermissions->getMaskNextOwner();
  140. std::string text = node->mName;
  141. if (!(next_owner_mask & PERM_COPY))
  142. {
  143. text.append(floater->getString("no_copy_text"));
  144. }
  145. if (!(next_owner_mask & PERM_MODIFY))
  146. {
  147. text.append(floater->getString("no_modify_text"));
  148. }
  149. if (!(next_owner_mask & PERM_TRANSFER))
  150. {
  151. text.append(floater->getString("no_transfer_text"));
  152. }
  153. row["columns"][1]["column"] = "text";
  154. row["columns"][1]["value"] = text;
  155. row["columns"][1]["font"] = "SANSSERIF";
  156. // Add after columns added so appropriate heights are correct.
  157. object_list->addElement(row);
  158. floater->childSetTextArg("buy_text", "[AMOUNT]", llformat("%d", sale_info.getSalePrice()));
  159. floater->childSetTextArg("buy_text", "[NAME]", owner_name);
  160. // Must do this after the floater is created, because
  161. // sometimes the inventory is already there and 
  162. // the callback is called immediately.
  163. LLViewerObject* obj = selection->getFirstRootObject();
  164. floater->registerVOInventoryListener(obj,NULL);
  165. floater->requestVOInventory();
  166. }
  167. void LLFloaterBuy::inventoryChanged(LLViewerObject* obj,
  168.  InventoryObjectList* inv,
  169.  S32 serial_num,
  170.  void* data)
  171. {
  172. if (!obj)
  173. {
  174. llwarns << "No object in LLFloaterBuy::inventoryChanged" << llendl;
  175. return;
  176. }
  177. if (!inv)
  178. {
  179. llwarns << "No inventory in LLFloaterBuy::inventoryChanged"
  180. << llendl;
  181. removeVOInventoryListener();
  182. return;
  183. }
  184. LLCtrlListInterface *item_list = childGetListInterface("item_list");
  185. if (!item_list)
  186. {
  187. removeVOInventoryListener();
  188. return;
  189. }
  190. InventoryObjectList::const_iterator it = inv->begin();
  191. InventoryObjectList::const_iterator end = inv->end();
  192. for ( ; it != end; ++it )
  193. {
  194. LLInventoryObject* obj = (LLInventoryObject*)(*it);
  195. // Skip folders, so we know we have inventory items only
  196. if (obj->getType() == LLAssetType::AT_CATEGORY)
  197. continue;
  198. // Skip the mysterious blank InventoryObject 
  199. if (obj->getType() == LLAssetType::AT_NONE)
  200. continue;
  201. LLInventoryItem* inv_item = (LLInventoryItem*)(obj);
  202. // Skip items we can't transfer
  203. if (!inv_item->getPermissions().allowTransferTo(gAgent.getID())) 
  204. continue;
  205. // Create the line in the list
  206. LLSD row;
  207. // Compute icon for this item
  208. BOOL item_is_multi = FALSE;
  209. if ( inv_item->getFlags() & LLInventoryItem::II_FLAGS_LANDMARK_VISITED )
  210. {
  211. item_is_multi = TRUE;
  212. }
  213. std::string icon_name = get_item_icon_name(inv_item->getType(), 
  214.  inv_item->getInventoryType(),
  215.  inv_item->getFlags(),
  216.  item_is_multi);
  217. row["columns"][0]["column"] = "icon";
  218. row["columns"][0]["type"] = "icon";
  219. row["columns"][0]["value"] = icon_name;
  220. // Append the permissions that you will acquire (not the current
  221. // permissions).
  222. U32 next_owner_mask = inv_item->getPermissions().getMaskNextOwner();
  223. std::string text = obj->getName();
  224. if (!(next_owner_mask & PERM_COPY))
  225. {
  226. text.append(LLTrans::getString("no_copy"));
  227. }
  228. if (!(next_owner_mask & PERM_MODIFY))
  229. {
  230. text.append(LLTrans::getString("no_modify"));
  231. }
  232. if (!(next_owner_mask & PERM_TRANSFER))
  233. {
  234. text.append(LLTrans::getString("no_transfer"));
  235. }
  236. row["columns"][1]["column"] = "text";
  237. row["columns"][1]["value"] = text;
  238. row["columns"][1]["font"] = "SANSSERIF";
  239. item_list->addElement(row);
  240. }
  241. removeVOInventoryListener();
  242. }
  243. void LLFloaterBuy::onClickBuy()
  244. {
  245. // Put the items where we put new folders.
  246. LLUUID category_id;
  247. category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);
  248. // *NOTE: doesn't work for multiple object buy, which UI does not
  249. // currently support sale info is used for verification only, if
  250. // it doesn't match region info then sale is canceled.
  251. LLSelectMgr::getInstance()->sendBuy(gAgent.getID(), category_id, mSaleInfo );
  252. closeFloater();
  253. }
  254. void LLFloaterBuy::onClickCancel()
  255. {
  256. closeFloater();
  257. }
  258. // virtual
  259. void LLFloaterBuy::onClose(bool app_quitting)
  260. {
  261. mObjectSelection.clear();
  262. }