diff options
| -rw-r--r-- | indra/newview/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | indra/newview/llfolderview.cpp | 223 | ||||
| -rw-r--r-- | indra/newview/llfolderview.h | 12 | ||||
| -rw-r--r-- | indra/newview/llfolderviewitem.cpp | 219 | ||||
| -rw-r--r-- | indra/newview/llfolderviewitem.h | 11 | ||||
| -rw-r--r-- | indra/newview/llfolderviewmodel.cpp | 54 | ||||
| -rw-r--r-- | indra/newview/llfolderviewmodel.h | 38 | ||||
| -rw-r--r-- | indra/newview/llfolderviewmodelinventory.cpp | 306 | ||||
| -rw-r--r-- | indra/newview/llfolderviewmodelinventory.h | 107 | ||||
| -rw-r--r-- | indra/newview/llimfloatercontainer.h | 18 | ||||
| -rw-r--r-- | indra/newview/llinventoryfilter.cpp | 24 | ||||
| -rw-r--r-- | indra/newview/llinventoryfunctions.cpp | 88 | ||||
| -rw-r--r-- | indra/newview/llinventoryfunctions.h | 7 | ||||
| -rw-r--r-- | indra/newview/llinventorypanel.cpp | 212 | ||||
| -rw-r--r-- | indra/newview/llinventorypanel.h | 3 | ||||
| -rw-r--r-- | indra/newview/llpanellandmarks.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llpanelmaininventory.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llpanelobjectinventory.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/lltexturectrl.cpp | 4 | 
19 files changed, 739 insertions, 600 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 1ea474a485..64bc70da58 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -255,6 +255,8 @@ set(viewer_SOURCE_FILES      llfloaterworldmap.cpp      llfolderview.cpp      llfolderviewitem.cpp +    llfolderviewmodel.cpp +    llfolderviewmodelinventory.cpp      llfollowcam.cpp      llfriendcard.cpp      llgesturelistener.cpp @@ -813,6 +815,7 @@ set(viewer_HEADER_FILES      llfloaterworldmap.h      llfolderview.h      llfolderviewmodel.h +    llfolderviewmodelinventory.h      llfolderviewitem.h      llfollowcam.h      llfriendcard.h diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 5844c58e09..6bc89cdbca 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -27,33 +27,24 @@  #include "llviewerprecompiledheaders.h"  #include "llfolderview.h" -#include "llfolderview.h" -#include "llcallbacklist.h" -#include "llinventorybridge.h"  #include "llclipboard.h" // *TODO: remove this once hack below gone. -#include "llinventorypanel.h" -#include "llfoldertype.h"  #include "llkeyboard.h"  #include "lllineeditor.h"  #include "llmenugl.h"  #include "llpanel.h" -#include "llpreview.h"  #include "llscrollcontainer.h" // hack to allow scrolling -#include "lltooldraganddrop.h"  #include "lltrans.h"  #include "llui.h" -#include "llviewertexture.h" -#include "llviewertexturelist.h" -#include "llviewerjointattachment.h" -#include "llviewermenu.h"  #include "lluictrlfactory.h" -#include "llviewercontrol.h" -#include "llviewerfoldertype.h" -#include "llviewerwindow.h" -#include "llvoavatar.h" -#include "llfloaterproperties.h" -#include "llnotificationsutil.h" + +// TODO RN: kill these +// newview includes +#include "llcallbacklist.h"			// per-frame on-idle +#include "llfloaterproperties.h"	// showProperties +#include "llviewerwindow.h"			// renamer popup handling +#include "llpreview.h"				// openSelectedItems +#include "llinventorypanel.h"		// idle loop for filtering, sort order declarations, etc.  // Linden library includes  #include "lldbstrings.h" @@ -251,7 +242,7 @@ LLFolderView::LLFolderView(const Params& p)  	// make the popup menu available -	LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); +	LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory.xml", LLMenuGL::sMenuContainer, LLMenuHolderGL::child_registry_t::instance());  	if (!menu)  	{  		menu = LLUICtrlFactory::getDefaultWidget<LLMenuGL>("inventory_menu"); @@ -259,7 +250,7 @@ LLFolderView::LLFolderView(const Params& p)  	menu->setBackgroundColor(LLUIColorTable::instance().getColor("MenuPopupBgColor"));  	mPopupMenuHandle = menu->getHandle(); -	mListener->openItem(); +	mViewModelItem->openItem();  }  // Destroys the object @@ -361,13 +352,9 @@ static LLFastTimer::DeclareTimer FTM_FILTER("Filter Folder View");  void LLFolderView::filter( LLFolderViewFilter& filter )  {  	LLFastTimer t2(FTM_FILTER); -	filter.setFilterCount(llclamp(gSavedSettings.getS32("FilterItemsPerFrame"), 1, 5000)); +	filter.setFilterCount(llclamp(LLUI::sSettingGroups["config"]->getS32("FilterItemsPerFrame"), 1, 5000)); -	if (getLastFilterGeneration() < filter.getCurrentGeneration()) -	{ -		mMinWidth = 0; -		getViewModelItem()->filter(filter); -	} +	getViewModelItem()->filter(filter);  }  void LLFolderView::reshape(S32 width, S32 height, BOOL called_from_parent) @@ -635,7 +622,7 @@ void LLFolderView::clearSelection()  }  std::set<LLFolderViewItem*> LLFolderView::getSelectionList() const -	{ +{  	std::set<LLFolderViewItem*> selection;  	std::copy(mSelectedItems.begin(), mSelectedItems.end(), std::inserter(selection, selection.begin()));  	return selection; @@ -699,27 +686,18 @@ void LLFolderView::draw()  	} -	if (mSearchTimer.getElapsedTimeF32() > gSavedSettings.getF32("TypeAheadTimeout") || !mSearchString.size()) +	if (mSearchTimer.getElapsedTimeF32() > LLUI::sSettingGroups["config"]->getF32("TypeAheadTimeout") || !mSearchString.size())  	{  		mSearchString.clear();  	}  	if (hasVisibleChildren())  	{ -		mStatusText.clear();  		mStatusTextBox->setVisible( FALSE );  	}  	else if (mShowEmptyMessage)  	{ -		if (!mViewModel->contentsReady() || getLastFilterGeneration() < getFolderViewModel()->getFilter()->getFirstSuccessGeneration()) -		{ -			mStatusText = LLTrans::getString("Searching"); -		} -		else -		{ -			mStatusText = getFolderViewModel()->getFilter()->getEmptyLookupMessage(); -		} -		mStatusTextBox->setValue(mStatusText); +		mStatusTextBox->setValue(getFolderViewModel()->getStatusText());  		mStatusTextBox->setVisible( TRUE );  		// firstly reshape message textbox with current size. This is necessary to @@ -780,14 +758,6 @@ void LLFolderView::closeRenamer( void )  	}  } -void LLFolderView::removeSelectedItems( void ) -{ -	if (mSelectedItems.empty()) return; -	LLSD args; -	args["QUESTION"] = LLTrans::getString(mSelectedItems.size() > 1 ? "DeleteItems" :  "DeleteItem"); -	LLNotificationsUtil::add("DeleteItems", args, LLSD(), boost::bind(&LLFolderView::onItemsRemovalConfirmation, this, _1, _2)); -} -  bool isDescendantOfASelectedItem(LLFolderViewItem* item, const std::vector<LLFolderViewItem*>& selectedItems)  {  	LLFolderViewItem* item_parent = dynamic_cast<LLFolderViewItem*>(item->getParent()); @@ -833,11 +803,8 @@ void LLFolderView::removeCutItems()  	}  } -void LLFolderView::onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response) +void LLFolderView::removeSelectedItems()  { -	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); -	if (option != 0) return; // canceled -  	if(getVisible() && getEnabled())  	{  		// just in case we're removing the renaming item. @@ -940,42 +907,44 @@ void LLFolderView::onItemsRemovalConfirmation(const LLSD& notification, const LL  	}  } +// TODO RN: abstract   // open the selected item.  void LLFolderView::openSelectedItems( void )  { -	if(getVisible() && getEnabled()) -	{ -		if (mSelectedItems.size() == 1) -		{ -			mSelectedItems.front()->openItem(); -		} -		else -		{ -			LLMultiPreview* multi_previewp = new LLMultiPreview(); -			LLMultiProperties* multi_propertiesp = new LLMultiProperties(); +	//TODO RN: get working again +	//if(getVisible() && getEnabled()) +	//{ +	//	if (mSelectedItems.size() == 1) +	//	{ +	//		mSelectedItems.front()->openItem(); +	//	} +	//	else +	//	{ +	//		LLMultiPreview* multi_previewp = new LLMultiPreview(); +	//		LLMultiProperties* multi_propertiesp = new LLMultiProperties(); -			selected_items_t::iterator item_it; -			for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it) -			{ -				// IT_{OBJECT,ATTACHMENT} creates LLProperties -				// floaters; others create LLPreviews.  Put -				// each one in the right type of container. -				LLFolderViewModelItemInventory* listener = static_cast<LLFolderViewModelItemInventory*>((*item_it)->getViewModelItem()); -				bool is_prop = listener && (listener->getInventoryType() == LLInventoryType::IT_OBJECT || listener->getInventoryType() == LLInventoryType::IT_ATTACHMENT); -				if (is_prop) -					LLFloater::setFloaterHost(multi_propertiesp); -				else -					LLFloater::setFloaterHost(multi_previewp); -				listener->openItem(); -			} +	//		selected_items_t::iterator item_it; +	//		for (item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it) +	//		{ +	//			// IT_{OBJECT,ATTACHMENT} creates LLProperties +	//			// floaters; others create LLPreviews.  Put +	//			// each one in the right type of container. +	//			LLFolderViewModelItemInventory* listener = static_cast<LLFolderViewModelItemInventory*>((*item_it)->getViewModelItem()); +	//			bool is_prop = listener && (listener->getInventoryType() == LLInventoryType::IT_OBJECT || listener->getInventoryType() == LLInventoryType::IT_ATTACHMENT); +	//			if (is_prop) +	//				LLFloater::setFloaterHost(multi_propertiesp); +	//			else +	//				LLFloater::setFloaterHost(multi_previewp); +	//			listener->openItem(); +	//		} -			LLFloater::setFloaterHost(NULL); -			// *NOTE: LLMulti* will safely auto-delete when open'd -			// without any children. -			multi_previewp->openFloater(LLSD()); -			multi_propertiesp->openFloater(LLSD()); -		} -	} +	//		LLFloater::setFloaterHost(NULL); +	//		// *NOTE: LLMulti* will safely auto-delete when open'd +	//		// without any children. +	//		multi_previewp->openFloater(LLSD()); +	//		multi_propertiesp->openFloater(LLSD()); +	//	} +	//}  }  void LLFolderView::propertiesSelectedItems( void ) @@ -1007,15 +976,6 @@ void LLFolderView::propertiesSelectedItems( void )  	//}  } -void LLFolderView::changeType(LLInventoryModel *model, LLFolderType::EType new_folder_type) -{ -	LLFolderBridge *folder_bridge = LLFolderBridge::sSelf.get(); - -	if (!folder_bridge) return; -	LLViewerInventoryCategory *cat = folder_bridge->getCategory(); -	if (!cat) return; -	cat->changeType(new_folder_type); -}  void LLFolderView::autoOpenItem( LLFolderViewFolder* item )  { @@ -1534,7 +1494,7 @@ BOOL LLFolderView::handleUnicodeCharHere(llwchar uni_char)  		}  		//do text search -		if (mSearchTimer.getElapsedTimeF32() > gSavedSettings.getF32("TypeAheadTimeout")) +		if (mSearchTimer.getElapsedTimeF32() > LLUI::sSettingGroups["config"]->getF32("TypeAheadTimeout"))  		{  			mSearchString.clear();  		} @@ -1844,81 +1804,6 @@ void LLFolderView::setShowSingleSelection(BOOL show)  	}  } -bool LLFolderView::doToSelected(LLInventoryModel* model, const LLSD& userdata) -{ -	std::string action = userdata.asString(); -	 -	if ("rename" == action) -	{ -		startRenamingSelectedItem(); -		return true; -	} -	if ("delete" == action) -	{ -		removeSelectedItems(); -		return true; -	} -	if (("copy" == action) || ("cut" == action)) -	{	 -		// Clear the clipboard before we start adding things on it -		LLClipboard::instance().reset(); -	} - -	static const std::string change_folder_string = "change_folder_type_"; -	if (action.length() > change_folder_string.length() &&  -		(action.compare(0,change_folder_string.length(),"change_folder_type_") == 0)) -	{ -		LLFolderType::EType new_folder_type = LLViewerFolderType::lookupTypeFromXUIName(action.substr(change_folder_string.length())); -		changeType(model, new_folder_type); -		return true; -	} - - -	std::set<LLFolderViewItem*> selected_items = getSelectionList(); - -	LLMultiPreview* multi_previewp = NULL; -	LLMultiProperties* multi_propertiesp = NULL; - -	if (("task_open" == action  || "open" == action) && selected_items.size() > 1) -	{ -		multi_previewp = new LLMultiPreview(); -		gFloaterView->addChild(multi_previewp); - -		LLFloater::setFloaterHost(multi_previewp); -	 -	} -	else if (("task_properties" == action || "properties" == action) && selected_items.size() > 1) -	{ -		multi_propertiesp = new LLMultiProperties(); -		gFloaterView->addChild(multi_propertiesp); - -		LLFloater::setFloaterHost(multi_propertiesp); -	} - -	std::set<LLFolderViewItem*>::iterator set_iter; - -	for (set_iter = selected_items.begin(); set_iter != selected_items.end(); ++set_iter) -	{ -		LLFolderViewItem* folder_item = *set_iter; -		if(!folder_item) continue; -		LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getViewModelItem(); -		if(!bridge) continue; -		bridge->performAction(model, action); -	} - -	LLFloater::setFloaterHost(NULL); -	if (multi_previewp) -	{ -		multi_previewp->openFloater(LLSD()); -	} -	else if (multi_propertiesp) -	{ -		multi_propertiesp->openFloater(LLSD()); -	} - -	return true; -} -  static LLFastTimer::DeclareTimer FTM_AUTO_SELECT("Open and Select");  static LLFastTimer::DeclareTimer FTM_INVENTORY("Inventory"); @@ -1971,7 +1856,7 @@ void LLFolderView::doIdle()  		scrollToShowSelection();  	} -	BOOL filter_finished = getLastFilterGeneration() >= getFolderViewModel()->getFilter()->getCurrentGeneration()  +	BOOL filter_finished = getViewModelItem()->passedFilter()  						&& mViewModel->contentsReady();  	if (filter_finished   		|| gFocusMgr.childHasKeyboardFocus(inventory_panel)  @@ -2264,9 +2149,3 @@ S32 LLFolderView::getItemHeight()  	}  	return 0;  } - -//TODO RN: move to llfolderviewmodel.cpp file -bool LLFolderViewModelCommon::needsSort(LLFolderViewModelItem* item) -{ -	return item->getSortVersion() < mTargetSortVersion; -} diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 8a0317f840..e098119293 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -39,20 +39,17 @@  #include "lluictrl.h"  #include "v4color.h" -#include "lldarray.h"  #include "stdenums.h"  #include "lldepthstack.h"  #include "lleditmenuhandler.h"  #include "llfontgl.h"  #include "llscrollcontainer.h"  #include "lltooldraganddrop.h" -#include "llviewertexture.h"  class LLFolderViewModelInterface;  class LLFolderViewFolder;  class LLFolderViewItem;  class LLFolderViewFilter; -class LLInventoryModel;  class LLPanel;  class LLLineEditor;  class LLMenuGL; @@ -153,8 +150,9 @@ public:  	virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected);  	virtual std::set<LLFolderViewItem*> getSelectionList() const; +	S32 getNumSelectedItems() { return mSelectedItems.size(); } -	// Make sure if ancestor is selected, descendents are not +	// Make sure if ancestor is selected, descendants are not  	void sanitizeSelection();  	virtual void clearSelection();  	void addToSelectionList(LLFolderViewItem* item); @@ -173,9 +171,6 @@ public:  	void openSelectedItems( void );  	void propertiesSelectedItems( void ); -	// Change the folder type -	void changeType(LLInventoryModel *model, LLFolderType::EType new_folder_type); -  	void autoOpenItem(LLFolderViewFolder* item);  	void closeAutoOpenedFolders();  	BOOL autoOpenTest(LLFolderViewFolder* item); @@ -228,8 +223,6 @@ public:  	F32  getSelectionFadeElapsedTime() { return mMultiSelectionFadeTimer.getElapsedTimeF32(); }  	bool getUseEllipses() { return mUseEllipses; } -	bool doToSelected(LLInventoryModel* model, const LLSD& userdata); -	  	void	doIdle();						// Real idle routine  	static void idle(void* user_data);		// static glue to doIdle() @@ -270,7 +263,6 @@ protected:  	BOOL addNoOptions(LLMenuGL* menu) const; -	void onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response);  protected:  	LLHandle<LLView>					mPopupMenuHandle; diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 08ddb76f3b..3937d4332b 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -28,16 +28,9 @@  #include "llfolderviewitem.h"  // viewer includes -#include "llfolderview.h"		// Items depend extensively on LLFolderViews  #include "llfolderview.h"  #include "llfolderviewmodel.h" -#include "llviewerfoldertype.h" -#include "llinventorybridge.h"	// for LLItemBridge in LLInventorySort::operator() -#include "llinventoryfunctions.h" -#include "llinventorymodelbackgroundfetch.h"  #include "llpanel.h" -#include "llviewercontrol.h"	// gSavedSettings -#include "llviewerwindow.h"		// Argh, only for setCursor()  // linden library includes  #include "llclipboard.h" @@ -120,12 +113,12 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)  	mDragAndDropTarget(FALSE),  	mLabel(p.name),  	mRoot(p.root), -	mListener(p.listener), +	mViewModelItem(p.listener),  	mIsMouseOverTitle(false)  { -	if (mListener) +	if (mViewModelItem)  	{ -		mListener->setFolderViewItem(this); +		mViewModelItem->setFolderViewItem(this);  	}  } @@ -138,8 +131,8 @@ BOOL LLFolderViewItem::postBuild()  // Destroys the object  LLFolderViewItem::~LLFolderViewItem( void )  { -	delete mListener; -	mListener = NULL; +	delete mViewModelItem; +	mViewModelItem = NULL;  }  LLFolderView* LLFolderViewItem::getRoot() @@ -218,7 +211,7 @@ BOOL LLFolderViewItem::passedFilter(S32 filter_generation)  }  void LLFolderViewItem::refresh() -{ +{   	LLFolderViewModelItem& vmi = *getViewModelItem();  	mLabel = vmi.getDisplayName(); @@ -422,12 +415,12 @@ void LLFolderViewItem::rename(const std::string& new_name)  	{  		getViewModelItem()->renameItem(new_name); -		if(mParentFolder) -		{ -			mParentFolder->requestSort(); +			if(mParentFolder) +			{ +				mParentFolder->requestSort(); +			}  		}  	} -}  const std::string& LLFolderViewItem::getName( void ) const  { @@ -529,11 +522,11 @@ BOOL LLFolderViewItem::handleHover( S32 x, S32 y, MASK mask )  		if (can_drag)  		{ -			gViewerWindow->setCursor(UI_CURSOR_ARROW); +			getWindow()->setCursor(UI_CURSOR_ARROW);  		}  		else  		{ -			gViewerWindow->setCursor(UI_CURSOR_NOLOCKED); +			getWindow()->setCursor(UI_CURSOR_NOLOCKED);  		}  		return TRUE;  	} @@ -543,7 +536,7 @@ BOOL LLFolderViewItem::handleHover( S32 x, S32 y, MASK mask )  		{  			getRoot()->setShowSelectionContext(FALSE);  		} -		gViewerWindow->setCursor(UI_CURSOR_ARROW); +		getWindow()->setCursor(UI_CURSOR_ARROW);  		// let parent handle this then...  		return FALSE;  	} @@ -587,7 +580,7 @@ BOOL LLFolderViewItem::handleMouseUp( S32 x, S32 y, MASK mask )  	{  		if (getRoot())  		{ -			getRoot()->setShowSelectionContext(FALSE); +		getRoot()->setShowSelectionContext(FALSE);  		}  		gFocusMgr.setMouseCapture( NULL );  	} @@ -607,16 +600,16 @@ BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  {  	BOOL handled = FALSE;  	BOOL 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; -	} +		handled = accepted; +		if (accepted) +		{ +			mDragAndDropTarget = TRUE; +			*accept = ACCEPT_YES_MULTI; +		} +		else +		{ +			*accept = ACCEPT_NO; +		}  	if(mParentFolder && !handled)  	{  		// store this item to get it in LLFolderBridge::dragItemIntoFolder on drop event. @@ -783,7 +776,7 @@ void LLFolderViewItem::draw()  	//TODO RN: implement this in terms of getColor()  	//if (highlight_link) color = sLinkColor;  	//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); @@ -834,21 +827,15 @@ 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 @@ -1452,6 +1439,7 @@ void LLFolderViewFolder::extractItem( LLFolderViewItem* item )  		mItems.erase(it);  	}  	//item has been removed, need to update filter +	getViewModelItem()->removeChild(item->getViewModelItem());  	getViewModelItem()->dirtyFilter();  	//because an item is going away regardless of filter status, force rearrange  	requestArrange(); @@ -1461,29 +1449,29 @@ void LLFolderViewFolder::extractItem( LLFolderViewItem* item )  BOOL LLFolderViewFolder::isMovable()  {  	if( !(getViewModelItem()->isItemMovable()) ) -	{ -		return FALSE; -	} - -	for (items_t::iterator iter = mItems.begin(); -		iter != mItems.end();) -	{ -		items_t::iterator iit = iter++; -		if(!(*iit)->isMovable())  		{  			return FALSE;  		} -	} -	for (folders_t::iterator iter = mFolders.begin(); -		iter != mFolders.end();) -	{ -		folders_t::iterator fit = iter++; -		if(!(*fit)->isMovable()) +		for (items_t::iterator iter = mItems.begin(); +			iter != mItems.end();)  		{ -			return FALSE; +			items_t::iterator iit = iter++; +			if(!(*iit)->isMovable()) +			{ +				return FALSE; +			} +		} + +		for (folders_t::iterator iter = mFolders.begin(); +			iter != mFolders.end();) +		{ +			folders_t::iterator fit = iter++; +			if(!(*fit)->isMovable()) +			{ +				return FALSE; +			}  		} -	}  	return TRUE;  } @@ -1491,29 +1479,29 @@ BOOL LLFolderViewFolder::isMovable()  BOOL LLFolderViewFolder::isRemovable()  {  	if( !(getViewModelItem()->isItemRemovable()) ) -	{ -		return FALSE; -	} - -	for (items_t::iterator iter = mItems.begin(); -		iter != mItems.end();) -	{ -		items_t::iterator iit = iter++; -		if(!(*iit)->isRemovable())  		{  			return FALSE;  		} -	} -	for (folders_t::iterator iter = mFolders.begin(); -		iter != mFolders.end();) -	{ -		folders_t::iterator fit = iter++; -		if(!(*fit)->isRemovable()) +		for (items_t::iterator iter = mItems.begin(); +			iter != mItems.end();)  		{ -			return FALSE; +			items_t::iterator iit = iter++; +			if(!(*iit)->isRemovable()) +			{ +				return FALSE; +			} +		} + +		for (folders_t::iterator iter = mFolders.begin(); +			iter != mFolders.end();) +		{ +			folders_t::iterator fit = iter++; +			if(!(*fit)->isRemovable()) +			{ +				return FALSE; +			}  		} -	}  	return TRUE;  } @@ -1644,7 +1632,7 @@ BOOL LLFolderViewFolder::handleDragAndDropFromChild(MASK mask,  													EAcceptance* accept,  													std::string& tooltip_msg)  { -	BOOL accepted = mListener->dragOrDrop(mask,drop,c_type,cargo_data, tooltip_msg); +	BOOL accepted = mViewModelItem->dragOrDrop(mask,drop,c_type,cargo_data, tooltip_msg);  	if (accepted)   	{  		mDragAndDropTarget = TRUE; @@ -2080,84 +2068,3 @@ LLFolderViewItem* LLFolderViewFolder::getPreviousFromChild( LLFolderViewItem* it  	return result;  } -bool LLInventorySort::operator()(const LLFolderViewModelItemInventory* const& a, const LLFolderViewModelItemInventory* const& b) const -{ -	// ignore sort order for landmarks in the Favorites folder. -	// they should be always sorted as in Favorites bar. See EXT-719 -	//TODO RN: fix sorting in favorites folder -	//if (a->getSortGroup() == SG_ITEM -	//	&& b->getSortGroup() == SG_ITEM -	//	&& a->getInventoryType() == LLInventoryType::IT_LANDMARK -	//	&& b->getInventoryType() == LLInventoryType::IT_LANDMARK) -	//{ - -	//	static const LLUUID& favorites_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); - -	//	LLUUID a_uuid = a->getParentFolder()->getUUID(); -	//	LLUUID b_uuid = b->getParentFolder()->getUUID(); - -	//	if ((a_uuid == favorites_folder_id && b_uuid == favorites_folder_id)) -	//	{ -	//		// *TODO: mantipov: probably it is better to add an appropriate method to LLFolderViewItem -	//		// or to LLInvFVBridge -	//		LLViewerInventoryItem* aitem = (static_cast<const LLItemBridge*>(a))->getItem(); -	//		LLViewerInventoryItem* bitem = (static_cast<const LLItemBridge*>(b))->getItem(); -	//		if (!aitem || !bitem) -	//			return false; -	//		S32 a_sort = aitem->getSortField(); -	//		S32 b_sort = bitem->getSortField(); -	//		return a_sort < b_sort; -	//	} -	//} - -	// We sort by name if we aren't sorting by date -	// OR if these are folders and we are sorting folders by name. -	bool by_name = (!mByDate  -		|| (mFoldersByName  -		&& (a->getSortGroup() != SG_ITEM))); - -	if (a->getSortGroup() != b->getSortGroup()) -	{ -		if (mSystemToTop) -		{ -			// Group order is System Folders, Trash, Normal Folders, Items -			return (a->getSortGroup() < b->getSortGroup()); -		} -		else if (mByDate) -		{ -			// Trash needs to go to the bottom if we are sorting by date -			if ( (a->getSortGroup() == SG_TRASH_FOLDER) -				|| (b->getSortGroup() == SG_TRASH_FOLDER)) -			{ -				return (b->getSortGroup() == SG_TRASH_FOLDER); -			} -		} -	} - -	if (by_name) -	{ -		S32 compare = LLStringUtil::compareDict(a->getDisplayName(), b->getDisplayName()); -		if (0 == compare) -		{ -			return (a->getCreationDate() > b->getCreationDate()); -		} -		else -		{ -			return (compare < 0); -		} -	} -	else -	{ -		time_t first_create = a->getCreationDate(); -		time_t second_create = b->getCreationDate(); -		if (first_create == second_create) -		{ -			return (LLStringUtil::compareDict(a->getDisplayName(), b->getDisplayName()) < 0); -		} -		else -		{ -			return (first_create > second_create); -		} -	} -} - diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h index a3c92a55e8..92923e82da 100644 --- a/indra/newview/llfolderviewitem.h +++ b/indra/newview/llfolderviewitem.h @@ -27,7 +27,6 @@  #define LLFOLDERVIEWITEM_H  #include "llview.h" -#include "lldarray.h"  // *TODO: Eliminate, forward declare  #include "lluiimage.h"  class LLFolderView; @@ -92,13 +91,12 @@ protected:  	S32							mLabelWidth;  	bool						mLabelWidthDirty;  	LLFolderViewFolder*			mParentFolder; -	LLFolderViewModelItem*		mListener; +	LLFolderViewModelItem*		mViewModelItem;  	BOOL						mIsCurSelection;  	BOOL						mSelectPending;  	LLFontGL::StyleFlags		mLabelStyle;  	std::string					mLabelSuffix;  	LLUIImagePtr				mIcon; -	std::string					mStatusText;  	LLUIImagePtr				mIconOpen;  	LLUIImagePtr				mIconOverlay;  	BOOL						mHasVisibleChildren; @@ -136,9 +134,6 @@ public:  	virtual S32 arrange( S32* width, S32* height );  	virtual S32 getItemHeight(); -	// updates filter serial number and optionally propagated value up to root -	S32		getLastFilterGeneration() const; -  	// If 'selection' is 'this' then note that otherwise ignore.  	// Returns TRUE if this item ends up being selected.  	virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus); @@ -202,8 +197,8 @@ public:  	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 LLFolderViewModelItem* getViewModelItem( void ) const { return mViewModelItem; } +	LLFolderViewModelItem* getViewModelItem( void ) { return mViewModelItem; }  	const LLFolderViewModelInterface* getFolderViewModel( void ) const;  	LLFolderViewModelInterface* getFolderViewModel( void ); diff --git a/indra/newview/llfolderviewmodel.cpp b/indra/newview/llfolderviewmodel.cpp new file mode 100644 index 0000000000..92db84156e --- /dev/null +++ b/indra/newview/llfolderviewmodel.cpp @@ -0,0 +1,54 @@ +/**  + * @file llfolderviewmodel.cpp + * @brief Implementation of the view model collection of classes. + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfolderviewmodel.h" +#include "lltrans.h" +#include "llviewercontrol.h" + +bool LLFolderViewModelCommon::needsSort(LLFolderViewModelItem* item) +{ +	return item->getSortVersion() < mTargetSortVersion; +} + +std::string LLFolderViewModelCommon::getStatusText() +{ +	if (!contentsReady() || mFolderView->getViewModelItem()->getLastFilterGeneration() < getFilter()->getCurrentGeneration()) +	{ +		return LLTrans::getString("Searching"); +	} +	else +	{ +		return getFilter()->getEmptyLookupMessage(); +	} +} + +void LLFolderViewModelCommon::filter() +{ +	getFilter()->setFilterCount(llclamp(gSavedSettings.getS32("FilterItemsPerFrame"), 1, 5000)); +	mFolderView->getViewModelItem()->filter(*getFilter()); +} diff --git a/indra/newview/llfolderviewmodel.h b/indra/newview/llfolderviewmodel.h index 5304613219..98b7255137 100644 --- a/indra/newview/llfolderviewmodel.h +++ b/indra/newview/llfolderviewmodel.h @@ -22,17 +22,11 @@   * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */ -#ifndef LLFOLDERVIEWEVENTLISTENER_H -#define LLFOLDERVIEWEVENTLISTENER_H +#ifndef LLFOLDERVIEWMODEL_H +#define LLFOLDERVIEWMODEL_H -#include "lldarray.h"	// *TODO: convert to std::vector -#include "llfoldertype.h"  #include "llfontgl.h"	// just for StyleFlags enum -#include "llfolderviewitem.h" -#include "llinventorytype.h" -#include "llpermissionsflags.h" -#include "llpointer.h" -#include "llwearabletype.h" +#include "llfolderview.h"  #include "lltooldraganddrop.h"  // These are grouping of inventory types. @@ -122,11 +116,13 @@ public:  	virtual void requestSortAll() = 0;  	virtual void sort(class LLFolderViewFolder*) = 0; +	virtual void filter() = 0;  	virtual bool contentsReady() = 0;  	virtual void setFolderView(LLFolderView* folder_view) = 0;  	virtual LLFolderViewFilter* getFilter() = 0;  	virtual const LLFolderViewFilter* getFilter() const = 0; +	virtual std::string getStatusText() = 0;  };  class LLFolderViewModelCommon : public LLFolderViewModelInterface @@ -142,6 +138,8 @@ public:  		// sort everything  		mTargetSortVersion++;  	} +	virtual std::string getStatusText(); +	virtual void filter();  	void setFolderView(LLFolderView* folder_view) { mFolderView = folder_view;} @@ -177,6 +175,7 @@ public:  	// add getStatusText and isFiltering()  	virtual bool contentsReady()					{ return true; } +  	struct ViewModelCompare  	{  		ViewModelCompare(const SortType& sorter) @@ -272,6 +271,7 @@ public:  	virtual bool hasChildren() const = 0;  	virtual void addChild(LLFolderViewModelItem* child) = 0; +	virtual void removeChild(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 @@ -305,7 +305,9 @@ public:  		mLastFilterGeneration(-1),  		mMostFilteredDescendantGeneration(-1),  		mParent(NULL) -	{} +	{ +		std::for_each(mChildren.begin(), mChildren.end(), DeletePointer()); +	}  	void requestSort() { mSortVersion = -1; }  	S32 getSortVersion() { return mSortVersion; } @@ -315,13 +317,23 @@ public:  	void dirtyFilter()  	{  		mLastFilterGeneration = -1; +  		// bubble up dirty flag all the way to root  		if (mParent)  		{  			mParent->dirtyFilter(); -		} +		}	 +	} +	virtual void addChild(LLFolderViewModelItem* child)  +	{  +		mChildren.push_back(child);  +		child->setParent(this);  +	} +	virtual void removeChild(LLFolderViewModelItem* child)  +	{  +		mChildren.remove(child);  +		child->setParent(NULL);   	} -	virtual void addChild(LLFolderViewModelItem* child) { mChildren.push_back(child); child->setParent(this); }  protected:  	virtual void setParent(LLFolderViewModelItem* parent) { mParent = parent; } @@ -343,4 +355,4 @@ protected:  }; -#endif +#endif // LLFOLDERVIEWMODEL_H diff --git a/indra/newview/llfolderviewmodelinventory.cpp b/indra/newview/llfolderviewmodelinventory.cpp new file mode 100644 index 0000000000..99831c61bf --- /dev/null +++ b/indra/newview/llfolderviewmodelinventory.cpp @@ -0,0 +1,306 @@ +/*  + * @file llfolderviewmodelinventory.cpp + * @brief Implementation of the inventory-specific view model + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llfolderviewmodelinventory.h" +#include "llinventorymodelbackgroundfetch.h" +#include "llinventorypanel.h" + +// +// class LLFolderViewModelInventory +// +static LLFastTimer::DeclareTimer FTM_INVENTORY_SORT("Sort"); + +void LLFolderViewModelInventory::sort( LLFolderViewFolder* folder ) +{ +	LLFastTimer _(FTM_INVENTORY_SORT); + +	if (!needsSort(folder->getViewModelItem())) return; + +	LLFolderViewModelItemInventory* modelp =   static_cast<LLFolderViewModelItemInventory*>(folder->getViewModelItem()); +	if (modelp->getUUID().isNull()) return; + +	for (std::list<LLFolderViewFolder*>::iterator it =   folder->getFoldersBegin(), end_it = folder->getFoldersEnd(); +		it != end_it; +		++it) +	{ +		LLFolderViewFolder* child_folderp = *it; +		sort(child_folderp); + +		if (child_folderp->getFoldersCount() > 0) +		{ +			time_t most_recent_folder_time = +				static_cast<LLFolderViewModelItemInventory*>((*child_folderp->getFoldersBegin())->getViewModelItem())->getCreationDate(); +			LLFolderViewModelItemInventory* modelp =   static_cast<LLFolderViewModelItemInventory*>(child_folderp->getViewModelItem()); +			if (most_recent_folder_time > modelp->getCreationDate()) +			{ +				modelp->setCreationDate(most_recent_folder_time); +			} +		} +		if (child_folderp->getItemsCount() > 0)			 +		{ +			time_t most_recent_item_time = +				static_cast<LLFolderViewModelItemInventory*>((*child_folderp->getItemsBegin())->getViewModelItem())->getCreationDate(); + +			LLFolderViewModelItemInventory* modelp =   static_cast<LLFolderViewModelItemInventory*>(child_folderp->getViewModelItem()); +			if (most_recent_item_time > modelp->getCreationDate()) +			{ +				modelp->setCreationDate(most_recent_item_time); +			} +		} +	} +	base_t::sort(folder); +} + +bool LLFolderViewModelInventory::contentsReady() +{ +	return !LLInventoryModelBackgroundFetch::instance().folderFetchActive(); +} + +void LLFolderViewModelItemInventory::requestSort() +{ +	LLFolderViewModelItemCommon::requestSort(); +	if (mRootViewModel->getSorter().isByDate()) +	{ +		// sort by date potentially affects parent folders which use a date +		// derived from newest item in them +		if (mParent) +		{ +			mParent->requestSort(); +		} +	} +} + +bool LLFolderViewModelItemInventory::potentiallyVisible() +{ +	return passedFilter() // we've passed the filter +		|| getLastFilterGeneration() < mRootViewModel->getFilter()->getFirstSuccessGeneration() // or we don't know yet +		|| descendantsPassedFilter(); +} + +bool LLFolderViewModelItemInventory::passedFilter(S32 filter_generation)  +{  +	if (filter_generation < 0 && mRootViewModel)  +		filter_generation = mRootViewModel->getFilter()->getFirstSuccessGeneration(); + +	return mPassedFolderFilter  +		&& mLastFilterGeneration >= filter_generation +		&& (mPassedFilter || descendantsPassedFilter(filter_generation)); +} + +bool LLFolderViewModelItemInventory::descendantsPassedFilter(S32 filter_generation) +{  +	if (filter_generation < 0) filter_generation = mRootViewModel->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; +} + +bool LLFolderViewModelItemInventory::filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter ) +{ +	bool passed_filter_before = item->passedFilter(); +	S32 filter_generation = filter.getCurrentGeneration(); +	S32 must_pass_generation = filter.getFirstRequiredGeneration(); + +	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->filter(filter); +			if (item->passedFilter()) +			{ +				llerrs << "Invalid shortcut in inventory filtering!" << llendl; +			} +			item->setPassedFilter(false, false, filter_generation); +		} +		else +		{ +			item->filter( filter ); +		} +	} + +	// track latest generation to pass any child items, for each folder up to root +	if (item->passedFilter()) +	{ +		LLFolderViewModelItemInventory* view_model = this; +		 +		while(view_model && view_model->mMostFilteredDescendantGeneration < filter_generation) +		{ +			view_model->mMostFilteredDescendantGeneration = filter_generation; +			view_model = static_cast<LLFolderViewModelItemInventory*>(view_model->mParent); +		} +		 +		return !passed_filter_before; +	} +	else // !item->passedfilter() +	{ +		return passed_filter_before; +	} +} + +bool LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter) +{ +	bool changed = false; + +	if(!mChildren.empty() +		&& (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) +		{ +			changed |= filterChildItem((*iter), filter); +		} +	} + +	if (changed) +	{ +		//TODO RN: ensure this still happens, but without dependency on folderview +		LLFolderViewFolder* folder = static_cast<LLFolderViewFolder*>(mFolderViewItem); +		folder->requestArrange(); +	} + +	// if we didn't use all filter iterations +	// that means we filtered all of our descendants +	// so filter ourselves now +	if (filter.getFilterCount() > 0) +	{ +		filter.decrementFilterCount(); + +		const BOOL passed_filter = filter.check(this); +		const BOOL passed_filter_folder = (getInventoryType() == LLInventoryType::IT_CATEGORY)  +								? filter.checkFolder(this) +								: true; + +		setPassedFilter(passed_filter, passed_filter_folder, filter.getCurrentGeneration()); +		//TODO RN: create interface for string highlighting +		//mStringMatchOffset = filter.getStringMatchOffset(this); +	} +	return changed; +} + +LLFolderViewModelInventory* LLInventoryPanel::getFolderViewModel() +{ +	return &mInventoryViewModel; +} + + +const LLFolderViewModelInventory* LLInventoryPanel::getFolderViewModel() const +{ +	return &mInventoryViewModel; +} + +bool LLInventorySort::operator()(const LLFolderViewModelItemInventory* const& a, const LLFolderViewModelItemInventory* const& b) const +{ +	// ignore sort order for landmarks in the Favorites folder. +	// they should be always sorted as in Favorites bar. See EXT-719 +	//TODO RN: fix sorting in favorites folder +	//if (a->getSortGroup() == SG_ITEM +	//	&& b->getSortGroup() == SG_ITEM +	//	&& a->getInventoryType() == LLInventoryType::IT_LANDMARK +	//	&& b->getInventoryType() == LLInventoryType::IT_LANDMARK) +	//{ + +	//	static const LLUUID& favorites_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); + +	//	LLUUID a_uuid = a->getParentFolder()->getUUID(); +	//	LLUUID b_uuid = b->getParentFolder()->getUUID(); + +	//	if ((a_uuid == favorites_folder_id && b_uuid == favorites_folder_id)) +	//	{ +	//		// *TODO: mantipov: probably it is better to add an appropriate method to LLFolderViewItem +	//		// or to LLInvFVBridge +	//		LLViewerInventoryItem* aitem = (static_cast<const LLItemBridge*>(a))->getItem(); +	//		LLViewerInventoryItem* bitem = (static_cast<const LLItemBridge*>(b))->getItem(); +	//		if (!aitem || !bitem) +	//			return false; +	//		S32 a_sort = aitem->getSortField(); +	//		S32 b_sort = bitem->getSortField(); +	//		return a_sort < b_sort; +	//	} +	//} + +	// We sort by name if we aren't sorting by date +	// OR if these are folders and we are sorting folders by name. +	bool by_name = (!mByDate  +		|| (mFoldersByName  +		&& (a->getSortGroup() != SG_ITEM))); + +	if (a->getSortGroup() != b->getSortGroup()) +	{ +		if (mSystemToTop) +		{ +			// Group order is System Folders, Trash, Normal Folders, Items +			return (a->getSortGroup() < b->getSortGroup()); +		} +		else if (mByDate) +		{ +			// Trash needs to go to the bottom if we are sorting by date +			if ( (a->getSortGroup() == SG_TRASH_FOLDER) +				|| (b->getSortGroup() == SG_TRASH_FOLDER)) +			{ +				return (b->getSortGroup() == SG_TRASH_FOLDER); +			} +		} +	} + +	if (by_name) +	{ +		S32 compare = LLStringUtil::compareDict(a->getDisplayName(), b->getDisplayName()); +		if (0 == compare) +		{ +			return (a->getCreationDate() > b->getCreationDate()); +		} +		else +		{ +			return (compare < 0); +		} +	} +	else +	{ +		time_t first_create = a->getCreationDate(); +		time_t second_create = b->getCreationDate(); +		if (first_create == second_create) +		{ +			return (LLStringUtil::compareDict(a->getDisplayName(), b->getDisplayName()) < 0); +		} +		else +		{ +			return (first_create > second_create); +		} +	} +} + diff --git a/indra/newview/llfolderviewmodelinventory.h b/indra/newview/llfolderviewmodelinventory.h new file mode 100644 index 0000000000..a8fe3f57ea --- /dev/null +++ b/indra/newview/llfolderviewmodelinventory.h @@ -0,0 +1,107 @@ +/**  + * @file llfolderviewmodelinventory.h + * @brief view model implementation specific to inventory + * class definition + * + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLFOLDERVIEWMODELINVENTORY_H +#define LL_LLFOLDERVIEWMODELINVENTORY_H + +#include "llinventoryfilter.h" + +class LLFolderViewModelItemInventory +	:	public LLFolderViewModelItemCommon +{ +public: +	LLFolderViewModelItemInventory() +		:	mRootViewModel(NULL) +	{} +	void setRootViewModel(class LLFolderViewModelInventory* root_view_model) +	{ +		mRootViewModel = root_view_model; +	} +	virtual const LLUUID& getUUID() const = 0; +	virtual time_t getCreationDate() const = 0;	// UTC seconds +	virtual void setCreationDate(time_t creation_date_utc) = 0; +	virtual PermissionMask getPermissionMask() const = 0; +	virtual LLFolderType::EType getPreferredType() const = 0; +	virtual void showProperties(void) = 0; +	virtual BOOL isItemInTrash( void) const { return FALSE; } // TODO: make   into pure virtual. +	virtual BOOL isUpToDate() const = 0; +	virtual bool hasChildren() const = 0; +	virtual LLInventoryType::EType getInventoryType() const = 0; +	virtual void performAction(LLInventoryModel* model, std::string action)   = 0; +	virtual LLWearableType::EType getWearableType() const = 0; +	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 bool filter( LLFolderViewFilter& filter); +	virtual bool filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter); +protected: +	class LLFolderViewModelInventory* mRootViewModel; +}; + +class LLInventorySort +{ +public: +	LLInventorySort(U32 order = 0) +		:	mSortOrder(order), +		mByDate(false), +		mSystemToTop(false), +		mFoldersByName(false) +	{ +		mByDate = (order & LLInventoryFilter::SO_DATE); +		mSystemToTop = (order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP); +		mFoldersByName = (order & LLInventoryFilter::SO_FOLDERS_BY_NAME); +	} + +	bool isByDate() const { return mByDate; } +	U32 getSortOrder() const { return mSortOrder; } + +	bool operator()(const LLFolderViewModelItemInventory* const& a, const LLFolderViewModelItemInventory* const& b) const; +private: +	U32  mSortOrder; +	bool mByDate; +	bool mSystemToTop; +	bool mFoldersByName; +}; + +class LLFolderViewModelInventory +	:	public LLFolderViewModel<LLInventorySort,   LLFolderViewModelItemInventory, LLFolderViewModelItemInventory,   LLInventoryFilter> +{ +public: +	typedef LLFolderViewModel<LLInventorySort,   LLFolderViewModelItemInventory, LLFolderViewModelItemInventory,   LLInventoryFilter> base_t; + +	virtual ~LLFolderViewModelInventory() {} + +	void sort(LLFolderViewFolder* folder); + +	bool contentsReady(); + +}; +#endif // LL_LLFOLDERVIEWMODELINVENTORY_H diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h index 2bbd371e8f..9615f3f44d 100644 --- a/indra/newview/llimfloatercontainer.h +++ b/indra/newview/llimfloatercontainer.h @@ -37,7 +37,7 @@  #include "llgroupmgr.h"  #include "llfolderviewitem.h" -#include "llfoldervieweventlistener.h" +#include "llfolderviewmodel.h"  class LLButton;  class LLLayoutPanel; @@ -53,7 +53,7 @@ typedef std::map<LLFloater*, LLFolderViewItem*> conversations_widgets_map;  // Conversation items: we hold a list of those and create an LLFolderViewItem widget for each    // that we tuck into the mConversationsListPanel.  -class LLConversationItem : public LLFolderViewEventListener +class LLConversationItem : public LLFolderViewModelItemCommon  {  public:  	LLConversationItem(std::string name, const LLUUID& uuid, LLFloater* floaterp, LLIMFloaterContainer* containerp); @@ -62,6 +62,7 @@ public:  	// Stub those things we won't really be using in this conversation context  	virtual const std::string& getName() const { return mName; }  	virtual const std::string& getDisplayName() const { return mName; } +	virtual const std::string& getSearchableName() const { return mName; }  	virtual const LLUUID& getUUID() const { return mUUID; }  	virtual time_t getCreationDate() const { return 0; }  	virtual PermissionMask getPermissionMask() const { return PERM_ALL; } @@ -76,8 +77,8 @@ public:  	virtual BOOL isItemRemovable( void ) const { return FALSE; }  	virtual BOOL isItemInTrash( void) const { return FALSE; }  	virtual BOOL removeItem() { return FALSE; } -	virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch) { } -	virtual void move( LLFolderViewEventListener* parent_listener ) { } +	virtual void removeBatch(std::vector<LLFolderViewModelItem*>& batch) { } +	virtual void move( LLFolderViewModelItem* parent_listener ) { }  	virtual BOOL isItemCopyable() const { return FALSE; }  	virtual BOOL copyToClipboard() const { return FALSE; }  	virtual BOOL cutToClipboard() const { return FALSE; } @@ -86,10 +87,16 @@ public:  	virtual void pasteLinkFromClipboard() { }  	virtual void buildContextMenu(LLMenuGL& menu, U32 flags) { }  	virtual BOOL isUpToDate() const { return TRUE; } -	virtual BOOL hasChildren() const { return FALSE; } +	virtual bool hasChildren() const { return FALSE; }  	virtual LLInventoryType::EType getInventoryType() const { return LLInventoryType::IT_NONE; }  	virtual LLWearableType::EType getWearableType() const { return LLWearableType::WT_NONE; } +	virtual bool potentiallyVisible() { return true; } +	virtual bool filter( LLFolderViewFilter& filter) { return true; } +	virtual bool descendantsPassedFilter(S32 filter_generation = -1) { return true; } +	virtual void setPassedFilter(bool passed, bool passed_folder, S32 filter_generation) { } +	virtual bool passedFilter(S32 filter_generation = -1) { return true; } +  	// The action callbacks  	virtual void performAction(LLInventoryModel* model, std::string action);  	virtual void openItem( void ); @@ -102,6 +109,7 @@ public:  	// This method should be called when a drag begins.  	// Returns TRUE if the drag can begin, FALSE otherwise. +	virtual LLToolDragAndDrop::ESource getDragSource() const { return LLToolDragAndDrop::SOURCE_PEOPLE; }  	virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const { return FALSE; }  	// This method will be called to determine if a drop can be diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 6a33130322..3f38d80a39 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -779,14 +779,12 @@ const std::string& LLInventoryFilter::getFilterText()  	if (isFilterObjectTypesWith(LLInventoryType::IT_ANIMATION))  	{ -		//filtered_types += " Animations,";  		filtered_types += LLTrans::getString("Animations");  		filtered_by_type = TRUE;  		num_filter_types++;  	}  	else  	{ -		//not_filtered_types += " Animations,";  		not_filtered_types += LLTrans::getString("Animations");  		filtered_by_all_types = FALSE; @@ -794,140 +792,120 @@ const std::string& LLInventoryFilter::getFilterText()  	if (isFilterObjectTypesWith(LLInventoryType::IT_CALLINGCARD))  	{ -		//filtered_types += " Calling Cards,";  		filtered_types += LLTrans::getString("Calling Cards");  		filtered_by_type = TRUE;  		num_filter_types++;  	}  	else  	{ -		//not_filtered_types += " Calling Cards,";  		not_filtered_types += LLTrans::getString("Calling Cards");  		filtered_by_all_types = FALSE;  	}  	if (isFilterObjectTypesWith(LLInventoryType::IT_WEARABLE))  	{ -		//filtered_types += " Clothing,";  		filtered_types +=  LLTrans::getString("Clothing");  		filtered_by_type = TRUE;  		num_filter_types++;  	}  	else  	{ -		//not_filtered_types += " Clothing,";  		not_filtered_types +=  LLTrans::getString("Clothing");  		filtered_by_all_types = FALSE;  	}  	if (isFilterObjectTypesWith(LLInventoryType::IT_GESTURE))  	{ -		//filtered_types += " Gestures,";  		filtered_types +=  LLTrans::getString("Gestures");  		filtered_by_type = TRUE;  		num_filter_types++;  	}  	else  	{ -		//not_filtered_types += " Gestures,";  		not_filtered_types +=  LLTrans::getString("Gestures");  		filtered_by_all_types = FALSE;  	}  	if (isFilterObjectTypesWith(LLInventoryType::IT_LANDMARK))  	{ -		//filtered_types += " Landmarks,";  		filtered_types +=  LLTrans::getString("Landmarks");  		filtered_by_type = TRUE;  		num_filter_types++;  	}  	else  	{ -		//not_filtered_types += " Landmarks,";  		not_filtered_types +=  LLTrans::getString("Landmarks");  		filtered_by_all_types = FALSE;  	}  	if (isFilterObjectTypesWith(LLInventoryType::IT_NOTECARD))  	{ -		//filtered_types += " Notecards,";  		filtered_types +=  LLTrans::getString("Notecards");  		filtered_by_type = TRUE;  		num_filter_types++;  	}  	else  	{ -		//not_filtered_types += " Notecards,";  		not_filtered_types +=  LLTrans::getString("Notecards");  		filtered_by_all_types = FALSE;  	}  	if (isFilterObjectTypesWith(LLInventoryType::IT_OBJECT) && isFilterObjectTypesWith(LLInventoryType::IT_ATTACHMENT))  	{ -		//filtered_types += " Objects,";  		filtered_types +=  LLTrans::getString("Objects");  		filtered_by_type = TRUE;  		num_filter_types++;  	}  	else  	{ -		//not_filtered_types += " Objects,";  		not_filtered_types +=  LLTrans::getString("Objects");  		filtered_by_all_types = FALSE;  	}  	if (isFilterObjectTypesWith(LLInventoryType::IT_LSL))  	{ -		//filtered_types += " Scripts,";  		filtered_types +=  LLTrans::getString("Scripts");  		filtered_by_type = TRUE;  		num_filter_types++;  	}  	else  	{ -		//not_filtered_types += " Scripts,";  		not_filtered_types +=  LLTrans::getString("Scripts");  		filtered_by_all_types = FALSE;  	}  	if (isFilterObjectTypesWith(LLInventoryType::IT_SOUND))  	{ -		//filtered_types += " Sounds,";  		filtered_types +=  LLTrans::getString("Sounds");  		filtered_by_type = TRUE;  		num_filter_types++;  	}  	else  	{ -		//not_filtered_types += " Sounds,";  		not_filtered_types +=  LLTrans::getString("Sounds");  		filtered_by_all_types = FALSE;  	}  	if (isFilterObjectTypesWith(LLInventoryType::IT_TEXTURE))  	{ -		//filtered_types += " Textures,";  		filtered_types +=  LLTrans::getString("Textures");  		filtered_by_type = TRUE;  		num_filter_types++;  	}  	else  	{ -		//not_filtered_types += " Textures,";  		not_filtered_types +=  LLTrans::getString("Textures");  		filtered_by_all_types = FALSE;  	}  	if (isFilterObjectTypesWith(LLInventoryType::IT_SNAPSHOT))  	{ -		//filtered_types += " Snapshots,";  		filtered_types +=  LLTrans::getString("Snapshots");  		filtered_by_type = TRUE;  		num_filter_types++;  	}  	else  	{ -		//not_filtered_types += " Snapshots,";  		not_filtered_types +=  LLTrans::getString("Snapshots");  		filtered_by_all_types = FALSE;  	} @@ -943,7 +921,6 @@ const std::string& LLInventoryFilter::getFilterText()  		}  		else  		{ -			//mFilterText += "No ";  			mFilterText += LLTrans::getString("No Filters");  			mFilterText += not_filtered_types;  		} @@ -953,7 +930,6 @@ const std::string& LLInventoryFilter::getFilterText()  	if (isSinceLogoff())  	{ -		//mFilterText += " - Since Logoff";  		mFilterText += LLTrans::getString("Since Logoff");  	}  	return mFilterText; diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index ff461236a2..07f3dd8ffb 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -45,7 +45,7 @@  // newview includes  #include "llappearancemgr.h"  #include "llappviewer.h" -//#include "llfirstuse.h" +#include "llclipboard.h"  #include "llfloaterinventory.h"  #include "llfloatersidepanelcontainer.h"  #include "llfocusmgr.h" @@ -74,8 +74,10 @@  #include "llsidepanelinventory.h"  #include "lltabcontainer.h"  #include "lltooldraganddrop.h" +#include "lltrans.h"  #include "lluictrlfactory.h"  #include "llviewermessage.h" +#include "llviewerfoldertype.h"  #include "llviewerobjectlist.h"  #include "llviewerregion.h"  #include "llviewerwindow.h" @@ -1044,3 +1046,87 @@ void LLOpenFoldersWithSelection::doFolder(LLFolderViewFolder* folder)  	}  } +void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root, const std::string& action) +{ +	if ("rename" == action) +	{ +		root->startRenamingSelectedItem(); +		return; +	} +	if ("delete" == action) +	{ +		LLSD args; +		args["QUESTION"] = LLTrans::getString(root->getNumSelectedItems() > 1 ? "DeleteItems" :  "DeleteItem"); +		LLNotificationsUtil::add("DeleteItems", args, LLSD(), boost::bind(&LLInventoryAction::onItemsRemovalConfirmation, _1, _2, root)); +		return; +	} +	if (("copy" == action) || ("cut" == action)) +	{	 +		// Clear the clipboard before we start adding things on it +		LLClipboard::instance().reset(); +	} + +	static const std::string change_folder_string = "change_folder_type_"; +	if (action.length() > change_folder_string.length() &&  +		(action.compare(0,change_folder_string.length(),"change_folder_type_") == 0)) +	{ +		LLFolderType::EType new_folder_type = LLViewerFolderType::lookupTypeFromXUIName(action.substr(change_folder_string.length())); +		LLFolderViewModelItemInventory* inventory_item = static_cast<LLFolderViewModelItemInventory*>(root->getViewModelItem()); +		LLViewerInventoryCategory *cat = model->getCategory(inventory_item->getUUID()); +		if (!cat) return; +		cat->changeType(new_folder_type); +		return; +	} + + +	std::set<LLFolderViewItem*> selected_items = root->getSelectionList(); + +	LLMultiPreview* multi_previewp = NULL; +	LLMultiProperties* multi_propertiesp = NULL; + +	if (("task_open" == action  || "open" == action) && selected_items.size() > 1) +	{ +		multi_previewp = new LLMultiPreview(); +		gFloaterView->addChild(multi_previewp); + +		LLFloater::setFloaterHost(multi_previewp); + +	} +	else if (("task_properties" == action || "properties" == action) && selected_items.size() > 1) +	{ +		multi_propertiesp = new LLMultiProperties(); +		gFloaterView->addChild(multi_propertiesp); + +		LLFloater::setFloaterHost(multi_propertiesp); +	} + +	std::set<LLFolderViewItem*>::iterator set_iter; + +	for (set_iter = selected_items.begin(); set_iter != selected_items.end(); ++set_iter) +	{ +		LLFolderViewItem* folder_item = *set_iter; +		if(!folder_item) continue; +		LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getViewModelItem(); +		if(!bridge) continue; +		bridge->performAction(model, action); +	} + +	LLFloater::setFloaterHost(NULL); +	if (multi_previewp) +	{ +		multi_previewp->openFloater(LLSD()); +	} +	else if (multi_propertiesp) +	{ +		multi_propertiesp->openFloater(LLSD()); +	} +} + +void LLInventoryAction::onItemsRemovalConfirmation( const LLSD& notification, const LLSD& response, LLFolderView* root ) +{ +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +	if (option == 0) +	{ +		root->removeSelectedItems(); +	} +} diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index c6b1da0417..d8d3d9bbbb 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -427,6 +427,13 @@ public:  	static LLUUID sWearNewClothingTransactionID;	// wear all clothing in this transaction	  }; +struct LLInventoryAction +{ +	static void doToSelected(class LLInventoryModel* model, class LLFolderView* root, const std::string& action); + +	static void onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLFolderView* root); +}; +  #endif // LL_LLINVENTORYFUNCTIONS_H diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index e4cabcc988..c1ffe89184 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -44,6 +44,7 @@  #include "llinventorybridge.h"  #include "llinventoryfunctions.h"  #include "llinventorymodelbackgroundfetch.h" +#include "llpreview.h"  #include "llsidepanelinventory.h"  #include "llviewerattachmenu.h"  #include "llviewerfoldertype.h" @@ -56,58 +57,6 @@ const std::string LLInventoryPanel::RECENTITEMS_SORT_ORDER = std::string("Recent  const std::string LLInventoryPanel::INHERIT_SORT_ORDER = std::string("");  static const LLInventoryFVBridgeBuilder INVENTORY_BRIDGE_BUILDER; -// -// class LLFolderViewModelInventory -// -static LLFastTimer::DeclareTimer FTM_INVENTORY_SORT("Sort"); - -void LLFolderViewModelInventory::sort( LLFolderViewFolder* folder ) -{ -	LLFastTimer _(FTM_INVENTORY_SORT); - -	if (!needsSort(folder->getViewModelItem())) return; - -	LLFolderViewModelItemInventory* modelp =   static_cast<LLFolderViewModelItemInventory*>(folder->getViewModelItem()); -	if (modelp->getUUID().isNull()) return; - -	for (std::list<LLFolderViewFolder*>::iterator it =   folder->getFoldersBegin(), end_it = folder->getFoldersEnd(); -		it != end_it; -		++it) -	{ -		LLFolderViewFolder* child_folderp = *it; -		sort(child_folderp); - -		if (child_folderp->getFoldersCount() > 0) -		{ -			time_t most_recent_folder_time = -				static_cast<LLFolderViewModelItemInventory*>((*child_folderp->getFoldersBegin())->getViewModelItem())->getCreationDate(); -			LLFolderViewModelItemInventory* modelp =   static_cast<LLFolderViewModelItemInventory*>(child_folderp->getViewModelItem()); -			if (most_recent_folder_time > modelp->getCreationDate()) -			{ -				modelp->setCreationDate(most_recent_folder_time); -			} -		} -		if (child_folderp->getItemsCount() > 0)			 -		{ -			time_t most_recent_item_time = -				static_cast<LLFolderViewModelItemInventory*>((*child_folderp->getItemsBegin())->getViewModelItem())->getCreationDate(); - -			LLFolderViewModelItemInventory* modelp =   static_cast<LLFolderViewModelItemInventory*>(child_folderp->getViewModelItem()); -			if (most_recent_item_time > modelp->getCreationDate()) -			{ -				modelp->setCreationDate(most_recent_item_time); -			} -		} -	} -	base_t::sort(folder); -} - -bool LLFolderViewModelInventory::contentsReady() -{ -	return !LLInventoryModelBackgroundFetch::instance().folderFetchActive(); -} - -  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  // Class LLInventoryPanelObserver  // @@ -580,6 +529,7 @@ void LLInventoryPanel::modelChanged(U32 mask)  			else if (!model_item && view_item)  			{  				// Remove the item's UI. +                removeItemID(viewmodel_item->getUUID());  				view_item->destroyView();                  removeItemID(viewmodel_item->getUUID());  			} @@ -978,11 +928,6 @@ void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& it  	}  } -void LLInventoryPanel::doToSelected(const LLSD& userdata) -{ -	mFolderRoot->doToSelected(&gInventory, userdata); -} -  void LLInventoryPanel::doCreate(const LLSD& userdata)  {  	menu_create_inventory_item(this, LLFolderBridge::sSelf.get(), userdata); @@ -1312,6 +1257,13 @@ void LLInventoryPanel::updateSelection()  	}  } +void LLInventoryPanel::doToSelected(const LLSD& userdata) +{ +	LLInventoryAction::doToSelected(mInventory, mFolderRoot, userdata.asString()); + +	return; +} +  /************************************************************************/  /* Recent Inventory Panel related class                                 */ @@ -1345,149 +1297,3 @@ LLInventoryRecentItemsPanel::LLInventoryRecentItemsPanel( const Params& params)  	mInvFVBridgeBuilder = &RECENT_ITEMS_BUILDER;  } - -void LLFolderViewModelItemInventory::requestSort() -{ -	LLFolderViewModelItemCommon::requestSort(); -	if (mRootViewModel->getSorter().isByDate()) -	{ -		// sort by date potentially affects parent folders which use a date -		// derived from newest item in them -		if (mParent) -		{ -			mParent->requestSort(); -		} -	} -} - -bool LLFolderViewModelItemInventory::potentiallyVisible() -{ -	return passedFilter() // we've passed the filter -		|| getLastFilterGeneration() < mRootViewModel->getFilter()->getFirstSuccessGeneration() // or we don't know yet -		|| descendantsPassedFilter(); -} - -bool LLFolderViewModelItemInventory::passedFilter(S32 filter_generation)  -{  -	if (filter_generation < 0) filter_generation = mRootViewModel->getFilter()->getFirstSuccessGeneration(); -	return mPassedFolderFilter  -		&& mLastFilterGeneration >= filter_generation -		&& (mPassedFilter || descendantsPassedFilter(filter_generation)); -} - -bool LLFolderViewModelItemInventory::descendantsPassedFilter(S32 filter_generation) -{  -	if (filter_generation < 0) filter_generation = mRootViewModel->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; -} - -bool LLFolderViewModelItemInventory::filterChildItem( LLFolderViewModelItem* item, LLFolderViewFilter& filter ) -{ -	bool passed_filter_before = item->passedFilter(); -	S32 filter_generation = filter.getCurrentGeneration(); -	S32 must_pass_generation = filter.getFirstRequiredGeneration(); -	bool changed = false; - -	// 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 -		{ -			changed |= item->filter( filter ); -		} -	} - -	// track latest generation to pass any child items -	if (item->passedFilter()) -	{ -		LLFolderViewModelItemInventory* view_model = this; -		 -		while(view_model && view_model->mMostFilteredDescendantGeneration < filter_generation) -		{ -			view_model->mMostFilteredDescendantGeneration = filter_generation; -			view_model = static_cast<LLFolderViewModelItemInventory*>(view_model->mParent); -		} -	} - -	changed |= (item->passedFilter() != passed_filter_before); -	if (changed) -	{ -		//TODO RN: ensure this still happens, but without dependency on folderview -		LLFolderViewFolder* parent = mFolderViewItem->getParentFolder(); -		if (parent) parent->requestArrange(); -	} - -	return changed; -} - -bool LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter) -{ -	bool changed = false; - -	if(!mChildren.empty() -		&& (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) -		{ -			changed |= 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(); -	} -	return changed; -} - -LLFolderViewModelInventory* LLInventoryPanel::getFolderViewModel() -{ -	return &mInventoryViewModel; -} - - -const LLFolderViewModelInventory* LLInventoryPanel::getFolderViewModel() const -{ -	return &mInventoryViewModel; -} - diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index 3195d9a369..1061f12575 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -31,6 +31,7 @@  #include "llassetstorage.h"  #include "lldarray.h"  #include "llfolderviewitem.h" +#include "llfolderviewmodelinventory.h"  #include "llfloater.h"  #include "llinventory.h"  #include "llinventoryfilter.h" @@ -252,7 +253,7 @@ public:  	LLFolderViewFolder* getFolderByID(const LLUUID& id);  	void setSelectionByID(const LLUUID& obj_id, BOOL take_keyboard_focus);  	void updateSelection(); -	 	 +  	LLFolderViewModelInventory* getFolderViewModel();  	const LLFolderViewModelInventory* getFolderViewModel() const; diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 0b899d34f4..faef923338 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -851,7 +851,7 @@ void LLLandmarksPanel::onClipboardAction(const LLSD& userdata) const  	}  	else  	{ -		mCurrentSelectedList->getRootFolder()->doToSelected(mCurrentSelectedList->getModel(),command_name); +		mCurrentSelectedList->doToSelected(command_name);  	}  } @@ -896,7 +896,7 @@ void LLLandmarksPanel::onFoldingAction(const LLSD& userdata)  	{  		if(mCurrentSelectedList)  		{ -			mCurrentSelectedList->getRootFolder()->doToSelected(&gInventory, userdata); +			mCurrentSelectedList->doToSelected(userdata);  		}  	}  } diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 6cef1f877b..fea27b37d3 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -294,7 +294,7 @@ BOOL LLPanelMainInventory::handleKeyHere(KEY key, MASK mask)  void LLPanelMainInventory::doToSelected(const LLSD& userdata)  { -	getPanel()->getRootFolder()->doToSelected(&gInventory, userdata); +	getPanel()->doToSelected(userdata);  }  void LLPanelMainInventory::closeAllFolders() @@ -970,7 +970,7 @@ void LLPanelMainInventory::onTrashButtonClick()  void LLPanelMainInventory::onClipboardAction(const LLSD& userdata)  {  	std::string command_name = userdata.asString(); -	getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name); +	getActivePanel()->doToSelected(command_name);  }  void LLPanelMainInventory::saveTexture(const LLSD& userdata) diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 450e1f7ed0..002c0c1113 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -1522,7 +1522,7 @@ BOOL LLPanelObjectInventory::postBuild()  void LLPanelObjectInventory::doToSelected(const LLSD& userdata)  { -	mFolders->doToSelected(&gInventory, userdata); +	LLInventoryAction::doToSelected(&gInventory, mFolders, userdata.asString());  }  void LLPanelObjectInventory::clearContents() diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 61a0331b72..4a9e106687 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -623,9 +623,9 @@ void LLFloaterTexturePicker::draw()  		LLFolderView* folder_view = mInventoryPanel->getRootFolder();  		if (!folder_view) return; -		LLInventoryFilter* filter = static_cast<LLFolderViewModelInventory*>(folder_view->getFolderViewModel())->getFilter(); +		LLFolderViewFilter* filter = static_cast<LLFolderViewModelInventory*>(folder_view->getFolderViewModel())->getFilter(); -		bool is_filter_active = folder_view->getLastFilterGeneration() < filter->getCurrentGeneration() && +		bool is_filter_active = folder_view->getViewModelItem()->getLastFilterGeneration() < filter->getCurrentGeneration() &&  				filter->isNotDefault();  		// After inventory panel filter is applied we have to update  | 
