280 lines
7.8 KiB
C++
280 lines
7.8 KiB
C++
/**
|
|
* @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 "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));
|
|
}
|
|
|
|
// 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();
|
|
}
|
|
if (key.has("select"))
|
|
{
|
|
mPanelMainInventory->getPanel()->setSelection(key["select"].asUUID(), TAKE_FOCUS_NO);
|
|
}
|
|
}
|
|
|
|
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()
|
|
{
|
|
performActionOnSelection("activate");
|
|
}
|
|
|
|
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;
|
|
|
|
mInfoBtn->setEnabled(TRUE);
|
|
mShareBtn->setEnabled(TRUE);
|
|
|
|
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;
|
|
}
|