diff options
author | Loren Shih <seraph@lindenlab.com> | 2009-11-17 13:00:26 -0500 |
---|---|---|
committer | Loren Shih <seraph@lindenlab.com> | 2009-11-17 13:00:26 -0500 |
commit | 53beee9e0837865163ff700df4b8d452135da9eb (patch) | |
tree | 091ad1000bacecec6f28639bf6e1227254ac7638 /indra/newview/llpaneloutfitsinventory.cpp | |
parent | 32dccaf3d89b40b711d69088a3e390119c7efc7f (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.cpp | 262 |
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 // +//////////////////////////////////////////////////////////////////////////////// + |