summaryrefslogtreecommitdiff
path: root/indra/newview/lloutfitgallery.cpp
diff options
context:
space:
mode:
authorCosmic Linden <cosmic@lindenlab.com>2023-10-13 14:02:51 -0700
committerCosmic Linden <cosmic@lindenlab.com>2023-10-13 14:02:51 -0700
commita91f08ba84844647bbcdecac11e85c449579527c (patch)
tree9bfdc77c9e7de33413b95f2648cb139b19cb06f0 /indra/newview/lloutfitgallery.cpp
parentcc0f831aaa960552b218da436da57b44cb2dfe0f (diff)
parentcba71633559ccdfd394983a6086da816e739a730 (diff)
Merge branch 'DRTVWR-559' into DRTVWR-592
Diffstat (limited to 'indra/newview/lloutfitgallery.cpp')
-rw-r--r--indra/newview/lloutfitgallery.cpp879
1 files changed, 399 insertions, 480 deletions
diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp
index 92a742466e..de988555c5 100644
--- a/indra/newview/lloutfitgallery.cpp
+++ b/indra/newview/lloutfitgallery.cpp
@@ -36,12 +36,11 @@
#include "llaccordionctrltab.h"
#include "llappearancemgr.h"
-#include "llagentbenefits.h"
#include "llerror.h"
#include "llfilepicker.h"
#include "llfloaterperms.h"
#include "llfloaterreg.h"
-#include "llfloatersimpleoutfitsnapshot.h"
+#include "llfloatersimplesnapshot.h"
#include "llimagedimensionsinfo.h"
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
@@ -65,7 +64,6 @@ const S32 GALLERY_ITEMS_PER_ROW_MIN = 2;
LLOutfitGallery::LLOutfitGallery(const LLOutfitGallery::Params& p)
: LLOutfitListBase(),
- mTexturesObserver(NULL),
mOutfitsObserver(NULL),
mScrollPanel(NULL),
mGalleryPanel(NULL),
@@ -125,7 +123,6 @@ void LLOutfitGallery::onOpen(const LLSD& info)
LLOutfitListBase::onOpen(info);
if (!mGalleryCreated)
{
- loadPhotos();
uuid_vec_t cats;
getCurrentCategories(cats);
int n = cats.size();
@@ -149,6 +146,264 @@ void LLOutfitGallery::draw()
}
}
+BOOL LLOutfitGallery::handleKeyHere(KEY key, MASK mask)
+{
+ BOOL handled = FALSE;
+ switch (key)
+ {
+ case KEY_RETURN:
+ // Open selected items if enter key hit on the inventory panel
+ if (mask == MASK_NONE && mSelectedOutfitUUID.notNull())
+ {
+ // Or should it wearSelectedOutfit?
+ getSelectedItem()->openOutfitsContent();
+ }
+ handled = TRUE;
+ break;
+ case KEY_DELETE:
+#if LL_DARWIN
+ case KEY_BACKSPACE:
+#endif
+ // Delete selected items if delete or backspace key hit on the inventory panel
+ // Note: on Mac laptop keyboards, backspace and delete are one and the same
+ if (mSelectedOutfitUUID.notNull())
+ {
+ onRemoveOutfit(mSelectedOutfitUUID);
+ }
+ handled = TRUE;
+ break;
+
+ case KEY_F2:
+ LLAppearanceMgr::instance().renameOutfit(mSelectedOutfitUUID);
+ handled = TRUE;
+ break;
+
+ case KEY_PAGE_UP:
+ if (mScrollPanel)
+ {
+ mScrollPanel->pageUp(30);
+ }
+ handled = TRUE;
+ break;
+
+ case KEY_PAGE_DOWN:
+ if (mScrollPanel)
+ {
+ mScrollPanel->pageDown(30);
+ }
+ handled = TRUE;
+ break;
+
+ case KEY_HOME:
+ if (mScrollPanel)
+ {
+ mScrollPanel->goToTop();
+ }
+ handled = TRUE;
+ break;
+
+ case KEY_END:
+ if (mScrollPanel)
+ {
+ mScrollPanel->goToBottom();
+ }
+ handled = TRUE;
+ break;
+
+ case KEY_LEFT:
+ moveLeft();
+ handled = TRUE;
+ break;
+
+ case KEY_RIGHT:
+ moveRight();
+ handled = TRUE;
+ break;
+
+ case KEY_UP:
+ moveUp();
+ handled = TRUE;
+ break;
+
+ case KEY_DOWN:
+ moveDown();
+ handled = TRUE;
+ break;
+
+ default:
+ break;
+ }
+
+ if (handled)
+ {
+ mOutfitGalleryMenu->hide();
+ }
+
+ return handled;
+}
+
+void LLOutfitGallery::moveUp()
+{
+ if (mSelectedOutfitUUID.notNull() && mItemsAddedCount > 1)
+ {
+ LLOutfitGalleryItem* item = getSelectedItem();
+ if (item)
+ {
+ S32 n = mItemIndexMap[item];
+ n -= mItemsInRow;
+ if (n >= 0)
+ {
+ item = mIndexToItemMap[n];
+ LLUUID item_id = item->getUUID();
+ ChangeOutfitSelection(nullptr, item_id);
+ item->setFocus(TRUE);
+
+ scrollToShowItem(mSelectedOutfitUUID);
+ }
+ }
+ }
+}
+
+void LLOutfitGallery::moveDown()
+{
+ if (mSelectedOutfitUUID.notNull() && mItemsAddedCount > 1)
+ {
+ LLOutfitGalleryItem* item = getSelectedItem();
+ if (item)
+ {
+ S32 n = mItemIndexMap[item];
+ n += mItemsInRow;
+ if (n < mItemsAddedCount)
+ {
+ item = mIndexToItemMap[n];
+ LLUUID item_id = item->getUUID();
+ ChangeOutfitSelection(nullptr, item_id);
+ item->setFocus(TRUE);
+
+ scrollToShowItem(mSelectedOutfitUUID);
+ }
+ }
+ }
+}
+
+void LLOutfitGallery::moveLeft()
+{
+ if (mSelectedOutfitUUID.notNull() && mItemsAddedCount > 1)
+ {
+ LLOutfitGalleryItem* item = getSelectedItem();
+ if (item)
+ {
+ // Might be better to get item from panel
+ S32 n = mItemIndexMap[item];
+ n--;
+ if (n < 0)
+ {
+ n = mItemsAddedCount - 1;
+ }
+ item = mIndexToItemMap[n];
+ LLUUID item_id = item->getUUID();
+ ChangeOutfitSelection(nullptr, item_id);
+ item->setFocus(TRUE);
+
+ scrollToShowItem(mSelectedOutfitUUID);
+ }
+ }
+}
+
+void LLOutfitGallery::moveRight()
+{
+ if (mSelectedOutfitUUID.notNull() && mItemsAddedCount > 1)
+ {
+ LLOutfitGalleryItem* item = getSelectedItem();
+ if (item)
+ {
+ S32 n = mItemIndexMap[item];
+ n++;
+ if (n == mItemsAddedCount)
+ {
+ n = 0;
+ }
+ item = mIndexToItemMap[n];
+ LLUUID item_id = item->getUUID();
+ ChangeOutfitSelection(nullptr, item_id);
+ item->setFocus(TRUE);
+
+ scrollToShowItem(mSelectedOutfitUUID);
+ }
+ }
+}
+
+void LLOutfitGallery::onFocusLost()
+{
+ LLOutfitListBase::onFocusLost();
+
+ if (mSelectedOutfitUUID.notNull())
+ {
+ LLOutfitGalleryItem* item = getSelectedItem();
+ if (item)
+ {
+ item->setSelected(false);
+ }
+ }
+}
+
+void LLOutfitGallery::onFocusReceived()
+{
+ LLOutfitListBase::onFocusReceived();
+
+ if (mSelectedOutfitUUID.notNull())
+ {
+ LLOutfitGalleryItem* item = getSelectedItem();
+ if (item)
+ {
+ item->setSelected(true);
+ }
+ }
+}
+
+void LLOutfitGallery::onRemoveOutfit(const LLUUID& outfit_cat_id)
+{
+ LLNotificationsUtil::add("DeleteOutfits", LLSD(), LLSD(), boost::bind(onOutfitsRemovalConfirmation, _1, _2, outfit_cat_id));
+}
+
+void LLOutfitGallery::onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response, const LLUUID& outfit_cat_id)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option != 0) return; // canceled
+
+ if (outfit_cat_id.notNull())
+ {
+ gInventory.removeCategory(outfit_cat_id);
+ }
+}
+
+void LLOutfitGallery::scrollToShowItem(const LLUUID& item_id)
+{
+ LLOutfitGalleryItem* item = mOutfitMap[item_id];
+ if (item)
+ {
+ const LLRect visible_content_rect = mScrollPanel->getVisibleContentRect();
+
+ LLRect item_rect;
+ item->localRectToOtherView(item->getLocalRect(), &item_rect, mScrollPanel);
+ LLRect overlap_rect(item_rect);
+ overlap_rect.intersectWith(visible_content_rect);
+
+ //Scroll when the selected item is outside the visible area
+ if (overlap_rect.getHeight() + 5 < item->getRect().getHeight())
+ {
+ LLRect content_rect = mScrollPanel->getContentWindowRect();
+ LLRect constraint_rect;
+ constraint_rect.setOriginAndSize(0, 0, content_rect.getWidth(), content_rect.getHeight());
+
+ LLRect item_doc_rect;
+ item->localRectToOtherView(item->getLocalRect(), &item_doc_rect, mGalleryPanel);
+
+ mScrollPanel->scrollToShowRect(item_doc_rect, constraint_rect);
+ }
+ }
+}
+
void LLOutfitGallery::updateRowsIfNeeded()
{
if(((getRect().getWidth() - mRowPanelWidth) > mItemWidth) && mRowCount > 1)
@@ -269,8 +524,9 @@ void LLOutfitGallery::addToGallery(LLOutfitGalleryItem* item)
mHiddenItems.push_back(item);
return;
}
+ mItemIndexMap[item] = mItemsAddedCount;
+ mIndexToItemMap[mItemsAddedCount] = item;
mItemsAddedCount++;
- mItemIndexMap[item] = mItemsAddedCount - 1;
int n = mItemsAddedCount;
int row_count = (n % mItemsInRow) == 0 ? n / mItemsInRow : n / mItemsInRow + 1;
int n_prev = n - 1;
@@ -306,6 +562,7 @@ void LLOutfitGallery::removeFromGalleryLast(LLOutfitGalleryItem* item)
int row_count = (n % mItemsInRow) == 0 ? n / mItemsInRow : n / mItemsInRow + 1;
int row_count_prev = (n_prev % mItemsInRow) == 0 ? n_prev / mItemsInRow : n_prev / mItemsInRow + 1;
mItemsAddedCount--;
+ mIndexToItemMap.erase(mItemsAddedCount);
bool remove_row = row_count != row_count_prev;
removeFromLastRow(mItems[mItemsAddedCount]);
@@ -331,6 +588,7 @@ void LLOutfitGallery::removeFromGalleryMiddle(LLOutfitGalleryItem* item)
}
int n = mItemIndexMap[item];
mItemIndexMap.erase(item);
+ mIndexToItemMap.erase(n);
std::vector<LLOutfitGalleryItem*> saved;
for (int i = mItemsAddedCount - 1; i > n; i--)
{
@@ -364,9 +622,15 @@ LLOutfitGalleryItem* LLOutfitGallery::buildGalleryItem(std::string name, LLUUID
gitem->setFollowsTop();
gitem->setOutfitName(name);
gitem->setUUID(outfit_id);
+ gitem->setGallery(this);
return gitem;
}
+LLOutfitGalleryItem* LLOutfitGallery::getSelectedItem()
+{
+ return mOutfitMap[mSelectedOutfitUUID];
+}
+
void LLOutfitGallery::buildGalleryPanel(int row_count)
{
LLPanel::Params params;
@@ -440,12 +704,6 @@ void LLOutfitGallery::moveRowPanel(LLPanel* stack, int left, int bottom)
LLOutfitGallery::~LLOutfitGallery()
{
delete mOutfitGalleryMenu;
-
- if (gInventory.containsObserver(mTexturesObserver))
- {
- gInventory.removeObserver(mTexturesObserver);
- }
- delete mTexturesObserver;
if (gInventory.containsObserver(mOutfitsObserver))
{
@@ -617,6 +875,7 @@ void LLOutfitGallery::onChangeOutfitSelection(LLWearableItemsList* list, const L
{
mOutfitMap[category_id]->setSelected(TRUE);
}
+ // mSelectedOutfitUUID will be set in LLOutfitListBase::ChangeOutfitSelection
}
void LLOutfitGallery::wearSelectedOutfit()
@@ -668,7 +927,8 @@ static LLDefaultChildRegistry::Register<LLOutfitGalleryItem> r("outfit_gallery_i
LLOutfitGalleryItem::LLOutfitGalleryItem(const Params& p)
: LLPanel(p),
- mTexturep(NULL),
+ mGallery(nullptr),
+ mTexturep(nullptr),
mSelected(false),
mWorn(false),
mDefaultImage(true),
@@ -743,10 +1003,13 @@ void LLOutfitGalleryItem::setOutfitWorn(bool value)
mWorn = value;
LLStringUtil::format_map_t worn_string_args;
std::string worn_string = getString("worn_string", worn_string_args);
- LLUIColor text_color = LLUIColorTable::instance().getColor(mSelected ? "White" : (mWorn ? "OutfitGalleryItemWorn" : "White"), LLColor4::white);
+ LLUIColor text_color = LLUIColorTable::instance().getColor("White", LLColor4::white);
mOutfitWornText->setReadOnlyColor(text_color.get());
mOutfitNameText->setReadOnlyColor(text_color.get());
+ mOutfitWornText->setFont(value ? LLFontGL::getFontSansSerifBold() : LLFontGL::getFontSansSerifSmall());
+ mOutfitNameText->setFont(value ? LLFontGL::getFontSansSerifBold() : LLFontGL::getFontSansSerifSmall());
mOutfitWornText->setValue(value ? worn_string : "");
+ mOutfitNameText->setText(mOutfitName); // refresh LLTextViewModel to pick up font changes
}
void LLOutfitGalleryItem::setSelected(bool value)
@@ -770,8 +1033,63 @@ BOOL LLOutfitGalleryItem::handleRightMouseDown(S32 x, S32 y, MASK mask)
BOOL LLOutfitGalleryItem::handleDoubleClick(S32 x, S32 y, MASK mask)
{
+ return openOutfitsContent() || LLPanel::handleDoubleClick(x, y, mask);
+}
+
+BOOL LLOutfitGalleryItem::handleKeyHere(KEY key, MASK mask)
+{
+ if (!mGallery)
+ {
+ return FALSE;
+ }
+
+ BOOL handled = FALSE;
+ switch (key)
+ {
+ case KEY_LEFT:
+ mGallery->moveLeft();
+ handled = true;
+ break;
+
+ case KEY_RIGHT:
+ mGallery->moveRight();
+ handled = true;
+ break;
+
+ case KEY_UP:
+ mGallery->moveUp();
+ handled = true;
+ break;
+
+ case KEY_DOWN:
+ mGallery->moveDown();
+ handled = true;
+ break;
+
+ default:
+ break;
+ }
+ return handled;
+}
+
+void LLOutfitGalleryItem::onFocusLost()
+{
+ setSelected(false);
+
+ LLPanel::onFocusLost();
+}
+
+void LLOutfitGalleryItem::onFocusReceived()
+{
+ setSelected(true);
+
+ LLPanel::onFocusReceived();
+}
+
+bool LLOutfitGalleryItem::openOutfitsContent()
+{
LLTabContainer* appearence_tabs = LLPanelOutfitsInventory::findInstance()->getChild<LLTabContainer>("appearance_tabs");
- if (appearence_tabs && (mUUID != LLUUID()))
+ if (appearence_tabs && mUUID.notNull())
{
appearence_tabs->selectTabByName("outfitslist_tab");
LLPanel* panel = appearence_tabs->getCurrentPanel();
@@ -784,12 +1102,11 @@ BOOL LLOutfitGalleryItem::handleDoubleClick(S32 x, S32 y, MASK mask)
outfit_list->setSelectedOutfitByUUID(mUUID);
LLAccordionCtrlTab* tab = accordion->getSelectedTab();
tab->showAndFocusHeader();
- return TRUE;
+ return true;
}
}
}
-
- return LLPanel::handleDoubleClick(x, y, mask);
+ return false;
}
bool LLOutfitGalleryItem::setImageAssetId(LLUUID image_asset_id)
@@ -835,68 +1152,22 @@ LLContextMenu* LLOutfitGalleryContextMenu::createMenu()
boost::bind(&LLAppearanceMgr::takeOffOutfit, &LLAppearanceMgr::instance(), selected_id));
registrar.add("Outfit.Edit", boost::bind(editOutfit));
registrar.add("Outfit.Rename", boost::bind(renameOutfit, selected_id));
- registrar.add("Outfit.Delete", boost::bind(&LLOutfitGalleryContextMenu::onRemoveOutfit, this, selected_id));
+ registrar.add("Outfit.Delete", boost::bind(LLOutfitGallery::onRemoveOutfit, 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)
-{
- LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
- if (gallery && outfit_cat_id.notNull())
- {
- gallery->uploadPhoto(outfit_cat_id);
- }
-}
-
-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)
+void LLOutfitGalleryContextMenu::onThumbnail(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)
-{
- LLNotificationsUtil::add("DeleteOutfits", LLSD(), LLSD(), boost::bind(&LLOutfitGalleryContextMenu::onOutfitsRemovalConfirmation, this, _1, _2, outfit_cat_id));
-}
-
-void LLOutfitGalleryContextMenu::onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response, const LLUUID& outfit_cat_id)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if (option != 0) return; // canceled
-
- if (outfit_cat_id.notNull())
- {
- gInventory.removeCategory(outfit_cat_id);
+ LLSD data(outfit_cat_id);
+ LLFloaterReg::showInstance("change_item_thumbnail", data);
}
}
@@ -919,16 +1190,6 @@ bool LLOutfitGalleryContextMenu::onEnable(LLSD::String param)
bool LLOutfitGalleryContextMenu::onVisible(LLSD::String param)
{
- mMenuHandle.get()->getChild<LLUICtrl>("upload_photo")->setLabelArg("[UPLOAD_COST]", std::to_string(LLAgentBenefitsMgr::current().getTextureUploadCost()));
- if ("remove_photo" == param)
- {
- LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
- LLUUID selected_id = mUUIDs.front();
- if (gallery && selected_id.notNull())
- {
- return !gallery->hasDefaultImage(selected_id);
- }
- }
return LLOutfitContextMenu::onVisible(param);
}
@@ -943,56 +1204,12 @@ void LLOutfitGalleryGearMenu::onUpdateItemsVisibility()
bool have_selection = getSelectedOutfitID().notNull();
mMenu->setItemVisible("expand", FALSE);
mMenu->setItemVisible("collapse", FALSE);
- mMenu->setItemVisible("upload_photo", have_selection);
- mMenu->setItemVisible("select_photo", have_selection);
- mMenu->setItemVisible("take_snapshot", have_selection);
- mMenu->setItemVisible("remove_photo", !hasDefaultImage());
+ mMenu->setItemVisible("thumbnail", have_selection);
mMenu->setItemVisible("sepatator3", TRUE);
mMenu->setItemVisible("sort_folders_by_name", TRUE);
LLOutfitListGearMenuBase::onUpdateItemsVisibility();
}
-void LLOutfitGalleryGearMenu::onUploadFoto()
-{
- LLUUID selected_outfit_id = getSelectedOutfitID();
- LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
- if (gallery && selected_outfit_id.notNull())
- {
- gallery->uploadPhoto(selected_outfit_id);
- }
-}
-
-void LLOutfitGalleryGearMenu::onSelectPhoto()
-{
- LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
- LLUUID selected_outfit_id = getSelectedOutfitID();
- if (gallery && !selected_outfit_id.isNull())
- {
- gallery->onSelectPhoto(selected_outfit_id);
- }
-}
-
-void LLOutfitGalleryGearMenu::onRemovePhoto()
-{
- LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
- LLUUID selected_outfit_id = getSelectedOutfitID();
- if (gallery && !selected_outfit_id.isNull())
- {
- gallery->checkRemovePhoto(selected_outfit_id);
- gallery->refreshOutfit(selected_outfit_id);
- }
-}
-
-void LLOutfitGalleryGearMenu::onTakeSnapshot()
-{
- LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
- LLUUID selected_outfit_id = getSelectedOutfitID();
- if (gallery && !selected_outfit_id.isNull())
- {
- gallery->onTakeSnapshot(selected_outfit_id);
- }
-}
-
void LLOutfitGalleryGearMenu::onChangeSortOrder()
{
bool sort_by_name = !gSavedSettings.getBOOL("OutfitGallerySortByName");
@@ -1019,240 +1236,89 @@ void LLOutfitGallery::onTextureSelectionChanged(LLInventoryItem* itemp)
{
}
-void LLOutfitGallery::loadPhotos()
-{
- //Iterate over inventory
- mSnapshotFolderID = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE);
- LLViewerInventoryCategory* textures_category = gInventory.getCategory(mSnapshotFolderID);
- if (!textures_category)
- return;
- if (mTexturesObserver == NULL)
- {
- mTexturesObserver = new LLInventoryCategoriesObserver();
- gInventory.addObserver(mTexturesObserver);
- }
-
- // Start observing changes in "Textures" category.
- mTexturesObserver->addCategory(mSnapshotFolderID,
- boost::bind(&LLOutfitGallery::refreshTextures, this, mSnapshotFolderID));
-
- textures_category->fetch();
-}
-
-void LLOutfitGallery::updateSnapshotFolderObserver()
-{
- if(mSnapshotFolderID != gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE))
- {
- if (gInventory.containsObserver(mTexturesObserver))
- {
- gInventory.removeObserver(mTexturesObserver);
- }
- delete mTexturesObserver;
- mTexturesObserver = NULL;
- loadPhotos();
- }
-}
-
void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
{
LLViewerInventoryCategory* category = gInventory.getCategory(category_id);
if (category)
{
bool photo_loaded = false;
- LLInventoryModel::cat_array_t sub_cat_array;
- LLInventoryModel::item_array_t outfit_item_array;
- // Collect all sub-categories of a given category.
- gInventory.collectDescendents(
- category->getUUID(),
- sub_cat_array,
- outfit_item_array,
- LLInventoryModel::EXCLUDE_TRASH);
- BOOST_FOREACH(LLViewerInventoryItem* outfit_item, outfit_item_array)
+ LLUUID asset_id = category->getThumbnailUUID();
+ if (asset_id.isNull())
{
- LLViewerInventoryItem* linked_item = outfit_item->getLinkedItem();
- LLUUID asset_id, inv_id;
- std::string item_name;
- if (linked_item != NULL)
+ LLInventoryModel::cat_array_t sub_cat_array;
+ LLInventoryModel::item_array_t outfit_item_array;
+ // Collect all sub-categories of a given category.
+ gInventory.collectDescendents(
+ category->getUUID(),
+ sub_cat_array,
+ outfit_item_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+ BOOST_FOREACH(LLViewerInventoryItem* outfit_item, outfit_item_array)
{
- if (linked_item->getActualType() == LLAssetType::AT_TEXTURE)
+ LLViewerInventoryItem* linked_item = outfit_item->getLinkedItem();
+ LLUUID asset_id, inv_id;
+ std::string item_name;
+ if (linked_item != NULL)
{
- asset_id = linked_item->getAssetUUID();
- inv_id = linked_item->getUUID();
- item_name = linked_item->getName();
+ if (linked_item->getActualType() == LLAssetType::AT_TEXTURE)
+ {
+ asset_id = linked_item->getAssetUUID();
+ inv_id = linked_item->getUUID();
+ item_name = linked_item->getName();
+ }
}
- }
- else if (outfit_item->getActualType() == LLAssetType::AT_TEXTURE)
- {
- asset_id = outfit_item->getAssetUUID();
- inv_id = outfit_item->getUUID();
- item_name = outfit_item->getName();
- }
- if (asset_id.notNull())
- {
- photo_loaded |= mOutfitMap[category_id]->setImageAssetId(asset_id);
- // Rename links
- if (!mOutfitRenamePending.isNull() && mOutfitRenamePending.asString() == item_name)
+ else if (outfit_item->getActualType() == LLAssetType::AT_TEXTURE)
+ {
+ asset_id = outfit_item->getAssetUUID();
+ inv_id = outfit_item->getUUID();
+ item_name = outfit_item->getName();
+ }
+ if (category->getThumbnailUUID().notNull())
+ {
+ asset_id = category->getThumbnailUUID();
+ }
+ if (asset_id.notNull())
{
- LLViewerInventoryCategory *outfit_cat = gInventory.getCategory(mOutfitRenamePending);
- LLStringUtil::format_map_t photo_string_args;
- photo_string_args["OUTFIT_NAME"] = outfit_cat->getName();
- std::string new_name = getString("outfit_photo_string", photo_string_args);
- LLSD updates;
- updates["name"] = new_name;
- update_inventory_item(inv_id, updates, NULL);
- mOutfitRenamePending.setNull();
- LLFloater* appearance_floater = LLFloaterReg::getInstance("appearance");
- if (appearance_floater)
+ photo_loaded |= mOutfitMap[category_id]->setImageAssetId(asset_id);
+ // Rename links
+ if (!mOutfitRenamePending.isNull() && mOutfitRenamePending.asString() == item_name)
+ {
+ LLViewerInventoryCategory *outfit_cat = gInventory.getCategory(mOutfitRenamePending);
+ LLStringUtil::format_map_t photo_string_args;
+ photo_string_args["OUTFIT_NAME"] = outfit_cat->getName();
+ std::string new_name = getString("outfit_photo_string", photo_string_args);
+ LLSD updates;
+ updates["name"] = new_name;
+ update_inventory_item(inv_id, updates, NULL);
+ mOutfitRenamePending.setNull();
+ LLFloater* appearance_floater = LLFloaterReg::getInstance("appearance");
+ if (appearance_floater)
+ {
+ appearance_floater->setFocus(TRUE);
+ }
+ }
+ if (item_name == LLAppearanceMgr::sExpectedTextureName)
{
- appearance_floater->setFocus(TRUE);
+ // Images with "appropriate" name take priority
+ break;
}
}
- if (item_name == LLAppearanceMgr::sExpectedTextureName)
+ if (!photo_loaded)
{
- // Images with "appropriate" name take priority
- break;
+ mOutfitMap[category_id]->setDefaultImage();
}
}
- if (!photo_loaded)
- {
- mOutfitMap[category_id]->setDefaultImage();
- }
- }
- }
-
- if (mGalleryCreated && !LLApp::isExiting())
- {
- reArrangeRows();
- }
-}
-
-// Refresh linked textures from "textures" uploads folder
-void LLOutfitGallery::refreshTextures(const LLUUID& category_id)
-{
- LLInventoryModel::cat_array_t cat_array;
- LLInventoryModel::item_array_t item_array;
-
- // Collect all sub-categories of a given category.
- LLIsType is_texture(LLAssetType::AT_TEXTURE);
- gInventory.collectDescendentsIf(
- category_id,
- cat_array,
- item_array,
- LLInventoryModel::EXCLUDE_TRASH,
- is_texture);
-
- //Find texture which contain pending outfit ID string in name
- LLViewerInventoryItem* photo_upload_item = NULL;
- BOOST_FOREACH(LLViewerInventoryItem* item, item_array)
- {
- std::string name = item->getName();
- if (!mOutfitLinkPending.isNull() && name == mOutfitLinkPending.asString())
- {
- photo_upload_item = item;
- break;
- }
- }
-
- if (photo_upload_item != NULL)
- {
- LLUUID photo_item_id = photo_upload_item->getUUID();
- LLInventoryObject* upload_object = gInventory.getObject(photo_item_id);
- if (!upload_object)
- {
- LL_WARNS() << "LLOutfitGallery::refreshTextures added_object is null!" << LL_ENDL;
}
else
{
- linkPhotoToOutfit(photo_item_id, mOutfitLinkPending);
- mOutfitRenamePending = mOutfitLinkPending;
- mOutfitLinkPending.setNull();
+ mOutfitMap[category_id]->setImageAssetId(asset_id);
}
}
-}
-
-void LLOutfitGallery::uploadPhoto(LLUUID outfit_id)
-{
- outfit_map_t::iterator outfit_it = mOutfitMap.find(outfit_id);
- if (outfit_it == mOutfitMap.end() || outfit_it->first.isNull())
- {
- return;
- }
- LLFilePickerReplyThread::startPicker(boost::bind(&LLOutfitGallery::uploadOutfitImage, this, _1, outfit_id), LLFilePicker::FFLOAD_IMAGE, false);
-}
-
-void LLOutfitGallery::uploadOutfitImage(const std::vector<std::string>& filenames, LLUUID outfit_id)
-{
- std::string filename = filenames[0];
- LLLocalBitmap* unit = new LLLocalBitmap(filename);
- if (unit->getValid())
+
+ if (mGalleryCreated && !LLApp::isExiting())
{
- std::string exten = gDirUtilp->getExtension(filename);
- U32 codec = LLImageBase::getCodecFromExtension(exten);
-
- LLImageDimensionsInfo image_info;
- std::string image_load_error;
- if (!image_info.load(filename, codec))
- {
- image_load_error = image_info.getLastError();
- }
-
- S32 max_width = MAX_OUTFIT_PHOTO_WIDTH;
- S32 max_height = MAX_OUTFIT_PHOTO_HEIGHT;
-
- if ((image_info.getWidth() > max_width) || (image_info.getHeight() > max_height))
- {
- LLStringUtil::format_map_t args;
- args["WIDTH"] = llformat("%d", max_width);
- args["HEIGHT"] = llformat("%d", max_height);
-
- image_load_error = LLTrans::getString("outfit_photo_load_dimensions_error", args);
- }
-
- if (!image_load_error.empty())
- {
- LLSD subst;
- subst["REASON"] = image_load_error;
- LLNotificationsUtil::add("OutfitPhotoLoadError", subst);
- return;
- }
-
- S32 expected_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost();
- void *nruserdata = NULL;
- nruserdata = (void *)&outfit_id;
-
- LLViewerInventoryCategory *outfit_cat = gInventory.getCategory(outfit_id);
- if (!outfit_cat) return;
- updateSnapshotFolderObserver();
- checkRemovePhoto(outfit_id);
- std::string upload_pending_name = outfit_id.asString();
- std::string upload_pending_desc = "";
- upload_new_resource(filename, // file
- upload_pending_name,
- upload_pending_desc,
- 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
- LLFloaterPerms::getNextOwnerPerms("Uploads"),
- LLFloaterPerms::getGroupPerms("Uploads"),
- LLFloaterPerms::getEveryonePerms("Uploads"),
- upload_pending_name, LLAssetStorage::LLStoreAssetCallback(), expected_upload_cost, nruserdata, false);
- mOutfitLinkPending = outfit_id;
+ reArrangeRows();
}
- delete unit;
-}
-
-void LLOutfitGallery::linkPhotoToOutfit(LLUUID photo_id, LLUUID outfit_id)
-{
- LLPointer<LLInventoryCallback> cb = new LLUpdateGalleryOnPhotoLinked();
- link_inventory_object(outfit_id, photo_id, cb);
-}
-
-bool LLOutfitGallery::checkRemovePhoto(LLUUID outfit_id)
-{
- LLAppearanceMgr::instance().removeOutfitPhoto(outfit_id);
- return true;
-}
-
-void LLUpdateGalleryOnPhotoLinked::fire(const LLUUID& inv_item_id)
-{
}
LLUUID LLOutfitGallery::getPhotoAssetId(const LLUUID& outfit_id)
@@ -1270,150 +1336,3 @@ LLUUID LLOutfitGallery::getDefaultPhoto()
return LLUUID();
}
-void LLOutfitGallery::onTexturePickerCommit(LLTextureCtrl::ETexturePickOp op, LLUUID id)
-{
- LLUUID selected_outfit_id = getSelectedOutfitUUID();
-
- if (selected_outfit_id.isNull())
- {
- return;
- }
-
- LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterHandle.get();
-
- if (floaterp && op == LLTextureCtrl::TEXTURE_SELECT)
- {
- LLUUID image_item_id;
- if (id.notNull())
- {
- image_item_id = id;
- }
- else
- {
- image_item_id = floaterp->findItemID(floaterp->getAssetID(), FALSE, TRUE);
- if (image_item_id.isNull())
- {
- LL_WARNS() << "id or image_item_id is NULL!" << LL_ENDL;
- return;
- }
- }
-
- std::string image_load_error;
- S32 max_width = MAX_OUTFIT_PHOTO_WIDTH;
- S32 max_height = MAX_OUTFIT_PHOTO_HEIGHT;
- if (mTextureSelected.isNull() ||
- mTextureSelected->getFullWidth() == 0 ||
- mTextureSelected->getFullHeight() == 0)
- {
- image_load_error = LLTrans::getString("outfit_photo_verify_dimensions_error");
- LL_WARNS() << "Cannot verify selected texture dimensions" << LL_ENDL;
- return;
- }
- S32 width = mTextureSelected->getFullWidth();
- S32 height = mTextureSelected->getFullHeight();
- if ((width > max_width) || (height > max_height))
- {
- LLStringUtil::format_map_t args;
- args["WIDTH"] = llformat("%d", max_width);
- args["HEIGHT"] = llformat("%d", max_height);
-
- image_load_error = LLTrans::getString("outfit_photo_select_dimensions_error", args);
- }
-
- if (!image_load_error.empty())
- {
- LLSD subst;
- subst["REASON"] = image_load_error;
- LLNotificationsUtil::add("OutfitPhotoLoadError", subst);
- return;
- }
-
- checkRemovePhoto(selected_outfit_id);
- linkPhotoToOutfit(image_item_id, selected_outfit_id);
- }
-}
-
-void LLOutfitGallery::onSelectPhoto(LLUUID selected_outfit_id)
-{
- if (selected_outfit_id.notNull())
- {
-
- // show hourglass cursor when loading inventory window
- // because inventory construction is slooow
- getWindow()->setCursor(UI_CURSOR_WAIT);
- LLFloater* floaterp = mFloaterHandle.get();
-
- // Show the dialog
- if (floaterp)
- {
- floaterp->openFloater();
- }
- else
- {
- floaterp = new LLFloaterTexturePicker(
- this,
- getPhotoAssetId(selected_outfit_id),
- getPhotoAssetId(selected_outfit_id),
- getPhotoAssetId(selected_outfit_id),
- FALSE,
- TRUE,
- "SELECT PHOTO",
- PERM_NONE,
- PERM_NONE,
- FALSE,
- NULL);
-
- mFloaterHandle = floaterp->getHandle();
- mTextureSelected = NULL;
-
- LLFloaterTexturePicker* texture_floaterp = dynamic_cast<LLFloaterTexturePicker*>(floaterp);
- if (texture_floaterp)
- {
- texture_floaterp->setTextureSelectedCallback(boost::bind(&LLOutfitGallery::onTextureSelectionChanged, this, _1));
- 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);
- }
-
- floaterp->openFloater();
- }
- floaterp->setFocus(TRUE);
- }
-}
-
-void LLOutfitGallery::onTakeSnapshot(LLUUID selected_outfit_id)
-{
- LLFloaterReg::toggleInstanceOrBringToFront("simple_outfit_snapshot");
- LLFloaterSimpleOutfitSnapshot* snapshot_floater = LLFloaterSimpleOutfitSnapshot::getInstance();
- if (snapshot_floater)
- {
- snapshot_floater->setOutfitID(selected_outfit_id);
- snapshot_floater->getInstance()->setGallery(this);
- }
-}
-
-void LLOutfitGallery::onBeforeOutfitSnapshotSave()
-{
- LLUUID selected_outfit_id = getSelectedOutfitUUID();
- if (!selected_outfit_id.isNull())
- {
- checkRemovePhoto(selected_outfit_id);
- updateSnapshotFolderObserver();
- }
-}
-
-void LLOutfitGallery::onAfterOutfitSnapshotSave()
-{
- LLUUID selected_outfit_id = getSelectedOutfitUUID();
- if (!selected_outfit_id.isNull())
- {
- mOutfitLinkPending = selected_outfit_id;
- }
-}
-
-void LLOutfitGallery::onTexturePickerUpdateImageStats(LLPointer<LLViewerTexture> texture)
-{
- mTextureSelected = texture;
-}