diff options
Diffstat (limited to 'indra/newview')
209 files changed, 4614 insertions, 1517 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 4158899446..835a9aacd5 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -104,6 +104,7 @@ set(viewer_SOURCE_FILES llclassifiedinfo.cpp llclassifiedstatsresponder.cpp llcloud.cpp + llcofwearables.cpp llcolorswatch.cpp llcommanddispatcherlistener.cpp llcommandhandler.cpp @@ -142,6 +143,7 @@ set(viewer_SOURCE_FILES llfavoritesbar.cpp llfeaturemanager.cpp llfilepicker.cpp + llfilteredwearablelist.cpp llfirstuse.cpp llflexibleobject.cpp llfloaterabout.cpp @@ -252,6 +254,7 @@ set(viewer_SOURCE_FILES llinventoryclipboard.cpp llinventoryfilter.cpp llinventoryfunctions.cpp + llinventoryitemslist.cpp llinventorymodel.cpp llinventorymodelbackgroundfetch.cpp llinventoryobserver.cpp @@ -294,7 +297,9 @@ set(viewer_SOURCE_FILES llnotificationmanager.cpp llnotificationofferhandler.cpp llnotificationscripthandler.cpp + llnotificationstorage.cpp llnotificationtiphandler.cpp + lloutfitslist.cpp lloutputmonitorctrl.cpp llpanelavatar.cpp llpanelavatartag.cpp @@ -303,6 +308,7 @@ set(viewer_SOURCE_FILES llpanelcontents.cpp llpaneleditwearable.cpp llpanelface.cpp + llpanelgenerictip.cpp llpanelgroup.cpp llpanelgroupgeneral.cpp llpanelgroupinvite.cpp @@ -326,6 +332,7 @@ set(viewer_SOURCE_FILES llpanelnearbymedia.cpp llpanelobject.cpp llpanelobjectinventory.cpp + llpanelonlinestatus.cpp llpaneloutfitedit.cpp llpaneloutfitsinventory.cpp llpanelpeople.cpp @@ -342,6 +349,7 @@ set(viewer_SOURCE_FILES llpanelprofile.cpp llpanelprofileview.cpp llpanelteleporthistory.cpp + llpaneltiptoast.cpp llpanelvolume.cpp llpanelvolumepulldown.cpp llparcelselection.cpp @@ -437,7 +445,6 @@ set(viewer_SOURCE_FILES lltracker.cpp lltransientdockablefloater.cpp lltransientfloatermgr.cpp - llpanelgenerictip.cpp lluilistener.cpp lluploaddialog.cpp llurl.cpp @@ -527,6 +534,7 @@ set(viewer_SOURCE_FILES llwaterparamset.cpp llwearable.cpp llwearabledictionary.cpp + llwearableitemslist.cpp llwearablelist.cpp llweb.cpp llwind.cpp @@ -607,6 +615,7 @@ set(viewer_HEADER_FILES llclassifiedinfo.h llclassifiedstatsresponder.h llcloud.h + llcofwearables.h llcolorswatch.h llcommanddispatcherlistener.h llcommandhandler.h @@ -646,6 +655,7 @@ set(viewer_HEADER_FILES llfavoritesbar.h llfeaturemanager.h llfilepicker.h + llfilteredwearablelist.h llfirstuse.h llflexibleobject.h llfloaterabout.h @@ -755,6 +765,7 @@ set(viewer_HEADER_FILES llinventoryclipboard.h llinventoryfilter.h llinventoryfunctions.h + llinventoryitemslist.h llinventorymodel.h llinventorymodelbackgroundfetch.h llinventoryobserver.h @@ -794,6 +805,8 @@ set(viewer_HEADER_FILES llnetmap.h llnotificationhandler.h llnotificationmanager.h + llnotificationstorage.h + lloutfitslist.h lloutputmonitorctrl.h llpanelavatar.h llpanelavatartag.h @@ -802,6 +815,7 @@ set(viewer_HEADER_FILES llpanelcontents.h llpaneleditwearable.h llpanelface.h + llpanelgenerictip.h llpanelgroup.h llpanelgroupgeneral.h llpanelgroupinvite.h @@ -825,6 +839,7 @@ set(viewer_HEADER_FILES llpanelnearbymedia.h llpanelobject.h llpanelobjectinventory.h + llpanelonlinestatus.h llpaneloutfitedit.h llpaneloutfitsinventory.h llpanelpeople.h @@ -841,6 +856,7 @@ set(viewer_HEADER_FILES llpanelprofile.h llpanelprofileview.h llpanelteleporthistory.h + llpaneltiptoast.h llpanelvolume.h llpanelvolumepulldown.h llparcelselection.h @@ -939,7 +955,6 @@ set(viewer_HEADER_FILES lltracker.h lltransientdockablefloater.h lltransientfloatermgr.h - llpanelgenerictip.h lluiconstants.h lluilistener.h lluploaddialog.h @@ -1028,6 +1043,7 @@ set(viewer_HEADER_FILES llwaterparamset.h llwearable.h llwearabledictionary.h + llwearableitemslist.h llwearablelist.h llweb.h llwind.h @@ -1388,7 +1404,7 @@ if (WINDOWS) # If adding a file to viewer_manifest.py in the WindowsManifest.construct() method, be sure to add the dependency # here. - # *NOTE:Mani - This is a crappy hack to have important dependecies for the viewer_manifest copy action + # *NOTE:Mani - This is a crappy hack to have important dependencies for the viewer_manifest copy action # be met. I'm looking forward to a source-code split-up project next year that will address this kind of thing. # In the meantime, if you have any ideas on how to easily maintain one list, either here or in viewer_manifest.py # and have the build deps get tracked *please* tell me about it. @@ -1409,7 +1425,7 @@ if (WINDOWS) endif(USE_GOOGLE_PERFTOOLS) - set(COPY_INPUT_DEPENDECIES + set(COPY_INPUT_DEPENDENCIES # The following commented dependencies are determined at variably at build time. Can't do this here. #${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libtcmalloc_minimal.dll => None ... Skipping libtcmalloc_minimal.dll ${CMAKE_SOURCE_DIR}/../etc/message.xml @@ -1443,8 +1459,6 @@ if (WINDOWS) ${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt ${CMAKE_CURRENT_SOURCE_DIR}/dbghelp.dll ${CMAKE_CURRENT_SOURCE_DIR}/fmod.dll - ${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}/media_plugin_quicktime.dll - ${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}/media_plugin_webkit.dll ${ARCH_PREBUILT_DIRS_RELEASE}/libeay32.dll ${ARCH_PREBUILT_DIRS_RELEASE}/qtcore4.dll ${ARCH_PREBUILT_DIRS_RELEASE}/qtgui4.dll @@ -1484,6 +1498,7 @@ if (WINDOWS) SLPlugin media_plugin_quicktime media_plugin_webkit + winmm_shim windows-crash-logger windows-updater ) @@ -1505,7 +1520,7 @@ if (WINDOWS) DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py stage_third_party_libs - ${COPY_INPUT_DEPENDECIES} + ${COPY_INPUT_DEPENDENCIES} COMMENT "Performing viewer_manifest copy" ) @@ -1524,8 +1539,6 @@ if (WINDOWS) add_dependencies(${VIEWER_BINARY_NAME} SLPlugin - media_plugin_quicktime - media_plugin_webkit windows-updater windows-crash-logger ) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index c9b5631d54..a6dbe00759 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -10590,7 +10590,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>WaterEditPresets</key> <map> @@ -10972,7 +10972,38 @@ <key>Value</key> <integer>0</integer> </map> - + <key>max_texture_dimension_X</key> + <map> + <key>Comment</key> + <string>Maximum texture width for user uploaded textures</string> + <key>Persist</key> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>2048</integer> + </map> + <key>max_texture_dimension_Y</key> + <map> + <key>Comment</key> + <string>Maximum texture height for user uploaded textures</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>2048</integer> + </map> <!-- End of back compatibility settings --> + <key>teleport_offer_invitation_max_length</key> + <map> + <key>Comment</key> + <string>Maximum length of teleport offer invitation line editor. 254 - max_location_url_length(76) = 178</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>178</integer> + </map> </map> </llsd> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 8bcf680876..ddcaeb113d 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -1226,7 +1226,10 @@ void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::s if ( distance > 1.f && heightDelta > (sqrtf(mAutoPilotStopDistance) + 1.f)) { setFlying(TRUE); - mAutoPilotFlyOnStop = TRUE; + // Do not force flying for "Sit" behavior to prevent flying after pressing "Stand" + // from an object. See EXT-1655. + if ("Sit" != mAutoPilotBehaviorName) + mAutoPilotFlyOnStop = TRUE; } mAutoPilot = TRUE; diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index ff4404c6c9..b5fde0baca 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -1338,7 +1338,8 @@ public: LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key); LLPanelOutfitsInventory *outfit_panel = dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory")); - if (outfit_panel) + // TODO: add handling "My Outfits" tab. + if (outfit_panel && outfit_panel->isCOFPanelActive()) { outfit_panel->getRootFolder()->clearSelection(); outfit_panel->getRootFolder()->setSelectionByID(mFolderID, TRUE); @@ -1361,24 +1362,6 @@ private: LLUUID mFolderID; }; -LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name) -{ - if (!isAgentAvatarValid()) return LLUUID::null; - - // 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, - new_folder_name); - - LLPointer<LLInventoryCallback> cb = new LLShowCreatedOutfit(folder_id); - LLAppearanceMgr::instance().shallowCopyCategoryContents(LLAppearanceMgr::instance().getCOF(),folder_id, cb); - LLAppearanceMgr::instance().createBaseOutfitLink(folder_id, cb); - - return folder_id; -} - void LLAgentWearables::makeNewOutfitDone(S32 type, U32 index) { LLUUID first_item_id = getWearableItemID((EWearableType)type, index); @@ -2052,6 +2035,39 @@ void LLAgentWearables::animateAllWearableParams(F32 delta, BOOL upload_bake) } } +bool LLAgentWearables::moveWearable(const LLViewerInventoryItem* item, bool closer_to_body) +{ + if (!item) return false; + if (!item->isWearableType()) return false; + + wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(item->getWearableType()); + if (wearable_iter == mWearableDatas.end()) return false; + + wearableentry_vec_t& wearable_vec = wearable_iter->second; + if (wearable_vec.empty()) return false; + + const LLUUID& asset_id = item->getAssetUUID(); + + //nowhere to move if the wearable is already on any boundary (closest to the body/furthest from the body) + if (closer_to_body && asset_id == wearable_vec.front()->getAssetID()) return false; + if (!closer_to_body && asset_id == wearable_vec.back()->getAssetID()) return false; + + for (U32 i = 0; i < wearable_vec.size(); ++i) + { + LLWearable* wearable = wearable_vec[i]; + if (!wearable) continue; + if (wearable->getAssetID() != asset_id) continue; + + //swapping wearables + U32 swap_i = closer_to_body ? i-1 : i+1; + wearable_vec[i] = wearable_vec[swap_i]; + wearable_vec[swap_i] = wearable; + return true; + } + + return false; +} + void LLAgentWearables::updateServer() { sendAgentWearablesUpdate(); diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index b76367324c..d3b18f68f1 100644 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -82,6 +82,8 @@ public: void animateAllWearableParams(F32 delta, BOOL upload_bake); + bool moveWearable(const LLViewerInventoryItem* item, bool closer_to_body); + //-------------------------------------------------------------------- // Accessors //-------------------------------------------------------------------- @@ -169,8 +171,7 @@ public: const LLDynamicArray<S32>& wearables_to_include, const LLDynamicArray<S32>& attachments_to_include, BOOL rename_clothing); - - LLUUID makeNewOutfitLinks(const std::string& new_folder_name); + // Should only be called if we *know* we've never done so before, since users may // not want the Library outfits to stay in their quick outfit selector and can delete them. diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp index 08d8ccfd23..03d09a3798 100644 --- a/indra/newview/llagentwearablesfetch.cpp +++ b/indra/newview/llagentwearablesfetch.cpp @@ -119,6 +119,7 @@ public: item->getLinkedUUID(), LLAppearanceMgr::instance().getCOF(), item->getName(), + item->getDescription(), LLAssetType::AT_LINK, link_waiter); } @@ -507,6 +508,7 @@ void LLLibraryOutfitsFetch::contentsDone() item->getLinkedUUID(), new_outfit_folder_id, item->getName(), + item->getDescription(), LLAssetType::AT_LINK, NULL); } diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 4d18ff57fe..5586b3cd4d 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -32,6 +32,7 @@ #include "llviewerprecompiledheaders.h" +#include "llaccordionctrltab.h" #include "llagent.h" #include "llagentwearables.h" #include "llappearancemgr.h" @@ -42,6 +43,7 @@ #include "llinventoryfunctions.h" #include "llinventoryobserver.h" #include "llnotificationsutil.h" +#include "llpaneloutfitsinventory.h" #include "llselectmgr.h" #include "llsidepanelappearance.h" #include "llsidetray.h" @@ -51,6 +53,8 @@ #include "llviewerregion.h" #include "llwearablelist.h" +char ORDER_NUMBER_SEPARATOR('@'); + LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id, const std::string& name) { LLInventoryModel::cat_array_t cat_array; @@ -118,6 +122,38 @@ private: bool mAppend; }; + +//Inventory callback updating "dirty" state when destroyed +class LLUpdateDirtyState: public LLInventoryCallback +{ +public: + LLUpdateDirtyState() {} + virtual ~LLUpdateDirtyState(){ LLAppearanceMgr::getInstance()->updateIsDirty(); } + virtual void fire(const LLUUID&) {} +}; + + +//Inventory collect functor collecting wearables of a specific wearable type +class LLFindClothesOfType : public LLInventoryCollectFunctor +{ +public: + LLFindClothesOfType(EWearableType type) : mWearableType(type) {} + virtual ~LLFindClothesOfType() {} + virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) + { + if (!item) return false; + if (item->getType() != LLAssetType::AT_CLOTHING) return false; + + LLViewerInventoryItem *vitem = dynamic_cast<LLViewerInventoryItem*>(item); + if (!vitem || vitem->getWearableType() != mWearableType) return false; + + return true; + } + + const EWearableType mWearableType; +}; + + LLUpdateAppearanceOnDestroy::LLUpdateAppearanceOnDestroy(): mFireCount(0) { @@ -400,6 +436,7 @@ public: item_id, LLAppearanceMgr::instance().getCOF(), itemp->getName(), + itemp->getDescription(), LLAssetType::AT_LINK, cb); } @@ -691,10 +728,13 @@ void LLAppearanceMgr::shallowCopyCategoryContents(const LLUUID& src_id, const LL { case LLAssetType::AT_LINK: { + //LLInventoryItem::getDescription() is used for a new description + //to propagate ordering information saved in descriptions of links link_inventory_item(gAgent.getID(), item->getLinkedUUID(), dst_id, item->getName(), + item->LLInventoryItem::getDescription(), LLAssetType::AT_LINK, cb); break; } @@ -708,6 +748,7 @@ void LLAppearanceMgr::shallowCopyCategoryContents(const LLUUID& src_id, const LL item->getLinkedUUID(), dst_id, item->getName(), + item->getDescription(), LLAssetType::AT_LINK_FOLDER, cb); } break; @@ -811,20 +852,7 @@ void LLAppearanceMgr::filterWearableItems( { // Divvy items into arrays by wearable type. std::vector<LLInventoryModel::item_array_t> items_by_type(WT_COUNT); - for (S32 i=0; i<items.count(); i++) - { - LLViewerInventoryItem *item = items.get(i); - // Ignore non-wearables. - if (!item->isWearableType()) - continue; - EWearableType type = item->getWearableType(); - if(type < 0 || type >= WT_COUNT) - { - LL_WARNS("Appearance") << "Invalid wearable type. Inventory type does not match wearable flag bitfield." << LL_ENDL; - continue; - } - items_by_type[type].push_back(item); - } + divvyWearablesByType(items, items_by_type); // rebuild items list, retaining the last max_per_type of each array items.clear(); @@ -853,6 +881,7 @@ void LLAppearanceMgr::linkAll(const LLUUID& category, item->getLinkedUUID(), category, item->getName(), + item->LLInventoryItem::getDescription(), LLAssetType::AT_LINK, cb); } @@ -956,7 +985,7 @@ void LLAppearanceMgr::createBaseOutfitLink(const LLUUID& category, LLPointer<LLI if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT) { - link_inventory_item(gAgent.getID(), category, cof, catp->getName(), + link_inventory_item(gAgent.getID(), category, cof, catp->getName(), "", LLAssetType::AT_LINK_FOLDER, link_waiter); new_outfit_name = catp->getName(); } @@ -1016,8 +1045,24 @@ static void remove_non_link_items(LLInventoryModel::item_array_t &items) items = pruned_items; } +//a predicate for sorting inventory items by actual descriptions +bool sort_by_description(const LLInventoryItem* item1, const LLInventoryItem* item2) +{ + if (!item1 || !item2) + { + llwarning("either item1 or item2 is NULL", 0); + return true; + } + + return item1->LLInventoryItem::getDescription() < item2->LLInventoryItem::getDescription(); +} + void LLAppearanceMgr::updateAppearanceFromCOF() { + //checking integrity of the COF in terms of ordering of wearables, + //checking and updating links' descriptions of wearables in the COF (before analyzed for "dirty" state) + updateClothingOrderingInfo(); + // update dirty flag to see if the state of the COF matches // the saved outfit stored as a folder link llinfos << "starting" << llendl; @@ -1046,6 +1091,9 @@ void LLAppearanceMgr::updateAppearanceFromCOF() return; } + //preparing the list of wearables in the correct order for LLAgentWearables + std::sort(wear_items.begin(), wear_items.end(), sort_by_description); + LLWearableHoldingPattern* holder = new LLWearableHoldingPattern; holder->mObjItems = obj_items; @@ -1079,8 +1127,8 @@ void LLAppearanceMgr::updateAppearanceFromCOF() } #endif - - holder->mFoundList.push_front(found); + //pushing back, not front, to preserve order of wearables for LLAgentWearables + holder->mFoundList.push_back(found); } else { @@ -1407,7 +1455,7 @@ void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item, bool do_update // Are these links to different items of the same wearable // type? If so, new item will replace old. // MULTI-WEARABLES: revisit if more than one per type is allowed. - else if (areMatchingWearables(vitem,inv_item)) + else if (FALSE/*areMatchingWearables(vitem,inv_item)*/) { if (inv_item->getIsLinkType()) { @@ -1430,6 +1478,7 @@ void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item, bool do_update vitem->getLinkedUUID(), getCOF(), vitem->getName(), + vitem->getDescription(), LLAssetType::AT_LINK, cb); } @@ -1446,6 +1495,7 @@ void LLAppearanceMgr::addEnsembleLink( LLInventoryCategory* cat, bool do_update cat->getLinkedUUID(), getCOF(), cat->getName(), + cat->getDescription(), LLAssetType::AT_LINK_FOLDER, cb); #endif @@ -1475,6 +1525,17 @@ void LLAppearanceMgr::removeCOFItemLinks(const LLUUID& item_id, bool do_update) } } +bool sort_by_linked_uuid(const LLViewerInventoryItem* item1, const LLViewerInventoryItem* item2) +{ + if (!item1 || !item2) + { + llwarning("item1, item2 cannot be null, something is very wrong", 0); + return true; + } + + return item1->getLinkedUUID() < item2->getLinkedUUID(); +} + void LLAppearanceMgr::updateIsDirty() { LLUUID cof = getCOF(); @@ -1514,33 +1575,37 @@ void LLAppearanceMgr::updateIsDirty() // Current outfit folder should have one more item than the outfit folder. // this one item is the link back to the outfit folder itself. mOutfitIsDirty = true; + return; } - else - { - typedef std::set<LLUUID> item_set_t; - item_set_t cof_set; - item_set_t outfit_set; - // sort COF items by UUID - for (S32 i = 0; i < cof_items.count(); ++i) + //getting rid of base outfit folder link to simplify comparison + for (LLInventoryModel::item_array_t::iterator it = cof_items.begin(); it != cof_items.end(); ++it) + { + if (*it == base_outfit_item) { - LLViewerInventoryItem *item = cof_items.get(i); - // don't add the base outfit link to the list of objects we're comparing - if(item != base_outfit_item) - { - cof_set.insert(item->getLinkedUUID()); - } + cof_items.erase(it); + break; } + } - // sort outfit folder by UUID - for (S32 i = 0; i < outfit_items.count(); ++i) + //"dirty" - also means a difference in linked UUIDs and/or a difference in wearables order (links' descriptions) + std::sort(cof_items.begin(), cof_items.end(), sort_by_linked_uuid); + std::sort(outfit_items.begin(), outfit_items.end(), sort_by_linked_uuid); + + for (U32 i = 0; i < cof_items.size(); ++i) + { + LLViewerInventoryItem *item1 = cof_items.get(i); + LLViewerInventoryItem *item2 = outfit_items.get(i); + + if (item1->getLinkedUUID() != item2->getLinkedUUID() || + item1->LLInventoryItem::getDescription() != item2->LLInventoryItem::getDescription()) { - LLViewerInventoryItem *item = outfit_items.get(i); - outfit_set.insert(item->getLinkedUUID()); + mOutfitIsDirty = true; + return; } - - mOutfitIsDirty = (outfit_set != cof_set); } + + mOutfitIsDirty = false; } } @@ -1572,15 +1637,182 @@ bool LLAppearanceMgr::updateBaseOutfit() const LLUUID base_outfit_id = getBaseOutfitUUID(); if (base_outfit_id.isNull()) return false; + updateClothingOrderingInfo(); + // in a Base Outfit we do not remove items, only links purgeCategory(base_outfit_id, false); + + LLPointer<LLInventoryCallback> dirty_state_updater = new LLUpdateDirtyState(); + //COF contains only links so we copy to the Base Outfit only links - shallowCopyCategoryContents(getCOF(), base_outfit_id, NULL); + shallowCopyCategoryContents(getCOF(), base_outfit_id, dirty_state_updater); return true; } +void LLAppearanceMgr::divvyWearablesByType(const LLInventoryModel::item_array_t& items, wearables_by_type_t& items_by_type) +{ + items_by_type.reserve(WT_COUNT); + if (items.empty()) return; + + for (S32 i=0; i<items.count(); i++) + { + LLViewerInventoryItem *item = items.get(i); + // Ignore non-wearables. + if (!item->isWearableType()) + continue; + EWearableType type = item->getWearableType(); + if(type < 0 || type >= WT_COUNT) + { + LL_WARNS("Appearance") << "Invalid wearable type. Inventory type does not match wearable flag bitfield." << LL_ENDL; + continue; + } + items_by_type[type].push_back(item); + } +} + +std::string build_order_string(EWearableType type, U32 i) +{ + std::ostringstream order_num; + order_num << ORDER_NUMBER_SEPARATOR << type * 100 + i; + return order_num.str(); +} + +struct WearablesOrderComparator +{ + WearablesOrderComparator(const EWearableType type) + { + mControlSize = build_order_string(type, 0).size(); + }; + + bool operator()(const LLInventoryItem* item1, const LLInventoryItem* item2) + { + if (!item1 || !item2) + { + llwarning("either item1 or item2 is NULL", 0); + return true; + } + + const std::string& desc1 = item1->LLInventoryItem::getDescription(); + const std::string& desc2 = item2->LLInventoryItem::getDescription(); + + bool item1_valid = (desc1.size() == mControlSize) && (ORDER_NUMBER_SEPARATOR == desc1[0]); + bool item2_valid = (desc2.size() == mControlSize) && (ORDER_NUMBER_SEPARATOR == desc2[0]); + + if (item1_valid && item2_valid) + return desc1 < desc2; + + //we need to sink down invalid items: items with empty descriptions, items with "Broken link" descriptions, + //items with ordering information but not for the associated wearables type + if (!item1_valid && item2_valid) + return false; + + return true; + } + + U32 mControlSize; +}; + +void LLAppearanceMgr::updateClothingOrderingInfo() +{ + LLInventoryModel::item_array_t wear_items; + getDescendentsOfAssetType(getCOF(), wear_items, LLAssetType::AT_CLOTHING, false); + + wearables_by_type_t items_by_type(WT_COUNT); + divvyWearablesByType(wear_items, items_by_type); + + bool inventory_changed = false; + for (U32 type = WT_SHIRT; type < WT_COUNT; type++) + { + + U32 size = items_by_type[type].size(); + if (!size) continue; + + //sinking down invalid items which need reordering + std::sort(items_by_type[type].begin(), items_by_type[type].end(), WearablesOrderComparator((EWearableType) type)); + + //requesting updates only for those links which don't have "valid" descriptions + for (U32 i = 0; i < size; i++) + { + LLViewerInventoryItem* item = items_by_type[type][i]; + if (!item) continue; + + std::string new_order_str = build_order_string((EWearableType)type, i); + if (new_order_str == item->LLInventoryItem::getDescription()) continue; + + item->setDescription(new_order_str); + item->setComplete(TRUE); + item->updateServer(FALSE); + gInventory.updateItem(item); + inventory_changed = true; + } + } + + //*TODO do we really need to notify observers? + if (inventory_changed) gInventory.notifyObservers(); +} + + + + +class LLShowCreatedOutfit: public LLInventoryCallback +{ +public: + LLShowCreatedOutfit(LLUUID& folder_id): mFolderID(folder_id) + {} + + virtual ~LLShowCreatedOutfit() + { + LLSD key; + LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key); + LLPanelOutfitsInventory *outfit_panel = + dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory")); + if (outfit_panel) + { + outfit_panel->getRootFolder()->clearSelection(); + outfit_panel->getRootFolder()->setSelectionByID(mFolderID, TRUE); + } + + LLAccordionCtrlTab* tab_outfits = outfit_panel ? outfit_panel->findChild<LLAccordionCtrlTab>("tab_outfits") : 0; + if (tab_outfits && !tab_outfits->getDisplayChildren()) + { + tab_outfits->changeOpenClose(tab_outfits->getDisplayChildren()); + } + + LLAppearanceMgr::getInstance()->updateIsDirty(); + LLAppearanceMgr::getInstance()->updatePanelOutfitName(""); + } + + virtual void fire(const LLUUID&) + {} + +private: + LLUUID mFolderID; +}; + +LLUUID LLAppearanceMgr::makeNewOutfitLinks(const std::string& new_folder_name) +{ + if (!isAgentAvatarValid()) return LLUUID::null; + + // 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, + new_folder_name); + + updateClothingOrderingInfo(); + + LLPointer<LLInventoryCallback> cb = new LLShowCreatedOutfit(folder_id); + shallowCopyCategoryContents(getCOF(),folder_id, cb); + createBaseOutfitLink(folder_id, cb); + + dumpCat(folder_id,"COF, new outfit"); + + return folder_id; +} + void LLAppearanceMgr::wearBaseOutfit() { const LLUUID& base_outfit_id = getBaseOutfitUUID(); @@ -1622,6 +1854,63 @@ void LLAppearanceMgr::removeItemFromAvatar(const LLUUID& id_to_remove) } } + +bool LLAppearanceMgr::moveWearable(LLViewerInventoryItem* item, bool closer_to_body) +{ + if (!item || !item->isWearableType()) return false; + if (item->getType() != LLAssetType::AT_CLOTHING) return false; + if (!gInventory.isObjectDescendentOf(item->getUUID(), getCOF())) return false; + + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + LLFindClothesOfType filter_wearables_of_type(item->getWearableType()); + gInventory.collectDescendentsIf(getCOF(), cats, items, true, filter_wearables_of_type); + if (items.empty()) return false; + + //*TODO all items are not guarantied to have valid descriptions (check?) + std::sort(items.begin(), items.end(), WearablesOrderComparator(item->getWearableType())); + + if (closer_to_body && items.front() == item) return false; + if (!closer_to_body && items.back() == item) return false; + + LLInventoryModel::item_array_t::iterator it = std::find(items.begin(), items.end(), item); + if (items.end() == it) return false; + + + //swapping descriptions + closer_to_body ? --it : ++it; + LLViewerInventoryItem* swap_item = *it; + if (!swap_item) return false; + std::string tmp = swap_item->LLInventoryItem::getDescription(); + swap_item->setDescription(item->LLInventoryItem::getDescription()); + item->setDescription(tmp); + + + //items need to be updated on a dataserver + item->setComplete(TRUE); + item->updateServer(FALSE); + gInventory.updateItem(item); + + swap_item->setComplete(TRUE); + swap_item->updateServer(FALSE); + gInventory.updateItem(swap_item); + + //to cause appearance of the agent to be updated + bool result = false; + if (result = gAgentWearables.moveWearable(item, closer_to_body)) + { + gAgentAvatarp->wearableUpdated(item->getWearableType(), TRUE); + } + + setOutfitDirty(true); + + //*TODO do we need to notify observers here in such a way? + gInventory.notifyObservers(); + + return result; +} + + //#define DUMP_CAT_VERBOSE void LLAppearanceMgr::dumpCat(const LLUUID& cat_id, const std::string& msg) diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 7e35919892..a308a3efa9 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -138,12 +138,25 @@ public: //Remove clothing or detach an object from the agent (a bodypart cannot be removed) void removeItemFromAvatar(const LLUUID& item_id); + + LLUUID makeNewOutfitLinks(const std::string& new_folder_name); + + bool moveWearable(LLViewerInventoryItem* item, bool closer_to_body); + protected: LLAppearanceMgr(); ~LLAppearanceMgr(); private: + typedef std::vector<LLInventoryModel::item_array_t> wearables_by_type_t; + + //Divvy items into arrays by wearable type + static void divvyWearablesByType(const LLInventoryModel::item_array_t& items, wearables_by_type_t& items_by_type); + + //Check ordering information on wearables stored in links' descriptions and update if it is invalid + void updateClothingOrderingInfo(); + void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type); void getDescendentsOfAssetType(const LLUUID& category, diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 532391e590..2f9bbb1407 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3242,6 +3242,13 @@ bool LLAppViewer::initCache() else { LLVFile::initClass(); + + //llinfos << "Static VFS listing" << llendl; + //gStaticVFS->listFiles(); + + //llinfos << "regular VFS listing" << llendl; + //gVFS->listFiles(); + return true; } } diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 80d9b14345..44ef39fb7d 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -291,6 +291,7 @@ static OSStatus CarbonEventHandler(EventHandlerCallRef inHandlerCallRef, if(os_result >= 0 && matching_psn) { sCrashReporterIsRunning = false; + QuitApplicationEventLoop(); } } return noErr; @@ -326,7 +327,7 @@ void LLAppViewerMacOSX::handleCrashReporting(bool reportFreeze) // *NOTE:Mani A better way - make a copy of the data that the crash reporter will send // and let SL go about its business. This way makes the mac work like windows and linux // and is the smallest patch for the issue. - sCrashReporterIsRunning = true; + sCrashReporterIsRunning = false; ProcessSerialNumber o_psn; static EventHandlerRef sCarbonEventsRef = NULL; @@ -356,15 +357,13 @@ void LLAppViewerMacOSX::handleCrashReporting(bool reportFreeze) if(os_result >= 0) { - EventRecord evt; - while(sCrashReporterIsRunning) - { - while(WaitNextEvent(osMask, &evt, 0, NULL)) - { - // null op!?! - } - } - } + sCrashReporterIsRunning = true; + } + + while(sCrashReporterIsRunning) + { + RunApplicationEventLoop(); + } // Re-install the apps quit handler. AEInstallEventHandler(kCoreEventClass, @@ -453,16 +452,17 @@ std::string LLAppViewerMacOSX::generateSerialNumber() static AudioDeviceID get_default_audio_output_device(void) { AudioDeviceID device = 0; - UInt32 size; - OSStatus err; - - size = sizeof(device); - err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &size, &device); + UInt32 size = sizeof(device); + AudioObjectPropertyAddress device_address = { kAudioHardwarePropertyDefaultOutputDevice, + kAudioObjectPropertyScopeGlobal, + kAudioObjectPropertyElementMaster }; + + OSStatus err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &device_address, 0, NULL, &size, &device); if(err != noErr) { LL_DEBUGS("SystemMute") << "Couldn't get default audio output device (0x" << std::hex << err << ")" << LL_ENDL; } - + return device; } @@ -470,11 +470,15 @@ static AudioDeviceID get_default_audio_output_device(void) void LLAppViewerMacOSX::setMasterSystemAudioMute(bool new_mute) { AudioDeviceID device = get_default_audio_output_device(); - + if(device != 0) { UInt32 mute = new_mute; - OSStatus err = AudioDeviceSetProperty(device, NULL, 0, false, kAudioDevicePropertyMute, sizeof(mute), &mute); + AudioObjectPropertyAddress device_address = { kAudioDevicePropertyMute, + kAudioDevicePropertyScopeOutput, + kAudioObjectPropertyElementMaster }; + + OSStatus err = AudioObjectSetPropertyData(device, &device_address, 0, NULL, sizeof(mute), &mute); if(err != noErr) { LL_INFOS("SystemMute") << "Couldn't set audio mute property (0x" << std::hex << err << ")" << LL_ENDL; @@ -487,13 +491,17 @@ bool LLAppViewerMacOSX::getMasterSystemAudioMute() { // Assume the system isn't muted UInt32 mute = 0; - + AudioDeviceID device = get_default_audio_output_device(); - + if(device != 0) { UInt32 size = sizeof(mute); - OSStatus err = AudioDeviceGetProperty(device, 0, false, kAudioDevicePropertyMute, &size, &mute); + AudioObjectPropertyAddress device_address = { kAudioDevicePropertyMute, + kAudioDevicePropertyScopeOutput, + kAudioObjectPropertyElementMaster }; + + OSStatus err = AudioObjectGetPropertyData(device, &device_address, 0, NULL, &size, &mute); if(err != noErr) { LL_DEBUGS("SystemMute") << "Couldn't get audio mute property (0x" << std::hex << err << ")" << LL_ENDL; diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index c7a5691d70..dfb213716c 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -34,6 +34,7 @@ // common #include "lltrans.h" +#include "llcommonutils.h" #include "llavatarlist.h" #include "llagentdata.h" // for comparator @@ -113,7 +114,7 @@ LLAvatarList::Params::Params() } LLAvatarList::LLAvatarList(const Params& p) -: LLFlatListView(p) +: LLFlatListViewEx(p) , mIgnoreOnlineStatus(p.ignore_online_status) , mShowLastInteractionTime(p.show_last_interaction_time) , mContextMenu(NULL) @@ -154,7 +155,7 @@ void LLAvatarList::draw() // *NOTE dzaporozhan // Call refresh() after draw() to avoid flickering of avatar list items. - LLFlatListView::draw(); + LLFlatListViewEx::draw(); if (mDirty) refresh(); @@ -171,14 +172,20 @@ void LLAvatarList::clear() { getIDs().clear(); setDirty(true); - LLFlatListView::clear(); + LLFlatListViewEx::clear(); } void LLAvatarList::setNameFilter(const std::string& filter) { - if (mNameFilter != filter) + std::string filter_upper = filter; + LLStringUtil::toUpper(filter_upper); + if (mNameFilter != filter_upper) { - mNameFilter = filter; + mNameFilter = filter_upper; + + // update message for empty state here instead of refresh() to avoid blinking when switch + // between tabs. + updateNoItemsMessage(filter); setDirty(); } } @@ -360,7 +367,7 @@ S32 LLAvatarList::notifyParent(const LLSD& info) sort(); return 1; } - return LLFlatListView::notifyParent(info); + return LLFlatListViewEx::notifyParent(info); } void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos) @@ -400,7 +407,6 @@ void LLAvatarList::computeDifference( uuid_vec_t& vremoved) { uuid_vec_t vcur; - uuid_vec_t vnew = vnew_unsorted; // Convert LLSDs to LLUUIDs. { @@ -411,21 +417,7 @@ void LLAvatarList::computeDifference( vcur.push_back(vcur_values[i].asUUID()); } - std::sort(vcur.begin(), vcur.end()); - std::sort(vnew.begin(), vnew.end()); - - uuid_vec_t::iterator it; - size_t maxsize = llmax(vcur.size(), vnew.size()); - vadded.resize(maxsize); - vremoved.resize(maxsize); - - // what to remove - it = set_difference(vcur.begin(), vcur.end(), vnew.begin(), vnew.end(), vremoved.begin()); - vremoved.erase(it, vremoved.end()); - - // what to add - it = set_difference(vnew.begin(), vnew.end(), vcur.begin(), vcur.end(), vadded.begin()); - vadded.erase(it, vadded.end()); + LLCommonUtils::computeDifference(vnew_unsorted, vcur, vadded, vremoved); } // Refresh shown time of our last interaction with all listed avatars. diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index 528f796b8b..ff090f3a34 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -49,11 +49,11 @@ class LLTimer; * @see setDirty() * @see setNameFilter() */ -class LLAvatarList : public LLFlatListView +class LLAvatarList : public LLFlatListViewEx { LOG_CLASS(LLAvatarList); public: - struct Params : public LLInitParam::Block<Params, LLFlatListView::Params> + struct Params : public LLInitParam::Block<Params, LLFlatListViewEx::Params> { Optional<bool> ignore_online_status, // show all items as online show_last_interaction_time, // show most recent interaction time. *HACK: move this to a derived class diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp index 33e5046f50..c7e788f345 100644 --- a/indra/newview/llavatarpropertiesprocessor.cpp +++ b/indra/newview/llavatarpropertiesprocessor.cpp @@ -37,6 +37,7 @@ // Viewer includes #include "llagent.h" #include "llagentpicksinfo.h" +#include "lldateutil.h" #include "llviewergenericmessage.h" // Linden library includes @@ -246,6 +247,7 @@ std::string LLAvatarPropertiesProcessor::paymentInfo(const LLAvatarData* avatar_ void LLAvatarPropertiesProcessor::processAvatarPropertiesReply(LLMessageSystem* msg, void**) { LLAvatarData avatar_data; + std::string birth_date; msg->getUUIDFast( _PREHASH_AgentData, _PREHASH_AgentID, avatar_data.agent_id); msg->getUUIDFast( _PREHASH_AgentData, _PREHASH_AvatarID, avatar_data.avatar_id); @@ -254,11 +256,12 @@ void LLAvatarPropertiesProcessor::processAvatarPropertiesReply(LLMessageSystem* msg->getUUIDFast( _PREHASH_PropertiesData, _PREHASH_PartnerID, avatar_data.partner_id); msg->getStringFast( _PREHASH_PropertiesData, _PREHASH_AboutText, avatar_data.about_text); msg->getStringFast( _PREHASH_PropertiesData, _PREHASH_FLAboutText, avatar_data.fl_about_text); - msg->getStringFast( _PREHASH_PropertiesData, _PREHASH_BornOn, avatar_data.born_on); + msg->getStringFast( _PREHASH_PropertiesData, _PREHASH_BornOn, birth_date); msg->getString( _PREHASH_PropertiesData, _PREHASH_ProfileURL, avatar_data.profile_url); msg->getU32Fast( _PREHASH_PropertiesData, _PREHASH_Flags, avatar_data.flags); + LLDateUtil::dateFromPDTString(avatar_data.born_on, birth_date); avatar_data.caption_index = 0; S32 charter_member_size = 0; diff --git a/indra/newview/llavatarpropertiesprocessor.h b/indra/newview/llavatarpropertiesprocessor.h index 716c1b8065..b9e8bfd0ab 100644 --- a/indra/newview/llavatarpropertiesprocessor.h +++ b/indra/newview/llavatarpropertiesprocessor.h @@ -67,7 +67,7 @@ struct LLAvatarData LLUUID partner_id; std::string about_text; std::string fl_about_text; - std::string born_on; + LLDate born_on; std::string profile_url; U8 caption_index; std::string caption_text; diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp index d15c5f9bf4..5a96613870 100644 --- a/indra/newview/llcallfloater.cpp +++ b/indra/newview/llcallfloater.cpp @@ -228,7 +228,7 @@ void LLCallFloater::leaveCall() LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel(); if (voice_channel) { - voice_channel->deactivate(); + gIMMgr->endCall(voice_channel->getSessionID()); } } diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp index 769387c26c..4f9434030f 100644 --- a/indra/newview/llchannelmanager.cpp +++ b/indra/newview/llchannelmanager.cpp @@ -35,6 +35,7 @@ #include "llchannelmanager.h" #include "llappviewer.h" +#include "llnotificationstorage.h" #include "llviewercontrol.h" #include "llviewerwindow.h" #include "llrootview.h" @@ -107,31 +108,35 @@ void LLChannelManager::onLoginCompleted() if(!away_notifications) { onStartUpToastClose(); - return; } - - // create a channel for the StartUp Toast - LLChannelManager::Params p; - p.id = LLUUID(gSavedSettings.getString("StartUpChannelUUID")); - p.channel_align = CA_RIGHT; - mStartUpChannel = createChannel(p); - - if(!mStartUpChannel) + else { - onStartUpToastClose(); - return; - } + // create a channel for the StartUp Toast + LLChannelManager::Params p; + p.id = LLUUID(gSavedSettings.getString("StartUpChannelUUID")); + p.channel_align = CA_RIGHT; + mStartUpChannel = createChannel(p); - gViewerWindow->getRootView()->addChild(mStartUpChannel); + if(!mStartUpChannel) + { + onStartUpToastClose(); + } + else + { + gViewerWindow->getRootView()->addChild(mStartUpChannel); - // init channel's position and size - S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); - S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth"); - mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound); - mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4)); + // init channel's position and size + S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); + S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth"); + mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound); + mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4)); + + mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this)); + mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime")); + } + } - mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this)); - mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime")); + LLPersistentNotificationStorage::getInstance()->loadNotifications(); } //-------------------------------------------------------------------------- diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index aef36b677c..6ee14e8ba9 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -44,6 +44,8 @@ #include "llviewercontrol.h" #include "llagentdata.h" +#include "llslurl.h" + static const S32 msg_left_offset = 10; static const S32 msg_right_offset = 10; static const S32 msg_height_pad = 5; @@ -190,6 +192,8 @@ void LLNearbyChatToastPanel::init(LLSD& notification) style_params_name.font.name(font_name); style_params_name.font.size(font_style_size); + style_params_name.link_href = LLSLURL::buildCommand("agent",mFromID,"about"); + msg_text->appendText(str_sender, FALSE, style_params_name); } diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 05d3d70c74..9c4aa7b964 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -465,6 +465,7 @@ LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p) , mSpeakerCtrl(NULL) , mCounterCtrl(NULL) , mChicletButton(NULL) +, mPopupMenu(NULL) { enableCounterControl(p.enable_counter); } @@ -648,6 +649,37 @@ LLIMChiclet::EType LLIMChiclet::getIMSessionType(const LLUUID& session_id) return type; } +BOOL LLIMChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask) +{ + if(!mPopupMenu) + { + createPopupMenu(); + } + + if (mPopupMenu) + { + updateMenuItems(); + mPopupMenu->arrangeAndClear(); + LLMenuGL::showPopup(this, mPopupMenu, x, y); + } + + return TRUE; +} + +bool LLIMChiclet::canCreateMenu() +{ + if(mPopupMenu) + { + llwarns << "Menu already exists" << llendl; + return false; + } + if(getSessionId().isNull()) + { + return false; + } + return true; +} + ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// @@ -665,7 +697,6 @@ LLIMP2PChiclet::Params::Params() LLIMP2PChiclet::LLIMP2PChiclet(const Params& p) : LLIMChiclet(p) , mChicletIconCtrl(NULL) -, mPopupMenu(NULL) { LLButton::Params button_params = p.chiclet_button; mChicletButton = LLUICtrlFactory::create<LLButton>(button_params); @@ -720,34 +751,10 @@ void LLIMP2PChiclet::updateMenuItems() mPopupMenu->getChild<LLUICtrl>("Add Friend")->setEnabled(!is_friend); } -BOOL LLIMP2PChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask) -{ - if(!mPopupMenu) - { - createPopupMenu(); - } - - if (mPopupMenu) - { - updateMenuItems(); - mPopupMenu->arrangeAndClear(); - LLMenuGL::showPopup(this, mPopupMenu, x, y); - } - - return TRUE; -} - void LLIMP2PChiclet::createPopupMenu() { - if(mPopupMenu) - { - llwarns << "Menu already exists" << llendl; + if(!canCreateMenu()) return; - } - if(getSessionId().isNull()) - { - return; - } LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; registrar.add("IMChicletMenu.Action", boost::bind(&LLIMP2PChiclet::onMenuItemClicked, this, _2)); @@ -797,7 +804,6 @@ LLAdHocChiclet::Params::Params() LLAdHocChiclet::LLAdHocChiclet(const Params& p) : LLIMChiclet(p) , mChicletIconCtrl(NULL) -, mPopupMenu(NULL) { LLButton::Params button_params = p.chiclet_button; mChicletButton = LLUICtrlFactory::create<LLButton>(button_params); @@ -867,15 +873,8 @@ void LLAdHocChiclet::switchToCurrentSpeaker() void LLAdHocChiclet::createPopupMenu() { - if(mPopupMenu) - { - llwarns << "Menu already exists" << llendl; + if(!canCreateMenu()) return; - } - if(getSessionId().isNull()) - { - return; - } LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; registrar.add("IMChicletMenu.Action", boost::bind(&LLAdHocChiclet::onMenuItemClicked, this, _2)); @@ -895,22 +894,6 @@ void LLAdHocChiclet::onMenuItemClicked(const LLSD& user_data) } } -BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask) -{ - if(!mPopupMenu) - { - createPopupMenu(); - } - - if (mPopupMenu) - { - mPopupMenu->arrangeAndClear(); - LLMenuGL::showPopup(this, mPopupMenu, x, y); - } - - return TRUE; -} - ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// @@ -929,7 +912,6 @@ LLIMGroupChiclet::LLIMGroupChiclet(const Params& p) : LLIMChiclet(p) , LLGroupMgrObserver(LLUUID::null) , mChicletIconCtrl(NULL) -, mPopupMenu(NULL) { LLButton::Params button_params = p.chiclet_button; mChicletButton = LLUICtrlFactory::create<LLButton>(button_params); @@ -1042,34 +1024,10 @@ void LLIMGroupChiclet::updateMenuItems() mPopupMenu->getChild<LLUICtrl>("Chat")->setEnabled(!open_window_exists); } -BOOL LLIMGroupChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask) -{ - if(!mPopupMenu) - { - createPopupMenu(); - } - - if (mPopupMenu) - { - updateMenuItems(); - mPopupMenu->arrangeAndClear(); - LLMenuGL::showPopup(this, mPopupMenu, x, y); - } - - return TRUE; -} - void LLIMGroupChiclet::createPopupMenu() { - if(mPopupMenu) - { - llwarns << "Menu already exists" << llendl; + if(!canCreateMenu()) return; - } - if(getSessionId().isNull()) - { - return; - } LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; registrar.add("IMChicletMenu.Action", boost::bind(&LLIMGroupChiclet::onMenuItemClicked, this, _2)); @@ -1917,6 +1875,28 @@ void LLScriptChiclet::onMouseDown() LLScriptFloaterManager::getInstance()->toggleScriptFloater(getSessionId()); } +void LLScriptChiclet::onMenuItemClicked(const LLSD& user_data) +{ + std::string action = user_data.asString(); + + if("end" == action) + { + LLScriptFloaterManager::instance().onRemoveNotification(getSessionId()); + } +} + +void LLScriptChiclet::createPopupMenu() +{ + if(!canCreateMenu()) + return; + + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + registrar.add("ScriptChiclet.Action", boost::bind(&LLScriptChiclet::onMenuItemClicked, this, _2)); + + mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL> + ("menu_script_chiclet.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); +} + ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// @@ -1978,4 +1958,26 @@ void LLInvOfferChiclet::onMouseDown() LLScriptFloaterManager::instance().toggleScriptFloater(getSessionId()); } +void LLInvOfferChiclet::onMenuItemClicked(const LLSD& user_data) +{ + std::string action = user_data.asString(); + + if("end" == action) + { + LLScriptFloaterManager::instance().onRemoveNotification(getSessionId()); + } +} + +void LLInvOfferChiclet::createPopupMenu() +{ + if(!canCreateMenu()) + return; + + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + registrar.add("InvOfferChiclet.Action", boost::bind(&LLInvOfferChiclet::onMenuItemClicked, this, _2)); + + mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL> + ("menu_inv_offer_chiclet.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); +} + // EOF diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index 97f494b817..9d421b4f0b 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -428,12 +428,31 @@ public: virtual void setToggleState(bool toggle); + /** + * Displays popup menu. + */ + virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); + protected: LLIMChiclet(const LLIMChiclet::Params& p); protected: + /** + * Creates chiclet popup menu. + */ + virtual void createPopupMenu() = 0; + + /** + * Enables/disables menus. + */ + virtual void updateMenuItems() {}; + + bool canCreateMenu(); + + LLMenuGL* mPopupMenu; + bool mShowSpeaker; bool mCounterEnabled; /* initial width of chiclet, should not include counter or speaker width */ @@ -519,11 +538,6 @@ protected: */ virtual void onMenuItemClicked(const LLSD& user_data); - /** - * Displays popup menu. - */ - /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); - /** * Enables/disables menus based on relationship with other participant. * Enables/disables "show session" menu item depending on visible IM floater existence. @@ -533,7 +547,6 @@ protected: private: LLChicletAvatarIconCtrl* mChicletIconCtrl; - LLMenuGL* mPopupMenu; }; /** @@ -598,11 +611,6 @@ protected: virtual void onMenuItemClicked(const LLSD& user_data); /** - * Displays popup menu. - */ - virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); - - /** * Finds a current speaker and resets the SpeakerControl with speaker's ID */ /*virtual*/ void switchToCurrentSpeaker(); @@ -610,7 +618,6 @@ protected: private: LLChicletAvatarIconCtrl* mChicletIconCtrl; - LLMenuGL* mPopupMenu; }; /** @@ -647,6 +654,16 @@ protected: LLScriptChiclet(const Params&); friend class LLUICtrlFactory; + /** + * Creates chiclet popup menu. + */ + virtual void createPopupMenu(); + + /** + * Processes clicks on chiclet popup menu. + */ + virtual void onMenuItemClicked(const LLSD& user_data); + private: LLIconCtrl* mChicletIconCtrl; @@ -685,6 +702,16 @@ protected: LLInvOfferChiclet(const Params&); friend class LLUICtrlFactory; + /** + * Creates chiclet popup menu. + */ + virtual void createPopupMenu(); + + /** + * Processes clicks on chiclet popup menu. + */ + virtual void onMenuItemClicked(const LLSD& user_data); + private: LLChicletInvOfferIconCtrl* mChicletIconCtrl; }; @@ -767,15 +794,9 @@ protected: */ virtual void updateMenuItems(); - /** - * Displays popup menu. - */ - /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); - private: LLChicletGroupIconCtrl* mChicletIconCtrl; - LLMenuGL* mPopupMenu; }; /** @@ -900,6 +921,9 @@ protected: class LLNotificationChiclet : public LLSysWellChiclet { friend class LLUICtrlFactory; +public: + struct Params : public LLInitParam::Block<Params, LLSysWellChiclet::Params>{}; + protected: LLNotificationChiclet(const Params& p); diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp new file mode 100644 index 0000000000..f0442ee3f6 --- /dev/null +++ b/indra/newview/llcofwearables.cpp @@ -0,0 +1,153 @@ +/** + * @file llcofwearables.cpp + * @brief LLCOFWearables displayes wearables from the current outfit split into three lists (attachments, clothing and body parts) + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, 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 "llcofwearables.h" + +#include "llappearancemgr.h" +#include "llinventory.h" +#include "llinventoryitemslist.h" +#include "llinventoryfunctions.h" + +static LLRegisterPanelClassWrapper<LLCOFWearables> t_cof_wearables("cof_wearables"); + +const LLSD REARRANGE = LLSD().with("rearrange", LLSD()); + + +LLCOFWearables::LLCOFWearables() : LLPanel(), + mAttachments(NULL), + mClothing(NULL), + mBodyParts(NULL), + mLastSelectedList(NULL) +{ +}; + + +// virtual +BOOL LLCOFWearables::postBuild() +{ + mAttachments = getChild<LLFlatListView>("list_attachments"); + mClothing = getChild<LLFlatListView>("list_clothing"); + mBodyParts = getChild<LLFlatListView>("list_body_parts"); + + + //selection across different list/tabs is not supported + mAttachments->setCommitCallback(boost::bind(&LLCOFWearables::onSelectionChange, this, mAttachments)); + mClothing->setCommitCallback(boost::bind(&LLCOFWearables::onSelectionChange, this, mClothing)); + mBodyParts->setCommitCallback(boost::bind(&LLCOFWearables::onSelectionChange, this, mBodyParts)); + + mAttachments->setCommitOnSelectionChange(true); + mClothing->setCommitOnSelectionChange(true); + mBodyParts->setCommitOnSelectionChange(true); + + return LLPanel::postBuild(); +} + +void LLCOFWearables::onSelectionChange(LLFlatListView* selected_list) +{ + if (!selected_list) return; + + if (selected_list != mLastSelectedList) + { + if (selected_list != mAttachments) mAttachments->resetSelection(true); + if (selected_list != mClothing) mClothing->resetSelection(true); + if (selected_list != mBodyParts) mBodyParts->resetSelection(true); + + mLastSelectedList = selected_list; + } + + onCommit(); +} + +void LLCOFWearables::refresh() +{ + clear(); + + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + + gInventory.collectDescendents(LLAppearanceMgr::getInstance()->getCOF(), cats, items, LLInventoryModel::EXCLUDE_TRASH); + if (items.empty()) return; + + for (U32 i = 0; i < items.size(); ++i) + { + LLViewerInventoryItem* item = items.get(i); + if (!item) continue; + + LLPanelInventoryListItem* item_panel = LLPanelInventoryListItem::createItemPanel(item); + if (!item_panel) continue; + + switch (item->getType()) + { + case LLAssetType::AT_OBJECT: + mAttachments->addItem(item_panel, item->getUUID(), ADD_BOTTOM, false); + break; + + case LLAssetType::AT_BODYPART: + mBodyParts->addItem(item_panel, item->getUUID(), ADD_BOTTOM, false); + break; + + case LLAssetType::AT_CLOTHING: + mClothing->addItem(item_panel, item->getUUID(), ADD_BOTTOM, false); + break; + + default: break; + } + } + + mAttachments->sort(); //*TODO by Name + mAttachments->notify(REARRANGE); //notifying the parent about the list's size change (cause items were added with rearrange=false) + + mClothing->sort(); //*TODO by actual inventory item description + mClothing->notify(REARRANGE); + + mBodyParts->sort(); //*TODO by name + mBodyParts->notify(REARRANGE); +} + + +LLUUID LLCOFWearables::getSelectedUUID() +{ + if (!mLastSelectedList) return LLUUID::null; + + return mLastSelectedList->getSelectedUUID(); +} + +void LLCOFWearables::clear() +{ + mAttachments->clear(); + mClothing->clear(); + mBodyParts->clear(); +} + +//EOF diff --git a/indra/newview/llcofwearables.h b/indra/newview/llcofwearables.h new file mode 100644 index 0000000000..58d67ed32f --- /dev/null +++ b/indra/newview/llcofwearables.h @@ -0,0 +1,66 @@ +/** + * @file llcofwearables.h + * @brief LLCOFWearables displayes wearables from the current outfit split into three lists (attachments, clothing and body parts) + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, 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_LLCOFWEARABLES_H +#define LL_LLCOFWEARABLES_H + +#include "llpanel.h" + +class LLFlatListView; + +class LLCOFWearables : public LLPanel +{ +public: + LLCOFWearables(); + virtual ~LLCOFWearables() {}; + + /*virtual*/ BOOL postBuild(); + + LLUUID getSelectedUUID(); + + void refresh(); + void clear(); + +protected: + + void onSelectionChange(LLFlatListView* selected_list); + + LLFlatListView* mAttachments; + LLFlatListView* mClothing; + LLFlatListView* mBodyParts; + + LLFlatListView* mLastSelectedList; + +}; + + +#endif diff --git a/indra/newview/lldateutil.cpp b/indra/newview/lldateutil.cpp index abb2fdeb9a..3e71ecdfba 100644 --- a/indra/newview/lldateutil.cpp +++ b/indra/newview/lldateutil.cpp @@ -59,19 +59,22 @@ static S32 days_from_month(S32 year, S32 month) } } -std::string LLDateUtil::ageFromDate(const std::string& date_string, - const LLDate& now) +bool LLDateUtil::dateFromPDTString(LLDate& date, const std::string& str) +{ + S32 month, day, year; + S32 matched = sscanf(str.c_str(), "%d/%d/%d", &month, &day, &year); + if (matched != 3) return false; + date.fromYMDHMS(year, month, day); + F64 secs_since_epoch = date.secondsSinceEpoch(); + // Correct for the fact that specified date is in Pacific time, == UTC - 8 + secs_since_epoch += 8.0 * 60.0 * 60.0; + date.secondsSinceEpoch(secs_since_epoch); + return true; +} + +std::string LLDateUtil::ageFromDate(const LLDate& born_date, const LLDate& now) { S32 born_month, born_day, born_year; - S32 matched = sscanf(date_string.c_str(), "%d/%d/%d", &born_month, &born_day, &born_year); - if (matched != 3) return "???"; - LLDate born_date; - born_date.fromYMDHMS(born_year, born_month, born_day); - F64 born_date_secs_since_epoch = born_date.secondsSinceEpoch(); - // Correct for the fact that account creation dates are in Pacific time, - // == UTC - 8 - born_date_secs_since_epoch += 8.0 * 60.0 * 60.0; - born_date.secondsSinceEpoch(born_date_secs_since_epoch); // explode out to month/day/year again born_date.split(&born_year, &born_month, &born_day); @@ -155,6 +158,16 @@ std::string LLDateUtil::ageFromDate(const std::string& date_string, return LLTrans::getString("TodayOld"); } +std::string LLDateUtil::ageFromDate(const std::string& date_string, const LLDate& now) +{ + LLDate born_date; + + if (!dateFromPDTString(born_date, date_string)) + return "???"; + + return ageFromDate(born_date, now); +} + std::string LLDateUtil::ageFromDate(const std::string& date_string) { return ageFromDate(date_string, LLDate::now()); diff --git a/indra/newview/lldateutil.h b/indra/newview/lldateutil.h index 041be07f12..a0df21022e 100644 --- a/indra/newview/lldateutil.h +++ b/indra/newview/lldateutil.h @@ -36,6 +36,29 @@ class LLDate; namespace LLDateUtil { + /** + * Convert a date provided by the server into seconds since the Epoch. + * + * @param[out] date Number of seconds since 01/01/1970 UTC. + * @param[in] str Date string (MM/DD/YYYY) in PDT time zone. + * + * @return true on success, false on parse error + */ + bool dateFromPDTString(LLDate& date, const std::string& str); + + /** + * Get human-readable avatar age. + * + * Used for avatar inspectors and profiles. + * + * @param born_date Date an avatar was born on. + * @param now Current date. + * + * @return human-readable localized string like "1 year, 2 months", + * or "???" on error. + */ + std::string ageFromDate(const LLDate& born_date, const LLDate& now); + // Convert a date provided by the server (MM/DD/YYYY) into a localized, // human-readable age (1 year, 2 months) using translation strings. // Pass LLDate::now() for now. diff --git a/indra/newview/llfilteredwearablelist.cpp b/indra/newview/llfilteredwearablelist.cpp new file mode 100644 index 0000000000..01d3c3f22e --- /dev/null +++ b/indra/newview/llfilteredwearablelist.cpp @@ -0,0 +1,113 @@ +/** + * @file llfilteredwearablelist.cpp + * @brief Functionality for showing filtered wearable flat list + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, 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 "llfilteredwearablelist.h" + +// newview +#include "llinventoryfunctions.h" +#include "llinventoryitemslist.h" +#include "llinventorymodel.h" + +class LLFindItemsByMask : public LLInventoryCollectFunctor +{ +public: + LLFindItemsByMask(U64 mask) + : mFilterMask(mask) + {} + + virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) + { + if(item) + { + if( mFilterMask & (1LL << item->getInventoryType()) ) + { + return TRUE; + } + } + return FALSE; + } + +private: + U64 mFilterMask; +}; + +////////////////////////////////////////////////////////////////////////// + +LLFilteredWearableListManager::LLFilteredWearableListManager(LLInventoryItemsList* list, U64 filter_mask) +: mWearableList(list) +, mFilterMask(filter_mask) +{ + llassert(mWearableList); + gInventory.addObserver(this); + gInventory.fetchDescendentsOf(gInventory.getRootFolderID()); +} + +LLFilteredWearableListManager::~LLFilteredWearableListManager() +{ + gInventory.removeObserver(this); +} + +void LLFilteredWearableListManager::changed(U32 mask) +{ + if(!gInventory.isInventoryUsable()) + { + return; + } + + populateList(); +} + +void LLFilteredWearableListManager::setFilterMask(U64 mask) +{ + mFilterMask = mask; + populateList(); +} + +void LLFilteredWearableListManager::populateList() +{ + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + LLFindItemsByMask collector(mFilterMask); + + gInventory.collectDescendentsIf( + gInventory.getRootFolderID(), + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH, + collector); + + // Probably will also need to get items from Library (waiting for reply in EXT-6724). + + mWearableList->refreshList(item_array); +} + +// EOF diff --git a/indra/newview/llfilteredwearablelist.h b/indra/newview/llfilteredwearablelist.h new file mode 100644 index 0000000000..3f42833bb4 --- /dev/null +++ b/indra/newview/llfilteredwearablelist.h @@ -0,0 +1,70 @@ +/** + * @file llfilteredwearablelist.h + * @brief Functionality for showing filtered wearable flat list + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, 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_LLFILTEREDWEARABLELIST_H +#define LL_LLFILTEREDWEARABLELIST_H + +#include "llinventoryobserver.h" + +class LLInventoryItemsList; + +// Class that fills LLInventoryItemsList with filtered data. +class LLFilteredWearableListManager : public LLInventoryObserver +{ + LOG_CLASS(LLFilteredWearableListManager); +public: + + LLFilteredWearableListManager(LLInventoryItemsList* list, U64 filter_mask); + ~LLFilteredWearableListManager(); + + /** LLInventoryObserver implementation + * + */ + /*virtual*/ void changed(U32 mask); + + /** + * Sets new filter and applies it immediately + */ + void setFilterMask(U64 mask); + + /** + * Populates wearable list with filtered data. + */ + void populateList(); + +private: + LLInventoryItemsList* mWearableList; + U64 mFilterMask; +}; + +#endif //LL_LLFILTEREDWEARABLELIST_H + +// EOF diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp index 698ccec9c1..679ab4c713 100644 --- a/indra/newview/llfloaterauction.cpp +++ b/indra/newview/llfloaterauction.cpp @@ -46,6 +46,7 @@ #include "llagent.h" #include "llcombobox.h" +#include "llmimetypes.h" #include "llnotifications.h" #include "llnotificationsutil.h" #include "llsavedsettingsglue.h" @@ -351,7 +352,7 @@ void LLFloaterAuction::doResetParcel() body["music_url"] = empty; body["media_url"] = empty; body["media_desc"] = empty; - body["media_type"] = std::string("none/none"); + body["media_type"] = LLMIMETypes::getDefaultMimeType(); body["media_width"] = (S32) 0; body["media_height"] = (S32) 0; body["auto_scale"] = (S32) 0; diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp index d37bc01885..76a61db5fd 100644 --- a/indra/newview/llfloaterbuyland.cpp +++ b/indra/newview/llfloaterbuyland.cpp @@ -54,6 +54,7 @@ #include "llstatusbar.h" #include "lltextbox.h" #include "lltexturectrl.h" +#include "lltrans.h" #include "llviewchildren.h" #include "llviewercontrol.h" #include "lluictrlfactory.h" @@ -1172,13 +1173,13 @@ void LLFloaterBuyLandUI::refreshUI() if (!mParcelValid) { - message += getString("no_parcel_selected"); + message += LLTrans::getString("sentences_separator") + getString("no_parcel_selected"); } else if (mParcelBillableArea == mParcelActualArea) { LLStringUtil::format_map_t string_args; string_args["[AMOUNT]"] = llformat("%d ", mParcelActualArea); - message += getString("parcel_meters", string_args); + message += LLTrans::getString("sentences_separator") + getString("parcel_meters", string_args); } else { @@ -1187,13 +1188,13 @@ void LLFloaterBuyLandUI::refreshUI() { LLStringUtil::format_map_t string_args; string_args["[AMOUNT]"] = llformat("%d ", mParcelBillableArea); - message += getString("premium_land", string_args); + message += LLTrans::getString("sentences_separator") + getString("premium_land", string_args); } else { LLStringUtil::format_map_t string_args; string_args["[AMOUNT]"] = llformat("%d ", mParcelBillableArea); - message += getString("discounted_land", string_args); + message += LLTrans::getString("sentences_separator") + getString("discounted_land", string_args); } } diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp index ef9da30552..8a20712ea8 100644 --- a/indra/newview/llfloaterimagepreview.cpp +++ b/indra/newview/llfloaterimagepreview.cpp @@ -59,13 +59,18 @@ #include "llviewertexturelist.h" #include "llstring.h" +#include "llendianswizzle.h" + +#include "llviewercontrol.h" +#include "lltrans.h" +#include "llimagedimensionsinfo.h" + const S32 PREVIEW_BORDER_WIDTH = 2; const S32 PREVIEW_RESIZE_HANDLE_SIZE = S32(RESIZE_HANDLE_WIDTH * OO_SQRT2) + PREVIEW_BORDER_WIDTH; const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE; const S32 PREF_BUTTON_HEIGHT = 16 + 7 + 16; const S32 PREVIEW_TEXTURE_HEIGHT = 300; - //----------------------------------------------------------------------------- // LLFloaterImagePreview() //----------------------------------------------------------------------------- @@ -124,6 +129,11 @@ BOOL LLFloaterImagePreview::postBuild() childShow("bad_image_text"); childDisable("clothing_type_combo"); childDisable("ok_btn"); + + if(!mImageLoadError.empty()) + { + childSetValue("bad_image_text",mImageLoadError.c_str()); + } } getChild<LLUICtrl>("ok_btn")->setCommitCallback(boost::bind(&LLFloaterNameDesc::onBtnOK, this)); @@ -341,6 +351,27 @@ bool LLFloaterImagePreview::loadImage(const std::string& src_filename) codec = IMG_CODEC_PNG; } + LLImageDimensionsInfo image_info; + if(!image_info.load(src_filename,codec)) + { + mImageLoadError = image_info.getLastError(); + return false; + } + + S32 max_width = gSavedSettings.getS32("max_texture_dimension_X"); + S32 max_heigh = gSavedSettings.getS32("max_texture_dimension_Y"); + + if(image_info.getWidth() > max_width|| image_info.getHeight() > max_heigh) + { + LLStringUtil::format_map_t args; + args["WIDTH"] = llformat("%d", max_width); + args["HEIGHT"] = llformat("%d", max_heigh); + + mImageLoadError = LLTrans::getString("texture_load_dimensions_error", args); + return false; + } + + LLPointer<LLImageRaw> raw_image = new LLImageRaw; switch (codec) diff --git a/indra/newview/llfloaterimagepreview.h b/indra/newview/llfloaterimagepreview.h index 466bd1d0ec..3a7e1ff7d8 100644 --- a/indra/newview/llfloaterimagepreview.h +++ b/indra/newview/llfloaterimagepreview.h @@ -143,7 +143,8 @@ protected: LLRect mPreviewRect; LLRectf mPreviewImageRect; LLPointer<LLViewerTexture> mImagep ; - + + std::string mImageLoadError; }; #endif // LL_LLFLOATERIMAGEPREVIEW_H diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index a6a8194685..e994a18d9b 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -988,7 +988,7 @@ void profile_pic_upload_callback(const LLUUID& uuid) void LLSnapshotLivePreview::confirmSavingTexture(bool set_as_profile_pic) { LLSD args; - args["AMOUNT"] = "10"; // *TODO: there's currently no way to avoid hardcoding the upload price + args["AMOUNT"] = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); LLNotificationsUtil::add("UploadConfirmation", args, LLSD(), boost::bind(&LLSnapshotLivePreview::onSavingTextureConfirmed, this, _1, _2, set_as_profile_pic)); } diff --git a/indra/newview/llfloatertos.cpp b/indra/newview/llfloatertos.cpp index 3db9587797..104827f4a3 100644 --- a/indra/newview/llfloatertos.cpp +++ b/indra/newview/llfloatertos.cpp @@ -144,9 +144,6 @@ BOOL LLFloaterTOS::postBuild() // Don't use the start_url parameter for this browser instance -- it may finish loading before we get to add our observer. // Store the URL separately and navigate here instead. web_browser->navigateTo( getString( "loading_url" ) ); - - gResponsePtr = LLIamHere::build( this ); - LLHTTPClient::get( getString( "real_url" ), gResponsePtr ); } return TRUE; @@ -163,10 +160,19 @@ void LLFloaterTOS::setSiteIsAlive( bool alive ) if ( alive ) { // navigate to the "real" page - loadIfNeeded(); + if(!mRealNavigateBegun && mSiteAlive) + { + LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("tos_html"); + if(web_browser) + { + mRealNavigateBegun = true; + web_browser->navigateTo( getString( "real_url" ) ); + } + } } else { + LL_INFOS("TOS") << "ToS page: ToS page unavailable!" << LL_ENDL; // normally this is set when navigation to TOS page navigation completes (so you can't accept before TOS loads) // but if the page is unavailable, we need to do this now LLCheckBoxCtrl* tos_agreement = getChild<LLCheckBoxCtrl>("agree_chk"); @@ -175,22 +181,8 @@ void LLFloaterTOS::setSiteIsAlive( bool alive ) } } -void LLFloaterTOS::loadIfNeeded() -{ - if(!mRealNavigateBegun && mSiteAlive) - { - LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("tos_html"); - if(web_browser) - { - mRealNavigateBegun = true; - web_browser->navigateTo( getString( "real_url" ) ); - } - } -} - LLFloaterTOS::~LLFloaterTOS() { - // tell the responder we're not here anymore if ( gResponsePtr ) gResponsePtr->setParent( 0 ); @@ -215,7 +207,7 @@ void LLFloaterTOS::updateAgree(LLUICtrl*, void* userdata ) void LLFloaterTOS::onContinue( void* userdata ) { LLFloaterTOS* self = (LLFloaterTOS*) userdata; - llinfos << "User agrees with TOS." << llendl; + LL_INFOS("TOS") << "User agrees with TOS." << LL_ENDL; if(self->mReplyPumpName != "") { @@ -229,7 +221,7 @@ void LLFloaterTOS::onContinue( void* userdata ) void LLFloaterTOS::onCancel( void* userdata ) { LLFloaterTOS* self = (LLFloaterTOS*) userdata; - llinfos << "User disagrees with TOS." << llendl; + LL_INFOS("TOS") << "User disagrees with TOS." << LL_ENDL; LLNotificationsUtil::add("MustAgreeToLogIn", LLSD(), LLSD(), login_alert_done); if(self->mReplyPumpName != "") @@ -254,11 +246,13 @@ void LLFloaterTOS::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent ev if(!mLoadingScreenLoaded) { mLoadingScreenLoaded = true; - loadIfNeeded(); + + gResponsePtr = LLIamHere::build( this ); + LLHTTPClient::get( getString( "real_url" ), gResponsePtr ); } else if(mRealNavigateBegun) { - llinfos << "NAVIGATE COMPLETE" << llendl; + LL_INFOS("TOS") << "TOS: NAVIGATE COMPLETE" << LL_ENDL; // enable Agree to TOS radio button now that page has loaded LLCheckBoxCtrl * tos_agreement = getChild<LLCheckBoxCtrl>("agree_chk"); tos_agreement->setEnabled( true ); diff --git a/indra/newview/llfloatertos.h b/indra/newview/llfloatertos.h index 6ea56408ee..d985ccbab0 100644 --- a/indra/newview/llfloatertos.h +++ b/indra/newview/llfloatertos.h @@ -67,8 +67,6 @@ public: private: - void loadIfNeeded(); - std::string mMessage; int mWebBrowserWindowId; bool mLoadingScreenLoaded; diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp index 91d0f0e370..002d417e4c 100644 --- a/indra/newview/llfloaterurlentry.cpp +++ b/indra/newview/llfloaterurlentry.cpp @@ -40,6 +40,7 @@ #include "llpanelface.h" #include "llcombobox.h" +#include "llmimetypes.h" #include "llnotificationsutil.h" #include "llurlhistory.h" #include "lluictrlfactory.h" @@ -71,14 +72,14 @@ public: virtual void error( U32 status, const std::string& reason ) { - completeAny(status, "none/none"); + completeAny(status, LLMIMETypes::getDefaultMimeType()); } void completeAny(U32 status, const std::string& mime_type) { // Set empty type to none/none. Empty string is reserved for legacy parcels // which have no mime type set. - std::string resolved_mime_type = ! mime_type.empty() ? mime_type : "none/none"; + std::string resolved_mime_type = ! mime_type.empty() ? mime_type : LLMIMETypes::getDefaultMimeType(); LLFloaterURLEntry* floater_url_entry = (LLFloaterURLEntry*)mParent.get(); if ( floater_url_entry ) floater_url_entry->headerFetchComplete( status, resolved_mime_type ); diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index c492bfcef1..eba4cdfa31 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -946,7 +946,9 @@ void LLFolderView::draw() } else { - mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage()); + LLStringUtil::format_map_t args; + args["[SEARCH_TERM]"] = LLURI::escape(getFilter()->getFilterSubStringOrig()); + mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage(), args); //font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE ); } mStatusTextBox->setValue(mStatusText); diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp index 8a056f836f..252c34cf9c 100644 --- a/indra/newview/llgrouplist.cpp +++ b/indra/newview/llgrouplist.cpp @@ -71,18 +71,10 @@ public: static const LLGroupComparator GROUP_COMPARATOR; -LLGroupList::Params::Params() -: no_groups_msg("no_groups_msg") -, no_filtered_groups_msg("no_filtered_groups_msg") -{ - -} LLGroupList::LLGroupList(const Params& p) -: LLFlatListView(p) +: LLFlatListViewEx(p) , mDirty(true) // to force initial update - , mNoFilteredGroupsMsg(p.no_filtered_groups_msg) - , mNoGroupsMsg(p.no_groups_msg) { // Listen for agent group changes. gAgent.addListener(this, "new group"); @@ -139,9 +131,15 @@ BOOL LLGroupList::handleRightMouseDown(S32 x, S32 y, MASK mask) void LLGroupList::setNameFilter(const std::string& filter) { - if (mNameFilter != filter) + std::string filter_upper = filter; + LLStringUtil::toUpper(filter_upper); + if (mNameFilter != filter_upper) { - mNameFilter = filter; + mNameFilter = filter_upper; + + // set no items message depend on filter state + updateNoItemsMessage(filter); + setDirty(); } } @@ -159,18 +157,6 @@ void LLGroupList::refresh() LLUUID id; bool have_filter = !mNameFilter.empty(); - // set no items message depend on filter state & total count of groups - if (have_filter) - { - // groups were filtered - setNoItemsCommentText(mNoFilteredGroupsMsg); - } - else if (0 == count) - { - // user is not a member of any group - setNoItemsCommentText(mNoGroupsMsg); - } - clear(); for(S32 i = 0; i < count; ++i) diff --git a/indra/newview/llgrouplist.h b/indra/newview/llgrouplist.h index 0e9da25c58..16f3fc05a3 100644 --- a/indra/newview/llgrouplist.h +++ b/indra/newview/llgrouplist.h @@ -47,23 +47,10 @@ * * @see setNameFilter() */ -class LLGroupList: public LLFlatListView, public LLOldEvents::LLSimpleListener +class LLGroupList: public LLFlatListViewEx, public LLOldEvents::LLSimpleListener { LOG_CLASS(LLGroupList); public: - struct Params : public LLInitParam::Block<Params, LLFlatListView::Params> - { - /** - * Contains a message for empty list when user is not a member of any group - */ - Optional<std::string> no_groups_msg; - - /** - * Contains a message for empty list when all groups don't match passed filter - */ - Optional<std::string> no_filtered_groups_msg; - Params(); - }; LLGroupList(const Params& p); virtual ~LLGroupList(); @@ -75,11 +62,6 @@ public: void toggleIcons(); bool getIconsVisible() const { return mShowIcons; } - // *WORKAROUND: two methods to overload appropriate Params due to localization issue: - // no_groups_msg & no_filtered_groups_msg attributes are not defined as translatable in VLT. See EXT-5931 - void setNoGroupsMsg(const std::string& msg) { mNoGroupsMsg = msg; } - void setNoFilteredGroupsMsg(const std::string& msg) { mNoFilteredGroupsMsg = msg; } - private: void setDirty(bool val = true) { mDirty = val; } void refresh(); @@ -94,8 +76,6 @@ private: bool mShowIcons; bool mDirty; std::string mNameFilter; - std::string mNoFilteredGroupsMsg; - std::string mNoGroupsMsg; }; class LLButton; diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 4357c7d426..f03026715d 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1767,6 +1767,8 @@ void LLOutgoingCallDialog::show(const LLSD& key) getChild<LLTextBox>("leaving")->setVisible(true); } break; + // STATE_READY is here to show appropriate text for ad-hoc and group calls when floater is shown(EXT-6893) + case LLVoiceChannel::STATE_READY : case LLVoiceChannel::STATE_RINGING : if(show_oldchannel) { @@ -2744,6 +2746,12 @@ bool LLIMMgr::endCall(const LLUUID& session_id) if (!voice_channel) return false; voice_channel->deactivate(); + LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id); + if (im_session) + { + // need to update speakers' state + im_session->mSpeakers->update(FALSE); + } return true; } diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp index 94ea236757..e48bb77bda 100644 --- a/indra/newview/llinspectavatar.cpp +++ b/indra/newview/llinspectavatar.cpp @@ -58,6 +58,7 @@ #include "llfloaterreg.h" #include "llmenubutton.h" #include "lltooltip.h" // positionViewNearMouse() +#include "lltrans.h" #include "lluictrl.h" #include "llavatariconctrl.h" @@ -380,7 +381,11 @@ void LLInspectAvatar::requestUpdate() void LLInspectAvatar::processAvatarData(LLAvatarData* data) { LLStringUtil::format_map_t args; - args["[BORN_ON]"] = data->born_on; + { + std::string birth_date = LLTrans::getString("AvatarBirthDateFormat"); + LLStringUtil::format(birth_date, LLSD().with("datetime", (S32) data->born_on.secondsSinceEpoch())); + args["[BORN_ON]"] = birth_date; + } args["[AGE]"] = LLDateUtil::ageFromDate(data->born_on, LLDate::now()); args["[SL_PROFILE]"] = data->about_text; args["[RW_PROFILE"] = data->fl_about_text; diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 023e1a0461..9275ddc4e3 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2525,6 +2525,7 @@ void LLFolderBridge::pasteLinkFromClipboard() item->getLinkedUUID(), parent_id, item->getName(), + item->getDescription(), LLAssetType::AT_LINK, LLPointer<LLInventoryCallback>(NULL)); } @@ -3171,6 +3172,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, inv_item->getLinkedUUID(), mUUID, inv_item->getName(), + inv_item->getDescription(), LLAssetType::AT_LINK, cb); } diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 1a488175ac..901a570487 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -329,9 +329,10 @@ void LLInventoryFilter::setFilterSubString(const std::string& string) // appending new characters const BOOL more_restrictive = mFilterSubString.size() < string.size() && !string.substr(0, mFilterSubString.size()).compare(mFilterSubString); - mFilterSubString = string; + mFilterSubStringOrig = string; + LLStringUtil::trimHead(mFilterSubStringOrig); + mFilterSubString = mFilterSubStringOrig; LLStringUtil::toUpper(mFilterSubString); - LLStringUtil::trimHead(mFilterSubString); if (less_restrictive) { setModified(FILTER_LESS_RESTRICTIVE); diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index b01554edc8..2376ba5d22 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -84,6 +84,7 @@ public: void setFilterSubString(const std::string& string); const std::string& getFilterSubString(BOOL trim = FALSE) const; + const std::string& getFilterSubStringOrig() const { return mFilterSubStringOrig; } BOOL hasFilterString() const; void setFilterPermissions(PermissionMask perms); @@ -181,6 +182,7 @@ private: std::string::size_type mSubStringMatchOffset; std::string mFilterSubString; + std::string mFilterSubStringOrig; const std::string mName; S32 mFilterGeneration; diff --git a/indra/newview/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp new file mode 100644 index 0000000000..dca130c672 --- /dev/null +++ b/indra/newview/llinventoryitemslist.cpp @@ -0,0 +1,237 @@ +/** + * @file llinventoryitemslist.cpp + * @brief A list of inventory items represented by LLFlatListView. + * + * Class LLInventoryItemsList implements a flat list of inventory items. + * Class LLPanelInventoryListItem displays inventory item as an element + * of LLInventoryItemsList. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, 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 "llinventoryitemslist.h" + +// llcommon +#include "llcommonutils.h" + +#include "lliconctrl.h" + +#include "llinventoryfunctions.h" +#include "llinventorymodel.h" +#include "lltextutil.h" + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// + +// static +LLPanelInventoryListItem* LLPanelInventoryListItem::createItemPanel(const LLViewerInventoryItem* item) +{ + if (item) + { + return new LLPanelInventoryListItem(item); + } + else + { + return NULL; + } +} + +LLPanelInventoryListItem::~LLPanelInventoryListItem() +{} + +//virtual +BOOL LLPanelInventoryListItem::postBuild() +{ + mIcon = getChild<LLIconCtrl>("item_icon"); + mTitle = getChild<LLTextBox>("item_name"); + + updateItem(); + + return TRUE; +} + +//virtual +void LLPanelInventoryListItem::setValue(const LLSD& value) +{ + if (!value.isMap()) return; + if (!value.has("selected")) return; + childSetVisible("selected_icon", value["selected"]); +} + +void LLPanelInventoryListItem::updateItem() +{ + if (mItemIcon.notNull()) + mIcon->setImage(mItemIcon); + + LLTextUtil::textboxSetHighlightedVal( + mTitle, + LLStyle::Params(), + mItemName, + mHighlightedText); +} + +void LLPanelInventoryListItem::onMouseEnter(S32 x, S32 y, MASK mask) +{ + childSetVisible("hovered_icon", true); + + LLPanel::onMouseEnter(x, y, mask); +} + +void LLPanelInventoryListItem::onMouseLeave(S32 x, S32 y, MASK mask) +{ + childSetVisible("hovered_icon", false); + + LLPanel::onMouseLeave(x, y, mask); +} + +LLPanelInventoryListItem::LLPanelInventoryListItem(const LLViewerInventoryItem* item) +: LLPanel() + ,mIcon(NULL) + ,mTitle(NULL) +{ + mItemName = item->getName(); + mItemIcon = get_item_icon(item->getType(), item->getInventoryType(), item->getFlags(), FALSE); + + LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory_item.xml"); +} + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// + +LLInventoryItemsList::Params::Params() +{} + +LLInventoryItemsList::LLInventoryItemsList(const LLInventoryItemsList::Params& p) +: LLFlatListView(p) +, mNeedsRefresh(false) +{ + // TODO: mCommitOnSelectionChange is set to "false" in LLFlatListView + // but reset to true in all derived classes. This settings might need to + // be added to LLFlatListView::Params() and/or set to "true" by default. + setCommitOnSelectionChange(true); +} + +// virtual +LLInventoryItemsList::~LLInventoryItemsList() +{} + +void LLInventoryItemsList::refreshList(const LLInventoryModel::item_array_t item_array) +{ + getIDs().clear(); + LLInventoryModel::item_array_t::const_iterator it = item_array.begin(); + for( ; item_array.end() != it; ++it) + { + getIDs().push_back((*it)->getUUID()); + } + mNeedsRefresh = true; +} + +void LLInventoryItemsList::draw() +{ + LLFlatListView::draw(); + if(mNeedsRefresh) + { + refresh(); + } +} + +void LLInventoryItemsList::refresh() +{ + static const unsigned ADD_LIMIT = 50; + + uuid_vec_t added_items; + uuid_vec_t removed_items; + + computeDifference(getIDs(), added_items, removed_items); + + bool add_limit_exceeded = false; + unsigned nadded = 0; + + uuid_vec_t::const_iterator it = added_items.begin(); + for( ; added_items.end() != it; ++it) + { + if(nadded >= ADD_LIMIT) + { + add_limit_exceeded = true; + break; + } + LLViewerInventoryItem* item = gInventory.getItem(*it); + addNewItem(item); + ++nadded; + } + + it = removed_items.begin(); + for( ; removed_items.end() != it; ++it) + { + removeItemByUUID(*it); + } + + bool needs_refresh = add_limit_exceeded; + setNeedsRefresh(needs_refresh); +} + +void LLInventoryItemsList::computeDifference( + const uuid_vec_t& vnew, + uuid_vec_t& vadded, + uuid_vec_t& vremoved) +{ + uuid_vec_t vcur; + { + std::vector<LLSD> vcur_values; + getValues(vcur_values); + + for (size_t i=0; i<vcur_values.size(); i++) + vcur.push_back(vcur_values[i].asUUID()); + } + + LLCommonUtils::computeDifference(vnew, vcur, vadded, vremoved); +} + +void LLInventoryItemsList::addNewItem(LLViewerInventoryItem* item) +{ + if (!item) + { + llwarns << "No inventory item. Couldn't create flat list item." << llendl; + llassert(!"No inventory item. Couldn't create flat list item."); + } + + LLPanelInventoryListItem *list_item = LLPanelInventoryListItem::createItemPanel(item); + if (!list_item) + return; + + if (!addItem(list_item, item->getUUID())) + { + llwarns << "Couldn't add flat list item." << llendl; + llassert(!"Couldn't add flat list item."); + } +} + +// EOF diff --git a/indra/newview/llinventoryitemslist.h b/indra/newview/llinventoryitemslist.h new file mode 100644 index 0000000000..b496f4b9e9 --- /dev/null +++ b/indra/newview/llinventoryitemslist.h @@ -0,0 +1,128 @@ +/** + * @file llinventoryitemslist.h + * @brief A list of inventory items represented by LLFlatListView. + * + * Class LLInventoryItemsList implements a flat list of inventory items. + * Class LLPanelInventoryListItem displays inventory item as an element + * of LLInventoryItemsList. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, 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_LLINVENTORYITEMSLIST_H +#define LL_LLINVENTORYITEMSLIST_H + +#include "lldarray.h" + +#include "llpanel.h" + +// newview +#include "llflatlistview.h" + +class LLIconCtrl; +class LLTextBox; +class LLViewerInventoryItem; + +class LLPanelInventoryListItem : public LLPanel +{ +public: + static LLPanelInventoryListItem* createItemPanel(const LLViewerInventoryItem* item); + + virtual ~LLPanelInventoryListItem(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void setValue(const LLSD& value); + + void updateItem(); + + void onMouseEnter(S32 x, S32 y, MASK mask); + void onMouseLeave(S32 x, S32 y, MASK mask); + +protected: + LLPanelInventoryListItem(const LLViewerInventoryItem* item); + +private: + LLIconCtrl* mIcon; + LLTextBox* mTitle; + + LLUIImagePtr mItemIcon; + std::string mItemName; + std::string mHighlightedText; +}; + +class LLInventoryItemsList : public LLFlatListView +{ +public: + struct Params : public LLInitParam::Block<Params, LLFlatListView::Params> + { + Params(); + }; + + virtual ~LLInventoryItemsList(); + + void refreshList(const LLDynamicArray<LLPointer<LLViewerInventoryItem> > item_array); + + /** + * Let list know items need to be refreshed in next draw() + */ + void setNeedsRefresh(bool needs_refresh){ mNeedsRefresh = needs_refresh; } + + bool getNeedsRefresh(){ return mNeedsRefresh; } + + /*virtual*/ void draw(); + +protected: + friend class LLUICtrlFactory; + LLInventoryItemsList(const LLInventoryItemsList::Params& p); + + uuid_vec_t& getIDs() { return mIDs; } + + /** + * Refreshes list items, adds new items and removes deleted items. + * Called from draw() until all new items are added, , + * maximum 50 items can be added during single call. + */ + void refresh(); + + /** + * Compute difference between new items and current items, fills 'vadded' with added items, + * 'vremoved' with removed items. See LLCommonUtils::computeDifference + */ + void computeDifference(const uuid_vec_t& vnew, uuid_vec_t& vadded, uuid_vec_t& vremoved); + + /** + * Add an item to the list + */ + void addNewItem(LLViewerInventoryItem* item); + +private: + uuid_vec_t mIDs; // IDs of items that were added in refreshList(). + // Will be used in refresh() to determine added and removed ids + bool mNeedsRefresh; +}; + +#endif //LL_LLINVENTORYITEMSLIST_H diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp index 544a815896..214b5d317a 100644 --- a/indra/newview/llinventoryobserver.cpp +++ b/indra/newview/llinventoryobserver.cpp @@ -148,6 +148,7 @@ void LLInventoryCompletionObserver::watchItem(const LLUUID& id) LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const LLUUID& item_id) : LLInventoryFetchObserver(item_id), + mNumTries(MAX_NUM_NOTIFICATIONS_TO_PROCESS) { mIDs.clear(); @@ -155,7 +156,9 @@ LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const LLUUID& item_ } LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const uuid_vec_t& item_ids) : - LLInventoryFetchObserver(item_ids) + LLInventoryFetchObserver(item_ids), + + mNumTries(MAX_NUM_NOTIFICATIONS_TO_PROCESS) { } @@ -647,3 +650,53 @@ void LLInventoryTransactionObserver::changed(U32 mask) } } } + +void LLInventoryCategoriesObserver::changed(U32 mask) +{ + if (!mCategoryMap.size()) + return; + + for (category_map_t::iterator iter = mCategoryMap.begin(); + iter != mCategoryMap.end(); + ++iter) + { + LLViewerInventoryCategory* category = gInventory.getCategory((*iter).first); + if (!category) + continue; + + S32 version = category->getVersion(); + if (version != (*iter).second.mVersion) + { + // Update category version in map. + (*iter).second.mVersion = version; + (*iter).second.mCallback(); + } + } +} + +void LLInventoryCategoriesObserver::addCategory(const LLUUID& cat_id, callback_t cb) +{ + S32 version; + LLViewerInventoryCategory* category = gInventory.getCategory(cat_id); + if (category) + { + // Inventory category version is used to find out if some changes + // to a category have been made. + version = category->getVersion(); + } + else + { + // If category could not be retrieved it might mean that + // inventory is unusable at the moment so the category is + // stored with VERSION_UNKNOWN and it may be updated later. + version = LLViewerInventoryCategory::VERSION_UNKNOWN; + } + + version = category->getVersion(); + mCategoryMap.insert(category_map_value_t(cat_id, LLCategoryData(cb, version))); +} + +void LLInventoryCategoriesObserver::removeCategory(const LLUUID& cat_id) +{ + mCategoryMap.erase(cat_id); +} diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h index c48ffaa55d..e63b67d2ad 100644 --- a/indra/newview/llinventoryobserver.h +++ b/indra/newview/llinventoryobserver.h @@ -148,7 +148,6 @@ public: virtual void done() = 0; protected: - BOOL mDone; LLInventoryFetchItemsObserver *mFetchItems; LLInventoryFetchDescendentsObserver *mFetchDescendents; }; @@ -262,5 +261,40 @@ protected: uuid_vec_t mIncomplete; }; -#endif // LL_LLINVENTORYOBSERVERS_H +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryCategoriesObserver +// +// This class is used for monitoring a list of inventory categories +// and firing a callback when there are changes in any of them. +// Categories are identified by their UUIDs. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLInventoryCategoriesObserver : public LLInventoryObserver +{ +public: + typedef boost::function<void()> callback_t; + + LLInventoryCategoriesObserver() {}; + virtual void changed(U32 mask); + + void addCategory(const LLUUID& cat_id, callback_t cb); + void removeCategory(const LLUUID& cat_id); +protected: + struct LLCategoryData + { + LLCategoryData(callback_t cb, S32 version) + : mCallback(cb) + , mVersion(version) + {} + + callback_t mCallback; + S32 mVersion; + }; + + typedef std::map<LLUUID, LLCategoryData> category_map_t; + typedef category_map_t::value_type category_map_value_t; + + category_map_t mCategoryMap; +}; + +#endif // LL_LLINVENTORYOBSERVERS_H diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 4e0be81f62..7abb4f4f16 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -38,6 +38,7 @@ // common includes #include "llbutton.h" #include "llfocusmgr.h" +#include "llhelp.h" #include "llmenugl.h" #include "llparcel.h" #include "llstring.h" @@ -177,6 +178,7 @@ static LLDefaultChildRegistry::Register<LLLocationInputCtrl> r("location_input") LLLocationInputCtrl::Params::Params() : icon_maturity_general("icon_maturity_general"), icon_maturity_adult("icon_maturity_adult"), + icon_maturity_moderate("icon_maturity_moderate"), add_landmark_image_enabled("add_landmark_image_enabled"), add_landmark_image_disabled("add_landmark_image_disabled"), add_landmark_image_hover("add_landmark_image_hover"), @@ -186,14 +188,15 @@ LLLocationInputCtrl::Params::Params() add_landmark_button("add_landmark_button"), for_sale_button("for_sale_button"), info_button("info_button"), - maturity_icon("maturity_icon"), + maturity_button("maturity_button"), voice_icon("voice_icon"), fly_icon("fly_icon"), push_icon("push_icon"), build_icon("build_icon"), scripts_icon("scripts_icon"), damage_icon("damage_icon"), - damage_text("damage_text") + damage_text("damage_text"), + maturity_help_topic("maturity_help_topic") { } @@ -208,7 +211,9 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) mLandmarkImageOn(NULL), mLandmarkImageOff(NULL), mIconMaturityGeneral(NULL), - mIconMaturityAdult(NULL) + mIconMaturityAdult(NULL), + mIconMaturityModerate(NULL), + mMaturityHelpTopic(p.maturity_help_topic) { // Lets replace default LLLineEditor with LLLocationLineEditor // to make needed escaping while copying and cutting url @@ -276,10 +281,15 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) { mIconMaturityAdult = p.icon_maturity_adult; } + if(p.icon_maturity_moderate()) + { + mIconMaturityModerate = p.icon_maturity_moderate; + } - LLIconCtrl::Params maturity_icon = p.maturity_icon; - mMaturityIcon = LLUICtrlFactory::create<LLIconCtrl>(maturity_icon); - addChild(mMaturityIcon); + LLButton::Params maturity_button = p.maturity_button; + mMaturityButton = LLUICtrlFactory::create<LLButton>(maturity_button); + addChild(mMaturityButton); + mMaturityButton->setClickedCallback(boost::bind(&LLLocationInputCtrl::onMaturityButtonClicked, this)); LLButton::Params for_sale_button = p.for_sale_button; for_sale_button.tool_tip = LLTrans::getString("LocationCtrlForSaleTooltip"); @@ -576,7 +586,7 @@ void LLLocationInputCtrl::reshape(S32 width, S32 height, BOOL called_from_parent if (isHumanReadableLocationVisible) { - refreshMaturityIcon(); + refreshMaturityButton(); } } @@ -613,6 +623,11 @@ void LLLocationInputCtrl::onAgentParcelChange() refresh(); } +void LLLocationInputCtrl::onMaturityButtonClicked() +{ + LLUI::sHelpImpl->showTopic(mMaturityHelpTopic); +} + void LLLocationInputCtrl::onLandmarkLoaded(LLLandmark* lm) { (void) lm; @@ -736,7 +751,7 @@ void LLLocationInputCtrl::refreshLocation() setText(location_name); isHumanReadableLocationVisible = true; - refreshMaturityIcon(); + refreshMaturityButton(); } // returns new right edge @@ -852,37 +867,54 @@ void LLLocationInputCtrl::refreshHealth() } } -void LLLocationInputCtrl::refreshMaturityIcon() +void LLLocationInputCtrl::refreshMaturityButton() { // Updating maturity rating icon. LLViewerRegion* region = gAgent.getRegion(); if (!region) return; + bool button_visible = true; + LLPointer<LLUIImage> rating_image = NULL; + std::string rating_tooltip; + U8 sim_access = region->getSimAccess(); switch(sim_access) { case SIM_ACCESS_PG: - mMaturityIcon->setValue(mIconMaturityGeneral->getName()); - mMaturityIcon->setVisible(TRUE); + rating_image = mIconMaturityGeneral; + rating_tooltip = LLTrans::getString("LocationCtrlGeneralIconTooltip"); break; case SIM_ACCESS_ADULT: - mMaturityIcon->setValue(mIconMaturityAdult->getName()); - mMaturityIcon->setVisible(TRUE); + rating_image = mIconMaturityAdult; + rating_tooltip = LLTrans::getString("LocationCtrlAdultIconTooltip"); + break; + + case SIM_ACCESS_MATURE: + rating_image = mIconMaturityModerate; + rating_tooltip = LLTrans::getString("LocationCtrlModerateIconTooltip"); break; default: - mMaturityIcon->setVisible(FALSE); + button_visible = false; + break; } - if (mMaturityIcon->getVisible()) + mMaturityButton->setVisible(button_visible); + mMaturityButton->setToolTip(rating_tooltip); + if(rating_image) + { + mMaturityButton->setImageUnselected(rating_image); + mMaturityButton->setImagePressed(rating_image); + } + if (mMaturityButton->getVisible()) { - positionMaturityIcon(); + positionMaturityButton(); } } -void LLLocationInputCtrl::positionMaturityIcon() +void LLLocationInputCtrl::positionMaturityButton() { const LLFontGL* font = mTextEntry->getFont(); if (!font) @@ -894,11 +926,11 @@ void LLLocationInputCtrl::positionMaturityIcon() // Calculate the right edge of rendered text + a whitespace. left_pad = left_pad + font->getWidth(mTextEntry->getText()) + font->getWidth(" "); - LLRect rect = mMaturityIcon->getRect(); - mMaturityIcon->setRect(rect.setOriginAndSize(left_pad, rect.mBottom, rect.getWidth(), rect.getHeight())); + LLRect rect = mMaturityButton->getRect(); + mMaturityButton->setRect(rect.setOriginAndSize(left_pad, rect.mBottom, rect.getWidth(), rect.getHeight())); // Hide icon if it text area is not width enough to display it, show otherwise. - mMaturityIcon->setVisible(rect.mRight < mTextEntry->getRect().getWidth() - right_pad); + mMaturityButton->setVisible(rect.mRight < mTextEntry->getRect().getWidth() - right_pad); } void LLLocationInputCtrl::rebuildLocationHistory(const std::string& filter) @@ -1014,7 +1046,7 @@ void LLLocationInputCtrl::changeLocationPresentation() mTextEntry->setText(LLAgentUI::buildSLURL(false)); mTextEntry->selectAll(); - mMaturityIcon->setVisible(FALSE); + mMaturityButton->setVisible(FALSE); isHumanReadableLocationVisible = false; } diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h index f790140f07..fc7adf60b0 100644 --- a/indra/newview/lllocationinputctrl.h +++ b/indra/newview/lllocationinputctrl.h @@ -66,17 +66,19 @@ public: { Optional<LLUIImage*> icon_maturity_general, icon_maturity_adult, + icon_maturity_moderate, add_landmark_image_enabled, add_landmark_image_disabled, add_landmark_image_hover, add_landmark_image_selected; + Optional<std::string> maturity_help_topic; Optional<S32> icon_hpad, add_landmark_hpad; - Optional<LLButton::Params> add_landmark_button, + Optional<LLButton::Params> maturity_button, + add_landmark_button, for_sale_button, info_button; - Optional<LLIconCtrl::Params> maturity_icon, - voice_icon, + Optional<LLIconCtrl::Params> voice_icon, fly_icon, push_icon, build_icon, @@ -136,8 +138,8 @@ private: void refreshParcelIcons(); // Refresh the value in the health percentage text field void refreshHealth(); - void refreshMaturityIcon(); - void positionMaturityIcon(); + void refreshMaturityButton(); + void positionMaturityButton(); void rebuildLocationHistory(const std::string& filter = LLStringUtil::null); bool findTeleportItemsByTitle(const LLTeleportHistoryItem& item, const std::string& filter); @@ -156,6 +158,7 @@ private: void onForSaleButtonClicked(); void onAddLandmarkButtonClicked(); void onAgentParcelChange(); + void onMaturityButtonClicked(); // callbacks bool onLocationContextMenuItemEnabled(const LLSD& userdata); void onLocationContextMenuItemClicked(const LLSD& userdata); @@ -168,7 +171,7 @@ private: S32 mIconHPad; // pad between all icons S32 mAddLandmarkHPad; // pad to left of landmark star - LLIconCtrl* mMaturityIcon; + LLButton* mMaturityButton; LLIconCtrl* mParcelIcon[ICON_COUNT]; LLTextBox* mDamageText; @@ -182,14 +185,16 @@ private: boost::signals2::connection mLocationHistoryConnection; LLUIImage* mLandmarkImageOn; LLUIImage* mLandmarkImageOff; - LLUIImage* mIconMaturityGeneral; - LLUIImage* mIconMaturityAdult; + LLPointer<LLUIImage> mIconMaturityGeneral; + LLPointer<LLUIImage> mIconMaturityAdult; + LLPointer<LLUIImage> mIconMaturityModerate; std::string mAddLandmarkTooltip; std::string mEditLandmarkTooltip; // this field holds a human-readable form of the location string, it is needed to be able to compare copy-pated value and real location std::string mHumanReadableLocation; bool isHumanReadableLocationVisible; + std::string mMaturityHelpTopic; }; #endif diff --git a/indra/newview/llmimetypes.cpp b/indra/newview/llmimetypes.cpp index 235487cf46..7bddc0d84c 100644 --- a/indra/newview/llmimetypes.cpp +++ b/indra/newview/llmimetypes.cpp @@ -34,6 +34,7 @@ #include "llviewerprecompiledheaders.h" #include "llmimetypes.h" +#include "lltrans.h" #include "llxmlnode.h" #include "lluictrlfactory.h" @@ -49,6 +50,7 @@ std::string sDefaultImpl; // Returned when we don't know what impl to use std::string sXMLFilename; // Squirrel away XML filename so we know how to reset +std::string DEFAULT_MIME_TYPE = "none/none"; ///////////////////////////////////////////////////////////////////////////// @@ -212,7 +214,7 @@ std::string LLMIMETypes::findIcon(const std::string& mime_type) // static std::string LLMIMETypes::findDefaultMimeType(const std::string& widget_type) { - std::string mime_type = "none/none"; + std::string mime_type = getDefaultMimeType(); mime_widget_set_map_t::iterator it = sWidgetMap.find(widget_type); if(it != sWidgetMap.end()) { @@ -222,6 +224,18 @@ std::string LLMIMETypes::findDefaultMimeType(const std::string& widget_type) } // static +const std::string& LLMIMETypes::getDefaultMimeType() +{ + return DEFAULT_MIME_TYPE; +} + +const std::string& LLMIMETypes::getDefaultMimeTypeTranslation() +{ + static std::string mime_type = LLTrans::getString("DefaultMimeType"); + return mime_type; +} + +// static std::string LLMIMETypes::findToolTip(const std::string& mime_type) { std::string tool_tip = ""; diff --git a/indra/newview/llmimetypes.h b/indra/newview/llmimetypes.h index b217ce7a81..3461769ff3 100644 --- a/indra/newview/llmimetypes.h +++ b/indra/newview/llmimetypes.h @@ -66,6 +66,10 @@ public: static std::string findDefaultMimeType(const std::string& widget_type); // Canonical mime type associated with this widget set + static const std::string& getDefaultMimeType(); + + static const std::string& getDefaultMimeTypeTranslation(); + static bool findAllowResize(const std::string& mime_type); // accessor for flag to enable/disable media size edit fields diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index 9611c286eb..d605d4430e 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -81,7 +81,7 @@ void LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos, item.enabled = enabled; item.target = INDIVIDUAL; - addNameItemRow(item, pos); + addNameItemRow(item, pos, suffix); } // virtual, public diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index e11df06d86..0341f2c693 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -375,7 +375,6 @@ void LLNavigationBar::draw() if(mPurgeTPHistoryItems) { LLTeleportHistory::getInstance()->purgeItems(); - onTeleportHistoryChanged(); mPurgeTPHistoryItems = false; } diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 5d72827a7a..f1c13de8bb 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -107,7 +107,9 @@ BOOL LLNearbyChat::postBuild() getDockTongue(), LLDockControl::TOP, boost::bind(&LLNearbyChat::getAllowedRect, this, _1))); } - setIsChrome(true); + //fix for EXT-4621 + //chrome="true" prevents floater from stilling capture + setIsChrome(true); //chrome="true" hides floater caption if (mDragHandle) mDragHandle->setTitleVisible(TRUE); @@ -351,3 +353,14 @@ void LLNearbyChat::onFocusLost() LLPanel::onFocusLost(); } +BOOL LLNearbyChat::handleMouseDown(S32 x, S32 y, MASK mask) +{ + //fix for EXT-6625 + //highlight NearbyChat history whenever mouseclick happen in NearbyChat + //setting focus to eidtor will force onFocusLost() call that in its turn will change + //background opaque. This all happenn since NearByChat is "chrome" and didn't process focus change. + + if(mChatHistory) + mChatHistory->setFocus(TRUE); + return LLDockableFloater::handleMouseDown(x, y, mask); +} diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h index 6ef2a1fee3..3c116dbe83 100644 --- a/indra/newview/llnearbychat.h +++ b/indra/newview/llnearbychat.h @@ -53,6 +53,8 @@ public: void onNearbyChatContextMenuItemClicked(const LLSD& userdata); bool onNearbyChatCheckContextMenuItem(const LLSD& userdata); + virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); + // focus overrides /*virtual*/ void onFocusLost(); /*virtual*/ void onFocusReceived(); diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h index 3d7f3233ac..eb53d295b2 100644 --- a/indra/newview/llnetmap.h +++ b/indra/newview/llnetmap.h @@ -46,10 +46,6 @@ class LLImageRaw; class LLTextBox; class LLViewerTexture; -const F32 MAP_SCALE_MIN = 64.f; -const F32 MAP_SCALE_MID = 172.f; -const F32 MAP_SCALE_MAX = 512.f; - class LLNetMap : public LLUICtrl { public: diff --git a/indra/newview/llnotificationstorage.cpp b/indra/newview/llnotificationstorage.cpp new file mode 100644 index 0000000000..316ff4324c --- /dev/null +++ b/indra/newview/llnotificationstorage.cpp @@ -0,0 +1,228 @@ +/** +* @file llnotificationstorage.cpp +* @brief LLPersistentNotificationStorage class implementation +* +* $LicenseInfo:firstyear=2010&license=viewergpl$ +* +* Copyright (c) 2010, 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" // must be first include +#include "llnotificationstorage.h" + +#include "llxmlnode.h" // for linux compilers + +#include "llchannelmanager.h" +#include "llscreenchannel.h" +#include "llscriptfloater.h" +#include "llsdserialize.h" +#include "llviewermessage.h" + +////////////////////////////////////////////////////////////////////////// + +class LLResponderRegistry +{ +public: + + static void registerResponders(); + + static LLNotificationResponderInterface* createResponder(const std::string& notification_name, const LLSD& params); + +private: + + template<typename RESPONDER_TYPE> + static LLNotificationResponderInterface* create(const LLSD& params) + { + RESPONDER_TYPE* responder = new RESPONDER_TYPE(); + responder->fromLLSD(params); + return responder; + } + + typedef boost::function<LLNotificationResponderInterface* (const LLSD& params)> responder_constructor_t; + + static void add(const std::string& notification_name, const responder_constructor_t& ctr); + +private: + + typedef std::map<std::string, responder_constructor_t> build_map_t; + + static build_map_t sBuildMap; +}; + +////////////////////////////////////////////////////////////////////////// + +LLPersistentNotificationStorage::LLPersistentNotificationStorage() +{ + mFileName = gDirUtilp->getExpandedFilename ( LL_PATH_PER_SL_ACCOUNT, "open_notifications.xml" ); +} + +bool LLPersistentNotificationStorage::onPersistentChannelChanged(const LLSD& payload) +{ + // we ignore "load" messages, but rewrite the persistence file on any other + const std::string sigtype = payload["sigtype"].asString(); + if ("load" != sigtype) + { + saveNotifications(); + } + return false; +} + +void LLPersistentNotificationStorage::saveNotifications() +{ + // TODO - think about save optimization. + + llofstream notify_file(mFileName.c_str()); + if (!notify_file.is_open()) + { + llwarns << "Failed to open " << mFileName << llendl; + return; + } + + LLSD output; + LLSD& data = output["data"]; + + LLNotificationChannelPtr history_channel = LLNotifications::instance().getChannel("Persistent"); + LLNotificationSet::iterator it = history_channel->begin(); + + for ( ; history_channel->end() != it; ++it) + { + LLNotificationPtr notification = *it; + + // After a notification was placed in Persist channel, it can become + // responded, expired - in this case we are should not save it + if(notification->isRespondedTo() + || notification->isExpired()) + { + continue; + } + + data.append(notification->asLLSD()); + } + + LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter(); + formatter->format(output, notify_file, LLSDFormatter::OPTIONS_PRETTY); +} + +void LLPersistentNotificationStorage::loadNotifications() +{ + LLResponderRegistry::registerResponders(); + + LLNotifications::instance().getChannel("Persistent")-> + connectChanged(boost::bind(&LLPersistentNotificationStorage::onPersistentChannelChanged, this, _1)); + + llifstream notify_file(mFileName.c_str()); + if (!notify_file.is_open()) + { + llwarns << "Failed to open " << mFileName << llendl; + return; + } + + LLSD input; + LLPointer<LLSDParser> parser = new LLSDXMLParser(); + if (parser->parse(notify_file, input, LLSDSerialize::SIZE_UNLIMITED) < 0) + { + llwarns << "Failed to parse open notifications" << llendl; + return; + } + + if (input.isUndefined()) + { + return; + } + + LLSD& data = input["data"]; + if (data.isUndefined()) + { + return; + } + + using namespace LLNotificationsUI; + LLScreenChannel* notification_channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()-> + findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID")))); + + LLNotifications& instance = LLNotifications::instance(); + + for (LLSD::array_const_iterator notification_it = data.beginArray(); + notification_it != data.endArray(); + ++notification_it) + { + LLSD notification_params = *notification_it; + LLNotificationPtr notification(new LLNotification(notification_params)); + + LLNotificationResponderPtr responder(LLResponderRegistry:: + createResponder(notification_params["name"], notification_params["responder"])); + notification->setResponseFunctor(responder); + + instance.add(notification); + + // hide script floaters so they don't confuse the user and don't overlap startup toast + LLScriptFloaterManager::getInstance()->setFloaterVisible(notification->getID(), false); + + if(notification_channel) + { + // hide saved toasts so they don't confuse the user + notification_channel->hideToast(notification->getID()); + } + } +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +LLResponderRegistry::build_map_t LLResponderRegistry::sBuildMap; + +void LLResponderRegistry::registerResponders() +{ + sBuildMap.clear(); + + add("ObjectGiveItem", &create<LLOfferInfo>); + add("UserGiveItem", &create<LLOfferInfo>); +} + +LLNotificationResponderInterface* LLResponderRegistry::createResponder(const std::string& notification_name, const LLSD& params) +{ + build_map_t::const_iterator it = sBuildMap.find(notification_name); + if(sBuildMap.end() == it) + { + llwarns << "Responder for notification \'" << notification_name << "\' is not registered" << llendl; + return NULL; + } + responder_constructor_t ctr = it->second; + return ctr(params); +} + +void LLResponderRegistry::add(const std::string& notification_name, const responder_constructor_t& ctr) +{ + if(sBuildMap.find(notification_name) != sBuildMap.end()) + { + llwarns << "Responder is already registered : " << notification_name << llendl; + llassert(!"Responder already registered"); + } + sBuildMap[notification_name] = ctr; +} + +// EOF diff --git a/indra/newview/llnotificationstorage.h b/indra/newview/llnotificationstorage.h new file mode 100644 index 0000000000..5050781a85 --- /dev/null +++ b/indra/newview/llnotificationstorage.h @@ -0,0 +1,65 @@ +/** +* @file llnotificationstorage.h +* @brief LLNotificationStorage class declaration +* +* $LicenseInfo:firstyear=2010&license=viewergpl$ +* +* Copyright (c) 2010, 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_NOTIFICATIONSTORAGE_H +#define LL_NOTIFICATIONSTORAGE_H + +#include "llnotifications.h" + +// Class that saves not responded(unread) notifications. +// Unread notifications are saved in open_notifications.xml in SL account folder +// +// Notifications that should be saved(if unread) are marked with persist="true" in notifications.xml +// Notifications using functor responders are saved automatically (see llviewermessage.cpp +// lure_callback_reg for example). +// Notifications using object responders(LLOfferInfo) need additional tuning. Responder object should +// be a) serializable(implement LLNotificationResponderInterface), +// b) registered with LLResponderRegistry (found in llnotificationstorage.cpp). +class LLPersistentNotificationStorage : public LLSingleton<LLPersistentNotificationStorage> +{ + LOG_CLASS(LLPersistentNotificationStorage); +public: + + LLPersistentNotificationStorage(); + + void saveNotifications(); + + void loadNotifications(); + +private: + + bool onPersistentChannelChanged(const LLSD& payload); + + std::string mFileName; +}; + +#endif // LL_NOTIFICATIONSTORAGE_H diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp index 407de79c89..df6f04b6ea 100644 --- a/indra/newview/llnotificationtiphandler.cpp +++ b/indra/newview/llnotificationtiphandler.cpp @@ -41,41 +41,10 @@ #include "llviewercontrol.h" #include "llviewerwindow.h" #include "llnotificationmanager.h" +#include "llpaneltiptoast.h" using namespace LLNotificationsUI; -class LLOnlineStatusToast : public LLToastPanel -{ -public: - - struct Params - { - LLNotificationPtr notification; - LLUUID avatar_id; - std::string message; - - Params() {} - }; - - LLOnlineStatusToast(Params& p) : LLToastPanel(p.notification) - { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_online_status_toast.xml"); - - childSetValue("avatar_icon", p.avatar_id); - childSetValue("message", p.message); - - if (p.notification->getPayload().has("respond_on_mousedown") - && p.notification->getPayload()["respond_on_mousedown"] ) - { - setMouseDownCallback(boost::bind(&LLNotification::respond, p.notification, - p.notification->getResponseTemplate())); - } - - // set line max count to 3 in case of a very long name - snapToMessageHeight(getChild<LLTextBox>("message"), 3); - } -}; - //-------------------------------------------------------------------------- LLTipHandler::LLTipHandler(e_notification_type type, const LLSD& id) { @@ -156,28 +125,7 @@ bool LLTipHandler::processNotification(const LLSD& notify) return true; } - LLToastPanel* notify_box = NULL; - // TODO: this should be implemented in LLToastPanel::buidPanelFromNotification - if("FriendOffline" == notification->getName() || "FriendOnline" == notification->getName()) - { - LLOnlineStatusToast::Params p; - p.notification = notification; - p.message = notification->getMessage(); - p.avatar_id = notification->getPayload()["FROM_ID"]; - notify_box = new LLOnlineStatusToast(p); - } - else - { - notify_box = LLToastPanel::buidPanelFromNotification(notification); - } - - // TODO: this if statement should be removed after modification of - // LLToastPanel::buidPanelFromNotification() to allow create generic tip panel - // for all tip notifications except FriendOnline and FriendOffline - if (notify_box == NULL) - { - notify_box = new LLToastNotifyPanel(notification); - } + LLToastPanel* notify_box = LLToastPanel::buidPanelFromNotification(notification); LLToast::Params p; p.notif_id = notification->getID(); diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp new file mode 100644 index 0000000000..1215272685 --- /dev/null +++ b/indra/newview/lloutfitslist.cpp @@ -0,0 +1,286 @@ +/** + * @file lloutfitslist.cpp + * @brief List of agent's outfits for My Appearance side panel. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, 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 "lloutfitslist.h" + +// llcommon +#include "llcommonutils.h" + +// llcommon +#include "llcommonutils.h" + +#include "llaccordionctrl.h" +#include "llaccordionctrltab.h" +#include "llinventoryfunctions.h" +#include "llinventorymodel.h" +#include "llwearableitemslist.h" + +static LLRegisterPanelClassWrapper<LLOutfitsList> t_outfits_list("outfits_list"); + +LLOutfitsList::LLOutfitsList() + : LLPanel() + , mAccordion(NULL) + , mListCommands(NULL) +{ + mCategoriesObserver = new LLInventoryCategoriesObserver(); + gInventory.addObserver(mCategoriesObserver); + + gInventory.addObserver(this); +} + +LLOutfitsList::~LLOutfitsList() +{ + if (gInventory.containsObserver(mCategoriesObserver)) + { + gInventory.removeObserver(mCategoriesObserver); + delete mCategoriesObserver; + } + + if (gInventory.containsObserver(this)) + { + gInventory.removeObserver(this); + } +} + +BOOL LLOutfitsList::postBuild() +{ + mAccordion = getChild<LLAccordionCtrl>("outfits_accordion"); + + return TRUE; +} + +//virtual +void LLOutfitsList::changed(U32 mask) +{ + if (!gInventory.isInventoryUsable()) + return; + + const LLUUID outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + LLViewerInventoryCategory* category = gInventory.getCategory(outfits); + if (!category) + return; + + // Start observing changes in "My Outfits" category. + mCategoriesObserver->addCategory(outfits, + boost::bind(&LLOutfitsList::refreshList, this, outfits)); + + // Fetch "My Outfits" contents and refresh the list to display + // initially fetched items. If not all items are fetched now + // the observer will refresh the list as soon as the new items + // arrive. + category->fetch(); + refreshList(outfits); + + // This observer is used to start the initial outfits fetch + // when inventory becomes usable. It is no longer needed because + // "My Outfits" category is now observed by + // LLInventoryCategoriesObserver. + gInventory.removeObserver(this); +} + +void LLOutfitsList::refreshList(const LLUUID& category_id) +{ + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + + // Collect all sub-categories of a given category. + LLIsType is_category(LLAssetType::AT_CATEGORY); + gInventory.collectDescendentsIf( + category_id, + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH, + is_category); + + uuid_vec_t vadded; + uuid_vec_t vremoved; + + // Create added and removed items vectors. + computeDifference(cat_array, vadded, vremoved); + + // Handle added tabs. + for (uuid_vec_t::const_iterator iter = vadded.begin(); + iter != vadded.end(); + ++iter) + { + const LLUUID cat_id = (*iter); + LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id); + if (!cat) + continue; + + std::string name = cat->getName(); + + static LLXMLNodePtr accordionXmlNode = getAccordionTabXMLNode(); + + accordionXmlNode->setAttributeString("name", name); + accordionXmlNode->setAttributeString("title", name); + LLAccordionCtrlTab* tab = LLUICtrlFactory::defaultBuilder<LLAccordionCtrlTab>(accordionXmlNode, NULL, NULL); + + // *TODO: LLUICtrlFactory::defaultBuilder does not use "display_children" from xml. Should be investigated. + tab->setDisplayChildren(false); + mAccordion->addCollapsibleCtrl(tab); + + // Map the new tab with outfit category UUID. + mOutfitsMap.insert(LLOutfitsList::outfits_map_value_t(cat_id, tab)); + + // Start observing the new outfit category. + LLWearableItemsList* list = tab->getChild<LLWearableItemsList>("wearable_items_list"); + mCategoriesObserver->addCategory(cat_id, boost::bind(&LLWearableItemsList::updateList, list, cat_id)); + + // Setting drop down callback to monitor currently selected outfit. + tab->setDropDownStateChangedCallback(boost::bind(&LLOutfitsList::onTabExpandedCollapsed, this, list)); + + // Fetch the new outfit contents. + cat->fetch(); + + // Refresh the list of outfit items after fetch(). + // Further list updates will be triggered by the category observer. + list->updateList(cat_id); + } + + // Handle removed tabs. + for (uuid_vec_t::const_iterator iter=vremoved.begin(); iter != vremoved.end(); iter++) + { + outfits_map_t::iterator outfits_iter = mOutfitsMap.find((*iter)); + if (outfits_iter != mOutfitsMap.end()) + { + // An outfit is removed from the list. Do the following: + // 1. Remove outfit accordion tab from accordion. + mAccordion->removeCollapsibleCtrl(outfits_iter->second); + + // 2. Remove outfit category from observer to stop monitoring its changes. + mCategoriesObserver->removeCategory(outfits_iter->first); + + // 3. Remove category UUID to accordion tab mapping. + mOutfitsMap.erase(outfits_iter); + } + } + + // Get changed items from inventory model and update outfit tabs + // which might have been renamed. + const LLInventoryModel::changed_items_t& changed_items = gInventory.getChangedIDs(); + for (LLInventoryModel::changed_items_t::const_iterator items_iter = changed_items.begin(); + items_iter != changed_items.end(); + ++items_iter) + { + updateOutfitTab(*items_iter); + } + + mAccordion->arrange(); +} + +void LLOutfitsList::updateOutfitTab(const LLUUID& category_id) +{ + outfits_map_t::iterator outfits_iter = mOutfitsMap.find(category_id); + if (outfits_iter != mOutfitsMap.end()) + { + LLViewerInventoryCategory *cat = gInventory.getCategory(category_id); + if (!cat) + return; + + std::string name = cat->getName(); + + // Update tab name with the new category name. + LLAccordionCtrlTab* tab = outfits_iter->second; + if (tab) + { + tab->setName(name); + } + + // Update tab title with the new category name using textbox + // in accordion tab header. + LLTextBox* tab_title = tab->findChild<LLTextBox>("dd_textbox"); + if (tab_title) + { + tab_title->setText(name); + } + } +} + +void LLOutfitsList::onTabExpandedCollapsed(LLWearableItemsList* list) +{ + if (!list) + return; + + // TODO: Add outfit selection handling. +} + +void LLOutfitsList::setFilterSubString(const std::string& string) +{ + mFilterSubString = string; +} + + +////////////////////////////////////////////////////////////////////////// +// Private methods +////////////////////////////////////////////////////////////////////////// +LLXMLNodePtr LLOutfitsList::getAccordionTabXMLNode() +{ + LLXMLNodePtr xmlNode = NULL; + bool success = LLUICtrlFactory::getLayeredXMLNode("outfit_accordion_tab.xml", xmlNode); + if (!success) + { + llwarns << "Failed to read xml of Outfit's Accordion Tab from outfit_accordion_tab.xml" << llendl; + return NULL; + } + + return xmlNode; +} + +void LLOutfitsList::computeDifference( + const LLInventoryModel::cat_array_t& vcats, + uuid_vec_t& vadded, + uuid_vec_t& vremoved) +{ + uuid_vec_t vnew; + // Creating a vector of newly collected sub-categories UUIDs. + for (LLInventoryModel::cat_array_t::const_iterator iter = vcats.begin(); + iter != vcats.end(); + iter++) + { + vnew.push_back((*iter)->getUUID()); + } + + uuid_vec_t vcur; + // Creating a vector of currently displayed sub-categories UUIDs. + for (outfits_map_t::const_iterator iter = mOutfitsMap.begin(); + iter != mOutfitsMap.end(); + iter++) + { + vcur.push_back((*iter).first); + } + + LLCommonUtils::computeDifference(vnew, vcur, vadded, vremoved); +} + +// EOF diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h new file mode 100644 index 0000000000..2d103ea356 --- /dev/null +++ b/indra/newview/lloutfitslist.h @@ -0,0 +1,101 @@ +/** + * @file lloutfitslist.h + * @brief List of agent's outfits for My Appearance side panel. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, 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_LLOUTFITSLIST_H +#define LL_LLOUTFITSLIST_H + +#include "llpanel.h" + +// newview +#include "llinventorymodel.h" +#include "llinventoryobserver.h" + +class LLAccordionCtrl; +class LLAccordionCtrlTab; +class LLWearableItemsList; + +/** + * @class LLOutfitsList + * + * A list of agents's outfits from "My Outfits" inventory category + * which displays each outfit in an accordion tab with a flat list + * of items inside it. + * Uses LLInventoryCategoriesObserver to monitor changes to "My Outfits" + * inventory category and refresh the outfits listed in it. + * This class is derived from LLInventoryObserver to know when inventory + * becomes usable and it is safe to request data from inventory model. + */ +class LLOutfitsList : public LLPanel, public LLInventoryObserver +{ +public: + LLOutfitsList(); + virtual ~LLOutfitsList(); + + /*virtual*/ BOOL postBuild(); + + /*virtual*/ void changed(U32 mask); + + void refreshList(const LLUUID& category_id); + + // Update tab displaying outfit identified by category_id. + void updateOutfitTab(const LLUUID& category_id); + + void onTabExpandedCollapsed(LLWearableItemsList* list); + + void setFilterSubString(const std::string& string); + +private: + /** + * Reads xml with accordion tab and Flat list from xml file. + * + * @return LLPointer to XMLNode with accordion tab and flat list. + */ + LLXMLNodePtr getAccordionTabXMLNode(); + + /** + * Wrapper for LLCommonUtils::computeDifference. @see LLCommonUtils::computeDifference + */ + void computeDifference(const LLInventoryModel::cat_array_t& vcats, uuid_vec_t& vadded, uuid_vec_t& vremoved); + + + LLInventoryCategoriesObserver* mCategoriesObserver; + + LLAccordionCtrl* mAccordion; + LLPanel* mListCommands; + + std::string mFilterSubString; + + typedef std::map<LLUUID, LLAccordionCtrlTab*> outfits_map_t; + typedef outfits_map_t::value_type outfits_map_value_t; + outfits_map_t mOutfitsMap; +}; + +#endif //LL_LLOUTFITSLIST_H diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index a0ba2f739b..dd632ccefe 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -51,6 +51,7 @@ #include "llnotificationsutil.h" #include "llvoiceclient.h" #include "llnamebox.h" +#include "lltrans.h" //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLDropTarget @@ -645,7 +646,11 @@ void LLPanelAvatarProfile::fillCommonData(const LLAvatarData* avatar_data) LLAvatarIconIDCache::getInstance()->remove(avatar_data->avatar_id); LLStringUtil::format_map_t args; - args["[REG_DATE]"] = avatar_data->born_on; + { + std::string birth_date = LLTrans::getString("AvatarBirthDateFormat"); + LLStringUtil::format(birth_date, LLSD().with("datetime", (S32) avatar_data->born_on.secondsSinceEpoch())); + args["[REG_DATE]"] = birth_date; + } args["[AGE]"] = LLDateUtil::ageFromDate( avatar_data->born_on, LLDate::now()); std::string register_date = getString("RegisterDateFormat", args); childSetValue("register_date", register_date ); diff --git a/indra/newview/llpanelgenerictip.cpp b/indra/newview/llpanelgenerictip.cpp index 2e977faf09..e0658554a4 100644 --- a/indra/newview/llpanelgenerictip.cpp +++ b/indra/newview/llpanelgenerictip.cpp @@ -36,15 +36,10 @@ #include "llpanelgenerictip.h" #include "llnotifications.h" -/** - * Generic toast tip panel. - * This is particular case of toast panel that decoupled from LLToastNotifyPanel. - * From now LLToastNotifyPanel is deprecated and will be removed after all panel - * types are represented in separate classes. - */ + LLPanelGenericTip::LLPanelGenericTip( const LLNotificationPtr& notification) : - LLToastPanel(notification) + LLPanelTipToast(notification) { LLUICtrlFactory::getInstance()->buildPanel(this, "panel_generic_tip.xml"); diff --git a/indra/newview/llpanelgenerictip.h b/indra/newview/llpanelgenerictip.h index 0eb502498a..defa069727 100644 --- a/indra/newview/llpanelgenerictip.h +++ b/indra/newview/llpanelgenerictip.h @@ -34,14 +34,24 @@ #ifndef LL_PANELGENERICTIP_H #define LL_PANELGENERICTIP_H -#include "lltoastpanel.h" +#include "llpaneltiptoast.h" -class LLPanelGenericTip: public LLToastPanel +/** + * Represents tip toast panel that contains only one child element - message text. + * This panel can be used for different cases of tip notifications. + */ +class LLPanelGenericTip: public LLPanelTipToast { // disallow instantiation of this class private: // grant privileges to instantiate this class to LLToastPanel friend class LLToastPanel; + /** + * Generic toast tip panel. + * This is particular case of toast panel that decoupled from LLToastNotifyPanel. + * From now LLToastNotifyPanel is deprecated and will be removed after all panel + * types are represented in separate classes. + */ LLPanelGenericTip(const LLNotificationPtr& notification); }; #endif /* LL_PANELGENERICTIP_H */ diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h index 136868a60d..359f252383 100644 --- a/indra/newview/llpanelgroup.h +++ b/indra/newview/llpanelgroup.h @@ -37,7 +37,7 @@ #include "lltimer.h" #include "llvoiceclient.h" -struct LLOfferInfo; +class LLOfferInfo; const S32 UPDATE_MEMBERS_PER_FRAME = 500; diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp index 9ac3a07041..65fe7165c2 100644 --- a/indra/newview/llpanelgrouplandmoney.cpp +++ b/indra/newview/llpanelgrouplandmoney.cpp @@ -236,6 +236,7 @@ public: std::string mCantViewParcelsText; std::string mCantViewAccountsText; + std::string mEmptyParcelsText; }; //******************************************* @@ -452,6 +453,7 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg) // This power was removed to make group roles simpler //if ( !gAgent.hasPowerInGroup(mGroupID, GP_LAND_VIEW_OWNED) ) return; if (!gAgent.isInGroup(mPanel.mGroupID)) return; + mGroupParcelsp->setCommentText(mEmptyParcelsText); std::string name; std::string desc; @@ -696,6 +698,7 @@ BOOL LLPanelGroupLandMoney::postBuild() mImplementationp->mCantViewParcelsText = getString("cant_view_group_land_text"); mImplementationp->mCantViewAccountsText = getString("cant_view_group_accounting_text"); + mImplementationp->mEmptyParcelsText = getString("epmty_view_group_land_text"); if ( mImplementationp->mMapButtonp ) { diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp index 8da19d1574..230e484fad 100644 --- a/indra/newview/llpanelgroupnotices.cpp +++ b/indra/newview/llpanelgroupnotices.cpp @@ -517,6 +517,11 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg) mNoticesList->setEnabled(TRUE); + //save sort state and set unsorted state to prevent unnecessary + //sorting while adding notices + bool save_sort = mNoticesList->isSorted(); + mNoticesList->setNeedsSort(false); + for (;i<count;++i) { msg->getUUID("Data","NoticeID",id,i); @@ -527,6 +532,13 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg) mNoticesList->setEnabled(FALSE); return; } + + //with some network delays we can receive notice list more then once... + //so add only unique notices + S32 pos = mNoticesList->getItemIndex(id); + + if(pos!=-1)//if items with this ID already in the list - skip it + continue; msg->getString("Data","Subject",subj,i); msg->getString("Data","FromName",name,i); @@ -562,6 +574,7 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg) mNoticesList->addElement(row, ADD_BOTTOM); } + mNoticesList->setNeedsSort(save_sort); mNoticesList->updateSort(); } @@ -656,6 +669,9 @@ void LLPanelGroupNotices::setGroupID(const LLUUID& id) if(mViewMessage) mViewMessage->clear(); + + if(mViewInventoryName) + mViewInventoryName->clear(); activate(); } diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 67d40a39b1..0a978d1b26 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -583,6 +583,7 @@ void LLLandmarksPanel::initLandmarksPanel(LLPlacesInventoryPanel* inventory_list if (!inventory_list->getFilter()) return; + inventory_list->getFilter()->setEmptyLookupMessage("PlacesNoMatchingItems"); inventory_list->setFilterTypes(0x1 << LLInventoryType::IT_LANDMARK); inventory_list->setSelectCallback(boost::bind(&LLLandmarksPanel::onSelectionChange, this, inventory_list, _1, _2)); diff --git a/indra/newview/llpanellandmedia.cpp b/indra/newview/llpanellandmedia.cpp index 42ad9820a8..e834e229cd 100644 --- a/indra/newview/llpanellandmedia.cpp +++ b/indra/newview/llpanellandmedia.cpp @@ -153,7 +153,7 @@ void LLPanelLandMedia::refresh() std::string mime_type = parcel->getMediaType(); if (mime_type.empty()) { - mime_type = "none/none"; + mime_type = LLMIMETypes::getDefaultMimeTypeTranslation(); } setMediaType(mime_type); mMediaTypeCombo->setEnabled( can_change_media ); @@ -218,7 +218,7 @@ void LLPanelLandMedia::refresh() void LLPanelLandMedia::populateMIMECombo() { - std::string default_mime_type = "none/none"; + std::string default_mime_type = LLMIMETypes::getDefaultMimeType(); std::string default_label; LLMIMETypes::mime_widget_set_map_t::const_iterator it; for (it = LLMIMETypes::sWidgetMap.begin(); it != LLMIMETypes::sWidgetMap.end(); ++it) @@ -235,8 +235,7 @@ void LLPanelLandMedia::populateMIMECombo() mMediaTypeCombo->add(info.mLabel, mime_type); } } - // *TODO: The sort order is based on std::map key, which is - // ASCII-sorted and is wrong in other languages. TRANSLATE + mMediaTypeCombo->add( default_label, default_mime_type, ADD_BOTTOM ); } @@ -248,7 +247,15 @@ void LLPanelLandMedia::setMediaType(const std::string& mime_type) std::string media_key = LLMIMETypes::widgetType(mime_type); mMediaTypeCombo->setValue(media_key); - childSetText("mime_type", mime_type); + + std::string mime_str = mime_type; + if(LLMIMETypes::getDefaultMimeType() == mime_type) + { + // Instead of showing predefined "none/none" we are going to show something + // localizable - "none" for example (see EXT-6542) + mime_str = LLMIMETypes::getDefaultMimeTypeTranslation(); + } + childSetText("mime_type", mime_str); } void LLPanelLandMedia::setMediaURL(const std::string& media_url) diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index ee4dcc44fe..529a368dc3 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -1007,7 +1007,7 @@ void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data) { if (gKeyboard->getKeyDown(KEY_CAPSLOCK) && sCapslockDidNotification == FALSE) { - LLNotificationsUtil::add("CapsKeyOn"); +// *TODO: use another way to notify user about enabled caps lock, see EXT-6858 sCapslockDidNotification = TRUE; } } diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp index 35acf8edcc..3f620869e0 100644 --- a/indra/newview/llpanelme.cpp +++ b/indra/newview/llpanelme.cpp @@ -63,7 +63,6 @@ BOOL LLPanelMe::postBuild() LLPanelProfile::postBuild(); getTabContainer()[PANEL_PROFILE]->childSetAction("edit_profile_btn", boost::bind(&LLPanelMe::onEditProfileClicked, this), this); - getTabContainer()[PANEL_PROFILE]->childSetAction("edit_appearance_btn", boost::bind(&LLPanelMe::onEditAppearanceClicked, this), this); return TRUE; } @@ -141,14 +140,6 @@ void LLPanelMe::onEditProfileClicked() togglePanel(mEditPanel, getAvatarId()); // open } -void LLPanelMe::onEditAppearanceClicked() -{ - if (gAgentWearables.areWearablesLoaded()) - { - gAgentCamera.changeCameraToCustomizeAvatar(); - } -} - void LLPanelMe::onSaveChangesClicked() { LLAvatarData data = LLAvatarData(); diff --git a/indra/newview/llpanelme.h b/indra/newview/llpanelme.h index 1325192bbf..f2b38de3d6 100644 --- a/indra/newview/llpanelme.h +++ b/indra/newview/llpanelme.h @@ -63,7 +63,6 @@ private: void buildEditPanel(); void onEditProfileClicked(); - void onEditAppearanceClicked(); void onSaveChangesClicked(); void onCancelClicked(); diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp index 79786c06d9..6411cd802d 100644 --- a/indra/newview/llpanelnearbymedia.cpp +++ b/indra/newview/llpanelnearbymedia.cpp @@ -1062,15 +1062,10 @@ void LLPanelNearByMedia::showBasicControls(bool playing, bool include_zoom, bool mStopCtrl->setVisible(playing); mPlayCtrl->setVisible(!playing); mPauseCtrl->setVisible(false); -#ifdef PER_MEDIA_VOLUME mVolumeSliderCtrl->setVisible(true); mMuteCtrl->setVisible(true); mMuteBtn->setValue(muted); mVolumeSlider->setValue(volume); -#else - mVolumeSliderCtrl->setVisible(false); - mMuteCtrl->setVisible(false); -#endif mZoomCtrl->setVisible(include_zoom && !is_zoomed); mUnzoomCtrl->setVisible(include_zoom && is_zoomed); mStopCtrl->setEnabled(true); diff --git a/indra/newview/llpanelonlinestatus.cpp b/indra/newview/llpanelonlinestatus.cpp new file mode 100644 index 0000000000..6ba015b11c --- /dev/null +++ b/indra/newview/llpanelonlinestatus.cpp @@ -0,0 +1,60 @@ +/** + * @file llpanelonlinestatus.cpp + * @brief Represents a class of online status tip toast panels. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, 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 "llnotifications.h" +#include "llpanelonlinestatus.h" + +LLPanelOnlineStatus::LLPanelOnlineStatus( + const LLNotificationPtr& notification) : + LLPanelTipToast(notification) +{ + + LLUICtrlFactory::getInstance()->buildPanel(this, + "panel_online_status_toast.xml"); + + + childSetValue("avatar_icon", notification->getPayload()["FROM_ID"]); + childSetValue("message", notification->getMessage()); + + if (notification->getPayload().has("respond_on_mousedown") + && notification->getPayload()["respond_on_mousedown"]) + { + setMouseDownCallback(boost::bind(&LLNotification::respond, + notification, notification->getResponseTemplate())); + } + + // set line max count to 3 in case of a very long name + snapToMessageHeight(getChild<LLTextBox> ("message"), 3); + +} diff --git a/indra/newview/llpanelonlinestatus.h b/indra/newview/llpanelonlinestatus.h new file mode 100644 index 0000000000..b47050c3a2 --- /dev/null +++ b/indra/newview/llpanelonlinestatus.h @@ -0,0 +1,53 @@ +/** + * @file llpanelonlinestatus.h + * @brief Represents a class of online status tip toast panels. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, 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 "llpaneltiptoast.h" + +#ifndef LL_PANELONLINESTATUS_H +#define LL_PANELONLINESTATUS_H + +/** + * Represents online tip toast panel. + */ +class LLPanelOnlineStatus : public LLPanelTipToast +{ + // disallow instantiation of this class +private: + // grant privileges to instantiate this class to LLToastPanel + friend class LLToastPanel; + + LLPanelOnlineStatus(const LLNotificationPtr& notification); + virtual ~LLPanelOnlineStatus() {} +}; + +#endif /* LL_PANELONLINESTATUS_H */ diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index ba6473839a..dbccd243da 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -38,7 +38,10 @@ #include "llagent.h" #include "llagentwearables.h" #include "llappearancemgr.h" +#include "llcofwearables.h" +#include "llfilteredwearablelist.h" #include "llinventory.h" +#include "llinventoryitemslist.h" #include "llviewercontrol.h" #include "llui.h" #include "llfloater.h" @@ -71,6 +74,9 @@ const U64 WEARABLE_MASK = (1LL << LLInventoryType::IT_WEARABLE); const U64 ATTACHMENT_MASK = (1LL << LLInventoryType::IT_ATTACHMENT) | (1LL << LLInventoryType::IT_OBJECT); const U64 ALL_ITEMS_MASK = WEARABLE_MASK | ATTACHMENT_MASK; +static const std::string SAVE_BTN("save_btn"); +static const std::string REVERT_BTN("revert_btn"); + class LLInventoryLookObserver : public LLInventoryObserver { public: @@ -116,9 +122,15 @@ private: LLPanelOutfitEdit::LLPanelOutfitEdit() -: LLPanel(), mCurrentOutfitID(), mFetchLook(NULL), mSearchFilter(NULL), -mLookContents(NULL), mInventoryItemsPanel(NULL), mAddToOutfitBtn(NULL), -mRemoveFromOutfitBtn(NULL), mLookObserver(NULL) +: LLPanel(), + mCurrentOutfitID(), + mFetchLook(NULL), + mSearchFilter(NULL), + mCOFWearables(NULL), + mInventoryItemsPanel(NULL), + mAddToOutfitBtn(NULL), + mRemoveFromOutfitBtn(NULL), + mLookObserver(NULL) { mSavedFolderState = new LLSaveFolderState(); mSavedFolderState->setApply(FALSE); @@ -164,10 +176,10 @@ BOOL LLPanelOutfitEdit::postBuild() childSetCommitCallback("add_btn", boost::bind(&LLPanelOutfitEdit::showAddWearablesPanel, this), NULL); childSetCommitCallback("filter_button", boost::bind(&LLPanelOutfitEdit::showWearablesFilter, this), NULL); + childSetCommitCallback("list_view_btn", boost::bind(&LLPanelOutfitEdit::showFilteredWearablesPanel, this), NULL); - mLookContents = getChild<LLScrollListCtrl>("look_items_list"); - mLookContents->sortByColumn("look_item_sort", TRUE); - mLookContents->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onOutfitItemSelectionChange, this)); + mCOFWearables = getChild<LLCOFWearables>("cof_wearables_list"); + mCOFWearables->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onOutfitItemSelectionChange, this)); mInventoryItemsPanel = getChild<LLInventoryPanel>("inventory_items"); mInventoryItemsPanel->setFilterTypes(ALL_ITEMS_MASK); @@ -200,15 +212,6 @@ BOOL LLPanelOutfitEdit::postBuild() childSetAction("add_to_outfit_btn", boost::bind(&LLPanelOutfitEdit::onAddToOutfitClicked, this)); childSetEnabled("add_to_outfit_btn", false); - mUpBtn = getChild<LLButton>("up_btn"); - mUpBtn->setEnabled(TRUE); - mUpBtn->setClickedCallback(boost::bind(&LLPanelOutfitEdit::onUpClicked, this)); - - //*TODO rename mLookContents to mOutfitContents - mLookContents = getChild<LLScrollListCtrl>("look_items_list"); - mLookContents->sortByColumn("look_item_sort", TRUE); - mLookContents->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onOutfitItemSelectionChange, this)); - mRemoveFromOutfitBtn = getChild<LLButton>("remove_from_outfit_btn"); mRemoveFromOutfitBtn->setEnabled(FALSE); mRemoveFromOutfitBtn->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onRemoveFromOutfitClicked, this)); @@ -218,10 +221,9 @@ BOOL LLPanelOutfitEdit::postBuild() mEditWearableBtn->setVisible(FALSE); mEditWearableBtn->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onEditWearableClicked, this)); - childSetAction("revert_btn", boost::bind(&LLAppearanceMgr::wearBaseOutfit, LLAppearanceMgr::getInstance())); + childSetAction(REVERT_BTN, boost::bind(&LLAppearanceMgr::wearBaseOutfit, LLAppearanceMgr::getInstance())); - childSetAction("save_btn", boost::bind(&LLPanelOutfitEdit::saveOutfit, this, false)); - childSetAction("save_as_btn", boost::bind(&LLPanelOutfitEdit::saveOutfit, this, true)); + childSetAction(SAVE_BTN, boost::bind(&LLPanelOutfitEdit::saveOutfit, this, false)); childSetAction("save_flyout_btn", boost::bind(&LLPanelOutfitEdit::showSaveMenu, this)); LLUICtrl::CommitCallbackRegistry::ScopedRegistrar save_registar; @@ -229,9 +231,27 @@ BOOL LLPanelOutfitEdit::postBuild() save_registar.add("Outfit.SaveAsNew.Action", boost::bind(&LLPanelOutfitEdit::saveOutfit, this, true)); mSaveMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_save_outfit.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + mWearableListManager = new LLFilteredWearableListManager( + getChild<LLInventoryItemsList>("filtered_wearables_list"), ALL_ITEMS_MASK); + + childSetAction("move_closer_btn", boost::bind(&LLPanelOutfitEdit::moveWearable, this, true)); + childSetAction("move_further_btn", boost::bind(&LLPanelOutfitEdit::moveWearable, this, false)); + return TRUE; } +void LLPanelOutfitEdit::moveWearable(bool closer_to_body) +{ + LLUUID item_id = mCOFWearables->getSelectedUUID(); + if (item_id.isNull()) return; + + LLViewerInventoryItem* wearable_to_move = gInventory.getItem(item_id); + LLAppearanceMgr::getInstance()->moveWearable(wearable_to_move, closer_to_body); + + //*TODO why not to listen to inventory? + updateLookInfo(); +} + void LLPanelOutfitEdit::showAddWearablesPanel() { childSetVisible("add_wearables_panel", childGetValue("add_btn")); @@ -242,6 +262,11 @@ void LLPanelOutfitEdit::showWearablesFilter() childSetVisible("filter_combobox_panel", childGetValue("filter_button")); } +void LLPanelOutfitEdit::showFilteredWearablesPanel() +{ + childSetVisible("filtered_wearables_panel", !childIsVisible("filtered_wearables_panel")); +} + void LLPanelOutfitEdit::saveOutfit(bool as_new) { if (!as_new && LLAppearanceMgr::getInstance()->updateBaseOutfit()) @@ -256,6 +281,8 @@ void LLPanelOutfitEdit::saveOutfit(bool as_new) { panel_outfits_inventory->onSave(); } + + //*TODO how to get to know when base outfit is updated or new outfit is created? } void LLPanelOutfitEdit::showSaveMenu() @@ -275,6 +302,7 @@ void LLPanelOutfitEdit::onTypeFilterChanged(LLUICtrl* ctrl) { U32 curr_filter_type = type_filter->getCurrentIndex(); mInventoryItemsPanel->setFilterTypes(mLookItemTypes[curr_filter_type].inventoryMask); + mWearableListManager->setFilterMask(mLookItemTypes[curr_filter_type].inventoryMask); } mSavedFolderState->setApply(TRUE); @@ -346,7 +374,7 @@ void LLPanelOutfitEdit::onAddToOutfitClicked(void) void LLPanelOutfitEdit::onRemoveFromOutfitClicked(void) { - LLUUID id_to_remove = mLookContents->getSelectionInterface()->getCurrentID(); + LLUUID id_to_remove = mCOFWearables->getSelectedUUID(); LLAppearanceMgr::getInstance()->removeItemFromAvatar(id_to_remove); @@ -356,41 +384,9 @@ void LLPanelOutfitEdit::onRemoveFromOutfitClicked(void) } -void LLPanelOutfitEdit::onUpClicked(void) -{ - LLUUID inv_id = mLookContents->getSelectionInterface()->getCurrentID(); - if (inv_id.isNull()) - { - //nothing selected, do nothing - return; - } - - LLViewerInventoryItem *link_item = gInventory.getItem(inv_id); - if (!link_item) - { - llwarns << "could not find inventory item based on currently worn link." << llendl; - return; - } - - - LLUUID asset_id = link_item->getAssetUUID(); - if (asset_id.isNull()) - { - llwarns << "inventory link has null Asset ID. could not get object reference" << llendl; - } - - static const std::string empty = ""; - LLWearableList::instance().getAsset(asset_id, - empty, // don't care about wearable name - link_item->getActualType(), - LLSidepanelAppearance::editWearable, - (void*)getParentUICtrl()); -} - - void LLPanelOutfitEdit::onEditWearableClicked(void) { - LLUUID id_to_edit = mLookContents->getSelectionInterface()->getCurrentID(); + LLUUID id_to_edit = mCOFWearables->getSelectedUUID(); LLViewerInventoryItem * item_to_edit = gInventory.getItem(id_to_edit); if (item_to_edit) @@ -463,28 +459,11 @@ void LLPanelOutfitEdit::onInventorySelectionChange(const std::deque<LLFolderView void LLPanelOutfitEdit::onOutfitItemSelectionChange(void) { - LLScrollListItem* item = mLookContents->getLastSelectedItem(); - if (!item) - return; - - LLRect item_rect; - mLookContents->localRectToOtherView(item->getRect(), &item_rect, getChild<LLUICtrl>("outfit_wearables_panel")); - - // TODO button(and item list) should be removed (when new widget is ready) - LLRect btn_rect = mEditWearableBtn->getRect(); - btn_rect.set(item_rect.mRight - btn_rect.getWidth(), item_rect.mTop, item_rect.mRight, item_rect.mBottom); - - mEditWearableBtn->setShape(btn_rect); - - mEditWearableBtn->setEnabled(TRUE); - if (!mEditWearableBtn->getVisible()) - { - mEditWearableBtn->setVisible(TRUE); - } + LLUUID item_id = mCOFWearables->getSelectedUUID(); + //*TODO show Edit Wearable Button - const LLUUID& id_item_to_remove = item->getUUID(); - LLViewerInventoryItem* item_to_remove = gInventory.getItem(id_item_to_remove); + LLViewerInventoryItem* item_to_remove = gInventory.getItem(item_id); if (!item_to_remove) return; switch (item_to_remove->getType()) @@ -505,42 +484,15 @@ void LLPanelOutfitEdit::changed(U32 mask) void LLPanelOutfitEdit::lookFetched(void) { - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t item_array; - - // collectDescendentsIf takes non-const reference: - LLFindCOFValidItems is_cof_valid; - gInventory.collectDescendentsIf(mCurrentOutfitID, - cat_array, - item_array, - LLInventoryModel::EXCLUDE_TRASH, - is_cof_valid); - for (LLInventoryModel::item_array_t::const_iterator iter = item_array.begin(); - iter != item_array.end(); - iter++) - { - const LLViewerInventoryItem *item = (*iter); - - LLSD row; - row["id"] = item->getUUID(); - LLSD& columns = row["columns"]; - columns[0]["column"] = "look_item"; - columns[0]["type"] = "text"; - columns[0]["value"] = item->getName(); - columns[1]["column"] = "look_item_sort"; - columns[1]["type"] = "text"; // TODO: multi-wearable sort "type" should go here. - columns[1]["value"] = "BAR"; // TODO: Multi-wearable sort index should go here - - mLookContents->addElement(row); - } + mCOFWearables->refresh(); + + updateVerbs(); } void LLPanelOutfitEdit::updateLookInfo() { if (getVisible()) { - mLookContents->clearRows(); - mFetchLook->setFetchID(mCurrentOutfitID); mFetchLook->startFetch(); if (mFetchLook->isFinished()) @@ -576,4 +528,15 @@ void LLPanelOutfitEdit::displayCurrentOutfit() updateLookInfo(); } +//private +void LLPanelOutfitEdit::updateVerbs() +{ + bool outfit_is_dirty = LLAppearanceMgr::getInstance()->isOutfitDirty(); + + childSetEnabled(SAVE_BTN, outfit_is_dirty); + childSetEnabled(REVERT_BTN, outfit_is_dirty); + + mSaveMenu->setItemEnabled("save_outfit", outfit_is_dirty); +} +// EOF diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h index 69e8016534..21fa849289 100644 --- a/indra/newview/llpaneloutfitedit.h +++ b/indra/newview/llpaneloutfitedit.h @@ -45,6 +45,7 @@ #include "llinventorymodel.h" class LLButton; +class LLCOFWearables; class LLTextBox; class LLInventoryCategory; class LLInventoryLookObserver; @@ -55,6 +56,7 @@ class LLScrollListCtrl; class LLToggleableMenu; class LLLookFetchObserver; class LLFilterEditor; +class LLFilteredWearableListManager; class LLPanelOutfitEdit : public LLPanel { @@ -86,8 +88,11 @@ public: // Sends a request for data about the given parcel, which will // only update the location if there is none already available. + void moveWearable(bool closer_to_body); + void showAddWearablesPanel(); void showWearablesFilter(); + void showFilteredWearablesPanel(); void saveOutfit(bool as_new = false); void showSaveMenu(); @@ -98,7 +103,6 @@ public: void onOutfitItemSelectionChange(void); void onRemoveFromOutfitClicked(void); void onEditWearableClicked(void); - void onUpClicked(void); void displayCurrentOutfit(); @@ -108,24 +112,28 @@ public: private: + void updateVerbs(); + //*TODO got rid of mCurrentOutfitID LLUUID mCurrentOutfitID; LLTextBox* mCurrentOutfitName; - LLScrollListCtrl* mLookContents; LLInventoryPanel* mInventoryItemsPanel; LLFilterEditor* mSearchFilter; LLSaveFolderState* mSavedFolderState; std::string mSearchString; LLButton* mAddToOutfitBtn; LLButton* mRemoveFromOutfitBtn; - LLButton* mUpBtn; LLButton* mEditWearableBtn; LLToggleableMenu* mSaveMenu; - + + LLFilteredWearableListManager* mWearableListManager; + LLLookFetchObserver* mFetchLook; LLInventoryLookObserver* mLookObserver; std::vector<LLLookItemType> mLookItemTypes; + + LLCOFWearables* mCOFWearables; }; #endif // LL_LLPANELOUTFITEDIT_H diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index b78268da7b..789e85b46f 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -49,6 +49,7 @@ #include "lllineeditor.h" #include "llmodaldialog.h" #include "llnotificationsutil.h" +#include "lloutfitslist.h" #include "llsidepanelappearance.h" #include "llsidetray.h" #include "lltabcontainer.h" @@ -71,7 +72,8 @@ bool LLPanelOutfitsInventory::sShowDebugEditor = false; LLPanelOutfitsInventory::LLPanelOutfitsInventory() : - mActivePanel(NULL), + mMyOutfitsPanel(NULL), + mCurrentOutfitPanel(NULL), mParent(NULL) { mSavedFolderState = new LLSaveFolderState(); @@ -145,9 +147,17 @@ void LLPanelOutfitsInventory::setParent(LLSidepanelAppearance* parent) void LLPanelOutfitsInventory::onSearchEdit(const std::string& string) { mFilterSubString = string; + + // TODO: add handling "My Outfits" tab. + if (!isCOFPanelActive()) + { + mMyOutfitsPanel->setFilterSubString(string); + return; + } + if (string == "") { - mActivePanel->setFilterSubString(LLStringUtil::null); + getActivePanel()->setFilterSubString(LLStringUtil::null); // re-open folders that were initially open mSavedFolderState->setApply(TRUE); @@ -159,7 +169,7 @@ void LLPanelOutfitsInventory::onSearchEdit(const std::string& string) LLInventoryModelBackgroundFetch::instance().start(); - if (mActivePanel->getFilterSubString().empty() && string.empty()) + if (getActivePanel()->getFilterSubString().empty() && string.empty()) { // current filter and new filter empty, do nothing return; @@ -173,7 +183,7 @@ void LLPanelOutfitsInventory::onSearchEdit(const std::string& string) } // set new filter string - mActivePanel->setFilterSubString(string); + getActivePanel()->setFilterSubString(string); } void LLPanelOutfitsInventory::onWearButtonClick() @@ -216,7 +226,7 @@ bool LLPanelOutfitsInventory::onSaveCommit(const LLSD& notification, const LLSD& LLStringUtil::trim(outfit_name); if( !outfit_name.empty() ) { - LLUUID outfit_folder = gAgentWearables.makeNewOutfitLinks(outfit_name); + LLUUID outfit_folder = LLAppearanceMgr::getInstance()->makeNewOutfitLinks(outfit_name); LLSidepanelAppearance* panel_appearance = dynamic_cast<LLSidepanelAppearance *>(LLSideTray::getInstance()->getPanel("sidepanel_appearance")); @@ -267,6 +277,11 @@ void LLPanelOutfitsInventory::onSave() void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action) { updateVerbs(); + + // TODO: add handling "My Outfits" tab. + if (!isCOFPanelActive()) + return; + if (getRootFolder()->needsAutoRename() && items.size()) { getRootFolder()->startRenamingSelectedItem(); @@ -284,6 +299,10 @@ void LLPanelOutfitsInventory::showEditOutfitPanel() LLFolderViewEventListener *LLPanelOutfitsInventory::getCorrectListenerForAction() { + // TODO: add handling "My Outfits" tab. + if (!isCOFPanelActive()) + return NULL; + LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem(); if (!current_item) return NULL; @@ -311,7 +330,7 @@ bool LLPanelOutfitsInventory::getIsCorrectType(const LLFolderViewEventListener * LLFolderView *LLPanelOutfitsInventory::getRootFolder() { - return mActivePanel->getRootFolder(); + return getActivePanel()->getRootFolder(); } //static @@ -393,7 +412,11 @@ void LLPanelOutfitsInventory::onTrashButtonClick() void LLPanelOutfitsInventory::onClipboardAction(const LLSD& userdata) { std::string command_name = userdata.asString(); - getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name); + // TODO: add handling "My Outfits" tab. + if (isCOFPanelActive()) + { + getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name); + } updateListCommands(); updateVerbs(); } @@ -447,21 +470,26 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata) if (command_name == "delete" || command_name == "remove") { BOOL can_delete = FALSE; - LLFolderView* root = getActivePanel()->getRootFolder(); - if (root) + + // TODO: add handling "My Outfits" tab. + if (isCOFPanelActive()) { - std::set<LLUUID> selection_set; - root->getSelectionList(selection_set); - can_delete = (selection_set.size() > 0); - for (std::set<LLUUID>::iterator iter = selection_set.begin(); - iter != selection_set.end(); - ++iter) + LLFolderView* root = getActivePanel()->getRootFolder(); + if (root) { - const LLUUID &item_id = (*iter); - LLFolderViewItem *item = root->getItemByID(item_id); - can_delete &= item->getListener()->isItemRemovable(); + std::set<LLUUID> selection_set; + root->getSelectionList(selection_set); + can_delete = (selection_set.size() > 0); + for (std::set<LLUUID>::iterator iter = selection_set.begin(); + iter != selection_set.end(); + ++iter) + { + const LLUUID &item_id = (*iter); + LLFolderViewItem *item = root->getItemByID(item_id); + can_delete &= item->getListener()->isItemRemovable(); + } + return can_delete; } - return can_delete; } return FALSE; } @@ -517,12 +545,17 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata) bool LLPanelOutfitsInventory::hasItemsSelected() { bool has_items_selected = false; - LLFolderView* root = getActivePanel()->getRootFolder(); - if (root) + + // TODO: add handling "My Outfits" tab. + if (isCOFPanelActive()) { - std::set<LLUUID> selection_set; - root->getSelectionList(selection_set); - has_items_selected = (selection_set.size() > 0); + LLFolderView* root = getActivePanel()->getRootFolder(); + if (root) + { + std::set<LLUUID> selection_set; + root->getSelectionList(selection_set); + has_items_selected = (selection_set.size() > 0); + } } return has_items_selected; } @@ -549,74 +582,58 @@ bool LLPanelOutfitsInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropTy void LLPanelOutfitsInventory::initTabPanels() { - LLInventoryPanel *cof_panel = getChild<LLInventoryPanel>(COF_TAB_NAME); - cof_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); - mTabPanels.push_back(cof_panel); + mCurrentOutfitPanel = getChild<LLInventoryPanel>(COF_TAB_NAME); + mCurrentOutfitPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); + mCurrentOutfitPanel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onTabSelectionChange, this, mCurrentOutfitPanel, _1, _2)); - LLInventoryPanel *myoutfits_panel = getChild<LLInventoryPanel>(OUTFITS_TAB_NAME); - myoutfits_panel->setFilterTypes(1LL << LLFolderType::FT_OUTFIT, LLInventoryFilter::FILTERTYPE_CATEGORY); - myoutfits_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); - mTabPanels.push_back(myoutfits_panel); - - for (tabpanels_vec_t::iterator iter = mTabPanels.begin(); - iter != mTabPanels.end(); - ++iter) - { - LLInventoryPanel *panel = (*iter); - panel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onTabSelectionChange, this, panel, _1, _2)); - } + mMyOutfitsPanel = getChild<LLOutfitsList>(OUTFITS_TAB_NAME); mAppearanceTabs = getChild<LLTabContainer>("appearance_tabs"); mAppearanceTabs->setCommitCallback(boost::bind(&LLPanelOutfitsInventory::onTabChange, this)); - mActivePanel = (LLInventoryPanel*)mAppearanceTabs->getCurrentPanel(); } void LLPanelOutfitsInventory::onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action) { if (user_action && items.size() > 0) { - for (tabpanels_vec_t::iterator iter = mTabPanels.begin(); - iter != mTabPanels.end(); - ++iter) + // TODO: add handling "My Outfits" tab. + if (isCOFPanelActive()) { - LLInventoryPanel *panel = (*iter); - if (panel == tab_panel) - { - mActivePanel = panel; - } - else - { - panel->getRootFolder()->clearSelection(); - } + onSelectionChange(items, user_action); + } + else + { + mCurrentOutfitPanel->getRootFolder()->clearSelection(); } } - onSelectionChange(items, user_action); } void LLPanelOutfitsInventory::onTabChange() { - mActivePanel = (LLInventoryPanel*)childGetVisibleTab("appearance_tabs"); - if (!mActivePanel) + // TODO: add handling "My Outfits" tab. + if (isCOFPanelActive()) { - return; + mCurrentOutfitPanel->setFilterSubString(mFilterSubString); + } + else + { + mMyOutfitsPanel->setFilterSubString(mFilterSubString); } - mActivePanel->setFilterSubString(mFilterSubString); + updateVerbs(); } BOOL LLPanelOutfitsInventory::isTabPanel(LLInventoryPanel *panel) const { - for(tabpanels_vec_t::const_iterator it = mTabPanels.begin(); - it != mTabPanels.end(); - ++it) + // TODO: add handling "My Outfits" tab. + if (mCurrentOutfitPanel == panel) { - if (*it == panel) - return TRUE; + return TRUE; } return FALSE; } BOOL LLPanelOutfitsInventory::isCOFPanelActive() const { - return (getActivePanel()->getName() == COF_TAB_NAME); + return (childGetVisibleTab("appearance_tabs")->getName() == COF_TAB_NAME); } diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h index 5d0d27ee4f..4234cc45c5 100644 --- a/indra/newview/llpaneloutfitsinventory.h +++ b/indra/newview/llpaneloutfitsinventory.h @@ -40,6 +40,7 @@ class LLFolderView; class LLFolderViewItem; class LLFolderViewEventListener; class LLInventoryPanel; +class LLOutfitsList; class LLSaveFolderState; class LLButton; class LLMenuGL; @@ -88,20 +89,21 @@ private: public: ////////////////////////////////////////////////////////////////////////////////// // tab panels - LLInventoryPanel* getActivePanel() { return mActivePanel; } - const LLInventoryPanel* getActivePanel() const { return mActivePanel; } + // TODO: change getActivePanel() to return the active tab instead of returning + // a pointer to "Wearing" inventory panel. + LLInventoryPanel* getActivePanel() { return mCurrentOutfitPanel; } + BOOL isTabPanel(LLInventoryPanel *panel) const; - + BOOL isCOFPanelActive() const; + protected: void initTabPanels(); void onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action); void onTabChange(); - BOOL isCOFPanelActive() const; private: - LLInventoryPanel* mActivePanel; - typedef std::vector<LLInventoryPanel *> tabpanels_vec_t; - tabpanels_vec_t mTabPanels; + LLOutfitsList* mMyOutfitsPanel; + LLInventoryPanel* mCurrentOutfitPanel; // tab panels // //////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 5802d53cd1..f2c0f92f9b 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -443,6 +443,7 @@ public: LLPanelPeople::LLPanelPeople() : LLPanel(), mFilterSubString(LLStringUtil::null), + mFilterSubStringOrig(LLStringUtil::null), mFilterEditor(NULL), mTabContainer(NULL), mOnlineFriendList(NULL), @@ -512,15 +513,19 @@ BOOL LLPanelPeople::postBuild() mNearbyList = getChild<LLPanel>(NEARBY_TAB_NAME)->getChild<LLAvatarList>("avatar_list"); mNearbyList->setNoItemsCommentText(getString("no_one_near")); + mNearbyList->setNoItemsMsg(getString("no_one_near")); + mNearbyList->setNoFilteredItemsMsg(getString("no_one_filtered_near")); mNearbyList->setShowIcons("NearbyListShowIcons"); mRecentList = getChild<LLPanel>(RECENT_TAB_NAME)->getChild<LLAvatarList>("avatar_list"); - mRecentList->setNoItemsCommentText(getString("no_people")); + mRecentList->setNoItemsCommentText(getString("no_recent_people")); + mRecentList->setNoItemsMsg(getString("no_recent_people")); + mRecentList->setNoFilteredItemsMsg(getString("no_filtered_recent_people")); mRecentList->setShowIcons("RecentListShowIcons"); mGroupList = getChild<LLGroupList>("group_list"); - mGroupList->setNoGroupsMsg(getString("no_groups_msg")); - mGroupList->setNoFilteredGroupsMsg(getString("no_filtered_groups_msg")); + mGroupList->setNoItemsMsg(getString("no_groups_msg")); + mGroupList->setNoFilteredItemsMsg(getString("no_filtered_groups_msg")); mNearbyList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu); mRecentList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu); @@ -641,6 +646,25 @@ void LLPanelPeople::onChange(EStatusType status, const std::string &channelURI, updateButtons(); } +void LLPanelPeople::updateFriendListHelpText() +{ + // show special help text for just created account to help finding friends. EXT-4836 + static LLTextBox* no_friends_text = getChild<LLTextBox>("no_friends_help_text"); + + // Seems sometimes all_friends can be empty because of issue with Inventory loading (clear cache, slow connection...) + // So, lets check all lists to avoid overlapping the text with online list. See EXT-6448. + bool any_friend_exists = mAllFriendList->filterHasMatches() || mOnlineFriendList->filterHasMatches(); + no_friends_text->setVisible(!any_friend_exists); + if (no_friends_text->getVisible()) + { + //update help text for empty lists + std::string message_name = mFilterSubString.empty() ? "no_friends_msg" : "no_filtered_friends_msg"; + LLStringUtil::format_map_t args; + args["[SEARCH_TERM]"] = LLURI::escape(mFilterSubStringOrig); + no_friends_text->setText(getString(message_name, args)); + } +} + void LLPanelPeople::updateFriendList() { if (!mOnlineFriendList || !mAllFriendList) @@ -680,14 +704,6 @@ void LLPanelPeople::updateFriendList() online_friendsp.push_back(buddy_id); } - // show special help text for just created account to help found friends. EXT-4836 - static LLTextBox* no_friends_text = getChild<LLTextBox>("no_friends_msg"); - - // Seems sometimes all_friends can be empty because of issue with Inventory loading (clear cache, slow connection...) - // So, lets check all lists to avoid overlapping the text with online list. See EXT-6448. - bool any_friend_exists = (all_friendsp.size() > 0) || (online_friendsp.size() > 0); - no_friends_text->setVisible(!any_friend_exists); - /* * 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(); @@ -968,10 +984,11 @@ bool LLPanelPeople::isRealGroup() void LLPanelPeople::onFilterEdit(const std::string& search_string) { - std::string search_upper = search_string; + mFilterSubStringOrig = search_string; + LLStringUtil::trimHead(mFilterSubStringOrig); // Searches are case-insensitive + std::string search_upper = mFilterSubStringOrig; LLStringUtil::toUpper(search_upper); - LLStringUtil::trimHead(search_upper); if (mFilterSubString == search_upper) return; @@ -986,11 +1003,11 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string) // Apply new filter. - mNearbyList->setNameFilter(mFilterSubString); - mOnlineFriendList->setNameFilter(mFilterSubString); - mAllFriendList->setNameFilter(mFilterSubString); - mRecentList->setNameFilter(mFilterSubString); - mGroupList->setNameFilter(mFilterSubString); + mNearbyList->setNameFilter(mFilterSubStringOrig); + mOnlineFriendList->setNameFilter(mFilterSubStringOrig); + mAllFriendList->setNameFilter(mFilterSubStringOrig); + mRecentList->setNameFilter(mFilterSubStringOrig); + mGroupList->setNameFilter(mFilterSubStringOrig); setAccordionCollapsedByUser("tab_online", false); setAccordionCollapsedByUser("tab_all", false); @@ -1432,6 +1449,9 @@ void LLPanelPeople::showFriendsAccordionsIfNeeded() // Rearrange accordions LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion"); accordion->arrange(); + + // keep help text in a synchronization with accordions visibility. + updateFriendListHelpText(); } } diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h index 891381e2de..17c45a034b 100644 --- a/indra/newview/llpanelpeople.h +++ b/indra/newview/llpanelpeople.h @@ -73,6 +73,7 @@ private: } ESortOrder; // methods indirectly called by the updaters + void updateFriendListHelpText(); void updateFriendList(); void updateNearbyList(); void updateRecentList(); @@ -168,6 +169,7 @@ private: Updater* mRecentListUpdater; std::string mFilterSubString; + std::string mFilterSubStringOrig; }; #endif //LL_LLPANELPEOPLE_H diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 17784c31e3..51a11e97e4 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -528,8 +528,7 @@ void LLPanelPlaces::onFilterEdit(const std::string& search_string, bool force_fi std::string string = search_string; // Searches are case-insensitive - LLStringUtil::toUpper(string); - LLStringUtil::trimHead(string); + // but we don't convert the typed string to upper-case so that it can be fed to the web search as-is. mActivePanel->onSearchEdit(string); } @@ -1071,8 +1070,7 @@ void LLPanelPlaces::updateVerbs() mSaveBtn->setVisible(isLandmarkEditModeOn); mCancelBtn->setVisible(isLandmarkEditModeOn); mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn); - mPlaceInfoBtn->setVisible(mPlaceInfoType != LANDMARK_INFO_TYPE && mPlaceInfoType != TELEPORT_HISTORY_INFO_TYPE - && !is_create_landmark_visible && !isLandmarkEditModeOn); + mPlaceInfoBtn->setVisible(!is_place_info_visible && !is_create_landmark_visible && !isLandmarkEditModeOn); mShowOnMapBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn && have_3d_pos); mPlaceInfoBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn && have_3d_pos); diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 5209d50755..0648d99685 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -350,6 +350,11 @@ void LLPanelPrimMediaControls::updateShape() mHomeCtrl->setEnabled(has_focus && can_navigate); LLPluginClassMediaOwner::EMediaStatus result = ((media_impl != NULL) && media_impl->hasMedia()) ? media_plugin->getStatus() : LLPluginClassMediaOwner::MEDIA_NONE; + mVolumeCtrl->setVisible(has_focus); + mVolumeCtrl->setEnabled(has_focus); + mVolumeSliderCtrl->setEnabled(has_focus && shouldVolumeSliderBeVisible()); + mVolumeSliderCtrl->setVisible(has_focus && shouldVolumeSliderBeVisible()); + if(media_plugin && media_plugin->pluginSupportsMediaTime()) { mReloadCtrl->setEnabled(false); @@ -462,14 +467,6 @@ void LLPanelPrimMediaControls::updateShape() mSkipBackCtrl->setVisible(FALSE); mSkipBackCtrl->setEnabled(FALSE); -#ifdef PER_MEDIA_VOLUME - // these should be pulled up above the pluginSupportsMediaTime - // if check once we always have PER_MEDIA_VOLUME turned on - mVolumeCtrl->setVisible(has_focus); - mVolumeCtrl->setEnabled(has_focus); - mVolumeSliderCtrl->setEnabled(has_focus && shouldVolumeSliderBeVisible()); - mVolumeSliderCtrl->setVisible(has_focus && shouldVolumeSliderBeVisible()); - if(media_impl->getVolume() <= 0.0) { mMuteBtn->setToggleState(true); @@ -478,12 +475,6 @@ void LLPanelPrimMediaControls::updateShape() { mMuteBtn->setToggleState(false); } -#else - mVolumeCtrl->setVisible(FALSE); - mVolumeSliderCtrl->setVisible(FALSE); - mVolumeCtrl->setEnabled(FALSE); - mVolumeSliderCtrl->setEnabled(FALSE); -#endif if (mMediaPanelScroll) { diff --git a/indra/newview/llpaneltiptoast.cpp b/indra/newview/llpaneltiptoast.cpp new file mode 100644 index 0000000000..23367df41a --- /dev/null +++ b/indra/newview/llpaneltiptoast.cpp @@ -0,0 +1,69 @@ +/** + * @file llpaneltiptoast.cpp + * @brief Represents a base class of tip toast panels. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, 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 "llpaneltiptoast.h" + +BOOL LLPanelTipToast::postBuild() +{ + mMessageText= findChild<LLUICtrl>("message"); + + if (mMessageText != NULL) + { + mMessageText->setMouseUpCallback(boost::bind(&LLPanelTipToast::onMessageTextClick,this)); + setMouseUpCallback(boost::bind(&LLPanelTipToast::onPanelClick, this, _2, _3, _4)); + } + else + { + llassert(!"Can't find child 'message' text box."); + return FALSE; + } + + return TRUE; +} + +void LLPanelTipToast::onMessageTextClick() +{ + // notify parent toast about need hide + LLSD info; + info["action"] = "hide_toast"; + notifyParent(info); +} + +void LLPanelTipToast::onPanelClick(S32 x, S32 y, MASK mask) +{ + if (!mMessageText->getRect().pointInRect(x, y)) + { + onMessageTextClick(); + } +} diff --git a/indra/newview/llpaneltiptoast.h b/indra/newview/llpaneltiptoast.h new file mode 100644 index 0000000000..e8678aa1d3 --- /dev/null +++ b/indra/newview/llpaneltiptoast.h @@ -0,0 +1,57 @@ +/** + * @file llpaneltiptoast.h + * @brief Represents a base class of tip toast panels. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, 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 "lltoastpanel.h" + +#ifndef LL_PANELTOASTTIP_H +#define LL_PANELTOASTTIP_H + +/** + * Base class for tip toast panels. + * + * Tip toast panels are required to have text message box named as 'message'. + */ +class LLPanelTipToast : public LLToastPanel +{ + LOG_CLASS(LLPanelTipToast); +public: + LLPanelTipToast(const LLNotificationPtr& notification): LLToastPanel(notification) {} + virtual BOOL postBuild(); +private: + void onMessageTextClick(); + void onPanelClick(S32 x, S32 y, MASK mask); + + LLUICtrl* mMessageText; +}; + +#endif /* LL_PANELTOASTTIP_H */ diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 53f92f7ad1..c3748ca81d 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -643,6 +643,7 @@ LLContextMenu* LLParticipantList::LLParticipantListMenu::createMenu() registrar.add("ParticipantList.ModerateVoice", boost::bind(&LLParticipantList::LLParticipantListMenu::moderateVoice, this, _2)); enable_registrar.add("ParticipantList.EnableItem", boost::bind(&LLParticipantList::LLParticipantListMenu::enableContextMenuItem, this, _2)); + enable_registrar.add("ParticipantList.EnableItem.Moderate", boost::bind(&LLParticipantList::LLParticipantListMenu::enableModerateContextMenuItem, this, _2)); enable_registrar.add("ParticipantList.CheckItem", boost::bind(&LLParticipantList::LLParticipantListMenu::checkContextMenuItem, this, _2)); // create the context menu from the XUI @@ -667,7 +668,7 @@ void LLParticipantList::LLParticipantListMenu::show(LLView* spawning_view, const if (uuids.size() == 0) return; - const LLUUID speaker_id = mUUIDs.front(); + const LLUUID& speaker_id = mUUIDs.front(); BOOL is_muted = isMuted(speaker_id); if (is_muted) @@ -801,28 +802,18 @@ void LLParticipantList::LLParticipantListMenu::moderateVoiceOtherParticipants(co bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& userdata) { std::string item = userdata.asString(); + const LLUUID& participant_id = mUUIDs.front(); + + // For now non of "can_view_profile" action and menu actions listed below except "can_block" + // can be performed for Avaline callers. + bool is_participant_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(participant_id); + if (!is_participant_avatar && "can_block" != item) return false; + if (item == "can_mute_text" || "can_block" == item || "can_share" == item || "can_im" == item || "can_pay" == item) { return mUUIDs.front() != gAgentID; } - else if (item == "can_allow_text_chat") - { - return isGroupModerator(); - } - else if ("can_moderate_voice" == item) - { - if (isGroupModerator()) - { - LLPointer<LLSpeaker> speakerp = mParent.mSpeakerMgr->findSpeaker(mUUIDs.front()); - if (speakerp.notNull()) - { - // not in voice participants can not be moderated - return speakerp->isInVoiceChannel(); - } - } - return false; - } else if (item == std::string("can_add")) { // We can add friends if: @@ -855,6 +846,36 @@ bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& return true; } +/* +Processed menu items with such parameters: + can_allow_text_chat + can_moderate_voice +*/ +bool LLParticipantList::LLParticipantListMenu::enableModerateContextMenuItem(const LLSD& userdata) +{ + // only group moderators can perform actions related to this "enable callback" + if (!isGroupModerator()) return false; + + const LLUUID& participant_id = mUUIDs.front(); + LLPointer<LLSpeaker> speakerp = mParent.mSpeakerMgr->findSpeaker(participant_id); + + // not in voice participants can not be moderated + bool speaker_in_voice = speakerp.notNull() && speakerp->isInVoiceChannel(); + + const std::string& item = userdata.asString(); + + if ("can_moderate_voice" == item) + { + return speaker_in_voice; + } + + // For now non of menu actions except "can_moderate_voice" can be performed for Avaline callers. + bool is_participant_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(participant_id); + if (!is_participant_avatar) return false; + + return true; +} + bool LLParticipantList::LLParticipantListMenu::checkContextMenuItem(const LLSD& userdata) { std::string item = userdata.asString(); diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index 9e5a2cbc1f..bbef8baaac 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -158,6 +158,7 @@ class LLParticipantList LLParticipantList& mParent; private: bool enableContextMenuItem(const LLSD& userdata); + bool enableModerateContextMenuItem(const LLSD& userdata); bool checkContextMenuItem(const LLSD& userdata); void sortParticipantList(const LLSD& userdata); diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp index f35cb3516a..11b6c0a3ae 100644 --- a/indra/newview/llscriptfloater.cpp +++ b/indra/newview/llscriptfloater.cpp @@ -539,4 +539,14 @@ bool LLScriptFloaterManager::getFloaterPosition(const LLUUID& object_id, Floater return false; } +void LLScriptFloaterManager::setFloaterVisible(const LLUUID& notification_id, bool visible) +{ + LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>( + "script_floater", notification_id); + if(floater) + { + floater->setVisible(visible); + } +} + // EOF diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h index ec3ec4b540..dc0cfc2400 100644 --- a/indra/newview/llscriptfloater.h +++ b/indra/newview/llscriptfloater.h @@ -99,6 +99,8 @@ public: bool getFloaterPosition(const LLUUID& object_id, FloaterPositionInfo& fpi); + void setFloaterVisible(const LLUUID& notification_id, bool visible); + protected: typedef std::map<std::string, EObjectType> object_type_map; diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index abef47d4be..f38df19de0 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -197,8 +197,7 @@ void LLSidepanelAppearance::onFilterEdit(const std::string& search_string) mFilterSubString = search_string; // Searches are case-insensitive - LLStringUtil::toUpper(mFilterSubString); - LLStringUtil::trimHead(mFilterSubString); + // but we don't convert the typed string to upper-case so that it can be fed to the web search as-is. mPanelOutfitsInventory->onSearchEdit(mFilterSubString); } @@ -329,8 +328,8 @@ void LLSidepanelAppearance::updateVerbs() if (mPanelOutfitsInventory && !is_look_info_visible) { - const bool is_correct_type = (mPanelOutfitsInventory->getCorrectListenerForAction() != NULL); - mEditBtn->setEnabled(is_correct_type); +// const bool is_correct_type = (mPanelOutfitsInventory->getCorrectListenerForAction() != NULL); +// mEditBtn->setEnabled(is_correct_type); } else { diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 27b8ff0628..7ad7799515 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -564,7 +564,7 @@ bool idle_startup() gXferManager->setUseAckThrottling(TRUE); gXferManager->setAckThrottleBPS(xfer_throttle_bps); } - gAssetStorage = new LLViewerAssetStorage(msg, gXferManager, gVFS); + gAssetStorage = new LLViewerAssetStorage(msg, gXferManager, gVFS, gStaticVFS); F32 dropPercent = gSavedSettings.getF32("PacketDropPercentage"); diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp index dcc85392f7..15684337f4 100644 --- a/indra/newview/llteleporthistory.cpp +++ b/indra/newview/llteleporthistory.cpp @@ -136,6 +136,7 @@ void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos) if (mCurrentItem < 0 || mCurrentItem >= (int) mItems.size()) // sanity check { llwarns << "Invalid current item. (this should not happen)" << llendl; + llassert(!"Invalid current teleport histiry item"); return; } LLVector3 new_pos_local = gAgent.getPosAgentFromGlobal(new_pos); @@ -166,6 +167,17 @@ void LLTeleportHistory::onHistoryChanged() void LLTeleportHistory::purgeItems() { + if (mItems.size() == 0) // no entries yet (we're called before login) + { + // If we don't return here the history will get into inconsistent state, hence: + // 1) updateCurrentLocation() will malfunction, + // so further teleports will not properly update the history; + // 2) mHistoryChangedSignal subscribers will be notified + // of such an invalid change. (EXT-6798) + // Both should not happen. + return; + } + if (mItems.size() > 0) { mItems.erase(mItems.begin(), mItems.end()-1); diff --git a/indra/newview/llteleporthistorystorage.cpp b/indra/newview/llteleporthistorystorage.cpp index c635f91423..430d62e15e 100644 --- a/indra/newview/llteleporthistorystorage.cpp +++ b/indra/newview/llteleporthistorystorage.cpp @@ -89,6 +89,13 @@ void LLTeleportHistoryStorage::onTeleportHistoryChange() if (!th) return; + // Hacky sanity check. (EXT-6798) + if (th->getItems().size() == 0) + { + llassert(!"Inconsistent teleport history state"); + return; + } + const LLTeleportHistoryItem &item = th->getItems()[th->getCurrentItemIndex()]; addItem(item.mTitle, item.mGlobalPos); diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 2ea6e5936d..e64696b120 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -850,6 +850,7 @@ bool LLTextureFetchWorker::doWork(S32 param) mState = WAIT_HTTP_REQ; mFetcher->addToHTTPQueue(mID); + mSentRequest = QUEUED; // Will call callbackHttpGet when curl request completes std::vector<std::string> headers; headers.push_back("Accept: image/x-j2c"); @@ -936,6 +937,11 @@ bool LLTextureFetchWorker::doWork(S32 param) { mFileSize = mBufferSize; } + else //the file size is unknown + { + mFileSize = S32_MAX ; //flag the file is not fully loaded. + } + U8* buffer = new U8[mBufferSize]; if (cur_size > 0) { diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index 911ed6ade7..568cd4cb19 100644 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -67,6 +67,7 @@ LLToast::Params::Params() LLToast::LLToast(const LLToast::Params& p) : LLModalDialog(LLSD(), p.is_modal), mPanel(p.panel), + mToastLifetime(p.lifetime_secs), mToastFadingTime(p.fading_time_secs), mNotificationID(p.notif_id), mSessionID(p.session_id), @@ -119,30 +120,10 @@ BOOL LLToast::postBuild() mTimer->stop(); } - if (mIsTip) - { - mTextEditor = mPanel->getChild<LLTextEditor>("text_editor_box"); - - if (mTextEditor) - { - mTextEditor->setMouseUpCallback(boost::bind(&LLToast::hide,this)); - mPanel->setMouseUpCallback(boost::bind(&LLToast::handleTipToastClick, this, _2, _3, _4)); - } - } - return TRUE; } //-------------------------------------------------------------------------- -void LLToast::handleTipToastClick(S32 x, S32 y, MASK mask) -{ - if (!mTextEditor->getRect().pointInRect(x, y)) - { - hide(); - } -} - -//-------------------------------------------------------------------------- void LLToast::setHideButtonEnabled(bool enabled) { if(mHideBtn) @@ -261,6 +242,13 @@ void LLToast::draw() drawChild(mHideBtn); } } + + // if timer started and remaining time <= fading time + if (mTimer->getStarted() && (mToastLifetime + - mTimer->getEventTimer().getElapsedTimeF32()) <= mToastFadingTime) + { + setBackgroundOpaque(FALSE); + } } //-------------------------------------------------------------------------- @@ -421,4 +409,13 @@ bool LLToast::isNotificationValid() //-------------------------------------------------------------------------- +S32 LLToast::notifyParent(const LLSD& info) +{ + if (info.has("action") && "hide_toast" == info["action"].asString()) + { + hide(); + return 1; + } + return LLModalDialog::notifyParent(info); +} diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h index bd07ff9fb1..4211f21ef1 100644 --- a/indra/newview/lltoast.h +++ b/indra/newview/lltoast.h @@ -190,14 +190,14 @@ public: boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseEnterSignal.connect(cb); }; boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseLeaveSignal.connect(cb); }; + virtual S32 notifyParent(const LLSD& info); + private: void onToastMouseEnter(); void onToastMouseLeave(); - void handleTipToastClick(S32 x, S32 y, MASK mask); - void expire(); LLUUID mNotificationID; @@ -209,11 +209,11 @@ private: // timer counts a lifetime of a toast std::auto_ptr<LLToastLifeTimer> mTimer; + F32 mToastLifetime; // in seconds F32 mToastFadingTime; // in seconds LLPanel* mPanel; LLButton* mHideBtn; - LLTextEditor* mTextEditor; LLColor4 mBgColor; bool mCanFade; diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp index 986ccdf19b..2b529a4e50 100644 --- a/indra/newview/lltoastalertpanel.cpp +++ b/indra/newview/lltoastalertpanel.cpp @@ -50,6 +50,7 @@ #include "llnotifications.h" #include "llfunctorregistry.h" #include "llrootview.h" +#include "llviewercontrol.h" // for gSavedSettings const S32 MAX_ALLOWED_MSG_WIDTH = 400; const F32 DEFAULT_BUTTON_DELAY = 0.5f; @@ -279,7 +280,18 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal mLineEditor->reshape(leditor_rect.getWidth(), leditor_rect.getHeight()); mLineEditor->setRect(leditor_rect); mLineEditor->setText(edit_text_contents); - mLineEditor->setMaxTextLength(STD_STRING_STR_LEN - 1); + + // decrease limit of line editor of teleport offer dialog to avoid truncation of + // location URL in invitation message, see EXT-6891 + if ("OfferTeleport" == mNotification->getName()) + { + mLineEditor->setMaxTextLength(gSavedSettings.getS32( + "teleport_offer_invitation_max_length")); + } + else + { + mLineEditor->setMaxTextLength(STD_STRING_STR_LEN - 1); + } LLToastPanel::addChild(mLineEditor); diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index c9d2d404c0..089163929e 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -493,7 +493,7 @@ void LLToastNotifyPanel::onClickButton(void* data) { sButtonClickSignal(self->mNotification->getID(), button_name); - if(new_info) + if(new_info && !self->mNotification->isPersistent()) { self->mNotification->setResponseFunctor( boost::bind(&LLOfferInfo::inventory_offer_callback, new_info, _1, _2)); diff --git a/indra/newview/lltoastpanel.cpp b/indra/newview/lltoastpanel.cpp index d142a0665b..71598b3169 100644 --- a/indra/newview/lltoastpanel.cpp +++ b/indra/newview/lltoastpanel.cpp @@ -33,6 +33,7 @@ #include "llviewerprecompiledheaders.h" #include "llpanelgenerictip.h" +#include "llpanelonlinestatus.h" #include "llnotifications.h" #include "lltoastpanel.h" @@ -97,9 +98,19 @@ LLToastPanel* LLToastPanel::buidPanelFromNotification( { LLToastPanel* res = NULL; - if (notification->getName() == "SystemMessageTip") + //process tip toast panels + if ("notifytip" == notification->getType()) { - res = new LLPanelGenericTip(notification); + // if it is online/offline notification + if ("FriendOffline" == notification->getName() || "FriendOnline" == notification->getName()) + { + res = new LLPanelOnlineStatus(notification); + } + // in all other case we use generic tip panel + else + { + res = new LLPanelGenericTip(notification); + } } /* else if(...) diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp index bb49804aff..c3a6b7111b 100644 --- a/indra/newview/llviewerassetstorage.cpp +++ b/indra/newview/llviewerassetstorage.cpp @@ -41,15 +41,16 @@ #include "llagent.h" LLViewerAssetStorage::LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, - LLVFS *vfs, const LLHost &upstream_host) - : LLAssetStorage(msg, xfer, vfs, upstream_host) + LLVFS *vfs, LLVFS *static_vfs, + const LLHost &upstream_host) + : LLAssetStorage(msg, xfer, vfs, static_vfs, upstream_host) { } LLViewerAssetStorage::LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, - LLVFS *vfs) - : LLAssetStorage(msg, xfer, vfs) + LLVFS *vfs, LLVFS *static_vfs) + : LLAssetStorage(msg, xfer, vfs, static_vfs) { } diff --git a/indra/newview/llviewerassetstorage.h b/indra/newview/llviewerassetstorage.h index 512b590a1b..8e7ea3471d 100644 --- a/indra/newview/llviewerassetstorage.h +++ b/indra/newview/llviewerassetstorage.h @@ -42,10 +42,10 @@ class LLViewerAssetStorage : public LLAssetStorage { public: LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, - LLVFS *vfs, const LLHost &upstream_host); + LLVFS *vfs, LLVFS *static_vfs, const LLHost &upstream_host); LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, - LLVFS *vfs); + LLVFS *vfs, LLVFS *static_vfs); using LLAssetStorage::storeAssetData; virtual void storeAssetData( diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index 2661c9f32b..9559311e3c 100644 --- a/indra/newview/llvieweraudio.cpp +++ b/indra/newview/llvieweraudio.cpp @@ -145,7 +145,7 @@ void audio_update_volume(bool force_update) { F32 music_volume = gSavedSettings.getF32("AudioLevelMusic"); BOOL music_muted = gSavedSettings.getBOOL("MuteMusic"); - music_volume = mute_volume * master_volume * (music_volume*music_volume); + music_volume = mute_volume * master_volume * music_volume; gAudiop->setInternetStreamGain ( music_muted ? 0.f : music_volume ); } @@ -153,7 +153,7 @@ void audio_update_volume(bool force_update) // Streaming Media F32 media_volume = gSavedSettings.getF32("AudioLevelMedia"); BOOL media_muted = gSavedSettings.getBOOL("MuteMedia"); - media_volume = mute_volume * master_volume * (media_volume*media_volume); + media_volume = mute_volume * master_volume * media_volume; LLViewerMedia::setVolume( media_muted ? 0.0f : media_volume ); // Voice diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 8a891b1462..b39ee8b2e0 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -67,6 +67,40 @@ #include "llviewermessage.h" ///---------------------------------------------------------------------------- +/// Helper class to store special inventory item names +///---------------------------------------------------------------------------- +class LLLocalizedInventoryItemsDictionary : public LLSingleton<LLLocalizedInventoryItemsDictionary> +{ +public: + std::map<std::string, std::string> mInventoryItemsDict; + + LLLocalizedInventoryItemsDictionary() + { + mInventoryItemsDict["New Shape"] = LLTrans::getString("New Shape"); + mInventoryItemsDict["New Skin"] = LLTrans::getString("New Skin"); + mInventoryItemsDict["New Hair"] = LLTrans::getString("New Hair"); + mInventoryItemsDict["New Eyes"] = LLTrans::getString("New Eyes"); + mInventoryItemsDict["New Shirt"] = LLTrans::getString("New Shirt"); + mInventoryItemsDict["New Pants"] = LLTrans::getString("New Pants"); + mInventoryItemsDict["New Shoes"] = LLTrans::getString("New Shoes"); + mInventoryItemsDict["New Socks"] = LLTrans::getString("New Socks"); + mInventoryItemsDict["New Jacket"] = LLTrans::getString("New Jacket"); + mInventoryItemsDict["New Gloves"] = LLTrans::getString("New Gloves"); + mInventoryItemsDict["New Undershirt"] = LLTrans::getString("New Undershirt"); + mInventoryItemsDict["New Underpants"] = LLTrans::getString("New Underpants"); + mInventoryItemsDict["New Skirt"] = LLTrans::getString("New Skirt"); + mInventoryItemsDict["New Alpha"] = LLTrans::getString("New Alpha"); + mInventoryItemsDict["New Tattoo"] = LLTrans::getString("New Tattoo"); + mInventoryItemsDict["Invalid Wearable"] = LLTrans::getString("Invalid Wearable"); + + mInventoryItemsDict["New Script"] = LLTrans::getString("New Script"); + mInventoryItemsDict["New Folder"] = LLTrans::getString("New Folder"); + mInventoryItemsDict["Contents"] = LLTrans::getString("Contents"); + } +}; + + +///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs ///---------------------------------------------------------------------------- @@ -316,6 +350,18 @@ BOOL LLViewerInventoryItem::unpackMessage(LLSD item) BOOL LLViewerInventoryItem::unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num) { BOOL rv = LLInventoryItem::unpackMessage(msg, block, block_num); + + std::string localized_str; + + std::map<std::string, std::string>::const_iterator dictionary_iter; + + dictionary_iter = LLLocalizedInventoryItemsDictionary::getInstance()->mInventoryItemsDict.find(mName); + + if(dictionary_iter != LLLocalizedInventoryItemsDictionary::getInstance()->mInventoryItemsDict.end()) + { + mName = dictionary_iter->second; + } + mIsComplete = TRUE; return rv; } @@ -867,6 +913,25 @@ void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id, U32 next_owner_perm, LLPointer<LLInventoryCallback> cb) { + //check if name is equal to one of special inventory items names + //EXT-5839 + std::string server_name = name; + + { + std::map<std::string, std::string>::const_iterator dictionary_iter; + + for (dictionary_iter = LLLocalizedInventoryItemsDictionary::getInstance()->mInventoryItemsDict.begin(); + dictionary_iter != LLLocalizedInventoryItemsDictionary::getInstance()->mInventoryItemsDict.end(); + dictionary_iter++) + { + const std::string& localized_name = dictionary_iter->second; + if(localized_name == name) + { + server_name = dictionary_iter->first; + } + } + } + LLMessageSystem* msg = gMessageSystem; msg->newMessageFast(_PREHASH_CreateInventoryItem); msg->nextBlock(_PREHASH_AgentData); @@ -880,7 +945,7 @@ void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id, msg->addS8Fast(_PREHASH_Type, (S8)asset_type); msg->addS8Fast(_PREHASH_InvType, (S8)inv_type); msg->addU8Fast(_PREHASH_WearableType, (U8)wtype); - msg->addStringFast(_PREHASH_Name, name); + msg->addStringFast(_PREHASH_Name, server_name); msg->addStringFast(_PREHASH_Description, desc); gAgent.sendReliableMessage(); @@ -923,6 +988,7 @@ void link_inventory_item( const LLUUID& item_id, const LLUUID& parent_id, const std::string& new_name, + const std::string& new_description, const LLAssetType::EType asset_type, LLPointer<LLInventoryCallback> cb) { @@ -948,7 +1014,6 @@ void link_inventory_item( } LLUUID transaction_id; - std::string desc = "Broken link"; // This should only show if the object can't find its baseobj. LLInventoryType::EType inv_type = LLInventoryType::IT_NONE; if (dynamic_cast<const LLInventoryCategory *>(baseobj)) { @@ -979,7 +1044,7 @@ void link_inventory_item( msg->addS8Fast(_PREHASH_Type, (S8)asset_type); msg->addS8Fast(_PREHASH_InvType, (S8)inv_type); msg->addStringFast(_PREHASH_Name, new_name); - msg->addStringFast(_PREHASH_Description, desc); + msg->addStringFast(_PREHASH_Description, new_description); } gAgent.sendReliableMessage(); } diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 9d449399e8..f296ce35ff 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -339,6 +339,7 @@ void link_inventory_item( const LLUUID& item_id, const LLUUID& parent_id, const std::string& new_name, + const std::string& new_description, const LLAssetType::EType asset_type, LLPointer<LLInventoryCallback> cb); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 58138d9917..3c0345df90 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -2245,7 +2245,7 @@ void LLViewerMediaImpl::navigateInternal() // This helps in supporting legacy media content where the server the media resides on returns a bogus MIME type // but the parcel owner has correctly set the MIME type in the parcel media settings. - if(!mMimeType.empty() && (mMimeType != "none/none")) + if(!mMimeType.empty() && (mMimeType != LLMIMETypes::getDefaultMimeType())) { std::string plugin_basename = LLMIMETypes::implType(mMimeType); if(!plugin_basename.empty()) diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index bc6716697e..e829d7a5b4 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -46,12 +46,6 @@ #include "llurl.h" - -#if defined(LL_DARWIN) || (LL_WINDOWS && !LL_RELEASE_FOR_DOWNLOAD ) -#define PER_MEDIA_VOLUME -#endif - - class LLViewerMediaImpl; class LLUUID; class LLViewerMediaTexture; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 08462f4e58..5dd9623955 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -794,7 +794,10 @@ private: // Store selected items (without destination folder) mSelectedItems.clear(); - mActivePanel->getRootFolder()->getSelectionList(mSelectedItems); + if (mActivePanel) + { + mActivePanel->getRootFolder()->getSelectionList(mSelectedItems); + } mSelectedItems.erase(mMoveIntoFolderID); } @@ -1032,21 +1035,26 @@ bool check_offer_throttle(const std::string& from_name, bool check_only) { // Use the name of the last item giver, who is probably the person // spamming you. - std::ostringstream message; - message << LLAppViewer::instance()->getSecondLifeTitle(); + + LLStringUtil::format_map_t arg; + std::string log_msg; + std::ostringstream time ; + time<<OFFER_THROTTLE_TIME; + + arg["APP_NAME"] = LLAppViewer::instance()->getSecondLifeTitle(); + arg["TIME"] = time.str(); + if (!from_name.empty()) { - message << ": Items coming in too fast from " << from_name; + arg["FROM_NAME"] = from_name; + log_msg = LLTrans::getString("ItemsComingInTooFastFrom", arg); } else { - message << ": Items coming in too fast"; + log_msg = LLTrans::getString("ItemsComingInTooFast", arg); } - message << ", automatic preview disabled for " - << OFFER_THROTTLE_TIME << " seconds."; //this is kinda important, so actually put it on screen - std::string log_msg = message.str(); LLSD args; args["MESSAGE"] = log_msg; LLNotificationsUtil::add("SystemMessage", args); @@ -1244,6 +1252,16 @@ void inventory_offer_mute_callback(const LLUUID& blocked_id, gSavedSettings.getString("NotificationChannelUUID")), OfferMatcher(blocked_id)); } +LLOfferInfo::LLOfferInfo() + : LLNotificationResponderInterface() + , mFromGroup(FALSE) + , mFromObject(FALSE) + , mIM(IM_NOTHING_SPECIAL) + , mType(LLAssetType::AT_NONE) + , mPersist(false) +{ +} + LLOfferInfo::LLOfferInfo(const LLSD& sd) { mIM = (EInstantMessage)sd["im_type"].asInteger(); @@ -1257,6 +1275,7 @@ LLOfferInfo::LLOfferInfo(const LLSD& sd) mFromName = sd["from_name"].asString(); mDesc = sd["description"].asString(); mHost = LLHost(sd["sender"].asString()); + mPersist = sd["persist"].asBoolean(); } LLOfferInfo::LLOfferInfo(const LLOfferInfo& info) @@ -1272,6 +1291,7 @@ LLOfferInfo::LLOfferInfo(const LLOfferInfo& info) mFromName = info.mFromName; mDesc = info.mDesc; mHost = info.mHost; + mPersist = info.mPersist; } LLSD LLOfferInfo::asLLSD() @@ -1288,9 +1308,15 @@ LLSD LLOfferInfo::asLLSD() sd["from_name"] = mFromName; sd["description"] = mDesc; sd["sender"] = mHost.getIPandPort(); + sd["persist"] = mPersist; return sd; } +void LLOfferInfo::fromLLSD(const LLSD& params) +{ + *this = params; +} + void LLOfferInfo::send_auto_receive_response(void) { LLMessageSystem* msg = gMessageSystem; @@ -1330,6 +1356,21 @@ void LLOfferInfo::send_auto_receive_response(void) } } +void LLOfferInfo::handleRespond(const LLSD& notification, const LLSD& response) +{ + initRespondFunctionMap(); + + const std::string name = notification["name"].asString(); + if(mRespondFunctions.find(name) == mRespondFunctions.end()) + { + llwarns << "Unexpected notification name : " << name << llendl; + llassert(!"Unexpected notification name"); + return; + } + + mRespondFunctions[name](notification, response); +} + bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& response) { LLChat chat; @@ -1466,7 +1507,10 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& gInventory.addObserver(opener); } - delete this; + if(!mPersist) + { + delete this; + } return false; } @@ -1632,7 +1676,10 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const gInventory.addObserver(opener); } - delete this; + if(!mPersist) + { + delete this; + } return false; } @@ -1648,6 +1695,16 @@ protected: } }; +void LLOfferInfo::initRespondFunctionMap() +{ + if(mRespondFunctions.empty()) + { + mRespondFunctions["ObjectGiveItem"] = boost::bind(&LLOfferInfo::inventory_task_offer_callback, this, _1, _2); + mRespondFunctions["ObjectGiveItemUnknownUser"] = boost::bind(&LLOfferInfo::inventory_task_offer_callback, this, _1, _2); + mRespondFunctions["UserGiveItem"] = boost::bind(&LLOfferInfo::inventory_offer_callback, this, _1, _2); + } +} + void inventory_offer_handler(LLOfferInfo* info) { //Until throttling is implmented, busy mode should reject inventory instead of silently @@ -1764,7 +1821,8 @@ void inventory_offer_handler(LLOfferInfo* info) // Inventory Slurls don't currently work for non agent transfers, so only display the object name. args["ITEM_SLURL"] = msg; // Note: sets inventory_task_offer_callback as the callback - p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_task_offer_callback, info, _1, _2)); + p.substitutions(args).payload(payload).functor.responder(LLNotificationResponderPtr(info)); + info->mPersist = true; p.name = name_found ? "ObjectGiveItem" : "ObjectGiveItemUnknownUser"; // Pop up inv offer chiclet and let the user accept (keep), or reject (and silently delete) the inventory. LLNotifications::instance().add(p); @@ -1776,7 +1834,8 @@ void inventory_offer_handler(LLOfferInfo* info) // *TODO fix memory leak // inventory_offer_callback() is not invoked if user received notification and // closes viewer(without responding the notification) - p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, info, _1, _2)); + p.substitutions(args).payload(payload).functor.responder(LLNotificationResponderPtr(info)); + info->mPersist = true; p.name = "UserGiveItem"; // Prefetch the item into your local inventory. @@ -1797,10 +1856,8 @@ void inventory_offer_handler(LLOfferInfo* info) // Inform user that there is a script floater via toast system { payload["give_inventory_notification"] = TRUE; - LLNotification::Params params(p.name); - params.substitutions = p.substitutions; - params.payload = p.payload; - LLPostponedNotification::add<LLPostponedOfferNotification>( params, info->mFromID, false); + p.payload = payload; + LLPostponedNotification::add<LLPostponedOfferNotification>(p, info->mFromID, false); } } } @@ -1877,7 +1934,7 @@ protected: } }; -static void parse_lure_bucket(const std::string& bucket, +static bool parse_lure_bucket(const std::string& bucket, U64& region_handle, LLVector3& pos, LLVector3& look_at, @@ -1889,15 +1946,25 @@ static void parse_lure_bucket(const std::string& bucket, tokenizer tokens(bucket, sep); tokenizer::iterator iter = tokens.begin(); - S32 gx = boost::lexical_cast<S32>((*(iter)).c_str()); - S32 gy = boost::lexical_cast<S32>((*(++iter)).c_str()); - S32 rx = boost::lexical_cast<S32>((*(++iter)).c_str()); - S32 ry = boost::lexical_cast<S32>((*(++iter)).c_str()); - S32 rz = boost::lexical_cast<S32>((*(++iter)).c_str()); - S32 lx = boost::lexical_cast<S32>((*(++iter)).c_str()); - S32 ly = boost::lexical_cast<S32>((*(++iter)).c_str()); - S32 lz = boost::lexical_cast<S32>((*(++iter)).c_str()); - + S32 gx,gy,rx,ry,rz,lx,ly,lz; + try + { + gx = boost::lexical_cast<S32>((*(iter)).c_str()); + gy = boost::lexical_cast<S32>((*(++iter)).c_str()); + rx = boost::lexical_cast<S32>((*(++iter)).c_str()); + ry = boost::lexical_cast<S32>((*(++iter)).c_str()); + rz = boost::lexical_cast<S32>((*(++iter)).c_str()); + lx = boost::lexical_cast<S32>((*(++iter)).c_str()); + ly = boost::lexical_cast<S32>((*(++iter)).c_str()); + lz = boost::lexical_cast<S32>((*(++iter)).c_str()); + } + catch( boost::bad_lexical_cast& ) + { + LL_WARNS("parse_lure_bucket") + << "Couldn't parse lure bucket." + << LL_ENDL; + return false; + } // Grab region access region_access = SIM_ACCESS_MIN; if (++iter != tokens.end()) @@ -1922,6 +1989,7 @@ static void parse_lure_bucket(const std::string& bucket, look_at.setVec((F32)lx, (F32)ly, (F32)lz); region_handle = to_region_handle(gx, gy); + return true; } void process_improved_im(LLMessageSystem *msg, void **user_data) @@ -2481,7 +2549,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) // Note: lie to Nearby Chat, pretending that this is NOT an IM, because // IMs from obejcts don't open IM sessions. LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); - if(nearby_chat) + if(SYSTEM_FROM != name && nearby_chat) { LLSD args; args["owner_id"] = from_id; @@ -2559,15 +2627,21 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) U64 region_handle; U8 region_access; std::string region_info = ll_safe_string((char*)binary_bucket, binary_bucket_size); - parse_lure_bucket(region_info, region_handle, pos, look_at, region_access); + std::string region_access_str = LLStringUtil::null; + std::string region_access_icn = LLStringUtil::null; - std::string region_access_str = LLViewerRegion::accessToString(region_access); + if (parse_lure_bucket(region_info, region_handle, pos, look_at, region_access)) + { + region_access_str = LLViewerRegion::accessToString(region_access); + region_access_icn = LLViewerRegion::getAccessIcon(region_access); + } LLSD args; // *TODO: Translate -> [FIRST] [LAST] (maybe) args["NAME_SLURL"] = LLSLURL::buildCommand("agent", from_id, "about"); args["MESSAGE"] = message; - args["MATURITY"] = region_access_str; + args["MATURITY_STR"] = region_access_str; + args["MATURITY_ICON"] = region_access_icn; LLSD payload; payload["from_id"] = from_id; payload["lure_id"] = session_id; diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h index 7c021dc05f..72ad3c8926 100644 --- a/indra/newview/llviewermessage.h +++ b/indra/newview/llviewermessage.h @@ -40,6 +40,7 @@ #include "lluuid.h" #include "message.h" #include "stdenums.h" +#include "llnotifications.h" // // Forward declarations @@ -210,11 +211,10 @@ bool highlight_offered_item(const LLUUID& item_id); void set_dad_inventory_item(LLInventoryItem* inv_item, const LLUUID& into_folder_uuid); -struct LLOfferInfo +class LLOfferInfo : public LLNotificationResponderInterface { - LLOfferInfo() - : mFromGroup(FALSE), mFromObject(FALSE), - mIM(IM_NOTHING_SPECIAL), mType(LLAssetType::AT_NONE) {}; +public: + LLOfferInfo(); LLOfferInfo(const LLSD& sd); LLOfferInfo(const LLOfferInfo& info); @@ -232,12 +232,27 @@ struct LLOfferInfo std::string mFromName; std::string mDesc; LLHost mHost; + bool mPersist; + + // LLNotificationResponderInterface implementation + /*virtual*/ LLSD asLLSD(); + /*virtual*/ void fromLLSD(const LLSD& params); + /*virtual*/ void handleRespond(const LLSD& notification, const LLSD& response); - LLSD asLLSD(); void send_auto_receive_response(void); + + // TODO - replace all references with handleRespond() bool inventory_offer_callback(const LLSD& notification, const LLSD& response); bool inventory_task_offer_callback(const LLSD& notification, const LLSD& response); +private: + + void initRespondFunctionMap(); + + typedef boost::function<bool (const LLSD&, const LLSD&)> respond_function_t; + typedef std::map<std::string, respond_function_t> respond_function_map_t; + + respond_function_map_t mRespondFunctions; }; void process_feature_disabled_message(LLMessageSystem* msg, void**); diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp index b967436df6..202f8822e3 100644 --- a/indra/newview/llviewerparcelmedia.cpp +++ b/indra/newview/llviewerparcelmedia.cpp @@ -35,6 +35,7 @@ #include "llagent.h" #include "llaudioengine.h" +#include "llmimetypes.h" #include "llviewercontrol.h" #include "llviewermedia.h" #include "llviewerregion.h" @@ -212,7 +213,7 @@ void LLViewerParcelMedia::play(LLParcel* parcel) } // Don't ever try to play if the media type is set to "none/none" - if(stricmp(mime_type.c_str(), "none/none") != 0) + if(stricmp(mime_type.c_str(), LLMIMETypes::getDefaultMimeType().c_str()) != 0) { if(!sMediaImpl) { @@ -306,7 +307,7 @@ LLPluginClassMediaOwner::EMediaStatus LLViewerParcelMedia::getStatus() // static std::string LLViewerParcelMedia::getMimeType() { - return sMediaImpl.notNull() ? sMediaImpl->getMimeType() : "none/none"; + return sMediaImpl.notNull() ? sMediaImpl->getMimeType() : LLMIMETypes::getDefaultMimeType(); } //static @@ -316,7 +317,7 @@ std::string LLViewerParcelMedia::getURL() if(sMediaImpl.notNull()) url = sMediaImpl->getMediaURL(); - if(stricmp(LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaType().c_str(), "none/none") != 0) + if(stricmp(LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaType().c_str(), LLMIMETypes::getDefaultMimeType().c_str()) != 0) { if (url.empty()) url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaCurrentURL(); diff --git a/indra/newview/llviewerparcelmediaautoplay.cpp b/indra/newview/llviewerparcelmediaautoplay.cpp index f55d6d89c4..032ad6635a 100644 --- a/indra/newview/llviewerparcelmediaautoplay.cpp +++ b/indra/newview/llviewerparcelmediaautoplay.cpp @@ -42,6 +42,7 @@ #include "message.h" #include "llviewertexturelist.h" // for texture stats #include "llagent.h" +#include "llmimetypes.h" const F32 AUTOPLAY_TIME = 5; // how many seconds before we autoplay const F32 AUTOPLAY_SIZE = 24*24; // how big the texture must be (pixel area) before we autoplay @@ -126,7 +127,7 @@ BOOL LLViewerParcelMediaAutoPlay::tick() if ((!mPlayed) && // if we've never played (mTimeInParcel > AUTOPLAY_TIME) && // and if we've been here for so many seconds (!this_media_url.empty()) && // and if the parcel has media - (stricmp(this_media_type.c_str(), "none/none") != 0) && + (stricmp(this_media_type.c_str(), LLMIMETypes::getDefaultMimeType().c_str()) != 0) && (LLViewerParcelMedia::sMediaImpl.isNull())) // and if the media is not already playing { if (this_media_texture_id.notNull()) // and if the media texture is good diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 07d4ac664f..c48668df9a 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -627,6 +627,26 @@ std::string LLViewerRegion::accessToString(U8 sim_access) } // static +std::string LLViewerRegion::getAccessIcon(U8 sim_access) +{ + switch(sim_access) + { + case SIM_ACCESS_MATURE: + return "Parcel_M_Dark"; + + case SIM_ACCESS_ADULT: + return "Parcel_R_Light"; + + case SIM_ACCESS_PG: + return "Parcel_PG_Light"; + + case SIM_ACCESS_MIN: + default: + return ""; + } +} + +// static std::string LLViewerRegion::accessToShortString(U8 sim_access) { switch(sim_access) /* Flawfinder: ignore */ diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 49d0900f2a..5c4d5a61fd 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -203,6 +203,9 @@ public: // Returns "M", "PG", "A" etc. static std::string accessToShortString(U8 sim_access); + + // Return access icon name + static std::string getAccessIcon(U8 sim_access); // helper function which just makes sure all interested parties // can process the message. diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index a5adb11c53..c883087cf2 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1564,10 +1564,6 @@ F32 LLViewerFetchedTexture::calcDecodePriority() // larger mips are corrupted priority = -3.0f; } - else if (cur_discard <= mDesiredDiscardLevel) - { - priority = -4.0f; - } else { // priority range = 100,000 - 500,000 diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 5100f4e59a..3f021d1f84 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1,6 +1,6 @@ /** * @File llvoavatar.cpp - * @brief Implementation of LLVOAvatar class which is a derivation fo LLViewerObject + * @brief Implementation of LLVOAvatar class which is a derivation of LLViewerObject * * $LicenseInfo:firstyear=2001&license=viewergpl$ * diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 8da4c226ed..c80d59966c 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -1,6 +1,6 @@ /** * @file llvoavatar.h - * @brief Declaration of LLVOAvatar class which is a derivation fo + * @brief Declaration of LLVOAvatar class which is a derivation of * LLViewerObject * * $LicenseInfo:firstyear=2001&license=viewergpl$ diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 7473adda1f..63f060b58a 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -2238,7 +2238,6 @@ LLGLuint LLVOAvatarSelf::getScratchTexName( LLGLenum format, S32& components, U3 { case GL_LUMINANCE: components = 1; internal_format = GL_LUMINANCE8; break; case GL_ALPHA: components = 1; internal_format = GL_ALPHA8; break; - case GL_COLOR_INDEX: components = 1; internal_format = GL_COLOR_INDEX8_EXT; break; case GL_LUMINANCE_ALPHA: components = 2; internal_format = GL_LUMINANCE8_ALPHA8; break; case GL_RGB: components = 3; internal_format = GL_RGB8; break; case GL_RGBA: components = 4; internal_format = GL_RGBA8; break; diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp new file mode 100644 index 0000000000..3d110dcc78 --- /dev/null +++ b/indra/newview/llwearableitemslist.cpp @@ -0,0 +1,91 @@ +/** + * @file llwearableitemslist.cpp + * @brief A flat list of wearable items. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, 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 "llwearableitemslist.h" + +#include "llinventoryfunctions.h" +#include "llinventorymodel.h" + +class LLFindOutfitItems : public LLInventoryCollectFunctor +{ +public: + LLFindOutfitItems() {} + virtual ~LLFindOutfitItems() {} + virtual bool operator()(LLInventoryCategory* cat, + LLInventoryItem* item); +}; + +bool LLFindOutfitItems::operator()(LLInventoryCategory* cat, + LLInventoryItem* item) +{ + if(item) + { + if((item->getType() == LLAssetType::AT_CLOTHING) + || (item->getType() == LLAssetType::AT_BODYPART) + || (item->getType() == LLAssetType::AT_OBJECT)) + { + return TRUE; + } + } + return FALSE; +} + +static const LLDefaultChildRegistry::Register<LLWearableItemsList> r("wearable_items_list"); + +LLWearableItemsList::Params::Params() +{} + +LLWearableItemsList::LLWearableItemsList(const LLWearableItemsList::Params& p) +: LLInventoryItemsList(p) +{} + +// virtual +LLWearableItemsList::~LLWearableItemsList() +{} + +void LLWearableItemsList::updateList(const LLUUID& category_id) +{ + LLInventoryModel::cat_array_t cat_array; + LLInventoryModel::item_array_t item_array; + + LLFindOutfitItems collector = LLFindOutfitItems(); + // collectDescendentsIf takes non-const reference: + gInventory.collectDescendentsIf( + category_id, + cat_array, + item_array, + LLInventoryModel::EXCLUDE_TRASH, + collector); + + refreshList(item_array); +} diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h new file mode 100644 index 0000000000..e7ccba8e6c --- /dev/null +++ b/indra/newview/llwearableitemslist.h @@ -0,0 +1,65 @@ +/** + * @file llwearableitemslist.h + * @brief A flat list of wearable items. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, 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_LLWEARABLEITEMSLIST_H +#define LL_LLWEARABLEITEMSLIST_H + +#include "llpanel.h" + +// newview +#include "llinventoryitemslist.h" + +/** + * @class LLWearableItemsList + * + * A flat list of wearable inventory items. + * Collects all items that can be a part of an outfit from + * an inventory category specified by UUID and displays them + * as a flat list. + */ +class LLWearableItemsList : public LLInventoryItemsList +{ +public: + struct Params : public LLInitParam::Block<Params, LLInventoryItemsList::Params> + { + Params(); + }; + + virtual ~LLWearableItemsList(); + + void updateList(const LLUUID& category_id); + +protected: + friend class LLUICtrlFactory; + LLWearableItemsList(const LLWearableItemsList::Params& p); +}; + +#endif //LL_LLWEARABLEITEMSLIST_H diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp index b2de31218b..20266706da 100644 --- a/indra/newview/llwearablelist.cpp +++ b/indra/newview/llwearablelist.cpp @@ -235,9 +235,7 @@ LLWearable* LLWearableList::createNewWearable( EWearableType type ) LLWearable *wearable = generateNewWearable(); wearable->setType( type ); - LLSD item_name = LLSD().with("[WEARABLE_ITEM]", wearable->getTypeLabel()); - std::string name = LLTrans::getString("NewWearable"); - LLStringUtil::format(name, item_name); + std::string name = LLTrans::getString( LLWearableDictionary::getTypeDefaultNewName(wearable->getType()) ); wearable->setName( name ); LLPermissions perm; diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 151180aae7..081a3721b1 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -1072,18 +1072,10 @@ BOOL LLWorldMapView::handleToolTip( S32 x, S32 y, MASK mask ) // zoomed out, so don't display anything about the count. JC if (agent_count > 0) { - // Merov: i18n horror!!! Even using gettext(), concatenating strings is not localizable. - // The singular/plural switch form here under might make no sense in some languages. Don't do that. - message += llformat("\n%d ", agent_count); - - if (agent_count == 1) - { - message += "person"; - } - else - { - message += "people"; - } + LLStringUtil::format_map_t string_args; + string_args["[NUMBER]"] = llformat("%d", agent_count); + message += '\n'; + message += getString((agent_count == 1 ? "world_map_person" : "world_map_people") , string_args); } } tooltip_msg.assign( message ); diff --git a/indra/newview/skins/default/textures/icons/Progress_1.png b/indra/newview/skins/default/textures/icons/Progress_1.png Binary files differnew file mode 100644 index 0000000000..5d6efbfa2a --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_1.png diff --git a/indra/newview/skins/default/textures/icons/Progress_10.png b/indra/newview/skins/default/textures/icons/Progress_10.png Binary files differnew file mode 100644 index 0000000000..28203324f1 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_10.png diff --git a/indra/newview/skins/default/textures/icons/Progress_11.png b/indra/newview/skins/default/textures/icons/Progress_11.png Binary files differnew file mode 100644 index 0000000000..6b87be0c3f --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_11.png diff --git a/indra/newview/skins/default/textures/icons/Progress_12.png b/indra/newview/skins/default/textures/icons/Progress_12.png Binary files differnew file mode 100644 index 0000000000..089d58b090 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_12.png diff --git a/indra/newview/skins/default/textures/icons/Progress_2.png b/indra/newview/skins/default/textures/icons/Progress_2.png Binary files differnew file mode 100644 index 0000000000..94cb73b1f7 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_2.png diff --git a/indra/newview/skins/default/textures/icons/Progress_3.png b/indra/newview/skins/default/textures/icons/Progress_3.png Binary files differnew file mode 100644 index 0000000000..a04a5b5263 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_3.png diff --git a/indra/newview/skins/default/textures/icons/Progress_4.png b/indra/newview/skins/default/textures/icons/Progress_4.png Binary files differnew file mode 100644 index 0000000000..a467098d82 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_4.png diff --git a/indra/newview/skins/default/textures/icons/Progress_5.png b/indra/newview/skins/default/textures/icons/Progress_5.png Binary files differnew file mode 100644 index 0000000000..ea64f1d907 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_5.png diff --git a/indra/newview/skins/default/textures/icons/Progress_6.png b/indra/newview/skins/default/textures/icons/Progress_6.png Binary files differnew file mode 100644 index 0000000000..fe4447935f --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_6.png diff --git a/indra/newview/skins/default/textures/icons/Progress_7.png b/indra/newview/skins/default/textures/icons/Progress_7.png Binary files differnew file mode 100644 index 0000000000..64fa294771 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_7.png diff --git a/indra/newview/skins/default/textures/icons/Progress_8.png b/indra/newview/skins/default/textures/icons/Progress_8.png Binary files differnew file mode 100644 index 0000000000..a1c9a7f2eb --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_8.png diff --git a/indra/newview/skins/default/textures/icons/Progress_9.png b/indra/newview/skins/default/textures/icons/Progress_9.png Binary files differnew file mode 100644 index 0000000000..f3e9723184 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_9.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 84a99ba92a..bbb82d86b1 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -580,4 +580,17 @@ with the same filename but different name <texture name="default_profile_picture.j2c" /> <texture name="locked_image.j2c" /> + <texture name="Progress_1" file_name="icons/Progress_1.png" preload="true" /> + <texture name="Progress_2" file_name="icons/Progress_2.png" preload="true" /> + <texture name="Progress_3" file_name="icons/Progress_3.png" preload="true" /> + <texture name="Progress_4" file_name="icons/Progress_4.png" preload="true" /> + <texture name="Progress_5" file_name="icons/Progress_5.png" preload="true" /> + <texture name="Progress_6" file_name="icons/Progress_6.png" preload="true" /> + <texture name="Progress_7" file_name="icons/Progress_7.png" preload="true" /> + <texture name="Progress_8" file_name="icons/Progress_8.png" preload="true" /> + <texture name="Progress_9" file_name="icons/Progress_9.png" preload="true" /> + <texture name="Progress_10" file_name="icons/Progress_10.png" preload="true" /> + <texture name="Progress_11" file_name="icons/Progress_11.png" preload="true" /> + <texture name="Progress_12" file_name="icons/Progress_12.png" preload="true" /> + </textures> diff --git a/indra/newview/skins/default/xui/da/floater_customize.xml b/indra/newview/skins/default/xui/da/floater_customize.xml index b8b4b03277..a47e0d33df 100644 --- a/indra/newview/skins/default/xui/da/floater_customize.xml +++ b/indra/newview/skins/default/xui/da/floater_customize.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="UDSEENDE" width="509"> - <tab_container name="customize tab container" width="507"> +<floater name="floater customize" title="UDSEENDE"> + <tab_container name="customize tab container"> <text label="Krops Dele" name="body_parts_placeholder"> Kropsdele </text> @@ -522,7 +522,7 @@ <button label="Vend tilbage" label_selected="Vend tilbage" name="Revert"/> </panel> </tab_container> - <scroll_container left="212" name="panel_container"/> + <scroll_container name="panel_container"/> <button label="Script info" label_selected="Script info" name="script_info" tool_tip="Vis scripts vedhæftet på din avatar"/> <button label="Lav sæt" label_selected="Lav sæt" name="make_outfit_btn"/> <button label="Annullér" label_selected="Annullér" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/da/menu_viewer.xml b/indra/newview/skins/default/xui/da/menu_viewer.xml index 7e7d1b190a..be57f88e8a 100644 --- a/indra/newview/skins/default/xui/da/menu_viewer.xml +++ b/indra/newview/skins/default/xui/da/menu_viewer.xml @@ -119,6 +119,7 @@ <menu_item_call label="[SECOND_LIFE] Help" name="Second Life Help"/> <menu_item_call label="Rapporter misbrug" name="Report Abuse"/> <menu_item_call label="Rapportér fejl" name="Report Bug"/> + <menu_item_call label="Om [APP_NAME]" name="About Second Life"/> </menu> <menu label="Avanceret" name="Advanced"> <menu_item_call label="Stop animering af min avatar" name="Stop Animating My Avatar"/> diff --git a/indra/newview/skins/default/xui/de/floater_about_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml index 5322febe27..38e72dbadf 100644 --- a/indra/newview/skins/default/xui/de/floater_about_land.xml +++ b/indra/newview/skins/default/xui/de/floater_about_land.xml @@ -264,7 +264,7 @@ werden. <text left="204" name="selected_objects_text" width="48"> [COUNT] </text> - <text left="4" name="Autoreturn" width="410"> + <text name="Autoreturn"> Objekte anderer Einwohner automatisch zurückgeben (Minuten, 0 für aus): </text> <line_editor name="clean other time" right="-10" width="56"/> diff --git a/indra/newview/skins/default/xui/de/floater_buy_object.xml b/indra/newview/skins/default/xui/de/floater_buy_object.xml index b23163b4a3..c697014b04 100644 --- a/indra/newview/skins/default/xui/de/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/de/floater_buy_object.xml @@ -6,7 +6,7 @@ <text name="buy_text"> [AMOUNT] L$ von [NAME] kaufen? </text> - <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn" width="73"/> + <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/> <button label="Kaufen" label_selected="Kaufen" name="buy_btn"/> <text name="title_buy_text"> Kaufen diff --git a/indra/newview/skins/default/xui/de/floater_customize.xml b/indra/newview/skins/default/xui/de/floater_customize.xml index f284d7cd6b..3651577797 100644 --- a/indra/newview/skins/default/xui/de/floater_customize.xml +++ b/indra/newview/skins/default/xui/de/floater_customize.xml @@ -81,7 +81,7 @@ <texture_picker label="Untere Tattoos" name="Lower Tattoos" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> <button label="Neue Haut" label_selected="Neue Haut" name="Create New"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> <panel label="Haar" name="Hair"> @@ -116,7 +116,7 @@ <texture_picker label="Textur" name="Texture" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> <button label="Neue Haare" label_selected="Neue Haare" name="Create New"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> <panel label="Augen" name="Eyes"> @@ -147,7 +147,7 @@ <texture_picker label="Iris" name="Iris" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/> <button label="Neue Augen" label_selected="Neue Augen" name="Create New"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> <text label="Kleidung" name="clothes_placeholder"> @@ -159,7 +159,7 @@ <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/> <button label="Neues Hemd" label_selected="Neues Hemd" name="Create New"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> <text name="title"> [DESC] @@ -192,7 +192,7 @@ <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/> <button label="Neue Hose" label_selected="Neue Hose" name="Create New"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> <text name="title"> [DESC] @@ -249,7 +249,7 @@ <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> <panel label="Socken" name="Socks"> @@ -282,7 +282,7 @@ <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> <panel label="Jacke" name="Jacket"> @@ -316,7 +316,7 @@ <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> <panel label="Handschuhe" name="Gloves"> @@ -349,7 +349,7 @@ <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> <panel label="Unterhemd" name="Undershirt"> @@ -382,7 +382,7 @@ <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> <panel label="Unterhose" name="Underpants"> @@ -415,7 +415,7 @@ <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> <panel label="Rock" name="Skirt"> @@ -448,7 +448,7 @@ <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> <button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/> <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> - <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> + <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/> <button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/> </panel> <panel label="Tätowierung" name="Tattoo"> diff --git a/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml index 54a8a43edf..837dfa9e8c 100644 --- a/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml @@ -66,7 +66,7 @@ Key-Zeit: </text> <spinner label="Std." name="WLCurKeyHour" /> - <spinner label="Min." name="WLCurKeyMin" label_width="100" width="66"/> + <spinner label="Min." name="WLCurKeyMin"/> <text name="WLCurKeyTimeText2"> Key-Voreinstellung: </text> @@ -79,8 +79,8 @@ Zykluslänge: </text> <spinner label="Std." name="WLLengthOfDayHour" /> - <spinner label="Min." name="WLLengthOfDayMin" label_width="100" width="66"/> - <spinner label="Sek." name="WLLengthOfDaySec" label_width="100" width="66"/> + <spinner label="Min." name="WLLengthOfDayMin"/> + <spinner label="Sek." name="WLLengthOfDaySec"/> <text name="DayCycleText3"> Vorschau: </text> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index fd05f02ceb..b3aeb8cd68 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -3577,4 +3577,7 @@ Missbrauchsbericht <string name="Contents"> Inhalt </string> + <string name="AvatarBirthDateFormat"> + [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt] + </string> </strings> 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 59f1889808..40c6b14a4a 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -1061,7 +1061,8 @@ Leyla Linden </text> left="10" name="Autoreturn" top_pad="0" - width="310"> + width="412" + wrap="true"> Auto return other Residents' objects (minutes, 0 for off): </text> <line_editor @@ -1073,9 +1074,9 @@ Leyla Linden </text> layout="topleft" max_length="6" name="clean other time" - right="-72" - width="56" - top_delta="-6"/> + left_pad="0" + width="46" + top_delta="-2"/> <text type="string" length="1" diff --git a/indra/newview/skins/default/xui/en/floater_buy_object.xml b/indra/newview/skins/default/xui/en/floater_buy_object.xml index f0e5e30010..3d8f5d678b 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_object.xml @@ -5,7 +5,7 @@ height="290" layout="topleft" min_height="150" - min_width="200" + min_width="225" name="contents" help_topic="contents" save_rect="true" @@ -52,7 +52,7 @@ <text type="string" length="1" - follows="all" + follows="left|top|right" font="SansSerif" height="16" layout="topleft" @@ -90,7 +90,8 @@ name="buy_text" text_color="white" top_pad="5" - width="276"> + use_ellipses="true" + width="260"> Buy for L$[AMOUNT] from [NAME]? </text> <button diff --git a/indra/newview/skins/default/xui/en/floater_color_picker.xml b/indra/newview/skins/default/xui/en/floater_color_picker.xml index 2fa112af8c..421f3a72c6 100644 --- a/indra/newview/skins/default/xui/en/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/en/floater_color_picker.xml @@ -213,7 +213,8 @@ left="10" name="(Drag below to save.)" top_pad="66" - width="130"> + width="130" + wrap="true"> (Drag below to save) </text> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml index 32460e937d..01bced81d0 100644 --- a/indra/newview/skins/default/xui/en/floater_customize.xml +++ b/indra/newview/skins/default/xui/en/floater_customize.xml @@ -11,7 +11,7 @@ save_rect="true" title="APPEARANCE" top_delta="-185" - width="524"> + width="600"> <tab_container height="517" layout="topleft" @@ -21,7 +21,7 @@ tab_position="left" tab_height="50" top="26" - width="506"> + width="580"> <text type="string" length="1" @@ -65,15 +65,15 @@ mouse_opaque="true" width="16" /> <button - follows="right|bottom" + follows="left|top" height="23" - label="Revert" - label_selected="Revert" + label="Create New Shape" + label_selected="Create New Shape" layout="topleft" - right="390" - name="Revert" - top="477" - width="82" /> + left="10" + name="Create New" + top="104" + width="160" /> <button follows="left|top" height="23" @@ -280,46 +280,46 @@ type="string" length="1" top="488" - follows="left|top|right" + follows="left|top" font="SansSerif" halign="right" height="23" layout="topleft" + left="10" name="Item Action Label" - right="90" - width="100"> + width="130"> Shape: </text> <button - follows="left|top" - height="23" - label="Create New Shape" - label_selected="Create New Shape" - layout="topleft" - left="10" - name="Create New" - top="104" - width="160" /> - <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" name="Save" - right="186" + left_pad="2" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" name="Save As" top="477" - right="304" + left_pad="3" width="115" /> + <button + follows="left|bottom" + height="23" + label="Revert" + label_selected="Revert" + layout="topleft" + left_pad="3" + name="Revert" + top="477" + width="120" /> </panel> <panel border="false" @@ -352,6 +352,16 @@ <button follows="left|top" height="23" + label="Create New Skin" + label_selected="Create New Skin" + layout="topleft" + left_delta="0" + name="Create New" + top_delta="-249" + width="160" /> + <button + follows="left|top" + height="23" label="Skin Color" label_selected="Skin Color" layout="topleft" @@ -479,20 +489,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - top="488" - follows="left|top|right" - font="SansSerif" - halign="right" - height="23" - layout="topleft" - name="Item Action Label" - right="90" - width="100"> - Skin: - </text> <texture_picker allow_no_texture="true" can_apply_immediately="true" @@ -532,46 +528,50 @@ tool_tip="Click to choose a picture" top_delta="102" width="82" /> - <button + <text + type="string" + length="1" + top="488" follows="left|top" + font="SansSerif" + halign="right" height="23" - label="Create New Skin" - label_selected="Create New Skin" layout="topleft" - left_delta="0" - name="Create New" - top_delta="-249" - width="160" /> + left="10" + name="Item Action Label" + width="130"> + Skin: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="186" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <panel border="false" @@ -729,20 +729,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - top="488" - follows="left|top|right" - font="SansSerif" - halign="right" - height="23" - layout="topleft" - name="Item Action Label" - right="90" - width="100"> - Hair: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -765,36 +751,50 @@ name="Create New" top_delta="-89" width="160" /> + <text + type="string" + length="1" + top="488" + follows="left|top" + font="SansSerif" + halign="right" + height="23" + layout="topleft" + name="Item Action Label" + left="10" + width="130"> + Hair: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="186" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <panel border="false" @@ -914,20 +914,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="90" - width="100"> - Eyes: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -949,36 +935,50 @@ name="Create New" top="66" width="160" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + name="Item Action Label" + left="10" + width="130"> + Eyes: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="186" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <text type="string" @@ -1063,36 +1063,50 @@ name="Create New" top="66" width="160" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + name="Item Action Label" + left="10" + width="130"> + Shirt: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="186" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> <text type="string" length="1" @@ -1183,20 +1197,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="90" - width="100"> - Shirt: - </text> </panel> <panel border="false" @@ -1266,36 +1266,50 @@ name="Create New" top="66" width="160" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + name="Item Action Label" + left="10" + width="130"> + Pants: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="186" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> <text type="string" length="1" @@ -1386,20 +1400,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="90" - width="100"> - Pants: - </text> </panel> <panel border="false" @@ -1528,20 +1528,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="90" - width="100"> - Shoes: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -1573,36 +1559,50 @@ name="Take Off" top_pad="4" width="82" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + left="10" + name="Item Action Label" + width="130"> + Shoes: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="186" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <panel border="false" @@ -1731,20 +1731,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="90" - width="100"> - Socks: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -1776,36 +1762,50 @@ name="Take Off" top_pad="4" width="82" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + left="10" + name="Item Action Label" + width="130"> + Socks: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="186" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <panel border="false" @@ -1934,20 +1934,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="90" - width="100"> - Jacket: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -1990,36 +1976,50 @@ name="Take Off" top_pad="4" width="82" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + left="10" + name="Item Action Label" + width="130"> + Jacket: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="186" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <panel border="false" @@ -2148,20 +2148,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="90" - width="100"> - Gloves: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -2193,36 +2179,50 @@ name="Take Off" top_pad="4" width="82" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + left="10" + name="Item Action Label" + width="130"> + Gloves: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="186" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <panel border="false" @@ -2351,20 +2351,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="90" - width="100"> - Undershirt: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -2396,36 +2382,50 @@ name="Take Off" top_pad="4" width="82" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + left="10" + name="Item Action Label" + width="130"> + Undershirt: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="186" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <panel border="false" @@ -2554,20 +2554,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="90" - width="100"> - Underpants: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -2599,36 +2585,50 @@ name="Take Off" top_pad="4" width="82" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + left="10" + name="Item Action Label" + width="130"> + Underpants: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="186" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <panel border="false" @@ -2757,20 +2757,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="90" - width="100"> - Skirt: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -2802,36 +2788,50 @@ name="Take Off" top_pad="4" width="82" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + left="10" + name="Item Action Label" + width="130"> + Skirt: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="186" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <panel border="false" @@ -2960,20 +2960,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="90" - width="100"> - Tattoo: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -3018,36 +3004,50 @@ top_pad="4" left="10" width="82" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + left="10" + name="Item Action Label" + width="130"> + Tattoo: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="186" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> <panel border="false" @@ -3176,20 +3176,6 @@ width="373"> You do not have permission to modify this wearable. </text> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom|right" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - right="90" - width="100"> - Alpha: - </text> <texture_picker can_apply_immediately="true" default_image_name="Default" @@ -3299,47 +3285,61 @@ left="10" top_pad="20" width="82" /> + <text + type="string" + length="1" + bottom="4" + follows="left|bottom" + font="SansSerif" + halign="right" + height="23" + layout="bottomleft" + left="10" + name="Item Action Label" + width="130"> + Alpha: + </text> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save" label_selected="Save" layout="topleft" - right="186" + left_pad="2" name="Save" top="477" width="82" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Save As..." label_selected="Save As..." layout="topleft" - right="304" + left_pad="3" name="Save As" top="477" width="115" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Revert" label_selected="Revert" layout="topleft" - right="390" + left_pad="3" name="Revert" top="477" - width="82" /> + width="120" /> </panel> </tab_container> <scroll_container follows="left|top|right|bottom" height="409" layout="topleft" - left="211" + left="247" mouse_opaque="false" name="panel_container" top="92" - width="292"> + width="330"> <scrolling_panel_list follows="left|bottom" layout="topleft" @@ -3355,7 +3355,7 @@ name="script_info" tool_tip="Show scripts attached to your avatar" left="13" - width="90" /> + width="90" ></button> <button bottom="574" follows="right|bottom" diff --git a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml index 2c0c8d45b3..42a9ff551e 100644 --- a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml @@ -7,7 +7,7 @@ help_topic="day_cycle_floater" save_rect="true" title="DAY CYCLE EDITOR" - width="646"> + width="658"> <tab_container follows="left|top" height="255" @@ -16,7 +16,7 @@ name="Day Cycle Tabs" tab_position="top" top="20" - width="644"> + width="656"> <panel border="true" follows="left|top|right|bottom" @@ -27,7 +27,7 @@ mouse_opaque="false" name="Day Cycle" top="0" - width="642"> + width="654"> <multi_slider can_edit_text="true" control_name="WLTimeSlider" @@ -313,7 +313,7 @@ left="555" name="WLAddKey" top="30" - width="80" /> + width="96" /> <button height="20" label="Delete Key" @@ -322,7 +322,7 @@ left_delta="0" name="WLDeleteKey" top_pad="5" - width="80" /> + width="96" /> <text type="string" length="1" @@ -348,7 +348,7 @@ left="30" name="WLCurKeyTimeText" top="124" - width="100"> + width="105"> Key Time: </text> <spinner @@ -361,11 +361,11 @@ label="Hour" label_width="30" layout="topleft" - left_delta="0" + left_delta="25" max_val="100" name="WLCurKeyHour" top_pad="4" - width="70" /> + width="74" /> <spinner control_name="WLCurKeyMin" decimal_digits="0" @@ -402,7 +402,7 @@ left_delta="0" name="WLKeyPresets" top_pad="7" - width="155" /> + width="205" /> <view_border bevel_style="none" follows="top|left" @@ -410,7 +410,7 @@ layout="topleft" left="12" top="101" - width="190" /> + width="240" /> <text type="string" length="1" @@ -419,7 +419,7 @@ font="SansSerif" height="16" layout="topleft" - left="220" + left_pad="15" name="DayCycleText" top="114" width="120"> @@ -444,7 +444,7 @@ layout="topleft" left_delta="0" name="DayCycleText2" - top_pad="9" + top_pad="17" width="120"> Length of Cycle: </text> @@ -462,7 +462,7 @@ max_val="100" name="WLLengthOfDayHour" top_pad="4" - width="70" /> + width="74" /> <spinner control_name="WLLengthOfDayMin" decimal_digits="0" @@ -492,57 +492,58 @@ max_val="59" name="WLLengthOfDaySec" top_delta="0" - width="60" /> + width="60"/> <text type="string" + halign="right" length="1" border_visible="true" follows="left|top|right" font="SansSerif" height="16" layout="topleft" - left="310" + left_delta="-23" name="DayCycleText3" top="114" - width="120"> - Preview: + width="85"> + Preview : </text> <button height="20" label="Play" label_selected="Play" layout="topleft" - left_delta="60" + left="480" name="WLAnimSky" top_pad="5" - width="50" /> + width="83" /> <button height="20" label="Stop!" label_selected="Stop" layout="topleft" - left_pad="5" + left_pad="4" name="WLStopAnimSky" top_delta="0" - width="50" /> + width="83" /> <button height="20" label="Use Estate Time" label_selected="Go to Estate Time" layout="topleft" - left_pad="5" + left="480" name="WLUseLindenTime" - top_delta="0" - width="150" /> + top_pad="9" + width="170" /> <button height="20" label="Save Test Day" label_selected="Save Test Day" layout="topleft" - left="480" + left_delta="0" name="WLSaveDayCycle" - top="175" - width="150" /> + top_pad="9" + width="170" /> <button height="20" label="Load Test Day" @@ -550,8 +551,8 @@ layout="topleft" left_delta="0" name="WLLoadDayCycle" - top_pad="5" - width="150" /> + top_pad="3" + width="170" /> </panel> </tab_container> </floater> 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 65a05f3ec5..ced8c29199 100644 --- a/indra/newview/skins/default/xui/en/floater_im_container.xml +++ b/indra/newview/skins/default/xui/en/floater_im_container.xml @@ -11,7 +11,7 @@ save_visibility="true" single_instance="true" title="CONVERSATIONS" - width="392"> + width="396"> <tab_container follows="left|right|top|bottom" height="390" @@ -27,7 +27,7 @@ halign="left" use_ellipses="true" top="0" - width="390" /> + width="394" /> <icon color="DefaultShadowLight" enabled="false" @@ -38,5 +38,5 @@ left="1" name="im_box_tab_container_icon" bottom="10" - width="390" /> + width="394" /> </multi_floater> diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml index 422e50f035..f537c81860 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -13,7 +13,7 @@ can_minimize="true" can_close="true" visible="false" - width="385" + width="394" can_resize="true" min_width="250" min_height="190"> @@ -22,7 +22,7 @@ default_tab_group="2" follows="all" height="320" - width="385" + width="394" layout="topleft" orientation="horizontal" name="im_panels" @@ -43,7 +43,7 @@ tab_group="2" top="0" height="200" - width="245" + width="254" user_resize="true"> <button height="20" @@ -70,7 +70,7 @@ parse_highlights="true" allow_html="true" left="1" - width="240"> + width="249"> </chat_history> <line_editor bottom="0" @@ -81,7 +81,7 @@ layout="bottomleft" name="chat_editor" tab_group="3" - width="240"> + width="249"> </line_editor> </layout_panel> </layout_stack> diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml index 5ea207675b..9db6568ee3 100644 --- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml +++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml @@ -119,7 +119,7 @@ No Answer. Please try again later. layout="topleft" left="77" name="leaving" - top="52" + top="62" width="315" word_wrap="true"> Leaving [CURRENT_CHAT]. diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index 49361784ae..6e82bb09ee 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -47,7 +47,7 @@ tab_group="1" tab_position="left" tab_width="115" - tab_padding_right="5" + tab_padding_right="0" top="21" width="658"> <panel diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml index 114b9a84e3..5b77f11d71 100644 --- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml @@ -10,7 +10,9 @@ name="floater_voice_controls" help_topic="floater_voice_controls" title="Voice Controls" + save_dock_state="true" save_visibility="true" + save_rect="true" single_instance="true" width="282"> <string diff --git a/indra/newview/skins/default/xui/en/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/en/menu_inv_offer_chiclet.xml new file mode 100644 index 0000000000..45a0a6635b --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_inv_offer_chiclet.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu + height="101" + layout="topleft" + left="100" + mouse_opaque="false" + name="InvOfferChiclet Menu" + top="724" + visible="false" + width="128"> + <menu_item_call + label="Close" + layout="topleft" + name="Close"> + <menu_item_call.on_click + function="InvOfferChiclet.Action" + parameter="end" /> + </menu_item_call> +</menu> diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml index 8b10c7b049..6ca8766e3f 100644 --- a/indra/newview/skins/default/xui/en/menu_object.xml +++ b/indra/newview/skins/default/xui/en/menu_object.xml @@ -18,16 +18,16 @@ name="Edit..."> <menu_item_call.on_click function="Object.Edit" /> - <menu_item_call.on_visible + <menu_item_call.on_visible function="EnableEdit"/> </menu_item_call> <menu_item_call label="Build" name="Build"> <menu_item_call.on_click - function="Object.Edit" /> - <menu_item_call.on_visible - function="VisibleBuild"/> + function="Object.Build" /> + <menu_item_call.on_visible + function="EnableEdit"/> </menu_item_call> <menu_item_call enabled="false" diff --git a/indra/newview/skins/default/xui/en/menu_participant_list.xml b/indra/newview/skins/default/xui/en/menu_participant_list.xml index 59c7f4ed85..2515b60868 100644 --- a/indra/newview/skins/default/xui/en/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/en/menu_participant_list.xml @@ -30,6 +30,9 @@ name="View Profile"> <menu_item_call.on_click function="Avatar.Profile" /> + <menu_item_call.on_enable + function="ParticipantList.EnableItem" + parameter="can_view_profile" /> </menu_item_call> <menu_item_call label="Add Friend" @@ -153,7 +156,7 @@ function="ParticipantList.ModerateVoice" parameter="selected" /> <on_enable - function="ParticipantList.EnableItem" + function="ParticipantList.EnableItem.Moderate" parameter="can_moderate_voice" /> </menu_item_call> <menu_item_call @@ -164,7 +167,7 @@ function="ParticipantList.ModerateVoice" parameter="others" /> <on_enable - function="ParticipantList.EnableItem" + function="ParticipantList.EnableItem.Moderate" parameter="can_moderate_voice" /> </menu_item_call> <menu_item_call @@ -175,7 +178,7 @@ function="ParticipantList.ModerateVoice" parameter="selected" /> <on_enable - function="ParticipantList.EnableItem" + function="ParticipantList.EnableItem.Moderate" parameter="can_moderate_voice" /> </menu_item_call> <menu_item_call @@ -186,7 +189,7 @@ function="ParticipantList.ModerateVoice" parameter="others" /> <on_enable - function="ParticipantList.EnableItem" + function="ParticipantList.EnableItem.Moderate" parameter="can_moderate_voice" /> </menu_item_call> </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_script_chiclet.xml b/indra/newview/skins/default/xui/en/menu_script_chiclet.xml new file mode 100644 index 0000000000..db29d9cebc --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_script_chiclet.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<menu + height="101" + layout="topleft" + left="100" + mouse_opaque="false" + name="ScriptChiclet Menu" + top="724" + visible="false" + width="128"> + <menu_item_call + label="Close" + layout="topleft" + name="Close"> + <menu_item_call.on_click + function="ScriptChiclet.Action" + parameter="end" /> + </menu_item_call> +</menu> diff --git a/indra/newview/skins/default/xui/en/menu_url_agent.xml b/indra/newview/skins/default/xui/en/menu_url_agent.xml index fa05dac148..73f0fa7979 100644 --- a/indra/newview/skins/default/xui/en/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/en/menu_url_agent.xml @@ -7,7 +7,7 @@ layout="topleft" name="show_agent"> <menu_item_call.on_click - function="Url.Execute" /> + function="Url.ShowProfile" /> </menu_item_call> <menu_item_separator layout="topleft" /> diff --git a/indra/newview/skins/default/xui/en/menu_url_group.xml b/indra/newview/skins/default/xui/en/menu_url_group.xml index c5eaf94d22..2cb125ce09 100644 --- a/indra/newview/skins/default/xui/en/menu_url_group.xml +++ b/indra/newview/skins/default/xui/en/menu_url_group.xml @@ -7,7 +7,7 @@ layout="topleft" name="show_group"> <menu_item_call.on_click - function="Url.Execute" /> + function="Url.ShowProfile" /> </menu_item_call> <menu_item_separator layout="topleft" /> diff --git a/indra/newview/skins/default/xui/en/mime_types.xml b/indra/newview/skins/default/xui/en/mime_types.xml index 76c0d027f3..a585069faa 100644 --- a/indra/newview/skins/default/xui/en/mime_types.xml +++ b/indra/newview/skins/default/xui/en/mime_types.xml @@ -120,7 +120,7 @@ none </widgettype> <impl> - media_plugin_quicktime + media_plugin_webkit </impl> </mimetype> <mimetype name="none/none"> @@ -130,6 +130,9 @@ <widgettype> none </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="audio/*"> <label name="audio2_label"> @@ -138,6 +141,9 @@ <widgettype> audio </widgettype> + <impl> + media_plugin_quicktime + </impl> </mimetype> <mimetype name="video/*"> <label name="video2_label"> @@ -146,6 +152,9 @@ <widgettype> movie </widgettype> + <impl> + media_plugin_quicktime + </impl> </mimetype> <mimetype name="image/*"> <label name="image2_label"> @@ -154,6 +163,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype menu="1" name="video/vnd.secondlife.qt.legacy"> <label name="vnd.secondlife.qt.legacy_label"> @@ -173,6 +185,9 @@ <widgettype> web </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/ogg"> <label name="application/ogg_label"> @@ -181,6 +196,9 @@ <widgettype> audio </widgettype> + <impl> + media_plugin_quicktime + </impl> </mimetype> <mimetype name="application/pdf"> <label name="application/pdf_label"> @@ -189,6 +207,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/postscript"> <label name="application/postscript_label"> @@ -197,6 +218,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/rtf"> <label name="application/rtf_label"> @@ -205,6 +229,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/smil"> <label name="application/smil_label"> @@ -213,6 +240,9 @@ <widgettype> movie </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/xhtml+xml"> <label name="application/xhtml+xml_label"> @@ -221,6 +251,9 @@ <widgettype> web </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/x-director"> <label name="application/x-director_label"> @@ -229,6 +262,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="audio/mid"> <label name="audio/mid_label"> diff --git a/indra/newview/skins/default/xui/en/mime_types_linux.xml b/indra/newview/skins/default/xui/en/mime_types_linux.xml index 05cd850725..e95b371d00 100644 --- a/indra/newview/skins/default/xui/en/mime_types_linux.xml +++ b/indra/newview/skins/default/xui/en/mime_types_linux.xml @@ -120,7 +120,7 @@ none </widgettype> <impl> - media_plugin_gstreamer + media_plugin_webkit </impl> </mimetype> <mimetype name="none/none"> @@ -130,6 +130,9 @@ <widgettype> none </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="audio/*"> <label name="audio2_label"> @@ -138,6 +141,9 @@ <widgettype> audio </widgettype> + <impl> + media_plugin_gstreamer + </impl> </mimetype> <mimetype name="video/*"> <label name="video2_label"> @@ -146,6 +152,9 @@ <widgettype> movie </widgettype> + <impl> + media_plugin_gstreamer + </impl> </mimetype> <mimetype name="image/*"> <label name="image2_label"> @@ -154,6 +163,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype menu="1" name="video/vnd.secondlife.qt.legacy"> <label name="vnd.secondlife.qt.legacy_label"> @@ -173,6 +185,9 @@ <widgettype> web </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/ogg"> <label name="application/ogg_label"> @@ -181,6 +196,9 @@ <widgettype> audio </widgettype> + <impl> + media_plugin_gstreamer + </impl> </mimetype> <mimetype name="application/pdf"> <label name="application/pdf_label"> @@ -189,6 +207,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/postscript"> <label name="application/postscript_label"> @@ -197,6 +218,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/rtf"> <label name="application/rtf_label"> @@ -205,6 +229,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/smil"> <label name="application/smil_label"> @@ -213,6 +240,9 @@ <widgettype> movie </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/xhtml+xml"> <label name="application/xhtml+xml_label"> @@ -221,6 +251,9 @@ <widgettype> web </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/x-director"> <label name="application/x-director_label"> @@ -229,6 +262,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="audio/mid"> <label name="audio/mid_label"> diff --git a/indra/newview/skins/default/xui/en/mime_types_mac.xml b/indra/newview/skins/default/xui/en/mime_types_mac.xml index 76c0d027f3..7931e55c0a 100644 --- a/indra/newview/skins/default/xui/en/mime_types_mac.xml +++ b/indra/newview/skins/default/xui/en/mime_types_mac.xml @@ -130,6 +130,9 @@ <widgettype> none </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="audio/*"> <label name="audio2_label"> @@ -138,6 +141,9 @@ <widgettype> audio </widgettype> + <impl> + media_plugin_quicktime + </impl> </mimetype> <mimetype name="video/*"> <label name="video2_label"> @@ -146,6 +152,9 @@ <widgettype> movie </widgettype> + <impl> + media_plugin_quicktime + </impl> </mimetype> <mimetype name="image/*"> <label name="image2_label"> @@ -154,6 +163,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype menu="1" name="video/vnd.secondlife.qt.legacy"> <label name="vnd.secondlife.qt.legacy_label"> @@ -173,6 +185,9 @@ <widgettype> web </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/ogg"> <label name="application/ogg_label"> @@ -181,6 +196,9 @@ <widgettype> audio </widgettype> + <impl> + media_plugin_quicktime + </impl> </mimetype> <mimetype name="application/pdf"> <label name="application/pdf_label"> @@ -189,6 +207,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/postscript"> <label name="application/postscript_label"> @@ -197,6 +218,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/rtf"> <label name="application/rtf_label"> @@ -205,6 +229,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/smil"> <label name="application/smil_label"> @@ -213,6 +240,9 @@ <widgettype> movie </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/xhtml+xml"> <label name="application/xhtml+xml_label"> @@ -221,6 +251,9 @@ <widgettype> web </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="application/x-director"> <label name="application/x-director_label"> @@ -229,6 +262,9 @@ <widgettype> image </widgettype> + <impl> + media_plugin_webkit + </impl> </mimetype> <mimetype name="audio/mid"> <label name="audio/mid_label"> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index ca922bf724..4479a3dd4d 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -800,7 +800,7 @@ Insufficient funds to create classified. icon="alertmodal.tga" name="DeleteAvatarPick" type="alertmodal"> -Delete pick [PICK]? +Delete pick <nolink>[PICK]</nolink>? <usetemplate name="okcancelbuttons" notext="Cancel" @@ -5066,6 +5066,7 @@ No valid parcel could be found. <notification icon="notify.tga" name="ObjectGiveItem" + persist="true" type="offer"> An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has given you this [OBJECTTYPE]: [ITEM_SLURL] @@ -5110,6 +5111,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th <notification icon="notify.tga" name="UserGiveItem" + persist="true" type="offer"> [NAME_SLURL] has given you this [OBJECTTYPE]: [ITEM_SLURL] @@ -5162,10 +5164,11 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th <notification icon="notify.tga" name="TeleportOffered" + persist="true" type="offer"> [NAME_SLURL] has offered to teleport you to their location: -[MESSAGE], ([MATURITY]) +[MESSAGE] - [MATURITY_STR] <icon>[MATURITY_ICON]</icon> <form name="form"> <button index="0" @@ -5207,6 +5210,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th <notification icon="notify.tga" name="OfferFriendship" + persist="true" type="offer"> [NAME_SLURL] is offering friendship. diff --git a/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml new file mode 100644 index 0000000000..5fcc9b012b --- /dev/null +++ b/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- *NOTE: mantipov: this xml is intended to be used inside panel_outfits_list.xml for each outfit folder--> +<!-- All accordion tabs in the My Appearance/My Outfits panel will be created from this one at runtime--> +<!-- Non of string values of controls below are visible to user. They are not need to be translated. --> +<accordion_tab + display_children="false" + follows="all" + height="45" + layout="topleft" + name="Mockup Tab" + title="Mockup Tab" + translate="false" + width="0"> + <wearable_items_list + allow_select="true" + follows="all" + keep_one_selected="true" + name="wearable_items_list" + translate="false" + /> +</accordion_tab> diff --git a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml new file mode 100644 index 0000000000..01c7ae61d2 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + bg_alpha_color="DkGray" + border="false" + bottom="0" + follows="all" + height="200" + left="0" + name="cof_wearables" + width="313"> + <accordion + follows="all" + height="373" + layout="topleft" + left="3" + top="0" + name="cof_wearables_accordion" + background_visible="true" + bg_alpha_color="DkGray2" + width="307"> + <accordion_tab + layout="topleft" + name="tab_attachments" + title="Attachments"> + <flat_list_view + allow_select="true" + follows="all" + height="150" + layout="topleft" + left="0" + name="list_attachments" + top="0" + width="307" /> + </accordion_tab> + <accordion_tab + layout="topleft" + name="tab_clothing" + title="Clothing"> + <flat_list_view + allow_select="true" + follows="all" + height="150" + layout="topleft" + left="0" + name="list_clothing" + top="0" + width="307" /> + </accordion_tab> + <accordion_tab + layout="topleft" + name="tab_body_parts" + title="Body Parts"> + <flat_list_view + allow_select="true" + follows="all" + height="150" + layout="topleft" + left="0" + name="list_body_parts" + top="0" + width="307" /> + </accordion_tab> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_generic_tip.xml b/indra/newview/skins/default/xui/en/panel_generic_tip.xml index 453ed7c7a6..eea92895f5 100644 --- a/indra/newview/skins/default/xui/en/panel_generic_tip.xml +++ b/indra/newview/skins/default/xui/en/panel_generic_tip.xml @@ -3,7 +3,7 @@ height="40" layout="topleft" left="0" - name="panel_system_tip" + name="panel_generic_tip" top="0" width="305"> <text diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml index 7996a89e72..76f7484c68 100644 --- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml @@ -17,6 +17,10 @@ You don't have permission to view group owned land </panel.string> <panel.string + name="epmty_view_group_land_text"> + No entries + </panel.string> + <panel.string name="cant_view_group_accounting_text"> You don't have permission to view the group's accounting information. </panel.string> @@ -262,6 +266,7 @@ top="0" width="313"> <text_editor + enabled="false" type="string" follows="all" height="200" @@ -286,6 +291,7 @@ top="0" width="313"> <text_editor + enabled="false" type="string" follows="all" height="185" @@ -329,6 +335,7 @@ top="0" width="313"> <text_editor + enabled="false" type="string" follows="all" height="185" diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml index 29c6a17c31..33a5e01e4c 100644 --- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml @@ -3,14 +3,14 @@ border="false" height="300" name="panel_im_control_panel" - width="110"> + width="119"> <avatar_icon follows="left|top" height="105" left_delta="5" name="avatar_icon" top="-5" - width="105"/> + width="114"/> <layout_stack mouse_opaque="false" border_size="0" @@ -22,7 +22,7 @@ name="button_stack" orientation="vertical" top_pad="5" - width="105"> + width="114"> <layout_panel mouse_opaque="false" auto_resize="true" @@ -31,7 +31,7 @@ layout="topleft" left="2" min_height="0" - width="100" + width="109" top="0" name="spacer" user_resize="false" /> @@ -41,7 +41,7 @@ height="20" layout="topleft" min_height="20" - width="100" + width="109" name="view_profile_btn_panel" user_resize="false"> <button @@ -50,7 +50,7 @@ label="Profile" name="view_profile_btn" top="0" - width="100" /> + width="109" /> </layout_panel> <layout_panel auto_resize="false" @@ -58,7 +58,7 @@ height="25" layout="topleft" min_height="25" - width="100" + width="109" name="add_friend_btn_panel" user_resize="false"> <button @@ -67,7 +67,7 @@ label="Add Friend" name="add_friend_btn" top="5" - width="100" /> + width="109" /> </layout_panel> <layout_panel auto_resize="false" @@ -75,7 +75,7 @@ height="25" layout="topleft" min_height="25" - width="100" + width="109" name="teleport_btn_panel" user_resize="false"> <button @@ -85,7 +85,7 @@ label="Teleport" name="teleport_btn" tool_tip = "Offer to teleport this person" - width="100" /> + width="109" /> </layout_panel> <layout_panel auto_resize="false" @@ -93,7 +93,7 @@ height="25" layout="topleft" min_height="25" - width="100" + width="109" name="share_btn_panel" user_resize="false"> <button @@ -102,7 +102,7 @@ height="23" label="Share" name="share_btn" - width="100" /> + width="109" /> </layout_panel> <layout_panel auto_resize="false" @@ -110,7 +110,7 @@ height="25" layout="topleft" min_height="25" - width="100" + width="109" name="pay_btn_panel" user_resize="false"> <button @@ -119,7 +119,7 @@ height="23" label="Pay" name="pay_btn" - width="100" /> + width="109" /> </layout_panel> <layout_panel auto_resize="false" @@ -127,7 +127,7 @@ height="25" layout="topleft" min_height="25" - width="100" + width="109" name="call_btn_panel" user_resize="false"> <button @@ -135,7 +135,7 @@ height="23" label="Call" name="call_btn" - width="100" /> + width="109" /> </layout_panel> <layout_panel auto_resize="false" @@ -143,7 +143,7 @@ height="25" layout="topleft" min_height="25" - width="100" + width="109" name="end_call_btn_panel" user_resize="false" visible="false"> @@ -152,7 +152,7 @@ height="23" label="End Call" name="end_call_btn" - width="100" /> + width="109" /> </layout_panel> <layout_panel auto_resize="false" @@ -160,7 +160,7 @@ height="25" layout="topleft" min_height="25" - width="100" + width="109" name="voice_ctrls_btn_panel" user_resize="false" visible="false"> @@ -169,7 +169,7 @@ height="23" label="Voice Controls" name="voice_ctrls_btn" - width="100" /> + width="109" /> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_inventory_item.xml b/indra/newview/skins/default/xui/en/panel_inventory_item.xml new file mode 100644 index 0000000000..f1b7b92ece --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_inventory_item.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + follows="top|right|left" + height="20" + layout="topleft" + left="0" + name="inventory_item" + top="0" + width="380"> + <icon + follows="top|right|left" + height="20" + image_name="ListItem_Over" + layout="topleft" + left="0" + name="hovered_icon" + top="0" + visible="false" + width="380" /> + <icon + height="20" + follows="top|right|left" + image_name="ListItem_Select" + layout="topleft" + left="0" + name="selected_icon" + top="0" + visible="false" + width="380" /> + <icon + height="16" + follows="top|left" + image_name="Inv_Object" + layout="topleft" + left="0" + name="item_icon" + top="0" + width="16" /> + <text + follows="left|right" + height="20" + layout="topleft" + left_pad="5" + allow_html="false" + use_ellipses="true" + name="item_name" + text_color="white" + top="4" + value="..." + width="359" /> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index 01adc00e1a..a725548e61 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -201,7 +201,7 @@ height="16" name="forgot_password_text" top_pad="12" right="-10" - width="210"> + width="215"> Forgot your name or password? </text> <text @@ -213,7 +213,7 @@ height="16" name="login_help" top_pad="2" right="-10" - width="190"> + width="220"> Need help logging in? </text> <!-- <text follows="right|bottom" diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml index b5c2371510..c5f44cd049 100644 --- a/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml +++ b/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml @@ -42,10 +42,11 @@ <text bottom_delta="-50" + enabled="false" follows="top|left" height="15" left="10" - enabled="false"> + name="owner_label"> Owner </text> @@ -79,10 +80,11 @@ <text bottom_delta="-36" + enabled="false" follows="top|left" height="15" left="10" - enabled="false"> + name="group_label"> Group: </text> @@ -126,10 +128,11 @@ <text bottom_delta="-36" + enabled="false" follows="top|left" height="15" left="10" - enabled="false"> + name="anyone_label"> Anyone </text> diff --git a/indra/newview/skins/default/xui/en/panel_my_profile.xml b/indra/newview/skins/default/xui/en/panel_my_profile.xml index 5e41d65720..841a4f5713 100644 --- a/indra/newview/skins/default/xui/en/panel_my_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml @@ -401,14 +401,6 @@ name="edit_profile_btn" tool_tip="Edit your personal information" width="152" /> - <button - follows="bottom|right" - height="23" - label="Edit Appearance" - left_pad="3" - name="edit_appearance_btn" - tool_tip="Create/edit your appearance: physical data, clothes and etc." - width="153" /> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml index 1d99de1fa7..5dbd8bfe6a 100644 --- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml @@ -16,10 +16,11 @@ label="Click here to chat." layout="topleft" left_delta="3" - text_pad_right="25" left="0" - max_length="512" + max_length="1024" name="chat_box" + text_pad_left="5" + text_pad_right="25" tool_tip="Press Enter to say, Ctrl+Enter to shout" top="2" width="283" /> diff --git a/indra/newview/skins/default/xui/en/panel_nearby_media.xml b/indra/newview/skins/default/xui/en/panel_nearby_media.xml index ff2aae645b..f5a78fc929 100644 --- a/indra/newview/skins/default/xui/en/panel_nearby_media.xml +++ b/indra/newview/skins/default/xui/en/panel_nearby_media.xml @@ -7,7 +7,7 @@ background_opaque="true" background_visible="true" layout="topleft" - width="270" + width="328" height="230" name="nearby_media" help_topic="nearby_media"> @@ -29,7 +29,7 @@ follows="left" tool_tip="Turn all nearby media off" left="8" - width="66" + width="95" height="22" label="Stop All"> <button.commit_callback @@ -40,7 +40,7 @@ follows="left" tool_tip="Turn all nearby media on" left_pad="4" - width="66" + width="95" height="22" label="Start All"> <button.commit_callback diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml index bc37af0319..73181392c9 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml @@ -30,6 +30,20 @@ <string name="Filter.Clothes/Body" value="Clothes/Body"/> <string name="Filter.Objects" value="Objects"/> + <!-- + TODO remove this button. Added it temporary for QA to be able to test new edit wearable + panel (see EXT-6564) + --> + <button + follows="left|top|right" + height="20" + label="edit" + left="0" + top="0" + layout="topleft" + name="edit_wearable_btn" + width="40" /> + <button follows="top|left" height="23" @@ -135,41 +149,20 @@ auto_resize="true" user_resize="true"> - <scroll_list - width="300" - column_padding="0" - draw_heading="false" - draw_stripes="false" + <!-- List containing items from the COF and Base outfit --> + <panel + background_visible="false" + class="cof_wearables" + filename="panel_cof_wearables.xml" follows="left|top|right|bottom" + height="193" layout="topleft" - name="look_items_list" - search_column="1" - sort_column="2" left="0" - height="193" - top="0"> - <scroll_list.columns - label="Look Item" - name="look_item" - width="285" /> - <scroll_list.columns - label="Outfit Item Sort" - width="0" - sort_column="look_item_sort" - name="look_item_sort" /> - </scroll_list> - <!-- TODO remove this button. Added it temporary for QA to be able to test new edit wearable panel (see EXT-6564)--> - <button - follows="left|top|right" - height="20" - label="edit" - left="0" - top="0" - layout="topleft" - name="edit_wearable_btn" - width="40" /> + name="cof_wearables_list" + top="0" + width="300" /> - <panel + <panel background_visible="true" bevel_style="none" follows="bottom|left|right" @@ -218,6 +211,30 @@ top="1" width="31" /> <button + follows="bottom|left" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="Movement_Forward_On" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" + layout="topleft" + left_pad="1" + name="move_closer_btn" + top="1" + width="31" /> + <button + follows="bottom|left" + height="25" + image_hover_unselected="Toolbar_Middle_Over" + image_overlay="Movement_Backward_On" + image_selected="Toolbar_Middle_Selected" + image_unselected="Toolbar_Middle_Off" + layout="topleft" + left_pad="1" + name="move_further_btn" + top="1" + width="31" /> + <button follows="bottom|right" height="25" image_hover_unselected="Toolbar_Middle_Over" @@ -338,6 +355,30 @@ width="300"/> <panel + name="filtered_wearables_panel" + background_opaque="true" + background_visible="true" + layout="topleft" + follows="left|top|right|bottom" + border="false" + height="155" + left="0" + mouse_opaque="false" + width="300" + top_delta="0" + visible="false"> + <wearable_items_list + name="filtered_wearables_list" + allow_select="true" + layout="topleft" + follows="all" + width="300" + height="155" + left="0" + top="0" /> + </panel> + + <panel background_visible="true" bevel_style="none" follows="left|right|bottom" diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml index 66ed43efec..b8ad278da7 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml @@ -23,20 +23,16 @@ tab_position="top" halign="center" width="312"> - <inventory_panel + <panel + class="outfits_list" + filename="panel_outfits_list.xml" + height="490" + name="outfitslist_tab" background_visible="true" - background_opaque="true" - label="MY OUTFITS" - help_topic="my_outfits_tab" - allow_multi_select="true" follows="all" - border="false" - left="0" - top="0" - width="315" - mouse_opaque="true" - name="outfitslist_tab" - start_folder="My Outfits" /> + label="MY OUTFITS" + layout="topleft" + width="315" /> <inventory_panel follows="all" background_visible="true" diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml new file mode 100644 index 0000000000..5cf94c25d7 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + bg_alpha_color="DkGray" + border="false" + follows="all" + height="400" + name="Outfits" + layout="topleft" + left="0" + top="0" + width="313"> + <accordion + background_visible="true" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + follows="all" + height="400" + layout="topleft" + left="3" + name="outfits_accordion" + top="0" + width="307"> + </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 8131b75b70..066ea3be6e 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -12,11 +12,17 @@ top="0" width="333"> <string - name="no_people" - value="No people" /> + name="no_recent_people" + value="No recent people. Looking for people to hang out with? Try [secondlife:///app/search/people Search] or the [secondlife:///app/worldmap World Map]." /> + <string + name="no_filtered_recent_people" + value="Didn't find what you're looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search]." /> <string name="no_one_near" - value="No one near" /> + value="No one nearby. Looking for people to hang out with? Try [secondlife:///app/search/people Search] or the [secondlife:///app/worldmap World Map]." /> + <string + name="no_one_filtered_near" + value="Didn't find what you're looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search]." /> <string name="no_friends_online" value="No friends online" /> @@ -24,21 +30,30 @@ name="no_friends" value="No friends" /> <string + name="no_friends_msg"> + Find friends using [secondlife:///app/search/people Search] or right-click on a Resident to add them as a friend. +Looking for people to hang out with? Try the [secondlife:///app/worldmap World Map]. + </string> + <string + name="no_filtered_friends_msg"> + Didn't find what you're looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search]. + </string> + <string name="people_filter_label" value="Filter People" /> <string name="groups_filter_label" value="Filter Groups" /> <!-- - *WORKAROUND: for group_list.no_groups_msg & group_list.no_filtered_groups_msg attributes. + *WORKAROUND: for group_list.no_items_msg & group_list.no_filtered_items_msg attributes. They are not defined as translatable in VLT. See EXT-5931 --> <string name="no_filtered_groups_msg" - value="[secondlife:///app/search/groups Try finding the group in search?]" /> + value="Didn't find what you're looking for? Try [secondlife:///app/search/groups/[SEARCH_TERM] Search]." /> <string name="no_groups_msg" - value="[secondlife:///app/search/groups Try searching for some groups to join.]" /> + value="Looking for Groups to join? Try [secondlife:///app/search/groups Search]." /> <filter_editor follows="left|top|right" height="23" @@ -259,14 +274,11 @@ <text follows="all" height="450" - left="10" - name="no_friends_msg" + left="13" + name="no_friends_help_text" top="10" width="293" - wrap="true"> - 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> + wrap="true" /> </panel> <panel background_opaque="true" @@ -287,6 +299,7 @@ If you're looking for people to hang out with, [secondlife:///app/worldmap try t Values are set from appropriate strings at the top of file via LLPeoplePanel::postBuild() --> <group_list + allow_select="true" background_visible="true" bg_alpha_color="DkGray2" bg_opaque_color="DkGray2" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index 7ab74855a5..0a56f711dd 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -332,21 +332,21 @@ increment="8" initial_value="160" label="Draw distance:" - label_width="140" + label_width="185" layout="topleft" - left="216" + left="200" max_val="512" min_val="64" name="DrawDistance" top="3" - width="255" /> + width="296" /> <text type="string" length="1" follows="left|top" height="12" layout="topleft" - left_delta="250" + left_delta="291" name="DrawDistanceMeterText2" top_delta="0" width="128"> @@ -360,13 +360,13 @@ increment="256" initial_value="4096" label="Max. particle count:" - label_width="140" + label_width="185" layout="topleft" - left="216" + left="200" max_val="8192" name="MaxParticleCount" top_pad="7" - width="262" /> + width="303" /> <slider control_name="RenderGlowResolutionPow" decimal_digits="0" @@ -375,7 +375,7 @@ increment="1" initial_value="8" label="Post process quality:" - label_width="140" + label_width="185" layout="topleft" left_delta="0" max_val="9" @@ -383,7 +383,7 @@ name="RenderPostProcess" show_text="false" top_pad="4" - width="223"> + width="264"> <slider.commit_callback function="Pref.UpdateSliderText" parameter="PostProcessText" /> @@ -407,14 +407,14 @@ increment="0.125" initial_value="160" label=" Objects:" - label_width="140" + label_width="185" layout="topleft" left_delta="0" max_val="2" name="ObjectMeshDetail" show_text="false" top_pad="6" - width="223"> + width="264"> <slider.commit_callback function="Pref.UpdateSliderText" parameter="ObjectMeshDetailText" /> @@ -425,13 +425,13 @@ height="16" initial_value="160" label=" Flexiprims:" - label_width="140" + label_width="185" layout="topleft" left_delta="0" name="FlexibleMeshDetail" show_text="false" top_pad="4" - width="223"> + width="264"> <slider.commit_callback function="Pref.UpdateSliderText" parameter="FlexibleMeshDetailText" /> @@ -443,13 +443,13 @@ increment="0.125" initial_value="160" label=" Trees:" - label_width="140" + label_width="185" layout="topleft" left_delta="0" name="TreeMeshDetail" show_text="false" top_pad="4" - width="223"> + width="264"> <slider.commit_callback function="Pref.UpdateSliderText" parameter="TreeMeshDetailText" /> @@ -461,13 +461,13 @@ increment="0.125" initial_value="160" label=" Avatars:" - label_width="140" + label_width="185" layout="topleft" left_delta="0" name="AvatarMeshDetail" show_text="false" top_pad="4" - width="223"> + width="264"> <slider.commit_callback function="Pref.UpdateSliderText" parameter="AvatarMeshDetailText" /> @@ -479,7 +479,7 @@ increment="0.125" initial_value="160" label=" Terrain:" - label_width="140" + label_width="185" layout="topleft" left_delta="0" max_val="2" @@ -487,7 +487,7 @@ name="TerrainMeshDetail" show_text="false" top_pad="4" - width="223"> + width="264"> <slider.commit_callback function="Pref.UpdateSliderText" parameter="TerrainMeshDetailText" /> @@ -501,7 +501,7 @@ increment="8" initial_value="160" label=" Sky:" - label_width="140" + label_width="185" layout="topleft" left_delta="0" max_val="128" @@ -509,7 +509,7 @@ name="SkyMeshDetail" show_text="false" top_pad="4" - width="223"> + width="264"> <slider.commit_callback function="Pref.UpdateSliderText" parameter="SkyMeshDetailText" /> @@ -520,7 +520,7 @@ follows="left|top" height="12" layout="topleft" - left="444" + left="469" name="PostProcessText" top="305" width="128"> @@ -605,7 +605,7 @@ follows="left|top" height="12" layout="topleft" - left_delta="-230" + left="200" name="LightingDetailText" top_pad="8" width="140"> @@ -616,15 +616,13 @@ draw_border="false" height="38" layout="topleft" - left_delta="0" name="LightingDetailRadio" top_pad="5" - width="321"> + width="200"> <radio_item height="16" label="Sun and moon only" layout="topleft" - left="3" name="SunMoon" value="0" top="3" @@ -633,7 +631,6 @@ height="16" label="Nearby local lights" layout="topleft" - left_delta="0" name="LocalLights" value="1" top_delta="16" @@ -645,7 +642,7 @@ follows="left|top" height="12" layout="topleft" - left="358" + left_pad="-30" name="TerrainDetailText" top="465" width="155"> @@ -659,23 +656,21 @@ left_delta="0" name="TerrainDetailRadio" top_pad="5" - width="321"> + width="70"> <radio_item height="16" label="Low" layout="topleft" - left="3" name="0" top="3" - width="315" /> + width="50" /> <radio_item height="16" label="High" layout="topleft" - left_delta="0" name="2" top_delta="16" - width="315" /> + width="50" /> </radio_group> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml index 500e65b916..2c6ceeef2e 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -374,5 +374,5 @@ min_val="10" name="web_proxy_port" top_delta="0" - width="140" /> + width="145" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index a666608103..d7a601d7a3 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -389,14 +389,6 @@ name="edit_profile_btn" tool_tip="Edit your personal information" width="130" /> - <button - follows="bottom|right" - height="23" - label="Edit Appearance" - left_pad="10" - name="edit_appearance_btn" - tool_tip="Create/edit your appearance: physical data, clothes and etc." - width="130" /> </layout_panel> </layout_stack> 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 9186efc431..08e36d5e57 100644 --- a/indra/newview/skins/default/xui/en/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml @@ -2,14 +2,14 @@ <panel border="false" follows="top|left" - height="320" + height="510" help_topic="panel_region_estate_tab" label="Estate" layout="topleft" left="0" name="Estate" top="320" - width="480"> + width="530"> <text type="string" length="1" @@ -20,7 +20,7 @@ name="estate_help_text" top="14" word_wrap="true" - width="250"> + width="300"> Changes to settings on this tab will affect all regions in the estate. </text> <text @@ -82,7 +82,7 @@ layout="topleft" left_delta="-4" top_pad="5" - width="250" /> + width="300" /> <check_box height="20" label="Use Global Time" @@ -184,14 +184,14 @@ layout="topleft" name="apply_btn" top_pad="10" - left="78" + left="110" width="97" /> <button follows="left|top" height="23" label="Send Message To Estate..." layout="topleft" - left="20" + left="45" name="message_estate_btn" top_pad="20" width="220" /> @@ -200,7 +200,7 @@ height="23" label="Kick Resident from Estate..." layout="topleft" - left="20" + left="45" name="kick_user_from_estate_btn" top_pad="5" width="220" /> @@ -213,7 +213,7 @@ height="20" layout="topleft" name="estate_manager_label" - right="470" + right="520" width="200"> Estate Managers: </text> @@ -222,7 +222,7 @@ follows="top|left" height="71" layout="topleft" - right="470" + right="520" top_pad="-5" width="200" /> <name_list @@ -240,7 +240,7 @@ label="Remove..." layout="topleft" name="remove_estate_manager_btn" - right="470" + right="520" top_pad="5" width="97" /> <button @@ -269,7 +269,7 @@ follows="top|left" height="71" layout="topleft" - right="470" + right="520" top_pad="-5" width="200" /> <name_list @@ -287,7 +287,7 @@ label="Remove..." layout="topleft" name="remove_allowed_avatar_btn" - right="470" + right="520" top_pad="5" width="97" /> <button @@ -316,7 +316,7 @@ follows="top|left" height="71" layout="topleft" - right="470" + right="520" top_pad="-5" width="200" /> <name_list @@ -334,7 +334,7 @@ label="Remove..." layout="topleft" name="remove_allowed_group_btn" - right="470" + right="520" top_pad="5" width="97" /> <button @@ -363,7 +363,7 @@ follows="top|left" height="71" layout="topleft" - right="470" + right="520" top_pad="-5" width="200" /> <name_list @@ -381,7 +381,7 @@ label="Remove..." layout="topleft" name="remove_banned_avatar_btn" - right="470" + right="520" top_pad="5" width="97" /> <button diff --git a/indra/newview/skins/default/xui/en/panel_world_map.xml b/indra/newview/skins/default/xui/en/panel_world_map.xml index 9f08d3a817..16860a6117 100644 --- a/indra/newview/skins/default/xui/en/panel_world_map.xml +++ b/indra/newview/skins/default/xui/en/panel_world_map.xml @@ -45,6 +45,14 @@ name="world_map_northwest"> NW </panel.string> + <panel.string + name="world_map_person"> + 1 person + </panel.string> + <panel.string + name="world_map_people"> + [NUMBER] people + </panel.string> <text type="string" length="1" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 813f59ff89..b0e43e72ed 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -1842,7 +1842,8 @@ Clears (deletes) the media and all params from the given face. <string name="LeaveMouselook">Press ESC to return to World View</string> <!-- inventory --> - <string name="InventoryNoMatchingItems">No matching items found in inventory. Try [secondlife:///app/search/groups "Search"].</string> + <string name="InventoryNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search].</string> + <string name="PlacesNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search].</string> <string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string> <string name="InventoryNoTexture">You do not have a copy of this texture in your inventory</string> <!-- use value="" because they have preceding spaces --> @@ -2156,7 +2157,7 @@ Clears (deletes) the media and all params from the given face. <!-- Region/Estate Covenant --> <string name="RegionNoCovenant">There is no Covenant provided for this Estate.</string> <string name="RegionNoCovenantOtherOwner">There is no Covenant provided for this Estate. The land on this estate is being sold by the Estate owner, not Linden Lab. Please contact the Estate Owner for sales details.</string> - <string name="covenant_last_modified">Last Modified:</string> + <string name="covenant_last_modified" value="Last Modified: " /> <!-- use value="" to keep the trailing space --> <string name="none_text" value=" (none) " /> <string name="never_text" value=" (never) " /> @@ -2897,6 +2898,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="LocationCtrlBuildTooltip">Building/dropping objects not allowed</string> <string name="LocationCtrlScriptsTooltip">Scripts not allowed</string> <string name="LocationCtrlDamageTooltip">Health</string> + <string name="LocationCtrlAdultIconTooltip">Adult Region</string> + <string name="LocationCtrlModerateIconTooltip">Moderate Region</string> + <string name="LocationCtrlGeneralIconTooltip">General Region</string> <!-- Strings used by the (currently Linux) auto-updater app --> <string name="UpdaterWindowTitle"> @@ -2930,6 +2934,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. Failed to start viewer </string> + <!-- System Messages --> + <string name="ItemsComingInTooFastFrom">[APP_NAME]: Items coming in too fast from [FROM_NAME], automatic preview disabled for [TIME] seconds</string> + <string name="ItemsComingInTooFast">[APP_NAME]: Items coming in too fast, automatic preview disabled for [TIME] seconds</string> + <!-- IM system messages --> <string name="IM_logging_string">-- Instant message logging enabled --</string> <string name="IM_typing_start_string">[NAME] is typing...</string> @@ -3103,4 +3111,14 @@ Abuse Report</string> <string name="New Script">New Script</string> <string name="New Folder">New Folder</string> <string name="Contents">Contents</string> -</strings> + + <!-- birth date format shared by avatar inspector and profile panels --> + <string name="AvatarBirthDateFormat">[mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]</string> + + <string name="DefaultMimeType">none/none</string> + <string name="texture_load_dimensions_error">Can't load images larger than [WIDTH]*[HEIGHT]</string> + + <!-- language specific white-space characters, delimiters, spacers, item separation symbols --> + <string name="sentences_separator" value=" "></string> + + </strings> diff --git a/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml b/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml new file mode 100644 index 0000000000..6040d24128 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<loading_indicator + follows="left|top" + mouse_opaque="false" + name="loading_indicator" + rotations_per_sec="1.0" + tab_stop="false" +/> diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml index 1d61447e31..02ea661da3 100644 --- a/indra/newview/skins/default/xui/en/widgets/location_input.xml +++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml @@ -6,6 +6,8 @@ <location_input font="SansSerifSmall" icon_maturity_general="Parcel_PG_Light" icon_maturity_adult="Parcel_R_Light" + icon_maturity_moderate="Parcel_M_Light" + maturity_help_topic="TODO" add_landmark_image_enabled="Favorite_Star_Active" add_landmark_image_disabled="Favorite_Star_Off" add_landmark_image_hover="Favorite_Star_Over" @@ -43,7 +45,7 @@ scale_image="false" top="19" left="-3" /> - <maturity_icon + <maturity_button name="maturity_icon" width="18" height="16" diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml index 6118a63872..f3a278945c 100644 --- a/indra/newview/skins/default/xui/es/floater_about_land.xml +++ b/indra/newview/skins/default/xui/es/floater_about_land.xml @@ -263,7 +263,7 @@ Vaya al menú Mundo > Acerca del terreno o seleccione otra parcela para ver s <text left="204" name="selected_objects_text" width="48"> [COUNT] </text> - <text left="4" name="Autoreturn" width="412"> + <text name="Autoreturn"> Devolución automát. de objetos de otros (en min., 0 la desactiva): </text> <line_editor name="clean other time" right="-20"/> diff --git a/indra/newview/skins/default/xui/es/floater_customize.xml b/indra/newview/skins/default/xui/es/floater_customize.xml index b7058d4314..77b670d5f0 100644 --- a/indra/newview/skins/default/xui/es/floater_customize.xml +++ b/indra/newview/skins/default/xui/es/floater_customize.xml @@ -81,7 +81,7 @@ <texture_picker label="Tatuaje: inferior" name="Lower Tattoos" tool_tip="Pulse para elegir una imagen" width="90"/> <button label="Crear una piel nueva" label_selected="Crear una piel nueva" name="Create New"/> <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> - <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> </panel> <panel label="Pelo" name="Hair"> @@ -116,7 +116,7 @@ <texture_picker label="Textura" name="Texture" tool_tip="Pulse para elegir una imagen"/> <button label="Crear un pelo nuevo" label_selected="Crear un pelo nuevo" name="Create New"/> <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> - <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> </panel> <panel label="Ojos" name="Eyes"> @@ -147,7 +147,7 @@ <texture_picker label="Iris" name="Iris" tool_tip="Pulse para elegir una imagen"/> <button label="Crear unos ojos nuevos" label_selected="Crear unos ojos nuevos" name="Create New"/> <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> - <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> </panel> <text label="Ropa" name="clothes_placeholder"> @@ -159,7 +159,7 @@ <button label="Quitarla" label_selected="Quitarla" name="Take Off"/> <button label="Crear una falda nueva" label_selected="Crear una falda nueva" name="Create New"/> <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> - <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> <text name="title"> [DESC] @@ -192,7 +192,7 @@ <button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/> <button label="Crear unos pantalones nuevos" label_selected="Crear unos pantalones nuevos" name="Create New" width="185"/> <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> - <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> <text name="title"> [DESC] @@ -249,7 +249,7 @@ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> <button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/> <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> - <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> </panel> <panel label="Calcetines" name="Socks"> @@ -282,7 +282,7 @@ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> <button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/> <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> - <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> </panel> <panel label="Chaqueta" name="Jacket"> @@ -316,7 +316,7 @@ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> <button label="Quitarla" label_selected="Quitarla" name="Take Off"/> <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> - <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> </panel> <panel label="Guantes" name="Gloves"> @@ -349,7 +349,7 @@ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> <button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/> <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> - <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> </panel> <panel label="Camiseta" name="Undershirt"> @@ -382,7 +382,7 @@ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> <button label="Quitarla" label_selected="Quitarla" name="Take Off"/> <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> - <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> </panel> <panel label="Ropa interior" name="Underpants"> @@ -415,7 +415,7 @@ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> <button label="Quitarla" label_selected="Quitarla" name="Take Off"/> <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> - <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> </panel> <panel label="Falda" name="Skirt"> @@ -448,7 +448,7 @@ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> <button label="Quitarla" label_selected="Quitarla" name="Take Off"/> <button label="Guardar" label_selected="Guardar" left="113" name="Save"/> - <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> + <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/> <button label="Restablecer" label_selected="Restablecer" name="Revert"/> </panel> <panel label="Tatuaje" name="Tattoo"> diff --git a/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml index 47ad16b277..9c3ac1be0e 100644 --- a/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml @@ -57,8 +57,8 @@ <text name="WL12amHash2"> | </text> - <button font="SansSerifSmall" width="96" left="546" label="Añadir un punto" label_selected="Añadir un punto" name="WLAddKey"/> - <button font="SansSerifSmall" width="96" left="546" label="Quitar un punto" label_selected="Quitar un punto" name="WLDeleteKey"/> + <button label="Añadir un punto" label_selected="Añadir un punto" name="WLAddKey"/> + <button label="Quitar un punto" label_selected="Quitar un punto" name="WLDeleteKey"/> <text name="WLCurKeyFrameText"> Configuración del fotograma clave: </text> @@ -86,9 +86,9 @@ </text> <button label="Probar" label_selected="Probar" name="WLAnimSky"/> <button label="Parar" label_selected="Parar" name="WLStopAnimSky"/> - <button width="150" font="SansSerifSmall" label="Usar el horario del estado" label_selected="Ir al horario del estado" name="WLUseLindenTime"/> - <button left="440" width="180" font="SansSerifSmall" label="Guardar este tipo de día" label_selected="Guardar este tipo de día" name="WLSaveDayCycle"/> - <button left="440" width="180" font="SansSerifSmall" label="Cargar y probar un tipo de día" label_selected="Cargar y probar un tipo de día" name="WLLoadDayCycle"/> + <button label="Usar el horario del estado" label_selected="Ir al horario del estado" name="WLUseLindenTime"/> + <button label="Guardar este tipo de día" label_selected="Guardar este tipo de día" name="WLSaveDayCycle"/> + <button label="Cargar y probar un tipo de día" label_selected="Cargar y probar un tipo de día" name="WLLoadDayCycle"/> </panel> </tab_container> </floater> diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml index bef803b45c..323e7c98bf 100644 --- a/indra/newview/skins/default/xui/es/menu_viewer.xml +++ b/indra/newview/skins/default/xui/es/menu_viewer.xml @@ -121,6 +121,7 @@ <menu_item_call label="Ayuda de [SECOND_LIFE]" name="Second Life Help"/> <menu_item_call label="Denunciar una infracción" name="Report Abuse"/> <menu_item_call label="Informar de un fallo" name="Report Bug"/> + <menu_item_call label="Acerca de [APP_NAME]" name="About Second Life"/> </menu> <menu label="Avanzado" name="Advanced"> <menu_item_call label="Parar mis animaciones" name="Stop Animating My Avatar"/> diff --git a/indra/newview/skins/default/xui/es/panel_region_general.xml b/indra/newview/skins/default/xui/es/panel_region_general.xml index 67800b2c6f..fe7f51c74e 100644 --- a/indra/newview/skins/default/xui/es/panel_region_general.xml +++ b/indra/newview/skins/default/xui/es/panel_region_general.xml @@ -30,10 +30,10 @@ <text label="Calificación" name="access_text"> Calificación: </text> - <icons_combo_box label="'Mature'" name="access_combo"> - <icons_combo_box.item label="'Adult'" name="Adult" value="42"/> + <icons_combo_box label="Moderado" name="access_combo"> + <icons_combo_box.item label="Adulto" name="Adult" value="42"/> <icons_combo_box.item label="Moderado" name="Mature" value="21"/> - <icons_combo_box.item label="'PG'" name="PG" value="13"/> + <icons_combo_box.item label="General" name="PG" value="13"/> </icons_combo_box> <button label="Aplicar" name="apply_btn"/> <button label="Teleportar a su Base a un Residente..." name="kick_btn"/> diff --git a/indra/newview/skins/default/xui/fr/floater_about_land.xml b/indra/newview/skins/default/xui/fr/floater_about_land.xml index 5d630cdf48..2e52a90373 100644 --- a/indra/newview/skins/default/xui/fr/floater_about_land.xml +++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml @@ -267,7 +267,7 @@ ou divisé. <text left_delta="214" name="selected_objects_text" width="48"> [COUNT] </text> - <text left="4" name="Autoreturn" width="440"> + <text name="Autoreturn"> Renvoi automatique des objets d'autres résidents (minutes, 0 pour désactiver) : </text> <line_editor name="clean other time" right="-6" width="36"/> diff --git a/indra/newview/skins/default/xui/fr/floater_color_picker.xml b/indra/newview/skins/default/xui/fr/floater_color_picker.xml index 7ead543c78..c54e3e9ce0 100644 --- a/indra/newview/skins/default/xui/fr/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/fr/floater_color_picker.xml @@ -25,7 +25,7 @@ <text left="8" name="Current color:"> Couleur actuelle : </text> - <text left="8" name="(Drag below to save.)" width="220"> - Enreg. : faire glisser dessous + <text name="(Drag below to save.)"> + Enr. : faire glisser dessous </text> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_customize.xml b/indra/newview/skins/default/xui/fr/floater_customize.xml index d5ee070dcd..ff407b25c1 100644 --- a/indra/newview/skins/default/xui/fr/floater_customize.xml +++ b/indra/newview/skins/default/xui/fr/floater_customize.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="APPARENCE" width="548"> - <tab_container name="customize tab container" tab_min_width="150" width="546"> +<floater name="floater customize" title="APPARENCE"> + <tab_container name="customize tab container" tab_min_width="150"> <text label="Parties du corps" name="body_parts_placeholder"> Parties du corps </text> <panel label="Silhouette" left="154" name="Shape" width="389"> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> <button label="Corps" label_selected="Corps" name="Body"/> <button label="Tête" label_selected="Tête" name="Head"/> <button label="Yeux" label_selected="Yeux" name="Eyes"/> @@ -44,8 +44,8 @@ Silhouette : </text> <button label="Créer une silhouette" label_selected="Créer une silhouette" name="Create New"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> </panel> <panel label="Peau" name="Skin"> <button label="Couleur" label_selected="Couleur" name="Skin Color" width="84"/> @@ -80,9 +80,9 @@ <texture_picker label="Tatouages haut" name="Upper Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/> <texture_picker label="Tatouages bas" name="Lower Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/> <button label="Créer une peau" label_selected="Créer une peau" name="Create New"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> <panel label="Cheveux" name="Hair"> <button label="Couleur" label_selected="Couleur" name="Color"/> @@ -115,9 +115,9 @@ </text> <texture_picker label="Texture" name="Texture" tool_tip="Cliquez pour sélectionner une image"/> <button label="Créer des cheveux" label_selected="Créer des cheveux" name="Create New"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> <panel label="Yeux" name="Eyes"> <text name="title"> @@ -146,9 +146,9 @@ </text> <texture_picker label="Iris" name="Iris" tool_tip="Cliquez pour sélectionner une image"/> <button label="Créer des yeux" label_selected="Créer des yeux" name="Create New"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> <text label="Habits" name="clothes_placeholder"> Habits @@ -158,9 +158,9 @@ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> <button label="Créer une chemise" label_selected="Créer une chemise" name="Create New"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> <text name="title"> [DESC] </text> @@ -191,9 +191,9 @@ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> <button label="Créer un pantalon" label_selected="Créer un pantalon" name="Create New"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> <text name="title"> [DESC] </text> @@ -248,9 +248,9 @@ <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/> <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> <panel label="Chaussettes" name="Socks"> <text name="title"> @@ -281,9 +281,9 @@ <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/> <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> <panel label="Veste" name="Jacket"> <text name="title"> @@ -315,9 +315,9 @@ <texture_picker label="Tissu (dessous)" name="Lower Fabric" tool_tip="Cliquez pour sélectionner une image" width="81"/> <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="81"/> <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> <panel label="Gants" name="Gloves"> <text name="title"> @@ -348,9 +348,9 @@ <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/> <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> <panel label="Débardeur" name="Undershirt"> <text name="title"> @@ -375,15 +375,15 @@ <text name="no modify instructions"> Vous n'avez pas la permission de modifier cet objet. </text> - <text bottom="-470" name="Item Action Label" right="92"> + <text name="Item Action Label"> Débardeur : </text> <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/> <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> <panel label="Caleçon" name="Underpants"> <text name="title"> @@ -408,15 +408,15 @@ <text name="no modify instructions"> Vous n'avez pas la permission de modifier cet objet. </text> - <text bottom="-470" name="Item Action Label" right="92"> + <text name="Item Action Label"> Caleçon : </text> <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/> <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> <panel label="Jupe" name="Skirt"> <text name="title"> @@ -447,9 +447,9 @@ <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/> <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/> <button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> - <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> - <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> - <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save"/> + <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> + <button label="Rétablir" label_selected="Rétablir" name="Revert"/> </panel> <panel label="Tatouage" name="Tattoo"> <text name="title"> @@ -523,7 +523,7 @@ </panel> </tab_container> <scroll_container left="251" name="panel_container"/> - <button label="Infos sur les scripts" label_selected="Infos sur les scripts" name="script_info" tool_tip="Afficher les scripts attachés à votre avatar"/> + <button label="Infos scripts" label_selected="Infos scripts" name="script_info" tool_tip="Afficher les scripts attachés à votre avatar"/> <button label="Créer tenue" label_selected="Créer une tenue..." name="make_outfit_btn"/> <button label="Annuler" label_selected="Annuler" name="Cancel"/> <button label="OK" label_selected="OK" name="Ok"/> diff --git a/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml index e8122108a8..ec3b246c76 100644 --- a/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml @@ -58,15 +58,15 @@ | </text> <button label="Ajouter clé" label_selected="Ajouter clé" name="WLAddKey"/> - <button label="Supprimer clé" label_selected="Supprimer clé" name="WLDeleteKey" width="89"/> - <text name="WLCurKeyFrameText" width="170"> + <button label="Supprimer clé" label_selected="Supprimer clé" name="WLDeleteKey"/> + <text name="WLCurKeyFrameText"> Réglages des images-clés : </text> - <text name="WLCurKeyTimeText" width="170"> + <text name="WLCurKeyTimeText"> Heure de la clé : </text> - <spinner label="Heure" name="WLCurKeyHour" label_width="80" width="74"/> - <spinner label="Min" name="WLCurKeyMin" label_width="80"/> + <spinner label="Heure" name="WLCurKeyHour"/> + <spinner label="Min" name="WLCurKeyMin"/> <text name="WLCurKeyTimeText2"> Préréglages clés : </text> @@ -78,9 +78,9 @@ <text name="DayCycleText2"> Durée du cycle : </text> - <spinner label="Heure" name="WLLengthOfDayHour" label_width="80" width="74" /> + <spinner label="Heure" name="WLLengthOfDayHour"/> <spinner label="Min" name="WLLengthOfDayMin" /> - <spinner label="S" name="WLLengthOfDaySec" label_width="10" width="50" left_delta="95"/> + <spinner label="S" name="WLLengthOfDaySec"/> <text name="DayCycleText3"> Prévisualiser : </text> diff --git a/indra/newview/skins/default/xui/fr/menu_group_plus.xml b/indra/newview/skins/default/xui/fr/menu_group_plus.xml index f5882261b0..0db5afedc7 100644 --- a/indra/newview/skins/default/xui/fr/menu_group_plus.xml +++ b/indra/newview/skins/default/xui/fr/menu_group_plus.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <menu name="menu_group_plus"> - <menu_item_call label="Rejoignez des groupes..." name="item_join"/> + <menu_item_call label="Rejoindre des groupes..." name="item_join"/> <menu_item_call label="Nouveau groupe..." name="item_new"/> </menu> diff --git a/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml index 91bccfd699..4cfdfd2614 100644 --- a/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml @@ -7,7 +7,7 @@ <menu_item_call label="Réinitialiser les filtres" name="reset_filters"/> <menu_item_call label="Fermer tous les dossiers" name="close_folders"/> <menu_item_call label="Vider la corbeille" name="empty_trash"/> - <menu_item_call label="Vider les Objets trouvés" name="empty_lostnfound"/> + <menu_item_call label="Vider les objets trouvés" name="empty_lostnfound"/> <menu_item_call label="Enregistrer la texture sous" name="Save Texture As"/> <menu_item_call label="Trouver l'original" name="Find Original"/> <menu_item_call label="Trouver tous les liens" name="Find All Links"/> diff --git a/indra/newview/skins/default/xui/fr/panel_main_inventory.xml b/indra/newview/skins/default/xui/fr/panel_main_inventory.xml index 1a4450cccc..6cd9db2a5e 100644 --- a/indra/newview/skins/default/xui/fr/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/fr/panel_main_inventory.xml @@ -23,7 +23,7 @@ <menu_item_call label="Réinitialiser les filtres" name="Reset Current"/> <menu_item_call label="Fermer tous les dossiers" name="Close All Folders"/> <menu_item_call label="Vider la corbeille" name="Empty Trash"/> - <menu_item_call label="Vider les Objets trouvés" name="Empty Lost And Found"/> + <menu_item_call label="Vider les objets trouvés" name="Empty Lost And Found"/> </menu> <menu label="Créer" name="Create"> <menu_item_call label="Nouveau dossier" name="New Folder"/> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 0ea11bb80f..6d81df5cdb 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -2085,7 +2085,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Large </string> <string name="Brow Size"> - Taille + Taille du front </string> <string name="Bug Eyes"> Yeux globuleux @@ -2235,7 +2235,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Extrémités </string> <string name="Egg Head"> - Forme de la tête + Proéminence </string> <string name="Eye Bags"> Cernes @@ -2361,7 +2361,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Gants avec doigts </string> <string name="Glove Length"> - Longueur des gants + Longueur </string> <string name="Hair"> Cheveux @@ -2475,7 +2475,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Angle mâchoire </string> <string name="Jaw Jut"> - Saillie de la mâchoire + Saillie mâchoire </string> <string name="Jaw Shape"> Mâchoire @@ -2559,7 +2559,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Fente labiale </string> <string name="Lip Cleft Depth"> - Fente labiale + Prof. fente labiale </string> <string name="Lip Fullness"> Volume des lèvres @@ -2643,7 +2643,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Abaisser </string> <string name="Lower Bridge"> - Arête plus basse + Arête inférieure </string> <string name="Lower Cheeks"> Joue inférieure @@ -2817,19 +2817,19 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Épaisseur du nez </string> <string name="Nose Tip Angle"> - Bout du nez + Angle bout du nez </string> <string name="Nose Tip Shape"> - Bout du nez + Forme bout du nez </string> <string name="Nose Width"> Largeur du nez </string> <string name="Nostril Division"> - Division des narines + Division narines </string> <string name="Nostril Width"> - Largeur des narines + Largeur narines </string> <string name="Opaque"> Opaque @@ -2919,10 +2919,10 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Plus rose </string> <string name="Platform Height"> - Plateforme (hauteur) + Platef. (hauteur) </string> <string name="Platform Width"> - Plateforme (largeur) + Platef. (largeur) </string> <string name="Pointy"> Pointue @@ -2946,7 +2946,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Plus </string> <string name="Puffy Eyelids"> - Cernes + Paup. gonflées </string> <string name="Rainbow Color"> Couleur arc en ciel @@ -3012,7 +3012,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Vers la gauche </string> <string name="Shift Mouth"> - Déplacer la bouche + Déplacement </string> <string name="Shift Right"> Vers la droite @@ -3210,7 +3210,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Forme de l'orteil </string> <string name="Toe Thickness"> - Épaisseur de l'orteil + Épaisseur orteil </string> <string name="Torso Length"> Longueur du torse @@ -3237,7 +3237,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Arête supérieure </string> <string name="Upper Cheeks"> - Pommette + Joue supérieure </string> <string name="Upper Chin Cleft"> Menton supérieur diff --git a/indra/newview/skins/default/xui/it/floater_about_land.xml b/indra/newview/skins/default/xui/it/floater_about_land.xml index bc23c2e8ff..742cdf44a5 100644 --- a/indra/newview/skins/default/xui/it/floater_about_land.xml +++ b/indra/newview/skins/default/xui/it/floater_about_land.xml @@ -266,7 +266,7 @@ o suddivisa. <text left="214" name="selected_objects_text" width="48"> [COUNT] </text> - <text left="4" name="Autoreturn" width="412"> + <text name="Autoreturn"> Restituzione automatica degli oggetti di altri residenti (minuti, 0 per disattivarla): </text> <line_editor name="clean other time" right="-20"/> diff --git a/indra/newview/skins/default/xui/it/floater_customize.xml b/indra/newview/skins/default/xui/it/floater_customize.xml index 75ddf43f65..63c26b4d73 100644 --- a/indra/newview/skins/default/xui/it/floater_customize.xml +++ b/indra/newview/skins/default/xui/it/floater_customize.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="ASPETTO" width="551"> - <tab_container name="customize tab container" tab_min_width="120" width="549"> +<floater name="floater customize" title="ASPETTO"> + <tab_container name="customize tab container" tab_min_width="120"> <text label="Parti del corpo" name="body_parts_placeholder"> Parti del corpo </text> - <panel label="Forma del corpo" left="124" name="Shape" width="389"> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <panel label="Forma del corpo" left="124" name="Shape"> + <button label="Crea una nuova forma del corpo" label_selected="Crea una nuova forma del corpo" name="Create New" width="190"/> <button label="Corpo" label_selected="Corpo" name="Body"/> <button label="Testa" label_selected="Testa" name="Head"/> <button label="Occhi" label_selected="Occhi" name="Eyes"/> @@ -40,12 +40,12 @@ <text name="no modify instructions"> Non hai il permesso di modificare questo indumento. </text> - <text name="Item Action Label" right="89"> + <text name="Item Action Label"> Forma del corpo: </text> - <button label="Crea una nuova forma del corpo" label_selected="Crea una nuova forma del corpo" name="Create New" width="190"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> - <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> + <button label="Salva" label_selected="Salva" name="Save"/> + <button label="Salva come..." label_selected="Salva come..." name="Save As"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/> </panel> <panel label="Pelle" name="Skin"> <button label="Colore della pelle" label_selected="Colore della pelle" name="Skin Color" width="115"/> @@ -80,9 +80,9 @@ <texture_picker label="Tatuaggi: superiori" name="Upper Tattoos" tool_tip="Clicca per scegliere un'immagine" width="96"/> <texture_picker label="Tatuaggi: inferiori" name="Lower Tattoos" tool_tip="Clicca per scegliere un'immagine" width="96"/> <button label="Crea una nuova pelle" label_selected="Crea una nuova pelle" name="Create New"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> - <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button label="Salva" label_selected="Salva" name="Save"/> + <button label="Salva come..." label_selected="Salva come..." name="Save As"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/> </panel> <panel label="Capelli" name="Hair"> <button label="Capelli" label_selected="Colore" name="Color"/> @@ -115,9 +115,9 @@ </text> <texture_picker label="Texture" name="Texture" tool_tip="Clicca per scegliere un'immagine"/> <button label="Crea nuovi capelli" label_selected="Crea nuovi capelli" name="Create New"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> </panel> <panel label="Occhi" name="Eyes"> <text name="title"> @@ -146,9 +146,9 @@ </text> <texture_picker label="Iride" name="Iris" tool_tip="Clicca per scegliere un'immagine"/> <button label="Crea nuovi occhi" label_selected="Crea nuovi occhi" name="Create New"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> </panel> <text label="Vestiti" name="clothes_placeholder"> Abiti @@ -158,9 +158,9 @@ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> <button label="Togli" label_selected="Togli" name="Take Off"/> <button label="Crea una nuova camicia" label_selected="Crea una nuova camicia" name="Create New"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> <text name="title"> [DESC] </text> @@ -191,9 +191,9 @@ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> <button label="Togli" label_selected="Togli" name="Take Off"/> <button label="Crea nuovi pantaloni" label_selected="Crea nuovi pantaloni" name="Create New"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> <text name="title"> [DESC] </text> @@ -248,9 +248,9 @@ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> <button label="Togli" label_selected="Togli" name="Take Off"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> </panel> <panel label="Calze" name="Socks"> <text name="title"> @@ -281,9 +281,9 @@ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> <button label="Togli" label_selected="Togli" name="Take Off"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> </panel> <panel label="Giacca" name="Jacket"> <text name="title"> @@ -315,9 +315,9 @@ <texture_picker label="Tessuto: inferiore" name="Lower Fabric" tool_tip="Clicca per scegliere un'immagine" width="96"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> <button label="Togli" label_selected="Togli" name="Take Off"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> </panel> <panel label="Guanti" name="Gloves"> <text name="title"> @@ -348,9 +348,9 @@ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> <button font="SansSerifSmall" label="Rimuovi l'indumento" label_selected="Rimuovi l'indumento" name="Take Off" width="115"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> </panel> <panel label="Canottiera" name="Undershirt"> <text name="title"> @@ -381,9 +381,9 @@ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> <button font="SansSerifSmall" label="Rimuovi l'indumento" label_selected="Rimuovi l'indumento" name="Take Off" width="115"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> </panel> <panel label="Mutande" name="Underpants"> <text name="title"> @@ -414,9 +414,9 @@ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> <button font="SansSerifSmall" label="Rimuovi l'indumento" label_selected="Rimuovi l'indumento" name="Take Off" width="115"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> </panel> <panel label="Gonna" name="Skirt"> <text name="title"> @@ -447,9 +447,9 @@ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> <button font="SansSerifSmall" label="Rimuovi l'indumento" label_selected="Rimuovi l'indumento" name="Take Off" width="115"/> - <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> + <button label="Salva" label_selected="Salva" name="Save"/> <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> + <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> </panel> <panel label="Tatuaggio" name="Tattoo"> <text name="title"> @@ -522,7 +522,7 @@ <button label="Ripristina" label_selected="Ripristina" name="Revert"/> </panel> </tab_container> - <scroll_container left="254" name="panel_container"/> + <scroll_container name="panel_container"/> <button label="Informazioni script" label_selected="Informazioni script" name="script_info" tool_tip="Mostra gli script collegati al tuo avatar"/> <button label="Crea vestiario" label_selected="Crea vestiario" name="make_outfit_btn"/> <button label="Annulla" label_selected="Annulla" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml index 808c758bb6..98c385d29f 100644 --- a/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml @@ -57,8 +57,8 @@ <text name="WL12amHash2"> | </text> - <button font="SansSerifSmall" width="96" left="546" label="Aggiungi voce" label_selected="Aggiungi voce" name="WLAddKey"/> - <button font="SansSerifSmall" width="96" left="546" label="Cancella voce" label_selected="Cancella voce" name="WLDeleteKey"/> + <button label="Aggiungi voce" label_selected="Aggiungi voce" name="WLAddKey"/> + <button label_selected="Cancella voce" name="WLDeleteKey"/> <text name="WLCurKeyFrameText"> Impostazioni del fotogramma chiave: </text> @@ -84,9 +84,9 @@ <text name="DayCycleText3"> Anteprima: </text> - <button width="55" font="SansSerifSmall" label="Avvia" label_selected="Avvia" name="WLAnimSky"/> - <button width="55" left_delta="60" font="SansSerifSmall" label="Arresta!" label_selected="Arresta" name="WLStopAnimSky"/> - <button left_delta="60" width="150" font="SansSerifSmall" label="Usa l'ora della proprietà" label_selected="Vai all'ora della proprietà" name="WLUseLindenTime"/> + <button label="Avvia" label_selected="Avvia" name="WLAnimSky"/> + <button label="Arresta!" label_selected="Arresta" name="WLStopAnimSky"/> + <button label="Usa l'ora della proprietà" label_selected="Vai all'ora della proprietà" name="WLUseLindenTime"/> <button label="Salva il test del giorno" label_selected="Salva il test del giorno" name="WLSaveDayCycle"/> <button label="Carica il test del giorno" label_selected="Carica il test del giorno" name="WLLoadDayCycle"/> </panel> diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml index 36b44abf4b..d9b401ea46 100644 --- a/indra/newview/skins/default/xui/it/menu_viewer.xml +++ b/indra/newview/skins/default/xui/it/menu_viewer.xml @@ -118,9 +118,10 @@ </menu> </menu> <menu label="Aiuto" name="Help"> - <menu_item_call label="[SECOND_LIFE] Aiuto" name="Second Life Help"/> + <menu_item_call label="Aiuto di [SECOND_LIFE]" name="Second Life Help"/> <menu_item_call label="Segnala abuso" name="Report Abuse"/> <menu_item_call label="Segnala bug" name="Report Bug"/> + <menu_item_call label="Informazioni su [APP_NAME]" name="About Second Life"/> </menu> <menu label="Avanzate" name="Advanced"> <menu_item_call label="Ferma animazione" name="Stop Animating My Avatar"/> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml index d02a794219..5bd0cfb106 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml @@ -47,12 +47,12 @@ <check_box initial_value="true" label="Avatar bidimensionali (Impostor)" name="AvatarImpostors"/> <check_box initial_value="true" label="Hardware Skinning" name="AvatarVertexProgram"/> <check_box initial_value="true" label="Abiti dell'avatar" name="AvatarCloth"/> - <slider label="Distanza di disegno:" label_width="158" name="DrawDistance" width="255"/> + <slider label="Distanza di disegno:" name="DrawDistance"/> <text name="DrawDistanceMeterText2"> m </text> - <slider label="Conteggio massimo particelle:" label_width="158" name="MaxParticleCount" width="262"/> - <slider label="Qualità in post-produzione:" label_width="158" name="RenderPostProcess" width="223"/> + <slider label="Conteggio massimo particelle:" name="MaxParticleCount"/> + <slider label="Qualità in post-produzione:" name="RenderPostProcess"/> <text name="MeshDetailText"> Dettagli reticolo: </text> @@ -99,7 +99,7 @@ </radio_group> </panel> <button label="Applica" label_selected="Applica" name="Apply"/> - <button label="Reimposta" left="110" name="Defaults" width="190"/> + <button label="Reimposta" name="Defaults"/> <button label="Avanzate" name="Advanced"/> <button label="Hardware" label_selected="Hardware" name="GraphicsHardwareButton"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/floater_about_land.xml b/indra/newview/skins/default/xui/ja/floater_about_land.xml index c9c01bc2a4..d23ab3565b 100644 --- a/indra/newview/skins/default/xui/ja/floater_about_land.xml +++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml @@ -264,7 +264,7 @@ <text left="200" name="selected_objects_text"> [COUNT] </text> - <text name="Autoreturn" width="500"> + <text name="Autoreturn"> 他人のオブジェクトを自動返却(分単位、0 で自動返却なし): </text> <line_editor left_delta="5" name="clean other time" right="-80"/> diff --git a/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml index 7bda25e00f..b924af4e67 100644 --- a/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml @@ -84,10 +84,10 @@ <text name="DayCycleText3"> プレビュー: </text> - <button label="再生" label_selected="再生" name="WLAnimSky" left_delta="70"/> + <button label="再生" label_selected="再生" name="WLAnimSky"/> <button label="停止" label_selected="停止" name="WLStopAnimSky" /> <button label="不動産の時刻を使用" - label_selected="不動産の時刻に変更" name="WLUseLindenTime" width="140"/> + label_selected="不動産の時刻に変更" name="WLUseLindenTime"/> <button label="デイテストを保存" label_selected="デイテストを保存" name="WLSaveDayCycle" /> <button label="デイテストをロード" diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index b9df82adcd..a54d96061f 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -3577,4 +3577,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ <string name="Contents"> コンテンツ </string> + <string name="AvatarBirthDateFormat"> + [year,datetime,slt]/[mthnum,datetime,slt]/[day,datetime,slt] + </string> </strings> diff --git a/indra/newview/skins/default/xui/nl/floater_customize.xml b/indra/newview/skins/default/xui/nl/floater_customize.xml index 4de26347e1..e6a4ed7a27 100644 --- a/indra/newview/skins/default/xui/nl/floater_customize.xml +++ b/indra/newview/skins/default/xui/nl/floater_customize.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="UITERLIJK" width="551"> - <tab_container name="customize tab container" tab_min_width="120" width="549"> +<floater name="floater customize" title="UITERLIJK"> + <tab_container name="customize tab container" tab_min_width="120"> <placeholder label="Lichaamsdelen" name="body_parts_placeholder"/> <panel label="Postuur" name="Shape" left="124" width="389"> <button label="Herstel" label_selected="Herstel" name="Revert"/> @@ -462,7 +462,7 @@ slepen. Ook kunt u zelf van begin af aan een nieuwe creëren en dragen. <button label="Herstel" label_selected="Herstel" name="Revert"/> </panel> </tab_container> - <scroll_container left="254" name="panel_container"/> + <scroll_container name="panel_container"/> <button label="Annuleren" label_selected="Annuleren" name="Cancel"/> <button label="OK" label_selected="OK" name="Ok"/> <button label="Maak kleding..." label_selected="Maak kleding..." name="Make Outfit" left="110"/> diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml index 85ceb9592f..d1f0ac0e5c 100644 --- a/indra/newview/skins/default/xui/pl/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml @@ -119,6 +119,7 @@ <menu_item_call label="[SECOND_LIFE] Portal Pomocy" name="Second Life Help"/> <menu_item_call label="Złóż Raport o Nadużyciu" name="Report Abuse"/> <menu_item_call label="Zgłoś Błędy Klienta" name="Report Bug"/> + <menu_item_call label="O [APP_NAME]" name="About Second Life"/> </menu> <menu label="Zaawansowane" name="Advanced"> <menu_item_call label="Zatrzymaj Wszystkie Animacje" name="Stop Animating My Avatar"/> diff --git a/indra/newview/skins/default/xui/pt/floater_about_land.xml b/indra/newview/skins/default/xui/pt/floater_about_land.xml index 252969609a..cebf03755b 100644 --- a/indra/newview/skins/default/xui/pt/floater_about_land.xml +++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml @@ -265,7 +265,7 @@ ou sub-divididos. <text left="214" name="selected_objects_text" width="48"> [COUNT] </text> - <text left="4" name="Autoreturn" width="412"> + <text name="Autoreturn"> Devolver objetos de outros residentes (p/ desligar tecle 0) </text> <line_editor name="clean other time" right="-10"/> diff --git a/indra/newview/skins/default/xui/pt/floater_customize.xml b/indra/newview/skins/default/xui/pt/floater_customize.xml index 2a367cb24a..a9ec0b9b1f 100644 --- a/indra/newview/skins/default/xui/pt/floater_customize.xml +++ b/indra/newview/skins/default/xui/pt/floater_customize.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="APARÊNCIA" width="546"> - <tab_container name="customize tab container" tab_min_width="115" width="544"> +<floater name="floater customize" title="APARÊNCIA"> + <tab_container name="customize tab container" tab_min_width="115"> <text label="Corpo" name="body_parts_placeholder"> Partes do corpo </text> diff --git a/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml index 42f34a3d82..dbca247a2f 100644 --- a/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml @@ -30,9 +30,9 @@ <text name="WL12am2"> 24:00 </text> - <button font="SansSerifSmall" width="96" left="546" label="Adicionar chave" label_selected="Adicionar chave" name="WLAddKey"/> - <button font="SansSerifSmall" width="96" left="546" label="Apagar chave" label_selected="Apagar chave" name="WLDeleteKey"/> - <text name="WLCurKeyFrameText" width="190" left="17"> + <button label="Adicionar chave" label_selected="Adicionar chave" name="WLAddKey"/> + <button label="Apagar chave" label_selected="Apagar chave" name="WLDeleteKey"/> + <text name="WLCurKeyFrameText"> Configurações de Quadro-chave: </text> <text name="WLCurKeyTimeText"> @@ -47,7 +47,7 @@ <text name="DayCycleText"> Grudar: </text> - <combo_box label="5 minutos" name="WLSnapOptions" width="85"/> + <combo_box label="5 minutos" name="WLSnapOptions"/> <text name="DayCycleText2"> Duração do Ciclo: </text> @@ -59,7 +59,7 @@ </text> <button label="Tocar" label_selected="Tocar" name="WLAnimSky"/> <button label="Pare!" label_selected="Pare" name="WLStopAnimSky"/> - <button width="175" font="SansSerifSmall" label="Usar o horário da Propriedade" label_selected="Ir para o horário da Propriedade" name="WLUseLindenTime"/> + <button label="Usar o horário da Propriedade" label_selected="Ir para o horário da Propriedade" name="WLUseLindenTime"/> <button label="Salvar o Dia teste" label_selected="Salvar o Dia teste" name="WLSaveDayCycle"/> <button label="Carregar o Dia teste" label_selected="Carregar o Dia teste" name="WLLoadDayCycle"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml index 45f7ca1424..fe69d228e9 100644 --- a/indra/newview/skins/default/xui/pt/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml @@ -121,6 +121,7 @@ <menu_item_call label="[SECOND_LIFE] Ajuda" name="Second Life Help"/> <menu_item_call label="Denunciar abuso" name="Report Abuse"/> <menu_item_call label="Relatar bug" name="Report Bug"/> + <menu_item_call label="Sobre [APP_NAME]" name="About Second Life"/> </menu> <menu label="Avançado" name="Advanced"> <menu_item_call label="Parar minha animação" name="Stop Animating My Avatar"/> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 18ac10fe38..668e21c253 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -332,6 +332,12 @@ class WindowsManifest(ViewerManifest): self.path("media_plugin_webkit.dll") self.end_prefix() + # winmm.dll shim + if self.prefix(src='../media_plugins/winmmshim/%s' % self.args['configuration'], dst="llplugin"): + self.path("winmm.dll") + self.end_prefix() + + if self.args['configuration'].lower() == 'debug': if self.prefix(src=os.path.join(os.pardir, os.pardir, 'libraries', 'i686-win32', 'lib', 'debug'), dst="llplugin"): @@ -639,10 +645,14 @@ class DarwinManifest(ViewerManifest): self.path("../mac_crash_logger/" + self.args['configuration'] + "/mac-crash-logger.app", "mac-crash-logger.app") self.path("../mac_updater/" + self.args['configuration'] + "/mac-updater.app", "mac-updater.app") + # plugin launcher + self.path("../llplugin/slplugin/" + self.args['configuration'] + "/SLPlugin.app", "SLPlugin.app") + # our apps dependencies on shared libs if dylibs["llcommon"]: mac_crash_logger_res_path = self.dst_path_of("mac-crash-logger.app/Contents/Resources") mac_updater_res_path = self.dst_path_of("mac-updater.app/Contents/Resources") + slplugin_res_path = self.dst_path_of("SLPlugin.app/Contents/Resources") for libfile in ("libllcommon.dylib", "libapr-1.0.3.7.dylib", "libaprutil-1.0.3.8.dylib", @@ -656,9 +666,10 @@ class DarwinManifest(ViewerManifest): {'target': target_lib, 'link' : os.path.join(mac_updater_res_path, libfile)} ) - - # plugin launcher - self.path("../llplugin/slplugin/" + self.args['configuration'] + "/SLPlugin", "SLPlugin") + self.run_command("ln -sf %(target)r %(link)r" % + {'target': target_lib, + 'link' : os.path.join(slplugin_res_path, libfile)} + ) # plugins if self.prefix(src="", dst="llplugin"): |