summaryrefslogtreecommitdiff
path: root/indra/llui
diff options
context:
space:
mode:
authorAndrey Kleshchev <andreykproductengine@lindenlab.com>2024-04-29 22:07:12 +0300
committerAndrey Kleshchev <andreykproductengine@lindenlab.com>2024-04-29 22:43:24 +0300
commit2add3b49537fb041b880752dc5302ac6b317e601 (patch)
tree0321f7dee151d92ac2eda0e8a76f0ced1f99dd8f /indra/llui
parenta0c4d81080fbc4b5326e6b598e5df27e01631d48 (diff)
viewer#1300 'Star' favorites in inventory #3
Diffstat (limited to 'indra/llui')
-rw-r--r--indra/llui/llfolderviewitem.cpp118
-rw-r--r--indra/llui/llfolderviewitem.h7
-rw-r--r--indra/llui/llfolderviewmodel.h3
3 files changed, 93 insertions, 35 deletions
diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp
index be703a1e9a..2accec7a68 100644
--- a/indra/llui/llfolderviewitem.cpp
+++ b/indra/llui/llfolderviewitem.cpp
@@ -199,7 +199,6 @@ BOOL LLFolderViewItem::postBuild()
// it also sets search strings so it requires a filter reset
mLabel = vmi->getDisplayName();
mIsFavorite = vmi->isFavorite();
- mHasFavorites = vmi->hasFavorites();
setToolTip(vmi->getName());
// Dirty the filter flag of the model from the view (CHUI-849)
@@ -314,7 +313,6 @@ void LLFolderViewItem::refresh()
mLabel = vmi.getDisplayName();
mIsFavorite = vmi.isFavorite();
- mHasFavorites = vmi.hasFavorites();
setToolTip(vmi.getName());
// icons are slightly expensive to get, can be optimized
// see LLInventoryIcon::getIcon()
@@ -348,7 +346,6 @@ void LLFolderViewItem::refreshSuffix()
mIconOverlay = vmi->getIconOverlay();
mIsFavorite = vmi->isFavorite();
- mHasFavorites = vmi->hasFavorites();
if (mRoot->useLabelSuffix())
{
@@ -1116,7 +1113,8 @@ LLFolderViewFolder::LLFolderViewFolder( const LLFolderViewItem::Params& p ):
mIsFolderComplete(false), // folder might have children that are not loaded yet.
mAreChildrenInited(false), // folder might have children that are not built yet.
mLastArrangeGeneration( -1 ),
- mLastCalculatedWidth(0)
+ mLastCalculatedWidth(0),
+ mFavoritesDirtyFlags(0)
{
}
@@ -1142,6 +1140,11 @@ LLFolderViewFolder::~LLFolderViewFolder( void )
// The LLView base class takes care of object destruction. make sure that we
// don't have mouse or keyboard focus
gFocusMgr.releaseFocusIfNeeded( this ); // calls onCommit()
+
+ if (mFavoritesDirtyFlags)
+ {
+ gIdleCallbacks.deleteFunction(&LLFolderViewFolder::onIdleUpdateFavorites, this);
+ }
}
// addToFolder() returns TRUE if it succeeds. FALSE otherwise
@@ -1785,60 +1788,109 @@ BOOL LLFolderViewFolder::isMovable()
void LLFolderViewFolder::updateHasFavorites(bool new_childs_value)
{
- if (mHasFavorites != new_childs_value)
+ if (mFavoritesDirtyFlags == 0)
+ {
+ gIdleCallbacks.addFunction(&LLFolderViewFolder::onIdleUpdateFavorites, this);
+ }
+ if (new_childs_value)
+ {
+ mFavoritesDirtyFlags |= FAVORITE_ADDED;
+ }
+ else
+ {
+ mFavoritesDirtyFlags |= FAVORITE_REMOVED;
+ }
+}
+
+void LLFolderViewFolder::onIdleUpdateFavorites(void* data)
+{
+ LLFolderViewFolder* self = reinterpret_cast<LLFolderViewFolder*>(data);
+ if (self->mFavoritesDirtyFlags == 0)
{
- if (new_childs_value)
+ LL_WARNS() << "Called onIdleUpdateFavorites without dirty flags set" << LL_ENDL;
+ gIdleCallbacks.addFunction(&LLFolderViewFolder::onIdleUpdateFavorites, self);
+ return;
+ }
+
+ if (self->getViewModelItem()->isItemInTrash())
+ {
+ // do not display favorite-stars in trash
+ self->mFavoritesDirtyFlags = 0;
+ gIdleCallbacks.addFunction(&LLFolderViewFolder::onIdleUpdateFavorites, self);
+ return;
+ }
+
+ LLFolderViewFolder* root_folder = self->getRoot();
+ if (self->mFavoritesDirtyFlags == FAVORITE_ADDED)
+ {
+ if (!self->mHasFavorites)
{
- mHasFavorites = new_childs_value;
- // propagate up to root
- LLFolderViewFolder* parent = getParentFolder();
- while (parent && !parent->hasFavorites())
+ // propagate up, exclude root
+ LLFolderViewFolder* parent = self;
+ while (parent && !parent->hasFavorites() && root_folder != parent)
{
parent->setHasFavorites(true);
parent = parent->getParentFolder();
}
}
- else
+ }
+ else if (self->mFavoritesDirtyFlags > FAVORITE_ADDED)
+ {
+ // full check
+ LLFolderViewFolder* parent = self;
+ while (parent && root_folder != parent)
{
- LLFolderViewFolder* parent = this;
- while (parent)
+ bool has_favorites = false;
+ for (items_t::iterator iter = parent->mItems.begin();
+ iter != parent->mItems.end();)
{
- bool has_favorites = false;
- for (items_t::iterator iter = parent->mItems.begin();
- iter != parent->mItems.end();)
+ items_t::iterator iit = iter++;
+ if ((*iit)->isFavorite())
{
- items_t::iterator iit = iter++;
- if ((*iit)->isFavorite())
- {
- has_favorites = true;
- break;
- }
+ has_favorites = true;
+ break;
}
+ }
- for (folders_t::iterator iter = parent->mFolders.begin();
- iter != parent->mFolders.end() && !has_favorites;)
+ for (folders_t::iterator iter = parent->mFolders.begin();
+ iter != parent->mFolders.end() && !has_favorites;)
+ {
+ folders_t::iterator fit = iter++;
+ if ((*fit)->isFavorite() || (*fit)->hasFavorites())
{
- folders_t::iterator fit = iter++;
- if ((*fit)->isFavorite() || (*fit)->hasFavorites())
- {
- has_favorites = true;
- break;
- }
+ has_favorites = true;
+ break;
}
+ }
- if (!has_favorites)
+ if (!has_favorites)
+ {
+ if (parent->hasFavorites())
{
- parent->mHasFavorites = false;
parent->setHasFavorites(false);
}
else
{
+ // Nothing changed
break;
}
- parent = parent->getParentFolder();
}
+ else
+ {
+ // propagate up, exclude root
+ while (parent && !parent->hasFavorites() && root_folder != parent)
+ {
+ parent->setHasFavorites(true);
+ parent = parent->getParentFolder();
+ }
+ break;
+ }
+ parent = parent->getParentFolder();
}
}
+
+ self->mFavoritesDirtyFlags = 0;
+ gIdleCallbacks.addFunction(&LLFolderViewFolder::onIdleUpdateFavorites, self);
}
diff --git a/indra/llui/llfolderviewitem.h b/indra/llui/llfolderviewitem.h
index 5905516023..fc19514615 100644
--- a/indra/llui/llfolderviewitem.h
+++ b/indra/llui/llfolderviewitem.h
@@ -402,6 +402,13 @@ public:
bool hasFavorites() const { return mHasFavorites; }
void setHasFavorites(bool val) { mHasFavorites = val; }
void updateHasFavorites(bool new_childs_value);
+private:
+ static void onIdleUpdateFavorites(void* data);
+
+ constexpr static S32 FAVORITE_ADDED = 1;
+ constexpr static S32 FAVORITE_REMOVED = 2;
+ S32 mFavoritesDirtyFlags { 0 };
+public:
// destroys this folder, and all children
virtual void destroyView();
diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h
index 9d46334fc4..152801ec69 100644
--- a/indra/llui/llfolderviewmodel.h
+++ b/indra/llui/llfolderviewmodel.h
@@ -163,8 +163,6 @@ public:
virtual void navigateToFolder(bool new_window = false, bool change_mode = false) = 0;
virtual bool isFavorite() const = 0;
- virtual bool hasFavorites() const = 0;
- virtual void setHasFavorites(bool val) = 0;
virtual BOOL isItemWearable() const { return FALSE; }
virtual BOOL isItemRenameable() const = 0;
@@ -174,6 +172,7 @@ public:
virtual void move( LLFolderViewModelItem* parent_listener ) = 0;
virtual BOOL isItemRemovable( void ) const = 0; // Can be destroyed
+ virtual BOOL isItemInTrash(void) const = 0;
virtual BOOL removeItem() = 0;
virtual void removeBatch(std::vector<LLFolderViewModelItem*>& batch) = 0;