/** * @file LLSidepanelInventory.cpp * @brief Side Bar "Inventory" panel * * $LicenseInfo:firstyear=2009&license=viewergpl$ * * Copyright (c) 2004-2009, Linden Research, Inc. * * Second Life Viewer Source Code * The source code in this file ("Source Code") is provided by Linden Lab * to you under the terms of the GNU General Public License, version 2.0 * ("GPL"), unless you have obtained a separate licensing agreement * ("Other License"), formally executed by you and Linden Lab. Terms of * the GPL can be found in doc/GPL-license.txt in this distribution, or * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 * * There are special exceptions to the terms and conditions of the GPL as * it is applied to this Source Code. View the full text of the exception * in the file doc/FLOSS-exception.txt in this software distribution, or * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception * * By copying, modifying or distributing this software, you acknowledge * that you have read and understood your obligations described above, * and agree to abide by those obligations. * * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, * COMPLETENESS OR PERFORMANCE. * $/LicenseInfo$ */ #include "llviewerprecompiledheaders.h" #include "llsidepanelinventory.h" #include "llagent.h" #include "llappearancemgr.h" #include "llavataractions.h" #include "llbutton.h" #include "llfirstuse.h" #include "llinventorybridge.h" #include "llinventoryfunctions.h" #include "llinventorypanel.h" #include "lloutfitobserver.h" #include "llpanelmaininventory.h" #include "llsidepaneliteminfo.h" #include "llsidepaneltaskinfo.h" #include "lltabcontainer.h" #include "llselectmgr.h" #include "llweb.h" static LLRegisterPanelClassWrapper t_inventory("sidepanel_inventory"); LLSidepanelInventory::LLSidepanelInventory() : LLPanel(), mItemPanel(NULL), mPanelMainInventory(NULL) { //LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() } LLSidepanelInventory::~LLSidepanelInventory() { } BOOL LLSidepanelInventory::postBuild() { // UI elements from inventory panel { mInventoryPanel = getChild("sidepanel__inventory_panel"); mInfoBtn = mInventoryPanel->getChild("info_btn"); mInfoBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onInfoButtonClicked, this)); mShareBtn = mInventoryPanel->getChild("share_btn"); mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this)); mShopBtn = mInventoryPanel->getChild("shop_btn"); mShopBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShopButtonClicked, this)); mWearBtn = mInventoryPanel->getChild("wear_btn"); mWearBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onWearButtonClicked, this)); mPlayBtn = mInventoryPanel->getChild("play_btn"); mPlayBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onPlayButtonClicked, this)); mTeleportBtn = mInventoryPanel->getChild("teleport_btn"); mTeleportBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onTeleportButtonClicked, this)); mOverflowBtn = mInventoryPanel->getChild("overflow_btn"); mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onOverflowButtonClicked, this)); mPanelMainInventory = mInventoryPanel->getChild("panel_main_inventory"); mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2)); LLTabContainer* tabs = mPanelMainInventory->getChild("inventory filter tabs"); tabs->setCommitCallback(boost::bind(&LLSidepanelInventory::updateVerbs, this)); /* EXT-4846 : "Can we suppress the "Landmarks" and "My Favorites" folder since they have their own Task Panel?" Deferring this until 2.1. LLInventoryPanel *my_inventory_panel = mPanelMainInventory->getChild("All Items"); my_inventory_panel->addHideFolderType(LLFolderType::FT_LANDMARK); my_inventory_panel->addHideFolderType(LLFolderType::FT_FAVORITE); */ LLOutfitObserver::instance().addCOFChangedCallback(boost::bind(&LLSidepanelInventory::updateVerbs, this)); } // UI elements from item panel { mItemPanel = getChild("sidepanel__item_panel"); LLButton* back_btn = mItemPanel->getChild("back_btn"); back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this)); } // UI elements from task panel { mTaskPanel = getChild("sidepanel__task_panel"); if (mTaskPanel) { LLButton* back_btn = mTaskPanel->getChild("back_btn"); back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this)); } } return TRUE; } void LLSidepanelInventory::onOpen(const LLSD& key) { LLFirstUse::inventoryOffer(false); if(key.size() == 0) return; mItemPanel->reset(); if (key.has("id")) { mItemPanel->setItemID(key["id"].asUUID()); if (key.has("object")) { mItemPanel->setObjectID(key["object"].asUUID()); } showItemInfoPanel(); } if (key.has("task")) { if (mTaskPanel) mTaskPanel->setObjectSelection(LLSelectMgr::getInstance()->getSelection()); showTaskInfoPanel(); } } void LLSidepanelInventory::onInfoButtonClicked() { LLInventoryItem *item = getSelectedItem(); if (item) { mItemPanel->reset(); mItemPanel->setItemID(item->getUUID()); showItemInfoPanel(); } } void LLSidepanelInventory::onShareButtonClicked() { LLAvatarActions::shareWithAvatars(); } void LLSidepanelInventory::onShopButtonClicked() { LLWeb::loadURLExternal(gSavedSettings.getString("MarketplaceURL")); } void LLSidepanelInventory::performActionOnSelection(const std::string &action) { LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild("panel_main_inventory"); LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem(); if (!current_item) { return; } current_item->getListener()->performAction(panel_main_inventory->getActivePanel()->getModel(), action); } void LLSidepanelInventory::onWearButtonClicked() { performActionOnSelection("wear"); performActionOnSelection("attach"); } void LLSidepanelInventory::onPlayButtonClicked() { const LLInventoryItem *item = getSelectedItem(); if (!item) { return; } switch(item->getInventoryType()) { case LLInventoryType::IT_GESTURE: performActionOnSelection("play"); break; default: performActionOnSelection("open"); break; } } void LLSidepanelInventory::onTeleportButtonClicked() { performActionOnSelection("teleport"); } void LLSidepanelInventory::onOverflowButtonClicked() { } void LLSidepanelInventory::onBackButtonClicked() { showInventoryPanel(); } void LLSidepanelInventory::onSelectionChange(const std::deque &items, BOOL user_action) { updateVerbs(); } void LLSidepanelInventory::showItemInfoPanel() { mItemPanel->setVisible(TRUE); if (mTaskPanel) mTaskPanel->setVisible(FALSE); mInventoryPanel->setVisible(FALSE); mItemPanel->dirty(); mItemPanel->setIsEditing(FALSE); } void LLSidepanelInventory::showTaskInfoPanel() { mItemPanel->setVisible(FALSE); mInventoryPanel->setVisible(FALSE); if (mTaskPanel) { mTaskPanel->setVisible(TRUE); mTaskPanel->dirty(); mTaskPanel->setIsEditing(FALSE); } } void LLSidepanelInventory::showInventoryPanel() { mItemPanel->setVisible(FALSE); if (mTaskPanel) mTaskPanel->setVisible(FALSE); mInventoryPanel->setVisible(TRUE); updateVerbs(); } void LLSidepanelInventory::updateVerbs() { mInfoBtn->setEnabled(FALSE); mShareBtn->setEnabled(FALSE); mWearBtn->setVisible(FALSE); mWearBtn->setEnabled(FALSE); mPlayBtn->setVisible(FALSE); mPlayBtn->setEnabled(FALSE); mTeleportBtn->setVisible(FALSE); mTeleportBtn->setEnabled(FALSE); mShopBtn->setVisible(TRUE); mShareBtn->setEnabled(canShare()); const LLInventoryItem *item = getSelectedItem(); if (!item) return; bool is_single_selection = getSelectedCount() == 1; mInfoBtn->setEnabled(is_single_selection); switch(item->getInventoryType()) { case LLInventoryType::IT_WEARABLE: case LLInventoryType::IT_OBJECT: case LLInventoryType::IT_ATTACHMENT: mWearBtn->setVisible(TRUE); mWearBtn->setEnabled(get_can_item_be_worn(item->getLinkedUUID())); mShopBtn->setVisible(FALSE); break; case LLInventoryType::IT_SOUND: case LLInventoryType::IT_GESTURE: case LLInventoryType::IT_ANIMATION: mPlayBtn->setVisible(TRUE); mPlayBtn->setEnabled(TRUE); mShopBtn->setVisible(FALSE); break; case LLInventoryType::IT_LANDMARK: mTeleportBtn->setVisible(TRUE); mTeleportBtn->setEnabled(TRUE); mShopBtn->setVisible(FALSE); break; default: break; } } bool LLSidepanelInventory::canShare() { LLPanelMainInventory* panel_main_inventory = mInventoryPanel->getChild("panel_main_inventory"); LLFolderView* root_folder = panel_main_inventory->getActivePanel()->getRootFolder(); LLFolderViewItem* current_item = root_folder->hasVisibleChildren() ? root_folder->getCurSelectedItem() : NULL; LLInvFVBridge* bridge = current_item ? dynamic_cast (current_item->getListener()) : NULL; return bridge ? bridge->canShare() : false; } LLInventoryItem *LLSidepanelInventory::getSelectedItem() { LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild("panel_main_inventory"); LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem(); if (!current_item) { return NULL; } const LLUUID &item_id = current_item->getListener()->getUUID(); LLInventoryItem *item = gInventory.getItem(item_id); return item; } U32 LLSidepanelInventory::getSelectedCount() { LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild("panel_main_inventory"); std::set selection_list = panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList(); return selection_list.size(); } LLInventoryPanel *LLSidepanelInventory::getActivePanel() { if (!getVisible()) { return NULL; } if (mInventoryPanel->getVisible()) { return mPanelMainInventory->getActivePanel(); } return NULL; } BOOL LLSidepanelInventory::isMainInventoryPanelActive() const { return mInventoryPanel->getVisible(); }