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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llfloaterbuycontents.cpp
  3.  * @author James Cook
  4.  * @brief LLFloaterBuyContents 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.  * Shows the contents of an object and their permissions when you
  35.  * click "Buy..." on an object with "Sell Contents" checked.
  36.  */
  37. #include "llviewerprecompiledheaders.h"
  38. #include "llfloaterbuycontents.h"
  39. #include "llcachename.h"
  40. #include "llagent.h" // for agent id
  41. #include "llcheckboxctrl.h"
  42. #include "llinventoryfunctions.h"
  43. #include "llinventorymodel.h" // for gInventory
  44. #include "llfloaterreg.h"
  45. #include "llfloaterinventory.h" // for get_item_icon
  46. #include "llnotificationsutil.h"
  47. #include "llselectmgr.h"
  48. #include "llscrolllistctrl.h"
  49. #include "llviewerobject.h"
  50. #include "llviewerregion.h"
  51. #include "lluictrlfactory.h"
  52. #include "llviewerwindow.h"
  53. LLFloaterBuyContents::LLFloaterBuyContents(const LLSD& key)
  54. : LLFloater(key)
  55. {
  56. //  LLUICtrlFactory::getInstance()->buildFloater(this, "floater_buy_contents.xml");
  57. }
  58. BOOL LLFloaterBuyContents::postBuild()
  59. {
  60. getChild<LLUICtrl>("cancel_btn")->setCommitCallback( boost::bind(&LLFloaterBuyContents::onClickCancel, this));
  61. getChild<LLUICtrl>("buy_btn")->setCommitCallback( boost::bind(&LLFloaterBuyContents::onClickBuy, this));
  62. childDisable("item_list");
  63. childDisable("buy_btn");
  64. childDisable("wear_check");
  65. setDefaultBtn("cancel_btn"); // to avoid accidental buy (SL-43130)
  66. // Always center the dialog.  User can change the size,
  67. // but purchases are important and should be center screen.
  68. // This also avoids problems where the user resizes the application window
  69. // mid-session and the saved rect is off-center.
  70. center();
  71. return TRUE;
  72. }
  73. LLFloaterBuyContents::~LLFloaterBuyContents()
  74. {
  75. }
  76. // static
  77. void LLFloaterBuyContents::show(const LLSaleInfo& sale_info)
  78. {
  79. LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
  80. if (selection->getRootObjectCount() != 1)
  81. {
  82. LLNotificationsUtil::add("BuyContentsOneOnly");
  83. return;
  84. }
  85. LLFloaterBuyContents* floater = LLFloaterReg::showTypedInstance<LLFloaterBuyContents>("buy_object_contents");
  86. if (!floater)
  87. return;
  88. LLScrollListCtrl* list = floater->getChild<LLScrollListCtrl>("item_list");
  89. if (list)
  90. list->deleteAllItems();
  91. floater->mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
  92. LLUUID owner_id;
  93. std::string owner_name;
  94. BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name);
  95. if (!owners_identical)
  96. {
  97. LLNotificationsUtil::add("BuyContentsOneOwner");
  98. return;
  99. }
  100. floater->mSaleInfo = sale_info;
  101. // Update the display
  102. LLSelectNode* node = selection->getFirstRootNode();
  103. if (!node) return;
  104. if(node->mPermissions->isGroupOwned())
  105. {
  106. gCacheName->getGroupName(owner_id, owner_name);
  107. }
  108. floater->childSetTextArg("contains_text", "[NAME]", node->mName);
  109. floater->childSetTextArg("buy_text", "[AMOUNT]", llformat("%d", sale_info.getSalePrice()));
  110. floater->childSetTextArg("buy_text", "[NAME]", owner_name);
  111. // Must do this after the floater is created, because
  112. // sometimes the inventory is already there and 
  113. // the callback is called immediately.
  114. LLViewerObject* obj = selection->getFirstRootObject();
  115. floater->registerVOInventoryListener(obj,NULL);
  116. floater->requestVOInventory();
  117. }
  118. void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,
  119. InventoryObjectList* inv,
  120.  S32 serial_num,
  121.  void* data)
  122. {
  123. if (!obj)
  124. {
  125. llwarns << "No object in LLFloaterBuyContents::inventoryChanged" << llendl;
  126. return;
  127. }
  128. if (!inv)
  129. {
  130. llwarns << "No inventory in LLFloaterBuyContents::inventoryChanged"
  131. << llendl;
  132. removeVOInventoryListener();
  133. return;
  134. }
  135. LLCtrlListInterface *item_list = childGetListInterface("item_list");
  136. if (!item_list)
  137. {
  138. removeVOInventoryListener();
  139. return;
  140. }
  141. // default to turning off the buy button.
  142. childDisable("buy_btn");
  143. LLUUID owner_id;
  144. BOOL is_group_owned;
  145. LLAssetType::EType asset_type;
  146. LLInventoryType::EType inv_type;
  147. S32 wearable_count = 0;
  148. InventoryObjectList::const_iterator it = inv->begin();
  149. InventoryObjectList::const_iterator end = inv->end();
  150. for ( ; it != end; ++it )
  151. {
  152. asset_type = (*it)->getType();
  153. // Skip folders, so we know we have inventory items only
  154. if (asset_type == LLAssetType::AT_CATEGORY)
  155. continue;
  156. LLInventoryItem* inv_item = (LLInventoryItem*)((LLInventoryObject*)(*it));
  157. inv_type = inv_item->getInventoryType();
  158. // Count clothing items for later
  159. if (LLInventoryType::IT_WEARABLE == inv_type)
  160. {
  161. wearable_count++;
  162. }
  163. // Skip items the object's owner can't copy (and hence can't sell)
  164. if (!inv_item->getPermissions().getOwnership(owner_id, is_group_owned))
  165. continue;
  166. if (!inv_item->getPermissions().allowCopyBy(owner_id, owner_id))
  167. continue;
  168. // Skip items we can't transfer
  169. if (!inv_item->getPermissions().allowTransferTo(gAgent.getID())) 
  170. continue;
  171. // There will be at least one item shown in the display, so go
  172. // ahead and enable the buy button.
  173. childEnable("buy_btn");
  174. // Create the line in the list
  175. LLSD row;
  176. BOOL item_is_multi = FALSE;
  177. if ( inv_item->getFlags() & LLInventoryItem::II_FLAGS_LANDMARK_VISITED )
  178. {
  179. item_is_multi = TRUE;
  180. }
  181. std::string icon_name = get_item_icon_name(inv_item->getType(), 
  182.  inv_item->getInventoryType(),
  183.  inv_item->getFlags(),
  184.  item_is_multi);
  185. row["columns"][0]["column"] = "icon";
  186. row["columns"][0]["type"] = "icon";
  187. row["columns"][0]["value"] = icon_name;
  188. // Append the permissions that you will acquire (not the current
  189. // permissions).
  190. U32 next_owner_mask = inv_item->getPermissions().getMaskNextOwner();
  191. std::string text = (*it)->getName();
  192. if (!(next_owner_mask & PERM_COPY))
  193. {
  194. text.append(getString("no_copy_text"));
  195. }
  196. if (!(next_owner_mask & PERM_MODIFY))
  197. {
  198. text.append(getString("no_modify_text"));
  199. }
  200. if (!(next_owner_mask & PERM_TRANSFER))
  201. {
  202. text.append(getString("no_transfer_text"));
  203. }
  204. row["columns"][1]["column"] = "text";
  205. row["columns"][1]["value"] = text;
  206. row["columns"][1]["font"] = "SANSSERIF";
  207. item_list->addElement(row);
  208. }
  209. if (wearable_count > 0)
  210. {
  211. childEnable("wear_check");
  212. childSetValue("wear_check", LLSD(false) );
  213. }
  214. removeVOInventoryListener();
  215. }
  216. void LLFloaterBuyContents::onClickBuy()
  217. {
  218. // Make sure this wasn't selected through other mechanisms 
  219. // (ie, being the default button and pressing enter.
  220. if(!childIsEnabled("buy_btn"))
  221. {
  222. // We shouldn't be enabled.  Just close.
  223. closeFloater();
  224. return;
  225. }
  226. // We may want to wear this item
  227. if (childGetValue("wear_check"))
  228. {
  229. LLInventoryState::sWearNewClothing = TRUE;
  230. }
  231. // Put the items where we put new folders.
  232. LLUUID category_id;
  233. category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_ROOT_INVENTORY);
  234. // *NOTE: doesn't work for multiple object buy, which UI does not
  235. // currently support sale info is used for verification only, if
  236. // it doesn't match region info then sale is canceled.
  237. LLSelectMgr::getInstance()->sendBuy(gAgent.getID(), category_id, mSaleInfo);
  238. closeFloater();
  239. }
  240. void LLFloaterBuyContents::onClickCancel()
  241. {
  242. closeFloater();
  243. }