From d70b749101f5a954fc824e73519102a0d88f24ae Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 29 Apr 2020 15:56:32 +0300 Subject: SL-13119 Moved ineffective function from inventory view creation --- indra/llui/llfolderviewitem.cpp | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'indra/llui/llfolderviewitem.cpp') diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index 9a1f7de73b..9754192b06 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), + mLabelNeedsRefresh(false), mLabelPaddingRight(DEFAULT_LABEL_PADDING_RIGHT), mParentFolder( NULL ), mIsSelected( FALSE ), @@ -181,11 +182,16 @@ LLFolderViewItem::~LLFolderViewItem() BOOL LLFolderViewItem::postBuild() { - refresh(); + LLFolderViewModelItem& vmi = *getViewModelItem(); + mLabel = vmi.getDisplayName(); // slightly expensive, but only first time + setToolTip(vmi.getName()); + + // Dirty the filter flag of the model from the view (CHUI-849) + mLabelNeedsRefresh = true; + mLabelWidthDirty = true; return TRUE; } - LLFolderView* LLFolderViewItem::getRoot() { return mRoot; @@ -282,22 +288,28 @@ void LLFolderViewItem::refresh() { LLFolderViewModelItem& vmi = *getViewModelItem(); + // getDisplayName() is slightly expensive on first run 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(); 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(); } - mLabelWidthDirty = true; // Dirty the filter flag of the model from the view (CHUI-849) vmi.dirtyFilter(); + mLabelWidthDirty = true; + mLabelNeedsRefresh = false; } // Utility function for LLFolderView @@ -348,6 +360,10 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height ) : 0; if (mLabelWidthDirty) { + if (mLabelNeedsRefresh) + { + refresh(); + } mLabelWidth = getLabelXPos() + getLabelFontForStyle(mLabelStyle)->getWidth(mLabel) + getLabelFontForStyle(mLabelStyle)->getWidth(mLabelSuffix) + mLabelPaddingRight; mLabelWidthDirty = false; } -- cgit v1.2.3 From 59433e3132b057003afcc1ba230ff16ffe62f92c Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 30 Apr 2020 16:28:40 +0300 Subject: SL-13119 Made control settings cached and fixed potential filtering issue --- indra/llui/llfolderviewitem.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) (limited to 'indra/llui/llfolderviewitem.cpp') diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index 9754192b06..863a72b6c0 100644 --- a/indra/llui/llfolderviewitem.cpp +++ b/indra/llui/llfolderviewitem.cpp @@ -183,10 +183,13 @@ LLFolderViewItem::~LLFolderViewItem() BOOL LLFolderViewItem::postBuild() { LLFolderViewModelItem& vmi = *getViewModelItem(); - mLabel = vmi.getDisplayName(); // slightly expensive, but only first time + // getDisplayName() is slightly expensive and requires a filter reset + mLabel = vmi.getDisplayName(); setToolTip(vmi.getName()); // Dirty the filter flag of the model from the view (CHUI-849) + vmi.dirtyFilter(); + mLabelNeedsRefresh = true; mLabelWidthDirty = true; return TRUE; @@ -288,10 +291,6 @@ void LLFolderViewItem::refresh() { LLFolderViewModelItem& vmi = *getViewModelItem(); - // getDisplayName() is slightly expensive on first run - mLabel = vmi.getDisplayName(); - setToolTip(vmi.getName()); - // icons are slightly expensive to get, can be optimized // see LLInventoryIcon::getIcon() mIcon = vmi.getIcon(); @@ -306,8 +305,6 @@ void LLFolderViewItem::refresh() mLabelSuffix = vmi.getLabelSuffix(); } - // Dirty the filter flag of the model from the view (CHUI-849) - vmi.dirtyFilter(); mLabelWidthDirty = true; mLabelNeedsRefresh = false; } @@ -362,6 +359,8 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height ) { if (mLabelNeedsRefresh) { + // Expensive. But despite refreshing label, + // it is purely visual, so it is fine to do at our laisure refresh(); } mLabelWidth = getLabelXPos() + getLabelFontForStyle(mLabelStyle)->getWidth(mLabel) + getLabelFontForStyle(mLabelStyle)->getWidth(mLabelSuffix) + mLabelPaddingRight; -- cgit v1.2.3 From 8576eaa3bf011bec4f7b64c82f962c26e067c52f Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 6 May 2020 23:52:38 +0300 Subject: SL-13119 Fixed label updates --- indra/llui/llfolderviewitem.cpp | 57 ++++++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 12 deletions(-) (limited to 'indra/llui/llfolderviewitem.cpp') diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index 863a72b6c0..1c6c7b1b35 100644 --- a/indra/llui/llfolderviewitem.cpp +++ b/indra/llui/llfolderviewitem.cpp @@ -122,7 +122,7 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p) : LLView(p), mLabelWidth(0), mLabelWidthDirty(false), - mLabelNeedsRefresh(false), + mSuffixNeedsRefresh(false), mLabelPaddingRight(DEFAULT_LABEL_PADDING_RIGHT), mParentFolder( NULL ), mIsSelected( FALSE ), @@ -183,14 +183,20 @@ LLFolderViewItem::~LLFolderViewItem() BOOL LLFolderViewItem::postBuild() { LLFolderViewModelItem& vmi = *getViewModelItem(); - // getDisplayName() is slightly expensive and requires a filter reset + // 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(); - mLabelNeedsRefresh = true; + // 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; } @@ -289,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(); + + 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(); + } + + // 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(); + mIcon = vmi->getIcon(); + mIconOpen = vmi->getIconOpen(); + mIconOverlay = vmi->getIconOverlay(); 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(); + mLabelStyle = vmi->getLabelStyle(); + mLabelSuffix = vmi->getLabelSuffix(); } mLabelWidthDirty = true; - mLabelNeedsRefresh = false; + mSuffixNeedsRefresh = false; } // Utility function for LLFolderView @@ -357,11 +390,11 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height ) : 0; if (mLabelWidthDirty) { - if (mLabelNeedsRefresh) + if (mSuffixNeedsRefresh) { // Expensive. But despite refreshing label, // it is purely visual, so it is fine to do at our laisure - refresh(); + refreshSuffix(); } mLabelWidth = getLabelXPos() + getLabelFontForStyle(mLabelStyle)->getWidth(mLabel) + getLabelFontForStyle(mLabelStyle)->getWidth(mLabelSuffix) + mLabelPaddingRight; mLabelWidthDirty = false; -- cgit v1.2.3