/** * @file llfloateravatarinfo.cpp * @brief LLFloaterAvatarInfo class implementation * * $LicenseInfo:firstyear=2002&license=viewergpl$ * * Copyright (c) 2002-2007, Linden Research, Inc. * * 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://secondlife.com/developers/opensource/gplv2 * * 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://secondlife.com/developers/opensource/flossexception * * 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. * * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, * COMPLETENESS OR PERFORMANCE. * $/LicenseInfo$ */ /** * Avatar information as shown in a floating window from right-click * Profile. Used for editing your own avatar info. Just a wrapper * for LLPanelAvatar, shared with the Find directory. */ // system includes // linden prefix includes #include "llviewerprecompiledheaders.h" // self include #include "llfloateravatarinfo.h" // linden library includes #include "llcachename.h" #include "llfontgl.h" #include "llinventory.h" #include "message.h" // viewer project includes #include "llagentdata.h" #include "llbutton.h" #include "llcallingcard.h" #include "llcheckboxctrl.h" #include "llcommandhandler.h" #include "llfloaterworldmap.h" #include "llfloatermute.h" #include "llinventoryview.h" #include "lllineeditor.h" #include "llmutelist.h" #include "llscrolllistctrl.h" #include "lltabcontainer.h" #include "llimview.h" #include "lluiconstants.h" #include "llviewerobject.h" #include "llviewerobjectlist.h" #include "llviewerregion.h" #include "llviewborder.h" #include "llinventorymodel.h" #include "lltextbox.h" #include "lltexturectrl.h" #include "llviewertexteditor.h" #include "llpanelavatar.h" #include "llvieweruictrlfactory.h" const char FLOATER_TITLE[] = "Profile"; const LLRect FAI_RECT(0, 530, 420, 0); //----------------------------------------------------------------------------- // Globals //----------------------------------------------------------------------------- LLMap< const LLUUID, LLFloaterAvatarInfo* > gAvatarInfoInstances; class LLAgentHandler : public LLCommandHandler { public: LLAgentHandler() : LLCommandHandler("agent") { } bool handle(const std::vector& params) { if (params.size() < 2) return false; LLUUID agent_id; if (!agent_id.set(params[0], FALSE)) { return false; } if (params[1] == "about") { LLFloaterAvatarInfo::showFromDirectory(agent_id); return true; } return false; } }; LLAgentHandler gAgentHandler; //----------------------------------------------------------------------------- // Member functions //----------------------------------------------------------------------------- //---------------------------------------------------------------------------- void* LLFloaterAvatarInfo::createPanelAvatar(void* data) { LLFloaterAvatarInfo* self = (LLFloaterAvatarInfo*)data; self->mPanelAvatarp = new LLPanelAvatar("PanelAv", LLRect(), TRUE); // allow edit self return self->mPanelAvatarp; } //---------------------------------------------------------------------------- BOOL LLFloaterAvatarInfo::postBuild() { return TRUE; } LLFloaterAvatarInfo::LLFloaterAvatarInfo(const std::string& name, const LLRect &rect, const LLUUID &avatar_id) : LLPreview(name, rect, FLOATER_TITLE, LLUUID::null, LLUUID::null), mAvatarID( avatar_id ), mSuggestedOnlineStatus(ONLINE_STATUS_NO) { mAutoFocus = TRUE; LLCallbackMap::map_t factory_map; factory_map["Panel Avatar"] = LLCallbackMap(createPanelAvatar, this); gUICtrlFactory->buildFloater(this, "floater_profile.xml", &factory_map); if(mPanelAvatarp) { mPanelAvatarp->selectTab(0); } gAvatarInfoInstances.addData(avatar_id, this); } // virtual LLFloaterAvatarInfo::~LLFloaterAvatarInfo() { // child views automatically deleted gAvatarInfoInstances.removeData(mAvatarID); } void LLFloaterAvatarInfo::resetGroupList() { // only get these updates asynchronously via the group floater, which works on the agent only if (mAvatarID != gAgentID) { return; } mPanelAvatarp->resetGroupList(); } // Open profile to a certian tab. // static void LLFloaterAvatarInfo::showFromObject( const LLUUID& avatar_id, std::string tab_name) { if(avatar_id.isNull()) { return; } LLFloaterAvatarInfo *floater = NULL; if (gAvatarInfoInstances.checkData(avatar_id)) { // ...bring that window to front floater = gAvatarInfoInstances.getData(avatar_id); } else { floater = new LLFloaterAvatarInfo("avatarinfo", FAI_RECT, avatar_id); floater->center(); floater->mPanelAvatarp->setAvatarID(avatar_id, "", ONLINE_STATUS_NO); } floater->mPanelAvatarp->selectTabByName(tab_name); floater->open(); /*Flawfinder: ignore*/ } // static void LLFloaterAvatarInfo::showFromDirectory(const LLUUID &avatar_id) { if(avatar_id.isNull()) { return; } LLFloaterAvatarInfo *floater; if (gAvatarInfoInstances.checkData(avatar_id)) { // ...bring that window to front floater = gAvatarInfoInstances.getData(avatar_id); } else { floater = new LLFloaterAvatarInfo("avatarinfo", FAI_RECT, avatar_id); floater->center(); floater->mPanelAvatarp->setAvatarID(avatar_id, "", ONLINE_STATUS_NO); } if(floater) { floater->open(); } } // static void LLFloaterAvatarInfo::showFromAvatar(LLViewerObject *avatar) { if (gAvatarInfoInstances.checkData(avatar->getID())) { // ...bring that window to front LLFloaterAvatarInfo *f = gAvatarInfoInstances.getData(avatar->getID()); f->open(); /*Flawfinder: ignore*/ } else { LLFloaterAvatarInfo *floater = new LLFloaterAvatarInfo("avatarinfo", FAI_RECT, avatar->getID() ); floater->center(); floater->open(); /*Flawfinder: ignore*/ } } // static void LLFloaterAvatarInfo::showFromFriend(const LLUUID& agent_id, BOOL online) { if(agent_id.isNull()) { return; } if (gAvatarInfoInstances.checkData( agent_id )) { // ...bring that window to front LLFloaterAvatarInfo *f = gAvatarInfoInstances.getData( agent_id ); f->open(); /*Flawfinder: ignore*/ } else { LLFloaterAvatarInfo *floater = new LLFloaterAvatarInfo("avatarinfo", FAI_RECT, agent_id); floater->center(); floater->mSuggestedOnlineStatus = online ? ONLINE_STATUS_YES : ONLINE_STATUS_NO; } } void LLFloaterAvatarInfo::showProfileCallback(S32 option, void *userdata) { if (option == 0) { showFromObject(gAgentID); } } //// virtual void LLFloaterAvatarInfo::draw() { LLFloater::draw(); } // virtual BOOL LLFloaterAvatarInfo::canClose() { return mPanelAvatarp && mPanelAvatarp->canClose(); } LLFloaterAvatarInfo* LLFloaterAvatarInfo::getInstance(const LLUUID &id) { return gAvatarInfoInstances.getIfThere(gAgentID); } void LLFloaterAvatarInfo::loadAsset() { if (mPanelAvatarp) { mPanelAvatarp->setAvatarID(mAvatarID, "", mSuggestedOnlineStatus); mAssetStatus = PREVIEW_ASSET_LOADING; } } LLPreview::EAssetStatus LLFloaterAvatarInfo::getAssetStatus() { if (mPanelAvatarp && mPanelAvatarp->haveData()) { mAssetStatus = PREVIEW_ASSET_LOADED; } return mAssetStatus; }