diff options
Diffstat (limited to 'indra/newview/llfloaterworldmap.cpp')
| -rwxr-xr-x | indra/newview/llfloaterworldmap.cpp | 335 | 
1 files changed, 179 insertions, 156 deletions
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index a798ba31ee..03979edbc1 100755 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -169,6 +169,52 @@ public:  };  LLWorldMapHandler gWorldMapHandler; +// handle secondlife:///app/worldmap_global/{GLOBAL_COORDS} URLs +class LLWorldMapGlobalHandler : public LLCommandHandler +{ +public: +    LLWorldMapGlobalHandler() : LLCommandHandler("worldmap_global", UNTRUSTED_THROTTLE) +    {} + +    virtual bool canHandleUntrusted( +        const LLSD& params, +        const LLSD& query_map, +        LLMediaCtrl* web, +        const std::string& nav_type) +    { +        if (nav_type == NAV_TYPE_CLICKED +            || nav_type == NAV_TYPE_EXTERNAL) +        { +            // NAV_TYPE_EXTERNAL will be throttled +            return true; +        } + +        return false; +    } + +    bool handle(const LLSD& params, +                const LLSD& query_map, +                const std::string& grid, +                LLMediaCtrl* web) +    { +        if (params.size() < 3) +        { +            LL_WARNS() << "Correct global coordinates are not provided." << LL_ENDL; +            return true; +        } + +        LLVector3d parcel_global_pos = LLVector3d(params[0].asInteger(), params[1].asInteger(), params[2].asInteger()); +        LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); +        if (!parcel_global_pos.isExactlyZero() && worldmap_instance) +        { +            worldmap_instance->trackLocation(parcel_global_pos); +            LLFloaterReg::showInstance("world_map", "center"); +        } +        return true; +    } +}; +LLWorldMapGlobalHandler gWorldMapGlobalHandler; +  // SocialMap handler secondlife:///app/maptrackavatar/id  class LLMapTrackAvatarHandler : public LLCommandHandler  { @@ -325,11 +371,9 @@ LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key)      mWaitingForTracker(false),      mIsClosing(false),      mSetToUserPosition(true), +    mProcessingSearchUpdate(false),      mTrackedLocation(0.0,0.0,0.0),      mTrackedStatus(LLTracker::TRACKING_NOTHING), -    mListFriendCombo(nullptr), -    mListLandmarkCombo(nullptr), -    mListSearchResults(nullptr),      mParcelInfoObserver(nullptr),      mShowParcelInfo(false)  { @@ -341,7 +385,7 @@ LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key)      mCommitCallbackRegistrar.add("WMap.Location",       boost::bind(&LLFloaterWorldMap::onLocationCommit, this));      mCommitCallbackRegistrar.add("WMap.AvatarCombo",    boost::bind(&LLFloaterWorldMap::onAvatarComboCommit, this));      mCommitCallbackRegistrar.add("WMap.Landmark",       boost::bind(&LLFloaterWorldMap::onLandmarkComboCommit, this)); -    mCommitCallbackRegistrar.add("WMap.SearchResult",   boost::bind(&LLFloaterWorldMap::onCommitSearchResult, this)); +    mCommitCallbackRegistrar.add("WMap.SearchResult", [this](LLUICtrl* ctrl, const LLSD& data) { LLFloaterWorldMap::onCommitSearchResult(false); });      mCommitCallbackRegistrar.add("WMap.GoHome",         boost::bind(&LLFloaterWorldMap::onGoHome, this));      mCommitCallbackRegistrar.add("WMap.Teleport",       boost::bind(&LLFloaterWorldMap::onClickTeleportBtn, this));      mCommitCallbackRegistrar.add("WMap.ShowTarget",     boost::bind(&LLFloaterWorldMap::onShowTargetBtn, this)); @@ -383,32 +427,33 @@ bool LLFloaterWorldMap::postBuild()      mTeleportCoordSpinY = getChild<LLUICtrl>("teleport_coordinate_y");      mTeleportCoordSpinZ = getChild<LLUICtrl>("teleport_coordinate_z"); -    LLComboBox *avatar_combo = getChild<LLComboBox>("friend combo"); -    avatar_combo->selectFirstItem(); -    avatar_combo->setPrearrangeCallback( boost::bind(&LLFloaterWorldMap::onAvatarComboPrearrange, this) ); -    avatar_combo->setTextChangedCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) ); -    mListFriendCombo = dynamic_cast<LLCtrlListInterface *>(avatar_combo); +    mFriendCombo = getChild<LLComboBox>("friend combo"); +    mFriendCombo->selectFirstItem(); +    mFriendCombo->setPrearrangeCallback(boost::bind(&LLFloaterWorldMap::onAvatarComboPrearrange, this)); +    mFriendCombo->setTextChangedCallback(boost::bind(&LLFloaterWorldMap::onComboTextEntry, this));      mLocationEditor = getChild<LLSearchEditor>("location");      mLocationEditor->setFocusChangedCallback(boost::bind(&LLFloaterWorldMap::onLocationFocusChanged, this, _1)); -    mLocationEditor->setTextChangedCallback( boost::bind(&LLFloaterWorldMap::onSearchTextEntry, this)); +    mLocationEditor->setTextChangedCallback(boost::bind(&LLFloaterWorldMap::onSearchTextEntry, this)); -    getChild<LLScrollListCtrl>("search_results")->setDoubleClickCallback( boost::bind(&LLFloaterWorldMap::onClickTeleportBtn, this)); -    mListSearchResults = childGetListInterface("search_results"); +    mSearchResults = getChild<LLScrollListCtrl>("search_results"); +    mSearchResults->setDoubleClickCallback(boost::bind(&LLFloaterWorldMap::onClickTeleportBtn, this)); -    LLComboBox *landmark_combo = getChild<LLComboBox>( "landmark combo"); -    landmark_combo->selectFirstItem(); -    landmark_combo->setPrearrangeCallback( boost::bind(&LLFloaterWorldMap::onLandmarkComboPrearrange, this) ); -    landmark_combo->setTextChangedCallback( boost::bind(&LLFloaterWorldMap::onComboTextEntry, this) ); -    mListLandmarkCombo = dynamic_cast<LLCtrlListInterface *>(landmark_combo); +    mLandmarkCombo = getChild<LLComboBox>("landmark combo"); +    mLandmarkCombo->selectFirstItem(); +    mLandmarkCombo->setPrearrangeCallback(boost::bind(&LLFloaterWorldMap::onLandmarkComboPrearrange, this)); +    mLandmarkCombo->setTextChangedCallback(boost::bind(&LLFloaterWorldMap::onComboTextEntry, this));      mZoomSlider = getChild<LLSliderCtrl>("zoom slider");      F32 slider_zoom = mMapView->getZoom();      mZoomSlider->setValue(slider_zoom); +    mTrackCtrlsPanel = getChild<LLPanel>("layout_panel_4"); +    mSearchButton = getChild<LLButton>("DoSearch"); +      getChild<LLPanel>("expand_btn_panel")->setMouseDownCallback(boost::bind(&LLFloaterWorldMap::onExpandCollapseBtn, this)); -    setDefaultBtn(NULL); +    mTrackCtrlsPanel->setDefaultBtn(nullptr);      onChangeMaturity(); @@ -608,7 +653,6 @@ void LLFloaterWorldMap::draw()      }      mTeleportButton->setEnabled((bool)tracking_status); -    //  getChildView("Clear")->setEnabled((bool)tracking_status);      mShowDestinationButton->setEnabled((bool)tracking_status || LLWorldMap::getInstance()->isTracking());      mCopySlurlButton->setEnabled((mSLURL.isValid()) ); @@ -700,26 +744,24 @@ void LLFloaterWorldMap::requestParcelInfo(const LLVector3d& pos_global, const LL      }  } -void LLFloaterWorldMap::trackAvatar( const LLUUID& avatar_id, const std::string& name ) +void LLFloaterWorldMap::trackAvatar(const LLUUID& avatar_id, const std::string& name)  {      mShowParcelInfo = false; -    LLCtrlSelectionInterface *iface = childGetSelectionInterface("friend combo"); -    if (!iface) return;      buildAvatarIDList(); -    if(iface->setCurrentByID(avatar_id) || gAgent.isGodlike()) +    if (mFriendCombo->setCurrentByID(avatar_id) || gAgent.isGodlike())      {          // *HACK: Adjust Z values automatically for liaisons & gods so          // they swoop down when they click on the map. Requested          // convenience. -        if(gAgent.isGodlike()) +        if (gAgent.isGodlike())          {              mTeleportCoordSpinZ->setValue(LLSD(200.f));          }          // Don't re-request info if we already have it or we won't have it in time to teleport          if (mTrackedStatus != LLTracker::TRACKING_AVATAR || avatar_id != mTrackedAvatarID)          { -            mTrackedStatus = LLTracker::TRACKING_AVATAR; +            mTrackedStatus   = LLTracker::TRACKING_AVATAR;              mTrackedAvatarID = avatar_id;              LLTracker::trackAvatar(avatar_id, name);          } @@ -728,52 +770,45 @@ void LLFloaterWorldMap::trackAvatar( const LLUUID& avatar_id, const std::string&      {          LLTracker::stopTracking(false);      } -    setDefaultBtn("Teleport"); +    mTrackCtrlsPanel->setDefaultBtn(mTeleportButton);  } -void LLFloaterWorldMap::trackLandmark( const LLUUID& landmark_item_id ) +void LLFloaterWorldMap::trackLandmark(const LLUUID& landmark_item_id)  {      mShowParcelInfo = false; -    LLCtrlSelectionInterface *iface = childGetSelectionInterface("landmark combo"); -    if (!iface) return;      buildLandmarkIDLists();      bool found = false; -    S32 idx; +    S32  idx;      for (idx = 0; idx < mLandmarkItemIDList.size(); idx++)      { -        if ( mLandmarkItemIDList.at(idx) == landmark_item_id) +        if (mLandmarkItemIDList.at(idx) == landmark_item_id)          {              found = true;              break;          }      } -    if (found && iface->setCurrentByID( landmark_item_id ) ) +    if (found && mLandmarkCombo->setCurrentByID(landmark_item_id))      { -        LLUUID asset_id = mLandmarkAssetIDList.at( idx ); -        std::string name; -        LLComboBox* combo = getChild<LLComboBox>( "landmark combo"); -        if (combo) name = combo->getSimple(); -        mTrackedStatus = LLTracker::TRACKING_LANDMARK; -        LLTracker::trackLandmark(mLandmarkAssetIDList.at( idx ),    // assetID -                                 mLandmarkItemIDList.at( idx ), // itemID -                                 name);         // name +        LLUUID      asset_id = mLandmarkAssetIDList.at(idx); +        std::string name     = mLandmarkCombo->getSimple(); +        mTrackedStatus       = LLTracker::TRACKING_LANDMARK; +        LLTracker::trackLandmark(mLandmarkAssetIDList.at(idx), // assetID +                                 mLandmarkItemIDList.at(idx),  // itemID +                                 name);                        // name -        if( asset_id != sHomeID ) +        if (asset_id != sHomeID)          {              // start the download process -            gLandmarkList.getAsset( asset_id); +            gLandmarkList.getAsset(asset_id);          } - -        // We have to download both region info and landmark data, so set busy. JC -        //      getWindow()->incBusyCount();      }      else      {          LLTracker::stopTracking(false);      } -    setDefaultBtn("Teleport"); +    mTrackCtrlsPanel->setDefaultBtn(mTeleportButton);  } @@ -782,7 +817,7 @@ 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"); +    mTrackCtrlsPanel->setDefaultBtn(mTeleportButton);  }  void LLFloaterWorldMap::trackGenericItem(const LLItemInfo &item) @@ -790,11 +825,12 @@ 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"); +    mTrackCtrlsPanel->setDefaultBtn(mTeleportButton);  }  void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)  { +    mProcessingSearchUpdate = false;      LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global);      if (!sim_info)      { @@ -804,7 +840,7 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)          S32 world_x = S32(pos_global.mdV[0] / 256);          S32 world_y = S32(pos_global.mdV[1] / 256);          LLWorldMapMessage::getInstance()->sendMapBlockRequest(world_x, world_y, world_x, world_y, true); -        setDefaultBtn(""); +        mTrackCtrlsPanel->setDefaultBtn(nullptr);          // clicked on a non-region - turn off coord display          enableTeleportCoordsDisplay( false ); @@ -818,7 +854,7 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)          LLTracker::stopTracking(false);          LLWorldMap::getInstance()->setTracking(pos_global);          LLWorldMap::getInstance()->setTrackingInvalid(); -        setDefaultBtn(""); +        mTrackCtrlsPanel->setDefaultBtn(nullptr);          // clicked on a down region - turn off coord display          enableTeleportCoordsDisplay( false ); @@ -849,7 +885,7 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global)      // we have a valid region - turn on coord display      enableTeleportCoordsDisplay( true ); -    setDefaultBtn("Teleport"); +    mTrackCtrlsPanel->setDefaultBtn(mTeleportButton);  }  // enable/disable teleport destination coordinates @@ -934,7 +970,10 @@ void LLFloaterWorldMap::updateLocation()              }          } -        mLocationEditor->setValue(sim_name); +        if (!mProcessingSearchUpdate) +        { +            mLocationEditor->setValue(sim_name); +        }          // refresh coordinate display to reflect where user clicked.          LLVector3d coord_pos = LLTracker::getTrackedPositionGlobal(); @@ -964,7 +1003,7 @@ void LLFloaterWorldMap::trackURL(const std::string& region_name, S32 x_coord, S3          local_pos.mV[VZ] = (F32)z_coord;          LLVector3d global_pos = sim_info->getGlobalPos(local_pos);          trackLocation(global_pos); -        setDefaultBtn("Teleport"); +        mTrackCtrlsPanel->setDefaultBtn(mTeleportButton);      }      else      { @@ -1025,17 +1064,14 @@ void LLFloaterWorldMap::observeFriends()  void LLFloaterWorldMap::friendsChanged()  { -    LLAvatarTracker& t = LLAvatarTracker::instance(); -    const LLUUID& avatar_id = t.getAvatarID(); +    LLAvatarTracker& t         = LLAvatarTracker::instance(); +    const LLUUID&    avatar_id = t.getAvatarID();      buildAvatarIDList(); -    if(avatar_id.notNull()) +    if (avatar_id.notNull())      { -        LLCtrlSelectionInterface *iface = childGetSelectionInterface("friend combo");          const LLRelationship* buddy_info = t.getBuddyInfo(avatar_id); -        if(!iface || -           !iface->setCurrentByID(avatar_id) || -           (buddy_info && !buddy_info->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION)) || -           gAgent.isGodlike()) +        if (!mFriendCombo->setCurrentByID(avatar_id) || +            (buddy_info && !buddy_info->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION)) || gAgent.isGodlike())          {              LLTracker::stopTracking(false);          } @@ -1045,15 +1081,12 @@ void LLFloaterWorldMap::friendsChanged()  // No longer really builds a list.  Instead, just updates mAvatarCombo.  void LLFloaterWorldMap::buildAvatarIDList()  { -    LLCtrlListInterface *list = mListFriendCombo; -    if (!list) return; -      // Delete all but the "None" entry -    S32 list_size = list->getItemCount(); +    S32 list_size = mFriendCombo->getItemCount();      if (list_size > 1)      { -        list->selectItemRange(1, -1); -        list->operateOnSelection(LLCtrlListInterface::OP_DELETE); +        mFriendCombo->selectItemRange(1, -1); +        mFriendCombo->operateOnSelection(LLCtrlListInterface::OP_DELETE);      }      // Get all of the calling cards for avatar that are currently online @@ -1061,29 +1094,26 @@ void LLFloaterWorldMap::buildAvatarIDList()      LLAvatarTracker::instance().applyFunctor(collector);      LLCollectMappableBuddies::buddy_map_t::iterator it;      LLCollectMappableBuddies::buddy_map_t::iterator end; -    it = collector.mMappable.begin(); +    it  = collector.mMappable.begin();      end = collector.mMappable.end(); -    for( ; it != end; ++it) +    for (; it != end; ++it)      { -        list->addSimpleElement((*it).second, ADD_BOTTOM, (*it).first); +        mFriendCombo->addSimpleElement((*it).second, ADD_BOTTOM, (*it).first);      } -    list->setCurrentByID( LLAvatarTracker::instance().getAvatarID() ); -    list->selectFirstItem(); +    mFriendCombo->setCurrentByID(LLAvatarTracker::instance().getAvatarID()); +    mFriendCombo->selectFirstItem();  }  void LLFloaterWorldMap::buildLandmarkIDLists()  { -    LLCtrlListInterface *list = mListLandmarkCombo; -    if (!list) return; -      // Delete all but the "None" entry -    S32 list_size = list->getItemCount(); +    S32 list_size = mLandmarkCombo->getItemCount();      if (list_size > 1)      { -        list->selectItemRange(1, -1); -        list->operateOnSelection(LLCtrlListInterface::OP_DELETE); +        mLandmarkCombo->selectItemRange(1, -1); +        mLandmarkCombo->operateOnSelection(LLCtrlListInterface::OP_DELETE);      }      mLandmarkItemIDList.clear(); @@ -1115,13 +1145,13 @@ void LLFloaterWorldMap::buildLandmarkIDLists()      {          LLInventoryItem* item = items.at(i); -        list->addSimpleElement(item->getName(), ADD_BOTTOM, item->getUUID()); +        mLandmarkCombo->addSimpleElement(item->getName(), ADD_BOTTOM, item->getUUID());          mLandmarkAssetIDList.push_back( item->getAssetUUID() );          mLandmarkItemIDList.push_back( item->getUUID() );      } -    list->selectFirstItem(); +    mLandmarkCombo->selectFirstItem();  } @@ -1139,10 +1169,9 @@ F32 LLFloaterWorldMap::getDistanceToDestination(const LLVector3d &destination,  void LLFloaterWorldMap::clearLocationSelection(bool clear_ui, bool dest_reached)  { -    LLCtrlListInterface *list = mListSearchResults; -    if (list && (!dest_reached || (list->getItemCount() == 1))) +    if (!dest_reached || (mSearchResults->getItemCount() == 1))      { -        list->operateOnAll(LLCtrlListInterface::OP_DELETE); +        mSearchResults->operateOnAll(LLCtrlListInterface::OP_DELETE);      }      LLWorldMap::getInstance()->cancelTracking();      mCompletingRegionName = ""; @@ -1153,11 +1182,7 @@ void LLFloaterWorldMap::clearLandmarkSelection(bool clear_ui)  {      if (clear_ui || !childHasKeyboardFocus("landmark combo"))      { -        LLCtrlListInterface *list = mListLandmarkCombo; -        if (list) -        { -            list->selectByValue( "None" ); -        } +        mLandmarkCombo->selectByValue("None");      }  } @@ -1167,10 +1192,9 @@ void LLFloaterWorldMap::clearAvatarSelection(bool clear_ui)      if (clear_ui || !childHasKeyboardFocus("friend combo"))      {          mTrackedStatus = LLTracker::TRACKING_NOTHING; -        LLCtrlListInterface *list = mListFriendCombo; -        if (list && list->getSelectedValue().asString() != "None") +        if (mFriendCombo->getSelectedValue().asString() != "None")          { -            list->selectByValue( "None" ); +            mFriendCombo->selectByValue("None");          }      }  } @@ -1223,28 +1247,25 @@ void LLFloaterWorldMap::onGoHome()  {      gAgent.teleportHome();      closeFloater(); +    mProcessingSearchUpdate = false;  } -void LLFloaterWorldMap::onLandmarkComboPrearrange( ) +void LLFloaterWorldMap::onLandmarkComboPrearrange()  { -    if( mIsClosing ) +    if (mIsClosing)      {          return;      } -    LLCtrlListInterface *list = mListLandmarkCombo; -    if (!list) return; - -    LLUUID current_choice = list->getCurrentID(); +    LLUUID current_choice = mLandmarkCombo->getCurrentID();      buildLandmarkIDLists(); -    if( current_choice.isNull() || !list->setCurrentByID( current_choice ) ) +    if (current_choice.isNull() || !mLandmarkCombo->setCurrentByID(current_choice))      {          LLTracker::stopTracking(false);      } -  }  void LLFloaterWorldMap::onComboTextEntry() @@ -1264,33 +1285,28 @@ void LLFloaterWorldMap::onSearchTextEntry( )  void LLFloaterWorldMap::onLandmarkComboCommit()  { -    if( mIsClosing ) +    if (mIsClosing)      {          return;      } -    LLCtrlListInterface *list = mListLandmarkCombo; -    if (!list) return; -      LLUUID asset_id; -    LLUUID item_id = list->getCurrentID(); +    LLUUID item_id = mLandmarkCombo->getCurrentID();      LLTracker::stopTracking(false); -    //RN: stopTracking() clears current combobox selection, need to reassert it here -    list->setCurrentByID(item_id); +    // RN: stopTracking() clears current combobox selection, need to reassert it here +    mLandmarkCombo->setCurrentByID(item_id); -    if( item_id.isNull() ) -    { -    } -    else if( item_id == sHomeID ) +    if (item_id.isNull()) {} +    else if (item_id == sHomeID)      {          asset_id = sHomeID;      }      else      { -        LLInventoryItem* item = gInventory.getItem( item_id ); -        if( item ) +        LLInventoryItem* item = gInventory.getItem(item_id); +        if (item)          {              asset_id = item->getAssetUUID();          } @@ -1301,34 +1317,31 @@ void LLFloaterWorldMap::onLandmarkComboCommit()          }      } -    trackLandmark( item_id); +    trackLandmark(item_id);      onShowTargetBtn();      // Reset to user postion if nothing is tracked -    mSetToUserPosition = ( LLTracker::getTrackingStatus() == LLTracker::TRACKING_NOTHING ); +    mSetToUserPosition = (LLTracker::getTrackingStatus() == LLTracker::TRACKING_NOTHING);  }  // static -void LLFloaterWorldMap::onAvatarComboPrearrange( ) +void LLFloaterWorldMap::onAvatarComboPrearrange()  { -    if( mIsClosing ) +    if (mIsClosing)      {          return;      } -    LLCtrlListInterface *list = mListFriendCombo; -    if (!list) return; -      LLUUID current_choice; -    if( LLAvatarTracker::instance().haveTrackingInfo() ) +    if (LLAvatarTracker::instance().haveTrackingInfo())      {          current_choice = LLAvatarTracker::instance().getAvatarID();      }      buildAvatarIDList(); -    if( !list->setCurrentByID( current_choice ) || current_choice.isNull() ) +    if (!mFriendCombo->setCurrentByID(current_choice) || current_choice.isNull())      {          LLTracker::stopTracking(false);      } @@ -1336,26 +1349,21 @@ void LLFloaterWorldMap::onAvatarComboPrearrange( )  void LLFloaterWorldMap::onAvatarComboCommit()  { -    if( mIsClosing ) +    if (mIsClosing)      {          return;      } -    LLCtrlListInterface *list = mListFriendCombo; -    if (!list) return; - -    const LLUUID& new_avatar_id = list->getCurrentID(); +    const LLUUID& new_avatar_id = mFriendCombo->getCurrentID();      if (new_avatar_id.notNull())      { -        std::string name; -        LLComboBox* combo = getChild<LLComboBox>("friend combo"); -        if (combo) name = combo->getSimple(); +        std::string name = mFriendCombo->getSimple();          trackAvatar(new_avatar_id, name);          onShowTargetBtn();      }      else -    {   // Reset to user postion if nothing is tracked -        mSetToUserPosition = ( LLTracker::getTrackingStatus() == LLTracker::TRACKING_NOTHING ); +    { // Reset to user postion if nothing is tracked +        mSetToUserPosition = (LLTracker::getTrackingStatus() == LLTracker::TRACKING_NOTHING);      }  } @@ -1375,11 +1383,11 @@ void LLFloaterWorldMap::updateSearchEnabled()      if (childHasKeyboardFocus("location") &&          mLocationEditor->getValue().asString().length() > 0)      { -        setDefaultBtn("DoSearch"); +        mTrackCtrlsPanel->setDefaultBtn(mSearchButton);      }      else      { -        setDefaultBtn(NULL); +        mTrackCtrlsPanel->setDefaultBtn(nullptr);      }  } @@ -1409,6 +1417,7 @@ void LLFloaterWorldMap::onLocationCommit()      {          return;      } +    mProcessingSearchUpdate = true;      LLStringUtil::toLower(str);      mCompletingRegionName = str; @@ -1430,6 +1439,7 @@ void LLFloaterWorldMap::onCoordinatesCommit()      {          return;      } +    mProcessingSearchUpdate = false;      S32 x_coord = (S32)mTeleportCoordSpinX->getValue().asReal();      S32 y_coord = (S32)mTeleportCoordSpinY->getValue().asReal(); @@ -1443,6 +1453,7 @@ void LLFloaterWorldMap::onCoordinatesCommit()  void LLFloaterWorldMap::onClearBtn()  {      mTrackedStatus = LLTracker::TRACKING_NOTHING; +    mProcessingSearchUpdate = false;      LLTracker::stopTracking(true);      LLWorldMap::getInstance()->cancelTracking();      mSLURL = LLSLURL();                 // Clear the SLURL since it's invalid @@ -1459,6 +1470,7 @@ void LLFloaterWorldMap::onShowAgentBtn()      mMapView->setPanWithInterpTime(0, 0, false, 0.1f);  // false == animate      // Set flag so user's location will be displayed if not tracking anything else      mSetToUserPosition = true; +    mProcessingSearchUpdate = false;  }  void LLFloaterWorldMap::onClickTeleportBtn() @@ -1487,8 +1499,9 @@ void LLFloaterWorldMap::onExpandCollapseBtn()      std::string image_name = getString(toggle_collapse ? "expand_icon" : "collapse_icon");      std::string tooltip = getString(toggle_collapse ? "expand_tooltip" : "collapse_tooltip"); -    getChild<LLIconCtrl>("expand_collapse_icon")->setImage(LLUI::getUIImage(image_name)); -    getChild<LLIconCtrl>("expand_collapse_icon")->setToolTip(tooltip); +    LLIconCtrl* expandCollapseIcon = getChild<LLIconCtrl>("expand_collapse_icon"); +    expandCollapseIcon->setImage(LLUI::getUIImage(image_name)); +    expandCollapseIcon->setToolTip(tooltip);      getChild<LLPanel>("expand_btn_panel")->setToolTip(tooltip);  } @@ -1613,6 +1626,12 @@ void LLFloaterWorldMap::teleport()              gAgent.teleportViaLocation( pos_global );          }      } + +    if (mProcessingSearchUpdate) +    { +        mProcessingSearchUpdate = false; +        mTrackedSimName.clear(); +    }  }  void LLFloaterWorldMap::flyToLandmark() @@ -1680,9 +1699,9 @@ void LLFloaterWorldMap::teleportToAvatar()  void LLFloaterWorldMap::flyToAvatar()  { -    if( LLAvatarTracker::instance().haveTrackingInfo() ) +    if (LLAvatarTracker::instance().haveTrackingInfo())      { -        gAgent.startAutoPilotGlobal( LLAvatarTracker::instance().getGlobalPos() ); +        gAgent.startAutoPilotGlobal(LLAvatarTracker::instance().getGlobalPos());      }  } @@ -1693,8 +1712,7 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim)          return;      } -    LLScrollListCtrl *list = getChild<LLScrollListCtrl>("search_results"); -    list->operateOnAll(LLCtrlListInterface::OP_DELETE); +    mSearchResults->operateOnAll(LLCtrlListInterface::OP_DELETE);      auto name_length = mCompletingRegionName.length(); @@ -1722,7 +1740,7 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim)              value["id"] = info->getName();              value["columns"][0]["column"] = "sim_name";              value["columns"][0]["value"] = info->getName(); -            list->addElement(value); +            mSearchResults->addElement(value);              num_results++;          }      } @@ -1737,21 +1755,24 @@ void LLFloaterWorldMap::updateSims(bool found_null_sim)          // if match found, highlight it and go          if (!match.isUndefined())          { -            list->selectByValue(match); +            mSearchResults->selectByValue(match); +            mSearchResults->setFocus(true); +            onCommitSearchResult(false /*fully commit the only option*/);          } -        // else select first found item +        // else let user decide          else          { -            list->selectFirstItem(); +            mSearchResults->selectFirstItem(); +            mSearchResults->setFocus(true); +            onCommitSearchResult(true /*don't update text field*/);          } -        getChild<LLUICtrl>("search_results")->setFocus(true); -        onCommitSearchResult();      }      else      {          // if we found nothing, say "none" -        list->setCommentText(LLTrans::getString("worldmap_results_none_found")); -        list->operateOnAll(LLCtrlListInterface::OP_DESELECT); +        mProcessingSearchUpdate = false; +        mSearchResults->setCommentText(LLTrans::getString("worldmap_results_none_found")); +        mSearchResults->operateOnAll(LLCtrlListInterface::OP_DESELECT);      }  } @@ -1763,13 +1784,9 @@ void LLFloaterWorldMap::onTeleportFinished()      }  } -void LLFloaterWorldMap::onCommitSearchResult() +void LLFloaterWorldMap::onCommitSearchResult(bool from_search)  { -    LLCtrlListInterface *list = mListSearchResults; -    if (!list) return; - -    LLSD selected_value = list->getSelectedValue(); -    std::string sim_name = selected_value.asString(); +    std::string sim_name = mSearchResults->getSelectedValue().asString();      if (sim_name.empty())      {          return; @@ -1785,7 +1802,7 @@ void LLFloaterWorldMap::onCommitSearchResult()          {              LLVector3d pos_global = info->getGlobalOrigin(); -            const F64 SIM_COORD_DEFAULT = 128.0; +            constexpr F64 SIM_COORD_DEFAULT = 128.0;              LLVector3 pos_local(SIM_COORD_DEFAULT, SIM_COORD_DEFAULT, 0.0f);              // Did this value come from a trackURL() request? @@ -1798,9 +1815,15 @@ void LLFloaterWorldMap::onCommitSearchResult()              pos_global.mdV[VY] += (F64)pos_local.mV[VY];              pos_global.mdV[VZ] = (F64)pos_local.mV[VZ]; -            mLocationEditor->setValue(sim_name); +            // Commiting search string automatically selects first item in the search list, +            // in such case onCommitSearchResult shouldn't modify search string +            if (!from_search) +            { +                mLocationEditor->setValue(sim_name); +            }              trackLocation(pos_global); -            setDefaultBtn("Teleport"); +            mProcessingSearchUpdate = from_search; +            mTrackCtrlsPanel->setDefaultBtn(mTeleportButton);              break;          }      }  | 
