summaryrefslogtreecommitdiff
path: root/indra/newview/llpanelmaininventory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llpanelmaininventory.cpp')
-rw-r--r--indra/newview/llpanelmaininventory.cpp5314
1 files changed, 2657 insertions, 2657 deletions
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 0d84ac0fa4..a34502cabb 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -1,2657 +1,2657 @@
-/**
- * @file llpanelmaininventory.cpp
- * @brief Implementation of llpanelmaininventory.
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-#include "llpanelmaininventory.h"
-
-#include "llagent.h"
-#include "llagentbenefits.h"
-#include "llagentcamera.h"
-#include "llavataractions.h"
-#include "llcheckboxctrl.h"
-#include "llcombobox.h"
-#include "lldndbutton.h"
-#include "llfilepicker.h"
-#include "llinventorybridge.h"
-#include "llinventoryfunctions.h"
-#include "llinventorygallery.h"
-#include "llinventorymodelbackgroundfetch.h"
-#include "llfiltereditor.h"
-#include "llfloatersidepanelcontainer.h"
-#include "llfloaterreg.h"
-#include "llmenubutton.h"
-#include "lloutfitobserver.h"
-#include "llpanelmarketplaceinbox.h"
-#include "llpreviewtexture.h"
-#include "llresmgr.h"
-#include "llscrollcontainer.h"
-#include "llsdserialize.h"
-#include "llsdparam.h"
-#include "llspinctrl.h"
-#include "lltoggleablemenu.h"
-#include "lltooldraganddrop.h"
-#include "lltrans.h"
-#include "llviewermenu.h"
-#include "llviewertexturelist.h"
-#include "llviewerinventory.h"
-#include "llsidepanelinventory.h"
-#include "llfolderview.h"
-#include "llradiogroup.h"
-#include "llenvironment.h"
-#include "llweb.h"
-
-const std::string FILTERS_FILENAME("filters.xml");
-
-const std::string ALL_ITEMS("All Items");
-const std::string RECENT_ITEMS("Recent Items");
-const std::string WORN_ITEMS("Worn Items");
-
-static LLPanelInjector<LLPanelMainInventory> t_inventory("panel_main_inventory");
-
-///----------------------------------------------------------------------------
-/// LLFloaterInventoryFinder
-///----------------------------------------------------------------------------
-
-class LLFloaterInventoryFinder : public LLFloater
-{
-public:
- LLFloaterInventoryFinder( LLPanelMainInventory* inventory_view);
- virtual void draw();
- /*virtual*/ bool postBuild();
- void changeFilter(LLInventoryFilter* filter);
- void updateElementsFromFilter();
- bool getCheckShowEmpty();
- bool getCheckSinceLogoff();
- U32 getDateSearchDirection();
-
- void onCreatorSelfFilterCommit();
- void onCreatorOtherFilterCommit();
-
- static void onTimeAgo(LLUICtrl*, void *);
- static void onCloseBtn(void* user_data);
- static void selectAllTypes(void* user_data);
- static void selectNoTypes(void* user_data);
-private:
- LLPanelMainInventory* mPanelMainInventory;
- LLSpinCtrl* mSpinSinceDays;
- LLSpinCtrl* mSpinSinceHours;
- LLCheckBoxCtrl* mCreatorSelf;
- LLCheckBoxCtrl* mCreatorOthers;
- LLInventoryFilter* mFilter;
-};
-
-///----------------------------------------------------------------------------
-/// LLPanelMainInventory
-///----------------------------------------------------------------------------
-
-LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p)
- : LLPanel(p),
- mActivePanel(NULL),
- mWornItemsPanel(NULL),
- mSavedFolderState(NULL),
- mFilterText(""),
- mMenuGearDefault(NULL),
- mMenuVisibility(NULL),
- mMenuAddHandle(),
- mNeedUploadCost(true),
- mMenuViewDefault(NULL),
- mSingleFolderMode(false),
- mForceShowInvLayout(false),
- mViewMode(MODE_COMBINATION),
- mListViewRootUpdatedConnection(),
- mGalleryRootUpdatedConnection()
-{
- // Menu Callbacks (non contex menus)
- mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelMainInventory::doToSelected, this, _2));
- mCommitCallbackRegistrar.add("Inventory.CloseAllFolders", boost::bind(&LLPanelMainInventory::closeAllFolders, this));
- mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH));
- mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND));
- mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLPanelMainInventory::doCreate, this, _2));
- mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLPanelMainInventory::toggleFindOptions, this));
- mCommitCallbackRegistrar.add("Inventory.ResetFilters", boost::bind(&LLPanelMainInventory::resetFilters, this));
- mCommitCallbackRegistrar.add("Inventory.SetSortBy", boost::bind(&LLPanelMainInventory::setSortBy, this, _2));
-
- mEnableCallbackRegistrar.add("Inventory.EnvironmentEnabled", [](LLUICtrl *, const LLSD &) { return LLPanelMainInventory::hasSettingsInventory(); });
- mEnableCallbackRegistrar.add("Inventory.MaterialsEnabled", [](LLUICtrl *, const LLSD &) { return LLPanelMainInventory::hasMaterialsInventory(); });
-
-
- mSavedFolderState = new LLSaveFolderState();
- mSavedFolderState->setApply(false);
-}
-
-bool LLPanelMainInventory::postBuild()
-{
- gInventory.addObserver(this);
-
- mFilterTabs = getChild<LLTabContainer>("inventory filter tabs");
- mFilterTabs->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterSelected, this));
-
- mCounterCtrl = getChild<LLUICtrl>("ItemcountText");
-
- //panel->getFilter().markDefault();
-
- // Set up the default inv. panel/filter settings.
- mActivePanel = getChild<LLInventoryPanel>(ALL_ITEMS);
- if (mActivePanel)
- {
- // "All Items" is the previous only view, so it gets the InventorySortOrder
- mActivePanel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER));
- mActivePanel->getFilter().markDefault();
- mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
- mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2));
- mResortActivePanel = true;
- }
- LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>(RECENT_ITEMS);
- if (recent_items_panel)
- {
- // assign default values until we will be sure that we have setting to restore
- recent_items_panel->setSinceLogoff(true);
- recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE);
- recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- LLInventoryFilter& recent_filter = recent_items_panel->getFilter();
- recent_filter.setFilterObjectTypes(recent_filter.getFilterObjectTypes() & ~(0x1 << LLInventoryType::IT_CATEGORY));
- recent_filter.setEmptyLookupMessage("InventoryNoMatchingRecentItems");
- recent_filter.markDefault();
- recent_items_panel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, recent_items_panel, _1, _2));
- }
-
- mWornItemsPanel = getChild<LLInventoryPanel>(WORN_ITEMS);
- if (mWornItemsPanel)
- {
- U32 filter_types = 0x0;
- filter_types |= 0x1 << LLInventoryType::IT_WEARABLE;
- filter_types |= 0x1 << LLInventoryType::IT_ATTACHMENT;
- filter_types |= 0x1 << LLInventoryType::IT_OBJECT;
- mWornItemsPanel->setFilterTypes(filter_types);
- mWornItemsPanel->setFilterWorn();
- mWornItemsPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- mWornItemsPanel->setFilterLinks(LLInventoryFilter::FILTERLINK_EXCLUDE_LINKS);
- LLInventoryFilter& worn_filter = mWornItemsPanel->getFilter();
- worn_filter.setFilterCategoryTypes(worn_filter.getFilterCategoryTypes() | (1ULL << LLFolderType::FT_INBOX));
- worn_filter.markDefault();
- mWornItemsPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mWornItemsPanel, _1, _2));
- }
- mSearchTypeCombo = getChild<LLComboBox>("search_type");
- if(mSearchTypeCombo)
- {
- mSearchTypeCombo->setCommitCallback(boost::bind(&LLPanelMainInventory::onSelectSearchType, this));
- }
- // Now load the stored settings from disk, if available.
- std::string filterSaveName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, FILTERS_FILENAME));
- LL_INFOS("Inventory") << "LLPanelMainInventory::init: reading from " << filterSaveName << LL_ENDL;
- llifstream file(filterSaveName.c_str());
- LLSD savedFilterState;
- if (file.is_open())
- {
- LLSDSerialize::fromXML(savedFilterState, file);
- file.close();
-
- // Load the persistent "Recent Items" settings.
- // Note that the "All Items" settings do not persist.
- if(recent_items_panel)
- {
- if(savedFilterState.has(recent_items_panel->getFilter().getName()))
- {
- LLSD recent_items = savedFilterState.get(
- recent_items_panel->getFilter().getName());
- LLInventoryFilter::Params p;
- LLParamSDParser parser;
- parser.readSD(recent_items, p);
- recent_items_panel->getFilter().fromParams(p);
- recent_items_panel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::RECENTITEMS_SORT_ORDER));
- }
- }
- if(mActivePanel)
- {
- if(savedFilterState.has(mActivePanel->getFilter().getName()))
- {
- LLSD items = savedFilterState.get(mActivePanel->getFilter().getName());
- LLInventoryFilter::Params p;
- LLParamSDParser parser;
- parser.readSD(items, p);
- mActivePanel->getFilter().setSearchVisibilityTypes(p);
- }
- }
-
- }
-
- mFilterEditor = getChild<LLFilterEditor>("inventory search editor");
- if (mFilterEditor)
- {
- mFilterEditor->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterEdit, this, _2));
- }
-
- mGearMenuButton = getChild<LLMenuButton>("options_gear_btn");
- mVisibilityMenuButton = getChild<LLMenuButton>("options_visibility_btn");
- mViewMenuButton = getChild<LLMenuButton>("view_btn");
-
- mBackBtn = getChild<LLButton>("back_btn");
- mForwardBtn = getChild<LLButton>("forward_btn");
- mUpBtn = getChild<LLButton>("up_btn");
- mViewModeBtn = getChild<LLButton>("view_mode_btn");
- mNavigationBtnsPanel = getChild<LLLayoutPanel>("nav_buttons");
-
- mDefaultViewPanel = getChild<LLPanel>("default_inventory_panel");
- mCombinationViewPanel = getChild<LLPanel>("combination_view_inventory");
- mCombinationGalleryLayoutPanel = getChild<LLLayoutPanel>("comb_gallery_layout");
- mCombinationListLayoutPanel = getChild<LLLayoutPanel>("comb_inventory_layout");
- mCombinationLayoutStack = getChild<LLLayoutStack>("combination_view_stack");
-
- mCombinationInventoryPanel = getChild<LLInventorySingleFolderPanel>("comb_single_folder_inv");
- LLInventoryFilter& comb_inv_filter = mCombinationInventoryPanel->getFilter();
- comb_inv_filter.setFilterThumbnails(LLInventoryFilter::FILTER_EXCLUDE_THUMBNAILS);
- comb_inv_filter.markDefault();
- mCombinationInventoryPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onCombinationInventorySelectionChanged, this, _1, _2));
- mListViewRootUpdatedConnection = mCombinationInventoryPanel->setRootChangedCallback(boost::bind(&LLPanelMainInventory::onCombinationRootChanged, this, false));
-
- mCombinationGalleryPanel = getChild<LLInventoryGallery>("comb_gallery_view_inv");
- mCombinationGalleryPanel->setSortOrder(mCombinationInventoryPanel->getSortOrder());
- LLInventoryFilter& comb_gallery_filter = mCombinationGalleryPanel->getFilter();
- comb_gallery_filter.setFilterThumbnails(LLInventoryFilter::FILTER_ONLY_THUMBNAILS);
- comb_gallery_filter.markDefault();
- mGalleryRootUpdatedConnection = mCombinationGalleryPanel->setRootChangedCallback(boost::bind(&LLPanelMainInventory::onCombinationRootChanged, this, true));
- mCombinationGalleryPanel->setSelectionChangeCallback(boost::bind(&LLPanelMainInventory::onCombinationGallerySelectionChanged, this, _1));
-
- initListCommandsHandlers();
-
- const std::string texture_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getTextureUploadCost());
- const std::string sound_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getSoundUploadCost());
- const std::string animation_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getAnimationUploadCost());
-
- LLMenuGL* menu = (LLMenuGL*)mMenuAddHandle.get();
- if (menu)
- {
- menu->getChild<LLMenuItemGL>("Upload Image")->setLabelArg("[COST]", texture_upload_cost_str);
- menu->getChild<LLMenuItemGL>("Upload Sound")->setLabelArg("[COST]", sound_upload_cost_str);
- menu->getChild<LLMenuItemGL>("Upload Animation")->setLabelArg("[COST]", animation_upload_cost_str);
- }
-
- // Trigger callback for focus received so we can deselect items in inbox/outbox
- LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLPanelMainInventory::onFocusReceived, this));
-
- return true;
-}
-
-// Destroys the object
-LLPanelMainInventory::~LLPanelMainInventory( void )
-{
- // Save the filters state.
- // Some params types cannot be saved this way
- // for example, LLParamSDParser doesn't know about U64,
- // so some FilterOps params should be revised.
- LLSD filterRoot;
- LLInventoryPanel* all_items_panel = getChild<LLInventoryPanel>(ALL_ITEMS);
- if (all_items_panel)
- {
- LLSD filterState;
- LLInventoryPanel::InventoryState p;
- all_items_panel->getFilter().toParams(p.filter);
- all_items_panel->getRootViewModel().getSorter().toParams(p.sort);
- if (p.validateBlock(false))
- {
- LLParamSDParser().writeSD(filterState, p);
- filterRoot[all_items_panel->getName()] = filterState;
- }
- }
-
- LLInventoryPanel* panel = findChild<LLInventoryPanel>(RECENT_ITEMS);
- if (panel)
- {
- LLSD filterState;
- LLInventoryPanel::InventoryState p;
- panel->getFilter().toParams(p.filter);
- panel->getRootViewModel().getSorter().toParams(p.sort);
- if (p.validateBlock(false))
- {
- LLParamSDParser().writeSD(filterState, p);
- filterRoot[panel->getName()] = filterState;
- }
- }
-
- std::string filterSaveName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, FILTERS_FILENAME));
- llofstream filtersFile(filterSaveName.c_str());
- if(!LLSDSerialize::toPrettyXML(filterRoot, filtersFile))
- {
- LL_WARNS() << "Could not write to filters save file " << filterSaveName << LL_ENDL;
- }
- else
- {
- filtersFile.close();
- }
-
- gInventory.removeObserver(this);
- delete mSavedFolderState;
-
- auto menu = mMenuAddHandle.get();
- if(menu)
- {
- menu->die();
- mMenuAddHandle.markDead();
- }
-
- if (mListViewRootUpdatedConnection.connected())
- {
- mListViewRootUpdatedConnection.disconnect();
- }
- if (mGalleryRootUpdatedConnection.connected())
- {
- mGalleryRootUpdatedConnection.disconnect();
- }
-}
-
-LLInventoryPanel* LLPanelMainInventory::getAllItemsPanel()
-{
- return getChild<LLInventoryPanel>(ALL_ITEMS);
-}
-
-void LLPanelMainInventory::selectAllItemsPanel()
-{
- mFilterTabs->selectFirstTab();
-}
-
-bool LLPanelMainInventory::isRecentItemsPanelSelected()
-{
- return (RECENT_ITEMS == getActivePanel()->getName());
-}
-
-void LLPanelMainInventory::startSearch()
-{
- // this forces focus to line editor portion of search editor
- if (mFilterEditor)
- {
- mFilterEditor->focusFirstItem(true);
- }
-}
-
-bool LLPanelMainInventory::handleKeyHere(KEY key, MASK mask)
-{
- LLFolderView* root_folder = mActivePanel ? mActivePanel->getRootFolder() : NULL;
- if (root_folder)
- {
- // first check for user accepting current search results
- if (mFilterEditor
- && mFilterEditor->hasFocus()
- && (key == KEY_RETURN
- || key == KEY_DOWN)
- && mask == MASK_NONE)
- {
- // move focus to inventory proper
- mActivePanel->setFocus(true);
- root_folder->scrollToShowSelection();
- return true;
- }
-
- if (mActivePanel->hasFocus() && key == KEY_UP)
- {
- startSearch();
- }
- if(mSingleFolderMode && key == KEY_LEFT)
- {
- onBackFolderClicked();
- }
- }
-
- return LLPanel::handleKeyHere(key, mask);
-
-}
-
-//----------------------------------------------------------------------------
-// menu callbacks
-
-void LLPanelMainInventory::doToSelected(const LLSD& userdata)
-{
- getPanel()->doToSelected(userdata);
-}
-
-void LLPanelMainInventory::closeAllFolders()
-{
- getPanel()->getRootFolder()->closeAllFolders();
-}
-
-S32 get_instance_num()
-{
- static S32 instance_num = 0;
- instance_num = (instance_num + 1) % S32_MAX;
-
- return instance_num;
-}
-
-LLFloaterSidePanelContainer* LLPanelMainInventory::newWindow()
-{
- S32 instance_num = get_instance_num();
-
- if (!gAgentCamera.cameraMouselook())
- {
- LLFloaterSidePanelContainer* floater = LLFloaterReg::showTypedInstance<LLFloaterSidePanelContainer>("inventory", LLSD(instance_num));
- LLSidepanelInventory* sidepanel_inventory = floater->findChild<LLSidepanelInventory>("main_panel");
- sidepanel_inventory->initInventoryViews();
- return floater;
- }
- return NULL;
-}
-
-//static
-void LLPanelMainInventory::newFolderWindow(LLUUID folder_id, LLUUID item_to_select)
-{
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
- for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end();)
- {
- LLFloaterSidePanelContainer* inventory_container = dynamic_cast<LLFloaterSidePanelContainer*>(*iter++);
- if (inventory_container)
- {
- LLSidepanelInventory* sidepanel_inventory = dynamic_cast<LLSidepanelInventory*>(inventory_container->findChild<LLPanel>("main_panel", true));
- if (sidepanel_inventory)
- {
- LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();
- if (main_inventory && main_inventory->isSingleFolderMode()
- && (main_inventory->getCurrentSFVRoot() == folder_id))
- {
- main_inventory->setFocus(true);
- if(item_to_select.notNull())
- {
- main_inventory->setGallerySelection(item_to_select);
- }
- return;
- }
- }
- }
- }
-
- S32 instance_num = get_instance_num();
-
- LLFloaterSidePanelContainer* inventory_container = LLFloaterReg::showTypedInstance<LLFloaterSidePanelContainer>("inventory", LLSD(instance_num));
- if(inventory_container)
- {
- LLSidepanelInventory* sidepanel_inventory = dynamic_cast<LLSidepanelInventory*>(inventory_container->findChild<LLPanel>("main_panel", true));
- if (sidepanel_inventory)
- {
- LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();
- if (main_inventory)
- {
- main_inventory->initSingleFolderRoot(folder_id);
- main_inventory->toggleViewMode();
- if(folder_id.notNull())
- {
- if(item_to_select.notNull())
- {
- main_inventory->setGallerySelection(item_to_select, true);
- }
- }
- }
- }
- }
-}
-
-void LLPanelMainInventory::doCreate(const LLSD& userdata)
-{
- reset_inventory_filter();
- if(mSingleFolderMode)
- {
- if(isListViewMode() || isCombinationViewMode())
- {
- LLFolderViewItem* current_folder = getActivePanel()->getRootFolder();
- if (current_folder)
- {
- if(isCombinationViewMode())
- {
- mForceShowInvLayout = true;
- }
-
- LLHandle<LLPanel> handle = getHandle();
- std::function<void(const LLUUID&)> callback_created = [handle](const LLUUID& new_id)
- {
- gInventory.notifyObservers(); // not really needed, should have been already done
- LLPanelMainInventory* panel = (LLPanelMainInventory*)handle.get();
- if (new_id.notNull() && panel)
- {
- // 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);
- }
- }
- else
- {
- LLHandle<LLPanel> handle = getHandle();
- std::function<void(const LLUUID&)> callback_created = [handle](const LLUUID &new_id)
- {
- gInventory.notifyObservers(); // not really needed, should have been already done
- if (new_id.notNull())
- {
- LLPanelMainInventory* panel = (LLPanelMainInventory*)handle.get();
- if (panel)
- {
- panel->setGallerySelection(new_id);
- LL_DEBUGS("Inventory") << "Done creating inventory: " << new_id << LL_ENDL;
- }
- }
- };
- menu_create_inventory_item(NULL, getCurrentSFVRoot(), userdata, LLUUID::null, callback_created);
- }
- }
- else
- {
- menu_create_inventory_item(getPanel(), NULL, userdata);
- }
-}
-
-void LLPanelMainInventory::resetFilters()
-{
- LLFloaterInventoryFinder *finder = getFinder();
- getCurrentFilter().resetDefault();
- if (finder)
- {
- finder->updateElementsFromFilter();
- }
-
- setFilterTextFromFilter();
-}
-
-void LLPanelMainInventory::resetAllItemsFilters()
-{
- LLFloaterInventoryFinder *finder = getFinder();
- getAllItemsPanel()->getFilter().resetDefault();
- if (finder)
- {
- finder->updateElementsFromFilter();
- }
-
- setFilterTextFromFilter();
-}
-
-void LLPanelMainInventory::findLinks(const LLUUID& item_id, const std::string& item_name)
-{
- mFilterSubString = item_name;
-
- LLInventoryFilter &filter = mActivePanel->getFilter();
- filter.setFindAllLinksMode(item_name, item_id);
-
- mFilterEditor->setText(item_name);
- mFilterEditor->setFocus(true);
-}
-
-void LLPanelMainInventory::setSortBy(const LLSD& userdata)
-{
- U32 sort_order_mask = getActivePanel()->getSortOrder();
- std::string sort_type = userdata.asString();
- if (sort_type == "name")
- {
- sort_order_mask &= ~LLInventoryFilter::SO_DATE;
- }
- else if (sort_type == "date")
- {
- sort_order_mask |= LLInventoryFilter::SO_DATE;
- }
- else if (sort_type == "foldersalwaysbyname")
- {
- if ( sort_order_mask & LLInventoryFilter::SO_FOLDERS_BY_NAME )
- {
- sort_order_mask &= ~LLInventoryFilter::SO_FOLDERS_BY_NAME;
- }
- else
- {
- sort_order_mask |= LLInventoryFilter::SO_FOLDERS_BY_NAME;
- }
- }
- else if (sort_type == "systemfolderstotop")
- {
- if ( sort_order_mask & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP )
- {
- sort_order_mask &= ~LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
- }
- else
- {
- sort_order_mask |= LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
- }
- }
- if(mSingleFolderMode && !isListViewMode())
- {
- mCombinationGalleryPanel->setSortOrder(sort_order_mask, true);
- }
-
- getActivePanel()->setSortOrder(sort_order_mask);
- if (isRecentItemsPanelSelected())
- {
- gSavedSettings.setU32("RecentItemsSortOrder", sort_order_mask);
- }
- else
- {
- gSavedSettings.setU32("InventorySortOrder", sort_order_mask);
- }
-}
-
-void LLPanelMainInventory::onSelectSearchType()
-{
- std::string new_type = mSearchTypeCombo->getValue();
- if (new_type == "search_by_name")
- {
- setSearchType(LLInventoryFilter::SEARCHTYPE_NAME);
- }
- if (new_type == "search_by_creator")
- {
- setSearchType(LLInventoryFilter::SEARCHTYPE_CREATOR);
- }
- if (new_type == "search_by_description")
- {
- setSearchType(LLInventoryFilter::SEARCHTYPE_DESCRIPTION);
- }
- if (new_type == "search_by_UUID")
- {
- setSearchType(LLInventoryFilter::SEARCHTYPE_UUID);
- }
-}
-
-void LLPanelMainInventory::setSearchType(LLInventoryFilter::ESearchType type)
-{
- if(mSingleFolderMode && isGalleryViewMode())
- {
- mCombinationGalleryPanel->setSearchType(type);
- }
- if(mSingleFolderMode && isCombinationViewMode())
- {
- mCombinationInventoryPanel->setSearchType(type);
- mCombinationGalleryPanel->setSearchType(type);
- }
- else
- {
- getActivePanel()->setSearchType(type);
- }
-}
-
-void LLPanelMainInventory::updateSearchTypeCombo()
-{
- LLInventoryFilter::ESearchType search_type(LLInventoryFilter::SEARCHTYPE_NAME);
-
- if(mSingleFolderMode && isGalleryViewMode())
- {
- search_type = mCombinationGalleryPanel->getSearchType();
- }
- else if(mSingleFolderMode && isCombinationViewMode())
- {
- search_type = mCombinationGalleryPanel->getSearchType();
- }
- else
- {
- search_type = getActivePanel()->getSearchType();
- }
-
- switch(search_type)
- {
- case LLInventoryFilter::SEARCHTYPE_CREATOR:
- mSearchTypeCombo->setValue("search_by_creator");
- break;
- case LLInventoryFilter::SEARCHTYPE_DESCRIPTION:
- mSearchTypeCombo->setValue("search_by_description");
- break;
- case LLInventoryFilter::SEARCHTYPE_UUID:
- mSearchTypeCombo->setValue("search_by_UUID");
- break;
- case LLInventoryFilter::SEARCHTYPE_NAME:
- default:
- mSearchTypeCombo->setValue("search_by_name");
- break;
- }
-}
-
-// static
-bool LLPanelMainInventory::filtersVisible(void* user_data)
-{
- LLPanelMainInventory* self = (LLPanelMainInventory*)user_data;
- if(!self) return false;
-
- return self->getFinder() != NULL;
-}
-
-void LLPanelMainInventory::onClearSearch()
-{
- bool initially_active = false;
- LLFloater *finder = getFinder();
- if (mActivePanel && (getActivePanel() != mWornItemsPanel))
- {
- initially_active = mActivePanel->getFilter().isNotDefault();
- setFilterSubString(LLStringUtil::null);
- mActivePanel->setFilterTypes(0xffffffffffffffffULL);
- mActivePanel->setFilterLinks(LLInventoryFilter::FILTERLINK_INCLUDE_LINKS);
- }
-
- if (finder)
- {
- LLFloaterInventoryFinder::selectAllTypes(finder);
- }
-
- // re-open folders that were initially open in case filter was active
- if (mActivePanel && (mFilterSubString.size() || initially_active) && !mSingleFolderMode)
- {
- mSavedFolderState->setApply(true);
- mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
- LLOpenFoldersWithSelection opener;
- mActivePanel->getRootFolder()->applyFunctorRecursively(opener);
- mActivePanel->getRootFolder()->scrollToShowSelection();
- }
- mFilterSubString = "";
-
- LLSidepanelInventory * sidepanel_inventory = getParentSidepanelInventory();
- if (sidepanel_inventory)
- {
- LLPanelMarketplaceInbox* inbox_panel = sidepanel_inventory->getChild<LLPanelMarketplaceInbox>("marketplace_inbox");
- if (inbox_panel)
- {
- inbox_panel->onClearSearch();
- }
- }
-}
-
-void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
-{
- if(mSingleFolderMode && isGalleryViewMode())
- {
- mFilterSubString = search_string;
- mCombinationGalleryPanel->setFilterSubString(mFilterSubString);
- return;
- }
- if(mSingleFolderMode && isCombinationViewMode())
- {
- mCombinationGalleryPanel->setFilterSubString(search_string);
- }
-
- if (search_string == "")
- {
- onClearSearch();
- }
-
- if (!mActivePanel)
- {
- return;
- }
-
- if (!LLInventoryModelBackgroundFetch::instance().inventoryFetchStarted())
- {
- llassert(false); // this should have been done on startup
- LLInventoryModelBackgroundFetch::instance().start();
- }
-
- mFilterSubString = search_string;
- if (mActivePanel->getFilterSubString().empty() && mFilterSubString.empty())
- {
- // current filter and new filter empty, do nothing
- return;
- }
-
- // save current folder open state if no filter currently applied
- if (!mActivePanel->getFilter().isNotDefault())
- {
- mSavedFolderState->setApply(false);
- mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
- }
-
- // set new filter string
- setFilterSubString(mFilterSubString);
-
- LLSidepanelInventory * sidepanel_inventory = getParentSidepanelInventory();
- if (sidepanel_inventory)
- {
- LLPanelMarketplaceInbox* inbox_panel = sidepanel_inventory->getChild<LLPanelMarketplaceInbox>("marketplace_inbox");
- if (inbox_panel)
- {
- inbox_panel->onFilterEdit(search_string);
- }
- }
-}
-
-
- //static
- bool LLPanelMainInventory::incrementalFind(LLFolderViewItem* first_item, const char *find_text, bool backward)
- {
- LLPanelMainInventory* active_view = NULL;
-
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
- for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
- {
- LLPanelMainInventory* iv = dynamic_cast<LLPanelMainInventory*>(*iter);
- if (iv)
- {
- if (gFocusMgr.childHasKeyboardFocus(iv))
- {
- active_view = iv;
- break;
- }
- }
- }
-
- if (!active_view)
- {
- return false;
- }
-
- std::string search_string(find_text);
-
- if (search_string.empty())
- {
- return false;
- }
-
- if (active_view->getPanel() &&
- active_view->getPanel()->getRootFolder()->search(first_item, search_string, backward))
- {
- return true;
- }
-
- return false;
- }
-
-void LLPanelMainInventory::onFilterSelected()
-{
- // Find my index
- setActivePanel();
-
- if (!mActivePanel)
- {
- return;
- }
-
- if (getActivePanel() == mWornItemsPanel)
- {
- mActivePanel->openAllFolders();
- }
- updateSearchTypeCombo();
- setFilterSubString(mFilterSubString);
- LLInventoryFilter& filter = getCurrentFilter();
- LLFloaterInventoryFinder *finder = getFinder();
- if (finder)
- {
- finder->changeFilter(&filter);
- if (mSingleFolderMode)
- {
- finder->setTitle(getLocalizedRootName());
- }
- }
- if (filter.isActive() && !LLInventoryModelBackgroundFetch::instance().inventoryFetchStarted())
- {
- llassert(false); // this should have been done on startup
- LLInventoryModelBackgroundFetch::instance().start();
- }
- setFilterTextFromFilter();
-}
-
-const std::string LLPanelMainInventory::getFilterSubString()
-{
- return mActivePanel->getFilterSubString();
-}
-
-void LLPanelMainInventory::setFilterSubString(const std::string& string)
-{
- mActivePanel->setFilterSubString(string);
-}
-
-bool LLPanelMainInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, bool drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg)
-{
- // Check to see if we are auto scrolling from the last frame
- LLInventoryPanel* panel = (LLInventoryPanel*)this->getActivePanel();
- bool needsToScroll = panel->getScrollableContainer()->canAutoScroll(x, y);
- if(mFilterTabs)
- {
- if(needsToScroll)
- {
- mFilterTabs->startDragAndDropDelayTimer();
- }
- }
-
- bool handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
-
- return handled;
-}
-
-// virtual
-void LLPanelMainInventory::changed(U32)
-{
- updateItemcountText();
-}
-
-void LLPanelMainInventory::setFocusFilterEditor()
-{
- if(mFilterEditor)
- {
- mFilterEditor->setFocus(true);
- }
-}
-
-// virtual
-void LLPanelMainInventory::draw()
-{
- if (mActivePanel && mFilterEditor)
- {
- mFilterEditor->setText(mFilterSubString);
- }
- if (mActivePanel && mResortActivePanel)
- {
- // EXP-756: Force resorting of the list the first time we draw the list:
- // In the case of date sorting, we don't have enough information at initialization time
- // to correctly sort the folders. Later manual resort doesn't do anything as the order value is
- // set correctly. The workaround is to reset the order to alphabetical (or anything) then to the correct order.
- U32 order = mActivePanel->getSortOrder();
- mActivePanel->setSortOrder(LLInventoryFilter::SO_NAME);
- mActivePanel->setSortOrder(order);
- mResortActivePanel = false;
- }
- LLPanel::draw();
- updateItemcountText();
- updateCombinationVisibility();
-}
-
-void LLPanelMainInventory::updateItemcountText()
-{
- if(mItemCount != gInventory.getItemCount())
- {
- mItemCount = gInventory.getItemCount();
- mItemCountString = "";
- LLLocale locale(LLLocale::USER_LOCALE);
- LLResMgr::getInstance()->getIntegerString(mItemCountString, mItemCount);
- }
-
- if(mCategoryCount != gInventory.getCategoryCount())
- {
- mCategoryCount = gInventory.getCategoryCount();
- mCategoryCountString = "";
- LLLocale locale(LLLocale::USER_LOCALE);
- LLResMgr::getInstance()->getIntegerString(mCategoryCountString, mCategoryCount);
- }
-
- LLStringUtil::format_map_t string_args;
- string_args["[ITEM_COUNT]"] = mItemCountString;
- string_args["[CATEGORY_COUNT]"] = mCategoryCountString;
- string_args["[FILTER]"] = getFilterText();
-
- std::string text = "";
-
- if (LLInventoryModelBackgroundFetch::instance().folderFetchActive())
- {
- text = getString("ItemcountFetching", string_args);
- }
- else if (LLInventoryModelBackgroundFetch::instance().isEverythingFetched())
- {
- text = getString("ItemcountCompleted", string_args);
- }
- else
- {
- text = getString("ItemcountUnknown", string_args);
- }
-
- if (mSingleFolderMode)
- {
- LLInventoryModel::cat_array_t *cats;
- LLInventoryModel::item_array_t *items;
-
- gInventory.getDirectDescendentsOf(getCurrentSFVRoot(), cats, items);
-
- if (items && cats)
- {
- string_args["[ITEM_COUNT]"] = llformat("%d", items->size());
- string_args["[CATEGORY_COUNT]"] = llformat("%d", cats->size());
- text = getString("ItemcountCompleted", string_args);
- }
- }
-
- mCounterCtrl->setValue(text);
- mCounterCtrl->setToolTip(text);
-}
-
-void LLPanelMainInventory::onFocusReceived()
-{
- LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
- if (!sidepanel_inventory)
- {
- LL_WARNS() << "Could not find Inventory Panel in My Inventory floater" << LL_ENDL;
- return;
- }
-
- sidepanel_inventory->clearSelections(false, true);
-}
-
-void LLPanelMainInventory::setFilterTextFromFilter()
-{
- mFilterText = getCurrentFilter().getFilterText();
-}
-
-void LLPanelMainInventory::toggleFindOptions()
-{
- LLFloater *floater = getFinder();
- if (!floater)
- {
- LLFloaterInventoryFinder * finder = new LLFloaterInventoryFinder(this);
- mFinderHandle = finder->getHandle();
- finder->openFloater();
-
- LLFloater* parent_floater = gFloaterView->getParentFloater(this);
- if (parent_floater)
- parent_floater->addDependentFloater(mFinderHandle);
-
- if (!LLInventoryModelBackgroundFetch::instance().inventoryFetchStarted())
- {
- llassert(false); // this should have been done on startup
- LLInventoryModelBackgroundFetch::instance().start();
- }
-
- if (mSingleFolderMode)
- {
- finder->setTitle(getLocalizedRootName());
- }
- }
- else
- {
- floater->closeFloater();
- }
-}
-
-void LLPanelMainInventory::setSelectCallback(const LLFolderView::signal_t::slot_type& cb)
-{
- getChild<LLInventoryPanel>(ALL_ITEMS)->setSelectCallback(cb);
- getChild<LLInventoryPanel>(RECENT_ITEMS)->setSelectCallback(cb);
-}
-
-void LLPanelMainInventory::onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, bool user_action)
-{
- updateListCommands();
- panel->onSelectionChange(items, user_action);
-}
-
-///----------------------------------------------------------------------------
-/// LLFloaterInventoryFinder
-///----------------------------------------------------------------------------
-
-LLFloaterInventoryFinder* LLPanelMainInventory::getFinder()
-{
- return (LLFloaterInventoryFinder*)mFinderHandle.get();
-}
-
-
-LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLPanelMainInventory* inventory_view) :
- LLFloater(LLSD()),
- mPanelMainInventory(inventory_view),
- mFilter(&inventory_view->getPanel()->getFilter())
-{
- buildFromFile("floater_inventory_view_finder.xml");
- updateElementsFromFilter();
-}
-
-bool LLFloaterInventoryFinder::postBuild()
-{
- const LLRect& viewrect = mPanelMainInventory->getRect();
- setRect(LLRect(viewrect.mLeft - getRect().getWidth(), viewrect.mTop, viewrect.mLeft, viewrect.mTop - getRect().getHeight()));
-
- childSetAction("All", selectAllTypes, this);
- childSetAction("None", selectNoTypes, this);
-
- mSpinSinceHours = getChild<LLSpinCtrl>("spin_hours_ago");
- childSetCommitCallback("spin_hours_ago", onTimeAgo, this);
-
- mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago");
- childSetCommitCallback("spin_days_ago", onTimeAgo, this);
-
- mCreatorSelf = getChild<LLCheckBoxCtrl>("check_created_by_me");
- mCreatorOthers = getChild<LLCheckBoxCtrl>("check_created_by_others");
- mCreatorSelf->setCommitCallback(boost::bind(&LLFloaterInventoryFinder::onCreatorSelfFilterCommit, this));
- mCreatorOthers->setCommitCallback(boost::bind(&LLFloaterInventoryFinder::onCreatorOtherFilterCommit, this));
-
- childSetAction("Close", onCloseBtn, this);
-
- updateElementsFromFilter();
- return true;
-}
-void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data)
-{
- LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data;
- if (!self) return;
-
- if ( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() )
- {
- self->getChild<LLUICtrl>("check_since_logoff")->setValue(false);
-
- U32 days = (U32)self->mSpinSinceDays->get();
- U32 hours = (U32)self->mSpinSinceHours->get();
- if (hours >= 24)
- {
- // Try to handle both cases of spinner clicking and text input in a sensible fashion as best as possible.
- // There is no way to tell if someone has clicked the spinner to get to 24 or input 24 manually, so in
- // this case add to days. Any value > 24 means they have input the hours manually, so do not add to the
- // current day value.
- if (24 == hours) // Got to 24 via spinner clicking or text input of 24
- {
- days = days + hours / 24;
- }
- else // Text input, so do not add to days
- {
- days = hours / 24;
- }
- hours = (U32)hours % 24;
- self->mSpinSinceHours->setFocus(false);
- self->mSpinSinceDays->setFocus(false);
- self->mSpinSinceDays->set((F32)days);
- self->mSpinSinceHours->set((F32)hours);
- self->mSpinSinceHours->setFocus(true);
- }
- }
-}
-
-void LLFloaterInventoryFinder::changeFilter(LLInventoryFilter* filter)
-{
- mFilter = filter;
- updateElementsFromFilter();
-}
-
-void LLFloaterInventoryFinder::updateElementsFromFilter()
-{
- if (!mFilter)
- return;
-
- // Get data needed for filter display
- U32 filter_types = mFilter->getFilterObjectTypes();
- LLInventoryFilter::EFolderShow show_folders = mFilter->getShowFolderState();
- U32 hours = mFilter->getHoursAgo();
- U32 date_search_direction = mFilter->getDateSearchDirection();
-
- LLInventoryFilter::EFilterCreatorType filter_creator = mFilter->getFilterCreatorType();
- bool show_created_by_me = ((filter_creator == LLInventoryFilter::FILTERCREATOR_ALL) || (filter_creator == LLInventoryFilter::FILTERCREATOR_SELF));
- bool show_created_by_others = ((filter_creator == LLInventoryFilter::FILTERCREATOR_ALL) || (filter_creator == LLInventoryFilter::FILTERCREATOR_OTHERS));
-
- // update the ui elements
- setTitle(mFilter->getName());
-
- getChild<LLUICtrl>("check_animation")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_ANIMATION));
-
- getChild<LLUICtrl>("check_calling_card")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_CALLINGCARD));
- getChild<LLUICtrl>("check_clothing")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE));
- getChild<LLUICtrl>("check_gesture")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE));
- getChild<LLUICtrl>("check_landmark")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK));
- getChild<LLUICtrl>("check_material")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_MATERIAL));
- getChild<LLUICtrl>("check_notecard")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD));
- getChild<LLUICtrl>("check_object")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT));
- getChild<LLUICtrl>("check_script")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_LSL));
- getChild<LLUICtrl>("check_sound")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_SOUND));
- getChild<LLUICtrl>("check_texture")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE));
- getChild<LLUICtrl>("check_snapshot")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT));
- getChild<LLUICtrl>("check_settings")->setValue((S32)(filter_types & 0x1 << LLInventoryType::IT_SETTINGS));
- getChild<LLUICtrl>("check_show_empty")->setValue(show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS);
-
- getChild<LLUICtrl>("check_created_by_me")->setValue(show_created_by_me);
- getChild<LLUICtrl>("check_created_by_others")->setValue(show_created_by_others);
-
- getChild<LLUICtrl>("check_since_logoff")->setValue(mFilter->isSinceLogoff());
- mSpinSinceHours->set((F32)(hours % 24));
- mSpinSinceDays->set((F32)(hours / 24));
- getChild<LLRadioGroup>("date_search_direction")->setSelectedIndex(date_search_direction);
-}
-
-void LLFloaterInventoryFinder::draw()
-{
- U64 filter = 0xffffffffffffffffULL;
- bool filtered_by_all_types = true;
-
- if (!getChild<LLUICtrl>("check_animation")->getValue())
- {
- filter &= ~(0x1 << LLInventoryType::IT_ANIMATION);
- filtered_by_all_types = false;
- }
-
-
- if (!getChild<LLUICtrl>("check_calling_card")->getValue())
- {
- filter &= ~(0x1 << LLInventoryType::IT_CALLINGCARD);
- filtered_by_all_types = false;
- }
-
- if (!getChild<LLUICtrl>("check_clothing")->getValue())
- {
- filter &= ~(0x1 << LLInventoryType::IT_WEARABLE);
- filtered_by_all_types = false;
- }
-
- if (!getChild<LLUICtrl>("check_gesture")->getValue())
- {
- filter &= ~(0x1 << LLInventoryType::IT_GESTURE);
- filtered_by_all_types = false;
- }
-
- if (!getChild<LLUICtrl>("check_landmark")->getValue())
-
-
- {
- filter &= ~(0x1 << LLInventoryType::IT_LANDMARK);
- filtered_by_all_types = false;
- }
-
- if (!getChild<LLUICtrl>("check_material")->getValue())
- {
- filter &= ~(0x1 << LLInventoryType::IT_MATERIAL);
- filtered_by_all_types = false;
- }
-
- if (!getChild<LLUICtrl>("check_notecard")->getValue())
- {
- filter &= ~(0x1 << LLInventoryType::IT_NOTECARD);
- filtered_by_all_types = false;
- }
-
- if (!getChild<LLUICtrl>("check_object")->getValue())
- {
- filter &= ~(0x1 << LLInventoryType::IT_OBJECT);
- filter &= ~(0x1 << LLInventoryType::IT_ATTACHMENT);
- filtered_by_all_types = false;
- }
-
- if (!getChild<LLUICtrl>("check_script")->getValue())
- {
- filter &= ~(0x1 << LLInventoryType::IT_LSL);
- filtered_by_all_types = false;
- }
-
- if (!getChild<LLUICtrl>("check_sound")->getValue())
- {
- filter &= ~(0x1 << LLInventoryType::IT_SOUND);
- filtered_by_all_types = false;
- }
-
- if (!getChild<LLUICtrl>("check_texture")->getValue())
- {
- filter &= ~(0x1 << LLInventoryType::IT_TEXTURE);
- filtered_by_all_types = false;
- }
-
- if (!getChild<LLUICtrl>("check_snapshot")->getValue())
- {
- filter &= ~(0x1 << LLInventoryType::IT_SNAPSHOT);
- filtered_by_all_types = false;
- }
-
- if (!getChild<LLUICtrl>("check_settings")->getValue())
- {
- filter &= ~(0x1 << LLInventoryType::IT_SETTINGS);
- filtered_by_all_types = false;
- }
-
- if (!filtered_by_all_types || (mPanelMainInventory->getPanel()->getFilter().getFilterTypes() & LLInventoryFilter::FILTERTYPE_DATE))
- {
- // don't include folders in filter, unless I've selected everything or filtering by date
- filter &= ~(0x1 << LLInventoryType::IT_CATEGORY);
- }
-
-
- bool is_sf_mode = mPanelMainInventory->isSingleFolderMode();
- if(is_sf_mode && mPanelMainInventory->isGalleryViewMode())
- {
- mPanelMainInventory->mCombinationGalleryPanel->getFilter().setShowFolderState(getCheckShowEmpty() ?
- LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- mPanelMainInventory->mCombinationGalleryPanel->getFilter().setFilterObjectTypes(filter);
- }
- else
- {
- if(is_sf_mode && mPanelMainInventory->isCombinationViewMode())
- {
- mPanelMainInventory->mCombinationGalleryPanel->getFilter().setShowFolderState(getCheckShowEmpty() ?
- LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- mPanelMainInventory->mCombinationGalleryPanel->getFilter().setFilterObjectTypes(filter);
- }
- // update the panel, panel will update the filter
- mPanelMainInventory->getPanel()->setShowFolderState(getCheckShowEmpty() ?
- LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- mPanelMainInventory->getPanel()->setFilterTypes(filter);
- }
-
- if (getCheckSinceLogoff())
- {
- mSpinSinceDays->set(0);
- mSpinSinceHours->set(0);
- }
- U32 days = (U32)mSpinSinceDays->get();
- U32 hours = (U32)mSpinSinceHours->get();
- if (hours >= 24)
- {
- days = hours / 24;
- hours = (U32)hours % 24;
- // A UI element that has focus will not display a new value set to it
- mSpinSinceHours->setFocus(false);
- mSpinSinceDays->setFocus(false);
- mSpinSinceDays->set((F32)days);
- mSpinSinceHours->set((F32)hours);
- mSpinSinceHours->setFocus(true);
- }
- hours += days * 24;
-
-
- mPanelMainInventory->setFilterTextFromFilter();
- if(is_sf_mode && mPanelMainInventory->isGalleryViewMode())
- {
- mPanelMainInventory->mCombinationGalleryPanel->getFilter().setHoursAgo(hours);
- mPanelMainInventory->mCombinationGalleryPanel->getFilter().setDateRangeLastLogoff(getCheckSinceLogoff());
- mPanelMainInventory->mCombinationGalleryPanel->getFilter().setDateSearchDirection(getDateSearchDirection());
- }
- else
- {
- if(is_sf_mode && mPanelMainInventory->isCombinationViewMode())
- {
- mPanelMainInventory->mCombinationGalleryPanel->getFilter().setHoursAgo(hours);
- mPanelMainInventory->mCombinationGalleryPanel->getFilter().setDateRangeLastLogoff(getCheckSinceLogoff());
- mPanelMainInventory->mCombinationGalleryPanel->getFilter().setDateSearchDirection(getDateSearchDirection());
- }
- mPanelMainInventory->getPanel()->setHoursAgo(hours);
- mPanelMainInventory->getPanel()->setSinceLogoff(getCheckSinceLogoff());
- mPanelMainInventory->getPanel()->setDateSearchDirection(getDateSearchDirection());
- }
-
- LLPanel::draw();
-}
-
-void LLFloaterInventoryFinder::onCreatorSelfFilterCommit()
-{
- bool show_creator_self = mCreatorSelf->getValue();
- bool show_creator_other = mCreatorOthers->getValue();
-
- if(show_creator_self && show_creator_other)
- {
- mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_ALL);
- }
- else if(show_creator_self)
- {
- mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_SELF);
- }
- else if(!show_creator_self || !show_creator_other)
- {
- mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_OTHERS);
- mCreatorOthers->set(true);
- }
-}
-
-void LLFloaterInventoryFinder::onCreatorOtherFilterCommit()
-{
- bool show_creator_self = mCreatorSelf->getValue();
- bool show_creator_other = mCreatorOthers->getValue();
-
- if(show_creator_self && show_creator_other)
- {
- mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_ALL);
- }
- else if(show_creator_other)
- {
- mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_OTHERS);
- }
- else if(!show_creator_other || !show_creator_self)
- {
- mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_SELF);
- mCreatorSelf->set(true);
- }
-}
-
-bool LLFloaterInventoryFinder::getCheckShowEmpty()
-{
- return getChild<LLUICtrl>("check_show_empty")->getValue();
-}
-
-bool LLFloaterInventoryFinder::getCheckSinceLogoff()
-{
- return getChild<LLUICtrl>("check_since_logoff")->getValue();
-}
-
-U32 LLFloaterInventoryFinder::getDateSearchDirection()
-{
- return getChild<LLRadioGroup>("date_search_direction")->getSelectedIndex();
-}
-
-void LLFloaterInventoryFinder::onCloseBtn(void* user_data)
-{
- LLFloaterInventoryFinder* finderp = (LLFloaterInventoryFinder*)user_data;
- finderp->closeFloater();
-}
-
-// static
-void LLFloaterInventoryFinder::selectAllTypes(void* user_data)
-{
- LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data;
- if(!self) return;
-
- self->getChild<LLUICtrl>("check_animation")->setValue(true);
- self->getChild<LLUICtrl>("check_calling_card")->setValue(true);
- self->getChild<LLUICtrl>("check_clothing")->setValue(true);
- self->getChild<LLUICtrl>("check_gesture")->setValue(true);
- self->getChild<LLUICtrl>("check_landmark")->setValue(true);
- self->getChild<LLUICtrl>("check_material")->setValue(true);
- self->getChild<LLUICtrl>("check_notecard")->setValue(true);
- self->getChild<LLUICtrl>("check_object")->setValue(true);
- self->getChild<LLUICtrl>("check_script")->setValue(true);
- self->getChild<LLUICtrl>("check_sound")->setValue(true);
- self->getChild<LLUICtrl>("check_texture")->setValue(true);
- self->getChild<LLUICtrl>("check_snapshot")->setValue(true);
- self->getChild<LLUICtrl>("check_settings")->setValue(true);
-}
-
-//static
-void LLFloaterInventoryFinder::selectNoTypes(void* user_data)
-{
- LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data;
- if(!self) return;
-
- self->getChild<LLUICtrl>("check_animation")->setValue(false);
- self->getChild<LLUICtrl>("check_calling_card")->setValue(false);
- self->getChild<LLUICtrl>("check_clothing")->setValue(false);
- self->getChild<LLUICtrl>("check_gesture")->setValue(false);
- self->getChild<LLUICtrl>("check_landmark")->setValue(false);
- self->getChild<LLUICtrl>("check_material")->setValue(false);
- self->getChild<LLUICtrl>("check_notecard")->setValue(false);
- self->getChild<LLUICtrl>("check_object")->setValue(false);
- self->getChild<LLUICtrl>("check_script")->setValue(false);
- self->getChild<LLUICtrl>("check_sound")->setValue(false);
- self->getChild<LLUICtrl>("check_texture")->setValue(false);
- self->getChild<LLUICtrl>("check_snapshot")->setValue(false);
- self->getChild<LLUICtrl>("check_settings")->setValue(false);
-}
-
-//////////////////////////////////////////////////////////////////////////////////
-// List Commands //
-
-void LLPanelMainInventory::initListCommandsHandlers()
-{
- childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this));
- childSetAction("view_mode_btn", boost::bind(&LLPanelMainInventory::onViewModeClick, this));
- childSetAction("up_btn", boost::bind(&LLPanelMainInventory::onUpFolderClicked, this));
- childSetAction("back_btn", boost::bind(&LLPanelMainInventory::onBackFolderClicked, this));
- childSetAction("forward_btn", boost::bind(&LLPanelMainInventory::onForwardFolderClicked, this));
-
- mCommitCallbackRegistrar.add("Inventory.GearDefault.Custom.Action", boost::bind(&LLPanelMainInventory::onCustomAction, this, _2));
- mEnableCallbackRegistrar.add("Inventory.GearDefault.Check", boost::bind(&LLPanelMainInventory::isActionChecked, this, _2));
- mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2));
- mEnableCallbackRegistrar.add("Inventory.GearDefault.Visible", boost::bind(&LLPanelMainInventory::isActionVisible, this, _2));
- mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- mGearMenuButton->setMenu(mMenuGearDefault, LLMenuButton::MP_BOTTOM_LEFT, true);
- mMenuViewDefault = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_inventory_view_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- mViewMenuButton->setMenu(mMenuViewDefault, LLMenuButton::MP_BOTTOM_LEFT, true);
- LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- mMenuAddHandle = menu->getHandle();
-
- mMenuVisibility = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_inventory_search_visibility.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- mVisibilityMenuButton->setMenu(mMenuVisibility, LLMenuButton::MP_BOTTOM_LEFT, true);
-
- // Update the trash button when selected item(s) get worn or taken off.
- LLOutfitObserver::instance().addCOFChangedCallback(boost::bind(&LLPanelMainInventory::updateListCommands, this));
-}
-
-void LLPanelMainInventory::updateListCommands()
-{
-}
-
-void LLPanelMainInventory::onAddButtonClick()
-{
-// Gray out the "New Folder" option when the Recent tab is active as new folders will not be displayed
-// unless "Always show folders" is checked in the filter options.
-
- LLMenuGL* menu = (LLMenuGL*)mMenuAddHandle.get();
- if (menu)
- {
- disableAddIfNeeded();
-
- setUploadCostIfNeeded();
-
- showActionMenu(menu,"add_btn");
- }
-}
-
-void LLPanelMainInventory::setActivePanel()
-{
- // Todo: should cover gallery mode in some way
- if(mSingleFolderMode && isListViewMode())
- {
- mActivePanel = getChild<LLInventoryPanel>("comb_single_folder_inv");
- }
- else if(mSingleFolderMode && isCombinationViewMode())
- {
- mActivePanel = getChild<LLInventoryPanel>("comb_single_folder_inv");
- }
- else
- {
- mActivePanel = (LLInventoryPanel*)getChild<LLTabContainer>("inventory filter tabs")->getCurrentPanel();
- }
- mViewModeBtn->setEnabled(mSingleFolderMode || (getAllItemsPanel() == getActivePanel()));
-}
-
-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())
- {
- mCombinationInventoryPanel->getRootFolder()->setForceArrange(false);
- }
-
- mSingleFolderMode = !mSingleFolderMode;
- mReshapeInvLayout = true;
-
- if (mCombinationGalleryPanel->getRootFolder().isNull())
- {
- mCombinationGalleryPanel->setRootFolder(mCombinationInventoryPanel->getSingleFolderRoot());
- mCombinationGalleryPanel->updateRootFolder();
- }
-
- updatePanelVisibility();
- setActivePanel();
- updateTitle();
- onFilterSelected();
-
- LLSidepanelInventory* sidepanel_inventory = getParentSidepanelInventory();
- if (sidepanel_inventory)
- {
- if(mSingleFolderMode)
- {
- sidepanel_inventory->hideInbox();
- }
- else
- {
- sidepanel_inventory->toggleInbox();
- }
- }
-}
-
-void LLPanelMainInventory::onViewModeClick()
-{
- LLUUID selected_folder;
- LLUUID new_root_folder;
- if(mSingleFolderMode)
- {
- selected_folder = getCurrentSFVRoot();
- }
- else
- {
- LLFolderView* root = getActivePanel()->getRootFolder();
- std::set<LLFolderViewItem*> selection_set = root->getSelectionList();
- if (selection_set.size() == 1)
- {
- LLFolderViewItem* current_item = *selection_set.begin();
- if (current_item)
- {
- const LLUUID& id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
- if(gInventory.getCategory(id) != NULL)
- {
- new_root_folder = id;
- }
- else
- {
- const LLViewerInventoryItem* selected_item = gInventory.getItem(id);
- if (selected_item && selected_item->getParentUUID().notNull())
- {
- new_root_folder = selected_item->getParentUUID();
- selected_folder = id;
- }
- }
- }
- }
- mCombinationInventoryPanel->initFolderRoot(new_root_folder);
- }
-
- toggleViewMode();
-
- if (mSingleFolderMode && new_root_folder.notNull())
- {
- setSingleFolderViewRoot(new_root_folder, true);
- if(selected_folder.notNull() && isListViewMode())
- {
- getActivePanel()->setSelection(selected_folder, TAKE_FOCUS_YES);
- }
- }
- else
- {
- if(selected_folder.notNull())
- {
- selectAllItemsPanel();
- getActivePanel()->setSelection(selected_folder, TAKE_FOCUS_YES);
- }
- }
-}
-
-void LLPanelMainInventory::onUpFolderClicked()
-{
- const LLViewerInventoryCategory* cat = gInventory.getCategory(getCurrentSFVRoot());
- if (cat)
- {
- if (cat->getParentUUID().notNull())
- {
- if(isListViewMode())
- {
- mCombinationInventoryPanel->changeFolderRoot(cat->getParentUUID());
- }
- if(isGalleryViewMode())
- {
- mCombinationGalleryPanel->setRootFolder(cat->getParentUUID());
- }
- if(isCombinationViewMode())
- {
- mCombinationInventoryPanel->changeFolderRoot(cat->getParentUUID());
- }
- }
- }
-}
-
-void LLPanelMainInventory::onBackFolderClicked()
-{
- if(isListViewMode())
- {
- mCombinationInventoryPanel->onBackwardFolder();
- }
- if(isGalleryViewMode())
- {
- mCombinationGalleryPanel->onBackwardFolder();
- }
- if(isCombinationViewMode())
- {
- mCombinationInventoryPanel->onBackwardFolder();
- }
-}
-
-void LLPanelMainInventory::onForwardFolderClicked()
-{
- if(isListViewMode())
- {
- mCombinationInventoryPanel->onForwardFolder();
- }
- if(isGalleryViewMode())
- {
- mCombinationGalleryPanel->onForwardFolder();
- }
- if(isCombinationViewMode())
- {
- mCombinationInventoryPanel->onForwardFolder();
- }
-}
-
-void LLPanelMainInventory::setSingleFolderViewRoot(const LLUUID& folder_id, bool clear_nav_history)
-{
- if(isListViewMode())
- {
- mCombinationInventoryPanel->changeFolderRoot(folder_id);
- if(clear_nav_history)
- {
- mCombinationInventoryPanel->clearNavigationHistory();
- }
- }
- else if(isGalleryViewMode())
- {
- mCombinationGalleryPanel->setRootFolder(folder_id);
- if(clear_nav_history)
- {
- mCombinationGalleryPanel->clearNavigationHistory();
- }
- }
- else if(isCombinationViewMode())
- {
- mCombinationInventoryPanel->changeFolderRoot(folder_id);
- }
- updateNavButtons();
-}
-
-LLUUID LLPanelMainInventory::getSingleFolderViewRoot()
-{
- return mCombinationInventoryPanel->getSingleFolderRoot();
-}
-
-void LLPanelMainInventory::showActionMenu(LLMenuGL* menu, std::string spawning_view_name)
-{
- if (menu)
- {
- menu->buildDrawLabels();
- menu->updateParent(LLMenuGL::sMenuContainer);
- LLView* spawning_view = getChild<LLView> (spawning_view_name);
- S32 menu_x, menu_y;
- //show menu in co-ordinates of panel
- spawning_view->localPointToOtherView(0, 0, &menu_x, &menu_y, this);
- LLMenuGL::showPopup(this, menu, menu_x, menu_y);
- }
-}
-
-void LLPanelMainInventory::onClipboardAction(const LLSD& userdata)
-{
- std::string command_name = userdata.asString();
- getActivePanel()->doToSelected(command_name);
-}
-
-void LLPanelMainInventory::saveTexture(const LLSD& userdata)
-{
- LLUUID item_id;
- if(mSingleFolderMode && isGalleryViewMode())
- {
- item_id = mCombinationGalleryPanel->getFirstSelectedItemID();
- if (item_id.isNull()) return;
- }
- else
- {
- LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
- if (!current_item)
- {
- return;
- }
- item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
- }
-
- LLPreviewTexture* preview_texture = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(item_id), TAKE_FOCUS_YES);
- if (preview_texture)
- {
- preview_texture->openToSave();
- }
-}
-
-void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
-{
- if (!isActionEnabled(userdata))
- return;
-
- const std::string command_name = userdata.asString();
-
- if (command_name == "new_window")
- {
- newWindow();
- }
- if (command_name == "sort_by_name")
- {
- const LLSD arg = "name";
- setSortBy(arg);
- }
- if (command_name == "sort_by_recent")
- {
- const LLSD arg = "date";
- setSortBy(arg);
- }
- if (command_name == "sort_folders_by_name")
- {
- const LLSD arg = "foldersalwaysbyname";
- setSortBy(arg);
- }
- if (command_name == "sort_system_folders_to_top")
- {
- const LLSD arg = "systemfolderstotop";
- setSortBy(arg);
- }
- if (command_name == "show_filters")
- {
- toggleFindOptions();
- }
- if (command_name == "reset_filters")
- {
- resetFilters();
- }
- if (command_name == "close_folders")
- {
- closeAllFolders();
- }
- if (command_name == "empty_trash")
- {
- const std::string notification = "ConfirmEmptyTrash";
- gInventory.emptyFolderType(notification, LLFolderType::FT_TRASH);
- }
- if (command_name == "empty_lostnfound")
- {
- const std::string notification = "ConfirmEmptyLostAndFound";
- gInventory.emptyFolderType(notification, LLFolderType::FT_LOST_AND_FOUND);
- }
- if (command_name == "save_texture")
- {
- saveTexture(userdata);
- }
- // This doesn't currently work, since the viewer can't change an assetID an item.
- if (command_name == "regenerate_link")
- {
- LLInventoryPanel *active_panel = getActivePanel();
- LLFolderViewItem* current_item = active_panel->getRootFolder()->getCurSelectedItem();
- if (!current_item)
- {
- return;
- }
- const LLUUID item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
- LLViewerInventoryItem *item = gInventory.getItem(item_id);
- if (item)
- {
- item->regenerateLink();
- }
- active_panel->setSelection(item_id, TAKE_FOCUS_NO);
- }
- if (command_name == "find_original")
- {
- if(mSingleFolderMode && isGalleryViewMode())
- {
- LLInventoryObject *obj = gInventory.getObject(mCombinationGalleryPanel->getFirstSelectedItemID());
- if (obj && obj->getIsLinkType())
- {
- show_item_original(obj->getUUID());
- }
- }
- else
- {
- LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
- if (!current_item)
- {
- return;
- }
- static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->performAction(getActivePanel()->getModel(), "goto");
- }
- }
-
- if (command_name == "find_links")
- {
- if(mSingleFolderMode && isGalleryViewMode())
- {
- LLFloaterSidePanelContainer* inventory_container = newWindow();
- if (inventory_container)
- {
- LLSidepanelInventory* sidepanel_inventory = dynamic_cast<LLSidepanelInventory*>(inventory_container->findChild<LLPanel>("main_panel", true));
- if (sidepanel_inventory)
- {
- LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();
- if (main_inventory)
- {
- LLInventoryObject *obj = gInventory.getObject(mCombinationGalleryPanel->getFirstSelectedItemID());
- if (obj)
- {
- main_inventory->findLinks(obj->getUUID(), obj->getName());
- }
- }
- }
- }
- }
- else
- {
- LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
- if (!current_item)
- {
- return;
- }
- const LLUUID& item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
- const std::string &item_name = current_item->getViewModelItem()->getName();
- findLinks(item_id, item_name);
- }
- }
-
- if (command_name == "replace_links")
- {
- LLSD params;
- if(mSingleFolderMode && isGalleryViewMode())
- {
- params = LLSD(mCombinationGalleryPanel->getFirstSelectedItemID());
- }
- else
- {
- LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
- if (current_item)
- {
- LLInvFVBridge* bridge = (LLInvFVBridge*)current_item->getViewModelItem();
-
- if (bridge)
- {
- LLInventoryObject* obj = bridge->getInventoryObject();
- if (obj && obj->getType() != LLAssetType::AT_CATEGORY && obj->getActualType() != LLAssetType::AT_LINK_FOLDER)
- {
- params = LLSD(obj->getUUID());
- }
- }
- }
- }
- LLFloaterReg::showInstance("linkreplace", params);
- }
-
- if (command_name == "close_inv_windows")
- {
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
- for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end();)
- {
- LLFloaterSidePanelContainer* iv = dynamic_cast<LLFloaterSidePanelContainer*>(*iter++);
- if (iv)
- {
- iv->closeFloater();
- }
- }
- LLFloaterReg::hideInstance("inventory_settings");
- }
-
- if (command_name == "toggle_search_outfits")
- {
- getCurrentFilter().toggleSearchVisibilityOutfits();
- }
-
- if (command_name == "toggle_search_trash")
- {
- getCurrentFilter().toggleSearchVisibilityTrash();
- }
-
- if (command_name == "toggle_search_library")
- {
- getCurrentFilter().toggleSearchVisibilityLibrary();
- }
-
- if (command_name == "include_links")
- {
- getCurrentFilter().toggleSearchVisibilityLinks();
- }
-
- if (command_name == "share")
- {
- if(mSingleFolderMode && isGalleryViewMode())
- {
- std::set<LLUUID> uuids{ mCombinationGalleryPanel->getFirstSelectedItemID()};
- LLAvatarActions::shareWithAvatars(uuids, gFloaterView->getParentFloater(this));
- }
- else
- {
- LLAvatarActions::shareWithAvatars(this);
- }
- }
- if (command_name == "shop")
- {
- LLWeb::loadURL(gSavedSettings.getString("MarketplaceURL"));
- }
- if (command_name == "list_view")
- {
- setViewMode(MODE_LIST);
- }
- if (command_name == "gallery_view")
- {
- setViewMode(MODE_GALLERY);
- }
- if (command_name == "combination_view")
- {
- setViewMode(MODE_COMBINATION);
- }
-}
-
-void LLPanelMainInventory::onVisibilityChange( bool new_visibility )
-{
- if(!new_visibility)
- {
- LLMenuGL* menu = (LLMenuGL*)mMenuAddHandle.get();
- if (menu)
- {
- menu->setVisible(false);
- }
- getActivePanel()->getRootFolder()->finishRenamingItem();
- }
-}
-
-bool LLPanelMainInventory::isSaveTextureEnabled(const LLSD& userdata)
-{
- LLViewerInventoryItem *inv_item = NULL;
- if(mSingleFolderMode && isGalleryViewMode())
- {
- inv_item = gInventory.getItem(mCombinationGalleryPanel->getFirstSelectedItemID());
- }
- else
- {
- LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
- if (current_item)
- {
- inv_item = dynamic_cast<LLViewerInventoryItem*>(static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getInventoryObject());
- }
- }
- if(inv_item)
- {
- bool can_save = inv_item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
- LLInventoryType::EType curr_type = inv_item->getInventoryType();
- return can_save && (curr_type == LLInventoryType::IT_TEXTURE || curr_type == LLInventoryType::IT_SNAPSHOT);
- }
-
- return false;
-}
-
-bool LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
-{
- const std::string command_name = userdata.asString();
- if (command_name == "not_empty")
- {
- bool status = false;
- LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
- if (current_item)
- {
- const LLUUID& item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
- LLInventoryModel::cat_array_t* cat_array;
- LLInventoryModel::item_array_t* item_array;
- gInventory.getDirectDescendentsOf(item_id, cat_array, item_array);
- status = (0 == cat_array->size() && 0 == item_array->size());
- }
- return status;
- }
- if (command_name == "delete")
- {
- return getActivePanel()->isSelectionRemovable();
- }
- if (command_name == "save_texture")
- {
- return isSaveTextureEnabled(userdata);
- }
- if (command_name == "find_original")
- {
- LLUUID item_id;
- if(mSingleFolderMode && isGalleryViewMode())
- {
- item_id = mCombinationGalleryPanel->getFirstSelectedItemID();
- }
- else{
- LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
- if (!current_item) return false;
- item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
- }
- const LLViewerInventoryItem *item = gInventory.getItem(item_id);
- if (item && item->getIsLinkType() && !item->getIsBrokenLink())
- {
- return true;
- }
- return false;
- }
-
- if (command_name == "find_links")
- {
- LLUUID item_id;
- if(mSingleFolderMode && isGalleryViewMode())
- {
- item_id = mCombinationGalleryPanel->getFirstSelectedItemID();
- }
- else{
- LLFolderView* root = getActivePanel()->getRootFolder();
- std::set<LLFolderViewItem*> selection_set = root->getSelectionList();
- if (selection_set.size() != 1) return false;
- LLFolderViewItem* current_item = root->getCurSelectedItem();
- if (!current_item) return false;
- item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
- }
- const LLInventoryObject *obj = gInventory.getObject(item_id);
- if (obj && !obj->getIsLinkType() && LLAssetType::lookupCanLink(obj->getType()))
- {
- return true;
- }
- return false;
- }
- // This doesn't currently work, since the viewer can't change an assetID an item.
- if (command_name == "regenerate_link")
- {
- LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
- if (!current_item) return false;
- const LLUUID& item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
- const LLViewerInventoryItem *item = gInventory.getItem(item_id);
- if (item && item->getIsBrokenLink())
- {
- return true;
- }
- return false;
- }
-
- if (command_name == "share")
- {
- if(mSingleFolderMode && isGalleryViewMode())
- {
- return can_share_item(mCombinationGalleryPanel->getFirstSelectedItemID());
- }
- else{
- LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
- if (!current_item) return false;
- LLSidepanelInventory* parent = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
- return parent ? parent->canShare() : false;
- }
- }
- if (command_name == "empty_trash")
- {
- const LLUUID &trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- LLInventoryModel::EHasChildren children = gInventory.categoryHasChildren(trash_id);
- return children != LLInventoryModel::CHILDREN_NO && gInventory.isCategoryComplete(trash_id);
- }
- if (command_name == "empty_lostnfound")
- {
- const LLUUID &trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
- LLInventoryModel::EHasChildren children = gInventory.categoryHasChildren(trash_id);
- return children != LLInventoryModel::CHILDREN_NO && gInventory.isCategoryComplete(trash_id);
- }
-
- return true;
-}
-
-bool LLPanelMainInventory::isActionVisible(const LLSD& userdata)
-{
- const std::string param_str = userdata.asString();
- if (param_str == "single_folder_view")
- {
- return mSingleFolderMode;
- }
- if (param_str == "multi_folder_view")
- {
- return !mSingleFolderMode;
- }
-
- return true;
-}
-
-bool LLPanelMainInventory::isActionChecked(const LLSD& userdata)
-{
- U32 sort_order_mask = (mSingleFolderMode && isGalleryViewMode()) ? mCombinationGalleryPanel->getSortOrder() : getActivePanel()->getSortOrder();
- const std::string command_name = userdata.asString();
- if (command_name == "sort_by_name")
- {
- return ~sort_order_mask & LLInventoryFilter::SO_DATE;
- }
-
- if (command_name == "sort_by_recent")
- {
- return sort_order_mask & LLInventoryFilter::SO_DATE;
- }
-
- if (command_name == "sort_folders_by_name")
- {
- return sort_order_mask & LLInventoryFilter::SO_FOLDERS_BY_NAME;
- }
-
- if (command_name == "sort_system_folders_to_top")
- {
- return sort_order_mask & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
- }
-
- if (command_name == "toggle_search_outfits")
- {
- return (getCurrentFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_OUTFITS) != 0;
- }
-
- if (command_name == "toggle_search_trash")
- {
- return (getCurrentFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_TRASH) != 0;
- }
-
- if (command_name == "toggle_search_library")
- {
- return (getCurrentFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_LIBRARY) != 0;
- }
-
- if (command_name == "include_links")
- {
- return (getCurrentFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_LINKS) != 0;
- }
-
- if (command_name == "list_view")
- {
- return isListViewMode();
- }
- if (command_name == "gallery_view")
- {
- return isGalleryViewMode();
- }
- if (command_name == "combination_view")
- {
- return isCombinationViewMode();
- }
-
- return false;
-}
-
-void LLPanelMainInventory::setUploadCostIfNeeded()
-{
- LLMenuGL* menu = (LLMenuGL*)mMenuAddHandle.get();
- if(mNeedUploadCost && menu)
- {
- const std::string texture_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getTextureUploadCost());
- const std::string sound_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getSoundUploadCost());
- const std::string animation_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getAnimationUploadCost());
-
- menu->getChild<LLView>("Upload Image")->setLabelArg("[COST]", texture_upload_cost_str);
- menu->getChild<LLView>("Upload Sound")->setLabelArg("[COST]", sound_upload_cost_str);
- menu->getChild<LLView>("Upload Animation")->setLabelArg("[COST]", animation_upload_cost_str);
- }
-}
-
-bool is_add_allowed(LLUUID folder_id)
-{
- if(!gInventory.isObjectDescendentOf(folder_id, gInventory.getRootFolderID()))
- {
- return false;
- }
-
- std::vector<LLFolderType::EType> not_allowed_types;
- not_allowed_types.push_back(LLFolderType::FT_LOST_AND_FOUND);
- not_allowed_types.push_back(LLFolderType::FT_FAVORITE);
- not_allowed_types.push_back(LLFolderType::FT_MARKETPLACE_LISTINGS);
- not_allowed_types.push_back(LLFolderType::FT_TRASH);
- not_allowed_types.push_back(LLFolderType::FT_CURRENT_OUTFIT);
- not_allowed_types.push_back(LLFolderType::FT_INBOX);
-
- for (std::vector<LLFolderType::EType>::const_iterator it = not_allowed_types.begin();
- it != not_allowed_types.end(); ++it)
- {
- if(gInventory.isObjectDescendentOf(folder_id, gInventory.findCategoryUUIDForType(*it)))
- {
- return false;
- }
- }
-
- LLViewerInventoryCategory* cat = gInventory.getCategory(folder_id);
- if (cat && (cat->getPreferredType() == LLFolderType::FT_OUTFIT))
- {
- return false;
- }
- return true;
-}
-
-void LLPanelMainInventory::disableAddIfNeeded()
-{
- LLMenuGL* menu = (LLMenuGL*)mMenuAddHandle.get();
- if (menu)
- {
- bool enable = !mSingleFolderMode || is_add_allowed(getCurrentSFVRoot());
-
- menu->getChild<LLMenuItemGL>("New Folder")->setEnabled(enable && !isRecentItemsPanelSelected());
- menu->getChild<LLMenuItemGL>("New Script")->setEnabled(enable);
- menu->getChild<LLMenuItemGL>("New Note")->setEnabled(enable);
- menu->getChild<LLMenuItemGL>("New Gesture")->setEnabled(enable);
- menu->setItemEnabled("New Clothes", enable);
- menu->setItemEnabled("New Body Parts", enable);
- menu->setItemEnabled("New Settings", enable);
- }
-}
-
-bool LLPanelMainInventory::hasSettingsInventory()
-{
- return LLEnvironment::instance().isInventoryEnabled();
-}
-
-bool LLPanelMainInventory::hasMaterialsInventory()
-{
- std::string agent_url = gAgent.getRegionCapability("UpdateMaterialAgentInventory");
- std::string task_url = gAgent.getRegionCapability("UpdateMaterialTaskInventory");
-
- return (!agent_url.empty() && !task_url.empty());
-}
-
-void LLPanelMainInventory::updateTitle()
-{
- LLFloater* inventory_floater = gFloaterView->getParentFloater(this);
- if(inventory_floater)
- {
- if(mSingleFolderMode)
- {
- inventory_floater->setTitle(getLocalizedRootName());
- LLFloaterInventoryFinder *finder = getFinder();
- if (finder)
- {
- finder->setTitle(getLocalizedRootName());
- }
- }
- else
- {
- inventory_floater->setTitle(getString("inventory_title"));
- }
- }
- updateNavButtons();
-}
-
-void LLPanelMainInventory::onCombinationRootChanged(bool gallery_clicked)
-{
- if(gallery_clicked)
- {
- mCombinationInventoryPanel->changeFolderRoot(mCombinationGalleryPanel->getRootFolder());
- }
- else
- {
- mCombinationGalleryPanel->setRootFolder(mCombinationInventoryPanel->getSingleFolderRoot());
- }
- mForceShowInvLayout = false;
- updateTitle();
- mReshapeInvLayout = true;
-}
-
-void LLPanelMainInventory::onCombinationGallerySelectionChanged(const LLUUID& category_id)
-{
-}
-
-void LLPanelMainInventory::onCombinationInventorySelectionChanged(const std::deque<LLFolderViewItem*>& items, bool user_action)
-{
- onSelectionChange(mCombinationInventoryPanel, items, user_action);
-}
-
-void LLPanelMainInventory::updatePanelVisibility()
-{
- mDefaultViewPanel->setVisible(!mSingleFolderMode);
- mCombinationViewPanel->setVisible(mSingleFolderMode);
- mNavigationBtnsPanel->setVisible(mSingleFolderMode);
- mViewModeBtn->setImageOverlay(mSingleFolderMode ? getString("default_mode_btn") : getString("single_folder_mode_btn"));
- mViewModeBtn->setEnabled(mSingleFolderMode || (getAllItemsPanel() == getActivePanel()));
- if (mSingleFolderMode)
- {
- if (isCombinationViewMode())
- {
- LLInventoryFilter& comb_inv_filter = mCombinationInventoryPanel->getFilter();
- comb_inv_filter.setFilterThumbnails(LLInventoryFilter::FILTER_EXCLUDE_THUMBNAILS);
- comb_inv_filter.markDefault();
-
- LLInventoryFilter& comb_gallery_filter = mCombinationGalleryPanel->getFilter();
- comb_gallery_filter.setFilterThumbnails(LLInventoryFilter::FILTER_ONLY_THUMBNAILS);
- comb_gallery_filter.markDefault();
-
- // visibility will be controled by updateCombinationVisibility()
- mCombinationGalleryLayoutPanel->setVisible(true);
- mCombinationGalleryPanel->setVisible(true);
- mCombinationListLayoutPanel->setVisible(true);
- }
- else
- {
- LLInventoryFilter& comb_inv_filter = mCombinationInventoryPanel->getFilter();
- comb_inv_filter.setFilterThumbnails(LLInventoryFilter::FILTER_INCLUDE_THUMBNAILS);
- comb_inv_filter.markDefault();
-
- LLInventoryFilter& comb_gallery_filter = mCombinationGalleryPanel->getFilter();
- comb_gallery_filter.setFilterThumbnails(LLInventoryFilter::FILTER_INCLUDE_THUMBNAILS);
- comb_gallery_filter.markDefault();
-
- mCombinationLayoutStack->setPanelSpacing(0);
- 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);
- }
-}
-
-void LLPanelMainInventory::updateCombinationVisibility()
-{
- if(mSingleFolderMode && isCombinationViewMode())
- {
- bool is_gallery_empty = !mCombinationGalleryPanel->hasVisibleItems();
- bool show_inv_pane = mCombinationInventoryPanel->hasVisibleItems() || is_gallery_empty || mForceShowInvLayout;
-
- const S32 DRAG_HANDLE_PADDING = 12; // for drag handle to not overlap gallery when both inventories are visible
- mCombinationLayoutStack->setPanelSpacing(show_inv_pane ? DRAG_HANDLE_PADDING : 0);
-
- mCombinationGalleryLayoutPanel->setVisible(!is_gallery_empty);
- mCombinationListLayoutPanel->setVisible(show_inv_pane);
- mCombinationInventoryPanel->getRootFolder()->setForceArrange(!show_inv_pane);
- if(mCombinationInventoryPanel->hasVisibleItems())
- {
- mForceShowInvLayout = false;
- }
- if(is_gallery_empty)
- {
- mCombinationGalleryPanel->handleModifiedFilter();
- }
-
- getActivePanel()->getRootFolder();
-
- if (mReshapeInvLayout
- && show_inv_pane
- && (mCombinationGalleryPanel->hasVisibleItems() || mCombinationGalleryPanel->areViewsInitialized())
- && mCombinationInventoryPanel->areViewsInitialized())
- {
- mReshapeInvLayout = false;
-
- // force drop previous shape (because panel doesn't decrease shape properly)
- LLRect list_latout = mCombinationListLayoutPanel->getRect();
- list_latout.mTop = list_latout.mBottom; // min height is at 100, so it should snap to be bigger
- mCombinationListLayoutPanel->setShape(list_latout, false);
-
- LLRect inv_inner_rect = mCombinationInventoryPanel->getScrollableContainer()->getScrolledViewRect();
- S32 inv_height = inv_inner_rect.getHeight()
- + (mCombinationInventoryPanel->getScrollableContainer()->getBorderWidth() * 2)
- + mCombinationInventoryPanel->getScrollableContainer()->getSize();
- LLRect inner_galery_rect = mCombinationGalleryPanel->getScrollableContainer()->getScrolledViewRect();
- S32 gallery_height = inner_galery_rect.getHeight()
- + (mCombinationGalleryPanel->getScrollableContainer()->getBorderWidth() * 2)
- + mCombinationGalleryPanel->getScrollableContainer()->getSize();
- LLRect layout_rect = mCombinationViewPanel->getRect();
-
- // by default make it take 1/3 of the panel
- S32 list_default_height = layout_rect.getHeight() / 3;
- // Don't set height from gallery_default_height - needs to account for a resizer in such case
- S32 gallery_default_height = layout_rect.getHeight() - list_default_height;
-
- if (inv_height > list_default_height
- && gallery_height < gallery_default_height)
- {
- LLRect gallery_latout = mCombinationGalleryLayoutPanel->getRect();
- gallery_latout.mTop = gallery_latout.mBottom + gallery_height;
- mCombinationGalleryLayoutPanel->setShape(gallery_latout, true /*tell stack to account for new shape*/);
- }
- else if (inv_height < list_default_height
- && gallery_height > gallery_default_height)
- {
- LLRect list_latout = mCombinationListLayoutPanel->getRect();
- list_latout.mTop = list_latout.mBottom + inv_height;
- mCombinationListLayoutPanel->setShape(list_latout, true /*tell stack to account for new shape*/);
- }
- else
- {
- LLRect list_latout = mCombinationListLayoutPanel->getRect();
- list_latout.mTop = list_latout.mBottom + list_default_height;
- mCombinationListLayoutPanel->setShape(list_latout, true /*tell stack to account for new shape*/);
- }
- }
- }
-
- if (mSingleFolderMode
- && !isGalleryViewMode()
- && mCombInvUUIDNeedsRename.notNull()
- && mCombinationInventoryPanel->areViewsInitialized())
- {
- mCombinationInventoryPanel->setSelectionByID(mCombInvUUIDNeedsRename, true);
- mCombinationInventoryPanel->getRootFolder()->scrollToShowSelection();
- mCombinationInventoryPanel->getRootFolder()->setNeedsAutoRename(true);
- mCombInvUUIDNeedsRename.setNull();
- }
-}
-
-void LLPanelMainInventory::updateNavButtons()
-{
- if(isListViewMode())
- {
- mBackBtn->setEnabled(mCombinationInventoryPanel->isBackwardAvailable());
- mForwardBtn->setEnabled(mCombinationInventoryPanel->isForwardAvailable());
- }
- if(isGalleryViewMode())
- {
- mBackBtn->setEnabled(mCombinationGalleryPanel->isBackwardAvailable());
- mForwardBtn->setEnabled(mCombinationGalleryPanel->isForwardAvailable());
- }
- if(isCombinationViewMode())
- {
- mBackBtn->setEnabled(mCombinationInventoryPanel->isBackwardAvailable());
- mForwardBtn->setEnabled(mCombinationInventoryPanel->isForwardAvailable());
- }
-
- const LLViewerInventoryCategory* cat = gInventory.getCategory(getCurrentSFVRoot());
- bool up_enabled = (cat && cat->getParentUUID().notNull());
- mUpBtn->setEnabled(up_enabled);
-}
-
-LLSidepanelInventory* LLPanelMainInventory::getParentSidepanelInventory()
-{
- LLFloaterSidePanelContainer* inventory_container = dynamic_cast<LLFloaterSidePanelContainer*>(gFloaterView->getParentFloater(this));
- if(inventory_container)
- {
- return dynamic_cast<LLSidepanelInventory*>(inventory_container->findChild<LLPanel>("main_panel", true));
- }
- return NULL;
-}
-
-void LLPanelMainInventory::setViewMode(EViewModeType mode)
-{
- if(mode != mViewMode)
- {
- std::list<LLUUID> forward_history;
- std::list<LLUUID> backward_history;
- U32 sort_order = 0;
- switch(mViewMode)
- {
- case MODE_LIST:
- forward_history = mCombinationInventoryPanel->getNavForwardList();
- backward_history = mCombinationInventoryPanel->getNavBackwardList();
- sort_order = mCombinationInventoryPanel->getSortOrder();
- break;
- case MODE_GALLERY:
- forward_history = mCombinationGalleryPanel->getNavForwardList();
- backward_history = mCombinationGalleryPanel->getNavBackwardList();
- sort_order = mCombinationGalleryPanel->getSortOrder();
- break;
- case MODE_COMBINATION:
- forward_history = mCombinationInventoryPanel->getNavForwardList();
- backward_history = mCombinationInventoryPanel->getNavBackwardList();
- mCombinationInventoryPanel->getRootFolder()->setForceArrange(false);
- sort_order = mCombinationInventoryPanel->getSortOrder();
- break;
- }
-
- LLUUID cur_root = getCurrentSFVRoot();
- mViewMode = mode;
-
- updatePanelVisibility();
-
- if(isListViewMode())
- {
- mCombinationInventoryPanel->changeFolderRoot(cur_root);
- mCombinationInventoryPanel->setNavForwardList(forward_history);
- mCombinationInventoryPanel->setNavBackwardList(backward_history);
- mCombinationInventoryPanel->setSortOrder(sort_order);
- }
- if(isGalleryViewMode())
- {
- mCombinationGalleryPanel->setRootFolder(cur_root);
- mCombinationGalleryPanel->setNavForwardList(forward_history);
- mCombinationGalleryPanel->setNavBackwardList(backward_history);
- mCombinationGalleryPanel->setSortOrder(sort_order, true);
- }
- if(isCombinationViewMode())
- {
- mCombinationInventoryPanel->changeFolderRoot(cur_root);
- mCombinationGalleryPanel->setRootFolder(cur_root);
- mCombinationInventoryPanel->setNavForwardList(forward_history);
- mCombinationInventoryPanel->setNavBackwardList(backward_history);
- mCombinationGalleryPanel->setNavForwardList(forward_history);
- mCombinationGalleryPanel->setNavBackwardList(backward_history);
- mCombinationInventoryPanel->setSortOrder(sort_order);
- mCombinationGalleryPanel->setSortOrder(sort_order, true);
- }
-
- updateNavButtons();
-
- onFilterSelected();
- if((isListViewMode() && (mActivePanel->getFilterSubString() != mFilterSubString)) ||
- (isGalleryViewMode() && (mCombinationGalleryPanel->getFilterSubString() != mFilterSubString)))
- {
- onFilterEdit(mFilterSubString);
- }
- }
-}
-
-std::string LLPanelMainInventory::getLocalizedRootName()
-{
- return mSingleFolderMode ? get_localized_folder_name(getCurrentSFVRoot()) : "";
-}
-
-LLUUID LLPanelMainInventory::getCurrentSFVRoot()
-{
- if(isListViewMode())
- {
- return mCombinationInventoryPanel->getSingleFolderRoot();
- }
- if(isGalleryViewMode())
- {
- return mCombinationGalleryPanel->getRootFolder();
- }
- if(isCombinationViewMode())
- {
- return mCombinationInventoryPanel->getSingleFolderRoot();
- }
- return LLUUID::null;
-}
-
-LLInventoryFilter& LLPanelMainInventory::getCurrentFilter()
-{
- if(mSingleFolderMode && isGalleryViewMode())
- {
- return mCombinationGalleryPanel->getFilter();
- }
- else
- {
- return mActivePanel->getFilter();
- }
-}
-
-void LLPanelMainInventory::setGallerySelection(const LLUUID& item_id, bool new_window)
-{
- if(mSingleFolderMode && isGalleryViewMode())
- {
- mCombinationGalleryPanel->changeItemSelection(item_id, true);
- }
- else if(mSingleFolderMode && isCombinationViewMode())
- {
- if(mCombinationGalleryPanel->getFilter().checkAgainstFilterThumbnails(item_id))
- {
- mCombinationGalleryPanel->changeItemSelection(item_id, false);
- scrollToGallerySelection();
- }
- else
- {
- mCombinationInventoryPanel->setSelection(item_id, true);
- scrollToInvPanelSelection();
- }
- }
- else if (mSingleFolderMode && isListViewMode())
- {
- mCombinationInventoryPanel->setSelection(item_id, true);
- }
-}
-
-void LLPanelMainInventory::scrollToGallerySelection()
-{
- mCombinationGalleryPanel->scrollToShowItem(mCombinationGalleryPanel->getFirstSelectedItemID());
-}
-
-void LLPanelMainInventory::scrollToInvPanelSelection()
-{
- mCombinationInventoryPanel->getRootFolder()->scrollToShowSelection();
-}
-
-// List Commands //
-////////////////////////////////////////////////////////////////////////////////
+/**
+ * @file llpanelmaininventory.cpp
+ * @brief Implementation of llpanelmaininventory.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llpanelmaininventory.h"
+
+#include "llagent.h"
+#include "llagentbenefits.h"
+#include "llagentcamera.h"
+#include "llavataractions.h"
+#include "llcheckboxctrl.h"
+#include "llcombobox.h"
+#include "lldndbutton.h"
+#include "llfilepicker.h"
+#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
+#include "llinventorygallery.h"
+#include "llinventorymodelbackgroundfetch.h"
+#include "llfiltereditor.h"
+#include "llfloatersidepanelcontainer.h"
+#include "llfloaterreg.h"
+#include "llmenubutton.h"
+#include "lloutfitobserver.h"
+#include "llpanelmarketplaceinbox.h"
+#include "llpreviewtexture.h"
+#include "llresmgr.h"
+#include "llscrollcontainer.h"
+#include "llsdserialize.h"
+#include "llsdparam.h"
+#include "llspinctrl.h"
+#include "lltoggleablemenu.h"
+#include "lltooldraganddrop.h"
+#include "lltrans.h"
+#include "llviewermenu.h"
+#include "llviewertexturelist.h"
+#include "llviewerinventory.h"
+#include "llsidepanelinventory.h"
+#include "llfolderview.h"
+#include "llradiogroup.h"
+#include "llenvironment.h"
+#include "llweb.h"
+
+const std::string FILTERS_FILENAME("filters.xml");
+
+const std::string ALL_ITEMS("All Items");
+const std::string RECENT_ITEMS("Recent Items");
+const std::string WORN_ITEMS("Worn Items");
+
+static LLPanelInjector<LLPanelMainInventory> t_inventory("panel_main_inventory");
+
+///----------------------------------------------------------------------------
+/// LLFloaterInventoryFinder
+///----------------------------------------------------------------------------
+
+class LLFloaterInventoryFinder : public LLFloater
+{
+public:
+ LLFloaterInventoryFinder( LLPanelMainInventory* inventory_view);
+ virtual void draw();
+ /*virtual*/ bool postBuild();
+ void changeFilter(LLInventoryFilter* filter);
+ void updateElementsFromFilter();
+ bool getCheckShowEmpty();
+ bool getCheckSinceLogoff();
+ U32 getDateSearchDirection();
+
+ void onCreatorSelfFilterCommit();
+ void onCreatorOtherFilterCommit();
+
+ static void onTimeAgo(LLUICtrl*, void *);
+ static void onCloseBtn(void* user_data);
+ static void selectAllTypes(void* user_data);
+ static void selectNoTypes(void* user_data);
+private:
+ LLPanelMainInventory* mPanelMainInventory;
+ LLSpinCtrl* mSpinSinceDays;
+ LLSpinCtrl* mSpinSinceHours;
+ LLCheckBoxCtrl* mCreatorSelf;
+ LLCheckBoxCtrl* mCreatorOthers;
+ LLInventoryFilter* mFilter;
+};
+
+///----------------------------------------------------------------------------
+/// LLPanelMainInventory
+///----------------------------------------------------------------------------
+
+LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p)
+ : LLPanel(p),
+ mActivePanel(NULL),
+ mWornItemsPanel(NULL),
+ mSavedFolderState(NULL),
+ mFilterText(""),
+ mMenuGearDefault(NULL),
+ mMenuVisibility(NULL),
+ mMenuAddHandle(),
+ mNeedUploadCost(true),
+ mMenuViewDefault(NULL),
+ mSingleFolderMode(false),
+ mForceShowInvLayout(false),
+ mViewMode(MODE_COMBINATION),
+ mListViewRootUpdatedConnection(),
+ mGalleryRootUpdatedConnection()
+{
+ // Menu Callbacks (non contex menus)
+ mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelMainInventory::doToSelected, this, _2));
+ mCommitCallbackRegistrar.add("Inventory.CloseAllFolders", boost::bind(&LLPanelMainInventory::closeAllFolders, this));
+ mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH));
+ mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND));
+ mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLPanelMainInventory::doCreate, this, _2));
+ mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLPanelMainInventory::toggleFindOptions, this));
+ mCommitCallbackRegistrar.add("Inventory.ResetFilters", boost::bind(&LLPanelMainInventory::resetFilters, this));
+ mCommitCallbackRegistrar.add("Inventory.SetSortBy", boost::bind(&LLPanelMainInventory::setSortBy, this, _2));
+
+ mEnableCallbackRegistrar.add("Inventory.EnvironmentEnabled", [](LLUICtrl *, const LLSD &) { return LLPanelMainInventory::hasSettingsInventory(); });
+ mEnableCallbackRegistrar.add("Inventory.MaterialsEnabled", [](LLUICtrl *, const LLSD &) { return LLPanelMainInventory::hasMaterialsInventory(); });
+
+
+ mSavedFolderState = new LLSaveFolderState();
+ mSavedFolderState->setApply(false);
+}
+
+bool LLPanelMainInventory::postBuild()
+{
+ gInventory.addObserver(this);
+
+ mFilterTabs = getChild<LLTabContainer>("inventory filter tabs");
+ mFilterTabs->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterSelected, this));
+
+ mCounterCtrl = getChild<LLUICtrl>("ItemcountText");
+
+ //panel->getFilter().markDefault();
+
+ // Set up the default inv. panel/filter settings.
+ mActivePanel = getChild<LLInventoryPanel>(ALL_ITEMS);
+ if (mActivePanel)
+ {
+ // "All Items" is the previous only view, so it gets the InventorySortOrder
+ mActivePanel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER));
+ mActivePanel->getFilter().markDefault();
+ mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+ mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2));
+ mResortActivePanel = true;
+ }
+ LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>(RECENT_ITEMS);
+ if (recent_items_panel)
+ {
+ // assign default values until we will be sure that we have setting to restore
+ recent_items_panel->setSinceLogoff(true);
+ recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE);
+ recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+ LLInventoryFilter& recent_filter = recent_items_panel->getFilter();
+ recent_filter.setFilterObjectTypes(recent_filter.getFilterObjectTypes() & ~(0x1 << LLInventoryType::IT_CATEGORY));
+ recent_filter.setEmptyLookupMessage("InventoryNoMatchingRecentItems");
+ recent_filter.markDefault();
+ recent_items_panel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, recent_items_panel, _1, _2));
+ }
+
+ mWornItemsPanel = getChild<LLInventoryPanel>(WORN_ITEMS);
+ if (mWornItemsPanel)
+ {
+ U32 filter_types = 0x0;
+ filter_types |= 0x1 << LLInventoryType::IT_WEARABLE;
+ filter_types |= 0x1 << LLInventoryType::IT_ATTACHMENT;
+ filter_types |= 0x1 << LLInventoryType::IT_OBJECT;
+ mWornItemsPanel->setFilterTypes(filter_types);
+ mWornItemsPanel->setFilterWorn();
+ mWornItemsPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+ mWornItemsPanel->setFilterLinks(LLInventoryFilter::FILTERLINK_EXCLUDE_LINKS);
+ LLInventoryFilter& worn_filter = mWornItemsPanel->getFilter();
+ worn_filter.setFilterCategoryTypes(worn_filter.getFilterCategoryTypes() | (1ULL << LLFolderType::FT_INBOX));
+ worn_filter.markDefault();
+ mWornItemsPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mWornItemsPanel, _1, _2));
+ }
+ mSearchTypeCombo = getChild<LLComboBox>("search_type");
+ if(mSearchTypeCombo)
+ {
+ mSearchTypeCombo->setCommitCallback(boost::bind(&LLPanelMainInventory::onSelectSearchType, this));
+ }
+ // Now load the stored settings from disk, if available.
+ std::string filterSaveName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, FILTERS_FILENAME));
+ LL_INFOS("Inventory") << "LLPanelMainInventory::init: reading from " << filterSaveName << LL_ENDL;
+ llifstream file(filterSaveName.c_str());
+ LLSD savedFilterState;
+ if (file.is_open())
+ {
+ LLSDSerialize::fromXML(savedFilterState, file);
+ file.close();
+
+ // Load the persistent "Recent Items" settings.
+ // Note that the "All Items" settings do not persist.
+ if(recent_items_panel)
+ {
+ if(savedFilterState.has(recent_items_panel->getFilter().getName()))
+ {
+ LLSD recent_items = savedFilterState.get(
+ recent_items_panel->getFilter().getName());
+ LLInventoryFilter::Params p;
+ LLParamSDParser parser;
+ parser.readSD(recent_items, p);
+ recent_items_panel->getFilter().fromParams(p);
+ recent_items_panel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::RECENTITEMS_SORT_ORDER));
+ }
+ }
+ if(mActivePanel)
+ {
+ if(savedFilterState.has(mActivePanel->getFilter().getName()))
+ {
+ LLSD items = savedFilterState.get(mActivePanel->getFilter().getName());
+ LLInventoryFilter::Params p;
+ LLParamSDParser parser;
+ parser.readSD(items, p);
+ mActivePanel->getFilter().setSearchVisibilityTypes(p);
+ }
+ }
+
+ }
+
+ mFilterEditor = getChild<LLFilterEditor>("inventory search editor");
+ if (mFilterEditor)
+ {
+ mFilterEditor->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterEdit, this, _2));
+ }
+
+ mGearMenuButton = getChild<LLMenuButton>("options_gear_btn");
+ mVisibilityMenuButton = getChild<LLMenuButton>("options_visibility_btn");
+ mViewMenuButton = getChild<LLMenuButton>("view_btn");
+
+ mBackBtn = getChild<LLButton>("back_btn");
+ mForwardBtn = getChild<LLButton>("forward_btn");
+ mUpBtn = getChild<LLButton>("up_btn");
+ mViewModeBtn = getChild<LLButton>("view_mode_btn");
+ mNavigationBtnsPanel = getChild<LLLayoutPanel>("nav_buttons");
+
+ mDefaultViewPanel = getChild<LLPanel>("default_inventory_panel");
+ mCombinationViewPanel = getChild<LLPanel>("combination_view_inventory");
+ mCombinationGalleryLayoutPanel = getChild<LLLayoutPanel>("comb_gallery_layout");
+ mCombinationListLayoutPanel = getChild<LLLayoutPanel>("comb_inventory_layout");
+ mCombinationLayoutStack = getChild<LLLayoutStack>("combination_view_stack");
+
+ mCombinationInventoryPanel = getChild<LLInventorySingleFolderPanel>("comb_single_folder_inv");
+ LLInventoryFilter& comb_inv_filter = mCombinationInventoryPanel->getFilter();
+ comb_inv_filter.setFilterThumbnails(LLInventoryFilter::FILTER_EXCLUDE_THUMBNAILS);
+ comb_inv_filter.markDefault();
+ mCombinationInventoryPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onCombinationInventorySelectionChanged, this, _1, _2));
+ mListViewRootUpdatedConnection = mCombinationInventoryPanel->setRootChangedCallback(boost::bind(&LLPanelMainInventory::onCombinationRootChanged, this, false));
+
+ mCombinationGalleryPanel = getChild<LLInventoryGallery>("comb_gallery_view_inv");
+ mCombinationGalleryPanel->setSortOrder(mCombinationInventoryPanel->getSortOrder());
+ LLInventoryFilter& comb_gallery_filter = mCombinationGalleryPanel->getFilter();
+ comb_gallery_filter.setFilterThumbnails(LLInventoryFilter::FILTER_ONLY_THUMBNAILS);
+ comb_gallery_filter.markDefault();
+ mGalleryRootUpdatedConnection = mCombinationGalleryPanel->setRootChangedCallback(boost::bind(&LLPanelMainInventory::onCombinationRootChanged, this, true));
+ mCombinationGalleryPanel->setSelectionChangeCallback(boost::bind(&LLPanelMainInventory::onCombinationGallerySelectionChanged, this, _1));
+
+ initListCommandsHandlers();
+
+ const std::string texture_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getTextureUploadCost());
+ const std::string sound_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getSoundUploadCost());
+ const std::string animation_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getAnimationUploadCost());
+
+ LLMenuGL* menu = (LLMenuGL*)mMenuAddHandle.get();
+ if (menu)
+ {
+ menu->getChild<LLMenuItemGL>("Upload Image")->setLabelArg("[COST]", texture_upload_cost_str);
+ menu->getChild<LLMenuItemGL>("Upload Sound")->setLabelArg("[COST]", sound_upload_cost_str);
+ menu->getChild<LLMenuItemGL>("Upload Animation")->setLabelArg("[COST]", animation_upload_cost_str);
+ }
+
+ // Trigger callback for focus received so we can deselect items in inbox/outbox
+ LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLPanelMainInventory::onFocusReceived, this));
+
+ return true;
+}
+
+// Destroys the object
+LLPanelMainInventory::~LLPanelMainInventory( void )
+{
+ // Save the filters state.
+ // Some params types cannot be saved this way
+ // for example, LLParamSDParser doesn't know about U64,
+ // so some FilterOps params should be revised.
+ LLSD filterRoot;
+ LLInventoryPanel* all_items_panel = getChild<LLInventoryPanel>(ALL_ITEMS);
+ if (all_items_panel)
+ {
+ LLSD filterState;
+ LLInventoryPanel::InventoryState p;
+ all_items_panel->getFilter().toParams(p.filter);
+ all_items_panel->getRootViewModel().getSorter().toParams(p.sort);
+ if (p.validateBlock(false))
+ {
+ LLParamSDParser().writeSD(filterState, p);
+ filterRoot[all_items_panel->getName()] = filterState;
+ }
+ }
+
+ LLInventoryPanel* panel = findChild<LLInventoryPanel>(RECENT_ITEMS);
+ if (panel)
+ {
+ LLSD filterState;
+ LLInventoryPanel::InventoryState p;
+ panel->getFilter().toParams(p.filter);
+ panel->getRootViewModel().getSorter().toParams(p.sort);
+ if (p.validateBlock(false))
+ {
+ LLParamSDParser().writeSD(filterState, p);
+ filterRoot[panel->getName()] = filterState;
+ }
+ }
+
+ std::string filterSaveName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, FILTERS_FILENAME));
+ llofstream filtersFile(filterSaveName.c_str());
+ if(!LLSDSerialize::toPrettyXML(filterRoot, filtersFile))
+ {
+ LL_WARNS() << "Could not write to filters save file " << filterSaveName << LL_ENDL;
+ }
+ else
+ {
+ filtersFile.close();
+ }
+
+ gInventory.removeObserver(this);
+ delete mSavedFolderState;
+
+ auto menu = mMenuAddHandle.get();
+ if(menu)
+ {
+ menu->die();
+ mMenuAddHandle.markDead();
+ }
+
+ if (mListViewRootUpdatedConnection.connected())
+ {
+ mListViewRootUpdatedConnection.disconnect();
+ }
+ if (mGalleryRootUpdatedConnection.connected())
+ {
+ mGalleryRootUpdatedConnection.disconnect();
+ }
+}
+
+LLInventoryPanel* LLPanelMainInventory::getAllItemsPanel()
+{
+ return getChild<LLInventoryPanel>(ALL_ITEMS);
+}
+
+void LLPanelMainInventory::selectAllItemsPanel()
+{
+ mFilterTabs->selectFirstTab();
+}
+
+bool LLPanelMainInventory::isRecentItemsPanelSelected()
+{
+ return (RECENT_ITEMS == getActivePanel()->getName());
+}
+
+void LLPanelMainInventory::startSearch()
+{
+ // this forces focus to line editor portion of search editor
+ if (mFilterEditor)
+ {
+ mFilterEditor->focusFirstItem(true);
+ }
+}
+
+bool LLPanelMainInventory::handleKeyHere(KEY key, MASK mask)
+{
+ LLFolderView* root_folder = mActivePanel ? mActivePanel->getRootFolder() : NULL;
+ if (root_folder)
+ {
+ // first check for user accepting current search results
+ if (mFilterEditor
+ && mFilterEditor->hasFocus()
+ && (key == KEY_RETURN
+ || key == KEY_DOWN)
+ && mask == MASK_NONE)
+ {
+ // move focus to inventory proper
+ mActivePanel->setFocus(true);
+ root_folder->scrollToShowSelection();
+ return true;
+ }
+
+ if (mActivePanel->hasFocus() && key == KEY_UP)
+ {
+ startSearch();
+ }
+ if(mSingleFolderMode && key == KEY_LEFT)
+ {
+ onBackFolderClicked();
+ }
+ }
+
+ return LLPanel::handleKeyHere(key, mask);
+
+}
+
+//----------------------------------------------------------------------------
+// menu callbacks
+
+void LLPanelMainInventory::doToSelected(const LLSD& userdata)
+{
+ getPanel()->doToSelected(userdata);
+}
+
+void LLPanelMainInventory::closeAllFolders()
+{
+ getPanel()->getRootFolder()->closeAllFolders();
+}
+
+S32 get_instance_num()
+{
+ static S32 instance_num = 0;
+ instance_num = (instance_num + 1) % S32_MAX;
+
+ return instance_num;
+}
+
+LLFloaterSidePanelContainer* LLPanelMainInventory::newWindow()
+{
+ S32 instance_num = get_instance_num();
+
+ if (!gAgentCamera.cameraMouselook())
+ {
+ LLFloaterSidePanelContainer* floater = LLFloaterReg::showTypedInstance<LLFloaterSidePanelContainer>("inventory", LLSD(instance_num));
+ LLSidepanelInventory* sidepanel_inventory = floater->findChild<LLSidepanelInventory>("main_panel");
+ sidepanel_inventory->initInventoryViews();
+ return floater;
+ }
+ return NULL;
+}
+
+//static
+void LLPanelMainInventory::newFolderWindow(LLUUID folder_id, LLUUID item_to_select)
+{
+ LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
+ for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end();)
+ {
+ LLFloaterSidePanelContainer* inventory_container = dynamic_cast<LLFloaterSidePanelContainer*>(*iter++);
+ if (inventory_container)
+ {
+ LLSidepanelInventory* sidepanel_inventory = dynamic_cast<LLSidepanelInventory*>(inventory_container->findChild<LLPanel>("main_panel", true));
+ if (sidepanel_inventory)
+ {
+ LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();
+ if (main_inventory && main_inventory->isSingleFolderMode()
+ && (main_inventory->getCurrentSFVRoot() == folder_id))
+ {
+ main_inventory->setFocus(true);
+ if(item_to_select.notNull())
+ {
+ main_inventory->setGallerySelection(item_to_select);
+ }
+ return;
+ }
+ }
+ }
+ }
+
+ S32 instance_num = get_instance_num();
+
+ LLFloaterSidePanelContainer* inventory_container = LLFloaterReg::showTypedInstance<LLFloaterSidePanelContainer>("inventory", LLSD(instance_num));
+ if(inventory_container)
+ {
+ LLSidepanelInventory* sidepanel_inventory = dynamic_cast<LLSidepanelInventory*>(inventory_container->findChild<LLPanel>("main_panel", true));
+ if (sidepanel_inventory)
+ {
+ LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();
+ if (main_inventory)
+ {
+ main_inventory->initSingleFolderRoot(folder_id);
+ main_inventory->toggleViewMode();
+ if(folder_id.notNull())
+ {
+ if(item_to_select.notNull())
+ {
+ main_inventory->setGallerySelection(item_to_select, true);
+ }
+ }
+ }
+ }
+ }
+}
+
+void LLPanelMainInventory::doCreate(const LLSD& userdata)
+{
+ reset_inventory_filter();
+ if(mSingleFolderMode)
+ {
+ if(isListViewMode() || isCombinationViewMode())
+ {
+ LLFolderViewItem* current_folder = getActivePanel()->getRootFolder();
+ if (current_folder)
+ {
+ if(isCombinationViewMode())
+ {
+ mForceShowInvLayout = true;
+ }
+
+ LLHandle<LLPanel> handle = getHandle();
+ std::function<void(const LLUUID&)> callback_created = [handle](const LLUUID& new_id)
+ {
+ gInventory.notifyObservers(); // not really needed, should have been already done
+ LLPanelMainInventory* panel = (LLPanelMainInventory*)handle.get();
+ if (new_id.notNull() && panel)
+ {
+ // 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);
+ }
+ }
+ else
+ {
+ LLHandle<LLPanel> handle = getHandle();
+ std::function<void(const LLUUID&)> callback_created = [handle](const LLUUID &new_id)
+ {
+ gInventory.notifyObservers(); // not really needed, should have been already done
+ if (new_id.notNull())
+ {
+ LLPanelMainInventory* panel = (LLPanelMainInventory*)handle.get();
+ if (panel)
+ {
+ panel->setGallerySelection(new_id);
+ LL_DEBUGS("Inventory") << "Done creating inventory: " << new_id << LL_ENDL;
+ }
+ }
+ };
+ menu_create_inventory_item(NULL, getCurrentSFVRoot(), userdata, LLUUID::null, callback_created);
+ }
+ }
+ else
+ {
+ menu_create_inventory_item(getPanel(), NULL, userdata);
+ }
+}
+
+void LLPanelMainInventory::resetFilters()
+{
+ LLFloaterInventoryFinder *finder = getFinder();
+ getCurrentFilter().resetDefault();
+ if (finder)
+ {
+ finder->updateElementsFromFilter();
+ }
+
+ setFilterTextFromFilter();
+}
+
+void LLPanelMainInventory::resetAllItemsFilters()
+{
+ LLFloaterInventoryFinder *finder = getFinder();
+ getAllItemsPanel()->getFilter().resetDefault();
+ if (finder)
+ {
+ finder->updateElementsFromFilter();
+ }
+
+ setFilterTextFromFilter();
+}
+
+void LLPanelMainInventory::findLinks(const LLUUID& item_id, const std::string& item_name)
+{
+ mFilterSubString = item_name;
+
+ LLInventoryFilter &filter = mActivePanel->getFilter();
+ filter.setFindAllLinksMode(item_name, item_id);
+
+ mFilterEditor->setText(item_name);
+ mFilterEditor->setFocus(true);
+}
+
+void LLPanelMainInventory::setSortBy(const LLSD& userdata)
+{
+ U32 sort_order_mask = getActivePanel()->getSortOrder();
+ std::string sort_type = userdata.asString();
+ if (sort_type == "name")
+ {
+ sort_order_mask &= ~LLInventoryFilter::SO_DATE;
+ }
+ else if (sort_type == "date")
+ {
+ sort_order_mask |= LLInventoryFilter::SO_DATE;
+ }
+ else if (sort_type == "foldersalwaysbyname")
+ {
+ if ( sort_order_mask & LLInventoryFilter::SO_FOLDERS_BY_NAME )
+ {
+ sort_order_mask &= ~LLInventoryFilter::SO_FOLDERS_BY_NAME;
+ }
+ else
+ {
+ sort_order_mask |= LLInventoryFilter::SO_FOLDERS_BY_NAME;
+ }
+ }
+ else if (sort_type == "systemfolderstotop")
+ {
+ if ( sort_order_mask & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP )
+ {
+ sort_order_mask &= ~LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
+ }
+ else
+ {
+ sort_order_mask |= LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
+ }
+ }
+ if(mSingleFolderMode && !isListViewMode())
+ {
+ mCombinationGalleryPanel->setSortOrder(sort_order_mask, true);
+ }
+
+ getActivePanel()->setSortOrder(sort_order_mask);
+ if (isRecentItemsPanelSelected())
+ {
+ gSavedSettings.setU32("RecentItemsSortOrder", sort_order_mask);
+ }
+ else
+ {
+ gSavedSettings.setU32("InventorySortOrder", sort_order_mask);
+ }
+}
+
+void LLPanelMainInventory::onSelectSearchType()
+{
+ std::string new_type = mSearchTypeCombo->getValue();
+ if (new_type == "search_by_name")
+ {
+ setSearchType(LLInventoryFilter::SEARCHTYPE_NAME);
+ }
+ if (new_type == "search_by_creator")
+ {
+ setSearchType(LLInventoryFilter::SEARCHTYPE_CREATOR);
+ }
+ if (new_type == "search_by_description")
+ {
+ setSearchType(LLInventoryFilter::SEARCHTYPE_DESCRIPTION);
+ }
+ if (new_type == "search_by_UUID")
+ {
+ setSearchType(LLInventoryFilter::SEARCHTYPE_UUID);
+ }
+}
+
+void LLPanelMainInventory::setSearchType(LLInventoryFilter::ESearchType type)
+{
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ mCombinationGalleryPanel->setSearchType(type);
+ }
+ if(mSingleFolderMode && isCombinationViewMode())
+ {
+ mCombinationInventoryPanel->setSearchType(type);
+ mCombinationGalleryPanel->setSearchType(type);
+ }
+ else
+ {
+ getActivePanel()->setSearchType(type);
+ }
+}
+
+void LLPanelMainInventory::updateSearchTypeCombo()
+{
+ LLInventoryFilter::ESearchType search_type(LLInventoryFilter::SEARCHTYPE_NAME);
+
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ search_type = mCombinationGalleryPanel->getSearchType();
+ }
+ else if(mSingleFolderMode && isCombinationViewMode())
+ {
+ search_type = mCombinationGalleryPanel->getSearchType();
+ }
+ else
+ {
+ search_type = getActivePanel()->getSearchType();
+ }
+
+ switch(search_type)
+ {
+ case LLInventoryFilter::SEARCHTYPE_CREATOR:
+ mSearchTypeCombo->setValue("search_by_creator");
+ break;
+ case LLInventoryFilter::SEARCHTYPE_DESCRIPTION:
+ mSearchTypeCombo->setValue("search_by_description");
+ break;
+ case LLInventoryFilter::SEARCHTYPE_UUID:
+ mSearchTypeCombo->setValue("search_by_UUID");
+ break;
+ case LLInventoryFilter::SEARCHTYPE_NAME:
+ default:
+ mSearchTypeCombo->setValue("search_by_name");
+ break;
+ }
+}
+
+// static
+bool LLPanelMainInventory::filtersVisible(void* user_data)
+{
+ LLPanelMainInventory* self = (LLPanelMainInventory*)user_data;
+ if(!self) return false;
+
+ return self->getFinder() != NULL;
+}
+
+void LLPanelMainInventory::onClearSearch()
+{
+ bool initially_active = false;
+ LLFloater *finder = getFinder();
+ if (mActivePanel && (getActivePanel() != mWornItemsPanel))
+ {
+ initially_active = mActivePanel->getFilter().isNotDefault();
+ setFilterSubString(LLStringUtil::null);
+ mActivePanel->setFilterTypes(0xffffffffffffffffULL);
+ mActivePanel->setFilterLinks(LLInventoryFilter::FILTERLINK_INCLUDE_LINKS);
+ }
+
+ if (finder)
+ {
+ LLFloaterInventoryFinder::selectAllTypes(finder);
+ }
+
+ // re-open folders that were initially open in case filter was active
+ if (mActivePanel && (mFilterSubString.size() || initially_active) && !mSingleFolderMode)
+ {
+ mSavedFolderState->setApply(true);
+ mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+ LLOpenFoldersWithSelection opener;
+ mActivePanel->getRootFolder()->applyFunctorRecursively(opener);
+ mActivePanel->getRootFolder()->scrollToShowSelection();
+ }
+ mFilterSubString = "";
+
+ LLSidepanelInventory * sidepanel_inventory = getParentSidepanelInventory();
+ if (sidepanel_inventory)
+ {
+ LLPanelMarketplaceInbox* inbox_panel = sidepanel_inventory->getChild<LLPanelMarketplaceInbox>("marketplace_inbox");
+ if (inbox_panel)
+ {
+ inbox_panel->onClearSearch();
+ }
+ }
+}
+
+void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
+{
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ mFilterSubString = search_string;
+ mCombinationGalleryPanel->setFilterSubString(mFilterSubString);
+ return;
+ }
+ if(mSingleFolderMode && isCombinationViewMode())
+ {
+ mCombinationGalleryPanel->setFilterSubString(search_string);
+ }
+
+ if (search_string == "")
+ {
+ onClearSearch();
+ }
+
+ if (!mActivePanel)
+ {
+ return;
+ }
+
+ if (!LLInventoryModelBackgroundFetch::instance().inventoryFetchStarted())
+ {
+ llassert(false); // this should have been done on startup
+ LLInventoryModelBackgroundFetch::instance().start();
+ }
+
+ mFilterSubString = search_string;
+ if (mActivePanel->getFilterSubString().empty() && mFilterSubString.empty())
+ {
+ // current filter and new filter empty, do nothing
+ return;
+ }
+
+ // save current folder open state if no filter currently applied
+ if (!mActivePanel->getFilter().isNotDefault())
+ {
+ mSavedFolderState->setApply(false);
+ mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+ }
+
+ // set new filter string
+ setFilterSubString(mFilterSubString);
+
+ LLSidepanelInventory * sidepanel_inventory = getParentSidepanelInventory();
+ if (sidepanel_inventory)
+ {
+ LLPanelMarketplaceInbox* inbox_panel = sidepanel_inventory->getChild<LLPanelMarketplaceInbox>("marketplace_inbox");
+ if (inbox_panel)
+ {
+ inbox_panel->onFilterEdit(search_string);
+ }
+ }
+}
+
+
+ //static
+ bool LLPanelMainInventory::incrementalFind(LLFolderViewItem* first_item, const char *find_text, bool backward)
+ {
+ LLPanelMainInventory* active_view = NULL;
+
+ LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
+ for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
+ {
+ LLPanelMainInventory* iv = dynamic_cast<LLPanelMainInventory*>(*iter);
+ if (iv)
+ {
+ if (gFocusMgr.childHasKeyboardFocus(iv))
+ {
+ active_view = iv;
+ break;
+ }
+ }
+ }
+
+ if (!active_view)
+ {
+ return false;
+ }
+
+ std::string search_string(find_text);
+
+ if (search_string.empty())
+ {
+ return false;
+ }
+
+ if (active_view->getPanel() &&
+ active_view->getPanel()->getRootFolder()->search(first_item, search_string, backward))
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+void LLPanelMainInventory::onFilterSelected()
+{
+ // Find my index
+ setActivePanel();
+
+ if (!mActivePanel)
+ {
+ return;
+ }
+
+ if (getActivePanel() == mWornItemsPanel)
+ {
+ mActivePanel->openAllFolders();
+ }
+ updateSearchTypeCombo();
+ setFilterSubString(mFilterSubString);
+ LLInventoryFilter& filter = getCurrentFilter();
+ LLFloaterInventoryFinder *finder = getFinder();
+ if (finder)
+ {
+ finder->changeFilter(&filter);
+ if (mSingleFolderMode)
+ {
+ finder->setTitle(getLocalizedRootName());
+ }
+ }
+ if (filter.isActive() && !LLInventoryModelBackgroundFetch::instance().inventoryFetchStarted())
+ {
+ llassert(false); // this should have been done on startup
+ LLInventoryModelBackgroundFetch::instance().start();
+ }
+ setFilterTextFromFilter();
+}
+
+const std::string LLPanelMainInventory::getFilterSubString()
+{
+ return mActivePanel->getFilterSubString();
+}
+
+void LLPanelMainInventory::setFilterSubString(const std::string& string)
+{
+ mActivePanel->setFilterSubString(string);
+}
+
+bool LLPanelMainInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, bool drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ // Check to see if we are auto scrolling from the last frame
+ LLInventoryPanel* panel = (LLInventoryPanel*)this->getActivePanel();
+ bool needsToScroll = panel->getScrollableContainer()->canAutoScroll(x, y);
+ if(mFilterTabs)
+ {
+ if(needsToScroll)
+ {
+ mFilterTabs->startDragAndDropDelayTimer();
+ }
+ }
+
+ bool handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+
+ return handled;
+}
+
+// virtual
+void LLPanelMainInventory::changed(U32)
+{
+ updateItemcountText();
+}
+
+void LLPanelMainInventory::setFocusFilterEditor()
+{
+ if(mFilterEditor)
+ {
+ mFilterEditor->setFocus(true);
+ }
+}
+
+// virtual
+void LLPanelMainInventory::draw()
+{
+ if (mActivePanel && mFilterEditor)
+ {
+ mFilterEditor->setText(mFilterSubString);
+ }
+ if (mActivePanel && mResortActivePanel)
+ {
+ // EXP-756: Force resorting of the list the first time we draw the list:
+ // In the case of date sorting, we don't have enough information at initialization time
+ // to correctly sort the folders. Later manual resort doesn't do anything as the order value is
+ // set correctly. The workaround is to reset the order to alphabetical (or anything) then to the correct order.
+ U32 order = mActivePanel->getSortOrder();
+ mActivePanel->setSortOrder(LLInventoryFilter::SO_NAME);
+ mActivePanel->setSortOrder(order);
+ mResortActivePanel = false;
+ }
+ LLPanel::draw();
+ updateItemcountText();
+ updateCombinationVisibility();
+}
+
+void LLPanelMainInventory::updateItemcountText()
+{
+ if(mItemCount != gInventory.getItemCount())
+ {
+ mItemCount = gInventory.getItemCount();
+ mItemCountString = "";
+ LLLocale locale(LLLocale::USER_LOCALE);
+ LLResMgr::getInstance()->getIntegerString(mItemCountString, mItemCount);
+ }
+
+ if(mCategoryCount != gInventory.getCategoryCount())
+ {
+ mCategoryCount = gInventory.getCategoryCount();
+ mCategoryCountString = "";
+ LLLocale locale(LLLocale::USER_LOCALE);
+ LLResMgr::getInstance()->getIntegerString(mCategoryCountString, mCategoryCount);
+ }
+
+ LLStringUtil::format_map_t string_args;
+ string_args["[ITEM_COUNT]"] = mItemCountString;
+ string_args["[CATEGORY_COUNT]"] = mCategoryCountString;
+ string_args["[FILTER]"] = getFilterText();
+
+ std::string text = "";
+
+ if (LLInventoryModelBackgroundFetch::instance().folderFetchActive())
+ {
+ text = getString("ItemcountFetching", string_args);
+ }
+ else if (LLInventoryModelBackgroundFetch::instance().isEverythingFetched())
+ {
+ text = getString("ItemcountCompleted", string_args);
+ }
+ else
+ {
+ text = getString("ItemcountUnknown", string_args);
+ }
+
+ if (mSingleFolderMode)
+ {
+ LLInventoryModel::cat_array_t *cats;
+ LLInventoryModel::item_array_t *items;
+
+ gInventory.getDirectDescendentsOf(getCurrentSFVRoot(), cats, items);
+
+ if (items && cats)
+ {
+ string_args["[ITEM_COUNT]"] = llformat("%d", items->size());
+ string_args["[CATEGORY_COUNT]"] = llformat("%d", cats->size());
+ text = getString("ItemcountCompleted", string_args);
+ }
+ }
+
+ mCounterCtrl->setValue(text);
+ mCounterCtrl->setToolTip(text);
+}
+
+void LLPanelMainInventory::onFocusReceived()
+{
+ LLSidepanelInventory *sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+ if (!sidepanel_inventory)
+ {
+ LL_WARNS() << "Could not find Inventory Panel in My Inventory floater" << LL_ENDL;
+ return;
+ }
+
+ sidepanel_inventory->clearSelections(false, true);
+}
+
+void LLPanelMainInventory::setFilterTextFromFilter()
+{
+ mFilterText = getCurrentFilter().getFilterText();
+}
+
+void LLPanelMainInventory::toggleFindOptions()
+{
+ LLFloater *floater = getFinder();
+ if (!floater)
+ {
+ LLFloaterInventoryFinder * finder = new LLFloaterInventoryFinder(this);
+ mFinderHandle = finder->getHandle();
+ finder->openFloater();
+
+ LLFloater* parent_floater = gFloaterView->getParentFloater(this);
+ if (parent_floater)
+ parent_floater->addDependentFloater(mFinderHandle);
+
+ if (!LLInventoryModelBackgroundFetch::instance().inventoryFetchStarted())
+ {
+ llassert(false); // this should have been done on startup
+ LLInventoryModelBackgroundFetch::instance().start();
+ }
+
+ if (mSingleFolderMode)
+ {
+ finder->setTitle(getLocalizedRootName());
+ }
+ }
+ else
+ {
+ floater->closeFloater();
+ }
+}
+
+void LLPanelMainInventory::setSelectCallback(const LLFolderView::signal_t::slot_type& cb)
+{
+ getChild<LLInventoryPanel>(ALL_ITEMS)->setSelectCallback(cb);
+ getChild<LLInventoryPanel>(RECENT_ITEMS)->setSelectCallback(cb);
+}
+
+void LLPanelMainInventory::onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, bool user_action)
+{
+ updateListCommands();
+ panel->onSelectionChange(items, user_action);
+}
+
+///----------------------------------------------------------------------------
+/// LLFloaterInventoryFinder
+///----------------------------------------------------------------------------
+
+LLFloaterInventoryFinder* LLPanelMainInventory::getFinder()
+{
+ return (LLFloaterInventoryFinder*)mFinderHandle.get();
+}
+
+
+LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLPanelMainInventory* inventory_view) :
+ LLFloater(LLSD()),
+ mPanelMainInventory(inventory_view),
+ mFilter(&inventory_view->getPanel()->getFilter())
+{
+ buildFromFile("floater_inventory_view_finder.xml");
+ updateElementsFromFilter();
+}
+
+bool LLFloaterInventoryFinder::postBuild()
+{
+ const LLRect& viewrect = mPanelMainInventory->getRect();
+ setRect(LLRect(viewrect.mLeft - getRect().getWidth(), viewrect.mTop, viewrect.mLeft, viewrect.mTop - getRect().getHeight()));
+
+ childSetAction("All", selectAllTypes, this);
+ childSetAction("None", selectNoTypes, this);
+
+ mSpinSinceHours = getChild<LLSpinCtrl>("spin_hours_ago");
+ childSetCommitCallback("spin_hours_ago", onTimeAgo, this);
+
+ mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago");
+ childSetCommitCallback("spin_days_ago", onTimeAgo, this);
+
+ mCreatorSelf = getChild<LLCheckBoxCtrl>("check_created_by_me");
+ mCreatorOthers = getChild<LLCheckBoxCtrl>("check_created_by_others");
+ mCreatorSelf->setCommitCallback(boost::bind(&LLFloaterInventoryFinder::onCreatorSelfFilterCommit, this));
+ mCreatorOthers->setCommitCallback(boost::bind(&LLFloaterInventoryFinder::onCreatorOtherFilterCommit, this));
+
+ childSetAction("Close", onCloseBtn, this);
+
+ updateElementsFromFilter();
+ return true;
+}
+void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data)
+{
+ LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data;
+ if (!self) return;
+
+ if ( self->mSpinSinceDays->get() || self->mSpinSinceHours->get() )
+ {
+ self->getChild<LLUICtrl>("check_since_logoff")->setValue(false);
+
+ U32 days = (U32)self->mSpinSinceDays->get();
+ U32 hours = (U32)self->mSpinSinceHours->get();
+ if (hours >= 24)
+ {
+ // Try to handle both cases of spinner clicking and text input in a sensible fashion as best as possible.
+ // There is no way to tell if someone has clicked the spinner to get to 24 or input 24 manually, so in
+ // this case add to days. Any value > 24 means they have input the hours manually, so do not add to the
+ // current day value.
+ if (24 == hours) // Got to 24 via spinner clicking or text input of 24
+ {
+ days = days + hours / 24;
+ }
+ else // Text input, so do not add to days
+ {
+ days = hours / 24;
+ }
+ hours = (U32)hours % 24;
+ self->mSpinSinceHours->setFocus(false);
+ self->mSpinSinceDays->setFocus(false);
+ self->mSpinSinceDays->set((F32)days);
+ self->mSpinSinceHours->set((F32)hours);
+ self->mSpinSinceHours->setFocus(true);
+ }
+ }
+}
+
+void LLFloaterInventoryFinder::changeFilter(LLInventoryFilter* filter)
+{
+ mFilter = filter;
+ updateElementsFromFilter();
+}
+
+void LLFloaterInventoryFinder::updateElementsFromFilter()
+{
+ if (!mFilter)
+ return;
+
+ // Get data needed for filter display
+ U32 filter_types = mFilter->getFilterObjectTypes();
+ LLInventoryFilter::EFolderShow show_folders = mFilter->getShowFolderState();
+ U32 hours = mFilter->getHoursAgo();
+ U32 date_search_direction = mFilter->getDateSearchDirection();
+
+ LLInventoryFilter::EFilterCreatorType filter_creator = mFilter->getFilterCreatorType();
+ bool show_created_by_me = ((filter_creator == LLInventoryFilter::FILTERCREATOR_ALL) || (filter_creator == LLInventoryFilter::FILTERCREATOR_SELF));
+ bool show_created_by_others = ((filter_creator == LLInventoryFilter::FILTERCREATOR_ALL) || (filter_creator == LLInventoryFilter::FILTERCREATOR_OTHERS));
+
+ // update the ui elements
+ setTitle(mFilter->getName());
+
+ getChild<LLUICtrl>("check_animation")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_ANIMATION));
+
+ getChild<LLUICtrl>("check_calling_card")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_CALLINGCARD));
+ getChild<LLUICtrl>("check_clothing")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE));
+ getChild<LLUICtrl>("check_gesture")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE));
+ getChild<LLUICtrl>("check_landmark")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK));
+ getChild<LLUICtrl>("check_material")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_MATERIAL));
+ getChild<LLUICtrl>("check_notecard")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD));
+ getChild<LLUICtrl>("check_object")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT));
+ getChild<LLUICtrl>("check_script")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_LSL));
+ getChild<LLUICtrl>("check_sound")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_SOUND));
+ getChild<LLUICtrl>("check_texture")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE));
+ getChild<LLUICtrl>("check_snapshot")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT));
+ getChild<LLUICtrl>("check_settings")->setValue((S32)(filter_types & 0x1 << LLInventoryType::IT_SETTINGS));
+ getChild<LLUICtrl>("check_show_empty")->setValue(show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS);
+
+ getChild<LLUICtrl>("check_created_by_me")->setValue(show_created_by_me);
+ getChild<LLUICtrl>("check_created_by_others")->setValue(show_created_by_others);
+
+ getChild<LLUICtrl>("check_since_logoff")->setValue(mFilter->isSinceLogoff());
+ mSpinSinceHours->set((F32)(hours % 24));
+ mSpinSinceDays->set((F32)(hours / 24));
+ getChild<LLRadioGroup>("date_search_direction")->setSelectedIndex(date_search_direction);
+}
+
+void LLFloaterInventoryFinder::draw()
+{
+ U64 filter = 0xffffffffffffffffULL;
+ bool filtered_by_all_types = true;
+
+ if (!getChild<LLUICtrl>("check_animation")->getValue())
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_ANIMATION);
+ filtered_by_all_types = false;
+ }
+
+
+ if (!getChild<LLUICtrl>("check_calling_card")->getValue())
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_CALLINGCARD);
+ filtered_by_all_types = false;
+ }
+
+ if (!getChild<LLUICtrl>("check_clothing")->getValue())
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_WEARABLE);
+ filtered_by_all_types = false;
+ }
+
+ if (!getChild<LLUICtrl>("check_gesture")->getValue())
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_GESTURE);
+ filtered_by_all_types = false;
+ }
+
+ if (!getChild<LLUICtrl>("check_landmark")->getValue())
+
+
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_LANDMARK);
+ filtered_by_all_types = false;
+ }
+
+ if (!getChild<LLUICtrl>("check_material")->getValue())
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_MATERIAL);
+ filtered_by_all_types = false;
+ }
+
+ if (!getChild<LLUICtrl>("check_notecard")->getValue())
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_NOTECARD);
+ filtered_by_all_types = false;
+ }
+
+ if (!getChild<LLUICtrl>("check_object")->getValue())
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_OBJECT);
+ filter &= ~(0x1 << LLInventoryType::IT_ATTACHMENT);
+ filtered_by_all_types = false;
+ }
+
+ if (!getChild<LLUICtrl>("check_script")->getValue())
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_LSL);
+ filtered_by_all_types = false;
+ }
+
+ if (!getChild<LLUICtrl>("check_sound")->getValue())
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_SOUND);
+ filtered_by_all_types = false;
+ }
+
+ if (!getChild<LLUICtrl>("check_texture")->getValue())
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_TEXTURE);
+ filtered_by_all_types = false;
+ }
+
+ if (!getChild<LLUICtrl>("check_snapshot")->getValue())
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_SNAPSHOT);
+ filtered_by_all_types = false;
+ }
+
+ if (!getChild<LLUICtrl>("check_settings")->getValue())
+ {
+ filter &= ~(0x1 << LLInventoryType::IT_SETTINGS);
+ filtered_by_all_types = false;
+ }
+
+ if (!filtered_by_all_types || (mPanelMainInventory->getPanel()->getFilter().getFilterTypes() & LLInventoryFilter::FILTERTYPE_DATE))
+ {
+ // don't include folders in filter, unless I've selected everything or filtering by date
+ filter &= ~(0x1 << LLInventoryType::IT_CATEGORY);
+ }
+
+
+ bool is_sf_mode = mPanelMainInventory->isSingleFolderMode();
+ if(is_sf_mode && mPanelMainInventory->isGalleryViewMode())
+ {
+ mPanelMainInventory->mCombinationGalleryPanel->getFilter().setShowFolderState(getCheckShowEmpty() ?
+ LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+ mPanelMainInventory->mCombinationGalleryPanel->getFilter().setFilterObjectTypes(filter);
+ }
+ else
+ {
+ if(is_sf_mode && mPanelMainInventory->isCombinationViewMode())
+ {
+ mPanelMainInventory->mCombinationGalleryPanel->getFilter().setShowFolderState(getCheckShowEmpty() ?
+ LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+ mPanelMainInventory->mCombinationGalleryPanel->getFilter().setFilterObjectTypes(filter);
+ }
+ // update the panel, panel will update the filter
+ mPanelMainInventory->getPanel()->setShowFolderState(getCheckShowEmpty() ?
+ LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+ mPanelMainInventory->getPanel()->setFilterTypes(filter);
+ }
+
+ if (getCheckSinceLogoff())
+ {
+ mSpinSinceDays->set(0);
+ mSpinSinceHours->set(0);
+ }
+ U32 days = (U32)mSpinSinceDays->get();
+ U32 hours = (U32)mSpinSinceHours->get();
+ if (hours >= 24)
+ {
+ days = hours / 24;
+ hours = (U32)hours % 24;
+ // A UI element that has focus will not display a new value set to it
+ mSpinSinceHours->setFocus(false);
+ mSpinSinceDays->setFocus(false);
+ mSpinSinceDays->set((F32)days);
+ mSpinSinceHours->set((F32)hours);
+ mSpinSinceHours->setFocus(true);
+ }
+ hours += days * 24;
+
+
+ mPanelMainInventory->setFilterTextFromFilter();
+ if(is_sf_mode && mPanelMainInventory->isGalleryViewMode())
+ {
+ mPanelMainInventory->mCombinationGalleryPanel->getFilter().setHoursAgo(hours);
+ mPanelMainInventory->mCombinationGalleryPanel->getFilter().setDateRangeLastLogoff(getCheckSinceLogoff());
+ mPanelMainInventory->mCombinationGalleryPanel->getFilter().setDateSearchDirection(getDateSearchDirection());
+ }
+ else
+ {
+ if(is_sf_mode && mPanelMainInventory->isCombinationViewMode())
+ {
+ mPanelMainInventory->mCombinationGalleryPanel->getFilter().setHoursAgo(hours);
+ mPanelMainInventory->mCombinationGalleryPanel->getFilter().setDateRangeLastLogoff(getCheckSinceLogoff());
+ mPanelMainInventory->mCombinationGalleryPanel->getFilter().setDateSearchDirection(getDateSearchDirection());
+ }
+ mPanelMainInventory->getPanel()->setHoursAgo(hours);
+ mPanelMainInventory->getPanel()->setSinceLogoff(getCheckSinceLogoff());
+ mPanelMainInventory->getPanel()->setDateSearchDirection(getDateSearchDirection());
+ }
+
+ LLPanel::draw();
+}
+
+void LLFloaterInventoryFinder::onCreatorSelfFilterCommit()
+{
+ bool show_creator_self = mCreatorSelf->getValue();
+ bool show_creator_other = mCreatorOthers->getValue();
+
+ if(show_creator_self && show_creator_other)
+ {
+ mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_ALL);
+ }
+ else if(show_creator_self)
+ {
+ mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_SELF);
+ }
+ else if(!show_creator_self || !show_creator_other)
+ {
+ mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_OTHERS);
+ mCreatorOthers->set(true);
+ }
+}
+
+void LLFloaterInventoryFinder::onCreatorOtherFilterCommit()
+{
+ bool show_creator_self = mCreatorSelf->getValue();
+ bool show_creator_other = mCreatorOthers->getValue();
+
+ if(show_creator_self && show_creator_other)
+ {
+ mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_ALL);
+ }
+ else if(show_creator_other)
+ {
+ mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_OTHERS);
+ }
+ else if(!show_creator_other || !show_creator_self)
+ {
+ mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_SELF);
+ mCreatorSelf->set(true);
+ }
+}
+
+bool LLFloaterInventoryFinder::getCheckShowEmpty()
+{
+ return getChild<LLUICtrl>("check_show_empty")->getValue();
+}
+
+bool LLFloaterInventoryFinder::getCheckSinceLogoff()
+{
+ return getChild<LLUICtrl>("check_since_logoff")->getValue();
+}
+
+U32 LLFloaterInventoryFinder::getDateSearchDirection()
+{
+ return getChild<LLRadioGroup>("date_search_direction")->getSelectedIndex();
+}
+
+void LLFloaterInventoryFinder::onCloseBtn(void* user_data)
+{
+ LLFloaterInventoryFinder* finderp = (LLFloaterInventoryFinder*)user_data;
+ finderp->closeFloater();
+}
+
+// static
+void LLFloaterInventoryFinder::selectAllTypes(void* user_data)
+{
+ LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data;
+ if(!self) return;
+
+ self->getChild<LLUICtrl>("check_animation")->setValue(true);
+ self->getChild<LLUICtrl>("check_calling_card")->setValue(true);
+ self->getChild<LLUICtrl>("check_clothing")->setValue(true);
+ self->getChild<LLUICtrl>("check_gesture")->setValue(true);
+ self->getChild<LLUICtrl>("check_landmark")->setValue(true);
+ self->getChild<LLUICtrl>("check_material")->setValue(true);
+ self->getChild<LLUICtrl>("check_notecard")->setValue(true);
+ self->getChild<LLUICtrl>("check_object")->setValue(true);
+ self->getChild<LLUICtrl>("check_script")->setValue(true);
+ self->getChild<LLUICtrl>("check_sound")->setValue(true);
+ self->getChild<LLUICtrl>("check_texture")->setValue(true);
+ self->getChild<LLUICtrl>("check_snapshot")->setValue(true);
+ self->getChild<LLUICtrl>("check_settings")->setValue(true);
+}
+
+//static
+void LLFloaterInventoryFinder::selectNoTypes(void* user_data)
+{
+ LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data;
+ if(!self) return;
+
+ self->getChild<LLUICtrl>("check_animation")->setValue(false);
+ self->getChild<LLUICtrl>("check_calling_card")->setValue(false);
+ self->getChild<LLUICtrl>("check_clothing")->setValue(false);
+ self->getChild<LLUICtrl>("check_gesture")->setValue(false);
+ self->getChild<LLUICtrl>("check_landmark")->setValue(false);
+ self->getChild<LLUICtrl>("check_material")->setValue(false);
+ self->getChild<LLUICtrl>("check_notecard")->setValue(false);
+ self->getChild<LLUICtrl>("check_object")->setValue(false);
+ self->getChild<LLUICtrl>("check_script")->setValue(false);
+ self->getChild<LLUICtrl>("check_sound")->setValue(false);
+ self->getChild<LLUICtrl>("check_texture")->setValue(false);
+ self->getChild<LLUICtrl>("check_snapshot")->setValue(false);
+ self->getChild<LLUICtrl>("check_settings")->setValue(false);
+}
+
+//////////////////////////////////////////////////////////////////////////////////
+// List Commands //
+
+void LLPanelMainInventory::initListCommandsHandlers()
+{
+ childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this));
+ childSetAction("view_mode_btn", boost::bind(&LLPanelMainInventory::onViewModeClick, this));
+ childSetAction("up_btn", boost::bind(&LLPanelMainInventory::onUpFolderClicked, this));
+ childSetAction("back_btn", boost::bind(&LLPanelMainInventory::onBackFolderClicked, this));
+ childSetAction("forward_btn", boost::bind(&LLPanelMainInventory::onForwardFolderClicked, this));
+
+ mCommitCallbackRegistrar.add("Inventory.GearDefault.Custom.Action", boost::bind(&LLPanelMainInventory::onCustomAction, this, _2));
+ mEnableCallbackRegistrar.add("Inventory.GearDefault.Check", boost::bind(&LLPanelMainInventory::isActionChecked, this, _2));
+ mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2));
+ mEnableCallbackRegistrar.add("Inventory.GearDefault.Visible", boost::bind(&LLPanelMainInventory::isActionVisible, this, _2));
+ mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ mGearMenuButton->setMenu(mMenuGearDefault, LLMenuButton::MP_BOTTOM_LEFT, true);
+ mMenuViewDefault = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_inventory_view_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ mViewMenuButton->setMenu(mMenuViewDefault, LLMenuButton::MP_BOTTOM_LEFT, true);
+ LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ mMenuAddHandle = menu->getHandle();
+
+ mMenuVisibility = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_inventory_search_visibility.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ mVisibilityMenuButton->setMenu(mMenuVisibility, LLMenuButton::MP_BOTTOM_LEFT, true);
+
+ // Update the trash button when selected item(s) get worn or taken off.
+ LLOutfitObserver::instance().addCOFChangedCallback(boost::bind(&LLPanelMainInventory::updateListCommands, this));
+}
+
+void LLPanelMainInventory::updateListCommands()
+{
+}
+
+void LLPanelMainInventory::onAddButtonClick()
+{
+// Gray out the "New Folder" option when the Recent tab is active as new folders will not be displayed
+// unless "Always show folders" is checked in the filter options.
+
+ LLMenuGL* menu = (LLMenuGL*)mMenuAddHandle.get();
+ if (menu)
+ {
+ disableAddIfNeeded();
+
+ setUploadCostIfNeeded();
+
+ showActionMenu(menu,"add_btn");
+ }
+}
+
+void LLPanelMainInventory::setActivePanel()
+{
+ // Todo: should cover gallery mode in some way
+ if(mSingleFolderMode && isListViewMode())
+ {
+ mActivePanel = getChild<LLInventoryPanel>("comb_single_folder_inv");
+ }
+ else if(mSingleFolderMode && isCombinationViewMode())
+ {
+ mActivePanel = getChild<LLInventoryPanel>("comb_single_folder_inv");
+ }
+ else
+ {
+ mActivePanel = (LLInventoryPanel*)getChild<LLTabContainer>("inventory filter tabs")->getCurrentPanel();
+ }
+ mViewModeBtn->setEnabled(mSingleFolderMode || (getAllItemsPanel() == getActivePanel()));
+}
+
+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())
+ {
+ mCombinationInventoryPanel->getRootFolder()->setForceArrange(false);
+ }
+
+ mSingleFolderMode = !mSingleFolderMode;
+ mReshapeInvLayout = true;
+
+ if (mCombinationGalleryPanel->getRootFolder().isNull())
+ {
+ mCombinationGalleryPanel->setRootFolder(mCombinationInventoryPanel->getSingleFolderRoot());
+ mCombinationGalleryPanel->updateRootFolder();
+ }
+
+ updatePanelVisibility();
+ setActivePanel();
+ updateTitle();
+ onFilterSelected();
+
+ LLSidepanelInventory* sidepanel_inventory = getParentSidepanelInventory();
+ if (sidepanel_inventory)
+ {
+ if(mSingleFolderMode)
+ {
+ sidepanel_inventory->hideInbox();
+ }
+ else
+ {
+ sidepanel_inventory->toggleInbox();
+ }
+ }
+}
+
+void LLPanelMainInventory::onViewModeClick()
+{
+ LLUUID selected_folder;
+ LLUUID new_root_folder;
+ if(mSingleFolderMode)
+ {
+ selected_folder = getCurrentSFVRoot();
+ }
+ else
+ {
+ LLFolderView* root = getActivePanel()->getRootFolder();
+ std::set<LLFolderViewItem*> selection_set = root->getSelectionList();
+ if (selection_set.size() == 1)
+ {
+ LLFolderViewItem* current_item = *selection_set.begin();
+ if (current_item)
+ {
+ const LLUUID& id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
+ if(gInventory.getCategory(id) != NULL)
+ {
+ new_root_folder = id;
+ }
+ else
+ {
+ const LLViewerInventoryItem* selected_item = gInventory.getItem(id);
+ if (selected_item && selected_item->getParentUUID().notNull())
+ {
+ new_root_folder = selected_item->getParentUUID();
+ selected_folder = id;
+ }
+ }
+ }
+ }
+ mCombinationInventoryPanel->initFolderRoot(new_root_folder);
+ }
+
+ toggleViewMode();
+
+ if (mSingleFolderMode && new_root_folder.notNull())
+ {
+ setSingleFolderViewRoot(new_root_folder, true);
+ if(selected_folder.notNull() && isListViewMode())
+ {
+ getActivePanel()->setSelection(selected_folder, TAKE_FOCUS_YES);
+ }
+ }
+ else
+ {
+ if(selected_folder.notNull())
+ {
+ selectAllItemsPanel();
+ getActivePanel()->setSelection(selected_folder, TAKE_FOCUS_YES);
+ }
+ }
+}
+
+void LLPanelMainInventory::onUpFolderClicked()
+{
+ const LLViewerInventoryCategory* cat = gInventory.getCategory(getCurrentSFVRoot());
+ if (cat)
+ {
+ if (cat->getParentUUID().notNull())
+ {
+ if(isListViewMode())
+ {
+ mCombinationInventoryPanel->changeFolderRoot(cat->getParentUUID());
+ }
+ if(isGalleryViewMode())
+ {
+ mCombinationGalleryPanel->setRootFolder(cat->getParentUUID());
+ }
+ if(isCombinationViewMode())
+ {
+ mCombinationInventoryPanel->changeFolderRoot(cat->getParentUUID());
+ }
+ }
+ }
+}
+
+void LLPanelMainInventory::onBackFolderClicked()
+{
+ if(isListViewMode())
+ {
+ mCombinationInventoryPanel->onBackwardFolder();
+ }
+ if(isGalleryViewMode())
+ {
+ mCombinationGalleryPanel->onBackwardFolder();
+ }
+ if(isCombinationViewMode())
+ {
+ mCombinationInventoryPanel->onBackwardFolder();
+ }
+}
+
+void LLPanelMainInventory::onForwardFolderClicked()
+{
+ if(isListViewMode())
+ {
+ mCombinationInventoryPanel->onForwardFolder();
+ }
+ if(isGalleryViewMode())
+ {
+ mCombinationGalleryPanel->onForwardFolder();
+ }
+ if(isCombinationViewMode())
+ {
+ mCombinationInventoryPanel->onForwardFolder();
+ }
+}
+
+void LLPanelMainInventory::setSingleFolderViewRoot(const LLUUID& folder_id, bool clear_nav_history)
+{
+ if(isListViewMode())
+ {
+ mCombinationInventoryPanel->changeFolderRoot(folder_id);
+ if(clear_nav_history)
+ {
+ mCombinationInventoryPanel->clearNavigationHistory();
+ }
+ }
+ else if(isGalleryViewMode())
+ {
+ mCombinationGalleryPanel->setRootFolder(folder_id);
+ if(clear_nav_history)
+ {
+ mCombinationGalleryPanel->clearNavigationHistory();
+ }
+ }
+ else if(isCombinationViewMode())
+ {
+ mCombinationInventoryPanel->changeFolderRoot(folder_id);
+ }
+ updateNavButtons();
+}
+
+LLUUID LLPanelMainInventory::getSingleFolderViewRoot()
+{
+ return mCombinationInventoryPanel->getSingleFolderRoot();
+}
+
+void LLPanelMainInventory::showActionMenu(LLMenuGL* menu, std::string spawning_view_name)
+{
+ if (menu)
+ {
+ menu->buildDrawLabels();
+ menu->updateParent(LLMenuGL::sMenuContainer);
+ LLView* spawning_view = getChild<LLView> (spawning_view_name);
+ S32 menu_x, menu_y;
+ //show menu in co-ordinates of panel
+ spawning_view->localPointToOtherView(0, 0, &menu_x, &menu_y, this);
+ LLMenuGL::showPopup(this, menu, menu_x, menu_y);
+ }
+}
+
+void LLPanelMainInventory::onClipboardAction(const LLSD& userdata)
+{
+ std::string command_name = userdata.asString();
+ getActivePanel()->doToSelected(command_name);
+}
+
+void LLPanelMainInventory::saveTexture(const LLSD& userdata)
+{
+ LLUUID item_id;
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ item_id = mCombinationGalleryPanel->getFirstSelectedItemID();
+ if (item_id.isNull()) return;
+ }
+ else
+ {
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (!current_item)
+ {
+ return;
+ }
+ item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
+ }
+
+ LLPreviewTexture* preview_texture = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(item_id), TAKE_FOCUS_YES);
+ if (preview_texture)
+ {
+ preview_texture->openToSave();
+ }
+}
+
+void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
+{
+ if (!isActionEnabled(userdata))
+ return;
+
+ const std::string command_name = userdata.asString();
+
+ if (command_name == "new_window")
+ {
+ newWindow();
+ }
+ if (command_name == "sort_by_name")
+ {
+ const LLSD arg = "name";
+ setSortBy(arg);
+ }
+ if (command_name == "sort_by_recent")
+ {
+ const LLSD arg = "date";
+ setSortBy(arg);
+ }
+ if (command_name == "sort_folders_by_name")
+ {
+ const LLSD arg = "foldersalwaysbyname";
+ setSortBy(arg);
+ }
+ if (command_name == "sort_system_folders_to_top")
+ {
+ const LLSD arg = "systemfolderstotop";
+ setSortBy(arg);
+ }
+ if (command_name == "show_filters")
+ {
+ toggleFindOptions();
+ }
+ if (command_name == "reset_filters")
+ {
+ resetFilters();
+ }
+ if (command_name == "close_folders")
+ {
+ closeAllFolders();
+ }
+ if (command_name == "empty_trash")
+ {
+ const std::string notification = "ConfirmEmptyTrash";
+ gInventory.emptyFolderType(notification, LLFolderType::FT_TRASH);
+ }
+ if (command_name == "empty_lostnfound")
+ {
+ const std::string notification = "ConfirmEmptyLostAndFound";
+ gInventory.emptyFolderType(notification, LLFolderType::FT_LOST_AND_FOUND);
+ }
+ if (command_name == "save_texture")
+ {
+ saveTexture(userdata);
+ }
+ // This doesn't currently work, since the viewer can't change an assetID an item.
+ if (command_name == "regenerate_link")
+ {
+ LLInventoryPanel *active_panel = getActivePanel();
+ LLFolderViewItem* current_item = active_panel->getRootFolder()->getCurSelectedItem();
+ if (!current_item)
+ {
+ return;
+ }
+ const LLUUID item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
+ LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ if (item)
+ {
+ item->regenerateLink();
+ }
+ active_panel->setSelection(item_id, TAKE_FOCUS_NO);
+ }
+ if (command_name == "find_original")
+ {
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ LLInventoryObject *obj = gInventory.getObject(mCombinationGalleryPanel->getFirstSelectedItemID());
+ if (obj && obj->getIsLinkType())
+ {
+ show_item_original(obj->getUUID());
+ }
+ }
+ else
+ {
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (!current_item)
+ {
+ return;
+ }
+ static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->performAction(getActivePanel()->getModel(), "goto");
+ }
+ }
+
+ if (command_name == "find_links")
+ {
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ LLFloaterSidePanelContainer* inventory_container = newWindow();
+ if (inventory_container)
+ {
+ LLSidepanelInventory* sidepanel_inventory = dynamic_cast<LLSidepanelInventory*>(inventory_container->findChild<LLPanel>("main_panel", true));
+ if (sidepanel_inventory)
+ {
+ LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();
+ if (main_inventory)
+ {
+ LLInventoryObject *obj = gInventory.getObject(mCombinationGalleryPanel->getFirstSelectedItemID());
+ if (obj)
+ {
+ main_inventory->findLinks(obj->getUUID(), obj->getName());
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (!current_item)
+ {
+ return;
+ }
+ const LLUUID& item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
+ const std::string &item_name = current_item->getViewModelItem()->getName();
+ findLinks(item_id, item_name);
+ }
+ }
+
+ if (command_name == "replace_links")
+ {
+ LLSD params;
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ params = LLSD(mCombinationGalleryPanel->getFirstSelectedItemID());
+ }
+ else
+ {
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (current_item)
+ {
+ LLInvFVBridge* bridge = (LLInvFVBridge*)current_item->getViewModelItem();
+
+ if (bridge)
+ {
+ LLInventoryObject* obj = bridge->getInventoryObject();
+ if (obj && obj->getType() != LLAssetType::AT_CATEGORY && obj->getActualType() != LLAssetType::AT_LINK_FOLDER)
+ {
+ params = LLSD(obj->getUUID());
+ }
+ }
+ }
+ }
+ LLFloaterReg::showInstance("linkreplace", params);
+ }
+
+ if (command_name == "close_inv_windows")
+ {
+ LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
+ for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end();)
+ {
+ LLFloaterSidePanelContainer* iv = dynamic_cast<LLFloaterSidePanelContainer*>(*iter++);
+ if (iv)
+ {
+ iv->closeFloater();
+ }
+ }
+ LLFloaterReg::hideInstance("inventory_settings");
+ }
+
+ if (command_name == "toggle_search_outfits")
+ {
+ getCurrentFilter().toggleSearchVisibilityOutfits();
+ }
+
+ if (command_name == "toggle_search_trash")
+ {
+ getCurrentFilter().toggleSearchVisibilityTrash();
+ }
+
+ if (command_name == "toggle_search_library")
+ {
+ getCurrentFilter().toggleSearchVisibilityLibrary();
+ }
+
+ if (command_name == "include_links")
+ {
+ getCurrentFilter().toggleSearchVisibilityLinks();
+ }
+
+ if (command_name == "share")
+ {
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ std::set<LLUUID> uuids{ mCombinationGalleryPanel->getFirstSelectedItemID()};
+ LLAvatarActions::shareWithAvatars(uuids, gFloaterView->getParentFloater(this));
+ }
+ else
+ {
+ LLAvatarActions::shareWithAvatars(this);
+ }
+ }
+ if (command_name == "shop")
+ {
+ LLWeb::loadURL(gSavedSettings.getString("MarketplaceURL"));
+ }
+ if (command_name == "list_view")
+ {
+ setViewMode(MODE_LIST);
+ }
+ if (command_name == "gallery_view")
+ {
+ setViewMode(MODE_GALLERY);
+ }
+ if (command_name == "combination_view")
+ {
+ setViewMode(MODE_COMBINATION);
+ }
+}
+
+void LLPanelMainInventory::onVisibilityChange( bool new_visibility )
+{
+ if(!new_visibility)
+ {
+ LLMenuGL* menu = (LLMenuGL*)mMenuAddHandle.get();
+ if (menu)
+ {
+ menu->setVisible(false);
+ }
+ getActivePanel()->getRootFolder()->finishRenamingItem();
+ }
+}
+
+bool LLPanelMainInventory::isSaveTextureEnabled(const LLSD& userdata)
+{
+ LLViewerInventoryItem *inv_item = NULL;
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ inv_item = gInventory.getItem(mCombinationGalleryPanel->getFirstSelectedItemID());
+ }
+ else
+ {
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (current_item)
+ {
+ inv_item = dynamic_cast<LLViewerInventoryItem*>(static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getInventoryObject());
+ }
+ }
+ if(inv_item)
+ {
+ bool can_save = inv_item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
+ LLInventoryType::EType curr_type = inv_item->getInventoryType();
+ return can_save && (curr_type == LLInventoryType::IT_TEXTURE || curr_type == LLInventoryType::IT_SNAPSHOT);
+ }
+
+ return false;
+}
+
+bool LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
+{
+ const std::string command_name = userdata.asString();
+ if (command_name == "not_empty")
+ {
+ bool status = false;
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (current_item)
+ {
+ const LLUUID& item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(item_id, cat_array, item_array);
+ status = (0 == cat_array->size() && 0 == item_array->size());
+ }
+ return status;
+ }
+ if (command_name == "delete")
+ {
+ return getActivePanel()->isSelectionRemovable();
+ }
+ if (command_name == "save_texture")
+ {
+ return isSaveTextureEnabled(userdata);
+ }
+ if (command_name == "find_original")
+ {
+ LLUUID item_id;
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ item_id = mCombinationGalleryPanel->getFirstSelectedItemID();
+ }
+ else{
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (!current_item) return false;
+ item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
+ }
+ const LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ if (item && item->getIsLinkType() && !item->getIsBrokenLink())
+ {
+ return true;
+ }
+ return false;
+ }
+
+ if (command_name == "find_links")
+ {
+ LLUUID item_id;
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ item_id = mCombinationGalleryPanel->getFirstSelectedItemID();
+ }
+ else{
+ LLFolderView* root = getActivePanel()->getRootFolder();
+ std::set<LLFolderViewItem*> selection_set = root->getSelectionList();
+ if (selection_set.size() != 1) return false;
+ LLFolderViewItem* current_item = root->getCurSelectedItem();
+ if (!current_item) return false;
+ item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
+ }
+ const LLInventoryObject *obj = gInventory.getObject(item_id);
+ if (obj && !obj->getIsLinkType() && LLAssetType::lookupCanLink(obj->getType()))
+ {
+ return true;
+ }
+ return false;
+ }
+ // This doesn't currently work, since the viewer can't change an assetID an item.
+ if (command_name == "regenerate_link")
+ {
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (!current_item) return false;
+ const LLUUID& item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
+ const LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ if (item && item->getIsBrokenLink())
+ {
+ return true;
+ }
+ return false;
+ }
+
+ if (command_name == "share")
+ {
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ return can_share_item(mCombinationGalleryPanel->getFirstSelectedItemID());
+ }
+ else{
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (!current_item) return false;
+ LLSidepanelInventory* parent = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+ return parent ? parent->canShare() : false;
+ }
+ }
+ if (command_name == "empty_trash")
+ {
+ const LLUUID &trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ LLInventoryModel::EHasChildren children = gInventory.categoryHasChildren(trash_id);
+ return children != LLInventoryModel::CHILDREN_NO && gInventory.isCategoryComplete(trash_id);
+ }
+ if (command_name == "empty_lostnfound")
+ {
+ const LLUUID &trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
+ LLInventoryModel::EHasChildren children = gInventory.categoryHasChildren(trash_id);
+ return children != LLInventoryModel::CHILDREN_NO && gInventory.isCategoryComplete(trash_id);
+ }
+
+ return true;
+}
+
+bool LLPanelMainInventory::isActionVisible(const LLSD& userdata)
+{
+ const std::string param_str = userdata.asString();
+ if (param_str == "single_folder_view")
+ {
+ return mSingleFolderMode;
+ }
+ if (param_str == "multi_folder_view")
+ {
+ return !mSingleFolderMode;
+ }
+
+ return true;
+}
+
+bool LLPanelMainInventory::isActionChecked(const LLSD& userdata)
+{
+ U32 sort_order_mask = (mSingleFolderMode && isGalleryViewMode()) ? mCombinationGalleryPanel->getSortOrder() : getActivePanel()->getSortOrder();
+ const std::string command_name = userdata.asString();
+ if (command_name == "sort_by_name")
+ {
+ return ~sort_order_mask & LLInventoryFilter::SO_DATE;
+ }
+
+ if (command_name == "sort_by_recent")
+ {
+ return sort_order_mask & LLInventoryFilter::SO_DATE;
+ }
+
+ if (command_name == "sort_folders_by_name")
+ {
+ return sort_order_mask & LLInventoryFilter::SO_FOLDERS_BY_NAME;
+ }
+
+ if (command_name == "sort_system_folders_to_top")
+ {
+ return sort_order_mask & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
+ }
+
+ if (command_name == "toggle_search_outfits")
+ {
+ return (getCurrentFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_OUTFITS) != 0;
+ }
+
+ if (command_name == "toggle_search_trash")
+ {
+ return (getCurrentFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_TRASH) != 0;
+ }
+
+ if (command_name == "toggle_search_library")
+ {
+ return (getCurrentFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_LIBRARY) != 0;
+ }
+
+ if (command_name == "include_links")
+ {
+ return (getCurrentFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_LINKS) != 0;
+ }
+
+ if (command_name == "list_view")
+ {
+ return isListViewMode();
+ }
+ if (command_name == "gallery_view")
+ {
+ return isGalleryViewMode();
+ }
+ if (command_name == "combination_view")
+ {
+ return isCombinationViewMode();
+ }
+
+ return false;
+}
+
+void LLPanelMainInventory::setUploadCostIfNeeded()
+{
+ LLMenuGL* menu = (LLMenuGL*)mMenuAddHandle.get();
+ if(mNeedUploadCost && menu)
+ {
+ const std::string texture_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getTextureUploadCost());
+ const std::string sound_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getSoundUploadCost());
+ const std::string animation_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getAnimationUploadCost());
+
+ menu->getChild<LLView>("Upload Image")->setLabelArg("[COST]", texture_upload_cost_str);
+ menu->getChild<LLView>("Upload Sound")->setLabelArg("[COST]", sound_upload_cost_str);
+ menu->getChild<LLView>("Upload Animation")->setLabelArg("[COST]", animation_upload_cost_str);
+ }
+}
+
+bool is_add_allowed(LLUUID folder_id)
+{
+ if(!gInventory.isObjectDescendentOf(folder_id, gInventory.getRootFolderID()))
+ {
+ return false;
+ }
+
+ std::vector<LLFolderType::EType> not_allowed_types;
+ not_allowed_types.push_back(LLFolderType::FT_LOST_AND_FOUND);
+ not_allowed_types.push_back(LLFolderType::FT_FAVORITE);
+ not_allowed_types.push_back(LLFolderType::FT_MARKETPLACE_LISTINGS);
+ not_allowed_types.push_back(LLFolderType::FT_TRASH);
+ not_allowed_types.push_back(LLFolderType::FT_CURRENT_OUTFIT);
+ not_allowed_types.push_back(LLFolderType::FT_INBOX);
+
+ for (std::vector<LLFolderType::EType>::const_iterator it = not_allowed_types.begin();
+ it != not_allowed_types.end(); ++it)
+ {
+ if(gInventory.isObjectDescendentOf(folder_id, gInventory.findCategoryUUIDForType(*it)))
+ {
+ return false;
+ }
+ }
+
+ LLViewerInventoryCategory* cat = gInventory.getCategory(folder_id);
+ if (cat && (cat->getPreferredType() == LLFolderType::FT_OUTFIT))
+ {
+ return false;
+ }
+ return true;
+}
+
+void LLPanelMainInventory::disableAddIfNeeded()
+{
+ LLMenuGL* menu = (LLMenuGL*)mMenuAddHandle.get();
+ if (menu)
+ {
+ bool enable = !mSingleFolderMode || is_add_allowed(getCurrentSFVRoot());
+
+ menu->getChild<LLMenuItemGL>("New Folder")->setEnabled(enable && !isRecentItemsPanelSelected());
+ menu->getChild<LLMenuItemGL>("New Script")->setEnabled(enable);
+ menu->getChild<LLMenuItemGL>("New Note")->setEnabled(enable);
+ menu->getChild<LLMenuItemGL>("New Gesture")->setEnabled(enable);
+ menu->setItemEnabled("New Clothes", enable);
+ menu->setItemEnabled("New Body Parts", enable);
+ menu->setItemEnabled("New Settings", enable);
+ }
+}
+
+bool LLPanelMainInventory::hasSettingsInventory()
+{
+ return LLEnvironment::instance().isInventoryEnabled();
+}
+
+bool LLPanelMainInventory::hasMaterialsInventory()
+{
+ std::string agent_url = gAgent.getRegionCapability("UpdateMaterialAgentInventory");
+ std::string task_url = gAgent.getRegionCapability("UpdateMaterialTaskInventory");
+
+ return (!agent_url.empty() && !task_url.empty());
+}
+
+void LLPanelMainInventory::updateTitle()
+{
+ LLFloater* inventory_floater = gFloaterView->getParentFloater(this);
+ if(inventory_floater)
+ {
+ if(mSingleFolderMode)
+ {
+ inventory_floater->setTitle(getLocalizedRootName());
+ LLFloaterInventoryFinder *finder = getFinder();
+ if (finder)
+ {
+ finder->setTitle(getLocalizedRootName());
+ }
+ }
+ else
+ {
+ inventory_floater->setTitle(getString("inventory_title"));
+ }
+ }
+ updateNavButtons();
+}
+
+void LLPanelMainInventory::onCombinationRootChanged(bool gallery_clicked)
+{
+ if(gallery_clicked)
+ {
+ mCombinationInventoryPanel->changeFolderRoot(mCombinationGalleryPanel->getRootFolder());
+ }
+ else
+ {
+ mCombinationGalleryPanel->setRootFolder(mCombinationInventoryPanel->getSingleFolderRoot());
+ }
+ mForceShowInvLayout = false;
+ updateTitle();
+ mReshapeInvLayout = true;
+}
+
+void LLPanelMainInventory::onCombinationGallerySelectionChanged(const LLUUID& category_id)
+{
+}
+
+void LLPanelMainInventory::onCombinationInventorySelectionChanged(const std::deque<LLFolderViewItem*>& items, bool user_action)
+{
+ onSelectionChange(mCombinationInventoryPanel, items, user_action);
+}
+
+void LLPanelMainInventory::updatePanelVisibility()
+{
+ mDefaultViewPanel->setVisible(!mSingleFolderMode);
+ mCombinationViewPanel->setVisible(mSingleFolderMode);
+ mNavigationBtnsPanel->setVisible(mSingleFolderMode);
+ mViewModeBtn->setImageOverlay(mSingleFolderMode ? getString("default_mode_btn") : getString("single_folder_mode_btn"));
+ mViewModeBtn->setEnabled(mSingleFolderMode || (getAllItemsPanel() == getActivePanel()));
+ if (mSingleFolderMode)
+ {
+ if (isCombinationViewMode())
+ {
+ LLInventoryFilter& comb_inv_filter = mCombinationInventoryPanel->getFilter();
+ comb_inv_filter.setFilterThumbnails(LLInventoryFilter::FILTER_EXCLUDE_THUMBNAILS);
+ comb_inv_filter.markDefault();
+
+ LLInventoryFilter& comb_gallery_filter = mCombinationGalleryPanel->getFilter();
+ comb_gallery_filter.setFilterThumbnails(LLInventoryFilter::FILTER_ONLY_THUMBNAILS);
+ comb_gallery_filter.markDefault();
+
+ // visibility will be controled by updateCombinationVisibility()
+ mCombinationGalleryLayoutPanel->setVisible(true);
+ mCombinationGalleryPanel->setVisible(true);
+ mCombinationListLayoutPanel->setVisible(true);
+ }
+ else
+ {
+ LLInventoryFilter& comb_inv_filter = mCombinationInventoryPanel->getFilter();
+ comb_inv_filter.setFilterThumbnails(LLInventoryFilter::FILTER_INCLUDE_THUMBNAILS);
+ comb_inv_filter.markDefault();
+
+ LLInventoryFilter& comb_gallery_filter = mCombinationGalleryPanel->getFilter();
+ comb_gallery_filter.setFilterThumbnails(LLInventoryFilter::FILTER_INCLUDE_THUMBNAILS);
+ comb_gallery_filter.markDefault();
+
+ mCombinationLayoutStack->setPanelSpacing(0);
+ 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);
+ }
+}
+
+void LLPanelMainInventory::updateCombinationVisibility()
+{
+ if(mSingleFolderMode && isCombinationViewMode())
+ {
+ bool is_gallery_empty = !mCombinationGalleryPanel->hasVisibleItems();
+ bool show_inv_pane = mCombinationInventoryPanel->hasVisibleItems() || is_gallery_empty || mForceShowInvLayout;
+
+ const S32 DRAG_HANDLE_PADDING = 12; // for drag handle to not overlap gallery when both inventories are visible
+ mCombinationLayoutStack->setPanelSpacing(show_inv_pane ? DRAG_HANDLE_PADDING : 0);
+
+ mCombinationGalleryLayoutPanel->setVisible(!is_gallery_empty);
+ mCombinationListLayoutPanel->setVisible(show_inv_pane);
+ mCombinationInventoryPanel->getRootFolder()->setForceArrange(!show_inv_pane);
+ if(mCombinationInventoryPanel->hasVisibleItems())
+ {
+ mForceShowInvLayout = false;
+ }
+ if(is_gallery_empty)
+ {
+ mCombinationGalleryPanel->handleModifiedFilter();
+ }
+
+ getActivePanel()->getRootFolder();
+
+ if (mReshapeInvLayout
+ && show_inv_pane
+ && (mCombinationGalleryPanel->hasVisibleItems() || mCombinationGalleryPanel->areViewsInitialized())
+ && mCombinationInventoryPanel->areViewsInitialized())
+ {
+ mReshapeInvLayout = false;
+
+ // force drop previous shape (because panel doesn't decrease shape properly)
+ LLRect list_latout = mCombinationListLayoutPanel->getRect();
+ list_latout.mTop = list_latout.mBottom; // min height is at 100, so it should snap to be bigger
+ mCombinationListLayoutPanel->setShape(list_latout, false);
+
+ LLRect inv_inner_rect = mCombinationInventoryPanel->getScrollableContainer()->getScrolledViewRect();
+ S32 inv_height = inv_inner_rect.getHeight()
+ + (mCombinationInventoryPanel->getScrollableContainer()->getBorderWidth() * 2)
+ + mCombinationInventoryPanel->getScrollableContainer()->getSize();
+ LLRect inner_galery_rect = mCombinationGalleryPanel->getScrollableContainer()->getScrolledViewRect();
+ S32 gallery_height = inner_galery_rect.getHeight()
+ + (mCombinationGalleryPanel->getScrollableContainer()->getBorderWidth() * 2)
+ + mCombinationGalleryPanel->getScrollableContainer()->getSize();
+ LLRect layout_rect = mCombinationViewPanel->getRect();
+
+ // by default make it take 1/3 of the panel
+ S32 list_default_height = layout_rect.getHeight() / 3;
+ // Don't set height from gallery_default_height - needs to account for a resizer in such case
+ S32 gallery_default_height = layout_rect.getHeight() - list_default_height;
+
+ if (inv_height > list_default_height
+ && gallery_height < gallery_default_height)
+ {
+ LLRect gallery_latout = mCombinationGalleryLayoutPanel->getRect();
+ gallery_latout.mTop = gallery_latout.mBottom + gallery_height;
+ mCombinationGalleryLayoutPanel->setShape(gallery_latout, true /*tell stack to account for new shape*/);
+ }
+ else if (inv_height < list_default_height
+ && gallery_height > gallery_default_height)
+ {
+ LLRect list_latout = mCombinationListLayoutPanel->getRect();
+ list_latout.mTop = list_latout.mBottom + inv_height;
+ mCombinationListLayoutPanel->setShape(list_latout, true /*tell stack to account for new shape*/);
+ }
+ else
+ {
+ LLRect list_latout = mCombinationListLayoutPanel->getRect();
+ list_latout.mTop = list_latout.mBottom + list_default_height;
+ mCombinationListLayoutPanel->setShape(list_latout, true /*tell stack to account for new shape*/);
+ }
+ }
+ }
+
+ if (mSingleFolderMode
+ && !isGalleryViewMode()
+ && mCombInvUUIDNeedsRename.notNull()
+ && mCombinationInventoryPanel->areViewsInitialized())
+ {
+ mCombinationInventoryPanel->setSelectionByID(mCombInvUUIDNeedsRename, true);
+ mCombinationInventoryPanel->getRootFolder()->scrollToShowSelection();
+ mCombinationInventoryPanel->getRootFolder()->setNeedsAutoRename(true);
+ mCombInvUUIDNeedsRename.setNull();
+ }
+}
+
+void LLPanelMainInventory::updateNavButtons()
+{
+ if(isListViewMode())
+ {
+ mBackBtn->setEnabled(mCombinationInventoryPanel->isBackwardAvailable());
+ mForwardBtn->setEnabled(mCombinationInventoryPanel->isForwardAvailable());
+ }
+ if(isGalleryViewMode())
+ {
+ mBackBtn->setEnabled(mCombinationGalleryPanel->isBackwardAvailable());
+ mForwardBtn->setEnabled(mCombinationGalleryPanel->isForwardAvailable());
+ }
+ if(isCombinationViewMode())
+ {
+ mBackBtn->setEnabled(mCombinationInventoryPanel->isBackwardAvailable());
+ mForwardBtn->setEnabled(mCombinationInventoryPanel->isForwardAvailable());
+ }
+
+ const LLViewerInventoryCategory* cat = gInventory.getCategory(getCurrentSFVRoot());
+ bool up_enabled = (cat && cat->getParentUUID().notNull());
+ mUpBtn->setEnabled(up_enabled);
+}
+
+LLSidepanelInventory* LLPanelMainInventory::getParentSidepanelInventory()
+{
+ LLFloaterSidePanelContainer* inventory_container = dynamic_cast<LLFloaterSidePanelContainer*>(gFloaterView->getParentFloater(this));
+ if(inventory_container)
+ {
+ return dynamic_cast<LLSidepanelInventory*>(inventory_container->findChild<LLPanel>("main_panel", true));
+ }
+ return NULL;
+}
+
+void LLPanelMainInventory::setViewMode(EViewModeType mode)
+{
+ if(mode != mViewMode)
+ {
+ std::list<LLUUID> forward_history;
+ std::list<LLUUID> backward_history;
+ U32 sort_order = 0;
+ switch(mViewMode)
+ {
+ case MODE_LIST:
+ forward_history = mCombinationInventoryPanel->getNavForwardList();
+ backward_history = mCombinationInventoryPanel->getNavBackwardList();
+ sort_order = mCombinationInventoryPanel->getSortOrder();
+ break;
+ case MODE_GALLERY:
+ forward_history = mCombinationGalleryPanel->getNavForwardList();
+ backward_history = mCombinationGalleryPanel->getNavBackwardList();
+ sort_order = mCombinationGalleryPanel->getSortOrder();
+ break;
+ case MODE_COMBINATION:
+ forward_history = mCombinationInventoryPanel->getNavForwardList();
+ backward_history = mCombinationInventoryPanel->getNavBackwardList();
+ mCombinationInventoryPanel->getRootFolder()->setForceArrange(false);
+ sort_order = mCombinationInventoryPanel->getSortOrder();
+ break;
+ }
+
+ LLUUID cur_root = getCurrentSFVRoot();
+ mViewMode = mode;
+
+ updatePanelVisibility();
+
+ if(isListViewMode())
+ {
+ mCombinationInventoryPanel->changeFolderRoot(cur_root);
+ mCombinationInventoryPanel->setNavForwardList(forward_history);
+ mCombinationInventoryPanel->setNavBackwardList(backward_history);
+ mCombinationInventoryPanel->setSortOrder(sort_order);
+ }
+ if(isGalleryViewMode())
+ {
+ mCombinationGalleryPanel->setRootFolder(cur_root);
+ mCombinationGalleryPanel->setNavForwardList(forward_history);
+ mCombinationGalleryPanel->setNavBackwardList(backward_history);
+ mCombinationGalleryPanel->setSortOrder(sort_order, true);
+ }
+ if(isCombinationViewMode())
+ {
+ mCombinationInventoryPanel->changeFolderRoot(cur_root);
+ mCombinationGalleryPanel->setRootFolder(cur_root);
+ mCombinationInventoryPanel->setNavForwardList(forward_history);
+ mCombinationInventoryPanel->setNavBackwardList(backward_history);
+ mCombinationGalleryPanel->setNavForwardList(forward_history);
+ mCombinationGalleryPanel->setNavBackwardList(backward_history);
+ mCombinationInventoryPanel->setSortOrder(sort_order);
+ mCombinationGalleryPanel->setSortOrder(sort_order, true);
+ }
+
+ updateNavButtons();
+
+ onFilterSelected();
+ if((isListViewMode() && (mActivePanel->getFilterSubString() != mFilterSubString)) ||
+ (isGalleryViewMode() && (mCombinationGalleryPanel->getFilterSubString() != mFilterSubString)))
+ {
+ onFilterEdit(mFilterSubString);
+ }
+ }
+}
+
+std::string LLPanelMainInventory::getLocalizedRootName()
+{
+ return mSingleFolderMode ? get_localized_folder_name(getCurrentSFVRoot()) : "";
+}
+
+LLUUID LLPanelMainInventory::getCurrentSFVRoot()
+{
+ if(isListViewMode())
+ {
+ return mCombinationInventoryPanel->getSingleFolderRoot();
+ }
+ if(isGalleryViewMode())
+ {
+ return mCombinationGalleryPanel->getRootFolder();
+ }
+ if(isCombinationViewMode())
+ {
+ return mCombinationInventoryPanel->getSingleFolderRoot();
+ }
+ return LLUUID::null;
+}
+
+LLInventoryFilter& LLPanelMainInventory::getCurrentFilter()
+{
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ return mCombinationGalleryPanel->getFilter();
+ }
+ else
+ {
+ return mActivePanel->getFilter();
+ }
+}
+
+void LLPanelMainInventory::setGallerySelection(const LLUUID& item_id, bool new_window)
+{
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ mCombinationGalleryPanel->changeItemSelection(item_id, true);
+ }
+ else if(mSingleFolderMode && isCombinationViewMode())
+ {
+ if(mCombinationGalleryPanel->getFilter().checkAgainstFilterThumbnails(item_id))
+ {
+ mCombinationGalleryPanel->changeItemSelection(item_id, false);
+ scrollToGallerySelection();
+ }
+ else
+ {
+ mCombinationInventoryPanel->setSelection(item_id, true);
+ scrollToInvPanelSelection();
+ }
+ }
+ else if (mSingleFolderMode && isListViewMode())
+ {
+ mCombinationInventoryPanel->setSelection(item_id, true);
+ }
+}
+
+void LLPanelMainInventory::scrollToGallerySelection()
+{
+ mCombinationGalleryPanel->scrollToShowItem(mCombinationGalleryPanel->getFirstSelectedItemID());
+}
+
+void LLPanelMainInventory::scrollToInvPanelSelection()
+{
+ mCombinationInventoryPanel->getRootFolder()->scrollToShowSelection();
+}
+
+// List Commands //
+////////////////////////////////////////////////////////////////////////////////