summaryrefslogtreecommitdiff
path: root/indra/newview/llcofwearables.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llcofwearables.cpp')
-rw-r--r--indra/newview/llcofwearables.cpp135
1 files changed, 115 insertions, 20 deletions
diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp
index 79ce2f8f6b..aa8cc01f7d 100644
--- a/indra/newview/llcofwearables.cpp
+++ b/indra/newview/llcofwearables.cpp
@@ -34,6 +34,8 @@
#include "llcofwearables.h"
+#include "llaccordionctrl.h"
+#include "llaccordionctrltab.h"
#include "llagentdata.h"
#include "llagentwearables.h"
#include "llappearancemgr.h"
@@ -58,13 +60,19 @@ static const LLWearableItemNameComparator WEARABLE_NAME_COMPARATOR;
class CofContextMenu : public LLListContextMenu
{
protected:
- static void updateCreateWearableLabel(LLMenuGL* menu, const LLUUID& item_id)
+ CofContextMenu(LLCOFWearables* cof_wearables)
+ : mCOFWearables(cof_wearables)
+ {
+ llassert(mCOFWearables);
+ }
+
+ void updateCreateWearableLabel(LLMenuGL* menu, const LLUUID& item_id)
{
LLMenuItemGL* menu_item = menu->getChild<LLMenuItemGL>("create_new");
+ LLWearableType::EType w_type = getWearableType(item_id);
// Hide the "Create new <WEARABLE_TYPE>" if it's irrelevant.
- LLViewerInventoryItem* item = gInventory.getLinkedItem(item_id);
- if (!item || !item->isWearableType())
+ if (w_type == LLWearableType::WT_NONE)
{
menu_item->setVisible(FALSE);
return;
@@ -72,25 +80,67 @@ protected:
// Set proper label for the "Create new <WEARABLE_TYPE>" menu item.
LLStringUtil::format_map_t args;
- LLWearableType::EType w_type = item->getWearableType();
args["[WEARABLE_TYPE]"] = LLWearableType::getTypeDefaultNewName(w_type);
std::string new_label = LLTrans::getString("CreateNewWearable", args);
menu_item->setLabel(new_label);
}
- static void createNew(const LLUUID& item_id)
+ void createNew(const LLUUID& item_id)
+ {
+ LLAgentWearables::createWearable(getWearableType(item_id), true);
+ }
+
+ // Get wearable type of the given item.
+ //
+ // There is a special case: so-called "dummy items"
+ // (i.e. the ones that are there just to indicate that you're not wearing
+ // any wearables of the corresponding type. They are currently grayed out
+ // and suffixed with "not worn").
+ // Those items don't have an UUID, but they do have an associated wearable type.
+ // If the user has invoked context menu for such item,
+ // we ignore the passed item_id and retrieve wearable type from the item.
+ LLWearableType::EType getWearableType(const LLUUID& item_id)
{
- LLViewerInventoryItem* item = gInventory.getLinkedItem(item_id);
- if (!item || !item->isWearableType()) return;
+ if (!isDummyItem(item_id))
+ {
+ LLViewerInventoryItem* item = gInventory.getLinkedItem(item_id);
+ if (item && item->isWearableType())
+ {
+ return item->getWearableType();
+ }
+ }
+ else if (mCOFWearables) // dummy item selected
+ {
+ LLPanelDummyClothingListItem* item;
+
+ item = dynamic_cast<LLPanelDummyClothingListItem*>(mCOFWearables->getSelectedItem());
+ if (item)
+ {
+ return item->getWearableType();
+ }
+ }
- LLAgentWearables::createWearable(item->getWearableType(), true);
+ return LLWearableType::WT_NONE;
}
+
+ static bool isDummyItem(const LLUUID& item_id)
+ {
+ return item_id.isNull();
+ }
+
+ LLCOFWearables* mCOFWearables;
};
//////////////////////////////////////////////////////////////////////////
-class CofAttachmentContextMenu : public LLListContextMenu
+class CofAttachmentContextMenu : public CofContextMenu
{
+public:
+ CofAttachmentContextMenu(LLCOFWearables* cof_wearables)
+ : CofContextMenu(cof_wearables)
+ {
+ }
+
protected:
/*virtual*/ LLContextMenu* createMenu()
@@ -108,8 +158,13 @@ protected:
class CofClothingContextMenu : public CofContextMenu
{
-protected:
+public:
+ CofClothingContextMenu(LLCOFWearables* cof_wearables)
+ : CofContextMenu(cof_wearables)
+ {
+ }
+protected:
/*virtual*/ LLContextMenu* createMenu()
{
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
@@ -121,7 +176,7 @@ protected:
registrar.add("Clothing.MoveUp", boost::bind(moveWearable, selected_id, false));
registrar.add("Clothing.MoveDown", boost::bind(moveWearable, selected_id, true));
registrar.add("Clothing.Edit", boost::bind(LLAgentWearables::editWearable, selected_id));
- registrar.add("Clothing.Create", boost::bind(createNew, selected_id));
+ registrar.add("Clothing.Create", boost::bind(&CofClothingContextMenu::createNew, this, selected_id));
enable_registrar.add("Clothing.OnEnable", boost::bind(&CofClothingContextMenu::onEnable, this, _2));
@@ -153,7 +208,7 @@ protected:
}
else if ("edit" == param)
{
- return gAgentWearables.isWearableModifiable(selected_id);
+ return mUUIDs.size() == 1 && gAgentWearables.isWearableModifiable(selected_id);
}
return true;
}
@@ -171,8 +226,13 @@ protected:
class CofBodyPartContextMenu : public CofContextMenu
{
-protected:
+public:
+ CofBodyPartContextMenu(LLCOFWearables* cof_wearables)
+ : CofContextMenu(cof_wearables)
+ {
+ }
+protected:
/*virtual*/ LLContextMenu* createMenu()
{
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
@@ -184,7 +244,7 @@ protected:
LLPanelOutfitEdit* panel_oe = dynamic_cast<LLPanelOutfitEdit*>(LLSideTray::getInstance()->getPanel("panel_outfit_edit"));
registrar.add("BodyPart.Replace", boost::bind(&LLPanelOutfitEdit::onReplaceBodyPartMenuItemClicked, panel_oe, selected_id));
registrar.add("BodyPart.Edit", boost::bind(LLAgentWearables::editWearable, selected_id));
- registrar.add("BodyPart.Create", boost::bind(createNew, selected_id));
+ registrar.add("BodyPart.Create", boost::bind(&CofBodyPartContextMenu::createNew, this, selected_id));
enable_registrar.add("BodyPart.OnEnable", boost::bind(&CofBodyPartContextMenu::onEnable, this, _2));
@@ -204,7 +264,7 @@ protected:
if ("edit" == param)
{
- return gAgentWearables.isWearableModifiable(selected_id);
+ return mUUIDs.size() == 1 && gAgentWearables.isWearableModifiable(selected_id);
}
return true;
@@ -219,9 +279,9 @@ LLCOFWearables::LLCOFWearables() : LLPanel(),
mBodyParts(NULL),
mLastSelectedList(NULL)
{
- mClothingMenu = new CofClothingContextMenu();
- mAttachmentMenu = new CofAttachmentContextMenu();
- mBodyPartMenu = new CofBodyPartContextMenu();
+ mClothingMenu = new CofClothingContextMenu(this);
+ mAttachmentMenu = new CofAttachmentContextMenu(this);
+ mBodyPartMenu = new CofBodyPartContextMenu(this);
};
LLCOFWearables::~LLCOFWearables()
@@ -387,7 +447,7 @@ LLPanelClothingListItem* LLCOFWearables::buildClothingListItem(LLViewerInventory
item_panel->childSetAction("btn_edit", mCOFCallbacks.mEditWearable);
//turning on gray separator line for the last item in the items group of the same wearable type
- item_panel->childSetVisible("wearable_type_separator_panel", last);
+ item_panel->childSetVisible("wearable_type_separator_icon", last);
return item_panel;
}
@@ -421,7 +481,7 @@ LLPanelDeletableWearableListItem* LLCOFWearables::buildAttachemntListItem(LLView
llassert(item);
if (!item) return NULL;
- LLPanelDeletableWearableListItem* item_panel = LLPanelDeletableWearableListItem::create(item);
+ LLPanelAttachmentListItem* item_panel = LLPanelAttachmentListItem::create(item);
if (!item_panel) return NULL;
//setting callbacks
@@ -499,6 +559,14 @@ LLPanel* LLCOFWearables::getSelectedItem()
return mLastSelectedList->getSelectedItem();
}
+void LLCOFWearables::getSelectedItems(std::vector<LLPanel*>& selected_items) const
+{
+ if (mLastSelectedList)
+ {
+ mLastSelectedList->getSelectedItems(selected_items);
+ }
+}
+
void LLCOFWearables::clear()
{
mAttachments->clear();
@@ -506,6 +574,33 @@ void LLCOFWearables::clear()
mBodyParts->clear();
}
+LLAssetType::EType LLCOFWearables::getExpandedAccordionAssetType()
+{
+ typedef std::map<std::string, LLAssetType::EType> type_map_t;
+
+ static type_map_t type_map;
+ static LLAccordionCtrl* accordion_ctrl = getChild<LLAccordionCtrl>("cof_wearables_accordion");
+
+ if (type_map.empty())
+ {
+ type_map["tab_clothing"] = LLAssetType::AT_CLOTHING;
+ type_map["tab_attachments"] = LLAssetType::AT_OBJECT;
+ type_map["tab_body_parts"] = LLAssetType::AT_BODYPART;
+ }
+
+ const LLAccordionCtrlTab* tab = accordion_ctrl->getExpandedTab();
+ LLAssetType::EType result = LLAssetType::AT_NONE;
+
+ if (tab)
+ {
+ type_map_t::iterator i = type_map.find(tab->getName());
+ llassert(i != type_map.end());
+ result = i->second;
+ }
+
+ return result;
+}
+
void LLCOFWearables::onListRightClick(LLUICtrl* ctrl, S32 x, S32 y, LLListContextMenu* menu)
{
if(menu)