EXT-7963 FIXED (Edit Outfit > Add More > Do not switch to next item type after add/replace)

- Added selected item type (in flat list view) as criterion when determining filter type in 'Add More' panel

- Fixed LLAccordionCtrl::getSelectedTab() method. When 'selection_enabled = false' for LLAccordionCtrlTab, LLAccordionCtrl::getSelectedTab() returned NULL, even if some accordion tab was selected. Now it's OK. Method returns currently selected LLAccordionCtrlTab.

Reviewed by Mike Antipov,  Neal Orman and Richard Nelson at https://codereview.productengine.com/secondlife/r/790/

--HG--
branch : product-engine
master
Paul Guslisty 2010-07-26 14:42:21 +03:00
parent 002bbd885b
commit bdacad23bb
4 changed files with 51 additions and 5 deletions

View File

@ -765,6 +765,17 @@ S32 LLAccordionCtrl::notifyParent(const LLSD& info)
}
return 0;
}
else if(str_action == "deselect_current")
{
// Reset selection to the currently selected tab.
if (mSelectedTab)
{
mSelectedTab->setSelected(false);
mSelectedTab = NULL;
return 1;
}
return 0;
}
}
else if (info.has("scrollToShowRect"))
{

View File

@ -371,9 +371,11 @@ LLAccordionCtrlTab::LLAccordionCtrlTab(const LLAccordionCtrlTab::Params&p)
mHeader = LLUICtrlFactory::create<LLAccordionCtrlTabHeader>(headerParams);
addChild(mHeader, 1);
if (p.selection_enabled)
LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLAccordionCtrlTab::selectOnFocusReceived, this));
if (!p.selection_enabled)
{
LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLAccordionCtrlTab::selectOnFocusReceived, this));
LLFocusableElement::setFocusLostCallback(boost::bind(&LLAccordionCtrlTab::deselectOnFocusLost, this));
}
reshape(100, 200,FALSE);
@ -598,6 +600,15 @@ void LLAccordionCtrlTab::selectOnFocusReceived()
getParent()->notifyParent(LLSD().with("action", "select_current"));
}
void LLAccordionCtrlTab::deselectOnFocusLost()
{
if(getParent()) // A parent may not be set if tabs are added dynamically.
{
getParent()->notifyParent(LLSD().with("action", "deselect_current"));
}
}
S32 LLAccordionCtrlTab::getHeaderHeight()
{
return mHeaderVisible?HEADER_HEIGHT:0;

View File

@ -220,6 +220,7 @@ protected:
LLView* findContainerView ();
void selectOnFocusReceived();
void deselectOnFocusLost();
private:

View File

@ -841,15 +841,38 @@ void LLPanelOutfitEdit::filterWearablesBySelectedItem(void)
bool more_than_one_selected = ids.size() > 1;
bool is_dummy_item = (ids.size() && dynamic_cast<LLPanelDummyClothingListItem*>(mCOFWearables->getSelectedItem()));
//selected and expanded accordion tabs determine filtering when no item is selected
// selected, expanded accordion tabs and selection in flat list view determine filtering when no item is selected in COF
// selection in flat list view participates in determining filtering because of EXT-7963
// So the priority of criterions in is:
// 1. Selected accordion tab | IF (any accordion selected)
// | filter_type = selected_accordion_type
// 2. Selected item in flat list view | ELSEIF (any item in flat list view selected)
// | filter_type = selected_item_type
// 3. Expanded accordion tab | ELSEIF (any accordion expanded)
// | filter_type = expanded accordion_type
if (nothing_selected)
{
showWearablesListView();
//selected accordion tab is more priority than expanded tab when determining filtering
//selected accordion tab is more priority than expanded tab
//and selected item in flat list view of 'Add more' panel when
//determining filtering
LLAssetType::EType type = mCOFWearables->getSelectedAccordionAssetType();
if (type == LLAssetType::AT_NONE)
{
{ //no accordion selected
// when no accordion selected then selected item from flat list view
// has more priority than expanded when determining filtering
LLUUID selected_item_id = mWearableItemsList->getSelectedUUID();
LLViewerInventoryItem* item = gInventory.getLinkedItem(selected_item_id);
if(item)
{
showFilteredWearablesListView(item->getWearableType());
return;
}
// when no accordion selected and no selected items in flat list view
// determine filtering according to expanded accordion
type = mCOFWearables->getExpandedAccordionAssetType();
}