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 | |
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')
-rw-r--r-- | indra/newview/llpanelmaininventory.cpp | 46 | ||||
-rw-r--r-- | indra/newview/llpanelmaininventory.h | 29 | ||||
-rw-r--r-- | indra/newview/llpaneloutfitsinventory.cpp | 262 | ||||
-rw-r--r-- | indra/newview/llpaneloutfitsinventory.h | 36 | ||||
-rw-r--r-- | indra/newview/llsidepanelappearance.cpp | 19 | ||||
-rw-r--r-- | indra/newview/llsidepanelappearance.h | 4 |
6 files changed, 264 insertions, 132 deletions
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 6c7d434eeb..9f723169e1 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -197,28 +197,6 @@ BOOL LLPanelMainInventory::postBuild() return TRUE;
}
-void LLPanelMainInventory::initListCommandsHandlers()
-{
- mListCommands = getChild<LLPanel>("bottom_panel");
-
- mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this));
- mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this));
- mListCommands->childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this));
-
- LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn");
- trash_btn->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this
- , _4 // BOOL drop
- , _5 // EDragAndDropType cargo_type
- , _7 // EAcceptance* accept
- ));
-
- mCommitCallbackRegistrar.add("Inventory.GearDefault.Custom.Action", boost::bind(&LLPanelMainInventory::onCustomAction, this, _2));
- mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2));
- mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
-
-}
-
// Destroys the object
LLPanelMainInventory::~LLPanelMainInventory( void )
{
@@ -863,9 +841,30 @@ void LLFloaterInventoryFinder::selectNoTypes(void* user_data) self->childSetValue("check_snapshot", FALSE);
}
+//////////////////////////////////////////////////////////////////////////////////
+// List Commands //
+void LLPanelMainInventory::initListCommandsHandlers()
+{
+ mListCommands = getChild<LLPanel>("bottom_panel");
+ mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this));
+ mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this));
+ mListCommands->childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this));
+ LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn");
+ trash_btn->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this
+ , _4 // BOOL drop
+ , _5 // EDragAndDropType cargo_type
+ , _7 // EAcceptance* accept
+ ));
+
+ mCommitCallbackRegistrar.add("Inventory.GearDefault.Custom.Action", boost::bind(&LLPanelMainInventory::onCustomAction, this, _2));
+ mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2));
+ mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+
+}
void LLPanelMainInventory::updateListCommands()
{
@@ -1018,3 +1017,6 @@ bool LLPanelMainInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType }
return true;
}
+
+// List Commands //
+////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index fbc0f09c50..627be21577 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -111,7 +111,20 @@ protected: void resetFilters();
void setSortBy(const LLSD& userdata);
- // List Commands Handlers
+private:
+ LLFloaterInventoryFinder* getFinder();
+
+ LLFilterEditor* mFilterEditor;
+ LLTabContainer* mFilterTabs;
+ LLHandle<LLFloater> mFinderHandle;
+ LLInventoryPanel* mActivePanel;
+ LLSaveFolderState* mSavedFolderState;
+ std::string mFilterText;
+
+
+ //////////////////////////////////////////////////////////////////////////////////
+ // List Commands //
+protected:
void initListCommandsHandlers();
void updateListCommands();
void onGearButtonClick();
@@ -122,22 +135,12 @@ protected: BOOL isActionEnabled(const LLSD& command_name);
void onCustomAction(const LLSD& command_name);
bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept);
-
-
private:
- LLFloaterInventoryFinder* getFinder();
-
- LLFilterEditor* mFilterEditor;
- LLTabContainer* mFilterTabs;
- LLHandle<LLFloater> mFinderHandle;
- LLInventoryPanel* mActivePanel;
- LLSaveFolderState* mSavedFolderState;
-
LLPanel* mListCommands;
LLMenuGL* mMenuGearDefault;
LLMenuGL* mMenuAdd;
-
- std::string mFilterText;
+ // List Commands //
+ ////////////////////////////////////////////////////////////////////////////////
};
#endif // LL_LLPANELMAININVENTORY_H
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 // +//////////////////////////////////////////////////////////////////////////////// + diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h index 3f837d3635..4d903a389b 100644 --- a/indra/newview/llpaneloutfitsinventory.h +++ b/indra/newview/llpaneloutfitsinventory.h @@ -42,6 +42,8 @@ class LLFolderViewEventListener; class LLInventoryPanel; class LLSaveFolderState; class LLButton; +class LLMenuGL; +class LLSidepanelAppearance; class LLPanelOutfitsInventory : public LLPanel { @@ -55,22 +57,46 @@ public: void onWear(); void onEdit(); void onNew(); - void updateVerbs(); void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action); void onSelectorButtonClicked(); + LLInventoryPanel* getActivePanel() { return mInventoryPanel; } + + // If a compatible listener type is selected, then return a pointer to that. + // Otherwise, return NULL. + LLFolderViewEventListener* getCorrectListenerForAction(); + void setParent(LLSidepanelAppearance *parent); +protected: + void updateParent(); + bool getIsCorrectType(const LLFolderViewEventListener *listenerp) const; LLFolderView* getRootFolder(); private: - bool getIsCorrectType(const LLFolderViewEventListener *listenerp) const; + LLSidepanelAppearance* mParent; LLInventoryPanel* mInventoryPanel; LLSaveFolderState* mSavedFolderState; - LLButton* mActionBtn; - LLButton* mWearBtn; - LLButton* mEditBtn; + ////////////////////////////////////////////////////////////////////////////////// + // List Commands // +protected: + void initListCommandsHandlers(); + void updateListCommands(); + void onGearButtonClick(); + void onAddButtonClick(); + void showActionMenu(LLMenuGL* menu, std::string spawning_view_name); + void onTrashButtonClick(); + void onClipboardAction(const LLSD& userdata); + BOOL isActionEnabled(const LLSD& command_name); + void onCustomAction(const LLSD& command_name); + bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept); +private: + LLPanel* mListCommands; + LLMenuGL* mMenuGearDefault; + LLMenuGL* mMenuAdd; + // // + //////////////////////////////////////////////////////////////////////////////// }; #endif //LL_LLPANELOUTFITSINVENTORY_H diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index d92e404c2c..aeab3e2876 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -103,6 +103,7 @@ BOOL LLSidepanelAppearance::postBuild() } mPanelOutfitsInventory = dynamic_cast<LLPanelOutfitsInventory *>(getChild<LLPanel>("panel_outfits_inventory")); + mPanelOutfitsInventory->setParent(this); mLookInfo = dynamic_cast<LLPanelLookInfo*>(getChild<LLPanel>("panel_look_info")); if (mLookInfo) @@ -172,10 +173,7 @@ void LLSidepanelAppearance::onFilterEdit(const std::string& search_string) void LLSidepanelAppearance::onWearButtonClicked() { - if (mLookInfo->getVisible()) - { - } - else + if (!mLookInfo->getVisible()) { mPanelOutfitsInventory->onWear(); } @@ -204,10 +202,7 @@ void LLSidepanelAppearance::onEditButtonClicked() void LLSidepanelAppearance::onNewOutfitButtonClicked() { - if (mLookInfo->getVisible()) - { - } - else + if (!mLookInfo->getVisible()) { mPanelOutfitsInventory->onNew(); } @@ -262,12 +257,16 @@ void LLSidepanelAppearance::updateVerbs() bool is_look_info_visible = mLookInfo->getVisible(); mOverflowBtn->setEnabled(false); - if (is_look_info_visible) + if (!is_look_info_visible) { + const bool is_correct_type = (mPanelOutfitsInventory->getCorrectListenerForAction() != NULL); + mEditBtn->setEnabled(is_correct_type); + mWearBtn->setEnabled(is_correct_type); } else { - mPanelOutfitsInventory->updateVerbs(); + mEditBtn->setEnabled(FALSE); + mWearBtn->setEnabled(FALSE); } } diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h index 7be6d2d432..496a1fef72 100644 --- a/indra/newview/llsidepanelappearance.h +++ b/indra/newview/llsidepanelappearance.h @@ -59,6 +59,8 @@ public: void fetchInventory(); void inventoryFetched(); + void updateVerbs(); + private: void onFilterEdit(const std::string& search_string); @@ -71,8 +73,6 @@ private: void toggleLookInfoPanel(BOOL visible); void toggleWearableEditPanel(BOOL visible, LLWearable* wearable); - void updateVerbs(); - LLFilterEditor* mFilterEditor; LLPanelOutfitsInventory* mPanelOutfitsInventory; LLPanelLookInfo* mLookInfo; |