summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Litovchuk <slitovchuk@productengine.com>2010-06-02 16:16:26 +0300
committerSergei Litovchuk <slitovchuk@productengine.com>2010-06-02 16:16:26 +0300
commitb678d2888c5da04cf4d778b29a60a78c8c1aff5f (patch)
tree2ff6930119837f31141f60e288b653c3f4328e60
parent508923ac0025a590996ade8503acaad850f26376 (diff)
EXT-7239 FIXED Added wearing double-clicked item or uutfit.
- Added outfit list item with double click support. - Added wearing/detaching single item on double click. - Added replacing current outfit with an outfit from double clicked accordion tab. Reviewed by Neal Orman at https://codereview.productengine.com/secondlife/r/493/. --HG-- branch : product-engine
-rw-r--r--indra/newview/lloutfitslist.cpp52
-rw-r--r--indra/newview/lloutfitslist.h2
-rw-r--r--indra/newview/llwearableitemslist.cpp62
-rw-r--r--indra/newview/llwearableitemslist.h25
4 files changed, 125 insertions, 16 deletions
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index 8f189a1e9f..66002d4044 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -49,6 +49,8 @@
#include "llvoavatarself.h"
#include "llwearableitemslist.h"
+static bool is_tab_header_clicked(LLAccordionCtrlTab* tab, S32 y);
+
//////////////////////////////////////////////////////////////////////////
class OutfitContextMenu : public LLListContextMenu
@@ -176,8 +178,6 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)
static LLXMLNodePtr accordionXmlNode = getAccordionTabXMLNode();
LLAccordionCtrlTab* tab = LLUICtrlFactory::defaultBuilder<LLAccordionCtrlTab>(accordionXmlNode, NULL, NULL);
- tab->setRightMouseDownCallback(boost::bind(&LLOutfitsList::onAccordionTabRightClick, this,
- _1, _2, _3, cat_id));
tab->setName(name);
tab->setTitle(name);
@@ -198,6 +198,12 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)
// Map the new tab with outfit category UUID.
mOutfitsMap.insert(LLOutfitsList::outfits_map_value_t(cat_id, tab));
+ tab->setRightMouseDownCallback(boost::bind(&LLOutfitsList::onAccordionTabRightClick, this,
+ _1, _2, _3, cat_id));
+
+ tab->setDoubleClickCallback(boost::bind(&LLOutfitsList::onAccordionTabDoubleClick, this,
+ _1, _2, _3, cat_id));
+
// Setting tab focus callback to monitor currently selected outfit.
tab->setFocusReceivedCallback(boost::bind(&LLOutfitsList::changeOutfitSelection, this, list, cat_id));
@@ -510,22 +516,30 @@ void LLOutfitsList::applyFilter(const std::string& new_filter_substring)
void LLOutfitsList::onAccordionTabRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id)
{
LLAccordionCtrlTab* tab = dynamic_cast<LLAccordionCtrlTab*>(ctrl);
- if(mOutfitMenu && tab && tab->getHeaderVisible() && cat_id.notNull())
+ if(mOutfitMenu && is_tab_header_clicked(tab, y) && cat_id.notNull())
{
- S32 header_bottom = tab->getLocalRect().getHeight() - tab->getHeaderHeight();
- if(y >= header_bottom)
+ // Focus tab header to trigger tab selection change.
+ LLUICtrl* header = tab->findChild<LLUICtrl>("dd_header");
+ if (header)
{
- // Focus tab header to trigger tab selection change.
- LLUICtrl* header = tab->findChild<LLUICtrl>("dd_header");
- if (header)
- {
- header->setFocus(TRUE);
- }
-
- uuid_vec_t selected_uuids;
- selected_uuids.push_back(cat_id);
- mOutfitMenu->show(ctrl, selected_uuids, x, y);
+ header->setFocus(TRUE);
}
+
+ uuid_vec_t selected_uuids;
+ selected_uuids.push_back(cat_id);
+ mOutfitMenu->show(ctrl, selected_uuids, x, y);
+ }
+}
+
+void LLOutfitsList::onAccordionTabDoubleClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id)
+{
+ LLAccordionCtrlTab* tab = dynamic_cast<LLAccordionCtrlTab*>(ctrl);
+ if(is_tab_header_clicked(tab, y) && cat_id.notNull())
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
+ if (!cat) return;
+
+ LLAppearanceMgr::instance().wearInventoryCategory( cat, FALSE, FALSE );
}
}
@@ -551,4 +565,12 @@ void LLOutfitsList::onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y)
LLWearableItemsList::ContextMenu::instance().show(list, selected_uuids, x, y);
}
+
+bool is_tab_header_clicked(LLAccordionCtrlTab* tab, S32 y)
+{
+ if(!tab || !tab->getHeaderVisible()) return false;
+
+ S32 header_bottom = tab->getLocalRect().getHeight() - tab->getHeaderHeight();
+ return y >= header_bottom;
+}
// EOF
diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h
index 1da7360c2e..d3da850e19 100644
--- a/indra/newview/lloutfitslist.h
+++ b/indra/newview/lloutfitslist.h
@@ -107,7 +107,7 @@ private:
void applyFilter(const std::string& new_filter_substring);
void onAccordionTabRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id);
-
+ void onAccordionTabDoubleClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id);
void onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y);
LLInventoryCategoriesObserver* mCategoriesObserver;
diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index 161cd40cfc..cfb48a22bb 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -94,6 +94,47 @@ LLPanelWearableListItem::LLPanelWearableListItem(LLViewerInventoryItem* item)
//////////////////////////////////////////////////////////////////////////
// static
+LLPanelWearableOutfitItem* LLPanelWearableOutfitItem::create(LLViewerInventoryItem* item)
+{
+ LLPanelWearableOutfitItem* list_item = NULL;
+ if (item)
+ {
+ list_item = new LLPanelWearableOutfitItem(item);
+ list_item->init();
+ }
+ return list_item;
+}
+
+BOOL LLPanelWearableOutfitItem::handleDoubleClick(S32 x, S32 y, MASK mask)
+{
+ LLViewerInventoryItem* item = getItem();
+ if (item)
+ {
+ LLUUID id = item->getUUID();
+
+ if (get_is_item_worn(id))
+ {
+ LLAppearanceMgr::getInstance()->removeItemFromAvatar(id);
+ }
+ else
+ {
+ LLAppearanceMgr::getInstance()->wearItemOnAvatar(id, true, false);
+ }
+ }
+
+ return LLUICtrl::handleDoubleClick(x, y, mask);
+}
+
+LLPanelWearableOutfitItem::LLPanelWearableOutfitItem(LLViewerInventoryItem* item)
+: LLPanelInventoryListItemBase(item)
+{
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+// static
LLPanelClothingListItem* LLPanelClothingListItem::create(LLViewerInventoryItem* item)
{
LLPanelClothingListItem* list_item = NULL;
@@ -402,6 +443,27 @@ LLWearableItemsList::LLWearableItemsList(const LLWearableItemsList::Params& p)
LLWearableItemsList::~LLWearableItemsList()
{}
+// virtual
+void LLWearableItemsList::addNewItem(LLViewerInventoryItem* item, bool rearrange /*= true*/)
+{
+ if (!item)
+ {
+ llwarns << "No inventory item. Couldn't create flat list item." << llendl;
+ llassert(item != NULL);
+ }
+
+ LLPanelWearableOutfitItem *list_item = LLPanelWearableOutfitItem::create(item);
+ if (!list_item)
+ return;
+
+ bool is_item_added = addItem(list_item, item->getUUID(), ADD_BOTTOM, rearrange);
+ if (!is_item_added)
+ {
+ llwarns << "Couldn't add flat list item." << llendl;
+ llassert(is_item_added);
+ }
+}
+
void LLWearableItemsList::updateList(const LLUUID& category_id)
{
LLInventoryModel::cat_array_t cat_array;
diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h
index de024ed220..995a8976f3 100644
--- a/indra/newview/llwearableitemslist.h
+++ b/indra/newview/llwearableitemslist.h
@@ -70,6 +70,29 @@ protected:
LLPanelWearableListItem(LLViewerInventoryItem* item);
};
+/**
+ * @class LLPanelWearableOutfitItem
+ *
+ * Outfit item for "My Outfits" list.
+ * Extends LLPanelInventoryListItemBase with handling
+ * double click to wear the item.
+ */
+class LLPanelWearableOutfitItem : public LLPanelInventoryListItemBase
+{
+ LOG_CLASS(LLPanelWearableOutfitItem);
+public:
+ static LLPanelWearableOutfitItem* create(LLViewerInventoryItem* item);
+
+ /**
+ * Puts item on if it is not worn by agent
+ * otherwise takes it off on double click.
+ */
+ /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
+
+protected:
+
+ LLPanelWearableOutfitItem(LLViewerInventoryItem* item);
+};
class LLPanelDeletableWearableListItem : public LLPanelWearableListItem
{
@@ -309,6 +332,8 @@ public:
virtual ~LLWearableItemsList();
+ /*virtual*/ void addNewItem(LLViewerInventoryItem* item, bool rearrange = true);
+
void updateList(const LLUUID& category_id);
protected: