497 lines
15 KiB
C++
497 lines
15 KiB
C++
/**
|
|
* @file llpanelprofile.h
|
|
* @brief Profile panel
|
|
*
|
|
* $LicenseInfo:firstyear=2022&license=viewerlgpl$
|
|
* Second Life Viewer Source Code
|
|
* Copyright (C) 2022, 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$
|
|
*/
|
|
|
|
#ifndef LL_LLPANELPROFILE_H
|
|
#define LL_LLPANELPROFILE_H
|
|
|
|
#include "llavatarpropertiesprocessor.h"
|
|
#include "llcallingcard.h"
|
|
#include "llfloater.h"
|
|
#include "llpanel.h"
|
|
#include "llpanelavatar.h"
|
|
#include "llmediactrl.h"
|
|
#include "llvoiceclient.h"
|
|
#include "rlvhandler.h"
|
|
|
|
// class LLPanelProfileClassifieds;
|
|
// class LLTabContainer;
|
|
|
|
// class LLPanelProfileSecondLife;
|
|
// class LLPanelProfileWeb;
|
|
// class LLPanelProfilePicks;
|
|
// class LLPanelProfileFirstLife;
|
|
// class LLPanelProfileNotes;
|
|
|
|
class LLAvatarName;
|
|
class LLButton;
|
|
class LLCheckBoxCtrl;
|
|
class LLComboBox;
|
|
class LLIconCtrl;
|
|
class LLTabContainer;
|
|
class LLTextBox;
|
|
class LLTextureCtrl;
|
|
class LLMediaCtrl;
|
|
class LLGroupList;
|
|
class LLTextBase;
|
|
class LLMenuButton;
|
|
class LLLineEditor;
|
|
class LLTextEditor;
|
|
class LLThumbnailCtrl;
|
|
class LLPanelProfileClassifieds;
|
|
class LLPanelProfilePicks;
|
|
class LLViewerFetchedTexture;
|
|
|
|
// <FS:Zi> FIRE-32184: Online/Offline status not working for non-friends
|
|
class LLPanelProfileSecondLife;
|
|
|
|
class FSPanelPropertiesObserver : public LLAvatarPropertiesObserver
|
|
{
|
|
public:
|
|
FSPanelPropertiesObserver();
|
|
|
|
virtual void processProperties(void* data, EAvatarProcessorType type);
|
|
|
|
LLUUID mRequester;
|
|
LLPanelProfileSecondLife* mPanelProfile;
|
|
};
|
|
// </FS:Zi>
|
|
|
|
/**
|
|
* Panel for displaying Avatar's second life related info.
|
|
*/
|
|
class LLPanelProfileSecondLife
|
|
: public LLPanelProfilePropertiesProcessorTab
|
|
, public LLFriendObserver
|
|
, public LLVoiceClientStatusObserver
|
|
{
|
|
public:
|
|
LLPanelProfileSecondLife();
|
|
/*virtual*/ ~LLPanelProfileSecondLife();
|
|
|
|
void onOpen(const LLSD& key) override;
|
|
|
|
bool handleDragAndDrop(S32 x, S32 y, MASK mask, bool drop,
|
|
EDragAndDropType cargo_type,
|
|
void* cargo_data,
|
|
EAcceptance* accept,
|
|
std::string& tooltip_msg) override;
|
|
|
|
/**
|
|
* LLFriendObserver trigger
|
|
*/
|
|
void changed(U32 mask) override;
|
|
|
|
// Implements LLVoiceClientStatusObserver::onChange() to enable the call
|
|
// button when voice is available
|
|
void onChange(EStatusType status, const LLSD& channelInfo, bool proximal) override;
|
|
|
|
void setAvatarId(const LLUUID& avatar_id) override;
|
|
|
|
bool postBuild() override;
|
|
|
|
void resetData() override;
|
|
|
|
/**
|
|
* Sends update data request to server.
|
|
*/
|
|
void apply(LLAvatarData* data);
|
|
void updateData() override; // <FS> OpenSim
|
|
void refreshName();
|
|
|
|
void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
|
|
|
|
void setProfileImageUploading(bool loading);
|
|
void setProfileImageUploaded(const LLUUID &image_asset_id);
|
|
|
|
bool hasUnsavedChanges() override;
|
|
void commitUnsavedChanges() override;
|
|
|
|
void processProperties(void* data, EAvatarProcessorType type) override;
|
|
|
|
// <FS:Zi> FIRE-32184: Online/Offline status not working for non-friends
|
|
void onAvatarProperties(const LLAvatarData* data);
|
|
|
|
protected:
|
|
/**
|
|
* Process profile related data received from server.
|
|
*/
|
|
void processProfileProperties(const LLAvatarData* avatar_data);
|
|
|
|
/**
|
|
* Processes group related data received from server.
|
|
*/
|
|
// <FS> OpenSim
|
|
void processGroupProperties(const LLAvatarGroups* avatar_groups);
|
|
|
|
/**
|
|
* Fills common for Avatar profile and My Profile fields.
|
|
*/
|
|
void fillCommonData(const LLAvatarData* avatar_data);
|
|
|
|
/**
|
|
* Fills partner data.
|
|
*/
|
|
void fillPartnerData(const LLAvatarData* avatar_data);
|
|
|
|
/**
|
|
* Fills account status.
|
|
*/
|
|
void fillAccountStatus(const LLAvatarData* avatar_data);
|
|
|
|
/**
|
|
* Sets permissions specific icon
|
|
*/
|
|
void fillRightsData();
|
|
|
|
/**
|
|
* Fills user name, display name, age.
|
|
*/
|
|
void fillAgeData(const LLAvatarData* avatar_data);
|
|
|
|
void onImageLoaded(bool success, LLViewerFetchedTexture *imagep);
|
|
static void onImageLoaded(bool success,
|
|
LLViewerFetchedTexture *src_vi,
|
|
LLImageRaw* src,
|
|
LLImageRaw* aux_src,
|
|
S32 discard_level,
|
|
bool final,
|
|
void* userdata);
|
|
|
|
/**
|
|
* Displays avatar's online status if possible.
|
|
*
|
|
* Requirements from EXT-3880:
|
|
* For friends:
|
|
* - Online when online and privacy settings allow to show
|
|
* - Offline when offline and privacy settings allow to show
|
|
* - Else: nothing
|
|
* For other avatars:
|
|
* - Online when online and was not set in Preferences/"Only Friends & Groups can see when I am online"
|
|
* - Else: Offline
|
|
*/
|
|
void updateOnlineStatus();
|
|
void processOnlineStatus(bool is_friend, bool show_online, bool online);
|
|
|
|
private:
|
|
void setLoaded() override;
|
|
void onCommitMenu(const LLSD& userdata);
|
|
bool onEnableMenu(const LLSD& userdata);
|
|
bool onCheckMenu(const LLSD& userdata);
|
|
void onAvatarNameCacheSetName(const LLUUID& id, const LLAvatarName& av_name);
|
|
|
|
void setDescriptionText(const std::string &text);
|
|
// <AS:Chanayane> Preview button
|
|
void reparseDescriptionText(const std::string& text);
|
|
// </AS:Chanayane>
|
|
void onSetDescriptionDirty();
|
|
void onShowInSearchCallback();
|
|
void onHideAgeCallback();
|
|
void onSaveDescriptionChanges();
|
|
void onDiscardDescriptionChanges();
|
|
void onShowAgentPermissionsDialog();
|
|
void onShowAgentProfileTexture();
|
|
void onShowTexturePicker();
|
|
void onSecondLifePicChanged(); // <FS:Zi> Allow proper texture swatch handling
|
|
void onCommitProfileImage(const LLUUID& id);
|
|
|
|
// <FS:Ansariel> Fix LL UI/UX design accident
|
|
enum class BadgeLocation
|
|
{
|
|
top,
|
|
bottom
|
|
};
|
|
void updateButtons();
|
|
void setBadge(std::string_view icon_name, std::string_view tooltip, BadgeLocation location);
|
|
|
|
private:
|
|
typedef std::map<std::string, LLUUID> group_map_t;
|
|
group_map_t mGroups;
|
|
void openGroupProfile();
|
|
|
|
LLTextBox* mStatusText; // <FS:Ansariel> Fix LL UI/UX design accident
|
|
LLGroupList* mGroupList;
|
|
// <FS:Ansariel> Fix LL UI/UX design accident
|
|
//LLComboBox* mShowInSearchCombo;
|
|
//LLComboBox* mHideAgeCombo;
|
|
LLCheckBoxCtrl* mShowInSearchCheckbox;
|
|
LLCheckBoxCtrl* mHideAgeCheckbox;
|
|
// </FS:Ansariel>
|
|
// <FS:Zi> Allow proper texture swatch handling
|
|
// LLThumbnailCtrl* mSecondLifePic;
|
|
LLTextureCtrl* mSecondLifePic;
|
|
// </FS:Zi>
|
|
LLPanel* mSecondLifePicLayout;
|
|
LLTextEditor* mDescriptionEdit;
|
|
//LLMenuButton* mAgentActionMenuButton; // <FS:Ansariel> Fix LL UI/UX design accident
|
|
LLButton* mSaveDescriptionChanges;
|
|
LLButton* mDiscardDescriptionChanges;
|
|
LLIconCtrl* mCanSeeOnlineIcon;
|
|
LLIconCtrl* mCantSeeOnlineIcon;
|
|
LLIconCtrl* mCanSeeOnMapIcon;
|
|
LLIconCtrl* mCantSeeOnMapIcon;
|
|
LLIconCtrl* mCanEditObjectsIcon;
|
|
LLIconCtrl* mCantEditObjectsIcon;
|
|
// <FS:Ansariel> Fix LL UI/UX design accident
|
|
LLMenuButton* mCopyMenuButton;
|
|
LLButton* mGroupInviteButton;
|
|
LLButton* mDisplayNameButton;
|
|
LLMenuButton* mImageActionMenuButton;
|
|
LLButton* mTeleportButton;
|
|
LLButton* mShowOnMapButton;
|
|
LLButton* mBlockButton;
|
|
LLButton* mUnblockButton;
|
|
LLButton* mAddFriendButton;
|
|
LLButton* mRemoveFriendButton; // <FS:Zi> Add "Remove Friend" button to profile
|
|
LLButton* mPayButton;
|
|
LLButton* mIMButton;
|
|
LLMenuButton* mOverflowButton;
|
|
// </FS:Ansariel>
|
|
LLButton* mPreviewButton; // <AS:Chanayane> Preview button
|
|
|
|
LLHandle<LLFloater> mFloaterPermissionsHandle;
|
|
LLHandle<LLFloater> mFloaterProfileTextureHandle;
|
|
LLHandle<LLFloater> mFloaterTexturePickerHandle;
|
|
|
|
bool mHasUnsavedDescriptionChanges;
|
|
bool mVoiceStatus;
|
|
bool mWaitingForImageUpload;
|
|
bool mAllowPublish;
|
|
bool mPreview; // <AS:Chanayane> Preview button
|
|
bool mHideAge;
|
|
std::string mDescriptionText;
|
|
std::string mOriginalDescriptionText; // <AS:Chanayane> Preview button
|
|
LLUUID mImageId;
|
|
|
|
boost::signals2::connection mAvatarNameCacheConnection;
|
|
|
|
// <FS:Ansariel> RLVa support
|
|
boost::signals2::connection mRlvBehaviorCallbackConnection;
|
|
void updateRlvRestrictions(ERlvBehaviour behavior);
|
|
// </FS:Ansariel>
|
|
|
|
// <FS:Zi> FIRE-32184: Online/Offline status not working for non-friends
|
|
FSPanelPropertiesObserver mPropertiesObserver;
|
|
};
|
|
|
|
|
|
/**
|
|
* Panel for displaying Avatar's web profile and home page.
|
|
*/
|
|
class LLPanelProfileWeb
|
|
: public LLPanelProfileTab
|
|
, public LLViewerMediaObserver
|
|
{
|
|
public:
|
|
LLPanelProfileWeb();
|
|
/*virtual*/ ~LLPanelProfileWeb();
|
|
|
|
void onOpen(const LLSD& key) override;
|
|
|
|
bool postBuild() override;
|
|
|
|
void resetData() override;
|
|
|
|
/**
|
|
* Loads web profile.
|
|
*/
|
|
void updateData() override;
|
|
void apply(LLAvatarData* data);
|
|
|
|
void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) override;
|
|
|
|
void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name);
|
|
|
|
protected:
|
|
void onCommitLoad(LLUICtrl* ctrl);
|
|
|
|
private:
|
|
std::string mURLHome;
|
|
std::string mURLWebProfile;
|
|
LLMediaCtrl* mWebBrowser;
|
|
|
|
LLFrameTimer mPerformanceTimer;
|
|
bool mFirstNavigate;
|
|
|
|
boost::signals2::connection mAvatarNameCacheConnection;
|
|
};
|
|
|
|
/**
|
|
* Panel for displaying Avatar's first life related info.
|
|
*/
|
|
class LLPanelProfileFirstLife
|
|
: public LLPanelProfilePropertiesProcessorTab
|
|
{
|
|
public:
|
|
LLPanelProfileFirstLife();
|
|
/*virtual*/ ~LLPanelProfileFirstLife();
|
|
|
|
void onOpen(const LLSD& key) override;
|
|
|
|
bool postBuild() override;
|
|
|
|
void processProperties(void * data, EAvatarProcessorType type) override;
|
|
void processProperties(const LLAvatarData* avatar_data);
|
|
void apply(LLAvatarData* data);
|
|
void resetData() override;
|
|
|
|
void setProfileImageUploading(bool loading);
|
|
void setProfileImageUploaded(const LLUUID &image_asset_id);
|
|
|
|
bool hasUnsavedChanges() override { return mHasUnsavedChanges; }
|
|
void commitUnsavedChanges() override;
|
|
|
|
protected:
|
|
void setLoaded() override;
|
|
|
|
void onUploadPhoto();
|
|
void onChangePhoto();
|
|
void onRemovePhoto();
|
|
void onFirstLifePicChanged(); // <FS:Zi> Allow proper texture swatch handling
|
|
void onCommitPhoto(const LLUUID& id);
|
|
void setDescriptionText(const std::string &text);
|
|
// <AS:Chanayane> Preview button
|
|
void reparseDescriptionText(const std::string& text);
|
|
// </AS:Chanayane>
|
|
void onSetDescriptionDirty();
|
|
void onSaveDescriptionChanges();
|
|
void onDiscardDescriptionChanges();
|
|
void onClickPreview(); // <AS:Chanayane> Preview button
|
|
|
|
LLTextEditor* mDescriptionEdit;
|
|
// <FS:Zi> Allow proper texture swatch handling
|
|
// LLThumbnailCtrl* mPicture;
|
|
LLTextureCtrl* mPicture;
|
|
// </FS:Zi>
|
|
LLButton* mUploadPhoto;
|
|
LLButton* mChangePhoto;
|
|
LLButton* mRemovePhoto;
|
|
LLButton* mSaveChanges;
|
|
LLButton* mDiscardChanges;
|
|
LLButton* mPreviewButton; // <AS:Chanayane> Preview button
|
|
|
|
LLHandle<LLFloater> mFloaterTexturePickerHandle;
|
|
|
|
std::string mCurrentDescription;
|
|
LLUUID mImageId;
|
|
bool mHasUnsavedChanges;
|
|
// <AS:Chanayane> Preview button
|
|
bool mPreview;
|
|
std::string mOriginalDescription;
|
|
// </AS:Chanayane>
|
|
};
|
|
|
|
/**
|
|
* Panel for displaying Avatar's notes and modifying friend's rights.
|
|
*/
|
|
class LLPanelProfileNotes
|
|
: public LLPanelProfilePropertiesProcessorTab
|
|
{
|
|
public:
|
|
LLPanelProfileNotes();
|
|
/*virtual*/ ~LLPanelProfileNotes();
|
|
|
|
void onOpen(const LLSD& key) override;
|
|
|
|
bool postBuild() override;
|
|
|
|
void processProperties(void * data, EAvatarProcessorType type) override;
|
|
void processProperties(const LLAvatarData* avatar_data);
|
|
void resetData() override;
|
|
|
|
// <FS> OpenSim
|
|
void updateData() override;
|
|
|
|
bool hasUnsavedChanges() override { return mHasUnsavedChanges; }
|
|
void commitUnsavedChanges() override;
|
|
|
|
protected:
|
|
void setNotesText(const std::string &text);
|
|
void onSetNotesDirty();
|
|
void onSaveNotesChanges();
|
|
void onDiscardNotesChanges();
|
|
|
|
LLTextEditor* mNotesEditor;
|
|
LLButton* mSaveChanges;
|
|
LLButton* mDiscardChanges;
|
|
|
|
std::string mCurrentNotes;
|
|
bool mHasUnsavedChanges;
|
|
};
|
|
|
|
|
|
/**
|
|
* Container panel for the profile tabs
|
|
*/
|
|
class LLPanelProfile
|
|
: public LLPanelProfileTab
|
|
{
|
|
public:
|
|
LLPanelProfile();
|
|
/*virtual*/ ~LLPanelProfile();
|
|
|
|
bool postBuild() override;
|
|
|
|
void updateData() override;
|
|
void refreshName();
|
|
|
|
void onOpen(const LLSD& key) override;
|
|
|
|
void createPick(const LLPickData &data);
|
|
void showPick(const LLUUID& pick_id = LLUUID::null);
|
|
bool isPickTabSelected();
|
|
bool isNotesTabSelected();
|
|
bool hasUnsavedChanges() override;
|
|
bool hasUnpublishedClassifieds();
|
|
void commitUnsavedChanges() override;
|
|
|
|
void showClassified(const LLUUID& classified_id = LLUUID::null, bool edit = false);
|
|
void createClassified();
|
|
|
|
LLAvatarData getAvatarData() { return mAvatarData; };
|
|
void setAvatarData(const LLAvatarData* avatar_data){ mAvatarData = *avatar_data; };
|
|
|
|
private:
|
|
void onTabChange();
|
|
|
|
LLPanelProfileSecondLife* mPanelSecondlife;
|
|
LLPanelProfileWeb* mPanelWeb;
|
|
LLPanelProfilePicks* mPanelPicks;
|
|
LLPanelProfileClassifieds* mPanelClassifieds;
|
|
LLPanelProfileFirstLife* mPanelFirstlife;
|
|
LLPanelProfileNotes* mPanelNotes;
|
|
LLTabContainer* mTabContainer;
|
|
|
|
// <FS> OpenSim
|
|
// Todo: due to server taking minutes to update this needs a more long term storage
|
|
// to reuse recently saved values if user opens floater again
|
|
// Storage implementation depends onto how a cap will be implemented, if cap will be
|
|
// enought to fully update LLAvatarPropertiesProcessor, then this storage can be
|
|
// implemented there.
|
|
LLAvatarData mAvatarData;
|
|
};
|
|
|
|
#endif //LL_LLPANELPROFILE_H
|