diff options
| author | Cosmic Linden <cosmic@lindenlab.com> | 2022-02-09 18:03:52 -0800 | 
|---|---|---|
| committer | Cosmic Linden <cosmic@lindenlab.com> | 2022-03-03 12:30:58 -0800 | 
| commit | 81da0dd2db7261e402c53445efa1d012177a4cfe (patch) | |
| tree | a1c95308c5a9a31eda9b4179f8e5d2367ce3c003 /indra | |
| parent | f62579f29303b33ff331f3f0b0e8d4197755d279 (diff) | |
SL-16824: Change minimap hover tooltip. Show parcel name, owner name, and/or for sale info when available. Remove "shift-drag to pan" hint.
Diffstat (limited to 'indra')
| -rwxr-xr-x | indra/newview/llfloatermap.cpp | 56 | ||||
| -rw-r--r-- | indra/newview/llnetmap.cpp | 152 | ||||
| -rw-r--r-- | indra/newview/llnetmap.h | 20 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_map.xml | 30 | 
4 files changed, 188 insertions, 70 deletions
| diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp index 7a7ffb0c7e..ab39d08830 100755 --- a/indra/newview/llfloatermap.cpp +++ b/indra/newview/llfloatermap.cpp @@ -77,25 +77,31 @@ LLFloaterMap::~LLFloaterMap()  BOOL LLFloaterMap::postBuild()  { -	mMap = getChild<LLNetMap>("Net Map"); -	if (gSavedSettings.getBOOL("DoubleClickTeleport")) -	{ -		mMap->setToolTipMsg(getString("AltToolTipMsg")); -	} -	else if (gSavedSettings.getBOOL("DoubleClickShowWorldMap")) -	{ -		mMap->setToolTipMsg(getString("ToolTipMsg")); -	} -	sendChildToBack(mMap); -	 -	mTextBoxNorth = getChild<LLTextBox> ("floater_map_north"); -	mTextBoxEast = getChild<LLTextBox> ("floater_map_east"); -	mTextBoxWest = getChild<LLTextBox> ("floater_map_west"); -	mTextBoxSouth = getChild<LLTextBox> ("floater_map_south"); -	mTextBoxSouthEast = getChild<LLTextBox> ("floater_map_southeast"); -	mTextBoxNorthEast = getChild<LLTextBox> ("floater_map_northeast"); -	mTextBoxSouthWest = getChild<LLTextBox> ("floater_map_southwest"); -	mTextBoxNorthWest = getChild<LLTextBox> ("floater_map_northwest"); +    mMap = getChild<LLNetMap>("Net Map"); +    mMap->setToolTipMsg(getString("ToolTipMsg")); +    mMap->setParcelNameMsg(getString("ParcelNameMsg")); +    mMap->setParcelSalePriceMsg(getString("ParcelSalePriceMsg")); +    mMap->setParcelSaleAreaMsg(getString("ParcelSaleAreaMsg")); +    mMap->setParcelOwnerMsg(getString("ParcelOwnerMsg")); +    mMap->setRegionNameMsg(getString("RegionNameMsg")); +    if (gSavedSettings.getBOOL("DoubleClickTeleport")) +    { +        mMap->setToolTipHintMsg(getString("AltToolTipHintMsg")); +    } +    else if (gSavedSettings.getBOOL("DoubleClickShowWorldMap")) +    { +        mMap->setToolTipHintMsg(getString("ToolTipHintMsg")); +    } +    sendChildToBack(mMap); + +    mTextBoxNorth     = getChild<LLTextBox>("floater_map_north"); +    mTextBoxEast      = getChild<LLTextBox>("floater_map_east"); +    mTextBoxWest      = getChild<LLTextBox>("floater_map_west"); +    mTextBoxSouth     = getChild<LLTextBox>("floater_map_south"); +    mTextBoxSouthEast = getChild<LLTextBox>("floater_map_southeast"); +    mTextBoxNorthEast = getChild<LLTextBox>("floater_map_northeast"); +    mTextBoxSouthWest = getChild<LLTextBox>("floater_map_southwest"); +    mTextBoxNorthWest = getChild<LLTextBox>("floater_map_northwest");      mTextBoxNorth->reshapeToFitText();      mTextBoxEast->reshapeToFitText(); @@ -106,15 +112,15 @@ BOOL LLFloaterMap::postBuild()      mTextBoxSouthWest->reshapeToFitText();      mTextBoxNorthWest->reshapeToFitText(); -	updateMinorDirections(); +    updateMinorDirections(); -	// Get the drag handle all the way in back -	sendChildToBack(getDragHandle()); +    // Get the drag handle all the way in back +    sendChildToBack(getDragHandle()); -	// keep onscreen -	gFloaterView->adjustToFitScreen(this, FALSE); +    // keep onscreen +    gFloaterView->adjustToFitScreen(this, false); -	return TRUE; +    return true;  }  BOOL LLFloaterMap::handleDoubleClick(S32 x, S32 y, MASK mask) diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index 80fac58a1e..e87ec10e5d 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -37,6 +37,7 @@  #include "llfocusmgr.h"  #include "lllocalcliprect.h"  #include "llrender.h" +#include "llresmgr.h"  #include "llui.h"  #include "lltooltip.h" @@ -48,10 +49,14 @@  #include "llappviewer.h" // for gDisconnected  #include "llcallingcard.h" // LLAvatarTracker  #include "llfloaterworldmap.h" +#include "llparcel.h"  #include "lltracker.h"  #include "llsurface.h" +#include "llurlmatch.h" +#include "llurlregistry.h"  #include "llviewercamera.h"  #include "llviewercontrol.h" +#include "llviewerparcelmgr.h"  #include "llviewertexture.h"  #include "llviewertexturelist.h"  #include "llviewermenu.h" @@ -603,47 +608,116 @@ BOOL LLNetMap::handleScrollWheel(S32 x, S32 y, S32 clicks)  	return TRUE;  } -BOOL LLNetMap::handleToolTip( S32 x, S32 y, MASK mask ) +BOOL LLNetMap::handleToolTip(S32 x, S32 y, MASK mask)  { -	if (gDisconnected) -	{ -		return FALSE; -	} - -	// If the cursor is near an avatar on the minimap, a mini-inspector will be -	// shown for the avatar, instead of the normal map tooltip. -	if (handleToolTipAgent(mClosestAgentToCursor)) -	{ -		return TRUE; -	} - -	LLRect sticky_rect; -	std::string region_name; -	LLViewerRegion*	region = LLWorld::getInstance()->getRegionFromPosGlobal( viewPosToGlobal( x, y ) ); -	if(region) -	{ -		// set sticky_rect -		S32 SLOP = 4; -		localPointToScreen(x - SLOP, y - SLOP, &(sticky_rect.mLeft), &(sticky_rect.mBottom)); -		sticky_rect.mRight = sticky_rect.mLeft + 2 * SLOP; -		sticky_rect.mTop = sticky_rect.mBottom + 2 * SLOP; - -		region_name = region->getName(); -		if (!region_name.empty()) -		{ -			region_name += "\n"; -		} -	} +    if (gDisconnected) +    { +        return false; +    } + +    // If the cursor is near an avatar on the minimap, a mini-inspector will be +    // shown for the avatar, instead of the normal map tooltip. +    if (handleToolTipAgent(mClosestAgentToCursor)) +    { +        return true; +    } + +    LLRect sticky_rect; +    S32 SLOP = 4; +    localPointToScreen(x - SLOP, y - SLOP, &(sticky_rect.mLeft), &(sticky_rect.mBottom)); +    sticky_rect.mRight = sticky_rect.mLeft + 2 * SLOP; +    sticky_rect.mTop   = sticky_rect.mBottom + 2 * SLOP; + +    std::string parcel_name_msg; +    std::string parcel_sale_price_msg; +    std::string parcel_sale_area_msg; +    std::string parcel_owner_msg; +    std::string region_name_msg; + +    LLVector3d      posGlobal = viewPosToGlobal(x, y); +    LLViewerRegion *region    = LLWorld::getInstance()->getRegionFromPosGlobal(posGlobal); +    if (region) +    { +        std::string region_name = region->getName(); +        if (!region_name.empty()) +        { +            region_name_msg = mRegionNameMsg; +            LLStringUtil::format(region_name_msg, {{"[REGION_NAME]", region_name}}); +        } -	LLStringUtil::format_map_t args; -	args["[REGION]"] = region_name; -	std::string msg = mToolTipMsg; -	LLStringUtil::format(msg, args); -	LLToolTipMgr::instance().show(LLToolTip::Params() -		.message(msg) -		.sticky_rect(sticky_rect)); -		 -	return TRUE; +        // Only show parcel information in the tooltip if property lines are visible. Otherwise, the parcel the tooltip is referring to is +        // ambiguous. +        if (gSavedSettings.getBOOL("MiniMapShowPropertyLines")) +        { +            LLViewerParcelMgr::getInstance()->setHoverParcel(posGlobal); +            LLParcel *hover_parcel = LLViewerParcelMgr::getInstance()->getHoverParcel(); +            if (hover_parcel) +            { +                std::string parcel_name = hover_parcel->getName(); +                if (!parcel_name.empty()) +                { +                    parcel_name_msg = mParcelNameMsg; +                    LLStringUtil::format(parcel_name_msg, {{"[PARCEL_NAME]", parcel_name}}); +                } + +                const LLUUID      parcel_owner          = hover_parcel->getOwnerID(); +                std::string       parcel_owner_name_url = LLSLURL("agent", parcel_owner, "inspect").getSLURLString(); +                static LLUrlMatch parcel_owner_name_url_match; +                LLUrlRegistry::getInstance()->findUrl(parcel_owner_name_url, parcel_owner_name_url_match); +                if (!parcel_owner_name_url_match.empty()) +                { +                    parcel_owner_msg              = mParcelOwnerMsg; +                    std::string parcel_owner_name = parcel_owner_name_url_match.getLabel(); +                    LLStringUtil::format(parcel_owner_msg, {{"[PARCEL_OWNER]", parcel_owner_name}}); +                } + +                if (hover_parcel->getForSale()) +                { +                    const LLUUID auth_buyer_id = hover_parcel->getAuthorizedBuyerID(); +                    const LLUUID agent_id      = gAgent.getID(); +                    bool         show_for_sale = auth_buyer_id.isNull() || auth_buyer_id == agent_id || parcel_owner == agent_id; +                    if (show_for_sale) +                    { +                        S32 price        = hover_parcel->getSalePrice(); +                        S32 area         = hover_parcel->getArea(); +                        F32 cost_per_sqm = 0.0f; +                        if (area > 0) +                        { +                            cost_per_sqm = F32(price) / area; +                        } +                        std::string formatted_price          = LLResMgr::getInstance()->getMonetaryString(price); +                        std::string formatted_cost_per_meter = llformat("%.1f", cost_per_sqm); +                        parcel_sale_price_msg                = mParcelSalePriceMsg; +                        LLStringUtil::format(parcel_sale_price_msg, +                                             {{"[PRICE]", formatted_price}, {"[PRICE_PER_SQM]", formatted_cost_per_meter}}); +                        std::string formatted_area = llformat("%d", area); +                        parcel_sale_area_msg       = mParcelSaleAreaMsg; +                        LLStringUtil::format(parcel_sale_area_msg, {{"[AREA]", formatted_area}}); +                    } +                } +            } +        } +    } + +    std::string tool_tip_hint_msg = mToolTipHintMsg; + +    LLStringUtil::format_map_t args; +    args["[PARCEL_NAME_MSG]"]       = parcel_name_msg.empty() ? "" : parcel_name_msg + '\n'; +    args["[PARCEL_SALE_PRICE_MSG]"] = parcel_sale_price_msg.empty() ? "" : parcel_sale_price_msg + '\n'; +    args["[PARCEL_SALE_AREA_MSG]"]  = parcel_sale_area_msg.empty() ? "" : parcel_sale_area_msg + '\n'; +    args["[PARCEL_OWNER_MSG]"]      = parcel_owner_msg.empty() ? "" : parcel_owner_msg + '\n'; +    args["[REGION_NAME_MSG]"]       = region_name_msg.empty() ? "" : region_name_msg + '\n'; +    args["[TOOL_TIP_HINT_MSG]"]     = tool_tip_hint_msg.empty() ? "" : tool_tip_hint_msg + '\n'; + +    std::string msg                 = mToolTipMsg; +    LLStringUtil::format(msg, args); +    if (msg.back() == '\n') +    { +        msg.resize(msg.size() - 1); +    } +    LLToolTipMgr::instance().show(LLToolTip::Params().message(msg).sticky_rect(sticky_rect)); + +    return true;  }  BOOL LLNetMap::handleToolTipAgent(const LLUUID& avatar_id) diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h index 1f7e7d68c6..e7eeda7dcc 100644 --- a/indra/newview/llnetmap.h +++ b/indra/newview/llnetmap.h @@ -79,8 +79,16 @@ public:  	/*virtual*/ BOOL	handleClick(S32 x, S32 y, MASK mask);  	/*virtual*/ BOOL	handleDoubleClick( S32 x, S32 y, MASK mask ); -	void			setScale( F32 scale ); -	void			setToolTipMsg(const std::string& msg) { mToolTipMsg = msg; } +    void            setScale(F32 scale); + +    void            setToolTipMsg(const std::string& msg) { mToolTipMsg = msg; } +    void            setParcelNameMsg(const std::string& msg) { mParcelNameMsg = msg; } +    void            setParcelSalePriceMsg(const std::string& msg) { mParcelSalePriceMsg = msg; } +    void            setParcelSaleAreaMsg(const std::string& msg) { mParcelSaleAreaMsg = msg; } +    void            setParcelOwnerMsg(const std::string& msg) { mParcelOwnerMsg = msg; } +    void            setRegionNameMsg(const std::string& msg) { mRegionNameMsg = msg; } +    void            setToolTipHintMsg(const std::string& msg) { mToolTipHintMsg = msg; } +  	void			renderScaledPointGlobal( const LLVector3d& pos, const LLColor4U &color, F32 radius );  private: @@ -125,7 +133,13 @@ private:  	LLUUID			mClosestAgentToCursor;  	LLUUID			mClosestAgentAtLastRightClick; -	std::string		mToolTipMsg; +    std::string     mToolTipMsg; +    std::string     mParcelNameMsg; +    std::string     mParcelSalePriceMsg; +    std::string     mParcelSaleAreaMsg; +    std::string     mParcelOwnerMsg; +    std::string     mRegionNameMsg; +    std::string     mToolTipHintMsg;  public:  	void			setSelected(uuid_vec_t uuids) { gmSelected=uuids; }; diff --git a/indra/newview/skins/default/xui/en/floater_map.xml b/indra/newview/skins/default/xui/en/floater_map.xml index 18e7147136..9639e70544 100644 --- a/indra/newview/skins/default/xui/en/floater_map.xml +++ b/indra/newview/skins/default/xui/en/floater_map.xml @@ -16,11 +16,35 @@   width="200">      <floater.string       name="ToolTipMsg"> -        [REGION](Double-click to open Map, shift-drag to pan) +        [PARCEL_NAME_MSG][PARCEL_SALE_PRICE_MSG][PARCEL_SALE_AREA_MSG][PARCEL_OWNER_MSG][REGION_NAME_MSG][TOOL_TIP_HINT_MSG]      </floater.string> +    <floater.string +     name="ParcelNameMsg"> +        [PARCEL_NAME] +    </floater.string> +    <floater.string +     name="ParcelSalePriceMsg"> +        Price: L$[PRICE] (L$[PRICE_PER_SQM]/m²) +    </floater.string> +    <floater.string +     name="ParcelSaleAreaMsg"> +        Area: [AREA]m² +    </floater.string> +    <floater.string +     name="ParcelOwnerMsg"> +        Owner: [PARCEL_OWNER] +    </floater.string> +    <floater.string +     name="RegionNameMsg"> +        Region: [REGION_NAME] +    </floater.string> +	<floater.string +     name="ToolTipHintMsg"> +        Double-click to open map +	</floater.string>  	<floater.string -     name="AltToolTipMsg"> -		[REGION](Double-click to teleport, shift-drag to pan) +     name="AltToolTipHintMsg"> +        Double-click to teleport  	</floater.string>  	<floater.string name="mini_map_caption">  	Mini-map | 
