Skip to content
Snippets Groups Projects
Commit c24f6380 authored by maxim_productengine's avatar maxim_productengine
Browse files

MAINT-8997 Add "Sort by recent arrival" to viewer People / Nearby map and list

parent cdef4175
No related branches found
No related tags found
No related merge requests found
...@@ -213,10 +213,39 @@ class LLAvatarItemRecentSpeakerComparator : public LLAvatarItemNameComparator ...@@ -213,10 +213,39 @@ class LLAvatarItemRecentSpeakerComparator : public LLAvatarItemNameComparator
} }
}; };
class LLAvatarItemRecentArrivalComparator : public LLAvatarItemNameComparator
{
public:
LLAvatarItemRecentArrivalComparator() {};
virtual ~LLAvatarItemRecentArrivalComparator() {};
protected:
virtual bool doCompare(const LLAvatarListItem* item1, const LLAvatarListItem* item2) const
{
F32 arr_time1 = LLRecentPeople::instance().getArrivalTimeByID(item1->getAvatarId());
F32 arr_time2 = LLRecentPeople::instance().getArrivalTimeByID(item2->getAvatarId());
if (arr_time1 == arr_time2)
{
std::string name1 = item1->getAvatarName();
std::string name2 = item2->getAvatarName();
LLStringUtil::toUpper(name1);
LLStringUtil::toUpper(name2);
return name1 < name2;
}
return arr_time1 > arr_time2;
}
};
static const LLAvatarItemRecentComparator RECENT_COMPARATOR; static const LLAvatarItemRecentComparator RECENT_COMPARATOR;
static const LLAvatarItemStatusComparator STATUS_COMPARATOR; static const LLAvatarItemStatusComparator STATUS_COMPARATOR;
static LLAvatarItemDistanceComparator DISTANCE_COMPARATOR; static LLAvatarItemDistanceComparator DISTANCE_COMPARATOR;
static const LLAvatarItemRecentSpeakerComparator RECENT_SPEAKER_COMPARATOR; static const LLAvatarItemRecentSpeakerComparator RECENT_SPEAKER_COMPARATOR;
static LLAvatarItemRecentArrivalComparator RECENT_ARRIVAL_COMPARATOR;
static LLPanelInjector<LLPanelPeople> t_people("panel_people"); static LLPanelInjector<LLPanelPeople> t_people("panel_people");
...@@ -539,6 +568,8 @@ LLPanelPeople::LLPanelPeople() ...@@ -539,6 +568,8 @@ LLPanelPeople::LLPanelPeople()
mEnableCallbackRegistrar.add("People.Nearby.ViewSort.CheckItem", boost::bind(&LLPanelPeople::onNearbyViewSortMenuItemCheck, this, _2)); mEnableCallbackRegistrar.add("People.Nearby.ViewSort.CheckItem", boost::bind(&LLPanelPeople::onNearbyViewSortMenuItemCheck, this, _2));
mEnableCallbackRegistrar.add("People.Group.Plus.Validate", boost::bind(&LLPanelPeople::onGroupPlusButtonValidate, this)); mEnableCallbackRegistrar.add("People.Group.Plus.Validate", boost::bind(&LLPanelPeople::onGroupPlusButtonValidate, this));
doPeriodically(boost::bind(&LLPanelPeople::updateNearbyArrivalTime, this), 2.0);
} }
LLPanelPeople::~LLPanelPeople() LLPanelPeople::~LLPanelPeople()
...@@ -1049,6 +1080,10 @@ void LLPanelPeople::setSortOrder(LLAvatarList* list, ESortOrder order, bool save ...@@ -1049,6 +1080,10 @@ void LLPanelPeople::setSortOrder(LLAvatarList* list, ESortOrder order, bool save
list->setComparator(&DISTANCE_COMPARATOR); list->setComparator(&DISTANCE_COMPARATOR);
list->sort(); list->sort();
break; break;
case E_SORT_BY_RECENT_ARRIVAL:
list->setComparator(&RECENT_ARRIVAL_COMPARATOR);
list->sort();
break;
default: default:
LL_WARNS() << "Unrecognized people sort order for " << list->getName() << LL_ENDL; LL_WARNS() << "Unrecognized people sort order for " << list->getName() << LL_ENDL;
return; return;
...@@ -1386,6 +1421,10 @@ void LLPanelPeople::onNearbyViewSortMenuItemClicked(const LLSD& userdata) ...@@ -1386,6 +1421,10 @@ void LLPanelPeople::onNearbyViewSortMenuItemClicked(const LLSD& userdata)
{ {
setSortOrder(mNearbyList, E_SORT_BY_DISTANCE); setSortOrder(mNearbyList, E_SORT_BY_DISTANCE);
} }
else if (chosen_item == "sort_arrival")
{
setSortOrder(mNearbyList, E_SORT_BY_RECENT_ARRIVAL);
}
else if (chosen_item == "view_usernames") else if (chosen_item == "view_usernames")
{ {
bool hide_usernames = !gSavedSettings.getBOOL("NearbyListHideUsernames"); bool hide_usernames = !gSavedSettings.getBOOL("NearbyListHideUsernames");
...@@ -1407,6 +1446,8 @@ bool LLPanelPeople::onNearbyViewSortMenuItemCheck(const LLSD& userdata) ...@@ -1407,6 +1446,8 @@ bool LLPanelPeople::onNearbyViewSortMenuItemCheck(const LLSD& userdata)
return sort_order == E_SORT_BY_NAME; return sort_order == E_SORT_BY_NAME;
if (item == "sort_distance") if (item == "sort_distance")
return sort_order == E_SORT_BY_DISTANCE; return sort_order == E_SORT_BY_DISTANCE;
if (item == "sort_arrival")
return sort_order == E_SORT_BY_RECENT_ARRIVAL;
return false; return false;
} }
...@@ -1594,5 +1635,15 @@ bool LLPanelPeople::isAccordionCollapsedByUser(const std::string& name) ...@@ -1594,5 +1635,15 @@ bool LLPanelPeople::isAccordionCollapsedByUser(const std::string& name)
return isAccordionCollapsedByUser(getChild<LLUICtrl>(name)); return isAccordionCollapsedByUser(getChild<LLUICtrl>(name));
} }
bool LLPanelPeople::updateNearbyArrivalTime()
{
std::vector<LLVector3d> positions;
std::vector<LLUUID> uuids;
static LLCachedControl<F32> range(gSavedSettings, "NearMeRange");
LLWorld::getInstance()->getAvatars(&uuids, &positions, gAgent.getPositionGlobal(), range);
LLRecentPeople::instance().updateAvatarsArrivalTime(uuids);
return LLApp::isExiting();
}
// EOF // EOF
...@@ -62,6 +62,8 @@ class LLPanelPeople ...@@ -62,6 +62,8 @@ class LLPanelPeople
// internals // internals
class Updater; class Updater;
bool updateNearbyArrivalTime();
private: private:
typedef enum e_sort_oder { typedef enum e_sort_oder {
...@@ -70,6 +72,7 @@ class LLPanelPeople ...@@ -70,6 +72,7 @@ class LLPanelPeople
E_SORT_BY_MOST_RECENT = 2, E_SORT_BY_MOST_RECENT = 2,
E_SORT_BY_DISTANCE = 3, E_SORT_BY_DISTANCE = 3,
E_SORT_BY_RECENT_SPEAKERS = 4, E_SORT_BY_RECENT_SPEAKERS = 4,
E_SORT_BY_RECENT_ARRIVAL = 5
} ESortOrder; } ESortOrder;
void removePicker(); void removePicker();
......
...@@ -126,3 +126,33 @@ bool LLRecentPeople::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) ...@@ -126,3 +126,33 @@ bool LLRecentPeople::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
add(event->getValue().asUUID()); add(event->getValue().asUUID());
return true; return true;
} }
void LLRecentPeople::updateAvatarsArrivalTime(uuid_vec_t& uuids)
{
id_to_time_map_t buf = mAvatarsArrivalTime;
mAvatarsArrivalTime.clear();
for (uuid_vec_t::const_iterator id_it = uuids.begin(); id_it != uuids.end(); ++id_it)
{
if (buf.find(*id_it) != buf.end())
{
mAvatarsArrivalTime[*id_it] = buf[*id_it];
}
else
{
mAvatarsArrivalTime[*id_it] = LLDate::now().secondsSinceEpoch();
}
}
}
F32 LLRecentPeople::getArrivalTimeByID(const LLUUID& id)
{
id_to_time_map_t::const_iterator it = mAvatarsArrivalTime.find(id);
if (it != mAvatarsArrivalTime.end())
{
return it->second;
}
return LLDate::now().secondsSinceEpoch();
}
...@@ -53,6 +53,7 @@ class LLRecentPeople: public LLSingleton<LLRecentPeople>, public LLOldEvents::LL ...@@ -53,6 +53,7 @@ class LLRecentPeople: public LLSingleton<LLRecentPeople>, public LLOldEvents::LL
LLSINGLETON_EMPTY_CTOR(LLRecentPeople); LLSINGLETON_EMPTY_CTOR(LLRecentPeople);
LOG_CLASS(LLRecentPeople); LOG_CLASS(LLRecentPeople);
public: public:
typedef std::map <LLUUID, F32> id_to_time_map_t;
typedef boost::signals2::signal<void ()> signal_t; typedef boost::signals2::signal<void ()> signal_t;
/** /**
...@@ -116,6 +117,9 @@ class LLRecentPeople: public LLSingleton<LLRecentPeople>, public LLOldEvents::LL ...@@ -116,6 +117,9 @@ class LLRecentPeople: public LLSingleton<LLRecentPeople>, public LLOldEvents::LL
*/ */
/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
void updateAvatarsArrivalTime(uuid_vec_t& uuids);
F32 getArrivalTimeByID(const LLUUID& id);
private: private:
const LLUUID& getIDByPhoneNumber(const LLSD& userdata); const LLUUID& getIDByPhoneNumber(const LLSD& userdata);
...@@ -123,6 +127,7 @@ class LLRecentPeople: public LLSingleton<LLRecentPeople>, public LLOldEvents::LL ...@@ -123,6 +127,7 @@ class LLRecentPeople: public LLSingleton<LLRecentPeople>, public LLOldEvents::LL
typedef std::map<LLUUID, LLSD> recent_people_t; typedef std::map<LLUUID, LLSD> recent_people_t;
recent_people_t mPeople; recent_people_t mPeople;
signal_t mChangedSignal; signal_t mChangedSignal;
id_to_time_map_t mAvatarsArrivalTime;
}; };
#endif // LL_LLRECENTPEOPLE_H #endif // LL_LLRECENTPEOPLE_H
...@@ -33,6 +33,16 @@ ...@@ -33,6 +33,16 @@
function="People.Nearby.ViewSort.CheckItem" function="People.Nearby.ViewSort.CheckItem"
parameter="sort_distance"/> parameter="sort_distance"/>
</menu_item_check> </menu_item_check>
<menu_item_check
label="Sort by Recent arrival"
name="sort_arrival">
<menu_item_check.on_click
function="People.Nearby.ViewSort.Action"
parameter="sort_arrival"/>
<menu_item_check.on_check
function="People.Nearby.ViewSort.CheckItem"
parameter="sort_arrival"/>
</menu_item_check>
<menu_item_separator layout="topleft" /> <menu_item_separator layout="topleft" />
<menu_item_check name="view_icons" label="View People Icons"> <menu_item_check name="view_icons" label="View People Icons">
<menu_item_check.on_click <menu_item_check.on_click
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment