/** * @file llpanelavatar.cpp * @brief LLPanelAvatar and related class implementations * * $LicenseInfo:firstyear=2004&license=viewerlgpl$ * 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 * $/LicenseInfo$ */ #include "llviewerprecompiledheaders.h" #include "llpanelavatar.h" #include "llagent.h" #include "llavataractions.h" #include "llcallingcard.h" #include "llcombobox.h" #include "lldateutil.h" // ageFromDate() #include "llimview.h" #include "llmenubutton.h" #include "llnotificationsutil.h" #include "llslurl.h" #include "lltexteditor.h" #include "lltexturectrl.h" #include "lltoggleablemenu.h" #include "lltooldraganddrop.h" #include "llscrollcontainer.h" #include "llavatariconctrl.h" #include "llfloaterreg.h" #include "llnotificationsutil.h" #include "llvoiceclient.h" #include "lltextbox.h" #include "lltrans.h" //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLDropTarget // // This handy class is a simple way to drop something on another // view. It handles drop events, always setting itself to the size of // its parent. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLDropTarget : public LLView { public: struct Params : public LLInitParam::Block<Params, LLView::Params> { Optional<LLUUID> agent_id; Params() : agent_id("agent_id") { changeDefault(mouse_opaque, false); changeDefault(follows.flags, FOLLOWS_ALL); } }; LLDropTarget(const Params&); ~LLDropTarget(); void doDrop(EDragAndDropType cargo_type, void* cargo_data); // // LLView functionality virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void* cargo_data, EAcceptance* accept, std::string& tooltip_msg); void setAgentID(const LLUUID &agent_id) { mAgentID = agent_id; } protected: LLUUID mAgentID; }; LLDropTarget::LLDropTarget(const LLDropTarget::Params& p) : LLView(p), mAgentID(p.agent_id) {} LLDropTarget::~LLDropTarget() {} void LLDropTarget::doDrop(EDragAndDropType cargo_type, void* cargo_data) { LL_INFOS() << "LLDropTarget::doDrop()" << LL_ENDL; } BOOL LLDropTarget::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void* cargo_data, EAcceptance* accept, std::string& tooltip_msg) { if(getParent()) { LLToolDragAndDrop::handleGiveDragAndDrop(mAgentID, LLUUID::null, drop, cargo_type, cargo_data, accept); return TRUE; } return FALSE; } static LLDefaultChildRegistry::Register<LLDropTarget> r("drop_target"); ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// LLPanelProfileTab::LLPanelProfileTab() : LLPanel() , mAvatarId(LLUUID::null) { } LLPanelProfileTab::~LLPanelProfileTab() { if(getAvatarId().notNull()) { LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this); } } void LLPanelProfileTab::setAvatarId(const LLUUID& id) { if(id.notNull()) { if(getAvatarId().notNull()) { LLAvatarPropertiesProcessor::getInstance()->removeObserver(mAvatarId,this); } mAvatarId = id; LLAvatarPropertiesProcessor::getInstance()->addObserver(getAvatarId(),this); } } void LLPanelProfileTab::onOpen(const LLSD& key) { // Don't reset panel if we are opening it for same avatar. if(getAvatarId() != key.asUUID()) { resetControls(); resetData(); scrollToTop(); } // Update data even if we are viewing same avatar profile as some data might been changed. setAvatarId(key.asUUID()); updateData(); updateButtons(); } void LLPanelProfileTab::scrollToTop() { LLScrollContainer* scrollContainer = findChild<LLScrollContainer>("profile_scroll"); if (scrollContainer) scrollContainer->goToTop(); } void LLPanelProfileTab::onMapButtonClick() { LLAvatarActions::showOnMap(getAvatarId()); } void LLPanelProfileTab::updateButtons() { bool is_buddy_online = LLAvatarTracker::instance().isBuddyOnline(getAvatarId()); if(LLAvatarActions::isFriend(getAvatarId())) { getChildView("teleport")->setEnabled(is_buddy_online); } else { getChildView("teleport")->setEnabled(true); } bool enable_map_btn = (is_buddy_online && is_agent_mappable(getAvatarId())) || gAgent.isGodlike(); getChildView("show_on_map_btn")->setEnabled(enable_map_btn); }