# Conflicts:
#	indra/newview/llinventorybridge.cpp
#	indra/newview/llinventorypanel.cpp
#	indra/newview/skins/default/xui/en/panel_main_inventory.xml
master
Ansariel 2023-06-19 11:17:10 +02:00
commit 147dc16bc5
22 changed files with 355 additions and 210 deletions

View File

@ -55,7 +55,7 @@ void LLCallbackList::addFunction( callback_t func, void *data)
// only add one callback per func/data pair
//
if (containsFunction(func))
if (containsFunction(func, data))
{
return;
}

View File

@ -724,6 +724,7 @@ void LLFolderView::draw()
{
// renamer is not connected to the item we are renaming in any form so manage it manually
// TODO: consider stopping on any scroll action instead of when out of visible area
LL_DEBUGS("Inventory") << "Renamer out of bounds, hiding" << LL_ENDL;
finishRenamingItem();
}
@ -1085,6 +1086,8 @@ void LLFolderView::paste()
// public rename functionality - can only start the process
void LLFolderView::startRenamingSelectedItem( void )
{
LL_DEBUGS("Inventory") << "Starting inventory renamer" << LL_ENDL;
// make sure selection is visible
scrollToShowSelection();
@ -1568,10 +1571,10 @@ BOOL LLFolderView::handleRightMouseDown( S32 x, S32 y, MASK mask )
}
}
bool item_clicked = false;
BOOL item_clicked = FALSE;
for (selected_items_t::iterator item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)
{
item_clicked |= (bool)(*item_it)->getRect().pointInRect(x, y);
item_clicked |= (*item_it)->getRect().pointInRect(x, y);
}
if(!item_clicked && mSingleFolderMode)
{

View File

@ -296,8 +296,8 @@ void LLFloaterChangeItemThumbnail::refreshFromInventory()
if (obj)
{
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
bool in_trash = (obj->getUUID() == trash_id) || gInventory.isObjectDescendentOf(obj->getUUID(), trash_id);
if (in_trash)
bool in_trash = gInventory.isObjectDescendentOf(obj->getUUID(), trash_id);
if (in_trash && obj->getUUID() != trash_id)
{
// Close properties when moving to trash
// Aren't supposed to view properties from trash

View File

@ -988,8 +988,8 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
// <FS:Zi> Don't offer "Show in Main View" for folders opened in separate inventory views
// as there are no tabs to switch to
//if (!isPanelActive("All Items") && !isPanelActive("single_folder_inv") && !isPanelActive("comb_single_folder_inv"))
if (!isPanelActive("All Items") && !isPanelActive("single_folder_inv") && !isPanelActive("comb_single_folder_inv") && !isPanelActive("inv_panel"))
//if (!isPanelActive("All Items") && !isPanelActive("comb_single_folder_inv"))
if (!isPanelActive("All Items") && !isPanelActive("comb_single_folder_inv") && !isPanelActive("inv_panel"))
// </FS:Zi>
{
items.push_back(std::string("Show in Main Panel"));
@ -4639,6 +4639,8 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
{
disabled_items.push_back(std::string("Empty Trash"));
}
items.push_back(std::string("thumbnail"));
}
else if(isItemInTrash())
{
@ -4705,6 +4707,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
if (model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT) == mUUID)
{
items.push_back(std::string("Copy outfit list to clipboard"));
addOpenFolderMenuOptions(flags, items);
}
//Added by aura to force inventory pull on right-click to display folder options correctly. 07-17-06
@ -4857,9 +4860,12 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags, menuentry_vec_t&
if(!category) return;
const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
if (trash_id == mUUID) return;
if (isItemInTrash()) return;
if ((trash_id == mUUID) || isItemInTrash())
{
addOpenFolderMenuOptions(flags, items);
return;
}
if (!isItemRemovable())
{
disabled_items.push_back(std::string("Delete"));
@ -4901,15 +4907,7 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags, menuentry_vec_t&
return;
}
if ((flags & ITEM_IN_MULTI_SELECTION) == 0)
{
items.push_back(std::string("open_in_new_window"));
items.push_back(std::string("Open Folder Separator"));
if(isPanelActive("single_folder_inv"))
{
items.push_back(std::string("open_in_current_window"));
}
}
addOpenFolderMenuOptions(flags, items);
#ifndef LL_RELEASE_FOR_DOWNLOAD
if (LLFolderType::lookupIsProtectedType(type) && is_agent_inventory)
@ -5006,6 +5004,20 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
menu.arrangeAndClear();
}
void LLFolderBridge::addOpenFolderMenuOptions(U32 flags, menuentry_vec_t& items)
{
if ((flags & ITEM_IN_MULTI_SELECTION) == 0)
{
items.push_back(std::string("open_in_new_window"));
items.push_back(std::string("Open Folder Separator"));
items.push_back(std::string("Copy Separator"));
if(isPanelActive("comb_single_folder_inv"))
{
items.push_back(std::string("open_in_current_window"));
}
}
}
bool LLFolderBridge::hasChildren() const
{
LLInventoryModel* model = getInventoryModel();

View File

@ -366,6 +366,7 @@ public:
protected:
void buildContextMenuOptions(U32 flags, menuentry_vec_t& items, menuentry_vec_t& disabled_items);
void buildContextMenuFolderOptions(U32 flags, menuentry_vec_t& items, menuentry_vec_t& disabled_items);
void addOpenFolderMenuOptions(U32 flags, menuentry_vec_t& items);
//--------------------------------------------------------------------
// Menu callbacks

View File

@ -85,6 +85,7 @@ LLInventoryGallery::LLInventoryGallery(const LLInventoryGallery::Params& p)
mRowPanWidthFactor(p.row_panel_width_factor),
mGalleryWidthFactor(p.gallery_width_factor),
mIsInitialized(false),
mRootDirty(false),
mNeedsArrange(false),
mSearchType(LLInventoryFilter::SEARCHTYPE_NAME)
{
@ -142,8 +143,8 @@ LLInventoryGallery::~LLInventoryGallery()
delete mInventoryGalleryMenu;
delete mRootGalleryMenu;
delete mFilter;
gIdleCallbacks.deleteFunction(onIdle, this);
gIdleCallbacks.deleteFunction(onIdle, (void*)this);
while (!mUnusedRowPanels.empty())
{
@ -157,6 +158,13 @@ LLInventoryGallery::~LLInventoryGallery()
mUnusedItemPanels.pop_back();
panelp->die();
}
while (!mHiddenItems.empty())
{
LLPanel* panelp = mHiddenItems.back();
mHiddenItems.pop_back();
panelp->die();
}
if (gInventory.containsObserver(mCategoriesObserver))
{
@ -176,8 +184,6 @@ LLInventoryGallery::~LLInventoryGallery()
void LLInventoryGallery::setRootFolder(const LLUUID cat_id)
{
gIdleCallbacks.deleteFunction(onIdle, this);
LLViewerInventoryCategory* category = gInventory.getCategory(cat_id);
if(!category || (mFolderID == cat_id))
{
@ -187,8 +193,26 @@ void LLInventoryGallery::setRootFolder(const LLUUID cat_id)
{
mBackwardFolders.push_back(mFolderID);
}
gIdleCallbacks.deleteFunction(onIdle, (void*)this);
mFolderID = cat_id;
updateRootFolder();
mItemToSelect.setNull();
mItemBuildQuery.clear();
mNeedsArrange = false;
dirtyRootFolder();
}
void LLInventoryGallery::dirtyRootFolder()
{
if (getVisible())
{
updateRootFolder();
}
else
{
mRootDirty = true;
}
}
void LLInventoryGallery::updateRootFolder()
@ -206,6 +230,7 @@ void LLInventoryGallery::updateRootFolder()
{
updateRemovedItem(mHiddenItems[i]->getUUID());
}
mItemBuildQuery.clear();
if (gInventory.containsObserver(mCategoriesObserver))
{
@ -249,17 +274,17 @@ void LLInventoryGallery::updateRootFolder()
iter != cat_array->end();
iter++)
{
updateAddedItem((*iter)->getUUID());
mItemBuildQuery.insert((*iter)->getUUID());
}
for (LLInventoryModel::item_array_t::const_iterator iter = item_array->begin();
iter != item_array->end();
iter++)
{
updateAddedItem((*iter)->getUUID());
mItemBuildQuery.insert((*iter)->getUUID());
}
reArrangeRows();
mIsInitialized = true;
mRootDirty = false;
if (mScrollPanel)
{
@ -273,6 +298,11 @@ void LLInventoryGallery::updateRootFolder()
{
initGallery();
}
if (!mItemBuildQuery.empty())
{
gIdleCallbacks.addFunction(onIdle, (void*)this);
}
}
void LLInventoryGallery::initGallery()
@ -305,14 +335,26 @@ void LLInventoryGallery::draw()
}
}
void LLInventoryGallery::onVisibilityChange(BOOL new_visibility)
{
if (new_visibility && mRootDirty)
{
updateRootFolder();
}
LLPanel::onVisibilityChange(new_visibility);
}
bool LLInventoryGallery::updateRowsIfNeeded()
{
if(((getRect().getWidth() - mRowPanelWidth) > mItemWidth) && mRowCount > 1)
S32 scroll_content_width = mScrollPanel ? mScrollPanel->getVisibleContentRect().getWidth() : getRect().getWidth();
if(((scroll_content_width - mRowPanelWidth) > mItemWidth)
&& mRowCount > 1)
{
reArrangeRows(1);
return true;
}
else if((mRowPanelWidth > (getRect().getWidth() + mItemHorizontalGap)) && mItemsInRow > GALLERY_ITEMS_PER_ROW_MIN)
else if((mRowPanelWidth > (scroll_content_width + mItemHorizontalGap))
&& mItemsInRow > GALLERY_ITEMS_PER_ROW_MIN)
{
reArrangeRows(-1);
return true;
@ -344,7 +386,7 @@ void LLInventoryGallery::reArrangeRows(S32 row_diff)
std::vector<LLInventoryGalleryItem*> buf_items = mItems;
for (std::vector<LLInventoryGalleryItem*>::const_reverse_iterator it = buf_items.rbegin(); it != buf_items.rend(); ++it)
{
removeFromGalleryLast(*it);
removeFromGalleryLast(*it, false);
}
for (std::vector<LLInventoryGalleryItem*>::const_reverse_iterator it = mHiddenItems.rbegin(); it != mHiddenItems.rend(); ++it)
{
@ -457,11 +499,12 @@ void LLInventoryGallery::addToGallery(LLInventoryGalleryItem* item)
}
void LLInventoryGallery::removeFromGalleryLast(LLInventoryGalleryItem* item)
void LLInventoryGallery::removeFromGalleryLast(LLInventoryGalleryItem* item, bool needs_reshape)
{
if(item->isHidden())
{
mHiddenItems.pop_back();
// Note: item still exists!!!
return;
}
int n_prev = mItemsAddedCount;
@ -482,7 +525,10 @@ void LLInventoryGallery::removeFromGalleryLast(LLInventoryGalleryItem* item)
}
removeLastRow();
}
reshapeGalleryPanel(row_count);
if (needs_reshape)
{
reshapeGalleryPanel(row_count);
}
}
@ -491,6 +537,7 @@ void LLInventoryGallery::removeFromGalleryMiddle(LLInventoryGalleryItem* item)
if(item->isHidden())
{
mHiddenItems.erase(std::remove(mHiddenItems.begin(), mHiddenItems.end(), item), mHiddenItems.end());
// item still exists and needs to be deleted or used!!!
return;
}
int n = mItemIndexMap[item];
@ -522,12 +569,11 @@ void LLInventoryGallery::removeFromLastRow(LLInventoryGalleryItem* item)
LLInventoryGalleryItem* LLInventoryGallery::buildGalleryItem(std::string name, LLUUID item_id, LLAssetType::EType type, LLUUID thumbnail_id, LLInventoryType::EType inventory_type, U32 flags, bool is_link, bool is_worn)
{
LLInventoryGalleryItem::Params giparams;
giparams.visible = true;
giparams.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP);
giparams.rect(LLRect(0,mItemHeight, mItemWidth, 0));
LLInventoryGalleryItem* gitem = LLUICtrlFactory::create<LLInventoryGalleryItem>(giparams);
gitem->reshape(mItemWidth, mItemHeight);
gitem->setVisible(true);
gitem->setFollowsLeft();
gitem->setFollowsTop();
gitem->setName(name);
gitem->setItemName(name);
gitem->setUUID(item_id);
gitem->setGallery(this);
gitem->setType(type, inventory_type, flags, is_link);
@ -542,6 +588,9 @@ LLInventoryGalleryItem* LLInventoryGallery::buildGalleryItem(std::string name, L
void LLInventoryGallery::buildGalleryPanel(int row_count)
{
LLPanel::Params params;
params.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP);
params.visible = true;
params.use_bounding_rect = false;
mGalleryPanel = LLUICtrlFactory::create<LLPanel>(params);
reshapeGalleryPanel(row_count);
}
@ -554,40 +603,41 @@ void LLInventoryGallery::reshapeGalleryPanel(int row_count)
LLRect rect = LLRect(left, bottom + height, left + mGalleryWidth, bottom);
mGalleryPanel->setRect(rect);
mGalleryPanel->reshape(mGalleryWidth, height);
mGalleryPanel->setVisible(true);
mGalleryPanel->setFollowsLeft();
mGalleryPanel->setFollowsTop();
}
LLPanel* LLInventoryGallery::buildItemPanel(int left)
{
LLPanel::Params lpparams;
int top = 0;
LLPanel* lpanel = NULL;
if(mUnusedItemPanels.empty())
{
LLPanel::Params lpparams;
lpparams.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP);
lpparams.visible = true;
lpparams.rect(LLRect(left, top + mItemHeight, left + mItemWidth + mItemHorizontalGap, top));
lpparams.use_bounding_rect = false;
lpanel = LLUICtrlFactory::create<LLPanel>(lpparams);
}
else
{
lpanel = mUnusedItemPanels.back();
mUnusedItemPanels.pop_back();
LLRect rect = LLRect(left, top + mItemHeight, left + mItemWidth + mItemHorizontalGap, top);
lpanel->setShape(rect, false);
}
LLRect rect = LLRect(left, top + mItemHeight, left + mItemWidth + mItemHorizontalGap, top);
lpanel->setRect(rect);
lpanel->reshape(mItemWidth + mItemHorizontalGap, mItemHeight);
lpanel->setVisible(true);
lpanel->setFollowsLeft();
lpanel->setFollowsTop();
return lpanel;
}
LLPanel* LLInventoryGallery::buildRowPanel(int left, int bottom)
{
LLPanel::Params sparams;
LLPanel* stack = NULL;
if(mUnusedRowPanels.empty())
{
LLPanel::Params sparams;
sparams.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP);
sparams.use_bounding_rect = false;
sparams.visible = true;
stack = LLUICtrlFactory::create<LLPanel>(sparams);
}
else
@ -604,9 +654,6 @@ void LLInventoryGallery::moveRowPanel(LLPanel* stack, int left, int bottom)
LLRect rect = LLRect(left, bottom + mRowPanelHeight, left + mRowPanelWidth, bottom);
stack->setRect(rect);
stack->reshape(mRowPanelWidth, mRowPanelHeight);
stack->setVisible(true);
stack->setFollowsLeft();
stack->setFollowsTop();
}
void LLInventoryGallery::setFilterSubString(const std::string& string)
@ -617,12 +664,15 @@ void LLInventoryGallery::setFilterSubString(const std::string& string)
//reArrangeRows();
}
void LLInventoryGallery::applyFilter(LLInventoryGalleryItem* item, const std::string& filter_substring)
bool LLInventoryGallery::applyFilter(LLInventoryGalleryItem* item, const std::string& filter_substring)
{
if(item)
{
item->setHidden(!checkAgainstFilters(item, filter_substring));
bool visible = checkAgainstFilters(item, filter_substring);
item->setHidden(!visible);
return visible;
}
return false;
}
bool LLInventoryGallery::checkAgainstFilters(LLInventoryGalleryItem* item, const std::string& filter_substring)
@ -701,10 +751,26 @@ void LLInventoryGallery::onIdle(void* userdata)
return;
}
const F64 MAX_TIME_VISIBLE = 0.020f;
const F64 MAX_TIME_HIDDEN = 0.001f; // take it slow
const F64 max_time = self->getVisible() ? MAX_TIME_VISIBLE : MAX_TIME_HIDDEN;
F64 curent_time = LLTimer::getTotalSeconds();
const F64 end_time = curent_time + max_time;
while (!self->mItemBuildQuery.empty() && end_time > curent_time)
{
uuid_set_t::iterator iter = self->mItemBuildQuery.begin();
LLUUID item_id = *iter;
self->mNeedsArrange |= self->updateAddedItem(item_id);
self->mItemBuildQuery.erase(iter);
curent_time = LLTimer::getTotalSeconds();
}
if (self->mNeedsArrange)
{
self->mNeedsArrange = false;
self->reArrangeRows();
self->updateMessageVisibility();
}
if (self->mItemToSelect.notNull())
@ -714,7 +780,7 @@ void LLInventoryGallery::onIdle(void* userdata)
self->changeItemSelection(item_to_select, true);
}
if (self->mItemToSelect.isNull())
if (self->mItemToSelect.isNull() && self->mItemBuildQuery.empty())
{
gIdleCallbacks.deleteFunction(onIdle, (void*)self);
}
@ -745,13 +811,13 @@ void LLInventoryGallery::getCurrentCategories(uuid_vec_t& vcur)
}
}
void LLInventoryGallery::updateAddedItem(LLUUID item_id)
bool LLInventoryGallery::updateAddedItem(LLUUID item_id)
{
LLInventoryObject* obj = gInventory.getObject(item_id);
if (!obj)
{
LL_WARNS("InventoryGallery") << "Failed to find item: " << item_id << LL_ENDL;
return;
return false;
}
std::string name = obj->getName();
@ -782,18 +848,20 @@ void LLInventoryGallery::updateAddedItem(LLUUID item_id)
}
}
bool res = false;
LLInventoryGalleryItem* item = buildGalleryItem(name, item_id, obj->getType(), thumbnail_id, inventory_type, misc_flags, obj->getIsLinkType(), is_worn);
mItemMap.insert(LLInventoryGallery::gallery_item_map_t::value_type(item_id, item));
item->setRightMouseDownCallback(boost::bind(&LLInventoryGallery::showContextMenu, this, _1, _2, _3, item_id));
item->setFocusReceivedCallback(boost::bind(&LLInventoryGallery::changeItemSelection, this, item_id, false));
if (mGalleryCreated)
{
applyFilter(item, mFilterSubString);
res = applyFilter(item, mFilterSubString);
addToGallery(item);
}
mThumbnailsObserver->addItem(item_id,
boost::bind(&LLInventoryGallery::updateItemThumbnail, this, item_id));
return res;
}
void LLInventoryGallery::updateRemovedItem(LLUUID item_id)
@ -812,9 +880,12 @@ void LLInventoryGallery::updateRemovedItem(LLUUID item_id)
// kill removed item
if (item != NULL)
{
// Todo: instead of deleting, store somewhere to reuse later
item->die();
}
}
mItemBuildQuery.erase(item_id);
}
void LLInventoryGallery::updateChangedItemName(LLUUID item_id, std::string name)
@ -825,7 +896,7 @@ void LLInventoryGallery::updateChangedItemName(LLUUID item_id, std::string name)
LLInventoryGalleryItem* item = iter->second;
if (item)
{
item->setName(name);
item->setItemName(name);
}
}
}
@ -870,24 +941,15 @@ void LLInventoryGallery::updateItemThumbnail(LLUUID item_id)
}
}
void LLInventoryGallery::onThumbnailAdded(LLUUID item_id)
{
if((mItemMap.count(item_id) == 0) && mFilter->checkAgainstFilterThumbnails(item_id))
{
updateAddedItem(item_id);
reArrangeRows();
}
}
BOOL LLInventoryGallery::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
LLUUID old_selection = mSelectedItemID;
BOOL res = LLPanel::handleRightMouseDown(x, y, mask);
if (!res)
if(mItemMap[mSelectedItemID])
{
clearSelection();
mItemMap[old_selection]->setFocus(false);
mItemMap[mSelectedItemID]->setFocus(false);
setFocus(true);
}
clearSelection();
BOOL res = LLPanel::handleRightMouseDown(x, y, mask);
if (mSelectedItemID.isNull())
{
@ -1257,7 +1319,7 @@ void LLInventoryGallery::paste()
}
const LLUUID& marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
if (gInventory.isObjectDescendentOf(mSelectedItemID, marketplacelistings_id))
if (!mSelectedItemID.isNull() && gInventory.isObjectDescendentOf(mSelectedItemID, marketplacelistings_id))
{
return;
}
@ -1649,6 +1711,7 @@ void LLInventoryGallery::computeDifference(
uuid_vec_t vcur;
getCurrentCategories(vcur);
std::copy(mItemBuildQuery.begin(), mItemBuildQuery.end(), std::back_inserter(vcur));
LLCommonUtils::computeDifference(vnew, vcur, vadded, vremoved);
}
@ -1793,7 +1856,7 @@ void LLInventoryGallery::onForwardFolder()
mBackwardFolders.push_back(mFolderID);
mFolderID = mForwardFolders.back();
mForwardFolders.pop_back();
updateRootFolder();
dirtyRootFolder();
}
}
@ -1804,7 +1867,7 @@ void LLInventoryGallery::onBackwardFolder()
mForwardFolders.push_back(mFolderID);
mFolderID = mBackwardFolders.back();
mBackwardFolders.pop_back();
updateRootFolder();
dirtyRootFolder();
}
}
@ -1841,6 +1904,11 @@ BOOL LLInventoryGallery::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
return handled;
}
bool LLInventoryGallery::areViewsInitialized()
{
return mGalleryCreated && mItemBuildQuery.empty();
}
bool LLInventoryGallery::hasDescendents(const LLUUID& cat_id)
{
LLInventoryModel::cat_array_t* cats;
@ -1946,7 +2014,7 @@ LLInventoryGalleryItem::LLInventoryGalleryItem(const Params& p)
: LLPanel(p),
mSelected(false),
mDefaultImage(true),
mName(""),
mItemName(""),
mWornSuffix(""),
mPermSuffix(""),
mUUID(LLUUID()),
@ -2062,9 +2130,9 @@ void LLInventoryGalleryItem::draw()
gl_rect_2d(border, border_color.get(), FALSE);
}
void LLInventoryGalleryItem::setName(std::string name)
void LLInventoryGalleryItem::setItemName(std::string name)
{
mName = name;
mItemName = name;
updateNameText();
}
@ -2232,9 +2300,9 @@ LLFontGL* LLInventoryGalleryItem::getTextFont()
void LLInventoryGalleryItem::updateNameText()
{
mNameText->setFont(getTextFont());
mNameText->setText(mName + mPermSuffix + mWornSuffix);
mNameText->setToolTip(mName + mPermSuffix + mWornSuffix);
getChild<LLThumbnailCtrl>("preview_thumbnail")->setToolTip(mName + mPermSuffix + mWornSuffix);
mNameText->setText(mItemName + mPermSuffix + mWornSuffix);
mNameText->setToolTip(mItemName + mPermSuffix + mWornSuffix);
getChild<LLThumbnailCtrl>("preview_thumbnail")->setToolTip(mItemName + mPermSuffix + mWornSuffix);
}
//-----------------------------
@ -2244,33 +2312,6 @@ void LLInventoryGalleryItem::updateNameText()
void LLThumbnailsObserver::changed(U32 mask)
{
std::vector<LLUUID> deleted_ids;
for (item_map_t::iterator iter = mSkippedItems.begin();
iter != mSkippedItems.end();
++iter)
{
const LLUUID& obj_id = (*iter).first;
LLItemData& data = (*iter).second;
LLInventoryObject* obj = gInventory.getObject(obj_id);
if (!obj)
{
deleted_ids.push_back(obj_id);
continue;
}
const LLUUID thumbnail_id = obj->getThumbnailUUID();
if (data.mThumbnailID != thumbnail_id)
{
data.mThumbnailID = thumbnail_id;
data.mCallback();
}
}
for (std::vector<LLUUID>::iterator deleted_id = deleted_ids.begin(); deleted_id != deleted_ids.end(); ++deleted_id)
{
removeSkippedItem(*deleted_id);
}
deleted_ids.clear();
for (item_map_t::iterator iter = mItemMap.begin();
iter != mItemMap.end();
++iter)
@ -2311,25 +2352,11 @@ bool LLThumbnailsObserver::addItem(const LLUUID& obj_id, callback_t cb)
return false;
}
void LLThumbnailsObserver::addSkippedItem(const LLUUID& obj_id, callback_t cb)
{
LLInventoryObject* obj = gInventory.getObject(obj_id);
if (obj)
{
mSkippedItems.insert(item_map_value_t(obj_id, LLItemData(obj_id, obj->getThumbnailUUID(), cb)));
}
}
void LLThumbnailsObserver::removeItem(const LLUUID& obj_id)
{
mItemMap.erase(obj_id);
}
void LLThumbnailsObserver::removeSkippedItem(const LLUUID& obj_id)
{
mSkippedItems.erase(obj_id);
}
//-----------------------------
// Helper drag&drop functions
//-----------------------------

View File

@ -76,6 +76,7 @@ public:
BOOL postBuild() override;
void initGallery();
void draw() override;
void onVisibilityChange(BOOL new_visibility) override;
BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type,
void* cargo_data, EAcceptance* accept, std::string& tooltip_msg) override;
BOOL handleRightMouseDown(S32 x, S32 y, MASK mask) override;
@ -91,11 +92,10 @@ public:
bool checkAgainstFilterType(const LLUUID& object_id);
void getCurrentCategories(uuid_vec_t& vcur);
void updateAddedItem(LLUUID item_id);
bool updateAddedItem(LLUUID item_id); // returns true if added item is visible
void updateRemovedItem(LLUUID item_id);
void updateChangedItemName(LLUUID item_id, std::string name);
void updateItemThumbnail(LLUUID item_id);
void onThumbnailAdded(LLUUID item_id);
void updateWornItem(LLUUID item_id, bool is_worn);
void updateMessageVisibility();
@ -103,6 +103,7 @@ public:
void setRootFolder(const LLUUID cat_id);
void updateRootFolder();
LLUUID getRootFolder() { return mFolderID; }
bool isRootDirty() { return mRootDirty; }
boost::signals2::connection setRootChangedCallback(callback_t cb);
void onForwardFolder();
void onBackwardFolder();
@ -133,6 +134,7 @@ public:
void setSearchType(LLInventoryFilter::ESearchType type);
LLInventoryFilter::ESearchType getSearchType() { return mSearchType; }
bool areViewsInitialized();
bool hasDescendents(const LLUUID& cat_id);
bool hasVisibleItems();
void handleModifiedFilter();
@ -165,9 +167,10 @@ protected:
void showContextMenu(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& item_id);
void applyFilter(LLInventoryGalleryItem* item, const std::string& filter_substring);
bool applyFilter(LLInventoryGalleryItem* item, const std::string& filter_substring);
bool checkAgainstFilters(LLInventoryGalleryItem* item, const std::string& filter_substring);
static void onIdle(void* userdata);
void dirtyRootFolder();
LLInventoryCategoriesObserver* mCategoriesObserver;
LLThumbnailsObserver* mThumbnailsObserver;
@ -176,6 +179,7 @@ protected:
LLUUID mSelectedItemID;
LLUUID mItemToSelect;
bool mIsInitialized;
bool mRootDirty;
selection_change_signal_t mSelectionChangeSignal;
boost::signals2::signal<void()> mRootChangedSignal;
@ -185,7 +189,7 @@ protected:
private:
void addToGallery(LLInventoryGalleryItem* item);
void removeFromGalleryLast(LLInventoryGalleryItem* item);
void removeFromGalleryLast(LLInventoryGalleryItem* item, bool needs_reshape = true);
void removeFromGalleryMiddle(LLInventoryGalleryItem* item);
LLPanel* addLastRow();
void removeLastRow();
@ -243,6 +247,7 @@ private:
gallery_item_map_t mItemMap;
uuid_vec_t mCOFLinkedItems;
uuid_vec_t mActiveGestures;
uuid_set_t mItemBuildQuery;
std::map<LLInventoryGalleryItem*, S32> mItemIndexMap;
std::map<S32, LLInventoryGalleryItem*> mIndexToItemMap;
@ -283,7 +288,7 @@ public:
LLFontGL* getTextFont();
void setName(std::string name);
void setItemName(std::string name);
void setSelected(bool value);
void setWorn(bool value);
void setUUID(LLUUID id) {mUUID = id;}
@ -296,7 +301,7 @@ public:
void setCreatorName(std::string name) {mCreatorName = name;}
std::string getCreatorName() { return mCreatorName;}
std::string getItemName() {return mName;}
std::string getItemName() {return mItemName;}
std::string getItemNameSuffix() {return mPermSuffix + mWornSuffix;}
bool isDefaultImage() {return mDefaultImage;}
@ -330,7 +335,7 @@ private:
EInventorySortGroup mSortGroup;
LLAssetType::EType mType;
std::string mName;
std::string mItemName;
std::string mWornSuffix;
std::string mPermSuffix;
LLInventoryGallery* mGallery;
@ -343,9 +348,7 @@ public:
virtual void changed(U32 mask);
bool addItem(const LLUUID& obj_id, callback_t cb);
void addSkippedItem(const LLUUID& obj_id, callback_t cb);
void removeItem(const LLUUID& obj_id);
void removeSkippedItem(const LLUUID& obj_id);
protected:
@ -365,7 +368,6 @@ protected:
typedef std::map<LLUUID, LLItemData> item_map_t;
typedef item_map_t::value_type item_map_value_t;
item_map_t mItemMap;
item_map_t mSkippedItems;
};
class LLGalleryGestureObserver : public LLGestureManagerObserver

View File

@ -334,7 +334,7 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men
if(!is_link)
{
items.push_back(std::string("thumbnail"));
if (!is_agent_inventory)
if (!is_agent_inventory || (is_in_trash && !is_trash))
{
disabled_items.push_back(std::string("thumbnail"));
}

View File

@ -1121,13 +1121,14 @@ void LLInventoryModel::createNewCategory(const LLUUID& parent_id,
{
if (new_category.isNull())
{
if (callback)
if (callback && !callback.empty())
{
callback(new_category);
}
return;
}
// todo: not needed since AIS does the accounting?
LLViewerInventoryCategory* folderp = gInventory.getCategory(new_category);
if (!folderp)
{
@ -1147,7 +1148,7 @@ void LLInventoryModel::createNewCategory(const LLUUID& parent_id,
updateCategory(cat);
}
if (callback)
if (callback && !callback.empty())
{
callback(new_category);
}

View File

@ -170,7 +170,8 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
mInventoryViewModel(p.name),
mGroupedItemBridge(new LLFolderViewGroupedItemBridge),
mFocusSelection(false),
mBuildChildrenViews(true)
mBuildChildrenViews(true),
mRootInited(false)
{
mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER;
@ -311,6 +312,7 @@ void LLInventoryPanel::initFolderRoot()
// build the views starting with that folder.
LLFolderView* folder_view = createFolderRoot(root_id);
mFolderRoot = folder_view->getHandle();
mRootInited = true;
addItemID(root_id, mFolderRoot.get());
}
@ -347,22 +349,9 @@ void LLInventoryPanel::initFolderRoot()
mCompletionObserver = new LLInvPanelComplObserver(boost::bind(&LLInventoryPanel::onItemsCompletion, this));
mInventory->addObserver(mCompletionObserver);
if (mBuildViewsOnInit && mViewsInitialized == VIEWS_UNINITIALIZED)
if (mBuildViewsOnInit)
{
// Build view of inventory if we need default full hierarchy and inventory is ready, otherwise do in onIdle.
// Initializing views takes a while so always do it onIdle if viewer already loaded.
if (mInventory->isInventoryUsable()
&& LLStartUp::getStartupState() <= STATE_WEARABLES_WAIT)
{
// Usually this happens on login, so we have less time constraits, but too long and we can cause a disconnect
const F64 max_time = 20.f;
initializeViews(max_time);
}
else
{
mViewsInitialized = VIEWS_INITIALIZING;
gIdleCallbacks.addFunction(onIdle, (void*)this);
}
initializeViewBuilding();
}
if (mSortOrderSetting != INHERIT_SORT_ORDER)
@ -407,13 +396,38 @@ void LLInventoryPanel::initFolderRoot()
mClipboardState = LLClipboard::instance().getGeneration();
}
void LLInventoryPanel::initializeViewBuilding()
{
if (mViewsInitialized == VIEWS_UNINITIALIZED)
{
LL_DEBUGS("Inventory") << "Setting views for " << getName() << " to initialize" << LL_ENDL;
// Build view of inventory if we need default full hierarchy and inventory is ready, otherwise do in onIdle.
// Initializing views takes a while so always do it onIdle if viewer already loaded.
if (mInventory->isInventoryUsable()
&& LLStartUp::getStartupState() <= STATE_WEARABLES_WAIT)
{
// Usually this happens on login, so we have less time constraits, but too long and we can cause a disconnect
const F64 max_time = 20.f;
initializeViews(max_time);
}
else
{
mViewsInitialized = VIEWS_INITIALIZING;
gIdleCallbacks.addFunction(onIdle, (void*)this);
}
}
}
/*virtual*/
void LLInventoryPanel::onVisibilityChange(BOOL new_visibility)
{
if (new_visibility && mViewsInitialized == VIEWS_UNINITIALIZED)
{
mViewsInitialized = VIEWS_INITIALIZING;
gIdleCallbacks.addFunction(onIdle, (void*)this);
// first call can be from tab initialization
if (gFloaterView->getParentFloater(this) != NULL)
{
initializeViewBuilding();
}
}
LLPanel::onVisibilityChange(new_visibility);
}
@ -965,6 +979,7 @@ void LLInventoryPanel::idle(void* user_data)
void LLInventoryPanel::initializeViews(F64 max_time)
{
if (!gInventory.isInventoryUsable()) return;
if (!mRootInited) return;
mViewsInitialized = VIEWS_BUILDING;
@ -1153,7 +1168,7 @@ LLFolderViewItem* LLInventoryPanel::buildViewsTree(const LLUUID& id,
if (objectp->getType() >= LLAssetType::AT_COUNT)
{
// Example: Happens when we add assets of new, not yet supported type to library
LL_DEBUGS() << "LLInventoryPanel::buildViewsTree called with unknown objectp->mType : "
LL_DEBUGS("Inventory") << "LLInventoryPanel::buildViewsTree called with unknown objectp->mType : "
<< ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID()
<< LL_ENDL;
@ -1252,7 +1267,7 @@ LLFolderViewItem* LLInventoryPanel::buildViewsTree(const LLUUID& id,
else
{
create_children = true;
folder_view_item->setChildrenInited(true);
folder_view_item->setChildrenInited(mBuildChildrenViews);
}
break;
}
@ -1293,6 +1308,11 @@ LLFolderViewItem* LLInventoryPanel::buildViewsTree(const LLUUID& id,
LLViewerInventoryItem::item_array_t* items;
mInventory->lockDirectDescendentArrays(id, categories, items);
// Make sure panel won't lock in a loop over existing items if
// folder is enormous and at least some work gets done
const S32 MIN_ITEMS_PER_CALL = 500;
const S32 starting_item_count = mItemMap.size();
LLFolderViewFolder *parentp = dynamic_cast<LLFolderViewFolder*>(folder_view_item);
if(categories)
@ -1318,6 +1338,22 @@ LLFolderViewItem* LLInventoryPanel::buildViewsTree(const LLUUID& id,
buildViewsTree(cat->getUUID(), id, cat, NULL, parentp, (mode == BUILD_ONE_FOLDER ? BUILD_NO_CHILDREN : mode), depth);
}
}
if (!mBuildChildrenViews
&& mode == BUILD_TIMELIMIT
&& MIN_ITEMS_PER_CALL + starting_item_count < mItemMap.size())
{
// Single folder view, check if we still have time
//
// Todo: make sure this causes no dupplciates, breaks nothing,
// especially filters and arrange
F64 curent_time = LLTimer::getTotalSeconds();
if (mBuildViewsEndTime < curent_time)
{
mBuildViewsQueue.push_back(id);
break;
}
}
}
}
@ -1337,8 +1373,30 @@ LLFolderViewItem* LLInventoryPanel::buildViewsTree(const LLUUID& id,
LLFolderViewItem* view_itemp = getItemByID(item->getUUID());
buildViewsTree(item->getUUID(), id, item, view_itemp, parentp, mode, depth);
}
if (!mBuildChildrenViews
&& mode == BUILD_TIMELIMIT
&& MIN_ITEMS_PER_CALL + starting_item_count < mItemMap.size())
{
// Single folder view, check if we still have time
//
// Todo: make sure this causes no dupplciates, breaks nothing,
// especially filters and arrange
F64 curent_time = LLTimer::getTotalSeconds();
if (mBuildViewsEndTime < curent_time)
{
mBuildViewsQueue.push_back(id);
break;
}
}
}
}
if (!mBuildChildrenViews)
{
// flat list is done initializing folder
folder_view_item->setChildrenInited(true);
}
mInventory->unlockDirectDescendentArrays(id);
}
@ -1597,6 +1655,10 @@ void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& it
{
fv->startRenamingSelectedItem();
}
else
{
LL_DEBUGS("Inventory") << "Failed to start renemr, no items selected" << LL_ENDL;
}
}
std::set<LLFolderViewItem*> selected_items = mFolderRoot.get()->getSelectionList();
@ -2065,6 +2127,7 @@ void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const L
LLPanelMainInventory* main_panel = inventory_panel->getMainInventoryPanel();
if(main_panel->isSingleFolderMode() && main_panel->isGalleryViewMode())
{
LL_DEBUGS("Inventory") << "Opening gallery panel for item" << obj_id << LL_ENDL;
main_panel->setGallerySelection(obj_id);
return;
}
@ -2078,6 +2141,7 @@ void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const L
// const LLInventoryObject *obj = gInventory.getObject(obj_id);
// if (obj)
// {
// LL_DEBUGS("Inventory") << "Opening main inventory panel for item" << obj_id << LL_ENDL;
// main_inventory->setSingleFolderViewRoot(obj->getParentUUID(), false);
// main_inventory->setGallerySelection(obj_id);
// return;
@ -2108,7 +2172,7 @@ void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const L
if (active_panel)
{
LL_DEBUGS("Messaging") << "Highlighting" << obj_id << LL_ENDL;
LL_DEBUGS("Messaging", "Inventory") << "Highlighting" << obj_id << LL_ENDL;
if (reset_filter)
{
@ -2401,12 +2465,11 @@ LLInventorySingleFolderPanel::LLInventorySingleFolderPanel(const Params& params)
: LLInventoryPanel(params)
{
mBuildChildrenViews = false;
mRootInited = false;
getFilter().setSingleFolderMode(true);
getFilter().setEmptyLookupMessage("InventorySingleFolderNoMatches");
getFilter().setDefaultEmptyLookupMessage("InventorySingleFolderEmpty");
mCommitCallbackRegistrar.add("Inventory.OpenSelectedFolder", boost::bind(&LLInventorySingleFolderPanel::openInCurrentWindow, this, _2));
mCommitCallbackRegistrar.replace("Inventory.DoToSelected", boost::bind(&LLInventorySingleFolderPanel::doToSelected, this, _2));
mCommitCallbackRegistrar.replace("Inventory.DoCreate", boost::bind(&LLInventorySingleFolderPanel::doCreate, this, _2));
mCommitCallbackRegistrar.replace("Inventory.Share", boost::bind(&LLInventorySingleFolderPanel::doShare, this));
}
@ -2440,11 +2503,6 @@ void LLInventorySingleFolderPanel::initFolderRoot(const LLUUID& start_folder_id)
mFolderRoot.get()->setSingleFolderMode(true);
}
void LLInventorySingleFolderPanel::openInCurrentWindow(const LLSD& userdata)
{
changeFolderRoot(LLFolderBridge::sSelf.get()->getUUID());
}
void LLInventorySingleFolderPanel::changeFolderRoot(const LLUUID& new_id)
{
if (mFolderID != new_id)
@ -2575,6 +2633,16 @@ void LLInventorySingleFolderPanel::doCreate(const LLSD& userdata)
menu_create_inventory_item(this, dest_id, userdata);
}
void LLInventorySingleFolderPanel::doToSelected(const LLSD& userdata)
{
if (("open_in_current_window" == userdata.asString()))
{
changeFolderRoot(LLFolderBridge::sSelf.get()->getUUID());
return;
}
LLInventoryPanel::doToSelected(userdata);
}
void LLInventorySingleFolderPanel::doShare()
{
LLAvatarActions::shareWithAvatars(this);

View File

@ -285,6 +285,7 @@ public:
void changeFolderRoot(const LLUUID& new_id) {};
void initFolderRoot();
void initializeViewBuilding();
protected:
void openStartFolderOrMyInventory(); // open the first level of inventory
@ -322,7 +323,7 @@ protected:
*/
const LLInventoryFolderViewModelBuilder* mInvFVBridgeBuilder;
bool mBuildChildrenViews;
bool mBuildChildrenViews; // build root and children
bool mRootInited;
@ -424,7 +425,6 @@ public:
void initFolderRoot(const LLUUID& start_folder_id = LLUUID::null);
void openInCurrentWindow(const LLSD& userdata);
void changeFolderRoot(const LLUUID& new_id);
void onForwardFolder();
void onBackwardFolder();
@ -432,6 +432,7 @@ public:
LLUUID getSingleFolderRoot() { return mFolderID; }
void doCreate(const LLSD& userdata);
void doToSelected(const LLSD& userdata);
void doShare();
bool isBackwardAvailable();

View File

@ -301,7 +301,7 @@ BOOL LLPanelMainInventory::postBuild()
}
// Now load the stored settings from disk, if available.
std::string filterSaveName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, FILTERS_FILENAME));
LL_INFOS() << "LLPanelMainInventory::init: reading from " << filterSaveName << LL_ENDL;
LL_INFOS("Inventory") << "LLPanelMainInventory::init: reading from " << filterSaveName << LL_ENDL;
llifstream file(filterSaveName.c_str());
LLSD savedFilterState;
if (file.is_open())
@ -576,7 +576,10 @@ LLFloaterSidePanelContainer* LLPanelMainInventory::newWindow()
if (!gAgentCamera.cameraMouselook())
{
return LLFloaterReg::showTypedInstance<LLFloaterSidePanelContainer>("inventory", LLSD(instance_num));
LLFloaterSidePanelContainer* floater = LLFloaterReg::showTypedInstance<LLFloaterSidePanelContainer>("inventory", LLSD(instance_num));
LLSidepanelInventory* sidepanel_inventory = floater->findChild<LLSidepanelInventory>("main_panel");
sidepanel_inventory->initInventoryViews();
return floater;
}
return NULL;
}
@ -648,8 +651,6 @@ void LLPanelMainInventory::doCreate(const LLSD& userdata)
{
if(isCombinationViewMode())
{
//show layout and inventory panel before adding the item
//to avoid wrong position of the 'renamer'
mForceShowInvLayout = true;
}
@ -662,6 +663,13 @@ void LLPanelMainInventory::doCreate(const LLSD& userdata)
{
// might need to refresh visibility, delay rename
panel->mCombInvUUIDNeedsRename = new_id;
if (panel->isCombinationViewMode())
{
panel->mForceShowInvLayout = true;
}
LL_DEBUGS("Inventory") << "Done creating inventory: " << new_id << LL_ENDL;
}
};
menu_create_inventory_item(NULL, getCurrentSFVRoot(), userdata, LLUUID::null, callback_created);
@ -679,6 +687,7 @@ void LLPanelMainInventory::doCreate(const LLSD& userdata)
if (panel)
{
panel->setGallerySelection(new_id);
LL_DEBUGS("Inventory") << "Done creating inventory: " << new_id << LL_ENDL;
}
}
};
@ -1982,9 +1991,10 @@ void LLPanelMainInventory::onAddButtonClick()
void LLPanelMainInventory::setActivePanel()
{
// Todo: should cover gallery mode in some way
if(mSingleFolderMode && isListViewMode())
{
mActivePanel = getChild<LLInventoryPanel>("single_folder_inv");
mActivePanel = getChild<LLInventoryPanel>("comb_single_folder_inv");
}
else if(mSingleFolderMode && isCombinationViewMode())
{
@ -2002,6 +2012,16 @@ void LLPanelMainInventory::initSingleFolderRoot(const LLUUID& start_folder_id)
mCombinationInventoryPanel->initFolderRoot(start_folder_id);
}
void LLPanelMainInventory::initInventoryViews()
{
LLInventoryPanel* all_item = getChild<LLInventoryPanel>(ALL_ITEMS);
all_item->initializeViewBuilding();
LLInventoryPanel* recent_item = getChild<LLInventoryPanel>(RECENT_ITEMS);
recent_item->initializeViewBuilding();
LLInventoryPanel* worn_item = getChild<LLInventoryPanel>(WORN_ITEMS);
worn_item->initializeViewBuilding();
}
void LLPanelMainInventory::toggleViewMode()
{
if(mSingleFolderMode && isCombinationViewMode())
@ -3036,6 +3056,7 @@ void LLPanelMainInventory::updatePanelVisibility()
// visibility will be controled by updateCombinationVisibility()
mCombinationGalleryLayoutPanel->setVisible(true);
mCombinationGalleryPanel->setVisible(true);
mCombinationListLayoutPanel->setVisible(true);
}
else
@ -3049,12 +3070,14 @@ void LLPanelMainInventory::updatePanelVisibility()
comb_gallery_filter.markDefault();
mCombinationGalleryLayoutPanel->setVisible(mSingleFolderMode && isGalleryViewMode());
mCombinationGalleryPanel->setVisible(mSingleFolderMode && isGalleryViewMode()); // to prevent or process updates
mCombinationListLayoutPanel->setVisible(mSingleFolderMode && isListViewMode());
}
}
else
{
mCombinationGalleryLayoutPanel->setVisible(false);
mCombinationGalleryPanel->setVisible(false); // to prevent updates
mCombinationListLayoutPanel->setVisible(false);
}
}
@ -3081,7 +3104,7 @@ void LLPanelMainInventory::updateCombinationVisibility()
if (mReshapeInvLayout
&& show_inv_pane
&& mCombinationGalleryPanel->hasVisibleItems()
&& (mCombinationGalleryPanel->hasVisibleItems() || mCombinationGalleryPanel->areViewsInitialized())
&& mCombinationInventoryPanel->areViewsInitialized())
{
mReshapeInvLayout = false;
@ -3127,14 +3150,17 @@ void LLPanelMainInventory::updateCombinationVisibility()
mCombinationListLayoutPanel->setShape(list_latout, true /*tell stack to account for new shape*/);
}
}
}
if (mCombInvUUIDNeedsRename.notNull() && mCombinationInventoryPanel->areViewsInitialized())
{
mCombinationInventoryPanel->setSelectionByID(mCombInvUUIDNeedsRename, TRUE);
mCombinationInventoryPanel->getRootFolder()->scrollToShowSelection();
mCombinationInventoryPanel->getRootFolder()->setNeedsAutoRename(TRUE);
mCombInvUUIDNeedsRename.setNull();
}
if (mSingleFolderMode
&& !isGalleryViewMode()
&& mCombInvUUIDNeedsRename.notNull()
&& mCombinationInventoryPanel->areViewsInitialized())
{
mCombinationInventoryPanel->setSelectionByID(mCombInvUUIDNeedsRename, TRUE);
mCombinationInventoryPanel->getRootFolder()->scrollToShowSelection();
mCombinationInventoryPanel->getRootFolder()->setNeedsAutoRename(TRUE);
mCombInvUUIDNeedsRename.setNull();
}
}

View File

@ -123,6 +123,7 @@ public:
void onViewModeClick();
void toggleViewMode();
void initSingleFolderRoot(const LLUUID& start_folder_id = LLUUID::null);
void initInventoryViews();
void onUpFolderClicked();
void onBackFolderClicked();
void onForwardFolderClicked();

View File

@ -97,10 +97,15 @@ namespace
//=========================================================================
void LLSettingsVOBase::createNewInventoryItem(LLSettingsType::type_e stype, const LLUUID& parent_id, std::function<void(const LLUUID&)> created_cb)
{
inventory_result_fn cb = [created_cb](LLUUID asset_id, LLUUID inventory_id, LLUUID object_id, LLSD results)
inventory_result_fn cb = NULL;
if (created_cb != NULL)
{
created_cb(inventory_id);
};
cb = [created_cb](LLUUID asset_id, LLUUID inventory_id, LLUUID object_id, LLSD results)
{
created_cb(inventory_id);
};
}
createNewInventoryItem(stype, parent_id, cb);
}

View File

@ -252,6 +252,17 @@ BOOL LLSidepanelInventory::postBuild()
// <FS:Ansariel> Optional hiding of Received Items folder aka Inbox
//gSavedSettings.getControl("InventoryDisplayInbox")->getCommitSignal()->connect(boost::bind(&handleInventoryDisplayInboxChanged));
LLFloater *floater = dynamic_cast<LLFloater*>(getParent());
if (floater && floater->getKey().isUndefined() && !sLoginCompleted)
{
// Prefill inventory for primary inventory floater
// Other floaters should fill on visibility change
//
// see get_instance_num();
// Primary inventory floater will have undefined key
initInventoryViews();
}
return TRUE;
}
@ -489,6 +500,11 @@ void LLSidepanelInventory::showInventoryPanel()
mInventoryPanel->setVisible(TRUE);
}
void LLSidepanelInventory::initInventoryViews()
{
mPanelMainInventory->initInventoryViews();
}
bool LLSidepanelInventory::canShare()
{
LLInventoryPanel* inbox = mInventoryPanelInbox.get();

View File

@ -67,6 +67,7 @@ public:
std::set<LLFolderViewItem*> getInboxSelectionList();
void showInventoryPanel();
void initInventoryViews();
// checks can share selected item(s)
bool canShare();

View File

@ -2204,7 +2204,7 @@ void menu_create_inventory_item(LLInventoryPanel* panel, LLUUID dest_id, const L
if (panel)
{
LLHandle<LLPanel> handle = panel->getHandle();
std::function<void(const LLUUID&)> callback_cat_created = [handle](const LLUUID& new_category_id)
callback_cat_created = [handle](const LLUUID& new_category_id)
{
gInventory.notifyObservers();
LLInventoryPanel* panel = static_cast<LLInventoryPanel*>(handle.get());
@ -2212,6 +2212,7 @@ void menu_create_inventory_item(LLInventoryPanel* panel, LLUUID dest_id, const L
{
panel->setSelectionByID(new_category_id, TRUE);
}
LL_DEBUGS(LOG_INV) << "Done creating inventory: " << new_category_id << LL_ENDL;
};
}
else if (created_cb != NULL)

View File

@ -808,6 +808,7 @@
name="All Items"
sort_order_setting="InventorySortOrder"
show_item_link_overlays="true"
preinitialize_views="false"
top="16"
width="288"
scroll.reserve_scroll_corner="false">
@ -825,6 +826,7 @@
left_delta="0"
name="Recent Items"
show_item_link_overlays="true"
preinitialize_views="false"
width="288"
scroll.reserve_scroll_corner="false">
<folder double_click_override="true"/>
@ -840,6 +842,7 @@
left_delta="0"
name="Worn Items"
show_item_link_overlays="true"
preinitialize_views="false"
width="288"
scroll.reserve_scroll_corner="false">
<folder double_click_override="true"/>

View File

@ -3,8 +3,6 @@
<menu_item_call label="Teilen" name="Share"/>
<menu_item_call label="Papierkorb ausleeren" name="Empty Trash"/>
<menu_item_call label="Fundstücke ausleeren" name="Empty Lost And Found"/>
<menu_item_call label="Neuer Ordner" name="New Folder"/>
<menu_item_call label="Neues Outfit" name="New Outfit"/>
<menu_item_call label="Teleportieren" name="Landmark Open"/>
<menu_item_call label="Aktuelles Outfit ersetzen" name="Replace Outfit"/>
<menu_item_call label="Zum aktuellen Outfit hinzufügen" name="Add To Outfit"/>
@ -37,7 +35,6 @@
<menu_item_call label="Instant Message senden" name="Send Instant Message"/>
<menu_item_call label="Teleport anbieten..." name="Offer Teleport..."/>
<menu_item_call label="Teleport anfordern..." name="Request Teleport..."/>
<menu_item_call label="Konferenz-Chat starten" name="Conference Chat"/>
<menu_item_call label="Aktivieren" name="Activate"/>
<menu_item_call label="Deaktivieren" name="Deactivate"/>
<menu_item_call label="Speichern unter" name="Save As"/>

View File

@ -23,22 +23,6 @@
<menu_item_call.on_click
function="Inventory.EmptyLostAndFound"/>
</menu_item_call>
<menu_item_call
label="New Folder"
layout="topleft"
name="New Folder">
<menu_item_call.on_click
function="Inventory.DoCreate"
parameter="category" />
</menu_item_call>
<menu_item_call
label="New Outfit"
layout="topleft"
name="New Outfit">
<menu_item_call.on_click
function="Inventory.DoCreate"
parameter="outfit" />
</menu_item_call>
<menu_item_call
label="Teleport"
layout="topleft"
@ -323,14 +307,6 @@
function="Inventory.DoToSelected"
parameter="request_lure" />
</menu_item_call>
<menu_item_call
label="Start Conference Chat"
layout="topleft"
name="Conference Chat">
<menu_item_call.on_click
function="Inventory.BeginIMSession"
parameter="selected" />
</menu_item_call>
<menu_item_separator
layout="topleft"
name="Gesture Separator" />

View File

@ -684,7 +684,8 @@
layout="topleft"
name="open_in_current_window">
<menu_item_call.on_click
function="Inventory.OpenSelectedFolder"/>
function="Inventory.DoToSelected"
parameter="open_in_current_window" />
</menu_item_call>
<menu_item_call
label="Open in new window"

View File

@ -235,6 +235,7 @@
name="All Items"
sort_order_setting="InventorySortOrder"
show_item_link_overlays="true"
preinitialize_views="false"
top="16"
width="288" >
<folder double_click_override="true"/>
@ -251,6 +252,7 @@
left_delta="0"
name="Recent Items"
show_item_link_overlays="true"
preinitialize_views="false"
width="290" >
<folder double_click_override="true"/>
</recent_inventory_panel>
@ -265,6 +267,7 @@
left_delta="0"
name="Worn Items"
show_item_link_overlays="true"
preinitialize_views="false"
width="290" >
<folder double_click_override="true"/>
</worn_inventory_panel>