diff options
Diffstat (limited to 'indra/newview/llpanelprofileview.cpp')
-rw-r--r-- | indra/newview/llpanelprofileview.cpp | 199 |
1 files changed, 144 insertions, 55 deletions
diff --git a/indra/newview/llpanelprofileview.cpp b/indra/newview/llpanelprofileview.cpp index 457397a379..dba047660d 100644 --- a/indra/newview/llpanelprofileview.cpp +++ b/indra/newview/llpanelprofileview.cpp @@ -2,93 +2,126 @@ * @file llpanelprofileview.cpp * @brief Side tray "Profile View" panel * -* $LicenseInfo:firstyear=2009&license=viewergpl$ -* -* Copyright (c) 2009, Linden Research, Inc. -* +* $LicenseInfo:firstyear=2009&license=viewerlgpl$ * Second Life Viewer Source Code -* The source code in this file ("Source Code") is provided by Linden Lab -* to you under the terms of the GNU General Public License, version 2.0 -* ("GPL"), unless you have obtained a separate licensing agreement -* ("Other License"), formally executed by you and Linden Lab. Terms of -* the GPL can be found in doc/GPL-license.txt in this distribution, or -* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 +* 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. * -* There are special exceptions to the terms and conditions of the GPL as -* it is applied to this Source Code. View the full text of the exception -* in the file doc/FLOSS-exception.txt in this software distribution, or -* online at -* http://secondlifegrid.net/programs/open_source/licensing/flossexception +* 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. * -* By copying, modifying or distributing this software, you acknowledge -* that you have read and understood your obligations described above, -* and agree to abide by those obligations. +* 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 * -* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO -* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, -* COMPLETENESS OR PERFORMANCE. +* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ #include "llviewerprecompiledheaders.h" + +#include "llavatarconstants.h" +#include "lluserrelations.h" + #include "llpanelprofileview.h" -#include <llfloaterreg.h> -#include <lltabcontainer.h> -#include <lluictrlfactory.h> + +#include "llavatarpropertiesprocessor.h" +#include "llcallingcard.h" #include "llpanelavatar.h" #include "llpanelpicks.h" +#include "llpanelprofile.h" +#include "llsidetraypanelcontainer.h" static LLRegisterPanelClassWrapper<LLPanelProfileView> t_panel_target_profile("panel_profile_view"); -static LLRegisterPanelClassWrapper<LLPanelAvatarNotes> t_panel_notes("panel_notes"); -static std::string PANEL_PROFILE = "panel_profile"; -static std::string PANEL_PICKS = "panel_picks"; static std::string PANEL_NOTES = "panel_notes"; +static const std::string PANEL_PROFILE = "panel_profile"; +static const std::string PANEL_PICKS = "panel_picks"; + + +class AvatarStatusObserver : public LLAvatarPropertiesObserver +{ +public: + AvatarStatusObserver(LLPanelProfileView* profile_view) + { + mProfileView = profile_view; + } -LLPanelProfileView::LLPanelProfileView(const LLPanel::Params& p) -: LLPanel(p) + void processProperties(void* data, EAvatarProcessorType type) + { + if(APT_PROPERTIES != type) return; + const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data); + if(avatar_data && mProfileView->getAvatarId() == avatar_data->avatar_id) + { + mProfileView->processOnlineStatus(avatar_data->flags & AVATAR_ONLINE); + LLAvatarPropertiesProcessor::instance().removeObserver(mProfileView->getAvatarId(), this); + } + } + + void subscribe() + { + LLAvatarPropertiesProcessor::instance().addObserver(mProfileView->getAvatarId(), this); + } + +private: + LLPanelProfileView* mProfileView; +}; + +LLPanelProfileView::LLPanelProfileView() +: LLPanelProfile() +, mStatusText(NULL) +, mAvatarStatusObserver(NULL) { + mAvatarStatusObserver = new AvatarStatusObserver(this); } LLPanelProfileView::~LLPanelProfileView(void) { + delete mAvatarStatusObserver; } /*virtual*/ void LLPanelProfileView::onOpen(const LLSD& key) { - if (!getVisible()) - setVisible(TRUE); + LLUUID id; + if(key.has("id")) + { + id = key["id"]; + } - LLUUID id(key.asUUID()); - if(id.notNull() && mProfileId.notNull() && mProfileId != id) + if(id.notNull() && getAvatarId() != id) { - mTabs[PANEL_PROFILE]->clear(); - mTabs[PANEL_PICKS]->clear(); - mTabs[PANEL_NOTES]->clear(); + setAvatarId(id); } - mProfileId = id; - mTabs[PANEL_PROFILE]->onOpen(mProfileId); - mTabs[PANEL_PICKS]->setAvatarId(mProfileId); - mTabs[PANEL_PICKS]->updateData(); - mTabs[PANEL_NOTES]->setAvatarId(mProfileId); - mTabs[PANEL_NOTES]->updateData(); + // Update the avatar name. + gCacheName->get(getAvatarId(), FALSE, + boost::bind(&LLPanelProfileView::onAvatarNameCached, this, _1, _2, _3, _4)); - std::string full_name; - gCacheName->getFullName(key,full_name); - childSetValue("user_name",full_name); -} + updateOnlineStatus(); + LLPanelProfile::onOpen(key); +} + BOOL LLPanelProfileView::postBuild() { - mTabContainer = getChild<LLTabContainer>("profile_tabs"); - mTabContainer->setCommitCallback(boost::bind(&LLPanelProfileView::onTabSelected, this, _2)); + LLPanelProfile::postBuild(); + + getTabContainer()[PANEL_NOTES] = findChild<LLPanelAvatarNotes>(PANEL_NOTES); + + //*TODO remove this, according to style guide we don't use status combobox + getTabContainer()[PANEL_PROFILE]->getChildView("online_me_status_text")->setVisible( FALSE); + getTabContainer()[PANEL_PROFILE]->getChildView("status_combo")->setVisible( FALSE); - mTabs[PANEL_PROFILE] = (getChild<LLPanelAvatarProfile>(PANEL_PROFILE)); - mTabs[PANEL_PICKS] = (getChild<LLPanelPicks>(PANEL_PICKS)); - mTabs[PANEL_NOTES] = (getChild<LLPanelAvatarNotes>(PANEL_NOTES)); + mStatusText = getChild<LLTextBox>("status"); + mStatusText->setVisible(false); childSetCommitCallback("back",boost::bind(&LLPanelProfileView::onBackBtnClick,this),NULL); @@ -98,15 +131,71 @@ BOOL LLPanelProfileView::postBuild() //private -void LLPanelProfileView::initTabs(const LLSD& key) +void LLPanelProfileView::onBackBtnClick() { + // Set dummy value to make picks panel dirty, + // This will make Picks reload on next open. + getTabContainer()[PANEL_PICKS]->setValue(LLSD()); + + LLSideTrayPanelContainer* parent = dynamic_cast<LLSideTrayPanelContainer*>(getParent()); + if(parent) + { + parent->openPreviousPanel(); + } } -void LLPanelProfileView::onTabSelected(const LLSD& param) +bool LLPanelProfileView::isGrantedToSeeOnlineStatus() { + const LLRelationship* relationship = LLAvatarTracker::instance().getBuddyInfo(getAvatarId()); + if (NULL == relationship) + return false; + + // *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 + return relationship->isRightGrantedFrom(LLRelationship::GRANT_ONLINE_STATUS); } -void LLPanelProfileView::onBackBtnClick() +// method was disabled according to EXT-2022. Re-enabled & improved according to EXT-3880 +void LLPanelProfileView::updateOnlineStatus() { - setVisible(FALSE); + // 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" + mStatusText->setVisible(TRUE); + + const LLRelationship* relationship = LLAvatarTracker::instance().getBuddyInfo(getAvatarId()); + if (NULL == relationship) + { + // this is non-friend avatar. Status will be updated from LLAvatarPropertiesProcessor. + // in LLPanelProfileView::processOnlineStatus() + + // subscribe observer to get online status. Request will be sent by LLPanelAvatarProfile 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. + mAvatarStatusObserver->subscribe(); + return; + } + // For friend let check if he allowed me to see his status + + // status should only show if viewer has permission to view online/offline. EXT-453, EXT-3880 + mStatusText->setVisible(isGrantedToSeeOnlineStatus()); + + bool online = relationship->isOnline(); + processOnlineStatus(online); +} + +void LLPanelProfileView::processOnlineStatus(bool online) +{ + std::string status = getString(online ? "status_online" : "status_offline"); + + mStatusText->setValue(status); } + +void LLPanelProfileView::onAvatarNameCached(const LLUUID& id, const std::string& first_name, const std::string& last_name, BOOL is_group) +{ + llassert(getAvatarId() == id); + getChild<LLUICtrl>("user_name", FALSE)->setValue(first_name + " " + last_name); +} + +// EOF |