summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/newview/llinventoryitemslist.cpp10
-rw-r--r--indra/newview/llinventoryitemslist.h8
-rw-r--r--indra/newview/lloutfitslist.cpp35
-rw-r--r--indra/newview/lloutfitslist.h2
4 files changed, 43 insertions, 12 deletions
diff --git a/indra/newview/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp
index 2d1d401cd4..9b592e79af 100644
--- a/indra/newview/llinventoryitemslist.cpp
+++ b/indra/newview/llinventoryitemslist.cpp
@@ -322,7 +322,7 @@ LLInventoryItemsList::Params::Params()
LLInventoryItemsList::LLInventoryItemsList(const LLInventoryItemsList::Params& p)
: LLFlatListViewEx(p)
, mNeedsRefresh(false)
-, mPrevVisibility(false)
+, mForceRefresh(false)
{
// TODO: mCommitOnSelectionChange is set to "false" in LLFlatListView
// but reset to true in all derived classes. This settings might need to
@@ -356,14 +356,13 @@ boost::signals2::connection LLInventoryItemsList::setRefreshCompleteCallback(con
void LLInventoryItemsList::doIdle()
{
- bool cur_visibility = getVisible();
- if(cur_visibility != mPrevVisibility || mNeedsRefresh)
+ if (!mNeedsRefresh) return;
+
+ if (isInVisibleChain() || mForceRefresh)
{
refresh();
mRefreshCompleteSignal(this, LLSD());
-
- mPrevVisibility = getVisible();
}
}
@@ -414,6 +413,7 @@ void LLInventoryItemsList::refresh()
bool needs_refresh = add_limit_exceeded;
setNeedsRefresh(needs_refresh);
+ setForceRefresh(needs_refresh);
}
void LLInventoryItemsList::computeDifference(
diff --git a/indra/newview/llinventoryitemslist.h b/indra/newview/llinventoryitemslist.h
index 60cccc0f4f..a3863b511c 100644
--- a/indra/newview/llinventoryitemslist.h
+++ b/indra/newview/llinventoryitemslist.h
@@ -222,6 +222,12 @@ public:
bool getNeedsRefresh(){ return mNeedsRefresh; }
/**
+ * Sets the flag indicating that the list needs to be refreshed even if it is
+ * not currently visible.
+ */
+ void setForceRefresh(bool force_refresh){ mForceRefresh = force_refresh; }
+
+ /**
* Idle routine used to refresh the list regardless of the current list
* visibility, unlike draw() which is called only for the visible list.
* This is needed for example to filter items of the list hidden by closed
@@ -259,7 +265,7 @@ private:
// Will be used in refresh() to determine added and removed ids
bool mNeedsRefresh;
- bool mPrevVisibility;
+ bool mForceRefresh;
commit_signal_t mRefreshCompleteSignal;
};
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index 12d5203429..43b7e15977 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -170,7 +170,7 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)
list->setCommitCallback(boost::bind(&LLOutfitsList::onSelectionChange, this, _1));
// Setting list refresh callback to apply filter on list change.
- list->setRefreshCompleteCallback(boost::bind(&LLOutfitsList::onWearableItemsListRefresh, this, _1));
+ list->setRefreshCompleteCallback(boost::bind(&LLOutfitsList::onFilteredWearableItemsListRefresh, this, _1));
// Fetch the new outfit contents.
cat->fetch();
@@ -178,6 +178,21 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)
// Refresh the list of outfit items after fetch().
// Further list updates will be triggered by the category observer.
list->updateList(cat_id);
+
+ // If filter is currently applied we store the initial tab state and
+ // open it to show matched items if any.
+ if (!mFilterSubString.empty())
+ {
+ tab->notifyChildren(LLSD().with("action","store_state"));
+ tab->setDisplayChildren(true);
+
+ // Setting mForceRefresh flag will make the list refresh its contents
+ // even if it is not currently visible. This is required to apply the
+ // filter to the newly added list.
+ list->setForceRefresh(true);
+
+ list->setFilterSubString(mFilterSubString);
+ }
}
// Handle removed tabs.
@@ -327,7 +342,7 @@ void LLOutfitsList::changeOutfitSelection(LLWearableItemsList* list, const LLUUI
mSelectedOutfitUUID = category_id;
}
-void LLOutfitsList::onWearableItemsListRefresh(LLUICtrl* ctrl)
+void LLOutfitsList::onFilteredWearableItemsListRefresh(LLUICtrl* ctrl)
{
if (!ctrl || mFilterSubString.empty())
return;
@@ -338,7 +353,7 @@ void LLOutfitsList::onWearableItemsListRefresh(LLUICtrl* ctrl)
iter != iter_end; ++iter)
{
LLAccordionCtrlTab* tab = iter->second;
- if (tab) continue;
+ if (!tab) continue;
LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
if (list != ctrl) continue;
@@ -395,8 +410,6 @@ void LLOutfitsList::applyFilter(const std::string& new_filter_substring)
if (!new_filter_substring.empty())
{
- tab->setDisplayChildren(true);
-
std::string title = tab->getTitle();
LLStringUtil::toUpper(title);
@@ -413,6 +426,18 @@ void LLOutfitsList::applyFilter(const std::string& new_filter_substring)
{
tab->setTitle(tab->getTitle(), cur_filter);
}
+
+ if (tab->getVisible())
+ {
+ // Open tab if it has passed the filter.
+ tab->setDisplayChildren(true);
+ }
+ else
+ {
+ // Set force refresh flag to refresh not visible list
+ // when some changes occur in it.
+ list->setForceRefresh(true);
+ }
}
else
{
diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h
index bcb393b12a..8eaa39e6f1 100644
--- a/indra/newview/lloutfitslist.h
+++ b/indra/newview/lloutfitslist.h
@@ -98,7 +98,7 @@ private:
* Called upon list refresh event to update tab visibility depending on
* the results of applying filter to the title and list items of the tab.
*/
- void onWearableItemsListRefresh(LLUICtrl* ctrl);
+ void onFilteredWearableItemsListRefresh(LLUICtrl* ctrl);
/**
* Highlights filtered items and hides tabs which haven't passed filter.