jira-archive-internal#71115 Add Images to Objects in Bulk #2

UI integration
master
Andrey Kleshchev 2024-02-20 01:13:58 +02:00 committed by Andrey Kleshchev
parent a657b9b52d
commit 11ded7b9a2
4 changed files with 119 additions and 17 deletions

View File

@ -103,6 +103,7 @@ void LLThumbnailImagePicker::notify(const std::vector<std::string>& filenames)
LLFloaterChangeItemThumbnail::LLFloaterChangeItemThumbnail(const LLSD& key)
: LLFloater(key)
, mObserverInitialized(false)
, mMultipleThumbnails(false)
, mTooltipState(TOOLTIP_NONE)
{
}
@ -119,9 +120,11 @@ BOOL LLFloaterChangeItemThumbnail::postBuild()
mItemTypeIcon = getChild<LLIconCtrl>("item_type_icon");
mThumbnailCtrl = getChild<LLThumbnailCtrl>("item_thumbnail");
mToolTipTextBox = getChild<LLTextBox>("tooltip_text");
mMultipleTextBox = getChild<LLTextBox>("multiple_lbl");
LLSD tooltip_text;
mToolTipTextBox->setValue(tooltip_text);
mMultipleTextBox->setVisible(FALSE);
LLButton *upload_local = getChild<LLButton>("upload_local");
upload_local->setClickedCallback(onUploadLocal, (void*)this);
@ -163,20 +166,33 @@ void LLFloaterChangeItemThumbnail::onOpen(const LLSD& key)
closeFloater();
}
mItemList.clear();
mMultipleThumbnails = false;
if (key.isArray())
{
if (key.size() > 30)
if (key.size() > 50)
{
// incident avoidance
// Todo: Show notification
LLNotificationsUtil::add("ThumbnailSelectionTooLarge");
closeFloater();
}
LLUUID image_id;
for (LLSD::array_const_iterator it = key.beginArray(); it != key.endArray(); ++it)
{
mItemList.insert(it->asUUID());
LLInventoryObject* obj = gInventory.getObject(it->asUUID());
if (obj)
{
if (mItemList.empty())
{
image_id = obj->getThumbnailUUID();
}
mItemList.insert(it->asUUID());
if (image_id != obj->getThumbnailUUID())
{
mMultipleThumbnails = true;
}
}
}
}
else if (key.isUUID())
@ -189,6 +205,11 @@ void LLFloaterChangeItemThumbnail::onOpen(const LLSD& key)
mTaskId = key["task_id"].asUUID();
}
if (mItemList.size() == 0)
{
closeFloater();
}
refreshFromInventory();
}
@ -412,12 +433,44 @@ void LLFloaterChangeItemThumbnail::refreshFromObject(LLInventoryObject* obj)
mRemoveImageBtn->setEnabled(thumbnail_id.notNull());
}
}
mItemTypeIcon->setImage(icon_img);
mItemNameText->setValue(obj->getName());
if (mItemList.size() == 1)
{
mItemTypeIcon->setImage(icon_img);
mItemTypeIcon->setVisible(TRUE);
mMultipleTextBox->setVisible(FALSE);
mItemNameText->setValue(obj->getName());
mItemNameText->setToolTip(std::string());
}
else
{
mItemTypeIcon->setVisible(FALSE);
mMultipleTextBox->setVisible(mMultipleThumbnails);
mItemNameText->setValue(getString("multiple_item_names"));
// Display first five names as a tooltip
const S32 ITEMS_TO_SHOW = 5;
std::string items_str;
uuid_set_t::iterator iter = mItemList.begin();
uuid_set_t::iterator end = mItemList.end();
for (S32 i = 0; (iter != end) && (i < ITEMS_TO_SHOW); iter++, i++)
{
LLInventoryObject* pobj = gInventory.getObject(*iter);
if (pobj)
{
items_str += pobj->getName();
items_str += '\n';
}
}
if (mItemList.size() > ITEMS_TO_SHOW)
{
items_str += "...";
}
mItemNameText->setToolTip(items_str);
}
mThumbnailCtrl->setValue(thumbnail_id);
mCopyToClipboardBtn->setEnabled(thumbnail_id.notNull());
mCopyToClipboardBtn->setEnabled(thumbnail_id.notNull() && !mMultipleThumbnails);
mPasteFromClipboardBtn->setEnabled(LLClipboard::instance().hasContents());
// todo: some elements might not support setting thumbnails
@ -431,12 +484,13 @@ void LLFloaterChangeItemThumbnail::onUploadLocal(void *userdata)
LLUUID task_id = self->mTaskId;
uuid_set_t inventory_ids = self->mItemList;
LLHandle<LLFloater> handle = self->getHandle();
(new LLThumbnailImagePicker(
*self->mItemList.begin(),
self->mTaskId,
[inventory_ids, task_id](const LLUUID& asset_id)
[inventory_ids, task_id, handle](const LLUUID& asset_id)
{
onUploadComplete(asset_id, task_id, inventory_ids);
onUploadComplete(asset_id, task_id, inventory_ids, handle);
}
))->getFile();
@ -475,10 +529,11 @@ void LLFloaterChangeItemThumbnail::onUploadSnapshot(void *userdata)
snapshot_floater->setOwner(self);
LLUUID task_id = self->mTaskId;
uuid_set_t inventory_ids = self->mItemList;
LLHandle<LLFloater> handle = self->getHandle();
snapshot_floater->setComplectionCallback(
[inventory_ids, task_id](const LLUUID& asset_id)
[inventory_ids, task_id, handle](const LLUUID& asset_id)
{
onUploadComplete(asset_id, task_id, inventory_ids);
onUploadComplete(asset_id, task_id, inventory_ids, handle);
});
}
}
@ -767,12 +822,13 @@ void LLFloaterChangeItemThumbnail::onFullImageLoaded(
{
LLUUID task_id = data->mTaskId;
uuid_set_t inventory_ids = data->mItemIds;
LLHandle<LLFloater> handle = data->mFloaterHandle;
LLFloaterSimpleSnapshot::uploadThumbnail(src,
*data->mItemIds.begin(),
task_id,
[inventory_ids, task_id](const LLUUID& asset_id)
[inventory_ids, task_id, handle](const LLUUID& asset_id)
{
onUploadComplete(asset_id, task_id, inventory_ids);
onUploadComplete(asset_id, task_id, inventory_ids, handle);
});
}
else
@ -899,10 +955,11 @@ void LLFloaterChangeItemThumbnail::onTexturePickerCommit()
{
LLUUID task_id = mTaskId;
uuid_set_t inventory_ids = mItemList;
LLHandle<LLFloater> handle = getHandle();
LLFloaterSimpleSnapshot::completion_t callback =
[inventory_ids, task_id](const LLUUID& asset_id)
[inventory_ids, task_id, handle](const LLUUID& asset_id)
{
onUploadComplete(asset_id, task_id, inventory_ids);
onUploadComplete(asset_id, task_id, inventory_ids, handle);
};
if (texturep->isRawImageValid())
{
@ -948,7 +1005,10 @@ void LLFloaterChangeItemThumbnail::onTexturePickerCommit()
}
//static
void LLFloaterChangeItemThumbnail::onUploadComplete(const LLUUID& asset_id, const LLUUID& task_id, const uuid_set_t& inventory_ids)
void LLFloaterChangeItemThumbnail::onUploadComplete(const LLUUID& asset_id,
const LLUUID& task_id,
const uuid_set_t& inventory_ids,
LLHandle<LLFloater> handle)
{
if (asset_id.isNull())
{
@ -969,6 +1029,15 @@ void LLFloaterChangeItemThumbnail::onUploadComplete(const LLUUID& asset_id, cons
setThumbnailId(asset_id, task_id, *iter);
}
}
if (!handle.isDead())
{
LLFloaterChangeItemThumbnail* floater = (LLFloaterChangeItemThumbnail*)handle.get();
if (floater)
{
floater->mMultipleThumbnails = false;
floater->mMultipleTextBox->setVisible(FALSE);
}
}
}
void LLFloaterChangeItemThumbnail::setThumbnailId(const LLUUID &new_thumbnail_id)

View File

@ -100,7 +100,7 @@ private:
void showTexturePicker(const LLUUID &thumbnail_id);
void onTexturePickerCommit();
static void onUploadComplete(const LLUUID& asset_id, const LLUUID& task_id, const uuid_set_t& inventory_ids);
static void onUploadComplete(const LLUUID& asset_id, const LLUUID& task_id, const uuid_set_t& inventory_ids, LLHandle<LLFloater> handle);
void setThumbnailId(const LLUUID &new_thumbnail_id);
static void setThumbnailId(const LLUUID& new_thumbnail_id, const LLUUID& task_id, const LLUUID& inv_obj_id);
@ -121,6 +121,7 @@ private:
void onButtonMouseLeave(LLUICtrl* button, const LLSD& param, EToolTipState state);
bool mObserverInitialized;
bool mMultipleThumbnails; // for multiselection
EToolTipState mTooltipState;
uuid_set_t mItemList;
LLUUID mTaskId;
@ -130,6 +131,7 @@ private:
LLUICtrl *mItemNameText;
LLThumbnailCtrl *mThumbnailCtrl;
LLTextBox *mToolTipTextBox;
LLTextBox *mMultipleTextBox;
LLButton *mCopyToClipboardBtn;
LLButton *mPasteFromClipboardBtn;
LLButton *mRemoveImageBtn;

View File

@ -8,6 +8,10 @@
title="CHANGE ITEM IMAGE"
width="319">
<floater.string
name="multiple_item_names">
Multiple items selected
</floater.string>
<floater.string
name="title_item_thumbnail">
CHANGE ITEM IMAGE
@ -72,6 +76,22 @@
height="256"
width="256"
/>
<text
name="multiple_lbl"
font="SansSerifBig"
text_color="White"
halign="center"
valign="center"
use_ellipses="true"
follows="top|left"
layout="topleft"
height="256"
width="256"
top_delta="0"
left_delta="0"
visible =" false">
Multiple thumbnails
</text>
<button
follows="right|bottom"

View File

@ -6217,6 +6217,17 @@ Are you sure you want to delete them?
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="ThumbnailSelectionTooLarge"
type="alertmodal">
<unique/>
You can only modify up to 50 thumbnails at a time.
<usetemplate
name="okbutton"
yestext="OK"/>
</notification>
<notification
icon="alertmodal.tga"
name="ConfirmUnlink"