@@ -9279,6 +9279,22 @@ class ListBanFromGroup final : public view_listener_t
92799279
92809280void copy_from_ids (const uuid_vec_t & ids, std::function<std::string(const LLUUID &)> func);
92819281
9282+ uuid_vec_t get_active_owner_ids ()
9283+ {
9284+ uuid_vec_t ret;
9285+ for (const auto & id : LFIDBearer::getActiveSelectedIDs ())
9286+ {
9287+ const auto & owner_id = get_obj_owner (id);
9288+ if (owner_id.notNull ()) ret.push_back (owner_id);
9289+ }
9290+ return ret;
9291+ }
9292+
9293+ const LLUUID & get_active_owner_id ()
9294+ {
9295+ return get_obj_owner (LFIDBearer::getActiveSelectedID ());
9296+ }
9297+
92829298class ListCopyNames final : public view_listener_t
92839299{
92849300 static std::string getGroupName (const LLUUID & id)
@@ -9310,8 +9326,9 @@ class ListCopyNames final : public view_listener_t
93109326 {
93119327 LLWString str;
93129328 const auto & type = LFIDBearer::getActiveType ();
9313- copy_from_ids (LFIDBearer::getActiveSelectedIDs (), type == LFIDBearer::GROUP ? getGroupName :
9314- type == LFIDBearer::OBJECT ? getObjectName :
9329+ bool owner = !userdata.asBoolean ();
9330+ copy_from_ids (owner ? get_active_owner_ids () : LFIDBearer::getActiveSelectedIDs (), type == LFIDBearer::GROUP ? getGroupName :
9331+ type == LFIDBearer::OBJECT ? owner ? getAvatarName : getObjectName :
93159332 type == LFIDBearer::EXPERIENCE ? getExperienceName :
93169333 getAvatarName);
93179334 if (!str.empty ()) LLView::getWindow ()->copyTextToClipboard (str);
@@ -9322,16 +9339,24 @@ class ListCopySLURL final : public view_listener_t
93229339{
93239340 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
93249341 {
9325- copy_profile_uri (LFIDBearer::getActiveSelectedID (), LFIDBearer::getActiveType ());
9342+ bool owner = !userdata.asBoolean ();
9343+ copy_profile_uri (owner ? get_active_owner_id () : LFIDBearer::getActiveSelectedID (), owner ? LFIDBearer::AVATAR : LFIDBearer::getActiveType ());
93269344 return true ;
93279345 }
93289346};
93299347
9348+ const LLUUID & active_owner_or_id (const LLSD & userdata)
9349+ {
9350+ return !userdata.asBoolean () ? get_active_owner_id () : LFIDBearer::getActiveSelectedID ();
9351+ }
9352+
9353+ #define active_owners_or_ids (userdata ) !userdata.asBoolean() ? get_active_owner_ids() : LFIDBearer::getActiveSelectedIDs()
9354+
93309355class ListCopyUUIDs final : public view_listener_t
93319356{
93329357 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
93339358 {
9334- LLAvatarActions::copyUUIDs (LFIDBearer::getActiveSelectedIDs ( ));
9359+ LLAvatarActions::copyUUIDs (active_owners_or_ids (userdata ));
93359360 return true ;
93369361 }
93379362};
@@ -9340,7 +9365,7 @@ class ListInviteToGroup final : public view_listener_t
93409365{
93419366 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
93429367 {
9343- LLAvatarActions::inviteToGroup (LFIDBearer::getActiveSelectedIDs ( ));
9368+ LLAvatarActions::inviteToGroup (active_owners_or_ids (userdata ));
93449369 return true ;
93459370 }
93469371};
@@ -9349,7 +9374,7 @@ class ListOfferTeleport final : public view_listener_t
93499374{
93509375 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
93519376 {
9352- LLAvatarActions::offerTeleport (LFIDBearer::getActiveSelectedIDs ( ));
9377+ LLAvatarActions::offerTeleport (active_owners_or_ids (userdata ));
93539378 return true ;
93549379 }
93559380};
@@ -9358,7 +9383,7 @@ class ListPay final : public view_listener_t
93589383{
93599384 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
93609385 {
9361- LLAvatarActions::pay (LFIDBearer::getActiveSelectedID ( ));
9386+ LLAvatarActions::pay (active_owner_or_id (userdata ));
93629387 return true ;
93639388 }
93649389};
@@ -9367,7 +9392,7 @@ class ListRemoveFriend final : public view_listener_t
93679392{
93689393 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
93699394 {
9370- LLAvatarActions::removeFriendDialog (LFIDBearer::getActiveSelectedID ( ));
9395+ LLAvatarActions::removeFriendDialog (active_owner_or_id (userdata ));
93719396 return true ;
93729397 }
93739398};
@@ -9376,7 +9401,7 @@ class ListRequestFriendship final : public view_listener_t
93769401{
93779402 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
93789403 {
9379- LLAvatarActions::requestFriendshipDialog (LFIDBearer::getActiveSelectedID ( ));
9404+ LLAvatarActions::requestFriendshipDialog (active_owner_or_id (userdata ));
93809405 return true ;
93819406 }
93829407};
@@ -9385,7 +9410,7 @@ class ListRequestTeleport final : public view_listener_t
93859410{
93869411 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
93879412 {
9388- LLAvatarActions::teleportRequest (LFIDBearer::getActiveSelectedID ( ));
9413+ LLAvatarActions::teleportRequest (active_owner_or_id (userdata ));
93899414 return true ;
93909415 }
93919416};
@@ -9394,7 +9419,7 @@ class ListShare final : public view_listener_t
93949419{
93959420 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
93969421 {
9397- LLAvatarActions::share (LFIDBearer::getActiveSelectedID ( ));
9422+ LLAvatarActions::share (active_owner_or_id (userdata ));
93989423 return true ;
93999424 }
94009425};
@@ -9409,8 +9434,9 @@ class ListShowLog final : public view_listener_t
94099434{
94109435 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
94119436 {
9412- for (const LLUUID & id : LFIDBearer::getActiveSelectedIDs ())
9413- show_log_browser (id, LFIDBearer::getActiveType ());
9437+ const auto & type = userdata.asBoolean () ? LFIDBearer::getActiveType () : LFIDBearer::AVATAR ;
9438+ for (const LLUUID & id : active_owners_or_ids (userdata))
9439+ show_log_browser (id, type);
94149440 return true ;
94159441 }
94169442};
@@ -9423,7 +9449,12 @@ class ListShowProfile final : public view_listener_t
94239449 {
94249450 case LFIDBearer::AVATAR : LLAvatarActions::showProfiles (LFIDBearer::getActiveSelectedIDs ()); break ;
94259451 case LFIDBearer::GROUP : LLGroupActions::showProfiles (LFIDBearer::getActiveSelectedIDs ()); break ;
9426- case LFIDBearer::OBJECT : for (const auto & id : LFIDBearer::getActiveSelectedIDs ()) LLUrlAction::openURL (get_slurl_for (id, LFIDBearer::OBJECT )); break ;
9452+ case LFIDBearer::OBJECT :
9453+ if (userdata.asBoolean ())
9454+ for (const auto & id : LFIDBearer::getActiveSelectedIDs ()) LLUrlAction::openURL (get_slurl_for (id, LFIDBearer::OBJECT ));
9455+ else // Owners
9456+ LLAvatarActions::showProfiles (get_active_owner_ids ());
9457+ break ;
94279458 case LFIDBearer::EXPERIENCE : for (const auto & id : LFIDBearer::getActiveSelectedIDs ()) LLFloaterExperienceProfile::showInstance (id); break ;
94289459 default : break ;
94299460 }
@@ -9435,7 +9466,7 @@ class ListShowWebProfile final : public view_listener_t
94359466{
94369467 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
94379468 {
9438- LLAvatarActions::showProfiles (LFIDBearer::getActiveSelectedIDs ( ), true );
9469+ LLAvatarActions::showProfiles (active_owners_or_ids (userdata ), true );
94399470 return true ;
94409471 }
94419472};
@@ -9444,7 +9475,7 @@ class ListStartAdhocCall final : public view_listener_t
94449475{
94459476 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
94469477 {
9447- LLAvatarActions::startAdhocCall (LFIDBearer::getActiveSelectedIDs ( ));
9478+ LLAvatarActions::startAdhocCall (active_owners_or_ids (userdata ));
94489479 return true ;
94499480 }
94509481};
@@ -9453,7 +9484,7 @@ class ListStartCall final : public view_listener_t
94539484{
94549485 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
94559486 {
9456- (LFIDBearer::getActiveType () == LFIDBearer::GROUP ? LLGroupActions::startCall : LLAvatarActions::startCall)(LFIDBearer::getActiveSelectedID ( ));
9487+ (LFIDBearer::getActiveType () == LFIDBearer::GROUP ? LLGroupActions::startCall : LLAvatarActions::startCall)(active_owner_or_id (userdata ));
94579488 return true ;
94589489 }
94599490};
@@ -9462,7 +9493,7 @@ class ListStartConference final : public view_listener_t
94629493{
94639494 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
94649495 {
9465- LLAvatarActions::startConference (LFIDBearer::getActiveSelectedIDs ( ));
9496+ LLAvatarActions::startConference (active_owners_or_ids (userdata ));
94669497 return true ;
94679498 }
94689499};
@@ -9472,7 +9503,7 @@ class ListStartIM final : public view_listener_t
94729503 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
94739504 {
94749505 const auto && im = LFIDBearer::getActiveType () == LFIDBearer::GROUP ? [](const LLUUID & id) { LLGroupActions::startIM (id); } : LLAvatarActions::startIM;
9475- for (const auto & id : LFIDBearer::getActiveSelectedIDs ( ))
9506+ for (const auto & id : active_owners_or_ids (userdata ))
94769507 im (id);
94779508 return true ;
94789509 }
@@ -9485,10 +9516,10 @@ const LLVector3d get_obj_pos(const LLUUID& id)
94859516 return obj->getPositionGlobal ();
94869517 return LLVector3d::zero;
94879518}
9488- static const LLVector3d get_active_pos ()
9519+ static const LLVector3d get_active_pos (const LLSD & userdata )
94899520{
9490- const auto & id = LFIDBearer::getActiveSelectedID ( );
9491- if (LFIDBearer::getActiveType () == LFIDBearer::OBJECT )
9521+ const auto & id = active_owner_or_id (userdata );
9522+ if (userdata. asBoolean () && LFIDBearer::getActiveType () == LFIDBearer::OBJECT )
94929523 return get_obj_pos (id);
94939524 return get_av_pos (id);
94949525}
@@ -9497,7 +9528,7 @@ class ListTeleportTo final : public view_listener_t
94979528{
94989529 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
94999530 {
9500- const auto & pos = get_active_pos ();
9531+ const auto & pos = get_active_pos (userdata );
95019532 if (!pos.isExactlyZero ())
95029533 gAgent .teleportViaLocation (pos);
95039534 return true ;
@@ -9508,7 +9539,7 @@ class ListStalk final : public view_listener_t
95089539{
95099540 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
95109541 {
9511- LLAvatarActions::showOnMap (LFIDBearer::getActiveSelectedID ( ));
9542+ LLAvatarActions::showOnMap (active_owner_or_id (userdata ));
95129543 return true ;
95139544 }
95149545};
@@ -9518,7 +9549,7 @@ class ListStalkable final : public view_listener_t
95189549 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
95199550 {
95209551 BOOL is_agent_mappable (const LLUUID & agent_id);
9521- const auto & ids = LFIDBearer::getActiveSelectedIDs ( );
9552+ const auto & ids = active_owners_or_ids (userdata[ " data " ] );
95229553 gMenuHolder ->findControl (userdata[" control" ].asString ())->setValue (ids.size () == 1 && is_agent_mappable (ids[0 ]));
95239554 return true ;
95249555 }
@@ -9531,7 +9562,7 @@ class ListAbuseReport final : public view_listener_t
95319562 if (LFIDBearer::getActiveType () == LFIDBearer::EXPERIENCE )
95329563 LLFloaterReporter::showFromExperience (LFIDBearer::getActiveSelectedID ());
95339564 else
9534- LLFloaterReporter::showFromObject (LFIDBearer::getActiveSelectedID ( ));
9565+ LLFloaterReporter::showFromObject (active_owner_or_id (userdata ));
95359566 return true ;
95369567 }
95379568};
@@ -9597,8 +9628,9 @@ class ListIsNearby final : public view_listener_t
95979628{
95989629 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
95999630 {
9600- const auto & id = LFIDBearer::getActiveSelectedID ();
9601- gMenuHolder ->findControl (userdata[" control" ].asString ())->setValue (LFIDBearer::getActiveType () == LFIDBearer::OBJECT ? !!gObjectList .findObject (id) : is_nearby (id));
9631+ const auto & data = userdata[" data" ];
9632+ const auto & id = active_owner_or_id (data);
9633+ gMenuHolder ->findControl (userdata[" control" ].asString ())->setValue (!data.asBoolean () && LFIDBearer::getActiveType () == LFIDBearer::OBJECT ? !!gObjectList .findObject (id) : is_nearby (id));
96029634 return true ;
96039635 }
96049636};
@@ -9607,7 +9639,7 @@ class ListFollow final : public view_listener_t
96079639{
96089640 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
96099641 {
9610- gAgent .startFollowPilot (LFIDBearer::getActiveSelectedID ( ), true , gSavedSettings .getF32 (" SinguFollowDistance" ));
9642+ gAgent .startFollowPilot (active_owner_or_id (userdata ), true , gSavedSettings .getF32 (" SinguFollowDistance" ));
96119643 return true ;
96129644 }
96139645};
@@ -9616,7 +9648,7 @@ class ListGoTo final : public view_listener_t
96169648{
96179649 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
96189650 {
9619- const auto & pos = get_active_pos ();
9651+ const auto & pos = get_active_pos (userdata );
96209652 if (!pos.isExactlyZero ())
96219653 handle_go_to (pos);
96229654 return true ;
@@ -9628,7 +9660,7 @@ class ListTrack final : public view_listener_t
96289660{
96299661 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
96309662 {
9631- track_av (LFIDBearer::getActiveSelectedID ( ));
9663+ track_av (active_owner_or_id (userdata ));
96329664 return true ;
96339665 }
96349666};
@@ -9642,7 +9674,7 @@ class ListEject final : public view_listener_t
96429674{
96439675 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
96449676 {
9645- confirm_eject (LFIDBearer::getActiveSelectedIDs ( ));
9677+ confirm_eject (active_owners_or_ids (userdata ));
96469678 return true ;
96479679 }
96489680};
@@ -9656,7 +9688,7 @@ class ListFreeze final : public view_listener_t
96569688{
96579689 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
96589690 {
9659- confirm_freeze (LFIDBearer::getActiveSelectedIDs ( ));
9691+ confirm_freeze (active_owners_or_ids (userdata ));
96609692 return true ;
96619693 }
96629694};
@@ -9695,7 +9727,7 @@ class ListEstateBan final : public view_listener_t
96959727{
96969728 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
96979729 {
9698- confirm_estate_ban (LFIDBearer::getActiveSelectedIDs ( ));
9730+ confirm_estate_ban (active_owners_or_ids (userdata ));
96999731 return true ;
97009732 }
97019733};
@@ -9708,7 +9740,7 @@ class ListEstateEject final : public view_listener_t
97089740{
97099741 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
97109742 {
9711- confirm_estate_kick (LFIDBearer::getActiveSelectedIDs ( ));
9743+ confirm_estate_kick (active_owners_or_ids (userdata ));
97129744 return true ;
97139745 }
97149746};
@@ -9717,7 +9749,7 @@ class ListToggleMute final : public view_listener_t
97179749{
97189750 bool handleEvent (LLPointer<LLEvent> event, const LLSD & userdata) override
97199751 {
9720- for (const auto & id : LFIDBearer::getActiveSelectedIDs ( ))
9752+ for (const auto & id : active_owners_or_ids (userdata ))
97219753 LLAvatarActions::toggleBlock (id);
97229754 return true ;
97239755 }
0 commit comments