llsidepanelinventory.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:9k
源码类别:
游戏引擎
开发平台:
C++ Builder
- /**
- * @file LLSidepanelInventory.cpp
- * @brief Side Bar "Inventory" panel
- *
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- *
- * Copyright (c) 2009-2010, 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 "llbutton.h"
- #include "llinventorybridge.h"
- #include "llinventorypanel.h"
- #include "llpanelmaininventory.h"
- #include "llsidepaneliteminfo.h"
- #include "llsidepaneltaskinfo.h"
- #include "lltabcontainer.h"
- #include "llselectmgr.h"
- static LLRegisterPanelClassWrapper<LLSidepanelInventory> 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<LLPanel>("sidepanel__inventory_panel");
- mInfoBtn = mInventoryPanel->getChild<LLButton>("info_btn");
- mInfoBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onInfoButtonClicked, this));
- mShareBtn = mInventoryPanel->getChild<LLButton>("share_btn");
- mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this));
- mWearBtn = mInventoryPanel->getChild<LLButton>("wear_btn");
- mWearBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onWearButtonClicked, this));
- mPlayBtn = mInventoryPanel->getChild<LLButton>("play_btn");
- mPlayBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onPlayButtonClicked, this));
- mTeleportBtn = mInventoryPanel->getChild<LLButton>("teleport_btn");
- mTeleportBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onTeleportButtonClicked, this));
- mOverflowBtn = mInventoryPanel->getChild<LLButton>("overflow_btn");
- mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onOverflowButtonClicked, this));
- mPanelMainInventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
- mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2));
- /*
- 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<LLInventoryPanel>("All Items");
- my_inventory_panel->addHideFolderType(LLFolderType::FT_LANDMARK);
- my_inventory_panel->addHideFolderType(LLFolderType::FT_FAVORITE);
- */
- }
- // UI elements from item panel
- {
- mItemPanel = getChild<LLSidepanelItemInfo>("sidepanel__item_panel");
- LLButton* back_btn = mItemPanel->getChild<LLButton>("back_btn");
- back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this));
- }
- // UI elements from task panel
- {
- mTaskPanel = getChild<LLSidepanelTaskInfo>("sidepanel__task_panel");
- if (mTaskPanel)
- {
- LLButton* back_btn = mTaskPanel->getChild<LLButton>("back_btn");
- back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this));
- }
- }
- return TRUE;
- }
- void LLSidepanelInventory::onOpen(const LLSD& key)
- {
- 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()
- {
- }
- void LLSidepanelInventory::performActionOnSelection(const std::string &action)
- {
- LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
- LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem();
- if (!current_item)
- {
- return;
- }
- current_item->getListener()->performAction(panel_main_inventory->getActivePanel()->getRootFolder(), 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<LLFolderViewItem*> &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);
- const LLInventoryItem *item = getSelectedItem();
- if (!item)
- return;
- bool is_single_selection = getSelectedCount() == 1;
- mInfoBtn->setEnabled(is_single_selection);
- mShareBtn->setEnabled(is_single_selection);
- switch(item->getInventoryType())
- {
- case LLInventoryType::IT_WEARABLE:
- case LLInventoryType::IT_OBJECT:
- case LLInventoryType::IT_ATTACHMENT:
- mWearBtn->setVisible(TRUE);
- mWearBtn->setEnabled(TRUE);
- break;
- case LLInventoryType::IT_SOUND:
- case LLInventoryType::IT_GESTURE:
- case LLInventoryType::IT_ANIMATION:
- mPlayBtn->setVisible(TRUE);
- mPlayBtn->setEnabled(TRUE);
- break;
- case LLInventoryType::IT_LANDMARK:
- mTeleportBtn->setVisible(TRUE);
- mTeleportBtn->setEnabled(TRUE);
- break;
- default:
- break;
- }
- }
- LLInventoryItem *LLSidepanelInventory::getSelectedItem()
- {
- LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("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<LLPanelMainInventory>("panel_main_inventory");
- std::set<LLUUID> selection_list;
- panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList(selection_list);
- 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();
- }