Undo CHUI-90 and make avatar inspector useful again
parent
8b2a45a0f4
commit
8380fe9f71
|
|
@ -48,6 +48,22 @@
|
|||
#include "lltooltip.h" // positionViewNearMouse()
|
||||
#include "lltrans.h"
|
||||
|
||||
// <FS:Ansariel> Undo CHUI-90 and make avatar inspector useful again
|
||||
#include "llagentdata.h"
|
||||
#include "llcallingcard.h"
|
||||
#include "llfloaterreporter.h"
|
||||
#include "llfloaterworldmap.h"
|
||||
#include "llimview.h"
|
||||
#include "llpanelblockedlist.h"
|
||||
#include "llspeakers.h"
|
||||
#include "llviewermenu.h"
|
||||
#include "llviewerobjectlist.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llmenubutton.h"
|
||||
#include "lltoggleablemenu.h"
|
||||
#include "lluictrl.h"
|
||||
// </FS:Ansariel>
|
||||
|
||||
class LLFetchAvatarData;
|
||||
|
||||
|
||||
|
|
@ -78,6 +94,15 @@ public:
|
|||
void processAvatarData(LLAvatarData* data);
|
||||
|
||||
virtual LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::GLOBAL; }
|
||||
|
||||
// <FS:Ansariel> Undo CHUI-90 and make avatar inspector useful again
|
||||
// When closing they should close their gear menu
|
||||
/*virtual*/ void onClose(bool app_quitting);
|
||||
|
||||
// override the inspector mouse leave so timer is only paused if
|
||||
// gear menu is not open
|
||||
/* virtual */ void onMouseLeave(S32 x, S32 y, MASK mask);
|
||||
// </FS:Ansariel>
|
||||
|
||||
private:
|
||||
// Make network requests for all the data to display in this view.
|
||||
|
|
@ -88,10 +113,48 @@ private:
|
|||
// hiding/disabling if the user is not nearby.
|
||||
void updateVolumeSlider();
|
||||
|
||||
// <FS:Ansariel> Undo CHUI-90 and make avatar inspector useful again
|
||||
// Shows/hides moderator panel depending on voice state
|
||||
void updateModeratorPanel();
|
||||
|
||||
// Moderator ability to enable/disable voice chat for avatar
|
||||
void toggleSelectedVoice(bool enabled);
|
||||
// </FS:Ansariel>
|
||||
|
||||
// Button callbacks
|
||||
void onClickMuteVolume();
|
||||
void onVolumeChange(const LLSD& data);
|
||||
|
||||
|
||||
// <FS:Ansariel> Undo CHUI-90 and make avatar inspector useful again
|
||||
void onClickAddFriend();
|
||||
void onClickViewProfile();
|
||||
void onClickIM();
|
||||
void onClickCall();
|
||||
void onClickTeleport();
|
||||
void onClickInviteToGroup();
|
||||
void onClickPay();
|
||||
void onClickShare();
|
||||
void onToggleMute();
|
||||
void onClickReport();
|
||||
void onClickFreeze();
|
||||
void onClickEject();
|
||||
void onClickKick();
|
||||
void onClickCSR();
|
||||
void onClickZoomIn();
|
||||
void onClickFindOnMap();
|
||||
bool onVisibleFindOnMap();
|
||||
bool onVisibleEject();
|
||||
bool onVisibleFreeze();
|
||||
bool onVisibleZoomIn();
|
||||
bool enableMute();
|
||||
bool enableUnmute();
|
||||
bool enableTeleportOffer();
|
||||
bool godModeEnabled();
|
||||
|
||||
// Is used to determine if "Add friend" option should be enabled in gear menu
|
||||
bool isNotFriend();
|
||||
// </FS:Ansariel>
|
||||
|
||||
void onAvatarNameCache(const LLUUID& agent_id,
|
||||
const LLAvatarName& av_name);
|
||||
|
||||
|
|
@ -158,6 +221,39 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
|
|||
mPropertiesRequest(NULL),
|
||||
mAvatarNameCacheConnection()
|
||||
{
|
||||
// <FS:Ansariel> Undo CHUI-90 and make avatar inspector useful again
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.ViewProfile", boost::bind(&LLInspectAvatar::onClickViewProfile, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.AddFriend", boost::bind(&LLInspectAvatar::onClickAddFriend, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.IM",
|
||||
boost::bind(&LLInspectAvatar::onClickIM, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Call", boost::bind(&LLInspectAvatar::onClickCall, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Teleport", boost::bind(&LLInspectAvatar::onClickTeleport, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.InviteToGroup", boost::bind(&LLInspectAvatar::onClickInviteToGroup, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Pay", boost::bind(&LLInspectAvatar::onClickPay, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Share", boost::bind(&LLInspectAvatar::onClickShare, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.ToggleMute", boost::bind(&LLInspectAvatar::onToggleMute, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Freeze", boost::bind(&LLInspectAvatar::onClickFreeze, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Eject", boost::bind(&LLInspectAvatar::onClickEject, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Kick", boost::bind(&LLInspectAvatar::onClickKick, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.CSR", boost::bind(&LLInspectAvatar::onClickCSR, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.Report", boost::bind(&LLInspectAvatar::onClickReport, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.FindOnMap", boost::bind(&LLInspectAvatar::onClickFindOnMap, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.ZoomIn", boost::bind(&LLInspectAvatar::onClickZoomIn, this));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.DisableVoice", boost::bind(&LLInspectAvatar::toggleSelectedVoice, this, false));
|
||||
mCommitCallbackRegistrar.add("InspectAvatar.EnableVoice", boost::bind(&LLInspectAvatar::toggleSelectedVoice, this, true));
|
||||
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.EnableGod", boost::bind(&LLInspectAvatar::godModeEnabled, this));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.VisibleFindOnMap", boost::bind(&LLInspectAvatar::onVisibleFindOnMap, this));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.VisibleEject", boost::bind(&LLInspectAvatar::onVisibleEject, this));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.VisibleFreeze", boost::bind(&LLInspectAvatar::onVisibleFreeze, this));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.VisibleZoomIn", boost::bind(&LLInspectAvatar::onVisibleZoomIn, this));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.Gear.Enable", boost::bind(&LLInspectAvatar::isNotFriend, this));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableCall", boost::bind(&LLAvatarActions::canCall));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableTeleportOffer", boost::bind(&LLInspectAvatar::enableTeleportOffer, this));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.EnableMute", boost::bind(&LLInspectAvatar::enableMute, this));
|
||||
mEnableCallbackRegistrar.add("InspectAvatar.EnableUnmute", boost::bind(&LLInspectAvatar::enableUnmute, this));
|
||||
// </FS:Ansariel>
|
||||
|
||||
// can't make the properties request until the widgets are constructed
|
||||
// as it might return immediately, so do it in onOpen.
|
||||
|
||||
|
|
@ -182,6 +278,14 @@ LLInspectAvatar::~LLInspectAvatar()
|
|||
/*virtual*/
|
||||
BOOL LLInspectAvatar::postBuild(void)
|
||||
{
|
||||
// <FS:Ansariel> Undo CHUI-90 and make avatar inspector useful again
|
||||
getChild<LLUICtrl>("add_friend_btn")->setCommitCallback(
|
||||
boost::bind(&LLInspectAvatar::onClickAddFriend, this) );
|
||||
|
||||
getChild<LLUICtrl>("view_profile_btn")->setCommitCallback(
|
||||
boost::bind(&LLInspectAvatar::onClickViewProfile, this) );
|
||||
// </FS:Ansariel>
|
||||
|
||||
getChild<LLUICtrl>("mute_btn")->setCommitCallback(
|
||||
boost::bind(&LLInspectAvatar::onClickMuteVolume, this) );
|
||||
|
||||
|
|
@ -202,6 +306,13 @@ void LLInspectAvatar::onOpen(const LLSD& data)
|
|||
// Extract appropriate avatar id
|
||||
mAvatarID = data["avatar_id"];
|
||||
|
||||
// <FS:Ansariel> Undo CHUI-90 and make avatar inspector useful again
|
||||
BOOL self = mAvatarID == gAgent.getID();
|
||||
|
||||
getChild<LLUICtrl>("gear_self_btn")->setVisible(self);
|
||||
getChild<LLUICtrl>("gear_btn")->setVisible(!self);
|
||||
// </FS:Ansariel>
|
||||
|
||||
// Position the inspector relative to the mouse cursor
|
||||
// Similar to how tooltips are positioned
|
||||
// See LLToolTipMgr::createToolTip
|
||||
|
|
@ -215,14 +326,26 @@ void LLInspectAvatar::onOpen(const LLSD& data)
|
|||
}
|
||||
|
||||
// Generate link to avatar profile.
|
||||
getChild<LLUICtrl>("avatar_profile_link")->setTextArg("[LINK]", LLSLURL("agent", mAvatarID, "about").getSLURLString());
|
||||
// <FS:Ansariel> Undo CHUI-90 and make avatar inspector useful again
|
||||
//getChild<LLUICtrl>("avatar_profile_link")->setTextArg("[LINK]", LLSLURL("agent", mAvatarID, "about").getSLURLString());
|
||||
|
||||
// can't call from constructor as widgets are not built yet
|
||||
requestUpdate();
|
||||
|
||||
updateVolumeSlider();
|
||||
|
||||
// <FS:Ansariel> Undo CHUI-90 and make avatar inspector useful again
|
||||
updateModeratorPanel();
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Undo CHUI-90 and make avatar inspector useful again
|
||||
// virtual
|
||||
void LLInspectAvatar::onClose(bool app_quitting)
|
||||
{
|
||||
getChild<LLMenuButton>("gear_btn")->hideMenu();
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
void LLInspectAvatar::requestUpdate()
|
||||
{
|
||||
// Don't make network requests when spawning from the debug menu at the
|
||||
|
|
@ -249,6 +372,27 @@ void LLInspectAvatar::requestUpdate()
|
|||
delete mPropertiesRequest;
|
||||
mPropertiesRequest = new LLFetchAvatarData(mAvatarID, this);
|
||||
|
||||
// <FS:Ansariel> Undo CHUI-90 and make avatar inspector useful again
|
||||
// You can't re-add someone as a friend if they are already your friend
|
||||
bool is_friend = LLAvatarTracker::instance().getBuddyInfo(mAvatarID) != NULL;
|
||||
bool is_self = (mAvatarID == gAgentID);
|
||||
if (is_self)
|
||||
{
|
||||
getChild<LLUICtrl>("add_friend_btn")->setVisible(false);
|
||||
getChild<LLUICtrl>("im_btn")->setVisible(false);
|
||||
}
|
||||
else if (is_friend)
|
||||
{
|
||||
getChild<LLUICtrl>("add_friend_btn")->setVisible(false);
|
||||
getChild<LLUICtrl>("im_btn")->setVisible(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
getChild<LLUICtrl>("add_friend_btn")->setVisible(true);
|
||||
getChild<LLUICtrl>("im_btn")->setVisible(false);
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
// Use an avatar_icon even though the image id will come down with the
|
||||
// avatar properties because the avatar_icon code maintains a cache of icons
|
||||
// and this may result in the image being visible sooner.
|
||||
|
|
@ -399,6 +543,352 @@ void LLInspectAvatar::onAvatarNameCache(
|
|||
}
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Undo CHUI-90 and make avatar inspector useful again
|
||||
// For the avatar inspector, we only want to unpause the fade timer
|
||||
// if neither the gear menu or self gear menu are open
|
||||
void LLInspectAvatar::onMouseLeave(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
LLToggleableMenu* gear_menu = getChild<LLMenuButton>("gear_btn")->getMenu();
|
||||
LLToggleableMenu* gear_menu_self = getChild<LLMenuButton>("gear_self_btn")->getMenu();
|
||||
if ( gear_menu && gear_menu->getVisible() &&
|
||||
gear_menu_self && gear_menu_self->getVisible() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if(childHasVisiblePopupMenu())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
mOpenTimer.unpause();
|
||||
}
|
||||
|
||||
void LLInspectAvatar::updateModeratorPanel()
|
||||
{
|
||||
bool enable_moderator_panel = false;
|
||||
|
||||
if (LLVoiceChannel::getCurrentVoiceChannel() &&
|
||||
mAvatarID != gAgent.getID())
|
||||
{
|
||||
LLUUID session_id = LLVoiceChannel::getCurrentVoiceChannel()->getSessionID();
|
||||
|
||||
if (session_id != LLUUID::null)
|
||||
{
|
||||
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
|
||||
|
||||
if (speaker_mgr)
|
||||
{
|
||||
LLPointer<LLSpeaker> self_speakerp = speaker_mgr->findSpeaker(gAgent.getID());
|
||||
LLPointer<LLSpeaker> selected_speakerp = speaker_mgr->findSpeaker(mAvatarID);
|
||||
|
||||
if(speaker_mgr->isVoiceActive() && selected_speakerp &&
|
||||
selected_speakerp->isInVoiceChannel() &&
|
||||
((self_speakerp && self_speakerp->mIsModerator) || gAgent.isGodlike()))
|
||||
{
|
||||
getChild<LLUICtrl>("enable_voice")->setVisible(selected_speakerp->mModeratorMutedVoice);
|
||||
getChild<LLUICtrl>("disable_voice")->setVisible(!selected_speakerp->mModeratorMutedVoice);
|
||||
|
||||
enable_moderator_panel = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (enable_moderator_panel)
|
||||
{
|
||||
if (!getChild<LLUICtrl>("moderator_panel")->getVisible())
|
||||
{
|
||||
getChild<LLUICtrl>("moderator_panel")->setVisible(true);
|
||||
// stretch the floater so it can accommodate the moderator panel
|
||||
reshape(getRect().getWidth(), getRect().getHeight() + getChild<LLUICtrl>("moderator_panel")->getRect().getHeight());
|
||||
}
|
||||
}
|
||||
else if (getChild<LLUICtrl>("moderator_panel")->getVisible())
|
||||
{
|
||||
getChild<LLUICtrl>("moderator_panel")->setVisible(false);
|
||||
// shrink the inspector floater back to original size
|
||||
reshape(getRect().getWidth(), getRect().getHeight() - getChild<LLUICtrl>("moderator_panel")->getRect().getHeight());
|
||||
}
|
||||
}
|
||||
|
||||
void LLInspectAvatar::toggleSelectedVoice(bool enabled)
|
||||
{
|
||||
LLUUID session_id = LLVoiceChannel::getCurrentVoiceChannel()->getSessionID();
|
||||
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
|
||||
|
||||
if (speaker_mgr)
|
||||
{
|
||||
if (!gAgent.getRegion())
|
||||
return;
|
||||
|
||||
std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
|
||||
LLSD data;
|
||||
data["method"] = "mute update";
|
||||
data["session-id"] = session_id;
|
||||
data["params"] = LLSD::emptyMap();
|
||||
data["params"]["agent_id"] = mAvatarID;
|
||||
data["params"]["mute_info"] = LLSD::emptyMap();
|
||||
// ctrl value represents ability to type, so invert
|
||||
data["params"]["mute_info"]["voice"] = !enabled;
|
||||
|
||||
class MuteVoiceResponder : public LLHTTPClient::Responder
|
||||
{
|
||||
public:
|
||||
MuteVoiceResponder(const LLUUID& session_id)
|
||||
{
|
||||
mSessionID = session_id;
|
||||
}
|
||||
|
||||
virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content)
|
||||
{
|
||||
llwarns << "MuteVoiceResponder error [status:" << status << "]: " << content << llendl;
|
||||
|
||||
if ( gIMMgr )
|
||||
{
|
||||
//403 == you're not a mod
|
||||
//should be disabled if you're not a moderator
|
||||
if ( 403 == status )
|
||||
{
|
||||
gIMMgr->showSessionEventError(
|
||||
"mute",
|
||||
"not_a_moderator",
|
||||
mSessionID);
|
||||
}
|
||||
else
|
||||
{
|
||||
gIMMgr->showSessionEventError(
|
||||
"mute",
|
||||
"generic",
|
||||
mSessionID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
LLUUID mSessionID;
|
||||
};
|
||||
|
||||
LLHTTPClient::post(
|
||||
url,
|
||||
data,
|
||||
new MuteVoiceResponder(speaker_mgr->getSessionID()));
|
||||
}
|
||||
|
||||
closeFloater();
|
||||
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickAddFriend()
|
||||
{
|
||||
LLAvatarActions::requestFriendshipDialog(mAvatarID, mAvatarName.getDisplayName());
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickViewProfile()
|
||||
{
|
||||
LLAvatarActions::showProfile(mAvatarID);
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
bool LLInspectAvatar::isNotFriend()
|
||||
{
|
||||
return !LLAvatarActions::isFriend(mAvatarID);
|
||||
}
|
||||
|
||||
bool LLInspectAvatar::onVisibleFindOnMap()
|
||||
{
|
||||
return gAgent.isGodlike() || is_agent_mappable(mAvatarID);
|
||||
}
|
||||
|
||||
bool LLInspectAvatar::onVisibleEject()
|
||||
{
|
||||
return enable_freeze_eject( LLSD(mAvatarID) );
|
||||
}
|
||||
|
||||
bool LLInspectAvatar::onVisibleFreeze()
|
||||
{
|
||||
// either user is a god and can do long distance freeze
|
||||
// or check for target proximity and permissions
|
||||
return gAgent.isGodlike() || enable_freeze_eject(LLSD(mAvatarID));
|
||||
}
|
||||
|
||||
bool LLInspectAvatar::onVisibleZoomIn()
|
||||
{
|
||||
return gObjectList.findObject(mAvatarID);
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickIM()
|
||||
{
|
||||
LLAvatarActions::startIM(mAvatarID);
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickCall()
|
||||
{
|
||||
LLAvatarActions::startCall(mAvatarID);
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickTeleport()
|
||||
{
|
||||
LLAvatarActions::offerTeleport(mAvatarID);
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickInviteToGroup()
|
||||
{
|
||||
LLAvatarActions::inviteToGroup(mAvatarID);
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickPay()
|
||||
{
|
||||
LLAvatarActions::pay(mAvatarID);
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickShare()
|
||||
{
|
||||
LLAvatarActions::share(mAvatarID);
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onToggleMute()
|
||||
{
|
||||
LLMute mute(mAvatarID, mAvatarName.getDisplayName(), LLMute::AGENT);
|
||||
|
||||
if (LLMuteList::getInstance()->isMuted(mute.mID, mute.mName))
|
||||
{
|
||||
LLMuteList::getInstance()->remove(mute);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLMuteList::getInstance()->add(mute);
|
||||
}
|
||||
|
||||
LLPanelBlockedList::showPanelAndSelect(mute.mID);
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickReport()
|
||||
{
|
||||
LLFloaterReporter::showFromAvatar(mAvatarID, mAvatarName.getCompleteName());
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
bool godlike_freeze(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
|
||||
switch (option)
|
||||
{
|
||||
case 0:
|
||||
LLAvatarActions::freeze(avatar_id);
|
||||
break;
|
||||
case 1:
|
||||
LLAvatarActions::unfreeze(avatar_id);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickFreeze()
|
||||
{
|
||||
if (gAgent.isGodlike())
|
||||
{
|
||||
// use godlike freeze-at-a-distance, with confirmation
|
||||
LLNotificationsUtil::add("FreezeAvatar",
|
||||
LLSD(),
|
||||
LLSD().with("avatar_id", mAvatarID),
|
||||
godlike_freeze);
|
||||
}
|
||||
else
|
||||
{
|
||||
// use default "local" version of freezing that requires avatar to be in range
|
||||
handle_avatar_freeze( LLSD(mAvatarID) );
|
||||
}
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickEject()
|
||||
{
|
||||
handle_avatar_eject( LLSD(mAvatarID) );
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickKick()
|
||||
{
|
||||
LLAvatarActions::kick(mAvatarID);
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickCSR()
|
||||
{
|
||||
std::string name;
|
||||
gCacheName->getFullName(mAvatarID, name);
|
||||
LLAvatarActions::csr(mAvatarID, name);
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickZoomIn()
|
||||
{
|
||||
handle_zoom_to_object(mAvatarID);
|
||||
closeFloater();
|
||||
}
|
||||
|
||||
void LLInspectAvatar::onClickFindOnMap()
|
||||
{
|
||||
gFloaterWorldMap->trackAvatar(mAvatarID, mAvatarName.getDisplayName());
|
||||
LLFloaterReg::showInstance("world_map");
|
||||
}
|
||||
|
||||
|
||||
bool LLInspectAvatar::enableMute()
|
||||
{
|
||||
bool is_linden = LLStringUtil::endsWith(mAvatarName.getDisplayName(), " Linden");
|
||||
bool is_self = mAvatarID == gAgent.getID();
|
||||
|
||||
if (!is_linden && !is_self && !LLMuteList::getInstance()->isMuted(mAvatarID, mAvatarName.getDisplayName()))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool LLInspectAvatar::enableUnmute()
|
||||
{
|
||||
bool is_linden = LLStringUtil::endsWith(mAvatarName.getDisplayName(), " Linden");
|
||||
bool is_self = mAvatarID == gAgent.getID();
|
||||
|
||||
if (!is_linden && !is_self && LLMuteList::getInstance()->isMuted(mAvatarID, mAvatarName.getDisplayName()))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool LLInspectAvatar::enableTeleportOffer()
|
||||
{
|
||||
return LLAvatarActions::canOfferTeleport(mAvatarID);
|
||||
}
|
||||
|
||||
bool LLInspectAvatar::godModeEnabled()
|
||||
{
|
||||
return gAgent.isGodlike();
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// LLInspectAvatarUtil
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -2,14 +2,14 @@
|
|||
<!--
|
||||
Not can_close / no title to avoid window chrome
|
||||
Single instance - only have one at a time, recycle it each spawn
|
||||
-->
|
||||
-->
|
||||
<floater
|
||||
legacy_header_height="25"
|
||||
bevel_style="in"
|
||||
bg_opaque_image="Inspector_Background"
|
||||
can_close="false"
|
||||
can_minimize="false"
|
||||
height="160"
|
||||
height="164"
|
||||
layout="topleft"
|
||||
name="inspect_avatar"
|
||||
single_instance="true"
|
||||
|
|
@ -98,13 +98,13 @@
|
|||
follows="top|left"
|
||||
height="23"
|
||||
increment="0.01"
|
||||
left="10"
|
||||
left="1"
|
||||
max_val="0.95"
|
||||
min_val="0.05"
|
||||
name="volume_slider"
|
||||
show_text="false"
|
||||
tool_tip="Voice volume"
|
||||
top_pad="5"
|
||||
top_pad="0"
|
||||
value="0.5"
|
||||
width="200" />
|
||||
<button
|
||||
|
|
@ -116,21 +116,10 @@
|
|||
image_selected="AudioMute_Off"
|
||||
image_unselected="Audio_Off"
|
||||
is_toggle="true"
|
||||
left_pad="5"
|
||||
left_pad="0"
|
||||
top_delta="4"
|
||||
name="mute_btn"
|
||||
width="16" />
|
||||
<text
|
||||
follows="top|left"
|
||||
height="16"
|
||||
left="8"
|
||||
name="avatar_profile_link"
|
||||
font="SansSerifSmall"
|
||||
text_color="White"
|
||||
top_pad="5"
|
||||
translate="false"
|
||||
value="[[LINK] View full profile]"
|
||||
width="175" />
|
||||
<avatar_icon
|
||||
follows="top|left"
|
||||
height="38"
|
||||
|
|
@ -141,4 +130,83 @@
|
|||
name="avatar_icon"
|
||||
top="10"
|
||||
width="38" />
|
||||
<!-- Overlapping buttons for default actions
|
||||
llinspectavatar.cpp makes visible the most likely default action
|
||||
-->
|
||||
<button
|
||||
follows="top|left"
|
||||
height="20"
|
||||
label="Add Friend"
|
||||
left="8"
|
||||
top="135"
|
||||
name="add_friend_btn"
|
||||
width="90" />
|
||||
<button
|
||||
follows="top|left"
|
||||
height="20"
|
||||
label="IM"
|
||||
left_delta="0"
|
||||
top_delta="0"
|
||||
name="im_btn"
|
||||
width="80"
|
||||
commit_callback.function="InspectAvatar.IM"/>
|
||||
<button
|
||||
follows="top|left"
|
||||
height="20"
|
||||
label="Profile"
|
||||
layout="topleft"
|
||||
name="view_profile_btn"
|
||||
left_delta="96"
|
||||
top_delta="0"
|
||||
tab_stop="false"
|
||||
width="80" />
|
||||
<!-- gear buttons here -->
|
||||
<menu_button
|
||||
follows="top|left"
|
||||
height="20"
|
||||
layout="topleft"
|
||||
image_overlay="OptionsMenu_Off"
|
||||
menu_filename="menu_inspect_avatar_gear.xml"
|
||||
name="gear_btn"
|
||||
right="-5"
|
||||
top_delta="0"
|
||||
width="35" />
|
||||
<menu_button
|
||||
follows="top|left"
|
||||
height="20"
|
||||
image_overlay="OptionsMenu_Off"
|
||||
menu_filename="menu_inspect_self_gear.xml"
|
||||
name="gear_self_btn"
|
||||
right="-5"
|
||||
top_delta="0"
|
||||
width="35" />
|
||||
<panel
|
||||
follows="top|left"
|
||||
top="164"
|
||||
left="0"
|
||||
height="60"
|
||||
width="228"
|
||||
visible="false"
|
||||
background_visible="true"
|
||||
name="moderator_panel"
|
||||
background_opaque="true"
|
||||
bg_opaque_color="MouseGray">
|
||||
<button
|
||||
name="disable_voice"
|
||||
label="Disable Voice"
|
||||
top="20"
|
||||
width="95"
|
||||
height="20"
|
||||
left="10"
|
||||
commit_callback.function="InspectAvatar.DisableVoice"/>
|
||||
<button
|
||||
name="enable_voice"
|
||||
label="Enable Voice"
|
||||
top="20"
|
||||
width="95"
|
||||
height="20"
|
||||
left="10"
|
||||
visible="false"
|
||||
commit_callback.function="InspectAvatar.EnableVoice"/>
|
||||
</panel>
|
||||
</floater>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,151 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<toggleable_menu
|
||||
create_jump_keys="true"
|
||||
layout="topleft"
|
||||
mouse_opaque="false"
|
||||
visible="false"
|
||||
name="Gear Menu">
|
||||
<menu_item_call
|
||||
label="View Profile"
|
||||
enabled="true"
|
||||
name="view_profile">
|
||||
<menu_item_call.on_click
|
||||
function="InspectAvatar.ViewProfile"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Add Friend"
|
||||
name="add_friend">
|
||||
<menu_item_call.on_click
|
||||
function="InspectAvatar.AddFriend"/>
|
||||
<menu_item_call.on_enable
|
||||
function="InspectAvatar.Gear.Enable"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="IM"
|
||||
name="im">
|
||||
<menu_item_call.on_click
|
||||
function="InspectAvatar.IM"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Call"
|
||||
enabled="true"
|
||||
name="call">
|
||||
<menu_item_call.on_click
|
||||
function="InspectAvatar.Call"/>
|
||||
<menu_item_call.on_enable
|
||||
function="InspectAvatar.Gear.EnableCall"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Teleport"
|
||||
name="teleport">
|
||||
<menu_item_call.on_click
|
||||
function="InspectAvatar.Teleport"/>
|
||||
<menu_item_call.on_enable
|
||||
function="InspectAvatar.Gear.EnableTeleportOffer"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Invite to Group"
|
||||
name="invite_to_group">
|
||||
<menu_item_call.on_click
|
||||
function="InspectAvatar.InviteToGroup"/>
|
||||
</menu_item_call>
|
||||
<menu_item_separator />
|
||||
<menu_item_call
|
||||
label="Block"
|
||||
name="block">
|
||||
<menu_item_call.on_click
|
||||
function="InspectAvatar.ToggleMute"/>
|
||||
<menu_item_call.on_visible
|
||||
function="InspectAvatar.EnableMute" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Unblock"
|
||||
name="unblock">
|
||||
<menu_item_call.on_click
|
||||
function="InspectAvatar.ToggleMute"/>
|
||||
<menu_item_call.on_visible
|
||||
function="InspectAvatar.EnableUnmute" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Report"
|
||||
name="report">
|
||||
<menu_item_call.on_click
|
||||
function="InspectAvatar.Report"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Freeze"
|
||||
name="freeze">
|
||||
<menu_item_call.on_click
|
||||
function="InspectAvatar.Freeze"/>
|
||||
<menu_item_call.on_visible
|
||||
function="InspectAvatar.VisibleFreeze"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Eject"
|
||||
name="eject">
|
||||
<menu_item_call.on_click
|
||||
function="InspectAvatar.Eject"/>
|
||||
<menu_item_call.on_visible
|
||||
function="InspectAvatar.VisibleEject"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Kick"
|
||||
name="kick">
|
||||
<menu_item_call.on_click
|
||||
function="InspectAvatar.Kick"/>
|
||||
<menu_item_call.on_visible
|
||||
function="InspectAvatar.EnableGod"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="CSR"
|
||||
name="csr">
|
||||
<menu_item_call.on_click
|
||||
function="InspectAvatar.CSR" />
|
||||
<menu_item_call.on_visible
|
||||
function="InspectAvatar.EnableGod" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Debug Textures"
|
||||
name="debug">
|
||||
<menu_item_call.on_click
|
||||
function="Avatar.Debug"/>
|
||||
<menu_item_call.on_visible
|
||||
function="IsGodCustomerService"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Dump XML"
|
||||
name="Dump XML">
|
||||
<menu_item_call.on_click
|
||||
function="Advanced.AppearanceToXML" />
|
||||
<menu_item_call.on_visible
|
||||
function="Advanced.EnableAppearanceToXML"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Find On Map"
|
||||
name="find_on_map">
|
||||
<menu_item_call.on_click
|
||||
function="InspectAvatar.FindOnMap"/>
|
||||
<menu_item_call.on_visible
|
||||
function="InspectAvatar.VisibleFindOnMap"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Zoom In"
|
||||
name="zoom_in">
|
||||
<menu_item_call.on_click
|
||||
function="InspectAvatar.ZoomIn"/>
|
||||
<menu_item_call.on_visible
|
||||
function="InspectAvatar.VisibleZoomIn"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Pay"
|
||||
name="pay">
|
||||
<menu_item_call.on_click
|
||||
function="InspectAvatar.Pay"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Share"
|
||||
name="share">
|
||||
<menu_item_call.on_click
|
||||
function="InspectAvatar.Share"/>
|
||||
</menu_item_call>
|
||||
</toggleable_menu>
|
||||
|
|
@ -0,0 +1,260 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<toggleable_menu
|
||||
layout="topleft"
|
||||
name="Self Pie">
|
||||
<menu_item_call
|
||||
label="Sit Down"
|
||||
layout="topleft"
|
||||
name="Sit Down Here">
|
||||
<menu_item_call.on_click
|
||||
function="Self.SitDown"
|
||||
parameter="" />
|
||||
<menu_item_call.on_enable
|
||||
function="Self.EnableSitDown" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Stand Up"
|
||||
layout="topleft"
|
||||
name="Stand Up">
|
||||
<menu_item_call.on_click
|
||||
function="Self.StandUp"
|
||||
parameter="" />
|
||||
<menu_item_call.on_enable
|
||||
function="Self.EnableStandUp" />
|
||||
</menu_item_call>
|
||||
<context_menu
|
||||
label="Take Off"
|
||||
layout="topleft"
|
||||
name="Take Off >">
|
||||
<context_menu
|
||||
label="Clothes"
|
||||
layout="topleft"
|
||||
name="Clothes >">
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Shirt"
|
||||
layout="topleft"
|
||||
name="Shirt">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="shirt" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="shirt" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Pants"
|
||||
layout="topleft"
|
||||
name="Pants">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="pants" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="pants" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Skirt"
|
||||
layout="topleft"
|
||||
name="Skirt">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="skirt" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="skirt" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Shoes"
|
||||
layout="topleft"
|
||||
name="Shoes">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="shoes" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="shoes" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Socks"
|
||||
layout="topleft"
|
||||
name="Socks">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="socks" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="socks" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Jacket"
|
||||
layout="topleft"
|
||||
name="Jacket">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="jacket" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="jacket" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Gloves"
|
||||
layout="topleft"
|
||||
name="Gloves">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="gloves" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="gloves" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Undershirt"
|
||||
layout="topleft"
|
||||
name="Self Undershirt">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="undershirt" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="undershirt" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Underpants"
|
||||
layout="topleft"
|
||||
name="Self Underpants">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="underpants" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="underpants" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Tattoo"
|
||||
layout="topleft"
|
||||
name="Self Tattoo">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="tattoo" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="tattoo" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
enabled="false"
|
||||
label="Alpha"
|
||||
layout="topleft"
|
||||
name="Self Alpha">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="alpha" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableTakeOff"
|
||||
parameter="alpha" />
|
||||
</menu_item_call>
|
||||
<menu_item_separator
|
||||
layout="topleft" />
|
||||
<menu_item_call
|
||||
label="All Clothes"
|
||||
layout="topleft"
|
||||
name="All Clothes">
|
||||
<menu_item_call.on_click
|
||||
function="Edit.TakeOff"
|
||||
parameter="all" />
|
||||
</menu_item_call>
|
||||
</context_menu>
|
||||
<context_menu
|
||||
label="HUD"
|
||||
layout="topleft"
|
||||
name="Object Detach HUD" />
|
||||
<context_menu
|
||||
label="Detach"
|
||||
layout="topleft"
|
||||
name="Object Detach" />
|
||||
<menu_item_call
|
||||
label="Detach All"
|
||||
layout="topleft"
|
||||
name="Detach All">
|
||||
<menu_item_call.on_click
|
||||
function="Self.RemoveAllAttachments"
|
||||
parameter="" />
|
||||
<menu_item_call.on_enable
|
||||
function="Self.EnableRemoveAllAttachments" />
|
||||
</menu_item_call>
|
||||
</context_menu>
|
||||
<menu_item_call
|
||||
label="Change Outfit"
|
||||
layout="topleft"
|
||||
name="Chenge Outfit">
|
||||
<menu_item_call.on_click
|
||||
function="CustomizeAvatar" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableCustomizeAvatar" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Edit Outfit"
|
||||
layout="topleft"
|
||||
name="Edit Outfit">
|
||||
<menu_item_call.on_click
|
||||
function="EditOutfit" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableCustomizeAvatar" />
|
||||
</menu_item_call>
|
||||
<menu_item_call label="Edit Shape"
|
||||
layout="topleft"
|
||||
name="Edit My Shape">
|
||||
<menu_item_call.on_click
|
||||
function="EditShape" />
|
||||
<menu_item_call.on_enable
|
||||
function="Edit.EnableEditShape" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Friends"
|
||||
layout="topleft"
|
||||
name="Friends...">
|
||||
<menu_item_call.on_click
|
||||
function="SideTray.PanelPeopleTab"
|
||||
parameter="friends_panel" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Groups"
|
||||
layout="topleft"
|
||||
name="Groups...">
|
||||
<menu_item_call.on_click
|
||||
function="SideTray.PanelPeopleTab"
|
||||
parameter="groups_panel" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Profile"
|
||||
layout="topleft"
|
||||
name="Profile...">
|
||||
<menu_item_call.on_click
|
||||
function="ShowAgentProfile"
|
||||
parameter="agent" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Debug Textures"
|
||||
name="Debug...">
|
||||
<menu_item_call.on_click
|
||||
function="Avatar.Debug" />
|
||||
<menu_item_call.on_visible
|
||||
function="IsGodCustomerService"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Dump XML"
|
||||
name="Dump XML">
|
||||
<menu_item_call.on_click
|
||||
function="Advanced.AppearanceToXML" />
|
||||
<menu_item_call.on_visible
|
||||
function="Advanced.EnableAppearanceToXML"/>
|
||||
</menu_item_call>
|
||||
</toggleable_menu>
|
||||
Loading…
Reference in New Issue