summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/llui/llfolderview.cpp2
-rwxr-xr-xindra/llui/llfolderviewitem.cpp2
-rw-r--r--indra/newview/llpanelpeople.cpp1
-rw-r--r--indra/newview/llpersonfolderview.cpp1
-rw-r--r--indra/newview/llpersonmodelcommon.cpp28
-rw-r--r--indra/newview/llpersonmodelcommon.h14
6 files changed, 36 insertions, 12 deletions
diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp
index cf449217f5..9cf822892e 100644
--- a/indra/llui/llfolderview.cpp
+++ b/indra/llui/llfolderview.cpp
@@ -1652,7 +1652,7 @@ void LLFolderView::update()
}
BOOL is_visible = isInVisibleChain();
-
+
// Puts folders/items in proper positions
// arrange() takes the model filter flag into account and call sort() if necessary (CHUI-849)
// It also handles the open/close folder animation
diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp
index 6c147ccc12..0c0c54c38c 100755
--- a/indra/llui/llfolderviewitem.cpp
+++ b/indra/llui/llfolderviewitem.cpp
@@ -1109,7 +1109,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height )
BOOL LLFolderViewFolder::needsArrange()
{
- return mLastArrangeGeneration < getRoot()->getArrangeGeneration();
+ return mLastArrangeGeneration < getRoot()->getArrangeGeneration();
}
// Passes selection information on to children and record selection
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index f7492a51e1..af9ecd743c 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -1199,6 +1199,7 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string)
else if (cur_tab == FBCTESTTWO_TAB_NAME)
{
mPersonFolderViewModel.getFilter().setFilterSubString(filter);
+ mPersonFolderView->requestArrange();
}
}
diff --git a/indra/newview/llpersonfolderview.cpp b/indra/newview/llpersonfolderview.cpp
index c22e4f3e58..7e969fc96c 100644
--- a/indra/newview/llpersonfolderview.cpp
+++ b/indra/newview/llpersonfolderview.cpp
@@ -36,6 +36,7 @@ LLPersonFolderView::LLPersonFolderView(const Params &p) :
LLFolderView(p),
mConversationsEventStream("ConversationsEventsTwo")
{
+ rename("Persons"); // For tracking!
mConversationsEventStream.listen("ConversationsRefresh", boost::bind(&LLPersonFolderView::onConversationModelEvent, this, _1));
createPersonTabs();
diff --git a/indra/newview/llpersonmodelcommon.cpp b/indra/newview/llpersonmodelcommon.cpp
index 70a24ac77a..b3424cc451 100644
--- a/indra/newview/llpersonmodelcommon.cpp
+++ b/indra/newview/llpersonmodelcommon.cpp
@@ -48,6 +48,7 @@ LLPersonModelCommon::LLPersonModelCommon(LLFolderViewModelInterface& root_view_m
LLFolderViewModelItemCommon(root_view_model),
mName(""),
mSearchableName(""),
+ mPrevPassedAllFilters(false),
mID(LLUUID().generateNewID())
{
}
@@ -103,11 +104,11 @@ bool LLPersonModelCommon::filter( LLFolderViewFilter& filter)
llinfos << "Merov : LLPersonModelCommon::filter, exit, no modif" << llendl;
return true;
}
-*/
+ */
if (!mChildren.empty())
{
// If the current instance has children, it's a "person folder" and always passes filters (we do not filter out empty folders)
- setPassedFilter(1, -1);
+ setPassedFilter(1, filter.getCurrentGeneration());
// Call filter recursively on all children
for (child_list_t::iterator iter = mChildren.begin(), end_iter = mChildren.end();
iter != end_iter;
@@ -121,13 +122,31 @@ bool LLPersonModelCommon::filter( LLFolderViewFilter& filter)
{
// If there's no children, the current instance is a person and we check and set the passed filter flag on it
const bool passed_filter = filter.check(this);
- setPassedFilter(passed_filter, -1, filter.getStringMatchOffset(this), filter.getFilterStringSize());
+ setPassedFilter(passed_filter, filter.getCurrentGeneration(), filter.getStringMatchOffset(this), filter.getFilterStringSize());
}
filter.clearModified();
return true;
}
+void LLPersonModelCommon::setPassedFilter(bool passed, S32 filter_generation, std::string::size_type string_offset, std::string::size_type string_size)
+{
+ LLFolderViewModelItemCommon::setPassedFilter(passed, filter_generation, string_offset, string_size);
+ bool before = mPrevPassedAllFilters;
+ mPrevPassedAllFilters = passedFilter(filter_generation);
+
+ if (before != mPrevPassedAllFilters)
+ {
+ // Need to rearrange the folder if the filtered state of the item changed
+ LLFolderViewFolder* parent_folder = mFolderViewItem->getParentFolder();
+ if (parent_folder)
+ {
+ parent_folder->requestArrange();
+ }
+ }
+}
+
+
//
// LLPersonTabModel
//
@@ -218,7 +237,8 @@ LLPersonViewFilter::LLPersonViewFilter() :
mEmptyLookupMessage(""),
mFilterSubString(""),
mName(""),
- mFilterModified(FILTER_NONE)
+ mFilterModified(FILTER_NONE),
+ mCurrentGeneration(0)
{
}
diff --git a/indra/newview/llpersonmodelcommon.h b/indra/newview/llpersonmodelcommon.h
index 7be3387564..5f3801874d 100644
--- a/indra/newview/llpersonmodelcommon.h
+++ b/indra/newview/llpersonmodelcommon.h
@@ -75,7 +75,7 @@ public:
virtual bool filter( LLFolderViewFilter& filter);
virtual bool descendantsPassedFilter(S32 filter_generation = -1) { return true; }
-// virtual void setPassedFilter(bool passed, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0) { }
+ virtual void setPassedFilter(bool passed, S32 filter_generation, std::string::size_type string_offset = std::string::npos, std::string::size_type string_size = 0);
virtual bool passedFilter(S32 filter_generation = -1) { return mPassedFilter; }
// The action callbacks
@@ -102,6 +102,7 @@ protected:
std::string mName; // Name of the person
std::string mSearchableName; // Name used in string matching for this person
+ bool mPrevPassedAllFilters;
LLUUID mID;
};
@@ -180,7 +181,7 @@ public:
void clearModified();
const std::string& getName() const { return mName; }
const std::string& getFilterText() { return mName; }
- void setModified(EFilterModified behavior = FILTER_RESTART) { mFilterModified = behavior; }
+ void setModified(EFilterModified behavior = FILTER_RESTART) { mFilterModified = behavior; mCurrentGeneration++; }
// +-------------------------------------------------------------------+
// + Time
@@ -201,10 +202,10 @@ public:
// +-------------------------------------------------------------------+
// + Generation
// +-------------------------------------------------------------------+
- // Note : unclear if we have to take tab on generation at that point
- S32 getCurrentGeneration() const { return 0; }
- S32 getFirstSuccessGeneration() const { return 0; }
- S32 getFirstRequiredGeneration() const { return 0; }
+ // Note : For the moment, we do not support restrictive filtering so all generation indexes are pointing to the current generation
+ S32 getCurrentGeneration() const { return mCurrentGeneration; }
+ S32 getFirstSuccessGeneration() const { return mCurrentGeneration; }
+ S32 getFirstRequiredGeneration() const { return mCurrentGeneration; }
// Non Virtual Methods (i.e. specific to this class)
void setFilterSubString(const std::string& string);
@@ -214,6 +215,7 @@ private:
std::string mEmptyLookupMessage;
std::string mFilterSubString;
EFilterModified mFilterModified;
+ S32 mCurrentGeneration;
};
class LLPersonViewSort