diff options
| -rw-r--r-- | indra/llui/llfolderview.cpp | 36 | ||||
| -rw-r--r-- | indra/newview/llimfloatercontainer.cpp | 23 | ||||
| -rw-r--r-- | indra/newview/llimfloatercontainer.h | 83 | 
3 files changed, 128 insertions, 14 deletions
diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp index 990b79a30b..92e3b7a8e9 100644 --- a/indra/llui/llfolderview.cpp +++ b/indra/llui/llfolderview.cpp @@ -320,10 +320,10 @@ S32 LLFolderView::arrange( S32* unused_width, S32* unused_height )  	LLFolderViewFolder::arrange(&mMinWidth, &target_height); -	LLRect scroll_rect = mScrollContainer->getContentWindowRect(); +	LLRect scroll_rect = (mScrollContainer ? mScrollContainer->getContentWindowRect() : LLRect());  	reshape( llmax(scroll_rect.getWidth(), mMinWidth), llround(mCurHeight) ); -	LLRect new_scroll_rect = mScrollContainer->getContentWindowRect(); +	LLRect new_scroll_rect = (mScrollContainer ? mScrollContainer->getContentWindowRect() : LLRect());  	if (new_scroll_rect.getWidth() != scroll_rect.getWidth())  	{  		reshape( llmax(scroll_rect.getWidth(), mMinWidth), llround(mCurHeight) ); @@ -945,7 +945,7 @@ void LLFolderView::autoOpenItem( LLFolderViewFolder* item )  	mAutoOpenItems.push(item);  	item->setOpen(TRUE); -	LLRect content_rect = mScrollContainer->getContentWindowRect(); +	LLRect content_rect = (mScrollContainer ? mScrollContainer->getContentWindowRect() : LLRect());  	LLRect constraint_rect(0,content_rect.getHeight(), content_rect.getWidth(), 0);  	scrollToShowItem(item, constraint_rect);  } @@ -1225,25 +1225,37 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )  	case KEY_PAGE_UP:  		mSearchString.clear(); -		mScrollContainer->pageUp(30); +		if (mScrollContainer) +		{ +			mScrollContainer->pageUp(30); +		}  		handled = TRUE;  		break;  	case KEY_PAGE_DOWN:  		mSearchString.clear(); -		mScrollContainer->pageDown(30); +		if (mScrollContainer) +		{ +			mScrollContainer->pageDown(30); +		}  		handled = TRUE;  		break;  	case KEY_HOME:  		mSearchString.clear(); -		mScrollContainer->goToTop(); +		if (mScrollContainer) +		{ +			mScrollContainer->goToTop(); +		}  		handled = TRUE;  		break;  	case KEY_END:  		mSearchString.clear(); -		mScrollContainer->goToBottom(); +		if (mScrollContainer) +		{ +			mScrollContainer->goToBottom(); +		}  		break;  	case KEY_DOWN: @@ -1719,8 +1731,8 @@ void LLFolderView::scrollToShowItem(LLFolderViewItem* item, const LLRect& constr  LLRect LLFolderView::getVisibleRect()  { -	S32 visible_height = mScrollContainer->getRect().getHeight(); -	S32 visible_width = mScrollContainer->getRect().getWidth(); +	S32 visible_height = (mScrollContainer ? mScrollContainer->getRect().getHeight() : 0); +	S32 visible_width  = (mScrollContainer ? mScrollContainer->getRect().getWidth()  : 0);  	LLRect visible_rect;  	visible_rect.setLeftTopAndSize(-getRect().mLeft, visible_height - getRect().mBottom, visible_width, visible_height);  	return visible_rect; @@ -1816,7 +1828,7 @@ void LLFolderView::update()  			// lets pin it!  			mPinningSelectedItem = TRUE; -			LLRect visible_content_rect = mScrollContainer->getVisibleContentRect(); +			LLRect visible_content_rect = (mScrollContainer ? mScrollContainer->getVisibleContentRect() : LLRect());  			LLFolderViewItem* selected_item = mSelectedItems.back();  			LLRect item_rect; @@ -1831,7 +1843,7 @@ void LLFolderView::update()  			else  			{  				// otherwise we just want it onscreen somewhere -				LLRect content_rect = mScrollContainer->getContentWindowRect(); +				LLRect content_rect = (mScrollContainer ? mScrollContainer->getContentWindowRect() : LLRect());  				mScrollConstraintRect.setOriginAndSize(0, 0, content_rect.getWidth(), content_rect.getHeight());  			}  		} @@ -1854,7 +1866,7 @@ void LLFolderView::update()  	else  	{  		// during normal use (page up/page down, etc), just try to fit item on screen -		LLRect content_rect = mScrollContainer->getContentWindowRect(); +		LLRect content_rect = (mScrollContainer ? mScrollContainer->getContentWindowRect() : LLRect());  		constraint_rect.setOriginAndSize(0, 0, content_rect.getWidth(), content_rect.getHeight());  	} diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp index 2b943df48f..be38eddbaf 100644 --- a/indra/newview/llimfloatercontainer.cpp +++ b/indra/newview/llimfloatercontainer.cpp @@ -91,12 +91,14 @@ BOOL LLIMFloaterContainer::postBuild()  	mConversationsListPanel = getChild<LLPanel>("conversations_list_panel"); +	mRoot = new LLConversationItem();  	LLFolderView::Params p; -	//TODO RN: define view model for conversations -	//p.view_model = ?; +	// CHUI-98 : View Model for conversations +	p.view_model = &mConversationViewModel;  	p.parent_panel = mConversationsListPanel;  	p.rect = mConversationsListPanel->getLocalRect();  	p.follows.flags = FOLLOWS_ALL; +	p.listener = mRoot;  	mFolders = LLUICtrlFactory::create<LLFolderView>(p);  	mConversationsListPanel->addChild(mFolders); @@ -544,6 +546,15 @@ LLConversationItem::LLConversationItem(std::string name, const LLUUID& uuid, LLF  		mName = "Nearby Chat";  } +LLConversationItem::LLConversationItem() : +	mName(""), +	mUUID(), +	mFloater(NULL), +	mContainer(NULL) +{ +} + +  // Virtual action callbacks  void LLConversationItem::selectItem(void)  { @@ -589,4 +600,12 @@ void LLConversationItem::showProperties(void)  {  } +bool LLConversationSort::operator()(const LLConversationItem* const& a, const LLConversationItem* const& b) const +{ +	// We compare only by name for the moment +	// *TODO : Implement the sorting by date +	S32 compare = LLStringUtil::compareDict(a->getDisplayName(), b->getDisplayName()); +	return (compare < 0); +} +  // EOF diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h index 890a115a04..f146e65897 100644 --- a/indra/newview/llimfloatercontainer.h +++ b/indra/newview/llimfloatercontainer.h @@ -57,6 +57,7 @@ class LLConversationItem : public LLFolderViewModelItemCommon  {  public:  	LLConversationItem(std::string name, const LLUUID& uuid, LLFloater* floaterp, LLIMFloaterContainer* containerp); +	LLConversationItem();  	virtual ~LLConversationItem() {}  	// Stub those things we won't really be using in this conversation context @@ -120,6 +121,86 @@ private:      LLFloater* mFloater;      LLIMFloaterContainer* mContainer;  }; + +// We don't want to ever filter conversations but we need to declare that class to create a conversation view model. +// We just stubb everything for the moment. +class LLConversationFilter : public LLFolderViewFilter +{ +public: +		 +	enum ESortOrderType +	{ +		SO_NAME = 0,						// Sort inventory by name +		SO_DATE = 0x1,						// Sort inventory by date +	}; + +	LLConversationFilter() { mEmpty = ""; } +	~LLConversationFilter() {} +		 +	bool 				check(const LLFolderViewModelItem* item) { return true; } +	bool				checkFolder(const LLFolderViewModelItem* folder) const { return true; } +	void 				setEmptyLookupMessage(const std::string& message) { } +	std::string			getEmptyLookupMessage() const { return mEmpty; } +	bool				showAllResults() const { return true; } +		 +	bool 				isActive() const { return false; } +	bool 				isModified() const { return false; } +	void 				clearModified() { } +	const std::string& 	getName() const { return mEmpty; } +	const std::string& 	getFilterText() { return mEmpty; } +	void 				setModified(EFilterModified behavior = FILTER_RESTART) { } +		 +	void 				setFilterCount(S32 count) { } +	S32 				getFilterCount() const { return 0; } +	void 				decrementFilterCount() { } +		 +	bool 				isDefault() const { return true; } +	bool 				isNotDefault() const { return false; } +	void 				markDefault() { } +	void 				resetDefault() { } +		 +	S32 				getCurrentGeneration() const { return 0; } +	S32 				getFirstSuccessGeneration() const { return 0; } +	S32 				getFirstRequiredGeneration() const { return 0; } +private: +	std::string mEmpty; +}; + +class LLConversationSort +{ +public: +	LLConversationSort(U32 order = 0) +	:	mSortOrder(order), +	mByDate(false), +	mByName(false) +	{ +		mByDate = (order & LLConversationFilter::SO_DATE); +		mByName = (order & LLConversationFilter::SO_NAME); +	} +	 +	bool isByDate() const { return mByDate; } +	U32 getSortOrder() const { return mSortOrder; } +	 +	bool operator()(const LLConversationItem* const& a, const LLConversationItem* const& b) const; +private: +	U32  mSortOrder; +	bool mByDate; +	bool mByName; +}; + +class LLConversationViewModel +:	public LLFolderViewModel<LLConversationSort, LLConversationItem, LLConversationItem, LLConversationFilter> +{ +public: +	typedef LLFolderViewModel<LLConversationSort, LLConversationItem, LLConversationItem, LLConversationFilter> base_t; +	 +	void sort(LLFolderViewFolder* folder) { } // *TODO : implement conversation sort +	bool contentsReady() { return true; }	// *TODO : we need to check that participants names are available somewhat +	bool startDrag(std::vector<LLFolderViewModelItem*>& items) { return false; } // We do not allow drag of conversation items +	 +private: +}; +  // CHUI-137 : End  class LLIMFloaterContainer @@ -189,6 +270,8 @@ public:  	void addConversationListItem(std::string name, const LLUUID& uuid, LLFloater* floaterp);  	LLFloater* findConversationItem(LLUUID& uuid);  private: +	LLConversationViewModel mConversationViewModel; +	LLConversationItem* mRoot;   	LLFolderViewItem* createConversationItemWidget(LLConversationItem* item);  	// Conversation list data  	LLPanel* mConversationsListPanel;	// This is the widget we add items to (i.e. clickable title for each conversation)  | 
