Skip to content

Commit e4eca07

Browse files
committed
Allow right clicking object UI labels to interact with their owners!
1 parent 68ceac3 commit e4eca07

5 files changed

Lines changed: 326 additions & 36 deletions

File tree

indra/newview/llviewermenu.cpp

Lines changed: 68 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -9279,6 +9279,22 @@ class ListBanFromGroup final : public view_listener_t
92799279

92809280
void 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+
92829298
class 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+
93309355
class 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
}

indra/newview/skins/default/xui/en-us/menu_objects_list.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
22
<context_menu label="Objects" name="Objects">
3+
<menu filename="menu_objects_list_owners.xml"/>
34
<menu_item_call label="Cam To" name="Cam To">
45
<on_click function="List.Object.CamTo"/>
56
<on_visible function="List.EnableSingleSelected"/>

0 commit comments

Comments
 (0)