SL-17532 Ability to pick inventory image as a profile image

master
Andrey Kleshchev 2022-06-09 00:22:02 +03:00
parent 8ef8497add
commit ababcc700c
6 changed files with 282 additions and 34 deletions

View File

@ -1374,6 +1374,7 @@ void LLOutfitGallery::onSelectPhoto(LLUUID selected_outfit_id)
texture_floaterp->setOnFloaterCommitCallback(boost::bind(&LLOutfitGallery::onTexturePickerCommit, this, _1, _2));
texture_floaterp->setOnUpdateImageStatsCallback(boost::bind(&LLOutfitGallery::onTexturePickerUpdateImageStats, this, _1));
texture_floaterp->setLocalTextureEnabled(FALSE);
texture_floaterp->setBakeTextureEnabled(FALSE);
texture_floaterp->setCanApply(false, true);
}

View File

@ -169,6 +169,14 @@ void request_avatar_properties_coro(std::string cap_url, LLUUID agent_id)
{
avatar_data->flags |= AVATAR_ALLOW_PUBLISH;
}
if (result["identified"].asBoolean())
{
avatar_data->flags |= AVATAR_IDENTIFIED;
}
if (result["transacted"].asBoolean())
{
avatar_data->flags |= AVATAR_TRANSACTED;
}
avatar_data->caption_index = 0;
if (result.has("charter_member")) // won't be present if "caption" is set
@ -1412,6 +1420,10 @@ void LLProfileImagePicker::notify(const std::vector<std::string>& filenames)
{
return;
}
if (filenames.empty())
{
return;
}
std::string file_path = filenames[0];
if (file_path.empty())
{
@ -1541,34 +1553,28 @@ void LLPanelProfileSecondLife::onCommitMenu(const LLSD& userdata)
url = LLWeb::expandURLSubstitutions(url, subs);
LLUrlAction::openURL(url);
}
else if (item_name == "change_photo")
else if (item_name == "upload_photo")
{
(new LLProfileImagePicker(PROFILE_IMAGE_SL, new LLHandle<LLPanel>(getHandle())))->getFile();
LLFloater* floaterp = mFloaterTexturePickerHandle.get();
if (floaterp)
{
floaterp->closeFloater();
}
}
else if (item_name == "change_photo")
{
onShowTexturePicker();
}
else if (item_name == "remove_photo")
{
LLSD params;
params["sl_image_id"] = LLUUID::null;
onCommitProfileImage(LLUUID::null);
std::string cap_url = gAgent.getRegionCapability(PROFILE_PROPERTIES_CAP);
if (!cap_url.empty())
LLFloater* floaterp = mFloaterTexturePickerHandle.get();
if (floaterp)
{
LLCoros::instance().launch("putAgentUserInfoCoro",
boost::bind(put_avatar_properties_coro, cap_url, getAvatarId(), params));
mSecondLifePic->setValue("Generic_Person_Large");
mImageId = LLUUID::null;
LLFloater *floater = mFloaterProfileTextureHandle.get();
if (floater)
{
LLFloaterProfileTexture * texture_view = dynamic_cast<LLFloaterProfileTexture*>(floater);
texture_view->resetAsset();
}
}
else
{
LL_WARNS("AvatarProperties") << "Failed to update profile data, no cap found" << LL_ENDL;
floaterp->closeFloater();
}
}
}
@ -1615,15 +1621,16 @@ bool LLPanelProfileSecondLife::onEnableMenu(const LLSD& userdata)
{
return !mAvatarNameCacheConnection.connected();
}
else if (item_name == "change_photo")
else if (item_name == "upload_photo"
|| item_name == "change_photo")
{
std::string cap_url = gAgent.getRegionCapability(PROFILE_IMAGE_UPLOAD_CAP);
return !cap_url.empty() && !mWaitingForImageUpload;
return !cap_url.empty() && !mWaitingForImageUpload && getIsLoaded();
}
else if (item_name == "remove_photo")
{
std::string cap_url = gAgent.getRegionCapability(PROFILE_PROPERTIES_CAP);
return mImageId.notNull() && !cap_url.empty() && !mWaitingForImageUpload;
return mImageId.notNull() && !cap_url.empty() && !mWaitingForImageUpload && getIsLoaded();
}
return false;
@ -1799,6 +1806,117 @@ void LLPanelProfileSecondLife::onShowAgentProfileTexture()
}
}
void LLPanelProfileSecondLife::onShowTexturePicker()
{
LLFloater* floaterp = mFloaterTexturePickerHandle.get();
// Show the dialog
if (!floaterp)
{
LLFloater* parent_floater = gFloaterView->getParentFloater(this);
if (parent_floater)
{
// because inventory construction is somewhat slow
getWindow()->setCursor(UI_CURSOR_WAIT);
LLFloaterTexturePicker* texture_floaterp = new LLFloaterTexturePicker(
this,
mImageId,
LLUUID::null,
mImageId,
FALSE,
FALSE,
"SELECT PHOTO",
PERM_NONE,
PERM_NONE,
PERM_NONE,
FALSE,
NULL);
mFloaterTexturePickerHandle = texture_floaterp->getHandle();
texture_floaterp->setOnFloaterCommitCallback([this](LLTextureCtrl::ETexturePickOp op, LLUUID id)
{
if (op == LLTextureCtrl::TEXTURE_SELECT)
{
LLUUID image_asset_id;
LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterTexturePickerHandle.get();
if (floaterp)
{
if (id.notNull())
{
image_asset_id = id;
}
else
{
image_asset_id = floaterp->getAssetID();
}
}
onCommitProfileImage(image_asset_id);
}
});
texture_floaterp->setLocalTextureEnabled(FALSE);
texture_floaterp->setBakeTextureEnabled(FALSE);
texture_floaterp->setCanApply(false, true);
parent_floater->addDependentFloater(mFloaterTexturePickerHandle);
texture_floaterp->openFloater();
texture_floaterp->setFocus(TRUE);
}
}
else
{
floaterp->setMinimized(FALSE);
floaterp->setVisibleAndFrontmost(TRUE);
}
}
void LLPanelProfileSecondLife::onCommitProfileImage(const LLUUID& id)
{
if (mImageId == id)
{
return;
}
std::string cap_url = gAgent.getRegionCapability(PROFILE_PROPERTIES_CAP);
if (!cap_url.empty())
{
LLSD params;
params["sl_image_id"] = id;
LLCoros::instance().launch("putAgentUserInfoCoro",
boost::bind(put_avatar_properties_coro, cap_url, getAvatarId(), params));
mImageId = id;
if (mImageId == LLUUID::null)
{
mSecondLifePic->setValue("Generic_Person_Large");
}
else
{
mSecondLifePic->setValue(mImageId);
}
LLFloater *floater = mFloaterProfileTextureHandle.get();
if (floater)
{
LLFloaterProfileTexture * texture_view = dynamic_cast<LLFloaterProfileTexture*>(floater);
if (mImageId == LLUUID::null)
{
texture_view->resetAsset();
}
else
{
texture_view->loadAsset(mImageId);
}
}
}
else
{
LL_WARNS("AvatarProperties") << "Failed to update profile data, no cap found" << LL_ENDL;
}
}
void LLPanelProfileSecondLife::onOpenNotes()
{
LLFloater* parent_floater = gFloaterView->getParentFloater(this);
@ -1973,11 +2091,13 @@ BOOL LLPanelProfileFirstLife::postBuild()
mDescriptionEdit = getChild<LLTextEditor>("fl_description_edit");
mPicture = getChild<LLIconCtrl>("real_world_pic");
mChangePhoto = getChild<LLButton>("fl_upload_image");
mUploadPhoto = getChild<LLButton>("fl_upload_image");
mChangePhoto = getChild<LLButton>("fl_change_image");
mRemovePhoto = getChild<LLButton>("fl_remove_image");
mSaveChanges = getChild<LLButton>("fl_save_changes");
mDiscardChanges = getChild<LLButton>("fl_discard_changes");
mUploadPhoto->setCommitCallback([this](LLUICtrl*, void*) { onUploadPhoto(); }, nullptr);
mChangePhoto->setCommitCallback([this](LLUICtrl*, void*) { onChangePhoto(); }, nullptr);
mRemovePhoto->setCommitCallback([this](LLUICtrl*, void*) { onRemovePhoto(); }, nullptr);
mSaveChanges->setCommitCallback([this](LLUICtrl*, void*) { onSaveDescriptionChanges(); }, nullptr);
@ -2002,8 +2122,9 @@ void LLPanelProfileFirstLife::onOpen(const LLSD& key)
void LLPanelProfileFirstLife::setProfileImageUploading(bool loading)
{
mUploadPhoto->setEnabled(!loading);
mChangePhoto->setEnabled(!loading);
mRemovePhoto->setEnabled(!loading);
mRemovePhoto->setEnabled(!loading && mImageId.notNull());
LLLoadingIndicator* indicator = getChild<LLLoadingIndicator>("image_upload_indicator");
indicator->setVisible(loading);
@ -2031,23 +2152,107 @@ void LLPanelProfileFirstLife::commitUnsavedChanges()
}
}
void LLPanelProfileFirstLife::onChangePhoto()
void LLPanelProfileFirstLife::onUploadPhoto()
{
(new LLProfileImagePicker(PROFILE_IMAGE_FL, new LLHandle<LLPanel>(getHandle())))->getFile();
}
void LLPanelProfileFirstLife::onChangePhoto()
{
LLFloater* floaterp = mFloaterTexturePickerHandle.get();
// Show the dialog
if (!floaterp)
{
LLFloater* parent_floater = gFloaterView->getParentFloater(this);
if (parent_floater)
{
// because inventory construction is somewhat slow
getWindow()->setCursor(UI_CURSOR_WAIT);
LLFloaterTexturePicker* texture_floaterp = new LLFloaterTexturePicker(
this,
mImageId,
LLUUID::null,
mImageId,
FALSE,
FALSE,
"SELECT PHOTO",
PERM_NONE,
PERM_NONE,
PERM_NONE,
FALSE,
NULL);
mFloaterTexturePickerHandle = texture_floaterp->getHandle();
texture_floaterp->setOnFloaterCommitCallback([this](LLTextureCtrl::ETexturePickOp op, LLUUID id)
{
if (op == LLTextureCtrl::TEXTURE_SELECT)
{
LLUUID image_asset_id;
LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterTexturePickerHandle.get();
if (floaterp)
{
if (id.notNull())
{
image_asset_id = id;
}
else
{
image_asset_id = floaterp->getAssetID();
}
}
onCommitPhoto(image_asset_id);
}
});
texture_floaterp->setLocalTextureEnabled(FALSE);
texture_floaterp->setCanApply(false, true);
parent_floater->addDependentFloater(mFloaterTexturePickerHandle);
texture_floaterp->openFloater();
texture_floaterp->setFocus(TRUE);
}
}
else
{
floaterp->setMinimized(FALSE);
floaterp->setVisibleAndFrontmost(TRUE);
}
}
void LLPanelProfileFirstLife::onRemovePhoto()
{
LLSD params;
params["fl_image_id"] = LLUUID::null;
onCommitPhoto(LLUUID::null);
}
void LLPanelProfileFirstLife::onCommitPhoto(const LLUUID& id)
{
if (mImageId == id)
{
return;
}
std::string cap_url = gAgent.getRegionCapability(PROFILE_PROPERTIES_CAP);
if (!cap_url.empty())
{
LLSD params;
params["fl_image_id"] = id;
LLCoros::instance().launch("putAgentUserInfoCoro",
boost::bind(put_avatar_properties_coro, cap_url, getAvatarId(), params));
mPicture->setValue("Generic_Person_Large");
mImageId = id;
if (mImageId.notNull())
{
mPicture->setValue(mImageId);
}
else
{
mPicture->setValue("Generic_Person_Large");
}
mRemovePhoto->setEnabled(mImageId.notNull());
}
else
{
@ -2099,14 +2304,18 @@ void LLPanelProfileFirstLife::onDiscardDescriptionChanges()
void LLPanelProfileFirstLife::processProperties(const LLAvatarData* avatar_data)
{
setDescriptionText(avatar_data->fl_about_text);
if (avatar_data->fl_image_id.notNull())
mImageId = avatar_data->fl_image_id;
if (mImageId.notNull())
{
mPicture->setValue(avatar_data->fl_image_id);
mPicture->setValue(mImageId);
}
else
{
mPicture->setValue("Generic_Person_Large");
}
setLoaded();
}
@ -2115,6 +2324,7 @@ void LLPanelProfileFirstLife::resetData()
mDescriptionEdit->setValue(LLStringUtil::null);
mPicture->setValue("Generic_Person_Large");
mUploadPhoto->setVisible(getSelfProfile());
mChangePhoto->setVisible(getSelfProfile());
mRemovePhoto->setVisible(getSelfProfile());
mSaveChanges->setVisible(getSelfProfile());
@ -2129,6 +2339,7 @@ void LLPanelProfileFirstLife::setLoaded()
{
mDescriptionEdit->setEnabled(TRUE);
mPicture->setEnabled(TRUE);
mRemovePhoto->setEnabled(mImageId.notNull());
}
}

View File

@ -181,6 +181,8 @@ private:
void onDiscardDescriptionChanges();
void onShowAgentPermissionsDialog();
void onShowAgentProfileTexture();
void onShowTexturePicker();
void onCommitProfileImage(const LLUUID& id);
void onOpenNotes();
private:
@ -205,6 +207,7 @@ private:
LLHandle<LLFloater> mFloaterPermissionsHandle;
LLHandle<LLFloater> mFloaterProfileTextureHandle;
LLHandle<LLFloater> mFloaterTexturePickerHandle;
bool mHasUnsavedDescriptionChanges;
bool mVoiceStatus;
@ -288,8 +291,10 @@ public:
protected:
void setLoaded() override;
void onUploadPhoto();
void onChangePhoto();
void onRemovePhoto();
void onCommitPhoto(const LLUUID& id);
void setDescriptionText(const std::string &text);
void onSetDescriptionDirty();
void onSaveDescriptionChanges();
@ -297,12 +302,16 @@ protected:
LLTextEditor* mDescriptionEdit;
LLIconCtrl* mPicture;
LLButton* mUploadPhoto;
LLButton* mChangePhoto;
LLButton* mRemovePhoto;
LLButton* mSaveChanges;
LLButton* mDiscardChanges;
std::string mCurrentDescription;
LLHandle<LLFloater> mFloaterTexturePickerHandle;
std::string mCurrentDescription;
LLUUID mImageId;
bool mHasUnsavedChanges;
};

View File

@ -290,4 +290,11 @@
<menu_item_call.on_visible
function="EnableMuteParticle" />
</menu_item_call>
<menu_item_separator/>
<menu_item_call label="View Profile"
layout="topleft"
name="show_avatar_profile">
<menu_item_call.on_click
function="Avatar.ToggleMyProfile" />
</menu_item_call>
</context_menu>

View File

@ -18,6 +18,17 @@
function="Profile.Commit"
parameter="edit_partner"/>
</menu_item_call>
<menu_item_call
label="Upload Photo"
layout="topleft"
name="upload_photo">
<menu_item_call.on_click
function="Profile.Commit"
parameter="upload_photo"/>
<menu_item_call.on_enable
function="Profile.EnableItem"
parameter="upload_photo"/>
</menu_item_call>
<menu_item_call
label="Change Photo"
layout="topleft"

View File

@ -39,8 +39,17 @@
visible="false"/>
<button
name="fl_upload_image"
label="Upload Photo"
top="102"
left="175"
height="20"
width="120"
follows="top|left"
layout="topleft"/>
<button
name="fl_change_image"
label="Change Photo"
top="127"
top_pad="5"
left="175"
height="20"
width="120"