diff options
Diffstat (limited to 'indra/llui')
| -rw-r--r-- | indra/llui/llaccordionctrl.cpp | 13 | ||||
| -rw-r--r-- | indra/llui/llaccordionctrl.h | 35 | ||||
| -rw-r--r-- | indra/llui/llaccordionctrltab.cpp | 2 | ||||
| -rw-r--r-- | indra/llui/llaccordionctrltab.h | 2 | 
4 files changed, 49 insertions, 3 deletions
| diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp index 5f866c49e6..6bf1347514 100644 --- a/indra/llui/llaccordionctrl.cpp +++ b/indra/llui/llaccordionctrl.cpp @@ -66,6 +66,7 @@ LLAccordionCtrl::LLAccordionCtrl(const Params& params):LLPanel(params)   , mAutoScrolling( false )   , mAutoScrollRate( 0.f )   , mSelectedTab( NULL ) + , mTabComparator( NULL )   , mNoVisibleTabsHelpText(NULL)  {  	initNoTabsWidget(params.empty_accordion_text); @@ -799,6 +800,18 @@ void	LLAccordionCtrl::reset		()  		mScrollbar->setDocPos(0);  } +void LLAccordionCtrl::sort() +{ +	if (!mTabComparator) +	{ +		llwarns << "No comparator specified for sorting accordion tabs." << llendl; +		return; +	} + +	std::sort(mAccordionTabs.begin(), mAccordionTabs.end(), LLComparatorAdaptor(*mTabComparator)); +	arrange(); +} +  void	LLAccordionCtrl::setFilterSubString(const std::string& filter_string)  {  	LLStringUtil::format_map_t args; diff --git a/indra/llui/llaccordionctrl.h b/indra/llui/llaccordionctrl.h index 2f483eafb2..fc6f2d896c 100644 --- a/indra/llui/llaccordionctrl.h +++ b/indra/llui/llaccordionctrl.h @@ -57,6 +57,19 @@ private:  public: +	/** +	 * Abstract comparator for accordion tabs. +	 */ +	class LLTabComparator +	{ +	public: +		LLTabComparator() {}; +		virtual ~LLTabComparator() {}; + +		/** Returns true if tab1 < tab2, false otherwise */ +		virtual bool compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const = 0; +	}; +  	struct Params   		: public LLInitParam::Block<Params, LLPanel::Params>  	{ @@ -108,6 +121,9 @@ public:  	void	reset		(); +	void	setComparator(const LLTabComparator* comp) { mTabComparator = comp; } +	void	sort(); +  	/**  	 * Sets filter substring as a search_term for help text when there are no any visible tabs.  	 */ @@ -134,6 +150,21 @@ private:  	BOOL	autoScroll				(S32 x, S32 y); +	/** +	 * An adaptor for LLTabComparator +	 */ +	struct LLComparatorAdaptor +	{ +		LLComparatorAdaptor(const LLTabComparator& comparator) : mComparator(comparator) {}; + +		bool operator()(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) +		{ +			return mComparator.compare(tab1, tab2); +		} + +		const LLTabComparator& mComparator; +	}; +  private:  	LLRect			mInnerRect;  	LLScrollbar*	mScrollbar; @@ -141,9 +172,11 @@ private:  	bool			mFitParent;  	bool			mAutoScrolling;  	F32				mAutoScrollRate; -	LLAccordionCtrlTab* mSelectedTab;  	LLTextBox*		mNoVisibleTabsHelpText;  	std::string		mNoVisibleTabsOrigString; + +	LLAccordionCtrlTab*		mSelectedTab; +	const LLTabComparator*	mTabComparator;  }; diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp index 83fcc77f2a..1bc8086a27 100644 --- a/indra/llui/llaccordionctrltab.cpp +++ b/indra/llui/llaccordionctrltab.cpp @@ -473,7 +473,7 @@ void LLAccordionCtrlTab::setAccordionView(LLView* panel)  	addChild(panel,0);  } -std::string LLAccordionCtrlTab::getTitle() +std::string LLAccordionCtrlTab::getTitle() const  {  	LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME);  	if (header) diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h index be8b464b8e..82e0234bfc 100644 --- a/indra/llui/llaccordionctrltab.h +++ b/indra/llui/llaccordionctrltab.h @@ -115,7 +115,7 @@ public:  	void		setAccordionView(LLView* panel);  	LLView*		getAccordionView() { return mContainerPanel; }; -	std::string getTitle(); +	std::string getTitle() const;  	// Set text and highlight substring in LLAccordionCtrlTabHeader  	void setTitle(const std::string& title, const std::string& hl = LLStringUtil::null); | 
