summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/newview/llagentwearables.cpp230
-rw-r--r--indra/newview/llchathistory.cpp4
-rw-r--r--indra/newview/llchatitemscontainerctrl.cpp5
-rw-r--r--indra/newview/llimfloater.cpp2
-rw-r--r--indra/newview/lllogchat.cpp3
-rw-r--r--indra/newview/llnearbychat.cpp2
-rw-r--r--indra/newview/llviewerparcelmediaautoplay.cpp16
-rw-r--r--indra/newview/llviewerparcelmediaautoplay.h2
8 files changed, 229 insertions, 35 deletions
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index f49f862045..10a2dd132a 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -95,19 +95,38 @@ public:
enum ELibraryOutfitFetchStep {
LOFS_FOLDER = 0,
LOFS_OUTFITS,
+ LOFS_LIBRARY,
+ LOFS_IMPORTED,
LOFS_CONTENTS
};
- LLLibraryOutfitsFetch() : mCurrFetchStep(LOFS_FOLDER), mOutfitsPopulated(false) {}
+ LLLibraryOutfitsFetch() : mCurrFetchStep(LOFS_FOLDER), mOutfitsPopulated(false)
+ {
+ mMyOutfitsID = LLUUID::null;
+ mClothingID = LLUUID::null;
+ mLibraryClothingID = LLUUID::null;
+ mImportedClothingID = LLUUID::null;
+ mImportedClothingName = "Imported Library Clothing";
+ }
~LLLibraryOutfitsFetch() {}
- virtual void done();
+ virtual void done();
void doneIdle();
+ LLUUID mMyOutfitsID;
+ void importedFolderFetch();
protected:
void folderDone(void);
void outfitsDone(void);
+ void libraryDone(void);
+ void importedFolderDone(void);
void contentsDone(void);
enum ELibraryOutfitFetchStep mCurrFetchStep;
- std::vector< std::pair< LLUUID, std::string > > mOutfits;
+ typedef std::vector< std::pair< LLUUID, std::string > > cloth_folder_vec_t;
+ cloth_folder_vec_t mLibraryClothingFolders;
+ cloth_folder_vec_t mImportedClothingFolders;
bool mOutfitsPopulated;
+ LLUUID mClothingID;
+ LLUUID mLibraryClothingID;
+ LLUUID mImportedClothingID;
+ std::string mImportedClothingName;
};
LLAgentWearables gAgentWearables;
@@ -2126,11 +2145,15 @@ void LLAgentWearables::populateMyOutfitsFolder(void)
// Get the complete information on the items in the inventory and
// setup an observer that will wait for that to happen.
LLInventoryFetchDescendentsObserver::folder_ref_t folders;
- const LLUUID my_outfits_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+ outfits->mMyOutfitsID = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
- folders.push_back(my_outfits_id);
+ folders.push_back(outfits->mMyOutfitsID);
gInventory.addObserver(outfits);
outfits->fetchDescendents(folders);
+ if (outfits->isEverythingComplete())
+ {
+ outfits->done();
+ }
}
void LLLibraryOutfitsFetch::done()
@@ -2144,13 +2167,24 @@ void LLLibraryOutfitsFetch::done()
void LLLibraryOutfitsFetch::doneIdle()
{
gInventory.addObserver(this); // Add this back in since it was taken out during ::done()
+
switch (mCurrFetchStep)
{
case LOFS_FOLDER:
folderDone();
+ mCurrFetchStep = LOFS_OUTFITS;
break;
case LOFS_OUTFITS:
outfitsDone();
+ mCurrFetchStep = LOFS_LIBRARY;
+ break;
+ case LOFS_LIBRARY:
+ libraryDone();
+ mCurrFetchStep = LOFS_IMPORTED;
+ break;
+ case LOFS_IMPORTED:
+ importedFolderDone();
+ mCurrFetchStep = LOFS_CONTENTS;
break;
case LOFS_CONTENTS:
contentsDone();
@@ -2172,67 +2206,217 @@ void LLLibraryOutfitsFetch::doneIdle()
void LLLibraryOutfitsFetch::folderDone(void)
{
- // Early out if we already have items in My Outfits.
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t wearable_array;
- gInventory.collectDescendents(mCompleteFolders.front(), cat_array, wearable_array,
+ gInventory.collectDescendents(mMyOutfitsID, cat_array, wearable_array,
LLInventoryModel::EXCLUDE_TRASH);
+
+ // Early out if we already have items in My Outfits.
if (cat_array.count() > 0 || wearable_array.count() > 0)
{
mOutfitsPopulated = true;
return;
}
- // Get the UUID of the library's clothing folder
- const LLUUID library_clothing_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING, false, true);
+ mClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
+ mLibraryClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING, false, true);
mCompleteFolders.clear();
// Get the complete information on the items in the inventory.
LLInventoryFetchDescendentsObserver::folder_ref_t folders;
- folders.push_back(library_clothing_id);
- mCurrFetchStep = LOFS_OUTFITS;
+ folders.push_back(mClothingID);
+ folders.push_back(mLibraryClothingID);
fetchDescendents(folders);
+ if (isEverythingComplete())
+ {
+ done();
+ }
}
void LLLibraryOutfitsFetch::outfitsDone(void)
{
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t wearable_array;
- gInventory.collectDescendents(mCompleteFolders.front(), cat_array, wearable_array,
- LLInventoryModel::EXCLUDE_TRASH);
-
LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+ // Collect the contents of the Library's Clothing folder
+ gInventory.collectDescendents(mLibraryClothingID, cat_array, wearable_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+
llassert(cat_array.count() > 0);
for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array.begin();
iter != cat_array.end();
++iter)
{
const LLViewerInventoryCategory *cat = iter->get();
+
+ // Get the names and id's of every outfit in the library, except for ruth and other "misc" outfits.
if (cat->getName() != "More Outfits" && cat->getName() != "Ruth")
{
+ // Get the name of every outfit in the library
folders.push_back(cat->getUUID());
- mOutfits.push_back(std::make_pair(cat->getUUID(), cat->getName()));
+ mLibraryClothingFolders.push_back(std::make_pair(cat->getUUID(), cat->getName()));
+ }
+ }
+
+ // Collect the contents of your Inventory Clothing folder
+ cat_array.clear();
+ wearable_array.clear();
+ gInventory.collectDescendents(mClothingID, cat_array, wearable_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+
+ // Check if you already have an "Imported Library Clothing" folder
+ for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array.begin();
+ iter != cat_array.end();
+ ++iter)
+ {
+ const LLViewerInventoryCategory *cat = iter->get();
+ if (cat->getName() == mImportedClothingName)
+ {
+ mImportedClothingID = cat->getUUID();
}
}
+
mCompleteFolders.clear();
+
+ fetchDescendents(folders);
+ if (isEverythingComplete())
+ {
+ done();
+ }
+}
+
+class LLLibraryOutfitsCopyDone: public LLInventoryCallback
+{
+public:
+ LLLibraryOutfitsCopyDone(LLLibraryOutfitsFetch * fetcher):
+ mFireCount(0), mLibraryOutfitsFetcher(fetcher)
+ {
+ }
+
+ virtual ~LLLibraryOutfitsCopyDone()
+ {
+ if (mLibraryOutfitsFetcher)
+ {
+ gInventory.addObserver(mLibraryOutfitsFetcher);
+ mLibraryOutfitsFetcher->done();
+ }
+ }
+
+ /* virtual */ void fire(const LLUUID& inv_item)
+ {
+ mFireCount++;
+ }
+private:
+ U32 mFireCount;
+ LLLibraryOutfitsFetch * mLibraryOutfitsFetcher;
+};
- mCurrFetchStep = LOFS_CONTENTS;
+void LLLibraryOutfitsFetch::libraryDone(void)
+{
+ // Copy the clothing folders from the library into the imported clothing folder if necessary.
+ if (mImportedClothingID == LLUUID::null)
+ {
+ gInventory.removeObserver(this);
+ LLPointer<LLInventoryCallback> copy_waiter = new LLLibraryOutfitsCopyDone(this);
+ mImportedClothingID = gInventory.createNewCategory(mClothingID,
+ LLFolderType::FT_NONE,
+ mImportedClothingName);
+
+ for (cloth_folder_vec_t::const_iterator iter = mLibraryClothingFolders.begin();
+ iter != mLibraryClothingFolders.end();
+ ++iter)
+ {
+ LLUUID folder_id = gInventory.createNewCategory(mImportedClothingID,
+ LLFolderType::FT_NONE,
+ iter->second);
+ LLAppearanceManager::getInstance()->shallowCopyCategory(iter->first, folder_id, copy_waiter);
+ }
+ }
+ else
+ {
+ // Skip straight to fetching the contents of the imported folder
+ importedFolderFetch();
+ }
+}
+
+void LLLibraryOutfitsFetch::importedFolderFetch(void)
+{
+ // Fetch the contents of the Imported Clothing Folder
+ LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+ folders.push_back(mImportedClothingID);
+
+ mCompleteFolders.clear();
+
fetchDescendents(folders);
+ if (isEverythingComplete())
+ {
+ done();
+ }
}
-void LLLibraryOutfitsFetch::contentsDone(void)
+void LLLibraryOutfitsFetch::importedFolderDone(void)
{
- for(S32 i = 0; i < (S32)mOutfits.size(); ++i)
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t wearable_array;
+ LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+
+ // Collect the contents of the Imported Clothing folder
+ gInventory.collectDescendents(mImportedClothingID, cat_array, wearable_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+
+ for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array.begin();
+ iter != cat_array.end();
+ ++iter)
+ {
+ const LLViewerInventoryCategory *cat = iter->get();
+
+ // Get the name of every imported outfit
+ folders.push_back(cat->getUUID());
+ mImportedClothingFolders.push_back(std::make_pair(cat->getUUID(), cat->getName()));
+ }
+
+ mCompleteFolders.clear();
+ fetchDescendents(folders);
+ if (isEverythingComplete())
+ {
+ done();
+ }
+}
+
+void LLLibraryOutfitsFetch::contentsDone(void)
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t wearable_array;
+
+ for (cloth_folder_vec_t::const_iterator folder_iter = mImportedClothingFolders.begin();
+ folder_iter != mImportedClothingFolders.end();
+ ++folder_iter)
{
// First, make a folder in the My Outfits directory.
- const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
- LLUUID folder_id = gInventory.createNewCategory(parent_id,
- LLFolderType::FT_OUTFIT,
- mOutfits[i].second);
- LLAppearanceManager::getInstance()->shallowCopyCategory(mOutfits[i].first, folder_id, NULL);
+ LLUUID new_outfit_folder_id = gInventory.createNewCategory(mMyOutfitsID, LLFolderType::FT_OUTFIT, folder_iter->second);
+
+ cat_array.clear();
+ wearable_array.clear();
+ // Collect the contents of each imported clothing folder, so we can create new outfit links for it
+ gInventory.collectDescendents(folder_iter->first, cat_array, wearable_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+
+ for (LLInventoryModel::item_array_t::const_iterator wearable_iter = wearable_array.begin();
+ wearable_iter != wearable_array.end();
+ ++wearable_iter)
+ {
+ const LLViewerInventoryItem *item = wearable_iter->get();
+ link_inventory_item(gAgent.getID(),
+ item->getLinkedUUID(),
+ new_outfit_folder_id,
+ item->getName(),
+ LLAssetType::AT_LINK,
+ NULL);
+ }
}
+
mOutfitsPopulated = true;
}
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index dac3280575..cda3e3a419 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -576,10 +576,10 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
style_params.font.style = "ITALIC";
if (chat.mFromName.size() > 0)
- mEditor->appendText(chat.mFromName + " ", TRUE, style_params);
+ mEditor->appendText(chat.mFromName, TRUE, style_params);
// Ensure that message ends with NewLine, to avoid losing of new lines
// while copy/paste from text chat. See EXT-3263.
- mEditor->appendText(chat.mText.substr(4) + NEW_LINE, FALSE, style_params);
+ mEditor->appendText(chat.mText.substr(3) + NEW_LINE, FALSE, style_params);
}
else
{
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 60a37ac4af..9ce3f29853 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -170,10 +170,7 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
std::string str_sender;
- if(gAgentID != mFromID)
- str_sender = fromName;
- else
- str_sender = LLTrans::getString("You");
+ str_sender = fromName;
str_sender+=" ";
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index fdc5d14d97..b05568f353 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -595,7 +595,7 @@ void LLIMFloater::updateMessages()
std::string time = msg["time"].asString();
LLUUID from_id = msg["from_id"].asUUID();
- std::string from = from_id != gAgentID ? msg["from"].asString() : LLTrans::getString("You");
+ std::string from = msg["from"].asString();
std::string message = msg["message"].asString();
LLChat chat;
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index fc9654e9ad..92f19c9232 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -59,9 +59,6 @@ const static std::string NEW_LINE_SPACE_PREFIX("\n ");
const static std::string TWO_SPACES(" ");
const static std::string MULTI_LINE_PREFIX(" ");
-//viewer 1.23 may have used "You" for Agent's entries
-const static std::string YOU("You");
-
/**
* Chat log lines - timestamp and name are optional but message text is mandatory.
*
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index e7043b2d00..fc0e51b76d 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -178,7 +178,7 @@ void LLNearbyChat::addMessage(const LLChat& chat,bool archive)
if (!chat.mMuted)
{
- tmp_chat.mFromName = chat.mFromID != gAgentID ? chat.mFromName : LLTrans::getString("You");
+ tmp_chat.mFromName = chat.mFromName;
if (chat.mChatStyle == CHAT_STYLE_IRC)
{
diff --git a/indra/newview/llviewerparcelmediaautoplay.cpp b/indra/newview/llviewerparcelmediaautoplay.cpp
index 1b79b47905..ad2723b66b 100644
--- a/indra/newview/llviewerparcelmediaautoplay.cpp
+++ b/indra/newview/llviewerparcelmediaautoplay.cpp
@@ -35,6 +35,7 @@
#include "llviewerparcelmedia.h"
#include "llviewercontrol.h"
#include "llviewermedia.h"
+#include "llviewerregion.h"
#include "llparcel.h"
#include "llviewerparcelmgr.h"
#include "lluuid.h"
@@ -48,6 +49,8 @@ const F32 AUTOPLAY_SPEED = 0.1f; // how slow should the agent be moving t
LLViewerParcelMediaAutoPlay::LLViewerParcelMediaAutoPlay() :
LLEventTimer(1),
+
+ mLastParcelID(-1),
mPlayed(FALSE),
mTimeInParcel(0)
{
@@ -81,9 +84,18 @@ void LLViewerParcelMediaAutoPlay::playStarted()
BOOL LLViewerParcelMediaAutoPlay::tick()
{
LLParcel *this_parcel = NULL;
+ LLViewerRegion *this_region = NULL;
std::string this_media_url;
LLUUID this_media_texture_id;
S32 this_parcel_id = 0;
+ LLUUID this_region_id;
+
+ this_region = gAgent.getRegion();
+
+ if (this_region)
+ {
+ this_region_id = this_region->getRegionID();
+ }
this_parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
@@ -96,12 +108,14 @@ BOOL LLViewerParcelMediaAutoPlay::tick()
this_parcel_id = this_parcel->getLocalID();
}
- if (this_parcel_id != mLastParcelID)
+ if (this_parcel_id != mLastParcelID ||
+ this_region_id != mLastRegionID)
{
// we've entered a new parcel
mPlayed = FALSE; // we haven't autoplayed yet
mTimeInParcel = 0; // reset our timer
mLastParcelID = this_parcel_id;
+ mLastRegionID = this_region_id;
}
mTimeInParcel += mPeriod; // increase mTimeInParcel by the amount of time between ticks
diff --git a/indra/newview/llviewerparcelmediaautoplay.h b/indra/newview/llviewerparcelmediaautoplay.h
index 16279e7f1f..1d80b4756c 100644
--- a/indra/newview/llviewerparcelmediaautoplay.h
+++ b/indra/newview/llviewerparcelmediaautoplay.h
@@ -34,6 +34,7 @@
#define LLVIEWERPARCELMEDIAAUTOPLAY_H
#include "lltimer.h"
+#include "lluuid.h"
// timer to automatically play media
class LLViewerParcelMediaAutoPlay : LLEventTimer
@@ -47,6 +48,7 @@ class LLViewerParcelMediaAutoPlay : LLEventTimer
private:
S32 mLastParcelID;
+ LLUUID mLastRegionID;
BOOL mPlayed;
F32 mTimeInParcel;
};