summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/llcofwearables.cpp62
-rw-r--r--indra/newview/llcofwearables.h9
-rw-r--r--indra/newview/llpaneloutfitedit.cpp11
3 files changed, 79 insertions, 3 deletions
diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp
index f278fb6a7b..d83706de52 100644
--- a/indra/newview/llcofwearables.cpp
+++ b/indra/newview/llcofwearables.cpp
@@ -281,7 +281,11 @@ LLCOFWearables::LLCOFWearables() : LLPanel(),
mAttachments(NULL),
mClothing(NULL),
mBodyParts(NULL),
- mLastSelectedList(NULL)
+ mLastSelectedList(NULL),
+ mClothingTab(NULL),
+ mAttachmentsTab(NULL),
+ mBodyPartsTab(NULL),
+ mLastSelectedTab(NULL)
{
mClothingMenu = new CofClothingContextMenu(this);
mAttachmentMenu = new CofAttachmentContextMenu(this);
@@ -319,6 +323,16 @@ BOOL LLCOFWearables::postBuild()
mAttachments->setComparator(&WEARABLE_NAME_COMPARATOR);
mBodyParts->setComparator(&WEARABLE_NAME_COMPARATOR);
+
+ mClothingTab = getChild<LLAccordionCtrlTab>("tab_clothing");
+ mClothingTab->setDropDownStateChangedCallback(boost::bind(&LLCOFWearables::onAccordionTabStateChanged, this, _1, _2));
+
+ mAttachmentsTab = getChild<LLAccordionCtrlTab>("tab_attachments");
+ mAttachmentsTab->setDropDownStateChangedCallback(boost::bind(&LLCOFWearables::onAccordionTabStateChanged, this, _1, _2));
+
+ mBodyPartsTab = getChild<LLAccordionCtrlTab>("tab_body_parts");
+ mBodyPartsTab->setDropDownStateChangedCallback(boost::bind(&LLCOFWearables::onAccordionTabStateChanged, this, _1, _2));
+
return LLPanel::postBuild();
}
@@ -338,6 +352,28 @@ void LLCOFWearables::onSelectionChange(LLFlatListView* selected_list)
onCommit();
}
+void LLCOFWearables::onAccordionTabStateChanged(LLUICtrl* ctrl, const LLSD& expanded)
+{
+ bool had_selected_items = mClothing->numSelected() || mAttachments->numSelected() || mBodyParts->numSelected();
+ mClothing->resetSelection(true);
+ mAttachments->resetSelection(true);
+ mBodyParts->resetSelection(true);
+
+ bool tab_selection_changed = false;
+ LLAccordionCtrlTab* tab = dynamic_cast<LLAccordionCtrlTab*>(ctrl);
+ if (tab && tab != mLastSelectedTab)
+ {
+ mLastSelectedTab = tab;
+ tab_selection_changed = true;
+ }
+
+ if (had_selected_items || tab_selection_changed)
+ {
+ //sending commit signal to indicate selection changes
+ onCommit();
+ }
+}
+
void LLCOFWearables::refresh()
{
typedef std::vector<LLSD> values_vector_t;
@@ -617,6 +653,30 @@ LLAssetType::EType LLCOFWearables::getExpandedAccordionAssetType()
return result;
}
+LLAssetType::EType LLCOFWearables::getSelectedAccordionAssetType()
+{
+ //*TODO share the code with ::getExpandedAccordionAssetType(...)
+ static LLAccordionCtrl* accordion_ctrl = getChild<LLAccordionCtrl>("cof_wearables_accordion");
+ const LLAccordionCtrlTab* selected_tab = accordion_ctrl->getSelectedTab();
+
+ if (selected_tab == mClothingTab)
+ {
+ return LLAssetType::AT_CLOTHING;
+ }
+ else if (selected_tab == mAttachmentsTab)
+ {
+ return LLAssetType::AT_OBJECT;
+ }
+ else if (selected_tab == mBodyPartsTab)
+ {
+ return LLAssetType::AT_BODYPART;
+ }
+ else
+ {
+ return LLAssetType::AT_NONE;
+ }
+}
+
void LLCOFWearables::onListRightClick(LLUICtrl* ctrl, S32 x, S32 y, LLListContextMenu* menu)
{
if(menu)
diff --git a/indra/newview/llcofwearables.h b/indra/newview/llcofwearables.h
index 62f4cfc692..de148e0d46 100644
--- a/indra/newview/llcofwearables.h
+++ b/indra/newview/llcofwearables.h
@@ -40,6 +40,7 @@
#include "llappearancemgr.h"
#include "llinventorymodel.h"
+class LLAccordionCtrlTab;
class LLListContextMenu;
class LLPanelClothingListItem;
class LLPanelBodyPartsListItem;
@@ -84,6 +85,7 @@ public:
void clear();
LLAssetType::EType getExpandedAccordionAssetType();
+ LLAssetType::EType getSelectedAccordionAssetType();
LLCOFCallbacks& getCOFCallbacks() { return mCOFCallbacks; }
@@ -94,6 +96,7 @@ protected:
void addClothingTypesDummies(const LLAppearanceMgr::wearables_by_type_t& clothing_by_type);
void onSelectionChange(LLFlatListView* selected_list);
+ void onAccordionTabStateChanged(LLUICtrl* ctrl, const LLSD& expanded);
LLPanelClothingListItem* buildClothingListItem(LLViewerInventoryItem* item, bool first, bool last);
LLPanelBodyPartsListItem* buildBodypartListItem(LLViewerInventoryItem* item);
@@ -107,6 +110,12 @@ protected:
LLFlatListView* mLastSelectedList;
+ LLAccordionCtrlTab* mClothingTab;
+ LLAccordionCtrlTab* mAttachmentsTab;
+ LLAccordionCtrlTab* mBodyPartsTab;
+
+ LLAccordionCtrlTab* mLastSelectedTab;
+
LLCOFCallbacks mCOFCallbacks;
LLListContextMenu* mClothingMenu;
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index 289fe8c570..c397dd5092 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -731,12 +731,19 @@ void LLPanelOutfitEdit::filterWearablesBySelectedItem(void)
bool more_than_one_selected = ids.size() > 1;
bool is_dummy_item = (ids.size() && dynamic_cast<LLPanelDummyClothingListItem*>(mCOFWearables->getSelectedItem()));
- //expanded accordion tab determines filtering when no item is selected
+ //selected and expanded accordion tabs determine filtering when no item is selected
if (nothing_selected)
{
showWearablesListView();
- switch (mCOFWearables->getExpandedAccordionAssetType())
+ //selected accordion tab is more priority than expanded tab when determining filtering
+ LLAssetType::EType type = mCOFWearables->getSelectedAccordionAssetType();
+ if (type == LLAssetType::AT_NONE)
+ {
+ type = mCOFWearables->getExpandedAccordionAssetType();
+ }
+
+ switch (type)
{
case LLAssetType::AT_OBJECT:
applyListViewFilter(LVIT_ATTACHMENT);