diff options
| author | Erik Kundiman <erik@megapahit.org> | 2024-08-17 13:23:01 +0800 | 
|---|---|---|
| committer | Erik Kundiman <erik@megapahit.org> | 2024-08-17 13:23:01 +0800 | 
| commit | d15ebf5623fe15677a59a66029e9cfd00edc2942 (patch) | |
| tree | 5dc79911481636a95546c2c10382cc609ba92edc | |
| parent | 90127cf36c5ca6e7c6273261830e65da2d7e9c73 (diff) | |
Distance in nearby tab (draft)
https://megapahit.com/show_bug.cgi?id=49
Still needs to be tidied up. For now it's aligned to the left.
If you want to align it to the right, apart from modifying
avatar_distance in panel_avatar_list_item.xml to look more like
last_interaction, modify newview/llavatarlistitem.cpp line 555
to be something like:
`S32 avatar_distance_width = avatar_item->mLastInteractionTime->getRect().mLeft - avatar_item->mAvatarDistance->getRect().mLeft;`
I had tried this at first, but I couldn't make it look good and
that's why I aligned it to the left.
Also, these distances need to not be shown on Friends list.
I'm doing that next.
| -rw-r--r-- | indra/newview/llavatarlist.cpp | 37 | ||||
| -rw-r--r-- | indra/newview/llavatarlist.h | 2 | ||||
| -rw-r--r-- | indra/newview/llavatarlistitem.cpp | 20 | ||||
| -rw-r--r-- | indra/newview/llavatarlistitem.h | 4 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_avatar_list_item.xml | 11 | 
5 files changed, 72 insertions, 2 deletions
| diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index e467f74f9c..57126d175f 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -36,6 +36,7 @@  #include "lltextutil.h"  // newview +#include "llagent.h"  #include "llagentdata.h" // for comparator  #include "llavatariconctrl.h"  #include "llavatarnamecache.h" @@ -47,6 +48,7 @@  #include "llvoiceclient.h"  #include "llviewercontrol.h"    // for gSavedSettings  #include "lltooldraganddrop.h" +#include "llworld.h"  static LLDefaultChildRegistry::Register<LLAvatarList> r("avatar_list"); @@ -131,6 +133,7 @@ LLAvatarList::LLAvatarList(const Params& p)  :   LLFlatListViewEx(p)  , mIgnoreOnlineStatus(p.ignore_online_status)  , mShowLastInteractionTime(p.show_last_interaction_time) +, mAvatarDistance(true)  , mContextMenu(NULL)  , mDirty(true) // to force initial update  , mNeedUpdateNames(false) @@ -147,7 +150,7 @@ LLAvatarList::LLAvatarList(const Params& p)      // Set default sort order.      setComparator(&NAME_COMPARATOR); -    if (mShowLastInteractionTime) +    if (mShowLastInteractionTime || mAvatarDistance)      {          mLITUpdateTimer = new LLTimer();          mLITUpdateTimer->setTimerExpirySec(0); // zero to force initial update @@ -196,9 +199,16 @@ void LLAvatarList::draw()      if (mDirty)          refresh(); -    if (mShowLastInteractionTime && mLITUpdateTimer->hasExpired()) +    if ((mShowLastInteractionTime || mAvatarDistance) && mLITUpdateTimer->hasExpired())      { +        if (mAvatarDistance) +        { +            updateAvatarDistance(); +        } +        if (mShowLastInteractionTime) +        {          updateLastInteractionTimes(); +        }          mLITUpdateTimer->setTimerExpirySec(LIT_UPDATE_PERIOD); // restart the timer      }  } @@ -422,6 +432,7 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is      // This sets the name as a side effect      item->setAvatarId(id, mSessionID, mIgnoreOnlineStatus);      item->setOnline(mIgnoreOnlineStatus ? true : is_online); +    item->showAvatarDistance(true);      item->showLastInteractionTime(mShowLastInteractionTime);      item->setAvatarIconVisible(mShowIcons); @@ -528,6 +539,28 @@ void LLAvatarList::computeDifference(      LLCommonUtils::computeDifference(vnew_unsorted, vcur, vadded, vremoved);  } +void LLAvatarList::updateAvatarDistance() +{ +    std::vector<LLPanel*> items; +    getItems(items); +    auto uuids = getIDs(); +    std::vector<LLVector3d> positions; +    auto me_pos = gAgent.getPositionGlobal(); +    LLWorld::getInstance()->getAvatars(&uuids, &positions, me_pos, gSavedSettings.getF32("MPVNearMeRange")); +    std::map <LLUUID, LLVector3d> avatarsPositions; +    auto pos_it = positions.begin(); +    auto id_it = uuids.begin(); +    for (;pos_it != positions.end() && id_it != uuids.end(); ++pos_it, ++id_it) +    { +        avatarsPositions[*id_it] = *pos_it; +    } +    for (auto it = items.begin(); it != items.end(); it++) +    { +        auto item = static_cast<LLAvatarListItem*>(*it); +        item->setAvatarDistance(dist_vec(avatarsPositions[item->getAvatarId()], me_pos)); +    } +} +  // Refresh shown time of our last interaction with all listed avatars.  void LLAvatarList::updateLastInteractionTimes()  { diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index 2352c7cd55..ac92c97660 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -110,6 +110,7 @@ protected:          const uuid_vec_t& vnew,          uuid_vec_t& vadded,          uuid_vec_t& vremoved); +    void updateAvatarDistance();      void updateLastInteractionTimes();      void rebuildNames();      void onItemDoubleClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask); @@ -118,6 +119,7 @@ protected:  private:      bool mIgnoreOnlineStatus; +    bool mAvatarDistance;      bool mShowLastInteractionTime;      bool mDirty;      bool mNeedUpdateNames; diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index 5f243d18c0..dd0e2d83d3 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -65,6 +65,7 @@ LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/)      LLFriendObserver(),      mAvatarIcon(NULL),      mAvatarName(NULL), +    mAvatarDistance(NULL),      mLastInteractionTime(NULL),      mIconPermissionOnline(NULL),      mIconPermissionMap(NULL), @@ -107,6 +108,7 @@ BOOL  LLAvatarListItem::postBuild()  {      mAvatarIcon = getChild<LLAvatarIconCtrl>("avatar_icon");      mAvatarName = getChild<LLTextBox>("avatar_name"); +    mAvatarDistance = getChild<LLTextBox>("avatar_distance");      mLastInteractionTime = getChild<LLTextBox>("last_interaction");      mIconPermissionOnline = getChild<LLIconCtrl>("permission_online_icon"); @@ -301,6 +303,17 @@ void LLAvatarListItem::setAvatarId(const LLUUID& id, const LLUUID& session_id, b      }  } +void LLAvatarListItem::showAvatarDistance(bool show) +{ +    mAvatarDistance->setVisible(show); +    updateChildren(); +} + +void LLAvatarListItem::setAvatarDistance(F32 distance) +{ +    mAvatarDistance->setValue(llformat("%.1f m", distance)); +} +  void LLAvatarListItem::showLastInteractionTime(bool show)  {      mLastInteractionTime->setVisible(show); @@ -538,6 +551,9 @@ void LLAvatarListItem::initChildrenWidths(LLAvatarListItem* avatar_item)      // last interaction time textbox width + padding      S32 last_interaction_time_width = avatar_item->mIconPermissionEditTheirs->getRect().mLeft - avatar_item->mLastInteractionTime->getRect().mLeft; +    // avatar distance textbox width + padding +    S32 avatar_distance_width = avatar_item->mAvatarDistance->getRect().mLeft - avatar_item->mAvatarName->getRect().mLeft; +      // avatar icon width + padding      S32 icon_width = avatar_item->mAvatarName->getRect().mLeft - avatar_item->mAvatarIcon->getRect().mLeft; @@ -546,6 +562,7 @@ void LLAvatarListItem::initChildrenWidths(LLAvatarListItem* avatar_item)      S32 index = ALIC_COUNT;      sChildrenWidths[--index] = icon_width;      sChildrenWidths[--index] = 0; // for avatar name we don't need its width, it will be calculated as "left available space" +    sChildrenWidths[--index] = avatar_distance_width;      sChildrenWidths[--index] = last_interaction_time_width;      sChildrenWidths[--index] = permission_edit_theirs_width;      sChildrenWidths[--index] = permission_edit_mine_width; @@ -666,6 +683,9 @@ LLView* LLAvatarListItem::getItemChildView(EAvatarListItemChildIndex child_view_      case ALIC_NAME:          child_view = mAvatarName;          break; +    case ALIC_DISTANCE: +        child_view = mAvatarDistance; +        break;      case ALIC_INTERACTION_TIME:          child_view = mLastInteractionTime;          break; diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h index 3f6dcb0783..ac356ab3b1 100644 --- a/indra/newview/llavatarlistitem.h +++ b/indra/newview/llavatarlistitem.h @@ -98,12 +98,14 @@ public:      void setHighlight(const std::string& highlight);      void setState(EItemState item_style);      void setAvatarId(const LLUUID& id, const LLUUID& session_id, bool ignore_status_changes = false, bool is_resident = true); +    void setAvatarDistance(F32 distance);      void setLastInteractionTime(U32 secs_since);      //Show/hide profile/info btn, translating speaker indicator and avatar name coordinates accordingly      void setShowProfileBtn(bool show);      void setShowInfoBtn(bool show);      void showSpeakingIndicator(bool show);      void setShowPermissions(bool show) { mShowPermissions = show; }; +    void showAvatarDistance(bool show);      void showLastInteractionTime(bool show);      void setAvatarIconVisible(bool visible);      void setShowCompleteName(bool show) { mShowCompleteName = show;}; @@ -158,6 +160,7 @@ private:          ALIC_PERMISSION_EDIT_MINE,          ALIC_PERMISSION_EDIT_THEIRS,          ALIC_INTERACTION_TIME, +        ALIC_DISTANCE,          ALIC_NAME,          ALIC_ICON,          ALIC_COUNT, @@ -199,6 +202,7 @@ private:      LLView* getItemChildView(EAvatarListItemChildIndex child_index);      LLTextBox* mAvatarName; +    LLTextBox* mAvatarDistance;      LLTextBox* mLastInteractionTime;      LLStyle::Params mAvatarNameStyle; diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml index ca6e94397d..122b5ae508 100644 --- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml @@ -66,6 +66,17 @@       value="(loading)"       width="180" />      <text +     follows="left|right" +     font="SansSerifSmall" +     height="15" +     layout="topleft" +     left_pad="5" +     name="avatar_distance" +     top="6" +     text_color="LtGray_50" +     value="0m" +     width="35" /> +    <text       follows="right"       font="SansSerifSmall"       height="15" | 
