llpanelprofileview.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:6k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2. * @file llpanelprofileview.cpp
  3. * @brief Side tray "Profile View" panel
  4. *
  5. * $LicenseInfo:firstyear=2009&license=viewergpl$
  6. * Copyright (c) 2009-2010, Linden Research, Inc.
  7. * Second Life Viewer Source Code
  8. * The source code in this file ("Source Code") is provided by Linden Lab
  9. * to you under the terms of the GNU General Public License, version 2.0
  10. * ("GPL"), unless you have obtained a separate licensing agreement
  11. * ("Other License"), formally executed by you and Linden Lab.  Terms of
  12. * the GPL can be found in doc/GPL-license.txt in this distribution, or
  13. * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  14. * There are special exceptions to the terms and conditions of the GPL as
  15. * it is applied to this Source Code. View the full text of the exception
  16. * in the file doc/FLOSS-exception.txt in this software distribution, or
  17. * online at
  18. * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  19. * By copying, modifying or distributing this software, you acknowledge
  20. * that you have read and understood your obligations described above,
  21. * and agree to abide by those obligations.
  22. * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  23. * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  24. * COMPLETENESS OR PERFORMANCE.
  25. * $/LicenseInfo$
  26. */
  27. #include "llviewerprecompiledheaders.h"
  28. #include "llavatarconstants.h"
  29. #include "lluserrelations.h"
  30. #include "llpanelprofileview.h"
  31. #include "llavatarpropertiesprocessor.h"
  32. #include "llcallingcard.h"
  33. #include "llpanelavatar.h"
  34. #include "llpanelpicks.h"
  35. #include "llpanelprofile.h"
  36. #include "llsidetraypanelcontainer.h"
  37. static LLRegisterPanelClassWrapper<LLPanelProfileView> t_panel_target_profile("panel_profile_view");
  38. static std::string PANEL_NOTES = "panel_notes";
  39. static const std::string PANEL_PROFILE = "panel_profile";
  40. static const std::string PANEL_PICKS = "panel_picks";
  41. class AvatarStatusObserver : public LLAvatarPropertiesObserver
  42. {
  43. public:
  44. AvatarStatusObserver(LLPanelProfileView* profile_view)
  45. {
  46. mProfileView = profile_view;
  47. }
  48. void processProperties(void* data, EAvatarProcessorType type)
  49. {
  50. if(APT_PROPERTIES != type) return;
  51. const LLAvatarData* avatar_data = static_cast<const LLAvatarData*>(data);
  52. if(avatar_data && mProfileView->getAvatarId() == avatar_data->avatar_id)
  53. {
  54. mProfileView->processOnlineStatus(avatar_data->flags & AVATAR_ONLINE);
  55. LLAvatarPropertiesProcessor::instance().removeObserver(mProfileView->getAvatarId(), this);
  56. }
  57. }
  58. void subscribe()
  59. {
  60. LLAvatarPropertiesProcessor::instance().addObserver(mProfileView->getAvatarId(), this);
  61. }
  62. private:
  63. LLPanelProfileView* mProfileView;
  64. };
  65. LLPanelProfileView::LLPanelProfileView()
  66. : LLPanelProfile()
  67. , mStatusText(NULL)
  68. , mAvatarStatusObserver(NULL)
  69. {
  70. mAvatarStatusObserver = new AvatarStatusObserver(this);
  71. }
  72. LLPanelProfileView::~LLPanelProfileView(void)
  73. {
  74. delete mAvatarStatusObserver;
  75. }
  76. /*virtual*/ 
  77. void LLPanelProfileView::onOpen(const LLSD& key)
  78. {
  79. LLUUID id;
  80. if(key.has("id"))
  81. {
  82. id = key["id"];
  83. }
  84. if(id.notNull() && getAvatarId() != id)
  85. {
  86. setAvatarId(id);
  87. }
  88. // Update the avatar name.
  89. gCacheName->get(getAvatarId(), FALSE,
  90. boost::bind(&LLPanelProfileView::onAvatarNameCached, this, _1, _2, _3, _4));
  91. updateOnlineStatus();
  92. LLPanelProfile::onOpen(key);
  93. }
  94. BOOL LLPanelProfileView::postBuild()
  95. {
  96. LLPanelProfile::postBuild();
  97. getTabContainer()[PANEL_NOTES] = getChild<LLPanelAvatarNotes>(PANEL_NOTES);
  98. //*TODO remove this, according to style guide we don't use status combobox
  99. getTabContainer()[PANEL_PROFILE]->childSetVisible("online_me_status_text", FALSE);
  100. getTabContainer()[PANEL_PROFILE]->childSetVisible("status_combo", FALSE);
  101. mStatusText = getChild<LLTextBox>("status");
  102. mStatusText->setVisible(false);
  103. childSetCommitCallback("back",boost::bind(&LLPanelProfileView::onBackBtnClick,this),NULL);
  104. return TRUE;
  105. }
  106. //private
  107. void LLPanelProfileView::onBackBtnClick()
  108. {
  109. // Set dummy value to make picks panel dirty, 
  110. // This will make Picks reload on next open.
  111. getTabContainer()[PANEL_PICKS]->setValue(LLSD());
  112. LLSideTrayPanelContainer* parent = dynamic_cast<LLSideTrayPanelContainer*>(getParent());
  113. if(parent)
  114. {
  115. parent->openPreviousPanel();
  116. }
  117. }
  118. bool LLPanelProfileView::isGrantedToSeeOnlineStatus()
  119. {
  120. const LLRelationship* relationship = LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
  121. if (NULL == relationship)
  122. return false;
  123. // *NOTE: GRANT_ONLINE_STATUS is always set to false while changing any other status.
  124. // When avatar disallow me to see her online status processOfflineNotification Message is received by the viewer
  125. // see comments for ChangeUserRights template message. EXT-453.
  126. // If GRANT_ONLINE_STATUS flag is changed it will be applied when viewer restarts. EXT-3880
  127. return relationship->isRightGrantedFrom(LLRelationship::GRANT_ONLINE_STATUS);
  128. }
  129. // method was disabled according to EXT-2022. Re-enabled & improved according to EXT-3880
  130. void LLPanelProfileView::updateOnlineStatus()
  131. {
  132. // set text box visible to show online status for non-friends who has not set in Preferences
  133. // "Only Friends & Groups can see when I am online"
  134. mStatusText->setVisible(TRUE);
  135. const LLRelationship* relationship = LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
  136. if (NULL == relationship)
  137. {
  138. // this is non-friend avatar. Status will be updated from LLAvatarPropertiesProcessor.
  139. // in LLPanelProfileView::processOnlineStatus()
  140. // subscribe observer to get online status. Request will be sent by LLPanelAvatarProfile itself.
  141. // do not subscribe for friend avatar because online status can be wrong overridden
  142. // via LLAvatarData::flags if Preferences: "Only Friends & Groups can see when I am online" is set.
  143. mAvatarStatusObserver->subscribe();
  144. return;
  145. }
  146. // For friend let check if he allowed me to see his status
  147. // status should only show if viewer has permission to view online/offline. EXT-453, EXT-3880
  148. mStatusText->setVisible(isGrantedToSeeOnlineStatus());
  149. bool online = relationship->isOnline();
  150. processOnlineStatus(online);
  151. }
  152. void LLPanelProfileView::processOnlineStatus(bool online)
  153. {
  154. std::string status = getString(online ? "status_online" : "status_offline");
  155. mStatusText->setValue(status);
  156. }
  157. void LLPanelProfileView::onAvatarNameCached(const LLUUID& id, const std::string& first_name, const std::string& last_name, BOOL is_group)
  158. {
  159. llassert(getAvatarId() == id);
  160. getChild<LLUICtrl>("user_name", FALSE)->setValue(first_name + " " + last_name);
  161. }
  162. // EOF