summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorRichard Linden <none@none>2012-06-27 18:56:10 -0700
committerRichard Linden <none@none>2012-06-27 18:56:10 -0700
commitcb865a7e1300d4ce0bedae7c856fb210b68a43f8 (patch)
tree5a792a9f87692c85f1b3470931a162c0af9b48bf /indra
parent5b6db72c5b7c5c3c4cfde671480ec1fc56bbd859 (diff)
CHUI-101 WIP Make LLFolderView general purpose
moved filtering logic to viewmodel
Diffstat (limited to 'indra')
-rw-r--r--indra/llui/llnotifications.cpp24
-rw-r--r--indra/newview/llfolderview.cpp106
-rw-r--r--indra/newview/llfolderview.h12
-rw-r--r--indra/newview/llfolderviewitem.cpp787
-rw-r--r--indra/newview/llfolderviewitem.h82
-rw-r--r--indra/newview/llfolderviewmodel.h194
-rw-r--r--indra/newview/llinventorybridge.cpp20
-rw-r--r--indra/newview/llinventorybridge.h3
-rw-r--r--indra/newview/llinventoryfilter.cpp97
-rw-r--r--indra/newview/llinventoryfilter.h20
-rw-r--r--indra/newview/llinventoryfunctions.cpp10
-rw-r--r--indra/newview/llinventorypanel.cpp128
-rw-r--r--indra/newview/llinventorypanel.h6
-rw-r--r--indra/newview/llpanellandmarks.cpp2
-rw-r--r--indra/newview/llpanelmaininventory.cpp2
-rw-r--r--indra/newview/llpanelobjectinventory.cpp11
-rw-r--r--indra/newview/llsidepanelappearance.cpp2
-rw-r--r--indra/newview/lltexturectrl.cpp10
18 files changed, 557 insertions, 959 deletions
diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index 487a2e5fe7..48128e0b40 100644
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -1542,34 +1542,32 @@ void LLNotifications::addFromCallback(const LLSD& name)
add(name.asString(), LLSD(), LLSD());
}
-LLNotificationPtr LLNotifications::add(const std::string& name,
- const LLSD& substitutions,
- const LLSD& payload)
+LLNotificationPtr LLNotifications::add(const std::string& name, const LLSD& substitutions, const LLSD& payload)
{
LLNotification::Params::Functor functor_p;
functor_p.name = name;
return add(LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));
}
-LLNotificationPtr LLNotifications::add(const std::string& name,
- const LLSD& substitutions,
- const LLSD& payload,
- const std::string& functor_name)
+LLNotificationPtr LLNotifications::add(const std::string& name, const LLSD& substitutions, const LLSD& payload, const std::string& functor_name)
{
LLNotification::Params::Functor functor_p;
functor_p.name = functor_name;
- return add(LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));
+ return add(LLNotification::Params().name(name)
+ .substitutions(substitutions)
+ .payload(payload)
+ .functor(functor_p));
}
//virtual
-LLNotificationPtr LLNotifications::add(const std::string& name,
- const LLSD& substitutions,
- const LLSD& payload,
- LLNotificationFunctorRegistry::ResponseFunctor functor)
+LLNotificationPtr LLNotifications::add(const std::string& name, const LLSD& substitutions, const LLSD& payload, LLNotificationFunctorRegistry::ResponseFunctor functor)
{
LLNotification::Params::Functor functor_p;
functor_p.function = functor;
- return add(LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));
+ return add(LLNotification::Params().name(name)
+ .substitutions(substitutions)
+ .payload(payload)
+ .functor(functor_p));
}
// generalized add function that takes a parameter block object for more complex instantiations
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index ee8c94a2dd..a37fc7714b 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -181,7 +181,6 @@ LLFolderView::LLFolderView(const Params& p)
mNeedsAutoSelect( FALSE ),
mAutoSelectOverride(FALSE),
mNeedsAutoRename(FALSE),
- mDebugFilters(FALSE),
mSortOrder(LLInventoryFilter::SO_FOLDERS_BY_NAME), // This gets overridden by a pref immediately
mFilter(new LLInventoryFilter(LLInventoryFilter::Params().name(p.title))),
mShowSelectionContext(FALSE),
@@ -316,7 +315,7 @@ BOOL LLFolderView::addFolder( LLFolderViewFolder* folder)
folder->reshape(getRect().getWidth(), 0);
folder->setVisible(FALSE);
addChild( folder );
- folder->dirtyFilter();
+ folder->getViewModelItem()->dirtyFilter();
folder->requestArrange();
return TRUE;
}
@@ -339,15 +338,14 @@ void LLFolderView::openTopLevelFolders()
}
// This view grows and shrinks to enclose all of its children items and folders.
-// mItemHeight = mDebugFilters ? LLFontGL::getFontMonospace()->getLineHeight() : 0;
// *width should be 0
// conform show folder state works
-S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_generation )
+S32 LLFolderView::arrange( S32* unused_width, S32* unused_height )
{
mMinWidth = 0;
S32 target_height;
- LLFolderViewFolder::arrange(&mMinWidth, &target_height, mFilter->getFirstSuccessGeneration());
+ LLFolderViewFolder::arrange(&mMinWidth, &target_height);
LLRect scroll_rect = mScrollContainer->getContentWindowRect();
reshape( llmax(scroll_rect.getWidth(), mMinWidth), llround(mCurHeight) );
@@ -371,15 +369,10 @@ void LLFolderView::filter( LLFolderViewFilter& filter )
LLFastTimer t2(FTM_FILTER);
filter.setFilterCount(llclamp(gSavedSettings.getS32("FilterItemsPerFrame"), 1, 5000));
- if (getCompletedFilterGeneration() < filter.getCurrentGeneration())
+ if (getLastFilterGeneration() < filter.getCurrentGeneration())
{
- mPassedFilter = FALSE;
mMinWidth = 0;
- LLFolderViewFolder::filter(filter);
- }
- else
- {
- mPassedFilter = TRUE;
+ getViewModelItem()->filter(filter);
}
}
@@ -548,15 +541,15 @@ void LLFolderView::sanitizeSelection()
LLFolderViewItem* item = *item_iter;
// ensure that each ancestor is open and potentially passes filtering
- BOOL visible = item->potentiallyVisible(); // initialize from filter state for this item
+ BOOL visible = item->getViewModelItem()->potentiallyVisible(); // initialize from filter state for this item
// modify with parent open and filters states
LLFolderViewFolder* parent_folder = item->getParentFolder();
// Move up through parent folders and see what's visible
- while(parent_folder)
- {
- visible = visible && parent_folder->isOpen() && parent_folder->potentiallyVisible();
- parent_folder = parent_folder->getParentFolder();
- }
+ while(parent_folder)
+ {
+ visible = visible && parent_folder->isOpen() && parent_folder->getViewModelItem()->potentiallyVisible();
+ parent_folder = parent_folder->getParentFolder();
+ }
// deselect item if any ancestor is closed or didn't pass filter requirements.
if (!visible)
@@ -606,7 +599,7 @@ void LLFolderView::sanitizeSelection()
parent_folder;
parent_folder = parent_folder->getParentFolder())
{
- if (parent_folder->potentiallyVisible())
+ if (parent_folder->getViewModelItem()->potentiallyVisible())
{
// give initial selection to first ancestor folder that potentially passes the filter
if (!new_selection)
@@ -684,16 +677,6 @@ void LLFolderView::commitRename( const LLSD& data )
void LLFolderView::draw()
{
- static LLUIColor sSearchStatusColor = LLUIColorTable::instance().getColor("InventorySearchStatusColor", LLColor4::white);
- if (mDebugFilters)
- {
- std::string current_filter_string = llformat("Current Filter: %d, Least Filter: %d, Auto-accept Filter: %d",
- mFilter->getCurrentGeneration(), mFilter->getFirstSuccessGeneration(), mFilter->getFirstRequiredGeneration());
- LLFontGL::getFontMonospace()->renderUTF8(current_filter_string, 0, 2,
- getRect().getHeight() - LLFontGL::getFontMonospace()->getLineHeight(), LLColor4(0.5f, 0.5f, 0.8f, 1.f),
- LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
- }
-
//LLFontGL* font = getLabelFontForStyle(mLabelStyle);
// if cursor has moved off of me during drag and drop
@@ -734,17 +717,14 @@ void LLFolderView::draw()
}
else if (mShowEmptyMessage)
{
- if (!mViewModel->contentsReady() || mCompletedFilterGeneration < mFilter->getFirstSuccessGeneration())
+ if (!mViewModel->contentsReady() || getLastFilterGeneration() < mFilter->getFirstSuccessGeneration())
{
// TODO RN: Get this from filter
mStatusText = LLTrans::getString("Searching");
}
else
{
- if (getFilter())
- {
- mStatusText = getFilter()->getEmptyLookupMessage();
- }
+ mStatusText = getFolderViewModel()->getFilter()->getEmptyLookupMessage();
}
mStatusTextBox->setValue(mStatusText);
mStatusTextBox->setVisible( TRUE );
@@ -763,7 +743,11 @@ void LLFolderView::draw()
// This will indirectly call ::arrange and reshape of the status textbox.
// We should call this method to also notify parent about required rect.
// See EXT-7564, EXT-7047.
- arrangeFromRoot();
+ S32 height = 0;
+ S32 width = 0;
+ S32 total_height = arrange( &width, &height );
+ notifyParent(LLSD().with("action", "size_changes").with("height", total_height));
+
LLUI::popMatrix();
LLUI::pushMatrix();
LLUI::translate((F32)getRect().mLeft, (F32)getRect().mBottom);
@@ -902,16 +886,16 @@ void LLFolderView::onItemsRemovalConfirmation(const LLSD& notification, const LL
}
if(parent)
{
- if (parent->removeItem(item_to_delete))
+ if (item_to_delete->remove())
{
// change selection on successful delete
if (new_selection)
{
- setSelectionFromRoot(new_selection, new_selection->isOpen(), mParentPanel->hasFocus());
+ getRoot()->setSelection(new_selection, new_selection->isOpen(), mParentPanel->hasFocus());
}
else
{
- setSelectionFromRoot(NULL, mParentPanel->hasFocus());
+ getRoot()->setSelection(NULL, mParentPanel->hasFocus());
}
}
}
@@ -937,11 +921,11 @@ void LLFolderView::onItemsRemovalConfirmation(const LLSD& notification, const LL
}
if (new_selection)
{
- setSelectionFromRoot(new_selection, new_selection->isOpen(), mParentPanel->hasFocus());
+ getRoot()->setSelection(new_selection, new_selection->isOpen(), mParentPanel->hasFocus());
}
else
{
- setSelectionFromRoot(NULL, mParentPanel->hasFocus());
+ getRoot()->setSelection(NULL, mParentPanel->hasFocus());
}
for(S32 i = 0; i < count; ++i)
@@ -1386,12 +1370,12 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )
if (next->isSelected())
{
// shrink selection
- changeSelectionFromRoot(last_selected, FALSE);
+ getRoot()->changeSelection(last_selected, FALSE);
}
else if (last_selected->getParentFolder() == next->getParentFolder())
{
// grow selection
- changeSelectionFromRoot(next, TRUE);
+ getRoot()->changeSelection(next, TRUE);
}
}
}
@@ -1450,12 +1434,12 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )
if (prev->isSelected())
{
// shrink selection
- changeSelectionFromRoot(last_selected, FALSE);
+ getRoot()->changeSelection(last_selected, FALSE);
}
else if (last_selected->getParentFolder() == prev->getParentFolder())
{
// grow selection
- changeSelectionFromRoot(prev, TRUE);
+ getRoot()->changeSelection(prev, TRUE);
}
}
}
@@ -1649,7 +1633,7 @@ BOOL LLFolderView::search(LLFolderViewItem* first_item, const std::string &searc
}
}
- const std::string current_item_label(search_item->getSearchableLabel());
+ const std::string current_item_label(search_item->getViewModelItem()->getSearchableName());
S32 search_string_length = llmin(upper_case_string.size(), current_item_label.size());
if (!current_item_label.compare(0, search_string_length, upper_case_string))
{
@@ -1959,13 +1943,6 @@ void LLFolderView::doIdle()
LLFastTimer t2(FTM_INVENTORY);
- BOOL debug_filters = gSavedSettings.getBOOL("DebugInventoryFilters");
- if (debug_filters != getDebugFilters())
- {
- mDebugFilters = debug_filters;
- arrangeAll();
- }
-
if (mFilter->isModified() && mFilter->isNotDefault())
{
mNeedsAutoSelect = TRUE;
@@ -1973,7 +1950,7 @@ void LLFolderView::doIdle()
mFilter->clearModified();
// filter to determine visibility before arranging
- filterFromRoot();
+ filter(*(getFolderViewModel()->getFilter()));
// automatically show matching items, and select first one if we had a selection
if (mNeedsAutoSelect)
@@ -1981,7 +1958,7 @@ void LLFolderView::doIdle()
LLFastTimer t3(FTM_AUTO_SELECT);
// select new item only if a filtered item not currently selected
LLFolderViewItem* selected_itemp = mSelectedItems.empty() ? NULL : mSelectedItems.back();
- if (!mAutoSelectOverride && (!selected_itemp || !selected_itemp->potentiallyHidden()))
+ if (!mAutoSelectOverride && (!selected_itemp || selected_itemp->passedFilter()))
{
// these are named variables to get around gcc not binding non-const references to rvalues
// and functor application is inherently non-const to allow for stateful functors
@@ -1991,7 +1968,7 @@ void LLFolderView::doIdle()
// Open filtered folders for folder views with mAutoSelectOverride=TRUE.
// Used by LLPlacesFolderView.
- if (mAutoSelectOverride && mFilter->showAllResults())
+ if (mFilter->showAllResults())
{
// these are named variables to get around gcc not binding non-const references to rvalues
// and functor application is inherently non-const to allow for stateful functors
@@ -2002,7 +1979,7 @@ void LLFolderView::doIdle()
scrollToShowSelection();
}
- BOOL filter_finished = mCompletedFilterGeneration >= mFilter->getCurrentGeneration()
+ BOOL filter_finished = getLastFilterGeneration() >= mFilter->getCurrentGeneration()
&& mViewModel->contentsReady();
if (filter_finished
|| gFocusMgr.childHasKeyboardFocus(inventory_panel)
@@ -2073,7 +2050,10 @@ void LLFolderView::doIdle()
sanitizeSelection();
if( needsArrange() )
{
- arrangeFromRoot();
+ S32 height = 0;
+ S32 width = 0;
+ S32 total_height = arrange( &width, &height );
+ notifyParent(LLSD().with("action", "size_changes").with("height", total_height));
}
}
@@ -2278,25 +2258,19 @@ void LLFolderView::onRenamerLost()
if( mRenameItem )
{
- setSelectionFromRoot( mRenameItem, TRUE );
+ setSelection( mRenameItem, TRUE );
mRenameItem = NULL;
}
}
-LLFolderViewFilter* LLFolderView::getFilter()
-{
- return mFilter;
-}
-
S32 LLFolderView::getItemHeight()
{
- S32 debug_height = mDebugFilters ? LLFontGL::getFontMonospace()->getLineHeight() : 0;
if(!hasVisibleChildren())
{
//We need to display status textbox, let's reserve some place for it
- return llmax(debug_height, mStatusTextBox->getTextPixelHeight());
+ return llmax(0, mStatusTextBox->getTextPixelHeight());
}
- return debug_height;
+ return 0;
}
//TODO RN: move to llfolderviewmodel.cpp file
diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h
index 8b58da9f45..d261a5967d 100644
--- a/indra/newview/llfolderview.h
+++ b/indra/newview/llfolderview.h
@@ -110,9 +110,11 @@ public:
virtual BOOL canFocusChildren() const;
+ virtual const LLFolderView* getRoot() const { return this; }
virtual LLFolderView* getRoot() { return this; }
LLFolderViewModelInterface* getFolderViewModel() { return mViewModel; }
+ const LLFolderViewModelInterface* getFolderViewModel() const { return mViewModel; }
void setFilterPermMask(PermissionMask filter_perm_mask);
@@ -120,9 +122,6 @@ public:
void setSelectCallback(const signal_t::slot_type& cb) { mSelectSignal.connect(cb); }
void setReshapeCallback(const signal_t::slot_type& cb) { mReshapeSignal.connect(cb); }
- // filter is never null
- LLFolderViewFilter* getFilter();
-
bool getAllowMultiSelect() { return mAllowMultiSelect; }
// Close all folders in the view
@@ -133,7 +132,7 @@ public:
// Find width and height of this object and its children. Also
// makes sure that this view and its children are the right size.
- virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
+ virtual S32 arrange( S32* width, S32* height );
virtual S32 getItemHeight();
void arrangeAll() { mArrangeGeneration++; }
@@ -147,7 +146,7 @@ public:
// Record the selected item and pass it down the hierarchy.
virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem,
- BOOL take_keyboard_focus);
+ BOOL take_keyboard_focus = TRUE);
// This method is used to toggle the selection of an item. Walks
// children, and keeps track of selected objects.
@@ -244,8 +243,6 @@ public:
void setCallbackRegistrar(LLUICtrl::CommitCallbackRegistry::ScopedRegistrar* registrar) { mCallbackRegistrar = registrar; }
- BOOL getDebugFilters() { return mDebugFilters; }
-
LLPanel* getParentPanel() { return mParentPanel; }
// DEBUG only
void dumpSelectionInformation();
@@ -299,7 +296,6 @@ protected:
bool mUseLabelSuffix;
bool mShowItemLinkOverlays;
- BOOL mDebugFilters;
U32 mSortOrder;
LLDepthStack<LLFolderViewFolder> mAutoOpenItems;
LLFolderViewFolder* mAutoOpenCandidate;
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 3f0b493986..f65a13be1e 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -114,8 +114,6 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
mHasVisibleChildren(FALSE),
mIndentation(0),
mItemHeight(p.item_height),
- mPassedFilter(FALSE),
- mLastFilterGeneration(-1),
//TODO RN: create interface for string highlighting
//mStringMatchOffset(std::string::npos),
mControlLabelRotation(0.f),
@@ -146,6 +144,10 @@ LLFolderView* LLFolderViewItem::getRoot()
return mRoot;
}
+const LLFolderView* LLFolderViewItem::getRoot() const
+{
+ return mRoot;
+}
// Returns true if this object is a child (or grandchild, etc.) of potential_ancestor.
BOOL LLFolderViewItem::isDescendantOf( const LLFolderViewFolder* potential_ancestor )
{
@@ -207,99 +209,47 @@ LLFolderViewItem* LLFolderViewItem::getPreviousOpenNode(BOOL include_children)
return itemp;
}
-// is this item something we think we should be showing?
-// for example, if we haven't gotten around to filtering it yet, then the answer is yes
-// until we find out otherwise
-BOOL LLFolderViewItem::potentiallyVisible()
-{
- return getFiltered() // we've passed the filter
- || getLastFilterGeneration() < getRoot()->getFilter()->getFirstSuccessGeneration(); // or we don't know yet
-}
-
-BOOL LLFolderViewItem::potentiallyHidden()
+BOOL LLFolderViewItem::passedFilter(S32 filter_generation)
{
- return !mPassedFilter // didn't pass the filter
- || getLastFilterGeneration() < getRoot()->getFilter()->getFirstSuccessGeneration(); // or we don't know yet
-}
-
-BOOL LLFolderViewItem::getFiltered()
-{
- return mPassedFilter && mLastFilterGeneration >= getRoot()->getFilter()->getFirstSuccessGeneration();
-}
-
-BOOL LLFolderViewItem::getFiltered(S32 filter_generation)
-{
- return mPassedFilter && mLastFilterGeneration >= filter_generation;
-}
-
-void LLFolderViewItem::setFiltered(BOOL filtered, S32 filter_generation)
-{
- mPassedFilter = filtered;
- mLastFilterGeneration = filter_generation;
+ return getViewModelItem()->passedFilter(filter_generation);
}
void LLFolderViewItem::refresh()
{
- if(!getViewModelItem()) return;
+ LLFolderViewModelItem& vmi = *getViewModelItem();
- mLabel = getViewModelItem()->getDisplayName();
+ mLabel = vmi.getDisplayName();
setToolTip(mLabel);
- mIcon = getViewModelItem()->getIcon();
- mIconOpen = getViewModelItem()->getIconOpen();
- mIconOverlay = getViewModelItem()->getIconOverlay();
+ mIcon = vmi.getIcon();
+ mIconOpen = vmi.getIconOpen();
+ mIconOverlay = vmi.getIconOverlay();
if (mRoot->useLabelSuffix())
{
- mLabelStyle = getViewModelItem()->getLabelStyle();
- mLabelSuffix = getViewModelItem()->getLabelSuffix();
+ mLabelStyle = vmi.getLabelStyle();
+ mLabelSuffix = vmi.getLabelSuffix();
}
- std::string searchable_label(mLabel);
- searchable_label.append(mLabelSuffix);
- LLStringUtil::toUpper(searchable_label);
+ //TODO RN: make sure this logic still fires
+ //std::string searchable_label(mLabel);
+ //searchable_label.append(mLabelSuffix);
+ //LLStringUtil::toUpper(searchable_label);
- if (mSearchableLabel.compare(searchable_label))
- {
- mSearchableLabel.assign(searchable_label);
- dirtyFilter();
- // some part of label has changed, so overall width has potentially changed, and sort order too
- if (mParentFolder)
- {
- mParentFolder->requestSort();
- mParentFolder->requestArrange();
- }
- }
+ //if (mSearchableLabel.compare(searchable_label))
+ //{
+ // mSearchableLabel.assign(searchable_label);
+ // vmi.dirtyFilter();
+ // // some part of label has changed, so overall width has potentially changed, and sort order too
+ // if (mParentFolder)
+ // {
+ // mParentFolder->requestSort();
+ // mParentFolder->requestArrange();
+ // }
+ //}
mLabelWidthDirty = true;
- dirtyFilter();
-}
-
-// This function is called when items are added or view filters change. It's
-// implemented here but called by derived classes when folding the
-// views.
-void LLFolderViewItem::filterFromRoot( void )
-{
- LLFolderViewItem* root = getRoot();
-
- root->filter(*((LLFolderView*)root)->getFilter());
-}
-
-// This function is called when the folder view is dirty. It's
-// implemented here but called by derived classes when folding the
-// views.
-void LLFolderViewItem::arrangeFromRoot()
-{
- LLFolderViewItem* root = getRoot();
-
- S32 height = 0;
- S32 width = 0;
- S32 total_height = root->arrange( &width, &height, 0 );
-
- LLSD params;
- params["action"] = "size_changes";
- params["height"] = total_height;
- getParent()->notifyParent(params);
+ vmi.dirtyFilter();
}
// Utility function for LLFolderView
@@ -313,7 +263,7 @@ void LLFolderViewItem::arrangeAndSet(BOOL set_selection,
}
if(set_selection)
{
- setSelectionFromRoot(this, TRUE, take_keyboard_focus);
+ getRoot()->setSelection(this, TRUE, take_keyboard_focus);
if(root)
{
root->scrollToShowSelection();
@@ -321,22 +271,6 @@ void LLFolderViewItem::arrangeAndSet(BOOL set_selection,
}
}
-// This function clears the currently selected item, and records the
-// specified selected item appropriately for display and use in the
-// UI. If open is TRUE, then folders are opened up along the way to
-// the selection.
-void LLFolderViewItem::setSelectionFromRoot(LLFolderViewItem* selection,
- BOOL openitem,
- BOOL take_keyboard_focus)
-{
- getRoot()->setSelection(selection, openitem, take_keyboard_focus);
-}
-
-// helper function to change the selection from the root.
-void LLFolderViewItem::changeSelectionFromRoot(LLFolderViewItem* selection, BOOL selected)
-{
- getRoot()->changeSelection(selection, selected);
-}
std::set<LLFolderViewItem*> LLFolderViewItem::getSelectionList() const
{
@@ -347,18 +281,13 @@ std::set<LLFolderViewItem*> LLFolderViewItem::getSelectionList() const
// addToFolder() returns TRUE if it succeeds. FALSE otherwise
BOOL LLFolderViewItem::addToFolder(LLFolderViewFolder* folder)
{
- if (!folder)
- {
- return FALSE;
- }
- mParentFolder = folder;
return folder->addItem(this);
}
// Finds width and height of this object and its children. Also
// makes sure that this view and its children are the right size.
-S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)
+S32 LLFolderViewItem::arrange( S32* width, S32* height )
{
const Params& p = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
S32 indentation = p.folder_indentation();
@@ -390,41 +319,6 @@ S32 LLFolderViewItem::getItemHeight()
return mItemHeight;
}
-void LLFolderViewItem::filter( LLFolderViewFilter& filter)
-{
- const BOOL previous_passed_filter = mPassedFilter;
- const BOOL passed_filter = filter.check(this);
-
- // If our visibility will change as a result of this filter, then
- // we need to be rearranged in our parent folder
- if (mParentFolder)
- {
- if (getVisible() != passed_filter
- || previous_passed_filter != passed_filter )
- mParentFolder->requestArrange();
- }
-
- setFiltered(passed_filter, filter.getCurrentGeneration());
- //TODO RN: create interface for string highlighting
- //mStringMatchOffset = filter.getStringMatchOffset(this);
- filter.decrementFilterCount();
-
- if (getRoot()->getDebugFilters())
- {
- mStatusText = llformat("%d", mLastFilterGeneration);
- }
-}
-
-void LLFolderViewItem::dirtyFilter()
-{
- mLastFilterGeneration = -1;
- // bubble up dirty flag all the way to root
- if (getParentFolder())
- {
- getParentFolder()->setCompletedFilterGeneration(-1, TRUE);
- }
-}
-
// *TODO: This can be optimized a lot by simply recording that it is
// selected in the appropriate places, and assuming that set selection
// means 'deselect' for a leaf item. Do this optimization after
@@ -469,45 +363,31 @@ void LLFolderViewItem::selectItem(void)
{
if (mIsSelected == FALSE)
{
- if (getViewModelItem())
- {
- getViewModelItem()->selectItem();
- }
+ getViewModelItem()->selectItem();
mIsSelected = TRUE;
}
}
BOOL LLFolderViewItem::isMovable()
{
- if( getViewModelItem() )
- {
- return getViewModelItem()->isItemMovable();
- }
- else
- {
- return TRUE;
- }
+ return getViewModelItem()->isItemMovable();
}
BOOL LLFolderViewItem::isRemovable()
{
- if( getViewModelItem() )
- {
- return getViewModelItem()->isItemRemovable();
- }
- else
- {
- return TRUE;
- }
+ return getViewModelItem()->isItemRemovable();
}
void LLFolderViewItem::destroyView()
{
+ getRoot()->removeFromSelectionList(this);
+
if (mParentFolder)
{
// removeView deletes me
- mParentFolder->removeView(this);
+ mParentFolder->extractItem(this);
}
+ delete this;
}
// Call through to the viewed object and return true if it can be
@@ -519,58 +399,36 @@ BOOL LLFolderViewItem::remove()
{
return FALSE;
}
- if(getViewModelItem())
- {
- return getViewModelItem()->removeItem();
- }
- return TRUE;
+ return getViewModelItem()->removeItem();
}
// Build an appropriate context menu for the item.
void LLFolderViewItem::buildContextMenu(LLMenuGL& menu, U32 flags)
{
- if(getViewModelItem())
- {
- getViewModelItem()->buildContextMenu(menu, flags);
- }
+ getViewModelItem()->buildContextMenu(menu, flags);
}
void LLFolderViewItem::openItem( void )
{
- if( getViewModelItem() )
- {
- getViewModelItem()->openItem();
- }
+ getViewModelItem()->openItem();
}
void LLFolderViewItem::rename(const std::string& new_name)
{
if( !new_name.empty() )
{
- if( getViewModelItem() )
- {
- getViewModelItem()->renameItem(new_name);
+ getViewModelItem()->renameItem(new_name);
- if(mParentFolder)
- {
- mParentFolder->requestSort();
- }
+ if(mParentFolder)
+ {
+ mParentFolder->requestSort();
}
}
}
-const std::string& LLFolderViewItem::getSearchableLabel() const
-{
- return mSearchableLabel;
-}
-
const std::string& LLFolderViewItem::getName( void ) const
{
- if(getViewModelItem())
- {
- return getViewModelItem()->getName();
- }
- return LLStringUtil::null;
+ return getViewModelItem()->getName();
}
// LLView functionality
@@ -578,7 +436,7 @@ BOOL LLFolderViewItem::handleRightMouseDown( S32 x, S32 y, MASK mask )
{
if(!mIsSelected)
{
- setSelectionFromRoot(this, FALSE);
+ getRoot()->setSelection(this, FALSE);
}
make_ui_sound("UISndClick");
return TRUE;
@@ -599,7 +457,7 @@ BOOL LLFolderViewItem::handleMouseDown( S32 x, S32 y, MASK mask )
{
if(mask & MASK_CONTROL)
{
- changeSelectionFromRoot(this, !mIsSelected);
+ getRoot()->changeSelection(this, !mIsSelected);
}
else if (mask & MASK_SHIFT)
{
@@ -607,7 +465,7 @@ BOOL LLFolderViewItem::handleMouseDown( S32 x, S32 y, MASK mask )
}
else
{
- setSelectionFromRoot(this, FALSE);
+ getRoot()->setSelection(this, FALSE);
}
make_ui_sound("UISndClick");
}
@@ -646,14 +504,7 @@ BOOL LLFolderViewItem::handleHover( S32 x, S32 y, MASK mask )
// *TODO: push this into listener and remove
// dependency on llagent
- if (getViewModelItem())
- {
- src = getViewModelItem()->getDragSource();
- }
- else
- {
- src = LLToolDragAndDrop::SOURCE_VIEWER;
- }
+ src = getViewModelItem()->getDragSource();
can_drag = root->startDrag(src);
if (can_drag)
@@ -695,10 +546,7 @@ BOOL LLFolderViewItem::handleHover( S32 x, S32 y, MASK mask )
BOOL LLFolderViewItem::handleDoubleClick( S32 x, S32 y, MASK mask )
{
- if (getViewModelItem())
- {
- getViewModelItem()->openItem();
- }
+ getViewModelItem()->openItem();
return TRUE;
}
@@ -715,7 +563,7 @@ BOOL LLFolderViewItem::handleMouseUp( S32 x, S32 y, MASK mask )
//...then select
if(mask & MASK_CONTROL)
{
- changeSelectionFromRoot(this, !mIsSelected);
+ getRoot()->changeSelection(this, !mIsSelected);
}
else if (mask & MASK_SHIFT)
{
@@ -723,7 +571,7 @@ BOOL LLFolderViewItem::handleMouseUp( S32 x, S32 y, MASK mask )
}
else
{
- setSelectionFromRoot(this, FALSE);
+ getRoot()->setSelection(this, FALSE);
}
}
@@ -748,21 +596,17 @@ BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EAcceptance* accept,
std::string& tooltip_msg)
{
- BOOL accepted = FALSE;
BOOL handled = FALSE;
- if(getViewModelItem())
+ BOOL accepted = getViewModelItem()->dragOrDrop(mask,drop,cargo_type,cargo_data, tooltip_msg);
+ handled = accepted;
+ if (accepted)
{
- accepted = getViewModelItem()->dragOrDrop(mask,drop,cargo_type,cargo_data, tooltip_msg);
- handled = accepted;
- if (accepted)
- {
- mDragAndDropTarget = TRUE;
- *accept = ACCEPT_YES_MULTI;
- }
- else
- {
- *accept = ACCEPT_NO;
- }
+ mDragAndDropTarget = TRUE;
+ *accept = ACCEPT_YES_MULTI;
+ }
+ else
+ {
+ *accept = ACCEPT_NO;
}
if(mParentFolder && !handled)
{
@@ -781,17 +625,17 @@ BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
void LLFolderViewItem::draw()
{
- static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
- static LLUIColor sHighlightBgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE);
- static LLUIColor sHighlightFgColor = LLUIColorTable::instance().getColor("MenuItemHighlightFgColor", DEFAULT_WHITE);
+ static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
+ static LLUIColor sHighlightBgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE);
+ static LLUIColor sHighlightFgColor = LLUIColorTable::instance().getColor("MenuItemHighlightFgColor", DEFAULT_WHITE);
static LLUIColor sFocusOutlineColor = LLUIColorTable::instance().getColor("InventoryFocusOutlineColor", DEFAULT_WHITE);
- static LLUIColor sFilterBGColor = LLUIColorTable::instance().getColor("FilterBackgroundColor", DEFAULT_WHITE);
- static LLUIColor sFilterTextColor = LLUIColorTable::instance().getColor("FilterTextColor", DEFAULT_WHITE);
- static LLUIColor sSuffixColor = LLUIColorTable::instance().getColor("InventoryItemColor", DEFAULT_WHITE);
- static LLUIColor sLibraryColor = LLUIColorTable::instance().getColor("InventoryItemLibraryColor", DEFAULT_WHITE);
- static LLUIColor sLinkColor = LLUIColorTable::instance().getColor("InventoryItemLinkColor", DEFAULT_WHITE);
+ static LLUIColor sFilterBGColor = LLUIColorTable::instance().getColor("FilterBackgroundColor", DEFAULT_WHITE);
+ static LLUIColor sFilterTextColor = LLUIColorTable::instance().getColor("FilterTextColor", DEFAULT_WHITE);
+ static LLUIColor sSuffixColor = LLUIColorTable::instance().getColor("InventoryItemColor", DEFAULT_WHITE);
+ static LLUIColor sLibraryColor = LLUIColorTable::instance().getColor("InventoryItemLibraryColor", DEFAULT_WHITE);
+ static LLUIColor sLinkColor = LLUIColorTable::instance().getColor("InventoryItemLinkColor", DEFAULT_WHITE);
static LLUIColor sSearchStatusColor = LLUIColorTable::instance().getColor("InventorySearchStatusColor", DEFAULT_WHITE);
- static LLUIColor sMouseOverColor = LLUIColorTable::instance().getColor("InventoryMouseOverColor", DEFAULT_WHITE);
+ static LLUIColor sMouseOverColor = LLUIColorTable::instance().getColor("InventoryMouseOverColor", DEFAULT_WHITE);
const Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
const S32 TOP_PAD = default_params.item_top_pad;
@@ -929,30 +773,13 @@ void LLFolderViewItem::draw()
LLColor4 color = (mIsSelected && filled) ? sHighlightFgColor : sFgColor;
//TODO RN: implement this in terms of getColor()
//if (highlight_link) color = sLinkColor;
- //if (getViewModelItem() && gInventory.isObjectDescendentOf(getViewModelItem()->getUUID(), gInventory.getLibraryRootFolderID())) color = sLibraryColor;
+ //if (gInventory.isObjectDescendentOf(getViewModelItem()->getUUID(), gInventory.getLibraryRootFolderID())) color = sLibraryColor;
F32 right_x = 0;
F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD;
F32 text_left = (F32)(ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mIndentation);
//--------------------------------------------------------------------------------//
- // Highlight filtered text
- //
- if (getRoot()->getDebugFilters())
- {
- if (!getFiltered() && !getViewModelItem()->hasChildren())
- {
- color.mV[VALPHA] *= 0.5f;
- }
- LLColor4 filter_color = mLastFilterGeneration >= getRoot()->getFilter()->getCurrentGeneration() ?
- LLColor4(0.5f, 0.8f, 0.5f, 1.f) :
- LLColor4(0.8f, 0.5f, 0.5f, 1.f);
- LLFontGL::getFontMonospace()->renderUTF8(mStatusText, 0, text_left, y, filter_color,
- LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
- S32_MAX, S32_MAX, &right_x, FALSE );
- text_left = right_x;
- }
- //--------------------------------------------------------------------------------//
// Draw the actual label text
//
font->renderUTF8(mLabel, 0, text_left, y, color,
@@ -997,6 +824,22 @@ void LLFolderViewItem::draw()
//}
}
+const LLFolderViewModelInterface* LLFolderViewItem::getFolderViewModel( void ) const
+{
+ return getRoot()->getFolderViewModel();
+}
+
+LLFolderViewModelInterface* LLFolderViewItem::getFolderViewModel( void )
+{
+ return getRoot()->getFolderViewModel();
+}
+
+S32 LLFolderViewItem::getLastFilterGeneration() const
+{
+ return getViewModelItem()->getLastFilterGeneration();
+}
+
+
///----------------------------------------------------------------------------
/// Class LLFolderViewFolder
@@ -1010,10 +853,7 @@ LLFolderViewFolder::LLFolderViewFolder( const LLFolderViewItem::Params& p ):
mTargetHeight(0.f),
mAutoOpenCountdown(0.f),
mLastArrangeGeneration( -1 ),
- mLastCalculatedWidth(0),
- mCompletedFilterGeneration(-1),
- mMostFilteredDescendantGeneration(-1),
- mPassedFolderFilter(FALSE)
+ mLastCalculatedWidth(0)
{
}
@@ -1025,25 +865,9 @@ LLFolderViewFolder::~LLFolderViewFolder( void )
gFocusMgr.releaseFocusIfNeeded( this ); // calls onCommit()
}
-void LLFolderViewFolder::setFilteredFolder(bool filtered, S32 filter_generation)
-{
- mPassedFolderFilter = filtered;
- mLastFilterGeneration = filter_generation;
-}
-
-bool LLFolderViewFolder::getFilteredFolder(S32 filter_generation)
-{
- return mPassedFolderFilter && mLastFilterGeneration >= getRoot()->getFilter()->getFirstSuccessGeneration();
-}
-
// addToFolder() returns TRUE if it succeeds. FALSE otherwise
BOOL LLFolderViewFolder::addToFolder(LLFolderViewFolder* folder)
{
- if (!folder)
- {
- return FALSE;
- }
- mParentFolder = folder;
return folder->addFolder(this);
}
@@ -1051,7 +875,7 @@ static LLFastTimer::DeclareTimer FTM_ARRANGE("Arrange");
// Finds width and height of this object and its children. Also
// makes sure that this view and its children are the right size.
-S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)
+S32 LLFolderViewFolder::arrange( S32* width, S32* height )
{
// sort before laying out contents
getRoot()->getFolderViewModel()->sort(this);
@@ -1060,7 +884,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)
// evaluate mHasVisibleChildren
mHasVisibleChildren = false;
- if (hasFilteredDescendants(filter_generation))
+ if (getViewModelItem()->descendantsPassedFilter())
{
// We have to verify that there's at least one child that's not filtered out
bool found = false;
@@ -1068,7 +892,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)
for (items_t::iterator iit = mItems.begin(); iit != mItems.end(); ++iit)
{
LLFolderViewItem* itemp = (*iit);
- found = (itemp->getFiltered(filter_generation));
+ found = itemp->passedFilter();
if (found)
break;
}
@@ -1078,9 +902,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)
for (folders_t::iterator fit = mFolders.begin(); fit != mFolders.end(); ++fit)
{
LLFolderViewFolder* folderp = (*fit);
- found = ( (folderp->getFiltered(filter_generation)
- || (folderp->getFilteredFolder(filter_generation)
- && folderp->hasFilteredDescendants(filter_generation))));
+ found = folderp->passedFilter();
if (found)
break;
}
@@ -1090,7 +912,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)
}
// calculate height as a single item (without any children), and reshapes rectangle to match
- LLFolderViewItem::arrange( width, height, filter_generation );
+ LLFolderViewItem::arrange( width, height );
// clamp existing animated height so as to never get smaller than a single item
mCurHeight = llmax((F32)*height, mCurHeight);
@@ -1113,16 +935,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)
for(folders_t::iterator fit = mFolders.begin(); fit != mFolders.end(); ++fit)
{
LLFolderViewFolder* folderp = (*fit);
- if (getRoot()->getDebugFilters())
- {
- folderp->setVisible(TRUE);
- }
- else
- {
- folderp->setVisible( folderp->getFiltered(filter_generation)
- || (folderp->getFilteredFolder(filter_generation)
- && folderp->hasFilteredDescendants(filter_generation))); // passed filter or has descendants that passed filter
- }
+ folderp->setVisible(folderp->passedFilter()); // passed filter or has descendants that passed filter
if (folderp->getVisible())
{
@@ -1130,7 +943,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)
S32 child_height = 0;
S32 child_top = parent_item_height - llround(running_height);
- target_height += folderp->arrange( &child_width, &child_height, filter_generation );
+ target_height += folderp->arrange( &child_width, &child_height );
running_height += (F32)child_height;
*width = llmax(*width, child_width);
@@ -1141,14 +954,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)
iit != mItems.end(); ++iit)
{
LLFolderViewItem* itemp = (*iit);
- if (getRoot()->getDebugFilters())
- {
- itemp->setVisible(TRUE);
- }
- else
- {
- itemp->setVisible(itemp->getFiltered(filter_generation));
- }
+ itemp->setVisible(itemp->passedFilter());
if (itemp->getVisible())
{
@@ -1156,7 +962,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height, S32 filter_generation)
S32 child_height = 0;
S32 child_top = parent_item_height - llround(running_height);
- target_height += itemp->arrange( &child_width, &child_height, filter_generation );
+ target_height += itemp->arrange( &child_width, &child_height );
// don't change width, as this item is as wide as its parent folder by construction
itemp->reshape( itemp->getRect().getWidth(), child_height);
@@ -1234,234 +1040,21 @@ void LLFolderViewFolder::requestSort()
getViewModelItem()->requestSort();
}
-void LLFolderViewFolder::setCompletedFilterGeneration(S32 generation, BOOL recurse_up)
-{
- //mMostFilteredDescendantGeneration = llmin(mMostFilteredDescendantGeneration, generation);
- mCompletedFilterGeneration = generation;
- // only aggregate up if we are a lower (older) value
- if (recurse_up
- && mParentFolder
- && generation < mParentFolder->getCompletedFilterGeneration())
- {
- mParentFolder->setCompletedFilterGeneration(generation, TRUE);
- }
-}
+//TODO RN: get height resetting working
+//void LLFolderViewFolder::setPassedFilter(BOOL passed, BOOL passed_folder, S32 filter_generation)
+//{
+// // if this folder is now filtered, but wasn't before
+// // (it just passed)
+// if (passed && !passedFilter(filter_generation))
+// {
+// // reset current height, because last time we drew it
+// // it might have had more visible items than now
+// mCurHeight = 0.f;
+// }
+//
+// LLFolderViewItem::setPassedFilter(passed, passed_folder, filter_generation);
+//}
-void LLFolderViewFolder::filter( LLFolderViewFilter& filter)
-{
- S32 filter_generation = filter.getCurrentGeneration();
- // if failed to pass filter newer than must_pass_generation
- // you will automatically fail this time, so we only
- // check against items that have passed the filter
- S32 must_pass_generation = filter.getFirstRequiredGeneration();
-
- bool autoopen_folders = filter.showAllResults();
-
- // if we have already been filtered against this generation, skip out
- if (getCompletedFilterGeneration() >= filter_generation)
- {
- return;
- }
-
- // filter folder itself
- if (getLastFilterGeneration() < filter_generation)
- {
- if (getLastFilterGeneration() >= must_pass_generation // folder has been compared to a valid precursor filter
- && !mPassedFilter) // and did not pass the filter
- {
- // go ahead and flag this folder as done
- mLastFilterGeneration = filter_generation;
- //TODO RN: create interface for string highlighting
- //mStringMatchOffset = std::string::npos;
- }
- else // filter self only on first pass through
- {
- // filter against folder rules
- filterFolder(filter);
- // and then item rules
- LLFolderViewItem::filter( filter );
- }
- }
-
- if (getRoot()->getDebugFilters())
- {
- mStatusText = llformat("%d", mLastFilterGeneration);
- mStatusText += llformat("(%d)", mCompletedFilterGeneration);
- mStatusText += llformat("+%d", mMostFilteredDescendantGeneration);
- }
-
- // all descendants have been filtered later than must pass generation
- // but none passed
- if(getCompletedFilterGeneration() >= must_pass_generation && !hasFilteredDescendants(must_pass_generation))
- {
- // don't traverse children if we've already filtered them since must_pass_generation
- // and came back with nothing
- return;
- }
-
- // we entered here with at least one filter iteration left
- // check to see if we have any more before continuing on to children
- if (filter.getFilterCount() < 0)
- {
- return;
- }
-
- // now query children
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();
- ++iter)
- {
- LLFolderViewFolder* folder = (*iter);
- // have we run out of iterations this frame?
- if (filter.getFilterCount() < 0)
- {
- break;
- }
-
- // mMostFilteredDescendantGeneration might have been reset
- // in which case we need to update it even for folders that
- // don't need to be filtered anymore
- if (folder->getCompletedFilterGeneration() >= filter_generation)
- {
- // track latest generation to pass any child items
- if (folder->getFiltered() || folder->hasFilteredDescendants(filter.getFirstSuccessGeneration()))
- {
- mMostFilteredDescendantGeneration = filter_generation;
- requestArrange();
- }
- // just skip it, it has already been filtered
- continue;
- }
-
- // update this folders filter status (and children)
- folder->filter( filter );
-
- // track latest generation to pass any child items
- if (folder->getFiltered() || folder->hasFilteredDescendants(filter_generation))
- {
- mMostFilteredDescendantGeneration = filter_generation;
- requestArrange();
- if (getRoot()->needsAutoSelect() && autoopen_folders)
- {
- folder->setOpenArrangeRecursively(TRUE);
- }
- }
- }
-
- for (items_t::iterator iter = mItems.begin();
- iter != mItems.end();
- ++iter)
- {
- LLFolderViewItem* item = (*iter);
- if (filter.getFilterCount() < 0)
- {
- break;
- }
- if (item->getLastFilterGeneration() >= filter_generation)
- {
- if (item->getFiltered())
- {
- mMostFilteredDescendantGeneration = filter_generation;
- requestArrange();
- }
- continue;
- }
-
- if (item->getLastFilterGeneration() >= must_pass_generation &&
- !item->getFiltered(must_pass_generation))
- {
- // failed to pass an earlier filter that was a subset of the current one
- // go ahead and flag this item as done
- item->setFiltered(FALSE, filter_generation);
- continue;
- }
-
- item->filter( filter );
-
- if (item->getFiltered(filter.getFirstSuccessGeneration()))
- {
- mMostFilteredDescendantGeneration = filter_generation;
- requestArrange();
- }
- }
-
- // if we didn't use all filter iterations
- // that means we filtered all of our descendants
- // instead of exhausting the filter count for this frame
- if (filter.getFilterCount() > 0)
- {
- // flag this folder as having completed filter pass for all descendants
- setCompletedFilterGeneration(filter_generation, FALSE/*dont recurse up to root*/);
- }
-}
-
-void LLFolderViewFolder::filterFolder(LLFolderViewFilter& filter)
-{
- const BOOL previous_passed_filter = mPassedFolderFilter;
- const BOOL passed_filter = filter.checkFolder(this);
-
- // If our visibility will change as a result of this filter, then
- // we need to be rearranged in our parent folder
- if (mParentFolder)
- {
- if (getVisible() != passed_filter
- || previous_passed_filter != passed_filter )
- {
- mParentFolder->requestArrange();
- }
- }
-
- setFilteredFolder(passed_filter, filter.getCurrentGeneration());
- filter.decrementFilterCount();
-
- if (getRoot()->getDebugFilters())
- {
- mStatusText = llformat("%d", mLastFilterGeneration);
- }
-}
-
-void LLFolderViewFolder::setFiltered(BOOL filtered, S32 filter_generation)
-{
- // if this folder is now filtered, but wasn't before
- // (it just passed)
- if (filtered && !mPassedFilter)
- {
- // reset current height, because last time we drew it
- // it might have had more visible items than now
- mCurHeight = 0.f;
- }
-
- LLFolderViewItem::setFiltered(filtered, filter_generation);
-}
-
-void LLFolderViewFolder::dirtyFilter()
-{
- // we're a folder, so invalidate our completed generation
- setCompletedFilterGeneration(-1, FALSE);
- LLFolderViewItem::dirtyFilter();
-}
-
-BOOL LLFolderViewFolder::getFiltered()
-{
- return getFilteredFolder(getRoot()->getFilter()->getFirstSuccessGeneration())
- && LLFolderViewItem::getFiltered();
-}
-
-BOOL LLFolderViewFolder::getFiltered(S32 filter_generation)
-{
- return getFilteredFolder(filter_generation) && LLFolderViewItem::getFiltered(filter_generation);
-}
-
-BOOL LLFolderViewFolder::hasFilteredDescendants(S32 filter_generation)
-{
- return mMostFilteredDescendantGeneration >= filter_generation;
-}
-
-
-BOOL LLFolderViewFolder::hasFilteredDescendants()
-{
- return mMostFilteredDescendantGeneration >= getRoot()->getFilter()->getFirstSuccessGeneration();
-}
// Passes selection information on to children and record selection
// information if necessary.
@@ -1824,39 +1417,7 @@ void LLFolderViewFolder::destroyView()
folderp->destroyView(); // removes entry from mFolders
}
- if (mParentFolder)
- {
- mParentFolder->removeView(this);
- }
-}
-
-// remove the specified item (and any children) if possible. Return
-// TRUE if the item was deleted.
-BOOL LLFolderViewFolder::removeItem(LLFolderViewItem* item)
-{
- if(item->remove())
- {
- return TRUE;
- }
- return FALSE;
-}
-
-// simply remove the view (and any children) Don't bother telling the
-// listeners.
-void LLFolderViewFolder::removeView(LLFolderViewItem* item)
-{
- if (!item || item->getParentFolder() != this)
- {
- return;
- }
- // deselect without traversing hierarchy
- if (item->isSelected())
- {
- item->deselectItem();
- }
- getRoot()->removeFromSelectionList(item);
- extractItem(item);
- delete item;
+ LLFolderViewItem::destroyView();
}
// extractItem() removes the specified item from the folder, but
@@ -1882,7 +1443,7 @@ void LLFolderViewFolder::extractItem( LLFolderViewItem* item )
mItems.erase(it);
}
//item has been removed, need to update filter
- dirtyFilter();
+ getViewModelItem()->dirtyFilter();
//because an item is going away regardless of filter status, force rearrange
requestArrange();
removeChild(item);
@@ -1890,31 +1451,28 @@ void LLFolderViewFolder::extractItem( LLFolderViewItem* item )
BOOL LLFolderViewFolder::isMovable()
{
- if( getViewModelItem() )
+ if( !(getViewModelItem()->isItemMovable()) )
{
- if( !(getViewModelItem()->isItemMovable()) )
- {
- return FALSE;
- }
+ return FALSE;
+ }
- for (items_t::iterator iter = mItems.begin();
- iter != mItems.end();)
+ for (items_t::iterator iter = mItems.begin();
+ iter != mItems.end();)
+ {
+ items_t::iterator iit = iter++;
+ if(!(*iit)->isMovable())
{
- items_t::iterator iit = iter++;
- if(!(*iit)->isMovable())
- {
- return FALSE;
- }
+ return FALSE;
}
+ }
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
+ for (folders_t::iterator iter = mFolders.begin();
+ iter != mFolders.end();)
+ {
+ folders_t::iterator fit = iter++;
+ if(!(*fit)->isMovable())
{
- folders_t::iterator fit = iter++;
- if(!(*fit)->isMovable())
- {
- return FALSE;
- }
+ return FALSE;
}
}
return TRUE;
@@ -1923,31 +1481,28 @@ BOOL LLFolderViewFolder::isMovable()
BOOL LLFolderViewFolder::isRemovable()
{
- if( getViewModelItem() )
+ if( !(getViewModelItem()->isItemRemovable()) )
{
- if( !(getViewModelItem()->isItemRemovable()) )
- {
- return FALSE;
- }
+ return FALSE;
+ }
- for (items_t::iterator iter = mItems.begin();
- iter != mItems.end();)
+ for (items_t::iterator iter = mItems.begin();
+ iter != mItems.end();)
+ {
+ items_t::iterator iit = iter++;
+ if(!(*iit)->isRemovable())
{
- items_t::iterator iit = iter++;
- if(!(*iit)->isRemovable())
- {
- return FALSE;
- }
+ return FALSE;
}
+ }
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
+ for (folders_t::iterator iter = mFolders.begin();
+ iter != mFolders.end();)
+ {
+ folders_t::iterator fit = iter++;
+ if(!(*fit)->isRemovable())
{
- folders_t::iterator fit = iter++;
- if(!(*fit)->isRemovable())
- {
- return FALSE;
- }
+ return FALSE;
}
}
return TRUE;
@@ -1956,6 +1511,12 @@ BOOL LLFolderViewFolder::isRemovable()
// this is an internal method used for adding items to folders.
BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item)
{
+ if (item->getParentFolder())
+ {
+ item->getParentFolder()->extractItem(item);
+ }
+ item->setParentFolder(this);
+
mItems.push_back(item);
item->setRect(LLRect(0, 0, getRect().getWidth(), 0));
@@ -1963,12 +1524,14 @@ BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item)
addChild(item);
- item->dirtyFilter();
+ item->getViewModelItem()->dirtyFilter();
// Handle sorting
requestArrange();
requestSort();
+ getViewModelItem()->addChild(item->getViewModelItem());
+
//TODO RN - make sort bubble up as long as parent Folder doesn't have anything matching sort criteria
//// Traverse parent folders and update creation date and resort, if necessary
//LLFolderViewFolder* parentp = this;
@@ -1989,16 +1552,23 @@ BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item)
// this is an internal method used for adding items to folders.
BOOL LLFolderViewFolder::addFolder(LLFolderViewFolder* folder)
{
+ if (folder->mParentFolder)
+ {
+ folder->mParentFolder->extractItem(folder);
+ }
+ folder->mParentFolder = this;
mFolders.push_back(folder);
folder->setOrigin(0, 0);
folder->reshape(getRect().getWidth(), 0);
folder->setVisible(FALSE);
addChild( folder );
- folder->dirtyFilter();
+ folder->getViewModelItem()->dirtyFilter();
// rearrange all descendants too, as our indentation level might have changed
folder->requestArrange();
requestSort();
+ getViewModelItem()->addChild(folder->getViewModelItem());
+
return TRUE;
}
@@ -2027,16 +1597,13 @@ void LLFolderViewFolder::setOpenArrangeRecursively(BOOL openitem, ERecurseType r
{
BOOL was_open = isOpen();
mIsOpen = openitem;
- if (getViewModelItem())
+ if(!was_open && openitem)
{
- if(!was_open && openitem)
- {
- getViewModelItem()->openItem();
- }
- else if(was_open && !openitem)
- {
- getViewModelItem()->closeItem();
- }
+ getViewModelItem()->openItem();
+ }
+ else if(was_open && !openitem)
+ {
+ getViewModelItem()->closeItem();
}
if (recurse == RECURSE_DOWN || recurse == RECURSE_UP_DOWN)
@@ -2068,7 +1635,7 @@ BOOL LLFolderViewFolder::handleDragAndDropFromChild(MASK mask,
EAcceptance* accept,
std::string& tooltip_msg)
{
- BOOL accepted = mListener && mListener->dragOrDrop(mask,drop,c_type,cargo_data, tooltip_msg);
+ BOOL accepted = mListener->dragOrDrop(mask,drop,c_type,cargo_data, tooltip_msg);
if (accepted)
{
mDragAndDropTarget = TRUE;
@@ -2156,7 +1723,7 @@ BOOL LLFolderViewFolder::handleDragAndDropToThisFolder(MASK mask,
EAcceptance* accept,
std::string& tooltip_msg)
{
- BOOL accepted = getViewModelItem() && getViewModelItem()->dragOrDrop(mask,drop,cargo_type,cargo_data, tooltip_msg);
+ BOOL accepted = getViewModelItem()->dragOrDrop(mask,drop,cargo_type,cargo_data, tooltip_msg);
if (accepted)
{
@@ -2259,7 +1826,7 @@ BOOL LLFolderViewFolder::handleDoubleClick( S32 x, S32 y, MASK mask )
}
else
{
- setSelectionFromRoot(this, FALSE);
+ getRoot()->setSelection(this, FALSE);
toggleOpen();
}
handled = TRUE;
@@ -2293,16 +1860,6 @@ void LLFolderViewFolder::draw()
mExpanderHighlighted = FALSE;
}
-BOOL LLFolderViewFolder::potentiallyVisible()
-{
- // folder should be visible by it's own filter status
- return LLFolderViewItem::potentiallyVisible()
- // or one or more of its descendants have passed the minimum filter requirement
- || hasFilteredDescendants()
- // or not all of its descendants have been checked against minimum filter requirement
- || getCompletedFilterGeneration() < getRoot()->getFilter()->getFirstSuccessGeneration();
-}
-
// this does prefix traversal, as folders are listed above their contents
LLFolderViewItem* LLFolderViewFolder::getNextFromChild( LLFolderViewItem* item, BOOL include_children )
{
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index fd2948f34e..7e48969826 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -35,6 +35,7 @@ class LLFolderViewModelItem;
class LLFolderViewFolder;
class LLFolderViewFunctor;
class LLFolderViewFilter;
+class LLFolderViewModelInterface;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLFolderViewItem
@@ -78,8 +79,6 @@ public:
static const F32 FOLDER_CLOSE_TIME_CONSTANT;
static const F32 FOLDER_OPEN_TIME_CONSTANT;
- const std::string& getSearchableLabel() { return mSearchableLabel; }
-
private:
BOOL mIsSelected;
@@ -90,7 +89,6 @@ protected:
LLFolderViewItem(const Params& p);
std::string mLabel;
- std::string mSearchableLabel;
S32 mLabelWidth;
bool mLabelWidthDirty;
LLFolderViewFolder* mParentFolder;
@@ -106,8 +104,7 @@ protected:
BOOL mHasVisibleChildren;
S32 mIndentation;
S32 mItemHeight;
- BOOL mPassedFilter;
- S32 mLastFilterGeneration;
+
//TODO RN: create interface for string highlighting
//std::string::size_type mStringMatchOffset;
F32 mControlLabelRotation;
@@ -115,9 +112,6 @@ protected:
BOOL mDragAndDropTarget;
bool mIsMouseOverTitle;
- // helper function to change the selection from the root.
- void changeSelectionFromRoot(LLFolderViewItem* selection, BOOL selected);
-
// this is an internal method used for adding items to folders. A
// no-op at this level, but reimplemented in derived classes.
virtual BOOL addItem(LLFolderViewItem*) { return FALSE; }
@@ -130,39 +124,20 @@ public:
virtual void openItem( void );
- // This function clears the currently selected item, and records
- // the specified selected item appropriately for display and use
- // in the UI. If open is TRUE, then folders are opened up along
- // the way to the selection.
- void setSelectionFromRoot(LLFolderViewItem* selection, BOOL openitem,
- BOOL take_keyboard_focus = TRUE);
-
- // This function is called when the folder view is dirty. It's
- // implemented here but called by derived classes when folding the
- // views.
- void arrangeFromRoot();
- void filterFromRoot( void );
-
void arrangeAndSet(BOOL set_selection, BOOL take_keyboard_focus);
virtual ~LLFolderViewItem( void );
// addToFolder() returns TRUE if it succeeds. FALSE otherwise
- enum { ARRANGE = TRUE, DO_NOT_ARRANGE = FALSE };
virtual BOOL addToFolder(LLFolderViewFolder* folder);
// Finds width and height of this object and it's children. Also
// makes sure that this view and it's children are the right size.
- virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
+ virtual S32 arrange( S32* width, S32* height );
virtual S32 getItemHeight();
- // applies filters to control visibility of items
- virtual void filter( LLFolderViewFilter& filter);
-
// updates filter serial number and optionally propagated value up to root
- S32 getLastFilterGeneration() { return mLastFilterGeneration; }
-
- virtual void dirtyFilter();
+ S32 getLastFilterGeneration() const;
// If 'selection' is 'this' then note that otherwise ignore.
// Returns TRUE if this item ends up being selected.
@@ -213,8 +188,6 @@ public:
// viewed. This method will ask the viewed object itself.
const std::string& getName( void ) const;
- const std::string& getSearchableLabel( void ) const;
-
// This method returns the label displayed on the view. This
// method was primarily added to allow sorting on the folder
// contents possible before the entire view has been constructed.
@@ -224,12 +197,17 @@ public:
LLFolderViewFolder* getParentFolder( void ) { return mParentFolder; }
const LLFolderViewFolder* getParentFolder( void ) const { return mParentFolder; }
+ void setParentFolder(LLFolderViewFolder* parent) { mParentFolder = parent; }
+
LLFolderViewItem* getNextOpenNode( BOOL include_children = TRUE );
LLFolderViewItem* getPreviousOpenNode( BOOL include_children = TRUE );
const LLFolderViewModelItem* getViewModelItem( void ) const { return mListener; }
LLFolderViewModelItem* getViewModelItem( void ) { return mListener; }
+ const LLFolderViewModelInterface* getFolderViewModel( void ) const;
+ LLFolderViewModelInterface* getFolderViewModel( void );
+
// just rename the object.
void rename(const std::string& new_name);
@@ -239,15 +217,11 @@ public:
virtual BOOL isOpen() const { return FALSE; }
virtual LLFolderView* getRoot();
+ virtual const LLFolderView* getRoot() const;
BOOL isDescendantOf( const LLFolderViewFolder* potential_ancestor );
S32 getIndentation() { return mIndentation; }
- virtual BOOL potentiallyVisible(); // is the item definitely visible or we haven't made up our minds yet?
- virtual BOOL potentiallyHidden(); // did this item not pass the filter or do we not know yet?
-
- virtual BOOL getFiltered();
- virtual BOOL getFiltered(S32 filter_generation);
- virtual void setFiltered(BOOL filtered, S32 filter_generation);
+ virtual BOOL passedFilter(S32 filter_generation = -1);
// refresh information from the object being viewed.
virtual void refresh();
@@ -305,7 +279,6 @@ protected:
F32 mAutoOpenCountdown;
S32 mLastArrangeGeneration;
S32 mLastCalculatedWidth;
- S32 mCompletedFilterGeneration;
S32 mMostFilteredDescendantGeneration;
bool mNeedsSort;
bool mPassedFolderFilter;
@@ -322,8 +295,6 @@ public:
virtual ~LLFolderViewFolder( void );
- virtual BOOL potentiallyVisible();
-
LLFolderViewItem* getNextFromChild( LLFolderViewItem*, BOOL include_children = TRUE );
LLFolderViewItem* getPreviousFromChild( LLFolderViewItem*, BOOL include_children = TRUE );
@@ -332,34 +303,17 @@ public:
// Finds width and height of this object and it's children. Also
// makes sure that this view and it's children are the right size.
- virtual S32 arrange( S32* width, S32* height, S32 filter_generation );
+ virtual S32 arrange( S32* width, S32* height );
BOOL needsArrange();
- virtual void setCompletedFilterGeneration(S32 generation, BOOL recurse_up);
- virtual S32 getCompletedFilterGeneration() { return mCompletedFilterGeneration; }
-
- BOOL hasFilteredDescendants(S32 filter_generation);
- BOOL hasFilteredDescendants();
-
- // applies filters to control visibility of items
- virtual void filter( LLFolderViewFilter& filter);
- virtual void setFiltered(BOOL filtered, S32 filter_generation);
- virtual BOOL getFiltered();
- virtual BOOL getFiltered(S32 filter_generation);
-
- virtual void dirtyFilter();
-
- // folder-specific filtering (filter status propagates top down instead of bottom up)
- void filterFolder(LLFolderViewFilter& filter);
- void setFilteredFolder(bool filtered, S32 filter_generation);
- bool getFilteredFolder(S32 filter_generation);
+ bool descendantsPassedFilter(S32 filter_generation = -1);
// Passes selection information on to children and record
// selection information if necessary.
// Returns TRUE if this object (or a child) ends up being selected.
// If 'openitem' is TRUE then folders are opened up along the way to the selection.
- virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus);
+ virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus = TRUE);
// This method is used to change the selection of an item.
// Recursively traverse all children; if 'selection' is 'this' then change
@@ -385,14 +339,6 @@ public:
//virtual BOOL removeRecursively(BOOL single_item);
//virtual BOOL remove();
- // remove the specified item (and any children) if
- // possible. Return TRUE if the item was deleted.
- BOOL removeItem(LLFolderViewItem* item);
-
- // simply remove the view (and any children) Don't bother telling
- // the listeners.
- void removeView(LLFolderViewItem* item);
-
// extractItem() removes the specified item from the folder, but
// doesn't delete it.
virtual void extractItem( LLFolderViewItem* item );
diff --git a/indra/newview/llfolderviewmodel.h b/indra/newview/llfolderviewmodel.h
index 74c8bb92ef..0216ba2a07 100644
--- a/indra/newview/llfolderviewmodel.h
+++ b/indra/newview/llfolderviewmodel.h
@@ -72,9 +72,9 @@ public:
// +-------------------------------------------------------------------+
// + Execution And Results
// +-------------------------------------------------------------------+
- virtual bool check(const LLFolderViewItem* item) = 0;
+ virtual bool check(const LLFolderViewModelItem* item) = 0;
virtual bool check(const LLInventoryItem* item) = 0;
- virtual bool checkFolder(const LLFolderViewFolder* folder) const = 0;
+ virtual bool checkFolder(const LLFolderViewModelItem* folder) const = 0;
virtual bool checkFolder(const LLUUID& folder_id) const = 0;
virtual void setEmptyLookupMessage(const std::string& message) = 0;
@@ -126,6 +126,8 @@ public:
virtual bool contentsReady() = 0;
virtual void setFolderView(LLFolderView* folder_view) = 0;
+ virtual LLFolderViewFilter* getFilter() = 0;
+ virtual const LLFolderViewFilter* getFilter() const = 0;
};
class LLFolderViewModelCommon : public LLFolderViewModelInterface
@@ -152,20 +154,82 @@ protected:
};
+template <typename SORT_TYPE, typename ITEM_TYPE, typename FOLDER_TYPE, typename FILTER_TYPE>
+class LLFolderViewModel : public LLFolderViewModelCommon
+{
+public:
+ LLFolderViewModel(){}
+ virtual ~LLFolderViewModel() {}
+
+ typedef SORT_TYPE SortType;
+ typedef ITEM_TYPE ItemType;
+ typedef FOLDER_TYPE FolderType;
+ typedef FILTER_TYPE FilterType;
+
+ virtual SortType& getSorter() { return mSorter; }
+ virtual const SortType& getSorter() const { return mSorter; }
+ virtual void setSorter(const SortType& sorter) { mSorter = sorter; requestSortAll(); }
+
+ virtual FilterType* getFilter() { return &mFilter; }
+ virtual const FilterType* getFilter() const { return &mFilter; }
+ virtual void setFilter(const FilterType& filter) { mFilter = filter; }
+
+ // TODO RN: remove this and put all filtering logic in view model
+ // add getStatusText and isFiltering()
+ virtual bool contentsReady() { return true; }
+
+ struct ViewModelCompare
+ {
+ ViewModelCompare(const SortType& sorter)
+ : mSorter(sorter)
+ {}
+
+ bool operator () (const LLFolderViewItem* a, const LLFolderViewItem* b) const
+ {
+ return mSorter(static_cast<const ItemType*>(a->getViewModelItem()), static_cast<const ItemType*>(b->getViewModelItem()));
+ }
+
+ bool operator () (const LLFolderViewFolder* a, const LLFolderViewFolder* b) const
+ {
+ return mSorter(static_cast<const ItemType*>(a->getViewModelItem()), static_cast<const ItemType*>(b->getViewModelItem()));
+ }
+
+ const SortType& mSorter;
+ };
+
+ void sort(LLFolderViewFolder* folder)
+ {
+ if (needsSort(folder->getViewModelItem()))
+ {
+ folder->sortFolders(ViewModelCompare(getSorter()));
+ folder->sortItems(ViewModelCompare(getSorter()));
+ folder->getViewModelItem()->setSortVersion(mTargetSortVersion);
+ folder->requestArrange();
+ }
+ }
+
+ //TODO RN: fix this
+ void filter(LLFolderViewFolder* folder)
+ {
+
+ }
+
+protected:
+ SortType mSorter;
+ FilterType mFilter;
+};
+
// This is am abstract base class that users of the folderview classes
// would use to bridge the folder view with the underlying data
class LLFolderViewModelItem
{
public:
- LLFolderViewModelItem()
- : mFolderViewItem(NULL)
- {}
-
virtual ~LLFolderViewModelItem( void ) {};
virtual void update() {} //called when drawing
virtual const std::string& getName() const = 0;
virtual const std::string& getDisplayName() const = 0;
+ virtual const std::string& getSearchableName() const = 0;
virtual LLPointer<LLUIImage> getIcon() const = 0;
virtual LLPointer<LLUIImage> getIconOpen() const { return getIcon(); }
@@ -198,12 +262,23 @@ public:
virtual void buildContextMenu(LLMenuGL& menu, U32 flags) = 0;
+ virtual bool potentiallyVisible() = 0; // is the item definitely visible or we haven't made up our minds yet?
+
+ virtual void filter( LLFolderViewFilter& filter) = 0;
+ virtual bool passedFilter(S32 filter_generation = -1) = 0;
+ virtual bool descendantsPassedFilter(S32 filter_generation = -1) = 0;
+ virtual void setPassedFilter(bool passed, bool passed_folder, S32 filter_generation) = 0;
+ virtual void dirtyFilter() = 0;
+
+ virtual S32 getLastFilterGeneration() const = 0;
+
// This method should be called when a drag begins. returns TRUE
// if the drag can begin, otherwise FALSE.
virtual LLToolDragAndDrop::ESource getDragSource() const = 0;
virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const = 0;
virtual bool hasChildren() const = 0;
+ virtual void addChild(LLFolderViewModelItem* child) = 0;
// This method will be called to determine if a drop can be
// performed, and will set drop to TRUE if a drop is
@@ -217,10 +292,12 @@ public:
virtual void requestSort() = 0;
virtual S32 getSortVersion() = 0;
virtual void setSortVersion(S32 version) = 0;
+ virtual void setParent(LLFolderViewModelItem* parent) = 0;
+
protected:
+
friend class LLFolderViewItem;
- void setFolderViewItem(LLFolderViewItem* folder_view_item) { mFolderViewItem = folder_view_item;}
- LLFolderViewItem* mFolderViewItem;
+ virtual void setFolderViewItem(LLFolderViewItem* folder_view_item) = 0;
};
@@ -228,95 +305,48 @@ class LLFolderViewModelItemCommon : public LLFolderViewModelItem
{
public:
LLFolderViewModelItemCommon()
- : mSortVersion(-1)
+ : mSortVersion(-1),
+ mPassedFilter(false),
+ mPassedFolderFilter(false),
+ mFolderViewItem(NULL),
+ mLastFilterGeneration(-1),
+ mMostFilteredDescendantGeneration(-1)
{}
void requestSort() { mSortVersion = -1; }
S32 getSortVersion() { return mSortVersion; }
void setSortVersion(S32 version) { mSortVersion = version;}
-protected:
-
- S32 mSortVersion;
-};
-
-template <typename SORT_TYPE, typename ITEM_TYPE, typename FOLDER_TYPE, typename FILTER_TYPE>
-class LLFolderViewModel : public LLFolderViewModelCommon
-{
-public:
- LLFolderViewModel(){}
- virtual ~LLFolderViewModel() {}
-
- typedef SORT_TYPE SortType;
- typedef ITEM_TYPE ItemType;
- typedef FOLDER_TYPE FolderType;
- typedef FILTER_TYPE FilterType;
-
- virtual SortType& getSorter() { return mSorter; }
- virtual const SortType& getSorter() const { return mSorter; }
- virtual void setSorter(const SortType& sorter) { mSorter = sorter; requestSortAll(); }
- virtual FilterType& getFilter() { return mFilter; }
- virtual const FilterType& getFilter() const { return mFilter; }
- virtual void setFilter(const FilterType& filter) { mFilter = filter; }
-
- // TODO RN: remove this and put all filtering logic in view model
- // add getStatusText and isFiltering()
- virtual bool contentsReady() { return true; }
-
- struct ViewModelCompare
+ S32 getLastFilterGeneration() const { return mLastFilterGeneration; }
+ void dirtyFilter()
{
- ViewModelCompare(const SortType& sorter)
- : mSorter(sorter)
- {}
-
- bool operator () (const LLFolderViewItem* a, const LLFolderViewItem* b) const
+ mLastFilterGeneration = -1;
+ // bubble up dirty flag all the way to root
+ if (mParent)
{
- return mSorter(static_cast<const ItemType*>(a->getViewModelItem()), static_cast<const ItemType*>(b->getViewModelItem()));
+ mParent->dirtyFilter();
}
+ }
+ virtual void addChild(LLFolderViewModelItem* child) { mChildren.push_back(child); child->setParent(this); }
- bool operator () (const LLFolderViewFolder* a, const LLFolderViewFolder* b) const
- {
- return mSorter(static_cast<const ItemType*>(a->getViewModelItem()), static_cast<const ItemType*>(b->getViewModelItem()));
- }
+protected:
+ virtual void setParent(LLFolderViewModelItem* parent) { mParent = parent; }
- const SortType& mSorter;
- };
+ S32 mSortVersion;
+ bool mPassedFilter;
+ bool mPassedFolderFilter;
- void sort(LLFolderViewFolder* folder)
- {
- if (needsSort(folder->getViewModelItem()))
- {
- folder->sortFolders(ViewModelCompare(getSorter()));
- folder->sortItems(ViewModelCompare(getSorter()));
- folder->getViewModelItem()->setSortVersion(mTargetSortVersion);
- folder->requestArrange();
- }
- }
+ S32 mLastFilterGeneration;
+ S32 mMostFilteredDescendantGeneration;
- //TODO RN: fix this
- void filter(LLFolderViewFolder* folder)
- {
- /*FilterType& filter = getFilter();
- for (std::list<LLFolderViewItem*>::const_iterator it = folder->getItemsBegin(), end_it = folder->getItemsEnd();
- it != end_it;
- ++it)
- {
- LLFolderViewItem* child_item = *it;
- child_item->setFiltered(filter.checkFolder(static_cast<ItemType*>(child_item->getViewModelItem())), filter.getCurrentGeneration());
- }
- for (std::list<LLFolderViewFolder*>::const_iterator it = folder->getFoldersBegin(), end_it = folder->getFoldersEnd();
- it != end_it;
- ++it)
- {
- LLFolderViewItem* child_folder = *it;
- child_folder->setFiltered(filter.check(static_cast<ItemType*>(child_folder->getViewModelItem())), filter.getCurrentGeneration());
- }*/
- }
+ typedef std::list<LLFolderViewModelItem*> child_list_t;
+ child_list_t mChildren;
+ LLFolderViewModelItem* mParent;
-protected:
- SortType mSorter;
- FilterType mFilter;
+ void setFolderViewItem(LLFolderViewItem* folder_view_item) { mFolderViewItem = folder_view_item;}
+ LLFolderViewItem* mFolderViewItem;
};
+
#endif
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 70a174a140..45a2bffa6b 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -1545,6 +1545,10 @@ void LLItemBridge::buildDisplayName() const
{
mDisplayName.assign(LLStringUtil::null);
}
+
+ mSearchableName.assign(mDisplayName);
+ mSearchableName.append(getLabelSuffix());
+ LLStringUtil::toUpper(mSearchableName);
}
LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const
@@ -1850,11 +1854,9 @@ void LLFolderBridge::buildDisplayName() const
LLTrans::findString(mDisplayName, std::string("InvFolder ") + getName(), LLSD());
}
- //if (mDisplayName.empty())
- //{
- // S32 foo;
- // foo = 0;
- //}
+ mSearchableName.assign(mDisplayName);
+ mSearchableName.append(getLabelSuffix());
+ LLStringUtil::toUpper(mSearchableName);
}
@@ -4000,7 +4002,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
LLFolderViewItem* fv_item = active_panel->getItemByID(inv_item->getUUID());
if (!fv_item) return false;
- accept = filter->check(fv_item);
+ accept = filter->check(fv_item->getViewModelItem());
}
if (accept && drop)
@@ -4222,7 +4224,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
LLFolderViewItem* fv_item = active_panel->getItemByID(inv_item->getUUID());
if (!fv_item) return false;
- accept = filter->check(fv_item);
+ accept = filter->check(fv_item->getViewModelItem());
}
if (accept && drop)
@@ -4319,7 +4321,7 @@ bool check_item(const LLUUID& item_id,
LLFolderViewItem* fv_item = active_panel->getItemByID(item_id);
if (!fv_item) return false;
- return filter->check(fv_item);
+ return filter->check(fv_item->getViewModelItem());
}
// +=================================================+
@@ -6126,7 +6128,7 @@ void LLLinkFolderBridge::gotoItem()
model->fetchDescendentsOf(cat_uuid);
}
base_folder->setOpen(TRUE);
- mRoot->setSelectionFromRoot(base_folder,TRUE);
+ mRoot->setSelection(base_folder,TRUE);
mRoot->scrollToShowSelection();
}
}
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 26789627f7..b0582d003d 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -88,6 +88,8 @@ public:
//--------------------------------------------------------------------
virtual const std::string& getName() const;
virtual const std::string& getDisplayName() const;
+ const std::string& getSearchableName() const { return mSearchableName; }
+
virtual PermissionMask getPermissionMask() const;
virtual LLFolderType::EType getPreferredType() const;
virtual time_t getCreationDate() const;
@@ -174,6 +176,7 @@ protected:
bool mIsLink;
LLTimer mTimeSinceRequestStart;
mutable std::string mDisplayName;
+ mutable std::string mSearchableName;
void purgeItem(LLInventoryModel *model, const LLUUID &uuid);
virtual void buildDisplayName() const {}
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index c13bb5123e..c7e0136368 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -71,35 +71,35 @@ LLInventoryFilter::LLInventoryFilter(const Params& p)
mFilterOps(p.filter_ops),
mOrder(p.sort_order),
mFilterSubString(p.substring),
- mLastSuccessGeneration(0),
- mLastFailGeneration(S32_MAX),
+ mCurrentGeneration(0),
+ mFirstRequiredGeneration(0),
mFirstSuccessGeneration(0),
mFilterCount(0)
{
- mNextFilterGeneration = mLastSuccessGeneration + 1;
+ mNextFilterGeneration = mCurrentGeneration + 1;
// copy mFilterOps into mDefaultFilterOps
markDefault();
}
-bool LLInventoryFilter::check(const LLFolderViewItem* item)
+bool LLInventoryFilter::check(const LLFolderViewModelItem* item)
{
+ const LLFolderViewModelItemInventory* listener = static_cast<const LLFolderViewModelItemInventory*>(item);
// Clipboard cut items are *always* filtered so we need this value upfront
- const LLFolderViewModelItemInventory* listener = static_cast<const LLFolderViewModelItemInventory*>(item->getViewModelItem());
const BOOL passed_clipboard = (listener ? checkAgainstClipboard(listener->getUUID()) : TRUE);
// If it's a folder and we're showing all folders, return automatically.
- const BOOL is_folder = (dynamic_cast<const LLFolderViewFolder*>(item) != NULL);
+ const BOOL is_folder = listener->getInventoryType() == LLInventoryType::IT_CATEGORY;;
if (is_folder && (mFilterOps.mShowFolderState == LLInventoryFilter::SHOW_ALL_FOLDERS))
{
return passed_clipboard;
}
- std::string::size_type string_offset = mFilterSubString.size() ? item->getSearchableLabel().find(mFilterSubString) : std::string::npos;
+ std::string::size_type string_offset = mFilterSubString.size() ? listener->getSearchableName().find(mFilterSubString) : std::string::npos;
- const BOOL passed_filtertype = checkAgainstFilterType(item);
- const BOOL passed_permissions = checkAgainstPermissions(item);
- const BOOL passed_filterlink = checkAgainstFilterLinks(item);
+ const BOOL passed_filtertype = checkAgainstFilterType(listener);
+ const BOOL passed_permissions = checkAgainstPermissions(listener);
+ const BOOL passed_filterlink = checkAgainstFilterLinks(listener);
const BOOL passed = (passed_filtertype &&
passed_permissions &&
passed_filterlink &&
@@ -117,27 +117,19 @@ bool LLInventoryFilter::check(const LLInventoryItem* item)
const bool passed_permissions = checkAgainstPermissions(item);
const BOOL passed_clipboard = checkAgainstClipboard(item->getUUID());
const bool passed = (passed_filtertype
- && passed_permissions
- && passed_clipboard
- && (mFilterSubString.size() == 0 || string_offset != std::string::npos));
+ && passed_permissions
+ && passed_clipboard
+ && (mFilterSubString.size() == 0 || string_offset != std::string::npos));
return passed;
}
-bool LLInventoryFilter::checkFolder(const LLFolderViewFolder* folder) const
+bool LLInventoryFilter::checkFolder(const LLFolderViewModelItem* item) const
{
- if (!folder)
- {
- llwarns << "The filter can not be checked on an invalid folder." << llendl;
- llassert(false); // crash in development builds
- return false;
- }
-
- const LLFolderViewModelItemInventory* listener = static_cast<const LLFolderViewModelItemInventory*>(folder->getViewModelItem());
+ const LLFolderViewModelItemInventory* listener = static_cast<const LLFolderViewModelItemInventory*>(item);
if (!listener)
{
- llwarns << "Folder view event listener not found." << llendl;
- llassert(false); // crash in development builds
+ llerrs << "Folder view event listener not found." << llendl;
return false;
}
@@ -179,9 +171,8 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const
return passed_clipboard;
}
-bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) const
+bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInventory* listener) const
{
- const LLFolderViewModelItemInventory* listener = static_cast<const LLFolderViewModelItemInventory*>(item->getViewModelItem());
if (!listener) return FALSE;
LLInventoryType::EType object_type = listener->getInventoryType();
@@ -347,13 +338,12 @@ bool LLInventoryFilter::checkAgainstClipboard(const LLUUID& object_id) const
return true;
}
-bool LLInventoryFilter::checkAgainstPermissions(const LLFolderViewItem* item) const
+bool LLInventoryFilter::checkAgainstPermissions(const LLFolderViewModelItemInventory* listener) const
{
- const LLFolderViewModelItemInventory* listener = static_cast<const LLFolderViewModelItemInventory*>(item->getViewModelItem());
if (!listener) return FALSE;
PermissionMask perm = listener->getPermissionMask();
- const LLInvFVBridge *bridge = dynamic_cast<const LLInvFVBridge *>(item->getViewModelItem());
+ const LLInvFVBridge *bridge = dynamic_cast<const LLInvFVBridge *>(listener);
if (bridge && bridge->isLink())
{
const LLUUID& linked_uuid = gInventory.getLinkedItemID(bridge->getUUID());
@@ -375,9 +365,8 @@ bool LLInventoryFilter::checkAgainstPermissions(const LLInventoryItem* item) con
return (perm & mFilterOps.mPermissions) == mFilterOps.mPermissions;
}
-bool LLInventoryFilter::checkAgainstFilterLinks(const LLFolderViewItem* item) const
+bool LLInventoryFilter::checkAgainstFilterLinks(const LLFolderViewModelItemInventory* listener) const
{
- const LLFolderViewModelItemInventory* listener = static_cast<const LLFolderViewModelItemInventory*>(item->getViewModelItem());
if (!listener) return TRUE;
const LLUUID object_id = listener->getUUID();
@@ -740,7 +729,7 @@ void LLInventoryFilter::resetDefault()
void LLInventoryFilter::setModified(EFilterModified behavior)
{
mFilterText.clear();
- mLastSuccessGeneration = mNextFilterGeneration++;
+ mCurrentGeneration = mNextFilterGeneration++;
if (mFilterModified == FILTER_NONE)
{
@@ -753,33 +742,21 @@ void LLInventoryFilter::setModified(EFilterModified behavior)
mFilterModified = FILTER_RESTART;
}
- if (isNotDefault())
- {
- // if not keeping current filter results, update last valid as well
- switch(mFilterModified)
- {
- case FILTER_RESTART:
- mLastFailGeneration = mLastSuccessGeneration;
- mFirstSuccessGeneration = mLastSuccessGeneration;
- break;
- case FILTER_LESS_RESTRICTIVE:
- mLastFailGeneration = mLastSuccessGeneration;
- break;
- case FILTER_MORE_RESTRICTIVE:
- mFirstSuccessGeneration = mLastSuccessGeneration;
- // must have passed either current filter generation (meaningless, as it hasn't been run yet)
- // or some older generation, so keep the value
- mLastFailGeneration = llmin(mLastFailGeneration, mLastSuccessGeneration);
- break;
- default:
- llerrs << "Bad filter behavior specified" << llendl;
- }
- }
- else
+ // if not keeping current filter results, update last valid as well
+ switch(mFilterModified)
{
- // shortcut disabled filters to show everything immediately
- mLastFailGeneration = 0;
- mFirstSuccessGeneration = S32_MAX;
+ case FILTER_RESTART:
+ mFirstRequiredGeneration = mCurrentGeneration;
+ mFirstSuccessGeneration = mCurrentGeneration;
+ break;
+ case FILTER_LESS_RESTRICTIVE:
+ mFirstRequiredGeneration = mCurrentGeneration;
+ break;
+ case FILTER_MORE_RESTRICTIVE:
+ mFirstSuccessGeneration = mCurrentGeneration;
+ break;
+ default:
+ llerrs << "Bad filter behavior specified" << llendl;
}
}
@@ -1101,7 +1078,7 @@ void LLInventoryFilter::decrementFilterCount()
S32 LLInventoryFilter::getCurrentGeneration() const
{
- return mLastSuccessGeneration;
+ return mCurrentGeneration;
}
S32 LLInventoryFilter::getFirstSuccessGeneration() const
{
@@ -1109,7 +1086,7 @@ S32 LLInventoryFilter::getFirstSuccessGeneration() const
}
S32 LLInventoryFilter::getFirstRequiredGeneration() const
{
- return mLastFailGeneration;
+ return mFirstRequiredGeneration;
}
void LLInventoryFilter::setEmptyLookupMessage(const std::string& message)
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index 5b92c21a85..af245a9c3b 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -186,16 +186,10 @@ public:
// +-------------------------------------------------------------------+
// + Execution And Results
// +-------------------------------------------------------------------+
- bool check(const LLFolderViewItem* item);
+ bool check(const LLFolderViewModelItem* listener);
bool check(const LLInventoryItem* item);
- bool checkFolder(const LLFolderViewFolder* folder) const;
+ bool checkFolder(const LLFolderViewModelItem* listener) const;
bool checkFolder(const LLUUID& folder_id) const;
- bool checkAgainstFilterType(const LLFolderViewItem* item) const;
- bool checkAgainstFilterType(const LLInventoryItem* item) const;
- bool checkAgainstPermissions(const LLFolderViewItem* item) const;
- bool checkAgainstPermissions(const LLInventoryItem* item) const;
- bool checkAgainstFilterLinks(const LLFolderViewItem* item) const;
- bool checkAgainstClipboard(const LLUUID& object_id) const;
bool showAllResults() const;
@@ -260,6 +254,12 @@ public:
private:
bool areDateLimitsSet();
+ bool checkAgainstFilterType(const class LLFolderViewModelItemInventory* listener) const;
+ bool checkAgainstFilterType(const LLInventoryItem* item) const;
+ bool checkAgainstPermissions(const class LLFolderViewModelItemInventory* listener) const;
+ bool checkAgainstPermissions(const LLInventoryItem* item) const;
+ bool checkAgainstFilterLinks(const class LLFolderViewModelItemInventory* listener) const;
+ bool checkAgainstClipboard(const LLUUID& object_id) const;
U32 mOrder;
@@ -270,8 +270,8 @@ private:
std::string mFilterSubStringOrig;
const std::string mName;
- S32 mLastSuccessGeneration;
- S32 mLastFailGeneration;
+ S32 mCurrentGeneration;
+ S32 mFirstRequiredGeneration;
S32 mFirstSuccessGeneration;
S32 mNextFilterGeneration;
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 1e494c3ef1..ff461236a2 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -983,7 +983,7 @@ void LLSaveFolderState::doFolder(LLFolderViewFolder* folder)
void LLOpenFilteredFolders::doItem(LLFolderViewItem *item)
{
- if (item->getFiltered())
+ if (item->passedFilter())
{
item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
}
@@ -991,12 +991,12 @@ void LLOpenFilteredFolders::doItem(LLFolderViewItem *item)
void LLOpenFilteredFolders::doFolder(LLFolderViewFolder* folder)
{
- if (folder->getFiltered() && folder->getParentFolder())
+ if (folder->LLFolderViewItem::passedFilter() && folder->getParentFolder())
{
folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
}
// if this folder didn't pass the filter, and none of its descendants did
- else if (!folder->getFiltered() && !folder->hasFilteredDescendants())
+ else if (!folder->getViewModelItem()->passedFilter() && !folder->getViewModelItem()->descendantsPassedFilter())
{
folder->setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_NO);
}
@@ -1004,7 +1004,7 @@ void LLOpenFilteredFolders::doFolder(LLFolderViewFolder* folder)
void LLSelectFirstFilteredItem::doItem(LLFolderViewItem *item)
{
- if (item->getFiltered() && !mItemSelected)
+ if (item->passedFilter() && !mItemSelected)
{
item->getRoot()->setSelection(item, FALSE, FALSE);
if (item->getParentFolder())
@@ -1017,7 +1017,7 @@ void LLSelectFirstFilteredItem::doItem(LLFolderViewItem *item)
void LLSelectFirstFilteredItem::doFolder(LLFolderViewFolder* folder)
{
- if (folder->getFiltered() && !mItemSelected)
+ if (folder->LLFolderViewItem::passedFilter() && !mItemSelected)
{
folder->getRoot()->setSelection(folder, FALSE, FALSE);
if (folder->getParentFolder())
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 74492e0005..aba4c088ab 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -254,18 +254,16 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
mFolderRoot->setCallbackRegistrar(&mCommitCallbackRegistrar);
// Scroller
- {
- LLRect scroller_view_rect = getRect();
- scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
- LLScrollContainer::Params scroller_params(params.scroll());
- scroller_params.rect(scroller_view_rect);
- mScroller = LLUICtrlFactory::create<LLFolderViewScrollContainer>(scroller_params);
- addChild(mScroller);
- mScroller->addChild(mFolderRoot);
- mFolderRoot->setScrollContainer(mScroller);
- mFolderRoot->setFollowsAll();
- mFolderRoot->addChild(mFolderRoot->mStatusTextBox);
- }
+ LLRect scroller_view_rect = getRect();
+ scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
+ LLScrollContainer::Params scroller_params(params.scroll());
+ scroller_params.rect(scroller_view_rect);
+ mScroller = LLUICtrlFactory::create<LLFolderViewScrollContainer>(scroller_params);
+ addChild(mScroller);
+ mScroller->addChild(mFolderRoot);
+ mFolderRoot->setScrollContainer(mScroller);
+ mFolderRoot->setFollowsAll();
+ mFolderRoot->addChild(mFolderRoot->mStatusTextBox);
// Set up the callbacks from the inventory we're viewing, and then build everything.
mInventoryObserver = new LLInventoryPanelObserver(this);
@@ -344,12 +342,12 @@ void LLInventoryPanel::draw()
const LLInventoryFilter* LLInventoryPanel::getFilter() const
{
- return &getFolderViewModel()->getFilter();
+ return getFolderViewModel()->getFilter();
}
LLInventoryFilter* LLInventoryPanel::getFilter()
{
- return &getFolderViewModel()->getFilter();
+ return getFolderViewModel()->getFilter();
}
void LLInventoryPanel::setFilterTypes(U64 types, LLInventoryFilter::EFilterType filter_type)
@@ -561,7 +559,6 @@ void LLInventoryPanel::modelChanged(U32 mask)
if (new_parent != NULL)
{
// Item is to be moved and we found its new parent in the panel's directory, so move the item's UI.
- view_item->getParentFolder()->extractItem(view_item);
view_item->addToFolder(new_parent);
addItemID(viewmodel_item->getUUID(), view_item);
}
@@ -1358,3 +1355,104 @@ void LLFolderViewModelItemInventory::requestSort()
mFolderViewItem->getParentFolder()->getViewModelItem()->requestSort();
}
}
+
+bool LLFolderViewModelItemInventory::potentiallyVisible()
+{
+ return passedFilter() // we've passed the filter
+ || getLastFilterGeneration() < mFolderViewItem->getRoot()->getFolderViewModel()->getFilter()->getFirstSuccessGeneration() // or we don't know yet
+ || descendantsPassedFilter();
+}
+
+bool LLFolderViewModelItemInventory::passedFilter(S32 filter_generation)
+{
+ if (filter_generation < 0) filter_generation = mFolderViewItem->getRoot()->getFolderViewModel()->getFilter()->getFirstSuccessGeneration();
+ return mPassedFolderFilter
+ && mLastFilterGeneration >= filter_generation
+ && (mPassedFilter || descendantsPassedFilter(filter_generation));
+}
+
+bool LLFolderViewModelItemInventory::descendantsPassedFilter(S32 filter_generation)
+{
+ if (filter_generation < 0) filter_generation = mFolderViewItem->getRoot()->getFolderViewModel()->getFilter()->getFirstSuccessGeneration();
+ return mMostFilteredDescendantGeneration >= filter_generation;
+}
+
+void LLFolderViewModelItemInventory::setPassedFilter(bool passed, bool passed_folder, S32 filter_generation)
+{
+ mPassedFilter = passed;
+ mPassedFolderFilter = passed_folder;
+ mLastFilterGeneration = filter_generation;
+}
+
+void LLFolderViewModelItemInventory::filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter )
+{
+ S32 filter_generation = filter.getCurrentGeneration();
+ S32 must_pass_generation = filter.getFirstRequiredGeneration();
+
+ // mMostFilteredDescendantGeneration might have been reset
+ // in which case we need to update it even for folders that
+ // don't need to be filtered anymore
+ if (item->getLastFilterGeneration() < filter_generation)
+ {
+ if (item->getLastFilterGeneration() >= must_pass_generation &&
+ !item->passedFilter(must_pass_generation))
+ {
+ // failed to pass an earlier filter that was a subset of the current one
+ // go ahead and flag this item as done
+ item->setPassedFilter(false, false, filter_generation);
+ }
+ else
+ {
+ //TODO RN:
+ item->filter( filter );
+ }
+ }
+
+ // track latest generation to pass any child items
+ if (item->passedFilter())
+ {
+ mMostFilteredDescendantGeneration = filter_generation;
+ //TODO RN: ensure this still happens
+ //requestArrange();
+ }
+}
+
+void LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter)
+{
+ if(getLastFilterGeneration() < filter.getFirstRequiredGeneration() // haven't checked descendants against minimum required generation to pass
+ || descendantsPassedFilter(filter.getFirstRequiredGeneration())) // or at least one descendant has passed the minimum requirement
+ {
+ // now query children
+ for (child_list_t::iterator iter = mChildren.begin();
+ iter != mChildren.end() && filter.getFilterCount() > 0;
+ ++iter)
+ {
+ filterChildItem((*iter), filter);
+ }
+ }
+
+ // if we didn't use all filter iterations
+ // that means we filtered all of our descendants
+ // so filter ourselves now
+ if (filter.getFilterCount() > 0)
+ {
+ const BOOL previous_passed_filter = mPassedFilter;
+ const BOOL passed_filter = filter.check(this);
+ const BOOL passed_filter_folder = (getInventoryType() == LLInventoryType::IT_CATEGORY)
+ ? filter.checkFolder(this)
+ : true;
+
+ // If our visibility will change as a result of this filter, then
+ // we need to be rearranged in our parent folder
+ LLFolderViewFolder* parent_folder = mFolderViewItem->getParentFolder();
+ if (parent_folder && passed_filter != previous_passed_filter)
+ {
+ parent_folder->requestArrange();
+ }
+
+ setPassedFilter(passed_filter, passed_filter_folder, filter.getCurrentGeneration());
+ //TODO RN: create interface for string highlighting
+ //mStringMatchOffset = filter.getStringMatchOffset(this);
+ filter.decrementFilterCount();
+ }
+}
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 645e2f6d76..35a3f9b5e1 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -62,6 +62,12 @@ public:
virtual EInventorySortGroup getSortGroup() const = 0;
virtual LLInventoryObject* getInventoryObject() const = 0;
virtual void requestSort();
+ virtual bool potentiallyVisible();
+ virtual bool passedFilter(S32 filter_generation = -1);
+ virtual bool descendantsPassedFilter(S32 filter_generation = -1);
+ virtual void setPassedFilter(bool filtered, bool filtered_folder, S32 filter_generation);
+ virtual void filter( LLFolderViewFilter& filter);
+ virtual void filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter);
};
class LLInventorySort
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 901c6379de..0b899d34f4 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -102,7 +102,7 @@ void LLCheckFolderState::doFolder(LLFolderViewFolder* folder)
// Counting only folders that pass the filter.
// The listener check allow us to avoid counting the folder view
// object itself because it has no listener assigned.
- if (folder->hasFilteredDescendants() && folder->getViewModelItem())
+ if (folder->getViewModelItem()->descendantsPassedFilter())
{
if (folder->isOpen())
{
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index e3446fdb3a..33581160fd 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -227,7 +227,7 @@ LLPanelMainInventory::~LLPanelMainInventory( void )
}
}
- LLInventoryFilter* filter = getChild<LLInventoryPanel>("Recent Items")->getFilter();
+ LLInventoryFilter* filter = findChild<LLInventoryPanel>("Recent Items")->getFilter();
if (filter)
{
LLSD filterState;
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index da82d70f22..6a232a26f7 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -77,6 +77,7 @@ protected:
LLUUID mUUID;
std::string mName;
mutable std::string mDisplayName;
+ mutable std::string mSearchableName;
LLPanelObjectInventory* mPanel;
U32 mFlags;
LLAssetType::EType mAssetType;
@@ -105,6 +106,8 @@ public:
// LLFolderViewModelItemInventory functionality
virtual const std::string& getName() const;
virtual const std::string& getDisplayName() const;
+ virtual const std::string& getSearchableName() const;
+
virtual PermissionMask getPermissionMask() const { return PERM_NONE; }
/*virtual*/ LLFolderType::EType getPreferredType() const { return LLFolderType::FT_NONE; }
virtual const LLUUID& getUUID() const { return mUUID; }
@@ -335,9 +338,17 @@ const std::string& LLTaskInvFVBridge::getDisplayName() const
}
}
+ mSearchableName.assign(mDisplayName + getLabelSuffix());
+
return mDisplayName;
}
+const std::string& LLTaskInvFVBridge::getSearchableName() const
+{
+ return mSearchableName;
+}
+
+
// BUG: No creation dates for task inventory
time_t LLTaskInvFVBridge::getCreationDate() const
{
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 194aa7f71b..b143240187 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -271,7 +271,7 @@ void LLSidepanelAppearance::onOpenOutfitButtonClicked()
if (outfit_folder)
{
outfit_folder->setOpen(!outfit_folder->isOpen());
- root->setSelectionFromRoot(outfit_folder,TRUE);
+ root->setSelection(outfit_folder,TRUE);
root->scrollToShowSelection();
}
}
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 50d63911ad..654b18614a 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -623,10 +623,9 @@ void LLFloaterTexturePicker::draw()
LLFolderView* folder_view = mInventoryPanel->getRootFolder();
if (!folder_view) return;
- LLInventoryFilter* filter = static_cast<LLInventoryFilter*>(folder_view->getFilter());
- if (!filter) return;
+ LLInventoryFilter* filter = static_cast<LLFolderViewModelInventory*>(folder_view->getFolderViewModel())->getFilter();
- bool is_filter_active = folder_view->getCompletedFilterGeneration() < filter->getCurrentGeneration() &&
+ bool is_filter_active = folder_view->getLastFilterGeneration() < filter->getCurrentGeneration() &&
filter->isNotDefault();
// After inventory panel filter is applied we have to update
@@ -637,8 +636,9 @@ void LLFloaterTexturePicker::draw()
if (!is_filter_active && !mSelectedItemPinned)
{
folder_view->setPinningSelectedItem(mSelectedItemPinned);
- folder_view->dirtyFilter();
- folder_view->arrangeFromRoot();
+ folder_view->getViewModelItem()->dirtyFilter();
+ //TODO RN: test
+ //folder_view->arrangeFromRoot();
mSelectedItemPinned = TRUE;
}