Display parcel name when clicking on a parcel on the world map (#2131)

master
Ansariel Hiller 2024-08-03 00:24:41 +02:00 committed by GitHub
parent 01688e5216
commit 593479f33c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 161 additions and 14 deletions

View File

@ -261,6 +261,48 @@ void LLMapFriendObserver::changed(U32 mask)
}
}
LLWorldMapParcelInfoObserver::LLWorldMapParcelInfoObserver(const LLVector3d& pos_global)
: LLRemoteParcelInfoObserver(),
mPosGlobal(pos_global),
mParcelID(LLUUID::null)
{ }
LLWorldMapParcelInfoObserver::~LLWorldMapParcelInfoObserver()
{
if (mParcelID.notNull())
{
LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mParcelID, this);
}
}
void LLWorldMapParcelInfoObserver::processParcelInfo(const LLParcelData& parcel_data)
{
if (parcel_data.parcel_id == mParcelID)
{
LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mParcelID, this);
if (gFloaterWorldMap)
{
gFloaterWorldMap->processParcelInfo(parcel_data, mPosGlobal);
}
}
}
// virtual
void LLWorldMapParcelInfoObserver::setParcelID(const LLUUID& parcel_id)
{
mParcelID = parcel_id;
auto instance = LLRemoteParcelInfoProcessor::getInstance();
instance->addObserver(mParcelID, this);
instance->sendParcelInfoRequest(mParcelID);
}
// virtual
void LLWorldMapParcelInfoObserver::setErrorStatus(S32 status, const std::string& reason)
{
LL_WARNS("LLWorldMapParcelInfoObserver") << "Can't handle remote parcel request." << " Http Status: " << status << ". Reason : " << reason << LL_ENDL;
}
//---------------------------------------------------------------------------
// Statics
//---------------------------------------------------------------------------
@ -275,23 +317,25 @@ const LLUUID LLFloaterWorldMap::sHomeID( "10000000-0000-0000-0000-000000000001"
LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key)
: LLFloater(key),
mInventory(NULL),
mInventoryObserver(NULL),
mFriendObserver(NULL),
mInventory(nullptr),
mInventoryObserver(nullptr),
mFriendObserver(nullptr),
mCompletingRegionName(),
mCompletingRegionPos(),
mWaitingForTracker(false),
mIsClosing(false),
mSetToUserPosition(true),
mTrackedLocation(0,0,0),
mTrackedLocation(0.0,0.0,0.0),
mTrackedStatus(LLTracker::TRACKING_NOTHING),
mListFriendCombo(NULL),
mListLandmarkCombo(NULL),
mListSearchResults(NULL)
mListFriendCombo(nullptr),
mListLandmarkCombo(nullptr),
mListSearchResults(nullptr),
mParcelInfoObserver(nullptr),
mShowParcelInfo(false)
{
gFloaterWorldMap = this;
mFactoryMap["objects_mapview"] = LLCallbackMap(createWorldMapView, NULL);
mFactoryMap["objects_mapview"] = LLCallbackMap(createWorldMapView, nullptr);
mCommitCallbackRegistrar.add("WMap.Coordinates", boost::bind(&LLFloaterWorldMap::onCoordinatesCommit, this));
mCommitCallbackRegistrar.add("WMap.Location", boost::bind(&LLFloaterWorldMap::onLocationCommit, this));
@ -374,6 +418,11 @@ bool LLFloaterWorldMap::postBuild()
// virtual
LLFloaterWorldMap::~LLFloaterWorldMap()
{
if (mParcelInfoObserver)
{
delete mParcelInfoObserver;
}
// All cleaned up by LLView destructor
mMapView = NULL;
@ -584,9 +633,73 @@ void LLFloaterWorldMap::draw()
// Internal utility functions
//-------------------------------------------------------------------------
void LLFloaterWorldMap::processParcelInfo(const LLParcelData& parcel_data, const LLVector3d& pos_global) const
{
LLVector3d tracker_pos = LLTracker::getTrackedPositionGlobal();
if (!mShowParcelInfo ||
(tracker_pos.mdV[VX] != pos_global.mdV[VX] && tracker_pos.mdV[VY] != pos_global.mdV[VY]) ||
LLTracker::getTrackedLocationType() != LLTracker::LOCATION_NOTHING ||
LLTracker::getTrackingStatus() != LLTracker::TRACKING_LOCATION)
{
return;
}
LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global);
if (!sim_info)
{
return;
}
std::string sim_name = sim_info->getName();
U32 locX, locY;
from_region_handle(sim_info->getHandle(), &locX, &locY);
F32 region_x = (F32)(pos_global.mdV[VX] - locX);
F32 region_y = (F32)(pos_global.mdV[VY] - locY);
std::string full_name = llformat("%s (%d, %d, %d)",
sim_name.c_str(),
ll_round(region_x),
ll_round(region_y),
ll_round((F32)pos_global.mdV[VZ]));
LLTracker::trackLocation(pos_global, parcel_data.name.empty() ? getString("UnnamedParcel") : parcel_data.name, full_name);
}
void LLFloaterWorldMap::requestParcelInfo(const LLVector3d& pos_global, const LLVector3d& region_origin)
{
if (pos_global == mRequestedGlobalPos)
{
return;
}
LLViewerRegion* region = gAgent.getRegion();
if (!region)
{
return;
}
if (std::string url = region->getCapability("RemoteParcelRequest"); !url.empty())
{
mRequestedGlobalPos = pos_global;
if (mParcelInfoObserver)
{
delete mParcelInfoObserver;
}
mParcelInfoObserver = new LLWorldMapParcelInfoObserver(pos_global);
auto pos_region = LLVector3(pos_global - region_origin);
LLRemoteParcelInfoProcessor::instance().requestRegionParcelInfo(url,
region->getRegionID(), pos_region, pos_global,
mParcelInfoObserver->getObserverHandle());
}
else
{
LL_WARNS() << "Cannot request parcel details: Cap not found" << LL_ENDL;
}
}
void LLFloaterWorldMap::trackAvatar( const LLUUID& avatar_id, const std::string& name )
{
mShowParcelInfo = false;
LLCtrlSelectionInterface *iface = childGetSelectionInterface("friend combo");
if (!iface) return;
@ -617,6 +730,7 @@ void LLFloaterWorldMap::trackAvatar( const LLUUID& avatar_id, const std::string&
void LLFloaterWorldMap::trackLandmark( const LLUUID& landmark_item_id )
{
mShowParcelInfo = false;
LLCtrlSelectionInterface *iface = childGetSelectionInterface("landmark combo");
if (!iface) return;
@ -662,6 +776,7 @@ void LLFloaterWorldMap::trackLandmark( const LLUUID& landmark_item_id )
void LLFloaterWorldMap::trackEvent(const LLItemInfo &event_info)
{
mShowParcelInfo = false;
mTrackedStatus = LLTracker::TRACKING_LOCATION;
LLTracker::trackLocation(event_info.getGlobalPosition(), event_info.getName(), event_info.getToolTip(), LLTracker::LOCATION_EVENT);
setDefaultBtn("Teleport");
@ -669,6 +784,7 @@ void LLFloaterWorldMap::trackEvent(const LLItemInfo &event_info)
void LLFloaterWorldMap::trackGenericItem(const LLItemInfo &item)
{
mShowParcelInfo = false;
mTrackedStatus = LLTracker::TRACKING_LOCATION;
LLTracker::trackLocation(item.getGlobalPosition(), item.getName(), item.getToolTip(), LLTracker::LOCATION_ITEM);
setDefaultBtn("Teleport");
@ -721,6 +837,9 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)
LLWorldMap::getInstance()->cancelTracking(); // The floater is taking over the tracking
LLTracker::trackLocation(pos_global, full_name, tooltip);
mShowParcelInfo = true;
requestParcelInfo(pos_global, sim_info->getGlobalOrigin());
LLVector3d coord_pos = LLTracker::getTrackedPositionGlobal();
updateTeleportCoordsDisplay( coord_pos );

View File

@ -34,8 +34,9 @@
#include "llfloater.h"
#include "llmapimagetype.h"
#include "lltracker.h"
#include "llremoteparcelrequest.h"
#include "llslurl.h"
#include "lltracker.h"
class LLCtrlListInterface;
class LLFriendObserver;
@ -51,6 +52,21 @@ class LLSliderCtrl;
class LLSpinCtrl;
class LLSearchEditor;
class LLWorldMapParcelInfoObserver : public LLRemoteParcelInfoObserver
{
public:
LLWorldMapParcelInfoObserver(const LLVector3d& pos_global);
~LLWorldMapParcelInfoObserver();
void processParcelInfo(const LLParcelData& parcel_data);
void setParcelID(const LLUUID& parcel_id);
void setErrorStatus(S32 status, const std::string& reason);
protected:
LLVector3d mPosGlobal;
LLUUID mParcelID;
};
class LLFloaterWorldMap : public LLFloater
{
public:
@ -119,6 +135,8 @@ public:
//Slapp instigated avatar tracking
void avatarTrackFromSlapp( const LLUUID& id );
void processParcelInfo(const LLParcelData& parcel_data, const LLVector3d& pos_global) const;
protected:
void onGoHome();
@ -169,8 +187,13 @@ private:
// enable/disable teleport destination coordinates
void enableTeleportCoordsDisplay( bool enabled );
std::vector<LLUUID> mLandmarkAssetIDList;
std::vector<LLUUID> mLandmarkItemIDList;
void requestParcelInfo(const LLVector3d& pos_global, const LLVector3d& region_origin);
LLVector3d mRequestedGlobalPos;
bool mShowParcelInfo;
LLWorldMapParcelInfoObserver* mParcelInfoObserver;
uuid_vec_t mLandmarkAssetIDList;
uuid_vec_t mLandmarkItemIDList;
static const LLUUID sHomeID;

View File

@ -128,9 +128,9 @@ public:
LLPointer<LLViewerFetchedTexture> getLandForSaleImage(); // Get the overlay image, fetch it if necessary
bool isName(const std::string& name) const;
bool isDown() { return (mAccess == SIM_ACCESS_DOWN); }
bool isPG() { return (mAccess <= SIM_ACCESS_PG); }
bool isAdult() { return (mAccess == SIM_ACCESS_ADULT); }
bool isDown() const { return (mAccess == SIM_ACCESS_DOWN); }
bool isPG() const { return (mAccess <= SIM_ACCESS_PG); }
bool isAdult() const { return (mAccess == SIM_ACCESS_ADULT); }
// Debug only
void dump() const; // Print the region info to the standard output
@ -157,6 +157,8 @@ public:
const LLSimInfo::item_info_list_t& getLandForSaleAdult() const { return mLandForSaleAdult; }
const LLSimInfo::item_info_list_t& getAgentLocation() const { return mAgentLocations; }
const U64& getHandle() const { return mHandle; }
private:
U64 mHandle; // This is a hash of the X and Y world coordinates of the SW corner of the sim
std::string mName; // Region name

View File

@ -14,6 +14,9 @@
single_instance="true"
title="WORLD MAP"
width="650">
<string name="UnnamedParcel">
(Unnamed Parcel)
</string>
<string
name="collapse_icon"
value="map_ui_collapse_icon.png"/>