From 047b74c4f4727c41ae1086d18a12a9cf5aad5fce Mon Sep 17 00:00:00 2001
From: Aimee Linden <aimee@lindenlab.com>
Date: Thu, 22 Jul 2010 17:46:47 +0100
Subject: [PATCH] EXT-8248 FIXED Can't teleport multiple friends

---
 indra/newview/llavataractions.cpp             | 16 +++++++++++++++
 indra/newview/llavataractions.h               | 12 ++++++++---
 indra/newview/llpanelpeople.cpp               | 20 ++++++++-----------
 indra/newview/llpanelpeople.h                 |  1 -
 indra/newview/llpanelpeoplemenus.cpp          |  7 +++----
 .../xui/en/menu_people_nearby_multiselect.xml |  9 +++++++++
 6 files changed, 45 insertions(+), 20 deletions(-)

diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index eedadb962f..b9ae976e58 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -689,6 +689,7 @@ void LLAvatarActions::toggleBlock(const LLUUID& id)
 		LLMuteList::getInstance()->add(mute);
 	}
 }
+
 // static
 bool LLAvatarActions::canOfferTeleport(const LLUUID& id)
 {
@@ -704,6 +705,21 @@ bool LLAvatarActions::canOfferTeleport(const LLUUID& id)
 	return true;
 }
 
+// static
+bool LLAvatarActions::canOfferTeleport(const uuid_vec_t& ids)
+{
+	bool result = true;
+	for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
+	{
+		if(!canOfferTeleport(*it))
+		{
+			result = false;
+			break;
+		}
+	}
+	return result;
+}
+
 void LLAvatarActions::inviteToGroup(const LLUUID& id)
 {
 	LLFloaterGroupPicker* widget = LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(id));
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index cd8ac3b653..6313ae0759 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -171,12 +171,18 @@ public:
 	static void csr(const LLUUID& id, std::string name);
 
 	/**
-	 * Checks whether can offer teleport to the avatar
-	 * Can't offer only for offline friends
+	 * Checks whether we can offer a teleport to the avatar, only offline friends
+	 * cannot be offered a teleport.
+	 *
+	 * @return false if avatar is a friend and not visibly online
 	 */
 	static bool canOfferTeleport(const LLUUID& id);
 
-	
+	/**
+	 * @return false if any one of the specified avatars a friend and not visibly online
+	 */
+	static bool canOfferTeleport(const uuid_vec_t& ids);
+
 private:
 	static bool callbackAddFriend(const LLSD& notification, const LLSD& response);
 	static bool callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response);
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 1c4476ca49..bb202c864d 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -754,12 +754,6 @@ void LLPanelPeople::buttonSetAction(const std::string& btn_name, const commit_si
 	button->setClickedCallback(cb);
 }
 
-bool LLPanelPeople::isFriendOnline(const LLUUID& id)
-{
-	uuid_vec_t ids = mOnlineFriendList->getIDs();
-	return std::find(ids.begin(), ids.end(), id) != ids.end();
-}
-
 void LLPanelPeople::updateButtons()
 {
 	std::string cur_tab		= getActiveTabName();
@@ -821,11 +815,11 @@ void LLPanelPeople::updateButtons()
 
 	bool enable_calls = LLVoiceClient::getInstance()->isVoiceWorking() && LLVoiceClient::getInstance()->voiceEnabled();
 
-	buttonSetEnabled("teleport_btn",		friends_tab_active && item_selected && isFriendOnline(selected_uuids.front()));
-	buttonSetEnabled("view_profile_btn",	item_selected);
-	buttonSetEnabled("im_btn",				multiple_selected); // allow starting the friends conference for multiple selection
-	buttonSetEnabled("call_btn",			multiple_selected && enable_calls);
-	buttonSetEnabled("share_btn",			item_selected); // not implemented yet
+	buttonSetEnabled("view_profile_btn",item_selected);
+	buttonSetEnabled("share_btn",		item_selected);
+	buttonSetEnabled("im_btn",			multiple_selected); // allow starting the friends conference for multiple selection
+	buttonSetEnabled("call_btn",		multiple_selected && enable_calls);
+	buttonSetEnabled("teleport_btn",	multiple_selected && LLAvatarActions::canOfferTeleport(selected_uuids));
 
 	bool none_group_selected = item_selected && selected_id.isNull();
 	buttonSetEnabled("group_info_btn", !none_group_selected);
@@ -1329,7 +1323,9 @@ void LLPanelPeople::onGroupCallButtonClicked()
 
 void LLPanelPeople::onTeleportButtonClicked()
 {
-	LLAvatarActions::offerTeleport(getCurrentItemID());
+	uuid_vec_t selected_uuids;
+	getCurrentItemIDs(selected_uuids);
+	LLAvatarActions::offerTeleport(selected_uuids);
 }
 
 void LLPanelPeople::onShareButtonClicked()
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index e931537042..b875ac51a6 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -72,7 +72,6 @@ private:
 	void					updateNearbyList();
 	void					updateRecentList();
 
-	bool					isFriendOnline(const LLUUID& id);
 	bool					isItemsFreeOfFriends(const uuid_vec_t& uuids);
 
 	void					updateButtons();
diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index efca3ae1c2..f12c4de2f7 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -81,6 +81,7 @@ LLContextMenu* NearbyMenu::createMenu()
 		// registrar.add("Avatar.AddFriend",	boost::bind(&LLAvatarActions::requestFriendshipDialog,	mUUIDs)); // *TODO: unimplemented
 		registrar.add("Avatar.IM",			boost::bind(&LLAvatarActions::startConference,			mUUIDs));
 		registrar.add("Avatar.Call",		boost::bind(&LLAvatarActions::startAdhocCall,			mUUIDs));
+		registrar.add("Avatar.OfferTeleport",	boost::bind(&NearbyMenu::offerTeleport,					this));
 		registrar.add("Avatar.RemoveFriend",boost::bind(&LLAvatarActions::removeFriendsDialog,		mUUIDs));
 		// registrar.add("Avatar.Share",		boost::bind(&LLAvatarActions::startIM,					mUUIDs)); // *TODO: unimplemented
 		// registrar.add("Avatar.Pay",		boost::bind(&LLAvatarActions::pay,						mUUIDs)); // *TODO: unimplemented
@@ -168,8 +169,7 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
 	}
 	else if(item == std::string("can_offer_teleport"))
 	{
-		const LLUUID& id = mUUIDs.front();
-		return LLAvatarActions::canOfferTeleport(id);
+		return LLAvatarActions::canOfferTeleport(mUUIDs);
 	}
 	return false;
 }
@@ -191,8 +191,7 @@ void NearbyMenu::offerTeleport()
 {
 	// boost::bind cannot recognize overloaded method LLAvatarActions::offerTeleport(),
 	// so we have to use a wrapper.
-	const LLUUID& id = mUUIDs.front();
-	LLAvatarActions::offerTeleport(id);
+	LLAvatarActions::offerTeleport(mUUIDs);
 }
 
 } // namespace LLPanelPeopleMenus
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
index 588342595e..5d58a9d289 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
@@ -57,4 +57,13 @@
         <on_click
          function="Avatar.Pay" />
     </menu_item_call>
+    <menu_item_call
+    label="Offer Teleport"
+    name="teleport">
+      <menu_item_call.on_click
+       function="Avatar.OfferTeleport"/>
+      <menu_item_call.on_enable
+      function="Avatar.EnableItem"
+      parameter="can_offer_teleport"/>
+    </menu_item_call>
 </context_menu>
-- 
GitLab