diff options
Diffstat (limited to 'indra/newview')
47 files changed, 694 insertions, 369 deletions
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 11ac103b3a..7b55282ee5 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -119,9 +119,9 @@ protected: void importedFolderDone(void); void contentsDone(void); enum ELibraryOutfitFetchStep mCurrFetchStep; - typedef std::vector< std::pair< LLUUID, std::string > > cloth_folder_vec_t; - cloth_folder_vec_t mLibraryClothingFolders; - cloth_folder_vec_t mImportedClothingFolders; + typedef std::vector<LLUUID> clothing_folder_vec_t; + clothing_folder_vec_t mLibraryClothingFolders; + clothing_folder_vec_t mImportedClothingFolders; bool mOutfitsPopulated; LLUUID mClothingID; LLUUID mLibraryClothingID; @@ -2240,7 +2240,7 @@ void LLAgentWearables::updateServer() void LLAgentWearables::populateMyOutfitsFolder(void) { - llinfos << "starting outfit populate" << llendl; + llinfos << "starting outfit population" << llendl; LLLibraryOutfitsFetch* outfits = new LLLibraryOutfitsFetch(); @@ -2312,17 +2312,28 @@ void LLLibraryOutfitsFetch::folderDone(void) LLInventoryModel::item_array_t 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; } - + mClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING); mLibraryClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING, false, true); - + + // If Library->Clothing->Initial Outfits exists, use that. + LLNameCategoryCollector matchFolderFunctor("Initial Outfits"); + gInventory.collectDescendentsIf(mLibraryClothingID, + cat_array, wearable_array, + LLInventoryModel::EXCLUDE_TRASH, + matchFolderFunctor); + if (cat_array.count() > 0) + { + const LLViewerInventoryCategory *cat = cat_array.get(0); + mLibraryClothingID = cat->getUUID(); + } + mCompleteFolders.clear(); // Get the complete information on the items in the inventory. @@ -2353,31 +2364,28 @@ void LLLibraryOutfitsFetch::outfitsDone(void) { 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 names and id's of every outfit in the library, skip "Ruth" + // because it's a low quality legacy outfit + if (cat->getName() != "Ruth") { // Get the name of every outfit in the library folders.push_back(cat->getUUID()); - mLibraryClothingFolders.push_back(std::make_pair(cat->getUUID(), cat->getName())); + mLibraryClothingFolders.push_back(cat->getUUID()); } } - - // 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) + LLNameCategoryCollector matchFolderFunctor(mImportedClothingName); + gInventory.collectDescendentsIf(mClothingID, + cat_array, wearable_array, + LLInventoryModel::EXCLUDE_TRASH, + matchFolderFunctor); + if (cat_array.size() > 0) { - const LLViewerInventoryCategory *cat = iter->get(); - if (cat->getName() == mImportedClothingName) - { - mImportedClothingID = cat->getUUID(); - } + const LLViewerInventoryCategory *cat = cat_array.get(0); + mImportedClothingID = cat->getUUID(); } mCompleteFolders.clear(); @@ -2415,31 +2423,59 @@ private: LLLibraryOutfitsFetch * mLibraryOutfitsFetcher; }; +// Copy the clothing folders from the library into the imported clothing folder void LLLibraryOutfitsFetch::libraryDone(void) { - // Copy the clothing folders from the library into the imported clothing folder if necessary. - if (mImportedClothingID == LLUUID::null) + if (mImportedClothingID != LLUUID::null) { - gInventory.removeObserver(this); - LLPointer<LLInventoryCallback> copy_waiter = new LLLibraryOutfitsCopyDone(this); - mImportedClothingID = gInventory.createNewCategory(mClothingID, - LLFolderType::FT_NONE, - mImportedClothingName); + // Skip straight to fetching the contents of the imported folder + importedFolderFetch(); + return; + } + + // Remove observer; next autopopulation step will be triggered externally by LLLibraryOutfitsCopyDone. + gInventory.removeObserver(this); + + LLPointer<LLInventoryCallback> copy_waiter = new LLLibraryOutfitsCopyDone(this); + mImportedClothingID = gInventory.createNewCategory(mClothingID, + LLFolderType::FT_NONE, + mImportedClothingName); + // Copy each folder from library into clothing unless it already exists. + for (clothing_folder_vec_t::const_iterator iter = mLibraryClothingFolders.begin(); + iter != mLibraryClothingFolders.end(); + ++iter) + { + const LLUUID& src_folder_id = (*iter); // Library clothing folder ID + const LLViewerInventoryCategory *cat = gInventory.getCategory(src_folder_id); + if (!cat) + { + llwarns << "Library folder import for uuid:" << src_folder_id << " failed to find folder." << llendl; + continue; + } - for (cloth_folder_vec_t::const_iterator iter = mLibraryClothingFolders.begin(); - iter != mLibraryClothingFolders.end(); - ++iter) + if (!LLAppearanceManager::getInstance()->getCanMakeFolderIntoOutfit(src_folder_id)) { - LLUUID folder_id = gInventory.createNewCategory(mImportedClothingID, - LLFolderType::FT_NONE, - iter->second); - LLAppearanceManager::getInstance()->shallowCopyCategoryContents(iter->first, folder_id, copy_waiter); + llinfos << "Skipping non-outfit folder name:" << cat->getName() << llendl; + continue; } - } - else - { - // Skip straight to fetching the contents of the imported folder - importedFolderFetch(); + + // Don't copy the category if it already exists. + LLNameCategoryCollector matchFolderFunctor(cat->getName()); + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t wearable_array; + gInventory.collectDescendentsIf(mImportedClothingID, + cat_array, wearable_array, + LLInventoryModel::EXCLUDE_TRASH, + matchFolderFunctor); + if (cat_array.size() > 0) + { + continue; + } + + LLUUID dst_folder_id = gInventory.createNewCategory(mImportedClothingID, + LLFolderType::FT_NONE, + cat->getName()); + LLAppearanceManager::getInstance()->shallowCopyCategoryContents(src_folder_id, dst_folder_id, copy_waiter); } } @@ -2476,7 +2512,7 @@ void LLLibraryOutfitsFetch::importedFolderDone(void) // Get the name of every imported outfit folders.push_back(cat->getUUID()); - mImportedClothingFolders.push_back(std::make_pair(cat->getUUID(), cat->getName())); + mImportedClothingFolders.push_back(cat->getUUID()); } mCompleteFolders.clear(); @@ -2492,17 +2528,25 @@ 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(); + for (clothing_folder_vec_t::const_iterator folder_iter = mImportedClothingFolders.begin(); folder_iter != mImportedClothingFolders.end(); ++folder_iter) { + const LLUUID &folder_id = (*folder_iter); + const LLViewerInventoryCategory *cat = gInventory.getCategory(folder_id); + if (!cat) + { + llwarns << "Library folder import for uuid:" << folder_id << " failed to find folder." << llendl; + continue; + } + // First, make a folder in the My Outfits directory. - LLUUID new_outfit_folder_id = gInventory.createNewCategory(mMyOutfitsID, LLFolderType::FT_OUTFIT, folder_iter->second); + LLUUID new_outfit_folder_id = gInventory.createNewCategory(mMyOutfitsID, LLFolderType::FT_OUTFIT, cat->getName()); 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, + gInventory.collectDescendents(folder_id, cat_array, wearable_array, LLInventoryModel::EXCLUDE_TRASH); for (LLInventoryModel::item_array_t::const_iterator wearable_iter = wearable_array.begin(); diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 5c21be8c32..f08d8decfe 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -807,47 +807,91 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID void LLAppearanceManager::shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id, LLPointer<LLInventoryCallback> cb) { - LLInventoryModel::cat_array_t cats; - LLInventoryModel::item_array_t items; - gInventory.collectDescendents(src_id, cats, items, - LLInventoryModel::EXCLUDE_TRASH); - for (S32 i = 0; i < items.count(); ++i) - { - const LLViewerInventoryItem* item = items.get(i).get(); - if (item->getActualType() == LLAssetType::AT_LINK) - { - link_inventory_item(gAgent.getID(), - item->getLinkedUUID(), - dst_id, - item->getName(), - LLAssetType::AT_LINK, cb); - } - else if (item->getActualType() == LLAssetType::AT_LINK_FOLDER) + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + gInventory.getDirectDescendentsOf(src_id, cats, items); + for (LLInventoryModel::item_array_t::const_iterator iter = items->begin(); + iter != items->end(); + ++iter) + { + const LLViewerInventoryItem* item = (*iter); + switch (item->getActualType()) { - LLViewerInventoryCategory *catp = item->getLinkedCategory(); - // Skip copying outfit links. - if (catp && catp->getPreferredType() != LLFolderType::FT_OUTFIT) + case LLAssetType::AT_LINK: { link_inventory_item(gAgent.getID(), item->getLinkedUUID(), dst_id, item->getName(), - LLAssetType::AT_LINK_FOLDER, cb); + LLAssetType::AT_LINK, cb); + break; + } + case LLAssetType::AT_LINK_FOLDER: + { + LLViewerInventoryCategory *catp = item->getLinkedCategory(); + // Skip copying outfit links. + if (catp && catp->getPreferredType() != LLFolderType::FT_OUTFIT) + { + link_inventory_item(gAgent.getID(), + item->getLinkedUUID(), + dst_id, + item->getName(), + LLAssetType::AT_LINK_FOLDER, cb); + } + break; } + case LLAssetType::AT_CLOTHING: + case LLAssetType::AT_OBJECT: + case LLAssetType::AT_BODYPART: + case LLAssetType::AT_GESTURE: + { + copy_inventory_item(gAgent.getID(), + item->getPermissions().getOwner(), + item->getUUID(), + dst_id, + item->getName(), + cb); + break; + } + default: + // Ignore non-outfit asset types + break; } - else + } +} + +BOOL LLAppearanceManager::getCanMakeFolderIntoOutfit(const LLUUID& folder_id) +{ + // These are the wearable items that are required for considering this + // folder as containing a complete outfit. + U32 required_wearables = 0; + required_wearables |= 1LL << WT_SHAPE; + required_wearables |= 1LL << WT_SKIN; + required_wearables |= 1LL << WT_HAIR; + required_wearables |= 1LL << WT_EYES; + + // These are the wearables that the folder actually contains. + U32 folder_wearables = 0; + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + gInventory.getDirectDescendentsOf(folder_id, cats, items); + for (LLInventoryModel::item_array_t::const_iterator iter = items->begin(); + iter != items->end(); + ++iter) + { + const LLViewerInventoryItem* item = (*iter); + if (item->isWearableType()) { - copy_inventory_item( - gAgent.getID(), - item->getPermissions().getOwner(), - item->getUUID(), - dst_id, - item->getName(), - cb); + const EWearableType wearable_type = item->getWearableType(); + folder_wearables |= 1LL << wearable_type; } } + + // If the folder contains the required wearables, return TRUE. + return ((required_wearables & folder_wearables) == required_wearables); } + void LLAppearanceManager::purgeBaseOutfitLink(const LLUUID& category) { LLInventoryModel::cat_array_t cats; diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index e7e2f33520..9d6cd34ad7 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -60,6 +60,9 @@ public: void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id, LLPointer<LLInventoryCallback> cb); + // Return whether this folder contains minimal contents suitable for making a full outfit. + BOOL getCanMakeFolderIntoOutfit(const LLUUID& folder_id); + // Copy all items in a category. void shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id, LLPointer<LLInventoryCallback> cb); diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 50d8672083..45c540b3a3 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -183,6 +183,15 @@ void LLAvatarList::sortByName() sort(); } +void LLAvatarList::setDirty(bool val /*= true*/, bool force_refresh /*= false*/) +{ + mDirty = val; + if(mDirty && force_refresh) + { + refresh(); + } +} + ////////////////////////////////////////////////////////////////////////// // PROTECTED SECTION ////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index 0e4215e91a..00c72f1f9d 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -73,7 +73,7 @@ public: virtual void clear(); void setNameFilter(const std::string& filter); - void setDirty(bool val = true) { mDirty = val; } + void setDirty(bool val = true, bool force_refresh = false); uuid_vector_t& getIDs() { return mIDs; } bool contains(const LLUUID& id); diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp index 169a963d0d..f113cc49d4 100644 --- a/indra/newview/lldebugview.cpp +++ b/indra/newview/lldebugview.cpp @@ -81,11 +81,13 @@ void LLDebugView::init() r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f), (S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f)); + mFastTimerView = new LLFastTimerView(r); mFastTimerView->setFollowsTop(); mFastTimerView->setFollowsLeft(); mFastTimerView->setVisible(FALSE); // start invisible addChild(mFastTimerView); + mFastTimerView->setRect(rect); r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f), (S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f)); diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index 4fa97e789b..8bc3b5a75f 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -44,6 +44,7 @@ #include "llfontgl.h" #include "llsdserialize.h" #include "lltooltip.h" +#include "llbutton.h" #include "llappviewer.h" #include "llviewertexturelist.h" @@ -99,6 +100,8 @@ LLFastTimerView::LLFastTimerView(const LLRect& rect) FTV_NUM_TIMERS = LLFastTimer::NamedTimer::instanceCount(); mPrintStats = -1; mAverageCyclesPerTimer = 0; + setCanMinimize(false); + setCanClose(true); } @@ -139,6 +142,18 @@ LLFastTimer::NamedTimer* LLFastTimerView::getLegendID(S32 y) BOOL LLFastTimerView::handleMouseDown(S32 x, S32 y, MASK mask) { + + { + S32 local_x = x - mButtons[BUTTON_CLOSE]->getRect().mLeft; + S32 local_y = y - mButtons[BUTTON_CLOSE]->getRect().mBottom; + if(mButtons[BUTTON_CLOSE]->getVisible() + && mButtons[BUTTON_CLOSE]->pointInView(local_x, local_y) ) + { + return LLFloater::handleMouseDown(x, y, mask);; + } + } + + if (x < mBarRect.mLeft) { LLFastTimer::NamedTimer* idp = getLegendID(y); @@ -188,6 +203,15 @@ BOOL LLFastTimerView::handleMouseDown(S32 x, S32 y, MASK mask) BOOL LLFastTimerView::handleMouseUp(S32 x, S32 y, MASK mask) { + { + S32 local_x = x - mButtons[BUTTON_CLOSE]->getRect().mLeft; + S32 local_y = y - mButtons[BUTTON_CLOSE]->getRect().mBottom; + if(mButtons[BUTTON_CLOSE]->getVisible() + && mButtons[BUTTON_CLOSE]->pointInView(local_x, local_y) ) + { + return LLFloater::handleMouseUp(x, y, mask);; + } + } return FALSE; } @@ -1191,5 +1215,8 @@ void LLFastTimerView::doAnalysis(std::string baseline, std::string target, std:: return ; } } - +void LLFastTimerView::onClickCloseBtn() +{ + setVisible(false); +} diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h index f5c8f23818..ac06990913 100644 --- a/indra/newview/llfasttimerview.h +++ b/indra/newview/llfasttimerview.h @@ -63,7 +63,9 @@ public: LLFastTimer::NamedTimer* getLegendID(S32 y); F64 getTime(const std::string& name); - + +protected: + virtual void onClickCloseBtn(); private: typedef std::vector<std::vector<S32> > bar_positions_t; bar_positions_t mBarStart; diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 23f19a38a6..f7fd7bb472 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -179,6 +179,7 @@ LLFolderView::LLFolderView(const Params& p) mSourceID(p.task_id), mRenameItem( NULL ), mNeedsScroll( FALSE ), + mEnableScroll( true ), mPinningSelectedItem(FALSE), mNeedsAutoSelect( FALSE ), mAutoSelectOverride(FALSE), @@ -1913,7 +1914,7 @@ void LLFolderView::deleteAllChildren() void LLFolderView::scrollToShowSelection() { - if (mSelectedItems.size()) + if (mEnableScroll && mSelectedItems.size()) { mNeedsScroll = TRUE; } diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index faf6a9cf23..38255b3cea 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -269,6 +269,7 @@ public: void dumpSelectionInformation(); virtual S32 notify(const LLSD& info) ; + void setEnableScroll(bool enable_scroll) { mEnableScroll = enable_scroll; } private: void updateRenamerPosition(); @@ -300,6 +301,7 @@ protected: LLLineEditor* mRenamer; BOOL mNeedsScroll; + bool mEnableScroll; BOOL mPinningSelectedItem; LLRect mScrollConstraintRect; BOOL mNeedsAutoSelect; diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp index ac060cef15..18f81fe506 100644 --- a/indra/newview/llfriendcard.cpp +++ b/indra/newview/llfriendcard.cpp @@ -44,24 +44,28 @@ // Constants; -static const std::string INVENTORY_STRING_FRIENDS_SUBFOLDER = "InvFolder Friends"; -static const std::string INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER = "InvFolder All"; +static const std::string INVENTORY_STRING_FRIENDS_SUBFOLDER = "Friends"; +static const std::string INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER = "All"; // helper functions -// NOTE: Usage of LLTrans::getString(); in next two functions to set localized -// folders' names is caused by a hack in the LLFolderViewItem::refreshFromListener() -// method for protected asset types. -// So, localized names will be got from the strings with "InvFolder LABEL_NAME" -// in the strings.xml +// NOTE: For now Friends & All folders are created as protected folders of the LLFolderType::FT_CALLINGCARD type. +// So, their names will be processed in the LLFolderViewItem::refreshFromListener() to be localized +// using "InvFolder LABEL_NAME" as LLTrans::findString argument. + +// We must use in this file their hard-coded names to ensure found them on different locales. EXT-5829. +// These hard-coded names will be stored in InventoryItems but shown localized in FolderViewItems + +// If hack in the LLFolderViewItem::refreshFromListener() to localize protected folder is removed +// or these folders are not protected these names should be localized in another place/way. inline const std::string get_friend_folder_name() { - return LLTrans::getString(INVENTORY_STRING_FRIENDS_SUBFOLDER); + return INVENTORY_STRING_FRIENDS_SUBFOLDER; } inline const std::string get_friend_all_subfolder_name() { - return LLTrans::getString(INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER); + return INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER; } void move_from_to_arrays(LLInventoryModel::cat_array_t& from, LLInventoryModel::cat_array_t& to) @@ -350,9 +354,9 @@ const LLUUID& LLFriendCardsManager::findFriendAllSubfolderUUIDImpl() const return findChildFolderUUID(friendFolderUUID, friendAllSubfolderName); } -const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& localizedName) const +const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& nonLocalizedName) const { - LLNameCategoryCollector matchFolderFunctor(localizedName); + LLNameCategoryCollector matchFolderFunctor(nonLocalizedName); return get_folder_uuid(parentFolderUUID, matchFolderFunctor); } diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h index b94d5ec2c0..1cda52c1d7 100644 --- a/indra/newview/llfriendcard.h +++ b/indra/newview/llfriendcard.h @@ -120,7 +120,7 @@ private: return (mBuddyIDSet.end() != mBuddyIDSet.find(avatarID)); } - const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& localizedName) const; + const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& nonLocalizedName) const; const LLUUID& findFriendFolderUUIDImpl() const; const LLUUID& findFriendAllSubfolderUUIDImpl() const; const LLUUID& findFriendCardInventoryUUIDImpl(const LLUUID& avatarID); diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp index d518318b0e..9eb11a6ac4 100644 --- a/indra/newview/llimfloatercontainer.cpp +++ b/indra/newview/llimfloatercontainer.cpp @@ -96,8 +96,29 @@ void LLIMFloaterContainer::addFloater(LLFloater* floaterp, LLUUID session_id = floaterp->getKey(); - floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, session_id)); - mSessions[session_id] = floaterp; + LLIconCtrl* icon = 0; + + if(gAgent.isInGroup(session_id, TRUE)) + { + LLGroupIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLGroupIconCtrl>(); + icon_params.group_id = session_id; + icon = LLUICtrlFactory::instance().createWidget<LLGroupIconCtrl>(icon_params); + + mSessions[session_id] = floaterp; + floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, session_id)); + } + else + { + LLUUID avatar_id = LLIMModel::getInstance()->getOtherParticipantID(session_id); + + LLAvatarIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLAvatarIconCtrl>(); + icon_params.avatar_id = avatar_id; + icon = LLUICtrlFactory::instance().createWidget<LLAvatarIconCtrl>(icon_params); + + mSessions[session_id] = floaterp; + floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, session_id)); + } + mTabContainer->setTabImage(floaterp, icon); } void LLIMFloaterContainer::onCloseFloater(LLUUID& id) @@ -134,6 +155,8 @@ void LLIMFloaterContainer::setMinimized(BOOL b) if (isMinimized() == b) return; LLMultiFloater::setMinimized(b); + // Hide minimized floater (see EXT-5315) + setVisible(!b); if (isMinimized()) return; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 048ed10886..8097985ade 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -681,6 +681,21 @@ BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, return handled; } +// virtual +void LLInventoryPanel::onMouseEnter(S32 x, S32 y, MASK mask) +{ + LLPanel::onMouseEnter(x, y, mask); + // don't auto-scroll a list when cursor is over Inventory. See EXT-3981. + mFolders->setEnableScroll(false); +} + +// virtual +void LLInventoryPanel::onMouseLeave(S32 x, S32 y, MASK mask) +{ + LLPanel::onMouseLeave(x, y, mask); + mFolders->setEnableScroll(true); +} + void LLInventoryPanel::onFocusLost() { // inventory no longer handles cut/copy/paste/delete diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index f312b588b9..37b03dbd7d 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -122,6 +122,10 @@ public: void* cargo_data, EAcceptance* accept, std::string& tooltip_msg); + + void onMouseEnter(S32 x, S32 y, MASK mask); + void onMouseLeave(S32 x, S32 y, MASK mask); + // LLUICtrl methods /*virtual*/ void onFocusLost(); /*virtual*/ void onFocusReceived(); diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index 114fef8712..883d4cdf4b 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -47,6 +47,8 @@ static LLDefaultChildRegistry::Register<LLNameListCtrl> r("name_list"); +static const S32 info_icon_size = 16; + void LLNameListCtrl::NameTypeNames::declareValues() { declare("INDIVIDUAL", LLNameListCtrl::INDIVIDUAL); @@ -138,6 +140,29 @@ void LLNameListCtrl::showInspector(const LLUUID& avatar_id, bool is_group) LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", avatar_id)); } +void LLNameListCtrl::mouseOverHighlightNthItem( S32 target_index ) +{ + if (getHighlightedItemInx()!= target_index) + { + if(getHighlightedItemInx()!=-1) + { + LLScrollListItem* item = getItemList()[getHighlightedItemInx()]; + LLScrollListText* cell = dynamic_cast<LLScrollListText*>(item->getColumn(mNameColumnIndex)); + if(cell) + cell->setTextWidth(cell->getTextWidth() + info_icon_size); + } + if(target_index != -1) + { + LLScrollListItem* item = getItemList()[target_index]; + LLScrollListText* cell = dynamic_cast<LLScrollListText*>(item->getColumn(mNameColumnIndex)); + if(cell) + cell->setTextWidth(cell->getTextWidth() - info_icon_size); + } + } + + LLScrollListCtrl::mouseOverHighlightNthItem(target_index); +} + //virtual BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask) { @@ -164,7 +189,7 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask) // Spawn at right side of cell LLPointer<LLUIImage> icon = LLUI::getUIImage("Info_Small"); - LLCoordGL pos( sticky_rect.mRight - 16, sticky_rect.mTop - (sticky_rect.getHeight() - icon->getHeight())/2 ); + LLCoordGL pos( sticky_rect.mRight - info_icon_size, sticky_rect.mTop - (sticky_rect.getHeight() - icon->getHeight())/2 ); // Should we show a group or an avatar inspector? bool is_group = hit_item->getValue()["is_group"].asBoolean(); diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h index 23b1cb6897..1c26ee5db4 100644 --- a/indra/newview/llnamelistctrl.h +++ b/indra/newview/llnamelistctrl.h @@ -120,6 +120,8 @@ public: void setAllowCallingCardDrop(BOOL b) { mAllowCallingCardDrop = b; } /*virtual*/ void updateColumns(); + + /*virtual*/ void mouseOverHighlightNthItem( S32 index ); private: void showInspector(const LLUUID& avatar_id, bool is_group); diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index 836331b44b..7cf27d9141 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -1290,18 +1290,11 @@ void LLPanelClassifiedInfo::resetData() void LLPanelClassifiedInfo::resetControls() { - if(getAvatarId() == gAgent.getID()) - { - childSetEnabled("edit_btn", TRUE); - childSetVisible("edit_btn", TRUE); - childSetVisible("auto_renew", TRUE); - } - else - { - childSetEnabled("edit_btn", FALSE); - childSetVisible("edit_btn", FALSE); - childSetVisible("auto_renew", FALSE); - } + bool is_self = getAvatarId() == gAgent.getID(); + + childSetEnabled("edit_btn", is_self); + childSetVisible("edit_btn", is_self); + childSetVisible("price_layout_panel", is_self); } void LLPanelClassifiedInfo::setClassifiedName(const std::string& name) diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp index c02f154dc8..a73c25a979 100644 --- a/indra/newview/llpanelnearbymedia.cpp +++ b/indra/newview/llpanelnearbymedia.cpp @@ -549,11 +549,10 @@ void LLPanelNearByMedia::refreshParcelItems() MediaClass choice = (MediaClass)choice_llsd.asInteger(); // Only show "special parcel items" if "All" or "Within" filter // (and if media is "enabled") - bool should_include = gSavedSettings.getBOOL("AudioStreamingMedia") && - (choice == MEDIA_CLASS_ALL || choice == MEDIA_CLASS_WITHIN_PARCEL); + bool should_include = (choice == MEDIA_CLASS_ALL || choice == MEDIA_CLASS_WITHIN_PARCEL); // First Parcel Media: add or remove it as necessary - if (should_include && LLViewerMedia::hasParcelMedia()) + if (gSavedSettings.getBOOL("AudioStreamingMedia") &&should_include && LLViewerMedia::hasParcelMedia()) { // Yes, there is parcel media. if (NULL == mParcelMediaItem) @@ -716,11 +715,14 @@ void LLPanelNearByMedia::refreshList() } } } - mDisableAllCtrl->setEnabled(gSavedSettings.getBOOL("AudioStreamingMedia") && + mDisableAllCtrl->setEnabled((gSavedSettings.getBOOL("AudioStreamingMusic") || + gSavedSettings.getBOOL("AudioStreamingMedia")) && (LLViewerMedia::isAnyMediaShowing() || LLViewerMedia::isParcelMediaPlaying() || LLViewerMedia::isParcelAudioPlaying())); - mEnableAllCtrl->setEnabled(gSavedSettings.getBOOL("AudioStreamingMedia") && + + mEnableAllCtrl->setEnabled( (gSavedSettings.getBOOL("AudioStreamingMusic") || + gSavedSettings.getBOOL("AudioStreamingMedia")) && (disabled_count > 0 || // parcel media (if we have it, and it isn't playing, enable "start") (LLViewerMedia::hasParcelMedia() && ! LLViewerMedia::isParcelMediaPlaying()) || @@ -979,20 +981,13 @@ void LLPanelNearByMedia::onMoreLess() void LLPanelNearByMedia::updateControls() { - if (! gSavedSettings.getBOOL("AudioStreamingMedia")) - { - // Just show disabled controls - showDisabledControls(); - return; - } - LLUUID selected_media_id = mMediaList->getValue().asUUID(); if (selected_media_id == PARCEL_AUDIO_LIST_ITEM_UUID) { if (!LLViewerMedia::hasParcelAudio() || !gSavedSettings.getBOOL("AudioStreamingMusic")) { - // Shouldn't happen, but do this anyway + // disable controls if audio streaming music is disabled from preference showDisabledControls(); } else { @@ -1005,9 +1000,9 @@ void LLPanelNearByMedia::updateControls() } else if (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID) { - if (!LLViewerMedia::hasParcelMedia()) + if (!LLViewerMedia::hasParcelMedia() || !gSavedSettings.getBOOL("AudioStreamingMedia")) { - // Shouldn't happen, but do this anyway + // disable controls if audio streaming media is disabled from preference showDisabledControls(); } else { @@ -1034,7 +1029,7 @@ void LLPanelNearByMedia::updateControls() else { LLViewerMediaImpl* impl = LLViewerMedia::getMediaImplFromTextureID(selected_media_id); - if (NULL == impl) + if (NULL == impl || !gSavedSettings.getBOOL("AudioStreamingMedia")) { showDisabledControls(); } diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index d2a518a06a..93a6a7803a 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -683,9 +683,15 @@ void LLPanelPeople::updateFriendList() online_friendsp.push_back(buddy_id); } - mOnlineFriendList->setDirty(); - mAllFriendList->setDirty(); - + /* + * Avatarlists will be hidden by showFriendsAccordionsIfNeeded(), if they do not have items. + * But avatarlist can be updated only if it is visible @see LLAvatarList::draw(); + * So we need to do force update of lists to avoid inconsistency of data and view of avatarlist. + */ + mOnlineFriendList->setDirty(true, !mOnlineFriendList->filterHasMatches());// do force update if list do NOT have items + mAllFriendList->setDirty(true, !mAllFriendList->filterHasMatches()); + //update trash and other buttons according to a selected item + updateButtons(); showFriendsAccordionsIfNeeded(); } @@ -1434,9 +1440,8 @@ void LLPanelPeople::onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param { showAccordion("tab_all", param.asInteger()); } + updateButtons(); - LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion"); - accordion->arrange(); } void LLPanelPeople::setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed) diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp index 0630981d7e..6ebe55e362 100644 --- a/indra/newview/llsidepaneltaskinfo.cpp +++ b/indra/newview/llsidepaneltaskinfo.cpp @@ -100,6 +100,8 @@ BOOL LLSidepanelTaskInfo::postBuild() mPayBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onPayButtonClicked, this)); mBuyBtn = getChild<LLButton>("buy_btn"); mBuyBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onBuyButtonClicked, this)); + mDetailsBtn = getChild<LLButton>("details_btn"); + mDetailsBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onDetailsButtonClicked, this)); mLabelGroupName = getChild<LLNameBox>("Group Name Proxy"); @@ -1122,6 +1124,15 @@ void LLSidepanelTaskInfo::updateVerbs() //mEditBtn->setEnabled(obj && obj->permModify()); */ + LLSafeHandle<LLObjectSelection> object_selection = LLSelectMgr::getInstance()->getSelection(); + const BOOL multi_select = (object_selection->getNumNodes() > 1); + + mOpenBtn->setVisible(!multi_select); + mPayBtn->setVisible(!multi_select); + mBuyBtn->setVisible(!multi_select); + mDetailsBtn->setVisible(multi_select); + mDetailsBtn->setEnabled(multi_select); + mOpenBtn->setEnabled(enable_object_open()); mPayBtn->setEnabled(enable_pay_object()); mBuyBtn->setEnabled(enable_buy_object()); @@ -1145,6 +1156,11 @@ void LLSidepanelTaskInfo::onBuyButtonClicked() doClickAction(CLICK_ACTION_BUY); } +void LLSidepanelTaskInfo::onDetailsButtonClicked() +{ + LLFloaterReg::showInstance("inspect", LLSD()); +} + // virtual void LLSidepanelTaskInfo::save() { diff --git a/indra/newview/llsidepaneltaskinfo.h b/indra/newview/llsidepaneltaskinfo.h index cf36c20767..e41627435f 100644 --- a/indra/newview/llsidepaneltaskinfo.h +++ b/indra/newview/llsidepaneltaskinfo.h @@ -109,10 +109,12 @@ protected: void onOpenButtonClicked(); void onPayButtonClicked(); void onBuyButtonClicked(); + void onDetailsButtonClicked(); private: LLButton* mOpenBtn; LLButton* mPayBtn; LLButton* mBuyBtn; + LLButton* mDetailsBtn; protected: LLViewerObject* getObject(); diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index 732c23982b..9fb496c214 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -360,12 +360,14 @@ void LLStatusBar::refresh() // Disable media toggle if there's no media, parcel media, and no parcel audio // (or if media is disabled) - mMediaToggle->setEnabled(gSavedSettings.getBOOL("AudioStreamingMedia") && - (LLViewerMedia::hasInWorldMedia() || LLViewerMedia::hasParcelMedia() || LLViewerMedia::hasParcelAudio())); + bool button_enabled = (gSavedSettings.getBOOL("AudioStreamingMusic")||gSavedSettings.getBOOL("AudioStreamingMedia")) && + (LLViewerMedia::hasInWorldMedia() || LLViewerMedia::hasParcelMedia() || LLViewerMedia::hasParcelAudio()); + mMediaToggle->setEnabled(button_enabled); // Note the "sense" of the toggle is opposite whether media is playing or not - mMediaToggle->setValue(! (LLViewerMedia::isAnyMediaShowing() || + bool any_media_playing = (LLViewerMedia::isAnyMediaShowing() || LLViewerMedia::isParcelMediaPlaying() || - LLViewerMedia::isParcelAudioPlaying())); + LLViewerMedia::isParcelAudioPlaying()); + mMediaToggle->setValue(!any_media_playing); } void LLStatusBar::setVisibleForMouselook(bool visible) diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 86336e353c..344c4c469b 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -851,7 +851,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg) } } // update the audio stream here as well - if(!inworld_media_enabled || !inworld_audio_enabled) + if( !inworld_audio_enabled) { if(LLViewerMedia::isParcelAudioPlaying() && gAudiop && LLViewerMedia::hasParcelAudio()) { diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index ae31c9732c..361f4e2326 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -3115,8 +3115,12 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) { // Chat the "back" SLURL. (DEV-4907) + LLSD substitution = LLSD().with("[T_SLURL]", gAgent.getTeleportSourceSLURL()); + std::string completed_from = LLAgent::sTeleportProgressMessages["completed_from"]; + LLStringUtil::format(completed_from, substitution); + LLSD args; - args["MESSAGE"] = "Teleport completed from " + gAgent.getTeleportSourceSLURL(); + args["MESSAGE"] = completed_from; LLNotificationsUtil::add("SystemMessageTip", args); // Set the new position diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index f1ec489a20..30f2d2c41b 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -695,22 +695,15 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK { S32 local_x, local_y; top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); - if (down) + if (top_ctrl->pointInView(local_x, local_y)) { - if (top_ctrl->pointInView(local_x, local_y)) - { - return top_ctrl->handleAnyMouseClick(local_x, local_y, mask, clicktype, down) ; - } - else - { - gFocusMgr.setTopCtrl(NULL); - } + return top_ctrl->handleAnyMouseClick(local_x, local_y, mask, clicktype, down) ; } else { - if (top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleMouseUp(local_x, local_y, mask)) + if (down) { - return TRUE; + gFocusMgr.setTopCtrl(NULL); } } } diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 131c6ac1a1..acd12099cd 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -1723,7 +1723,7 @@ BOOL LLVOAvatarSelf::canGrabLocalTexture(ETextureIndex type, U32 index) const return FALSE; } - if (gAgent.isGodlike()) + if (gAgent.isGodlikeWithoutAdminMenuFakery()) return TRUE; // Check permissions of textures that show up in the diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index c617dacec5..d45d6155dd 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -344,7 +344,7 @@ value="0.92 0.92 1 0.78" /> <color name="GridlineColor" - reference="Red" /> + reference="White" /> <color name="GridlineShadowColor" value="0 0 0 0.31" /> @@ -359,7 +359,7 @@ reference="White"/> <color name="GroupNotifyDimmedTextColor" - reference="LtGray" /> + reference="DkGray" /> <color name="GroupOverTierColor" value="0.43 0.06 0.06 1" /> diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index 58ea7cec9c..29c6ae8009 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -46,7 +46,7 @@ top="0"> <panel.string name="new users only"> - New users only + New Residents only </panel.string> <panel.string name="anyone"> diff --git a/indra/newview/skins/default/xui/en/floater_buy_land.xml b/indra/newview/skins/default/xui/en/floater_buy_land.xml index 98508e5113..125b080519 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_land.xml @@ -64,7 +64,7 @@ Try selecting a smaller area. </floater.string> <floater.string name="not_owned_by_you"> - Land owned by another user is selected. + Land owned by another Resident is selected. Try selecting a smaller area. </floater.string> <floater.string diff --git a/indra/newview/skins/default/xui/en/floater_god_tools.xml b/indra/newview/skins/default/xui/en/floater_god_tools.xml index 0fac6cd5f1..36ef6beb59 100644 --- a/indra/newview/skins/default/xui/en/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_god_tools.xml @@ -31,8 +31,8 @@ <button follows="left|top" height="20" - label="Kick all users" - label_selected="Kick all users" + label="Kick all Residents" + label_selected="Kick all Residents" layout="topleft" left="10" name="Kick all users" diff --git a/indra/newview/skins/default/xui/en/floater_im.xml b/indra/newview/skins/default/xui/en/floater_im.xml index a21242ffe1..55efe83820 100644 --- a/indra/newview/skins/default/xui/en/floater_im.xml +++ b/indra/newview/skins/default/xui/en/floater_im.xml @@ -14,7 +14,7 @@ width="419"> <multi_floater.string name="only_user_message"> - You are the only user in this session. + You are the only Resident in this session. </multi_floater.string> <multi_floater.string name="offline_message"> @@ -54,7 +54,7 @@ </multi_floater.string> <multi_floater.string name="add_session_event"> - Unable to add users to chat session with [RECIPIENT]. + Unable to add Residents to chat session with [RECIPIENT]. </multi_floater.string> <multi_floater.string name="message_session_event"> diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml index 0f098bbb52..65a05f3ec5 100644 --- a/indra/newview/skins/default/xui/en/floater_im_container.xml +++ b/indra/newview/skins/default/xui/en/floater_im_container.xml @@ -22,7 +22,9 @@ tab_width="64" tab_max_width = "134" tab_height="16" - halign="center" + use_custom_icon_ctrl="true" + tab_icon_ctrl_pad="2" + halign="left" use_ellipses="true" top="0" width="390" /> diff --git a/indra/newview/skins/default/xui/en/floater_inspect.xml b/indra/newview/skins/default/xui/en/floater_inspect.xml index 3f7642fafe..bea35e5fc1 100644 --- a/indra/newview/skins/default/xui/en/floater_inspect.xml +++ b/indra/newview/skins/default/xui/en/floater_inspect.xml @@ -16,7 +16,7 @@ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] </floater.string> <scroll_list - bottom="270" + bottom="268" column_padding="0" draw_heading="true" follows="top|right|left|bottom" @@ -47,23 +47,23 @@ </scroll_list> <button follows="left|bottom" - height="20" + height="23" label="See Owner Profile..." layout="topleft" - left_delta="0" + left_delta="-1" name="button owner" tool_tip="See profile of the highlighted object's owner" - top_pad="5" + top_pad="4" width="150"> <button.commit_callback function="Inspect.OwnerProfile" /> </button> <button follows="left|bottom" - height="20" + height="23" label="See Creator Profile..." layout="topleft" - left_pad="10" + left_pad="5" name="button creator" tool_tip="See profile of the highlighted object's original creator" top_delta="0" diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index 1ab3dda52c..01548dd820 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -105,9 +105,11 @@ width="100"> <flyout_button.item label="Save" + name="save_item" value="save" /> <flyout_button.item label="Save As..." + name="saveas_item" value="save as" /> </flyout_button> <button diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 936f4a3fab..4264b86a72 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -2848,11 +2848,11 @@ Leave Group? icon="alert.tga" name="ConfirmKick" type="alert"> -Do you REALLY want to kick all users off the grid? +Do you REALLY want to kick all Residents off the grid? <usetemplate name="okcancelbuttons" notext="Cancel" - yestext="Kick All Users"/> + yestext="Kick All Residents"/> </notification> <notification @@ -2952,7 +2952,7 @@ You have reached your maximum number of groups. Please leave some group before j icon="alert.tga" name="KickUser" type="alert"> -Kick this user with what message? +Kick this Resident with what message? <form name="form"> <input name="message" type="text"> An administrator has logged you off. @@ -2994,7 +2994,7 @@ An administrator has logged you off. icon="alert.tga" name="FreezeUser" type="alert"> -Freeze this user with what message? +Freeze this Resident with what message? <form name="form"> <input name="message" type="text"> You have been frozen. You cannot move or chat. An administrator will contact you via instant message (IM). @@ -3015,7 +3015,7 @@ You have been frozen. You cannot move or chat. An administrator will contact you icon="alert.tga" name="UnFreezeUser" type="alert"> -Unfreeze this user with what message? +Unfreeze this Resident with what message? <form name="form"> <input name="message" type="text"> You are no longer frozen. @@ -3057,7 +3057,7 @@ Join me in [REGION] icon="alertmodal.tga" name="OfferTeleportFromGod" type="alertmodal"> -God summon user to your location? +God summon Resident to your location? <form name="form"> <input name="message" type="text"> Join me in [REGION] @@ -3137,7 +3137,7 @@ Type a short announcement which will be sent to everyone currently in your estat type="alert"> You are about to change a Linden owned estate (mainland, teen grid, orientation, etc.). -This is EXTREMELY DANGEROUS because it can fundamentally affect the user experience. On the mainland, it will change thousands of regions and make the spaceserver hiccup. +This is EXTREMELY DANGEROUS because it can fundamentally affect the Resident experience. On the mainland, it will change thousands of regions and make the spaceserver hiccup. Proceed? <usetemplate @@ -5383,7 +5383,7 @@ Grant this request? icon="notify.tga" name="ScriptToast" type="notify"> - [FIRST] [LAST]'s '[TITLE]' is requesting user input. + [FIRST] [LAST]'s '[TITLE]' is requesting Resident input. <form name="form"> <button index="0" diff --git a/indra/newview/skins/default/xui/en/panel_classified_info.xml b/indra/newview/skins/default/xui/en/panel_classified_info.xml index 903a9689f1..a8c72e03bd 100644 --- a/indra/newview/skins/default/xui/en/panel_classified_info.xml +++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml @@ -51,11 +51,11 @@ follows="all" height="502" layout="topleft" - left="9" + left="10" top_pad="10" name="profile_scroll" reserve_scroll_corner="false" - width="310"> + width="312"> <panel name="scroll_content_panel" follows="left|top" @@ -63,18 +63,18 @@ layout="topleft" top="0" background_visible="false" - height="500" + height="610" left="0" width="285"> <texture_picker enabled="false" follows="left|top|right" height="197" + width="272" layout="topleft" left="11" name="classified_snapshot" - top="10" - width="286" /> + top="10" /> <text_editor allow_scroll="false" bg_visible="false" @@ -93,6 +93,17 @@ v_pad="0" value="[name]" use_ellipses="true" /> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="10" + name="classified_location_label" + text_color="white" + top_pad="10" + value="Location:" + width="250" /> <text_editor allow_scroll="false" bg_visible="false" @@ -103,10 +114,22 @@ left="10" name="classified_location" read_only="true" + top_pad="5" width="290" word_wrap="true" v_pad="0" value="[loading...]" /> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="10" + name="content_type_label" + text_color="white" + top_pad="10" + value="Content Type:" + width="250" /> <text_editor allow_scroll="false" bg_visible="false" @@ -118,9 +141,20 @@ name="content_type" read_only="true" width="290" - top_pad="5" + top_pad="15" v_pad="0" value="[content type]" /> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="10" + name="category_label" + text_color="white" + top_pad="10" + value="Category:" + width="250" /> <text_editor allow_html="true" allow_scroll="false" @@ -136,6 +170,17 @@ top_pad="5" v_pad="0" value="[category]" /> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="10" + name="price_for_listing_label" + text_color="white" + top_pad="10" + value="Price for listing:" + width="250" /> <text_editor allow_scroll="false" bg_visible="false" @@ -150,33 +195,80 @@ top_pad="5" tool_tip="Price for listing." v_pad="0" + value="[price]" width="105" /> + <layout_stack + animate="false" + name="descr_stack" + layout="topleft" + follows="top|left" + orientation="vertical" + left="10" + top_pad="5" + width="290" + height="250"> + <layout_panel + auto_resize="false" + name="price_layout_panel" + layout="topleft" + follows="top|left" + left="0" + top="0" + width="290" + height="26" + user_resize="false"> <check_box enabled="false" height="16" label="Auto renew each week" layout="topleft" - left="10" + follows="top|left" + left="0" name="auto_renew" - top_pad="5" + top="0" v_pad="0" width="290" /> + </layout_panel> + <layout_panel + name="descr_layout_panel" + layout="topleft" + follows="top|left" + left="0" + top="0" + width="290" + height="215" + user_resize="false"> + <text + auto_resize="false" + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="0" + name="classified_desc_label" + text_color="white" + top="0" + value="Description:" + width="250" /> <text_editor allow_html="true" - allow_scroll="false" + allow_scroll="true" bg_visible="false" follows="left|top|right" h_pad="0" height="200" layout="topleft" - left="10" + left="0" max_length="1023" name="classified_desc" read_only="true" + top_pad="5" width="290" v_pad="0" value="[description]" word_wrap="true" /> + </layout_panel> + </layout_stack> </panel> </scroll_container> <panel diff --git a/indra/newview/skins/default/xui/en/panel_edit_classified.xml b/indra/newview/skins/default/xui/en/panel_edit_classified.xml index 66d5389d9b..6cc6c51fe0 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_classified.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml @@ -42,16 +42,16 @@ Edit Classified </text> <scroll_container - color="DkGray2" - follows="all" - height="502" - layout="topleft" - left="8" - top_pad="10" - name="profile_scroll" - reserve_scroll_corner="false" - opaque="true" - width="312"> + color="DkGray2" + follows="all" + height="502" + layout="topleft" + left="8" + top_pad="10" + name="profile_scroll" + reserve_scroll_corner="false" + opaque="true" + width="312"> <panel name="scroll_content_panel" follows="left|top" @@ -59,17 +59,17 @@ layout="topleft" top="0" background_visible="false" - height="610" + height="690" left="0" width="285"> - <texture_picker - follows="left|top|right" - height="197" - width="272" - layout="topleft" - top="10" - left="11" - name="classified_snapshot" /> + <texture_picker + follows="left|top|right" + height="197" + width="272" + layout="topleft" + top="10" + left="11" + name="classified_snapshot" /> <icon height="197" image_name="spacer24.tga" @@ -153,7 +153,7 @@ type="string" length="1" follows="left|top" - height="50" + height="30" layout="topleft" left="10" name="classified_location" @@ -172,6 +172,17 @@ top_pad="5" name="set_to_curr_location_btn" width="156" /> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="10" + name="category_label" + text_color="white" + top_pad="15" + value="Category:" + width="250" /> <combo_box follows="left|top" height="23" @@ -180,6 +191,17 @@ name="category" top_pad="5" width="156" /> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="10" + name="content_type_label" + text_color="white" + top_pad="15" + value="Content type:" + width="250" /> <combo_box allow_text_entry="false" follows="left|top" @@ -199,6 +221,17 @@ General Content </combo_item> </combo_box> + <text + follows="left|top" + font.style="BOLD" + height="10" + layout="topleft" + left="10" + name="price_for_listing_label" + text_color="white" + top_pad="15" + value="Price for listing:" + width="250" /> <spinner decimal_digits="0" follows="left|top" @@ -223,9 +256,9 @@ layout="topleft" left="10" name="auto_renew" - top_pad="5" + top_pad="15" width="250" /> - </panel> + </panel> </scroll_container> <panel follows="left|right|bottom" diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml index 4e57b428bd..5147bb72d0 100644 --- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml @@ -100,17 +100,8 @@ background_visible="true" expanded="true" layout="topleft" name="group_general_tab" - title="General"> - <scroll_container - color="DkGray2" - follows="all" - layout="topleft" - left="0" - name="profile_scroll" - opaque="true" - height="604" - width="304" - top="0"> + title="General" + fit_panel="false"> <panel border="false" class="panel_group_general" @@ -121,24 +112,13 @@ background_visible="true" help_topic="group_general_tab" name="group_general_tab_panel" top="0" /> - </scroll_container> </accordion_tab> <accordion_tab expanded="false" layout="topleft" name="group_roles_tab" - title="Roles"> - <scroll_container - color="DkGray2" - follows="all" - layout="topleft" - left="0" - name="profile_scroll" - opaque="true" - height="680" - width="304" - top="0"> - + title="Roles" + fit_panel="false"> <panel border="false" class="panel_group_roles" @@ -148,24 +128,13 @@ background_visible="true" left="0" name="group_roles_tab_panel" top="0" /> - </scroll_container> </accordion_tab> <accordion_tab expanded="false" layout="topleft" name="group_notices_tab" - title="Notices"> - <scroll_container - color="DkGray2" - follows="all" - layout="topleft" - left="0" - name="profile_scroll" - opaque="true" - height="530" - width="304" - top="0"> - + title="Notices" + fit_panel="false"> <panel border="false" class="panel_group_notices" @@ -176,24 +145,13 @@ background_visible="true" help_topic="group_notices_tab" name="group_notices_tab_panel" top="0" /> - </scroll_container> </accordion_tab> <accordion_tab expanded="false" layout="topleft" name="group_land_tab" - title="Land/Assets"> - <scroll_container - color="DkGray2" - follows="all" - layout="topleft" - left="0" - name="profile_scroll" - opaque="true" - height="500" - width="304" - top="0"> - + title="Land/Assets" + fit_panel="false"> <panel border="false" class="panel_group_land_money" @@ -203,7 +161,6 @@ background_visible="true" left="0" name="group_land_tab_panel" top="0" /> - </scroll_container> </accordion_tab> </accordion> </layout_panel> diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 540e17e413..0c57b99b68 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -222,7 +222,7 @@ top="10" width="293" wrap="true"> - To add friends try [secondlife:///app/search/people global search] or use right-click on a user to add them as a friend. + To add friends try [secondlife:///app/search/people global search] or use right-click on a Resident to add them as a friend. If you're looking for people to hang out with, [secondlife:///app/worldmap try the Map]. </text> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml index d336e18011..3913b6d709 100644 --- a/indra/newview/skins/default/xui/en/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml @@ -59,7 +59,7 @@ left_delta="0" name="owner_text" top_pad="2" - width="180"> + width="80"> Estate owner: </text> <text @@ -198,7 +198,7 @@ <button follows="left|top" height="23" - label="Kick User from Estate..." + label="Kick Resident from Estate..." layout="topleft" left="50" name="kick_user_from_estate_btn" diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml index c06e67a4bb..1bbe9d80c0 100644 --- a/indra/newview/skins/default/xui/en/panel_region_general.xml +++ b/indra/newview/skins/default/xui/en/panel_region_general.xml @@ -205,7 +205,7 @@ <button follows="left|top" height="20" - label="Teleport Home One User..." + label="Teleport Home One Resident..." layout="topleft" left="10" name="kick_btn" @@ -214,7 +214,7 @@ <button follows="left|top" height="20" - label="Teleport Home All Users..." + label="Teleport Home All Residents..." layout="topleft" left_delta="0" name="kick_all_btn" diff --git a/indra/newview/skins/default/xui/en/panel_region_general_layout.xml b/indra/newview/skins/default/xui/en/panel_region_general_layout.xml index 525c5aa8e7..ffa1a257d5 100644 --- a/indra/newview/skins/default/xui/en/panel_region_general_layout.xml +++ b/indra/newview/skins/default/xui/en/panel_region_general_layout.xml @@ -203,7 +203,7 @@ <button follows="left|top" height="20" - label="Teleport Home One User..." + label="Teleport Home One Resident..." layout="topleft" left="10" name="kick_btn" @@ -212,7 +212,7 @@ <button follows="left|top" height="20" - label="Teleport Home All Users..." + label="Teleport Home All Residents..." layout="topleft" left_delta="0" name="kick_all_btn" diff --git a/indra/newview/skins/default/xui/en/panel_region_texture.xml b/indra/newview/skins/default/xui/en/panel_region_texture.xml index 04dbf73be9..5d910ea659 100644 --- a/indra/newview/skins/default/xui/en/panel_region_texture.xml +++ b/indra/newview/skins/default/xui/en/panel_region_texture.xml @@ -148,103 +148,33 @@ name="height_text_lbl6" top="185" width="100"> - Southwest - </text> - <text - follows="left|top" - height="20" - layout="topleft" - left_pad="10" - name="height_text_lbl7" - top_delta="0" - width="100"> Northwest </text> - <spinner - follows="left|top" - height="20" - increment="0.5" - label="Low" - label_width="37" - layout="topleft" - left="10" - max_val="500" - min_val="-500" - name="height_start_spin_0" - top_delta="15" - width="100" /> - <spinner - follows="left|top" - height="20" - increment="0.5" - label="Low" - label_width="37" - layout="topleft" - left_pad="10" - max_val="500" - min_val="-500" - name="height_start_spin_1" - top_delta="0" - width="100" /> - <spinner - follows="left|top" - height="20" - increment="0.5" - label="High" - label_width="37" - layout="topleft" - left="10" - max_val="500" - min_val="-500" - name="height_range_spin_0" - top_delta="20" - width="100" /> - <spinner - follows="left|top" - height="20" - increment="0.5" - label="High" - label_width="37" - layout="topleft" - left_pad="10" - max_val="500" - min_val="-500" - name="height_range_spin_1" - top_delta="0" - width="100" /> - <text - follows="left|top" - height="20" - layout="topleft" - left="51" - name="height_text_lbl8" - top_pad="10" - width="100"> - Southeast - </text> <text follows="left|top" height="20" layout="topleft" left_pad="10" - name="height_text_lbl9" + name="height_text_lbl7" top_delta="0" width="100"> Northeast </text> - <spinner - follows="left|top" - height="20" - increment="0.5" - label="Low" - label_width="37" - layout="topleft" - left="10" - max_val="500" - min_val="-500" - name="height_start_spin_2" - top_delta="15" - width="100" /> +<!-- northwest low--> + <spinner + follows="left|top" + height="20" + increment="0.5" + label="Low" + label_width="37" + layout="topleft" + left="10" + max_val="500" + min_val="-500" + name="height_start_spin_1" + top_delta="15" + width="100" /> +<!-- northeast low--> <spinner follows="left|top" height="20" @@ -258,20 +188,22 @@ name="height_start_spin_3" top_delta="0" width="100" /> - <spinner - follows="left|top" - height="20" - increment="0.5" - label="High" - label_width="37" - layout="topleft" - left="10" - max_val="500" - min_val="-500" - name="height_range_spin_2" - top_delta="20" - width="100" /> - <spinner +<!-- northwest high--> + <spinner + follows="left|top" + height="20" + increment="0.5" + label="High" + label_width="37" + layout="topleft" + left="10" + max_val="500" + min_val="-500" + name="height_range_spin_1" + top_delta="20" + width="100" /> +<!-- northeast high--> + <spinner follows="left|top" height="20" increment="0.5" @@ -284,18 +216,94 @@ name="height_range_spin_3" top_delta="0" width="100" /> - <text - follows="left|top" - height="20" - layout="topleft" - left="10" - name="height_text_lbl10" - top_delta="30" - width="400" - word_wrap="true"> - These values represent the blend range for the textures above. - </text> - <text + <text + follows="left|top" + height="20" + layout="topleft" + left="51" + name="height_text_lbl8" + top_pad="10" + width="100"> + Southwest + </text> + <text + follows="left|top" + height="20" + layout="topleft" + left_pad="10" + name="height_text_lbl9" + top_delta="0" + width="100"> + Southeast + </text> +<!-- southwest low--> + <spinner + follows="left|top" + height="20" + increment="0.5" + label="Low" + label_width="37" + layout="topleft" + left="10" + max_val="500" + min_val="-500" + name="height_start_spin_0" + top_delta="15" + width="100" /> +<!-- southeast low--> + <spinner + follows="left|top" + height="20" + increment="0.5" + label="Low" + label_width="37" + layout="topleft" + left_pad="10" + max_val="500" + min_val="-500" + name="height_start_spin_2" + top_delta="0" + width="100" /> +<!--southwest high--> + <spinner + follows="left|top" + height="20" + increment="0.5" + label="High" + label_width="37" + layout="topleft" + left="10" + max_val="500" + min_val="-500" + name="height_range_spin_0" + top_delta="20" + width="100" /> +<!-- southeast high--> + <spinner + follows="left|top" + height="20" + increment="0.5" + label="High" + label_width="37" + layout="topleft" + left_pad="10" + max_val="500" + min_val="-500" + name="height_range_spin_2" + top_delta="0" + width="100" /> + <text + follows="left|top" + height="20" + layout="topleft" + left="10" + name="height_text_lbl10" + top_delta="30" + width="400" + word_wrap="true"> + These values represent the blend range for the textures above. + </text> + <text follows="left|top" height="20" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml index d2c9e56bc3..6588663bac 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml @@ -549,5 +549,16 @@ name="buy_btn" top="0" width="100" /> + <button + follows="bottom|left" + height="23" + label="Details" + layout="topleft" + left="5" + name="details_btn" + top="0" + width="100" + visible="false" /> + </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/teleport_strings.xml b/indra/newview/skins/default/xui/en/teleport_strings.xml index e8f6b1319a..bae821d3b5 100644 --- a/indra/newview/skins/default/xui/en/teleport_strings.xml +++ b/indra/newview/skins/default/xui/en/teleport_strings.xml @@ -61,6 +61,9 @@ Try again in a moment. <message name="completing"> Completing teleport. </message> + <message name="completed_from"> + Teleport completed from [T_SLURL] + </message> <message name="resolving"> Resolving destination. </message> diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml index 63f08a4250..413ca1d1ef 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml @@ -24,7 +24,7 @@ follows="left|top|bottom" height="20" left="2" - mouse_opaque="true" + mouse_opaque="false" name="adhoc_icon" width="21" /> <chiclet_im_adhoc.unread_notifications |