00001
00034 #include "llviewerprecompiledheaders.h"
00035
00036 #include "llfloateravatarinfo.h"
00037
00038
00039 #include "llagentdata.h"
00040 #include "llcommandhandler.h"
00041 #include "llpanelavatar.h"
00042 #include "lluictrlfactory.h"
00043
00044
00045 #include "llinventory.h"
00046 #include "lluuid.h"
00047 #include "message.h"
00048
00049 const char FLOATER_TITLE[] = "Profile";
00050 const LLRect FAI_RECT(0, 530, 420, 0);
00051
00052
00053
00054
00055
00056 LLMap< const LLUUID, LLFloaterAvatarInfo* > gAvatarInfoInstances;
00057
00058 class LLAgentHandler : public LLCommandHandler
00059 {
00060 public:
00061
00062 LLAgentHandler() : LLCommandHandler("agent", false) { }
00063
00064 bool handle(const LLSD& params, const LLSD& queryMap)
00065 {
00066 if (params.size() < 2) return false;
00067 LLUUID agent_id;
00068 if (!agent_id.set(params[0], FALSE))
00069 {
00070 return false;
00071 }
00072
00073 if (params[1].asString() == "about")
00074 {
00075 LLFloaterAvatarInfo::show(agent_id);
00076 return true;
00077 }
00078 return false;
00079 }
00080 };
00081 LLAgentHandler gAgentHandler;
00082
00083
00084
00085
00086
00087
00088
00089 void* LLFloaterAvatarInfo::createPanelAvatar(void* data)
00090 {
00091 LLFloaterAvatarInfo* self = (LLFloaterAvatarInfo*)data;
00092 self->mPanelAvatarp = new LLPanelAvatar("PanelAv", LLRect(), TRUE);
00093 return self->mPanelAvatarp;
00094 }
00095
00096
00097
00098
00099 BOOL LLFloaterAvatarInfo::postBuild()
00100 {
00101 return TRUE;
00102 }
00103
00104 LLFloaterAvatarInfo::LLFloaterAvatarInfo(const std::string& name, const LLRect &rect, const LLUUID &avatar_id)
00105 : LLPreview(name, rect, FLOATER_TITLE, LLUUID::null, LLUUID::null),
00106 mAvatarID( avatar_id ),
00107 mSuggestedOnlineStatus(ONLINE_STATUS_NO)
00108 {
00109 setAutoFocus(TRUE);
00110
00111 LLCallbackMap::map_t factory_map;
00112
00113 factory_map["Panel Avatar"] = LLCallbackMap(createPanelAvatar, this);
00114
00115 LLUICtrlFactory::getInstance()->buildFloater(this, "floater_profile.xml", &factory_map);
00116
00117
00118 if(mPanelAvatarp)
00119 {
00120 mPanelAvatarp->selectTab(0);
00121 }
00122
00123 gAvatarInfoInstances.addData(avatar_id, this);
00124
00125
00126 }
00127
00128
00129 LLFloaterAvatarInfo::~LLFloaterAvatarInfo()
00130 {
00131
00132 gAvatarInfoInstances.removeData(mAvatarID);
00133
00134 }
00135
00136 void LLFloaterAvatarInfo::resetGroupList()
00137 {
00138
00139 if (mAvatarID != gAgentID)
00140 {
00141 return;
00142 }
00143
00144 mPanelAvatarp->resetGroupList();
00145 }
00146
00147
00148 LLFloaterAvatarInfo* LLFloaterAvatarInfo::show(const LLUUID &avatar_id)
00149 {
00150 if (avatar_id.isNull())
00151 {
00152 return NULL;
00153 }
00154
00155 LLFloaterAvatarInfo *floater;
00156 if (gAvatarInfoInstances.checkData(avatar_id))
00157 {
00158
00159 floater = gAvatarInfoInstances.getData(avatar_id);
00160 floater->open();
00161 }
00162 else
00163 {
00164 floater = new LLFloaterAvatarInfo("avatarinfo", FAI_RECT,
00165 avatar_id );
00166 floater->center();
00167 floater->open();
00168 }
00169 return floater;
00170 }
00171
00172
00173
00174 void LLFloaterAvatarInfo::showFromObject(
00175 const LLUUID& avatar_id,
00176 std::string tab_name)
00177 {
00178 LLFloaterAvatarInfo *floater = show(avatar_id);
00179 if (floater)
00180 {
00181 floater->mPanelAvatarp->setAvatarID(avatar_id, "", ONLINE_STATUS_NO);
00182 floater->mPanelAvatarp->selectTabByName(tab_name);
00183 }
00184 }
00185
00186
00187 void LLFloaterAvatarInfo::showFromDirectory(const LLUUID &avatar_id)
00188 {
00189 LLFloaterAvatarInfo *floater = show(avatar_id);
00190 if (floater)
00191 {
00192 floater->mPanelAvatarp->setAvatarID(avatar_id, "", ONLINE_STATUS_NO);
00193 }
00194 }
00195
00196
00197
00198 void LLFloaterAvatarInfo::showFromFriend(const LLUUID& agent_id, BOOL online)
00199 {
00200 LLFloaterAvatarInfo *floater = show(agent_id);
00201 if (floater)
00202 {
00203 floater->mSuggestedOnlineStatus = online ? ONLINE_STATUS_YES : ONLINE_STATUS_NO;
00204 }
00205 }
00206
00207
00208
00209 void LLFloaterAvatarInfo::showFromProfile(const LLUUID &avatar_id, LLRect rect)
00210 {
00211 if (avatar_id.isNull())
00212 {
00213 return;
00214 }
00215
00216 LLFloaterAvatarInfo *floater;
00217 if (gAvatarInfoInstances.checkData(avatar_id))
00218 {
00219
00220 floater = gAvatarInfoInstances.getData(avatar_id);
00221 }
00222 else
00223 {
00224 floater = new LLFloaterAvatarInfo("avatarinfo", FAI_RECT,
00225 avatar_id);
00226 floater->translate(rect.mLeft - floater->getRect().mLeft + 16,
00227 rect.mTop - floater->getRect().mTop - 16);
00228 floater->mPanelAvatarp->setAvatarID(avatar_id, "", ONLINE_STATUS_NO);
00229 }
00230 if (floater)
00231 {
00232 floater->open();
00233 }
00234 }
00235
00236 void LLFloaterAvatarInfo::showProfileCallback(S32 option, void *userdata)
00237 {
00238 if (option == 0)
00239 {
00240 showFromObject(gAgentID);
00241 }
00242 }
00243
00244
00246 void LLFloaterAvatarInfo::draw()
00247 {
00248
00249 LLFloater::draw();
00250 }
00251
00252
00253 BOOL LLFloaterAvatarInfo::canClose()
00254 {
00255 return mPanelAvatarp && mPanelAvatarp->canClose();
00256 }
00257
00258 LLFloaterAvatarInfo* LLFloaterAvatarInfo::getInstance(const LLUUID &id)
00259 {
00260 return gAvatarInfoInstances.getIfThere(gAgentID);
00261 }
00262
00263 void LLFloaterAvatarInfo::loadAsset()
00264 {
00265 if (mPanelAvatarp) {
00266 mPanelAvatarp->setAvatarID(mAvatarID, "", mSuggestedOnlineStatus);
00267 mAssetStatus = PREVIEW_ASSET_LOADING;
00268 }
00269 }
00270
00271 LLPreview::EAssetStatus LLFloaterAvatarInfo::getAssetStatus()
00272 {
00273 if (mPanelAvatarp && mPanelAvatarp->haveData())
00274 {
00275 mAssetStatus = PREVIEW_ASSET_LOADED;
00276 }
00277 return mAssetStatus;
00278 }