summaryrefslogtreecommitdiff
path: root/indra/newview/llpaneloutfitsinventory.cpp
diff options
context:
space:
mode:
authorLoren Shih <seraph@lindenlab.com>2009-11-17 13:00:26 -0500
committerLoren Shih <seraph@lindenlab.com>2009-11-17 13:00:26 -0500
commit53beee9e0837865163ff700df4b8d452135da9eb (patch)
tree091ad1000bacecec6f28639bf6e1227254ac7638 /indra/newview/llpaneloutfitsinventory.cpp
parent32dccaf3d89b40b711d69088a3e390119c7efc7f (diff)
EXT-2569 : Separate out LLPanelOutfitsInventory so it's more modular versus being coupled with LLSidepanelAppearance
EXT-2561 : Add standard bottom panel (gear menu, add button, trash icon) Added gear menu and standardized the code. (someday, will create a subclass to share the functionality across panels) Make LLPanelOutfitsInventory more modular, e.g. it no longer knows about the Wear/Edit buttons. --HG-- branch : avatar-pipeline
Diffstat (limited to 'indra/newview/llpaneloutfitsinventory.cpp')
-rw-r--r--indra/newview/llpaneloutfitsinventory.cpp262
1 files changed, 182 insertions, 80 deletions
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index 2964bbe792..5ad9bf056e 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -34,34 +34,36 @@
#include "llpaneloutfitsinventory.h"
#include "llagent.h"
+#include "llagentwearables.h"
+
#include "llbutton.h"
#include "llfloaterreg.h"
-#include "lllandmark.h"
-
#include "llfloaterworldmap.h"
#include "llfloaterinventory.h"
#include "llfoldervieweventlistener.h"
#include "llinventoryfunctions.h"
#include "llinventorypanel.h"
+#include "lllandmark.h"
+#include "llsidepanelappearance.h"
#include "llsidetray.h"
#include "lltabcontainer.h"
-#include "llagentwearables.h"
-#include "llviewerjointattachment.h"
#include "llviewerfoldertype.h"
+#include "llviewerjointattachment.h"
#include "llvoavatarself.h"
+// List Commands
+#include "lldndbutton.h"
+#include "llmenugl.h"
+#include "llviewermenu.h"
+
static LLRegisterPanelClassWrapper<LLPanelOutfitsInventory> t_inventory("panel_outfits_inventory");
LLPanelOutfitsInventory::LLPanelOutfitsInventory() :
mInventoryPanel(NULL),
- mActionBtn(NULL),
- mWearBtn(NULL),
- mEditBtn(NULL)
+ mParent(NULL)
{
mSavedFolderState = new LLSaveFolderState();
mSavedFolderState->setApply(FALSE);
-
- // LLUICtrlFactory::getInstance()->buildPanel(this, "panel_outfits_inventory.xml");
}
LLPanelOutfitsInventory::~LLPanelOutfitsInventory()
@@ -78,16 +80,23 @@ BOOL LLPanelOutfitsInventory::postBuild()
mInventoryPanel->openDefaultFolderForType(LLFolderType::FT_MY_OUTFITS);
mInventoryPanel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onSelectionChange, this, _1, _2));
- LLFolderView* root_folder = getRootFolder();
- root_folder->setReshapeCallback(boost::bind(&LLPanelOutfitsInventory::onSelectionChange, this, _1, _2));
-
- mWearBtn = getChild<LLButton>("wear_btn");
- mEditBtn = getChild<LLButton>("edit_btn");
- mActionBtn = getChild<LLButton>("action_btn");
-
+ initListCommandsHandlers();
return TRUE;
}
+void LLPanelOutfitsInventory::updateParent()
+{
+ if (mParent)
+ {
+ mParent->updateVerbs();
+ }
+}
+
+void LLPanelOutfitsInventory::setParent(LLSidepanelAppearance* parent)
+{
+ mParent = parent;
+}
+
// virtual
void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)
{
@@ -124,12 +133,8 @@ void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)
void LLPanelOutfitsInventory::onWear()
{
- LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem();
- if (!current_item)
- return;
-
- LLFolderViewEventListener* listenerp = current_item->getListener();
- if (getIsCorrectType(listenerp))
+ LLFolderViewEventListener* listenerp = getCorrectListenerForAction();
+ if (listenerp)
{
listenerp->performAction(NULL, NULL,"replaceoutfit");
}
@@ -147,66 +152,9 @@ void LLPanelOutfitsInventory::onNew()
getRootFolder()->setNeedsAutoRename(TRUE);
}
-void LLPanelOutfitsInventory::updateVerbs()
-{
- BOOL enabled = FALSE;
-
- LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem();
- if (current_item)
- {
- LLFolderViewEventListener* listenerp = current_item->getListener();
- if (getIsCorrectType(listenerp))
- {
- enabled = TRUE;
- }
- }
-
- if (mWearBtn)
- {
- mWearBtn->setEnabled(enabled);
- }
- // mEditBtn->setEnabled(enabled);
-}
-
void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
{
- LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem();
- if (!current_item)
- return;
-
- /*
- LLFolderViewEventListener* listenerp = current_item->getListener();
- if (getIsCorrectType(listenerp))
- {
- S32 bottom = 0;
- LLFolderViewItem* folder = current_item->getParentFolder();
-
- while ( folder->getParentFolder() != NULL )
- {
- bottom += folder->getRect().mBottom;
- folder = folder->getParentFolder();
- }
-
- LLRect rect = current_item->getRect();
- LLRect btn_rect(
- rect.mRight - mActionBtn->getRect().getWidth(),
- bottom + rect.mTop,
- rect.mRight,
- bottom + rect.mBottom);
-
- mActionBtn->setRect(btn_rect);
-
- if (!mActionBtn->getVisible())
- mActionBtn->setVisible(TRUE);
- }
- else
- {
- if (mActionBtn->getVisible())
- mActionBtn->setVisible(FALSE);
- }
- */
-
- updateVerbs();
+ updateParent();
}
void LLPanelOutfitsInventory::onSelectorButtonClicked()
@@ -226,6 +174,20 @@ void LLPanelOutfitsInventory::onSelectorButtonClicked()
*/
}
+LLFolderViewEventListener *LLPanelOutfitsInventory::getCorrectListenerForAction()
+{
+ LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem();
+ if (!current_item)
+ return NULL;
+
+ LLFolderViewEventListener* listenerp = current_item->getListener();
+ if (getIsCorrectType(listenerp))
+ {
+ return listenerp;
+ }
+ return NULL;
+}
+
bool LLPanelOutfitsInventory::getIsCorrectType(const LLFolderViewEventListener *listenerp) const
{
if (listenerp->getInventoryType() == LLInventoryType::IT_CATEGORY)
@@ -243,3 +205,143 @@ LLFolderView *LLPanelOutfitsInventory::getRootFolder()
{
return mInventoryPanel->getRootFolder();
}
+
+//////////////////////////////////////////////////////////////////////////////////
+// List Commands //
+
+void LLPanelOutfitsInventory::initListCommandsHandlers()
+{
+ mListCommands = getChild<LLPanel>("bottom_panel");
+
+ mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelOutfitsInventory::onGearButtonClick, this));
+ mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this));
+ mListCommands->childSetAction("add_btn", boost::bind(&LLPanelOutfitsInventory::onAddButtonClick, this));
+
+ LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn");
+ trash_btn->setDragAndDropHandler(boost::bind(&LLPanelOutfitsInventory::handleDragAndDropToTrash, this
+ , _4 // BOOL drop
+ , _5 // EDragAndDropType cargo_type
+ , _7 // EAcceptance* accept
+ ));
+
+ mCommitCallbackRegistrar.add("panel_outfits_inventory_gear_default.Custom.Action", boost::bind(&LLPanelOutfitsInventory::onCustomAction, this, _2));
+ mEnableCallbackRegistrar.add("panel_outfits_inventory_gear_default.Enable", boost::bind(&LLPanelOutfitsInventory::isActionEnabled, this, _2));
+ mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("panel_outfits_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+}
+
+void LLPanelOutfitsInventory::updateListCommands()
+{
+ bool trash_enabled = isActionEnabled("delete");
+
+ mListCommands->childSetEnabled("trash_btn", trash_enabled);
+}
+
+void LLPanelOutfitsInventory::onGearButtonClick()
+{
+ showActionMenu(mMenuGearDefault,"options_gear_btn");
+}
+
+void LLPanelOutfitsInventory::onAddButtonClick()
+{
+ onNew();
+}
+
+void LLPanelOutfitsInventory::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, spawning_view->getRect().getHeight(), &menu_x, &menu_y, this);
+ menu_y += menu->getRect().getHeight();
+ LLMenuGL::showPopup(this, menu, menu_x, menu_y);
+ }
+}
+
+void LLPanelOutfitsInventory::onTrashButtonClick()
+{
+ onClipboardAction("delete");
+}
+
+void LLPanelOutfitsInventory::onClipboardAction(const LLSD& userdata)
+{
+ std::string command_name = userdata.asString();
+ getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name);
+}
+
+void LLPanelOutfitsInventory::onCustomAction(const LLSD& userdata)
+{
+ if (!isActionEnabled(userdata))
+ return;
+
+ const std::string command_name = userdata.asString();
+ if (command_name == "new")
+ {
+ onNew();
+ }
+ if (command_name == "edit")
+ {
+ onEdit();
+ }
+ if (command_name == "wear")
+ {
+ onWear();
+ }
+ if (command_name == "delete")
+ {
+ onClipboardAction("delete");
+ }
+}
+
+BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
+{
+ const std::string command_name = userdata.asString();
+ if (command_name == "delete")
+ {
+ BOOL can_delete = FALSE;
+ LLFolderView *folder = getActivePanel()->getRootFolder();
+ if (folder)
+ {
+ can_delete = TRUE;
+ std::set<LLUUID> selection_set;
+ folder->getSelectionList(selection_set);
+ for (std::set<LLUUID>::iterator iter = selection_set.begin();
+ iter != selection_set.end();
+ ++iter)
+ {
+ const LLUUID &item_id = (*iter);
+ LLFolderViewItem *item = folder->getItemByID(item_id);
+ can_delete &= item->getListener()->isItemRemovable();
+ }
+ return can_delete;
+ }
+ return FALSE;
+ }
+ if (command_name == "edit" ||
+ command_name == "wear")
+ {
+ return (getCorrectListenerForAction() != NULL);
+ }
+ return TRUE;
+}
+
+bool LLPanelOutfitsInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept)
+{
+ *accept = ACCEPT_NO;
+
+ const bool is_enabled = isActionEnabled("delete");
+ if (is_enabled) *accept = ACCEPT_YES_MULTI;
+
+ if (is_enabled && drop)
+ {
+ onClipboardAction("delete");
+ }
+ return true;
+}
+
+// List Commands //
+////////////////////////////////////////////////////////////////////////////////
+