EXT-8061 FIXED resetting selection inside accordion (panel outfit edit)

- added resetting lists selection on tabs state changes
- added committing on tab selection change
- added filtering wearables by at first by a selected tab and then by an expended tab

Reviewed by Vadim Savchuk at https://codereview.productengine.com/secondlife/r/696

--HG--
branch : product-engine
master
Igor Borovkov 2010-07-06 18:11:14 +03:00
parent 3e7af3244f
commit 979dc6257a
3 changed files with 79 additions and 3 deletions

View File

@ -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)

View File

@ -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;

View File

@ -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);