diff options
| author | Andrey Lihatskiy <alihatskiy@productengine.com> | 2024-04-12 00:12:30 +0300 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-12 00:12:30 +0300 | 
| commit | dfbbad813f3a1b9a151db7b25d3657590324ca4c (patch) | |
| tree | e31cee85f651a874c4b6edc7491efa0cb2ec93d5 /indra/llui | |
| parent | 17e1f3692c5c1e9cbc6ba6895b312a8baae9aec2 (diff) | |
| parent | d0102af56d3b1d5b1d9bf3c8eb9aeea77028b70e (diff) | |
Merge pull request #1204 from Ansariel/DRTVWR-600-maint-A
Merge main into maint-A
Diffstat (limited to 'indra/llui')
| -rw-r--r-- | indra/llui/llaccordionctrltab.h | 10 | ||||
| -rw-r--r-- | indra/llui/llcontainerview.cpp | 2 | ||||
| -rw-r--r-- | indra/llui/llcontainerview.h | 2 | ||||
| -rw-r--r-- | indra/llui/llflatlistview.cpp | 49 | ||||
| -rw-r--r-- | indra/llui/llflatlistview.h | 11 | ||||
| -rw-r--r-- | indra/llui/llfloater.cpp | 31 | ||||
| -rw-r--r-- | indra/llui/llfloater.h | 3 | ||||
| -rw-r--r-- | indra/llui/llfolderviewitem.cpp | 18 | ||||
| -rw-r--r-- | indra/llui/llkeywords.cpp | 51 | ||||
| -rw-r--r-- | indra/llui/llkeywords.h | 9 | ||||
| -rw-r--r-- | indra/llui/llmenugl.cpp | 4 | ||||
| -rw-r--r-- | indra/llui/llmenugl.h | 7 | ||||
| -rw-r--r-- | indra/llui/llstatbar.cpp | 28 | ||||
| -rw-r--r-- | indra/llui/llstatbar.h | 8 | ||||
| -rw-r--r-- | indra/llui/llstatview.cpp | 3 | ||||
| -rw-r--r-- | indra/llui/llstatview.h | 4 | ||||
| -rw-r--r-- | indra/llui/lltabcontainer.cpp | 16 | ||||
| -rw-r--r-- | indra/llui/lltextbase.cpp | 2 | ||||
| -rw-r--r-- | indra/llui/lltexteditor.cpp | 3 | ||||
| -rw-r--r-- | indra/llui/lltooltip.cpp | 20 | ||||
| -rw-r--r-- | indra/llui/lltooltip.h | 8 | ||||
| -rw-r--r-- | indra/llui/llurlentry.cpp | 18 | ||||
| -rw-r--r-- | indra/llui/llurlregistry.cpp | 6 | 
23 files changed, 176 insertions, 137 deletions
| diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h index 8a1d90feac..70e59d7b0b 100644 --- a/indra/llui/llaccordionctrltab.h +++ b/indra/llui/llaccordionctrltab.h @@ -126,12 +126,12 @@ public:  	void setSelected(bool is_selected); -	bool getCollapsible() {return mCollapsible;}; +	bool getCollapsible() { return mCollapsible; }; -	void setCollapsible(bool collapsible) {mCollapsible = collapsible;}; +	void setCollapsible(bool collapsible) { mCollapsible = collapsible; };  	void changeOpenClose(bool is_open); -	void canOpenClose(bool can_open_close) { mCanOpenClose = can_open_close;}; +	void canOpenClose(bool can_open_close) { mCanOpenClose = can_open_close; };  	bool canOpenClose() const { return mCanOpenClose; };  	virtual bool postBuild(); @@ -142,8 +142,8 @@ public:  	void draw(); -	void    storeOpenCloseState		(); -	void    restoreOpenCloseState	(); +	void storeOpenCloseState(); +	void restoreOpenCloseState();  protected:  	LLAccordionCtrlTab(const LLAccordionCtrlTab::Params&); diff --git a/indra/llui/llcontainerview.cpp b/indra/llui/llcontainerview.cpp index c2fee0871c..f7d8b83e62 100644 --- a/indra/llui/llcontainerview.cpp +++ b/indra/llui/llcontainerview.cpp @@ -288,7 +288,7 @@ void LLContainerView::setLabel(const std::string& label)  	mLabel = label;  } -void LLContainerView::setDisplayChildren(const bool displayChildren) +void LLContainerView::setDisplayChildren(bool displayChildren)  {  	mDisplayChildren = displayChildren;  	for (child_list_const_iter_t child_iter = getChildList()->begin(); diff --git a/indra/llui/llcontainerview.h b/indra/llui/llcontainerview.h index 82e7384676..4ddff88f66 100644 --- a/indra/llui/llcontainerview.h +++ b/indra/llui/llcontainerview.h @@ -78,7 +78,7 @@ public:  	void setLabel(const std::string& label);  	void showLabel(bool show) { mShowLabel = show; } -	void setDisplayChildren(const bool displayChildren); +	void setDisplayChildren(bool displayChildren);  	bool getDisplayChildren() { return mDisplayChildren; }  	void setScrollContainer(LLScrollContainer* scroll) {mScrollContainer = scroll;} diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp index 85fda7928c..a761f54c4d 100644 --- a/indra/llui/llflatlistview.cpp +++ b/indra/llui/llflatlistview.cpp @@ -1361,26 +1361,28 @@ void LLFlatListViewEx::setForceShowingUnmatchedItems(bool show)  	mForceShowingUnmatchedItems = show;  } -void LLFlatListViewEx::setFilterSubString(const std::string& filter_str) +void LLFlatListViewEx::setFilterSubString(const std::string& filter_str, bool notify_parent)  {  	if (0 != LLStringUtil::compareInsensitive(filter_str, mFilterSubString))  	{  		mFilterSubString = filter_str;  		updateNoItemsMessage(mFilterSubString); -		filterItems(); +		filterItems(false, notify_parent);  	}  } -void LLFlatListViewEx::updateItemVisibility(LLPanel* item, const LLSD &action) +bool LLFlatListViewEx::updateItemVisibility(LLPanel* item, const LLSD &action)  { -	if (!item) return; +    if (!item) +        return false; + +	bool visible = true;  	// 0 signifies that filter is matched,  	// i.e. we don't hide items that don't support 'match_filter' action, separators etc.  	if (0 == item->notify(action))  	{  		mHasMatchedItems = true; -		item->setVisible(true);  	}  	else  	{ @@ -1388,34 +1390,45 @@ void LLFlatListViewEx::updateItemVisibility(LLPanel* item, const LLSD &action)  		if (!mForceShowingUnmatchedItems)  		{  			selectItem(item, false); +			visible = false;  		} -		item->setVisible(mForceShowingUnmatchedItems);  	} + +	if (item->getVisible() != visible) +	{ +		item->setVisible(visible); +		return true; +	} + +	return false;  } -void LLFlatListViewEx::filterItems() +void LLFlatListViewEx::filterItems(bool re_sort, bool notify_parent)  { -	typedef std::vector <LLPanel*> item_panel_list_t; -  	std::string cur_filter = mFilterSubString;  	LLStringUtil::toUpper(cur_filter);  	LLSD action;  	action.with("match_filter", cur_filter); -	item_panel_list_t items; -	getItems(items); -  	mHasMatchedItems = false; -    item_panel_list_t::iterator iter = items.begin(), iter_end = items.end(); -	while (iter < iter_end) +	bool visibility_changed = false; +	pairs_const_iterator_t iter = getItemPairs().begin(), iter_end = getItemPairs().end(); +	while (iter != iter_end)  	{ -		LLPanel* pItem = *(iter++); -		updateItemVisibility(pItem, action); +		LLPanel* pItem = (*(iter++))->first; +		visibility_changed |= updateItemVisibility(pItem, action);  	} -	sort(); -	notifyParentItemsRectChanged(); +    if (re_sort) +    { +        sort(); +    } + +    if (visibility_changed && notify_parent) +    { +        notifyParentItemsRectChanged(); +    }  }  bool LLFlatListViewEx::hasMatchedItems() diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h index a19413efa0..af83ef1a23 100644 --- a/indra/llui/llflatlistview.h +++ b/indra/llui/llflatlistview.h @@ -300,6 +300,7 @@ public:  	virtual S32	notify(const LLSD& info) ;  	virtual ~LLFlatListView(); +  protected:  	/** Pairs LLpanel representing a single item LLPanel and LLSD associated with it */ @@ -375,7 +376,9 @@ protected:  	LLRect getLastSelectedItemRect(); -	void   ensureSelectedVisible(); +	void ensureSelectedVisible(); + +	const pairs_list_t& getItemPairs() { return mItemPairs; }  private: @@ -482,14 +485,14 @@ public:  	/**  	 * Sets up new filter string and filters the list.  	 */ -	void setFilterSubString(const std::string& filter_str); +	void setFilterSubString(const std::string& filter_str, bool notify_parent);  	std::string getFilterSubString() { return mFilterSubString; }  	/**  	 * Filters the list, rearranges and notifies parent about shape changes.  	 * Derived classes may want to overload rearrangeItems() to exclude repeated separators after filtration.  	 */ -	void filterItems(); +	void filterItems(bool re_sort, bool notify_parent);  	/**  	 * Returns true if last call of filterItems() found at least one matching item @@ -513,7 +516,7 @@ protected:  	* @param item - item we are changing  	* @param item - action - parameters to determin visibility from  	*/ -	void updateItemVisibility(LLPanel* item, const LLSD &action); +	bool updateItemVisibility(LLPanel* item, const LLSD &action);  private:  	std::string mNoFilteredItemsMsg; diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 3ba56c6da1..ccd60dc536 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -506,7 +506,6 @@ void LLFloater::enableResizeCtrls(bool enable, bool width, bool height)  void LLFloater::destroy()  { -	gFloaterView->onDestroyFloater(this);  	// LLFloaterReg should be synchronized with "dead" floater to avoid returning dead instance before  	// it was deleted via LLMortician::updateClass(). See EXT-8458.  	LLFloaterReg::removeInstance(mInstanceName, mKey); @@ -2407,8 +2406,7 @@ LLFloaterView::LLFloaterView (const Params& p)  	mFocusCycleMode(false),  	mMinimizePositionVOffset(0),  	mSnapOffsetBottom(0), -	mSnapOffsetRight(0), -	mFrontChild(NULL) +	mSnapOffsetRight(0)  {  	mSnapView = getHandle();  } @@ -2564,7 +2562,8 @@ void LLFloaterView::bringToFront(LLFloater* child, bool give_focus, bool restore  	if (!child)  		return; -	if (mFrontChild == child) +    LLFloater* front_child = mFrontChildHandle.get(); +	if (front_child == child)  	{  		if (give_focus && child->canFocusStealFrontmost() && !gFocusMgr.childHasKeyboardFocus(child))  		{ @@ -2573,12 +2572,12 @@ void LLFloaterView::bringToFront(LLFloater* child, bool give_focus, bool restore  		return;  	} -	if (mFrontChild) +	if (front_child && front_child->getVisible())  	{ -		mFrontChild->goneFromFront(); +        front_child->goneFromFront();  	} -	mFrontChild = child; +    mFrontChildHandle = child->getHandle();  	// *TODO: make this respect floater's mAutoFocus value, instead of  	// using parameter @@ -3077,7 +3076,8 @@ LLFloater *LLFloaterView::getBackmost() const  void LLFloaterView::syncFloaterTabOrder()  { -	if (mFrontChild && !mFrontChild->isDead() && mFrontChild->getIsChrome()) +    LLFloater* front_child = mFrontChildHandle.get(); +	if (front_child && front_child->getIsChrome())  		return;  	// look for a visible modal dialog, starting from first @@ -3115,11 +3115,12 @@ void LLFloaterView::syncFloaterTabOrder()  			LLFloater* floaterp = dynamic_cast<LLFloater*>(*child_it);  			if (gFocusMgr.childHasKeyboardFocus(floaterp))  			{ -                if (mFrontChild != floaterp) +                LLFloater* front_child = mFrontChildHandle.get(); +                if (front_child != floaterp)                  {                      // Grab a list of the top floaters that want to stay on top of the focused floater  					std::list<LLFloater*> listTop; -					if (mFrontChild && !mFrontChild->canFocusStealFrontmost()) +					if (front_child && !front_child->canFocusStealFrontmost())                      {                          for (LLView* childp : *getChildList())                          { @@ -3139,7 +3140,7 @@ void LLFloaterView::syncFloaterTabOrder()  						{  							sendChildToFront(childp);  						} -						mFrontChild = listTop.back(); +                        mFrontChildHandle = listTop.back()->getHandle();  					}                  } @@ -3235,14 +3236,6 @@ void LLFloaterView::setToolbarRect(LLToolBarEnums::EToolBarLocation tb, const LL  	}  } -void LLFloaterView::onDestroyFloater(LLFloater* floater) -{ -    if (mFrontChild == floater) -    { -        mFrontChild = nullptr; -    } -} -  void LLFloater::setInstanceName(const std::string& name)  {  	if (name != mInstanceName) diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 814bebeb95..13d9bf5adc 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -607,7 +607,6 @@ public:  	LLFloater* getFrontmostClosableFloater();   	void setToolbarRect(LLToolBarEnums::EToolBarLocation tb, const LLRect& toolbar_rect); -	void onDestroyFloater(LLFloater* floater);  private:  	void hiddenFloaterClosed(LLFloater* floater); @@ -623,7 +622,7 @@ private:  	S32				mMinimizePositionVOffset;  	typedef std::vector<std::pair<LLHandle<LLFloater>, boost::signals2::connection> > hidden_floaters_t;  	hidden_floaters_t mHiddenFloaters; -	LLFloater *		mFrontChild; +    LLHandle<LLFloater>	mFrontChildHandle;  };  // diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index 76d926f922..bcbc0f9970 100644 --- a/indra/llui/llfolderviewitem.cpp +++ b/indra/llui/llfolderviewitem.cpp @@ -187,14 +187,18 @@ LLFolderViewItem::~LLFolderViewItem()  bool LLFolderViewItem::postBuild()  { -    LLFolderViewModelItem& vmi = *getViewModelItem(); -    // getDisplayName() is expensive (due to internal getLabelSuffix() and name building) -    // it also sets search strings so it requires a filter reset -    mLabel = vmi.getDisplayName(); -    setToolTip(vmi.getName()); +    LLFolderViewModelItem* vmi = getViewModelItem(); +    llassert(vmi); // not supposed to happen, if happens, find out why and fix +    if (vmi) +    { +        // getDisplayName() is expensive (due to internal getLabelSuffix() and name building) +        // it also sets search strings so it requires a filter reset +        mLabel = vmi->getDisplayName(); +        setToolTip(vmi->getName()); -    // Dirty the filter flag of the model from the view (CHUI-849) -    vmi.dirtyFilter(); +        // Dirty the filter flag of the model from the view (CHUI-849) +        vmi->dirtyFilter(); +    }      // Don't do full refresh on constructor if it is possible to avoid      // it significantly slows down bulk view creation. diff --git a/indra/llui/llkeywords.cpp b/indra/llui/llkeywords.cpp index 36401f5542..fd8ad0721a 100644 --- a/indra/llui/llkeywords.cpp +++ b/indra/llui/llkeywords.cpp @@ -479,7 +479,7 @@ LLTrace::BlockTimerStatHandle FTM_SYNTAX_COLORING("Syntax Coloring");  // Walk through a string, applying the rules specified by the keyword token list and  // create a list of color segments. -void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLWString& wtext, const LLColor4 &defaultColor, LLTextEditor& editor) +void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLWString& wtext, LLTextEditor& editor, LLStyleConstSP style)  {  	LL_RECORD_BLOCK_TIME(FTM_SYNTAX_COLORING);  	seg_list->clear(); @@ -491,7 +491,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW  	S32 text_len = wtext.size() + 1; -	seg_list->push_back( new LLNormalTextSegment( defaultColor, 0, text_len, editor ) ); +	seg_list->push_back( new LLNormalTextSegment( style, 0, text_len, editor ) );  	const llwchar* base = wtext.c_str();  	const llwchar* cur = base; @@ -501,9 +501,9 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW  		{  			if( *cur == '\n' )  			{ -				LLTextSegmentPtr text_segment = new LLLineBreakTextSegment(cur-base); +				LLTextSegmentPtr text_segment = new LLLineBreakTextSegment(style, cur-base);  				text_segment->setToken( 0 ); -				insertSegment( *seg_list, text_segment, text_len, defaultColor, editor); +				insertSegment( *seg_list, text_segment, text_len, style, editor);  				cur++;  				if( !*cur || *cur == '\n' )  				{ @@ -541,7 +541,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW  						S32 seg_end = cur - base;  						//create segments from seg_start to seg_end -						insertSegments(wtext, *seg_list,cur_token, text_len, seg_start, seg_end, defaultColor, editor); +						insertSegments(wtext, *seg_list,cur_token, text_len, seg_start, seg_end, style, editor);  						line_done = true; // to break out of second loop.  						break;  					} @@ -648,7 +648,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW  						seg_end = seg_start + between_delimiters + cur_delimiter->getLengthHead();  					} -					insertSegments(wtext, *seg_list,cur_delimiter, text_len, seg_start, seg_end, defaultColor, editor); +					insertSegments(wtext, *seg_list,cur_delimiter, text_len, seg_start, seg_end, style, editor);  					/*  					LLTextSegmentPtr text_segment = new LLNormalTextSegment( cur_delimiter->getColor(), seg_start, seg_end, editor );  					text_segment->setToken( cur_delimiter ); @@ -682,7 +682,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW  						// LL_INFOS("SyntaxLSL") << "Seg: [" << word.c_str() << "]" << LL_ENDL; -						insertSegments(wtext, *seg_list,cur_token, text_len, seg_start, seg_end, defaultColor, editor); +						insertSegments(wtext, *seg_list,cur_token, text_len, seg_start, seg_end, style, editor);  					}  					cur += seg_len;  					continue; @@ -697,30 +697,32 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW  	}  } -void LLKeywords::insertSegments(const LLWString& wtext, std::vector<LLTextSegmentPtr>& seg_list, LLKeywordToken* cur_token, S32 text_len, S32 seg_start, S32 seg_end, const LLColor4 &defaultColor, LLTextEditor& editor ) +void LLKeywords::insertSegments(const LLWString& wtext, std::vector<LLTextSegmentPtr>& seg_list, LLKeywordToken* cur_token, S32 text_len, S32 seg_start, S32 seg_end, LLStyleConstSP style, LLTextEditor& editor )  {  	std::string::size_type pos = wtext.find('\n',seg_start); +     +    LLStyleConstSP cur_token_style = new LLStyle(LLStyle::Params().font(style->getFont()).color(cur_token->getColor()));  	while (pos!=-1 && pos < (std::string::size_type)seg_end)  	{  		if (pos!=seg_start)  		{ -			LLTextSegmentPtr text_segment = new LLNormalTextSegment( cur_token->getColor(), seg_start, pos, editor ); +            LLTextSegmentPtr text_segment = new LLNormalTextSegment(cur_token_style, seg_start, pos, editor);  			text_segment->setToken( cur_token ); -			insertSegment( seg_list, text_segment, text_len, defaultColor, editor); +			insertSegment( seg_list, text_segment, text_len, style, editor);  		} -		LLTextSegmentPtr text_segment = new LLLineBreakTextSegment(pos); +		LLTextSegmentPtr text_segment = new LLLineBreakTextSegment(style, pos);  		text_segment->setToken( cur_token ); -		insertSegment( seg_list, text_segment, text_len, defaultColor, editor); +		insertSegment( seg_list, text_segment, text_len, style, editor);  		seg_start = pos+1;  		pos = wtext.find('\n',seg_start);  	} -	LLTextSegmentPtr text_segment = new LLNormalTextSegment( cur_token->getColor(), seg_start, seg_end, editor ); +	LLTextSegmentPtr text_segment = new LLNormalTextSegment(cur_token_style, seg_start, seg_end, editor);  	text_segment->setToken( cur_token ); -	insertSegment( seg_list, text_segment, text_len, defaultColor, editor); +	insertSegment( seg_list, text_segment, text_len, style, editor);  }  void LLKeywords::insertSegment(std::vector<LLTextSegmentPtr>& seg_list, LLTextSegmentPtr new_segment, S32 text_len, const LLColor4 &defaultColor, LLTextEditor& editor ) @@ -744,6 +746,27 @@ void LLKeywords::insertSegment(std::vector<LLTextSegmentPtr>& seg_list, LLTextSe  	}  } +void LLKeywords::insertSegment(std::vector<LLTextSegmentPtr>& seg_list, LLTextSegmentPtr new_segment, S32 text_len, LLStyleConstSP style, LLTextEditor& editor ) +{ +	LLTextSegmentPtr last = seg_list.back(); +	S32 new_seg_end = new_segment->getEnd(); + +	if( new_segment->getStart() == last->getStart() ) +	{ +		seg_list.pop_back(); +	} +	else +	{ +		last->setEnd( new_segment->getStart() ); +	} +	seg_list.push_back( new_segment ); + +	if( new_seg_end < text_len ) +	{ +		seg_list.push_back( new LLNormalTextSegment( style, new_seg_end, text_len, editor ) ); +	} +} +  #ifdef _DEBUG  void LLKeywords::dump()  { diff --git a/indra/llui/llkeywords.h b/indra/llui/llkeywords.h index 18e2ed06c5..2410fe7d5a 100644 --- a/indra/llui/llkeywords.h +++ b/indra/llui/llkeywords.h @@ -29,6 +29,7 @@  #include "lldir.h" +#include "llstyle.h"  #include "llstring.h"  #include "v3color.h"  #include "v4color.h" @@ -115,8 +116,8 @@ public:  	void		findSegments(std::vector<LLTextSegmentPtr> *seg_list,  							 const LLWString& text, -							 const LLColor4 &defaultColor, -							 class LLTextEditor& editor); +							 class LLTextEditor& editor, +                             LLStyleConstSP style);  	void		initialize(LLSD SyntaxXML);  	void		processTokens(); @@ -181,9 +182,11 @@ protected:  							   S32 text_len,  							   S32 seg_start,  							   S32 seg_end, -							   const LLColor4 &defaultColor, +							   LLStyleConstSP style,  							   LLTextEditor& editor); +    void insertSegment(std::vector<LLTextSegmentPtr>& seg_list, LLTextSegmentPtr new_segment, S32 text_len, LLStyleConstSP style, LLTextEditor& editor ); +  	bool		mLoaded;  	LLSD		mSyntax;  	word_token_map_t mWordTokenMap; diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index f53979e544..79a8bc5ba4 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -1788,7 +1788,8 @@ LLMenuGL::LLMenuGL(const LLMenuGL::Params& p)  	mNeedsArrange(false),  	mAlwaysShowMenu(false),  	mResetScrollPositionOnShow(true), -	mShortcutPad(p.shortcut_pad) +	mShortcutPad(p.shortcut_pad), +    mFont(p.font)  {  	typedef boost::tokenizer<boost::char_separator<char> > tokenizer;  	boost::char_separator<char> sep("_"); @@ -3647,6 +3648,7 @@ bool LLMenuBarGL::appendMenu( LLMenuGL* menu )  	p.disabled_color=LLUIColorTable::instance().getColor("MenuItemDisabledColor");  	p.highlight_bg_color=LLUIColorTable::instance().getColor("MenuItemHighlightBgColor");  	p.highlight_fg_color=LLUIColorTable::instance().getColor("MenuItemHighlightFgColor"); +    p.font = menu->getFont();  	LLMenuItemBranchDownGL* branch = LLUICtrlFactory::create<LLMenuItemBranchDownGL>(p);  	success &= branch->addToAcceleratorList(&mAccelerators); diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index 48d6d7114c..a0b2d4f7ef 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -562,7 +562,9 @@ public:  	// add a context menu branch  	bool appendContextSubMenu(LLMenuGL *menu); -protected: +    const LLFontGL *getFont() const { return mFont; } + +  protected:  	void createSpilloverBranch();  	void cleanupSpilloverBranch();  	// Add the menu item to this menu. @@ -594,6 +596,9 @@ protected:  	bool			mKeepFixedSize;  	bool			mNeedsArrange; +    // Font for top menu items only +    const LLFontGL* mFont; +  private: diff --git a/indra/llui/llstatbar.cpp b/indra/llui/llstatbar.cpp index 1ddb15473a..cba9eca9d2 100644 --- a/indra/llui/llstatbar.cpp +++ b/indra/llui/llstatbar.cpp @@ -181,7 +181,7 @@ LLStatBar::LLStatBar(const Params& p)  	mTargetMinBar(llmin(p.bar_min, p.bar_max)),  	mTargetMaxBar(llmax(p.bar_max, p.bar_min)),  	mCurMaxBar(p.bar_max), -    mCurMinBar(0), +	mCurMinBar(0),  	mDecimalDigits(p.decimal_digits),  	mNumHistoryFrames(p.num_frames),  	mNumShortHistoryFrames(p.num_frames_short), @@ -222,9 +222,6 @@ bool LLStatBar::handleHover(S32 x, S32 y, MASK mask)  	case STAT_SAMPLE:  		LLToolTipMgr::instance().show(LLToolTip::Params().message(mStat.sampleStatp->getDescription()).sticky_rect(calcScreenRect()));  		break; -	case STAT_MEM: -		LLToolTipMgr::instance().show(LLToolTip::Params().message(mStat.memStatp->getDescription()).sticky_rect(calcScreenRect())); -		break;  	default:  		break;  	} @@ -373,18 +370,6 @@ void LLStatBar::draw()  			}  		}  		break; -	case STAT_MEM: -		{ -			const LLTrace::StatType<LLTrace::MemAccumulator>& mem_stat = *mStat.memStatp; - -			unit_label        = mUnitLabel.empty() ? mem_stat.getUnitLabel() : mUnitLabel; -			current           = last_frame_recording.getLastValue(mem_stat).value(); -			min               = frame_recording.getPeriodMin(mem_stat, num_frames).value(); -			max               = frame_recording.getPeriodMax(mem_stat, num_frames).value(); -			mean              = frame_recording.getPeriodMean(mem_stat, num_frames).value(); -			display_value	  = current; -		} -		break;  	default:  		break;  	} @@ -500,11 +485,6 @@ void LLStatBar::draw()  							max_value		= recording.getMax(*mStat.sampleStatp);  							num_samples		= recording.getSampleCount(*mStat.sampleStatp);  							break; -						case STAT_MEM: -							min_value       = recording.getMin(*mStat.memStatp).value(); -							max_value		= recording.getMax(*mStat.memStatp).value(); -							num_samples = 1; -							break;  						default:  							break;  					} @@ -583,14 +563,8 @@ void LLStatBar::setStat(const std::string& stat_name)  		mStat.sampleStatp = sample_stat.get();  		mStatType = STAT_SAMPLE;  	} -	else if (auto mem_stat = StatType<MemAccumulator>::getInstance(stat_name)) -	{ -		mStat.memStatp = mem_stat.get(); -		mStatType = STAT_MEM; -	}  } -  void LLStatBar::setRange(F32 bar_min, F32 bar_max)  {  	mTargetMinBar		= llmin(bar_min, bar_max); diff --git a/indra/llui/llstatbar.h b/indra/llui/llstatbar.h index 8c74aaf4ad..8e78337c0d 100644 --- a/indra/llui/llstatbar.h +++ b/indra/llui/llstatbar.h @@ -95,17 +95,15 @@ private:  		STAT_NONE,  		STAT_COUNT,  		STAT_EVENT, -		STAT_SAMPLE, -		STAT_MEM +		STAT_SAMPLE  	} mStatType;  	union  	{ -		void*														valid; +		void*													valid;  		const LLTrace::StatType<LLTrace::CountAccumulator>*		countStatp;  		const LLTrace::StatType<LLTrace::EventAccumulator>*		eventStatp; -		const LLTrace::StatType<LLTrace::SampleAccumulator>*		sampleStatp; -		const LLTrace::StatType<LLTrace::MemAccumulator>*		memStatp; +		const LLTrace::StatType<LLTrace::SampleAccumulator>*	sampleStatp;  	} mStat;  	LLUIString   mLabel; diff --git a/indra/llui/llstatview.cpp b/indra/llui/llstatview.cpp index 4e74172777..bcc22431d0 100644 --- a/indra/llui/llstatview.cpp +++ b/indra/llui/llstatview.cpp @@ -58,10 +58,7 @@ LLStatView::~LLStatView()  	}  } -  static StatViewRegistry::Register<LLStatBar> r1("stat_bar");  static StatViewRegistry::Register<LLStatView> r2("stat_view");  // stat_view can be a child of panels/etc.  static LLDefaultChildRegistry::Register<LLStatView> r3("stat_view"); - - diff --git a/indra/llui/llstatview.h b/indra/llui/llstatview.h index af4db7d7ea..044f0a8679 100644 --- a/indra/llui/llstatview.h +++ b/indra/llui/llstatview.h @@ -63,7 +63,7 @@ protected:  	friend class LLUICtrlFactory;  protected: -	std::string mSetting; - +	const std::string mSetting;  }; +  #endif // LL_STATVIEW_ diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index 1328510a07..772dcdf119 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -1516,25 +1516,23 @@ bool LLTabContainer::selectTab(S32 which)  	LLTabTuple* selected_tuple = getTab(which);  	if (!selected_tuple) -	{  		return false; -	} -	 +  	LLSD cbdata;  	if (selected_tuple->mTabPanel)  		cbdata = selected_tuple->mTabPanel->getName(); -	bool res = false; -	if( !mValidateSignal || (*mValidateSignal)( this, cbdata ) ) +	bool result = false; +	if (!mValidateSignal || (*mValidateSignal)(this, cbdata))  	{ -		res = setTab(which); -		if (res && mCommitSignal) +		result = setTab(which); +		if (result && mCommitSignal)  		{  			(*mCommitSignal)(this, cbdata);  		}  	} -	 -	return res; + +	return result;  }  // private diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index bb3ce49b8b..349a001335 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -3477,7 +3477,7 @@ bool LLNormalTextSegment::handleToolTip(S32 x, S32 y, MASK mask)  	if (mToken && !mToken->getToolTip().empty())  	{  		const LLWString& wmsg = mToken->getToolTip(); -		LLToolTipMgr::instance().show(wstring_to_utf8str(wmsg)); +        LLToolTipMgr::instance().show(wstring_to_utf8str(wmsg), (mToken->getType() == LLKeywordToken::TT_FUNCTION));  		return true;  	}  	// or do we have an explicitly set tooltip (e.g., for Urls) diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 33eecc7bac..81eaec620c 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -1862,7 +1862,8 @@ bool LLTextEditor::handleKeyHere(KEY key, MASK mask )  		}  		if (mEnableTooltipPaste && -			LLToolTipMgr::instance().toolTipVisible() &&  +			LLToolTipMgr::instance().toolTipVisible() && +            LLToolTipMgr::instance().isTooltipPastable() &&  			KEY_TAB == key)  		{	// Paste the first line of a tooltip into the editor  			std::string message; diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp index 2cd50a7a39..4df2c0cb6d 100644 --- a/indra/llui/lltooltip.cpp +++ b/indra/llui/lltooltip.cpp @@ -154,7 +154,8 @@ LLToolTip::Params::Params()  	text_color("text_color"),  	time_based_media("time_based_media", false),  	web_based_media("web_based_media", false), -	media_playing("media_playing", false) +	media_playing("media_playing", false), +    allow_paste_tooltip("allow_paste_tooltip", false)  {  	changeDefault(chrome, true);  } @@ -167,7 +168,8 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)  	mTextBox(NULL),  	mInfoButton(NULL),  	mPlayMediaButton(NULL), -	mHomePageButton(NULL) +	mHomePageButton(NULL), +    mIsTooltipPastable(p.allow_paste_tooltip)  {  	LLTextBox::Params params;  	params.name = params.initial_value().asString(); @@ -289,6 +291,8 @@ void LLToolTip::initFromParams(const LLToolTip::Params& p)  		mTextBox->setText(p.message());  	} +	mIsTooltipPastable = p.allow_paste_tooltip; +  	updateTextBox();  	snapToChildren();  } @@ -483,9 +487,9 @@ void LLToolTipMgr::createToolTip(const LLToolTip::Params& params)  } -void LLToolTipMgr::show(const std::string& msg) +void LLToolTipMgr::show(const std::string& msg, bool allow_paste_tooltip)  { -	show(LLToolTip::Params().message(msg)); +    show(LLToolTip::Params().message(msg).allow_paste_tooltip(allow_paste_tooltip));  }  void LLToolTipMgr::show(const LLToolTip::Params& params) @@ -626,5 +630,13 @@ void LLToolTipMgr::getToolTipMessage(std::string & message)  	}  } +bool LLToolTipMgr::isTooltipPastable() +{ +    if (toolTipVisible()) +    { +        return mToolTip->isTooltipPastable(); +    } +    return false; + }  // EOF diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h index 309d2a468e..0794159957 100644 --- a/indra/llui/lltooltip.h +++ b/indra/llui/lltooltip.h @@ -94,6 +94,8 @@ public:  									padding;  		Optional<bool>				wrap; +        Optional<bool> allow_paste_tooltip; +  		Params();  	};  	/*virtual*/ void draw(); @@ -109,6 +111,7 @@ public:  	virtual void initFromParams(const LLToolTip::Params& params);  	void getToolTipMessage(std::string & message); +    bool isTooltipPastable() { return mIsTooltipPastable; }  protected:  	void updateTextBox(); @@ -125,6 +128,8 @@ protected:  	bool			mHasClickCallback;  	S32				mPadding;	// pixels  	S32				mMaxWidth; + +    bool mIsTooltipPastable;  };  // used for the inspector tooltips which need different background images etc. @@ -142,7 +147,7 @@ class LLToolTipMgr : public LLSingleton<LLToolTipMgr>  public:  	void show(const LLToolTip::Params& params); -	void show(const std::string& message); +	void show(const std::string& message, bool allow_paste_tooltip = false);  	void unblockToolTips();  	void blockToolTips(); @@ -154,6 +159,7 @@ public:  	void updateToolTipVisibility();  	void getToolTipMessage(std::string & message); +    bool isTooltipPastable();  private:  	void createToolTip(const LLToolTip::Params& params); diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 08f5d011f1..aa9272f782 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -234,14 +234,20 @@ bool LLUrlEntryBase::isWikiLinkCorrect(const std::string &labeled_url) const  std::string LLUrlEntryBase::urlToLabelWithGreyQuery(const std::string &url) const  { +    if (url.empty()) +    { +        return url; +    }  	LLUriParser up(escapeUrl(url)); -	up.normalize(); - -	std::string label; -	up.extractParts(); -	up.glueFirst(label); +	if (up.normalize() == 0) +    { +        std::string label; +        up.extractParts(); +        up.glueFirst(label); -	return unescapeUrl(label); +        return unescapeUrl(label); +    } +    return std::string();  }  std::string LLUrlEntryBase::urlToGreyQuery(const std::string &url) const diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index 3bd7321777..f1df7699e2 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -221,8 +221,10 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL  		if (match_entry == mUrlEntryTrusted)  		{  			LLUriParser up(url); -			up.normalize(); -			url = up.normalizedUri(); +			if (up.normalize() == 0) +            { +                url = up.normalizedUri(); +            }  		}  		match.setValues(match_start, match_end, | 
