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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llpanelpeoplemenus.h
  3.  * @brief Menus used by the side tray "People" 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. // libs
  34. #include "llmenugl.h"
  35. #include "lluictrlfactory.h"
  36. #include "llpanelpeoplemenus.h"
  37. // newview
  38. #include "llagentdata.h" // for gAgentID
  39. #include "llavataractions.h"
  40. #include "llviewermenu.h" // for gMenuHolder
  41. namespace LLPanelPeopleMenus
  42. {
  43. NearbyMenu gNearbyMenu;
  44. //== ContextMenu ==============================================================
  45. ContextMenu::ContextMenu()
  46. : mMenu(NULL)
  47. {
  48. }
  49. ContextMenu::~ContextMenu()
  50. {
  51. // do not forget delete LLContextMenu* mMenu.
  52. // It can have registered Enable callbacks which are called from the LLMenuHolderGL::draw()
  53. // via selected item (menu_item_call) by calling LLMenuItemCallGL::buildDrawLabel.
  54. // we can have a crash via using callbacks of deleted instance of ContextMenu. EXT-4725
  55. // menu holder deletes its menus on viewer exit, so we have no way to determine if instance 
  56. // of mMenu has already been deleted except of using LLHandle. EXT-4762.
  57. if (!mMenuHandle.isDead())
  58. {
  59. mMenu->die();
  60. mMenu = NULL;
  61. }
  62. }
  63. void ContextMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y)
  64. {
  65. if (mMenu)
  66. {
  67. //preventing parent (menu holder) from deleting already "dead" context menus on exit
  68. LLView* parent = mMenu->getParent();
  69. if (parent)
  70. {
  71. parent->removeChild(mMenu);
  72. }
  73. delete mMenu;
  74. mMenu = NULL;
  75. mUUIDs.clear();
  76. }
  77. if ( uuids.empty() )
  78. return;
  79. mUUIDs.resize(uuids.size());
  80. std::copy(uuids.begin(), uuids.end(), mUUIDs.begin());
  81. mMenu = createMenu();
  82. mMenuHandle = mMenu->getHandle();
  83. mMenu->show(x, y);
  84. LLMenuGL::showPopup(spawning_view, mMenu, x, y);
  85. }
  86. void ContextMenu::hide()
  87. {
  88. if(mMenu)
  89. {
  90. mMenu->hide();
  91. }
  92. }
  93. //== NearbyMenu ===============================================================
  94. LLContextMenu* NearbyMenu::createMenu()
  95. {
  96. // set up the callbacks for all of the avatar menu items
  97. LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
  98. LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
  99. if ( mUUIDs.size() == 1 )
  100. {
  101. // Set up for one person selected menu
  102. const LLUUID& id = mUUIDs.front();
  103. registrar.add("Avatar.Profile", boost::bind(&LLAvatarActions::showProfile, id));
  104. registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, id));
  105. registrar.add("Avatar.RemoveFriend", boost::bind(&LLAvatarActions::removeFriendDialog,  id));
  106. registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startIM, id));
  107. registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startCall, id));
  108. registrar.add("Avatar.OfferTeleport", boost::bind(&NearbyMenu::offerTeleport, this));
  109. registrar.add("Avatar.ShowOnMap", boost::bind(&LLAvatarActions::startIM, id)); // *TODO: unimplemented
  110. registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::share, id));
  111. registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, id));
  112. registrar.add("Avatar.BlockUnblock", boost::bind(&LLAvatarActions::toggleBlock, id));
  113. enable_registrar.add("Avatar.EnableItem", boost::bind(&NearbyMenu::enableContextMenuItem, this, _2));
  114. enable_registrar.add("Avatar.CheckItem",  boost::bind(&NearbyMenu::checkContextMenuItem, this, _2));
  115. // create the context menu from the XUI
  116. return LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>(
  117. "menu_people_nearby.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
  118. }
  119. else
  120. {
  121. // Set up for multi-selected People
  122. // registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, mUUIDs)); // *TODO: unimplemented
  123. registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startConference, mUUIDs));
  124. registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startAdhocCall, mUUIDs));
  125. registrar.add("Avatar.RemoveFriend",boost::bind(&LLAvatarActions::removeFriendsDialog, mUUIDs));
  126. // registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::startIM, mUUIDs)); // *TODO: unimplemented
  127. // registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, mUUIDs)); // *TODO: unimplemented
  128. enable_registrar.add("Avatar.EnableItem", boost::bind(&NearbyMenu::enableContextMenuItem, this, _2));
  129. // create the context menu from the XUI
  130. return LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>
  131. ("menu_people_nearby_multiselect.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
  132. }
  133. }
  134. bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
  135. {
  136. std::string item = userdata.asString();
  137. // Note: can_block and can_delete is used only for one person selected menu
  138. // so we don't need to go over all uuids.
  139. if (item == std::string("can_block"))
  140. {
  141. const LLUUID& id = mUUIDs.front();
  142. return LLAvatarActions::canBlock(id);
  143. }
  144. else if (item == std::string("can_add"))
  145. {
  146. // We can add friends if:
  147. // - there are selected people
  148. // - and there are no friends among selection yet.
  149. bool result = (mUUIDs.size() > 0);
  150. std::vector<LLUUID>::const_iterator
  151. id = mUUIDs.begin(),
  152. uuids_end = mUUIDs.end();
  153. for (;id != uuids_end; ++id)
  154. {
  155. if ( LLAvatarActions::isFriend(*id) )
  156. {
  157. result = false;
  158. break;
  159. }
  160. }
  161. return result;
  162. }
  163. else if (item == std::string("can_delete"))
  164. {
  165. // We can remove friends if:
  166. // - there are selected people
  167. // - and there are only friends among selection.
  168. bool result = (mUUIDs.size() > 0);
  169. std::vector<LLUUID>::const_iterator
  170. id = mUUIDs.begin(),
  171. uuids_end = mUUIDs.end();
  172. for (;id != uuids_end; ++id)
  173. {
  174. if ( !LLAvatarActions::isFriend(*id) )
  175. {
  176. result = false;
  177. break;
  178. }
  179. }
  180. return result;
  181. }
  182. else if (item == std::string("can_call"))
  183. {
  184. return LLAvatarActions::canCall();
  185. }
  186. return false;
  187. }
  188. bool NearbyMenu::checkContextMenuItem(const LLSD& userdata)
  189. {
  190. std::string item = userdata.asString();
  191. const LLUUID& id = mUUIDs.front();
  192. if (item == std::string("is_blocked"))
  193. {
  194. return LLAvatarActions::isBlocked(id);
  195. }
  196. return false;
  197. }
  198. void NearbyMenu::offerTeleport()
  199. {
  200. // boost::bind cannot recognize overloaded method LLAvatarActions::offerTeleport(),
  201. // so we have to use a wrapper.
  202. const LLUUID& id = mUUIDs.front();
  203. LLAvatarActions::offerTeleport(id);
  204. }
  205. } // namespace LLPanelPeopleMenus