diff options
| author | Andrey Lihatskiy <alihatskiy@productengine.com> | 2020-11-13 18:27:29 +0200 | 
|---|---|---|
| committer | Andrey Lihatskiy <alihatskiy@productengine.com> | 2020-11-13 18:27:29 +0200 | 
| commit | ac3db22abcb309898ae7e6dc683cdc80e6532da3 (patch) | |
| tree | 1014ed46857aa59f18750779d00ed04d4a4aa9c8 /indra/llui | |
| parent | 8aa41b9e1c18f3b108c2e219e72b6e40762c4652 (diff) | |
| parent | 04c473ab46041133ea6a87dbe0d43e662472adf5 (diff) | |
Merge branch 'master' into DRTVWR-518-ui
Diffstat (limited to 'indra/llui')
| -rw-r--r-- | indra/llui/llaccordionctrl.cpp | 3 | ||||
| -rw-r--r-- | indra/llui/llaccordionctrl.h | 4 | ||||
| -rw-r--r-- | indra/llui/llfolderview.cpp | 4 | ||||
| -rw-r--r-- | indra/llui/llfolderviewitem.cpp | 74 | ||||
| -rw-r--r-- | indra/llui/llfolderviewitem.h | 10 | ||||
| -rw-r--r-- | indra/llui/llfolderviewmodel.cpp | 3 | ||||
| -rw-r--r-- | indra/llui/llfolderviewmodel.h | 12 | ||||
| -rw-r--r-- | indra/llui/llspellcheck.cpp | 8 | ||||
| -rw-r--r-- | indra/llui/llspellcheck.h | 1 | ||||
| -rw-r--r-- | indra/llui/llurlentry.cpp | 16 | 
10 files changed, 99 insertions, 36 deletions
| diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp index 61a119800e..809d72208f 100644 --- a/indra/llui/llaccordionctrl.cpp +++ b/indra/llui/llaccordionctrl.cpp @@ -55,6 +55,7 @@ LLAccordionCtrl::LLAccordionCtrl(const Params& params):LLPanel(params)   , mTabComparator( NULL )   , mNoVisibleTabsHelpText(NULL)   , mNoVisibleTabsOrigString(params.no_visible_tabs_text.initial_value().asString()) + , mSkipScrollToChild(false)  {  	initNoTabsWidget(params.no_matched_tabs_text); @@ -659,7 +660,7 @@ void	LLAccordionCtrl::onScrollPosChangeCallback(S32, LLScrollbar*)  // virtual  void LLAccordionCtrl::onUpdateScrollToChild(const LLUICtrl *cntrl)  { -    if (mScrollbar && mScrollbar->getVisible()) +    if (mScrollbar && mScrollbar->getVisible() && !mSkipScrollToChild)      {          // same as scrollToShowRect          LLRect rect; diff --git a/indra/llui/llaccordionctrl.h b/indra/llui/llaccordionctrl.h index b38a76d27f..2828254472 100644 --- a/indra/llui/llaccordionctrl.h +++ b/indra/llui/llaccordionctrl.h @@ -138,6 +138,8 @@ public:  	bool getFitParent() const {return mFitParent;} +	void setSkipScrollToChild(bool skip) { mSkipScrollToChild = skip; } +  private:  	void	initNoTabsWidget(const LLTextBox::Params& tb_params);  	void	updateNoTabsHelpTextVisibility(); @@ -183,6 +185,8 @@ private:  	F32				mAutoScrollRate;  	LLTextBox*		mNoVisibleTabsHelpText; +	bool			mSkipScrollToChild; +  	std::string		mNoMatchedTabsOrigString;  	std::string		mNoVisibleTabsOrigString; diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp index e718fcec46..0c1dcc301b 100644 --- a/indra/llui/llfolderview.cpp +++ b/indra/llui/llfolderview.cpp @@ -342,7 +342,9 @@ static LLTrace::BlockTimerStatHandle FTM_FILTER("Filter Folder View");  void LLFolderView::filter( LLFolderViewFilter& filter )  {  	LL_RECORD_BLOCK_TIME(FTM_FILTER); -    filter.resetTime(llclamp(LLUI::getInstance()->mSettingGroups["config"]->getS32(mParentPanel.get()->getVisible() ? "FilterItemsMaxTimePerFrameVisible" : "FilterItemsMaxTimePerFrameUnvisible"), 1, 100)); +    static LLCachedControl<S32> filter_visible(*LLUI::getInstance()->mSettingGroups["config"], "FilterItemsMaxTimePerFrameVisible", 10); +    static LLCachedControl<S32> filter_hidden(*LLUI::getInstance()->mSettingGroups["config"], "FilterItemsMaxTimePerFrameUnvisible", 1); +    filter.resetTime(llclamp(mParentPanel.get()->getVisible() ? filter_visible() : filter_hidden(), 1, 100));      // Note: we filter the model, not the view  	getViewModelItem()->filter(filter); diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index 9a1f7de73b..1c6c7b1b35 100644 --- a/indra/llui/llfolderviewitem.cpp +++ b/indra/llui/llfolderviewitem.cpp @@ -122,6 +122,7 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)  :	LLView(p),  	mLabelWidth(0),  	mLabelWidthDirty(false), +    mSuffixNeedsRefresh(false),      mLabelPaddingRight(DEFAULT_LABEL_PADDING_RIGHT),  	mParentFolder( NULL ),  	mIsSelected( FALSE ), @@ -181,11 +182,25 @@ LLFolderViewItem::~LLFolderViewItem()  BOOL LLFolderViewItem::postBuild()  { -	refresh(); +    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()); + +    // 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. +    // Todo: Ideally we need to move getDisplayName() out of constructor as well. +    // Like: make a logic that will let filter update search string, +    // while LLFolderViewItem::arrange() updates visual part +    mSuffixNeedsRefresh = true; +    mLabelWidthDirty = true;  	return TRUE;  } -  LLFolderView* LLFolderViewItem::getRoot()  {  	return mRoot; @@ -280,24 +295,51 @@ BOOL LLFolderViewItem::isPotentiallyVisible(S32 filter_generation)  void LLFolderViewItem::refresh()  { -	LLFolderViewModelItem& vmi = *getViewModelItem(); +    LLFolderViewModelItem& vmi = *getViewModelItem(); + +    mLabel = vmi.getDisplayName(); +    setToolTip(vmi.getName()); +    // icons are slightly expensive to get, can be optimized +    // see LLInventoryIcon::getIcon() +    mIcon = vmi.getIcon(); +    mIconOpen = vmi.getIconOpen(); +    mIconOverlay = vmi.getIconOverlay(); -	mLabel = vmi.getDisplayName(); +    if (mRoot->useLabelSuffix()) +    { +        // Very Expensive! +        // Can do a number of expensive checks, like checking active motions, wearables or friend list +        mLabelStyle = vmi.getLabelStyle(); +        mLabelSuffix = vmi.getLabelSuffix(); +    } -	setToolTip(vmi.getName()); -	mIcon = vmi.getIcon(); -	mIconOpen = vmi.getIconOpen(); -	mIconOverlay = vmi.getIconOverlay(); +    // Dirty the filter flag of the model from the view (CHUI-849) +    vmi.dirtyFilter(); + +    mLabelWidthDirty = true; +    mSuffixNeedsRefresh = false; +} + +void LLFolderViewItem::refreshSuffix() +{ +	LLFolderViewModelItem const* vmi = getViewModelItem(); + +    // icons are slightly expensive to get, can be optimized +    // see LLInventoryIcon::getIcon() +	mIcon = vmi->getIcon(); +    mIconOpen = vmi->getIconOpen(); +    mIconOverlay = vmi->getIconOverlay();  	if (mRoot->useLabelSuffix())  	{ -		mLabelStyle = vmi.getLabelStyle(); -		mLabelSuffix = vmi.getLabelSuffix(); +        // Very Expensive! +        // Can do a number of expensive checks, like checking active motions, wearables or friend list +        mLabelStyle = vmi->getLabelStyle(); +        mLabelSuffix = vmi->getLabelSuffix();  	} -	mLabelWidthDirty = true; -    // Dirty the filter flag of the model from the view (CHUI-849) -	vmi.dirtyFilter(); +    mLabelWidthDirty = true; +    mSuffixNeedsRefresh = false;  }  // Utility function for LLFolderView @@ -348,6 +390,12 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height )  		: 0;  	if (mLabelWidthDirty)  	{ +        if (mSuffixNeedsRefresh) +        { +            // Expensive. But despite refreshing label, +            // it is purely visual, so it is fine to do at our laisure +            refreshSuffix(); +        }  		mLabelWidth = getLabelXPos() + getLabelFontForStyle(mLabelStyle)->getWidth(mLabel) + getLabelFontForStyle(mLabelStyle)->getWidth(mLabelSuffix) + mLabelPaddingRight;   		mLabelWidthDirty = false;  	} diff --git a/indra/llui/llfolderviewitem.h b/indra/llui/llfolderviewitem.h index 61c39e0175..da09d139e9 100644 --- a/indra/llui/llfolderviewitem.h +++ b/indra/llui/llfolderviewitem.h @@ -95,6 +95,7 @@ protected:  	LLPointer<LLFolderViewModelItem> mViewModelItem;  	LLFontGL::StyleFlags		mLabelStyle;  	std::string					mLabelSuffix; +	bool						mSuffixNeedsRefresh; //suffix and icons  	LLUIImagePtr				mIcon,  								mIconOpen,  								mIconOverlay; @@ -266,8 +267,13 @@ public:  	virtual BOOL	passedFilter(S32 filter_generation = -1);  	virtual BOOL	isPotentiallyVisible(S32 filter_generation = -1); -	// refresh information from the object being viewed. -	virtual void refresh(); +    // refresh information from the object being viewed. +    // refreshes label, suffixes and sets icons. Expensive! +    // Causes filter update +    virtual void refresh(); +    // refreshes suffixes and sets icons. Expensive! +    // Does not need filter update +	virtual void refreshSuffix();  	// LLView functionality  	virtual BOOL handleRightMouseDown( S32 x, S32 y, MASK mask ); diff --git a/indra/llui/llfolderviewmodel.cpp b/indra/llui/llfolderviewmodel.cpp index 3b45fb53a2..ea106b5fae 100644 --- a/indra/llui/llfolderviewmodel.cpp +++ b/indra/llui/llfolderviewmodel.cpp @@ -48,7 +48,8 @@ std::string LLFolderViewModelCommon::getStatusText()  void LLFolderViewModelCommon::filter()  { -    getFilter().resetTime(llclamp(LLUI::getInstance()->mSettingGroups["config"]->getS32("FilterItemsMaxTimePerFrameVisible"), 1, 100)); +    static LLCachedControl<S32> filter_visible(*LLUI::getInstance()->mSettingGroups["config"], "FilterItemsMaxTimePerFrameVisible", 10); +    getFilter().resetTime(llclamp(filter_visible(), 1, 100));  	mFolderView->getViewModelItem()->filter(getFilter());  } diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h index f71a88c56e..84a1539094 100644 --- a/indra/llui/llfolderviewmodel.h +++ b/indra/llui/llfolderviewmodel.h @@ -285,17 +285,7 @@ public:  	typedef std::list<LLFolderViewModelItem*> child_list_t;  	virtual void addChild(LLFolderViewModelItem* child)  -	{  -		// Avoid duplicates: bail out if that child is already present in the list -		// Note: this happens when models are created before views -		child_list_t::const_iterator iter; -		for (iter = mChildren.begin(); iter != mChildren.end(); iter++) -		{ -			if (child == *iter) -			{ -				return; -			} -		} +	{  		mChildren.push_back(child);  		child->setParent(this);   		dirtyFilter(); diff --git a/indra/llui/llspellcheck.cpp b/indra/llui/llspellcheck.cpp index 296ea09079..ebd8ca0923 100644 --- a/indra/llui/llspellcheck.cpp +++ b/indra/llui/llspellcheck.cpp @@ -49,8 +49,6 @@ LLSpellChecker::settings_change_signal_t LLSpellChecker::sSettingsChangeSignal;  LLSpellChecker::LLSpellChecker()  	: mHunspell(NULL)  { -	// Load initial dictionary information -	refreshDictionaryMap();  }  LLSpellChecker::~LLSpellChecker() @@ -58,6 +56,12 @@ LLSpellChecker::~LLSpellChecker()  	delete mHunspell;  } +void LLSpellChecker::initSingleton() +{ +	// Load initial dictionary information +	refreshDictionaryMap(); +} +  bool LLSpellChecker::checkSpelling(const std::string& word) const  {  	if ( (!mHunspell) || (word.length() < 3) || (0 != mHunspell->spell(word.c_str())) ) diff --git a/indra/llui/llspellcheck.h b/indra/llui/llspellcheck.h index f1964cc091..3da5e30955 100644 --- a/indra/llui/llspellcheck.h +++ b/indra/llui/llspellcheck.h @@ -47,6 +47,7 @@ public:  protected:  	void addToDictFile(const std::string& dict_path, const std::string& word);  	void initHunspell(const std::string& dict_language); +	void initSingleton();  public:  	typedef std::list<std::string> dict_list_t; diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 333d03f208..e6835f73fb 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -454,13 +454,17 @@ std::string LLUrlEntrySLURL::getLocation(const std::string &url) const  }  // -// LLUrlEntrySeconlifeURL Describes *secondlife.com/ *lindenlab.com/ and *tilia-inc.com/ urls to substitute icon 'hand.png' before link +// LLUrlEntrySeconlifeURL Describes *secondlife.com/ *lindenlab.com/ *secondlifegrid.net/ and *tilia-inc.com/ urls to substitute icon 'hand.png' before link  //  LLUrlEntrySecondlifeURL::LLUrlEntrySecondlifeURL()  {                                	mPattern = boost::regex("((http://([-\\w\\.]*\\.)?(secondlife|lindenlab|tilia-inc)\\.com)"  							"|" -							"(https://([-\\w\\.]*\\.)?(secondlife|lindenlab|tilia-inc)\\.com(:\\d{1,5})?))" +							"(http://([-\\w\\.]*\\.)?secondlifegrid\\.net)" +							"|" +							"(https://([-\\w\\.]*\\.)?(secondlife|lindenlab|tilia-inc)\\.com(:\\d{1,5})?)" +							"|" +							"(https://([-\\w\\.]*\\.)?secondlifegrid\\.net(:\\d{1,5})?))"  							"\\/\\S*",  		boost::regex::perl|boost::regex::icase); @@ -495,12 +499,14 @@ std::string LLUrlEntrySecondlifeURL::getTooltip(const std::string &url) const  }  // -// LLUrlEntrySimpleSecondlifeURL Describes *secondlife.com *lindenlab.com and *tilia-inc.com urls to substitute icon 'hand.png' before link +// LLUrlEntrySimpleSecondlifeURL Describes *secondlife.com *lindenlab.com *secondlifegrid.net and *tilia-inc.com urls to substitute icon 'hand.png' before link  //  LLUrlEntrySimpleSecondlifeURL::LLUrlEntrySimpleSecondlifeURL()    { -	mPattern = boost::regex("https?://([-\\w\\.]*\\.)?(secondlife|lindenlab|tilia-inc)\\.com(?!\\S)", -		boost::regex::perl|boost::regex::icase); +	mPattern = boost::regex("https?://([-\\w\\.]*\\.)?(secondlife|lindenlab|tilia-inc)\\.com(?!\\S)" +							"|" +							"https?://([-\\w\\.]*\\.)?secondlifegrid\\.net(?!\\S)", +							boost::regex::perl|boost::regex::icase);  	mIcon = "Hand";  	mMenuName = "menu_url_http.xml"; | 
