summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Kleshchev <andreykproductengine@lindenlab.com>2023-02-21 23:03:00 +0200
committerAndrey Kleshchev <andreykproductengine@lindenlab.com>2023-02-21 23:04:36 +0200
commit2d68a7c33622aa28c49989e959c2a9be1f053d03 (patch)
tree3e3bc627a0586e291b2d52d7753faa006521a81e
parentd6c0e40559fa090495b237bbbacf30578ac10aac (diff)
SL-19108 Update Simple snapshot floater
-rw-r--r--indra/newview/llfloaterchangeitemthumbnail.cpp47
-rw-r--r--indra/newview/llfloatersimplesnapshot.cpp42
-rw-r--r--indra/newview/llfloatersimplesnapshot.h17
-rw-r--r--indra/newview/llinspecttexture.cpp3
-rw-r--r--indra/newview/lloutfitgallery.cpp40
-rw-r--r--indra/newview/lloutfitgallery.h5
-rw-r--r--indra/newview/lloutfitslist.cpp27
-rw-r--r--indra/newview/lloutfitslist.h5
-rw-r--r--indra/newview/llsnapshotlivepreview.cpp26
-rw-r--r--indra/newview/llsnapshotlivepreview.h1
-rw-r--r--indra/newview/skins/default/xui/en/floater_simple_snapshot.xml4
-rwxr-xr-xindra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml32
-rw-r--r--indra/newview/skins/default/xui/en/menu_outfit_gear.xml6
13 files changed, 123 insertions, 132 deletions
diff --git a/indra/newview/llfloaterchangeitemthumbnail.cpp b/indra/newview/llfloaterchangeitemthumbnail.cpp
index 378f5bc132..5b47c483fb 100644
--- a/indra/newview/llfloaterchangeitemthumbnail.cpp
+++ b/indra/newview/llfloaterchangeitemthumbnail.cpp
@@ -31,6 +31,7 @@
#include "llbutton.h"
#include "llclipboard.h"
#include "lliconctrl.h"
+#include "llinventoryfunctions.h"
#include "llinventoryicon.h"
#include "llinventorymodel.h"
#include "llinventoryobserver.h"
@@ -264,6 +265,20 @@ void LLFloaterChangeItemThumbnail::refreshFromInventory()
}
}
+class LLIsOutfitTextureType : public LLInventoryCollectFunctor
+{
+public:
+ LLIsOutfitTextureType() {}
+ virtual ~LLIsOutfitTextureType() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item);
+};
+
+bool LLIsOutfitTextureType::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+{
+ return item && (item->getType() == LLAssetType::AT_TEXTURE);
+}
+
void LLFloaterChangeItemThumbnail::refreshFromObject(LLInventoryObject* obj)
{
LLUIImagePtr icon_img;
@@ -286,6 +301,35 @@ void LLFloaterChangeItemThumbnail::refreshFromObject(LLInventoryObject* obj)
if (cat)
{
icon_img = LLUI::getUIImage(LLViewerFolderType::lookupIconName(cat->getPreferredType(), true));
+
+ if (thumbnail_id.isNull() && (cat->getPreferredType() == LLFolderType::FT_OUTFIT))
+ {
+ // Legacy support, check if there is an image inside
+
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ // Not LLIsOfAssetType, because we allow links
+ LLIsOutfitTextureType f;
+ gInventory.getDirectDescendentsOf(mItemId, cats, items, f);
+
+ if (1 == items.size())
+ {
+ LLViewerInventoryItem* item = items.front();
+ if (item && item->getIsLinkType())
+ {
+ item = item->getLinkedItem();
+ }
+ if (item)
+ {
+ thumbnail_id = item->getAssetUUID();
+
+ // per SL-19188, set this image as a thumbnail
+ cat->setThumbnailUUID(thumbnail_id);
+ // todo: needs to trigger send/update once server support is done
+ }
+ }
+ }
+
mRemoveImageBtn->setEnabled(thumbnail_id.notNull());
}
}
@@ -358,6 +402,7 @@ void LLFloaterChangeItemThumbnail::onPasteFromClipboard(void *userdata)
if (obj)
{
obj->setThumbnailUUID(objects[0]);
+ // todo: need to trigger send/update once server support is done
}
}
}
@@ -384,6 +429,7 @@ void LLFloaterChangeItemThumbnail::onRemovalConfirmation(const LLSD& notificatio
if (obj)
{
obj->setThumbnailUUID(LLUUID::null);
+ // todo: need to trigger send/update once server support is done
}
}
}
@@ -450,6 +496,7 @@ void LLFloaterChangeItemThumbnail::onTexturePickerCommit(LLUUID id)
if (obj && floaterp)
{
obj->setThumbnailUUID(floaterp->getAssetID());
+ // todo: need to trigger send/update once server support is done
}
}
diff --git a/indra/newview/llfloatersimplesnapshot.cpp b/indra/newview/llfloatersimplesnapshot.cpp
index ca2b9b919a..096db132ac 100644
--- a/indra/newview/llfloatersimplesnapshot.cpp
+++ b/indra/newview/llfloatersimplesnapshot.cpp
@@ -30,9 +30,9 @@
#include "llfloaterreg.h"
#include "llimagefiltersmanager.h"
+#include "llinventorymodel.h"
#include "llstatusbar.h" // can_afford_transaction()
#include "llnotificationsutil.h"
-#include "lloutfitgallery.h"
#include "llagent.h"
#include "llagentbenefits.h"
#include "llviewercontrol.h"
@@ -44,8 +44,6 @@ LLSimpleSnapshotFloaterView* gSimpleSnapshotFloaterView = NULL;
const S32 THUMBNAIL_SNAPSHOT_DIM = 256;
-static LLDefaultChildRegistry::Register<LLSimpleSnapshotFloaterView> r("simple_snapshot_floater_view");
-
// Thumbnail posting coro
static const std::string THUMBNAIL_ITEM_UPLOAD_CAP = "InventoryItemThumbnailUpload";
@@ -229,8 +227,7 @@ void LLFloaterSimpleSnapshot::Impl::setStatus(EStatus status, bool ok, const std
///----------------------------------------------------------------------------
LLFloaterSimpleSnapshot::LLFloaterSimpleSnapshot(const LLSD& key)
- : LLFloaterSnapshotBase(key),
- mOutfitGallery(NULL)
+ : LLFloaterSnapshotBase(key)
{
impl = new Impl(this);
}
@@ -241,8 +238,6 @@ LLFloaterSimpleSnapshot::~LLFloaterSimpleSnapshot()
BOOL LLFloaterSimpleSnapshot::postBuild()
{
- getChild<LLUICtrl>("save_btn")->setLabelArg("[UPLOAD_COST]", std::to_string(LLAgentBenefitsMgr::current().getTextureUploadCost()));
-
childSetAction("new_snapshot_btn", ImplBase::onClickNewSnapshot, this);
childSetAction("save_btn", boost::bind(&LLFloaterSimpleSnapshot::onSend, this));
childSetAction("cancel_btn", boost::bind(&LLFloaterSimpleSnapshot::onCancel, this));
@@ -337,18 +332,18 @@ void LLFloaterSimpleSnapshot::onCancel()
void LLFloaterSimpleSnapshot::onSend()
{
- S32 expected_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost();
- if (can_afford_transaction(expected_upload_cost))
+ LLSnapshotLivePreview* previewp = getPreviewView();
+
+ std::string temp_file = gDirUtilp->getTempFilename();
+ if (previewp->createUploadFile(temp_file, THUMBNAIL_SNAPSHOT_DIM))
{
- saveTexture();
- postSave();
+ uploadImageUploadFile(temp_file, mInventoryId, mTaskId);
}
else
{
- LLSD args;
- args["COST"] = llformat("%d", expected_upload_cost);
- LLNotificationsUtil::add("ErrorPhotoCannotAfford", args);
- inventorySaveFailed();
+ LLSD notif_args;
+ notif_args["REASON"] = LLImage::getLastError().c_str();
+ LLNotificationsUtil::add("CannotUploadTexture", notif_args);
}
}
@@ -371,7 +366,12 @@ void LLFloaterSimpleSnapshot::uploadThumbnail(const std::string &file_path, cons
LL_WARNS("Thumbnail") << "Failed to upload thumbnail for " << inventory_id << " " << task_id << ", reason: " << notif_args["REASON"].asString() << LL_ENDL;
return;
}
+ uploadImageUploadFile(temp_file, inventory_id, task_id);
+}
+// static
+void LLFloaterSimpleSnapshot::uploadImageUploadFile(const std::string &temp_file, const LLUUID &inventory_id, const LLUUID &task_id)
+{
std::string cap_name;
LLSD data;
@@ -431,22 +431,14 @@ LLFloaterSimpleSnapshot* LLFloaterSimpleSnapshot::getInstance()
void LLFloaterSimpleSnapshot::saveTexture()
{
- LLSnapshotLivePreview* previewp = getPreviewView();
+ LLSnapshotLivePreview* previewp = getPreviewView();
if (!previewp)
{
llassert(previewp != NULL);
return;
}
- if (mOutfitGallery)
- {
- mOutfitGallery->onBeforeOutfitSnapshotSave();
- }
- previewp->saveTexture(TRUE, getOutfitID().asString());
- if (mOutfitGallery)
- {
- mOutfitGallery->onAfterOutfitSnapshotSave();
- }
+ previewp->saveTexture(TRUE, getInventoryId().asString());
closeFloater();
}
diff --git a/indra/newview/llfloatersimplesnapshot.h b/indra/newview/llfloatersimplesnapshot.h
index 55253b38e8..59cb526704 100644
--- a/indra/newview/llfloatersimplesnapshot.h
+++ b/indra/newview/llfloatersimplesnapshot.h
@@ -31,8 +31,6 @@
#include "llfloatersnapshot.h"
#include "llsnapshotlivepreview.h"
-class LLOutfitGallery;
-
///----------------------------------------------------------------------------
/// Class LLFloaterSimpleSnapshot
///----------------------------------------------------------------------------
@@ -58,11 +56,9 @@ public:
const LLRect& getThumbnailPlaceholderRect() { return mThumbnailPlaceholder->getRect(); }
- void setOutfitID(LLUUID id) { mOutfitID = id; }
- LLUUID getOutfitID() { return mOutfitID; }
- void setGallery(LLOutfitGallery* gallery) { mOutfitGallery = gallery; }
- void setInventoryId(const LLUUID &inventory_id) {}
- void setTaskId(const LLUUID &task_id) {}
+ void setInventoryId(const LLUUID &inventory_id) { mInventoryId = inventory_id; }
+ LLUUID getInventoryId() { return mInventoryId; }
+ void setTaskId(const LLUUID &task_id) { mTaskId = task_id; }
void postSave();
static void uploadThumbnail(const std::string &file_path, const LLUUID &inventory_id, const LLUUID &task_id);
@@ -74,8 +70,11 @@ private:
void onSend();
void onCancel();
- LLUUID mOutfitID;
- LLOutfitGallery* mOutfitGallery;
+ // uploads upload-ready file
+ static void uploadImageUploadFile(const std::string &temp_file, const LLUUID &inventory_id, const LLUUID &task_id);
+
+ LLUUID mInventoryId;
+ LLUUID mTaskId;
};
///----------------------------------------------------------------------------
diff --git a/indra/newview/llinspecttexture.cpp b/indra/newview/llinspecttexture.cpp
index de0d65eb7e..2e8273d6cf 100644
--- a/indra/newview/llinspecttexture.cpp
+++ b/indra/newview/llinspecttexture.cpp
@@ -185,7 +185,8 @@ LLToolTip* LLInspectTextureUtil::createInventoryToolTip(LLToolTip::Params p)
}
if (item)
{
- // Todo: write this into folder's thumbnail id
+ // Note: LLFloaterChangeItemThumbnail will attempt to write this
+ // into folder's thumbnail id when opened
p.create_params.getValue()["thumbnail_id"] = item->getAssetUUID();
return LLUICtrlFactory::create<LLTextureToolTip>(p);
}
diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp
index 06dbf50bee..d30cc66a38 100644
--- a/indra/newview/lloutfitgallery.cpp
+++ b/indra/newview/lloutfitgallery.cpp
@@ -837,52 +837,23 @@ LLContextMenu* LLOutfitGalleryContextMenu::createMenu()
registrar.add("Outfit.Rename", boost::bind(renameOutfit, selected_id));
registrar.add("Outfit.Delete", boost::bind(&LLOutfitGalleryContextMenu::onRemoveOutfit, this, selected_id));
registrar.add("Outfit.Create", boost::bind(&LLOutfitGalleryContextMenu::onCreate, this, _2));
- registrar.add("Outfit.UploadPhoto", boost::bind(&LLOutfitGalleryContextMenu::onUploadPhoto, this, selected_id));
- registrar.add("Outfit.SelectPhoto", boost::bind(&LLOutfitGalleryContextMenu::onSelectPhoto, this, selected_id));
- registrar.add("Outfit.TakeSnapshot", boost::bind(&LLOutfitGalleryContextMenu::onTakeSnapshot, this, selected_id));
- registrar.add("Outfit.RemovePhoto", boost::bind(&LLOutfitGalleryContextMenu::onRemovePhoto, this, selected_id));
+ registrar.add("Outfit.Thumbnail", boost::bind(&LLOutfitGalleryContextMenu::onThumbnail, this, selected_id));
enable_registrar.add("Outfit.OnEnable", boost::bind(&LLOutfitGalleryContextMenu::onEnable, this, _2));
enable_registrar.add("Outfit.OnVisible", boost::bind(&LLOutfitGalleryContextMenu::onVisible, this, _2));
return createFromFile("menu_gallery_outfit_tab.xml");
}
-void LLOutfitGalleryContextMenu::onUploadPhoto(const LLUUID& outfit_cat_id)
+void LLOutfitGalleryContextMenu::onThumbnail(const LLUUID& outfit_cat_id)
{
LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
if (gallery && outfit_cat_id.notNull())
{
- gallery->uploadPhoto(outfit_cat_id);
+ LLSD data(outfit_cat_id);
+ LLFloaterReg::showInstance("change_item_thumbnail", data);
}
}
-void LLOutfitGalleryContextMenu::onSelectPhoto(const LLUUID& outfit_cat_id)
-{
- LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
- if (gallery && outfit_cat_id.notNull())
- {
- gallery->onSelectPhoto(outfit_cat_id);
- }
-}
-
-void LLOutfitGalleryContextMenu::onRemovePhoto(const LLUUID& outfit_cat_id)
-{
- LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
- if (gallery && outfit_cat_id.notNull())
- {
- gallery->checkRemovePhoto(outfit_cat_id);
- gallery->refreshOutfit(outfit_cat_id);
- }
-}
-
-void LLOutfitGalleryContextMenu::onTakeSnapshot(const LLUUID& outfit_cat_id)
-{
- LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
- if (gallery && outfit_cat_id.notNull())
- {
- gallery->onTakeSnapshot(outfit_cat_id);
- }
-}
void LLOutfitGalleryContextMenu::onRemoveOutfit(const LLUUID& outfit_cat_id)
{
@@ -1390,8 +1361,7 @@ void LLOutfitGallery::onTakeSnapshot(LLUUID selected_outfit_id)
LLFloaterSimpleSnapshot* snapshot_floater = LLFloaterSimpleSnapshot::getInstance();
if (snapshot_floater)
{
- snapshot_floater->setOutfitID(selected_outfit_id);
- snapshot_floater->getInstance()->setGallery(this);
+ snapshot_floater->setInventoryId(selected_outfit_id);
}
}
diff --git a/indra/newview/lloutfitgallery.h b/indra/newview/lloutfitgallery.h
index ce5c090134..4839477cb2 100644
--- a/indra/newview/lloutfitgallery.h
+++ b/indra/newview/lloutfitgallery.h
@@ -215,10 +215,7 @@ protected:
/* virtual */ LLContextMenu* createMenu();
bool onEnable(LLSD::String param);
bool onVisible(LLSD::String param);
- void onUploadPhoto(const LLUUID& outfit_cat_id);
- void onSelectPhoto(const LLUUID& outfit_cat_id);
- void onRemovePhoto(const LLUUID& outfit_cat_id);
- void onTakeSnapshot(const LLUUID& outfit_cat_id);
+ void onThumbnail(const LLUUID& outfit_cat_id);
void onCreate(const LLSD& data);
void onRemoveOutfit(const LLUUID& outfit_cat_id);
void onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response, const LLUUID& outfit_cat_id);
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index 4171fd8822..2f7d1c433a 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -36,6 +36,7 @@
#include "llagentwearables.h"
#include "llappearancemgr.h"
#include "llagentbenefits.h"
+#include "llfloaterreg.h"
#include "llfloatersidepanelcontainer.h"
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
@@ -1112,10 +1113,7 @@ LLOutfitListGearMenuBase::LLOutfitListGearMenuBase(LLOutfitListBase* olist)
registrar.add("Gear.WearAdd", boost::bind(&LLOutfitListGearMenuBase::onAdd, this));
- registrar.add("Gear.UploadPhoto", boost::bind(&LLOutfitListGearMenuBase::onUploadFoto, this));
- registrar.add("Gear.SelectPhoto", boost::bind(&LLOutfitListGearMenuBase::onSelectPhoto, this));
- registrar.add("Gear.TakeSnapshot", boost::bind(&LLOutfitListGearMenuBase::onTakeSnapshot, this));
- registrar.add("Gear.RemovePhoto", boost::bind(&LLOutfitListGearMenuBase::onRemovePhoto, this));
+ registrar.add("Gear.Thumbnail", boost::bind(&LLOutfitListGearMenuBase::onThumbnail, this));
registrar.add("Gear.SortByName", boost::bind(&LLOutfitListGearMenuBase::onChangeSortOrder, this));
enable_registrar.add("Gear.OnEnable", boost::bind(&LLOutfitListGearMenuBase::onEnable, this, _2));
@@ -1251,24 +1249,11 @@ bool LLOutfitListGearMenuBase::onVisible(LLSD::String param)
return true;
}
-void LLOutfitListGearMenuBase::onUploadFoto()
+void LLOutfitListGearMenuBase::onThumbnail()
{
-
-}
-
-void LLOutfitListGearMenuBase::onSelectPhoto()
-{
-
-}
-
-void LLOutfitListGearMenuBase::onTakeSnapshot()
-{
-
-}
-
-void LLOutfitListGearMenuBase::onRemovePhoto()
-{
-
+ const LLUUID& selected_outfit_id = getSelectedOutfitID();
+ LLSD data(selected_outfit_id);
+ LLFloaterReg::showInstance("change_item_thumbnail", data);
}
void LLOutfitListGearMenuBase::onChangeSortOrder()
diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h
index 81be8de94f..66b3165169 100644
--- a/indra/newview/lloutfitslist.h
+++ b/indra/newview/lloutfitslist.h
@@ -163,10 +163,7 @@ public:
protected:
virtual void onUpdateItemsVisibility();
- virtual void onUploadFoto();
- virtual void onSelectPhoto();
- virtual void onTakeSnapshot();
- virtual void onRemovePhoto();
+ virtual void onThumbnail();
virtual void onChangeSortOrder();
const LLUUID& getSelectedOutfitID();
diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp
index ed7e18fadc..273e3a403d 100644
--- a/indra/newview/llsnapshotlivepreview.cpp
+++ b/indra/newview/llsnapshotlivepreview.cpp
@@ -51,6 +51,7 @@
#include "llviewercontrol.h"
#include "llviewermenufile.h" // upload_new_resource()
#include "llviewerstats.h"
+#include "llviewertexturelist.h"
#include "llwindow.h"
#include "llworld.h"
#include <boost/filesystem.hpp>
@@ -873,6 +874,31 @@ LLPointer<LLImageRaw> LLSnapshotLivePreview::getEncodedImage()
return mPreviewImageEncoded;
}
+bool LLSnapshotLivePreview::createUploadFile(const std::string &out_filename, const S32 max_image_dimentions)
+{
+ // make a copy, since convertToUploadFile modifies raw image
+ LLPointer<LLImageRaw> raw_image = new LLImageRaw(
+ mPreviewImage->getData(),
+ mPreviewImage->getWidth(),
+ mPreviewImage->getHeight(),
+ mPreviewImage->getComponents());
+
+ LLPointer<LLImageJ2C> compressedImage = LLViewerTextureList::convertToUploadFile(raw_image, max_image_dimentions);
+ if (compressedImage.isNull())
+ {
+ compressedImage->setLastError("Couldn't convert the image to jpeg2000.");
+ LL_INFOS() << "Couldn't convert to j2c, file : " << out_filename << LL_ENDL;
+ return false;
+ }
+ if (!compressedImage->save(out_filename))
+ {
+ compressedImage->setLastError("Couldn't create the jpeg2000 image for upload.");
+ LL_INFOS() << "Couldn't create output file : " << out_filename << LL_ENDL;
+ return false;
+ }
+ return true;
+}
+
// We actually estimate the data size so that we do not require actual compression when showing the preview
// Note : whenever formatted image is computed, mDataSize will be updated to reflect the true size
void LLSnapshotLivePreview::estimateDataSize()
diff --git a/indra/newview/llsnapshotlivepreview.h b/indra/newview/llsnapshotlivepreview.h
index 1f81307976..e78c885789 100644
--- a/indra/newview/llsnapshotlivepreview.h
+++ b/indra/newview/llsnapshotlivepreview.h
@@ -106,6 +106,7 @@ public:
LLPointer<LLImageFormatted> getFormattedImage();
LLPointer<LLImageRaw> getEncodedImage();
+ bool createUploadFile(const std::string &out_file, const S32 max_image_dimentions);
/// Sets size of preview thumbnail image and the surrounding rect.
void setThumbnailPlaceholderRect(const LLRect& rect) {mThumbnailPlaceholderRect = rect; }
diff --git a/indra/newview/skins/default/xui/en/floater_simple_snapshot.xml b/indra/newview/skins/default/xui/en/floater_simple_snapshot.xml
index a53d42be2e..97ea59593e 100644
--- a/indra/newview/skins/default/xui/en/floater_simple_snapshot.xml
+++ b/indra/newview/skins/default/xui/en/floater_simple_snapshot.xml
@@ -12,7 +12,7 @@
help_topic="snapshot"
save_rect="true"
save_visibility="false"
- title="THUMBNAIL SNAPSHOT"
+ title="ITEM SNAPSHOT"
width="351">
<ui_ctrl
layout="topleft"
@@ -36,7 +36,7 @@
height="22"
layout="topleft"
left_pad="10"
- label="Save (L$[UPLOAD_COST])"
+ label="Save"
name="save_btn"
width="90" />
<button
diff --git a/indra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml b/indra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml
index 99ca910062..0ca505dd5d 100755
--- a/indra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml
+++ b/indra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml
@@ -42,35 +42,11 @@
parameter="take_off" />
</menu_item_call>
<menu_item_call
- label="Upload Photo (L$[UPLOAD_COST])"
- layout="topleft"
- name="upload_photo">
- <on_click
- function="Outfit.UploadPhoto" />
- </menu_item_call>
- <menu_item_call
- label="Select Photo"
- layout="topleft"
- name="select_photo">
+ label="Image..."
+ layout="topleft"
+ name="thumbnail">
<on_click
- function="Outfit.SelectPhoto" />
- </menu_item_call>
- <menu_item_call
- label="Take a Snapshot"
- layout="topleft"
- name="take_snapshot">
- <on_click
- function="Outfit.TakeSnapshot" />
- </menu_item_call>
- <menu_item_call
- label="Remove Photo"
- layout="topleft"
- name="remove_photo">
- <on_click
- function="Outfit.RemovePhoto" />
- <on_visible
- function="Outfit.OnVisible"
- parameter="remove_photo" />
+ function="Outfit.Thumbnail" />
</menu_item_call>
<menu_item_separator name="sepatator1" />
<menu
diff --git a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
index 32d9d28434..0f7a7e8d56 100644
--- a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
@@ -40,11 +40,11 @@
parameter="take_off" />
</menu_item_call>
<menu_item_call
- label="Upload Photo (L$[UPLOAD_COST])"
+ label="Image..."
layout="topleft"
- name="upload_photo">
+ name="thumbnail">
<on_click
- function="Gear.UploadPhoto" />
+ function="Gear.Thumbnail" />
</menu_item_call>
<menu_item_call
label="Select Photo"