From 0b104e2a418dc794ce7230ab30f472d1787cd9c4 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 12 Nov 2009 15:10:06 -0500 Subject: LLAppearanceManager cleanup - turning into proper singleton --HG-- branch : avatar-pipeline --- indra/newview/llappearancemgr.cpp | 84 +++++++++++++++------------------------ 1 file changed, 33 insertions(+), 51 deletions(-) (limited to 'indra/newview/llappearancemgr.cpp') diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 0901289dac..5f2d22d78c 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -72,7 +72,7 @@ protected: // If the inventory callback manager goes away, we're shutting down, no longer want the callback. if( LLInventoryCallbackManager::is_instantiated() ) { - LLAppearanceManager::wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend); + LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend); } else { @@ -171,7 +171,7 @@ void LLOutfitObserver::done() else { // Wear the inventory category. - LLAppearanceManager::wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend); + LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend); } } @@ -251,7 +251,7 @@ public: virtual ~LLUpdateAppearanceOnDestroy() { - LLAppearanceManager::updateAppearanceFromCOF(); + LLAppearanceManager::instance().updateAppearanceFromCOF(); } /* virtual */ void fire(const LLUUID& inv_item) @@ -296,7 +296,7 @@ struct LLWearableHoldingPattern bool append; }; -/* static */ void removeDuplicateItems(LLInventoryModel::item_array_t& items) +static void removeDuplicateItems(LLInventoryModel::item_array_t& items) { LLInventoryModel::item_array_t new_items; std::set items_seen; @@ -323,7 +323,7 @@ struct LLWearableHoldingPattern items = new_items; } -void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventoryModel::item_array_t& src) +static void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventoryModel::item_array_t& src) { LLInventoryModel::item_array_t new_dst; std::set mark_inventory; @@ -361,25 +361,23 @@ void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventory dst = new_dst; } -/* static */ LLUUID LLAppearanceManager::getCOF() { return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); } // Update appearance from outfit folder. -/* static */ void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, bool append) { if (!proceed) return; #if 1 - updateCOF(category,append); + LLAppearanceManager::instance().updateCOF(category,append); #else if (append) { - updateCOFFromCategory(category, append); // append is true - add non-duplicates to COF. + LLAppearanceManager::instance().updateCOFFromCategory(category, append); // append is true - add non-duplicates to COF. } else { @@ -387,18 +385,17 @@ void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, boo if (catp->getPreferredType() == LLFolderType::FT_NONE || LLFolderType::lookupIsEnsembleType(catp->getPreferredType())) { - updateCOFFromCategory(category, append); // append is false - rebuild COF. + LLAppearanceManager::instance().updateCOFFromCategory(category, append); // append is false - rebuild COF. } else if (catp->getPreferredType() == LLFolderType::FT_OUTFIT) { - rebuildCOFFromOutfit(category); + LLAppearanceManager::instance().rebuildCOFFromOutfit(category); } } #endif } // Append to current COF contents by recursively traversing a folder. -/* static */ void LLAppearanceManager::updateCOFFromCategory(const LLUUID& category, bool append) { // BAP consolidate into one "get all 3 types of descendents" function, use both places. @@ -491,7 +488,6 @@ void LLAppearanceManager::updateCOFFromCategory(const LLUUID& category, bool app } } -/* static */ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id, LLPointer cb) { @@ -535,7 +531,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID } } } -/* static */ void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links) +void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links) { LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; @@ -552,7 +548,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID // Keep the last N wearables of each type. For viewer 2.0, N is 1 for // both body parts and clothing items. -/* static */ void LLAppearanceManager::filterWearableItems( +void LLAppearanceManager::filterWearableItems( LLInventoryModel::item_array_t& items, S32 max_per_type) { // Divvy items into arrays by wearable type. @@ -583,8 +579,8 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID } // Create links to all listed items. -/* static */ void LLAppearanceManager::linkAll(const LLUUID& category, - LLInventoryModel::item_array_t& items, +void LLAppearanceManager::linkAll(const LLUUID& category, + LLInventoryModel::item_array_t& items, LLPointer cb) { for (S32 i=0; i& types_found) { LLInventoryModel::cat_array_t new_cats; @@ -693,7 +687,6 @@ void LLAppearanceManager::checkMandatoryWearableTypes(const LLUUID& category, st // with contents of new category. This means preserving any mandatory // body parts that aren't present in the new category, and getting rid // of everything else. -/* static */ void LLAppearanceManager::purgeCOFBeforeRebuild(const LLUUID& category) { // See which mandatory body types are present in the new category. @@ -726,7 +719,6 @@ void LLAppearanceManager::purgeCOFBeforeRebuild(const LLUUID& category) } // Replace COF contents from a given outfit folder. -/* static */ void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category) { lldebugs << "rebuildCOFFromOutfit()" << llendl; @@ -790,11 +782,10 @@ void LLAppearanceManager::onWearableAssetFetch(LLWearable* wearable, void* data) holder->mResolved += 1; if(holder->mResolved >= (S32)holder->mFoundList.size()) { - LLAppearanceManager::updateAgentWearables(holder, append); + LLAppearanceManager::instance().updateAgentWearables(holder, append); } } -/* static */ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, bool append) { lldebugs << "updateAgentWearables()" << llendl; @@ -835,7 +826,6 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, // dec_busy_count(); } -/* static */ void LLAppearanceManager::updateAppearanceFromCOF() { dumpCat(getCOF(),"COF, start"); @@ -916,7 +906,6 @@ void LLAppearanceManager::updateAppearanceFromCOF() } } -/* static */ void LLAppearanceManager::getCOFValidDescendents(const LLUUID& category, LLInventoryModel::item_array_t& items) { @@ -931,7 +920,6 @@ void LLAppearanceManager::getCOFValidDescendents(const LLUUID& category, follow_folder_links); } -/* static */ void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category, LLInventoryModel::item_array_t& items, LLAssetType::EType type, @@ -947,7 +935,6 @@ void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category, follow_folder_links); } -/* static */ void LLAppearanceManager::getUserDescendents(const LLUUID& category, LLInventoryModel::item_array_t& wear_items, LLInventoryModel::item_array_t& obj_items, @@ -1011,7 +998,6 @@ void LLAppearanceManager::wearInventoryCategory(LLInventoryCategory* category, b } // *NOTE: hack to get from avatar inventory to avatar -/* static */ void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* category, bool append ) { // Avoid unintentionally overwriting old wearables. We have to do @@ -1031,7 +1017,6 @@ void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* ca } } -/* static */ void LLAppearanceManager::wearOutfitByName(const std::string& name) { llinfos << "Wearing category " << name << llendl; @@ -1084,7 +1069,7 @@ bool areMatchingWearables(const LLViewerInventoryItem *a, const LLViewerInventor return (a->isWearableType() && b->isWearableType() && (a->getWearableType() == b->getWearableType())); } -/* static */ + void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update ) { LLViewerInventoryItem *vitem = dynamic_cast(item); @@ -1138,7 +1123,6 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update ) return; } -/* static */ void LLAppearanceManager::wearEnsemble( LLInventoryCategory* cat, bool do_update ) { #if SUPPORT_ENSEMBLES @@ -1153,7 +1137,6 @@ void LLAppearanceManager::wearEnsemble( LLInventoryCategory* cat, bool do_update #endif } -/* static */ void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update) { LLInventoryModel::cat_array_t cat_array; @@ -1178,7 +1161,6 @@ void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update) //#define DUMP_CAT_VERBOSE -/* static */ void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg) { LLInventoryModel::cat_array_t cats; @@ -1200,7 +1182,6 @@ void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg) llinfos << msg << " count " << items.count() << llendl; } -/* static */ void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& items, const std::string& msg) { @@ -1213,15 +1194,19 @@ void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& it llinfos << llendl; } +LLAppearanceManager::LLAppearanceManager(): + mAttachmentInvLinkEnabled(false) +{ +} -std::set LLAppearanceManager::sRegisteredAttachments; -bool LLAppearanceManager::sAttachmentInvLinkEnabled(false); +LLAppearanceManager::~LLAppearanceManager() +{ +} -/* static */ void LLAppearanceManager::setAttachmentInvLinkEnable(bool val) { llinfos << "setAttachmentInvLinkEnable => " << (int) val << llendl; - sAttachmentInvLinkEnabled = val; + mAttachmentInvLinkEnabled = val; } void dumpAttachmentSet(const std::set& atts, const std::string& msg) @@ -1241,13 +1226,12 @@ void dumpAttachmentSet(const std::set& atts, const std::string& msg) llinfos << llendl; } -/* static */ void LLAppearanceManager::registerAttachment(const LLUUID& item_id) { - sRegisteredAttachments.insert(item_id); - //dumpAttachmentSet(sRegisteredAttachments,"after register:"); + mRegisteredAttachments.insert(item_id); + //dumpAttachmentSet(mRegisteredAttachments,"after register:"); - if (sAttachmentInvLinkEnabled) + if (mAttachmentInvLinkEnabled) { LLViewerInventoryItem *item = gInventory.getItem(item_id); if (item) @@ -1264,13 +1248,12 @@ void LLAppearanceManager::registerAttachment(const LLUUID& item_id) } } -/* static */ void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id) { - sRegisteredAttachments.erase(item_id); - //dumpAttachmentSet(sRegisteredAttachments,"after unregister:"); + mRegisteredAttachments.erase(item_id); + //dumpAttachmentSet(mRegisteredAttachments,"after unregister:"); - if (sAttachmentInvLinkEnabled) + if (mAttachmentInvLinkEnabled) { //LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:"); LLAppearanceManager::removeItemLinks(item_id, false); @@ -1284,11 +1267,10 @@ void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id) } } -/* static */ void LLAppearanceManager::linkRegisteredAttachments() { - for (std::set::iterator it = sRegisteredAttachments.begin(); - it != sRegisteredAttachments.end(); + for (std::set::iterator it = mRegisteredAttachments.begin(); + it != mRegisteredAttachments.end(); ++it) { LLUUID item_id = *it; @@ -1300,5 +1282,5 @@ void LLAppearanceManager::linkRegisteredAttachments() gInventory.notifyObservers(); } } - sRegisteredAttachments.clear(); + mRegisteredAttachments.clear(); } -- cgit v1.3 From 315af3fb82574698078dce00236e2778d6ce9730 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 12 Nov 2009 16:03:59 -0500 Subject: LLAppearanceManager cleanup - no static at all --HG-- branch : avatar-pipeline --- indra/newview/llappearancemgr.cpp | 57 ++++++++++++++++++++------------------- indra/newview/llappearancemgr.h | 7 ++--- 2 files changed, 31 insertions(+), 33 deletions(-) (limited to 'indra/newview/llappearancemgr.cpp') diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 5f2d22d78c..9301a47e6e 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -361,6 +361,31 @@ static void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLIn dst = new_dst; } +static void onWearableAssetFetch(LLWearable* wearable, void* data) +{ + LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data; + bool append = holder->append; + + if(wearable) + { + for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin(); + iter != holder->mFoundList.end(); ++iter) + { + LLFoundData* data = *iter; + if(wearable->getAssetID() == data->mAssetID) + { + data->mWearable = wearable; + break; + } + } + } + holder->mResolved += 1; + if(holder->mResolved >= (S32)holder->mFoundList.size()) + { + LLAppearanceManager::instance().updateAgentWearables(holder, append); + } +} + LLUUID LLAppearanceManager::getCOF() { return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); @@ -760,32 +785,6 @@ void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category) } } -/* static */ -void LLAppearanceManager::onWearableAssetFetch(LLWearable* wearable, void* data) -{ - LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data; - bool append = holder->append; - - if(wearable) - { - for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin(); - iter != holder->mFoundList.end(); ++iter) - { - LLFoundData* data = *iter; - if(wearable->getAssetID() == data->mAssetID) - { - data->mWearable = wearable; - break; - } - } - } - holder->mResolved += 1; - if(holder->mResolved >= (S32)holder->mFoundList.size()) - { - LLAppearanceManager::instance().updateAgentWearables(holder, append); - } -} - void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, bool append) { lldebugs << "updateAgentWearables()" << llendl; @@ -893,7 +892,7 @@ void LLAppearanceManager::updateAppearanceFromCOF() LLWearableList::instance().getAsset(found->mAssetID, found->mName, found->mAssetType, - LLAppearanceManager::onWearableAssetFetch, + onWearableAssetFetch, (void*)holder); } } @@ -1009,7 +1008,9 @@ void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* ca if( gFloaterCustomize ) { - gFloaterCustomize->askToSaveIfDirty(boost::bind(LLAppearanceManager::changeOutfit, _1, category->getUUID(), append)); + gFloaterCustomize->askToSaveIfDirty(boost::bind(&LLAppearanceManager::changeOutfit, + &LLAppearanceManager::instance(), + _1, category->getUUID(), append)); } else { diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index b0ecb2e23e..4401596e2c 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -55,6 +55,7 @@ public: void wearOutfitByName(const std::string& name); void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id, LLPointer cb); + void changeOutfit(bool proceed, const LLUUID& category, bool append); // Add COF link to individual item. void wearItem(LLInventoryItem* item, bool do_update = true); @@ -73,6 +74,7 @@ public: void registerAttachment(const LLUUID& item_id); void setAttachmentInvLinkEnable(bool val); void linkRegisteredAttachments(); + void updateAgentWearables(LLWearableHoldingPattern* holder, bool append); protected: LLAppearanceManager(); @@ -98,7 +100,6 @@ private: LLInventoryModel::item_array_t& obj_items, LLInventoryModel::item_array_t& gest_items, bool follow_folder_links); - void updateAgentWearables(LLWearableHoldingPattern* holder, bool append); bool isMandatoryWearableType(EWearableType type); void checkMandatoryWearableTypes(const LLUUID& category, std::set& types_found); void purgeCOFBeforeRebuild(const LLUUID& category); @@ -106,10 +107,6 @@ private: std::set mRegisteredAttachments; bool mAttachmentInvLinkEnabled; - - // Static callbacks - static void onWearableAssetFetch(LLWearable* wearable, void* data); - static void changeOutfit(bool proceed, const LLUUID& category, bool append); }; #define SUPPORT_ENSEMBLES 0 -- cgit v1.3 From 56df94412b230d6cec7d253cc431e3a97d008f67 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 12 Nov 2009 17:20:53 -0500 Subject: LLAppearanceManager cleanup - removed dead code --HG-- branch : avatar-pipeline --- indra/newview/llappearancemgr.cpp | 233 +------------------------------------- indra/newview/llappearancemgr.h | 22 ++-- 2 files changed, 12 insertions(+), 243 deletions(-) (limited to 'indra/newview/llappearancemgr.cpp') diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 9301a47e6e..456eaa43c6 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -396,121 +396,7 @@ void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, boo { if (!proceed) return; - -#if 1 LLAppearanceManager::instance().updateCOF(category,append); -#else - if (append) - { - LLAppearanceManager::instance().updateCOFFromCategory(category, append); // append is true - add non-duplicates to COF. - } - else - { - LLViewerInventoryCategory* catp = gInventory.getCategory(category); - if (catp->getPreferredType() == LLFolderType::FT_NONE || - LLFolderType::lookupIsEnsembleType(catp->getPreferredType())) - { - LLAppearanceManager::instance().updateCOFFromCategory(category, append); // append is false - rebuild COF. - } - else if (catp->getPreferredType() == LLFolderType::FT_OUTFIT) - { - LLAppearanceManager::instance().rebuildCOFFromOutfit(category); - } - } -#endif -} - -// Append to current COF contents by recursively traversing a folder. -void LLAppearanceManager::updateCOFFromCategory(const LLUUID& category, bool append) -{ - // BAP consolidate into one "get all 3 types of descendents" function, use both places. - LLInventoryModel::item_array_t wear_items; - LLInventoryModel::item_array_t obj_items; - LLInventoryModel::item_array_t gest_items; - bool follow_folder_links = false; - getUserDescendents(category, wear_items, obj_items, gest_items, follow_folder_links); - - // Find all the wearables that are in the category's subtree. - lldebugs << "appendCOFFromCategory()" << llendl; - if( !wear_items.count() && !obj_items.count() && !gest_items.count()) - { - LLNotifications::instance().add("CouldNotPutOnOutfit"); - return; - } - - const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); - // Processes that take time should show the busy cursor - //inc_busy_count(); - - LLInventoryModel::cat_array_t cof_cats; - LLInventoryModel::item_array_t cof_items; - gInventory.collectDescendents(current_outfit_id, cof_cats, cof_items, - LLInventoryModel::EXCLUDE_TRASH); - // Remove duplicates - if (append) - { - removeDuplicateItems(wear_items, cof_items); - removeDuplicateItems(obj_items, cof_items); - removeDuplicateItems(gest_items, cof_items); - } - - S32 total_links = gest_items.count() + wear_items.count() + obj_items.count(); - - if (!append && total_links > 0) - { - purgeCOFBeforeRebuild(category); - } - - LLPointer link_waiter = new LLUpdateAppearanceOnDestroy; - - // Link all gestures in this folder - if (gest_items.count() > 0) - { - llinfos << "Linking " << gest_items.count() << " gestures" << llendl; - for (S32 i = 0; i < gest_items.count(); ++i) - { - const LLInventoryItem* gest_item = gest_items.get(i).get(); - link_inventory_item(gAgent.getID(), gest_item->getLinkedUUID(), current_outfit_id, - gest_item->getName(), - LLAssetType::AT_LINK, link_waiter); - } - } - - // Link all wearables - if(wear_items.count() > 0) - { - llinfos << "Linking " << wear_items.count() << " wearables" << llendl; - for(S32 i = 0; i < wear_items.count(); ++i) - { - // Populate the current outfit folder with links to the newly added wearables - const LLInventoryItem* wear_item = wear_items.get(i).get(); - link_inventory_item(gAgent.getID(), - wear_item->getLinkedUUID(), // If this item is a link, then we'll use the linked item's UUID. - current_outfit_id, - wear_item->getName(), - LLAssetType::AT_LINK, - link_waiter); - } - } - - // Link all attachments. - if( obj_items.count() > 0 ) - { - llinfos << "Linking " << obj_items.count() << " attachments" << llendl; - LLVOAvatar* avatar = gAgent.getAvatarObject(); - if( avatar ) - { - for(S32 i = 0; i < obj_items.count(); ++i) - { - const LLInventoryItem* obj_item = obj_items.get(i).get(); - link_inventory_item(gAgent.getID(), - obj_item->getLinkedUUID(), // If this item is a link, then we'll use the linked item's UUID. - current_outfit_id, - obj_item->getName(), - LLAssetType::AT_LINK, link_waiter); - } - } - } } void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id, @@ -556,6 +442,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID } } } + void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links) { LLInventoryModel::cat_array_t cats; @@ -681,110 +568,6 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append) } -bool LLAppearanceManager::isMandatoryWearableType(EWearableType type) -{ - return (type==WT_SHAPE) || (type==WT_SKIN) || (type== WT_HAIR) || (type==WT_EYES); -} - -// For mandatory body parts. -void LLAppearanceManager::checkMandatoryWearableTypes(const LLUUID& category, std::set& types_found) -{ - LLInventoryModel::cat_array_t new_cats; - LLInventoryModel::item_array_t new_items; - gInventory.collectDescendents(category, new_cats, new_items, - LLInventoryModel::EXCLUDE_TRASH); - std::set wt_types_found; - for (S32 i = 0; i < new_items.count(); ++i) - { - LLViewerInventoryItem *itemp = new_items.get(i); - if (itemp->isWearableType()) - { - EWearableType type = itemp->getWearableType(); - if (isMandatoryWearableType(type)) - { - types_found.insert(type); - } - } - } -} - -// Remove everything from the COF that we safely can before replacing -// with contents of new category. This means preserving any mandatory -// body parts that aren't present in the new category, and getting rid -// of everything else. -void LLAppearanceManager::purgeCOFBeforeRebuild(const LLUUID& category) -{ - // See which mandatory body types are present in the new category. - std::set wt_types_found; - checkMandatoryWearableTypes(category,wt_types_found); - - LLInventoryModel::cat_array_t cof_cats; - LLInventoryModel::item_array_t cof_items; - gInventory.collectDescendents(getCOF(), cof_cats, cof_items, - LLInventoryModel::EXCLUDE_TRASH); - for (S32 i = 0; i < cof_items.count(); ++i) - { - LLViewerInventoryItem *itemp = cof_items.get(i); - if (itemp->isWearableType()) - { - EWearableType type = itemp->getWearableType(); - if (!isMandatoryWearableType(type) || (wt_types_found.find(type) != wt_types_found.end())) - { - // Not mandatory or supplied by the new category - OK to delete - gInventory.purgeObject(cof_items.get(i)->getUUID()); - } - } - else - { - // Not a wearable - always purge - gInventory.purgeObject(cof_items.get(i)->getUUID()); - } - } - gInventory.notifyObservers(); -} - -// Replace COF contents from a given outfit folder. -void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category) -{ - lldebugs << "rebuildCOFFromOutfit()" << llendl; - - dumpCat(category,"start, source outfit"); - dumpCat(getCOF(),"start, COF"); - - // Find all the wearables that are in the category's subtree. - LLInventoryModel::item_array_t items; - getCOFValidDescendents(category, items); - - if( items.count() == 0) - { - LLNotifications::instance().add("CouldNotPutOnOutfit"); - return; - } - - // Processes that take time should show the busy cursor - //inc_busy_count(); - - //dumpCat(current_outfit_id,"COF before remove:"); - - //dumpCat(current_outfit_id,"COF after remove:"); - - purgeCOFBeforeRebuild(category); - - LLPointer link_waiter = new LLUpdateAppearanceOnDestroy; - LLUUID current_outfit_id = getCOF(); - LLAppearanceManager::shallowCopyCategory(category, current_outfit_id, link_waiter); - - //dumpCat(current_outfit_id,"COF after shallow copy:"); - - // Create a link to the outfit that we wore. - LLViewerInventoryCategory* catp = gInventory.getCategory(category); - if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT) - { - link_inventory_item(gAgent.getID(), category, current_outfit_id, catp->getName(), - LLAssetType::AT_LINK_FOLDER, link_waiter); - } -} - void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, bool append) { lldebugs << "updateAgentWearables()" << llendl; @@ -905,20 +688,6 @@ void LLAppearanceManager::updateAppearanceFromCOF() } } -void LLAppearanceManager::getCOFValidDescendents(const LLUUID& category, - LLInventoryModel::item_array_t& items) -{ - LLInventoryModel::cat_array_t cats; - LLFindCOFValidItems is_cof_valid; - bool follow_folder_links = false; - gInventory.collectDescendentsIf(category, - cats, - items, - LLInventoryModel::EXCLUDE_TRASH, - is_cof_valid, - follow_folder_links); -} - void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category, LLInventoryModel::item_array_t& items, LLAssetType::EType type, diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 4401596e2c..736dabea31 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -48,13 +48,9 @@ public: void updateAppearanceFromCOF(); bool needToSaveCOF(); void updateCOF(const LLUUID& category, bool append = false); - void updateCOFFromCategory(const LLUUID& category, bool append); - void rebuildCOFFromOutfit(const LLUUID& category); void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append); void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append); void wearOutfitByName(const std::string& name); - void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id, - LLPointer cb); void changeOutfit(bool proceed, const LLUUID& category, bool append); // Add COF link to individual item. @@ -62,19 +58,28 @@ public: // Add COF link to ensemble folder. void wearEnsemble(LLInventoryCategory* item, bool do_update = true); + + // Copy all items in a category. + void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id, + LLPointer cb); + + // Find the Current Outfit folder. LLUUID getCOF(); // Remove COF entries void removeItemLinks(const LLUUID& item_id, bool do_update = true); + void updateAgentWearables(LLWearableHoldingPattern* holder, bool append); + // For debugging - could be moved elsewhere. void dumpCat(const LLUUID& cat_id, const std::string& msg); void dumpItemArray(const LLInventoryModel::item_array_t& items, const std::string& msg); + + // Attachment link management void unregisterAttachment(const LLUUID& item_id); void registerAttachment(const LLUUID& item_id); void setAttachmentInvLinkEnable(bool val); void linkRegisteredAttachments(); - void updateAgentWearables(LLWearableHoldingPattern* holder, bool append); protected: LLAppearanceManager(); @@ -92,17 +97,12 @@ private: LLAssetType::EType type, bool follow_folder_links); - void getCOFValidDescendents(const LLUUID& category, - LLInventoryModel::item_array_t& items); - void getUserDescendents(const LLUUID& category, LLInventoryModel::item_array_t& wear_items, LLInventoryModel::item_array_t& obj_items, LLInventoryModel::item_array_t& gest_items, bool follow_folder_links); - bool isMandatoryWearableType(EWearableType type); - void checkMandatoryWearableTypes(const LLUUID& category, std::set& types_found); - void purgeCOFBeforeRebuild(const LLUUID& category); + void purgeCategory(const LLUUID& category, bool keep_outfit_links); std::set mRegisteredAttachments; -- cgit v1.3 From 036b0b7d8d16bc37ccc618b616db864c67c940e4 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 13 Nov 2009 11:43:32 -0500 Subject: removed dead code that was triggering a warning on some platforms --HG-- branch : avatar-pipeline --- indra/newview/llappearancemgr.cpp | 38 -------------------------------------- 1 file changed, 38 deletions(-) (limited to 'indra/newview/llappearancemgr.cpp') diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 456eaa43c6..8d66cefa4f 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -323,44 +323,6 @@ static void removeDuplicateItems(LLInventoryModel::item_array_t& items) items = new_items; } -static void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventoryModel::item_array_t& src) -{ - LLInventoryModel::item_array_t new_dst; - std::set mark_inventory; - - S32 inventory_dups = 0; - - for (LLInventoryModel::item_array_t::const_iterator src_pos = src.begin(); - src_pos != src.end(); - ++src_pos) - { - LLUUID src_item_id = (*src_pos)->getLinkedUUID(); - mark_inventory.insert(src_item_id); - } - - for (LLInventoryModel::item_array_t::const_iterator dst_pos = dst.begin(); - dst_pos != dst.end(); - ++dst_pos) - { - LLUUID dst_item_id = (*dst_pos)->getLinkedUUID(); - - if (mark_inventory.find(dst_item_id) == mark_inventory.end()) - { - // Item is not already present in COF. - new_dst.put(*dst_pos); - mark_inventory.insert(dst_item_id); - } - else - { - inventory_dups++; - } - } - llinfos << "removeDups, original " << dst.count() << " final " << new_dst.count() - << " inventory dups " << inventory_dups << llendl; - - dst = new_dst; -} - static void onWearableAssetFetch(LLWearable* wearable, void* data) { LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data; -- cgit v1.3 From 0fb0ce836d286063a21c540cadbdbd12160cb9e1 Mon Sep 17 00:00:00 2001 From: Loren Shih Date: Fri, 13 Nov 2009 14:42:28 -0500 Subject: EXT-2428 : Wearing a look should update the "Current Look" sidepanel string Both double-clicking on an outfit to wear, and wearing an outfit from side panel, will now update the current look string. --HG-- branch : avatar-pipeline --- indra/newview/llappearancemgr.cpp | 21 +++++++++++++++------ indra/newview/llsidetray.cpp | 18 ++++++++++++++++++ indra/newview/llsidetray.h | 7 ++++++- 3 files changed, 39 insertions(+), 7 deletions(-) (limited to 'indra/newview/llappearancemgr.cpp') diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 456eaa43c6..aac0fd6088 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -32,18 +32,20 @@ #include "llviewerprecompiledheaders.h" +#include "llagent.h" +#include "llagentwearables.h" #include "llappearancemgr.h" -#include "llinventorymodel.h" -#include "llnotifications.h" +#include "llfloatercustomize.h" #include "llgesturemgr.h" #include "llinventorybridge.h" -#include "llwearablelist.h" -#include "llagentwearables.h" -#include "llagent.h" +#include "llinventorymodel.h" +#include "llnotifications.h" +#include "llpanelappearance.h" +#include "llsidetray.h" #include "llvoavatar.h" #include "llvoavatarself.h" #include "llviewerregion.h" -#include "llfloatercustomize.h" +#include "llwearablelist.h" class LLWearInventoryCategoryCallback : public LLInventoryCallback { @@ -564,6 +566,13 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append) { link_inventory_item(gAgent.getID(), category, cof, catp->getName(), LLAssetType::AT_LINK_FOLDER, link_waiter); + + // Update the current outfit name of the appearance sidepanel. + LLPanelAppearance* panel_appearance = dynamic_cast(LLSideTray::getInstance()->getPanel("panel_appearance")); + if (panel_appearance) + { + panel_appearance->refreshCurrentLookName(catp->getName()); + } } } diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 70dc04f575..7711f3c733 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -673,6 +673,24 @@ LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& para return NULL; } +LLPanel* LLSideTray::getPanel (const std::string& panel_name) +{ + child_vector_const_iter_t child_it; + for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) + { + LLView* view = (*child_it)->findChildView(panel_name,true); + if(view) + { + LLPanel* panel = dynamic_cast(view); + if(panel) + { + return panel; + } + } + } + return NULL; +} + // *TODO: Eliminate magic constants. static const S32 fake_offset = 132; static const S32 fake_top_offset = 18; diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 8b30199c45..54652c1108 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -36,8 +36,8 @@ #include "llpanel.h" #include "string" -class LLSideTrayTab; class LLAccordionCtrl; +class LLSideTrayTab; // added inheritance from LLDestroyClass to enable Side Tray perform necessary actions // while disconnecting viewer in LLAppViewer::disconnectViewer(). @@ -97,6 +97,11 @@ public: LLPanel* showPanel (const std::string& panel_name, const LLSD& params); /* + * get the panel (don't show it or do anything else with it) + */ + LLPanel* getPanel (const std::string& panel_name); + + /* * collapse SideBar, hiding visible tab and moving tab buttons * to the right corner of the screen */ -- cgit v1.3 From 4b05dc4890d82b5c13c74ad502f0123fb83072a9 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 13 Nov 2009 15:20:54 -0500 Subject: LLAppearanceManager cleanup - 2 methods renamed --HG-- branch : avatar-pipeline --- indra/newview/llappearancemgr.cpp | 8 ++++---- indra/newview/llappearancemgr.h | 4 ++-- indra/newview/llinventorybridge.cpp | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) (limited to 'indra/newview/llappearancemgr.cpp') diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 8d66cefa4f..f7d1396707 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -802,7 +802,7 @@ bool areMatchingWearables(const LLViewerInventoryItem *a, const LLViewerInventor (a->getWearableType() == b->getWearableType())); } -void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update ) +void LLAppearanceManager::addItemLink( LLInventoryItem* item, bool do_update ) { LLViewerInventoryItem *vitem = dynamic_cast(item); if (!vitem) @@ -855,7 +855,7 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update ) return; } -void LLAppearanceManager::wearEnsemble( LLInventoryCategory* cat, bool do_update ) +void LLAppearanceManager::addEnsembleLink( LLInventoryCategory* cat, bool do_update ) { #if SUPPORT_ENSEMBLES // BAP add check for already in COF. @@ -969,7 +969,7 @@ void LLAppearanceManager::registerAttachment(const LLUUID& item_id) if (item) { //LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Adding attachment link:"); - LLAppearanceManager::wearItem(item,false); // Add COF link for item. + LLAppearanceManager::addItemLink(item,false); // Add COF link for item. gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); gInventory.notifyObservers(); } @@ -1009,7 +1009,7 @@ void LLAppearanceManager::linkRegisteredAttachments() LLViewerInventoryItem *item = gInventory.getItem(item_id); if (item) { - wearItem(item, false); + addItemLink(item, false); gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id); gInventory.notifyObservers(); } diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 736dabea31..88d3320d1f 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -54,10 +54,10 @@ public: void changeOutfit(bool proceed, const LLUUID& category, bool append); // Add COF link to individual item. - void wearItem(LLInventoryItem* item, bool do_update = true); + void addItemLink(LLInventoryItem* item, bool do_update = true); // Add COF link to ensemble folder. - void wearEnsemble(LLInventoryCategory* item, bool do_update = true); + void addEnsembleLink(LLInventoryCategory* item, bool do_update = true); // Copy all items in a category. void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id, diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 4aef7b51a5..7162b08845 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -1687,7 +1687,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, // BAP - should skip if dup. if (move_is_into_current_outfit) { - LLAppearanceManager::instance().wearEnsemble(inv_cat); + LLAppearanceManager::instance().addEnsembleLink(inv_cat); } else { @@ -2089,7 +2089,7 @@ void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model if(!model) return; LLViewerInventoryCategory* cat = getCategory(); if(!cat) return; - LLAppearanceManager::instance().wearEnsemble(cat,true); + LLAppearanceManager::instance().addEnsembleLink(cat,true); return; } #endif @@ -2953,7 +2953,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, // BAP - should skip if dup. if (move_is_into_current_outfit) { - LLAppearanceManager::instance().wearItem(inv_item); + LLAppearanceManager::instance().addItemLink(inv_item); } else { @@ -4206,7 +4206,7 @@ void wear_inventory_item_on_avatar( LLInventoryItem* item ) lldebugs << "wear_inventory_item_on_avatar( " << item->getName() << " )" << llendl; - LLAppearanceManager::instance().wearItem(item); + LLAppearanceManager::instance().addItemLink(item); } } -- cgit v1.3 From acdce232994fce7edf9a67a360db2368c5ad6594 Mon Sep 17 00:00:00 2001 From: Loren Shih Date: Fri, 13 Nov 2009 17:47:00 -0500 Subject: Header file cleanup Removed unnecessary "#include llinventorymodel.h" now that llinventoryobserver was split from llinventorymodel. --HG-- branch : avatar-pipeline --- indra/newview/llagentwearables.cpp | 2 +- indra/newview/llappearancemgr.cpp | 2 +- indra/newview/llassetuploadresponders.cpp | 2 +- indra/newview/llcallingcard.cpp | 2 +- indra/newview/llfavoritesbar.h | 1 + indra/newview/llfloaterproperties.cpp | 1 + indra/newview/llfloaterworldmap.cpp | 1 + indra/newview/llfoldervieweventlistener.h | 2 ++ indra/newview/llfolderviewitem.cpp | 1 - indra/newview/llgesturemgr.h | 2 +- indra/newview/llinventorybridge.h | 10 ++++++---- indra/newview/llinventorymodel.cpp | 1 + indra/newview/llinventorymodel.h | 5 ----- indra/newview/lllocationinputctrl.cpp | 2 +- indra/newview/llpanelmaininventory.h | 3 ++- indra/newview/llpanelpeople.cpp | 1 + indra/newview/llpreview.h | 2 +- indra/newview/llpreviewscript.h | 2 +- indra/newview/llsidepaneliteminfo.cpp | 1 + indra/newview/lltexturectrl.cpp | 2 +- indra/newview/lltracker.cpp | 1 + indra/newview/llviewermessage.cpp | 1 + 22 files changed, 27 insertions(+), 20 deletions(-) (limited to 'indra/newview/llappearancemgr.cpp') diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 5dbbcd727c..17e7eea2f1 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -39,7 +39,7 @@ #include "llfloatercustomize.h" #include "llfloaterinventory.h" #include "llinventorybridge.h" -#include "llinventorymodel.h" +#include "llinventoryobserver.h" #include "llinventorypanel.h" #include "llnotify.h" #include "llviewerregion.h" diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index e46cfe6af9..61c1081d22 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -38,7 +38,7 @@ #include "llfloatercustomize.h" #include "llgesturemgr.h" #include "llinventorybridge.h" -#include "llinventorymodel.h" +#include "llinventoryobserver.h" #include "llnotifications.h" #include "llpanelappearance.h" #include "llsidetray.h" diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 4d85ecb97c..38843c7221 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -40,7 +40,7 @@ #include "llfloaterbuycurrency.h" #include "llfilepicker.h" #include "llnotify.h" -#include "llinventorymodel.h" +#include "llinventoryobserver.h" #include "llinventorypanel.h" #include "llfloaterinventory.h" #include "llpermissionsflags.h" diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp index e8812d87ee..0b10255c2f 100644 --- a/indra/newview/llcallingcard.cpp +++ b/indra/newview/llcallingcard.cpp @@ -51,7 +51,7 @@ #include "llagent.h" #include "llbutton.h" -//#include "llinventory.h" +#include "llinventoryobserver.h" #include "llinventorymodel.h" #include "llnotify.h" #include "llresmgr.h" diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h index e90d13f9d5..20a324c67c 100644 --- a/indra/newview/llfavoritesbar.h +++ b/indra/newview/llfavoritesbar.h @@ -35,6 +35,7 @@ #include "lluictrl.h" +#include "llinventoryobserver.h" #include "llinventorymodel.h" class LLFavoritesBarCtrl : public LLUICtrl, public LLInventoryObserver diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp index 928126bff9..e0d4a59d9d 100644 --- a/indra/newview/llfloaterproperties.cpp +++ b/indra/newview/llfloaterproperties.cpp @@ -44,6 +44,7 @@ #include "llbutton.h" #include "llcheckboxctrl.h" #include "llavataractions.h" +#include "llinventoryobserver.h" #include "llinventorymodel.h" #include "lllineeditor.h" //#include "llspinctrl.h" diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 7d2eb98111..85847e5fce 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -51,6 +51,7 @@ #include "llfloaterreg.h" // getTypedInstance() #include "llfocusmgr.h" #include "llinventorymodel.h" +#include "llinventoryobserver.h" #include "lllandmarklist.h" #include "lllineeditor.h" #include "llregionhandle.h" diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h index 60ece75cea..473d0be912 100644 --- a/indra/newview/llfoldervieweventlistener.h +++ b/indra/newview/llfoldervieweventlistener.h @@ -34,6 +34,8 @@ #include "lldarray.h" // JAMESDEBUG convert to std::vector #include "llfoldertype.h" #include "llfontgl.h" // just for StyleFlags enum +#include "llinventorytype.h" +#include "llpermissionsflags.h" #include "llpointer.h" diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 6fdaefd21a..102651f432 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -38,7 +38,6 @@ #include "llfoldervieweventlistener.h" #include "llinventorybridge.h" // for LLItemBridge in LLInventorySort::operator() #include "llinventoryfilter.h" -#include "llinventorymodel.h" // *TODO: make it take a pointer to an inventory-model interface #include "llviewercontrol.h" // gSavedSettings #include "llviewerwindow.h" // Argh, only for setCursor() diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h index 947773d66d..c8b26f7309 100644 --- a/indra/newview/llgesturemgr.h +++ b/indra/newview/llgesturemgr.h @@ -38,7 +38,7 @@ #include #include "llassetstorage.h" // LLAssetType -#include "llinventorymodel.h" +#include "llinventoryobserver.h" #include "llsingleton.h" #include "llviewerinventory.h" diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 3ffeb55d6c..4c7b0a0517 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -33,14 +33,16 @@ #ifndef LL_LLINVENTORYBRIDGE_H #define LL_LLINVENTORYBRIDGE_H -#include "llfloaterproperties.h" -#include "llwearable.h" -#include "llviewercontrol.h" #include "llcallingcard.h" -#include "llinventorymodel.h" +#include "llfloaterproperties.h" #include "llfoldervieweventlistener.h" +#include "llinventorymodel.h" +#include "llinventoryobserver.h" +#include "llviewercontrol.h" +#include "llwearable.h" class LLInventoryPanel; +class LLInventoryModel; class LLMenuGL; enum EInventoryIcon diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index ffe5f7181d..a8e5c4c216 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -39,6 +39,7 @@ #include "llfloaterinventory.h" #include "llinventorybridge.h" #include "llinventoryfunctions.h" +#include "llinventoryobserver.h" #include "llwindow.h" #include "llviewercontrol.h" #include "llpreview.h" diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index bd64591194..3c1f606d5c 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -46,11 +46,6 @@ #include #include -// ! REFACTOR ! Remove llinventoryobservers.h and have other files that need it explicitly -// include llinventoryobservers.h instead of llinventorymodel.h . This will reduce dependency on -// llinventorymodel.h. -#include "llinventoryobserver.h" - class LLInventoryObserver; class LLInventoryObject; class LLInventoryItem; diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 8fe317a292..7e35cfa04c 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -45,7 +45,7 @@ #include "lltooltip.h" // newview includes -#include "llinventorymodel.h" +#include "llinventoryobserver.h" #include "lllandmarkactions.h" #include "lllandmarklist.h" #include "lllocationhistory.h" diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index 29e9baa6cf..fbc0f09c50 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -35,7 +35,8 @@ #define LL_LLPANELMAININVENTORY_H #include "llpanel.h" -#include "llinventorymodel.h" +#include "llinventoryobserver.h" + #include "llfolderview.h" class LLFolderViewItem; diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 2bbb2b7153..69edccf09f 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -54,6 +54,7 @@ #include "llfriendcard.h" #include "llgroupactions.h" #include "llgrouplist.h" +#include "llinventoryobserver.h" #include "llpanelpeoplemenus.h" #include "llrecentpeople.h" #include "llviewercontrol.h" // for gSavedSettings diff --git a/indra/newview/llpreview.h b/indra/newview/llpreview.h index 506c135ca6..3b9f7f9882 100644 --- a/indra/newview/llpreview.h +++ b/indra/newview/llpreview.h @@ -37,7 +37,7 @@ #include "llresizehandle.h" #include "llpointer.h" #include "lluuid.h" -#include "llinventorymodel.h" // LLInventoryObserver +#include "llinventoryobserver.h" #include class LLInventoryItem; diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index a00f580e32..28a409d3ee 100644 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -41,7 +41,6 @@ #include "lliconctrl.h" #include "llframetimer.h" - class LLMessageSystem; class LLTextEditor; class LLButton; @@ -52,6 +51,7 @@ struct LLEntryAndEdCore; class LLMenuBarGL; class LLFloaterScriptSearch; class LLKeywordToken; +class LLViewerInventoryItem; // Inner, implementation class. LLPreviewScript and LLLiveLSLEditor each own one of these. class LLScriptEdCore : public LLPanel diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index 9d2960fbed..a3efea7b7e 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -41,6 +41,7 @@ #include "llfloaterreg.h" #include "llgroupactions.h" #include "llinventorymodel.h" +#include "llinventoryobserver.h" #include "lllineeditor.h" #include "llradiogroup.h" #include "llviewercontrol.h" diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index de00ca8420..5f7c2f5080 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -48,7 +48,7 @@ #include "llfoldervieweventlistener.h" #include "llinventory.h" #include "llinventoryfunctions.h" -#include "llinventorymodel.h" +#include "llinventoryobserver.h" #include "llinventorypanel.h" #include "llfloaterinventory.h" #include "lllineeditor.h" diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp index 1a61717658..407cc23d0d 100644 --- a/indra/newview/lltracker.cpp +++ b/indra/newview/lltracker.cpp @@ -55,6 +55,7 @@ #include "llhudtext.h" #include "llhudview.h" #include "llinventorymodel.h" +#include "llinventoryobserver.h" #include "lllandmarklist.h" #include "llsky.h" #include "llui.h" diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index f0c1823def..7f25e567d0 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -89,6 +89,7 @@ #include "llhudeffecttrail.h" #include "llhudmanager.h" #include "llinventorymodel.h" +#include "llinventoryobserver.h" #include "llinventorypanel.h" #include "llfloaterinventory.h" #include "llmenugl.h" -- cgit v1.3 From 9c823a1d40392dc00bdfb1f09220a5065d764f40 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Tue, 17 Nov 2009 10:33:47 -0500 Subject: Deferring work to idle time to avoid recursive notifyObservers calls - added wrapper class to defer an arbitrary boost::bind or other callable --HG-- branch : avatar-pipeline --- indra/newview/llagentwearables.cpp | 18 +++++++----------- indra/newview/llappearancemgr.cpp | 18 ++++++++++++++++-- indra/newview/llappearancemgr.h | 33 +++++++++++++++++++++++++++++++++ indra/newview/llinventorybridge.cpp | 12 ++++++++++++ 4 files changed, 68 insertions(+), 13 deletions(-) (limited to 'indra/newview/llappearancemgr.cpp') diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 17e7eea2f1..a171f75b17 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -62,7 +62,7 @@ class LLInitialWearablesFetch : public LLInventoryFetchDescendentsObserver { public: LLInitialWearablesFetch() {} - ~LLInitialWearablesFetch() {} + ~LLInitialWearablesFetch(); virtual void done(); struct InitialWearableData @@ -84,7 +84,6 @@ public: protected: void processWearablesMessage(); void processContents(); - static void onIdle(void *userdata); }; LLAgentWearables gAgentWearables; @@ -2013,6 +2012,11 @@ void LLAgentWearables::updateServer() // to avoid gInventory.notifyObservers recursion. //-------------------------------------------------------------------- +LLInitialWearablesFetch::~LLInitialWearablesFetch() +{ + llinfos << "~LLInitialWearablesFetch" << llendl; +} + // virtual void LLInitialWearablesFetch::done() { @@ -2020,15 +2024,7 @@ void LLInitialWearablesFetch::done() // gInventory.notifyObservers. The results will be handled in the next // idle tick instead. gInventory.removeObserver(this); - gIdleCallbacks.addFunction(onIdle, this); -} - -// static -void LLInitialWearablesFetch::onIdle(void *data) -{ - gIdleCallbacks.deleteFunction(onIdle, data); - LLInitialWearablesFetch *self = reinterpret_cast(data); - self->processContents(); + doOnIdle(boost::bind(&LLInitialWearablesFetch::processContents,this)); } void LLInitialWearablesFetch::processContents() diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 80ac9e4085..a23d21f84b 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -95,8 +95,9 @@ public: mCopyItems(copy_items), mAppend(append) {} - ~LLOutfitObserver() {} - virtual void done(); //public + ~LLOutfitObserver(); + virtual void done(); + void doWearCategory(); protected: LLUUID mCatID; @@ -104,7 +105,19 @@ protected: bool mAppend; }; +LLOutfitObserver::~LLOutfitObserver() +{ + llinfos << "~LLOutfitObserver" << llendl; +} + +// BAP is LLOutfitObserver getting deleted here? void LLOutfitObserver::done() +{ + gInventory.removeObserver(this); + doOnIdle(boost::bind(&LLOutfitObserver::doWearCategory,this)); +} + +void LLOutfitObserver::doWearCategory() { // We now have an outfit ready to be copied to agent inventory. Do // it, and wear that outfit normally. @@ -175,6 +188,7 @@ void LLOutfitObserver::done() // Wear the inventory category. LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend); } + delete this; } class LLOutfitFetch : public LLInventoryFetchDescendentsObserver diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 88d3320d1f..f39fbd7b1a 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -36,6 +36,7 @@ #include "llsingleton.h" #include "llinventorymodel.h" #include "llviewerinventory.h" +#include "llcallbacklist.h" class LLWearable; struct LLWearableHoldingPattern; @@ -111,4 +112,36 @@ private: #define SUPPORT_ENSEMBLES 0 +// Shim class and template function to allow arbitrary boost::bind +// expressions to be run as one-time idle callbacks. +template +class OnIdleCallback +{ +public: + OnIdleCallback(T callable): + mCallable(callable) + { + } + static void onIdle(void *data) + { + gIdleCallbacks.deleteFunction(onIdle, data); + OnIdleCallback* self = reinterpret_cast*>(data); + self->call(); + delete self; + } + void call() + { + mCallable(); + } +private: + T mCallable; +}; + +template +void doOnIdle(T callable) +{ + OnIdleCallback* cb_functor = new OnIdleCallback(callable); + gIdleCallbacks.addFunction(&OnIdleCallback::onIdle,cb_functor); +} + #endif diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index d7be09efa9..f406547620 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -1682,6 +1682,17 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, // if target is an outfit or current outfit folder we use link if (move_is_into_current_outfit || move_is_into_outfit) { + if (inv_cat->getPreferredType() == LLFolderType::FT_NONE) + { + if (move_is_into_current_outfit) + { + // traverse category and add all contents to currently worn. + BOOL append = true; + LLAppearanceManager::instance().wearInventoryCategory(inv_cat, false, append); + } + } + else + { #if SUPPORT_ENSEMBLES // BAP - should skip if dup. if (move_is_into_current_outfit) @@ -1700,6 +1711,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, cb); } #endif + } } else { -- cgit v1.3 From 32dccaf3d89b40b711d69088a3e390119c7efc7f Mon Sep 17 00:00:00 2001 From: Loren Shih Date: Tue, 17 Nov 2009 10:36:11 -0500 Subject: Sidepanel Appearance refactoring. Work in progress. 1. Changed sidepanel names to have "sidepanel" (e.g. panel_appearance -> sidepanel_appearance) 2. Changed some "Looks" names to "Outfits" 3. Changed LLPanelLooks to LLPanelOutfitsInventory (to match other inventory panel naming) 4. Took out tab from sidepanel_appearance. --HG-- branch : avatar-pipeline --- indra/newview/CMakeLists.txt | 10 +- indra/newview/llappearancemgr.cpp | 6 +- indra/newview/llinventoryfilter.cpp | 17 +- indra/newview/llinventorypanel.cpp | 35 +- indra/newview/llinventorypanel.h | 4 + indra/newview/llpanelmaininventory.cpp | 2 +- indra/newview/llpaneloutfitsinventory.cpp | 245 ++++++++++++++ indra/newview/llpaneloutfitsinventory.h | 76 +++++ indra/newview/llsidepanelappearance.cpp | 373 +++++++++++++++++++++ indra/newview/llsidepanelappearance.h | 102 ++++++ .../skins/default/xui/en/floater_inventory.xml | 2 +- .../default/xui/en/panel_outfits_inventory.xml | 81 +++++ .../skins/default/xui/en/panel_side_tray.xml | 6 +- .../skins/default/xui/en/sidepanel_appearance.xml | 104 ++++++ 14 files changed, 1026 insertions(+), 37 deletions(-) create mode 100644 indra/newview/llpaneloutfitsinventory.cpp create mode 100644 indra/newview/llpaneloutfitsinventory.h create mode 100644 indra/newview/llsidepanelappearance.cpp create mode 100644 indra/newview/llsidepanelappearance.h create mode 100644 indra/newview/skins/default/xui/en/panel_outfits_inventory.xml create mode 100644 indra/newview/skins/default/xui/en/sidepanel_appearance.xml (limited to 'indra/newview/llappearancemgr.cpp') diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 4adef84cd3..e7458529be 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -297,8 +297,6 @@ set(viewer_SOURCE_FILES llnotify.cpp lloutputmonitorctrl.cpp lloverlaybar.cpp - llpanelappearance.cpp - llpanelappearancetab.cpp llpanelavatar.cpp llpanelavatarrow.cpp llpanelavatartag.cpp @@ -322,7 +320,6 @@ set(viewer_SOURCE_FILES llpanellandmedia.cpp llpanellogin.cpp llpanellookinfo.cpp - llpanellooks.cpp llpanelmaininventory.cpp llpanelmediasettingsgeneral.cpp llpanelmediasettingspermissions.cpp @@ -330,6 +327,7 @@ set(viewer_SOURCE_FILES llpanelmeprofile.cpp llpanelobject.cpp llpanelobjectinventory.cpp + llpaneloutfitsinventory.cpp llpanelpeople.cpp llpanelpeoplemenus.cpp llpanelpermissions.cpp @@ -370,6 +368,7 @@ set(viewer_SOURCE_FILES llsearchcombobox.cpp llsearchhistory.cpp llselectmgr.cpp + llsidepanelappearance.cpp llsidepanelinventory.cpp llsidepanelinventorysubpanel.cpp llsidepaneliteminfo.cpp @@ -792,8 +791,6 @@ set(viewer_HEADER_FILES llnotify.h lloutputmonitorctrl.h lloverlaybar.h - llpanelappearance.h - llpanelappearancetab.h llpanelavatar.h llpanelavatarrow.h llpanelavatartag.h @@ -817,7 +814,6 @@ set(viewer_HEADER_FILES llpanellandmedia.h llpanellogin.h llpanellookinfo.h - llpanellooks.h llpanelmaininventory.h llpanelmediasettingsgeneral.h llpanelmediasettingspermissions.h @@ -825,6 +821,7 @@ set(viewer_HEADER_FILES llpanelmeprofile.h llpanelobject.h llpanelobjectinventory.h + llpaneloutfitsinventory.h llpanelpeople.h llpanelpeoplemenus.h llpanelpermissions.h @@ -867,6 +864,7 @@ set(viewer_HEADER_FILES llsearchcombobox.h llsearchhistory.h llselectmgr.h + llsidepanelappearance.h llsidepanelinventory.h llsidepanelinventorysubpanel.h llsidepaneliteminfo.h diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 80ac9e4085..554f270c02 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -40,7 +40,7 @@ #include "llinventorybridge.h" #include "llinventoryobserver.h" #include "llnotifications.h" -#include "llpanelappearance.h" +#include "llsidepanelappearance.h" #include "llsidetray.h" #include "llvoavatar.h" #include "llvoavatarself.h" @@ -530,10 +530,10 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append) LLAssetType::AT_LINK_FOLDER, link_waiter); // Update the current outfit name of the appearance sidepanel. - LLPanelAppearance* panel_appearance = dynamic_cast(LLSideTray::getInstance()->getPanel("panel_appearance")); + LLSidepanelAppearance* panel_appearance = dynamic_cast(LLSideTray::getInstance()->getPanel("sidepanel_appearance")); if (panel_appearance) { - panel_appearance->refreshCurrentLookName(catp->getName()); + panel_appearance->refreshCurrentOutfitName(catp->getName()); } } diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 3e4b3327db..085c96c93d 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -100,17 +100,18 @@ BOOL LLInventoryFilter::check(LLFolderViewItem* item) bool passed_type = false; if (mFilterOps.mFilterForCategories) { - if (listener->getInventoryType() == LLInventoryType::IT_CATEGORY) + // Pass if this item is a category of the filter type, or + // if its parent is a category of the filter type. + LLUUID uuid = listener->getUUID(); + if (listener->getInventoryType() != LLInventoryType::IT_CATEGORY) { - LLViewerInventoryCategory *cat = gInventory.getCategory(listener->getUUID()); - if (cat) - { - passed_type |= ((1LL << cat->getPreferredType() & mFilterOps.mFilterTypes) != U64(0)); - } + const LLInventoryObject *obj = gInventory.getObject(uuid); + uuid = obj->getParentUUID(); } - else + LLViewerInventoryCategory *cat = gInventory.getCategory(uuid); + if (cat) { - passed_type = TRUE; + passed_type |= ((1LL << cat->getPreferredType() & mFilterOps.mFilterTypes) != U64(0)); } } else diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 7b7090d10d..450ce92412 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -145,23 +145,10 @@ BOOL LLInventoryPanel::postBuild() mInventoryObserver = new LLInventoryPanelObserver(this); mInventory->addObserver(mInventoryObserver); - // determine the root folder, if any, so inventory contents show just the children - // of that folder (i.e. not including the folder itself). - const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString); - - if ("LIBRARY" == mStartFolderString) - { - mStartFolderID = gInventory.getLibraryRootFolderID(); - } - else - { - mStartFolderID = (preferred_type != LLFolderType::FT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null); - } - // build view of inventory if we need default full hierarchy and inventory ready, otherwise wait for modelChanged() callback if (mBuildDefaultHierarchy && mInventory->isInventoryUsable() && !mHasInventoryConnection) { - rebuildViewsFor(mStartFolderID); + rebuildViews(); mHasInventoryConnection = true; defaultOpenInventory(); } @@ -268,7 +255,7 @@ void LLInventoryPanel::modelChanged(U32 mask) // inventory just initialized, do complete build if ((mask & LLInventoryObserver::ADD) && gInventory.getChangedIDs().empty() && !mHasInventoryConnection) { - rebuildViewsFor(mStartFolderID); + rebuildViews(); mHasInventoryConnection = true; defaultOpenInventory(); return; @@ -388,6 +375,24 @@ void LLInventoryPanel::modelChanged(U32 mask) } +void LLInventoryPanel::rebuildViews() +{ + // Determine the root folder and rebuild the views starting + // at that folder. + const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString); + + if ("LIBRARY" == mStartFolderString) + { + mStartFolderID = gInventory.getLibraryRootFolderID(); + } + else + { + mStartFolderID = (preferred_type != LLFolderType::FT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null); + } + + rebuildViewsFor(mStartFolderID); +} + void LLInventoryPanel::rebuildViewsFor(const LLUUID& id) { LLFolderViewItem* old_view = NULL; diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index e398c44105..0ccee337c9 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -162,6 +162,10 @@ public: void unSelectAll() { mFolders->setSelection(NULL, FALSE, FALSE); } protected: + // Destroys the old views, and regenerates them based on the + // start folder ID. + void rebuildViews(); + // Given the id and the parent, build all of the folder views. void rebuildViewsFor(const LLUUID& id); virtual void buildNewViews(const LLUUID& id); // made virtual to support derived classes. EXT-719 diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index e3b2ab77aa..6c7d434eeb 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -49,7 +49,7 @@ #include "llviewermenu.h" #include "llviewertexturelist.h" -static LLRegisterPanelClassWrapper t_inventory("panel_main_inventory"); // Seraph is this redundant with constructor? +static LLRegisterPanelClassWrapper t_inventory("panel_main_inventory"); void on_file_loaded_for_save(BOOL success, LLViewerFetchedTexture *src_vi, diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp new file mode 100644 index 0000000000..2964bbe792 --- /dev/null +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -0,0 +1,245 @@ +/** + * @file llpaneloutfitsinventory.cpp + * @brief Outfits inventory panel + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llpaneloutfitsinventory.h" + +#include "llagent.h" +#include "llbutton.h" +#include "llfloaterreg.h" +#include "lllandmark.h" + +#include "llfloaterworldmap.h" +#include "llfloaterinventory.h" +#include "llfoldervieweventlistener.h" +#include "llinventoryfunctions.h" +#include "llinventorypanel.h" +#include "llsidetray.h" +#include "lltabcontainer.h" +#include "llagentwearables.h" +#include "llviewerjointattachment.h" +#include "llviewerfoldertype.h" +#include "llvoavatarself.h" + +static LLRegisterPanelClassWrapper t_inventory("panel_outfits_inventory"); + +LLPanelOutfitsInventory::LLPanelOutfitsInventory() : + mInventoryPanel(NULL), + mActionBtn(NULL), + mWearBtn(NULL), + mEditBtn(NULL) +{ + mSavedFolderState = new LLSaveFolderState(); + mSavedFolderState->setApply(FALSE); + + // LLUICtrlFactory::getInstance()->buildPanel(this, "panel_outfits_inventory.xml"); +} + +LLPanelOutfitsInventory::~LLPanelOutfitsInventory() +{ + delete mSavedFolderState; +} + +// virtual +BOOL LLPanelOutfitsInventory::postBuild() +{ + mInventoryPanel = getChild("outfits_list"); + mInventoryPanel->setFilterTypes(1LL << LLFolderType::FT_OUTFIT, TRUE); + mInventoryPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); + mInventoryPanel->openDefaultFolderForType(LLFolderType::FT_MY_OUTFITS); + mInventoryPanel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onSelectionChange, this, _1, _2)); + + LLFolderView* root_folder = getRootFolder(); + root_folder->setReshapeCallback(boost::bind(&LLPanelOutfitsInventory::onSelectionChange, this, _1, _2)); + + mWearBtn = getChild("wear_btn"); + mEditBtn = getChild("edit_btn"); + mActionBtn = getChild("action_btn"); + + return TRUE; +} + +// virtual +void LLPanelOutfitsInventory::onSearchEdit(const std::string& string) +{ + if (string == "") + { + mInventoryPanel->setFilterSubString(LLStringUtil::null); + + // re-open folders that were initially open + mSavedFolderState->setApply(TRUE); + getRootFolder()->applyFunctorRecursively(*mSavedFolderState); + LLOpenFoldersWithSelection opener; + getRootFolder()->applyFunctorRecursively(opener); + getRootFolder()->scrollToShowSelection(); + } + + gInventory.startBackgroundFetch(); + + if (mInventoryPanel->getFilterSubString().empty() && string.empty()) + { + // current filter and new filter empty, do nothing + return; + } + + // save current folder open state if no filter currently applied + if (getRootFolder()->getFilterSubString().empty()) + { + mSavedFolderState->setApply(FALSE); + getRootFolder()->applyFunctorRecursively(*mSavedFolderState); + } + + // set new filter string + mInventoryPanel->setFilterSubString(string); +} + +void LLPanelOutfitsInventory::onWear() +{ + LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem(); + if (!current_item) + return; + + LLFolderViewEventListener* listenerp = current_item->getListener(); + if (getIsCorrectType(listenerp)) + { + listenerp->performAction(NULL, NULL,"replaceoutfit"); + } +} + +void LLPanelOutfitsInventory::onEdit() +{ +} + +void LLPanelOutfitsInventory::onNew() +{ + const std::string& outfit_name = LLViewerFolderType::lookupNewCategoryName(LLFolderType::FT_OUTFIT); + LLUUID outfit_folder = gAgentWearables.makeNewOutfitLinks(outfit_name); + getRootFolder()->setSelectionByID(outfit_folder, TRUE); + getRootFolder()->setNeedsAutoRename(TRUE); +} + +void LLPanelOutfitsInventory::updateVerbs() +{ + BOOL enabled = FALSE; + + LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem(); + if (current_item) + { + LLFolderViewEventListener* listenerp = current_item->getListener(); + if (getIsCorrectType(listenerp)) + { + enabled = TRUE; + } + } + + if (mWearBtn) + { + mWearBtn->setEnabled(enabled); + } + // mEditBtn->setEnabled(enabled); +} + +void LLPanelOutfitsInventory::onSelectionChange(const std::deque &items, BOOL user_action) +{ + LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem(); + if (!current_item) + return; + + /* + LLFolderViewEventListener* listenerp = current_item->getListener(); + if (getIsCorrectType(listenerp)) + { + S32 bottom = 0; + LLFolderViewItem* folder = current_item->getParentFolder(); + + while ( folder->getParentFolder() != NULL ) + { + bottom += folder->getRect().mBottom; + folder = folder->getParentFolder(); + } + + LLRect rect = current_item->getRect(); + LLRect btn_rect( + rect.mRight - mActionBtn->getRect().getWidth(), + bottom + rect.mTop, + rect.mRight, + bottom + rect.mBottom); + + mActionBtn->setRect(btn_rect); + + if (!mActionBtn->getVisible()) + mActionBtn->setVisible(TRUE); + } + else + { + if (mActionBtn->getVisible()) + mActionBtn->setVisible(FALSE); + } + */ + + updateVerbs(); +} + +void LLPanelOutfitsInventory::onSelectorButtonClicked() +{ + /* + LLFolderViewItem* cur_item = getRootFolder()->getCurSelectedItem(); + + LLFolderViewEventListener* listenerp = cur_item->getListener(); + if (getIsCorrectType(listenerp)) + { + LLSD key; + key["type"] = "look"; + key["id"] = listenerp->getUUID(); + + LLSideTray::getInstance()->showPanel("sidepanel_appearance", key); + } + */ +} + +bool LLPanelOutfitsInventory::getIsCorrectType(const LLFolderViewEventListener *listenerp) const +{ + if (listenerp->getInventoryType() == LLInventoryType::IT_CATEGORY) + { + LLViewerInventoryCategory *cat = gInventory.getCategory(listenerp->getUUID()); + if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT) + { + return true; + } + } + return false; +} + +LLFolderView *LLPanelOutfitsInventory::getRootFolder() +{ + return mInventoryPanel->getRootFolder(); +} diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h new file mode 100644 index 0000000000..3f837d3635 --- /dev/null +++ b/indra/newview/llpaneloutfitsinventory.h @@ -0,0 +1,76 @@ +/** + * @file llpaneloutfitsinventory.h + * @brief Outfits inventory panel + * class definition + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2001-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLPANELOUTFITSINVENTORY_H +#define LL_LLPANELOUTFITSINVENTORY_H + +#include "llpanel.h" +#include "llinventoryobserver.h" + +class LLFolderView; +class LLFolderViewItem; +class LLFolderViewEventListener; +class LLInventoryPanel; +class LLSaveFolderState; +class LLButton; + +class LLPanelOutfitsInventory : public LLPanel +{ +public: + LLPanelOutfitsInventory(); + virtual ~LLPanelOutfitsInventory(); + + /*virtual*/ BOOL postBuild(); + + void onSearchEdit(const std::string& string); + void onWear(); + void onEdit(); + void onNew(); + void updateVerbs(); + + void onSelectionChange(const std::deque &items, BOOL user_action); + void onSelectorButtonClicked(); + + LLFolderView* getRootFolder(); + +private: + bool getIsCorrectType(const LLFolderViewEventListener *listenerp) const; + LLInventoryPanel* mInventoryPanel; + LLSaveFolderState* mSavedFolderState; + + LLButton* mActionBtn; + LLButton* mWearBtn; + LLButton* mEditBtn; + +}; + +#endif //LL_LLPANELOUTFITSINVENTORY_H diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp new file mode 100644 index 0000000000..d92e404c2c --- /dev/null +++ b/indra/newview/llsidepanelappearance.cpp @@ -0,0 +1,373 @@ +/** + * @file llsidepanelappearance.cpp + * @brief Side Bar "Appearance" panel + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llsidepanelappearance.h" + +#include "llagent.h" +#include "llagentwearables.h" +#include "llfiltereditor.h" +#include "llfloaterreg.h" +#include "llfloaterworldmap.h" +#include "llpaneleditwearable.h" +#include "llpaneloutfitsinventory.h" +#include "lltextbox.h" +#include "lluictrlfactory.h" +#include "llviewerregion.h" +#include "llvoavatarself.h" +#include "llwearable.h" + +static LLRegisterPanelClassWrapper t_appearance("sidepanel_appearance"); + +class LLCurrentlyWornFetchObserver : public LLInventoryFetchObserver +{ +public: + LLCurrentlyWornFetchObserver(LLSidepanelAppearance *panel) : + mPanel(panel) + {} + ~LLCurrentlyWornFetchObserver() {} + virtual void done() + { + mPanel->inventoryFetched(); + gInventory.removeObserver(this); + } +private: + LLSidepanelAppearance *mPanel; +}; + +LLSidepanelAppearance::LLSidepanelAppearance() : + LLPanel(), + mFilterSubString(LLStringUtil::null), + mFilterEditor(NULL), + mLookInfo(NULL), + mCurrLookPanel(NULL) +{ + //LLUICtrlFactory::getInstance()->buildPanel(this, "panel_appearance.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() + mFetchWorn = new LLCurrentlyWornFetchObserver(this); +} + +LLSidepanelAppearance::~LLSidepanelAppearance() +{ +} + +// virtual +BOOL LLSidepanelAppearance::postBuild() +{ + mEditAppearanceBtn = getChild("editappearance_btn"); + mEditAppearanceBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditAppearanceButtonClicked, this)); + + mWearBtn = getChild("wear_btn"); + mWearBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onWearButtonClicked, this)); + + mEditBtn = getChild("edit_btn"); + mEditBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditButtonClicked, this)); + + mNewLookBtn = getChild("newlook_btn"); + mNewLookBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onNewOutfitButtonClicked, this)); + mNewLookBtn->setEnabled(false); + + mOverflowBtn = getChild("overflow_btn"); + + mFilterEditor = getChild("Filter"); + if (mFilterEditor) + { + mFilterEditor->setCommitCallback(boost::bind(&LLSidepanelAppearance::onFilterEdit, this, _2)); + } + + mPanelOutfitsInventory = dynamic_cast(getChild("panel_outfits_inventory")); + + mLookInfo = dynamic_cast(getChild("panel_look_info")); + if (mLookInfo) + { + LLButton* back_btn = mLookInfo->getChild("back_btn"); + if (back_btn) + { + back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onBackButtonClicked, this)); + } + + // *TODO: Assign the action to an appropriate event. + // mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::toggleMediaPanel, this)); + } + + mEditWearable = dynamic_cast(getChild("panel_edit_wearable")); + if (mEditWearable) + { + LLButton* edit_wearable_back_btn = mEditWearable->getChild("back_btn"); + if (edit_wearable_back_btn) + { + edit_wearable_back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditWearBackClicked, this)); + } + } + + mCurrentLookName = getChild("currentlook_name"); + + mCurrLookPanel = getChild("panel_currentlook"); + + return TRUE; +} + +// virtual +void LLSidepanelAppearance::onOpen(const LLSD& key) +{ + fetchInventory(); + refreshCurrentOutfitName(); + + if(key.size() == 0) + return; + + toggleLookInfoPanel(TRUE); + updateVerbs(); + + mLookInfoType = key["type"].asString(); + + if (mLookInfoType == "look") + { + LLInventoryCategory *pLook = gInventory.getCategory(key["id"].asUUID()); + if (pLook) + mLookInfo->displayLookInfo(pLook); + } +} + +void LLSidepanelAppearance::onFilterEdit(const std::string& search_string) +{ + if (mFilterSubString != search_string) + { + mFilterSubString = search_string; + + // Searches are case-insensitive + LLStringUtil::toUpper(mFilterSubString); + LLStringUtil::trimHead(mFilterSubString); + + mPanelOutfitsInventory->onSearchEdit(mFilterSubString); + } +} + +void LLSidepanelAppearance::onWearButtonClicked() +{ + if (mLookInfo->getVisible()) + { + } + else + { + mPanelOutfitsInventory->onWear(); + } +} + +void LLSidepanelAppearance::onEditAppearanceButtonClicked() +{ + if (gAgentWearables.areWearablesLoaded()) + { + gAgent.changeCameraToCustomizeAvatar(); + } +} + +void LLSidepanelAppearance::onEditButtonClicked() +{ + toggleLookInfoPanel(FALSE); + toggleWearableEditPanel(TRUE, NULL); + /*if (mLookInfo->getVisible()) + { + } + else + { + mPanelOutfitsInventory->onEdit(); + }*/ +} + +void LLSidepanelAppearance::onNewOutfitButtonClicked() +{ + if (mLookInfo->getVisible()) + { + } + else + { + mPanelOutfitsInventory->onNew(); + } +} + + +void LLSidepanelAppearance::onBackButtonClicked() +{ + toggleLookInfoPanel(FALSE); +} + +void LLSidepanelAppearance::onEditWearBackClicked() +{ + mEditWearable->saveChanges(); + toggleWearableEditPanel(FALSE, NULL); + toggleLookInfoPanel(TRUE); +} + +void LLSidepanelAppearance::toggleLookInfoPanel(BOOL visible) +{ + if (!mLookInfo) + return; + + mLookInfo->setVisible(visible); + mPanelOutfitsInventory->setVisible(!visible); + mFilterEditor->setVisible(!visible); + mWearBtn->setVisible(!visible); + mEditBtn->setVisible(!visible); + mNewLookBtn->setVisible(!visible); + mOverflowBtn->setVisible(!visible); + mCurrLookPanel->setVisible(!visible); +} + +void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *wearable) +{ + if (!wearable) + { + wearable = gAgentWearables.getWearable(WT_SHAPE, 0); + } + if (!mEditWearable || !wearable) + { + return; + } + + mEditWearable->setVisible(visible); + mFilterEditor->setVisible(!visible); + mPanelOutfitsInventory->setVisible(!visible); +} + +void LLSidepanelAppearance::updateVerbs() +{ + bool is_look_info_visible = mLookInfo->getVisible(); + mOverflowBtn->setEnabled(false); + + if (is_look_info_visible) + { + } + else + { + mPanelOutfitsInventory->updateVerbs(); + } +} + +void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string name) +{ + if (name == "") + { + const LLUUID current_outfit_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + // Can't search on AT_OUTFIT since links to categories return AT_CATEGORY for type since they don't + // return preferred type. + LLIsType is_category( LLAssetType::AT_CATEGORY ); + gInventory.collectDescendentsIf(current_outfit_cat, + cat_array, + item_array, + false, + is_category, + false); + for (LLInventoryModel::item_array_t::const_iterator iter = item_array.begin(); + iter != item_array.end(); + iter++) + { + const LLViewerInventoryItem *item = (*iter); + const LLViewerInventoryCategory *cat = item->getLinkedCategory(); + if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT) + { + mCurrentLookName->setText(cat->getName()); + return; + } + } + mCurrentLookName->setText(std::string("")); + } + else + { + mCurrentLookName->setText(name); + } +} + +//static +void LLSidepanelAppearance::editWearable(LLWearable *wearable, void *data) +{ + LLSidepanelAppearance *panel = (LLSidepanelAppearance*) data; + panel->toggleLookInfoPanel(FALSE); + panel->toggleWearableEditPanel(TRUE, wearable); +} + +// Fetch currently worn items and only enable the New Look button after everything's been +// fetched. Alternatively, we could stuff this logic into llagentwearables::makeNewOutfitLinks. +void LLSidepanelAppearance::fetchInventory() +{ + + mNewLookBtn->setEnabled(false); + LLInventoryFetchObserver::item_ref_t ids; + LLUUID item_id; + for(S32 type = (S32)WT_SHAPE; type < (S32)WT_COUNT; ++type) + { + // MULTI_WEARABLE: + item_id = gAgentWearables.getWearableItemID((EWearableType)type,0); + if(item_id.notNull()) + { + ids.push_back(item_id); + } + } + + LLVOAvatarSelf* avatar = gAgent.getAvatarObject(); + if( avatar ) + { + for (LLVOAvatar::attachment_map_t::const_iterator iter = avatar->mAttachmentPoints.begin(); + iter != avatar->mAttachmentPoints.end(); ++iter) + { + LLViewerJointAttachment* attachment = iter->second; + if (!attachment) continue; + for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); + attachment_iter != attachment->mAttachedObjects.end(); + ++attachment_iter) + { + LLViewerObject* attached_object = (*attachment_iter); + if (!attached_object) continue; + const LLUUID& item_id = attached_object->getItemID(); + if (item_id.isNull()) continue; + ids.push_back(item_id); + } + } + } + + mFetchWorn->fetchItems(ids); + // If no items to be fetched, done will never be triggered. + // TODO: Change LLInventoryFetchObserver::fetchItems to trigger done() on this condition. + if (mFetchWorn->isEverythingComplete()) + { + mFetchWorn->done(); + } + else + { + gInventory.addObserver(mFetchWorn); + } +} + +void LLSidepanelAppearance::inventoryFetched() +{ + mNewLookBtn->setEnabled(true); +} diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h new file mode 100644 index 0000000000..7be6d2d432 --- /dev/null +++ b/indra/newview/llsidepanelappearance.h @@ -0,0 +1,102 @@ +/** + * @file llsidepanelappearance.h + * @brief Side Bar "Appearance" panel + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLSIDEPANELAPPEARANCE_H +#define LL_LLSIDEPANELAPPEARANCE_H + +#include "llpanel.h" +#include "llinventoryobserver.h" + +#include "llinventory.h" +#include "llpanellookinfo.h" + +class LLFilterEditor; +class LLCurrentlyWornFetchObserver; +class LLPanelEditWearable; +class LLWearable; +class LLPanelOutfitsInventory; + +class LLSidepanelAppearance : public LLPanel +{ +public: + LLSidepanelAppearance(); + virtual ~LLSidepanelAppearance(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + + void refreshCurrentOutfitName(const std::string name = ""); + + static void editWearable(LLWearable *wearable, void *data); + + void fetchInventory(); + void inventoryFetched(); +private: + void onFilterEdit(const std::string& search_string); + + void onEditAppearanceButtonClicked(); + void onWearButtonClicked(); + void onEditButtonClicked(); + void onNewOutfitButtonClicked(); + void onBackButtonClicked(); + void onEditWearBackClicked(); + void toggleLookInfoPanel(BOOL visible); + void toggleWearableEditPanel(BOOL visible, LLWearable* wearable); + + void updateVerbs(); + + LLFilterEditor* mFilterEditor; + LLPanelOutfitsInventory* mPanelOutfitsInventory; + LLPanelLookInfo* mLookInfo; + LLPanelEditWearable* mEditWearable; + + LLButton* mEditAppearanceBtn; + LLButton* mWearBtn; + LLButton* mEditBtn; + LLButton* mNewLookBtn; + LLButton* mOverflowBtn; + LLPanel* mCurrLookPanel; + + LLTextBox* mCurrentLookName; + + // Used to make sure the user's inventory is in memory. + LLCurrentlyWornFetchObserver* mFetchWorn; + + // Search string for filtering landmarks and teleport + // history locations + std::string mFilterSubString; + + // Information type currently shown in Look Information panel + std::string mLookInfoType; + +}; + +#endif //LL_LLSIDEPANELAPPEARANCE_H diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml index b48c962413..7cfcac8a9a 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory.xml @@ -30,7 +30,7 @@ name="Fetched"> Fetched - + + +