Newer
Older
Steven Bennetts
committed
* @file llpanelprofile.cpp
* @brief Profile panel implementation
*
* $LicenseInfo:firstyear=2009&license=viewerlgpl$
Steven Bennetts
committed
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
Steven Bennetts
committed
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llpanelprofile.h"
// Common
#include "llavatarnamecache.h"
#include "llslurl.h"
#include "lldateutil.h" //ageFromDate
// UI
#include "llavatariconctrl.h"
andreykproductengine
committed
#include "llclipboard.h"
#include "llcheckboxctrl.h"
#include "lllineeditor.h"
#include "llloadingindicator.h"
#include "llmenubutton.h"
#include "lltabcontainer.h"
#include "lltextbox.h"
#include "lltexteditor.h"
#include "lltexturectrl.h"
#include "lltoggleablemenu.h"
#include "llgrouplist.h"
// Newview
#include "llagent.h" //gAgent
#include "llagentpicksinfo.h"
#include "llavatarpropertiesprocessor.h"
#include "llcallingcard.h"
#include "llcommandhandler.h"
#include "llfloaterreg.h"
#include "llfirstuse.h"
#include "llgroupactions.h"
#include "llmutelist.h"
#include "llpanelblockedlist.h"
#include "llpanelprofileclassifieds.h"
#include "llpanelprofilepicks.h"
#include "lltrans.h"
#include "llviewercontrol.h"
Mnikolenko Productengine
committed
#include "llviewermenu.h" //is_agent_mappable
Richard Linden
committed
#include "llweb.h"
Steven Bennetts
committed
static LLPanelInjector<LLPanelProfileSecondLife> t_panel_profile_secondlife("panel_profile_secondlife");
static LLPanelInjector<LLPanelProfileWeb> t_panel_web("panel_profile_web");
static LLPanelInjector<LLPanelProfileInterests> t_panel_interests("panel_profile_interests");
static LLPanelInjector<LLPanelProfilePicks> t_panel_picks("panel_profile_picks");
static LLPanelInjector<LLPanelProfileFirstLife> t_panel_firstlife("panel_profile_firstlife");
static LLPanelInjector<LLPanelProfileNotes> t_panel_notes("panel_profile_notes");
static LLPanelInjector<LLPanelProfile> t_panel_profile("panel_profile");
static const std::string PANEL_SECONDLIFE = "panel_profile_secondlife";
static const std::string PANEL_WEB = "panel_profile_web";
static const std::string PANEL_INTERESTS = "panel_profile_interests";
static const std::string PANEL_PICKS = "panel_profile_picks";
static const std::string PANEL_CLASSIFIEDS = "panel_profile_classifieds";
static const std::string PANEL_FIRSTLIFE = "panel_profile_firstlife";
static const std::string PANEL_NOTES = "panel_profile_notes";
//////////////////////////////////////////////////////////////////////////
// LLProfileHandler
class LLProfileHandler : public LLCommandHandler
{
public:
// requires trusted browser to trigger
LLProfileHandler() : LLCommandHandler("profile", UNTRUSTED_THROTTLE) { }
bool handle(const LLSD& params, const LLSD& query_map,
LLMediaCtrl* web)
{
if (params.size() < 1) return false;
std::string agent_name = params[0];
LL_INFOS() << "Profile, agent_name " << agent_name << LL_ENDL;
std::string url = getProfileURL(agent_name);
LLWeb::loadURLInternal(url);
return true;
}
};
LLProfileHandler gProfileHandler;
//////////////////////////////////////////////////////////////////////////
// LLAgentHandler
class LLAgentHandler : public LLCommandHandler
{
public:
// requires trusted browser to trigger
LLAgentHandler() : LLCommandHandler("agent", UNTRUSTED_THROTTLE) { }
James Cook
committed
LLUUID avatar_id;
if (!avatar_id.set(params[0], FALSE))
const std::string verb = params[1].asString();
if (verb == "about")
James Cook
committed
LLAvatarActions::showProfile(avatar_id);
return true;
}
if (verb == "inspect")
James Cook
committed
{
LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", avatar_id));
if (verb == "im")
{
LLAvatarActions::startIM(avatar_id);
return true;
}
if (verb == "pay")
{
if (!LLUI::getInstance()->mSettingGroups["config"]->getBOOL("EnableAvatarPay"))
leyla
committed
{
LLNotificationsUtil::add("NoAvatarPay", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
return true;
}
LLAvatarActions::pay(avatar_id);
return true;
}
if (verb == "offerteleport")
{
LLAvatarActions::offerTeleport(avatar_id);
return true;
}
if (verb == "requestfriend")
{
LLAvatarActions::requestFriendshipDialog(avatar_id);
return true;
}
if (verb == "removefriend")
{
LLAvatarActions::removeFriendDialog(avatar_id);
return true;
}
if (verb == "mute")
{
if (! LLAvatarActions::isBlocked(avatar_id))
{
LLAvatarActions::toggleBlock(avatar_id);
}
return true;
}
if (verb == "unmute")
{
if (LLAvatarActions::isBlocked(avatar_id))
{
LLAvatarActions::toggleBlock(avatar_id);
}
return true;
}
if (verb == "block")
{
if (params.size() > 2)
{
const std::string object_name = LLURI::unescape(params[2].asString());
LLMute mute(avatar_id, object_name, LLMute::OBJECT);
LLMuteList::getInstance()->add(mute);
LLPanelBlockedList::showPanelAndSelect(mute.mID);
}
return true;
}
if (verb == "unblock")
{
if (params.size() > 2)
{
const std::string object_name = params[2].asString();
LLMute mute(avatar_id, object_name, LLMute::OBJECT);
LLMuteList::getInstance()->remove(mute);
}
return true;
}
return false;
}
};
LLAgentHandler gAgentHandler;
//////////////////////////////////////////////////////////////////////////
// LLPanelProfileSecondLife
LLPanelProfileSecondLife::LLPanelProfileSecondLife()
: LLPanelProfileTab()
, mStatusText(NULL)
, mAvatarNameCacheConnection()
LLPanelProfileSecondLife::~LLPanelProfileSecondLife()
Paul ProductEngine
committed
{
if (getAvatarId().notNull())
{
LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this);
}
if (LLVoiceClient::instanceExists())
{
LLVoiceClient::getInstance()->removeObserver((LLVoiceClientStatusObserver*)this);
}
if (mAvatarNameCacheConnection.connected())
{
mAvatarNameCacheConnection.disconnect();
}
Paul ProductEngine
committed
}
{
mStatusText = getChild<LLTextBox>("status");
mGroupList = getChild<LLGroupList>("group_list");
mShowInSearchCheckbox = getChild<LLCheckBoxCtrl>("show_in_search_checkbox");
mSecondLifePic = getChild<LLTextureCtrl>("2nd_life_pic");
mSecondLifePicLayout = getChild<LLPanel>("image_stack");
mDescriptionEdit = getChild<LLTextBase>("sl_description_edit");
mTeleportButton = getChild<LLButton>("teleport");
mShowOnMapButton = getChild<LLButton>("show_on_map_btn");
mBlockButton = getChild<LLButton>("block");
mUnblockButton = getChild<LLButton>("unblock");
mNameLabel = getChild<LLUICtrl>("name_label");
mDisplayNameButton = getChild<LLButton>("set_name");
mAddFriendButton = getChild<LLButton>("add_friend");
mGroupInviteButton = getChild<LLButton>("group_invite");
mPayButton = getChild<LLButton>("pay");
mIMButton = getChild<LLButton>("im");
andreykproductengine
committed
mCopyMenuButton = getChild<LLMenuButton>("copy_btn");
andreykproductengine
committed
mGiveInvPanel = getChild<LLPanel>("give_stack");
andreykproductengine
committed
mCopyMenuButton->setVisible(FALSE);
mAddFriendButton->setCommitCallback(boost::bind(&LLPanelProfileSecondLife::onAddFriendButtonClick, this));
mIMButton->setCommitCallback(boost::bind(&LLPanelProfileSecondLife::onIMButtonClick, this));
mTeleportButton->setCommitCallback(boost::bind(&LLPanelProfileSecondLife::onTeleportButtonClick, this));
mShowOnMapButton->setCommitCallback(boost::bind(&LLPanelProfileSecondLife::onMapButtonClick, this));
mPayButton->setCommitCallback(boost::bind(&LLPanelProfileSecondLife::pay, this));
andreykproductengine
committed
mBlockButton->setCommitCallback(boost::bind(&LLPanelProfileSecondLife::onClickToggleBlock, this));
mUnblockButton->setCommitCallback(boost::bind(&LLPanelProfileSecondLife::onClickToggleBlock, this));
mGroupInviteButton->setCommitCallback(boost::bind(&LLPanelProfileSecondLife::onGroupInvite,this));
mDisplayNameButton->setCommitCallback(boost::bind(&LLPanelProfileSecondLife::onClickSetName, this));
mSecondLifePic->setCommitCallback(boost::bind(&LLPanelProfileSecondLife::onCommitTexture, this));
andreykproductengine
committed
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar commit;
commit.add("Profile.CopyName", [this](LLUICtrl*, const LLSD& userdata) { onCommitMenu(userdata); });
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable;
enable.add("Profile.EnableCall", [this](LLUICtrl*, const LLSD&) { return mVoiceStatus; });
enable.add("Profile.EnableGod", [](LLUICtrl*, const LLSD&) { return gAgent.isGodlike(); });
mGroupList->setDoubleClickCallback(boost::bind(&LLPanelProfileSecondLife::openGroupProfile, this));
mGroupList->setReturnCallback(boost::bind(&LLPanelProfileSecondLife::openGroupProfile, this));
LLVoiceClient::getInstance()->addObserver((LLVoiceClientStatusObserver*)this);
andreykproductengine
committed
mCopyMenuButton->setMenu("menu_name_field.xml", LLMenuButton::MP_BOTTOM_RIGHT);
}
void LLPanelProfileSecondLife::onOpen(const LLSD& key)
{
LLUUID avatar_id = getAvatarId();
LLAvatarPropertiesProcessor::getInstance()->addObserver(avatar_id, this);
BOOL own_profile = getSelfProfile();
mGroupInviteButton->setVisible(!own_profile);
mShowOnMapButton->setVisible(!own_profile);
mPayButton->setVisible(!own_profile);
mTeleportButton->setVisible(!own_profile);
mIMButton->setVisible(!own_profile);
mAddFriendButton->setVisible(!own_profile);
mBlockButton->setVisible(!own_profile);
mUnblockButton->setVisible(!own_profile);
mGroupList->setShowNone(!own_profile);
andreykproductengine
committed
mGiveInvPanel->setVisible(!own_profile);
maxim_productengine
committed
mSecondLifePic->setOpenTexPreview(!own_profile);
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
if (own_profile && !getEmbedded())
{
// Group list control cannot toggle ForAgent loading
// Less than ideal, but viewing own profile via search is edge case
mGroupList->enableForAgent(false);
}
if (own_profile && !getEmbedded() )
{
mNameLabel->setVisible(FALSE);
mDisplayNameButton->setVisible(TRUE);
mDisplayNameButton->setEnabled(TRUE);
}
mDescriptionEdit->setParseHTML(!own_profile && !getEmbedded());
LLProfileDropTarget* drop_target = getChild<LLProfileDropTarget>("drop_target");
drop_target->setVisible(!own_profile);
drop_target->setEnabled(!own_profile);
if (!own_profile)
{
mVoiceStatus = LLAvatarActions::canCall() && (LLAvatarActions::isFriend(avatar_id) ? LLAvatarTracker::instance().isBuddyOnline(avatar_id) : TRUE);
drop_target->setAgentID(avatar_id);
updateOnlineStatus();
}
updateButtons();
mAvatarNameCacheConnection = LLAvatarNameCache::get(getAvatarId(), boost::bind(&LLPanelProfileSecondLife::onAvatarNameCache, this, _1, _2));
}
void LLPanelProfileSecondLife::apply(LLAvatarData* data)
{
if (getIsLoaded() && getSelfProfile())
{
data->image_id = mSecondLifePic->getImageAssetID();
data->about_text = mDescriptionEdit->getValue().asString();
data->allow_publish = mShowInSearchCheckbox->getValue();
LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate(data);
}
}
void LLPanelProfileSecondLife::updateData()
{
LLUUID avatar_id = getAvatarId();
if (!getIsLoading() && avatar_id.notNull() && !(getSelfProfile() && !getEmbedded()))
{
setIsLoading();
LLAvatarPropertiesProcessor::getInstance()->sendAvatarGroupsRequest(avatar_id);
}
}
void LLPanelProfileSecondLife::processProperties(void* data, EAvatarProcessorType type)
{
if (APT_PROPERTIES == type)
{
const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data);
if(avatar_data && getAvatarId() == avatar_data->avatar_id)
{
processProfileProperties(avatar_data);
updateButtons();
}
}
else if (APT_GROUPS == type)
{
LLAvatarGroups* avatar_groups = static_cast<LLAvatarGroups*>(data);
if(avatar_groups && getAvatarId() == avatar_groups->avatar_id)
{
processGroupProperties(avatar_groups);
}
}
}
{
resetLoading();
getChild<LLUICtrl>("complete_name")->setValue(LLStringUtil::null);
getChild<LLUICtrl>("register_date")->setValue(LLStringUtil::null);
getChild<LLUICtrl>("acc_status_text")->setValue(LLStringUtil::null);
getChild<LLUICtrl>("partner_text")->setValue(LLStringUtil::null);
// Set default image and 1:1 dimensions for it
mSecondLifePic->setValue(mSecondLifePic->getDefaultImageAssetID());
LLRect imageRect = mSecondLifePicLayout->getRect();
mSecondLifePicLayout->reshape(imageRect.getHeight(), imageRect.getHeight());
mDescriptionEdit->setValue(LLStringUtil::null);
mStatusText->setVisible(FALSE);
andreykproductengine
committed
mCopyMenuButton->setVisible(FALSE);
mGroups.clear();
mGroupList->setGroups(mGroups);
}
void LLPanelProfileSecondLife::processProfileProperties(const LLAvatarData* avatar_data)
{
LLUUID avatar_id = getAvatarId();
if (!LLAvatarActions::isFriend(avatar_id) && !getSelfProfile())
{
// this is non-friend avatar. Status will be updated from LLAvatarPropertiesProcessor.
// in LLPanelProfileSecondLife::processOnlineStatus()
// subscribe observer to get online status. Request will be sent by LLPanelProfileSecondLife itself.
// do not subscribe for friend avatar because online status can be wrong overridden
// via LLAvatarData::flags if Preferences: "Only Friends & Groups can see when I am online" is set.
processOnlineStatus(avatar_data->flags & AVATAR_ONLINE);
}
fillCommonData(avatar_data);
fillPartnerData(avatar_data);
fillAccountStatus(avatar_data);
}
void LLPanelProfileSecondLife::processGroupProperties(const LLAvatarGroups* avatar_groups)
{
//KC: the group_list ctrl can handle all this for us on our own profile
if (getSelfProfile() && !getEmbedded())
{
return;
}
// *NOTE dzaporozhan
// Group properties may arrive in two callbacks, we need to save them across
// different calls. We can't do that in textbox as textbox may change the text.
LLAvatarGroups::group_list_t::const_iterator it = avatar_groups->group_list.begin();
const LLAvatarGroups::group_list_t::const_iterator it_end = avatar_groups->group_list.end();
for (; it_end != it; ++it)
{
LLAvatarGroups::LLGroupData group_data = *it;
mGroups[group_data.group_name] = group_data.group_id;
}
mGroupList->setGroups(mGroups);
}
void LLPanelProfileSecondLife::openGroupProfile()
{
LLUUID group_id = mGroupList->getSelectedUUID();
LLGroupActions::show(group_id);
}
void LLPanelProfileSecondLife::onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name)
Steven Bennetts
committed
{
mAvatarNameCacheConnection.disconnect();
getChild<LLUICtrl>("complete_name")->setValue( av_name.getCompleteName() );
andreykproductengine
committed
mCopyMenuButton->setVisible(TRUE);
Steven Bennetts
committed
}
void LLPanelProfileSecondLife::fillCommonData(const LLAvatarData* avatar_data)
Steven Bennetts
committed
{
// Refresh avatar id in cache with new info to prevent re-requests
// and to make sure icons in text will be up to date
LLAvatarIconIDCache::getInstance()->add(avatar_data->avatar_id, avatar_data->image_id);
LLStringUtil::format_map_t args;
{
std::string birth_date = LLTrans::getString("AvatarBirthDateFormat");
LLStringUtil::format(birth_date, LLSD().with("datetime", (S32) avatar_data->born_on.secondsSinceEpoch()));
args["[REG_DATE]"] = birth_date;
}
Steven Bennetts
committed
args["[AGE]"] = LLDateUtil::ageFromDate( avatar_data->born_on, LLDate::now());
std::string register_date = getString("RegisterDateFormat", args);
getChild<LLUICtrl>("register_date")->setValue(register_date );
mDescriptionEdit->setValue(avatar_data->about_text);
mSecondLifePic->setValue(avatar_data->image_id);
Steven Bennetts
committed
//Don't bother about boost level, picker will set it
LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(avatar_data->image_id);
if (imagep->getFullHeight())
{
onImageLoaded(true, imagep);
}
else
{
imagep->setLoadedCallback(onImageLoaded,
MAX_DISCARD_LEVEL,
FALSE,
FALSE,
new LLHandle<LLPanel>(getHandle()),
NULL,
FALSE);
}
if (getSelfProfile())
{
mShowInSearchCheckbox->setValue((BOOL)(avatar_data->flags & AVATAR_ALLOW_PUBLISH));
}
Steven Bennetts
committed
}
void LLPanelProfileSecondLife::fillPartnerData(const LLAvatarData* avatar_data)
{
LLTextEditor* partner_text = getChild<LLTextEditor>("partner_text");
if (avatar_data->partner_id.notNull())
{
partner_text->setText(LLSLURL("agent", avatar_data->partner_id, "inspect").getSLURLString());
}
else
{
partner_text->setText(getString("no_partner_text"));
}
}
void LLPanelProfileSecondLife::fillAccountStatus(const LLAvatarData* avatar_data)
{
LLStringUtil::format_map_t args;
args["[ACCTTYPE]"] = LLAvatarPropertiesProcessor::accountType(avatar_data);
args["[PAYMENTINFO]"] = LLAvatarPropertiesProcessor::paymentInfo(avatar_data);
std::string caption_text = getString("CaptionTextAcctInfo", args);
getChild<LLUICtrl>("acc_status_text")->setValue(caption_text);
}
void LLPanelProfileSecondLife::onMapButtonClick()
Steven Bennetts
committed
{
Steven Bennetts
committed
}
Vadim ProductEngine
committed
andreykproductengine
committed
void LLPanelProfileSecondLife::onClickToggleBlock()
andreykproductengine
committed
bool blocked = LLAvatarActions::toggleBlock(getAvatarId());
andreykproductengine
committed
// we are hiding one button and showing another, set focus
if (blocked)
{
mUnblockButton->setFocus(true);
}
else
{
mBlockButton->setFocus(true);
}
void LLPanelProfileSecondLife::onAddFriendButtonClick()
{
LLAvatarActions::requestFriendshipDialog(getAvatarId());
void LLPanelProfileSecondLife::onIMButtonClick()
{
void LLPanelProfileSecondLife::onTeleportButtonClick()
{
LLAvatarActions::offerTeleport(getAvatarId());
}
Vadim ProductEngine
committed
void LLPanelProfileSecondLife::onGroupInvite()
{
LLAvatarActions::inviteToGroup(getAvatarId());
}
void LLPanelProfileSecondLife::onImageLoaded(BOOL success, LLViewerFetchedTexture *imagep)
{
LLRect imageRect = mSecondLifePicLayout->getRect();
if (!success || imagep->getFullWidth() == imagep->getFullHeight())
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
{
mSecondLifePicLayout->reshape(imageRect.getHeight(), imageRect.getHeight());
}
else
{
// assume 3:4, for sake of firestorm
mSecondLifePicLayout->reshape(imageRect.getHeight() * 4 / 3, imageRect.getHeight());
}
}
//static
void LLPanelProfileSecondLife::onImageLoaded(BOOL success,
LLViewerFetchedTexture *src_vi,
LLImageRaw* src,
LLImageRaw* aux_src,
S32 discard_level,
BOOL final,
void* userdata)
{
if (!userdata) return;
LLHandle<LLPanel>* handle = (LLHandle<LLPanel>*)userdata;
if (!handle->isDead())
{
LLPanelProfileSecondLife* panel = static_cast<LLPanelProfileSecondLife*>(handle->get());
if (panel)
{
panel->onImageLoaded(success, src_vi);
}
}
if (final || !success)
{
delete handle;
}
}
// virtual, called by LLAvatarTracker
void LLPanelProfileSecondLife::changed(U32 mask)
{
updateOnlineStatus();
updateButtons();
}
// virtual, called by LLVoiceClient
void LLPanelProfileSecondLife::onChange(EStatusType status, const std::string &channelURI, bool proximal)
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
if(status == STATUS_JOINING || status == STATUS_LEFT_CHANNEL)
{
return;
}
mVoiceStatus = LLAvatarActions::canCall() && (LLAvatarActions::isFriend(getAvatarId()) ? LLAvatarTracker::instance().isBuddyOnline(getAvatarId()) : TRUE);
}
void LLPanelProfileSecondLife::setAvatarId(const LLUUID& avatar_id)
{
if (avatar_id.notNull())
{
if (getAvatarId().notNull())
{
LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this);
}
LLPanelProfileTab::setAvatarId(avatar_id);
if (LLAvatarActions::isFriend(getAvatarId()))
{
LLAvatarTracker::instance().addParticularFriendObserver(getAvatarId(), this);
}
}
}
bool LLPanelProfileSecondLife::isGrantedToSeeOnlineStatus()
{
// set text box visible to show online status for non-friends who has not set in Preferences
// "Only Friends & Groups can see when I am online"
if (!LLAvatarActions::isFriend(getAvatarId()))
{
return true;
}
// *NOTE: GRANT_ONLINE_STATUS is always set to false while changing any other status.
// When avatar disallow me to see her online status processOfflineNotification Message is received by the viewer
// see comments for ChangeUserRights template message. EXT-453.
// If GRANT_ONLINE_STATUS flag is changed it will be applied when viewer restarts. EXT-3880
const LLRelationship* relationship = LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
return relationship->isRightGrantedFrom(LLRelationship::GRANT_ONLINE_STATUS);
}
// method was disabled according to EXT-2022. Re-enabled & improved according to EXT-3880
void LLPanelProfileSecondLife::updateOnlineStatus()
{
if (!LLAvatarActions::isFriend(getAvatarId())) return;
// For friend let check if he allowed me to see his status
const LLRelationship* relationship = LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
bool online = relationship->isOnline();
processOnlineStatus(online);
}
Dmitry Zaporozhan
committed
void LLPanelProfileSecondLife::processOnlineStatus(bool online)
{
mStatusText->setVisible(isGrantedToSeeOnlineStatus());
std::string status = getString(online ? "status_online" : "status_offline");
mStatusText->setValue(status);
mStatusText->setColor(online ?
LLUIColorTable::instance().getColor("StatusUserOnline") :
LLUIColorTable::instance().getColor("StatusUserOffline"));
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
void LLPanelProfileSecondLife::updateButtons()
{
LLPanelProfileTab::updateButtons();
if (getSelfProfile() && !getEmbedded())
{
mShowInSearchCheckbox->setVisible(TRUE);
mShowInSearchCheckbox->setEnabled(TRUE);
mDescriptionEdit->setEnabled(TRUE);
}
if (!getSelfProfile())
{
LLUUID av_id = getAvatarId();
bool is_buddy_online = LLAvatarTracker::instance().isBuddyOnline(getAvatarId());
if (LLAvatarActions::isFriend(av_id))
{
mTeleportButton->setEnabled(is_buddy_online);
//Disable "Add Friend" button for friends.
mAddFriendButton->setEnabled(false);
}
else
{
mTeleportButton->setEnabled(true);
mAddFriendButton->setEnabled(true);
}
bool enable_map_btn = (is_buddy_online && is_agent_mappable(av_id)) || gAgent.isGodlike();
mShowOnMapButton->setEnabled(enable_map_btn);
bool enable_block_btn = LLAvatarActions::canBlock(av_id) && !LLAvatarActions::isBlocked(av_id);
mBlockButton->setVisible(enable_block_btn);
bool enable_unblock_btn = LLAvatarActions::isBlocked(av_id);
mUnblockButton->setVisible(enable_unblock_btn);
}
}
void LLPanelProfileSecondLife::onClickSetName()
{
LLAvatarNameCache::get(getAvatarId(), boost::bind(&LLPanelProfileSecondLife::onAvatarNameCacheSetName, this, _1, _2));
LLFirstUse::setDisplayName(false);
}
void LLPanelProfileSecondLife::onCommitTexture()
{
LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(mSecondLifePic->getImageAssetID());
if (imagep->getFullHeight())
{
onImageLoaded(true, imagep);
}
else
{
imagep->setLoadedCallback(onImageLoaded,
MAX_DISCARD_LEVEL,
FALSE,
FALSE,
new LLHandle<LLPanel>(getHandle()),
NULL,
FALSE);
}
}
andreykproductengine
committed
void LLPanelProfileSecondLife::onCommitMenu(const LLSD& userdata)
{
LLAvatarName av_name;
if (!LLAvatarNameCache::get(getAvatarId(), &av_name))
{
// shouldn't happen, button(menu) is supposed to be invisible while name is fetching
LL_WARNS() << "Failed to get agent data" << LL_ENDL;
return;
}
const std::string item_name = userdata.asString();
LLWString wstr;
if (item_name == "display")
{
maxim_productengine
committed
wstr = utf8str_to_wstring(av_name.getDisplayName(true));
andreykproductengine
committed
}
else if (item_name == "name")
{
wstr = utf8str_to_wstring(av_name.getAccountName());
}
else if (item_name == "id")
{
wstr = utf8str_to_wstring(getAvatarId().asString());
}
LLClipboard::instance().copyToClipboard(wstr, 0, wstr.size());
}
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
void LLPanelProfileSecondLife::onAvatarNameCacheSetName(const LLUUID& agent_id, const LLAvatarName& av_name)
{
if (av_name.getDisplayName().empty())
{
// something is wrong, tell user to try again later
LLNotificationsUtil::add("SetDisplayNameFailedGeneric");
return;
}
LL_INFOS("LegacyProfile") << "name-change now " << LLDate::now() << " next_update "
<< LLDate(av_name.mNextUpdate) << LL_ENDL;
F64 now_secs = LLDate::now().secondsSinceEpoch();
if (now_secs < av_name.mNextUpdate)
{
// if the update time is more than a year in the future, it means updates have been blocked
// show a more general message
static const S32 YEAR = 60*60*24*365;
if (now_secs + YEAR < av_name.mNextUpdate)
{
LLNotificationsUtil::add("SetDisplayNameBlocked");
return;
}
}
LLFloaterReg::showInstance("display_name");
}
//////////////////////////////////////////////////////////////////////////
// LLPanelProfileWeb
LLPanelProfileWeb::LLPanelProfileWeb()
: LLPanelProfileTab()
, mWebBrowser(NULL)
, mAvatarNameCacheConnection()
{
}
LLPanelProfileWeb::~LLPanelProfileWeb()
{
if (mAvatarNameCacheConnection.connected())
{
mAvatarNameCacheConnection.disconnect();
}
}
void LLPanelProfileWeb::onOpen(const LLSD& key)
{
LLPanelProfileTab::onOpen(key);
resetData();
mAvatarNameCacheConnection = LLAvatarNameCache::get(getAvatarId(), boost::bind(&LLPanelProfileWeb::onAvatarNameCache, this, _1, _2));
}
BOOL LLPanelProfileWeb::postBuild()
{
mWebBrowser = getChild<LLMediaCtrl>("profile_html");
mWebBrowser->addObserver(this);
mWebBrowser->setHomePageUrl("about:blank");
return TRUE;
}
void LLPanelProfileWeb::processProperties(void* data, EAvatarProcessorType type)
{
if (APT_PROPERTIES == type)
{
const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data);
if (avatar_data && getAvatarId() == avatar_data->avatar_id)
{
updateButtons();
}
}
}
void LLPanelProfileWeb::resetData()
{
mWebBrowser->navigateHome();
}
void LLPanelProfileWeb::apply(LLAvatarData* data)
{
}
void LLPanelProfileWeb::updateData()
{
LLUUID avatar_id = getAvatarId();
if (!getIsLoading() && avatar_id.notNull() && !mURLWebProfile.empty())
mWebBrowser->setVisible(TRUE);
mPerformanceTimer.start();
mWebBrowser->navigateTo(mURLWebProfile, HTTP_CONTENT_TEXT_HTML);
}
}
void LLPanelProfileWeb::onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name)
{
mAvatarNameCacheConnection.disconnect();
std::string username = av_name.getAccountName();
if (username.empty())
{
username = LLCacheName::buildUsername(av_name.getDisplayName());
}
else
{
LLStringUtil::replaceChar(username, ' ', '.');
}
mURLWebProfile = getProfileURL(username, true);
if (mURLWebProfile.empty())
{
return;
}
//if the tab was opened before name was resolved, load the panel now
updateData();
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
}
void LLPanelProfileWeb::onCommitLoad(LLUICtrl* ctrl)
{
if (!mURLHome.empty())
{
LLSD::String valstr = ctrl->getValue().asString();
if (valstr.empty())
{
mWebBrowser->setVisible(TRUE);
mPerformanceTimer.start();
mWebBrowser->navigateTo( mURLHome, HTTP_CONTENT_TEXT_HTML );
}
else if (valstr == "popout")
{
// open in viewer's browser, new window
LLWeb::loadURLInternal(mURLHome);
}
else if (valstr == "external")
{
// open in external browser
LLWeb::loadURLExternal(mURLHome);
}
}
}
void LLPanelProfileWeb::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
{
switch(event)
{
case MEDIA_EVENT_STATUS_TEXT_CHANGED:
childSetValue("status_text", LLSD( self->getStatusText() ) );
break;
case MEDIA_EVENT_NAVIGATE_BEGIN:
{
if (mFirstNavigate)
{
mFirstNavigate = false;
}
else
{
mPerformanceTimer.start();
}
}
break;
case MEDIA_EVENT_NAVIGATE_COMPLETE:
{
LLStringUtil::format_map_t args;
args["[TIME]"] = llformat("%.2f", mPerformanceTimer.getElapsedTimeF32());
childSetValue("status_text", LLSD( getString("LoadTime", args)) );
}
break;
default:
// Having a default case makes the compiler happy.
break;
}
}
void LLPanelProfileWeb::updateButtons()
{
LLPanelProfileTab::updateButtons();
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
static const S32 WANT_CHECKS = 8;
static const S32 SKILL_CHECKS = 6;
LLPanelProfileInterests::LLPanelProfileInterests()
: LLPanelProfileTab()