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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llplacesinventorybridge.cpp
  3.  * @brief Implementation of the Inventory-Folder-View-Bridge classes for Places Panel.
  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 "llmenugl.h"
  34. #include "llplacesinventorybridge.h"
  35. #include "llfloaterinventory.h" // for LLInventoryPanel
  36. #include "llfolderview.h" // for FIRST_SELECTED_ITEM
  37. #include "llinventorypanel.h"
  38. static const std::string LANDMARKS_INVENTORY_LIST_NAME("landmarks_list");
  39. bool is_landmarks_panel(const LLInventoryPanel* inv_panel)
  40. {
  41. if (NULL == inv_panel)
  42. return false;
  43. return inv_panel->getName() == LANDMARKS_INVENTORY_LIST_NAME;
  44. }
  45. void fill_items_with_menu_items(std::vector<std::string>& items, LLMenuGL& menu)
  46. {
  47. LLView::child_list_const_iter_t itor;
  48. for (itor = menu.beginChild(); itor != menu.endChild(); ++itor)
  49. {
  50. std::string name = (*itor)->getName();
  51. items.push_back(name);
  52. }
  53. }
  54. // virtual
  55. void LLPlacesLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
  56. {
  57. std::vector<std::string> items;
  58. std::vector<std::string> disabled_items;
  59. if(isItemInTrash())
  60. {
  61. items.push_back(std::string("Purge Item"));
  62. if (!isItemRemovable())
  63. {
  64. disabled_items.push_back(std::string("Purge Item"));
  65. }
  66. items.push_back(std::string("Restore Item"));
  67. }
  68. else
  69. {
  70. fill_items_with_menu_items(items, menu);
  71. // Disabled items are processed via LLLandmarksPanel::isActionEnabled()
  72. // they should be synchronized with Places/My Landmarks/Gear menu. See EXT-1601 
  73. }
  74. hide_context_entries(menu, items, disabled_items);
  75. }
  76. void LLPlacesFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
  77. {
  78. {
  79. std::vector<std::string> items;
  80. std::vector<std::string> disabled_items;
  81. LLInventoryPanel* inv_panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
  82. bool is_open = false;
  83. if (inv_panel)
  84. {
  85. LLFolderViewFolder* folder = dynamic_cast<LLFolderViewFolder*>(inv_panel->getRootFolder()->getItemByID(mUUID));
  86. is_open = (NULL != folder) && folder->isOpen();
  87. }
  88. // collect all items' names
  89. fill_items_with_menu_items(items, menu);
  90. // remove expand or collapse menu item depend on folder state
  91. std::string collapse_expand_item_to_hide(is_open ? "expand" : "collapse");
  92. std::vector<std::string>::iterator it = std::find(items.begin(), items.end(), collapse_expand_item_to_hide);
  93. if (it != items.end()) items.erase(it);
  94. // Disabled items are processed via LLLandmarksPanel::isActionEnabled()
  95. // they should be synchronized with Places/My Landmarks/Gear menu. See EXT-1601 
  96. // repeat parent functionality
  97.   sSelf = this; // necessary for "New Folder" functionality
  98. hide_context_entries(menu, items, disabled_items);
  99. }
  100. }
  101. //virtual
  102. void LLPlacesFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
  103. {
  104. if ("expand" == action)
  105. {
  106. LLFolderViewFolder* act_folder = getFolder();
  107. act_folder->toggleOpen();
  108. }
  109. else if ("collapse" == action)
  110. {
  111. LLFolderViewFolder* act_folder = getFolder();
  112. act_folder->toggleOpen();
  113. }
  114. else
  115. {
  116. LLFolderBridge::performAction(folder, model, action);
  117. }
  118. }
  119. LLFolderViewFolder* LLPlacesFolderBridge::getFolder()
  120. {
  121. LLFolderViewFolder* folder = NULL;
  122. LLInventoryPanel* inv_panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
  123. if (inv_panel)
  124. {
  125. folder = dynamic_cast<LLFolderViewFolder*>(inv_panel->getRootFolder()->getItemByID(mUUID));
  126. }
  127. return folder;
  128. }
  129. // virtual
  130. LLInvFVBridge* LLPlacesInventoryBridgeBuilder::createBridge(
  131. LLAssetType::EType asset_type,
  132. LLAssetType::EType actual_asset_type,
  133. LLInventoryType::EType inv_type,
  134. LLInventoryPanel* inventory,
  135. const LLUUID& uuid,
  136. U32 flags/* = 0x00*/) const
  137. {
  138. LLInvFVBridge* new_listener = NULL;
  139. switch(asset_type)
  140. {
  141. case LLAssetType::AT_LANDMARK:
  142. if(!(inv_type == LLInventoryType::IT_LANDMARK))
  143. {
  144. llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
  145. }
  146. new_listener = new LLPlacesLandmarkBridge(inv_type, inventory, uuid, flags);
  147. break;
  148. case LLAssetType::AT_CATEGORY:
  149. if (actual_asset_type == LLAssetType::AT_LINK_FOLDER)
  150. {
  151. // *TODO: Create a link folder handler instead if it is necessary
  152. new_listener = LLInventoryFVBridgeBuilder::createBridge(
  153. asset_type,
  154. actual_asset_type,
  155. inv_type,
  156. inventory,
  157. uuid,
  158. flags);
  159. break;
  160. }
  161. new_listener = new LLPlacesFolderBridge(inv_type, inventory, uuid);
  162. break;
  163. default:
  164. new_listener = LLInventoryFVBridgeBuilder::createBridge(
  165. asset_type,
  166. actual_asset_type,
  167. inv_type,
  168. inventory,
  169. uuid,
  170. flags);
  171. }
  172. return new_listener;
  173. }
  174. // EOF