From b6c3ec4cb61ccf1e2c519474dca65975455ae83b Mon Sep 17 00:00:00 2001 From: Ansariel Date: Sat, 5 Jan 2013 17:45:20 +0100 Subject: [PATCH] Improved advanced hover tips for objects: * Get rid of old name cache that wasn't even needed * Use boost::bind to update the hovertip once we received an unknown name * Added some possible crash fixes --- indra/newview/lltoolpie.cpp | 67 ++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 8a05a44aa7..8307a50b63 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -994,8 +994,10 @@ BOOL LLToolPie::handleTooltipLand(std::string line, std::string tooltip_msg) BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string line, std::string tooltip_msg) { + // Advanced object tooltips const char* const DEFAULT_DESC = "(No Description)"; static LLCachedControl advancedToolTip(gSavedSettings, "FSAdvancedTooltips"); + // Advanced object tooltips if ( hover_object->isHUDAttachment() ) { @@ -1150,6 +1152,7 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l tooltip_msg.append( nodep->mName ); } + // Advanced object tooltips if (advancedToolTip) { // Set description @@ -1159,7 +1162,6 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l } // Set owner name - std::string final_name; std::string full_name; if (nodep->mValid) @@ -1167,25 +1169,25 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l LLUUID owner = nodep->mPermissions->getOwner(); if (owner.notNull()) { - - if (!gCacheName->getFullName(LLSelectMgr::getInstance()->getHoverNode()->mPermissions->getOwner(), full_name)) - { - full_name = LLTrans::getString("LoadingData"); - } - LLAvatarName av_name; - if (LLAvatarNameCache::useDisplayNames() && - LLAvatarNameCache::get(owner, &av_name)) + if (LLAvatarNameCache::get(owner, &av_name)) { - final_name = (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ? av_name.getCompleteName() : RlvStrings::getAnonym(av_name); + full_name = (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ? av_name.getCompleteName() : RlvStrings::getAnonym(av_name); } else { - final_name = (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) ? full_name : RlvStrings::getAnonym(full_name); + full_name = LLTrans::getString("LoadingData"); + + // If we don't have the avatar name already, let the + // avatar name cache retrieve it and simply invoke + // us again after it received the name. + std::string l; + std::string m; + LLAvatarNameCache::get(owner, boost::bind(&LLToolPie::handleTooltipObject, this, hover_object, l, m)); } // Owner name - tooltip_msg.append("\n" + LLTrans::getString("TooltipOwner") + " " + final_name); + tooltip_msg.append("\n" + LLTrans::getString("TooltipOwner") + " " + full_name); } } @@ -1231,8 +1233,7 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l // Get prim count S32 prim_count = LLSelectMgr::getInstance()->getHoverObjects()->getObjectCount(); args["COUNT"] = llformat("%d", prim_count); - std::string primlabel = LLTrans::getString("TooltipPrimCount"); - LLStringUtil::format(primlabel, args); + std::string primlabel = LLTrans::getString("TooltipPrimCount", args); tooltip_msg.append("\n" + primlabel); // Display the PE weight for an object if mesh is enabled @@ -1240,15 +1241,15 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l { // Ansariel: What a bummer! PE is only available for // objects in the same region as you! - if (hover_object->getRegion()->getRegionID() == gAgent.getRegion()->getRegionID()) + if (hover_object->getRegion() && gAgent.getRegion() && + hover_object->getRegion()->getRegionID() == gAgent.getRegion()->getRegionID()) { S32 link_cost = LLSelectMgr::getInstance()->getHoverObjects()->getSelectedLinksetCost(); if (link_cost > 0) { args.clear(); args["PEWEIGHT"] = llformat("%d", link_cost); - std::string pelabel = LLTrans::getString("TooltipPrimEquivalent"); - LLStringUtil::format(pelabel, args); + std::string pelabel = LLTrans::getString("TooltipPrimEquivalent", args); tooltip_msg.append(pelabel); } else @@ -1263,22 +1264,26 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l } // Get position - LLViewerRegion *region = gAgent.getRegion(); - LLVector3 relPositionObject = region->getPosRegionFromGlobal(hover_object->getPositionGlobal()); - args.clear(); - args["POSITION"] = llformat("<%.02f, %.02f, %.02f>", relPositionObject.mV[VX], relPositionObject.mV[VY], relPositionObject.mV[VZ]); - std::string positionlabel = LLTrans::getString("TooltipPosition"); - LLStringUtil::format(positionlabel, args); - tooltip_msg.append("\n" + positionlabel); + LLViewerRegion* region = gAgent.getRegion(); + if (region) + { + LLVector3 relPositionObject = region->getPosRegionFromGlobal(hover_object->getPositionGlobal()); + args.clear(); + args["POSITION"] = llformat("<%.02f, %.02f, %.02f>", relPositionObject.mV[VX], relPositionObject.mV[VY], relPositionObject.mV[VZ]); + std::string positionlabel = LLTrans::getString("TooltipPosition"); + LLStringUtil::format(positionlabel, args); + tooltip_msg.append("\n" + positionlabel); - // Get distance - F32 distance = (relPositionObject - region->getPosRegionFromGlobal(gAgent.getPositionGlobal())).magVec(); - args.clear(); - args["DISTANCE"] = llformat("%.02f", distance); - std::string distancelabel = LLTrans::getString("TooltipDistance"); - LLStringUtil::format(distancelabel, args); - tooltip_msg.append("\n" + distancelabel); + // Get distance + F32 distance = (relPositionObject - region->getPosRegionFromGlobal(gAgent.getPositionGlobal())).magVec(); + args.clear(); + args["DISTANCE"] = llformat("%.02f", distance); + std::string distancelabel = LLTrans::getString("TooltipDistance"); + LLStringUtil::format(distancelabel, args); + tooltip_msg.append("\n" + distancelabel); + } } + // Advanced object tooltips bool has_media = false; bool is_time_based_media = false;