diff --git a/indra/newview/llbuildnewviewsscheduler.cpp b/indra/newview/llbuildnewviewsscheduler.cpp new file mode 100644 index 000000000..c7dbceb25 --- /dev/null +++ b/indra/newview/llbuildnewviewsscheduler.cpp @@ -0,0 +1,140 @@ +// +#include "llviewerprecompiledheaders.h" +#include "llbuildnewviewsscheduler.h" +#include "llinventorybridge.h" +#define BUILD_DELAY 0.1f +#define BUILD_PER_DELAY 512 +std::list LLBuildNewViewsScheduler::sJobs; +LLBuildNewViewsScheduler::LLBuildNewViewsScheduler() : LLEventTimer(BUILD_DELAY) +{ +} +void LLBuildNewViewsScheduler::addJob(LLInventoryPanel* inventory_panel, LLInventoryObject* inventory_object) +{ + LLBuildNewViewsScheduler::job j; + j.mInventoryPanel = inventory_panel; + j.mInventoryObject = inventory_object; + sJobs.push_back(j); +} +void LLBuildNewViewsScheduler::cancel(LLInventoryPanel* inventory_panel) +{ + for(std::list::iterator iter = sJobs.begin(); + iter != sJobs.end(); ) + { + LLInventoryPanel* job_panel = (*iter).mInventoryPanel; + if(job_panel == inventory_panel) + { + iter = sJobs.erase(iter); + } + else + { + ++iter; + } + } +} +BOOL LLBuildNewViewsScheduler::tick() +{ + U32 i = 0; + while(!sJobs.empty() && (i < BUILD_PER_DELAY)) + { + LLBuildNewViewsScheduler::job j = sJobs.front(); + buildNewViews(j.mInventoryPanel, j.mInventoryObject); + sJobs.pop_front(); + ++i; + } + return FALSE; +} +void LLBuildNewViewsScheduler::buildNewViews(LLInventoryPanel* panelp, LLInventoryObject* objectp) +{ + LLFolderViewItem* itemp = NULL; + + if (objectp) + { + if (objectp->getType() <= LLAssetType::AT_NONE || + objectp->getType() >= LLAssetType::AT_COUNT) + { + llwarns << "called with objectp->mType == " + << ((S32) objectp->getType()) + << " (shouldn't happen)" << llendl; + } + else if (objectp->getType() == LLAssetType::AT_CATEGORY) // build new view for category + { + LLInvFVBridge* new_listener = LLInvFVBridge::createBridge(objectp->getType(), + LLInventoryType::IT_CATEGORY, + panelp, + objectp->getUUID()); + + if (new_listener) + { + LLFolderViewFolder* folderp = new LLFolderViewFolder(new_listener->getDisplayName(), + new_listener->getIcon(), + panelp->getRootFolder(), + new_listener); + + folderp->setItemSortOrder(panelp->getSortOrder()); + itemp = folderp; + } + } + else // build new view for item + { + LLInventoryItem* item = (LLInventoryItem*)objectp; + LLInvFVBridge* new_listener = LLInvFVBridge::createBridge( + item->getType(), + item->getInventoryType(), + panelp, + item->getUUID(), + item->getFlags()); + if (new_listener) + { + itemp = new LLFolderViewItem(new_listener->getDisplayName(), + new_listener->getIcon(), + new_listener->getCreationDate(), + panelp->getRootFolder(), + new_listener); + } + } + + LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)panelp->getRootFolder()->getItemByID(objectp->getParentUUID()); + + if (itemp) + { + itemp->mDelayedDelete = TRUE; + if (parent_folder) + { + itemp->addToFolder(parent_folder, panelp->getRootFolder()); + } + else + { + llwarns << "Couldn't find parent folder for child " << itemp->getLabel() << llendl; + delete itemp; + } + } + } + + if (!objectp || (objectp && (objectp->getType() == LLAssetType::AT_CATEGORY))) + { + LLViewerInventoryCategory::cat_array_t* categories; + LLViewerInventoryItem::item_array_t* items; + + panelp->getModel()->lockDirectDescendentArrays((objectp != NULL) ? objectp->getUUID() : LLUUID::null, categories, items); + if(categories) + { + S32 count = categories->count(); + for(S32 i = 0; i < count; ++i) + { + LLInventoryCategory* cat = categories->get(i); + addJob(panelp, cat); + } + } + if(items) + { + S32 count = items->count(); + for(S32 i = 0; i < count; ++i) + { + LLInventoryItem* item = items->get(i); + addJob(panelp, item); + } + } + panelp->getModel()->unlockDirectDescendentArrays(objectp->getUUID()); + } +} +// diff --git a/indra/newview/llbuildnewviewsscheduler.h b/indra/newview/llbuildnewviewsscheduler.h new file mode 100644 index 000000000..e6720f37c --- /dev/null +++ b/indra/newview/llbuildnewviewsscheduler.h @@ -0,0 +1,21 @@ +// +#include "llinventoryview.h" +#include "llinventory.h" +class LLBuildNewViewsScheduler : public LLEventTimer +{ + typedef struct + { + LLInventoryPanel* mInventoryPanel; + LLInventoryObject* mInventoryObject; + } job; +public: + LLBuildNewViewsScheduler(); + void addJob(LLInventoryPanel* inventory_panel, LLInventoryObject* inventory_object); + void cancel(LLInventoryPanel* inventory_panel); + BOOL tick(); +private: + static std::list sJobs; + void buildNewViews(LLInventoryPanel* panelp, LLInventoryObject* objectp); +}; +static LLBuildNewViewsScheduler* gBuildNewViewsScheduler; +//