diff options
| -rw-r--r-- | indra/newview/llinventorygallery.cpp | 52 | ||||
| -rw-r--r-- | indra/newview/llinventorygallery.h | 6 | 
2 files changed, 38 insertions, 20 deletions
diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index fe9605daa8..083dfdc65e 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -219,6 +219,7 @@ void LLInventoryGallery::updateRootFolder()          {              updateRemovedItem(mHiddenItems[i]->getUUID());          } +        mItemBuildQuery.clear();          if (gInventory.containsObserver(mCategoriesObserver))          { @@ -262,16 +263,15 @@ void LLInventoryGallery::updateRootFolder()              iter != cat_array->end();              iter++)          { -            updateAddedItem((*iter)->getUUID()); +            mItemBuildQuery.insert((*iter)->getUUID());          }          for (LLInventoryModel::item_array_t::const_iterator iter = item_array->begin();              iter != item_array->end();              iter++)          { -            updateAddedItem((*iter)->getUUID()); +            mItemBuildQuery.insert((*iter)->getUUID());          } -        reArrangeRows();          mIsInitialized = true;          mRootDirty = false; @@ -287,6 +287,11 @@ void LLInventoryGallery::updateRootFolder()      {          initGallery();      } + +    if (!mItemBuildQuery.empty()) +    { +        gIdleCallbacks.addFunction(onIdle, (void*)this); +    }  }  void LLInventoryGallery::initGallery() @@ -640,12 +645,14 @@ void LLInventoryGallery::setFilterSubString(const std::string& string)      //reArrangeRows();  } -void LLInventoryGallery::applyFilter(LLInventoryGalleryItem* item, const std::string& filter_substring) +bool LLInventoryGallery::applyFilter(LLInventoryGalleryItem* item, const std::string& filter_substring)  {      if(item)      {          item->setHidden(!checkAgainstFilters(item, filter_substring)); +        return false;      } +    return true;  }  bool LLInventoryGallery::checkAgainstFilters(LLInventoryGalleryItem* item, const std::string& filter_substring) @@ -724,6 +731,21 @@ void LLInventoryGallery::onIdle(void* userdata)          return;      } +    const F64 MAX_TIME_VISIBLE = 0.020f; +    const F64 MAX_TIME_HIDDEN = 0.001f; // take it slow +    const F64 max_time = self->getVisible() ? MAX_TIME_VISIBLE : MAX_TIME_HIDDEN; +    F64 curent_time = LLTimer::getTotalSeconds(); +    const F64 end_time = curent_time + max_time; + +    while (!self->mItemBuildQuery.empty() && end_time > curent_time) +    { +        uuid_set_t::iterator iter = self->mItemBuildQuery.begin(); +        LLUUID item_id = *iter; +        self->mNeedsArrange |= self->updateAddedItem(item_id); +        self->mItemBuildQuery.erase(iter); +        curent_time = LLTimer::getTotalSeconds(); +    } +      if (self->mNeedsArrange)      {          self->mNeedsArrange = false; @@ -737,7 +759,7 @@ void LLInventoryGallery::onIdle(void* userdata)          self->changeItemSelection(item_to_select, true);      } -    if (self->mItemToSelect.isNull()) +    if (self->mItemToSelect.isNull() && self->mItemBuildQuery.empty())      {          gIdleCallbacks.deleteFunction(onIdle, (void*)self);      } @@ -768,13 +790,13 @@ void LLInventoryGallery::getCurrentCategories(uuid_vec_t& vcur)      }  } -void LLInventoryGallery::updateAddedItem(LLUUID item_id) +bool LLInventoryGallery::updateAddedItem(LLUUID item_id)  {      LLInventoryObject* obj = gInventory.getObject(item_id);      if (!obj)      {          LL_WARNS("InventoryGallery") << "Failed to find item: " << item_id << LL_ENDL; -        return; +        return false;      }      std::string name = obj->getName(); @@ -805,18 +827,20 @@ void LLInventoryGallery::updateAddedItem(LLUUID item_id)          }      } +    bool res = false;      LLInventoryGalleryItem* item = buildGalleryItem(name, item_id, obj->getType(), thumbnail_id, inventory_type, misc_flags, obj->getIsLinkType(), is_worn);      mItemMap.insert(LLInventoryGallery::gallery_item_map_t::value_type(item_id, item));      item->setRightMouseDownCallback(boost::bind(&LLInventoryGallery::showContextMenu, this, _1, _2, _3, item_id));      item->setFocusReceivedCallback(boost::bind(&LLInventoryGallery::changeItemSelection, this, item_id, false));      if (mGalleryCreated)      { -        applyFilter(item, mFilterSubString); +        res = applyFilter(item, mFilterSubString);          addToGallery(item);      }      mThumbnailsObserver->addItem(item_id,          boost::bind(&LLInventoryGallery::updateItemThumbnail, this, item_id)); +    return res;  }  void LLInventoryGallery::updateRemovedItem(LLUUID item_id) @@ -838,6 +862,8 @@ void LLInventoryGallery::updateRemovedItem(LLUUID item_id)              item->die();          }      } + +    mItemBuildQuery.erase(item_id);  }  void LLInventoryGallery::updateChangedItemName(LLUUID item_id, std::string name) @@ -893,15 +919,6 @@ void LLInventoryGallery::updateItemThumbnail(LLUUID item_id)      }  } -void LLInventoryGallery::onThumbnailAdded(LLUUID item_id) -{ -    if((mItemMap.count(item_id) == 0) && mFilter->checkAgainstFilterThumbnails(item_id)) -    { -        updateAddedItem(item_id); -        reArrangeRows(); -    } -} -  BOOL LLInventoryGallery::handleRightMouseDown(S32 x, S32 y, MASK mask)  {      LLUUID old_selection = mSelectedItemID; @@ -1666,6 +1683,7 @@ void LLInventoryGallery::computeDifference(      uuid_vec_t vcur;      getCurrentCategories(vcur); +    std::copy(mItemBuildQuery.begin(), mItemBuildQuery.end(), std::back_inserter(vcur));      LLCommonUtils::computeDifference(vnew, vcur, vadded, vremoved);  } diff --git a/indra/newview/llinventorygallery.h b/indra/newview/llinventorygallery.h index 8519ee0731..66cffccebc 100644 --- a/indra/newview/llinventorygallery.h +++ b/indra/newview/llinventorygallery.h @@ -92,11 +92,10 @@ public:      bool checkAgainstFilterType(const LLUUID& object_id);      void getCurrentCategories(uuid_vec_t& vcur); -    void updateAddedItem(LLUUID item_id); +    bool updateAddedItem(LLUUID item_id); // returns true if added item is visible      void updateRemovedItem(LLUUID item_id);      void updateChangedItemName(LLUUID item_id, std::string name);      void updateItemThumbnail(LLUUID item_id); -    void onThumbnailAdded(LLUUID item_id);      void updateWornItem(LLUUID item_id, bool is_worn);      void updateMessageVisibility(); @@ -167,7 +166,7 @@ protected:      void showContextMenu(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& item_id); -    void applyFilter(LLInventoryGalleryItem* item, const std::string& filter_substring); +    bool applyFilter(LLInventoryGalleryItem* item, const std::string& filter_substring);      bool checkAgainstFilters(LLInventoryGalleryItem* item, const std::string& filter_substring);      static void onIdle(void* userdata);      void dirtyRootFolder(); @@ -247,6 +246,7 @@ private:      gallery_item_map_t mItemMap;      uuid_vec_t mCOFLinkedItems;      uuid_vec_t mActiveGestures; +    uuid_set_t mItemBuildQuery;      std::map<LLInventoryGalleryItem*, S32> mItemIndexMap;      std::map<S32, LLInventoryGalleryItem*> mIndexToItemMap;  | 
