From 27dca7fa4093665ef84e3f4ce7de7a85ef897ad8 Mon Sep 17 00:00:00 2001
From: Rye Mutt <rye@alchemyviewer.org>
Date: Wed, 4 Jan 2023 23:53:53 -0500
Subject: [PATCH] Add nearby list click to zoom option

---
 .../newview/app_settings/settings_alchemy.xml | 11 ++++
 indra/newview/llpanelpeople.cpp               | 66 +++++++++++++++++--
 indra/newview/llpanelpeople.h                 |  8 +++
 .../xui/en/menu_people_nearby_view.xml        | 41 ++++++++++++
 4 files changed, 122 insertions(+), 4 deletions(-)

diff --git a/indra/newview/app_settings/settings_alchemy.xml b/indra/newview/app_settings/settings_alchemy.xml
index 734dbc79d03..92baa20706e 100644
--- a/indra/newview/app_settings/settings_alchemy.xml
+++ b/indra/newview/app_settings/settings_alchemy.xml
@@ -607,6 +607,17 @@
       <key>Value</key>
       <real>0.15</real>
     </map>
+    <key>AlchemyNearbyPeopleClickAction</key>
+    <map>
+    <key>Comment</key>
+    <string>0 - IM, 1 - Profile, 2 - Zoom In, 3 - Teleport To</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>U32</string>
+      <key>Value</key>
+      <integer>2</integer>
+    </map>
     <key>AlchemyNearbyTypingIndicators</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 1cc810b806b..c6ed2c7c65c 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -44,6 +44,7 @@
 #include "llpanelpeople.h"
 
 // newview
+#include "alavataractions.h"
 #include "llaccordionctrl.h"
 #include "llaccordionctrltab.h"
 #include "llagent.h"
@@ -686,7 +687,7 @@ BOOL LLPanelPeople::postBuild()
 
 	mOnlineFriendList->setItemDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, _1));
 	mAllFriendList->setItemDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, _1));
-	mNearbyList->setItemDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, _1));
+	mNearbyList->setItemDoubleClickCallback(boost::bind(&LLPanelPeople::onNearbyListDoubleClicked, this, _1));
 	mRecentList->setItemDoubleClickCallback(boost::bind(&LLPanelPeople::onAvatarListDoubleClicked, this, _1));
 
 	mOnlineFriendList->setCommitCallback(boost::bind(&LLPanelPeople::onAvatarListCommitted, this, mOnlineFriendList));
@@ -1192,6 +1193,38 @@ void LLPanelPeople::onAvatarListCommitted(LLAvatarList* list)
 	updateButtons();
 }
 
+void LLPanelPeople::onNearbyListDoubleClicked(LLUICtrl* ctrl)
+{
+	LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(ctrl);
+	if(!item)
+	{
+		return;
+	}
+
+	LLUUID clicked_id = item->getAvatarId();
+	if(gAgent.getID() == clicked_id)
+	{
+		return;
+	}
+	U32 nearby_list_click_behavior = gSavedSettings.getU32("AlchemyNearbyPeopleClickAction");
+	switch (nearby_list_click_behavior)
+	{
+	default:
+	case 0:
+		LLAvatarActions::startIM(clicked_id);
+		break;
+	case 1:
+		LLAvatarActions::showProfile(clicked_id);
+		break;
+	case 2:
+		handle_zoom_to_object(clicked_id);
+		break;
+	case 3:
+		ALAvatarActions::teleportTo(clicked_id);
+		break;
+	}
+}
+
 void LLPanelPeople::onAddFriendButtonClicked()
 {
 	LLUUID id = getCurrentItemID();
@@ -1417,21 +1450,46 @@ void LLPanelPeople::onNearbyViewSortMenuItemClicked(const LLSD& userdata)
 	    mNearbyList->setShowCompleteName(!hide_usernames);
 	    mNearbyList->handleDisplayNamesOptionChanged();
 	}
+	else if (chosen_item == "click_im")
+	{
+		gSavedSettings.setU32("AlchemyNearbyPeopleClickAction", E_CLICK_TO_IM);
+	}
+	else if (chosen_item == "click_profile")
+	{
+		gSavedSettings.setU32("AlchemyNearbyPeopleClickAction", E_CLICK_TO_PROFILE);
+	}
+	else if (chosen_item == "click_zoom")
+	{
+		gSavedSettings.setU32("AlchemyNearbyPeopleClickAction", E_CLICK_TO_ZOOM);
+	}
+	else if (chosen_item == "click_teleport")
+	{
+		gSavedSettings.setU32("AlchemyNearbyPeopleClickAction", E_CLICK_TO_TELEPORT);
+	}
 }
 
 bool LLPanelPeople::onNearbyViewSortMenuItemCheck(const LLSD& userdata)
 {
 	std::string item = userdata.asString();
 	U32 sort_order = gSavedSettings.getU32("NearbyPeopleSortOrder");
+	U32 click_action = gSavedSettings.getU32("AlchemyNearbyPeopleClickAction");
 
 	if (item == "sort_by_recent_speakers")
 		return sort_order == E_SORT_BY_RECENT_SPEAKERS;
-	if (item == "sort_name")
+	else if (item == "sort_name")
 		return sort_order == E_SORT_BY_NAME;
-	if (item == "sort_distance")
+	else if (item == "sort_distance")
 		return sort_order == E_SORT_BY_DISTANCE;
-	if (item == "sort_arrival")
+	else if (item == "sort_arrival")
 		return sort_order == E_SORT_BY_RECENT_ARRIVAL;
+	else if (item == "click_im")
+		return click_action == E_CLICK_TO_IM;
+	else if (item == "click_profile")
+		return click_action == E_CLICK_TO_PROFILE;
+	else if (item == "click_zoom")
+		return click_action == E_CLICK_TO_ZOOM;
+	else if (item == "click_teleport")
+		return click_action == E_CLICK_TO_TELEPORT;
 
 	return false;
 }
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index ab108c51982..0a0a5feb2a5 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -78,6 +78,13 @@ class LLPanelPeople
 		E_SORT_BY_RECENT_ARRIVAL = 5
 	} ESortOrder;
 
+	typedef enum e_click_actions {
+		E_CLICK_TO_IM = 0,
+		E_CLICK_TO_PROFILE = 1,
+		E_CLICK_TO_ZOOM = 2,
+		E_CLICK_TO_TELEPORT = 3
+	} EClickActions;
+
     void				    removePicker();
 
 	// methods indirectly called by the updaters
@@ -108,6 +115,7 @@ class LLPanelPeople
 	void					onMoreButtonClicked();
 	void					onAvatarListDoubleClicked(LLUICtrl* ctrl);
 	void					onAvatarListCommitted(LLAvatarList* list);
+	void					onNearbyListDoubleClicked(LLUICtrl* ctrl);
 	bool					onGroupPlusButtonValidate();
 	void					onGroupMinusButtonClicked();
 	void					onGroupPlusMenuItemClicked(const LLSD& userdata);
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_view.xml
index 889447e5623..e3e6e8c16ee 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby_view.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby_view.xml
@@ -44,6 +44,47 @@
          parameter="sort_arrival"/>
   </menu_item_check>
     <menu_item_separator layout="topleft" />
+    <menu_item_check
+       label="Click to IM"
+       name="click_im">
+      <menu_item_check.on_click
+         function="People.Nearby.ViewSort.Action"
+         parameter="click_im"/>
+      <menu_item_check.on_check
+         function="People.Nearby.ViewSort.CheckItem"
+         parameter="click_im"/>
+    </menu_item_check>
+    <menu_item_check
+       label="Click to view profile"
+       name="click_profile">
+      <menu_item_check.on_click
+         function="People.Nearby.ViewSort.Action"
+         parameter="click_profile"/>
+      <menu_item_check.on_check
+         function="People.Nearby.ViewSort.CheckItem"
+         parameter="click_profile"/>
+    </menu_item_check>
+    <menu_item_check
+       label="Click to zoom in"
+       name="click_zoom">
+      <menu_item_check.on_click
+         function="People.Nearby.ViewSort.Action"
+         parameter="click_zoom"/>
+      <menu_item_check.on_check
+         function="People.Nearby.ViewSort.CheckItem"
+         parameter="click_zoom"/>
+    </menu_item_check>	
+    <menu_item_check
+       label="Click to teleport to"
+       name="click_teleport">
+      <menu_item_check.on_click
+         function="People.Nearby.ViewSort.Action"
+         parameter="click_teleport"/>
+      <menu_item_check.on_check
+         function="People.Nearby.ViewSort.CheckItem"
+         parameter="click_teleport"/>
+    </menu_item_check>	
+    <menu_item_separator layout="topleft" />	
     <menu_item_check name="view_icons" label="View People Icons">
         <menu_item_check.on_click
          function="People.Nearby.ViewSort.Action"
-- 
GitLab