diff --git a/.hgtags b/.hgtags index b0da8b0d987f003ea3e50ff9d9fb28482d18013f..a4fb6ce9f80c89f13d812b8466a457d6d6dc5d24 100755 --- a/.hgtags +++ b/.hgtags @@ -546,3 +546,10 @@ ac3b1332ad4f55b7182a8cbcc1254535a0069f75 5.1.7-release 21b7604680ef6b6ea67f8bebaaa588d6e263bdc1 6.0.1-release a3143db58a0f6b005232bf9018e7fef17ff9ec90 6.1.0-release 50f0ece62ddb5a244ecb6d00ef5a89d80ad50efa 6.1.1-release +82a89165e5929a6c3073d6cd60a543cb395f147b 6.2.0-release +706bdc7e25c6e6b8fb56f4a13fcce2936e70a79c 6.2.1-release +ec09daf1899c1c01c4ba0ba950fae572f2a612a8 6.2.2-release +ab2ec5c5423b277d23fd0511ce50c15123ff2e03 6.2.3-release +67297f9902857e357570c44722ad84de3aff974e 6.2.4-release +9777aec6dc4a30a24537297ac040861ce16b82ae 6.3.0-release +ece699718f163921717bb95a6131e94af4c4138f 6.3.1-release diff --git a/doc/contributions.txt b/doc/contributions.txt index afde7838df7e0272a56a565e1878a2c112573e79..0c68ae31002b9717e4962e0403196fca84868d89 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -222,6 +222,7 @@ Ansariel Hiller MAINT-8085 MAINT-8723 SL-10385 + SL-10891 Aralara Rajal Arare Chantilly CHUIBUG-191 @@ -373,6 +374,7 @@ Cinder Roxley STORM-2116 STORM-2127 STORM-2144 + SL-3404 Clara Young Coaldust Numbers VWR-1095 @@ -778,6 +780,7 @@ Jonathan Yap STORM-2100 STORM-2104 STORM-2142 + SL-10089 Kadah Coba STORM-1060 STORM-1843 @@ -1068,6 +1071,9 @@ Nicky Dasmijn STORM-2010 STORM-2082 MAINT-6665 + SL-10291 + SL-10293 + SL-11061 Nicky Perian OPEN-1 STORM-1087 @@ -1318,6 +1324,7 @@ Sovereign Engineer STORM-2143 STORM-2148 MAINT-7343 + SL-11079 SpacedOut Frye VWR-34 VWR-45 diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index 6c20a813bad182415bf5ca7665a1055c9bf0717a..62a8f3f003e8e0c19580eef1590c29d4e3302090 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -3,8 +3,8 @@ # cmake_minimum_required should appear before any # other commands to guarantee full compatibility # with the version specified -## prior to 3.4, the Windows manifest handling was missing -cmake_minimum_required(VERSION 3.4.0 FATAL_ERROR) +## 3.8 added VS_DEBUGGER_WORKING_DIRECTORY support +cmake_minimum_required(VERSION 3.8.0 FATAL_ERROR) set(ROOT_PROJECT_NAME "SecondLife" CACHE STRING "The root project/makefile/solution name. Defaults to SecondLife.") @@ -83,6 +83,12 @@ add_dependencies(viewer secondlife-bin) add_subdirectory(${VIEWER_PREFIX}doxygen EXCLUDE_FROM_ALL) +# sets the 'startup project' for debugging from visual studio. +set_property( + DIRECTORY ${VIEWER_PREFIX} + PROPERTY VS_STARTUP_PROJECT secondlife-bin + ) + if (LL_TESTS) # Define after the custom targets are created so # individual apps can add themselves as dependencies diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index 40fc706a9908b02a80bc4f1eb4ef0edd9192a951..03da30649a1c87033bdb40e6f326203bd3f0f326 100644 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -151,6 +151,8 @@ endif (LINUX) if (DARWIN) + # Warnings should be fatal -- thanks, Nicky Perian, for spotting reversed default + set(CLANG_DISABLE_FATAL_WARNINGS OFF) set(CMAKE_CXX_LINK_FLAGS "-Wl,-headerpad_max_install_names,-search_paths_first") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_CXX_LINK_FLAGS}") set(DARWIN_extra_cstar_flags "-Wno-unused-local-typedef -Wno-deprecated-declarations") diff --git a/indra/llappearance/llavatarappearance.cpp b/indra/llappearance/llavatarappearance.cpp index 38cda2e2f1bda05eb1d19911a97c8d0e159c0274..e60037b7399dbfe16881929a9325cabae3618fda 100644 --- a/indra/llappearance/llavatarappearance.cpp +++ b/indra/llappearance/llavatarappearance.cpp @@ -1482,6 +1482,21 @@ BOOL LLAvatarAppearance::teToColorParams( ETextureIndex te, U32 *param_name ) param_name[0] = 1071; //"tattoo_red"; param_name[1] = 1072; //"tattoo_green"; param_name[2] = 1073; //"tattoo_blue"; + break; + case TEX_HEAD_UNIVERSAL_TATTOO: + case TEX_UPPER_UNIVERSAL_TATTOO: + case TEX_LOWER_UNIVERSAL_TATTOO: + case TEX_SKIRT_TATTOO: + case TEX_HAIR_TATTOO: + case TEX_EYES_TATTOO: + case TEX_LEFT_ARM_TATTOO: + case TEX_LEFT_LEG_TATTOO: + case TEX_AUX1_TATTOO: + case TEX_AUX2_TATTOO: + case TEX_AUX3_TATTOO: + param_name[0] = 1238; //"tattoo_universal_red"; + param_name[1] = 1239; //"tattoo_universal_green"; + param_name[2] = 1240; //"tattoo_universal_blue"; break; default: diff --git a/indra/llappearance/llavatarappearancedefines.cpp b/indra/llappearance/llavatarappearancedefines.cpp index b5282d4f6f47350be8543becfaa7ea6794feb186..c72943bb8292a833841fce78ff6d3941936e7b1a 100644 --- a/indra/llappearance/llavatarappearancedefines.cpp +++ b/indra/llappearance/llavatarappearancedefines.cpp @@ -26,9 +26,10 @@ #include "linden_common.h" #include "llavatarappearancedefines.h" +#include "indra_constants.h" -const S32 LLAvatarAppearanceDefines::SCRATCH_TEX_WIDTH = 512; -const S32 LLAvatarAppearanceDefines::SCRATCH_TEX_HEIGHT = 512; +const S32 LLAvatarAppearanceDefines::SCRATCH_TEX_WIDTH = 1024; +const S32 LLAvatarAppearanceDefines::SCRATCH_TEX_HEIGHT = 1024; const S32 LLAvatarAppearanceDefines::IMPOSTOR_PERIOD = 2; using namespace LLAvatarAppearanceDefines; @@ -65,12 +66,30 @@ LLAvatarAppearanceDictionary::Textures::Textures() addEntry(TEX_UPPER_TATTOO, new TextureEntry("upper_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_TATTOO)); addEntry(TEX_LOWER_TATTOO, new TextureEntry("lower_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_TATTOO)); + addEntry(TEX_HEAD_UNIVERSAL_TATTOO, new TextureEntry("head_universal_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_UNIVERSAL)); + addEntry(TEX_UPPER_UNIVERSAL_TATTOO, new TextureEntry("upper_universal_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_UNIVERSAL)); + addEntry(TEX_LOWER_UNIVERSAL_TATTOO, new TextureEntry("lower_universal_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_UNIVERSAL)); + addEntry(TEX_SKIRT_TATTOO, new TextureEntry("skirt_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_UNIVERSAL)); + addEntry(TEX_HAIR_TATTOO, new TextureEntry("hair_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_UNIVERSAL)); + addEntry(TEX_EYES_TATTOO, new TextureEntry("eyes_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_UNIVERSAL)); + addEntry(TEX_LEFT_ARM_TATTOO, new TextureEntry("leftarm_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_UNIVERSAL)); + addEntry(TEX_LEFT_LEG_TATTOO, new TextureEntry("leftleg_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_UNIVERSAL)); + addEntry(TEX_AUX1_TATTOO, new TextureEntry("aux1_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_UNIVERSAL)); + addEntry(TEX_AUX2_TATTOO, new TextureEntry("aux2_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_UNIVERSAL)); + addEntry(TEX_AUX3_TATTOO, new TextureEntry("aux3_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_UNIVERSAL)); + + addEntry(TEX_HEAD_BAKED, new TextureEntry("head-baked", FALSE, BAKED_HEAD, "head")); addEntry(TEX_UPPER_BAKED, new TextureEntry("upper-baked", FALSE, BAKED_UPPER, "upper")); addEntry(TEX_LOWER_BAKED, new TextureEntry("lower-baked", FALSE, BAKED_LOWER, "lower")); addEntry(TEX_EYES_BAKED, new TextureEntry("eyes-baked", FALSE, BAKED_EYES, "eyes")); addEntry(TEX_HAIR_BAKED, new TextureEntry("hair-baked", FALSE, BAKED_HAIR, "hair")); addEntry(TEX_SKIRT_BAKED, new TextureEntry("skirt-baked", FALSE, BAKED_SKIRT, "skirt")); + addEntry(TEX_LEFT_ARM_BAKED, new TextureEntry("leftarm-baked", FALSE, BAKED_LEFT_ARM, "leftarm")); + addEntry(TEX_LEFT_LEG_BAKED, new TextureEntry("leftleg-baked", FALSE, BAKED_LEFT_LEG, "leftleg")); + addEntry(TEX_AUX1_BAKED, new TextureEntry("aux1-baked", FALSE, BAKED_AUX1, "aux1")); + addEntry(TEX_AUX2_BAKED, new TextureEntry("aux2-baked", FALSE, BAKED_AUX2, "aux2")); + addEntry(TEX_AUX3_BAKED, new TextureEntry("aux3-baked", FALSE, BAKED_AUX3, "aux3")); } LLAvatarAppearanceDictionary::BakedTextures::BakedTextures() @@ -78,35 +97,60 @@ LLAvatarAppearanceDictionary::BakedTextures::BakedTextures() // Baked textures addEntry(BAKED_HEAD, new BakedEntry(TEX_HEAD_BAKED, "head", "a4b9dc38-e13b-4df9-b284-751efb0566ff", - 3, TEX_HEAD_BODYPAINT, TEX_HEAD_TATTOO, TEX_HEAD_ALPHA, - 5, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN, LLWearableType::WT_HAIR, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA)); + 4, TEX_HEAD_BODYPAINT, TEX_HEAD_TATTOO, TEX_HEAD_ALPHA, TEX_HEAD_UNIVERSAL_TATTOO, + 6, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN, LLWearableType::WT_HAIR, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA, LLWearableType::WT_UNIVERSAL)); addEntry(BAKED_UPPER, new BakedEntry(TEX_UPPER_BAKED, "upper_body", "5943ff64-d26c-4a90-a8c0-d61f56bd98d4", - 7, TEX_UPPER_SHIRT,TEX_UPPER_BODYPAINT, TEX_UPPER_JACKET, - TEX_UPPER_GLOVES, TEX_UPPER_UNDERSHIRT, TEX_UPPER_TATTOO, TEX_UPPER_ALPHA, - 8, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN, LLWearableType::WT_SHIRT, LLWearableType::WT_JACKET, LLWearableType::WT_GLOVES, LLWearableType::WT_UNDERSHIRT, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA)); + 8, TEX_UPPER_SHIRT,TEX_UPPER_BODYPAINT, TEX_UPPER_JACKET, + TEX_UPPER_GLOVES, TEX_UPPER_UNDERSHIRT, TEX_UPPER_TATTOO, TEX_UPPER_ALPHA, TEX_UPPER_UNIVERSAL_TATTOO, + 9, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN, LLWearableType::WT_SHIRT, LLWearableType::WT_JACKET, LLWearableType::WT_GLOVES, LLWearableType::WT_UNDERSHIRT, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA, LLWearableType::WT_UNIVERSAL)); addEntry(BAKED_LOWER, new BakedEntry(TEX_LOWER_BAKED, "lower_body", "2944ee70-90a7-425d-a5fb-d749c782ed7d", - 8, TEX_LOWER_PANTS,TEX_LOWER_BODYPAINT,TEX_LOWER_SHOES, TEX_LOWER_SOCKS, - TEX_LOWER_JACKET, TEX_LOWER_UNDERPANTS, TEX_LOWER_TATTOO, TEX_LOWER_ALPHA, - 9, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN, LLWearableType::WT_PANTS, LLWearableType::WT_SHOES, LLWearableType::WT_SOCKS, LLWearableType::WT_JACKET, LLWearableType::WT_UNDERPANTS, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA)); + 9, TEX_LOWER_PANTS,TEX_LOWER_BODYPAINT,TEX_LOWER_SHOES, TEX_LOWER_SOCKS, + TEX_LOWER_JACKET, TEX_LOWER_UNDERPANTS, TEX_LOWER_TATTOO, TEX_LOWER_ALPHA, TEX_LOWER_UNIVERSAL_TATTOO, + 10, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN, LLWearableType::WT_PANTS, LLWearableType::WT_SHOES, LLWearableType::WT_SOCKS, LLWearableType::WT_JACKET, LLWearableType::WT_UNDERPANTS, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA, LLWearableType::WT_UNIVERSAL)); addEntry(BAKED_EYES, new BakedEntry(TEX_EYES_BAKED, "eyes", "27b1bc0f-979f-4b13-95fe-b981c2ba9788", - 2, TEX_EYES_IRIS, TEX_EYES_ALPHA, - 2, LLWearableType::WT_EYES, LLWearableType::WT_ALPHA)); + 3, TEX_EYES_IRIS, TEX_EYES_TATTOO, TEX_EYES_ALPHA, + 3, LLWearableType::WT_EYES, LLWearableType::WT_UNIVERSAL, LLWearableType::WT_ALPHA)); addEntry(BAKED_SKIRT, new BakedEntry(TEX_SKIRT_BAKED, "skirt", "03e7e8cb-1368-483b-b6f3-74850838ba63", - 1, TEX_SKIRT, - 1, LLWearableType::WT_SKIRT)); + 2, TEX_SKIRT, TEX_SKIRT_TATTOO, + 2, LLWearableType::WT_SKIRT, LLWearableType::WT_UNIVERSAL )); addEntry(BAKED_HAIR, new BakedEntry(TEX_HAIR_BAKED, "hair", "a60e85a9-74e8-48d8-8a2d-8129f28d9b61", - 2, TEX_HAIR, TEX_HAIR_ALPHA, - 2, LLWearableType::WT_HAIR, LLWearableType::WT_ALPHA)); + 3, TEX_HAIR, TEX_HAIR_TATTOO, TEX_HAIR_ALPHA, + 3, LLWearableType::WT_HAIR, LLWearableType::WT_UNIVERSAL, LLWearableType::WT_ALPHA)); + + addEntry(BAKED_LEFT_ARM, new BakedEntry(TEX_LEFT_ARM_BAKED, + "leftarm", "9f39febf-22d7-0087-79d1-e9e8c6c9ed19", + 1, TEX_LEFT_ARM_TATTOO, + 1, LLWearableType::WT_UNIVERSAL)); + + addEntry(BAKED_LEFT_LEG, new BakedEntry(TEX_LEFT_LEG_BAKED, + "leftleg", "054a7a58-8ed5-6386-0add-3b636fb28b78", + 1, TEX_LEFT_LEG_TATTOO, + 1, LLWearableType::WT_UNIVERSAL)); + + addEntry(BAKED_AUX1, new BakedEntry(TEX_AUX1_BAKED, + "aux1", "790c11be-b25c-c17e-b4d2-6a4ad786b752", + 1, TEX_AUX1_TATTOO, + 1, LLWearableType::WT_UNIVERSAL)); + + addEntry(BAKED_AUX2, new BakedEntry(TEX_AUX2_BAKED, + "aux2", "d78c478f-48c7-5928-5864-8d99fb1f521e", + 1, TEX_AUX2_TATTOO, + 1, LLWearableType::WT_UNIVERSAL)); + + addEntry(BAKED_AUX3, new BakedEntry(TEX_AUX3_BAKED, + "aux3", "6a95dd53-edd9-aac8-f6d3-27ed99f3c3eb", + 1, TEX_AUX3_TATTOO, + 1, LLWearableType::WT_UNIVERSAL)); } LLAvatarAppearanceDictionary::MeshEntries::MeshEntries() @@ -265,3 +309,113 @@ LLWearableType::EType LLAvatarAppearanceDictionary::getTEWearableType(ETextureIn { return getInstance()->getTexture(index)->mWearableType; } + +// static +BOOL LLAvatarAppearanceDictionary::isBakedImageId(const LLUUID& id) +{ + if ((id == IMG_USE_BAKED_EYES) || (id == IMG_USE_BAKED_HAIR) || (id == IMG_USE_BAKED_HEAD) || (id == IMG_USE_BAKED_LOWER) || (id == IMG_USE_BAKED_SKIRT) || (id == IMG_USE_BAKED_UPPER) + || (id == IMG_USE_BAKED_LEFTARM) || (id == IMG_USE_BAKED_LEFTLEG) || (id == IMG_USE_BAKED_AUX1) || (id == IMG_USE_BAKED_AUX2) || (id == IMG_USE_BAKED_AUX3) ) + { + return TRUE; + } + + return FALSE; +} + +// static +EBakedTextureIndex LLAvatarAppearanceDictionary::assetIdToBakedTextureIndex(const LLUUID& id) +{ + if (id == IMG_USE_BAKED_EYES) + { + return BAKED_EYES; + } + else if (id == IMG_USE_BAKED_HAIR) + { + return BAKED_HAIR; + } + else if (id == IMG_USE_BAKED_HEAD) + { + return BAKED_HEAD; + } + else if (id == IMG_USE_BAKED_LOWER) + { + return BAKED_LOWER; + } + else if (id == IMG_USE_BAKED_SKIRT) + { + return BAKED_SKIRT; + } + else if (id == IMG_USE_BAKED_UPPER) + { + return BAKED_UPPER; + } + else if (id == IMG_USE_BAKED_LEFTARM) + { + return BAKED_LEFT_ARM; + } + else if (id == IMG_USE_BAKED_LEFTLEG) + { + return BAKED_LEFT_LEG; + } + else if (id == IMG_USE_BAKED_AUX1) + { + return BAKED_AUX1; + } + else if (id == IMG_USE_BAKED_AUX2) + { + return BAKED_AUX2; + } + else if (id == IMG_USE_BAKED_AUX3) + { + return BAKED_AUX3; + } + + return BAKED_NUM_INDICES; +} + +//static +LLUUID LLAvatarAppearanceDictionary::localTextureIndexToMagicId(ETextureIndex t) +{ + LLUUID id = LLUUID::null; + + switch (t) + { + case LLAvatarAppearanceDefines::TEX_HEAD_BAKED: + id = IMG_USE_BAKED_HEAD; + break; + case LLAvatarAppearanceDefines::TEX_UPPER_BAKED: + id = IMG_USE_BAKED_UPPER; + break; + case LLAvatarAppearanceDefines::TEX_LOWER_BAKED: + id = IMG_USE_BAKED_LOWER; + break; + case LLAvatarAppearanceDefines::TEX_EYES_BAKED: + id = IMG_USE_BAKED_EYES; + break; + case LLAvatarAppearanceDefines::TEX_SKIRT_BAKED: + id = IMG_USE_BAKED_SKIRT; + break; + case LLAvatarAppearanceDefines::TEX_HAIR_BAKED: + id = IMG_USE_BAKED_HAIR; + break; + case LLAvatarAppearanceDefines::TEX_LEFT_ARM_BAKED: + id = IMG_USE_BAKED_LEFTARM; + break; + case LLAvatarAppearanceDefines::TEX_LEFT_LEG_BAKED: + id = IMG_USE_BAKED_LEFTLEG; + break; + case LLAvatarAppearanceDefines::TEX_AUX1_BAKED: + id = IMG_USE_BAKED_AUX1; + break; + case LLAvatarAppearanceDefines::TEX_AUX2_BAKED: + id = IMG_USE_BAKED_AUX2; + break; + case LLAvatarAppearanceDefines::TEX_AUX3_BAKED: + id = IMG_USE_BAKED_AUX3; + break; + default: + break; + } + + return id; +} diff --git a/indra/llappearance/llavatarappearancedefines.h b/indra/llappearance/llavatarappearancedefines.h index d6223bb4d24e732ceb01df1627434fd631dcda5f..5663d24293618ac796941c5d7e185a863b1a70d0 100644 --- a/indra/llappearance/llavatarappearancedefines.h +++ b/indra/llappearance/llavatarappearancedefines.h @@ -78,6 +78,22 @@ enum ETextureIndex TEX_HEAD_TATTOO, TEX_UPPER_TATTOO, TEX_LOWER_TATTOO, + TEX_HEAD_UNIVERSAL_TATTOO, + TEX_UPPER_UNIVERSAL_TATTOO, + TEX_LOWER_UNIVERSAL_TATTOO, + TEX_SKIRT_TATTOO, + TEX_HAIR_TATTOO, + TEX_EYES_TATTOO, + TEX_LEFT_ARM_TATTOO, + TEX_LEFT_LEG_TATTOO, + TEX_AUX1_TATTOO, + TEX_AUX2_TATTOO, + TEX_AUX3_TATTOO, + TEX_LEFT_ARM_BAKED, // Pre-composited + TEX_LEFT_LEG_BAKED, // Pre-composited + TEX_AUX1_BAKED, // Pre-composited + TEX_AUX2_BAKED, // Pre-composited + TEX_AUX3_BAKED, // Pre-composited TEX_NUM_INDICES }; @@ -89,6 +105,11 @@ enum EBakedTextureIndex BAKED_EYES, BAKED_SKIRT, BAKED_HAIR, + BAKED_LEFT_ARM, + BAKED_LEFT_LEG, + BAKED_AUX1, + BAKED_AUX2, + BAKED_AUX3, BAKED_NUM_INDICES }; @@ -223,6 +244,10 @@ class LLAvatarAppearanceDictionary : public LLSingleton<LLAvatarAppearanceDictio // Given a texture entry, determine which wearable type owns it. static LLWearableType::EType getTEWearableType(ETextureIndex index); + static BOOL isBakedImageId(const LLUUID& id); + static EBakedTextureIndex assetIdToBakedTextureIndex(const LLUUID& id); + static LLUUID localTextureIndexToMagicId(ETextureIndex t); + }; // End LLAvatarAppearanceDictionary } // End namespace LLAvatarAppearanceDefines diff --git a/indra/llappearance/lltexlayer.cpp b/indra/llappearance/lltexlayer.cpp index 3f2fcce429804c52bb3a240fe2259b19c9838572..186986bf9cb0c026df701c98d54e5c99efa21db8 100644 --- a/indra/llappearance/lltexlayer.cpp +++ b/indra/llappearance/lltexlayer.cpp @@ -1581,8 +1581,8 @@ void LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC // nSight doesn't support use of glReadPixels if (!LLRender::sNsightDebugSupport) { - glReadPixels(x, y, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, alpha_data); - } + glReadPixels(x, y, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, alpha_data); + } } getTexLayerSet()->getAvatarAppearance()->dirtyMesh(); diff --git a/indra/llappearance/llwearabletype.cpp b/indra/llappearance/llwearabletype.cpp index cd602b43b4452d968d8db0069d20638dc9bb1697..0e29bbe783e08219000a94ec341fef76122f8d5e 100644 --- a/indra/llappearance/llwearabletype.cpp +++ b/indra/llappearance/llwearabletype.cpp @@ -91,6 +91,7 @@ LLWearableDictionary::LLWearableDictionary() addEntry(LLWearableType::WT_SKIRT, new WearableEntry("skirt", "New Skirt", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_SKIRT, FALSE, TRUE)); addEntry(LLWearableType::WT_ALPHA, new WearableEntry("alpha", "New Alpha", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_ALPHA, FALSE, TRUE)); addEntry(LLWearableType::WT_TATTOO, new WearableEntry("tattoo", "New Tattoo", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_TATTOO, FALSE, TRUE)); + addEntry(LLWearableType::WT_UNIVERSAL, new WearableEntry("universal", "New Universal", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_UNIVERSAL, FALSE, TRUE)); addEntry(LLWearableType::WT_PHYSICS, new WearableEntry("physics", "New Physics", LLAssetType::AT_CLOTHING, LLInventoryType::ICONNAME_CLOTHING_PHYSICS, TRUE, TRUE)); diff --git a/indra/llappearance/llwearabletype.h b/indra/llappearance/llwearabletype.h index 519d5b92a2a46496cc32e09f2409b8d010aa97bf..ac81376538ed1d2d94f33babf891ee980f2e34dc 100644 --- a/indra/llappearance/llwearabletype.h +++ b/indra/llappearance/llwearabletype.h @@ -63,7 +63,8 @@ class LLWearableType WT_ALPHA = 13, WT_TATTOO = 14, WT_PHYSICS = 15, - WT_COUNT = 16, + WT_UNIVERSAL = 16, + WT_COUNT = 17, WT_INVALID = 255, WT_NONE = -1, diff --git a/indra/llaudio/llvorbisencode.h b/indra/llaudio/llvorbisencode.h index 6b22a2cb5997996744613292f5f46bde7d33625d..7372765075414405230df4a6b4dab20ada61b894 100644 --- a/indra/llaudio/llvorbisencode.h +++ b/indra/llaudio/llvorbisencode.h @@ -40,7 +40,7 @@ const S32 LLVORBISENC_UNSUPPORTED_WORD_SIZE = 9; // unsupported word size const S32 LLVORBISENC_CLIP_TOO_LONG = 10; // source file is too long const S32 LLVORBISENC_CHUNK_SIZE_ERR = 11; // chunk size is wrong -const F32 LLVORBIS_CLIP_MAX_TIME = 10.0f; +const F32 LLVORBIS_CLIP_MAX_TIME = 30.0f; const U8 LLVORBIS_CLIP_MAX_CHANNELS = 2; const U32 LLVORBIS_CLIP_SAMPLE_RATE = 44100; const U32 LLVORBIS_CLIP_MAX_SAMPLES_PER_CHANNEL = (U32)(LLVORBIS_CLIP_MAX_TIME * LLVORBIS_CLIP_SAMPLE_RATE); diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 42ad56f1b0b42114ae67244159afc61f198baaad..af41b9e460c75a609d213eae4f808734a9c4f80b 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -35,6 +35,7 @@ set(llcommon_SOURCE_FILES llapp.cpp llapr.cpp llassettype.cpp + llatomic.cpp llbase32.cpp llbase64.cpp llbitpack.cpp @@ -135,6 +136,7 @@ set(llcommon_HEADER_FILES llapp.h llapr.h llassettype.h + llatomic.h llbase32.h llbase64.h llbitpack.h diff --git a/indra/llcommon/indra_constants.cpp b/indra/llcommon/indra_constants.cpp index 7ea42a3fc0296e3ea620974f4a8b4b167ca06d08..e13176e8facdb3bdb716016a98d636992d3a71de 100644 --- a/indra/llcommon/indra_constants.cpp +++ b/indra/llcommon/indra_constants.cpp @@ -72,3 +72,15 @@ const LLUUID TERRAIN_ROCK_DETAIL ("53a2f406-4895-1d13-d541-d2e3b86bc19c"); // V const LLUUID DEFAULT_WATER_NORMAL ("822ded49-9a6c-f61c-cb89-6df54f42cdf4"); // VIEWER +const LLUUID IMG_USE_BAKED_HEAD ("5a9f4a74-30f2-821c-b88d-70499d3e7183"); +const LLUUID IMG_USE_BAKED_UPPER ("ae2de45c-d252-50b8-5c6e-19f39ce79317"); +const LLUUID IMG_USE_BAKED_LOWER ("24daea5f-0539-cfcf-047f-fbc40b2786ba"); +const LLUUID IMG_USE_BAKED_EYES ("52cc6bb6-2ee5-e632-d3ad-50197b1dcb8a"); +const LLUUID IMG_USE_BAKED_SKIRT ("43529ce8-7faa-ad92-165a-bc4078371687"); +const LLUUID IMG_USE_BAKED_HAIR ("09aac1fb-6bce-0bee-7d44-caac6dbb6c63"); +const LLUUID IMG_USE_BAKED_LEFTARM ("ff62763f-d60a-9855-890b-0c96f8f8cd98"); +const LLUUID IMG_USE_BAKED_LEFTLEG ("8e915e25-31d1-cc95-ae08-d58a47488251"); +const LLUUID IMG_USE_BAKED_AUX1 ("9742065b-19b5-297c-858a-29711d539043"); +const LLUUID IMG_USE_BAKED_AUX2 ("03642e83-2bd1-4eb9-34b4-4c47ed586d2d"); +const LLUUID IMG_USE_BAKED_AUX3 ("edd51b77-fc10-ce7a-4b3d-011dfc349e4f"); + diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h index a00a82aff0a8f7118e1e8e8ae2c77a9894246aef..0fbf4b966b2becc9e4a68ec57e48c92b64d5abb0 100644 --- a/indra/llcommon/indra_constants.h +++ b/indra/llcommon/indra_constants.h @@ -153,7 +153,6 @@ const U8 SIM_ACCESS_DOWN = 254; const U8 SIM_ACCESS_MAX = SIM_ACCESS_ADULT; // attachment constants -const S32 MAX_AGENT_ATTACHMENTS = 38; const U8 ATTACHMENT_ADD = 0x80; // god levels @@ -207,6 +206,18 @@ LL_COMMON_API extern const LLUUID TERRAIN_GRASS_DETAIL; LL_COMMON_API extern const LLUUID TERRAIN_MOUNTAIN_DETAIL; LL_COMMON_API extern const LLUUID TERRAIN_ROCK_DETAIL; +LL_COMMON_API extern const LLUUID IMG_USE_BAKED_HEAD; +LL_COMMON_API extern const LLUUID IMG_USE_BAKED_UPPER; +LL_COMMON_API extern const LLUUID IMG_USE_BAKED_LOWER; +LL_COMMON_API extern const LLUUID IMG_USE_BAKED_EYES; +LL_COMMON_API extern const LLUUID IMG_USE_BAKED_SKIRT; +LL_COMMON_API extern const LLUUID IMG_USE_BAKED_HAIR; +LL_COMMON_API extern const LLUUID IMG_USE_BAKED_LEFTARM; +LL_COMMON_API extern const LLUUID IMG_USE_BAKED_LEFTLEG; +LL_COMMON_API extern const LLUUID IMG_USE_BAKED_AUX1; +LL_COMMON_API extern const LLUUID IMG_USE_BAKED_AUX2; +LL_COMMON_API extern const LLUUID IMG_USE_BAKED_AUX3; + LL_COMMON_API extern const LLUUID DEFAULT_WATER_NORMAL; diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h index acd829d8649ae6a0883be66338014267ef3d82ee..245c73e3a2210fddc818fae52aaba3ddb6d64433 100644 --- a/indra/llcommon/llapp.h +++ b/indra/llcommon/llapp.h @@ -30,9 +30,8 @@ #include <map> #include "llrun.h" #include "llsd.h" +#include <atomic> // Forward declarations -template <typename Type> class LLAtomic32; -typedef LLAtomic32<U32> LLAtomicU32; class LLErrorThread; class LLLiveFile; #if LL_LINUX diff --git a/indra/llcommon/llapr.cpp b/indra/llcommon/llapr.cpp index d353d06de2ebef503d83334f454063b1152add6a..29f0c7da9a39ee1ac9d6906a51519cf621dc44a3 100644 --- a/indra/llcommon/llapr.cpp +++ b/indra/llcommon/llapr.cpp @@ -28,13 +28,12 @@ #include "linden_common.h" #include "llapr.h" +#include "llmutex.h" #include "apr_dso.h" #include "llthreadlocalstorage.h" apr_pool_t *gAPRPoolp = NULL; // Global APR memory pool LLVolatileAPRPool *LLAPRFile::sAPRFilePoolp = NULL ; //global volatile APR memory pool. -apr_thread_mutex_t *gLogMutexp = NULL; -apr_thread_mutex_t *gCallStacksLogMutexp = NULL; const S32 FULL_VOLATILE_APR_POOL = 1024 ; //number of references to LLVolatileAPRPool @@ -48,10 +47,6 @@ void ll_init_apr() if (!gAPRPoolp) { apr_pool_create(&gAPRPoolp, NULL); - - // Initialize the logging mutex - apr_thread_mutex_create(&gLogMutexp, APR_THREAD_MUTEX_UNNESTED, gAPRPoolp); - apr_thread_mutex_create(&gCallStacksLogMutexp, APR_THREAD_MUTEX_UNNESTED, gAPRPoolp); } if(!LLAPRFile::sAPRFilePoolp) @@ -75,23 +70,6 @@ void ll_cleanup_apr() LL_INFOS("APR") << "Cleaning up APR" << LL_ENDL; - if (gLogMutexp) - { - // Clean up the logging mutex - - // All other threads NEED to be done before we clean up APR, so this is okay. - apr_thread_mutex_destroy(gLogMutexp); - gLogMutexp = NULL; - } - if (gCallStacksLogMutexp) - { - // Clean up the logging mutex - - // All other threads NEED to be done before we clean up APR, so this is okay. - apr_thread_mutex_destroy(gCallStacksLogMutexp); - gCallStacksLogMutexp = NULL; - } - LLThreadLocalPointerBase::destroyAllThreadLocalStorage(); if (gAPRPoolp) @@ -168,26 +146,19 @@ apr_pool_t* LLAPRPool::getAPRPool() LLVolatileAPRPool::LLVolatileAPRPool(BOOL is_local, apr_pool_t *parent, apr_size_t size, BOOL releasePoolFlag) : LLAPRPool(parent, size, releasePoolFlag), mNumActiveRef(0), - mNumTotalRef(0), - mMutexPool(NULL), - mMutexp(NULL) + mNumTotalRef(0) { //create mutex if(!is_local) //not a local apr_pool, that is: shared by multiple threads. { - apr_pool_create(&mMutexPool, NULL); // Create a pool for mutex - apr_thread_mutex_create(&mMutexp, APR_THREAD_MUTEX_UNNESTED, mMutexPool); + mMutexp.reset(new std::mutex()); } } LLVolatileAPRPool::~LLVolatileAPRPool() { //delete mutex - if(mMutexp) - { - apr_thread_mutex_destroy(mMutexp); - apr_pool_destroy(mMutexPool); - } + mMutexp.reset(); } // @@ -201,7 +172,7 @@ apr_pool_t* LLVolatileAPRPool::getAPRPool() apr_pool_t* LLVolatileAPRPool::getVolatileAPRPool() { - LLScopedLock lock(mMutexp) ; + LLScopedLock lock(mMutexp.get()) ; mNumTotalRef++ ; mNumActiveRef++ ; @@ -216,7 +187,7 @@ apr_pool_t* LLVolatileAPRPool::getVolatileAPRPool() void LLVolatileAPRPool::clearVolatileAPRPool() { - LLScopedLock lock(mMutexp) ; + LLScopedLock lock(mMutexp.get()); if(mNumActiveRef > 0) { @@ -250,44 +221,6 @@ BOOL LLVolatileAPRPool::isFull() { return mNumTotalRef > FULL_VOLATILE_APR_POOL ; } -//--------------------------------------------------------------------- -// -// LLScopedLock -// -LLScopedLock::LLScopedLock(apr_thread_mutex_t* mutex) : mMutex(mutex) -{ - if(mutex) - { - if(ll_apr_warn_status(apr_thread_mutex_lock(mMutex))) - { - mLocked = false; - } - else - { - mLocked = true; - } - } - else - { - mLocked = false; - } -} - -LLScopedLock::~LLScopedLock() -{ - unlock(); -} - -void LLScopedLock::unlock() -{ - if(mLocked) - { - if(!ll_apr_warn_status(apr_thread_mutex_unlock(mMutex))) - { - mLocked = false; - } - } -} //--------------------------------------------------------------------- diff --git a/indra/llcommon/llapr.h b/indra/llcommon/llapr.h index 1ac5c4e9b2b9ed2309b819dcca3e2341689ed16a..da50dda103084fbd7d881459a12774a3ff36d264 100644 --- a/indra/llcommon/llapr.h +++ b/indra/llcommon/llapr.h @@ -36,15 +36,22 @@ #include <boost/noncopyable.hpp> #include "llwin32headerslean.h" #include "apr_thread_proc.h" -#include "apr_thread_mutex.h" #include "apr_getopt.h" #include "apr_signal.h" -#include "apr_atomic.h" #include "llstring.h" -extern LL_COMMON_API apr_thread_mutex_t* gLogMutexp; -extern apr_thread_mutex_t* gCallStacksLogMutexp; +#if LL_WINDOWS +#pragma warning (push) +#pragma warning (disable:4265) +#endif +// warning C4265: 'std::_Pad' : class has virtual functions, but destructor is not virtual + +#include <mutex> + +#if LL_WINDOWS +#pragma warning (pop) +#endif struct apr_dso_handle_t; /** @@ -120,77 +127,9 @@ class LL_COMMON_API LLVolatileAPRPool : public LLAPRPool S32 mNumActiveRef ; //number of active pointers pointing to the apr_pool. S32 mNumTotalRef ; //number of total pointers pointing to the apr_pool since last creating. - apr_thread_mutex_t *mMutexp; - apr_pool_t *mMutexPool; + std::unique_ptr<std::mutex> mMutexp; } ; -/** - * @class LLScopedLock - * @brief Small class to help lock and unlock mutexes. - * - * This class is used to have a stack level lock once you already have - * an apr mutex handy. The constructor handles the lock, and the - * destructor handles the unlock. Instances of this class are - * <b>not</b> thread safe. - */ -class LL_COMMON_API LLScopedLock : private boost::noncopyable -{ -public: - /** - * @brief Constructor which accepts a mutex, and locks it. - * - * @param mutex An allocated APR mutex. If you pass in NULL, - * this wrapper will not lock. - */ - LLScopedLock(apr_thread_mutex_t* mutex); - - /** - * @brief Destructor which unlocks the mutex if still locked. - */ - ~LLScopedLock(); - - /** - * @brief Check lock. - */ - bool isLocked() const { return mLocked; } - - /** - * @brief This method unlocks the mutex. - */ - void unlock(); - -protected: - bool mLocked; - apr_thread_mutex_t* mMutex; -}; - -template <typename Type> class LLAtomic32 -{ -public: - LLAtomic32<Type>() {}; - LLAtomic32<Type>(Type x) {apr_atomic_set32(&mData, apr_uint32_t(x)); }; - ~LLAtomic32<Type>() {}; - - operator const Type() { apr_uint32_t data = apr_atomic_read32(&mData); return Type(data); } - - Type CurrentValue() const { apr_uint32_t data = apr_atomic_read32(const_cast< volatile apr_uint32_t* >(&mData)); return Type(data); } - - Type operator =(const Type& x) { apr_atomic_set32(&mData, apr_uint32_t(x)); return Type(mData); } - void operator -=(Type x) { apr_atomic_sub32(&mData, apr_uint32_t(x)); } - void operator +=(Type x) { apr_atomic_add32(&mData, apr_uint32_t(x)); } - Type operator ++(int) { return apr_atomic_inc32(&mData); } // Type++ - Type operator --(int) { return apr_atomic_dec32(&mData); } // approximately --Type (0 if final is 0, non-zero otherwise) - - Type operator ++() { return apr_atomic_inc32(&mData); } // Type++ - Type operator --() { return apr_atomic_dec32(&mData); } // approximately --Type (0 if final is 0, non-zero otherwise) - -private: - volatile apr_uint32_t mData; -}; - -typedef LLAtomic32<U32> LLAtomicU32; -typedef LLAtomic32<S32> LLAtomicS32; - // File IO convenience functions. // Returns NULL if the file fails to open, sets *sizep to file size if not NULL // abbreviated flags diff --git a/indra/llcommon/llatomic.cpp b/indra/llcommon/llatomic.cpp new file mode 100644 index 0000000000000000000000000000000000000000..93aba1f46058bf0e57526178293944bd8b1bfaee --- /dev/null +++ b/indra/llcommon/llatomic.cpp @@ -0,0 +1,28 @@ +/** + * @file llatomic.cpp + * + * $LicenseInfo:firstyear=2018&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2018, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llatomic.h" + +//============================================================================ diff --git a/indra/llcommon/llatomic.h b/indra/llcommon/llatomic.h new file mode 100644 index 0000000000000000000000000000000000000000..8de773846c46c802582eea78050e7172a09d1e3a --- /dev/null +++ b/indra/llcommon/llatomic.h @@ -0,0 +1,69 @@ +/** + * @file llatomic.h + * @brief Base classes for atomic. + * + * $LicenseInfo:firstyear=2018&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2018, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLATOMIC_H +#define LL_LLATOMIC_H + +#include "stdtypes.h" + +#include <atomic> + +template <typename Type, typename AtomicType = std::atomic< Type > > class LLAtomicBase +{ +public: + LLAtomicBase() {}; + LLAtomicBase(Type x) { mData.store(x); } + ~LLAtomicBase() {}; + + operator const Type() { return mData; } + + Type CurrentValue() const { return mData; } + + Type operator =(const Type& x) { mData.store(x); return mData; } + void operator -=(Type x) { mData -= x; } + void operator +=(Type x) { mData += x; } + Type operator ++(int) { return mData++; } + Type operator --(int) { return mData--; } + + Type operator ++() { return ++mData; } + Type operator --() { return --mData; } + +private: + AtomicType mData; +}; + +// Typedefs for specialized versions. Using std::atomic_(u)int32_t to get the optimzed implementation. +#ifdef LL_WINDOWS +typedef LLAtomicBase<U32, std::atomic_uint32_t> LLAtomicU32; +typedef LLAtomicBase<S32, std::atomic_int32_t> LLAtomicS32; +#else +typedef LLAtomicBase<U32, std::atomic_uint> LLAtomicU32; +typedef LLAtomicBase<S32, std::atomic_int> LLAtomicS32; +#endif + +typedef LLAtomicBase<bool, std::atomic_bool> LLAtomicBool; + +#endif // LL_LLATOMIC_H diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index 7cfd1409b13a6d6d2e30c866ebd5404bb4cc32b8..335a0995feb1a87b830f8fb412df22b6169bec5b 100644 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -390,15 +390,22 @@ namespace { llifstream file(filename().c_str()); - if (file.is_open()) + if (!file.is_open()) { - LLSDSerialize::fromXML(configuration, file); + LL_WARNS() << filename() << " failed to open file; not changing configuration" << LL_ENDL; + return false; + } + + if (LLSDSerialize::fromXML(configuration, file) == LLSDParser::PARSE_FAILURE) + { + LL_WARNS() << filename() << " parcing error; not changing configuration" << LL_ENDL; + return false; } - if (configuration.isUndefined()) + if (configuration.isUndefined() || !configuration.isMap() || configuration.emptyMap()) { - LL_WARNS() << filename() << " missing, ill-formed," - " or simply undefined; not changing configuration" + LL_WARNS() << filename() << " missing, ill-formed, or simply undefined" + " content; not changing configuration" << LL_ENDL; return false; } @@ -860,19 +867,24 @@ namespace LLError setEnabledLogTypesMask(config["enabled-log-types-mask"].asInteger()); } - LLSD sets = config["settings"]; - LLSD::array_const_iterator a, end; - for (a = sets.beginArray(), end = sets.endArray(); a != end; ++a) - { - const LLSD& entry = *a; - - ELevel level = decodeLevel(entry["level"]); - - setLevels(s->mFunctionLevelMap, entry["functions"], level); - setLevels(s->mClassLevelMap, entry["classes"], level); - setLevels(s->mFileLevelMap, entry["files"], level); - setLevels(s->mTagLevelMap, entry["tags"], level); - } + if (config.has("settings") && config["settings"].isArray()) + { + LLSD sets = config["settings"]; + LLSD::array_const_iterator a, end; + for (a = sets.beginArray(), end = sets.endArray(); a != end; ++a) + { + const LLSD& entry = *a; + if (entry.isMap() && !entry.emptyMap()) + { + ELevel level = decodeLevel(entry["level"]); + + setLevels(s->mFunctionLevelMap, entry["functions"], level); + setLevels(s->mClassLevelMap, entry["classes"], level); + setLevels(s->mFileLevelMap, entry["files"], level); + setLevels(s->mTagLevelMap, entry["tags"], level); + } + } + } } } @@ -1136,6 +1148,9 @@ namespace } namespace { + LLMutex gLogMutex; + LLMutex gCallStacksLogMutex; + bool checkLevelMap(const LevelMap& map, const std::string& key, LLError::ELevel& level) { @@ -1175,56 +1190,6 @@ namespace { } return found_level; } - - class LogLock - { - public: - LogLock(); - ~LogLock(); - bool ok() const { return mOK; } - private: - bool mLocked; - bool mOK; - }; - - LogLock::LogLock() - : mLocked(false), mOK(false) - { - if (!gLogMutexp) - { - mOK = true; - return; - } - - const int MAX_RETRIES = 5; - for (int attempts = 0; attempts < MAX_RETRIES; ++attempts) - { - apr_status_t s = apr_thread_mutex_trylock(gLogMutexp); - if (!APR_STATUS_IS_EBUSY(s)) - { - mLocked = true; - mOK = true; - return; - } - - ms_sleep(1); - //apr_thread_yield(); - // Just yielding won't necessarily work, I had problems with - // this on Linux - doug 12/02/04 - } - - // We're hosed, we can't get the mutex. Blah. - std::cerr << "LogLock::LogLock: failed to get mutex for log" - << std::endl; - } - - LogLock::~LogLock() - { - if (mLocked) - { - apr_thread_mutex_unlock(gLogMutexp); - } - } } namespace LLError @@ -1232,8 +1197,8 @@ namespace LLError bool Log::shouldLog(CallSite& site) { - LogLock lock; - if (!lock.ok()) + LLMutexTrylock lock(&gLogMutex, 5); + if (!lock.isLocked()) { return false; } @@ -1283,11 +1248,11 @@ namespace LLError std::ostringstream* Log::out() { - LogLock lock; + LLMutexTrylock lock(&gLogMutex,5); // If we hit a logging request very late during shutdown processing, // when either of the relevant LLSingletons has already been deleted, // DO NOT resurrect them. - if (lock.ok() && ! (Settings::wasDeleted() || Globals::wasDeleted())) + if (lock.isLocked() && ! (Settings::wasDeleted() || Globals::wasDeleted())) { Globals* g = Globals::getInstance(); @@ -1303,8 +1268,8 @@ namespace LLError void Log::flush(std::ostringstream* out, char* message) { - LogLock lock; - if (!lock.ok()) + LLMutexTrylock lock(&gLogMutex,5); + if (!lock.isLocked()) { return; } @@ -1343,8 +1308,8 @@ namespace LLError void Log::flush(std::ostringstream* out, const CallSite& site) { - LogLock lock; - if (!lock.ok()) + LLMutexTrylock lock(&gLogMutex,5); + if (!lock.isLocked()) { return; } @@ -1514,69 +1479,6 @@ namespace LLError char** LLCallStacks::sBuffer = NULL ; S32 LLCallStacks::sIndex = 0 ; -#define SINGLE_THREADED 1 - - class CallStacksLogLock - { - public: - CallStacksLogLock(); - ~CallStacksLogLock(); - -#if SINGLE_THREADED - bool ok() const { return true; } -#else - bool ok() const { return mOK; } - private: - bool mLocked; - bool mOK; -#endif - }; - -#if SINGLE_THREADED - CallStacksLogLock::CallStacksLogLock() - { - } - CallStacksLogLock::~CallStacksLogLock() - { - } -#else - CallStacksLogLock::CallStacksLogLock() - : mLocked(false), mOK(false) - { - if (!gCallStacksLogMutexp) - { - mOK = true; - return; - } - - const int MAX_RETRIES = 5; - for (int attempts = 0; attempts < MAX_RETRIES; ++attempts) - { - apr_status_t s = apr_thread_mutex_trylock(gCallStacksLogMutexp); - if (!APR_STATUS_IS_EBUSY(s)) - { - mLocked = true; - mOK = true; - return; - } - - ms_sleep(1); - } - - // We're hosed, we can't get the mutex. Blah. - std::cerr << "CallStacksLogLock::CallStacksLogLock: failed to get mutex for log" - << std::endl; - } - - CallStacksLogLock::~CallStacksLogLock() - { - if (mLocked) - { - apr_thread_mutex_unlock(gCallStacksLogMutexp); - } - } -#endif - //static void LLCallStacks::allocateStackBuffer() { @@ -1605,8 +1507,8 @@ namespace LLError //static void LLCallStacks::push(const char* function, const int line) { - CallStacksLogLock lock; - if (!lock.ok()) + LLMutexTrylock lock(&gCallStacksLogMutex, 5); + if (!lock.isLocked()) { return; } @@ -1640,8 +1542,8 @@ namespace LLError //static void LLCallStacks::end(std::ostringstream* _out) { - CallStacksLogLock lock; - if (!lock.ok()) + LLMutexTrylock lock(&gCallStacksLogMutex, 5); + if (!lock.isLocked()) { return; } @@ -1662,8 +1564,8 @@ namespace LLError //static void LLCallStacks::print() { - CallStacksLogLock lock; - if (!lock.ok()) + LLMutexTrylock lock(&gCallStacksLogMutex, 5); + if (!lock.isLocked()) { return; } @@ -1700,8 +1602,8 @@ namespace LLError bool debugLoggingEnabled(const std::string& tag) { - LogLock lock; - if (!lock.ok()) + LLMutexTrylock lock(&gLogMutex, 5); + if (!lock.isLocked()) { return false; } diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h index 5d60c63810128446c02f4e6aeb0a1bf8ec185d7b..62d97007acde21edaa5b09ba3c0ec573c7472c45 100644 --- a/indra/llcommon/llevents.h +++ b/indra/llcommon/llevents.h @@ -582,11 +582,12 @@ class LL_COMMON_API LLEventPump: public LLEventTrackable /// Generate a distinct name for a listener -- see listen() static std::string inventName(const std::string& pfx="listener"); -private: - friend class LLEventPumps; /// flush queued events virtual void flush() {} +private: + friend class LLEventPumps; + virtual void reset(); @@ -675,12 +676,14 @@ class LL_COMMON_API LLEventMailDrop : public LLEventStream virtual ~LLEventMailDrop() {} /// Post an event to all listeners - virtual bool post(const LLSD& event); + virtual bool post(const LLSD& event) override; + /// Remove any history stored in the mail drop. + virtual void flush() override { mEventHistory.clear(); LLEventStream::flush(); }; protected: virtual LLBoundListener listen_impl(const std::string& name, const LLEventListener&, const NameList& after, - const NameList& before); + const NameList& before) override; private: typedef std::list<LLSD> EventList; @@ -703,7 +706,6 @@ class LL_COMMON_API LLEventQueue: public LLEventPump /// Post an event to all listeners virtual bool post(const LLSD& event); -private: /// flush queued events virtual void flush(); diff --git a/indra/llcommon/llfixedbuffer.cpp b/indra/llcommon/llfixedbuffer.cpp index d394f179fb52fd674854f724c9fd2721f00ec567..bd4db8be845528e0524ba15f4333f949c8419361 100644 --- a/indra/llcommon/llfixedbuffer.cpp +++ b/indra/llcommon/llfixedbuffer.cpp @@ -31,7 +31,7 @@ LLFixedBuffer::LLFixedBuffer(const U32 max_lines) : LLLineBuffer(), mMaxLines(max_lines), - mMutex(NULL) + mMutex() { mTimer.reset(); } diff --git a/indra/llcommon/llinstancetracker.cpp b/indra/llcommon/llinstancetracker.cpp index 11fc53f8c88edbf717270ceb5976a7c900bdbbbe..3f990f4869c3a504bb9a9c7d656d64a90e5c8279 100644 --- a/indra/llcommon/llinstancetracker.cpp +++ b/indra/llcommon/llinstancetracker.cpp @@ -36,17 +36,16 @@ void LLInstanceTrackerBase::StaticBase::incrementDepth() { - apr_atomic_inc32(&sIterationNestDepth); + ++sIterationNestDepth; } void LLInstanceTrackerBase::StaticBase::decrementDepth() { llassert(sIterationNestDepth); - apr_atomic_dec32(&sIterationNestDepth); + --sIterationNestDepth; } U32 LLInstanceTrackerBase::StaticBase::getDepth() { - apr_uint32_t data = apr_atomic_read32(&sIterationNestDepth); - return data; + return sIterationNestDepth; } diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h index 910c8dbd99cdebb677e5a157dd725d3c74553459..363d0bcbd58ce3eeb7ec096e98396863744e232b 100644 --- a/indra/llcommon/llinstancetracker.h +++ b/indra/llcommon/llinstancetracker.h @@ -28,6 +28,7 @@ #ifndef LL_LLINSTANCETRACKER_H #define LL_LLINSTANCETRACKER_H +#include <atomic> #include <map> #include <typeinfo> @@ -81,8 +82,12 @@ class LL_COMMON_API LLInstanceTrackerBase void decrementDepth(); U32 getDepth(); private: - U32 sIterationNestDepth; - }; +#ifdef LL_WINDOWS + std::atomic_uint32_t sIterationNestDepth; +#else + std::atomic_uint sIterationNestDepth; +#endif + }; }; LL_COMMON_API void assert_main_thread(); diff --git a/indra/llcommon/llmutex.cpp b/indra/llcommon/llmutex.cpp index 9c13ef9e309a94dda09dfa19929c69297a0cfc05..75f43a47042f3b2226ce93602b8b55fc492dbf51 100644 --- a/indra/llcommon/llmutex.cpp +++ b/indra/llcommon/llmutex.cpp @@ -24,47 +24,22 @@ */ #include "linden_common.h" -#include "llapr.h" - -#include "apr_portable.h" #include "llmutex.h" #include "llthread.h" +#include "lltimer.h" //============================================================================ -LLMutex::LLMutex(apr_pool_t *poolp) : - mAPRMutexp(NULL), mCount(0), mLockingThread(NO_THREAD) +LLMutex::LLMutex() : + mCount(0), + mLockingThread(NO_THREAD) { - //if (poolp) - //{ - // mIsLocalPool = FALSE; - // mAPRPoolp = poolp; - //} - //else - { - mIsLocalPool = TRUE; - apr_pool_create(&mAPRPoolp, NULL); // Create a subpool for this thread - } - apr_thread_mutex_create(&mAPRMutexp, APR_THREAD_MUTEX_UNNESTED, mAPRPoolp); } LLMutex::~LLMutex() { -#if MUTEX_DEBUG - //bad assertion, the subclass LLSignal might be "locked", and that's OK - //llassert_always(!isLocked()); // better not be locked! -#endif - if (ll_apr_is_initialized()) - { - apr_thread_mutex_destroy(mAPRMutexp); - if (mIsLocalPool) - { - apr_pool_destroy(mAPRPoolp); - } - } - mAPRMutexp = NULL; } @@ -76,7 +51,7 @@ void LLMutex::lock() return; } - apr_thread_mutex_lock(mAPRMutexp); + mMutex.lock(); #if MUTEX_DEBUG // Have to have the lock before we can access the debug info @@ -106,19 +81,18 @@ void LLMutex::unlock() #endif mLockingThread = NO_THREAD; - apr_thread_mutex_unlock(mAPRMutexp); + mMutex.unlock(); } bool LLMutex::isLocked() { - apr_status_t status = apr_thread_mutex_trylock(mAPRMutexp); - if (APR_STATUS_IS_EBUSY(status)) + if (!mMutex.try_lock()) { return true; } else { - apr_thread_mutex_unlock(mAPRMutexp); + mMutex.unlock(); return false; } } @@ -141,8 +115,7 @@ bool LLMutex::trylock() return true; } - apr_status_t status(apr_thread_mutex_trylock(mAPRMutexp)); - if (APR_STATUS_IS_EBUSY(status)) + if (!mMutex.try_lock()) { return false; } @@ -161,45 +134,95 @@ bool LLMutex::trylock() //============================================================================ -LLCondition::LLCondition(apr_pool_t *poolp) : - LLMutex(poolp) +LLCondition::LLCondition() : + LLMutex() { - // base class (LLMutex) has already ensured that mAPRPoolp is set up. - - apr_thread_cond_create(&mAPRCondp, mAPRPoolp); } LLCondition::~LLCondition() { - apr_thread_cond_destroy(mAPRCondp); - mAPRCondp = NULL; } void LLCondition::wait() { - if (!isLocked()) - { //mAPRMutexp MUST be locked before calling apr_thread_cond_wait - apr_thread_mutex_lock(mAPRMutexp); -#if MUTEX_DEBUG - // avoid asserts on destruction in non-release builds - U32 id = LLThread::currentID(); - mIsLocked[id] = TRUE; -#endif - } - apr_thread_cond_wait(mAPRCondp, mAPRMutexp); + std::unique_lock< std::mutex > lock(mMutex); + mCond.wait(lock); } void LLCondition::signal() { - apr_thread_cond_signal(mAPRCondp); + mCond.notify_one(); } void LLCondition::broadcast() { - apr_thread_cond_broadcast(mAPRCondp); + mCond.notify_all(); +} + + + +LLMutexTrylock::LLMutexTrylock(LLMutex* mutex) + : mMutex(mutex), + mLocked(false) +{ + if (mMutex) + mLocked = mMutex->trylock(); +} + +LLMutexTrylock::LLMutexTrylock(LLMutex* mutex, U32 aTries, U32 delay_ms) + : mMutex(mutex), + mLocked(false) +{ + if (!mMutex) + return; + + for (U32 i = 0; i < aTries; ++i) + { + mLocked = mMutex->trylock(); + if (mLocked) + break; + ms_sleep(delay_ms); + } } +LLMutexTrylock::~LLMutexTrylock() +{ + if (mMutex && mLocked) + mMutex->unlock(); +} + + +//--------------------------------------------------------------------- +// +// LLScopedLock +// +LLScopedLock::LLScopedLock(std::mutex* mutex) : mMutex(mutex) +{ + if(mutex) + { + mutex->lock(); + mLocked = true; + } + else + { + mLocked = false; + } +} + +LLScopedLock::~LLScopedLock() +{ + unlock(); +} + +void LLScopedLock::unlock() +{ + if(mLocked) + { + mMutex->unlock(); + mLocked = false; + } +} //============================================================================ diff --git a/indra/llcommon/llmutex.h b/indra/llcommon/llmutex.h index ea535cee86d1783be719df606b9dea747694e7cd..f841d7f9503bd3e02c3e14b634e91557706a8123 100644 --- a/indra/llcommon/llmutex.h +++ b/indra/llcommon/llmutex.h @@ -28,6 +28,19 @@ #define LL_LLMUTEX_H #include "stdtypes.h" +#include <boost/noncopyable.hpp> + +#if LL_WINDOWS +#pragma warning (push) +#pragma warning (disable:4265) +#endif +// 'std::_Pad' : class has virtual functions, but destructor is not virtual +#include <mutex> +#include <condition_variable> + +#if LL_WINDOWS +#pragma warning (pop) +#endif //============================================================================ @@ -37,10 +50,6 @@ #include <map> #endif -struct apr_thread_mutex_t; -struct apr_pool_t; -struct apr_thread_cond_t; - class LL_COMMON_API LLMutex { public: @@ -49,7 +58,7 @@ class LL_COMMON_API LLMutex NO_THREAD = 0xFFFFFFFF } e_locking_thread; - LLMutex(apr_pool_t *apr_poolp = NULL); // NULL pool constructs a new pool for the mutex + LLMutex(); virtual ~LLMutex(); void lock(); // blocks @@ -60,13 +69,10 @@ class LL_COMMON_API LLMutex U32 lockingThread() const; //get ID of locking thread protected: - apr_thread_mutex_t *mAPRMutexp; + std::mutex mMutex; mutable U32 mCount; mutable U32 mLockingThread; - apr_pool_t *mAPRPoolp; - BOOL mIsLocalPool; - #if MUTEX_DEBUG std::map<U32, BOOL> mIsLocked; #endif @@ -76,7 +82,7 @@ class LL_COMMON_API LLMutex class LL_COMMON_API LLCondition : public LLMutex { public: - LLCondition(apr_pool_t* apr_poolp); // Defaults to global pool, could use the thread pool as well. + LLCondition(); ~LLCondition(); void wait(); // blocks @@ -84,7 +90,7 @@ class LL_COMMON_API LLCondition : public LLMutex void broadcast(); protected: - apr_thread_cond_t* mAPRCondp; + std::condition_variable mCond; }; class LLMutexLock @@ -119,19 +125,9 @@ class LLMutexLock class LLMutexTrylock { public: - LLMutexTrylock(LLMutex* mutex) - : mMutex(mutex), - mLocked(false) - { - if (mMutex) - mLocked = mMutex->trylock(); - } - - ~LLMutexTrylock() - { - if (mMutex && mLocked) - mMutex->unlock(); - } + LLMutexTrylock(LLMutex* mutex); + LLMutexTrylock(LLMutex* mutex, U32 aTries, U32 delay_ms = 10); + ~LLMutexTrylock(); bool isLocked() const { @@ -142,4 +138,43 @@ class LLMutexTrylock LLMutex* mMutex; bool mLocked; }; -#endif // LL_LLTHREAD_H + +/** +* @class LLScopedLock +* @brief Small class to help lock and unlock mutexes. +* +* The constructor handles the lock, and the destructor handles +* the unlock. Instances of this class are <b>not</b> thread safe. +*/ +class LL_COMMON_API LLScopedLock : private boost::noncopyable +{ +public: + /** + * @brief Constructor which accepts a mutex, and locks it. + * + * @param mutex An allocated mutex. If you pass in NULL, + * this wrapper will not lock. + */ + LLScopedLock(std::mutex* mutex); + + /** + * @brief Destructor which unlocks the mutex if still locked. + */ + ~LLScopedLock(); + + /** + * @brief Check lock. + */ + bool isLocked() const { return mLocked; } + + /** + * @brief This method unlocks the mutex. + */ + void unlock(); + +protected: + bool mLocked; + std::mutex* mMutex; +}; + +#endif // LL_LLMUTEX_H diff --git a/indra/llcommon/llqueuedthread.h b/indra/llcommon/llqueuedthread.h index d3704b0fe22ad4e43d509e99901ebb6b215951aa..5d3f8736467fa7f6967d6d9017f53d7bd4d16227 100644 --- a/indra/llcommon/llqueuedthread.h +++ b/indra/llcommon/llqueuedthread.h @@ -32,7 +32,7 @@ #include <map> #include <set> -#include "llapr.h" +#include "llatomic.h" #include "llthread.h" #include "llsimplehash.h" @@ -128,7 +128,7 @@ class LL_COMMON_API LLQueuedThread : public LLThread }; protected: - LLAtomic32<status_t> mStatus; + LLAtomicBase<status_t> mStatus; U32 mPriority; U32 mFlags; }; @@ -198,7 +198,7 @@ class LL_COMMON_API LLQueuedThread : public LLThread protected: BOOL mThreaded; // if false, run on main thread and do updates during update() BOOL mStarted; // required when mThreaded is false to call startThread() from update() - LLAtomic32<BOOL> mIdleThread; // request queue is empty (or we are quitting) and the thread is idle + LLAtomicBool mIdleThread; // request queue is empty (or we are quitting) and the thread is idle typedef std::set<QueuedRequest*, queued_request_less> request_queue_t; request_queue_t mRequestQueue; diff --git a/indra/llcommon/llrefcount.cpp b/indra/llcommon/llrefcount.cpp index a638df2c7ccd5dfb29d5cc31f36b704d741025c4..29a5ca6f245cbec59e6be9205607a415fc4e050b 100644 --- a/indra/llcommon/llrefcount.cpp +++ b/indra/llcommon/llrefcount.cpp @@ -29,25 +29,9 @@ #include "llerror.h" -#if LL_REF_COUNT_DEBUG -#include "llthread.h" -#include "llapr.h" -#endif - LLRefCount::LLRefCount(const LLRefCount& other) : mRef(0) { -#if LL_REF_COUNT_DEBUG - if(gAPRPoolp) - { - mMutexp = new LLMutex(gAPRPoolp) ; - } - else - { - mMutexp = NULL ; - } - mCrashAtUnlock = FALSE ; -#endif } LLRefCount& LLRefCount::operator=(const LLRefCount&) @@ -59,17 +43,6 @@ LLRefCount& LLRefCount::operator=(const LLRefCount&) LLRefCount::LLRefCount() : mRef(0) { -#if LL_REF_COUNT_DEBUG - if(gAPRPoolp) - { - mMutexp = new LLMutex(gAPRPoolp) ; - } - else - { - mMutexp = NULL ; - } - mCrashAtUnlock = FALSE ; -#endif } LLRefCount::~LLRefCount() @@ -78,87 +51,5 @@ LLRefCount::~LLRefCount() { LL_ERRS() << "deleting non-zero reference" << LL_ENDL; } - -#if LL_REF_COUNT_DEBUG - if(gAPRPoolp) - { - delete mMutexp ; - } -#endif } -#if LL_REF_COUNT_DEBUG -void LLRefCount::ref() const -{ - if(mMutexp) - { - if(mMutexp->isLocked()) - { - mCrashAtUnlock = TRUE ; - LL_ERRS() << "the mutex is locked by the thread: " << mLockedThreadID - << " Current thread: " << LLThread::currentID() << LL_ENDL ; - } - - mMutexp->lock() ; - mLockedThreadID = LLThread::currentID() ; - - mRef++; - - if(mCrashAtUnlock) - { - while(1); //crash here. - } - mMutexp->unlock() ; - } - else - { - mRef++; - } -} - -S32 LLRefCount::unref() const -{ - if(mMutexp) - { - if(mMutexp->isLocked()) - { - mCrashAtUnlock = TRUE ; - LL_ERRS() << "the mutex is locked by the thread: " << mLockedThreadID - << " Current thread: " << LLThread::currentID() << LL_ENDL ; - } - - mMutexp->lock() ; - mLockedThreadID = LLThread::currentID() ; - - llassert(mRef >= 1); - if (0 == --mRef) - { - if(mCrashAtUnlock) - { - while(1); //crash here. - } - mMutexp->unlock() ; - - delete this; - return 0; - } - - if(mCrashAtUnlock) - { - while(1); //crash here. - } - mMutexp->unlock() ; - return mRef; - } - else - { - llassert(mRef >= 1); - if (0 == --mRef) - { - delete this; - return 0; - } - return mRef; - } -} -#endif diff --git a/indra/llcommon/llrefcount.h b/indra/llcommon/llrefcount.h index 11079735691b58be85916e4e34db789d456d8cb8..fb0411d27bfd76c39a8302be87bc67d4c3d483d0 100644 --- a/indra/llcommon/llrefcount.h +++ b/indra/llcommon/llrefcount.h @@ -29,12 +29,7 @@ #include <boost/noncopyable.hpp> #include <boost/intrusive_ptr.hpp> #include "llmutex.h" -#include "llapr.h" - -#define LL_REF_COUNT_DEBUG 0 -#if LL_REF_COUNT_DEBUG -class LLMutex ; -#endif +#include "llatomic.h" //---------------------------------------------------------------------------- // RefCount objects should generally only be accessed by way of LLPointer<>'s @@ -51,10 +46,6 @@ class LL_COMMON_API LLRefCount public: LLRefCount(); -#if LL_REF_COUNT_DEBUG - void ref() const ; - S32 unref() const ; -#else inline void ref() const { mRef++; @@ -69,8 +60,7 @@ class LL_COMMON_API LLRefCount return 0; } return mRef; - } -#endif + } //NOTE: when passing around a const LLRefCount object, this can return different results // at different types, since mRef is mutable @@ -81,12 +71,6 @@ class LL_COMMON_API LLRefCount private: mutable S32 mRef; - -#if LL_REF_COUNT_DEBUG - LLMutex* mMutexp ; - mutable U32 mLockedThreadID ; - mutable BOOL mCrashAtUnlock ; -#endif }; @@ -123,8 +107,8 @@ class LL_COMMON_API LLThreadSafeRefCount void unref() { llassert(mRef >= 1); - if ((--mRef) == 0) // See note in llapr.h on atomic decrement operator return value. - { + if ((--mRef) == 0) + { // If we hit zero, the caller should be the only smart pointer owning the object and we can delete it. // It is technically possible for a vanilla pointer to mess this up, or another thread to // jump in, find this object, create another smart pointer and end up dangling, but if @@ -140,7 +124,7 @@ class LL_COMMON_API LLThreadSafeRefCount } private: - LLAtomic32< S32 > mRef; + LLAtomicS32 mRef; }; /** diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index 30bec3a6f89ad30985f852ce57d85ecacdfc41d9..b619a9e48c55796693f4937797ff36f3cc64cc19 100644 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -1735,7 +1735,8 @@ bool LLStringUtilBase<T>::startsWith( const string_type& substr) { if(string.empty() || (substr.empty())) return false; - if(0 == string.find(substr)) return true; + if (substr.length() > string.length()) return false; + if (0 == string.compare(0, substr.length(), substr)) return true; return false; } @@ -1746,9 +1747,11 @@ bool LLStringUtilBase<T>::endsWith( const string_type& substr) { if(string.empty() || (substr.empty())) return false; - std::string::size_type idx = string.rfind(substr); - if(std::string::npos == idx) return false; - return (idx == (string.size() - substr.size())); + size_t sub_len = substr.length(); + size_t str_len = string.length(); + if (sub_len > str_len) return false; + if (0 == string.compare(str_len - sub_len, sub_len, substr)) return true; + return false; } // static diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 1ef6c538bae9df999aeceb377e966d9d95b8e578..1f8d558fbeb0c068c41b7183a667f685703f82b1 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -268,10 +268,32 @@ LLOSInfo::LLOSInfo() : } } + S32 ubr = 0; // Windows 10 Update Build Revision, can be retrieved from a registry + if (mMajorVer == 10) + { + DWORD cbData(sizeof(DWORD)); + DWORD data(0); + HKEY key; + BOOL ret_code = RegOpenKeyExW(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), 0, KEY_READ, &key); + if (ERROR_SUCCESS == ret_code) + { + ret_code = RegQueryValueExW(key, L"UBR", 0, NULL, reinterpret_cast<LPBYTE>(&data), &cbData); + if (ERROR_SUCCESS == ret_code) + { + ubr = data; + } + } + } + mOSString = mOSStringSimple; if (mBuild > 0) { - mOSString += llformat("(Build %d)", mBuild); + mOSString += llformat("(Build %d", mBuild); + if (ubr > 0) + { + mOSString += llformat(".%d", ubr); + } + mOSString += ")"; } LLStringUtil::trim(mOSStringSimple); diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp index f066e9a4cdd43006a531453e6bae33a19b8fa586..a4171729dbb8db1805e80ca1dc198b182c58f243 100644 --- a/indra/llcommon/llthread.cpp +++ b/indra/llcommon/llthread.cpp @@ -116,29 +116,27 @@ void LLThread::registerThreadID() // // Handed to the APR thread creation function // -void *APR_THREAD_FUNC LLThread::staticRun(apr_thread_t *apr_threadp, void *datap) +void LLThread::threadRun() { - LLThread *threadp = (LLThread *)datap; - #ifdef LL_WINDOWS - set_thread_name(-1, threadp->mName.c_str()); + set_thread_name(-1, mName.c_str()); #endif // for now, hard code all LLThreads to report to single master thread recorder, which is known to be running on main thread - threadp->mRecorder = new LLTrace::ThreadRecorder(*LLTrace::get_master_thread_recorder()); + mRecorder = new LLTrace::ThreadRecorder(*LLTrace::get_master_thread_recorder()); - sThreadID = threadp->mID; + sThreadID = mID; // Run the user supplied function do { try { - threadp->run(); + run(); } catch (const LLContinueError &e) { - LL_WARNS("THREAD") << "ContinueException on thread '" << threadp->mName << + LL_WARNS("THREAD") << "ContinueException on thread '" << mName << "' reentering run(). Error what is: '" << e.what() << "'" << LL_ENDL; //output possible call stacks to log file. LLError::LLCallStacks::print(); @@ -153,41 +151,27 @@ void *APR_THREAD_FUNC LLThread::staticRun(apr_thread_t *apr_threadp, void *datap //LL_INFOS() << "LLThread::staticRun() Exiting: " << threadp->mName << LL_ENDL; - delete threadp->mRecorder; - threadp->mRecorder = NULL; + delete mRecorder; + mRecorder = NULL; // We're done with the run function, this thread is done executing now. //NB: we are using this flag to sync across threads...we really need memory barriers here // Todo: add LLMutex per thread instead of flag? // We are using "while (mStatus != STOPPED) {ms_sleep();}" everywhere. - threadp->mStatus = STOPPED; - - return NULL; + mStatus = STOPPED; } LLThread::LLThread(const std::string& name, apr_pool_t *poolp) : mPaused(FALSE), mName(name), - mAPRThreadp(NULL), + mThreadp(NULL), mStatus(STOPPED), mRecorder(NULL) { mID = ++sIDIter; - - // Thread creation probably CAN be paranoid about APR being initialized, if necessary - if (poolp) - { - mIsLocalPool = FALSE; - mAPRPoolp = poolp; - } - else - { - mIsLocalPool = TRUE; - apr_pool_create(&mAPRPoolp, NULL); // Create a subpool for this thread - } - mRunCondition = new LLCondition(mAPRPoolp); - mDataLock = new LLMutex(mAPRPoolp); + mRunCondition = new LLCondition(); + mDataLock = new LLMutex(); mLocalAPRFilePoolp = NULL ; } @@ -217,7 +201,7 @@ void LLThread::shutdown() // Warning! If you somehow call the thread destructor from itself, // the thread will die in an unclean fashion! - if (mAPRThreadp) + if (mThreadp) { if (!isStopped()) { @@ -248,14 +232,19 @@ void LLThread::shutdown() { // This thread just wouldn't stop, even though we gave it time //LL_WARNS() << "LLThread::~LLThread() exiting thread before clean exit!" << LL_ENDL; - // Put a stake in its heart. - apr_thread_exit(mAPRThreadp, -1); + // Put a stake in its heart. (A very hostile method to force a thread to quit) +#if LL_WINDOWS + TerminateThread(mNativeHandle, 0); +#else + pthread_cancel(mNativeHandle); +#endif + delete mRecorder; mRecorder = NULL; mStatus = STOPPED; return; } - mAPRThreadp = NULL; + mThreadp = NULL; } delete mRunCondition; @@ -263,12 +252,6 @@ void LLThread::shutdown() delete mDataLock; mDataLock = NULL; - - if (mIsLocalPool && mAPRPoolp) - { - apr_pool_destroy(mAPRPoolp); - mAPRPoolp = 0; - } if (mRecorder) { @@ -287,19 +270,15 @@ void LLThread::start() // Set thread state to running mStatus = RUNNING; - apr_status_t status = - apr_thread_create(&mAPRThreadp, NULL, staticRun, (void *)this, mAPRPoolp); - - if(status == APR_SUCCESS) - { - // We won't bother joining - apr_thread_detach(mAPRThreadp); + try + { + mThreadp = new std::thread(std::bind(&LLThread::threadRun, this)); + mNativeHandle = mThreadp->native_handle(); } - else + catch (std::system_error& ex) { mStatus = STOPPED; - LL_WARNS() << "failed to start thread " << mName << LL_ENDL; - ll_apr_warn_status(status); + LL_WARNS() << "failed to start thread " << mName << " " << ex.what() << LL_ENDL; } } @@ -376,11 +355,7 @@ U32 LLThread::currentID() // static void LLThread::yield() { -#if LL_LINUX || LL_SOLARIS - sched_yield(); // annoyingly, apr_thread_yield is a noop on linux... -#else - apr_thread_yield(); -#endif + std::this_thread::yield(); } void LLThread::wake() @@ -413,7 +388,7 @@ void LLThreadSafeRefCount::initThreadSafeRefCount() { if (!sMutex) { - sMutex = new LLMutex(0); + sMutex = new LLMutex(); } } diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h index dda7fa8ffbb43e11e14a30629010f20fc6a07a1d..863c9051f38cb5edf5a959eb60ef09a16a69d82d 100644 --- a/indra/llcommon/llthread.h +++ b/indra/llcommon/llthread.h @@ -29,10 +29,10 @@ #include "llapp.h" #include "llapr.h" -#include "apr_thread_cond.h" #include "boost/intrusive_ptr.hpp" #include "llmutex.h" #include "llrefcount.h" +#include <thread> LL_COMMON_API void assert_main_thread(); @@ -86,7 +86,6 @@ class LL_COMMON_API LLThread // this kicks off the apr thread void start(void); - apr_pool_t *getAPRPool() { return mAPRPoolp; } LLVolatileAPRPool* getLocalAPRFilePool() { return mLocalAPRFilePoolp ; } U32 getID() const { return mID; } @@ -97,19 +96,18 @@ class LL_COMMON_API LLThread static void registerThreadID(); private: - BOOL mPaused; + bool mPaused; + std::thread::native_handle_type mNativeHandle; // for termination in case of issues // static function passed to APR thread creation routine - static void *APR_THREAD_FUNC staticRun(struct apr_thread_t *apr_threadp, void *datap); + void threadRun(); protected: std::string mName; class LLCondition* mRunCondition; LLMutex* mDataLock; - apr_thread_t *mAPRThreadp; - apr_pool_t *mAPRPoolp; - BOOL mIsLocalPool; + std::thread *mThreadp; EThreadStatus mStatus; U32 mID; LLTrace::ThreadRecorder* mRecorder; diff --git a/indra/llcommon/llthreadsafequeue.cpp b/indra/llcommon/llthreadsafequeue.cpp index 491f920c0f943c6be98b3078e45ee4583cf9f9e4..bde36999ba5bac2d81e89769d7bc12b2f5020b63 100644 --- a/indra/llcommon/llthreadsafequeue.cpp +++ b/indra/llcommon/llthreadsafequeue.cpp @@ -24,87 +24,6 @@ */ #include "linden_common.h" -#include <apr_pools.h> -#include <apr_queue.h> #include "llthreadsafequeue.h" -#include "llexception.h" - -// LLThreadSafeQueueImplementation -//----------------------------------------------------------------------------- - - -LLThreadSafeQueueImplementation::LLThreadSafeQueueImplementation(apr_pool_t * pool, unsigned int capacity): - mOwnsPool(pool == 0), - mPool(pool), - mQueue(0) -{ - if(mOwnsPool) { - apr_status_t status = apr_pool_create(&mPool, 0); - if(status != APR_SUCCESS) LLTHROW(LLThreadSafeQueueError("failed to allocate pool")); - } else { - ; // No op. - } - - apr_status_t status = apr_queue_create(&mQueue, capacity, mPool); - if(status != APR_SUCCESS) LLTHROW(LLThreadSafeQueueError("failed to allocate queue")); -} - - -LLThreadSafeQueueImplementation::~LLThreadSafeQueueImplementation() -{ - if(mQueue != 0) { - if(apr_queue_size(mQueue) != 0) LL_WARNS() << - "terminating queue which still contains " << apr_queue_size(mQueue) << - " elements;" << "memory will be leaked" << LL_ENDL; - apr_queue_term(mQueue); - } - if(mOwnsPool && (mPool != 0)) apr_pool_destroy(mPool); -} - - -void LLThreadSafeQueueImplementation::pushFront(void * element) -{ - apr_status_t status = apr_queue_push(mQueue, element); - - if(status == APR_EINTR) { - LLTHROW(LLThreadSafeQueueInterrupt()); - } else if(status != APR_SUCCESS) { - LLTHROW(LLThreadSafeQueueError("push failed")); - } else { - ; // Success. - } -} - - -bool LLThreadSafeQueueImplementation::tryPushFront(void * element){ - return apr_queue_trypush(mQueue, element) == APR_SUCCESS; -} - - -void * LLThreadSafeQueueImplementation::popBack(void) -{ - void * element; - apr_status_t status = apr_queue_pop(mQueue, &element); - - if(status == APR_EINTR) { - LLTHROW(LLThreadSafeQueueInterrupt()); - } else if(status != APR_SUCCESS) { - LLTHROW(LLThreadSafeQueueError("pop failed")); - } else { - return element; - } -} - - -bool LLThreadSafeQueueImplementation::tryPopBack(void *& element) -{ - return apr_queue_trypop(mQueue, &element) == APR_SUCCESS; -} - - -size_t LLThreadSafeQueueImplementation::size() -{ - return apr_queue_size(mQueue); -} diff --git a/indra/llcommon/llthreadsafequeue.h b/indra/llcommon/llthreadsafequeue.h index 45289ef0b400fa6a0f0b3f6d4b96ae1721cf12d7..b0bddac8e5128d9e67b689084b22a5c9f643a712 100644 --- a/indra/llcommon/llthreadsafequeue.h +++ b/indra/llcommon/llthreadsafequeue.h @@ -28,12 +28,20 @@ #define LL_LLTHREADSAFEQUEUE_H #include "llexception.h" +#include <deque> #include <string> +#if LL_WINDOWS +#pragma warning (push) +#pragma warning (disable:4265) +#endif +// 'std::_Pad' : class has virtual functions, but destructor is not virtual +#include <mutex> +#include <condition_variable> -struct apr_pool_t; // From apr_pools.h -class LLThreadSafeQueueImplementation; // See below. - +#if LL_WINDOWS +#pragma warning (pop) +#endif // // A general queue exception. @@ -64,31 +72,6 @@ class LL_COMMON_API LLThreadSafeQueueInterrupt: } }; - -struct apr_queue_t; // From apr_queue.h - - -// -// Implementation details. -// -class LL_COMMON_API LLThreadSafeQueueImplementation -{ -public: - LLThreadSafeQueueImplementation(apr_pool_t * pool, unsigned int capacity); - ~LLThreadSafeQueueImplementation(); - void pushFront(void * element); - bool tryPushFront(void * element); - void * popBack(void); - bool tryPopBack(void *& element); - size_t size(); - -private: - bool mOwnsPool; - apr_pool_t * mPool; - apr_queue_t * mQueue; -}; - - // // Implements a thread safe FIFO. // @@ -100,7 +83,7 @@ class LLThreadSafeQueue // If the pool is set to NULL one will be allocated and managed by this // queue. - LLThreadSafeQueue(apr_pool_t * pool = 0, unsigned int capacity = 1024); + LLThreadSafeQueue(U32 capacity = 1024); // Add an element to the front of queue (will block if the queue has // reached capacity). @@ -128,77 +111,103 @@ class LLThreadSafeQueue size_t size(); private: - LLThreadSafeQueueImplementation mImplementation; -}; - + std::deque< ElementT > mStorage; + U32 mCapacity; + std::mutex mLock; + std::condition_variable mCapacityCond; + std::condition_variable mEmptyCond; +}; // LLThreadSafeQueue //----------------------------------------------------------------------------- - template<typename ElementT> -LLThreadSafeQueue<ElementT>::LLThreadSafeQueue(apr_pool_t * pool, unsigned int capacity): - mImplementation(pool, capacity) +LLThreadSafeQueue<ElementT>::LLThreadSafeQueue(U32 capacity) : +mCapacity(capacity) { - ; // No op. } template<typename ElementT> void LLThreadSafeQueue<ElementT>::pushFront(ElementT const & element) { - ElementT * elementCopy = new ElementT(element); - try { - mImplementation.pushFront(elementCopy); - } catch (LLThreadSafeQueueInterrupt) { - delete elementCopy; - throw; - } + while (true) + { + std::unique_lock<std::mutex> lock1(mLock); + + if (mStorage.size() < mCapacity) + { + mStorage.push_front(element); + mEmptyCond.notify_one(); + return; + } + + // Storage Full. Wait for signal. + mCapacityCond.wait(lock1); + } } template<typename ElementT> bool LLThreadSafeQueue<ElementT>::tryPushFront(ElementT const & element) { - ElementT * elementCopy = new ElementT(element); - bool result = mImplementation.tryPushFront(elementCopy); - if(!result) delete elementCopy; - return result; + std::unique_lock<std::mutex> lock1(mLock, std::defer_lock); + if (!lock1.try_lock()) + return false; + + if (mStorage.size() >= mCapacity) + return false; + + mStorage.push_front(element); + mEmptyCond.notify_one(); + return true; } template<typename ElementT> ElementT LLThreadSafeQueue<ElementT>::popBack(void) { - ElementT * element = reinterpret_cast<ElementT *> (mImplementation.popBack()); - ElementT result(*element); - delete element; - return result; + while (true) + { + std::unique_lock<std::mutex> lock1(mLock); + + if (!mStorage.empty()) + { + ElementT value = mStorage.back(); + mStorage.pop_back(); + mCapacityCond.notify_one(); + return value; + } + + // Storage empty. Wait for signal. + mEmptyCond.wait(lock1); + } } template<typename ElementT> bool LLThreadSafeQueue<ElementT>::tryPopBack(ElementT & element) { - void * storedElement; - bool result = mImplementation.tryPopBack(storedElement); - if(result) { - ElementT * elementPtr = reinterpret_cast<ElementT *>(storedElement); - element = *elementPtr; - delete elementPtr; - } else { - ; // No op. - } - return result; + std::unique_lock<std::mutex> lock1(mLock, std::defer_lock); + if (!lock1.try_lock()) + return false; + + if (mStorage.empty()) + return false; + + element = mStorage.back(); + mStorage.pop_back(); + mCapacityCond.notify_one(); + return true; } template<typename ElementT> size_t LLThreadSafeQueue<ElementT>::size(void) { - return mImplementation.size(); + std::lock_guard<std::mutex> lock(mLock); + return mStorage.size(); } - #endif diff --git a/indra/llcommon/lluri.cpp b/indra/llcommon/lluri.cpp index 758b98e14390c7df48ba3e624940f71586d789f6..9942bc0cf8803eaaf8cbc61342d3827df8106fed 100644 --- a/indra/llcommon/lluri.cpp +++ b/indra/llcommon/lluri.cpp @@ -173,6 +173,19 @@ namespace "-._~"; return s; } + const std::string path() + { + static const std::string s = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789" + "$-_.+" + "!*'()," + "{}|\\^~[]`" + "<>#%" + ";/?:@&="; + return s; + } const std::string sub_delims() { static const std::string s = "!$&'()*+,;="; @@ -187,6 +200,12 @@ namespace { return LLURI::escape(s, unreserved() + ":@!$'()*+,"); } // sub_delims - "&;=" + ":@" std::string escapeQueryValue(const std::string& s) { return LLURI::escape(s, unreserved() + ":@!$'()*+,="); } // sub_delims - "&;" + ":@" + std::string escapeUriQuery(const std::string& s) + { return LLURI::escape(s, unreserved() + ":@?&$;*+=%/"); } + std::string escapeUriData(const std::string& s) + { return LLURI::escape(s, unreserved() + "%"); } + std::string escapeUriPath(const std::string& s) + { return LLURI::escape(s, path()); } } //static @@ -202,6 +221,85 @@ std::string LLURI::escape(const std::string& str) return escape(str, default_allowed, true); } +//static +std::string LLURI::escapePathAndData(const std::string &str) +{ + std::string result; + + const std::string data_marker = "data:"; + if (str.compare(0, data_marker.length(), data_marker) == 0) + { + // This is not url, but data, data part needs to be properly escaped + // data part is separated by ',' from header. Minimal data uri is "data:," + // See "data URI scheme" + size_t separator = str.find(','); + if (separator != std::string::npos) + { + size_t header_size = separator + 1; + std::string header = str.substr(0, header_size); + // base64 is url-safe + if (header.find("base64") != std::string::npos) + { + // assume url-safe data + result = str; + } + else + { + std::string data = str.substr(header_size, str.length() - header_size); + + // Notes: File can be partially pre-escaped, that's why escaping ignores '%' + // It somewhat limits user from displaying strings like "%20" in text + // but that's how viewer worked for a while and user can double-escape it + + + // Header doesn't need escaping + result = header + escapeUriData(data); + } + } + } + else + { + // try processing it as path with query separator + // The query component is indicated by the first question + // mark("?") character and terminated by a number sign("#") + size_t delim_pos = str.find('?'); + if (delim_pos == std::string::npos) + { + // alternate separator + delim_pos = str.find(';'); + } + + if (delim_pos != std::string::npos) + { + size_t path_size = delim_pos + 1; + std::string query; + std::string fragment; + + size_t fragment_pos = str.find('#'); + if (fragment_pos != std::string::npos) + { + query = str.substr(path_size, fragment_pos - path_size); + fragment = str.substr(fragment_pos); + } + else + { + query = str.substr(path_size); + } + + std::string path = str.substr(0, path_size); + + result = escapeUriPath(path) + escapeUriQuery(query) + escapeUriPath(fragment); + } + } + + if (result.empty()) + { + // Not a known scheme or no data part, try just escaping as Uri path + result = escapeUriPath(str); + } + return result; +} + LLURI::LLURI() { } diff --git a/indra/llcommon/lluri.h b/indra/llcommon/lluri.h index 9e44cc7da2ac10fa7b2d1d21c47f0881988bfef2..b8fca0ca5162bd3fec32da9bada17268205a86b3 100644 --- a/indra/llcommon/lluri.h +++ b/indra/llcommon/lluri.h @@ -157,6 +157,14 @@ class LL_COMMON_API LLURI const std::string& allowed, bool is_allowed_sorted = false); + /** + * @brief Break string into data part and path or sheme + * and escape path (if present) and data. + * Data part is not allowed to have path related symbols + * @param str The raw URI to escape. + */ + static std::string escapePathAndData(const std::string &str); + /** * @brief unescape an escaped URI string. * diff --git a/indra/llcommon/lluuid.cpp b/indra/llcommon/lluuid.cpp index d4af2c6b011f2cf261247a5a798ef051060c988c..8f33d789ebde25871f9c480d229029507556fbd6 100644 --- a/indra/llcommon/lluuid.cpp +++ b/indra/llcommon/lluuid.cpp @@ -738,7 +738,7 @@ void LLUUID::getCurrentTime(uuid_time_t *timestamp) getSystemTime(&time_last); uuids_this_tick = uuids_per_tick; init = TRUE; - mMutex = new LLMutex(NULL); + mMutex = new LLMutex(); } uuid_time_t time_now = {0,0}; diff --git a/indra/llcommon/llworkerthread.cpp b/indra/llcommon/llworkerthread.cpp index 4c197dc1d6362b193fd3fe29f9f2a73880022da6..4b91b2cacaf4007ab467ff4a7c505a7e32ff8826 100644 --- a/indra/llcommon/llworkerthread.cpp +++ b/indra/llcommon/llworkerthread.cpp @@ -37,7 +37,7 @@ LLWorkerThread::LLWorkerThread(const std::string& name, bool threaded, bool should_pause) : LLQueuedThread(name, threaded, should_pause) { - mDeleteMutex = new LLMutex(NULL); + mDeleteMutex = new LLMutex(); if(!mLocalAPRFilePoolp) { @@ -204,7 +204,7 @@ LLWorkerClass::LLWorkerClass(LLWorkerThread* workerthread, const std::string& na mWorkerClassName(name), mRequestHandle(LLWorkerThread::nullHandle()), mRequestPriority(LLWorkerThread::PRIORITY_NORMAL), - mMutex(NULL), + mMutex(), mWorkFlags(0) { if (!mWorkerThread) diff --git a/indra/llcommon/llworkerthread.h b/indra/llcommon/llworkerthread.h index 09776816a87f2312f8b26a4239d2af944daa2b91..b1a6f613607c908e505a316dbbd5df8bce5abb31 100644 --- a/indra/llcommon/llworkerthread.h +++ b/indra/llcommon/llworkerthread.h @@ -33,7 +33,7 @@ #include <string> #include "llqueuedthread.h" -#include "llapr.h" +#include "llatomic.h" #define USE_FRAME_CALLBACK_MANAGER 0 diff --git a/indra/llcommon/tests/lluri_test.cpp b/indra/llcommon/tests/lluri_test.cpp index 4c64f15ca78efa54e93a9353177631185fa2eed1..1a4c6641b9c0f096906e296952b950fa6eb5f171 100644 --- a/indra/llcommon/tests/lluri_test.cpp +++ b/indra/llcommon/tests/lluri_test.cpp @@ -383,6 +383,41 @@ namespace tut ensure_equals("query", u.query(), "redirect-http-hack=secondlife:///app/login?first_name=Callum&last_name=Linden&location=specify&grid=vaak®ion=/Morris/128/128&web_login_key=efaa4795-c2aa-4c58-8966-763c27931e78"); ensure_equals("query map element", u.queryMap()["redirect-http-hack"].asString(), "secondlife:///app/login?first_name=Callum&last_name=Linden&location=specify&grid=vaak®ion=/Morris/128/128&web_login_key=efaa4795-c2aa-4c58-8966-763c27931e78"); } + + template<> template<> + void URITestObject::test<20>() + { + set_test_name("escapePathAndData uri test"); + + // Basics scheme:[//authority]path[?query][#fragment] + ensure_equals(LLURI::escapePathAndData("dirname?query"), + "dirname?query"); + ensure_equals(LLURI::escapePathAndData("dirname?query=data"), + "dirname?query=data"); + ensure_equals(LLURI::escapePathAndData("host://dirname/subdir name?query#fragment"), + "host://dirname/subdir%20name?query#fragment"); + ensure_equals(LLURI::escapePathAndData("host://dirname/subdir name?query=some@>data#fragment"), + "host://dirname/subdir%20name?query=some@%3Edata#fragment"); + ensure_equals(LLURI::escapePathAndData("host://dir[name/subdir name?query=some[data#fra[gment"), + "host://dir[name/subdir%20name?query=some%5Bdata#fra[gment"); + ensure_equals(LLURI::escapePathAndData("mailto:zero@ll.com"), + "mailto:zero@ll.com"); + // pre-escaped + ensure_equals(LLURI::escapePathAndData("host://dirname/subdir%20name"), + "host://dirname/subdir%20name"); + + // data:[<mediatype>][;base64],<data> + ensure_equals(LLURI::escapePathAndData("data:,Hello, World!"), + "data:,Hello%2C%20World%21"); + ensure_equals(LLURI::escapePathAndData("data:text/html,<h1>Hello, World!</h1>"), + "data:text/html,%3Ch1%3EHello%2C%20World%21%3C%2Fh1%3E"); + // pre-escaped + ensure_equals(LLURI::escapePathAndData("data:text/html,%3Ch1%3EHello%2C%20World!</h1>"), + "data:text/html,%3Ch1%3EHello%2C%20World%21%3C%2Fh1%3E"); + // assume that base64 does not need escaping + ensure_equals(LLURI::escapePathAndData("data:image;base64,SGVs/bG8sIFd/vcmxkIQ%3D%3D!-&*?="), + "data:image;base64,SGVs/bG8sIFd/vcmxkIQ%3D%3D!-&*?="); + } } diff --git a/indra/llcorehttp/_httplibcurl.cpp b/indra/llcorehttp/_httplibcurl.cpp index abd304f6a55c5e63f91cbd6f78b9385991c79b7e..975ce8a4d5b338f0cd14377bc0aa84f96efa8026 100644 --- a/indra/llcorehttp/_httplibcurl.cpp +++ b/indra/llcorehttp/_httplibcurl.cpp @@ -355,7 +355,8 @@ bool HttpLibcurl::completeRequest(CURLM * multi_handle, CURL * handle, CURLcode } if (op->mStatus) { - int http_status(HTTP_OK); + // note: CURLINFO_RESPONSE_CODE requires a long - https://curl.haxx.se/libcurl/c/CURLINFO_RESPONSE_CODE.html + long http_status(HTTP_OK); if (handle) { diff --git a/indra/llcorehttp/_httpoprequest.cpp b/indra/llcorehttp/_httpoprequest.cpp index cc49a2af80bf8094671517e6152cab0bd02cb23a..0f76ff23ea9731b14eaed7001646da45a9b17991 100644 --- a/indra/llcorehttp/_httpoprequest.cpp +++ b/indra/llcorehttp/_httpoprequest.cpp @@ -555,6 +555,11 @@ HttpStatus HttpOpRequest::prepareRequest(HttpService * service) // about 700 or so requests and starts issuing TCP RSTs to // new connections. Reuse the DNS lookups for even a few // seconds and no RSTs. + // + // -1 stores forever + // 0 never stores + // any other positive number specifies seconds + // supposedly curl 7.62.0 can use TTL by default, otherwise default is 60 seconds check_curl_easy_setopt(mCurlHandle, CURLOPT_DNS_CACHE_TIMEOUT, dnsCacheTimeout); if (gpolicy.mUseLLProxy) diff --git a/indra/llcorehttp/_httpservice.h b/indra/llcorehttp/_httpservice.h index ac518a5de7405022ee270ac6a16b81586b13a56a..d0c37ac1956a9a89b3268b0fc584dfd0eabb323c 100644 --- a/indra/llcorehttp/_httpservice.h +++ b/indra/llcorehttp/_httpservice.h @@ -31,7 +31,7 @@ #include <vector> #include "linden_common.h" -#include "llapr.h" +#include "llatomic.h" #include "httpcommon.h" #include "httprequest.h" #include "_httppolicyglobal.h" diff --git a/indra/llcorehttp/_refcounted.h b/indra/llcorehttp/_refcounted.h index 7f713f229836a7c2f34ba6ba01a42b850ad315f6..5cc8914395dc84e4ef4a04d254b6e0df5f2b7cfa 100644 --- a/indra/llcorehttp/_refcounted.h +++ b/indra/llcorehttp/_refcounted.h @@ -34,7 +34,7 @@ #include <boost/thread.hpp> #include <boost/intrusive_ptr.hpp> -#include "llapr.h" +#include "llatomic.h" namespace LLCoreInt diff --git a/indra/llcorehttp/_thread.h b/indra/llcorehttp/_thread.h index e058d660e5654700debfe9de6a31f6bcac6f12ff..22b7750badb1b88b64f0ae500f208f3c54ae3199 100644 --- a/indra/llcorehttp/_thread.h +++ b/indra/llcorehttp/_thread.h @@ -33,6 +33,7 @@ #include <boost/function.hpp> #include <boost/date_time/posix_time/posix_time_types.hpp> +#include "apr.h" // thread-related functions #include "_refcounted.h" namespace LLCoreInt diff --git a/indra/llcorehttp/httpcommon.cpp b/indra/llcorehttp/httpcommon.cpp index 1829062af6426b1137323214aec283a8ecb9a475..7c93c54cdfc3fba724eddeae0cd6ec2b41773580 100644 --- a/indra/llcorehttp/httpcommon.cpp +++ b/indra/llcorehttp/httpcommon.cpp @@ -333,7 +333,7 @@ LLMutex *getCurlMutex() if (!sHandleMutexp) { - sHandleMutexp = new LLMutex(NULL); + sHandleMutexp = new LLMutex(); } return sHandleMutexp; @@ -389,7 +389,7 @@ void initialize() S32 mutex_count = CRYPTO_num_locks(); for (S32 i = 0; i < mutex_count; i++) { - sSSLMutex.push_back(LLMutex_ptr(new LLMutex(NULL))); + sSSLMutex.push_back(LLMutex_ptr(new LLMutex())); } CRYPTO_set_id_callback(&ssl_thread_id); CRYPTO_set_locking_callback(&ssl_locking_callback); diff --git a/indra/llcorehttp/tests/test_httprequest.hpp b/indra/llcorehttp/tests/test_httprequest.hpp index b450f3502e63c0f3c8328a2ee1e275d6f3aa8db1..e65588e48fd9c97f74c7df9e67384cad78375e49 100644 --- a/indra/llcorehttp/tests/test_httprequest.hpp +++ b/indra/llcorehttp/tests/test_httprequest.hpp @@ -2903,6 +2903,13 @@ void HttpRequestTestObjectType::test<22>() set_test_name("BUG-2295"); +#if LL_WINDOWS && ADDRESS_SIZE == 64 + // teamcity win64 builds freeze on this test, if you figure out the cause, please fix it + if (getenv("TEAMCITY_PROJECT_NAME")) + { + skip("BUG-2295 - partial load on W64 causes freeze"); + } +#endif // Handler can be stack-allocated *if* there are no dangling // references to it after completion of this method. // Create before memory record as the string copy will bump numbers. @@ -2921,6 +2928,7 @@ void HttpRequestTestObjectType::test<22>() // options set options = HttpOptions::ptr_t(new HttpOptions()); options->setRetries(1); // Partial_File is retryable and can timeout in here + options->setDNSCacheTimeout(30); // Get singletons created HttpRequest::createService(); @@ -3091,7 +3099,11 @@ void HttpRequestTestObjectType::test<23>() set_test_name("HttpRequest GET 503s with 'Retry-After'"); #if LL_WINDOWS && ADDRESS_SIZE == 64 - skip("llcorehttp 503-with-retry test hangs on Windows 64"); + // teamcity win64 builds freeze on this test, if you figure out the cause, please fix it + if (getenv("TEAMCITY_PROJECT_NAME")) + { + skip("llcorehttp 503-with-retry test hangs on Windows 64"); + } #endif // This tests mainly that the code doesn't fall over if diff --git a/indra/llcrashlogger/llcrashlock.cpp b/indra/llcrashlogger/llcrashlock.cpp index 77abfbcf0f7b1b40f34739e08e72685d23e59dfd..18d164abde5627b2f8a6e6b4447e0ba03e4f39ea 100644 --- a/indra/llcrashlogger/llcrashlock.cpp +++ b/indra/llcrashlogger/llcrashlock.cpp @@ -27,6 +27,7 @@ #include "linden_common.h" +#include "llapr.h" // thread-related functions #include "llcrashlock.h" #include "lldir.h" #include "llsd.h" diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index 1a4dd2ca9943c67b2383580972cd3883147b75dd..680fbf548f7ffd80ac819cda04957e027592088b 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -594,7 +594,7 @@ void LLImage::initClass(bool use_new_byte_range, S32 minimal_reverse_byte_range_ { sUseNewByteRange = use_new_byte_range; sMinimalReverseByteRangePercent = minimal_reverse_byte_range_percent; - sMutex = new LLMutex(NULL); + sMutex = new LLMutex(); } //static diff --git a/indra/llimage/llimagebmp.cpp b/indra/llimage/llimagebmp.cpp index 867b2bb47bac2311de1ea1c6a24be455163c9ce2..90b7272efa78f17d4314f8b07a763b23f0ba3b23 100644 --- a/indra/llimage/llimagebmp.cpp +++ b/indra/llimage/llimagebmp.cpp @@ -181,7 +181,7 @@ bool LLImageBMP::updateData() } } else - if( 12 <= header.mSize && 64 <= header.mSize ) + if( 12 <= header.mSize && header.mSize <= 64 ) { setLastError("OS/2 2.x BMP files are not supported"); return false; diff --git a/indra/llimage/llimageworker.cpp b/indra/llimage/llimageworker.cpp index 4875fe700198edc91015228311de23a01b03bc65..5f42fba86602ecf4df3b609ebae06b4ff947495a 100644 --- a/indra/llimage/llimageworker.cpp +++ b/indra/llimage/llimageworker.cpp @@ -35,7 +35,7 @@ LLImageDecodeThread::LLImageDecodeThread(bool threaded) : LLQueuedThread("imagedecode", threaded) { - mCreationMutex = new LLMutex(getAPRPool()); + mCreationMutex = new LLMutex(); } //virtual diff --git a/indra/llinventory/llinventorytype.h b/indra/llinventory/llinventorytype.h index 891ab217fd7f740b4574e645463ff6a0e1ce52f9..034cee5f45d81d615698ae7c2f0de79c7030cd27 100644 --- a/indra/llinventory/llinventorytype.h +++ b/indra/llinventory/llinventorytype.h @@ -101,6 +101,7 @@ class LLInventoryType ICONNAME_CLOTHING_SKIRT, ICONNAME_CLOTHING_ALPHA, ICONNAME_CLOTHING_TATTOO, + ICONNAME_CLOTHING_UNIVERSAL, ICONNAME_ANIMATION, ICONNAME_GESTURE, diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h index 280d2653d35f6694379dc42ff66d00ccf5fe3169..0e2f62f9db85a28a5684abee685e1f0d2be02d67 100644 --- a/indra/llmath/lloctree.h +++ b/indra/llmath/lloctree.h @@ -401,7 +401,7 @@ class LLOctreeNode : public LLTreeNode<T> child->insert(data); } } - else + else if (parent) { //it's not in here, give it to the root OCT_ERRS << "Octree insertion failed, starting over from root!" << LL_ENDL; @@ -416,6 +416,13 @@ class LLOctreeNode : public LLTreeNode<T> node->insert(data); } + else + { + // It's not in here, and we are root. + // LLOctreeRoot::insert() should have expanded + // root by now, something is wrong + OCT_ERRS << "Octree insertion failed! Root expansion failed." << LL_ENDL; + } return false; } @@ -763,10 +770,15 @@ class LLOctreeRoot : public LLOctreeNode<T> { LLOctreeNode<T>::insert(data); } - else + else if (node->isInside(data->getPositionGroup())) { node->insert(data); } + else + { + // calling node->insert(data) will return us to root + OCT_ERRS << "Failed to insert data at child node" << LL_ENDL; + } } else if (this->getChildCount() == 0) { diff --git a/indra/llmath/llvolumemgr.cpp b/indra/llmath/llvolumemgr.cpp index 3b8f08e0c6cc125557849211e76a4118951dafec..89cdb1c6b9176cb4c42e5774c0632d69bd217147 100644 --- a/indra/llmath/llvolumemgr.cpp +++ b/indra/llmath/llvolumemgr.cpp @@ -48,7 +48,7 @@ LLVolumeMgr::LLVolumeMgr() { // the LLMutex magic interferes with easy unit testing, // so you now must manually call useMutex() to use it - //mDataMutex = new LLMutex(gAPRPoolp); + //mDataMutex = new LLMutex(); } LLVolumeMgr::~LLVolumeMgr() @@ -214,7 +214,7 @@ void LLVolumeMgr::useMutex() { if (!mDataMutex) { - mDataMutex = new LLMutex(gAPRPoolp); + mDataMutex = new LLMutex(); } } diff --git a/indra/llmessage/llbuffer.cpp b/indra/llmessage/llbuffer.cpp index d07d9980c38bd662190a55dea03b41a6eaa3ed4f..1a0eceba0f824144a5fa073f903e68cbbc25c71d 100644 --- a/indra/llmessage/llbuffer.cpp +++ b/indra/llmessage/llbuffer.cpp @@ -265,7 +265,7 @@ void LLBufferArray::setThreaded(bool threaded) { if(!mMutexp) { - mMutexp = new LLMutex(NULL); + mMutexp = new LLMutex(); } } else diff --git a/indra/llmessage/lliosocket.cpp b/indra/llmessage/lliosocket.cpp index b15b98db806b04ae7204cd2a6c4482a5d0f7b13a..7caf0766b72f75f05b2c1c3a2553f6b19549073b 100644 --- a/indra/llmessage/lliosocket.cpp +++ b/indra/llmessage/lliosocket.cpp @@ -265,7 +265,7 @@ LLSocket::~LLSocket() void LLSocket::setBlocking(S32 timeout) { // set up the socket options - ll_apr_warn_status(apr_socket_timeout_set(mSocket, timeout)); + ll_apr_warn_status(apr_socket_timeout_set(mSocket, timeout)); // Sets both receive and send timeout SO_RCVTIMEO, SO_SNDTIMEO ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_NONBLOCK, 0)); ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_SNDBUF, LL_SEND_BUFFER_SIZE)); ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_RCVBUF, LL_RECV_BUFFER_SIZE)); diff --git a/indra/llmessage/llproxy.cpp b/indra/llmessage/llproxy.cpp index 537efa69d88bb1bdaf33b31fb0f0a814f7a18ca3..dea03aab853fe6267170ca7f8163c4425672bfb8 100644 --- a/indra/llmessage/llproxy.cpp +++ b/indra/llmessage/llproxy.cpp @@ -48,7 +48,7 @@ static void tcp_close_channel(LLSocket::ptr_t* handle_ptr); // Close an open TCP LLProxy::LLProxy(): mHTTPProxyEnabled(false), - mProxyMutex(NULL), + mProxyMutex(), mUDPProxy(), mTCPProxy(), mHTTPProxy(), @@ -473,7 +473,8 @@ static apr_status_t tcp_blocking_handshake(LLSocket::ptr_t handle, char * dataou rv = apr_socket_send(apr_socket, dataout, &outlen); if (APR_SUCCESS != rv) { - LL_WARNS("Proxy") << "Error sending data to proxy control channel, status: " << rv << LL_ENDL; + char buf[MAX_STRING]; + LL_WARNS("Proxy") << "Error sending data to proxy control channel, status: " << rv << " " << apr_strerror(rv, buf, MAX_STRING) << LL_ENDL; ll_apr_warn_status(rv); } else if (expected_len != outlen) @@ -483,13 +484,16 @@ static apr_status_t tcp_blocking_handshake(LLSocket::ptr_t handle, char * dataou rv = -1; } + ms_sleep(1); + if (APR_SUCCESS == rv) { expected_len = maxinlen; rv = apr_socket_recv(apr_socket, datain, &maxinlen); if (rv != APR_SUCCESS) { - LL_WARNS("Proxy") << "Error receiving data from proxy control channel, status: " << rv << LL_ENDL; + char buf[MAX_STRING]; + LL_WARNS("Proxy") << "Error receiving data from proxy control channel, status: " << rv << " " << apr_strerror(rv, buf, MAX_STRING) << LL_ENDL; ll_apr_warn_status(rv); } else if (expected_len < maxinlen) diff --git a/indra/llmessage/llproxy.h b/indra/llmessage/llproxy.h index 688dff7c8320916b9f2027f91f16d0cd6408867f..87891901ad6935cc627e63f02d03bf22b010de2f 100644 --- a/indra/llmessage/llproxy.h +++ b/indra/llmessage/llproxy.h @@ -298,7 +298,7 @@ class LLProxy: public LLSingleton<LLProxy> private: // Is the HTTP proxy enabled? Safe to read in any thread, but do not write directly. // Instead use enableHTTPProxy() and disableHTTPProxy() instead. - mutable LLAtomic32<bool> mHTTPProxyEnabled; + mutable LLAtomicBool mHTTPProxyEnabled; // Mutex to protect shared members in non-main thread calls to applyProxySettings(). mutable LLMutex mProxyMutex; diff --git a/indra/llmessage/llpumpio.cpp b/indra/llmessage/llpumpio.cpp index 506ccc98a4b315ab0baab35b394d8f524779a779..a2524e98043f6ec2dd17f01aa767966d9ed70715 100644 --- a/indra/llmessage/llpumpio.cpp +++ b/indra/llmessage/llpumpio.cpp @@ -54,11 +54,7 @@ // constants for poll timeout. if we are threading, we want to have a // longer poll timeout. -#if LL_THREADS_APR -static const S32 DEFAULT_POLL_TIMEOUT = 1000; -#else static const S32 DEFAULT_POLL_TIMEOUT = 0; -#endif // The default (and fallback) expiration time for chains const F32 DEFAULT_CHAIN_EXPIRY_SECS = 30.0f; @@ -169,8 +165,6 @@ LLPumpIO::LLPumpIO(apr_pool_t* pool) : mPool(NULL), mCurrentPool(NULL), mCurrentPoolReallocCount(0), - mChainsMutex(NULL), - mCallbackMutex(NULL), mCurrentChain(mRunningChains.end()) { mCurrentChain = mRunningChains.end(); @@ -194,9 +188,6 @@ bool LLPumpIO::addChain(const chain_t& chain, F32 timeout, bool has_curl_request { if(chain.empty()) return false; -#if LL_THREADS_APR - LLScopedLock lock(mChainsMutex); -#endif LLChainInfo info; info.mHasCurlRequest = has_curl_request; info.setTimeoutSeconds(timeout); @@ -234,9 +225,6 @@ bool LLPumpIO::addChain( if(!data) return false; if(links.empty()) return false; -#if LL_THREADS_APR - LLScopedLock lock(mChainsMutex); -#endif #if LL_DEBUG_PIPE_TYPE_IN_PUMP LL_DEBUGS() << "LLPumpIO::addChain() " << links[0].mPipe << " '" << typeid(*(links[0].mPipe)).name() << "'" << LL_ENDL; @@ -391,9 +379,6 @@ void LLPumpIO::clearLock(S32 key) // therefore won't be treading into deleted memory. I think we can // also clear the lock on the chain safely since the pump only // reads that value. -#if LL_THREADS_APR - LLScopedLock lock(mChainsMutex); -#endif mClearLocks.insert(key); } @@ -457,9 +442,6 @@ void LLPumpIO::pump(const S32& poll_timeout) PUMP_DEBUG; if(true) { -#if LL_THREADS_APR - LLScopedLock lock(mChainsMutex); -#endif // bail if this pump is paused. if(PAUSING == mState) { @@ -724,25 +706,10 @@ void LLPumpIO::pump(const S32& poll_timeout) END_PUMP_DEBUG; } -//bool LLPumpIO::respond(const chain_t& pipes) -//{ -//#if LL_THREADS_APR -// LLScopedLock lock(mCallbackMutex); -//#endif -// LLChainInfo info; -// links_t links; -// -// mPendingCallbacks.push_back(info); -// return true; -//} - bool LLPumpIO::respond(LLIOPipe* pipe) { if(NULL == pipe) return false; -#if LL_THREADS_APR - LLScopedLock lock(mCallbackMutex); -#endif LLChainInfo info; LLLinkInfo link; link.mPipe = pipe; @@ -761,10 +728,6 @@ bool LLPumpIO::respond( if(!data) return false; if(links.empty()) return false; -#if LL_THREADS_APR - LLScopedLock lock(mCallbackMutex); -#endif - // Add the callback response LLChainInfo info; info.mChainLinks = links; @@ -781,9 +744,6 @@ void LLPumpIO::callback() //LL_INFOS() << "LLPumpIO::callback()" << LL_ENDL; if(true) { -#if LL_THREADS_APR - LLScopedLock lock(mCallbackMutex); -#endif std::copy( mPendingCallbacks.begin(), mPendingCallbacks.end(), @@ -809,9 +769,6 @@ void LLPumpIO::callback() void LLPumpIO::control(LLPumpIO::EControl op) { -#if LL_THREADS_APR - LLScopedLock lock(mChainsMutex); -#endif switch(op) { case PAUSE: @@ -829,22 +786,11 @@ void LLPumpIO::control(LLPumpIO::EControl op) void LLPumpIO::initialize(apr_pool_t* pool) { if(!pool) return; -#if LL_THREADS_APR - // SJB: Windows defaults to NESTED and OSX defaults to UNNESTED, so use UNNESTED explicitly. - apr_thread_mutex_create(&mChainsMutex, APR_THREAD_MUTEX_UNNESTED, pool); - apr_thread_mutex_create(&mCallbackMutex, APR_THREAD_MUTEX_UNNESTED, pool); -#endif mPool = pool; } void LLPumpIO::cleanup() { -#if LL_THREADS_APR - if(mChainsMutex) apr_thread_mutex_destroy(mChainsMutex); - if(mCallbackMutex) apr_thread_mutex_destroy(mCallbackMutex); -#endif - mChainsMutex = NULL; - mCallbackMutex = NULL; if(mPollset) { // LL_DEBUGS() << "cleaning up pollset" << LL_ENDL; diff --git a/indra/llmessage/llpumpio.h b/indra/llmessage/llpumpio.h index d2c5d3757136e57caaba21b02a01d812090c3e0f..b9eabee710f2584da95f378e1c689e54122e3496 100644 --- a/indra/llmessage/llpumpio.h +++ b/indra/llmessage/llpumpio.h @@ -40,9 +40,6 @@ #include "lliopipe.h" #include "llrun.h" -// Define this to enable use with the APR thread library. -//#define LL_THREADS_APR 1 - // some simple constants to help with timeouts extern const F32 DEFAULT_CHAIN_EXPIRY_SECS; extern const F32 SHORT_CHAIN_EXPIRY_SECS; @@ -393,14 +390,6 @@ class LLPumpIO apr_pool_t* mCurrentPool; S32 mCurrentPoolReallocCount; -#if LL_THREADS_APR - apr_thread_mutex_t* mChainsMutex; - apr_thread_mutex_t* mCallbackMutex; -#else - int* mChainsMutex; - int* mCallbackMutex; -#endif - protected: void initialize(apr_pool_t* pool); void cleanup(); diff --git a/indra/llmessage/llregionflags.h b/indra/llmessage/llregionflags.h index d3791ef4d1ff6b47e64ee926b0c7322b9bf480e7..e1ccd333f152905e2cee37c731f8d4f87344e685 100644 --- a/indra/llmessage/llregionflags.h +++ b/indra/llmessage/llregionflags.h @@ -166,7 +166,7 @@ const U32 ESTATE_ACCESS_MANAGER_REMOVE = 1U << 9; const U32 ESTATE_ACCESS_NO_REPLY = 1U << 10; const U32 ESTATE_ACCESS_FAILED_BAN_ESTATE_MANAGER = 1U << 11; -const S32 ESTATE_MAX_MANAGERS = 10; +const S32 ESTATE_MAX_MANAGERS = 15; const S32 ESTATE_MAX_ACCESS_IDS = 500; // max for access, banned const S32 ESTATE_MAX_GROUP_IDS = (S32) ESTATE_ACCESS_MAX_ENTRIES_PER_PACKET; diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index 9d447b0f373e10772a7034bfd8b628c9ef0cb109..78b148381025a9c0c18ac9af79bb8edff91d8ffd 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -33,7 +33,10 @@ #include "llpluginmessageclasses.h" #include "llcontrol.h" -extern LLControlGroup gSavedSettings; +extern LLControlGroup gSavedSettings; +#if LL_DARWIN +extern BOOL gHiDPISupport; +#endif static int LOW_PRIORITY_TEXTURE_SIZE_DEFAULT = 256; @@ -365,11 +368,16 @@ void LLPluginClassMedia::setSizeInternal(void) mRequestedMediaHeight = nextPowerOf2(mRequestedMediaHeight); } - if(mRequestedMediaWidth > 2048) - mRequestedMediaWidth = 2048; +#if LL_DARWIN + if (!gHiDPISupport) +#endif + { + if (mRequestedMediaWidth > 2048) + mRequestedMediaWidth = 2048; - if(mRequestedMediaHeight > 2048) - mRequestedMediaHeight = 2048; + if (mRequestedMediaHeight > 2048) + mRequestedMediaHeight = 2048; + } } void LLPluginClassMedia::setAutoScale(bool auto_scale) diff --git a/indra/llplugin/llpluginmessagepipe.cpp b/indra/llplugin/llpluginmessagepipe.cpp index 9468696507b31e98be7b947a4badad5024ee9c56..9766e1bfede5f8f130153bc1f8b44d3c232ea6f6 100644 --- a/indra/llplugin/llpluginmessagepipe.cpp +++ b/indra/llplugin/llpluginmessagepipe.cpp @@ -92,8 +92,8 @@ void LLPluginMessagePipeOwner::killMessagePipe(void) } LLPluginMessagePipe::LLPluginMessagePipe(LLPluginMessagePipeOwner *owner, LLSocket::ptr_t socket): - mInputMutex(gAPRPoolp), - mOutputMutex(gAPRPoolp), + mInputMutex(), + mOutputMutex(), mOutputStartIndex(0), mOwner(owner), mSocket(socket) diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp index 0a8e58ac90cf60d7fda67900b565ce0e6ec9f426..eb6cb1b503a00778e37bbb22853aa5ecf0659b39 100644 --- a/indra/llplugin/llpluginprocessparent.cpp +++ b/indra/llplugin/llpluginprocessparent.cpp @@ -80,11 +80,11 @@ class LLPluginProcessParentPollThread: public LLThread }; LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner): - mIncomingQueueMutex(gAPRPoolp) + mIncomingQueueMutex() { if(!sInstancesMutex) { - sInstancesMutex = new LLMutex(gAPRPoolp); + sInstancesMutex = new LLMutex(); } mOwner = owner; diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h index cf3288489a86399a349fa125d18824ded39819aa..51fa2f8079cfef5f9182df9a68e24280dce4f88b 100644 --- a/indra/llprimitive/llmodel.h +++ b/indra/llprimitive/llmodel.h @@ -154,7 +154,6 @@ class LLModel : public LLVolume void ClearFacesAndMaterials() { mVolumeFaces.clear(); mMaterialList.clear(); } std::string getName() const; - std::string getMetric() const {return mMetric;} EModelStatus getStatus() const {return mStatus;} static std::string getStatusString(U32 status) ; @@ -260,8 +259,6 @@ class LLModel : public LLVolume std::string mRequestedLabel; // name requested in UI, if any. std::string mLabel; // name computed from dae. - std::string mMetric; // user-supplied metric data for upload - LLVector3 mNormalizedScale; LLVector3 mNormalizedTranslation; diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp index c69c059880cb2b4534c26d9d2aae95b2f87eed8b..a0987b35d86270d3d86a62da71a7e567e424d40e 100644 --- a/indra/llprimitive/llprimitive.cpp +++ b/indra/llprimitive/llprimitive.cpp @@ -1040,14 +1040,26 @@ S32 LLPrimitive::packTEField(U8 *cur_ptr, U8 *data_ptr, U8 data_size, U8 last_fa } //assign exception faces to cur_ptr - if (exception_faces >= (0x1 << 7)) + if (exception_faces >= ((U64)0x1 << 7)) { - if (exception_faces >= (0x1 << 14)) + if (exception_faces >= ((U64)0x1 << 14)) { - if (exception_faces >= (0x1 << 21)) + if (exception_faces >= ((U64)0x1 << 21)) { - if (exception_faces >= (0x1 << 28)) + if (exception_faces >= ((U64)0x1 << 28)) { + if (exception_faces >= ((U64)0x1 << 35)) + { + if (exception_faces >= ((U64)0x1 << 42)) + { + if (exception_faces >= ((U64)0x1 << 49)) + { + *cur_ptr++ = (U8)(((exception_faces >> 49) & 0x7F) | 0x80); + } + *cur_ptr++ = (U8)(((exception_faces >> 42) & 0x7F) | 0x80); + } + *cur_ptr++ = (U8)(((exception_faces >> 35) & 0x7F) | 0x80); + } *cur_ptr++ = (U8)(((exception_faces >> 28) & 0x7F) | 0x80); } *cur_ptr++ = (U8)(((exception_faces >> 21) & 0x7F) | 0x80); @@ -1056,6 +1068,7 @@ S32 LLPrimitive::packTEField(U8 *cur_ptr, U8 *data_ptr, U8 data_size, U8 last_fa } *cur_ptr++ = (U8)(((exception_faces >> 7) & 0x7F) | 0x80); } + *cur_ptr++ = (U8)(exception_faces & 0x7F); @@ -1115,7 +1128,7 @@ S32 LLPrimitive::unpackTEField(U8 *cur_ptr, U8 *buffer_end, U8 *data_ptr, U8 dat // Includes information about image ID, color, scale S,T, offset S,T and rotation BOOL LLPrimitive::packTEMessage(LLMessageSystem *mesgsys) const { - const U32 MAX_TES = 32; + const U32 MAX_TES = 45; U8 image_ids[MAX_TES*16]; U8 colors[MAX_TES*4]; @@ -1200,7 +1213,7 @@ BOOL LLPrimitive::packTEMessage(LLMessageSystem *mesgsys) const BOOL LLPrimitive::packTEMessage(LLDataPacker &dp) const { - const U32 MAX_TES = 32; + const U32 MAX_TES = 45; U8 image_ids[MAX_TES*16]; U8 colors[MAX_TES*4]; @@ -1313,6 +1326,8 @@ S32 LLPrimitive::parseTEMessage(LLMessageSystem* mesgsys, char const* block_name mesgsys->getBinaryDataFast(block_name, _PREHASH_TextureEntry, tec.packed_buffer, 0, block_num, LLTEContents::MAX_TE_BUFFER); } + + tec.face_count = llmin((U32)getNumTEs(),(U32)LLTEContents::MAX_TES); U8 *cur_ptr = tec.packed_buffer; @@ -1385,6 +1400,8 @@ S32 LLPrimitive::applyParsedTEMessage(LLTEContents& tec) retval |= setTEColor(i, color); + + } return retval; @@ -1403,7 +1420,7 @@ S32 LLPrimitive::unpackTEMessage(LLDataPacker &dp) { // use a negative block_num to indicate a single-block read (a non-variable block) S32 retval = 0; - const U32 MAX_TES = 32; + const U32 MAX_TES = 45; // Avoid construction of 32 UUIDs per call static LLUUID image_ids[MAX_TES]; @@ -1580,7 +1597,7 @@ bool LLPrimitive::getTESTAxes(const U8 face, U32* s_axis, U32* t_axis) *s_axis = VY; *t_axis = VZ; return true; } - else if (face == 5) + else if (face >= 5) { *s_axis = VX; *t_axis = VY; return true; diff --git a/indra/llprimitive/llprimitive.h b/indra/llprimitive/llprimitive.h index c138c2ac2b0552037e7ee1380db052d7f9856245..6fd433c3370a4e54890825c26ad2bd6cf85a45b3 100644 --- a/indra/llprimitive/llprimitive.h +++ b/indra/llprimitive/llprimitive.h @@ -319,7 +319,7 @@ class LLExtendedMeshParams : public LLNetworkData // - Vir struct LLTEContents { - static const U32 MAX_TES = 32; + static const U32 MAX_TES = 45; U8 image_data[MAX_TES*16]; U8 colors[MAX_TES*4]; diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index ab668dc192dfe7dca62c1ad7311e41ebe0d8b555..c41730ebaaacea9d369885fd04380f3821224f93 100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -157,7 +157,7 @@ void ft_close_cb(FT_Stream stream) { } #endif -BOOL LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, S32 components, BOOL is_fallback) +BOOL LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, S32 components, BOOL is_fallback, S32 face_n) { // Don't leak face objects. This is also needed to deal with // changed font file names. @@ -168,40 +168,8 @@ BOOL LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 v } int error; - #ifdef LL_WINDOWS - pFileStream = new llifstream(filename, std::ios::binary); - if (pFileStream->is_open()) - { - std::streampos beg = pFileStream->tellg(); - pFileStream->seekg(0, std::ios::end); - std::streampos end = pFileStream->tellg(); - std::size_t file_size = end - beg; - pFileStream->seekg(0, std::ios::beg); - - pFtStream = new LLFT_Stream(); - pFtStream->base = 0; - pFtStream->pos = 0; - pFtStream->size = file_size; - pFtStream->descriptor.pointer = pFileStream; - pFtStream->read = ft_read_cb; - pFtStream->close = ft_close_cb; - - FT_Open_Args args; - args.flags = FT_OPEN_STREAM; - args.stream = (FT_StreamRec*)pFtStream; - - error = FT_Open_Face(gFTLibrary, - &args, - 0, - &mFTFace); - } - else - { - delete pFileStream; - pFileStream = NULL; - return FALSE; - } + error = ftOpenFace(filename, face_n); #else error = FT_New_Face( gFTLibrary, filename.c_str(), @@ -212,11 +180,7 @@ BOOL LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 v if (error) { #ifdef LL_WINDOWS - pFileStream->close(); - delete pFileStream; - delete pFtStream; - pFileStream = NULL; - pFtStream = NULL; + clearFontStreams(); #endif return FALSE; } @@ -235,11 +199,7 @@ BOOL LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 v // Clean up freetype libs. FT_Done_Face(mFTFace); #ifdef LL_WINDOWS - pFileStream->close(); - delete pFileStream; - delete pFtStream; - pFileStream = NULL; - pFtStream = NULL; + clearFontStreams(); #endif mFTFace = NULL; return FALSE; @@ -285,18 +245,88 @@ BOOL LLFontFreetype::loadFace(const std::string& filename, F32 point_size, F32 v if(mFTFace->style_flags & FT_STYLE_FLAG_BOLD) { mStyle |= LLFontGL::BOLD; - mStyle &= ~LLFontGL::NORMAL; } if(mFTFace->style_flags & FT_STYLE_FLAG_ITALIC) { mStyle |= LLFontGL::ITALIC; - mStyle &= ~LLFontGL::NORMAL; } return TRUE; } +S32 LLFontFreetype::getNumFaces(const std::string& filename) +{ + if (mFTFace) + { + FT_Done_Face(mFTFace); + mFTFace = NULL; + } + + S32 num_faces = 1; + +#ifdef LL_WINDOWS + int error = ftOpenFace(filename, 0); + + if (error) + { + return 0; + } + else + { + num_faces = mFTFace->num_faces; + } + + FT_Done_Face(mFTFace); + clearFontStreams(); + mFTFace = NULL; +#endif + + return num_faces; +} + +#ifdef LL_WINDOWS +S32 LLFontFreetype::ftOpenFace(const std::string& filename, S32 face_n) +{ + S32 error = -1; + pFileStream = new llifstream(filename, std::ios::binary); + if (pFileStream->is_open()) + { + std::streampos beg = pFileStream->tellg(); + pFileStream->seekg(0, std::ios::end); + std::streampos end = pFileStream->tellg(); + std::size_t file_size = end - beg; + pFileStream->seekg(0, std::ios::beg); + + pFtStream = new LLFT_Stream(); + pFtStream->base = 0; + pFtStream->pos = 0; + pFtStream->size = file_size; + pFtStream->descriptor.pointer = pFileStream; + pFtStream->read = ft_read_cb; + pFtStream->close = ft_close_cb; + + FT_Open_Args args; + args.flags = FT_OPEN_STREAM; + args.stream = (FT_StreamRec*)pFtStream; + error = FT_Open_Face(gFTLibrary, &args, face_n, &mFTFace); + } + return error; +} + +void LLFontFreetype::clearFontStreams() +{ + if (pFileStream) + { + pFileStream->close(); + } + delete pFileStream; + delete pFtStream; + pFileStream = NULL; + pFtStream = NULL; +} +#endif + void LLFontFreetype::setFallbackFonts(const font_vector_t &font) { mFallbackFonts = font; diff --git a/indra/llrender/llfontfreetype.h b/indra/llrender/llfontfreetype.h index aadebf5e70b665c37b61d1e8f82735e15a4c0c45..1afe84e770f6c289708cc6bbff9d007971cf9da1 100644 --- a/indra/llrender/llfontfreetype.h +++ b/indra/llrender/llfontfreetype.h @@ -84,7 +84,14 @@ class LLFontFreetype : public LLRefCount, public LLTrace::MemTrackable<LLFontFre // is_fallback should be true for fallback fonts that aren't used // to render directly (Unicode backup, primarily) - BOOL loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, S32 components, BOOL is_fallback); + BOOL loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, S32 components, BOOL is_fallback, S32 face_n = 0); + + S32 getNumFaces(const std::string& filename); + +#ifdef LL_WINDOWS + S32 ftOpenFace(const std::string& filename, S32 face_n); + void clearFontStreams(); +#endif typedef std::vector<LLPointer<LLFontFreetype> > font_vector_t; diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 8cd18c5fa1987cd4a1b364a076f901e6221348a3..86a4c35e6dec1ef309c370bdc2b0a40fb7dff272 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -89,14 +89,24 @@ void LLFontGL::destroyGL() mFontFreetype->destroyGL(); } -BOOL LLFontGL::loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, S32 components, BOOL is_fallback) +BOOL LLFontGL::loadFace(const std::string& filename, F32 point_size, F32 vert_dpi, F32 horz_dpi, S32 components, BOOL is_fallback, S32 face_n) { if(mFontFreetype == reinterpret_cast<LLFontFreetype*>(NULL)) { mFontFreetype = new LLFontFreetype; } - return mFontFreetype->loadFace(filename, point_size, vert_dpi, horz_dpi, components, is_fallback); + return mFontFreetype->loadFace(filename, point_size, vert_dpi, horz_dpi, components, is_fallback, face_n); +} + +S32 LLFontGL::getNumFaces(const std::string& filename) +{ + if (mFontFreetype == reinterpret_cast<LLFontFreetype*>(NULL)) + { + mFontFreetype = new LLFontFreetype; + } + + return mFontFreetype->getNumFaces(filename); } static LLTrace::BlockTimerStatHandle FTM_RENDER_FONTS("Fonts"); @@ -860,10 +870,6 @@ void LLFontGL::destroyAllGL() U8 LLFontGL::getStyleFromString(const std::string &style) { S32 ret = 0; - if (style.find("NORMAL") != style.npos) - { - ret |= NORMAL; - } if (style.find("BOLD") != style.npos) { ret |= BOLD; @@ -883,7 +889,7 @@ U8 LLFontGL::getStyleFromString(const std::string &style) std::string LLFontGL::getStringFromStyle(U8 style) { std::string style_string; - if (style & NORMAL) + if (style == NORMAL) { style_string += "|NORMAL"; } diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h index 7d0e53f60f17830f973bdb5395886e379c288eb6..10891faed9c1318b918b1beb6bb6d2c64f741c8f 100644 --- a/indra/llrender/llfontgl.h +++ b/indra/llrender/llfontgl.h @@ -87,7 +87,9 @@ class LLFontGL void destroyGL(); - BOOL loadFace(const std::string& filename, F32 point_size, const F32 vert_dpi, const F32 horz_dpi, const S32 components, BOOL is_fallback); + BOOL loadFace(const std::string& filename, F32 point_size, const F32 vert_dpi, const F32 horz_dpi, const S32 components, BOOL is_fallback, S32 face_n = 0); + + S32 getNumFaces(const std::string& filename); S32 render(const LLWString &text, S32 begin_offset, const LLRect& rect, diff --git a/indra/llrender/llfontregistry.cpp b/indra/llrender/llfontregistry.cpp index 3c829596ce5f2a0a50c3fe390dd1d18d10ff4710..dbe71e2882ed177e82f3f1f44368c97c751ac483 100644 --- a/indra/llrender/llfontregistry.cpp +++ b/indra/llrender/llfontregistry.cpp @@ -44,6 +44,8 @@ using std::map; bool font_desc_init_from_xml(LLXMLNodePtr node, LLFontDescriptor& desc); bool init_from_xml(LLFontRegistry* registry, LLXMLNodePtr node); +const std::string MACOSX_FONT_PATH_LIBRARY = "/Library/Fonts/"; + LLFontDescriptor::LLFontDescriptor(): mStyle(0) { @@ -60,6 +62,16 @@ LLFontDescriptor::LLFontDescriptor(const std::string& name, { } +LLFontDescriptor::LLFontDescriptor(const std::string& name, + const std::string& size, + const U8 style, + const string_vec_t& file_names, + const string_vec_t& ft_collection_listections) : + LLFontDescriptor(name, size, style, file_names) +{ + mFontCollectionsList = ft_collection_listections; +} + LLFontDescriptor::LLFontDescriptor(const std::string& name, const std::string& size, const U8 style): @@ -162,7 +174,7 @@ LLFontDescriptor LLFontDescriptor::normalize() const if (removeSubString(new_name,"Italic")) new_style |= LLFontGL::ITALIC; - return LLFontDescriptor(new_name,new_size,new_style,getFileNames()); + return LLFontDescriptor(new_name,new_size,new_style,getFileNames(),getFontCollectionsList()); } LLFontRegistry::LLFontRegistry(bool create_gl_textures) @@ -213,6 +225,7 @@ bool LLFontRegistry::parseFontInfo(const std::string& xml_filename) success = success || init_succ; } } + //if (success) // dump(); @@ -260,6 +273,16 @@ bool font_desc_init_from_xml(LLXMLNodePtr node, LLFontDescriptor& desc) { std::string font_file_name = child->getTextContents(); desc.getFileNames().push_back(font_file_name); + + if (child->hasAttribute("load_collection")) + { + BOOL col = FALSE; + child->getAttributeBOOL("load_collection", col); + if (col) + { + desc.getFontCollectionsList().push_back(font_file_name); + } + } } else if (child->hasName("os")) { @@ -306,8 +329,15 @@ bool init_from_xml(LLFontRegistry* registry, LLXMLNodePtr node) match_file_names.insert(match_file_names.begin(), desc.getFileNames().begin(), desc.getFileNames().end()); + + string_vec_t collections_list = match_desc->getFontCollectionsList(); + collections_list.insert(collections_list.begin(), + desc.getFontCollectionsList().begin(), + desc.getFontCollectionsList().end()); + LLFontDescriptor new_desc = *match_desc; new_desc.getFileNames() = match_file_names; + new_desc.getFontCollectionsList() = collections_list; registry->mFontMap.erase(*match_desc); registry->mFontMap[new_desc] = NULL; } @@ -393,6 +423,7 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc) // Build list of font names to look for. // Files specified for this font come first, followed by those from the default descriptor. string_vec_t file_names = match_desc->getFileNames(); + string_vec_t ft_collection_list = match_desc->getFontCollectionsList(); string_vec_t default_file_names; LLFontDescriptor default_desc("default",s_template_string,0); const LLFontDescriptor *match_default_desc = getMatchingFontDesc(default_desc); @@ -401,6 +432,9 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc) file_names.insert(file_names.end(), match_default_desc->getFileNames().begin(), match_default_desc->getFileNames().end()); + ft_collection_list.insert(ft_collection_list.end(), + match_default_desc->getFontCollectionsList().begin(), + match_default_desc->getFontCollectionsList().end()); } // Add ultimate fallback list - generated dynamically on linux, @@ -433,39 +467,62 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc) file_name_it != file_names.end(); ++file_name_it) { - LLFontGL *fontp = new LLFontGL; - std::string font_path = local_path + *file_name_it; + LLFontGL *fontp = NULL; + string_vec_t font_paths; + font_paths.push_back(local_path + *file_name_it); + font_paths.push_back(sys_path + *file_name_it); +#if LL_DARWIN + font_paths.push_back(MACOSX_FONT_PATH_LIBRARY + *file_name_it); +#endif + + bool is_ft_collection = (std::find(ft_collection_list.begin(), ft_collection_list.end(), *file_name_it) != ft_collection_list.end()); // *HACK: Fallback fonts don't render, so we can use that to suppress // creation of OpenGL textures for test apps. JC BOOL is_fallback = !is_first_found || !mCreateGLTextures; F32 extra_scale = (is_fallback)?fallback_scale:1.0; - if (!fontp->loadFace(font_path, extra_scale * point_size, - LLFontGL::sVertDPI, LLFontGL::sHorizDPI, 2, is_fallback)) + F32 point_size_scale = extra_scale * point_size; + bool is_font_loaded = false; + for(string_vec_t::iterator font_paths_it = font_paths.begin(); + font_paths_it != font_paths.end(); + ++font_paths_it) { - font_path = sys_path + *file_name_it; - - if (!fontp->loadFace(font_path, extra_scale * point_size, - LLFontGL::sVertDPI, LLFontGL::sHorizDPI, 2, is_fallback)) + fontp = new LLFontGL; + S32 num_faces = is_ft_collection ? fontp->getNumFaces(*font_paths_it) : 1; + for (S32 i = 0; i < num_faces; i++) { - LL_INFOS_ONCE("LLFontRegistry") << "Couldn't load font " << *file_name_it << " from path " << local_path << LL_ENDL; - delete fontp; - fontp = NULL; + if (fontp == NULL) + { + fontp = new LLFontGL; + } + if (fontp->loadFace(*font_paths_it, point_size_scale, + LLFontGL::sVertDPI, LLFontGL::sHorizDPI, 2, is_fallback, i)) + { + is_font_loaded = true; + if (is_first_found) + { + result = fontp; + is_first_found = false; + } + else + { + fontlist.push_back(fontp->mFontFreetype); + delete fontp; + fontp = NULL; + } + } + else + { + delete fontp; + fontp = NULL; + } } + if (is_font_loaded) break; } - - if(fontp) + if(!is_font_loaded) { - if (is_first_found) - { - result = fontp; - is_first_found = false; - } - else - { - fontlist.push_back(fontp->mFontFreetype); - delete fontp; - fontp = NULL; - } + LL_INFOS_ONCE("LLFontRegistry") << "Couldn't load font " << *file_name_it << LL_ENDL; + delete fontp; + fontp = NULL; } } diff --git a/indra/llrender/llfontregistry.h b/indra/llrender/llfontregistry.h index 177eb6c8a5db548907bd3f2c94d0fa9808e644ff..e30c81c63018593ed561b6e9b51f40d9c31e9af8 100644 --- a/indra/llrender/llfontregistry.h +++ b/indra/llrender/llfontregistry.h @@ -40,6 +40,7 @@ class LLFontDescriptor LLFontDescriptor(); LLFontDescriptor(const std::string& name, const std::string& size, const U8 style); LLFontDescriptor(const std::string& name, const std::string& size, const U8 style, const string_vec_t& file_names); + LLFontDescriptor(const std::string& name, const std::string& size, const U8 style, const string_vec_t& file_names, const string_vec_t& font_collections); LLFontDescriptor normalize() const; bool operator<(const LLFontDescriptor& b) const; @@ -52,6 +53,8 @@ class LLFontDescriptor void setSize(const std::string& size) { mSize = size; } const std::vector<std::string>& getFileNames() const { return mFileNames; } std::vector<std::string>& getFileNames() { return mFileNames; } + const std::vector<std::string>& getFontCollectionsList() const { return mFontCollectionsList; } + std::vector<std::string>& getFontCollectionsList() { return mFontCollectionsList; } const U8 getStyle() const { return mStyle; } void setStyle(U8 style) { mStyle = style; } @@ -59,6 +62,7 @@ class LLFontDescriptor std::string mName; std::string mSize; string_vec_t mFileNames; + string_vec_t mFontCollectionsList; U8 mStyle; }; diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index 8054eb36199cdf57ebc8bafea46b1c026911b00a..e44f57fa9f4cacb61e29821bb96e0426a9655b35 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -200,6 +200,7 @@ set(llui_HEADER_FILES llresizehandle.h llresmgr.h llrngwriter.h + llsearchablecontrol.h llsearcheditor.h llscrollbar.h llscrollcontainer.h diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index 510a2537b9db02703411619c860fd651934aae58..6b7a8a8b860021a83a474a34944bb4aebf0ca257 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -769,6 +769,10 @@ void LLButton::draw() } } + // Highlight if needed + if( ll::ui::SearchableControl::getHighlighted() ) + label_color = ll::ui::SearchableControl::getHighlightColor(); + // Unselected label assignments LLWString label = getCurrentLabel(); diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h index 7b4719866d55b3a1c2bc3f0a7145f0cd95b1558c..7629ed1fea8d01865ef8a8abbc564252b8551fa0 100644 --- a/indra/llui/llbutton.h +++ b/indra/llui/llbutton.h @@ -62,6 +62,7 @@ class LLUICtrlFactory; class LLButton : public LLUICtrl, public LLBadgeOwner +, public ll::ui::SearchableControl { public: struct Params @@ -380,6 +381,12 @@ class LLButton LLFlashTimer * mFlashingTimer; bool mForceFlashing; // Stick flashing color even if button is pressed bool mHandleRightMouse; + +protected: + virtual std::string _getSearchText() const + { + return getLabelUnselected() + getToolTip(); + } }; // Build time optimization, generate once in .cpp file diff --git a/indra/llui/llcheckboxctrl.h b/indra/llui/llcheckboxctrl.h index 5ce45b21351ce3f929a84e9e6a3f3d271a95a8d6..07ae9c3b18670301bd3934193ad183fd8f9c4312 100644 --- a/indra/llui/llcheckboxctrl.h +++ b/indra/llui/llcheckboxctrl.h @@ -47,6 +47,7 @@ class LLViewBorder; class LLCheckBoxCtrl : public LLUICtrl +, public ll::ui::SearchableControl { public: struct Params @@ -92,6 +93,8 @@ class LLCheckBoxCtrl // LLCheckBoxCtrl interface virtual BOOL toggle() { return mButton->toggleState(); } // returns new state + void setBtnFocus() { mButton->setFocus(TRUE); } + void setEnabledColor( const LLColor4 &color ) { mTextEnabledColor = color; } void setDisabledColor( const LLColor4 &color ) { mTextDisabledColor = color; } @@ -106,6 +109,18 @@ class LLCheckBoxCtrl virtual BOOL isDirty() const; // Returns TRUE if the user has modified this control. virtual void resetDirty(); // Clear dirty state +protected: + virtual std::string _getSearchText() const + { + return getLabel() + getToolTip(); + } + + virtual void onSetHighlight() const // When highlight, really do highlight the label + { + if( mLabel ) + mLabel->ll::ui::SearchableControl::setHighlighted( ll::ui::SearchableControl::getHighlighted() ); + } + protected: // note: value is stored in toggle state of button LLButton* mButton; diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp index 00a933a0bba841e913f434ed8b07cf040ba5259e..b2ad38bddfb8e278112e0aaa2798eb763b29660e 100644 --- a/indra/llui/llcombobox.cpp +++ b/indra/llui/llcombobox.cpp @@ -243,7 +243,14 @@ LLScrollListItem* LLComboBox::add(const std::string& name, EAddPosition pos, BOO item->setEnabled(enabled); if (!mAllowTextEntry && mLabel.empty()) { - selectFirstItem(); + if (mControlVariable) + { + setValue(mControlVariable->getValue()); // selects the appropriate item + } + else + { + selectFirstItem(); + } } return item; } @@ -255,7 +262,14 @@ LLScrollListItem* LLComboBox::add(const std::string& name, const LLUUID& id, EAd item->setEnabled(enabled); if (!mAllowTextEntry && mLabel.empty()) { - selectFirstItem(); + if (mControlVariable) + { + setValue(mControlVariable->getValue()); // selects the appropriate item + } + else + { + selectFirstItem(); + } } return item; } @@ -268,7 +282,14 @@ LLScrollListItem* LLComboBox::add(const std::string& name, void* userdata, EAddP item->setUserdata( userdata ); if (!mAllowTextEntry && mLabel.empty()) { - selectFirstItem(); + if (mControlVariable) + { + setValue(mControlVariable->getValue()); // selects the appropriate item + } + else + { + selectFirstItem(); + } } return item; } @@ -280,7 +301,14 @@ LLScrollListItem* LLComboBox::add(const std::string& name, LLSD value, EAddPosit item->setEnabled(enabled); if (!mAllowTextEntry && mLabel.empty()) { - selectFirstItem(); + if (mControlVariable) + { + setValue(mControlVariable->getValue()); // selects the appropriate item + } + else + { + selectFirstItem(); + } } return item; } diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp index 69246a2f57cb28a8d3c6f26de3d63e6891c627d3..955e7089f464d5b9ef43eab2dfcc9d58cb5e87d8 100644 --- a/indra/llui/lllayoutstack.cpp +++ b/indra/llui/lllayoutstack.cpp @@ -251,8 +251,14 @@ void LLLayoutStack::draw() // always clip to stack itself LLLocalClipRect clip(getLocalRect()); - BOOST_FOREACH(LLLayoutPanel* panelp, mPanels) + for (LLLayoutPanel* panelp : mPanels) { + if ((!panelp->getVisible() || panelp->mCollapsed) + && (panelp->mVisibleAmt < 0.001f || !mAnimate)) + { + // essentially invisible + continue; + } // clip to layout rectangle, not bounding rectangle LLRect clip_rect = panelp->getRect(); // scale clipping rectangle by visible amount @@ -510,7 +516,6 @@ LLLayoutPanel* LLLayoutStack::findEmbeddedPanel(LLPanel* panelp) const { if (!panelp) return NULL; - e_panel_list_t::const_iterator panel_it; BOOST_FOREACH(LLLayoutPanel* p, mPanels) { if (p == panelp) diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index cfab6b7fc89af33e616c5719236944dbecf64e81..ff8bf3031900bd5b646b4f2bfb9b68f1291b307c 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -499,6 +499,13 @@ void LLLineEditor::setCursorToEnd() deselect(); } +void LLLineEditor::resetScrollPosition() +{ + mScrollHPos = 0; + // make sure cursor says in visible range + setCursor(getCursor()); +} + BOOL LLLineEditor::canDeselect() const { return hasSelection(); diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 287837a15c1db6326e2096807b1b4eb88cead74b..f775d53e63d7bde62b66b8a530b5ceed949696a9 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -208,6 +208,9 @@ class LLLineEditor void setCursor( S32 pos ); void setCursorToEnd(); + // set scroll to earliest position it can reasonable set + void resetScrollPosition(); + // Selects characters 'start' to 'end'. void setSelection(S32 start, S32 end); virtual void getSelectionRange(S32 *position, S32 *length) const; diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 0d42f726fab238ee68867b3c747d4c762a9396ae..92543b952e8f7cfbaccb002595a3e1bb10ee2640 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -504,6 +504,10 @@ void LLMenuItemGL::draw( void ) color = mDisabledColor.get(); } + // Highlight if needed + if( ll::ui::SearchableControl::getHighlighted() ) + color = ll::ui::SearchableControl::getHighlightColor(); + // Draw the text on top. if (mBriefItem) { diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index 69f7d2151348951a5fce0e8cabb0d5a132f86ae1..78f688642ea5d0a57b746b21811abe7c1a11b7ca 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -48,7 +48,7 @@ extern S32 MENU_BAR_WIDTH; // The LLMenuItemGL represents a single menu item in a menu. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLMenuItemGL : public LLUICtrl +class LLMenuItemGL: public LLUICtrl, public ll::ui::SearchableControl { public: struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> @@ -175,7 +175,12 @@ class LLMenuItemGL : public LLUICtrl // This function appends the character string representation of // the current accelerator key and mask to the provided string. void appendAcceleratorString( std::string& st ) const; - + + virtual std::string _getSearchText() const + { + return mLabel.getString(); + } + protected: KEY mAcceleratorKey; MASK mAcceleratorMask; diff --git a/indra/llui/llsearchablecontrol.h b/indra/llui/llsearchablecontrol.h new file mode 100644 index 0000000000000000000000000000000000000000..f7f1ffa0a5fd67fa50cc49d10604887ab6656d65 --- /dev/null +++ b/indra/llui/llsearchablecontrol.h @@ -0,0 +1,71 @@ +/** +* @file llsearchablecontrol.h +* +* $LicenseInfo:firstyear=2019&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2019, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +* $/LicenseInfo$ +*/ + +#ifndef LL_SEARCHABLE_CONTROL_H +#define LL_SEARCHABLE_CONTROL_H + +#include "lluicolortable.h" +#include "lluicolor.h" + +namespace ll +{ + namespace ui + { + class SearchableControl + { + mutable bool mIsHighlighed; + public: + SearchableControl() + : mIsHighlighed( false ) + { } + virtual ~SearchableControl() + { } + + LLColor4 getHighlightColor( ) const + { + static LLUIColor highlight_color = LLUIColorTable::instance().getColor("SearchableControlHighlightColor", LLColor4::red); + return highlight_color.get(); + } + + void setHighlighted( bool aVal ) const + { + mIsHighlighed = aVal; + onSetHighlight( ); + } + bool getHighlighted( ) const + { return mIsHighlighed; } + + std::string getSearchText() const + { return _getSearchText(); } + protected: + virtual std::string _getSearchText() const = 0; + virtual void onSetHighlight( ) const + { } + }; + } +} + + +#endif diff --git a/indra/llui/llsliderctrl.h b/indra/llui/llsliderctrl.h index 67cca9ef04efc701fbde13bcd692d0f8330938dd..2bb8668b90a2afba5bf6ef0ed138e542211da5f3 100644 --- a/indra/llui/llsliderctrl.h +++ b/indra/llui/llsliderctrl.h @@ -35,7 +35,7 @@ #include "lllineeditor.h" -class LLSliderCtrl : public LLF32UICtrl +class LLSliderCtrl: public LLF32UICtrl, public ll::ui::SearchableControl { public: struct Params : public LLInitParam::Block<Params, LLF32UICtrl::Params> @@ -131,6 +131,19 @@ class LLSliderCtrl : public LLF32UICtrl static void onEditorGainFocus(LLFocusableElement* caller, void *userdata); static void onEditorChangeFocus(LLUICtrl* caller, S32 direction, void *userdata); +protected: + virtual std::string _getSearchText() const + { + std::string strLabel; + if( mLabelBox ) + strLabel = mLabelBox->getLabel(); + return strLabel + getToolTip(); + } + virtual void onSetHighlight() const // When highlight, really do highlight the label + { + if( mLabelBox ) + mLabelBox->ll::ui::SearchableControl::setHighlighted( ll::ui::SearchableControl::getHighlighted() ); + } private: void updateText(); void reportInvalidData(); diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp index f6831c6d5ec52624829e23fd47223354bb958158..ce3fc29d32721a4b147a7d67548b9dc0280f908d 100644 --- a/indra/llui/llspinctrl.cpp +++ b/indra/llui/llspinctrl.cpp @@ -290,6 +290,7 @@ void LLSpinCtrl::forceSetValue(const LLSD& value ) LLF32UICtrl::setValue(value); updateEditor(); + mEditor->resetScrollPosition(); } } @@ -355,7 +356,9 @@ void LLSpinCtrl::onEditorCommit( const LLSD& data ) if( success ) { - updateEditor(); + // We commited and clamped value + // try to display as much as possible + mEditor->resetScrollPosition(); } else { @@ -475,6 +478,7 @@ BOOL LLSpinCtrl::handleKeyHere(KEY key, MASK mask) // text editors don't support revert normally (due to user confusion) // but not allowing revert on a spinner seems dangerous updateEditor(); + mEditor->resetScrollPosition(); mEditor->setFocus(FALSE); return TRUE; } diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index 1b2f09cff597b466dcdf8626d8e23dbb15cbd92f..6521b883f8e30222eee3e56577fef081d5267eec 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -76,7 +76,8 @@ class LLTabTuple mButton(b), mOldState(FALSE), mPlaceholderText(placeholder), - mPadding(0) + mPadding(0), + mVisible(true) {} LLTabContainer* mTabContainer; @@ -85,6 +86,8 @@ class LLTabTuple BOOL mOldState; LLTextBox* mPlaceholderText; S32 mPadding; + + mutable bool mVisible; }; //---------------------------------------------------------------------------- @@ -398,7 +401,10 @@ void LLTabContainer::draw() { break; } - target_pixel_scroll += (*iter)->mButton->getRect().getWidth(); + + if( (*iter)->mVisible ) + target_pixel_scroll += (*iter)->mButton->getRect().getWidth(); + cur_scroll_pos--; } @@ -467,6 +473,12 @@ void LLTabContainer::draw() { LLTabTuple* tuple = *iter; + if( !tuple->mVisible ) + { + tuple->mButton->setVisible( false ); + continue; + } + tuple->mButton->translate( left ? left - tuple->mButton->getRect().mLeft : 0, top ? top - tuple->mButton->getRect().mTop : 0 ); if (top) top -= BTN_HEIGHT + tabcntrv_pad; @@ -724,11 +736,11 @@ BOOL LLTabContainer::handleToolTip( S32 x, S32 y, MASK mask) { for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter) { - LLTabTuple* tuple = *iter; - tuple->mButton->setVisible( TRUE ); - S32 local_x = x - tuple->mButton->getRect().mLeft; - S32 local_y = y - tuple->mButton->getRect().mBottom; - handled = tuple->mButton->handleToolTip( local_x, local_y, mask); + LLButton* tab_button = (*iter)->mButton; + if (!tab_button->getVisible()) continue; + S32 local_x = x - tab_button->getRect().mLeft; + S32 local_y = y - tab_button->getRect().mBottom; + handled = tab_button->handleToolTip(local_x, local_y, mask); if( handled ) { break; @@ -1505,7 +1517,7 @@ BOOL LLTabContainer::setTab(S32 which) } BOOL is_visible = FALSE; - if (selected_tuple->mButton->getEnabled()) + if( selected_tuple->mButton->getEnabled() && selected_tuple->mVisible ) { setCurrentPanelIndex(which); @@ -2121,3 +2133,35 @@ S32 LLTabContainer::getTotalTabWidth() const { return mTotalTabWidth; } + +void LLTabContainer::setTabVisibility( LLPanel const *aPanel, bool aVisible ) +{ + for( tuple_list_t::const_iterator itr = mTabList.begin(); itr != mTabList.end(); ++itr ) + { + LLTabTuple const *pTT = *itr; + if( pTT->mTabPanel == aPanel ) + { + pTT->mVisible = aVisible; + break; + } + } + + bool foundTab( false ); + for( tuple_list_t::const_iterator itr = mTabList.begin(); itr != mTabList.end(); ++itr ) + { + LLTabTuple const *pTT = *itr; + if( pTT->mVisible ) + { + this->selectTab( itr - mTabList.begin() ); + foundTab = true; + break; + } + } + + if( foundTab ) + this->setVisible( TRUE ); + else + this->setVisible( FALSE ); + + updateMaxScrollPos(); +} diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h index 4a5f08f5d3c6e5e7a7c7f9e44d5f464ad1097f4b..6bf963313c922784e04c86634c71739d7fa7d6ae 100644 --- a/indra/llui/lltabcontainer.h +++ b/indra/llui/lltabcontainer.h @@ -216,6 +216,8 @@ class LLTabContainer : public LLPanel S32 getMinTabWidth() const { return mMinTabWidth; } S32 getMaxTabWidth() const { return mMaxTabWidth; } + void setTabVisibility( LLPanel const *aPanel, bool ); + void startDragAndDropDelayTimer() { mDragAndDropDelayTimer.start(); } void onTabBtn( const LLSD& data, LLPanel* panel ); diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index c570285856d62511ed58cb02e4a6377f644e60fa..a23741b6dd6d17f600579bce9f34285e98ea3c3c 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1222,6 +1222,17 @@ void LLTextBase::draw() gl_rect_2d(text_rect, bg_color % alpha, TRUE); } + // Draw highlighted if needed + if( ll::ui::SearchableControl::getHighlighted() ) + { + LLColor4 bg_color = ll::ui::SearchableControl::getHighlightColor(); + LLRect bg_rect = mVisibleTextRect; + if( mScroller ) + bg_rect.intersectWith( text_rect ); + + gl_rect_2d( text_rect, bg_color, TRUE ); + } + bool should_clip = mClip || mScroller != NULL; { LLLocalClipRect clip(text_rect, should_clip); diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 5fdde445ef55a50f755e1aa1a03e61e893b40a1a..9831c35858f5253d81f8f8a2f5695a575d868cbf 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -275,7 +275,8 @@ typedef LLPointer<LLTextSegment> LLTextSegmentPtr; class LLTextBase : public LLUICtrl, protected LLEditMenuHandler, - public LLSpellCheckMenuHandler + public LLSpellCheckMenuHandler, + public ll::ui::SearchableControl { public: friend class LLTextSegment; @@ -617,6 +618,11 @@ class LLTextBase void appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, bool underline_on_hover_only = false); S32 normalizeUri(std::string& uri); +protected: + virtual std::string _getSearchText() const + { + return mLabel.getString() + getToolTip(); + } protected: // text segmentation and flow diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp index 01fe82e45d555c7a15a9a44047aaa0e2d0a09915..9faff1278de8ffcfb3d1f3786b8d84f7034dbb73 100644 --- a/indra/llui/lltextbox.cpp +++ b/indra/llui/lltextbox.cpp @@ -122,6 +122,7 @@ void LLTextBox::setEnabled(BOOL enabled) LLTextBase::setReadOnly(read_only); updateSegments(); } + LLTextBase::setEnabled(enabled); } void LLTextBox::setText(const LLStringExplicit& text , const LLStyle::Params& input_params ) diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 134b76c720fd6df589af3ae03544ea9113f71e7f..137167db2adcdc75db2cf7a1f5b3f3cc769b5fe5 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -732,14 +732,30 @@ BOOL LLTextEditor::handleRightMouseDown(S32 x, S32 y, MASK mask) { setFocus(TRUE); } + + bool show_menu = false; + // Prefer editor menu if it has selection. See EXT-6806. - if (hasSelection() || !LLTextBase::handleRightMouseDown(x, y, mask)) + if (hasSelection()) { - if(getShowContextMenu()) + S32 click_pos = getDocIndexFromLocalCoord(x, y, FALSE); + if (click_pos > mSelectionStart && click_pos < mSelectionEnd) { - showContextMenu(x, y); + show_menu = true; } } + + // Let segments handle the click, if nothing does, show editor menu + if (!show_menu && !LLTextBase::handleRightMouseDown(x, y, mask)) + { + show_menu = true; + } + + if (show_menu && getShowContextMenu()) + { + showContextMenu(x, y); + } + return TRUE; } diff --git a/indra/llui/lltransutil.cpp b/indra/llui/lltransutil.cpp index 220cee4c90b37eb8e100f31d169bb4d250a1e034..b1534bb5e4a7daa13c3c983f202b4a8cfb166b50 100644 --- a/indra/llui/lltransutil.cpp +++ b/indra/llui/lltransutil.cpp @@ -44,7 +44,7 @@ bool LLTransUtil::parseStrings(const std::string& xml_filename, const std::set<s bool success = LLUICtrlFactory::getLayeredXMLNode(xml_filename, root, LLDir::ALL_SKINS); if (!success) { - LL_ERRS() << "Couldn't load string table " << xml_filename << LL_ENDL; + LL_ERRS() << "Couldn't load string table " << xml_filename << ". Please reinstall viewer from https://secondlife.com/support/downloads/ and contact https://support.secondlife.com if issue persists after reinstall." << LL_ENDL; return false; } diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index e9f8ba020e674c5bfcca6ec74f3b8f5ad64d868e..52190a1473075551889137246b77aba583448583 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -236,14 +236,14 @@ void LLUI::dirtyRect(LLRect rect) //static void LLUI::setMousePositionScreen(S32 x, S32 y) { - S32 screen_x, screen_y; #if defined(LL_DARWIN) - screen_x = ll_round((F32)x); - screen_y = ll_round((F32)y); + S32 screen_x = ll_round(((F32)x * getScaleFactor().mV[VX]) / LLView::getWindow()->getSystemUISize()); + S32 screen_y = ll_round(((F32)y * getScaleFactor().mV[VY]) / LLView::getWindow()->getSystemUISize()); #else - screen_x = ll_round((F32)x * getScaleFactor().mV[VX]); - screen_y = ll_round((F32)y * getScaleFactor().mV[VY]); + S32 screen_x = ll_round((F32)x * getScaleFactor().mV[VX]); + S32 screen_y = ll_round((F32)y * getScaleFactor().mV[VY]); #endif + LLView::getWindow()->setCursorPosition(LLCoordGL(screen_x, screen_y).convert()); } diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h index 550bee5c709e7989e0506a3fa1ee3814faba1435..63baed679345181f875abebe22f2f5419bc5b78b 100644 --- a/indra/llui/lluictrl.h +++ b/indra/llui/lluictrl.h @@ -37,6 +37,7 @@ #include "llinitparam.h" #include "llview.h" #include "llviewmodel.h" // *TODO move dependency to .cpp file +#include "llsearchablecontrol.h" const BOOL TAKE_FOCUS_YES = TRUE; const BOOL TAKE_FOCUS_NO = FALSE; diff --git a/indra/llvfs/lllfsthread.h b/indra/llvfs/lllfsthread.h index cdb5c759465495390d6ed38205a04771286f016a..58f658f7bab32d61ce5feff83615a53dae70254e 100644 --- a/indra/llvfs/lllfsthread.h +++ b/indra/llvfs/lllfsthread.h @@ -32,7 +32,6 @@ #include <map> #include <set> -#include "llapr.h" #include "llpointer.h" #include "llqueuedthread.h" diff --git a/indra/llvfs/llpidlock.cpp b/indra/llvfs/llpidlock.cpp index 6572edead398f250e6ac45308dc9a3ed3ee8399b..f770e93d45aa678e286d55e2ecef24cbcbd10e65 100644 --- a/indra/llvfs/llpidlock.cpp +++ b/indra/llvfs/llpidlock.cpp @@ -27,6 +27,7 @@ #include "linden_common.h" +#include "llapr.h" // thread-related functions #include "llpidlock.h" #include "lldir.h" #include "llsd.h" diff --git a/indra/llvfs/llvfs.cpp b/indra/llvfs/llvfs.cpp index d5bd1834c2da0d5ceb194f3178f0a67b5dbaa2d0..617056d94d224eeea3d89b26b45063fe469811e4 100644 --- a/indra/llvfs/llvfs.cpp +++ b/indra/llvfs/llvfs.cpp @@ -234,7 +234,7 @@ LLVFS::LLVFS(const std::string& index_filename, const std::string& data_filename mDataFP(NULL), mIndexFP(NULL) { - mDataMutex = new LLMutex(0); + mDataMutex = new LLMutex(); S32 i; for (i = 0; i < VFSLOCK_COUNT; i++) diff --git a/indra/llvfs/llvfsthread.h b/indra/llvfs/llvfsthread.h index 95f3c857c6ffb3557418d1bf98aca662938243e3..7814de4a2d91ae9721a31a3803ed40f4c88b8450 100644 --- a/indra/llvfs/llvfsthread.h +++ b/indra/llvfs/llvfsthread.h @@ -32,8 +32,6 @@ #include <map> #include <set> -#include "llapr.h" - #include "llqueuedthread.h" #include "llvfs.h" diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm index 54a4793b2df6bd2512262d3ff979941da0ac7db5..33eed7227af3ca0cd333ad1e9f75368eb5c8f04d 100644 --- a/indra/llwindow/llopenglview-objc.mm +++ b/indra/llwindow/llopenglview-objc.mm @@ -343,6 +343,10 @@ attributedStringInfo getSegments(NSAttributedString *str) - (void) mouseDown:(NSEvent *)theEvent { + NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow]; + mMousePos[0] = mPoint.x; + mMousePos[1] = mPoint.y; + // Apparently people still use this? if ([theEvent modifierFlags] & NSCommandKeyMask && !([theEvent modifierFlags] & NSControlKeyMask) && @@ -380,11 +384,17 @@ attributedStringInfo getSegments(NSAttributedString *str) - (void) rightMouseDown:(NSEvent *)theEvent { + NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow]; + mMousePos[0] = mPoint.x; + mMousePos[1] = mPoint.y; callRightMouseDown(mMousePos, [theEvent modifierFlags]); } - (void) rightMouseUp:(NSEvent *)theEvent { + NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow]; + mMousePos[0] = mPoint.x; + mMousePos[1] = mPoint.y; callRightMouseUp(mMousePos, [theEvent modifierFlags]); } @@ -431,11 +441,17 @@ attributedStringInfo getSegments(NSAttributedString *str) - (void) otherMouseDown:(NSEvent *)theEvent { + NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow]; + mMousePos[0] = mPoint.x; + mMousePos[1] = mPoint.y; callMiddleMouseDown(mMousePos, [theEvent modifierFlags]); } - (void) otherMouseUp:(NSEvent *)theEvent { + NSPoint mPoint = gHiDPISupport ? [self convertPointToBacking:[theEvent locationInWindow]] : [theEvent locationInWindow]; + mMousePos[0] = mPoint.x; + mMousePos[1] = mPoint.y; callMiddleMouseUp(mMousePos, [theEvent modifierFlags]); } diff --git a/indra/llwindow/llwindowmacosx-objc.h b/indra/llwindow/llwindowmacosx-objc.h index 34da99de194c59cbc0de4a0b818884609096b468..99af16110289c47d38327994d0a095fc91b0e80f 100644 --- a/indra/llwindow/llwindowmacosx-objc.h +++ b/indra/llwindow/llwindowmacosx-objc.h @@ -110,9 +110,9 @@ void glSwapBuffers(void* context); CGLContextObj getCGLContextObj(GLViewRef view); unsigned long getVramSize(GLViewRef view); float getDeviceUnitSize(GLViewRef view); -const CGPoint & getContentViewBoundsPosition(NSWindowRef window); -const CGSize & getContentViewBoundsSize(NSWindowRef window); -const CGSize & getDeviceContentViewSize(NSWindowRef window, GLViewRef view); +CGPoint getContentViewBoundsPosition(NSWindowRef window); +CGSize getContentViewBoundsSize(NSWindowRef window); +CGSize getDeviceContentViewSize(NSWindowRef window, GLViewRef view); void getWindowSize(NSWindowRef window, float* size); void setWindowSize(NSWindowRef window, int width, int height); void getCursorPos(NSWindowRef window, float* pos); diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm index c3eb9b8c8a79004d65094ba2457bb146fadea319..f895c1764396b862aa4adf246c3f22e9b7816559 100644 --- a/indra/llwindow/llwindowmacosx-objc.mm +++ b/indra/llwindow/llwindowmacosx-objc.mm @@ -258,17 +258,17 @@ float getDeviceUnitSize(GLViewRef view) return [(LLOpenGLView*)view convertSizeToBacking:NSMakeSize(1, 1)].width; } -const CGPoint & getContentViewBoundsPosition(NSWindowRef window) +CGPoint getContentViewBoundsPosition(NSWindowRef window) { return [[(LLNSWindow*)window contentView] bounds].origin; } -const CGSize & getContentViewBoundsSize(NSWindowRef window) +CGSize getContentViewBoundsSize(NSWindowRef window) { return [[(LLNSWindow*)window contentView] bounds].size; } -const CGSize & getDeviceContentViewSize(NSWindowRef window, GLViewRef view) +CGSize getDeviceContentViewSize(NSWindowRef window, GLViewRef view) { return [(NSOpenGLView*)view convertRectToBacking:[[(LLNSWindow*)window contentView] bounds]].size; } diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index fedea3de08d274286d7e6b3343b11392218e6ced..3554f90be8c558f600888849b26c2f616cfa1321 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -382,7 +382,10 @@ void callWindowFocus() void callWindowUnfocus() { - gWindowImplementation->getCallbacks()->handleFocusLost(gWindowImplementation); + if ( gWindowImplementation && gWindowImplementation->getCallbacks() ) + { + gWindowImplementation->getCallbacks()->handleFocusLost(gWindowImplementation); + } } void callWindowHide() @@ -869,10 +872,11 @@ BOOL LLWindowMacOSX::getSize(LLCoordScreen *size) size->mX = sz.width; size->mY = sz.height; + err = noErr; } else { - LL_ERRS() << "LLWindowMacOSX::getPosition(): no window and not fullscreen!" << LL_ENDL; + LL_ERRS() << "LLWindowMacOSX::getSize(): no window and not fullscreen!" << LL_ENDL; } return (err == noErr); @@ -894,10 +898,13 @@ BOOL LLWindowMacOSX::getSize(LLCoordWindow *size) size->mX = sz.width; size->mY = sz.height; + err = noErr; + + } else { - LL_ERRS() << "LLWindowMacOSX::getPosition(): no window and not fullscreen!" << LL_ENDL; + LL_ERRS() << "LLWindowMacOSX::getSize(): no window and not fullscreen!" << LL_ENDL; } return (err == noErr); diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 504c1589b0c8c641a2acbc807ab58a41f1ddb1eb..e05f5075067a406c941094a337fb8805a12b3d86 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -425,6 +425,9 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks, mKeyVirtualKey = 0; mhDC = NULL; mhRC = NULL; + memset(mCurrentGammaRamp, 0, sizeof(mCurrentGammaRamp)); + memset(mPrevGammaRamp, 0, sizeof(mPrevGammaRamp)); + mCustomGammaSet = FALSE; if (!SystemParametersInfo(SPI_GETMOUSEVANISH, 0, &mMouseVanish, 0)) { @@ -738,6 +741,17 @@ void LLWindowWin32::restore() SetFocus(mWindowHandle); } +bool destroy_window_handler(HWND &hWnd) +{ + __try + { + return DestroyWindow(hWnd); + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + return false; + } +} // close() destroys all OS-specific code associated with a window. // Usually called from LLWindowManager::destroyWindow() @@ -811,7 +825,7 @@ void LLWindowWin32::close() ShowWindow(mWindowHandle, SW_HIDE); // This causes WM_DESTROY to be sent *immediately* - if (!DestroyWindow(mWindowHandle)) + if (!destroy_window_handler(mWindowHandle)) { OSMessageBox(mCallbacks->translateString("MBDestroyWinFailed"), mCallbacks->translateString("MBShutdownErr"), @@ -2989,13 +3003,34 @@ F32 LLWindowWin32::getGamma() BOOL LLWindowWin32::restoreGamma() { - return SetDeviceGammaRamp(mhDC, mPrevGammaRamp); + if (mCustomGammaSet != FALSE) + { + LL_DEBUGS("Window") << "Restoring gamma" << LL_ENDL; + mCustomGammaSet = FALSE; + return SetDeviceGammaRamp(mhDC, mPrevGammaRamp); + } + return TRUE; } BOOL LLWindowWin32::setGamma(const F32 gamma) { mCurrentGamma = gamma; + //Get the previous gamma ramp to restore later. + if (mCustomGammaSet == FALSE) + { + if (!gGLManager.mIsIntel) // skip for Intel GPUs (see SL-11341) + { + LL_DEBUGS("Window") << "Getting the previous gamma ramp to restore later" << LL_ENDL; + if(GetDeviceGammaRamp(mhDC, mPrevGammaRamp) == FALSE) + { + LL_WARNS("Window") << "Failed to get the previous gamma ramp" << LL_ENDL; + return FALSE; + } + } + mCustomGammaSet = TRUE; + } + LL_DEBUGS("Window") << "Setting gamma to " << gamma << LL_ENDL; for ( int i = 0; i < 256; ++i ) @@ -3007,9 +3042,9 @@ BOOL LLWindowWin32::setGamma(const F32 gamma) if ( value > 0xffff ) value = 0xffff; - mCurrentGammaRamp [ 0 * 256 + i ] = - mCurrentGammaRamp [ 1 * 256 + i ] = - mCurrentGammaRamp [ 2 * 256 + i ] = ( WORD )value; + mCurrentGammaRamp[0][i] = + mCurrentGammaRamp[1][i] = + mCurrentGammaRamp[2][i] = (WORD) value; }; return SetDeviceGammaRamp ( mhDC, mCurrentGammaRamp ); @@ -4012,7 +4047,7 @@ void LLWindowWin32::setDPIAwareness() F32 LLWindowWin32::getSystemUISize() { - float scale_value = 0; + F32 scale_value = 1.f; HWND hWnd = (HWND)getPlatformWindow(); HDC hdc = GetDC(hWnd); HMONITOR hMonitor; diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h index d72623a6f40602bcb466ed87a9bcc196d0a2240e..9cd16eb99373b3079b33c225a2db80a593cceec7 100644 --- a/indra/llwindow/llwindowwin32.h +++ b/indra/llwindow/llwindowwin32.h @@ -184,8 +184,9 @@ class LLWindowWin32 : public LLWindow F32 mCurrentGamma; U32 mFSAASamples; - WORD mPrevGammaRamp[256*3]; - WORD mCurrentGammaRamp[256*3]; + WORD mPrevGammaRamp[3][256]; + WORD mCurrentGammaRamp[3][256]; + BOOL mCustomGammaSet; LPWSTR mIconResource; BOOL mMousePositionModified; diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp index 20ab1a7ad396605fbb95ca180d0021668cfdc5d7..ccf4f3ddf50e66928b9a7d42cff491fa71b1bac3 100644 --- a/indra/llxml/llcontrol.cpp +++ b/indra/llxml/llcontrol.cpp @@ -43,6 +43,9 @@ #include "llrect.h" #include "llxmltree.h" #include "llsdserialize.h" +#include "llfile.h" +#include "lltimer.h" +#include "lldir.h" #if LL_RELEASE_WITH_DEBUG_INFO || LL_DEBUG #define CONTROL_ERRS LL_ERRS("ControlErrors") @@ -92,6 +95,17 @@ template <> LLSD convert_from_llsd<LLSD>(const LLSD& sd, eControlType type, cons //this defines the current version of the settings file const S32 CURRENT_VERSION = 101; +// If you define the environment variable LL_SETTINGS_PROFILE to any value this will activate +// the gSavedSettings profiling code. This code tracks the calls to get a saved (debug) setting. +// When the viewer exits the results are written to the log directory to the file specified +// by SETTINGS_PROFILE below. Only settings with an average access rate >= 2/second are output. +typedef std::pair<std::string, U32> settings_pair_t; +typedef std::vector<settings_pair_t> settings_vec_t; +LLSD getCount; +settings_vec_t getCount_v; +F64 start_time = 0; +std::string SETTINGS_PROFILE = "settings_profile.log"; + bool LLControlVariable::llsd_compare(const LLSD& a, const LLSD & b) { bool result = false; @@ -327,6 +341,11 @@ LLSD LLControlVariable::getSaveValue() const LLPointer<LLControlVariable> LLControlGroup::getControl(const std::string& name) { + if (mSettingsProfile) + { + incrCount(name); + } + ctrl_name_table_t::iterator iter = mNameTable.find(name); return iter == mNameTable.end() ? LLPointer<LLControlVariable>() : iter->second; } @@ -349,8 +368,14 @@ const std::string LLControlGroup::mTypeString[TYPE_COUNT] = { "U32" }; LLControlGroup::LLControlGroup(const std::string& name) -: LLInstanceTracker<LLControlGroup, std::string>(name) +: LLInstanceTracker<LLControlGroup, std::string>(name), + mSettingsProfile(false) { + + if (NULL != getenv("LL_SETTINGS_PROFILE")) + { + mSettingsProfile = true; + } } LLControlGroup::~LLControlGroup() @@ -358,8 +383,66 @@ LLControlGroup::~LLControlGroup() cleanup(); } +static bool compareRoutine(settings_pair_t lhs, settings_pair_t rhs) +{ + return lhs.second > rhs.second; +}; + void LLControlGroup::cleanup() { + if(mSettingsProfile && getCount.size() != 0) + { + std::string file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, SETTINGS_PROFILE); + LLFILE* out = LLFile::fopen(file, "w"); /* Flawfinder: ignore */ + if(!out) + { + LL_WARNS("SettingsProfile") << "Error opening " << SETTINGS_PROFILE << LL_ENDL; + } + else + { + F64 end_time = LLTimer::getTotalSeconds(); + U32 total_seconds = (U32)(end_time - start_time); + + std::string msg = llformat("Runtime (seconds): %d\n\n No. accesses Avg. accesses/sec Name\n", total_seconds); + std::ostringstream data_msg; + + data_msg << msg; + size_t data_size = data_msg.str().size(); + if (fwrite(data_msg.str().c_str(), 1, data_size, out) != data_size) + { + LL_WARNS("SettingsProfile") << "Failed to write settings profile header" << LL_ENDL; + } + + for (LLSD::map_const_iterator iter = getCount.beginMap(); iter != getCount.endMap(); ++iter) + { + getCount_v.push_back(settings_pair_t(iter->first, iter->second.asInteger())); + } + sort(getCount_v.begin(), getCount_v.end(), compareRoutine); + + for (settings_vec_t::iterator iter = getCount_v.begin(); iter != getCount_v.end(); ++iter) + { + U32 access_rate = 0; + if (total_seconds != 0) + { + access_rate = iter->second / total_seconds; + } + if (access_rate >= 2) + { + std::ostringstream data_msg; + msg = llformat("%13d %7d %s", iter->second, access_rate, iter->first.c_str()); + data_msg << msg << "\n"; + size_t data_size = data_msg.str().size(); + if (fwrite(data_msg.str().c_str(), 1, data_size, out) != data_size) + { + LL_WARNS("SettingsProfile") << "Failed to write settings profile" << LL_ENDL; + } + } + } + getCount = LLSD::emptyMap(); + fclose(out); + } + } + mNameTable.clear(); } @@ -460,6 +543,15 @@ LLControlVariable* LLControlGroup::declareLLSD(const std::string& name, const LL return declareControl(name, TYPE_LLSD, initial_val, comment, persist); } +void LLControlGroup::incrCount(const std::string& name) +{ + if (0.0 == start_time) + { + start_time = LLTimer::getTotalSeconds(); + } + getCount[name] = getCount[name].asInteger() + 1; +} + BOOL LLControlGroup::getBOOL(const std::string& name) { return (BOOL)get<bool>(name); diff --git a/indra/llxml/llcontrol.h b/indra/llxml/llcontrol.h index 8136a3e88a0e48ea5a9025c6fc8e9b3cf76fc60c..de0d366492fcf475d60695955d8976e975fdd54a 100644 --- a/indra/llxml/llcontrol.h +++ b/indra/llxml/llcontrol.h @@ -301,6 +301,9 @@ class LLControlGroup : public LLInstanceTracker<LLControlGroup, std::string> U32 saveToFile(const std::string& filename, BOOL nondefault_only); U32 loadFromFile(const std::string& filename, bool default_values = false, bool save_values = true); void resetToDefaults(); + void incrCount(const std::string& name); + + bool mSettingsProfile; }; diff --git a/indra/media_plugins/cef/media_plugin_cef.cpp b/indra/media_plugins/cef/media_plugin_cef.cpp index 66b316df90ef72b3f17ff91a8a3c7576b64beac2..eead92fd8e8f6e555d3e123fe5b97e300f2506b6 100644 --- a/indra/media_plugins/cef/media_plugin_cef.cpp +++ b/indra/media_plugins/cef/media_plugin_cef.cpp @@ -498,7 +498,7 @@ void MediaPluginCEF::receiveMessage(const char* message_string) dullahan::dullahan_settings settings; settings.accept_language_list = mHostLanguage; - settings.background_color = 0xff282828; + settings.background_color = 0xffffffff; settings.cache_enabled = true; settings.cache_path = mCachePath; settings.cookie_store_path = mCookiePath; @@ -531,7 +531,12 @@ void MediaPluginCEF::receiveMessage(const char* message_string) } // now we can set page zoom factor - mCEFLib->setPageZoom(message_in.getValueReal("factor")); + F32 factor = (F32)message_in.getValueReal("factor"); +#if LL_DARWIN + //temporary fix for SL-10473: issue with displaying checkboxes on Mojave + factor*=1.001; +#endif + mCEFLib->setPageZoom(factor); // Plugin gets to decide the texture parameters to use. mDepth = 4; @@ -736,6 +741,10 @@ void MediaPluginCEF::receiveMessage(const char* message_string) if (message_name == "set_page_zoom_factor") { F32 factor = (F32)message_in.getValueReal("factor"); +#if LL_DARWIN + //temporary fix for SL-10473: issue with displaying checkboxes on Mojave + factor*=1.001; +#endif mCEFLib->setPageZoom(factor); } if (message_name == "browse_stop") @@ -813,7 +822,8 @@ void MediaPluginCEF::keyEvent(dullahan::EKeyEvent key_event, LLSD native_key_dat // adding new code below in unicodeInput means we don't send ascii chars // here too or we get double key presses on a mac. bool esc_key = (event_umodchars == 27); - if (esc_key || ((unsigned char)event_chars < 0x10 || (unsigned char)event_chars >= 0x7f )) + bool tab_key_up = (event_umodchars == 9) && (key_event == dullahan::EKeyEvent::KE_KEY_UP); + if ((esc_key || ((unsigned char)event_chars < 0x10 || (unsigned char)event_chars >= 0x7f )) && !tab_key_up) { mCEFLib->nativeKeyboardEventOSX(key_event, event_modifiers, event_keycode, event_chars, diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 99f99834f3083fd017265bd5933d5a18a69378b4..46fd0f3fd15cb4724bfd255d280b9d164a49d3f6 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -201,7 +201,6 @@ set(viewer_SOURCE_FILES llexperiencelog.cpp llexternaleditor.cpp llface.cpp - llfacebookconnect.cpp llfasttimerview.cpp llfavoritesbar.cpp llfeaturemanager.cpp @@ -218,6 +217,7 @@ set(viewer_SOURCE_FILES llfloateravatarpicker.cpp llfloateravatarrendersettings.cpp llfloateravatartextures.cpp + llfloaterbanduration.cpp llfloaterbeacons.cpp llfloaterbigpreview.cpp llfloaterbuildoptions.cpp @@ -244,7 +244,6 @@ set(viewer_SOURCE_FILES llfloaterexperiencepicker.cpp llfloaterexperienceprofile.cpp llfloaterexperiences.cpp - llfloaterfacebook.cpp llfloaterflickr.cpp llfloaterfonttest.cpp llfloatergesture.cpp @@ -275,6 +274,7 @@ set(viewer_SOURCE_FILES llfloatermemleak.cpp llfloatermodelpreview.cpp llfloatermodeluploadbase.cpp + llfloatermyscripts.cpp llfloaternamedesc.cpp llfloaternotificationsconsole.cpp llfloaternotificationstabbed.cpp @@ -542,6 +542,7 @@ set(viewer_SOURCE_FILES llscrollingpanelparam.cpp llscrollingpanelparambase.cpp llsculptidsize.cpp + llsearchableui.cpp llsearchcombobox.cpp llsearchhistory.cpp llsecapi.cpp @@ -825,7 +826,6 @@ set(viewer_HEADER_FILES llexperiencelog.h llexternaleditor.h llface.h - llfacebookconnect.h llfasttimerview.h llfavoritesbar.h llfeaturemanager.h @@ -842,6 +842,7 @@ set(viewer_HEADER_FILES llfloateravatarpicker.h llfloateravatarrendersettings.h llfloateravatartextures.h + llfloaterbanduration.h llfloaterbeacons.h llfloaterbigpreview.h llfloaterbuildoptions.h @@ -868,7 +869,6 @@ set(viewer_HEADER_FILES llfloaterexperiencepicker.h llfloaterexperienceprofile.h llfloaterexperiences.h - llfloaterfacebook.h llfloaterflickr.h llfloaterfonttest.h llfloatergesture.h @@ -902,6 +902,7 @@ set(viewer_HEADER_FILES llfloatermemleak.h llfloatermodelpreview.h llfloatermodeluploadbase.h + llfloatermyscripts.h llfloaternamedesc.h llfloaternotificationsconsole.h llfloaternotificationstabbed.h @@ -1158,6 +1159,7 @@ set(viewer_HEADER_FILES llscrollingpanelparam.h llscrollingpanelparambase.h llsculptidsize.h + llsearchableui.h llsearchcombobox.h llsearchhistory.h llsecapi.h @@ -1618,6 +1620,7 @@ endif (WINDOWS) # from within the IDE. set(viewer_XUI_FILES skins/default/colors.xml + skins/default/default_languages.xml skins/default/textures/textures.xml ) file(GLOB DEFAULT_XUI_FILE_GLOB_LIST @@ -1872,6 +1875,15 @@ if (WINDOWS) windows-crash-logger ) + # sets the 'working directory' for debugging from visual studio. + # Condition for version can be moved to requirements once build agents will be updated (see TOOL-3865) + if (NOT UNATTENDED) + set_property( + TARGET ${VIEWER_BINARY_NAME} + PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + ) + endif (NOT UNATTENDED) + if (PACKAGE) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2 @@ -2103,7 +2115,7 @@ if (DARWIN) set(MACOSX_BUNDLE_BUNDLE_NAME "SecondLife") set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}") set(MACOSX_BUNDLE_BUNDLE_VERSION "${VIEWER_SHORT_VERSION}${VIEWER_MACOSX_PHASE}${VIEWER_REVISION}") - set(MACOSX_BUNDLE_COPYRIGHT "Copyright © Linden Research, Inc. 2007") + set(MACOSX_BUNDLE_COPYRIGHT "Copyright © Linden Research, Inc. 2018") set(MACOSX_BUNDLE_NSMAIN_NIB_FILE "SecondLife.nib") set(MACOSX_BUNDLE_NSPRINCIPAL_CLASS "NSApplication") diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index 5e3254243a3b271c531c00916b750411d9dad34e..91e4a9f2622445cdde5b075e2f7d95e245821b59 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -6.1.2 +6.3.2 diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml index 412d3a53b327fc5dccb9951a033606039a6e1023..cab0c523b2300fd335e77843f59c1259bfea8e98 100644 --- a/indra/newview/app_settings/commands.xml +++ b/indra/newview/app_settings/commands.xml @@ -228,16 +228,6 @@ is_running_function="Floater.IsOpen" is_running_parameters="snapshot" /> - <command name="facebook" - available_in_toybox="true" - icon="Command_Facebook_Icon" - label_ref="Command_Facebook_Label" - tooltip_ref="Command_Facebook_Tooltip" - execute_function="Floater.ToggleOrBringToFront" - execute_parameters="facebook" - is_running_function="Floater.IsOpen" - is_running_parameters="facebook" - /> <command name="flickr" available_in_toybox="true" icon="Command_Flickr_Icon" diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 1173abf18ec06582ddd1ffe328afc7c5952d50f0..49601ae98f6fc992923710d30b31a0ad6934fa17 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -11362,6 +11362,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>MenuSearch</key> + <map> + <key>Comment</key> + <string>Show/hide 'Search menus' field</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>GroupListShowIcons</key> <map> <key>Comment</key> @@ -14090,6 +14101,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>RegionCrossingInterpolationTime</key> + <map> + <key>Comment</key> + <string>How long to extrapolate object motion after crossing regions</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <integer>1</integer> + </map> <key>VertexShaderEnable</key> <map> <key>Comment</key> @@ -16288,6 +16310,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>ResetUIScaleOnFirstRun</key> + <map> + <key>Comment</key> + <string>Resets the UI scale factor on first run due to changed display scaling behavior</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> </map> </llsd> diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index 3d4bd659f19f4eaee9dbc319387c38cc03d39fac..8f4ca6c6337e47bde432c347c251079a8d657a97 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -414,5 +414,16 @@ <key>Value</key> <string>Snapshot</string> </map> + <key>ExperienceSearchMaturity</key> + <map> + <key>Comment</key> + <string>Setting for the user's preferred Max Content rating for Experiences search (Default rating is General)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>2</integer> + </map> </map> </llsd> diff --git a/indra/newview/app_settings/toolbars.xml b/indra/newview/app_settings/toolbars.xml index 36e4eb91fdc1a67d7cb4417dd2b87e58b9f7fa91..eec0d81e8b001a7e5ed3aaa4127b43d00866fa24 100644 --- a/indra/newview/app_settings/toolbars.xml +++ b/indra/newview/app_settings/toolbars.xml @@ -21,7 +21,6 @@ <command name="voice"/> <command name="minimap"/> <command name="snapshot"/> - <command name="facebook"/> </left_toolbar> <right_toolbar button_display_mode="icons_only"> diff --git a/indra/newview/character/aux_base.tga b/indra/newview/character/aux_base.tga new file mode 100644 index 0000000000000000000000000000000000000000..dbcaaaf2b192d7dcc184e46e83c8815a26cd80ea Binary files /dev/null and b/indra/newview/character/aux_base.tga differ diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index df30f46002d072811a8b3e8c46e90df9ed1789d2..2cdd86267ee3b243c7e9e7b6c6b0c55a3bd1f2a6 100644 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -8947,6 +8947,66 @@ <texture local_texture="hair_alpha" /> </layer> + <layer + name="hair_tattoo"> + <texture + local_texture="hair_tattoo" /> + <param + id="1211" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_hair_red" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="255, 0, 0, 255" /> + </param_color> + </param> + + <param + id="1212" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_hair_green" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 255, 0, 255" /> + </param_color> + </param> + + <param + id="1213" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_hair_blue" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 0, 255, 255" /> + </param_color> + </param> + + </layer> + </layer_set> <!-- =========================================================== --> @@ -10024,7 +10084,65 @@ render_pass="bump"> </param> </layer> + <layer + name="head_universal_tattoo"> + <texture + local_texture="head_universal_tattoo" /> + <param + id="1229" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_head_universal_red" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="255, 0, 0, 255" /> + </param_color> + </param> + + <param + id="1230" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_head_universal_green" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 255, 0, 255" /> + </param_color> + </param> + <param + id="1231" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_head_universal_blue" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 0, 255, 255" /> + </param_color> + </param> + + </layer> </layer_set> @@ -10201,7 +10319,65 @@ render_pass="bump"> </param> </layer> + <layer + name="upper_universal_tattoo"> + <texture + local_texture="upper_universal_tattoo" /> + <param + id="1232" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_upper_universal_red" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="255, 0, 0, 255" /> + </param_color> + </param> + + <param + id="1233" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_upper_universal_green" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 255, 0, 255" /> + </param_color> + </param> + + <param + id="1234" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_upper_universal_blue" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 0, 255, 255" /> + </param_color> + </param> + </layer> <layer name="upper_undershirt bump" @@ -11453,7 +11629,65 @@ render_pass="bump"> </param> </layer> + <layer + name="lower_universal_tattoo"> + <texture + local_texture="lower_universal_tattoo" /> + <param + id="1235" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_lower_universal_red" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="255, 0, 0, 255" /> + </param_color> + </param> + + <param + id="1236" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_lower_universal_green" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 255, 0, 255" /> + </param_color> + </param> + + <param + id="1237" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_lower_universal_blue" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + <value + color="0, 0, 255, 255" /> + </param_color> + </param> + + </layer> <layer name="lower_underpants bump" render_pass="bump" @@ -12235,6 +12469,66 @@ render_pass="bump"> <texture local_texture="eyes_alpha" /> </layer> + <layer + name="eyes_tattoo"> + <texture + local_texture="eyes_tattoo" /> + <param + id="924" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_eyes_red" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="255, 0, 0, 255" /> + </param_color> + </param> + + <param + id="925" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_eyes_green" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 255, 0, 255" /> + </param_color> + </param> + + <param + id="926" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_eyes_blue" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 0, 255, 255" /> + </param_color> + </param> + + </layer> + </layer_set> @@ -12395,25 +12689,466 @@ render_pass="bump"> </param> <param - id="862" - group="0" - wearable="skirt" - edit_group="skirt" - edit_group_order="7" - name="Slit Right" - label_min="Open Right" - label_max="Closed Right" + id="862" + group="0" + wearable="skirt" + edit_group="skirt" + edit_group_order="7" + name="Slit Right" + label_min="Open Right" + label_max="Closed Right" + value_min="0" + value_max="1" + value_default="1" + camera_distance="1.3" + camera_elevation="-.5" + camera_angle="-30"> + <param_alpha + tga_file="skirt_slit_right_alpha.tga" + multiply_blend="true" + domain="0" /> + </param> + </layer> + <layer + name="skirt_tattoo"> + <texture + local_texture="skirt_tattoo" /> + <param + id="1208" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_skirt_red" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="255, 0, 0, 255" /> + </param_color> + </param> + + <param + id="1209" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_skirt_green" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 255, 0, 255" /> + </param_color> + </param> + + <param + id="1210" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_skirt_blue" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 0, 255, 255" /> + </param_color> + </param> + + </layer> + + </layer_set> + + <!-- =========================================================== --> + <layer_set + body_region="leftarm" + width="512" + height="512" + clear_alpha="false"> + <layer + name="base" + write_all_channels="true" + fixed_color = "128,128,128,255"> + <texture + tga_file="aux_base.tga" /> + </layer> + + <layer + name="leftarm_tattoo"> + <texture + local_texture="leftarm_tattoo" /> + <param + id="1214" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_leftarm_red" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="255, 0, 0, 255" /> + </param_color> + </param> + + <param + id="1215" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_leftarm_green" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 255, 0, 255" /> + </param_color> + </param> + + <param + id="1216" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_leftarm_blue" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 0, 255, 255" /> + </param_color> + </param> + + </layer> + + </layer_set> + + <!-- =========================================================== --> + <layer_set + body_region="leftleg" + width="512" + height="512" + clear_alpha="false"> + <layer + name="base" + write_all_channels="true" + fixed_color = "128,128,128,255"> + <texture + tga_file="aux_base.tga" /> + </layer> + <layer + name="leftleg_tattoo"> + <texture + local_texture="leftleg_tattoo" /> + <param + id="1217" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_leftleg_red" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="255, 0, 0, 255" /> + </param_color> + </param> + + <param + id="1218" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_leftleg_green" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 255, 0, 255" /> + </param_color> + </param> + + <param + id="1219" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_leftleg_blue" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 0, 255, 255" /> + </param_color> + </param> + + </layer> + + </layer_set> + + <!-- =========================================================== --> + <layer_set + body_region="aux1" + width="512" + height="512" + clear_alpha="false"> + + <layer + name="base" + write_all_channels="true" + fixed_color = "128,128,128,255"> + <texture + tga_file="aux_base.tga" /> + </layer> + + <layer + name="aux1_tattoo"> + <texture + local_texture="aux1_tattoo" /> + <param + id="1220" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_aux1_red" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="255, 0, 0, 255" /> + </param_color> + </param> + + <param + id="1221" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_aux1_green" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 255, 0, 255" /> + </param_color> + </param> + + <param + id="1222" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_aux1_blue" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 0, 255, 255" /> + </param_color> + </param> + + </layer> + + </layer_set> + + <!-- =========================================================== --> + <layer_set + body_region="aux2" + width="512" + height="512" + clear_alpha="false"> + + <layer + name="base" + write_all_channels="true" + fixed_color = "128,128,128,255"> + <texture + tga_file="aux_base.tga" /> + </layer> + + <layer + name="aux2_tattoo"> + <texture + local_texture="aux2_tattoo" /> + <param + id="1223" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_aux2_red" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="255, 0, 0, 255" /> + </param_color> + </param> + + <param + id="1224" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_aux2_green" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 255, 0, 255" /> + </param_color> + </param> + + <param + id="1225" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_aux2_blue" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 0, 255, 255" /> + </param_color> + </param> + + </layer> + + </layer_set> + + <!-- =========================================================== --> + <layer_set + body_region="aux3" + width="512" + height="512" + clear_alpha="false"> + + <layer + name="base" + write_all_channels="true" + fixed_color = "128,128,128,255"> + <texture + tga_file="aux_base.tga" /> + </layer> + + <layer + name="aux3_tattoo"> + <texture + local_texture="aux3_tattoo" /> + <param + id="1226" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_aux3_red" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="255, 0, 0, 255" /> + </param_color> + </param> + + <param + id="1227" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_aux3_green" + value_min="0" + value_max="1" + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 255, 0, 255" /> + </param_color> + </param> + + <param + id="1228" + group="1" + edit_group="colorpicker_driven" + wearable="universal" + name="tattoo_aux3_blue" value_min="0" value_max="1" - value_default="1" - camera_distance="1.3" - camera_elevation="-.5" - camera_angle="-30"> - <param_alpha - tga_file="skirt_slit_right_alpha.tga" - multiply_blend="true" - domain="0" /> + value_default="1"> + <param_color> + <value + color="0, 0, 0, 255" /> + + <value + color="0, 0, 255, 255" /> + </param_color> </param> + </layer> </layer_set> @@ -15934,7 +16669,277 @@ render_pass="bump"> </param_driver> </param> + <param + id="1238" + group="2" + wearable="universal" + edit_group="colorpicker" + name="tattoo_universal_red" + value_min="0" + value_max="1" + value_default="1"> + <param_driver> + <driven + id="1229" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1232" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1235" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1208" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1211" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="924" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1214" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1217" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1220" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1223" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1226" + min1="0" + max1="1" + max2="1" + min2="1" /> + + </param_driver> + </param> + + <param + id="1239" + group="2" + wearable="universal" + edit_group="colorpicker" + name="tattoo_universal_green" + value_min="0" + value_max="1" + value_default="1"> + <param_driver> + <driven + id="1230" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1233" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1236" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1209" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1212" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="925" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1215" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1218" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1221" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1224" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1227" + min1="0" + max1="1" + max2="1" + min2="1" /> + + </param_driver> + </param> + + <param + id="1240" + group="2" + wearable="universal" + edit_group="colorpicker" + name="tattoo_universal_blue" + value_min="0" + value_max="1" + value_default="1"> + <param_driver> + <driven + id="1231" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1234" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1237" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1210" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1213" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="926" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1216" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1219" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1222" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1225" + min1="0" + max1="1" + max2="1" + min2="1" /> + + <driven + id="1228" + min1="0" + max1="1" + max2="1" + min2="1" /> + + </param_driver> + </param> <!-- ==PHYSICS PARAMETERS======================================= --> + <param id="1100" diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index 4f9a1b7804de7925c979ba6f222d1d4d37a64458..8838b6d0be117e982dd66700d65cc47b2157e234 100644 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -346,6 +346,11 @@ Call CheckWillUninstallV2 # Check if Second Life is already installed StrCmp $DO_UNINSTALL_V2 "" PRESERVE_DONE PRESERVE_DONE: +# Viewer had "SLLauncher" for some time and we was seting "IsHostApp" for viewer, make sure to clean it up +DeleteRegValue HKEY_CLASSES_ROOT "Applications\$VIEWER_EXE" "IsHostApp" +DeleteRegValue HKEY_CLASSES_ROOT "Applications\$VIEWER_EXE" "NoStartPage" +ClearErrors + Call RemoveProgFilesOnInst # Remove existing files to prevent certain errors when running the new version of the viewer # This placeholder is replaced by the complete list of all the files in the installer, by viewer_manifest.py @@ -417,7 +422,7 @@ WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info\DefaultIcon" "" '"$INSTDIR\$ # URL param must be last item passed to viewer, it ignores subsequent params to avoid parameter injection attacks. WriteRegExpandStr HKEY_CLASSES_ROOT "x-grid-location-info\shell\open\command" "" '"$INSTDIR\$VIEWER_EXE" -url "%1"' -WriteRegStr HKEY_CLASSES_ROOT "Applications\$VIEWER_EXE" "IsHostApp" "" +WriteRegStr HKEY_CLASSES_ROOT "Applications\$INSTEXE" "IsHostApp" "" ##WriteRegStr HKEY_CLASSES_ROOT "Applications\${VIEWER_EXE}" "NoStartPage" "" # Write out uninstaller @@ -464,7 +469,7 @@ DeleteRegKey SHELL_CONTEXT "${INSTNAME_KEY}" DeleteRegKey SHELL_CONTEXT "${MSCURRVER_KEY}\Uninstall\$INSTNAME" # BUG-2707 Remove entry that disabled SEHOP DeleteRegKey SHELL_CONTEXT "${MSNTCURRVER_KEY}\Image File Execution Options\$VIEWER_EXE" -##DeleteRegKey HKEY_CLASSES_ROOT "Applications\$INSTEXE" +DeleteRegKey HKEY_CLASSES_ROOT "Applications\$INSTEXE" DeleteRegKey HKEY_CLASSES_ROOT "Applications\${VIEWER_EXE}" # Clean up shortcuts @@ -720,9 +725,7 @@ RMDir "$INSTDIR" IfFileExists "$INSTDIR" FOLDERFOUND NOFOLDER FOLDERFOUND: -# Silent uninstall always removes all files (/SD IDYES) - MessageBox MB_YESNO $(DeleteProgramFilesMB) /SD IDYES IDNO NOFOLDER - RMDir /r "$INSTDIR" + MessageBox MB_OK $(DeleteProgramFilesMB) /SD IDOK IDOK NOFOLDER NOFOLDER: diff --git a/indra/newview/installers/windows/lang_de.nsi b/indra/newview/installers/windows/lang_de.nsi index 8bb20476b3e0122d94945b092522d9dd1fbb9f2c..eebcf027a820c5980e8bce847470621d2b5f1ac8 100755 Binary files a/indra/newview/installers/windows/lang_de.nsi and b/indra/newview/installers/windows/lang_de.nsi differ diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index ba250fa4717b41f61a401273a9512df851632fc4..8b2d591da56abef0782938e5e6924bb577e3dcef 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -24,6 +24,7 @@ * $/LicenseInfo$ */ + #include "llviewerprecompiledheaders.h" #include "llagent.h" @@ -742,7 +743,7 @@ BOOL LLAgent::getFlying() const //----------------------------------------------------------------------------- // setFlying() //----------------------------------------------------------------------------- -void LLAgent::setFlying(BOOL fly) +void LLAgent::setFlying(BOOL fly, BOOL fail_sound) { if (isAgentAvatarValid()) { @@ -771,7 +772,10 @@ void LLAgent::setFlying(BOOL fly) // parcel doesn't let you start fly // gods can always fly // and it's OK if you're already flying - make_ui_sound("UISndBadKeystroke"); + if (fail_sound) + { + make_ui_sound("UISndBadKeystroke"); + } return; } if( !was_flying ) diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index b1b39b637e48587fd7eda112b16cf7cb1404d16f..ea6f68c482d82472d57d7c5d71082c00365a525d 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -337,7 +337,7 @@ class LLAgent : public LLOldEvents::LLObservable //-------------------------------------------------------------------- public: BOOL getFlying() const; - void setFlying(BOOL fly); + void setFlying(BOOL fly, BOOL fail_sound = FALSE); static void toggleFlying(); static bool enableFlying(); BOOL canFly(); // Does this parcel allow you to fly? diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 170e4063a1524b22d1eb62d69490194db116526b..15e4de8f6909f4e64d4c61043a595594f9a64d5a 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -1538,6 +1538,12 @@ void LLAgentWearables::createWearable(LLWearableType::EType type, bool wear, con { if (type == LLWearableType::WT_INVALID || type == LLWearableType::WT_NONE) return; + if (type == LLWearableType::WT_UNIVERSAL && !gAgent.getRegion()->bakesOnMeshEnabled()) + { + LL_WARNS("Inventory") << "Can't create WT_UNIVERSAL type " << LL_ENDL; + return; + } + LLViewerWearable* wearable = LLWearableList::instance().createNewWearable(type, gAgentAvatarp); LLAssetType::EType asset_type = wearable->getAssetType(); LLInventoryType::EType inv_type = LLInventoryType::IT_WEARABLE; diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 08daeb0f59d35e60bf137030c6e6882223f62e64..22bcbad7da211e8c054e6bcc17cf12bae798d023 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1865,7 +1865,6 @@ bool LLAppearanceMgr::getCanRemoveOutfit(const LLUUID& outfit_cat_id) LLFindNonRemovableObjects filter_non_removable; LLInventoryModel::cat_array_t cats; LLInventoryModel::item_array_t items; - LLInventoryModel::item_array_t::const_iterator it; gInventory.collectDescendentsIf(outfit_cat_id, cats, items, false, filter_non_removable); if (!cats.empty() || !items.empty()) { diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 1bc21ec4699f726b6d781b98053535b827e3f325..be5611899ae2ab9c42dddaa3ae0279f255e07ef6 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -572,12 +572,12 @@ static void settings_to_globals() LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO"); LLImageGL::sGlobalUseAnisotropic = gSavedSettings.getBOOL("RenderAnisotropic"); LLImageGL::sCompressTextures = gSavedSettings.getBOOL("RenderCompressTextures"); - LLVOVolume::sLODFactor = gSavedSettings.getF32("RenderVolumeLODFactor"); + LLVOVolume::sLODFactor = llclamp(gSavedSettings.getF32("RenderVolumeLODFactor"), 0.01f, MAX_LOD_FACTOR); LLVOVolume::sDistanceFactor = 1.f-LLVOVolume::sLODFactor * 0.1f; LLVolumeImplFlexible::sUpdateFactor = gSavedSettings.getF32("RenderFlexTimeFactor"); LLVOTree::sTreeFactor = gSavedSettings.getF32("RenderTreeLODFactor"); - LLVOAvatar::sLODFactor = gSavedSettings.getF32("RenderAvatarLODFactor"); - LLVOAvatar::sPhysicsLODFactor = gSavedSettings.getF32("RenderAvatarPhysicsLODFactor"); + LLVOAvatar::sLODFactor = llclamp(gSavedSettings.getF32("RenderAvatarLODFactor"), 0.f, MAX_AVATAR_LOD_FACTOR); + LLVOAvatar::sPhysicsLODFactor = llclamp(gSavedSettings.getF32("RenderAvatarPhysicsLODFactor"), 0.f, MAX_AVATAR_LOD_FACTOR); LLVOAvatar::updateImpostorRendering(gSavedSettings.getU32("RenderAvatarMaxNonImpostors")); LLVOAvatar::sVisibleInFirstPerson = gSavedSettings.getBOOL("FirstPersonAvatarVisible"); // clamp auto-open time to some minimum usable value @@ -1167,8 +1167,18 @@ bool LLAppViewer::init() // ForceAddressSize updater.args.add(stringize(gSavedSettings.getU32("ForceAddressSize"))); - // Run the updater. An exception from launching the updater should bother us. +#if LL_WINDOWS && !LL_RELEASE_FOR_DOWNLOAD && !LL_SEND_CRASH_REPORTS + // This is neither a release package, nor crash-reporting enabled test build + // try to run version updater, but don't bother if it fails (file might be missing) + LLLeap *leap_p = LLLeap::create(updater, false); + if (!leap_p) + { + LL_WARNS("LLLeap") << "Failed to run LLLeap" << LL_ENDL; + } +#else + // Run the updater. An exception from launching the updater should bother us. LLLeap::create(updater, true); +#endif // Iterate over --leap command-line options. But this is a bit tricky: if // there's only one, it won't be an array at all. @@ -2168,7 +2178,7 @@ bool LLAppViewer::initThreads() if (LLTrace::BlockTimer::sLog || LLTrace::BlockTimer::sMetricLog) { - LLTrace::BlockTimer::setLogLock(new LLMutex(NULL)); + LLTrace::BlockTimer::setLogLock(new LLMutex()); mFastTimerLogThread = new LLFastTimerLogThread(LLTrace::BlockTimer::sLogName); mFastTimerLogThread->start(); } @@ -2429,9 +2439,9 @@ bool LLAppViewer::initConfiguration() bool set_defaults = true; if(!loadSettingsFromDirectory("Default", set_defaults)) { - std::ostringstream msg; - msg << "Unable to load default settings file. The installation may be corrupted."; - OSMessageBox(msg.str(),LLStringUtil::null,OSMB_OK); + OSMessageBox( + "Unable to load default settings file. The installation may be corrupted.", + LLStringUtil::null,OSMB_OK); return false; } @@ -2552,7 +2562,7 @@ bool LLAppViewer::initConfiguration() if(gSavedSettings.getBOOL("DisableCrashLogger")) { LL_WARNS() << "Crashes will be handled by system, stack trace logs and crash logger are both disabled" << LL_ENDL; - LLAppViewer::instance()->disableCrashlogger(); + disableCrashlogger(); } // Handle initialization from settings. @@ -2569,7 +2579,7 @@ bool LLAppViewer::initConfiguration() LL_INFOS() << msg.str() << LL_ENDL; OSMessageBox( - msg.str().c_str(), + msg.str(), LLStringUtil::null, OSMB_OK); @@ -2679,7 +2689,34 @@ bool LLAppViewer::initConfiguration() ll_init_fail_log(gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "test_failures.log")); } + const LLControlVariable* skinfolder = gSavedSettings.getControl("SkinCurrent"); + if(skinfolder && LLStringUtil::null != skinfolder->getValue().asString()) + { + // Examining "Language" may not suffice -- see LLUI::getLanguage() + // logic. Unfortunately LLUI::getLanguage() doesn't yet do us much + // good because we haven't yet called LLUI::initClass(). + gDirUtilp->setSkinFolder(skinfolder->getValue().asString(), + gSavedSettings.getString("Language")); + } + + if (gSavedSettings.getBOOL("SpellCheck")) + { + std::list<std::string> dict_list; + std::string dict_setting = gSavedSettings.getString("SpellCheckDictionary"); + boost::split(dict_list, dict_setting, boost::is_any_of(std::string(","))); + if (!dict_list.empty()) + { + LLSpellChecker::setUseSpellCheck(dict_list.front()); + dict_list.pop_front(); + LLSpellChecker::instance().setSecondaryDictionaries(dict_list); + } + } + // Handle slurl use. NOTE: Don't let SL-55321 reappear. + // This initial-SLURL logic, up through the call to + // sendURLToOtherInstance(), must precede LLSplashScreen::show() -- + // because if sendURLToOtherInstance() succeeds, we take a fast exit, + // SKIPPING the splash screen and everything else. // *FIX: This init code should be made more robust to prevent // the issue SL-55321 from returning. One thought is to allow @@ -2724,6 +2761,27 @@ bool LLAppViewer::initConfiguration() } } + // NextLoginLocation is set as a side effect of LLStartUp::setStartSLURL() + std::string nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" ); + if ( !nextLoginLocation.empty() ) + { + LL_DEBUGS("AppInit")<<"set start from NextLoginLocation: "<<nextLoginLocation<<LL_ENDL; + LLStartUp::setStartSLURL(LLSLURL(nextLoginLocation)); + } + else if ( ( clp.hasOption("login") || clp.hasOption("autologin")) + && gSavedSettings.getString("CmdLineLoginLocation").empty()) + { + // If automatic login from command line with --login switch + // init StartSLURL location. + std::string start_slurl_setting = gSavedSettings.getString("LoginLocation"); + LL_DEBUGS("AppInit") << "start slurl setting '" << start_slurl_setting << "'" << LL_ENDL; + LLStartUp::setStartSLURL(LLSLURL(start_slurl_setting)); + } + else + { + // the login location will be set by the login panel (see LLPanelLogin) + } + //RN: if we received a URL, hand it off to the existing instance. // don't call anotherInstanceRunning() when doing URL handoff, as // it relies on checking a marker file which will not work when running @@ -2739,30 +2797,6 @@ bool LLAppViewer::initConfiguration() } } - const LLControlVariable* skinfolder = gSavedSettings.getControl("SkinCurrent"); - if(skinfolder && LLStringUtil::null != skinfolder->getValue().asString()) - { - // Examining "Language" may not suffice -- see LLUI::getLanguage() - // logic. Unfortunately LLUI::getLanguage() doesn't yet do us much - // good because we haven't yet called LLUI::initClass(). - gDirUtilp->setSkinFolder(skinfolder->getValue().asString(), - gSavedSettings.getString("Language")); - } - - if (gSavedSettings.getBOOL("SpellCheck")) - { - std::list<std::string> dict_list; - std::string dict_setting = gSavedSettings.getString("SpellCheckDictionary"); - boost::split(dict_list, dict_setting, boost::is_any_of(std::string(","))); - if (!dict_list.empty()) - { - LLSpellChecker::setUseSpellCheck(dict_list.front()); - dict_list.pop_front(); - LLSpellChecker::instance().setSecondaryDictionaries(dict_list); - } - } - - // Display splash screen. Must be after above check for previous // crash as this dialog is always frontmost. std::string splash_msg; @@ -2794,30 +2828,15 @@ bool LLAppViewer::initConfiguration() } LLStringUtil::truncate(gWindowTitle, 255); - //RN: if we received a URL, hand it off to the existing instance. - // don't call anotherInstanceRunning() when doing URL handoff, as - // it relies on checking a marker file which will not work when running - // out of different directories - - if (LLStartUp::getStartSLURL().isValid() && - (gSavedSettings.getBOOL("SLURLPassToOtherInstance"))) - { - if (sendURLToOtherInstance(LLStartUp::getStartSLURL().getSLURLString())) - { - // successfully handed off URL to existing instance, exit - return false; - } - } - // // Check for another instance of the app running + // This happens AFTER LLSplashScreen::show(). That may or may not be + // important. // if (mSecondInstance && !gSavedSettings.getBOOL("AllowMultipleViewers")) { - std::ostringstream msg; - msg << LLTrans::getString("MBAlreadyRunning"); OSMessageBox( - msg.str(), + LLTrans::getString("MBAlreadyRunning"), LLStringUtil::null, OSMB_OK); return false; @@ -2835,27 +2854,6 @@ bool LLAppViewer::initConfiguration() } } - // NextLoginLocation is set from the command line option - std::string nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" ); - if ( !nextLoginLocation.empty() ) - { - LL_DEBUGS("AppInit")<<"set start from NextLoginLocation: "<<nextLoginLocation<<LL_ENDL; - LLStartUp::setStartSLURL(LLSLURL(nextLoginLocation)); - } - else if ( ( clp.hasOption("login") || clp.hasOption("autologin")) - && gSavedSettings.getString("CmdLineLoginLocation").empty()) - { - // If automatic login from command line with --login switch - // init StartSLURL location. - std::string start_slurl_setting = gSavedSettings.getString("LoginLocation"); - LL_DEBUGS("AppInit") << "start slurl setting '" << start_slurl_setting << "'" << LL_ENDL; - LLStartUp::setStartSLURL(LLSLURL(start_slurl_setting)); - } - else - { - // the login location will be set by the login panel (see LLPanelLogin) - } - gLastRunVersion = gSavedSettings.getString("LastRunVersion"); loadColorSettings(); @@ -2879,7 +2877,14 @@ bool LLAppViewer::initConfiguration() // keeps growing, necessitating a method all its own. void LLAppViewer::initStrings() { - LLTransUtil::parseStrings("strings.xml", default_trans_args); + std::string strings_file = "strings.xml"; + std::string strings_path_full = gDirUtilp->findSkinnedFilenameBaseLang(LLDir::XUI, strings_file); + if (strings_path_full.empty() || !LLFile::isfile(strings_path_full)) + { + // initial check to make sure files are there failed + LL_ERRS() << "Viewer failed to find localization and UI files. Please reinstall viewer from https://secondlife.com/support/downloads/ and contact https://support.secondlife.com if issue persists after reinstall." << LL_ENDL; + } + LLTransUtil::parseStrings(strings_file, default_trans_args); LLTransUtil::parseLanguageStrings("language_settings.xml"); // parseStrings() sets up the LLTrans substitution table. Add this one item. @@ -3095,17 +3100,11 @@ LLSD LLAppViewer::getViewerInfo() const } // return a URL to the release notes for this viewer, such as: - // http://wiki.secondlife.com/wiki/Release_Notes/Second Life Beta Viewer/2.1.0.123456 + // https://releasenotes.secondlife.com/viewer/2.1.0.123456.html std::string url = LLTrans::getString("RELEASE_NOTES_BASE_URL"); if (! LLStringUtil::endsWith(url, "/")) url += "/"; - std::string channel = LLVersionInfo::getChannel(); - if (LLStringUtil::endsWith(boost::to_lower_copy(channel), " edu")) // Release Notes url shouldn't include the EDU parameter - { - boost::erase_tail(channel, 4); - } - url += LLURI::escape(channel) + "/"; - url += LLURI::escape(LLVersionInfo::getVersion()); + url += LLURI::escape(LLVersionInfo::getVersion()) + ".html"; info["VIEWER_RELEASE_NOTES_URL"] = url; @@ -3170,6 +3169,10 @@ LLSD LLAppViewer::getViewerInfo() const substitution["datetime"] = (S32)(gVFS ? gVFS->creationTime() : 0); info["VFS_TIME"] = LLTrans::getString("AboutTime", substitution); +#if LL_DARWIN + info["HIDPI"] = gHiDPISupport; +#endif + // Libraries info["J2C_VERSION"] = LLImageJ2C::getEngineInfo(); @@ -3312,6 +3315,9 @@ std::string LLAppViewer::getViewerInfoString(bool default_string) const } support << "\n" << LLTrans::getString("AboutOGL", args, default_string); support << "\n\n" << LLTrans::getString("AboutSettings", args, default_string); +#if LL_DARWIN + support << "\n" << LLTrans::getString("AboutOSXHiDPI", args, default_string); +#endif support << "\n\n" << LLTrans::getString("AboutLibs", args, default_string); if (info.has("COMPILER")) { @@ -5462,7 +5468,8 @@ void LLAppViewer::resumeMainloopTimeout(const std::string& state, F32 secs) { if(secs < 0.0f) { - secs = gSavedSettings.getF32("MainloopTimeoutDefault"); + static LLCachedControl<F32> mainloop_timeout(gSavedSettings, "MainloopTimeoutDefault", 60); + secs = mainloop_timeout; } mMainloopTimeout->setTimeout(secs); @@ -5489,7 +5496,8 @@ void LLAppViewer::pingMainloopTimeout(const std::string& state, F32 secs) { if(secs < 0.0f) { - secs = gSavedSettings.getF32("MainloopTimeoutDefault"); + static LLCachedControl<F32> mainloop_timeout(gSavedSettings, "MainloopTimeoutDefault", 60); + secs = mainloop_timeout; } mMainloopTimeout->setTimeout(secs); diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index e607b4a994faa4273e39b3f446e0dab58f21aafa..788fe6a19b0eacfce2a004f3a2a26083fa320936 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -43,6 +43,7 @@ #define LL_LLAPPVIEWER_H #include "llallocator.h" +#include "llapr.h" #include "llcontrol.h" #include "llsys.h" // for LLOSInfo #include "lltimer.h" diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 81f04744f8781e92ca36cd2099ea357aab119ced..3111540a13192c79a94b87a6f2c1a6fd32d0d109 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -411,68 +411,6 @@ std::string LLAppViewerMacOSX::generateSerialNumber() return serial_md5; } -static AudioDeviceID get_default_audio_output_device(void) -{ - AudioDeviceID device = 0; - 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; -} - -//virtual -void LLAppViewerMacOSX::setMasterSystemAudioMute(bool new_mute) -{ - AudioDeviceID device = get_default_audio_output_device(); - - if(device != 0) - { - UInt32 mute = new_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; - } - } -} - -//virtual -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); - 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; - } - } - - return (mute != 0); -} - void handleUrl(const char* url_utf8) { if (url_utf8 && gViewerAppPtr) diff --git a/indra/newview/llappviewermacosx.h b/indra/newview/llappviewermacosx.h index ebb41a495cee21f9df2d160079a920fea27d92c7..d5a80864be3dc0a5f0a599788f632a655806f1fc 100644 --- a/indra/newview/llappviewermacosx.h +++ b/indra/newview/llappviewermacosx.h @@ -42,10 +42,6 @@ class LLAppViewerMacOSX : public LLAppViewer // virtual bool init(); // Override to do application initialization - // mute/unmute the system's master audio - virtual void setMasterSystemAudioMute(bool mute); - virtual bool getMasterSystemAudioMute(); - protected: virtual bool restoreErrorTrap(); virtual void initCrashReporting(bool reportFreeze); diff --git a/indra/newview/llautoreplace.cpp b/indra/newview/llautoreplace.cpp index dd9354fe3a8b7d8f31a62ef83024a2fab509fafd..0516520c563af4da1166c797fbba13251b6c1d02 100644 --- a/indra/newview/llautoreplace.cpp +++ b/indra/newview/llautoreplace.cpp @@ -68,8 +68,8 @@ void LLAutoReplace::autoreplaceCallback(S32& replacement_start, S32& replacement word_start--; // walk word_start back to the beginning of the word } LL_DEBUGS("AutoReplace") << "word_start: " << word_start << " word_end: " << word_end << LL_ENDL; - std::string str_text = std::string(input_text.begin(), input_text.end()); - std::string last_word = str_text.substr(word_start, word_end - word_start + 1); + LLWString old_string = input_text.substr(word_start, word_end - word_start + 1); + std::string last_word = wstring_to_utf8str(old_string); std::string replacement_word(mSettings.replaceWord(last_word)); if (replacement_word != last_word) @@ -79,9 +79,8 @@ void LLAutoReplace::autoreplaceCallback(S32& replacement_start, S32& replacement { // return the replacement string replacement_start = word_start; - replacement_length = last_word.length(); + replacement_length = word_end - word_start + 1; replacement_string = utf8str_to_wstring(replacement_word); - LLWString old_string = utf8str_to_wstring(last_word); S32 size_change = replacement_string.size() - old_string.size(); cursor_pos += size_change; } diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index af3fac91bc07d17da393ad3010a7c9431c37f3ca..396b69ae3a22bd10ba7a473934e3594eeb5a37a9 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -119,6 +119,7 @@ BOOL LLAvatarListItem::postBuild() mIconPermissionEditTheirs->setVisible(false); mSpeakingIndicator = getChild<LLOutputMonitorCtrl>("speaking_indicator"); + mSpeakingIndicator->setChannelState(LLOutputMonitorCtrl::UNDEFINED_CHANNEL); mInfoBtn = getChild<LLButton>("info_btn"); mProfileBtn = getChild<LLButton>("profile_btn"); diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index eddc87efcd503199e8ed167841bc5898112aec7f..4f42868f1a19a61df788ad4ab0cbc28bb7159dd3 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -29,6 +29,7 @@ #include "llchatitemscontainerctrl.h" #include "lltextbox.h" +#include "llavataractions.h" #include "llavatariconctrl.h" #include "llcommandhandler.h" #include "llfloaterreg.h" @@ -204,6 +205,7 @@ void LLFloaterIMNearbyChatToastPanel::init(LLSD& notification) mMsgText = getChild<LLChatMsgBox>("msg_text", false); mMsgText->setContentTrusted(false); + mMsgText->setIsFriendCallback(LLAvatarActions::isFriend); mMsgText->setText(std::string("")); diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp index 307f93e28c921c584b38c8fa8f01fcaa874b9c56..b47e0930a3cea0b56e7d03ea379803750b17c287 100644 --- a/indra/newview/llcofwearables.cpp +++ b/indra/newview/llcofwearables.cpp @@ -42,6 +42,7 @@ #include "llwearableitemslist.h" #include "llpaneloutfitedit.h" #include "lltrans.h" +#include "llvoavatarself.h" static LLPanelInjector<LLCOFWearables> t_cof_wearables("cof_wearables"); @@ -330,7 +331,7 @@ void LLCOFWearables::setAttachmentsTitle() { if (mAttachmentsTab) { - U32 free_slots = MAX_AGENT_ATTACHMENTS - mAttachments->size(); + U32 free_slots = gAgentAvatarp->getMaxAttachments() - mAttachments->size(); LLStringUtil::format_map_t args_attachments; args_attachments["[COUNT]"] = llformat ("%d", free_slots); diff --git a/indra/newview/llcommandlineparser.cpp b/indra/newview/llcommandlineparser.cpp index 90a5483dc98f2686d779b4851ed51d5945681f53..fe14bc081f2f6cbcf4473c4b75ac276b583018ae 100644 --- a/indra/newview/llcommandlineparser.cpp +++ b/indra/newview/llcommandlineparser.cpp @@ -374,12 +374,40 @@ bool LLCommandLineParser::parseCommandLine(int argc, char **argv) bool LLCommandLineParser::parseCommandLineString(const std::string& str) { + std::string cmd_line_string(""); + if (!str.empty()) + { + bool add_last_c = true; + S32 last_c_pos = str.size() - 1; //don't get out of bounds on pos+1, last char will be processed separately + for (S32 pos = 0; pos < last_c_pos; ++pos) + { + cmd_line_string.append(&str[pos], 1); + if (str[pos] == '\\') + { + cmd_line_string.append("\\", 1); + if (str[pos + 1] == '\\') + { + ++pos; + add_last_c = (pos != last_c_pos); + } + } + } + if (add_last_c) + { + cmd_line_string.append(&str[last_c_pos], 1); + if (str[last_c_pos] == '\\') + { + cmd_line_string.append("\\", 1); + } + } + } + // Split the string content into tokens - const char* escape_chars = "\\"; - const char* separator_chars = "\r\n "; - const char* quote_chars = "\"'"; + const char* escape_chars = "\\"; + const char* separator_chars = "\r\n "; + const char* quote_chars = "\"'"; boost::escaped_list_separator<char> sep(escape_chars, separator_chars, quote_chars); - boost::tokenizer< boost::escaped_list_separator<char> > tok(str, sep); + boost::tokenizer< boost::escaped_list_separator<char> > tok(cmd_line_string, sep); std::vector<std::string> tokens; // std::copy(tok.begin(), tok.end(), std::back_inserter(tokens)); for(boost::tokenizer< boost::escaped_list_separator<char> >::iterator i = tok.begin(); diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp index d3fd5813a03ab6b04f2df321fbd77e544dccd6c7..d24dac385f245a570aa937af8558c3c0d890f175 100644 --- a/indra/newview/llcontrolavatar.cpp +++ b/indra/newview/llcontrolavatar.cpp @@ -60,6 +60,8 @@ LLControlAvatar::LLControlAvatar(const LLUUID& id, const LLPCode pcode, LLViewer // virtual LLControlAvatar::~LLControlAvatar() { + // Should already have been unlinked before destruction + llassert(!mRootVolp); } // virtual @@ -564,27 +566,49 @@ LLViewerObject* LLControlAvatar::lineSegmentIntersectRiggedAttachments(const LLV LLVector4a* normal, LLVector4a* tangent) { - LLViewerObject* hit = NULL; + if (!mRootVolp) + { + return NULL; + } - if (lineSegmentBoundingBox(start, end)) - { - LLVector4a local_end = end; - LLVector4a local_intersection; + LLViewerObject* hit = NULL; - if (mRootVolp && - mRootVolp->lineSegmentIntersect(start, local_end, face, pick_transparent, pick_rigged, face_hit, &local_intersection, tex_coord, normal, tangent)) + if (lineSegmentBoundingBox(start, end)) + { + LLVector4a local_end = end; + LLVector4a local_intersection; + if (mRootVolp->lineSegmentIntersect(start, local_end, face, pick_transparent, pick_rigged, face_hit, &local_intersection, tex_coord, normal, tangent)) { local_end = local_intersection; if (intersection) { *intersection = local_intersection; } - hit = mRootVolp; } - } - - return hit; + else + { + std::vector<LLVOVolume*> volumes; + getAnimatedVolumes(volumes); + + for (std::vector<LLVOVolume*>::iterator vol_it = volumes.begin(); vol_it != volumes.end(); ++vol_it) + { + LLVOVolume *volp = *vol_it; + if (mRootVolp != volp && volp->lineSegmentIntersect(start, local_end, face, pick_transparent, pick_rigged, face_hit, &local_intersection, tex_coord, normal, tangent)) + { + local_end = local_intersection; + if (intersection) + { + *intersection = local_intersection; + } + hit = volp; + break; + } + } + } + } + + return hit; } // virtual diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp index ebbbf23deee3961e1a9e15b664630e918ca38084..c2581368899430d3bb335e42126fc37f0399d1eb 100644 --- a/indra/newview/llconversationmodel.cpp +++ b/indra/newview/llconversationmodel.cpp @@ -351,7 +351,7 @@ void LLConversationItemSession::setParticipantIsMuted(const LLUUID& participant_ LLConversationItemParticipant* participant = findParticipant(participant_id); if (participant) { - participant->muteVoice(is_muted); + participant->moderateVoice(is_muted); } } @@ -498,6 +498,7 @@ void LLConversationItemSession::onAvatarNameCache(const LLAvatarName& av_name) LLConversationItemParticipant::LLConversationItemParticipant(std::string display_name, const LLUUID& uuid, LLFolderViewModelInterface& root_view_model) : LLConversationItem(display_name,uuid,root_view_model), + mIsModeratorMuted(false), mIsModerator(false), mDisplayModeratorLabel(false), mDistToAgent(-1.0) @@ -508,6 +509,7 @@ LLConversationItemParticipant::LLConversationItemParticipant(std::string display LLConversationItemParticipant::LLConversationItemParticipant(const LLUUID& uuid, LLFolderViewModelInterface& root_view_model) : LLConversationItem(uuid,root_view_model), + mIsModeratorMuted(false), mIsModerator(false), mDisplayModeratorLabel(false), mDistToAgent(-1.0) @@ -597,25 +599,7 @@ void LLConversationItemParticipant::setDisplayModeratorRole(bool displayRole) bool LLConversationItemParticipant::isVoiceMuted() { - return LLMuteList::getInstance()->isMuted(mUUID, LLMute::flagVoiceChat); -} - -void LLConversationItemParticipant::muteVoice(bool mute_voice) -{ - LLAvatarName av_name; - LLAvatarNameCache::get(mUUID, &av_name); - LLMuteList * mute_listp = LLMuteList::getInstance(); - bool voice_already_muted = mute_listp->isMuted(mUUID, av_name.getUserName()); - - LLMute mute(mUUID, av_name.getUserName(), LLMute::AGENT); - if (voice_already_muted && !mute_voice) - { - mute_listp->remove(mute); - } - else if (!voice_already_muted && mute_voice) - { - mute_listp->add(mute); - } + return mIsModeratorMuted || LLMuteList::getInstance()->isMuted(mUUID, LLMute::flagVoiceChat); } // diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h index 3868bafae4db0daecae40aeaa5f231860572ad70..80385fad5f6a9ad4c6ad251ce8004bcaf86a2c97 100644 --- a/indra/newview/llconversationmodel.h +++ b/indra/newview/llconversationmodel.h @@ -194,8 +194,9 @@ class LLConversationItemParticipant : public LLConversationItem virtual const std::string& getDisplayName() const { return mDisplayName; } bool isVoiceMuted(); + bool isModeratorMuted() { return mIsModeratorMuted; } bool isModerator() const { return mIsModerator; } - void muteVoice(bool mute_voice); + void moderateVoice(bool mute_voice) { mIsModeratorMuted = mute_voice; } void setIsModerator(bool is_moderator) { mIsModerator = is_moderator; mNeedsRefresh = true; } void setTimeNow() { mLastActiveTime = LLFrameTimer::getElapsedSeconds(); mNeedsRefresh = true; } void setDistance(F64 dist) { mDistToAgent = dist; mNeedsRefresh = true; } @@ -216,6 +217,7 @@ class LLConversationItemParticipant : public LLConversationItem void onAvatarNameCache(const LLAvatarName& av_name); // callback used by fetchAvatarName void updateName(const LLAvatarName& av_name); + bool mIsModeratorMuted; // default is false bool mIsModerator; // default is false bool mDisplayModeratorLabel; // default is false std::string mDisplayName; diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index 15a8aacd3733475576b4130d3e8e9cf7525d0a3a..0075b621008ac03909d77dd3b30315b8090ecafd 100644 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -234,6 +234,8 @@ void LLConversationViewSession::draw() // Draw children if root folder, or any other folder that is open. Do not draw children when animating to closed state or you get rendering overlap. bool draw_children = getRoot() == static_cast<LLFolderViewFolder*>(this) || isOpen(); + // Todo/fix this: arrange hides children 'out of bonds', session 'slowly' adjusts container size, unhides children + // this process repeats until children fit for (folders_t::iterator iter = mFolders.begin(); iter != mFolders.end();) { @@ -254,9 +256,6 @@ void LLConversationViewSession::draw() updateLabelRotation(); drawOpenFolderArrow(default_params, sFgColor); } - - refresh(); - LLView::draw(); } @@ -441,28 +440,23 @@ void LLConversationViewSession::refresh() LLSpeakingIndicatorManager::updateSpeakingIndicators(); // we should show indicator for specified voice session only if this is current channel. EXT-5562. - if (!mIsInActiveVoiceChannel) + if (mSpeakingIndicator) { - if (mSpeakingIndicator) - { - mSpeakingIndicator->setVisible(false); - } - LLConversationViewParticipant* participant = NULL; - items_t::const_iterator iter; - for (iter = getItemsBegin(); iter != getItemsEnd(); iter++) + mSpeakingIndicator->setIsActiveChannel(mIsInActiveVoiceChannel); + mSpeakingIndicator->setShowParticipantsSpeaking(mIsInActiveVoiceChannel); + } + + LLConversationViewParticipant* participant = NULL; + items_t::const_iterator iter; + for (iter = getItemsBegin(); iter != getItemsEnd(); iter++) + { + participant = dynamic_cast<LLConversationViewParticipant*>(*iter); + if (participant) { - participant = dynamic_cast<LLConversationViewParticipant*>(*iter); - if (participant) - { - participant->hideSpeakingIndicator(); - } + participant->allowSpeakingIndicator(mIsInActiveVoiceChannel); } } - - if (mSpeakingIndicator) - { - mSpeakingIndicator->setShowParticipantsSpeaking(mIsInActiveVoiceChannel); - } + requestArrange(); // Do the regular upstream refresh LLFolderViewFolder::refresh(); @@ -474,8 +468,13 @@ void LLConversationViewSession::onCurrentVoiceSessionChanged(const LLUUID& sessi if (vmi) { + bool old_value = mIsInActiveVoiceChannel; mIsInActiveVoiceChannel = vmi->getUUID() == session_id; mCallIconLayoutPanel->setVisible(mIsInActiveVoiceChannel); + if (old_value != mIsInActiveVoiceChannel) + { + refresh(); + } } } @@ -568,6 +567,7 @@ void LLConversationViewParticipant::draw() F32 text_left = (F32)getLabelXPos(); LLColor4 color; + LLLocalSpeakerMgr *speakerMgr = LLLocalSpeakerMgr::getInstance(); if (speakerMgr && speakerMgr->isSpeakerToBeRemoved(mUUID)) @@ -579,9 +579,14 @@ void LLConversationViewParticipant::draw() color = mIsSelected ? sHighlightFgColor : sFgColor; } + LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(getViewModelItem()); + if (participant_model) + { + mSpeakingIndicator->setIsModeratorMuted(participant_model->isModeratorMuted()); + } + drawHighlight(show_context, mIsSelected, sHighlightBgColor, sFlashBgColor, sFocusOutlineColor, sMouseOverColor); drawLabel(font, text_left, y, color, right_x); - refresh(); LLView::draw(); } @@ -605,16 +610,39 @@ S32 LLConversationViewParticipant::arrange(S32* width, S32* height) return arranged; } +// virtual +void LLConversationViewParticipant::refresh() +{ + // Refresh the participant view from its model data + LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(getViewModelItem()); + participant_model->resetRefresh(); + + // *TODO: We should also do something with vmi->isModerator() to echo that state in the UI somewhat + mSpeakingIndicator->setIsModeratorMuted(participant_model->isModeratorMuted()); + + // Do the regular upstream refresh + LLFolderViewItem::refresh(); +} + void LLConversationViewParticipant::addToFolder(LLFolderViewFolder* folder) { // Add the item to the folder (conversation) LLFolderViewItem::addToFolder(folder); // Retrieve the folder (conversation) UUID, which is also the speaker session UUID - LLConversationItem* vmi = getParentFolder() ? dynamic_cast<LLConversationItem*>(getParentFolder()->getViewModelItem()) : NULL; - if (vmi) + LLFolderViewFolder *prnt = getParentFolder(); + if (prnt) { - addToSession(vmi->getUUID()); + LLConversationItem* vmi = dynamic_cast<LLConversationItem*>(prnt->getViewModelItem()); + if (vmi) + { + addToSession(vmi->getUUID()); + } + LLConversationViewSession* session = dynamic_cast<LLConversationViewSession*>(prnt); + if (session) + { + allowSpeakingIndicator(session->isInActiveVoiceChannel()); + } } } @@ -744,9 +772,9 @@ LLView* LLConversationViewParticipant::getItemChildView(EAvatarListItemChildInde return child_view; } -void LLConversationViewParticipant::hideSpeakingIndicator() +void LLConversationViewParticipant::allowSpeakingIndicator(bool val) { - mSpeakingIndicator->setVisible(false); + mSpeakingIndicator->setIsActiveChannel(val); } // EOF diff --git a/indra/newview/llconversationview.h b/indra/newview/llconversationview.h index 5a74974302678e5978472ad74a926b00743a83ee..420c250dfe7f8be5093611654eed960288f322f3 100644 --- a/indra/newview/llconversationview.h +++ b/indra/newview/llconversationview.h @@ -90,6 +90,7 @@ class LLConversationViewSession : public LLFolderViewFolder void setHighlightState(bool hihglight_state); LLFloater* getSessionFloater(); + bool isInActiveVoiceChannel() { return mIsInActiveVoiceChannel; } private: @@ -136,6 +137,7 @@ class LLConversationViewParticipant : public LLFolderViewItem virtual ~LLConversationViewParticipant( void ); bool hasSameValue(const LLUUID& uuid) { return (uuid == mUUID); } + /*virtual*/ void refresh(); void addToFolder(LLFolderViewFolder* folder); void addToSession(const LLUUID& session_id); @@ -144,7 +146,7 @@ class LLConversationViewParticipant : public LLFolderViewItem /*virtual*/ S32 getLabelXPos(); /*virtual*/ BOOL handleMouseDown( S32 x, S32 y, MASK mask ); - void hideSpeakingIndicator(); + void allowSpeakingIndicator(bool val); protected: friend class LLUICtrlFactory; diff --git a/indra/newview/lldirpicker.cpp b/indra/newview/lldirpicker.cpp index 5443afe60c1c5418e8ec0fa295c5a726591b8eba..b8e6e81ee6695c92f5239d0d1d3f1c118226e652 100644 --- a/indra/newview/lldirpicker.cpp +++ b/indra/newview/lldirpicker.cpp @@ -315,7 +315,7 @@ void LLDirPickerThread::run() //static void LLDirPickerThread::initClass() { - sMutex = new LLMutex(NULL); + sMutex = new LLMutex(); } //static diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp index fa9a0712fa4185cdbb2f0164ae77cec76370e008..8ef0dd28650329cc0431d32a8a8ab9babc5bd956 100644 --- a/indra/newview/lldynamictexture.cpp +++ b/indra/newview/lldynamictexture.cpp @@ -125,7 +125,7 @@ BOOL LLViewerDynamicTexture::render() //----------------------------------------------------------------------------- void LLViewerDynamicTexture::preRender(BOOL clear_depth) { - //only images up to 512x512 are supported + //only images up to 1024*1024 are supported llassert(mFullHeight <= 512); llassert(mFullWidth <= 512); diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index b2da5bb9f8fe86ec5eaa01f52eacbee5c5d72a23..912bde9986bf2363d3fc1a1f0f465aa7ae883eae 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -608,15 +608,10 @@ void renderFace(LLDrawable* drawable, LLFace *face) LLVOVolume* vobj = drawable->getVOVolume(); if (vobj) { - LLVertexBuffer::unbind(); - gGL.pushMatrix(); - gGL.multMatrix((F32*)vobj->getRelativeXform().mMatrix); - LLVolume* volume = NULL; if (drawable->isState(LLDrawable::RIGGED)) { - vobj->updateRiggedVolume(); volume = vobj->getRiggedVolume(); } else @@ -629,44 +624,11 @@ void renderFace(LLDrawable* drawable, LLFace *face) const LLVolumeFace& vol_face = volume->getVolumeFace(face->getTEOffset()); LLVertexBuffer::drawElements(LLRender::TRIANGLES, vol_face.mPositions, NULL, vol_face.mNumIndices, vol_face.mIndices); } - - gGL.popMatrix(); } } -void LLFace::renderOneWireframe(const LLColor4 &color, F32 fogCfx, bool wireframe_selection, bool bRenderHiddenSelections) +void LLFace::renderOneWireframe(const LLColor4 &color, F32 fogCfx, bool wireframe_selection, bool bRenderHiddenSelections, bool shader) { - //Need to because crash on ATI 3800 (and similar cards) MAINT-5018 - LLGLDisable multisample(LLPipeline::RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0); - - LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr; - - if (shader) - { - gDebugProgram.bind(); - } - - gGL.matrixMode(LLRender::MM_MODELVIEW); - gGL.pushMatrix(); - - BOOL is_hud_object = mVObjp->isHUDAttachment(); - - if (mDrawablep->isActive()) - { - gGL.loadMatrix(gGLModelView); - gGL.multMatrix((F32*)mVObjp->getRenderMatrix().mMatrix); - } - else if (!is_hud_object) - { - gGL.loadIdentity(); - gGL.multMatrix(gGLModelView); - LLVector3 trans = mVObjp->getRegion()->getOriginAgent(); - gGL.translatef(trans.mV[0], trans.mV[1], trans.mV[2]); - } - - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - - if (bRenderHiddenSelections) { gGL.blendFunc(LLRender::BF_SOURCE_COLOR, LLRender::BF_ONE); @@ -715,15 +677,6 @@ void LLFace::renderOneWireframe(const LLColor4 &color, F32 fogCfx, bool wirefram glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); renderFace(mDrawablep, this); } - - glLineWidth(1.f); - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - gGL.popMatrix(); - - if (shader) - { - shader->bind(); - } } /* removed in lieu of raycast uv detection @@ -1106,7 +1059,7 @@ void LLFace::getPlanarProjectedParams(LLQuaternion* face_rot, LLVector3* face_po // Returns the necessary texture transform to align this face's TE to align_to's TE bool LLFace::calcAlignedPlanarTE(const LLFace* align_to, LLVector2* res_st_offset, - LLVector2* res_st_scale, F32* res_st_rot) const + LLVector2* res_st_scale, F32* res_st_rot, LLRender::eTexIndex map) const { if (!align_to) { @@ -1119,6 +1072,43 @@ bool LLFace::calcAlignedPlanarTE(const LLFace* align_to, LLVector2* res_st_offs return false; } + F32 map_rot = 0.f, map_scaleS = 0.f, map_scaleT = 0.f, map_offsS = 0.f, map_offsT = 0.f; + + switch (map) + { + case LLRender::DIFFUSE_MAP: + map_rot = orig_tep->getRotation(); + map_scaleS = orig_tep->mScaleS; + map_scaleT = orig_tep->mScaleT; + map_offsS = orig_tep->mOffsetS; + map_offsT = orig_tep->mOffsetT; + break; + case LLRender::NORMAL_MAP: + if (orig_tep->getMaterialParams()->getNormalID().isNull()) + { + return false; + } + map_rot = orig_tep->getMaterialParams()->getNormalRotation(); + map_scaleS = orig_tep->getMaterialParams()->getNormalRepeatX(); + map_scaleT = orig_tep->getMaterialParams()->getNormalRepeatY(); + map_offsS = orig_tep->getMaterialParams()->getNormalOffsetX(); + map_offsT = orig_tep->getMaterialParams()->getNormalOffsetY(); + break; + case LLRender::SPECULAR_MAP: + if (orig_tep->getMaterialParams()->getSpecularID().isNull()) + { + return false; + } + map_rot = orig_tep->getMaterialParams()->getSpecularRotation(); + map_scaleS = orig_tep->getMaterialParams()->getSpecularRepeatX(); + map_scaleT = orig_tep->getMaterialParams()->getSpecularRepeatY(); + map_offsS = orig_tep->getMaterialParams()->getSpecularOffsetX(); + map_offsT = orig_tep->getMaterialParams()->getSpecularOffsetY(); + break; + default: /*make compiler happy*/ + break; + } + LLVector3 orig_pos, this_pos; LLQuaternion orig_face_rot, this_face_rot; F32 orig_proj_scale, this_proj_scale; @@ -1126,7 +1116,7 @@ bool LLFace::calcAlignedPlanarTE(const LLFace* align_to, LLVector2* res_st_offs getPlanarProjectedParams(&this_face_rot, &this_pos, &this_proj_scale); // The rotation of "this face's" texture: - LLQuaternion orig_st_rot = LLQuaternion(orig_tep->getRotation(), LLVector3::z_axis) * orig_face_rot; + LLQuaternion orig_st_rot = LLQuaternion(map_rot, LLVector3::z_axis) * orig_face_rot; LLQuaternion this_st_rot = orig_st_rot * ~this_face_rot; F32 x_ang, y_ang, z_ang; this_st_rot.getEulerAngles(&x_ang, &y_ang, &z_ang); @@ -1134,10 +1124,10 @@ bool LLFace::calcAlignedPlanarTE(const LLFace* align_to, LLVector2* res_st_offs // Offset and scale of "this face's" texture: LLVector3 centers_dist = (this_pos - orig_pos) * ~orig_st_rot; - LLVector3 st_scale(orig_tep->mScaleS, orig_tep->mScaleT, 1.f); + LLVector3 st_scale(map_scaleS, map_scaleT, 1.f); st_scale *= orig_proj_scale; centers_dist.scaleVec(st_scale); - LLVector2 orig_st_offset(orig_tep->mOffsetS, orig_tep->mOffsetT); + LLVector2 orig_st_offset(map_offsS, map_offsT); *res_st_offset = orig_st_offset + (LLVector2)centers_dist; res_st_offset->mV[VX] -= (S32)res_st_offset->mV[VX]; diff --git a/indra/newview/llface.h b/indra/newview/llface.h index 736d45b7ad42888597692e66a30a4a5a925439b9..a08e730e54c4beaf68ce059440a116db63f9af02 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -114,7 +114,7 @@ class LLFace : public LLTrace::MemTrackableNonVirtual<LLFace, 16> LLVector2 surfaceToTexture(LLVector2 surface_coord, const LLVector4a& position, const LLVector4a& normal); void getPlanarProjectedParams(LLQuaternion* face_rot, LLVector3* face_pos, F32* scale) const; bool calcAlignedPlanarTE(const LLFace* align_to, LLVector2* st_offset, - LLVector2* st_scale, F32* st_rot) const; + LLVector2* st_scale, F32* st_rot, LLRender::eTexIndex map = LLRender::DIFFUSE_MAP) const; U32 getState() const { return mState; } void setState(U32 state) { mState |= state; } @@ -198,7 +198,7 @@ class LLFace : public LLTrace::MemTrackableNonVirtual<LLFace, 16> void renderSelectedUV(); void renderSelected(LLViewerTexture *image, const LLColor4 &color); - void renderOneWireframe(const LLColor4 &color, F32 fogCfx, bool wireframe_selection, bool bRenderHiddenSelections); + void renderOneWireframe(const LLColor4 &color, F32 fogCfx, bool wireframe_selection, bool bRenderHiddenSelections, bool shader); F32 getKey() const { return mDistance; } diff --git a/indra/newview/llfacebookconnect.cpp b/indra/newview/llfacebookconnect.cpp deleted file mode 100644 index 43b01fa2f14917ad7ae9970f12434d87b949bab5..0000000000000000000000000000000000000000 --- a/indra/newview/llfacebookconnect.cpp +++ /dev/null @@ -1,714 +0,0 @@ -/** - * @file llfacebookconnect.h - * @author Merov, Cho, Gil - * @brief Connection to Facebook Service - * - * $LicenseInfo:firstyear=2013&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2013, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llfacebookconnect.h" -#include "llflickrconnect.h" -#include "lltwitterconnect.h" - -#include "llagent.h" -#include "llcallingcard.h" // for LLAvatarTracker -#include "llcommandhandler.h" -#include "llnotificationsutil.h" -#include "llurlaction.h" -#include "llimagepng.h" -#include "llimagejpeg.h" -#include "lltrans.h" -#include "llevents.h" -#include "llviewerregion.h" -#include "llviewercontrol.h" - -#include "llfloaterwebcontent.h" -#include "llfloaterreg.h" -#include "llcorehttputil.h" - -boost::scoped_ptr<LLEventPump> LLFacebookConnect::sStateWatcher(new LLEventStream("FacebookConnectState")); -boost::scoped_ptr<LLEventPump> LLFacebookConnect::sInfoWatcher(new LLEventStream("FacebookConnectInfo")); -boost::scoped_ptr<LLEventPump> LLFacebookConnect::sContentWatcher(new LLEventStream("FacebookConnectContent")); - -// Local functions -void log_facebook_connect_error(const std::string& request, U32 status, const std::string& reason, const std::string& code, const std::string& description) -{ - // Note: 302 (redirect) is *not* an error that warrants logging - if (status != 302) - { - LL_WARNS("FacebookConnect") << request << " request failed with a " << status << " " << reason << ". Reason: " << code << " (" << description << ")" << LL_ENDL; - } -} - -void toast_user_for_facebook_success() -{ - LLSD args; - args["MESSAGE"] = LLTrans::getString("facebook_post_success"); - LLNotificationsUtil::add("FacebookConnect", args); -} - -LLCore::HttpHeaders::ptr_t get_headers() -{ - LLCore::HttpHeaders::ptr_t httpHeaders(new LLCore::HttpHeaders); - // The DebugSlshareLogTag mechanism is intended to trigger slshare-service - // debug logging. slshare-service is coded to respond to an X-debug-tag - // header by engaging debug logging for that request only. This way a - // developer need not muck with the slshare-service image to engage debug - // logging. Moreover, the value of X-debug-tag is embedded in each such - // log line so the developer can quickly find the log lines pertinent to - // THIS session. - std::string logtag(gSavedSettings.getString("DebugSlshareLogTag")); - if (! logtag.empty()) - { - httpHeaders->append("X-debug-tag", logtag); - } - return httpHeaders; -} - -/////////////////////////////////////////////////////////////////////////////// -// -class LLFacebookConnectHandler : public LLCommandHandler -{ -public: - LLFacebookConnectHandler() : LLCommandHandler("fbc", UNTRUSTED_THROTTLE) { } - - bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web) - { - if (tokens.size() >= 1) - { - if (tokens[0].asString() == "connect") - { - if (tokens.size() >= 2 && tokens[1].asString() == "flickr") - { - // this command probably came from the flickr_web browser, so close it - LLFloaterReg::hideInstance("flickr_web"); - - // connect to flickr - if (query_map.has("oauth_token")) - { - LLFlickrConnect::instance().connectToFlickr(query_map["oauth_token"], query_map.get("oauth_verifier")); - } - return true; - } - else if (tokens.size() >= 2 && tokens[1].asString() == "twitter") - { - // this command probably came from the twitter_web browser, so close it - LLFloaterReg::hideInstance("twitter_web"); - - // connect to twitter - if (query_map.has("oauth_token")) - { - LLTwitterConnect::instance().connectToTwitter(query_map["oauth_token"], query_map.get("oauth_verifier")); - } - return true; - } - else //if (tokens.size() >= 2 && tokens[1].asString() == "facebook") - { - // this command probably came from the fbc_web browser, so close it - LLFloaterReg::hideInstance("fbc_web"); - - // connect to facebook - if (query_map.has("code")) - { - LLFacebookConnect::instance().connectToFacebook(query_map["code"], query_map.get("state")); - } - return true; - } - } - } - return false; - } -}; -LLFacebookConnectHandler gFacebookConnectHandler; - -/////////////////////////////////////////////////////////////////////////////// -// -void LLFacebookConnect::facebookConnectCoro(std::string authCode, std::string authState) -{ - LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); - LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("FacebookConnect", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); - - LLSD putData; - if (!authCode.empty()) - { - putData["code"] = authCode; - } - if (!authState.empty()) - { - putData["state"] = authState; - } - - httpOpts->setWantHeaders(true); - httpOpts->setFollowRedirects(false); - - LLSD result = httpAdapter->putAndSuspend(httpRequest, getFacebookConnectURL("/connection"), putData, httpOpts, get_headers()); - - LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; - LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); - if (!status) - { - if (status == LLCore::HttpStatus(HTTP_FOUND)) - { - std::string location = httpResults[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_HEADERS][HTTP_IN_HEADER_LOCATION]; - if (location.empty()) - { - LL_WARNS("FacebookConnect") << "Missing Location header " << LL_ENDL; - } - else - { - openFacebookWeb(location); - } - } - } - else - { - LL_INFOS("FacebookConnect") << "Connect successful. " << LL_ENDL; - setConnectionState(LLFacebookConnect::FB_CONNECTED); - } - -} - -/////////////////////////////////////////////////////////////////////////////// -// -bool LLFacebookConnect::testShareStatus(LLSD &result) -{ - LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; - LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); - - if (status) - return true; - - if (status == LLCore::HttpStatus(HTTP_FOUND)) - { - std::string location = httpResults[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_HEADERS][HTTP_IN_HEADER_LOCATION]; - if (location.empty()) - { - LL_WARNS("FacebookConnect") << "Missing Location header " << LL_ENDL; - } - else - { - openFacebookWeb(location); - } - } - if (status == LLCore::HttpStatus(HTTP_NOT_FOUND)) - { - LL_DEBUGS("FacebookConnect") << "Not connected. " << LL_ENDL; - connectToFacebook(); - } - else - { - LL_WARNS("FacebookConnect") << "HTTP Status error " << status.toString() << LL_ENDL; - setConnectionState(LLFacebookConnect::FB_POST_FAILED); - log_facebook_connect_error("Share", status.getStatus(), status.toString(), - result.get("error_code"), result.get("error_description")); - } - return false; -} - -void LLFacebookConnect::facebookShareCoro(std::string route, LLSD share) -{ - LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); - LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("FacebookConnect", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); - - httpOpts->setWantHeaders(true); - httpOpts->setFollowRedirects(false); - - LLSD result = httpAdapter->postAndSuspend(httpRequest, getFacebookConnectURL(route, true), share, httpOpts, get_headers()); - - if (testShareStatus(result)) - { - toast_user_for_facebook_success(); - LL_DEBUGS("FacebookConnect") << "Post successful. " << LL_ENDL; - setConnectionState(LLFacebookConnect::FB_POSTED); - } -} - -void LLFacebookConnect::facebookShareImageCoro(std::string route, LLPointer<LLImageFormatted> image, std::string caption) -{ - LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); - LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("FacebookConnect", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpHeaders::ptr_t httpHeaders(get_headers()); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); - - httpOpts->setWantHeaders(true); - httpOpts->setFollowRedirects(false); - - std::string imageFormat; - if (dynamic_cast<LLImagePNG*>(image.get())) - { - imageFormat = "png"; - } - else if (dynamic_cast<LLImageJPEG*>(image.get())) - { - imageFormat = "jpg"; - } - else - { - LL_WARNS() << "Image to upload is not a PNG or JPEG" << LL_ENDL; - return; - } - - // All this code is mostly copied from LLWebProfile::post() - static const std::string boundary = "----------------------------0123abcdefab"; - - std::string contentType = "multipart/form-data; boundary=" + boundary; - httpHeaders->append("Content-Type", contentType.c_str()); - - LLCore::BufferArray::ptr_t raw = LLCore::BufferArray::ptr_t(new LLCore::BufferArray()); // - LLCore::BufferArrayStream body(raw.get()); - - // *NOTE: The order seems to matter. - body << "--" << boundary << "\r\n" - << "Content-Disposition: form-data; name=\"caption\"\r\n\r\n" - << caption << "\r\n"; - - body << "--" << boundary << "\r\n" - << "Content-Disposition: form-data; name=\"image\"; filename=\"Untitled." << imageFormat << "\"\r\n" - << "Content-Type: image/" << imageFormat << "\r\n\r\n"; - - // Insert the image data. - // *FIX: Treating this as a string will probably screw it up ... - U8* image_data = image->getData(); - for (S32 i = 0; i < image->getDataSize(); ++i) - { - body << image_data[i]; - } - - body << "\r\n--" << boundary << "--\r\n"; - - setConnectionState(LLFacebookConnect::FB_POSTING); - - LLSD result = httpAdapter->postAndSuspend(httpRequest, getFacebookConnectURL(route, true), raw, httpOpts, httpHeaders); - - if (testShareStatus(result)) - { - toast_user_for_facebook_success(); - LL_DEBUGS("FacebookConnect") << "Post successful. " << LL_ENDL; - setConnectionState(LLFacebookConnect::FB_POSTED); - } -} - -/////////////////////////////////////////////////////////////////////////////// -// -void LLFacebookConnect::facebookDisconnectCoro() -{ - LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); - LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("FacebookConnect", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); - - httpOpts->setFollowRedirects(false); - - LLSD result = httpAdapter->deleteAndSuspend(httpRequest, getFacebookConnectURL("/connection"), httpOpts, get_headers()); - - LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; - LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); - if (!status && (status != LLCore::HttpStatus(HTTP_FOUND))) - { - LL_WARNS("FacebookConnect") << "Failed to disconnect:" << status.toTerseString() << LL_ENDL; - setConnectionState(LLFacebookConnect::FB_DISCONNECT_FAILED); - log_facebook_connect_error("Disconnect", status.getStatus(), status.toString(), - result.get("error_code"), result.get("error_description")); - } - else - { - LL_DEBUGS("FacebookConnect") << "Facebook Disconnect successful. " << LL_ENDL; - clearInfo(); - clearContent(); - //Notify state change - setConnectionState(LLFacebookConnect::FB_NOT_CONNECTED); - } - -} - -/////////////////////////////////////////////////////////////////////////////// -// -void LLFacebookConnect::facebookConnectedCheckCoro(bool autoConnect) -{ - LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); - LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("FacebookConnect", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); - - setConnectionState(LLFacebookConnect::FB_CONNECTION_IN_PROGRESS); - - httpOpts->setFollowRedirects(false); - - LLSD result = httpAdapter->getAndSuspend(httpRequest, getFacebookConnectURL("/connection", true), httpOpts, get_headers()); - - LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; - LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); - - if (!status) - { - if ( status == LLCore::HttpStatus(HTTP_NOT_FOUND) ) - { - LL_DEBUGS("FacebookConnect") << "Not connected. " << LL_ENDL; - if (autoConnect) - { - connectToFacebook(); - } - else - { - setConnectionState(LLFacebookConnect::FB_NOT_CONNECTED); - } - } - else - { - LL_WARNS("FacebookConnect") << "Failed to test connection:" << status.toTerseString() << LL_ENDL; - - setConnectionState(LLFacebookConnect::FB_DISCONNECT_FAILED); - log_facebook_connect_error("Connected", status.getStatus(), status.toString(), - result.get("error_code"), result.get("error_description")); - } - } - else - { - LL_DEBUGS("FacebookConnect") << "Connect successful. " << LL_ENDL; - setConnectionState(LLFacebookConnect::FB_CONNECTED); - } -} - -/////////////////////////////////////////////////////////////////////////////// -// -void LLFacebookConnect::facebookConnectInfoCoro() -{ - LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); - LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("FacebookConnect", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); - - httpOpts->setWantHeaders(true); - httpOpts->setFollowRedirects(false); - - LLSD result = httpAdapter->getAndSuspend(httpRequest, getFacebookConnectURL("/info", true), httpOpts, get_headers()); - - LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; - LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); - - if (status == LLCore::HttpStatus(HTTP_FOUND)) - { - std::string location = httpResults[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_HEADERS][HTTP_IN_HEADER_LOCATION]; - if (location.empty()) - { - LL_WARNS("FacebookConnect") << "Missing Location header " << LL_ENDL; - } - else - { - openFacebookWeb(location); - } - } - else if (!status) - { - LL_WARNS("FacebookConnect") << "Facebook Info failed: " << status.toString() << LL_ENDL; - log_facebook_connect_error("Info", status.getStatus(), status.toString(), - result.get("error_code"), result.get("error_description")); - } - else - { - LL_INFOS("FacebookConnect") << "Facebook: Info received" << LL_ENDL; - result.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS); - storeInfo(result); - } -} - -/////////////////////////////////////////////////////////////////////////////// -// -void LLFacebookConnect::facebookConnectFriendsCoro() -{ - LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); - LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("FacebookConnect", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); - - httpOpts->setFollowRedirects(false); - - LLSD result = httpAdapter->getAndSuspend(httpRequest, getFacebookConnectURL("/friends", true), httpOpts, get_headers()); - - LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; - LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); - - if (status == LLCore::HttpStatus(HTTP_FOUND)) - { - std::string location = httpResults[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_HEADERS][HTTP_IN_HEADER_LOCATION]; - if (location.empty()) - { - LL_WARNS("FacebookConnect") << "Missing Location header " << LL_ENDL; - } - else - { - openFacebookWeb(location); - } - } - else if (!status) - { - LL_WARNS("FacebookConnect") << "Facebook Friends failed: " << status.toString() << LL_ENDL; - log_facebook_connect_error("Info", status.getStatus(), status.toString(), - result.get("error_code"), result.get("error_description")); - } - else - { - LL_INFOS("FacebookConnect") << "Facebook: Friends received" << LL_ENDL; - result.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS); - LLSD content = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_CONTENT]; - storeContent(content); - } -} - -/////////////////////////////////////////////////////////////////////////////// -// -LLFacebookConnect::LLFacebookConnect() -: mConnectionState(FB_NOT_CONNECTED), - mConnected(false), - mInfo(), - mContent(), - mRefreshInfo(false), - mRefreshContent(false), - mReadFromMaster(false) -{ -} - -void LLFacebookConnect::openFacebookWeb(std::string url) -{ - LLFloaterWebContent::Params p; - p.url(url); - p.show_chrome(true); - p.allow_back_forward_navigation(false); - p.clean_browser(true); - LLFloater *floater = LLFloaterReg::showInstance("fbc_web", p); - //the internal web browser has a bug that prevents it from gaining focus unless a mouse event occurs first (it seems). - //So when showing the internal web browser, set focus to it's containing floater "fbc_web". When a mouse event - //occurs on the "webbrowser" panel part of the floater, a mouse cursor will properly show and the "webbrowser" will gain focus. - //fbc_web floater contains the "webbrowser" panel. JIRA: ACME-744 - gFocusMgr.setKeyboardFocus( floater ); - - //LLUrlAction::openURLExternal(url); -} - -std::string LLFacebookConnect::getFacebookConnectURL(const std::string& route, bool include_read_from_master) -{ - std::string url(""); - LLViewerRegion *regionp = gAgent.getRegion(); - if (regionp) - { - //url = "http://pdp15.lindenlab.com/fbc/agent/" + gAgentID.asString(); // TEMPORARY FOR TESTING - CHO - url = regionp->getCapability("FacebookConnect"); - url += route; - - if (include_read_from_master && mReadFromMaster) - { - url += "?read_from_master=true"; - } - } - return url; -} - -void LLFacebookConnect::connectToFacebook(const std::string& auth_code, const std::string& auth_state) -{ - setConnectionState(LLFacebookConnect::FB_CONNECTION_IN_PROGRESS); - - LLCoros::instance().launch("LLFacebookConnect::facebookConnectCoro", - boost::bind(&LLFacebookConnect::facebookConnectCoro, this, auth_code, auth_state)); -} - -void LLFacebookConnect::disconnectFromFacebook() -{ - LLCoros::instance().launch("LLFacebookConnect::facebookDisconnectCoro", - boost::bind(&LLFacebookConnect::facebookDisconnectCoro, this)); -} - -void LLFacebookConnect::checkConnectionToFacebook(bool auto_connect) -{ - setConnectionState(LLFacebookConnect::FB_DISCONNECTING); - - LLCoros::instance().launch("LLFacebookConnect::facebookConnectedCheckCoro", - boost::bind(&LLFacebookConnect::facebookConnectedCheckCoro, this, auto_connect)); -} - -void LLFacebookConnect::loadFacebookInfo() -{ - if(mRefreshInfo) - { - LLCoros::instance().launch("LLFacebookConnect::facebookConnectInfoCoro", - boost::bind(&LLFacebookConnect::facebookConnectInfoCoro, this)); - } -} - -void LLFacebookConnect::loadFacebookFriends() -{ - if(mRefreshContent) - { - LLCoros::instance().launch("LLFacebookConnect::facebookConnectFriendsCoro", - boost::bind(&LLFacebookConnect::facebookConnectFriendsCoro, this)); - } -} - -void LLFacebookConnect::postCheckin(const std::string& location, const std::string& name, - const std::string& description, const std::string& image, const std::string& message) -{ - setConnectionState(LLFacebookConnect::FB_POSTING); - - LLSD body; - if (!location.empty()) - { - body["location"] = location; - } - if (!name.empty()) - { - body["name"] = name; - } - if (!description.empty()) - { - body["description"] = description; - } - if (!image.empty()) - { - body["image"] = image; - } - if (!message.empty()) - { - body["message"] = message; - } - - LLCoros::instance().launch("LLFacebookConnect::facebookShareCoro", - boost::bind(&LLFacebookConnect::facebookShareCoro, this, "/share/checkin", body)); -} - -void LLFacebookConnect::sharePhoto(const std::string& image_url, const std::string& caption) -{ - setConnectionState(LLFacebookConnect::FB_POSTING); - - LLSD body; - body["image"] = image_url; - body["caption"] = caption; - - LLCoros::instance().launch("LLFacebookConnect::facebookShareCoro", - boost::bind(&LLFacebookConnect::facebookShareCoro, this, "/share/photo", body)); -} - -void LLFacebookConnect::sharePhoto(LLPointer<LLImageFormatted> image, const std::string& caption) -{ - setConnectionState(LLFacebookConnect::FB_POSTING); - - LLCoros::instance().launch("LLFacebookConnect::facebookShareImageCoro", - boost::bind(&LLFacebookConnect::facebookShareImageCoro, this, "/share/photo", image, caption)); -} - -void LLFacebookConnect::updateStatus(const std::string& message) -{ - LLSD body; - body["message"] = message; - - setConnectionState(LLFacebookConnect::FB_POSTING); - - LLCoros::instance().launch("LLFacebookConnect::facebookShareCoro", - boost::bind(&LLFacebookConnect::facebookShareCoro, this, "/share/wall", body)); -} - -void LLFacebookConnect::storeInfo(const LLSD& info) -{ - mInfo = info; - mRefreshInfo = false; - - sInfoWatcher->post(info); -} - -const LLSD& LLFacebookConnect::getInfo() const -{ - return mInfo; -} - -void LLFacebookConnect::clearInfo() -{ - mInfo = LLSD(); -} - -void LLFacebookConnect::storeContent(const LLSD& content) -{ - mContent = content; - mRefreshContent = false; - - sContentWatcher->post(content); -} - -const LLSD& LLFacebookConnect::getContent() const -{ - return mContent; -} - -void LLFacebookConnect::clearContent() -{ - mContent = LLSD(); -} - -void LLFacebookConnect::setDataDirty() -{ - mRefreshInfo = true; - mRefreshContent = true; -} - -void LLFacebookConnect::setConnectionState(LLFacebookConnect::EConnectionState connection_state) -{ - if(connection_state == FB_CONNECTED) - { - mReadFromMaster = true; - setConnected(true); - setDataDirty(); - } - else if(connection_state == FB_NOT_CONNECTED) - { - setConnected(false); - } - else if(connection_state == FB_POSTED) - { - mReadFromMaster = false; - } - - if (mConnectionState != connection_state) - { - // set the connection state before notifying watchers - mConnectionState = connection_state; - - LLSD state_info; - state_info["enum"] = connection_state; - sStateWatcher->post(state_info); - } -} - -void LLFacebookConnect::setConnected(bool connected) -{ - mConnected = connected; -} diff --git a/indra/newview/llfacebookconnect.h b/indra/newview/llfacebookconnect.h deleted file mode 100644 index 7fd4070f54dfeb872b98ffc0b2e322fe3d9e44f7..0000000000000000000000000000000000000000 --- a/indra/newview/llfacebookconnect.h +++ /dev/null @@ -1,116 +0,0 @@ -/** - * @file llfacebookconnect.h - * @author Merov, Cho, Gil - * @brief Connection to Facebook Service - * - * $LicenseInfo:firstyear=2013&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2013, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#ifndef LL_LLFACEBOOKCONNECT_H -#define LL_LLFACEBOOKCONNECT_H - -#include "llsingleton.h" -#include "llimage.h" -#include "llcoros.h" -#include "lleventcoro.h" - -class LLEventPump; - -/** - * @class LLFacebookConnect - * - * Manages authentication to, and interaction with, a web service allowing the - * the viewer to get Facebook OpenGraph data. - */ -class LLFacebookConnect : public LLSingleton<LLFacebookConnect> -{ - LLSINGLETON(LLFacebookConnect); - ~LLFacebookConnect() {}; - LOG_CLASS(LLFacebookConnect); -public: - enum EConnectionState - { - FB_NOT_CONNECTED = 0, - FB_CONNECTION_IN_PROGRESS = 1, - FB_CONNECTED = 2, - FB_CONNECTION_FAILED = 3, - FB_POSTING = 4, - FB_POSTED = 5, - FB_POST_FAILED = 6, - FB_DISCONNECTING = 7, - FB_DISCONNECT_FAILED = 8 - }; - - void connectToFacebook(const std::string& auth_code = "", const std::string& auth_state = ""); // Initiate the complete FB connection. Please use checkConnectionToFacebook() in normal use. - void disconnectFromFacebook(); // Disconnect from the FBC service. - void checkConnectionToFacebook(bool auto_connect = false); // Check if an access token is available on the FBC service. If not, call connectToFacebook(). - - void loadFacebookInfo(); - void loadFacebookFriends(); - void postCheckin(const std::string& location, const std::string& name, const std::string& description, const std::string& picture, const std::string& message); - void sharePhoto(const std::string& image_url, const std::string& caption); - void sharePhoto(LLPointer<LLImageFormatted> image, const std::string& caption); - void updateStatus(const std::string& message); - - void storeInfo(const LLSD& info); - const LLSD& getInfo() const; - void clearInfo(); - void storeContent(const LLSD& content); - const LLSD& getContent() const; - void clearContent(); - void setDataDirty(); - - void setConnectionState(EConnectionState connection_state); - void setConnected(bool connected); - bool isConnected() { return mConnected; } - bool isTransactionOngoing() { return ((mConnectionState == FB_CONNECTION_IN_PROGRESS) || (mConnectionState == FB_POSTING) || (mConnectionState == FB_DISCONNECTING)); } - EConnectionState getConnectionState() { return mConnectionState; } - - void openFacebookWeb(std::string url); - -private: - - std::string getFacebookConnectURL(const std::string& route = "", bool include_read_from_master = false); - - EConnectionState mConnectionState; - BOOL mConnected; - LLSD mInfo; - LLSD mContent; - bool mRefreshInfo; - bool mRefreshContent; - bool mReadFromMaster; - - static boost::scoped_ptr<LLEventPump> sStateWatcher; - static boost::scoped_ptr<LLEventPump> sInfoWatcher; - static boost::scoped_ptr<LLEventPump> sContentWatcher; - - bool testShareStatus(LLSD &results); - void facebookConnectCoro(std::string authCode, std::string authState); - void facebookConnectedCheckCoro(bool autoConnect); - void facebookDisconnectCoro(); - void facebookShareCoro(std::string route, LLSD share); - void facebookShareImageCoro(std::string route, LLPointer<LLImageFormatted> image, std::string caption); - void facebookConnectInfoCoro(); - void facebookConnectFriendsCoro(); -}; - -#endif // LL_LLFACEBOOKCONNECT_H diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index f68e63cb96365185725fe1c8feb47197667b3df5..d90f03b403ccb36dd4d3d4f7c8cef26a42402d92 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -43,6 +43,7 @@ #include "llsdserialize.h" #include "lltooltip.h" #include "llbutton.h" +#include "llscrollbar.h" #include "llappviewer.h" #include "llviewertexturelist.h" @@ -128,7 +129,8 @@ void LLFastTimerView::setPauseState(bool pause_state) BOOL LLFastTimerView::postBuild() { LLButton& pause_btn = getChildRef<LLButton>("pause_btn"); - + mScrollBar = getChild<LLScrollbar>("scroll_vert"); + pause_btn.setCommitCallback(boost::bind(&LLFastTimerView::onPause, this)); return TRUE; } @@ -183,7 +185,7 @@ BOOL LLFastTimerView::handleDoubleClick(S32 x, S32 y, MASK mask) BOOL LLFastTimerView::handleMouseDown(S32 x, S32 y, MASK mask) { - if (x < mBarRect.mLeft) + if (x < mScrollBar->getRect().mLeft) { BlockTimerStatHandle* idp = getLegendID(y); if (idp) @@ -284,7 +286,7 @@ BOOL LLFastTimerView::handleHover(S32 x, S32 y, MASK mask) } } } - else if (x < mBarRect.mLeft) + else if (x < mScrollBar->getRect().mLeft) { BlockTimerStatHandle* timer_id = getLegendID(y); if (timer_id) @@ -335,7 +337,7 @@ BOOL LLFastTimerView::handleToolTip(S32 x, S32 y, MASK mask) else { // tooltips for timer legend - if (x < mBarRect.mLeft) + if (x < mScrollBar->getRect().mLeft) { BlockTimerStatHandle* idp = getLegendID(y); if (idp) @@ -352,11 +354,19 @@ BOOL LLFastTimerView::handleToolTip(S32 x, S32 y, MASK mask) BOOL LLFastTimerView::handleScrollWheel(S32 x, S32 y, S32 clicks) { - setPauseState(true); - mScrollIndex = llclamp( mScrollIndex + clicks, - 0, - llmin((S32)mRecording.getNumRecordedPeriods(), (S32)mRecording.getNumRecordedPeriods() - MAX_VISIBLE_HISTORY)); - return TRUE; + if (x < mBarRect.mLeft) + { + // Inside mScrollBar and list of timers + mScrollBar->handleScrollWheel(x,y,clicks); + } + else + { + setPauseState(true); + mScrollIndex = llclamp(mScrollIndex + clicks, + 0, + llmin((S32)mRecording.getNumRecordedPeriods(), (S32)mRecording.getNumRecordedPeriods() - MAX_VISIBLE_HISTORY)); + } + return TRUE; } static BlockTimerStatHandle FTM_RENDER_TIMER("Timers"); @@ -1197,6 +1207,7 @@ void LLFastTimerView::drawLegend() { LLLocalClipRect clip(mLegendRect); S32 cur_line = 0; + S32 scroll_offset = 0; // element's y offset from top of the inner scroll's rect ft_display_idx.clear(); std::map<BlockTimerStatHandle*, S32> display_line; for (block_timer_tree_df_iterator_t it = LLTrace::begin_block_timer_tree_df(FTM_FRAME); @@ -1204,10 +1215,24 @@ void LLFastTimerView::drawLegend() ++it) { BlockTimerStatHandle* idp = (*it); + // Needed to figure out offsets and parenting display_line[idp] = cur_line; - ft_display_idx.push_back(idp); cur_line++; + if (scroll_offset < mScrollBar->getDocPos()) + { + // only offset for visible items + scroll_offset += TEXT_HEIGHT + 2; + if (idp->getTreeNode().mCollapsed) + { + it.skipDescendants(); + } + continue; + } + + // used for mouse clicks + ft_display_idx.push_back(idp); + // Actual draw, first bar (square), then text x = MARGIN; LLRect bar_rect(x, y, x + TEXT_HEIGHT, y - TEXT_HEIGHT); @@ -1281,11 +1306,14 @@ void LLFastTimerView::drawLegend() y -= (TEXT_HEIGHT + 2); + scroll_offset += TEXT_HEIGHT + 2; if (idp->getTreeNode().mCollapsed) { it.skipDescendants(); } } + // Recalculate scroll size + mScrollBar->setDocSize(scroll_offset - mLegendRect.getHeight()); } } diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h index 3e30bd86ba8bda4536cfbd134c8dc1430845ef3d..ff65f8da079988aaea6b2b6e4fbb15cba0a5c4eb 100644 --- a/indra/newview/llfasttimerview.h +++ b/indra/newview/llfasttimerview.h @@ -33,6 +33,8 @@ #include "lltracerecording.h" #include <deque> +class LLScrollbar; + class LLFastTimerView : public LLFloater { public: @@ -142,6 +144,8 @@ class LLFastTimerView : public LLFloater mLegendRect; LLFrameTimer mHighlightTimer; LLTrace::PeriodicRecording mRecording; + + LLScrollbar* mScrollBar; }; #endif diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index 0f22b6200fb4cbdd6382986641b02329833c27c3..b6fd70452e7dfee28f5b4a843c13ce3e6aea91fd 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -101,6 +101,8 @@ LLFilePicker::LLFilePicker() mOFN.lpfnHook = NULL; mOFN.lpTemplateName = NULL; mFilesW[0] = '\0'; +#elif LL_DARWIN + mPickOptions = 0; #endif } diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index c5561fe011f24a3da64fc329558084c45e234699..33099db1b946c0b10f8ace73c6b1cd4e26eb95a3 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -812,7 +812,7 @@ bool LLFloaterAvatarPicker::isSelectBtnEnabled() { bool ret_val = visibleItemsSelected(); - if ( ret_val ) + if ( ret_val && !isMinimized()) { std::string acvtive_panel_name; LLScrollListCtrl* list = NULL; diff --git a/indra/newview/llfloaterbanduration.cpp b/indra/newview/llfloaterbanduration.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6ba6c30cab1e9ad6a5d03578c3cd22e2f0213f22 --- /dev/null +++ b/indra/newview/llfloaterbanduration.cpp @@ -0,0 +1,92 @@ +/** +* @file llfloaterbanduration.cpp +* +* $LicenseInfo:firstyear=2004&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2018, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +* $/LicenseInfo$ +*/ + +#include "llviewerprecompiledheaders.h" +#include "llfloaterbanduration.h" + +#include "llfloaterreg.h" +#include "llspinctrl.h" +#include "llradiogroup.h" + +LLFloaterBanDuration::LLFloaterBanDuration(const LLSD& target) + : LLFloater(target) +{ +} + +BOOL LLFloaterBanDuration::postBuild() +{ + childSetAction("ok_btn", boost::bind(&LLFloaterBanDuration::onClickBan, this)); + childSetAction("cancel_btn", boost::bind(&LLFloaterBanDuration::onClickCancel, this)); + + getChild<LLUICtrl>("ban_duration_radio")->setCommitCallback(boost::bind(&LLFloaterBanDuration::onClickRadio, this)); + getChild<LLRadioGroup>("ban_duration_radio")->setSelectedIndex(0); + getChild<LLUICtrl>("ban_hours")->setEnabled(FALSE); + + return TRUE; +} + +LLFloaterBanDuration* LLFloaterBanDuration::show(select_callback_t callback, uuid_vec_t ids) +{ + LLFloaterBanDuration* floater = LLFloaterReg::showTypedInstance<LLFloaterBanDuration>("ban_duration"); + if (!floater) + { + LL_WARNS() << "Cannot instantiate ban duration floater" << LL_ENDL; + return NULL; + } + + floater->mSelectionCallback = callback; + floater->mAvatar_ids = ids; + + return floater; +} + +void LLFloaterBanDuration::onClickRadio() +{ + getChild<LLUICtrl>("ban_hours")->setEnabled(getChild<LLRadioGroup>("ban_duration_radio")->getSelectedIndex() != 0); +} + +void LLFloaterBanDuration::onClickCancel() +{ + closeFloater(); +} + +void LLFloaterBanDuration::onClickBan() +{ + if (mSelectionCallback) + { + S32 time = 0; + if (getChild<LLRadioGroup>("ban_duration_radio")->getSelectedIndex() != 0) + { + LLSpinCtrl* hours_spin = getChild<LLSpinCtrl>("ban_hours"); + if (hours_spin) + { + time = LLDate::now().secondsSinceEpoch() + (hours_spin->getValue().asInteger() * 3600); + } + } + mSelectionCallback(mAvatar_ids, time); + } + closeFloater(); +} + diff --git a/indra/newview/llfloaterbanduration.h b/indra/newview/llfloaterbanduration.h new file mode 100644 index 0000000000000000000000000000000000000000..e8ec7cc669f245e2d0120949928e0696549f09ed --- /dev/null +++ b/indra/newview/llfloaterbanduration.h @@ -0,0 +1,52 @@ +/** +* @file llfloaterbanduration.h +* +* $LicenseInfo:firstyear=2004&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2018, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +* $/LicenseInfo$ +*/ + + +#ifndef LL_FLOATERBANDURATION_H +#define LL_FLOATERBANDURATION_H + +#include "llfloater.h" + +class LLFloaterBanDuration : public LLFloater +{ + typedef boost::function<void(const uuid_vec_t&, const S32 duration)> select_callback_t; + +public: + LLFloaterBanDuration(const LLSD& target); + BOOL postBuild(); + static LLFloaterBanDuration* show(select_callback_t callback, uuid_vec_t id); + +private: + ~LLFloaterBanDuration() {}; + void onClickBan(); + void onClickCancel(); + void onClickRadio(); + + uuid_vec_t mAvatar_ids; + select_callback_t mSelectionCallback; +}; + +#endif // LL_FLOATERBANDURATION_H + diff --git a/indra/newview/llfloaterconversationpreview.cpp b/indra/newview/llfloaterconversationpreview.cpp index b48ecc8f31a11aa81b925ee6abb783cbe1835567..66198b3bf68475fa989e448645d0b761b1afea69 100644 --- a/indra/newview/llfloaterconversationpreview.cpp +++ b/indra/newview/llfloaterconversationpreview.cpp @@ -46,7 +46,7 @@ LLFloaterConversationPreview::LLFloaterConversationPreview(const LLSD& session_i mPageSize(gSavedSettings.getS32("ConversationHistoryPageSize")), mAccountName(session_id[LL_FCP_ACCOUNT_NAME]), mCompleteName(session_id[LL_FCP_COMPLETE_NAME]), - mMutex(NULL), + mMutex(), mShowHistory(false), mMessages(NULL), mHistoryThreadsBusy(false), diff --git a/indra/newview/llfloaterfacebook.cpp b/indra/newview/llfloaterfacebook.cpp deleted file mode 100644 index e84cbc289f2d6377ebc6886023803d116397164f..0000000000000000000000000000000000000000 --- a/indra/newview/llfloaterfacebook.cpp +++ /dev/null @@ -1,1132 +0,0 @@ -/** -* @file llfloaterfacebook.cpp -* @brief Implementation of llfloaterfacebook -* @author Gilbert@lindenlab.com -* -* $LicenseInfo:firstyear=2013&license=viewerlgpl$ -* Second Life Viewer Source Code -* Copyright (C) 2013, Linden Research, Inc. -* -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License as published by the Free Software Foundation; -* version 2.1 of the License only. -* -* This library is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this library; if not, write to the Free Software -* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -* -* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA -* $/LicenseInfo$ -*/ - -#include "llviewerprecompiledheaders.h" - -#include "llfloaterfacebook.h" - -#include "llagent.h" -#include "llagentui.h" -#include "llcheckboxctrl.h" -#include "llcombobox.h" -#include "llfacebookconnect.h" -#include "llfloaterbigpreview.h" -#include "llfloaterreg.h" -#include "lliconctrl.h" -#include "llimagefiltersmanager.h" -#include "llresmgr.h" // LLLocale -#include "llsdserialize.h" -#include "llloadingindicator.h" -#include "llslurl.h" -#include "lltrans.h" -#include "llsnapshotlivepreview.h" -#include "llviewerregion.h" -#include "llviewercontrol.h" -#include "llviewermedia.h" -#include "lltabcontainer.h" -#include "llavatarlist.h" -#include "llpanelpeoplemenus.h" -#include "llaccordionctrl.h" -#include "llaccordionctrltab.h" - -static LLPanelInjector<LLFacebookStatusPanel> t_panel_status("llfacebookstatuspanel"); -static LLPanelInjector<LLFacebookPhotoPanel> t_panel_photo("llfacebookphotopanel"); -static LLPanelInjector<LLFacebookCheckinPanel> t_panel_checkin("llfacebookcheckinpanel"); -static LLPanelInjector<LLFacebookFriendsPanel> t_panel_friends("llfacebookfriendspanel"); - -const std::string DEFAULT_CHECKIN_LOCATION_URL = "http://maps.secondlife.com/"; -const std::string DEFAULT_CHECKIN_ICON_URL = "http://map.secondlife.com.s3.amazonaws.com/map_placeholder.png"; -const std::string DEFAULT_CHECKIN_QUERY_PARAMETERS = "?sourceid=slshare_checkin&utm_source=facebook&utm_medium=checkin&utm_campaign=slshare"; -const std::string DEFAULT_PHOTO_QUERY_PARAMETERS = "?sourceid=slshare_photo&utm_source=facebook&utm_medium=photo&utm_campaign=slshare"; - -const S32 MAX_QUALITY = 100; // Max quality value for jpeg images -const S32 MIN_QUALITY = 0; // Min quality value for jpeg images -const S32 TARGET_DATA_SIZE = 950000; // Size of the image (compressed) we're trying to send to Facebook - -std::string get_map_url() -{ - LLVector3d center_agent; - LLViewerRegion *regionp = gAgent.getRegion(); - if (regionp) - { - center_agent = regionp->getCenterGlobal(); - } - int x_pos = center_agent[0] / 256.0; - int y_pos = center_agent[1] / 256.0; - std::string map_url = gSavedSettings.getString("CurrentMapServerURL") + llformat("map-1-%d-%d-objects.jpg", x_pos, y_pos); - return map_url; -} - -// Compute target jpeg quality : see https://wiki.lindenlab.com/wiki/Facebook_Image_Quality for details -S32 compute_jpeg_quality(S32 width, S32 height) -{ - F32 target_compression_ratio = (F32)(width * height * 3) / (F32)(TARGET_DATA_SIZE); - S32 quality = (S32)(110.0f - (2.0f * target_compression_ratio)); - return llclamp(quality, MIN_QUALITY, MAX_QUALITY); -} - -/////////////////////////// -//LLFacebookStatusPanel////// -/////////////////////////// - -LLFacebookStatusPanel::LLFacebookStatusPanel() : - mMessageTextEditor(NULL), - mPostButton(NULL), - mCancelButton(NULL), - mAccountCaptionLabel(NULL), - mAccountNameLabel(NULL), - mPanelButtons(NULL), - mConnectButton(NULL), - mDisconnectButton(NULL) -{ - mCommitCallbackRegistrar.add("SocialSharing.Connect", boost::bind(&LLFacebookStatusPanel::onConnect, this)); - mCommitCallbackRegistrar.add("SocialSharing.Disconnect", boost::bind(&LLFacebookStatusPanel::onDisconnect, this)); - - setVisibleCallback(boost::bind(&LLFacebookStatusPanel::onVisibilityChange, this, _2)); - - mCommitCallbackRegistrar.add("SocialSharing.SendStatus", boost::bind(&LLFacebookStatusPanel::onSend, this)); -} - -BOOL LLFacebookStatusPanel::postBuild() -{ - mAccountCaptionLabel = getChild<LLTextBox>("account_caption_label"); - mAccountNameLabel = getChild<LLTextBox>("account_name_label"); - mPanelButtons = getChild<LLUICtrl>("panel_buttons"); - mConnectButton = getChild<LLUICtrl>("connect_btn"); - mDisconnectButton = getChild<LLUICtrl>("disconnect_btn"); - - mMessageTextEditor = getChild<LLUICtrl>("status_message"); - mPostButton = getChild<LLUICtrl>("post_status_btn"); - mCancelButton = getChild<LLUICtrl>("cancel_status_btn"); - - return LLPanel::postBuild(); -} - -void LLFacebookStatusPanel::draw() -{ - LLFacebookConnect::EConnectionState connection_state = LLFacebookConnect::instance().getConnectionState(); - - //Disable the 'disconnect' button and the 'use another account' button when disconnecting in progress - bool disconnecting = connection_state == LLFacebookConnect::FB_DISCONNECTING; - mDisconnectButton->setEnabled(!disconnecting); - - //Disable the 'connect' button when a connection is in progress - bool connecting = connection_state == LLFacebookConnect::FB_CONNECTION_IN_PROGRESS; - mConnectButton->setEnabled(!connecting); - - if (mMessageTextEditor && mPostButton && mCancelButton) - { - bool no_ongoing_connection = !(LLFacebookConnect::instance().isTransactionOngoing()); - std::string message = mMessageTextEditor->getValue().asString(); - mMessageTextEditor->setEnabled(no_ongoing_connection); - mCancelButton->setEnabled(no_ongoing_connection); - mPostButton->setEnabled(no_ongoing_connection && !message.empty()); - } - - LLPanel::draw(); -} - -void LLFacebookStatusPanel::onSend() -{ - LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLFacebookStatusPanel"); // just in case it is already listening - LLEventPumps::instance().obtain("FacebookConnectState").listen("LLFacebookStatusPanel", boost::bind(&LLFacebookStatusPanel::onFacebookConnectStateChange, this, _1)); - - // Connect to Facebook if necessary and then post - if (LLFacebookConnect::instance().isConnected()) - { - sendStatus(); - } - else - { - LLFacebookConnect::instance().checkConnectionToFacebook(true); - } -} - -bool LLFacebookStatusPanel::onFacebookConnectStateChange(const LLSD& data) -{ - switch (data.get("enum").asInteger()) - { - case LLFacebookConnect::FB_CONNECTED: - sendStatus(); - break; - - case LLFacebookConnect::FB_POSTED: - LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLFacebookStatusPanel"); - clearAndClose(); - break; - } - - return false; -} - -bool LLFacebookStatusPanel::onFacebookConnectAccountStateChange(const LLSD& data) -{ - if (LLFacebookConnect::instance().isConnected()) - { - //In process of disconnecting so leave the layout as is - if (data.get("enum").asInteger() != LLFacebookConnect::FB_DISCONNECTING) - { - showConnectedLayout(); - } - } - else - { - showDisconnectedLayout(); - } - - return false; -} - -void LLFacebookStatusPanel::sendStatus() -{ - std::string message = mMessageTextEditor->getValue().asString(); - if (!message.empty()) - { - LLFacebookConnect::instance().updateStatus(message); - } -} - -void LLFacebookStatusPanel::onVisibilityChange(BOOL visible) -{ - if (visible) - { - LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLFacebookAccountPanel"); - LLEventPumps::instance().obtain("FacebookConnectState").listen("LLFacebookAccountPanel", boost::bind(&LLFacebookStatusPanel::onFacebookConnectAccountStateChange, this, _1)); - - LLEventPumps::instance().obtain("FacebookConnectInfo").stopListening("LLFacebookAccountPanel"); - LLEventPumps::instance().obtain("FacebookConnectInfo").listen("LLFacebookAccountPanel", boost::bind(&LLFacebookStatusPanel::onFacebookConnectInfoChange, this)); - - //Connected - if (LLFacebookConnect::instance().isConnected()) - { - showConnectedLayout(); - } - //Check if connected (show disconnected layout in meantime) - else - { - showDisconnectedLayout(); - } - if ((LLFacebookConnect::instance().getConnectionState() == LLFacebookConnect::FB_NOT_CONNECTED) || - (LLFacebookConnect::instance().getConnectionState() == LLFacebookConnect::FB_CONNECTION_FAILED)) - { - LLFacebookConnect::instance().checkConnectionToFacebook(); - } - } - else - { - LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLFacebookAccountPanel"); - LLEventPumps::instance().obtain("FacebookConnectInfo").stopListening("LLFacebookAccountPanel"); - } -} - -bool LLFacebookStatusPanel::onFacebookConnectInfoChange() -{ - LLSD info = LLFacebookConnect::instance().getInfo(); - std::string clickable_name; - - //Strings of format [http://www.somewebsite.com Click Me] become clickable text - if (info.has("link") && info.has("name")) - { - clickable_name = "[" + info["link"].asString() + " " + info["name"].asString() + "]"; - } - - mAccountNameLabel->setText(clickable_name); - - return false; -} - -void LLFacebookStatusPanel::showConnectButton() -{ - if (!mConnectButton->getVisible()) - { - mConnectButton->setVisible(TRUE); - mDisconnectButton->setVisible(FALSE); - } -} - -void LLFacebookStatusPanel::hideConnectButton() -{ - if (mConnectButton->getVisible()) - { - mConnectButton->setVisible(FALSE); - mDisconnectButton->setVisible(TRUE); - } -} - -void LLFacebookStatusPanel::showDisconnectedLayout() -{ - mAccountCaptionLabel->setText(getString("facebook_disconnected")); - mAccountNameLabel->setText(std::string("")); - showConnectButton(); -} - -void LLFacebookStatusPanel::showConnectedLayout() -{ - LLFacebookConnect::instance().loadFacebookInfo(); - - mAccountCaptionLabel->setText(getString("facebook_connected")); - hideConnectButton(); -} - -void LLFacebookStatusPanel::onConnect() -{ - LLFacebookConnect::instance().checkConnectionToFacebook(true); -} - -void LLFacebookStatusPanel::onDisconnect() -{ - LLFacebookConnect::instance().disconnectFromFacebook(); -} - -void LLFacebookStatusPanel::clearAndClose() -{ - mMessageTextEditor->setValue(""); - - LLFloater* floater = getParentByType<LLFloater>(); - if (floater) - { - floater->closeFloater(); - } -} - -/////////////////////////// -//LLFacebookPhotoPanel/////// -/////////////////////////// - -LLFacebookPhotoPanel::LLFacebookPhotoPanel() : - mResolutionComboBox(NULL), - mRefreshBtn(NULL), - mBtnPreview(NULL), - mWorkingLabel(NULL), - mThumbnailPlaceholder(NULL), - mCaptionTextBox(NULL), - mPostButton(NULL), - mBigPreviewFloater(NULL), - mQuality(MAX_QUALITY) -{ - mCommitCallbackRegistrar.add("SocialSharing.SendPhoto", boost::bind(&LLFacebookPhotoPanel::onSend, this)); - mCommitCallbackRegistrar.add("SocialSharing.RefreshPhoto", boost::bind(&LLFacebookPhotoPanel::onClickNewSnapshot, this)); - mCommitCallbackRegistrar.add("SocialSharing.BigPreview", boost::bind(&LLFacebookPhotoPanel::onClickBigPreview, this)); -} - -LLFacebookPhotoPanel::~LLFacebookPhotoPanel() -{ - if (mPreviewHandle.get()) - { - mPreviewHandle.get()->die(); - } -} - -BOOL LLFacebookPhotoPanel::postBuild() -{ - setVisibleCallback(boost::bind(&LLFacebookPhotoPanel::onVisibilityChange, this, _2)); - - mResolutionComboBox = getChild<LLUICtrl>("resolution_combobox"); - mResolutionComboBox->setValue("[i1200,i630]"); // hardcoded defaults ftw! - mResolutionComboBox->setCommitCallback(boost::bind(&LLFacebookPhotoPanel::updateResolution, this, TRUE)); - mFilterComboBox = getChild<LLUICtrl>("filters_combobox"); - mFilterComboBox->setCommitCallback(boost::bind(&LLFacebookPhotoPanel::updateResolution, this, TRUE)); - mRefreshBtn = getChild<LLUICtrl>("new_snapshot_btn"); - mBtnPreview = getChild<LLButton>("big_preview_btn"); - mWorkingLabel = getChild<LLUICtrl>("working_lbl"); - mThumbnailPlaceholder = getChild<LLUICtrl>("thumbnail_placeholder"); - mCaptionTextBox = getChild<LLUICtrl>("photo_caption"); - mPostButton = getChild<LLUICtrl>("post_photo_btn"); - mCancelButton = getChild<LLUICtrl>("cancel_photo_btn"); - mBigPreviewFloater = dynamic_cast<LLFloaterBigPreview*>(LLFloaterReg::getInstance("big_preview")); - - // Update filter list - std::vector<std::string> filter_list = LLImageFiltersManager::getInstance()->getFiltersList(); - LLComboBox* filterbox = static_cast<LLComboBox *>(mFilterComboBox); - for (U32 i = 0; i < filter_list.size(); i++) - { - filterbox->add(filter_list[i]); - } - - return LLPanel::postBuild(); -} - -// virtual -S32 LLFacebookPhotoPanel::notify(const LLSD& info) -{ - if (info.has("snapshot-updating")) - { - // Disable the Post button and whatever else while the snapshot is not updated - // updateControls(); - return 1; - } - - if (info.has("snapshot-updated")) - { - // Enable the send/post/save buttons. - updateControls(); - - // The refresh button is initially hidden. We show it after the first update, - // i.e. after snapshot is taken - LLUICtrl * refresh_button = getRefreshBtn(); - if (!refresh_button->getVisible()) - { - refresh_button->setVisible(true); - } - return 1; - } - - return 0; -} - -void LLFacebookPhotoPanel::draw() -{ - LLSnapshotLivePreview * previewp = static_cast<LLSnapshotLivePreview *>(mPreviewHandle.get()); - - // Enable interaction only if no transaction with the service is on-going (prevent duplicated posts) - bool no_ongoing_connection = !(LLFacebookConnect::instance().isTransactionOngoing()); - mCancelButton->setEnabled(no_ongoing_connection); - mCaptionTextBox->setEnabled(no_ongoing_connection); - mResolutionComboBox->setEnabled(no_ongoing_connection); - mFilterComboBox->setEnabled(no_ongoing_connection); - mRefreshBtn->setEnabled(no_ongoing_connection); - mBtnPreview->setEnabled(no_ongoing_connection); - - // Reassign the preview floater if we have the focus and the preview exists - if (hasFocus() && isPreviewVisible()) - { - attachPreview(); - } - - // Toggle the button state as appropriate - bool preview_active = (isPreviewVisible() && mBigPreviewFloater->isFloaterOwner(getParentByType<LLFloater>())); - mBtnPreview->setToggleState(preview_active); - - // Display the thumbnail if one is available - if (previewp && previewp->getThumbnailImage()) - { - const LLRect& thumbnail_rect = mThumbnailPlaceholder->getRect(); - const S32 thumbnail_w = previewp->getThumbnailWidth(); - const S32 thumbnail_h = previewp->getThumbnailHeight(); - - // calc preview offset within the preview rect - const S32 local_offset_x = (thumbnail_rect.getWidth() - thumbnail_w) / 2; - const S32 local_offset_y = (thumbnail_rect.getHeight() - thumbnail_h) / 2; - S32 offset_x = thumbnail_rect.mLeft + local_offset_x; - S32 offset_y = thumbnail_rect.mBottom + local_offset_y; - - gGL.matrixMode(LLRender::MM_MODELVIEW); - // Apply floater transparency to the texture unless the floater is focused. - F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency(); - LLColor4 color = LLColor4::white; - gl_draw_scaled_image(offset_x, offset_y, - thumbnail_w, thumbnail_h, - previewp->getThumbnailImage(), color % alpha); - } - - // Update the visibility of the working (computing preview) label - mWorkingLabel->setVisible(!(previewp && previewp->getSnapshotUpToDate())); - - // Enable Post if we have a preview to send and no on going connection being processed - mPostButton->setEnabled(no_ongoing_connection && (previewp && previewp->getSnapshotUpToDate())); - - // Draw the rest of the panel on top of it - LLPanel::draw(); -} - -LLSnapshotLivePreview* LLFacebookPhotoPanel::getPreviewView() -{ - LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)mPreviewHandle.get(); - return previewp; -} - -void LLFacebookPhotoPanel::onVisibilityChange(BOOL visible) -{ - if (visible) - { - if (mPreviewHandle.get()) - { - LLSnapshotLivePreview* preview = getPreviewView(); - if (preview) - { - LL_DEBUGS() << "opened, updating snapshot" << LL_ENDL; - preview->updateSnapshot(TRUE); - } - } - else - { - LLRect full_screen_rect = getRootView()->getRect(); - LLSnapshotLivePreview::Params p; - p.rect(full_screen_rect); - LLSnapshotLivePreview* previewp = new LLSnapshotLivePreview(p); - mPreviewHandle = previewp->getHandle(); - mQuality = MAX_QUALITY; - - previewp->setContainer(this); - previewp->setSnapshotType(LLSnapshotModel::SNAPSHOT_WEB); - previewp->setSnapshotFormat(LLSnapshotModel::SNAPSHOT_FORMAT_JPEG); - previewp->setSnapshotQuality(mQuality, false); - previewp->setThumbnailSubsampled(TRUE); // We want the preview to reflect the *saved* image - previewp->setAllowRenderUI(FALSE); // We do not want the rendered UI in our snapshots - previewp->setAllowFullScreenPreview(FALSE); // No full screen preview in SL Share mode - previewp->setThumbnailPlaceholderRect(mThumbnailPlaceholder->getRect()); - - updateControls(); - } - } -} - -void LLFacebookPhotoPanel::onClickNewSnapshot() -{ - LLSnapshotLivePreview* previewp = getPreviewView(); - if (previewp) - { - previewp->updateSnapshot(TRUE); - } -} - -void LLFacebookPhotoPanel::onClickBigPreview() -{ - // Toggle the preview - if (isPreviewVisible()) - { - LLFloaterReg::hideInstance("big_preview"); - } - else - { - attachPreview(); - LLFloaterReg::showInstance("big_preview"); - } -} - -bool LLFacebookPhotoPanel::isPreviewVisible() -{ - return (mBigPreviewFloater && mBigPreviewFloater->getVisible()); -} - -void LLFacebookPhotoPanel::attachPreview() -{ - if (mBigPreviewFloater) - { - LLSnapshotLivePreview* previewp = getPreviewView(); - mBigPreviewFloater->setPreview(previewp); - mBigPreviewFloater->setFloaterOwner(getParentByType<LLFloater>()); - } -} - -void LLFacebookPhotoPanel::onSend() -{ - LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLFacebookPhotoPanel"); // just in case it is already listening - LLEventPumps::instance().obtain("FacebookConnectState").listen("LLFacebookPhotoPanel", boost::bind(&LLFacebookPhotoPanel::onFacebookConnectStateChange, this, _1)); - - // Connect to Facebook if necessary and then post - if (LLFacebookConnect::instance().isConnected()) - { - sendPhoto(); - } - else - { - LLFacebookConnect::instance().checkConnectionToFacebook(true); - } -} - -bool LLFacebookPhotoPanel::onFacebookConnectStateChange(const LLSD& data) -{ - switch (data.get("enum").asInteger()) - { - case LLFacebookConnect::FB_CONNECTED: - sendPhoto(); - break; - - case LLFacebookConnect::FB_POSTED: - LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLFacebookPhotoPanel"); - clearAndClose(); - break; - } - - return false; -} - -void LLFacebookPhotoPanel::sendPhoto() -{ - // Get the caption - std::string caption = mCaptionTextBox->getValue().asString(); - - // Get the image - LLSnapshotLivePreview* previewp = getPreviewView(); - - // Post to Facebook - LLFacebookConnect::instance().sharePhoto(previewp->getFormattedImage(), caption); - - updateControls(); -} - -void LLFacebookPhotoPanel::clearAndClose() -{ - mCaptionTextBox->setValue(""); - - LLFloater* floater = getParentByType<LLFloater>(); - if (floater) - { - floater->closeFloater(); - if (mBigPreviewFloater) - { - mBigPreviewFloater->closeOnFloaterOwnerClosing(floater); - } - } -} - -void LLFacebookPhotoPanel::updateControls() -{ - LLSnapshotLivePreview* previewp = getPreviewView(); - BOOL got_snap = previewp && previewp->getSnapshotUpToDate(); - - // *TODO: Separate maximum size for Web images from postcards - LL_DEBUGS() << "Is snapshot up-to-date? " << got_snap << LL_ENDL; - - updateResolution(FALSE); -} - -void LLFacebookPhotoPanel::updateResolution(BOOL do_update) -{ - LLComboBox* combobox = static_cast<LLComboBox *>(mResolutionComboBox); - LLComboBox* filterbox = static_cast<LLComboBox *>(mFilterComboBox); - - std::string sdstring = combobox->getSelectedValue(); - LLSD sdres; - std::stringstream sstream(sdstring); - LLSDSerialize::fromNotation(sdres, sstream, sdstring.size()); - - S32 width = sdres[0]; - S32 height = sdres[1]; - - // Note : index 0 of the filter drop down is assumed to be "No filter" in whichever locale - std::string filter_name = (filterbox->getCurrentIndex() ? filterbox->getSimple() : ""); - - LLSnapshotLivePreview * previewp = static_cast<LLSnapshotLivePreview *>(mPreviewHandle.get()); - if (previewp && combobox->getCurrentIndex() >= 0) - { - S32 original_width = 0, original_height = 0; - previewp->getSize(original_width, original_height); - - if (width == 0 || height == 0) - { - // take resolution from current window size - LL_DEBUGS() << "Setting preview res from window: " << gViewerWindow->getWindowWidthRaw() << "x" << gViewerWindow->getWindowHeightRaw() << LL_ENDL; - previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw()); - } - else - { - // use the resolution from the selected pre-canned drop-down choice - LL_DEBUGS() << "Setting preview res selected from combo: " << width << "x" << height << LL_ENDL; - previewp->setSize(width, height); - } - - checkAspectRatio(width); - - previewp->getSize(width, height); - - // Recompute quality setting - mQuality = compute_jpeg_quality(width, height); - previewp->setSnapshotQuality(mQuality, false); - - if (original_width != width || original_height != height) - { - previewp->setSize(width, height); - if (do_update) - { - previewp->updateSnapshot(TRUE); - updateControls(); - } - } - // Get the old filter, compare to the current one "filter_name" and set if changed - std::string original_filter = previewp->getFilter(); - if (original_filter != filter_name) - { - previewp->setFilter(filter_name); - if (do_update) - { - previewp->updateSnapshot(FALSE, TRUE); - updateControls(); - } - } - } -} - -void LLFacebookPhotoPanel::checkAspectRatio(S32 index) -{ - LLSnapshotLivePreview *previewp = getPreviewView(); - - BOOL keep_aspect = FALSE; - - if (0 == index) // current window size - { - keep_aspect = TRUE; - } - else // predefined resolution - { - keep_aspect = FALSE; - } - - if (previewp) - { - previewp->mKeepAspectRatio = keep_aspect; - } -} - -LLUICtrl* LLFacebookPhotoPanel::getRefreshBtn() -{ - return mRefreshBtn; -} - -//////////////////////// -//LLFacebookCheckinPanel// -//////////////////////// - -LLFacebookCheckinPanel::LLFacebookCheckinPanel() : - mMapUrl(""), - mReloadingMapTexture(false) -{ - mCommitCallbackRegistrar.add("SocialSharing.SendCheckin", boost::bind(&LLFacebookCheckinPanel::onSend, this)); -} - -BOOL LLFacebookCheckinPanel::postBuild() -{ - // Keep pointers to widgets so we don't traverse the UI hierarchy too often - mPostButton = getChild<LLUICtrl>("post_place_btn"); - mCancelButton = getChild<LLUICtrl>("cancel_place_btn"); - mMessageTextEditor = getChild<LLUICtrl>("place_caption"); - mMapLoadingIndicator = getChild<LLUICtrl>("map_loading_indicator"); - mMapPlaceholder = getChild<LLIconCtrl>("map_placeholder"); - mMapDefault = getChild<LLIconCtrl>("map_default"); - mMapCheckBox = getChild<LLCheckBoxCtrl>("add_place_view_cb"); - - return LLPanel::postBuild(); -} - -void LLFacebookCheckinPanel::draw() -{ - bool no_ongoing_connection = !(LLFacebookConnect::instance().isTransactionOngoing()); - mPostButton->setEnabled(no_ongoing_connection); - mCancelButton->setEnabled(no_ongoing_connection); - mMessageTextEditor->setEnabled(no_ongoing_connection); - mMapCheckBox->setEnabled(no_ongoing_connection); - - std::string map_url = get_map_url(); - // Did we change location? - if (map_url != mMapUrl) - { - mMapUrl = map_url; - // Load the map tile - mMapTexture = LLViewerTextureManager::getFetchedTextureFromUrl(mMapUrl, FTT_MAP_TILE, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); - mMapTexture->setBoostLevel(LLGLTexture::BOOST_MAP); - mReloadingMapTexture = true; - // In the meantime, put the "loading" indicator on, hide the tile map and disable the checkbox - mMapLoadingIndicator->setVisible(true); - mMapPlaceholder->setVisible(false); - } - // Are we done loading the map tile? - if (mReloadingMapTexture && mMapTexture->isFullyLoaded()) - { - // Don't do it again next time around - mReloadingMapTexture = false; - // Convert the map texture to the appropriate image object - LLPointer<LLUIImage> ui_image = new LLUIImage(mMapUrl, mMapTexture); - // Load the map widget with the correct map tile image - mMapPlaceholder->setImage(ui_image); - // Now hide the loading indicator, bring the tile in view and reenable the checkbox with its previous value - mMapLoadingIndicator->setVisible(false); - mMapPlaceholder->setVisible(true); - } - // Show the default icon if that's the checkbox value (the real one...) - // This will hide/show the loading indicator and/or tile underneath - mMapDefault->setVisible(!(mMapCheckBox->get())); - - LLPanel::draw(); -} - -void LLFacebookCheckinPanel::onSend() -{ - LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLFacebookCheckinPanel"); // just in case it is already listening - LLEventPumps::instance().obtain("FacebookConnectState").listen("LLFacebookCheckinPanel", boost::bind(&LLFacebookCheckinPanel::onFacebookConnectStateChange, this, _1)); - - // Connect to Facebook if necessary and then post - if (LLFacebookConnect::instance().isConnected()) - { - sendCheckin(); - } - else - { - LLFacebookConnect::instance().checkConnectionToFacebook(true); - } -} - -bool LLFacebookCheckinPanel::onFacebookConnectStateChange(const LLSD& data) -{ - switch (data.get("enum").asInteger()) - { - case LLFacebookConnect::FB_CONNECTED: - sendCheckin(); - break; - - case LLFacebookConnect::FB_POSTED: - LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLFacebookCheckinPanel"); - clearAndClose(); - break; - } - - return false; -} - -void LLFacebookCheckinPanel::sendCheckin() -{ - // Get the location SLURL - LLSLURL slurl; - LLAgentUI::buildSLURL(slurl); - std::string slurl_string = slurl.getSLURLString(); - - // Use a valid http:// URL if the scheme is secondlife:// - LLURI slurl_uri(slurl_string); - if (slurl_uri.scheme() == LLSLURL::SLURL_SECONDLIFE_SCHEME) - { - slurl_string = DEFAULT_CHECKIN_LOCATION_URL; - } - - // Add query parameters so Google Analytics can track incoming clicks! - slurl_string += DEFAULT_CHECKIN_QUERY_PARAMETERS; - - // Get the region name - std::string region_name(""); - LLViewerRegion *regionp = gAgent.getRegion(); - if (regionp) - { - region_name = regionp->getName(); - } - - // Get the region description - std::string description; - LLAgentUI::buildLocationString(description, LLAgentUI::LOCATION_FORMAT_NORMAL_COORDS, gAgent.getPositionAgent()); - - // Optionally add the region map view - bool add_map_view = mMapCheckBox->getValue().asBoolean(); - std::string map_url = (add_map_view ? get_map_url() : DEFAULT_CHECKIN_ICON_URL); - - // Get the caption - std::string caption = mMessageTextEditor->getValue().asString(); - - // Post to Facebook - LLFacebookConnect::instance().postCheckin(slurl_string, region_name, description, map_url, caption); -} - -void LLFacebookCheckinPanel::clearAndClose() -{ - mMessageTextEditor->setValue(""); - - LLFloater* floater = getParentByType<LLFloater>(); - if (floater) - { - floater->closeFloater(); - } -} - -/////////////////////////// -//LLFacebookFriendsPanel////// -/////////////////////////// - -LLFacebookFriendsPanel::LLFacebookFriendsPanel() : - mFriendsStatusCaption(NULL), - mSecondLifeFriends(NULL), - mSuggestedFriends(NULL) -{ -} - -LLFacebookFriendsPanel::~LLFacebookFriendsPanel() -{ - LLAvatarTracker::instance().removeObserver(this); -} - -BOOL LLFacebookFriendsPanel::postBuild() -{ - mFriendsStatusCaption = getChild<LLTextBox>("facebook_friends_status"); - - mSecondLifeFriends = getChild<LLAvatarList>("second_life_friends"); - mSecondLifeFriends->setContextMenu(&LLPanelPeopleMenus::gPeopleContextMenu); - - mSuggestedFriends = getChild<LLAvatarList>("suggested_friends"); - mSuggestedFriends->setContextMenu(&LLPanelPeopleMenus::gSuggestedFriendsContextMenu); - - setVisibleCallback(boost::bind(&LLFacebookFriendsPanel::updateFacebookList, this, _2)); - - LLAvatarTracker::instance().addObserver(this); - - return LLPanel::postBuild(); -} - -bool LLFacebookFriendsPanel::updateSuggestedFriendList() -{ - const LLAvatarTracker& av_tracker = LLAvatarTracker::instance(); - uuid_vec_t& second_life_friends = mSecondLifeFriends->getIDs(); - second_life_friends.clear(); - uuid_vec_t& suggested_friends = mSuggestedFriends->getIDs(); - suggested_friends.clear(); - - //Add suggested friends - LLSD friends = LLFacebookConnect::instance().getContent(); - for (LLSD::array_const_iterator i = friends.beginArray(); i != friends.endArray(); ++i) - { - LLUUID agent_id = (*i).asUUID(); - if (agent_id.notNull()) - { - bool second_life_buddy = av_tracker.isBuddy(agent_id); - if (second_life_buddy) - { - second_life_friends.push_back(agent_id); - } - else - { - //FB+SL but not SL friend - suggested_friends.push_back(agent_id); - } - } - } - - //Force a refresh when there aren't any filter matches (prevent displaying content that shouldn't display) - mSecondLifeFriends->setDirty(true, !mSecondLifeFriends->filterHasMatches()); - mSuggestedFriends->setDirty(true, !mSuggestedFriends->filterHasMatches()); - showFriendsAccordionsIfNeeded(); - - return false; -} - -void LLFacebookFriendsPanel::showFriendsAccordionsIfNeeded() -{ - // Show / hide the status text : needs to be done *before* showing / hidding the accordions - if (!mSecondLifeFriends->filterHasMatches() && !mSuggestedFriends->filterHasMatches()) - { - // Show some explanation text if the lists are empty... - mFriendsStatusCaption->setVisible(true); - if (LLFacebookConnect::instance().isConnected()) - { - //...you're connected to FB but have no friends :( - mFriendsStatusCaption->setText(getString("facebook_friends_empty")); - } - else - { - //...you're not connected to FB - mFriendsStatusCaption->setText(getString("facebook_friends_no_connected")); - } - // Hide the lists - getChild<LLAccordionCtrl>("friends_accordion")->setVisible(false); - getChild<LLAccordionCtrlTab>("tab_second_life_friends")->setVisible(false); - getChild<LLAccordionCtrlTab>("tab_suggested_friends")->setVisible(false); - } - else - { - // We have something in the lists, hide the explanatory text - mFriendsStatusCaption->setVisible(false); - - // Show the lists - LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion"); - accordion->setVisible(true); - - // Expand and show accordions if needed, else - hide them - getChild<LLAccordionCtrlTab>("tab_second_life_friends")->setVisible(mSecondLifeFriends->filterHasMatches()); - getChild<LLAccordionCtrlTab>("tab_suggested_friends")->setVisible(mSuggestedFriends->filterHasMatches()); - - // Rearrange accordions - accordion->arrange(); - } -} - -void LLFacebookFriendsPanel::changed(U32 mask) -{ - if (mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE)) - { - LLFacebookConnect::instance().loadFacebookFriends(); - updateFacebookList(true); - } -} - - -void LLFacebookFriendsPanel::updateFacebookList(bool visible) -{ - if (visible) - { - // We want this to be called to fetch the friends list once a connection is established - LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLFacebookFriendsPanel"); - LLEventPumps::instance().obtain("FacebookConnectState").listen("LLFacebookFriendsPanel", boost::bind(&LLFacebookFriendsPanel::onConnectedToFacebook, this, _1)); - - // We then want this to be called to update the displayed lists once the list of friends is received - LLEventPumps::instance().obtain("FacebookConnectContent").stopListening("LLFacebookFriendsPanel"); // just in case it is already listening - LLEventPumps::instance().obtain("FacebookConnectContent").listen("LLFacebookFriendsPanel", boost::bind(&LLFacebookFriendsPanel::updateSuggestedFriendList, this)); - - // Try to connect to Facebook - if ((LLFacebookConnect::instance().getConnectionState() == LLFacebookConnect::FB_NOT_CONNECTED) || - (LLFacebookConnect::instance().getConnectionState() == LLFacebookConnect::FB_CONNECTION_FAILED)) - { - LLFacebookConnect::instance().checkConnectionToFacebook(); - } - // Loads FB friends - if (LLFacebookConnect::instance().isConnected()) - { - LLFacebookConnect::instance().loadFacebookFriends(); - } - // Sort the FB friends and update the lists - updateSuggestedFriendList(); - } -} - -bool LLFacebookFriendsPanel::onConnectedToFacebook(const LLSD& data) -{ - LLSD::Integer connection_state = data.get("enum").asInteger(); - - if (connection_state == LLFacebookConnect::FB_CONNECTED) - { - LLFacebookConnect::instance().loadFacebookFriends(); - } - else if (connection_state == LLFacebookConnect::FB_NOT_CONNECTED) - { - updateSuggestedFriendList(); - } - - return false; -} - -//////////////////////// -//LLFloaterFacebook/////// -//////////////////////// - -LLFloaterFacebook::LLFloaterFacebook(const LLSD& key) : LLFloater(key), - mFacebookPhotoPanel(NULL), - mStatusErrorText(NULL), - mStatusLoadingText(NULL), - mStatusLoadingIndicator(NULL) -{ - mCommitCallbackRegistrar.add("SocialSharing.Cancel", boost::bind(&LLFloaterFacebook::onCancel, this)); -} - -void LLFloaterFacebook::onClose(bool app_quitting) -{ - LLFloaterBigPreview* big_preview_floater = dynamic_cast<LLFloaterBigPreview*>(LLFloaterReg::getInstance("big_preview")); - if (big_preview_floater) - { - big_preview_floater->closeOnFloaterOwnerClosing(this); - } - LLFloater::onClose(app_quitting); -} - -void LLFloaterFacebook::onCancel() -{ - LLFloaterBigPreview* big_preview_floater = dynamic_cast<LLFloaterBigPreview*>(LLFloaterReg::getInstance("big_preview")); - if (big_preview_floater) - { - big_preview_floater->closeOnFloaterOwnerClosing(this); - } - closeFloater(); -} - -BOOL LLFloaterFacebook::postBuild() -{ - // Keep tab of the Photo Panel - mFacebookPhotoPanel = static_cast<LLFacebookPhotoPanel*>(getChild<LLUICtrl>("panel_facebook_photo")); - // Connection status widgets - mStatusErrorText = getChild<LLTextBox>("connection_error_text"); - mStatusLoadingText = getChild<LLTextBox>("connection_loading_text"); - mStatusLoadingIndicator = getChild<LLUICtrl>("connection_loading_indicator"); - return LLFloater::postBuild(); -} - -void LLFloaterFacebook::showPhotoPanel() -{ - LLTabContainer* parent = dynamic_cast<LLTabContainer*>(mFacebookPhotoPanel->getParent()); - if (!parent) - { - LL_WARNS() << "Cannot find panel container" << LL_ENDL; - return; - } - - parent->selectTabPanel(mFacebookPhotoPanel); -} - -void LLFloaterFacebook::draw() -{ - if (mStatusErrorText && mStatusLoadingText && mStatusLoadingIndicator) - { - mStatusErrorText->setVisible(false); - mStatusLoadingText->setVisible(false); - mStatusLoadingIndicator->setVisible(false); - LLFacebookConnect::EConnectionState connection_state = LLFacebookConnect::instance().getConnectionState(); - std::string status_text; - - switch (connection_state) - { - case LLFacebookConnect::FB_NOT_CONNECTED: - // No status displayed when first opening the panel and no connection done - case LLFacebookConnect::FB_CONNECTED: - // When successfully connected, no message is displayed - case LLFacebookConnect::FB_POSTED: - // No success message to show since we actually close the floater after successful posting completion - break; - case LLFacebookConnect::FB_CONNECTION_IN_PROGRESS: - // Connection loading indicator - mStatusLoadingText->setVisible(true); - status_text = LLTrans::getString("SocialFacebookConnecting"); - mStatusLoadingText->setValue(status_text); - mStatusLoadingIndicator->setVisible(true); - break; - case LLFacebookConnect::FB_POSTING: - // Posting indicator - mStatusLoadingText->setVisible(true); - status_text = LLTrans::getString("SocialFacebookPosting"); - mStatusLoadingText->setValue(status_text); - mStatusLoadingIndicator->setVisible(true); - break; - case LLFacebookConnect::FB_CONNECTION_FAILED: - // Error connecting to the service - mStatusErrorText->setVisible(true); - status_text = LLTrans::getString("SocialFacebookErrorConnecting"); - mStatusErrorText->setValue(status_text); - break; - case LLFacebookConnect::FB_POST_FAILED: - // Error posting to the service - mStatusErrorText->setVisible(true); - status_text = LLTrans::getString("SocialFacebookErrorPosting"); - mStatusErrorText->setValue(status_text); - break; - case LLFacebookConnect::FB_DISCONNECTING: - // Disconnecting loading indicator - mStatusLoadingText->setVisible(true); - status_text = LLTrans::getString("SocialFacebookDisconnecting"); - mStatusLoadingText->setValue(status_text); - mStatusLoadingIndicator->setVisible(true); - break; - case LLFacebookConnect::FB_DISCONNECT_FAILED: - // Error disconnecting from the service - mStatusErrorText->setVisible(true); - status_text = LLTrans::getString("SocialFacebookErrorDisconnecting"); - mStatusErrorText->setValue(status_text); - break; - } - } - LLFloater::draw(); -} - diff --git a/indra/newview/llfloaterfacebook.h b/indra/newview/llfloaterfacebook.h deleted file mode 100644 index a4ca666b200531bc21135d3a00a90ddeb01f980e..0000000000000000000000000000000000000000 --- a/indra/newview/llfloaterfacebook.h +++ /dev/null @@ -1,185 +0,0 @@ -/** -* @file llfloaterfacebook.h -* @brief Header file for llfloaterfacebook -* @author Gilbert@lindenlab.com -* -* $LicenseInfo:firstyear=2013&license=viewerlgpl$ -* Second Life Viewer Source Code -* Copyright (C) 2013, Linden Research, Inc. -* -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License as published by the Free Software Foundation; -* version 2.1 of the License only. -* -* This library is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -* Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this library; if not, write to the Free Software -* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -* -* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA -* $/LicenseInfo$ -*/ -#ifndef LL_LLFLOATERFACEBOOK_H -#define LL_LLFLOATERFACEBOOK_H - -#include "llcallingcard.h" -#include "llfloater.h" -#include "lltextbox.h" -#include "llviewertexture.h" - -class LLIconCtrl; -class LLCheckBoxCtrl; -class LLSnapshotLivePreview; -class LLAvatarList; -class LLFloaterBigPreview; - -class LLFacebookStatusPanel : public LLPanel -{ -public: - LLFacebookStatusPanel(); - BOOL postBuild(); - void draw(); - void onSend(); - bool onFacebookConnectStateChange(const LLSD& data); - bool onFacebookConnectAccountStateChange(const LLSD& data); - - void sendStatus(); - void clearAndClose(); - -private: - void onVisibilityChange(BOOL new_visibility); - bool onFacebookConnectInfoChange(); - void onConnect(); - void onUseAnotherAccount(); - void onDisconnect(); - - void showConnectButton(); - void hideConnectButton(); - void showDisconnectedLayout(); - void showConnectedLayout(); - - LLTextBox * mAccountCaptionLabel; - LLTextBox * mAccountNameLabel; - LLUICtrl * mPanelButtons; - LLUICtrl * mConnectButton; - LLUICtrl * mDisconnectButton; - LLUICtrl* mMessageTextEditor; - LLUICtrl* mPostButton; - LLUICtrl* mCancelButton; -}; - -class LLFacebookPhotoPanel : public LLPanel -{ -public: - LLFacebookPhotoPanel(); - ~LLFacebookPhotoPanel(); - - BOOL postBuild(); - void draw(); - - LLSnapshotLivePreview* getPreviewView(); - void onVisibilityChange(BOOL new_visibility); - void onClickBigPreview(); - void onClickNewSnapshot(); - void onSend(); - S32 notify(const LLSD& info); - bool onFacebookConnectStateChange(const LLSD& data); - - void sendPhoto(); - void clearAndClose(); - - void updateControls(); - void updateResolution(BOOL do_update); - void checkAspectRatio(S32 index); - LLUICtrl* getRefreshBtn(); - -private: - bool isPreviewVisible(); - void attachPreview(); - - LLHandle<LLView> mPreviewHandle; - - LLUICtrl * mResolutionComboBox; - LLUICtrl * mFilterComboBox; - LLUICtrl * mRefreshBtn; - LLUICtrl * mWorkingLabel; - LLUICtrl * mThumbnailPlaceholder; - LLUICtrl * mCaptionTextBox; - LLUICtrl * mPostButton; - LLUICtrl * mCancelButton; - LLButton * mBtnPreview; - - LLFloaterBigPreview * mBigPreviewFloater; - - S32 mQuality; // Compression quality -}; - -class LLFacebookCheckinPanel : public LLPanel -{ -public: - LLFacebookCheckinPanel(); - BOOL postBuild(); - void draw(); - void onSend(); - bool onFacebookConnectStateChange(const LLSD& data); - - void sendCheckin(); - void clearAndClose(); - -private: - std::string mMapUrl; - LLPointer<LLViewerFetchedTexture> mMapTexture; - LLUICtrl* mPostButton; - LLUICtrl* mCancelButton; - LLUICtrl* mMessageTextEditor; - LLUICtrl* mMapLoadingIndicator; - LLIconCtrl* mMapPlaceholder; - LLIconCtrl* mMapDefault; - LLCheckBoxCtrl* mMapCheckBox; - bool mReloadingMapTexture; -}; - -class LLFacebookFriendsPanel : public LLPanel, public LLFriendObserver -{ -public: - LLFacebookFriendsPanel(); - ~LLFacebookFriendsPanel(); - BOOL postBuild(); - virtual void changed(U32 mask); - -private: - bool updateSuggestedFriendList(); - void showFriendsAccordionsIfNeeded(); - void updateFacebookList(bool visible); - bool onConnectedToFacebook(const LLSD& data); - - LLTextBox * mFriendsStatusCaption; - LLAvatarList* mSecondLifeFriends; - LLAvatarList* mSuggestedFriends; -}; - -class LLFloaterFacebook : public LLFloater -{ -public: - LLFloaterFacebook(const LLSD& key); - BOOL postBuild(); - void draw(); - void onClose(bool app_quitting); - void onCancel(); - - void showPhotoPanel(); - -private: - LLFacebookPhotoPanel* mFacebookPhotoPanel; - LLTextBox* mStatusErrorText; - LLTextBox* mStatusLoadingText; - LLUICtrl* mStatusLoadingIndicator; -}; - -#endif // LL_LLFLOATERFACEBOOK_H - diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index 3cfa1133df2056cdfda3e4e60677e08f635a7707..30d05ae2875b3230055272d8ec851e413a352c46 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -269,6 +269,9 @@ BOOL LLFloaterIMContainer::postBuild() // When display name option change, we need to reload all participant names LLAvatarNameCache::addUseDisplayNamesCallback(boost::bind(&LLFloaterIMContainer::processParticipantsStyleUpdate, this)); + mParticipantRefreshTimer.setTimerExpirySec(0); + mParticipantRefreshTimer.start(); + return TRUE; } @@ -420,14 +423,66 @@ void LLFloaterIMContainer::processParticipantsStyleUpdate() void LLFloaterIMContainer::idle(void* user_data) { LLFloaterIMContainer* self = static_cast<LLFloaterIMContainer*>(user_data); - - // Update the distance to agent in the nearby chat session if required - // Note: it makes no sense of course to update the distance in other session - if (self->mConversationViewModel.getSorter().getSortOrderParticipants() == LLConversationFilter::SO_DISTANCE) - { - self->setNearbyDistances(); - } - self->mConversationsRoot->update(); + + if (!self->getVisible() || self->isMinimized()) + { + return; + } + self->idleUpdate(); +} + +void LLFloaterIMContainer::idleUpdate() +{ + if (mTabContainer->getTabCount() == 0) + { + // Do not close the container when every conversation is torn off because the user + // still needs the conversation list. Simply collapse the message pane in that case. + collapseMessagesPane(true); + } + + U32 sort_order = mConversationViewModel.getSorter().getSortOrderParticipants(); + + if (mParticipantRefreshTimer.hasExpired()) + { + const LLConversationItem *current_session = getCurSelectedViewModelItem(); + if (current_session) + { + // Update moderator options visibility + LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = current_session->getChildrenBegin(); + LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = current_session->getChildrenEnd(); + bool is_moderator = isGroupModerator(); + bool can_ban = haveAbilityToBan(); + while (current_participant_model != end_participant_model) + { + LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model); + participant_model->setModeratorOptionsVisible(is_moderator && participant_model->getUUID() != gAgentID); + participant_model->setGroupBanVisible(can_ban && participant_model->getUUID() != gAgentID); + + current_participant_model++; + } + // Update floater's title as required by the currently selected session or use the default title + LLFloaterIMSession * conversation_floaterp = LLFloaterIMSession::findInstance(current_session->getUUID()); + setTitle(conversation_floaterp && conversation_floaterp->needsTitleOverwrite() ? conversation_floaterp->getTitle() : mGeneralTitle); + } + + mParticipantRefreshTimer.setTimerExpirySec(1.0f); + } + + // Update the distance to agent in the nearby chat session if required + // Note: it makes no sense of course to update the distance in other session + if (sort_order == LLConversationFilter::SO_DISTANCE) + { + // almost real-time updates + setNearbyDistances(); //calls arrange all + } + mConversationsRoot->update(); //arranges, resizes, heavy + + // "Manually" resize of mConversationsPane: same as temporarity cancellation of the flag "auto_resize=false" for it + if (!mConversationsPane->isCollapsed() && mMessagesPane->isCollapsed()) + { + LLRect stack_rect = mConversationsStack->getRect(); + mConversationsPane->reshape(stack_rect.getWidth(), stack_rect.getHeight(), true); + } } bool LLFloaterIMContainer::onConversationModelEvent(const LLSD& event) @@ -526,39 +581,6 @@ bool LLFloaterIMContainer::onConversationModelEvent(const LLSD& event) void LLFloaterIMContainer::draw() { - if (mTabContainer->getTabCount() == 0) - { - // Do not close the container when every conversation is torn off because the user - // still needs the conversation list. Simply collapse the message pane in that case. - collapseMessagesPane(true); - } - - const LLConversationItem *current_session = getCurSelectedViewModelItem(); - if (current_session) - { - // Update moderator options visibility - LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = current_session->getChildrenBegin(); - LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = current_session->getChildrenEnd(); - while (current_participant_model != end_participant_model) - { - LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model); - participant_model->setModeratorOptionsVisible(isGroupModerator() && participant_model->getUUID() != gAgentID); - participant_model->setGroupBanVisible(haveAbilityToBan() && participant_model->getUUID() != gAgentID); - - current_participant_model++; - } - // Update floater's title as required by the currently selected session or use the default title - LLFloaterIMSession * conversation_floaterp = LLFloaterIMSession::findInstance(current_session->getUUID()); - setTitle(conversation_floaterp && conversation_floaterp->needsTitleOverwrite() ? conversation_floaterp->getTitle() : mGeneralTitle); - } - - // "Manually" resize of mConversationsPane: same as temporarity cancellation of the flag "auto_resize=false" for it - if (!mConversationsPane->isCollapsed() && mMessagesPane->isCollapsed()) - { - LLRect stack_rect = mConversationsStack->getRect(); - mConversationsPane->reshape(stack_rect.getWidth(), stack_rect.getHeight(), true); - } - LLFloater::draw(); } diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h index 90fc0c2bdd54bab62c0b2a56d5d73d1bd64d55a3..78b35721112e751970fc5668c9f9cc0faf0f404c 100644 --- a/indra/newview/llfloaterimcontainer.h +++ b/indra/newview/llfloaterimcontainer.h @@ -180,6 +180,8 @@ class LLFloaterIMContainer void openNearbyChat(); bool isParticipantListExpanded(); + void idleUpdate(); // for convenience (self) from static idle + LLButton* mExpandCollapseBtn; LLButton* mStubCollapseBtn; LLButton* mSpeakBtn; @@ -226,6 +228,8 @@ class LLFloaterIMContainer LLConversationViewModel mConversationViewModel; LLFolderView* mConversationsRoot; LLEventStream mConversationsEventStream; + + LLTimer mParticipantRefreshTimer; }; #endif // LL_LLFLOATERIMCONTAINER_H diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 88b3fb7b9681f7af464beabb007f05086decf15e..3098c6d11831c941fd2d769dadd3cb55df5b462a 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -46,6 +46,7 @@ #include "llfloaterreg.h" #include "llfloateravatarpicker.h" #include "llfloaterauction.h" +#include "llfloaterbanduration.h" #include "llfloatergroups.h" #include "llfloaterscriptlimits.h" #include "llavataractions.h" @@ -415,6 +416,7 @@ BOOL LLPanelLandGeneral::postBuild() mTextSalePending = getChild<LLTextBox>("SalePending"); mTextOwnerLabel = getChild<LLTextBox>("Owner:"); mTextOwner = getChild<LLTextBox>("OwnerText"); + mTextOwner->setIsFriendCallback(LLAvatarActions::isFriend); mContentRating = getChild<LLTextBox>("ContentRatingText"); mLandType = getChild<LLTextBox>("LandTypeText"); @@ -1191,6 +1193,7 @@ BOOL LLPanelLandObjects::postBuild() mIconGroup = LLUIImageList::getInstance()->getUIImage("icon_group.tga", 0); mOwnerList = getChild<LLNameListCtrl>("owner list"); + mOwnerList->setIsFriendCallback(LLAvatarActions::isFriend); mOwnerList->sortByColumnIndex(3, FALSE); childSetCommitCallback("owner list", onCommitList, this); mOwnerList->setDoubleClickCallback(onDoubleClickOwner, this); @@ -1874,6 +1877,7 @@ LLPanelLandOptions::LLPanelLandOptions(LLParcelSelectionHandle& parcel) mLandingTypeCombo(NULL), mSnapshotCtrl(NULL), mLocationText(NULL), + mSeeAvatarsText(NULL), mSetBtn(NULL), mClearBtn(NULL), mMatureCtrl(NULL), @@ -1920,6 +1924,14 @@ BOOL LLPanelLandOptions::postBuild() mSeeAvatarsCtrl = getChild<LLCheckBoxCtrl>( "SeeAvatarsCheck"); childSetCommitCallback("SeeAvatarsCheck", onCommitAny, this); + mSeeAvatarsText = getChild<LLTextBox>("allow_see_label"); + if (mSeeAvatarsText) + { + mSeeAvatarsText->setShowCursorHand(false); + mSeeAvatarsText->setSoundFlags(LLView::MOUSE_UP); + mSeeAvatarsText->setClickedCallback(boost::bind(&toggleSeeAvatars, this)); + } + mCheckShowDirectory = getChild<LLCheckBoxCtrl>( "ShowDirectoryCheck"); childSetCommitCallback("ShowDirectoryCheck", onCommitAny, this); @@ -2013,6 +2025,7 @@ void LLPanelLandOptions::refresh() mSeeAvatarsCtrl->set(TRUE); mSeeAvatarsCtrl->setEnabled(FALSE); + mSeeAvatarsText->setEnabled(FALSE); mLandingTypeCombo->setCurrentByIndex(0); mLandingTypeCombo->setEnabled(FALSE); @@ -2071,6 +2084,7 @@ void LLPanelLandOptions::refresh() mSeeAvatarsCtrl->set(parcel->getSeeAVs()); mSeeAvatarsCtrl->setEnabled(can_change_options && parcel->getHaveNewParcelLimitData()); + mSeeAvatarsText->setEnabled(can_change_options && parcel->getHaveNewParcelLimitData()); BOOL can_change_landing_point = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_SET_LANDING_POINT); @@ -2361,7 +2375,16 @@ void LLPanelLandOptions::onClickClear(void* userdata) self->refresh(); } - +void LLPanelLandOptions::toggleSeeAvatars(void* userdata) +{ + LLPanelLandOptions* self = (LLPanelLandOptions*)userdata; + if (self) + { + self->getChild<LLCheckBoxCtrl>("SeeAvatarsCheck")->toggle(); + self->getChild<LLCheckBoxCtrl>("SeeAvatarsCheck")->setBtnFocus(); + self->onCommitAny(NULL, userdata); + } +} //--------------------------------------------------------------------------- // LLPanelLandAccess //--------------------------------------------------------------------------- @@ -2502,33 +2525,49 @@ void LLPanelLandAccess::refresh() cit != parcel->mBanList.end(); ++cit) { const LLAccessEntry& entry = (*cit).second; - std::string prefix; + std::string duration; if (entry.mTime != 0) { LLStringUtil::format_map_t args; S32 now = time(NULL); - S32 seconds = entry.mTime - now; + S32 seconds = entry.mTime - now; if (seconds < 0) seconds = 0; - prefix.assign(" ("); - if (seconds >= 120) + + if (seconds >= 7200) { - args["[MINUTES]"] = llformat("%d", (seconds/60)); - std::string buf = parent_floater->getString ("Minutes", args); - prefix.append(buf); + args["[HOURS]"] = llformat("%d", (seconds / 3600)); + duration = parent_floater->getString("Hours", args); + } + else if (seconds >= 3600) + { + duration = "1 " + parent_floater->getString("Hour"); + } + else if (seconds >= 120) + { + args["[MINUTES]"] = llformat("%d", (seconds / 60)); + duration = parent_floater->getString("Minutes", args); } else if (seconds >= 60) { - prefix.append("1 " + parent_floater->getString("Minute")); + duration = "1 " + parent_floater->getString("Minute"); } else { args["[SECONDS]"] = llformat("%d", seconds); - std::string buf = parent_floater->getString ("Seconds", args); - prefix.append(buf); + duration = parent_floater->getString("Seconds", args); } - prefix.append(" " + parent_floater->getString("Remaining") + ") "); } - mListBanned->addNameItem(entry.mID, ADD_DEFAULT, TRUE, "", prefix); + else + { + duration = parent_floater->getString("Always"); + } + LLSD item; + item["id"] = entry.mID; + LLSD& columns = item["columns"]; + columns[0]["column"] = "name"; // to be populated later + columns[1]["column"] = "duration"; + columns[1]["value"] = duration; + mListBanned->addElement(item); } mListBanned->sortByName(TRUE); } @@ -2880,7 +2919,7 @@ void LLPanelLandAccess::onClickAddBanned() LLView * button = findChild<LLButton>("add_banned"); LLFloater * root_floater = gFloaterView->getParentFloater(this); LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show( - boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1), FALSE, FALSE, FALSE, root_floater->getName(), button); + boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1), TRUE, FALSE, FALSE, root_floater->getName(), button); if (picker) { root_floater->addDependentFloater(picker); @@ -2890,23 +2929,41 @@ void LLPanelLandAccess::onClickAddBanned() // static void LLPanelLandAccess::callbackAvatarCBBanned(const uuid_vec_t& ids) { - if (!ids.empty()) + LLFloater * root_floater = gFloaterView->getParentFloater(this); + LLFloaterBanDuration* duration_floater = LLFloaterBanDuration::show( + boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned2, this, _1, _2), ids); + if (duration_floater) { - LLUUID id = ids[0]; - LLParcel* parcel = mParcel->getParcel(); - if (parcel && parcel->addToBanList(id, 0)) + root_floater->addDependentFloater(duration_floater); + } +} + +void LLPanelLandAccess::callbackAvatarCBBanned2(const uuid_vec_t& ids, S32 duration) +{ + LLParcel* parcel = mParcel->getParcel(); + if (!parcel) return; + + U32 lists_to_update = 0; + + for (uuid_vec_t::const_iterator it = ids.begin(); it < ids.end(); it++) + { + LLUUID id = *it; + if (parcel->addToBanList(id, duration)) { - U32 lists_to_update = AL_BAN; + lists_to_update |= AL_BAN; // agent was successfully added to ban list // but we also need to check access list to ensure that agent will not be in two lists simultaneously if (parcel->removeFromAccessList(id)) { lists_to_update |= AL_ACCESS; } - LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(lists_to_update); - refresh(); } } + if (lists_to_update > 0) + { + LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(lists_to_update); + refresh(); + } } // static diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h index 0540ddb88010a518f07ce68f1e6f26c07a44b1e7..0c49d78a20974f15b48db0a7ed8c61647acee935 100644 --- a/indra/newview/llfloaterland.h +++ b/indra/newview/llfloaterland.h @@ -327,6 +327,7 @@ class LLPanelLandOptions static void onCommitAny(LLUICtrl* ctrl, void *userdata); static void onClickSet(void* userdata); static void onClickClear(void* userdata); + static void toggleSeeAvatars(void* userdata); private: LLCheckBoxCtrl* mCheckEditObjects; @@ -345,6 +346,7 @@ class LLPanelLandOptions LLTextureCtrl* mSnapshotCtrl; LLTextBox* mLocationText; + LLTextBox* mSeeAvatarsText; LLButton* mSetBtn; LLButton* mClearBtn; @@ -378,6 +380,7 @@ class LLPanelLandAccess void onClickAddAccess(); void onClickAddBanned(); void callbackAvatarCBBanned(const uuid_vec_t& ids); + void callbackAvatarCBBanned2(const uuid_vec_t& ids, S32 duration); void callbackAvatarCBAccess(const uuid_vec_t& ids); protected: diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 268c646719eb166096f4f6013ce60ab9754d9ae6..cb58cfdd0aafb30acc5d229fc3de9a2e14c0fd0c 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -266,7 +266,7 @@ mCalculateBtn(NULL) sInstance = this; mLastMouseX = 0; mLastMouseY = 0; - mStatusLock = new LLMutex(NULL); + mStatusLock = new LLMutex(); mModelPreview = NULL; mLODMode[LLModel::LOD_HIGH] = 0; @@ -325,6 +325,8 @@ BOOL LLFloaterModelPreview::postBuild() childSetCommitCallback("import_scale", onImportScaleCommit, this); childSetCommitCallback("pelvis_offset", onPelvisOffsetCommit, this); + getChild<LLLineEditor>("description_form")->setKeystrokeCallback(boost::bind(&LLFloaterModelPreview::onDescriptionKeystroke, this, _1), NULL); + getChild<LLCheckBoxCtrl>("show_edges")->setCommitCallback(boost::bind(&LLFloaterModelPreview::onViewOptionChecked, this, _1)); getChild<LLCheckBoxCtrl>("show_physics")->setCommitCallback(boost::bind(&LLFloaterModelPreview::onViewOptionChecked, this, _1)); getChild<LLCheckBoxCtrl>("show_textures")->setCommitCallback(boost::bind(&LLFloaterModelPreview::onViewOptionChecked, this, _1)); @@ -520,6 +522,16 @@ void LLFloaterModelPreview::onClickCalculateBtn() mUploadBtn->setEnabled(false); } +void LLFloaterModelPreview::onDescriptionKeystroke(LLUICtrl* ctrl) +{ + // Workaround for SL-4186, server doesn't allow name changes after 'calculate' stage + LLLineEditor* input = static_cast<LLLineEditor*>(ctrl); + if (input->isDirty()) // dirty will be reset after commit + { + toggleCalculateButton(true); + } +} + //static void LLFloaterModelPreview::onImportScaleCommit(LLUICtrl*,void* userdata) { @@ -1208,7 +1220,7 @@ void LLFloaterModelPreview::onMouseCaptureLostModelPreview(LLMouseHandler* handl //----------------------------------------------------------------------------- LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp) -: LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE), LLMutex(NULL) +: LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE), LLMutex() , mLodsQuery() , mLodsWithParsingError() , mPelvisZOffset( 0.0f ) @@ -1418,8 +1430,6 @@ void LLModelPreview::rebuildUploadData() std::string requested_name = mFMP->getChild<LLUICtrl>("description_form")->getValue().asString(); - std::string metric = mFMP->getChild<LLUICtrl>("model_category_combo")->getValue().asString(); - LLSpinCtrl* scale_spinner = mFMP->getChild<LLSpinCtrl>("import_scale"); F32 scale = scale_spinner->getValue().asReal(); @@ -1460,7 +1470,6 @@ void LLModelPreview::rebuildUploadData() if (base_model && !requested_name.empty()) { base_model->mRequestedLabel = requested_name; - base_model->mMetric = metric; } for (int i = LLModel::NUM_LODS - 1; i >= LLModel::LOD_IMPOSTOR; i--) diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 7ec6a58ac76de31e44812a630f19edbc3b961307..edc90d1695176aa3859ff656e84daef8b9d97c5b 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -137,7 +137,9 @@ class LLFloaterModelPreview : public LLFloaterModelUploadBase friend class LLModelPreview; friend class LLMeshFilePicker; friend class LLPhysicsDecomp; - + + void onDescriptionKeystroke(LLUICtrl*); + static void onImportScaleCommit(LLUICtrl*, void*); static void onPelvisOffsetCommit(LLUICtrl*, void*); static void onUploadJointsCommit(LLUICtrl*,void*); diff --git a/indra/newview/llfloatermyscripts.cpp b/indra/newview/llfloatermyscripts.cpp new file mode 100644 index 0000000000000000000000000000000000000000..fa2de21a8f42de128a5a0bd13f4d2758fbbada55 --- /dev/null +++ b/indra/newview/llfloatermyscripts.cpp @@ -0,0 +1,294 @@ +/** + * @file llfloatermyscripts.cpp + * @brief LLFloaterMyScripts class implementation. + * + * $LicenseInfo:firstyear=2004&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2019, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llfloatermyscripts.h" + +#include "llagent.h" +#include "llcorehttputil.h" +#include "llcoros.h" +#include "lleventcoro.h" +#include "llfloaterreg.h" +#include "llscrolllistctrl.h" +#include "lltrans.h" +#include "llviewerregion.h" + +const S32 SIZE_OF_ONE_KB = 1024; + +LLFloaterMyScripts::LLFloaterMyScripts(const LLSD& seed) + : LLFloater(seed), + mGotAttachmentMemoryUsed(false), + mAttachmentMemoryMax(0), + mAttachmentMemoryUsed(0), + mGotAttachmentURLsUsed(false), + mAttachmentURLsMax(0), + mAttachmentURLsUsed(0) +{ +} + +BOOL LLFloaterMyScripts::postBuild() +{ + childSetAction("refresh_list_btn", onClickRefresh, this); + + std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestWaiting"); + getChild<LLUICtrl>("loading_text")->setValue(LLSD(msg_waiting)); + return requestAttachmentDetails(); +} + +BOOL LLFloaterMyScripts::requestAttachmentDetails() +{ + if (!gAgent.getRegion()) return FALSE; + + LLSD body; + std::string url = gAgent.getRegion()->getCapability("AttachmentResources"); + if (!url.empty()) + { + LLCoros::instance().launch("LLFloaterMyScripts::getAttachmentLimitsCoro", + boost::bind(&LLFloaterMyScripts::getAttachmentLimitsCoro, this, url)); + return TRUE; + } + else + { + return FALSE; + } +} + +void LLFloaterMyScripts::getAttachmentLimitsCoro(std::string url) +{ + LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); + LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t + httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getAttachmentLimitsCoro", httpPolicy)); + LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + + LLSD result = httpAdapter->getAndSuspend(httpRequest, url); + + LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; + LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); + + if (!status) + { + LL_WARNS() << "Unable to retrieve attachment limits." << LL_ENDL; + return; + } + + LLFloaterMyScripts* instance = LLFloaterReg::getTypedInstance<LLFloaterMyScripts>("my_scripts"); + + if (!instance) + { + LL_WARNS() << "Failed to get LLFloaterMyScripts instance" << LL_ENDL; + return; + } + + instance->getChild<LLUICtrl>("loading_text")->setValue(LLSD(std::string(""))); + + LLButton* btn = instance->getChild<LLButton>("refresh_list_btn"); + if (btn) + { + btn->setEnabled(true); + } + + result.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS); + instance->setAttachmentDetails(result); +} + + +void LLFloaterMyScripts::setAttachmentDetails(LLSD content) +{ + LLScrollListCtrl *list = getChild<LLScrollListCtrl>("scripts_list"); + + if(!list) + { + return; + } + + S32 number_attachments = content["attachments"].size(); + + for(int i = 0; i < number_attachments; i++) + { + std::string humanReadableLocation = ""; + if(content["attachments"][i].has("location")) + { + std::string actualLocation = content["attachments"][i]["location"]; + humanReadableLocation = LLTrans::getString(actualLocation.c_str()); + } + + S32 number_objects = content["attachments"][i]["objects"].size(); + for(int j = 0; j < number_objects; j++) + { + LLUUID task_id = content["attachments"][i]["objects"][j]["id"].asUUID(); + S32 size = 0; + if(content["attachments"][i]["objects"][j]["resources"].has("memory")) + { + size = content["attachments"][i]["objects"][j]["resources"]["memory"].asInteger() / SIZE_OF_ONE_KB; + } + S32 urls = 0; + if(content["attachments"][i]["objects"][j]["resources"].has("urls")) + { + urls = content["attachments"][i]["objects"][j]["resources"]["urls"].asInteger(); + } + std::string name = content["attachments"][i]["objects"][j]["name"].asString(); + + LLSD element; + + element["id"] = task_id; + element["columns"][0]["column"] = "size"; + element["columns"][0]["value"] = llformat("%d", size); + element["columns"][0]["font"] = "SANSSERIF"; + element["columns"][0]["halign"] = LLFontGL::RIGHT; + + element["columns"][1]["column"] = "urls"; + element["columns"][1]["value"] = llformat("%d", urls); + element["columns"][1]["font"] = "SANSSERIF"; + element["columns"][1]["halign"] = LLFontGL::RIGHT; + + element["columns"][2]["column"] = "name"; + element["columns"][2]["value"] = name; + element["columns"][2]["font"] = "SANSSERIF"; + + element["columns"][3]["column"] = "location"; + element["columns"][3]["value"] = humanReadableLocation; + element["columns"][3]["font"] = "SANSSERIF"; + + list->addElement(element); + } + } + + setAttachmentSummary(content); + + getChild<LLUICtrl>("loading_text")->setValue(LLSD(std::string(""))); + + LLButton* btn = getChild<LLButton>("refresh_list_btn"); + if(btn) + { + btn->setEnabled(true); + } +} + +void LLFloaterMyScripts::clearList() +{ + LLCtrlListInterface *list = childGetListInterface("scripts_list"); + + if (list) + { + list->operateOnAll(LLCtrlListInterface::OP_DELETE); + } + + std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestWaiting"); + getChild<LLUICtrl>("loading_text")->setValue(LLSD(msg_waiting)); +} + +void LLFloaterMyScripts::setAttachmentSummary(LLSD content) +{ + if(content["summary"]["used"][0]["type"].asString() == std::string("memory")) + { + mAttachmentMemoryUsed = content["summary"]["used"][0]["amount"].asInteger() / SIZE_OF_ONE_KB; + mAttachmentMemoryMax = content["summary"]["available"][0]["amount"].asInteger() / SIZE_OF_ONE_KB; + mGotAttachmentMemoryUsed = true; + } + else if(content["summary"]["used"][1]["type"].asString() == std::string("memory")) + { + mAttachmentMemoryUsed = content["summary"]["used"][1]["amount"].asInteger() / SIZE_OF_ONE_KB; + mAttachmentMemoryMax = content["summary"]["available"][1]["amount"].asInteger() / SIZE_OF_ONE_KB; + mGotAttachmentMemoryUsed = true; + } + else + { + LL_WARNS() << "attachment details don't contain memory summary info" << LL_ENDL; + return; + } + + if(content["summary"]["used"][0]["type"].asString() == std::string("urls")) + { + mAttachmentURLsUsed = content["summary"]["used"][0]["amount"].asInteger(); + mAttachmentURLsMax = content["summary"]["available"][0]["amount"].asInteger(); + mGotAttachmentURLsUsed = true; + } + else if(content["summary"]["used"][1]["type"].asString() == std::string("urls")) + { + mAttachmentURLsUsed = content["summary"]["used"][1]["amount"].asInteger(); + mAttachmentURLsMax = content["summary"]["available"][1]["amount"].asInteger(); + mGotAttachmentURLsUsed = true; + } + else + { + LL_WARNS() << "attachment details don't contain urls summary info" << LL_ENDL; + return; + } + + if((mAttachmentMemoryUsed >= 0) && (mAttachmentMemoryMax >= 0)) + { + LLStringUtil::format_map_t args_attachment_memory; + args_attachment_memory["[COUNT]"] = llformat ("%d", mAttachmentMemoryUsed); + std::string translate_message = "ScriptLimitsMemoryUsedSimple"; + + if (0 < mAttachmentMemoryMax) + { + S32 attachment_memory_available = mAttachmentMemoryMax - mAttachmentMemoryUsed; + + args_attachment_memory["[MAX]"] = llformat ("%d", mAttachmentMemoryMax); + args_attachment_memory["[AVAILABLE]"] = llformat ("%d", attachment_memory_available); + translate_message = "ScriptLimitsMemoryUsed"; + } + + getChild<LLUICtrl>("memory_used")->setValue(LLTrans::getString(translate_message, args_attachment_memory)); + } + + if((mAttachmentURLsUsed >= 0) && (mAttachmentURLsMax >= 0)) + { + S32 attachment_urls_available = mAttachmentURLsMax - mAttachmentURLsUsed; + + LLStringUtil::format_map_t args_attachment_urls; + args_attachment_urls["[COUNT]"] = llformat ("%d", mAttachmentURLsUsed); + args_attachment_urls["[MAX]"] = llformat ("%d", mAttachmentURLsMax); + args_attachment_urls["[AVAILABLE]"] = llformat ("%d", attachment_urls_available); + std::string msg_attachment_urls = LLTrans::getString("ScriptLimitsURLsUsed", args_attachment_urls); + getChild<LLUICtrl>("urls_used")->setValue(LLSD(msg_attachment_urls)); + } +} + +// static +void LLFloaterMyScripts::onClickRefresh(void* userdata) +{ + LLFloaterMyScripts* instance = LLFloaterReg::getTypedInstance<LLFloaterMyScripts>("my_scripts"); + if(instance) + { + LLButton* btn = instance->getChild<LLButton>("refresh_list_btn"); + + //To stop people from hammering the refesh button and accidentally dosing themselves - enough requests can crash the viewer! + //turn the button off, then turn it on when we get a response + if(btn) + { + btn->setEnabled(false); + } + instance->clearList(); + instance->requestAttachmentDetails(); + } + else + { + LL_WARNS() << "could not find LLFloaterMyScripts instance after refresh button clicked" << LL_ENDL; + } +} + diff --git a/indra/newview/llfloatermyscripts.h b/indra/newview/llfloatermyscripts.h new file mode 100644 index 0000000000000000000000000000000000000000..fe33ab90ae494efe0ac183b9000d822f4fe3a56b --- /dev/null +++ b/indra/newview/llfloatermyscripts.h @@ -0,0 +1,60 @@ +/** + * @file llfloatermyscripts.h + * @brief LLFloaterMyScripts class definition. + * + * $LicenseInfo:firstyear=2004&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2019, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLFLOATERMYSCRIPTS_H +#define LL_LLFLOATERMYSCRIPTS_H + +#include "llfloater.h" +#include "llpanel.h" + +class LLFloaterMyScripts : public LLFloater +{ +public: + LLFloaterMyScripts(const LLSD& seed); + + BOOL postBuild(); + void setAttachmentDetails(LLSD content); + void setAttachmentSummary(LLSD content); + BOOL requestAttachmentDetails(); + void clearList(); + +private: + void getAttachmentLimitsCoro(std::string url); + + bool mGotAttachmentMemoryUsed; + S32 mAttachmentMemoryMax; + S32 mAttachmentMemoryUsed; + + bool mGotAttachmentURLsUsed; + S32 mAttachmentURLsMax; + S32 mAttachmentURLsUsed; + +protected: + + static void onClickRefresh(void* userdata); +}; + +#endif diff --git a/indra/newview/llfloateroutfitsnapshot.cpp b/indra/newview/llfloateroutfitsnapshot.cpp index d80793f9e4286ad707ab79bfaa1e6ff1af0b43b4..bfcd1b8b472407029f11a919935cda29b250f76f 100644 --- a/indra/newview/llfloateroutfitsnapshot.cpp +++ b/indra/newview/llfloateroutfitsnapshot.cpp @@ -30,9 +30,7 @@ #include "llfloateroutfitsnapshot.h" #include "llagent.h" -#include "llfacebookconnect.h" #include "llfloaterreg.h" -#include "llfloaterfacebook.h" #include "llfloaterflickr.h" #include "llfloatertwitter.h" #include "llimagefiltersmanager.h" diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 3853ca1822ef661ba55a672de0c40fdad589d268..64961fc99ca2c34d28b2286337b1d0df57ab1ea8 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -117,6 +117,8 @@ #include "llfeaturemanager.h" #include "llviewertexturelist.h" +#include "llsearchableui.h" + const F32 BANDWIDTH_UPDATER_TIMEOUT = 0.5f; char const* const VISIBILITY_DEFAULT = "default"; char const* const VISIBILITY_HIDDEN = "hidden"; @@ -136,6 +138,25 @@ static const F32 MIN_ARC_LOG = log(MIN_ARC_LIMIT); static const F32 MAX_ARC_LOG = log(MAX_ARC_LIMIT); static const F32 ARC_LIMIT_MAP_SCALE = (MAX_ARC_LOG - MIN_ARC_LOG) / (MAX_INDIRECT_ARC_LIMIT - MIN_INDIRECT_ARC_LIMIT); +struct LabelDef : public LLInitParam::Block<LabelDef> +{ + Mandatory<std::string> name; + Mandatory<std::string> value; + + LabelDef() + : name("name"), + value("value") + {} +}; + +struct LabelTable : public LLInitParam::Block<LabelTable> +{ + Multiple<LabelDef> labels; + LabelTable() + : labels("label") + {} +}; + class LLVoiceSetKeyDialog : public LLModalDialog { public: @@ -393,6 +414,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) mCommitCallbackRegistrar.add("Pref.ClearLog", boost::bind(&LLConversationLog::onClearLog, &LLConversationLog::instance())); mCommitCallbackRegistrar.add("Pref.DeleteTranscripts", boost::bind(&LLFloaterPreference::onDeleteTranscripts, this)); + mCommitCallbackRegistrar.add("UpdateFilter", boost::bind(&LLFloaterPreference::onUpdateFilterTerm, this, false)); // <FS:ND/> Hook up for filtering } void LLFloaterPreference::processProperties( void* pData, EAvatarProcessorType type ) @@ -506,7 +528,33 @@ BOOL LLFloaterPreference::postBuild() LLSliderCtrl* fov_slider = getChild<LLSliderCtrl>("camera_fov"); fov_slider->setMinValue(LLViewerCamera::getInstance()->getMinView()); fov_slider->setMaxValue(LLViewerCamera::getInstance()->getMaxView()); - + + // Hook up and init for filtering + mFilterEdit = getChild<LLSearchEditor>("search_prefs_edit"); + mFilterEdit->setKeystrokeCallback(boost::bind(&LLFloaterPreference::onUpdateFilterTerm, this, false)); + + // Load and assign label for 'default language' + std::string user_filename = gDirUtilp->getExpandedFilename(LL_PATH_DEFAULT_SKIN, "default_languages.xml"); + std::map<std::string, std::string> labels; + if (loadFromFilename(user_filename, labels)) + { + std::string system_lang = gSavedSettings.getString("SystemLanguage"); + std::map<std::string, std::string>::iterator iter = labels.find(system_lang); + if (iter != labels.end()) + { + getChild<LLComboBox>("language_combobox")->add(iter->second, LLSD("default"), ADD_TOP, true); + } + else + { + LL_WARNS() << "Language \"" << system_lang << "\" is not in default_languages.xml" << LL_ENDL; + getChild<LLComboBox>("language_combobox")->add("System default", LLSD("default"), ADD_TOP, true); + } + } + else + { + LL_WARNS() << "Failed to load labels from " << user_filename << ". Using default." << LL_ENDL; + getChild<LLComboBox>("language_combobox")->add("System default", LLSD("default"), ADD_TOP, true); + } return TRUE; } @@ -786,6 +834,13 @@ void LLFloaterPreference::onOpen(const LLSD& key) save_btn->setEnabled(started); delete_btn->setEnabled(started); exceptions_btn->setEnabled(started); + + collectSearchableItems(); + if (!mFilterEdit->getText().empty()) + { + mFilterEdit->setText(LLStringExplicit("")); + onUpdateFilterTerm(true); + } } void LLFloaterPreference::onVertexShaderEnable() @@ -1966,6 +2021,45 @@ void LLFloaterPreference::updateMaxComplexity() getChild<LLTextBox>("IndirectMaxComplexityText")); } +bool LLFloaterPreference::loadFromFilename(const std::string& filename, std::map<std::string, std::string> &label_map) +{ + LLXMLNodePtr root; + + if (!LLXMLNode::parseFile(filename, root, NULL)) + { + LL_WARNS() << "Unable to parse file " << filename << LL_ENDL; + return false; + } + + if (!root->hasName("labels")) + { + LL_WARNS() << filename << " is not a valid definition file" << LL_ENDL; + return false; + } + + LabelTable params; + LLXUIParser parser; + parser.readXUI(root, params, filename); + + if (params.validateBlock()) + { + for (LLInitParam::ParamIterator<LabelDef>::const_iterator it = params.labels.begin(); + it != params.labels.end(); + ++it) + { + LabelDef label_entry = *it; + label_map[label_entry.name] = label_entry.value; + } + } + else + { + LL_WARNS() << filename << " failed to load" << LL_ENDL; + return false; + } + + return true; +} + void LLFloaterPreferenceGraphicsAdvanced::updateMaxComplexity() { // Called when the IndirectMaxComplexity control changes @@ -2329,6 +2423,7 @@ BOOL LLPanelPreference::postBuild() if (hasChild("mute_chb_label", TRUE)) { getChild<LLTextBox>("mute_chb_label")->setShowCursorHand(false); + getChild<LLTextBox>("mute_chb_label")->setSoundFlags(LLView::MOUSE_UP); getChild<LLTextBox>("mute_chb_label")->setClickedCallback(boost::bind(&toggleMuteWhenMinimized)); } @@ -2452,6 +2547,11 @@ void LLPanelPreference::toggleMuteWhenMinimized() { std::string mute("MuteWhenMinimized"); gSavedSettings.setBOOL(mute, !gSavedSettings.getBOOL(mute)); + LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences"); + if (instance) + { + instance->getChild<LLCheckBoxCtrl>("mute_when_minimized")->setBtnFocus(); + } } void LLPanelPreference::cancel() @@ -2600,6 +2700,11 @@ void LLPanelPreferenceGraphics::onPresetsListChange() { instance->saveSettings(); //make cancel work correctly after changing the preset } + else + { + std::string dummy; + instance->saveGraphicsPreset(dummy); + } } void LLPanelPreferenceGraphics::setPresetText() @@ -2977,3 +3082,109 @@ void LLFloaterPreferenceProxy::onChangeSocksSettings() } +void LLFloaterPreference::onUpdateFilterTerm(bool force) +{ + LLWString seachValue = utf8str_to_wstring( mFilterEdit->getValue() ); + LLWStringUtil::toLower( seachValue ); + + if( !mSearchData || (mSearchData->mLastFilter == seachValue && !force)) + return; + + mSearchData->mLastFilter = seachValue; + + if( !mSearchData->mRootTab ) + return; + + mSearchData->mRootTab->hightlightAndHide( seachValue ); + LLTabContainer *pRoot = getChild< LLTabContainer >( "pref core" ); + if( pRoot ) + pRoot->selectFirstTab(); +} + +void collectChildren( LLView const *aView, ll::prefs::PanelDataPtr aParentPanel, ll::prefs::TabContainerDataPtr aParentTabContainer ) +{ + if( !aView ) + return; + + llassert_always( aParentPanel || aParentTabContainer ); + + LLView::child_list_const_iter_t itr = aView->beginChild(); + LLView::child_list_const_iter_t itrEnd = aView->endChild(); + + while( itr != itrEnd ) + { + LLView *pView = *itr; + ll::prefs::PanelDataPtr pCurPanelData = aParentPanel; + ll::prefs::TabContainerDataPtr pCurTabContainer = aParentTabContainer; + if( !pView ) + continue; + LLPanel const *pPanel = dynamic_cast< LLPanel const *>( pView ); + LLTabContainer const *pTabContainer = dynamic_cast< LLTabContainer const *>( pView ); + ll::ui::SearchableControl const *pSCtrl = dynamic_cast< ll::ui::SearchableControl const *>( pView ); + + if( pTabContainer ) + { + pCurPanelData.reset(); + + pCurTabContainer = ll::prefs::TabContainerDataPtr( new ll::prefs::TabContainerData ); + pCurTabContainer->mTabContainer = const_cast< LLTabContainer *>( pTabContainer ); + pCurTabContainer->mLabel = pTabContainer->getLabel(); + pCurTabContainer->mPanel = 0; + + if( aParentPanel ) + aParentPanel->mChildPanel.push_back( pCurTabContainer ); + if( aParentTabContainer ) + aParentTabContainer->mChildPanel.push_back( pCurTabContainer ); + } + else if( pPanel ) + { + pCurTabContainer.reset(); + + pCurPanelData = ll::prefs::PanelDataPtr( new ll::prefs::PanelData ); + pCurPanelData->mPanel = pPanel; + pCurPanelData->mLabel = pPanel->getLabel(); + + llassert_always( aParentPanel || aParentTabContainer ); + + if( aParentTabContainer ) + aParentTabContainer->mChildPanel.push_back( pCurPanelData ); + else if( aParentPanel ) + aParentPanel->mChildPanel.push_back( pCurPanelData ); + } + else if( pSCtrl && pSCtrl->getSearchText().size() ) + { + ll::prefs::SearchableItemPtr item = ll::prefs::SearchableItemPtr( new ll::prefs::SearchableItem() ); + item->mView = pView; + item->mCtrl = pSCtrl; + + item->mLabel = utf8str_to_wstring( pSCtrl->getSearchText() ); + LLWStringUtil::toLower( item->mLabel ); + + llassert_always( aParentPanel || aParentTabContainer ); + + if( aParentPanel ) + aParentPanel->mChildren.push_back( item ); + if( aParentTabContainer ) + aParentTabContainer->mChildren.push_back( item ); + } + collectChildren( pView, pCurPanelData, pCurTabContainer ); + ++itr; + } +} + +void LLFloaterPreference::collectSearchableItems() +{ + mSearchData.reset( nullptr ); + LLTabContainer *pRoot = getChild< LLTabContainer >( "pref core" ); + if( mFilterEdit && pRoot ) + { + mSearchData.reset(new ll::prefs::SearchData() ); + + ll::prefs::TabContainerDataPtr pRootTabcontainer = ll::prefs::TabContainerDataPtr( new ll::prefs::TabContainerData ); + pRootTabcontainer->mTabContainer = pRoot; + pRootTabcontainer->mLabel = pRoot->getLabel(); + mSearchData->mRootTab = pRootTabcontainer; + + collectChildren( this, ll::prefs::PanelDataPtr(), pRootTabcontainer ); + } +} diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 4e51137df56783e2d0108218361c4a444bc3927c..1b8229ada6cc3e2b4148fab02ab2a40aa147788b 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -36,6 +36,7 @@ #include "llfloater.h" #include "llavatarpropertiesprocessor.h" #include "llconversationlog.h" +#include "llsearcheditor.h" class LLConversationLogObserver; class LLPanelPreference; @@ -47,6 +48,14 @@ class LLSliderCtrl; class LLSD; class LLTextBox; +namespace ll +{ + namespace prefs + { + struct SearchData; + } +} + typedef std::map<std::string, std::string> notifications_map; typedef enum @@ -189,6 +198,7 @@ class LLFloaterPreference : public LLFloater, public LLAvatarPropertiesObserver, void onDeleteTranscriptsResponse(const LLSD& notification, const LLSD& response); void updateDeleteTranscriptsButton(); void updateMaxComplexity(); + static bool loadFromFilename(const std::string& filename, std::map<std::string, std::string> &label_map); static std::string sSkin; notifications_map mNotificationOptions; @@ -205,6 +215,12 @@ class LLFloaterPreference : public LLFloater, public LLAvatarPropertiesObserver, LLAvatarData mAvatarProperties; std::string mSavedGraphicsPreset; LOG_CLASS(LLFloaterPreference); + + LLSearchEditor *mFilterEdit; + std::unique_ptr< ll::prefs::SearchData > mSearchData; + + void onUpdateFilterTerm( bool force = false ); + void collectSearchableItems(); }; class LLPanelPreference : public LLPanel diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index a0522c99c21f9325e20b4cf885b4d0e6e723a336..ec934a4732360c9687099e153e3f2fffde2953b0 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -51,6 +51,7 @@ #include "llfloateravatarpicker.h" #include "llbutton.h" #include "llcheckboxctrl.h" +#include "llclipboard.h" #include "llcombobox.h" #include "lldaycyclemanager.h" #include "llenvmanager.h" @@ -98,10 +99,13 @@ #include "llexperiencecache.h" #include "llpanelexperiences.h" #include "llcorehttputil.h" +#include "llavatarnamecache.h" const S32 TERRAIN_TEXTURE_COUNT = 4; const S32 CORNER_COUNT = 4; +const U32 MAX_LISTED_NAMES = 100; + #define TMP_DISABLE_WLES // STORM-1180 ///---------------------------------------------------------------------------- @@ -207,6 +211,11 @@ BOOL LLFloaterRegionInfo::postBuild() panel->buildFromFile("panel_region_estate.xml"); mTab->addTabPanel(LLTabContainer::TabPanelParams().panel(panel).select_tab(true)); + panel = new LLPanelEstateAccess; + mInfoPanels.push_back(panel); + panel->buildFromFile("panel_region_access.xml"); + mTab->addTabPanel(panel); + panel = new LLPanelEstateCovenant; mInfoPanels.push_back(panel); panel->buildFromFile("panel_region_covenant.xml"); @@ -269,6 +278,19 @@ void LLFloaterRegionInfo::onOpen(const LLSD& key) refreshFromRegion(gAgent.getRegion()); requestRegionInfo(); requestMeshRezInfo(); + + if (!mGodLevelChangeSlot.connected()) + { + mGodLevelChangeSlot = gAgent.registerGodLevelChanageListener(boost::bind(&LLFloaterRegionInfo::onGodLevelChange, this, _1)); + } +} + +void LLFloaterRegionInfo::onClose(bool app_quitting) +{ + if (mGodLevelChangeSlot.connected()) + { + mGodLevelChangeSlot.disconnect(); + } } // static @@ -280,6 +302,7 @@ void LLFloaterRegionInfo::requestRegionInfo() tab->getChild<LLPanel>("Debug")->setCtrlsEnabled(FALSE); tab->getChild<LLPanel>("Terrain")->setCtrlsEnabled(FALSE); tab->getChild<LLPanel>("Estate")->setCtrlsEnabled(FALSE); + tab->getChild<LLPanel>("Access")->setCtrlsEnabled(FALSE); // Must allow anyone to request the RegionInfo data // so non-owners/non-gods can see the values. @@ -307,8 +330,7 @@ void LLFloaterRegionInfo::processEstateOwnerRequest(LLMessageSystem* msg,void**) LLPanelEstateInfo::initDispatch(dispatch); } - LLTabContainer* tab = floater->getChild<LLTabContainer>("region_panels"); - LLPanelEstateInfo* panel = (LLPanelEstateInfo*)tab->getChild<LLPanel>("Estate"); + LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate(); // unpack the message std::string request; @@ -324,7 +346,10 @@ void LLFloaterRegionInfo::processEstateOwnerRequest(LLMessageSystem* msg,void**) //dispatch the message dispatch.dispatch(request, invoice, strings); - panel->updateControls(gAgent.getRegion()); + if (panel) + { + panel->updateControls(gAgent.getRegion()); + } } @@ -463,6 +488,16 @@ LLPanelEstateInfo* LLFloaterRegionInfo::getPanelEstate() return panel; } +// static +LLPanelEstateAccess* LLFloaterRegionInfo::getPanelAccess() +{ + LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info"); + if (!floater) return NULL; + LLTabContainer* tab = floater->getChild<LLTabContainer>("region_panels"); + LLPanelEstateAccess* panel = (LLPanelEstateAccess*)tab->getChild<LLPanel>("Access"); + return panel; +} + // static LLPanelEstateCovenant* LLFloaterRegionInfo::getPanelCovenant() { @@ -517,6 +552,7 @@ void LLFloaterRegionInfo::disableTabCtrls() tab->getChild<LLPanel>("Terrain")->setCtrlsEnabled(FALSE); tab->getChild<LLPanel>("panel_env_info")->setCtrlsEnabled(FALSE); tab->getChild<LLPanel>("Estate")->setCtrlsEnabled(FALSE); + tab->getChild<LLPanel>("Access")->setCtrlsEnabled(FALSE); } void LLFloaterRegionInfo::onTabSelected(const LLSD& param) @@ -567,6 +603,15 @@ void LLFloaterRegionInfo::disableTopButtons() getChildView("top_scripts_btn")->setEnabled(false); } +void LLFloaterRegionInfo::onGodLevelChange(U8 god_level) +{ + LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info"); + if (floater && floater->getVisible()) + { + refreshFromRegion(gAgent.getRegion()); + } +} + ///---------------------------------------------------------------------------- /// Local class implementation ///---------------------------------------------------------------------------- @@ -1522,11 +1567,7 @@ LLPanelEstateInfo::LLPanelEstateInfo() void LLPanelEstateInfo::initDispatch(LLDispatcher& dispatch) { std::string name; - -// name.assign("setowner"); -// static LLDispatchSetEstateOwner set_owner; -// dispatch.addHandler(name, &set_owner); - + name.assign("estateupdateinfo"); static LLDispatchEstateUpdateInfo estate_update_info; dispatch.addHandler(name, &estate_update_info); @@ -1535,7 +1576,6 @@ void LLPanelEstateInfo::initDispatch(LLDispatcher& dispatch) static LLDispatchSetEstateAccess set_access; dispatch.addHandler(name, &set_access); - name.assign("setexperience"); static LLDispatchSetEstateExperience set_experience; dispatch.addHandler(name, &set_experience); @@ -1543,124 +1583,6 @@ void LLPanelEstateInfo::initDispatch(LLDispatcher& dispatch) estate_dispatch_initialized = true; } -//--------------------------------------------------------------------------- -// Add/Remove estate access button callbacks -//--------------------------------------------------------------------------- -void LLPanelEstateInfo::onClickAddAllowedAgent() -{ - LLCtrlListInterface *list = childGetListInterface("allowed_avatar_name_list"); - if (!list) return; - if (list->getItemCount() >= ESTATE_MAX_ACCESS_IDS) - { - //args - - LLSD args; - args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); - LLNotificationsUtil::add("MaxAllowedAgentOnRegion", args); - return; - } - accessAddCore(ESTATE_ACCESS_ALLOWED_AGENT_ADD, "EstateAllowedAgentAdd"); -} - -void LLPanelEstateInfo::onClickRemoveAllowedAgent() -{ - accessRemoveCore(ESTATE_ACCESS_ALLOWED_AGENT_REMOVE, "EstateAllowedAgentRemove", "allowed_avatar_name_list"); -} - -void LLPanelEstateInfo::onClickAddAllowedGroup() -{ - LLCtrlListInterface *list = childGetListInterface("allowed_group_name_list"); - if (!list) return; - if (list->getItemCount() >= ESTATE_MAX_ACCESS_IDS) - { - LLSD args; - args["MAX_GROUPS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); - LLNotificationsUtil::add("MaxAllowedGroupsOnRegion", args); - return; - } - - LLNotification::Params params("ChangeLindenAccess"); - params.functor.function(boost::bind(&LLPanelEstateInfo::addAllowedGroup, this, _1, _2)); - if (isLindenEstate()) - { - LLNotifications::instance().add(params); - } - else - { - LLNotifications::instance().forceResponse(params, 0); - } -} - -bool LLPanelEstateInfo::addAllowedGroup(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - if (option != 0) return false; - - LLFloater* parent_floater = gFloaterView->getParentFloater(this); - - LLFloaterGroupPicker* widget = LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(gAgent.getID())); - if (widget) - { - widget->removeNoneOption(); - widget->setSelectGroupCallback(boost::bind(&LLPanelEstateInfo::addAllowedGroup2, this, _1)); - if (parent_floater) - { - LLRect new_rect = gFloaterView->findNeighboringPosition(parent_floater, widget); - widget->setOrigin(new_rect.mLeft, new_rect.mBottom); - parent_floater->addDependentFloater(widget); - } - } - - return false; -} - -void LLPanelEstateInfo::onClickRemoveAllowedGroup() -{ - accessRemoveCore(ESTATE_ACCESS_ALLOWED_GROUP_REMOVE, "EstateAllowedGroupRemove", "allowed_group_name_list"); -} - -void LLPanelEstateInfo::onClickAddBannedAgent() -{ - LLCtrlListInterface *list = childGetListInterface("banned_avatar_name_list"); - if (!list) return; - if (list->getItemCount() >= ESTATE_MAX_ACCESS_IDS) - { - LLSD args; - args["MAX_BANNED"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); - LLNotificationsUtil::add("MaxBannedAgentsOnRegion", args); - return; - } - accessAddCore(ESTATE_ACCESS_BANNED_AGENT_ADD, "EstateBannedAgentAdd"); -} - -void LLPanelEstateInfo::onClickRemoveBannedAgent() -{ - accessRemoveCore(ESTATE_ACCESS_BANNED_AGENT_REMOVE, "EstateBannedAgentRemove", "banned_avatar_name_list"); -} - -// static -void LLPanelEstateInfo::onClickAddEstateManager() -{ - LLCtrlListInterface *list = childGetListInterface("estate_manager_name_list"); - if (!list) return; - if (list->getItemCount() >= ESTATE_MAX_MANAGERS) - { // Tell user they can't add more managers - LLSD args; - args["MAX_MANAGER"] = llformat("%d",ESTATE_MAX_MANAGERS); - LLNotificationsUtil::add("MaxManagersOnRegion", args); - } - else - { // Go pick managers to add - accessAddCore(ESTATE_ACCESS_MANAGER_ADD, "EstateManagerAdd"); - } -} - -// static -void LLPanelEstateInfo::onClickRemoveEstateManager() -{ - accessRemoveCore(ESTATE_ACCESS_MANAGER_REMOVE, "EstateManagerRemove", "estate_manager_name_list"); -} - //--------------------------------------------------------------------------- // Kick from estate methods //--------------------------------------------------------------------------- @@ -1774,11 +1696,13 @@ struct LLEstateAccessChangeInfo LLSD sd; sd["name"] = mDialogName; sd["operation"] = (S32)mOperationFlag; - for (uuid_vec_t::const_iterator it = mAgentOrGroupIDs.begin(); - it != mAgentOrGroupIDs.end(); - ++it) + for (U32 i = 0; i < mAgentOrGroupIDs.size(); ++i) { - sd["allowed_ids"].append(*it); + sd["allowed_ids"].append(mAgentOrGroupIDs[i]); + if (mAgentNames.size() > i) + { + sd["allowed_names"].append(mAgentNames[i].asLLSD()); + } } return sd; } @@ -1786,2159 +1710,2532 @@ struct LLEstateAccessChangeInfo U32 mOperationFlag; // ESTATE_ACCESS_BANNED_AGENT_ADD, _REMOVE, etc. std::string mDialogName; uuid_vec_t mAgentOrGroupIDs; // List of agent IDs to apply to this change + std::vector<LLAvatarName> mAgentNames; // Optional list of the agent names for notifications }; -// Special case callback for groups, since it has different callback format than names -void LLPanelEstateInfo::addAllowedGroup2(LLUUID id) +// static +void LLPanelEstateInfo::updateEstateOwnerName(const std::string& name) { - LLSD payload; - payload["operation"] = (S32)ESTATE_ACCESS_ALLOWED_GROUP_ADD; - payload["dialog_name"] = "EstateAllowedGroupAdd"; - payload["allowed_ids"].append(id); - - LLSD args; - args["ALL_ESTATES"] = all_estates_text(); - - LLNotification::Params params("EstateAllowedGroupAdd"); - params.payload(payload) - .substitutions(args) - .functor.function(accessCoreConfirm); - if (isLindenEstate()) + LLPanelEstateInfo* panelp = LLFloaterRegionInfo::getPanelEstate(); + if (panelp) { - LLNotifications::instance().forceResponse(params, 0); + panelp->setOwnerName(name); } - else +} + +// static +void LLPanelEstateInfo::updateEstateName(const std::string& name) +{ + LLPanelEstateInfo* panelp = LLFloaterRegionInfo::getPanelEstate(); + if (panelp) { - LLNotifications::instance().add(params); + panelp->getChildRef<LLTextBox>("estate_name").setText(name); } } -// static -void LLPanelEstateInfo::accessAddCore(U32 operation_flag, const std::string& dialog_name) +void LLPanelEstateInfo::updateControls(LLViewerRegion* region) { - LLSD payload; - payload["operation"] = (S32)operation_flag; - payload["dialog_name"] = dialog_name; - // agent id filled in after avatar picker + BOOL god = gAgent.isGodlike(); + BOOL owner = (region && (region->getOwner() == gAgent.getID())); + BOOL manager = (region && region->isEstateManager()); + setCtrlsEnabled(god || owner || manager); + + getChildView("apply_btn")->setEnabled(FALSE); - LLNotification::Params params("ChangeLindenAccess"); - params.payload(payload) - .functor.function(accessAddCore2); + getChildView("message_estate_btn")->setEnabled(god || owner || manager); + getChildView("kick_user_from_estate_btn")->setEnabled(god || owner || manager); - if (isLindenEstate()) - { - LLNotifications::instance().add(params); - } - else - { - // same as clicking "OK" - LLNotifications::instance().forceResponse(params, 0); - } + refresh(); } -// static -bool LLPanelEstateInfo::accessAddCore2(const LLSD& notification, const LLSD& response) +bool LLPanelEstateInfo::refreshFromRegion(LLViewerRegion* region) { - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - if (option != 0) - { - // abort change - return false; - } + updateControls(region); + + // let the parent class handle the general data collection. + bool rv = LLPanelRegionInfo::refreshFromRegion(region); - LLEstateAccessChangeInfo* change_info = new LLEstateAccessChangeInfo(notification["payload"]); - //Get parent floater name - LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate(); - LLFloater* parent_floater = panel ? gFloaterView->getParentFloater(panel) : NULL; - const std::string& parent_floater_name = parent_floater ? parent_floater->getName() : ""; - - //Determine the button that triggered opening of the avatar picker - //(so that a shadow frustum from the button to the avatar picker can be created) - LLView * button = NULL; - switch(change_info->mOperationFlag) - { - case ESTATE_ACCESS_ALLOWED_AGENT_ADD: - button = panel->findChild<LLButton>("add_allowed_avatar_btn"); - break; - - case ESTATE_ACCESS_BANNED_AGENT_ADD: - button = panel->findChild<LLButton>("add_banned_avatar_btn"); - break; - - case ESTATE_ACCESS_MANAGER_ADD: - button = panel->findChild<LLButton>("add_estate_manager_btn"); - break; - } + // We want estate info. To make sure it works across region + // boundaries and multiple packets, we add a serial number to the + // integers and track against that on update. + strings_t strings; + //integers_t integers; + //LLFloaterRegionInfo::incrementSerial(); + LLFloaterRegionInfo::nextInvoice(); + LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); + //integers.push_back(LLFloaterRegionInfo::());::getPanelEstate(); - // avatar picker yes multi-select, yes close-on-select - LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::accessAddCore3, _1, (void*)change_info), - TRUE, TRUE, FALSE, parent_floater_name, button); + + sendEstateOwnerMessage(gMessageSystem, "getinfo", invoice, strings); - //Allows the closed parent floater to close the child floater (avatar picker) - if (child_floater) - { - parent_floater->addDependentFloater(child_floater); - } + refresh(); + + return rv; +} + +void LLPanelEstateInfo::updateChild(LLUICtrl* child_ctrl) +{ + // Ensure appropriate state of the management ui. + updateControls(gAgent.getRegion()); +} +bool LLPanelEstateInfo::estateUpdate(LLMessageSystem* msg) +{ + LL_INFOS() << "LLPanelEstateInfo::estateUpdate()" << LL_ENDL; return false; } -// static -void LLPanelEstateInfo::accessAddCore3(const uuid_vec_t& ids, void* data) + +BOOL LLPanelEstateInfo::postBuild() { - LLEstateAccessChangeInfo* change_info = (LLEstateAccessChangeInfo*)data; - if (!change_info) return; - if (ids.empty()) - { - // User didn't select a name. - delete change_info; - change_info = NULL; - return; - } - // User did select a name. - change_info->mAgentOrGroupIDs = ids; - // Can't put estate owner on ban list - LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate(); - if (!panel) return; - LLViewerRegion* region = gAgent.getRegion(); - if (!region) return; - - if (change_info->mOperationFlag & ESTATE_ACCESS_ALLOWED_AGENT_ADD) - { - LLCtrlListInterface *list = panel->childGetListInterface("allowed_avatar_name_list"); - int currentCount = (list ? list->getItemCount() : 0); - if (ids.size() + currentCount > ESTATE_MAX_ACCESS_IDS) - { - LLSD args; - args["NUM_ADDED"] = llformat("%d",ids.size()); - args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); - args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeAllowedAgents"); - args["NUM_EXCESS"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS); - LLNotificationsUtil::add("MaxAgentOnRegionBatch", args); - delete change_info; - return; - } - } - if (change_info->mOperationFlag & ESTATE_ACCESS_BANNED_AGENT_ADD) - { - LLCtrlListInterface *list = panel->childGetListInterface("banned_avatar_name_list"); - int currentCount = (list ? list->getItemCount() : 0); - if (ids.size() + currentCount > ESTATE_MAX_ACCESS_IDS) - { - LLSD args; - args["NUM_ADDED"] = llformat("%d",ids.size()); - args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); - args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeBannedAgents"); - args["NUM_EXCESS"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS); - LLNotificationsUtil::add("MaxAgentOnRegionBatch", args); - delete change_info; - return; - } - } + // set up the callbacks for the generic controls + initCtrl("externally_visible_radio"); + initCtrl("allow_direct_teleport"); + initCtrl("limit_payment"); + initCtrl("limit_age_verified"); + initCtrl("voice_chat_check"); + initCtrl("parcel_access_override"); - LLSD args; - args["ALL_ESTATES"] = all_estates_text(); + childSetAction("message_estate_btn", boost::bind(&LLPanelEstateInfo::onClickMessageEstate, this)); + childSetAction("kick_user_from_estate_btn", boost::bind(&LLPanelEstateInfo::onClickKickUser, this)); - LLNotification::Params params(change_info->mDialogName); - params.substitutions(args) - .payload(change_info->asLLSD()) - .functor.function(accessCoreConfirm); + getChild<LLUICtrl>("parcel_access_override")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeAccessOverride, this)); - if (isLindenEstate()) - { - // just apply to this estate - LLNotifications::instance().forceResponse(params, 0); - } - else - { - // ask if this estate or all estates with this owner - LLNotifications::instance().add(params); - } + getChild<LLUICtrl>("externally_visible_radio")->setFocus(TRUE); + + return LLPanelRegionInfo::postBuild(); } -// static -void LLPanelEstateInfo::accessRemoveCore(U32 operation_flag, const std::string& dialog_name, const std::string& list_ctrl_name) +void LLPanelEstateInfo::refresh() { - LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate(); - if (!panel) return; - LLNameListCtrl* name_list = panel->getChild<LLNameListCtrl>(list_ctrl_name); - if (!name_list) return; + // Disable access restriction controls if they make no sense. + bool public_access = ("estate_public_access" == getChild<LLUICtrl>("externally_visible_radio")->getValue().asString()); - std::vector<LLScrollListItem*> list_vector = name_list->getAllSelected(); - if (list_vector.size() == 0) - return; + getChildView("Only Allow")->setEnabled(public_access); + getChildView("limit_payment")->setEnabled(public_access); + getChildView("limit_age_verified")->setEnabled(public_access); - LLSD payload; - payload["operation"] = (S32)operation_flag; - payload["dialog_name"] = dialog_name; - - for (std::vector<LLScrollListItem*>::const_iterator iter = list_vector.begin(); - iter != list_vector.end(); - iter++) + // if this is set to false, then the limit fields are meaningless and should be turned off + if (public_access == false) { - LLScrollListItem *item = (*iter); - payload["allowed_ids"].append(item->getUUID()); + getChild<LLUICtrl>("limit_payment")->setValue(false); + getChild<LLUICtrl>("limit_age_verified")->setValue(false); } - - LLNotification::Params params("ChangeLindenAccess"); - params.payload(payload) - .functor.function(accessRemoveCore2); +} - if (isLindenEstate()) - { - // warn on change linden estate - LLNotifications::instance().add(params); - } - else - { - // just proceed, as if clicking OK - LLNotifications::instance().forceResponse(params, 0); - } +void LLPanelEstateInfo::refreshFromEstate() +{ + const LLEstateInfoModel& estate_info = LLEstateInfoModel::instance(); + + getChild<LLUICtrl>("estate_name")->setValue(estate_info.getName()); + setOwnerName(LLSLURL("agent", estate_info.getOwnerID(), "inspect").getSLURLString()); + + getChild<LLUICtrl>("externally_visible_radio")->setValue(estate_info.getIsExternallyVisible() ? "estate_public_access" : "estate_restricted_access"); + getChild<LLUICtrl>("voice_chat_check")->setValue(estate_info.getAllowVoiceChat()); + getChild<LLUICtrl>("allow_direct_teleport")->setValue(estate_info.getAllowDirectTeleport()); + getChild<LLUICtrl>("limit_payment")->setValue(estate_info.getDenyAnonymous()); + getChild<LLUICtrl>("limit_age_verified")->setValue(estate_info.getDenyAgeUnverified()); + getChild<LLUICtrl>("parcel_access_override")->setValue(estate_info.getAllowAccessOverride()); + + // Ensure appriopriate state of the management UI + updateControls(gAgent.getRegion()); + refresh(); } -// static -bool LLPanelEstateInfo::accessRemoveCore2(const LLSD& notification, const LLSD& response) +BOOL LLPanelEstateInfo::sendUpdate() { - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - if (option != 0) - { - // abort - return false; - } + LL_INFOS() << "LLPanelEsateInfo::sendUpdate()" << LL_ENDL; + + LLNotification::Params params("ChangeLindenEstate"); + params.functor.function(boost::bind(&LLPanelEstateInfo::callbackChangeLindenEstate, this, _1, _2)); - // If Linden estate, can only apply to "this" estate, not all estates - // owned by NULL. if (isLindenEstate()) { - accessCoreConfirm(notification, response); + // trying to change reserved estate, warn + LLNotifications::instance().add(params); } else { - LLSD args; - args["ALL_ESTATES"] = all_estates_text(); - LLNotificationsUtil::add(notification["payload"]["dialog_name"], - args, - notification["payload"], - accessCoreConfirm); + // for normal estates, just make the change + LLNotifications::instance().forceResponse(params, 0); } - return false; + return TRUE; } -// Used for both access add and remove operations, depending on the mOperationFlag -// passed in (ESTATE_ACCESS_BANNED_AGENT_ADD, ESTATE_ACCESS_ALLOWED_AGENT_REMOVE, etc.) -// static -bool LLPanelEstateInfo::accessCoreConfirm(const LLSD& notification, const LLSD& response) +bool LLPanelEstateInfo::callbackChangeLindenEstate(const LLSD& notification, const LLSD& response) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - const U32 originalFlags = (U32)notification["payload"]["operation"].asInteger(); - - LLViewerRegion* region = gAgent.getRegion(); - - LLSD::array_const_iterator end_it = notification["payload"]["allowed_ids"].endArray(); - - for (LLSD::array_const_iterator iter = notification["payload"]["allowed_ids"].beginArray(); - iter != end_it; - iter++) + switch(option) { - U32 flags = originalFlags; - if (iter + 1 != end_it) - flags |= ESTATE_ACCESS_NO_REPLY; - - const LLUUID id = iter->asUUID(); - if (((U32)notification["payload"]["operation"].asInteger() & ESTATE_ACCESS_BANNED_AGENT_ADD) - && region && (region->getOwner() == id)) - { - LLNotificationsUtil::add("OwnerCanNotBeDenied"); - break; - } - switch(option) + case 0: { - case 0: - // This estate - sendEstateAccessDelta(flags, id); - break; - case 1: - { - // All estates, either than I own or manage for this owner. - // This will be verified on simulator. JC - if (!region) break; - if (region->getOwner() == gAgent.getID() - || gAgent.isGodlike()) - { - flags |= ESTATE_ACCESS_APPLY_TO_ALL_ESTATES; - sendEstateAccessDelta(flags, id); - } - else if (region->isEstateManager()) - { - flags |= ESTATE_ACCESS_APPLY_TO_MANAGED_ESTATES; - sendEstateAccessDelta(flags, id); - } - break; - } - case 2: - default: - break; + LLEstateInfoModel& estate_info = LLEstateInfoModel::instance(); + + // update model + estate_info.setUseFixedSun(false); // we don't support fixed sun estates anymore + estate_info.setIsExternallyVisible("estate_public_access" == getChild<LLUICtrl>("externally_visible_radio")->getValue().asString()); + estate_info.setAllowDirectTeleport(getChild<LLUICtrl>("allow_direct_teleport")->getValue().asBoolean()); + estate_info.setDenyAnonymous(getChild<LLUICtrl>("limit_payment")->getValue().asBoolean()); + estate_info.setDenyAgeUnverified(getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean()); + estate_info.setAllowVoiceChat(getChild<LLUICtrl>("voice_chat_check")->getValue().asBoolean()); + estate_info.setAllowAccessOverride(getChild<LLUICtrl>("parcel_access_override")->getValue().asBoolean()); + // JIGGLYPUFF + //estate_info.setAllowAccessOverride(getChild<LLUICtrl>("")->getValue().asBoolean()); + // send the update to sim + estate_info.sendEstateInfo(); } + + // we don't want to do this because we'll get it automatically from the sim + // after the spaceserver processes it +// else +// { +// // caps method does not automatically send this info +// LLFloaterRegionInfo::requestRegionInfo(); +// } + break; + case 1: + default: + // do nothing + break; } return false; } -// key = "estateaccessdelta" -// str(estate_id) will be added to front of list by forward_EstateOwnerRequest_to_dataserver -// str[0] = str(agent_id) requesting the change -// str[1] = str(flags) (ESTATE_ACCESS_DELTA_*) -// str[2] = str(agent_id) to add or remove -// static -void LLPanelEstateInfo::sendEstateAccessDelta(U32 flags, const LLUUID& agent_or_group_id) + +/* +// Request = "getowner" +// SParam[0] = "" (empty string) +// IParam[0] = serial +void LLPanelEstateInfo::getEstateOwner() { + // TODO -- disable the panel + // and call this function whenever we cross a region boundary + // re-enable when owner matches, and get new estate info LLMessageSystem* msg = gMessageSystem; - msg->newMessage("EstateOwnerMessage"); + msg->newMessageFast(_PREHASH_EstateOwnerRequest); msg->nextBlockFast(_PREHASH_AgentData); msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used - - msg->nextBlock("MethodData"); - msg->addString("Method", "estateaccessdelta"); - msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice()); - std::string buf; - gAgent.getID().toString(buf); - msg->nextBlock("ParamList"); - msg->addString("Parameter", buf); + msg->nextBlockFast(_PREHASH_RequestData); + msg->addStringFast(_PREHASH_Request, "getowner"); - buf = llformat("%u", flags); - msg->nextBlock("ParamList"); - msg->addString("Parameter", buf); + // we send an empty string so that the variable block is not empty + msg->nextBlockFast(_PREHASH_StringData); + msg->addStringFast(_PREHASH_SParam, ""); - agent_or_group_id.toString(buf); - msg->nextBlock("ParamList"); - msg->addString("Parameter", buf); + msg->nextBlockFast(_PREHASH_IntegerData); + msg->addS32Fast(_PREHASH_IParam, LLFloaterRegionInfo::getSerial()); + gAgent.sendMessage(); +} +*/ - LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate(); +const std::string LLPanelEstateInfo::getOwnerName() const +{ + return getChild<LLUICtrl>("estate_owner")->getValue().asString(); +} - if (flags & (ESTATE_ACCESS_ALLOWED_AGENT_ADD | ESTATE_ACCESS_ALLOWED_AGENT_REMOVE | - ESTATE_ACCESS_BANNED_AGENT_ADD | ESTATE_ACCESS_BANNED_AGENT_REMOVE)) - { - - panel->clearAccessLists(); - } - - gAgent.sendReliableMessage(); +void LLPanelEstateInfo::setOwnerName(const std::string& name) +{ + getChild<LLUICtrl>("estate_owner")->setValue(LLSD(name)); } // static -void LLPanelEstateInfo::updateEstateOwnerName(const std::string& name) +void LLPanelEstateInfo::onClickMessageEstate(void* userdata) { - LLPanelEstateInfo* panelp = LLFloaterRegionInfo::getPanelEstate(); - if (panelp) - { - panelp->setOwnerName(name); - } + LL_INFOS() << "LLPanelEstateInfo::onClickMessageEstate" << LL_ENDL; + LLNotificationsUtil::add("MessageEstate", LLSD(), LLSD(), boost::bind(&LLPanelEstateInfo::onMessageCommit, (LLPanelEstateInfo*)userdata, _1, _2)); } -// static -void LLPanelEstateInfo::updateEstateName(const std::string& name) +bool LLPanelEstateInfo::onMessageCommit(const LLSD& notification, const LLSD& response) { - LLPanelEstateInfo* panelp = LLFloaterRegionInfo::getPanelEstate(); - if (panelp) + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + std::string text = response["message"].asString(); + if(option != 0) return false; + if(text.empty()) return false; + LL_INFOS() << "Message to everyone: " << text << LL_ENDL; + strings_t strings; + //integers_t integers; + std::string name; + LLAgentUI::buildFullname(name); + strings.push_back(strings_t::value_type(name)); + strings.push_back(strings_t::value_type(text)); + LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); + sendEstateOwnerMessage(gMessageSystem, "instantmessage", invoice, strings); + return false; +} + +void LLPanelEstateInfo::onChangeAccessOverride() +{ + if (!getChild<LLUICtrl>("parcel_access_override")->getValue().asBoolean()) { - panelp->getChildRef<LLTextBox>("estate_name").setText(name); + LLNotificationsUtil::add("EstateParcelAccessOverride"); } } -void LLPanelEstateInfo::updateControls(LLViewerRegion* region) +LLPanelEstateCovenant::LLPanelEstateCovenant() + : + mCovenantID(LLUUID::null), + mAssetStatus(ASSET_ERROR) { - BOOL god = gAgent.isGodlike(); - BOOL owner = (region && (region->getOwner() == gAgent.getID())); - BOOL manager = (region && region->isEstateManager()); - setCtrlsEnabled(god || owner || manager); - - getChildView("apply_btn")->setEnabled(FALSE); - - BOOL has_allowed_avatar = getChild<LLNameListCtrl>("allowed_avatar_name_list")->getFirstSelected() ? TRUE : FALSE; - BOOL has_allowed_group = getChild<LLNameListCtrl>("allowed_group_name_list")->getFirstSelected() ? TRUE : FALSE; - BOOL has_banned_agent = getChild<LLNameListCtrl>("banned_avatar_name_list")->getFirstSelected() ? TRUE : FALSE; - BOOL has_estate_manager = getChild<LLNameListCtrl>("estate_manager_name_list")->getFirstSelected() ? TRUE : FALSE; - - getChildView("add_allowed_avatar_btn")->setEnabled(god || owner || manager); - getChildView("remove_allowed_avatar_btn")->setEnabled(has_allowed_avatar && (god || owner || manager)); - getChildView("allowed_avatar_name_list")->setEnabled(god || owner || manager); - - getChildView("add_allowed_group_btn")->setEnabled(god || owner || manager); - getChildView("remove_allowed_group_btn")->setEnabled(has_allowed_group && (god || owner || manager) ); - getChildView("allowed_group_name_list")->setEnabled(god || owner || manager); - - // Can't ban people from mainland, orientation islands, etc. because this - // creates much network traffic and server load. - // Disable their accounts in CSR tool instead. - bool linden_estate = isLindenEstate(); - bool enable_ban = (god || owner || manager) && !linden_estate; - getChildView("add_banned_avatar_btn")->setEnabled(enable_ban); - getChildView("remove_banned_avatar_btn")->setEnabled(has_banned_agent && enable_ban); - getChildView("banned_avatar_name_list")->setEnabled(god || owner || manager); - - getChildView("message_estate_btn")->setEnabled(god || owner || manager); - getChildView("kick_user_from_estate_btn")->setEnabled(god || owner || manager); - - // estate managers can't add estate managers - getChildView("add_estate_manager_btn")->setEnabled(god || owner); - getChildView("remove_estate_manager_btn")->setEnabled(has_estate_manager && (god || owner)); - getChildView("estate_manager_name_list")->setEnabled(god || owner); - - refresh(); } -bool LLPanelEstateInfo::refreshFromRegion(LLViewerRegion* region) +// virtual +bool LLPanelEstateCovenant::refreshFromRegion(LLViewerRegion* region) { - updateControls(region); - - // let the parent class handle the general data collection. - bool rv = LLPanelRegionInfo::refreshFromRegion(region); + LLTextBox* region_name = getChild<LLTextBox>("region_name_text"); + if (region_name) + { + region_name->setText(region->getName()); + } - // We want estate info. To make sure it works across region - // boundaries and multiple packets, we add a serial number to the - // integers and track against that on update. - strings_t strings; - //integers_t integers; - //LLFloaterRegionInfo::incrementSerial(); - LLFloaterRegionInfo::nextInvoice(); - LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); - //integers.push_back(LLFloaterRegionInfo::());::getPanelEstate(); + LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause"); + if (resellable_clause) + { + if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL)) + { + resellable_clause->setText(getString("can_not_resell")); + } + else + { + resellable_clause->setText(getString("can_resell")); + } + } + + LLTextBox* changeable_clause = getChild<LLTextBox>("changeable_clause"); + if (changeable_clause) + { + if (region->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES)) + { + changeable_clause->setText(getString("can_change")); + } + else + { + changeable_clause->setText(getString("can_not_change")); + } + } + LLTextBox* region_maturity = getChild<LLTextBox>("region_maturity_text"); + if (region_maturity) + { + region_maturity->setText(region->getSimAccessString()); + } - LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate(); - panel->clearAccessLists(); + LLTextBox* region_landtype = getChild<LLTextBox>("region_landtype_text"); + region_landtype->setText(region->getLocalizedSimProductName()); - - sendEstateOwnerMessage(gMessageSystem, "getinfo", invoice, strings); - - refresh(); - + // let the parent class handle the general data collection. + bool rv = LLPanelRegionInfo::refreshFromRegion(region); + LLMessageSystem *msg = gMessageSystem; + msg->newMessage("EstateCovenantRequest"); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID()); + msg->sendReliable(region->getHost()); return rv; } -void LLPanelEstateInfo::updateChild(LLUICtrl* child_ctrl) +// virtual +bool LLPanelEstateCovenant::estateUpdate(LLMessageSystem* msg) { - // Ensure appropriate state of the management ui. - updateControls(gAgent.getRegion()); + LL_INFOS() << "LLPanelEstateCovenant::estateUpdate()" << LL_ENDL; + return true; } - -bool LLPanelEstateInfo::estateUpdate(LLMessageSystem* msg) + +// virtual +BOOL LLPanelEstateCovenant::postBuild() { - LL_INFOS() << "LLPanelEstateInfo::estateUpdate()" << LL_ENDL; - return false; + mEstateNameText = getChild<LLTextBox>("estate_name_text"); + mEstateOwnerText = getChild<LLTextBox>("estate_owner_text"); + mLastModifiedText = getChild<LLTextBox>("covenant_timestamp_text"); + mEditor = getChild<LLViewerTextEditor>("covenant_editor"); + LLButton* reset_button = getChild<LLButton>("reset_covenant"); + reset_button->setEnabled(gAgent.canManageEstate()); + reset_button->setClickedCallback(LLPanelEstateCovenant::resetCovenantID, NULL); + + return LLPanelRegionInfo::postBuild(); } +// virtual +void LLPanelEstateCovenant::updateChild(LLUICtrl* child_ctrl) +{ +} -BOOL LLPanelEstateInfo::postBuild() +// virtual +BOOL LLPanelEstateCovenant::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, + EDragAndDropType cargo_type, + void* cargo_data, + EAcceptance* accept, + std::string& tooltip_msg) { - // set up the callbacks for the generic controls - initCtrl("externally_visible_radio"); - initCtrl("allow_direct_teleport"); - initCtrl("limit_payment"); - initCtrl("limit_age_verified"); - initCtrl("voice_chat_check"); - initCtrl("parcel_access_override"); + LLInventoryItem* item = (LLInventoryItem*)cargo_data; - getChild<LLUICtrl>("allowed_avatar_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1)); - LLNameListCtrl *avatar_name_list = getChild<LLNameListCtrl>("allowed_avatar_name_list"); - if (avatar_name_list) + if (!gAgent.canManageEstate()) { - avatar_name_list->setCommitOnSelectionChange(TRUE); - avatar_name_list->setMaxItemCount(ESTATE_MAX_ACCESS_IDS); + *accept = ACCEPT_NO; + return TRUE; } - childSetAction("add_allowed_avatar_btn", boost::bind(&LLPanelEstateInfo::onClickAddAllowedAgent, this)); - childSetAction("remove_allowed_avatar_btn", boost::bind(&LLPanelEstateInfo::onClickRemoveAllowedAgent, this)); - - getChild<LLUICtrl>("allowed_group_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1)); - LLNameListCtrl* group_name_list = getChild<LLNameListCtrl>("allowed_group_name_list"); - if (group_name_list) + switch(cargo_type) { - group_name_list->setCommitOnSelectionChange(TRUE); - group_name_list->setMaxItemCount(ESTATE_MAX_ACCESS_IDS); + case DAD_NOTECARD: + *accept = ACCEPT_YES_COPY_SINGLE; + if (item && drop) + { + LLSD payload; + payload["item_id"] = item->getUUID(); + LLNotificationsUtil::add("EstateChangeCovenant", LLSD(), payload, + LLPanelEstateCovenant::confirmChangeCovenantCallback); + } + break; + default: + *accept = ACCEPT_NO; + break; } - getChild<LLUICtrl>("add_allowed_group_btn")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onClickAddAllowedGroup, this)); - childSetAction("remove_allowed_group_btn", boost::bind(&LLPanelEstateInfo::onClickRemoveAllowedGroup, this)); + return TRUE; +} - getChild<LLUICtrl>("banned_avatar_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1)); - LLNameListCtrl* banned_name_list = getChild<LLNameListCtrl>("banned_avatar_name_list"); - if (banned_name_list) - { - banned_name_list->setCommitOnSelectionChange(TRUE); - banned_name_list->setMaxItemCount(ESTATE_MAX_ACCESS_IDS); - } +// static +bool LLPanelEstateCovenant::confirmChangeCovenantCallback(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + LLInventoryItem* item = gInventory.getItem(notification["payload"]["item_id"].asUUID()); + LLPanelEstateCovenant* self = LLFloaterRegionInfo::getPanelCovenant(); - childSetAction("add_banned_avatar_btn", boost::bind(&LLPanelEstateInfo::onClickAddBannedAgent, this)); - childSetAction("remove_banned_avatar_btn", boost::bind(&LLPanelEstateInfo::onClickRemoveBannedAgent, this)); + if (!item || !self) return false; - getChild<LLUICtrl>("estate_manager_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1)); - LLNameListCtrl* manager_name_list = getChild<LLNameListCtrl>("estate_manager_name_list"); - if (manager_name_list) + switch(option) { - manager_name_list->setCommitOnSelectionChange(TRUE); - manager_name_list->setMaxItemCount(ESTATE_MAX_MANAGERS * 4); // Allow extras for dupe issue + case 0: + self->loadInvItem(item); + break; + default: + break; } + return false; +} - childSetAction("add_estate_manager_btn", boost::bind(&LLPanelEstateInfo::onClickAddEstateManager, this)); - childSetAction("remove_estate_manager_btn", boost::bind(&LLPanelEstateInfo::onClickRemoveEstateManager, this)); - childSetAction("message_estate_btn", boost::bind(&LLPanelEstateInfo::onClickMessageEstate, this)); - childSetAction("kick_user_from_estate_btn", boost::bind(&LLPanelEstateInfo::onClickKickUser, this)); - - getChild<LLUICtrl>("parcel_access_override")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeAccessOverride, this)); - - getChild<LLUICtrl>("externally_visible_radio")->setFocus(TRUE); - - return LLPanelRegionInfo::postBuild(); +// static +void LLPanelEstateCovenant::resetCovenantID(void* userdata) +{ + LLNotificationsUtil::add("EstateChangeCovenant", LLSD(), LLSD(), confirmResetCovenantCallback); } -void LLPanelEstateInfo::refresh() +// static +bool LLPanelEstateCovenant::confirmResetCovenantCallback(const LLSD& notification, const LLSD& response) { - // Disable access restriction controls if they make no sense. - bool public_access = ("estate_public_access" == getChild<LLUICtrl>("externally_visible_radio")->getValue().asString()); + LLPanelEstateCovenant* self = LLFloaterRegionInfo::getPanelCovenant(); + if (!self) return false; - getChildView("Only Allow")->setEnabled(public_access); - getChildView("limit_payment")->setEnabled(public_access); - getChildView("limit_age_verified")->setEnabled(public_access); - - // if this is set to false, then the limit fields are meaningless and should be turned off - if (public_access == false) + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + switch(option) { - getChild<LLUICtrl>("limit_payment")->setValue(false); - getChild<LLUICtrl>("limit_age_verified")->setValue(false); + case 0: + self->loadInvItem(NULL); + break; + default: + break; } + return false; } -void LLPanelEstateInfo::refreshFromEstate() -{ - const LLEstateInfoModel& estate_info = LLEstateInfoModel::instance(); - - getChild<LLUICtrl>("estate_name")->setValue(estate_info.getName()); - setOwnerName(LLSLURL("agent", estate_info.getOwnerID(), "inspect").getSLURLString()); - - getChild<LLUICtrl>("externally_visible_radio")->setValue(estate_info.getIsExternallyVisible() ? "estate_public_access" : "estate_restricted_access"); - getChild<LLUICtrl>("voice_chat_check")->setValue(estate_info.getAllowVoiceChat()); - getChild<LLUICtrl>("allow_direct_teleport")->setValue(estate_info.getAllowDirectTeleport()); - getChild<LLUICtrl>("limit_payment")->setValue(estate_info.getDenyAnonymous()); - getChild<LLUICtrl>("limit_age_verified")->setValue(estate_info.getDenyAgeUnverified()); - getChild<LLUICtrl>("parcel_access_override")->setValue(estate_info.getAllowAccessOverride()); - - // Ensure appriopriate state of the management UI - updateControls(gAgent.getRegion()); - refresh(); -} - -BOOL LLPanelEstateInfo::sendUpdate() +void LLPanelEstateCovenant::loadInvItem(LLInventoryItem *itemp) { - LL_INFOS() << "LLPanelEsateInfo::sendUpdate()" << LL_ENDL; - - LLNotification::Params params("ChangeLindenEstate"); - params.functor.function(boost::bind(&LLPanelEstateInfo::callbackChangeLindenEstate, this, _1, _2)); - - if (isLindenEstate()) + const BOOL high_priority = TRUE; + if (itemp) { - // trying to change reserved estate, warn - LLNotifications::instance().add(params); + gAssetStorage->getInvItemAsset(gAgent.getRegionHost(), + gAgent.getID(), + gAgent.getSessionID(), + itemp->getPermissions().getOwner(), + LLUUID::null, + itemp->getUUID(), + itemp->getAssetUUID(), + itemp->getType(), + onLoadComplete, + (void*)this, + high_priority); + mAssetStatus = ASSET_LOADING; } else { - // for normal estates, just make the change - LLNotifications::instance().forceResponse(params, 0); + mAssetStatus = ASSET_LOADED; + setCovenantTextEditor(LLTrans::getString("RegionNoCovenant")); + sendChangeCovenantID(LLUUID::null); } - return TRUE; } -bool LLPanelEstateInfo::callbackChangeLindenEstate(const LLSD& notification, const LLSD& response) +// static +void LLPanelEstateCovenant::onLoadComplete(LLVFS *vfs, + const LLUUID& asset_uuid, + LLAssetType::EType type, + void* user_data, S32 status, LLExtStat ext_status) { - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - switch(option) + LL_INFOS() << "LLPanelEstateCovenant::onLoadComplete()" << LL_ENDL; + LLPanelEstateCovenant* panelp = (LLPanelEstateCovenant*)user_data; + if( panelp ) { - case 0: + if(0 == status) { - LLEstateInfoModel& estate_info = LLEstateInfoModel::instance(); + LLVFile file(vfs, asset_uuid, type, LLVFile::READ); - // update model - estate_info.setUseFixedSun(false); // we don't support fixed sun estates anymore - estate_info.setIsExternallyVisible("estate_public_access" == getChild<LLUICtrl>("externally_visible_radio")->getValue().asString()); - estate_info.setAllowDirectTeleport(getChild<LLUICtrl>("allow_direct_teleport")->getValue().asBoolean()); - estate_info.setDenyAnonymous(getChild<LLUICtrl>("limit_payment")->getValue().asBoolean()); - estate_info.setDenyAgeUnverified(getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean()); - estate_info.setAllowVoiceChat(getChild<LLUICtrl>("voice_chat_check")->getValue().asBoolean()); - estate_info.setAllowAccessOverride(getChild<LLUICtrl>("parcel_access_override")->getValue().asBoolean()); - // JIGGLYPUFF - //estate_info.setAllowAccessOverride(getChild<LLUICtrl>("")->getValue().asBoolean()); - // send the update to sim - estate_info.sendEstateInfo(); + S32 file_length = file.getSize(); + + std::vector<char> buffer(file_length+1); + file.read((U8*)&buffer[0], file_length); + // put a EOS at the end + buffer[file_length] = 0; + + if( (file_length > 19) && !strncmp( &buffer[0], "Linden text version", 19 ) ) + { + if( !panelp->mEditor->importBuffer( &buffer[0], file_length+1 ) ) + { + LL_WARNS() << "Problem importing estate covenant." << LL_ENDL; + LLNotificationsUtil::add("ProblemImportingEstateCovenant"); + } + else + { + panelp->sendChangeCovenantID(asset_uuid); + } + } + else + { + // Version 0 (just text, doesn't include version number) + panelp->sendChangeCovenantID(asset_uuid); + } } + else + { + if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status || + LL_ERR_FILE_EMPTY == status) + { + LLNotificationsUtil::add("MissingNotecardAssetID"); + } + else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status) + { + LLNotificationsUtil::add("NotAllowedToViewNotecard"); + } + else + { + LLNotificationsUtil::add("UnableToLoadNotecardAsset"); + } - // we don't want to do this because we'll get it automatically from the sim - // after the spaceserver processes it -// else -// { -// // caps method does not automatically send this info -// LLFloaterRegionInfo::requestRegionInfo(); -// } - break; - case 1: - default: - // do nothing - break; + LL_WARNS() << "Problem loading notecard: " << status << LL_ENDL; + } + panelp->mAssetStatus = ASSET_LOADED; + panelp->setCovenantID(asset_uuid); } - return false; } - -/* -// Request = "getowner" -// SParam[0] = "" (empty string) -// IParam[0] = serial -void LLPanelEstateInfo::getEstateOwner() +// key = "estatechangecovenantid" +// strings[0] = str(estate_id) (added by simulator before relay - not here) +// strings[1] = str(covenant_id) +void LLPanelEstateCovenant::sendChangeCovenantID(const LLUUID &asset_id) { - // TODO -- disable the panel - // and call this function whenever we cross a region boundary - // re-enable when owner matches, and get new estate info - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_EstateOwnerRequest); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - - msg->nextBlockFast(_PREHASH_RequestData); - msg->addStringFast(_PREHASH_Request, "getowner"); + if (asset_id != getCovenantID()) + { + setCovenantID(asset_id); - // we send an empty string so that the variable block is not empty - msg->nextBlockFast(_PREHASH_StringData); - msg->addStringFast(_PREHASH_SParam, ""); + LLMessageSystem* msg = gMessageSystem; + msg->newMessage("EstateOwnerMessage"); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used - msg->nextBlockFast(_PREHASH_IntegerData); - msg->addS32Fast(_PREHASH_IParam, LLFloaterRegionInfo::getSerial()); + msg->nextBlock("MethodData"); + msg->addString("Method", "estatechangecovenantid"); + msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice()); - gAgent.sendMessage(); + msg->nextBlock("ParamList"); + msg->addString("Parameter", getCovenantID().asString()); + gAgent.sendReliableMessage(); + } } -*/ -const std::string LLPanelEstateInfo::getOwnerName() const +// virtual +BOOL LLPanelEstateCovenant::sendUpdate() { - return getChild<LLUICtrl>("estate_owner")->getValue().asString(); + return TRUE; } -void LLPanelEstateInfo::setOwnerName(const std::string& name) +std::string LLPanelEstateCovenant::getEstateName() const { - getChild<LLUICtrl>("estate_owner")->setValue(LLSD(name)); + return mEstateNameText->getText(); } -void LLPanelEstateInfo::clearAccessLists() +void LLPanelEstateCovenant::setEstateName(const std::string& name) { - LLNameListCtrl* name_list = getChild<LLNameListCtrl>("allowed_avatar_name_list"); - if (name_list) - { - name_list->deleteAllItems(); - } + mEstateNameText->setText(name); +} - name_list = getChild<LLNameListCtrl>("banned_avatar_name_list"); - if (name_list) +// static +void LLPanelEstateCovenant::updateCovenantText(const std::string& string, const LLUUID& asset_id) +{ + LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant(); + if( panelp ) { - name_list->deleteAllItems(); + panelp->mEditor->setText(string); + panelp->setCovenantID(asset_id); } - updateControls(gAgent.getRegion()); } // static -void LLPanelEstateInfo::onClickMessageEstate(void* userdata) +void LLPanelEstateCovenant::updateEstateName(const std::string& name) { - LL_INFOS() << "LLPanelEstateInfo::onClickMessageEstate" << LL_ENDL; - LLNotificationsUtil::add("MessageEstate", LLSD(), LLSD(), boost::bind(&LLPanelEstateInfo::onMessageCommit, (LLPanelEstateInfo*)userdata, _1, _2)); + LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant(); + if( panelp ) + { + panelp->mEstateNameText->setText(name); + } } -bool LLPanelEstateInfo::onMessageCommit(const LLSD& notification, const LLSD& response) +// static +void LLPanelEstateCovenant::updateLastModified(const std::string& text) { - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - std::string text = response["message"].asString(); - if(option != 0) return false; - if(text.empty()) return false; - LL_INFOS() << "Message to everyone: " << text << LL_ENDL; - strings_t strings; - //integers_t integers; - std::string name; - LLAgentUI::buildFullname(name); - strings.push_back(strings_t::value_type(name)); - strings.push_back(strings_t::value_type(text)); - LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); - sendEstateOwnerMessage(gMessageSystem, "instantmessage", invoice, strings); - return false; + LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant(); + if( panelp ) + { + panelp->mLastModifiedText->setText(text); + } } -void LLPanelEstateInfo::onChangeAccessOverride() +// static +void LLPanelEstateCovenant::updateEstateOwnerName(const std::string& name) { - if (!getChild<LLUICtrl>("parcel_access_override")->getValue().asBoolean()) + LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant(); + if( panelp ) { - LLNotificationsUtil::add("EstateParcelAccessOverride"); + panelp->mEstateOwnerText->setText(name); } } -LLPanelEstateCovenant::LLPanelEstateCovenant() - : - mCovenantID(LLUUID::null), - mAssetStatus(ASSET_ERROR) +std::string LLPanelEstateCovenant::getOwnerName() const { + return mEstateOwnerText->getText(); } -// virtual -bool LLPanelEstateCovenant::refreshFromRegion(LLViewerRegion* region) +void LLPanelEstateCovenant::setOwnerName(const std::string& name) { - LLTextBox* region_name = getChild<LLTextBox>("region_name_text"); - if (region_name) + mEstateOwnerText->setText(name); +} + +void LLPanelEstateCovenant::setCovenantTextEditor(const std::string& text) +{ + mEditor->setText(text); +} + +// key = "estateupdateinfo" +// strings[0] = estate name +// strings[1] = str(owner_id) +// strings[2] = str(estate_id) +// strings[3] = str(estate_flags) +// strings[4] = str((S32)(sun_hour * 1024)) +// strings[5] = str(parent_estate_id) +// strings[6] = str(covenant_id) +// strings[7] = str(covenant_timestamp) +// strings[8] = str(send_to_agent_only) +// strings[9] = str(abuse_email_addr) +bool LLDispatchEstateUpdateInfo::operator()( + const LLDispatcher* dispatcher, + const std::string& key, + const LLUUID& invoice, + const sparam_t& strings) +{ + LL_DEBUGS() << "Received estate update" << LL_ENDL; + + // Update estate info model. + // This will call LLPanelEstateInfo::refreshFromEstate(). + // *TODO: Move estate message handling stuff to llestateinfomodel.cpp. + LLEstateInfoModel::instance().update(strings); + + return true; +} + +bool LLDispatchSetEstateAccess::operator()( + const LLDispatcher* dispatcher, + const std::string& key, + const LLUUID& invoice, + const sparam_t& strings) +{ + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + if (panel && panel->getPendingUpdate()) { - region_name->setText(region->getName()); + panel->setPendingUpdate(false); + panel->updateLists(); } + return true; +} - LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause"); - if (resellable_clause) +LLSD LLDispatchSetEstateExperience::getIDs( sparam_t::const_iterator it, sparam_t::const_iterator end, S32 count ) +{ + LLSD idList = LLSD::emptyArray(); + LLUUID id; + while(count--> 0) { - if (region->getRegionFlag(REGION_FLAGS_BLOCK_LAND_RESELL)) - { - resellable_clause->setText(getString("can_not_resell")); - } - else - { - resellable_clause->setText(getString("can_resell")); - } + memcpy(id.mData, (*(it++)).data(), UUID_BYTES); + idList.append(id); } - - LLTextBox* changeable_clause = getChild<LLTextBox>("changeable_clause"); - if (changeable_clause) + return idList; +} + +// key = "setexperience" +// strings[0] = str(estate_id) +// strings[1] = str(send_to_agent_only) +// strings[2] = str(num blocked) +// strings[3] = str(num trusted) +// strings[4] = str(num allowed) +// strings[8] = bin(uuid) ... +// ... +bool LLDispatchSetEstateExperience::operator()( + const LLDispatcher* dispatcher, + const std::string& key, + const LLUUID& invoice, + const sparam_t& strings) +{ + LLPanelRegionExperiences* panel = LLFloaterRegionInfo::getPanelExperiences(); + if (!panel) return true; + + sparam_t::const_iterator it = strings.begin(); + ++it; // U32 estate_id = strtol((*it).c_str(), NULL, 10); + ++it; // U32 send_to_agent_only = strtoul((*(++it)).c_str(), NULL, 10); + + LLUUID id; + S32 num_blocked = strtol((*(it++)).c_str(), NULL, 10); + S32 num_trusted = strtol((*(it++)).c_str(), NULL, 10); + S32 num_allowed = strtol((*(it++)).c_str(), NULL, 10); + + LLSD ids = LLSD::emptyMap() + .with("blocked", getIDs(it, strings.end(), num_blocked)) + .with("trusted", getIDs(it + (num_blocked), strings.end(), num_trusted)) + .with("allowed", getIDs(it + (num_blocked+num_trusted), strings.end(), num_allowed)); + + panel->processResponse(ids); + + return true; +} + + + +LLPanelEnvironmentInfo::LLPanelEnvironmentInfo() +: mEnableEditing(false), + mRegionSettingsRadioGroup(NULL), + mDayCycleSettingsRadioGroup(NULL), + mWaterPresetCombo(NULL), + mSkyPresetCombo(NULL), + mDayCyclePresetCombo(NULL) +{ +} + +// virtual +BOOL LLPanelEnvironmentInfo::postBuild() +{ + mRegionSettingsRadioGroup = getChild<LLRadioGroup>("region_settings_radio_group"); + mRegionSettingsRadioGroup->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSwitchRegionSettings, this)); + + mDayCycleSettingsRadioGroup = getChild<LLRadioGroup>("sky_dayc_settings_radio_group"); + mDayCycleSettingsRadioGroup->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSwitchDayCycle, this)); + + mWaterPresetCombo = getChild<LLComboBox>("water_settings_preset_combo"); + mWaterPresetCombo->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSelectWaterPreset, this)); + + mSkyPresetCombo = getChild<LLComboBox>("sky_settings_preset_combo"); + mSkyPresetCombo->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSelectSkyPreset, this)); + + mDayCyclePresetCombo = getChild<LLComboBox>("dayc_settings_preset_combo"); + mDayCyclePresetCombo->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSelectDayCycle, this)); + + childSetCommitCallback("apply_btn", boost::bind(&LLPanelEnvironmentInfo::onBtnApply, this), NULL); + getChild<LLButton>("apply_btn")->setRightMouseDownCallback(boost::bind(&LLEnvManagerNew::dumpUserPrefs, LLEnvManagerNew::getInstance())); + childSetCommitCallback("cancel_btn", boost::bind(&LLPanelEnvironmentInfo::onBtnCancel, this), NULL); + getChild<LLButton>("cancel_btn")->setRightMouseDownCallback(boost::bind(&LLEnvManagerNew::dumpPresets, LLEnvManagerNew::getInstance())); + + LLEnvManagerNew::instance().setRegionSettingsChangeCallback(boost::bind(&LLPanelEnvironmentInfo::onRegionSettingschange, this)); + LLEnvManagerNew::instance().setRegionSettingsAppliedCallback(boost::bind(&LLPanelEnvironmentInfo::onRegionSettingsApplied, this, _1)); + + LLDayCycleManager::instance().setModifyCallback(boost::bind(&LLPanelEnvironmentInfo::populateDayCyclesList, this)); + LLWLParamManager::instance().setPresetListChangeCallback(boost::bind(&LLPanelEnvironmentInfo::populateSkyPresetsList, this)); + LLWaterParamManager::instance().setPresetListChangeCallback(boost::bind(&LLPanelEnvironmentInfo::populateWaterPresetsList, this)); + + return TRUE; +} + +// virtual +void LLPanelEnvironmentInfo::onOpen(const LLSD& key) +{ + LL_DEBUGS("Windlight") << "Panel opened, refreshing" << LL_ENDL; + refresh(); +} + +// virtual +void LLPanelEnvironmentInfo::onVisibilityChange(BOOL new_visibility) +{ + // If hiding (user switched to another tab or closed the floater), + // display user's preferred environment. + if (!new_visibility) { - if (region->getRegionFlag(REGION_FLAGS_ALLOW_PARCEL_CHANGES)) - { - changeable_clause->setText(getString("can_change")); - } - else - { - changeable_clause->setText(getString("can_not_change")); - } + LLEnvManagerNew::instance().usePrefs(); } +} - LLTextBox* region_maturity = getChild<LLTextBox>("region_maturity_text"); - if (region_maturity) +// virtual +bool LLPanelEnvironmentInfo::refreshFromRegion(LLViewerRegion* region) +{ + LL_DEBUGS("Windlight") << "Region updated, enabling/disabling controls" << LL_ENDL; + BOOL owner_or_god = gAgent.isGodlike() || (region && (region->getOwner() == gAgent.getID())); + BOOL owner_or_god_or_manager = owner_or_god || (region && region->isEstateManager()); + + // Don't refresh from region settings to avoid flicker after applying new region settings. + mEnableEditing = owner_or_god_or_manager; + setControlsEnabled(mEnableEditing); + + return LLPanelRegionInfo::refreshFromRegion(region); +} + +void LLPanelEnvironmentInfo::refresh() +{ + if(gDisconnected) { - region_maturity->setText(region->getSimAccessString()); + return; } - - LLTextBox* region_landtype = getChild<LLTextBox>("region_landtype_text"); - region_landtype->setText(region->getLocalizedSimProductName()); - - // let the parent class handle the general data collection. - bool rv = LLPanelRegionInfo::refreshFromRegion(region); - LLMessageSystem *msg = gMessageSystem; - msg->newMessage("EstateCovenantRequest"); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID()); - msg->sendReliable(region->getHost()); - return rv; + + populateWaterPresetsList(); + populateSkyPresetsList(); + populateDayCyclesList(); + + // Init radio groups. + const LLEnvironmentSettings& settings = LLEnvManagerNew::instance().getRegionSettings(); + const LLSD& dc = settings.getWLDayCycle(); + LLSD::Real first_frame_time = dc.size() > 0 ? dc[0][0].asReal() : 0.0f; + const bool use_fixed_sky = dc.size() == 1 && first_frame_time < 0; + mRegionSettingsRadioGroup->setSelectedIndex(settings.getSkyMap().size() == 0 ? 0 : 1); + mDayCycleSettingsRadioGroup->setSelectedIndex(use_fixed_sky ? 0 : 1); + + setControlsEnabled(mEnableEditing); + + setDirty(false); } -// virtual -bool LLPanelEstateCovenant::estateUpdate(LLMessageSystem* msg) +void LLPanelEnvironmentInfo::setControlsEnabled(bool enabled) { - LL_INFOS() << "LLPanelEstateCovenant::estateUpdate()" << LL_ENDL; - return true; + mRegionSettingsRadioGroup->setEnabled(enabled); + mDayCycleSettingsRadioGroup->setEnabled(enabled); + + mWaterPresetCombo->setEnabled(enabled); + mSkyPresetCombo->setEnabled(enabled); + mDayCyclePresetCombo->setEnabled(enabled); + + getChildView("apply_btn")->setEnabled(enabled); + getChildView("cancel_btn")->setEnabled(enabled); + + if (enabled) + { + // Enable/disable some controls based on currently selected radio buttons. + bool use_defaults = mRegionSettingsRadioGroup->getSelectedIndex() == 0; + getChild<LLView>("user_environment_settings")->setEnabled(!use_defaults); + + bool is_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0; + mSkyPresetCombo->setEnabled(is_fixed_sky); + mDayCyclePresetCombo->setEnabled(!is_fixed_sky); + } } - -// virtual -BOOL LLPanelEstateCovenant::postBuild() + +void LLPanelEnvironmentInfo::setApplyProgress(bool started) { - mEstateNameText = getChild<LLTextBox>("estate_name_text"); - mEstateOwnerText = getChild<LLTextBox>("estate_owner_text"); - mLastModifiedText = getChild<LLTextBox>("covenant_timestamp_text"); - mEditor = getChild<LLViewerTextEditor>("covenant_editor"); - LLButton* reset_button = getChild<LLButton>("reset_covenant"); - reset_button->setEnabled(gAgent.canManageEstate()); - reset_button->setClickedCallback(LLPanelEstateCovenant::resetCovenantID, NULL); + LLLoadingIndicator* indicator = getChild<LLLoadingIndicator>("progress_indicator"); - return LLPanelRegionInfo::postBuild(); + indicator->setVisible(started); + + if (started) + { + indicator->start(); + } + else + { + indicator->stop(); + } } -// virtual -void LLPanelEstateCovenant::updateChild(LLUICtrl* child_ctrl) +void LLPanelEnvironmentInfo::setDirty(bool dirty) { + getChildView("apply_btn")->setEnabled(dirty); + getChildView("cancel_btn")->setEnabled(dirty); } -// virtual -BOOL LLPanelEstateCovenant::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data, - EAcceptance* accept, - std::string& tooltip_msg) +void LLPanelEnvironmentInfo::sendRegionSunUpdate() { - LLInventoryItem* item = (LLInventoryItem*)cargo_data; + LLRegionInfoModel& region_info = LLRegionInfoModel::instance(); - if (!gAgent.canManageEstate()) + // If the region is being switched to fixed sky, + // change the region's sun hour according to the (fixed) sun position. + // This is needed for llGetSunDirection() LSL function to work properly (STORM-1330). + const LLSD& sky_map = mNewRegionSettings.getSkyMap(); + bool region_use_fixed_sky = sky_map.size() == 1; + if (region_use_fixed_sky) { - *accept = ACCEPT_NO; - return TRUE; + LLWLParamSet param_set; + llassert(sky_map.isMap()); + param_set.setAll(sky_map.beginMap()->second); + F32 sun_angle = param_set.getSunAngle(); + + LL_DEBUGS("WindlightSync") << "Old sun hour: " << region_info.mSunHour << LL_ENDL; + // convert value range from 0..2pi to 6..30 + region_info.mSunHour = fmodf((sun_angle / F_TWO_PI) * 24.f, 24.f) + 6.f; + } + + region_info.setUseFixedSun(region_use_fixed_sky); + region_info.mUseEstateSun = !region_use_fixed_sky; + LL_DEBUGS("WindlightSync") << "Sun hour: " << region_info.mSunHour << LL_ENDL; + + region_info.sendRegionTerrain(LLFloaterRegionInfo::getLastInvoice()); +} + +void LLPanelEnvironmentInfo::fixEstateSun() +{ + // We don't support fixed sun estates anymore and need to fix + // such estates for region day cycle to take effect. + // *NOTE: Assuming that current estate settings have arrived already. + LLEstateInfoModel& estate_info = LLEstateInfoModel::instance(); + if (estate_info.getUseFixedSun()) + { + LL_INFOS() << "Switching estate to global sun" << LL_ENDL; + estate_info.setUseFixedSun(false); + estate_info.sendEstateInfo(); + } +} + +void LLPanelEnvironmentInfo::populateWaterPresetsList() +{ + mWaterPresetCombo->removeall(); + + // If the region already has water params, add them to the list. + const LLEnvironmentSettings& region_settings = LLEnvManagerNew::instance().getRegionSettings(); + if (region_settings.getWaterParams().size() != 0) + { + const std::string& region_name = gAgent.getRegion()->getName(); + mWaterPresetCombo->add(region_name, LLWLParamKey(region_name, LLEnvKey::SCOPE_REGION).toLLSD()); + mWaterPresetCombo->addSeparator(); + } + + std::list<std::string> user_presets, system_presets; + LLWaterParamManager::instance().getPresetNames(user_presets, system_presets); + + // Add local user presets first. + for (std::list<std::string>::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it) + { + mWaterPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD()); + } + + if (user_presets.size() > 0) + { + mWaterPresetCombo->addSeparator(); + } + + // Add local system presets. + for (std::list<std::string>::const_iterator it = system_presets.begin(); it != system_presets.end(); ++it) + { + mWaterPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD()); + } + + // There's no way to select current preset because its name is not stored on server. +} + +void LLPanelEnvironmentInfo::populateSkyPresetsList() +{ + mSkyPresetCombo->removeall(); + + LLWLParamManager::preset_name_list_t region_presets; + LLWLParamManager::preset_name_list_t user_presets, sys_presets; + LLWLParamManager::instance().getPresetNames(region_presets, user_presets, sys_presets); + + // Add region presets. + std::string region_name = gAgent.getRegion() ? gAgent.getRegion()->getName() : LLTrans::getString("Unknown"); + for (LLWLParamManager::preset_name_list_t::const_iterator it = region_presets.begin(); it != region_presets.end(); ++it) + { + std::string preset_name = *it; + std::string item_title = preset_name + " (" + region_name + ")"; + mSkyPresetCombo->add(item_title, LLWLParamKey(preset_name, LLEnvKey::SCOPE_REGION).toStringVal()); + } + + if (!region_presets.empty()) + { + mSkyPresetCombo->addSeparator(); + } + + // Add user presets. + for (LLWLParamManager::preset_name_list_t::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it) + { + mSkyPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal()); } - switch(cargo_type) + if (!user_presets.empty()) { - case DAD_NOTECARD: - *accept = ACCEPT_YES_COPY_SINGLE; - if (item && drop) - { - LLSD payload; - payload["item_id"] = item->getUUID(); - LLNotificationsUtil::add("EstateChangeCovenant", LLSD(), payload, - LLPanelEstateCovenant::confirmChangeCovenantCallback); - } - break; - default: - *accept = ACCEPT_NO; - break; + mSkyPresetCombo->addSeparator(); } - return TRUE; -} - -// static -bool LLPanelEstateCovenant::confirmChangeCovenantCallback(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - LLInventoryItem* item = gInventory.getItem(notification["payload"]["item_id"].asUUID()); - LLPanelEstateCovenant* self = LLFloaterRegionInfo::getPanelCovenant(); - - if (!item || !self) return false; + // Add system presets. + for (LLWLParamManager::preset_name_list_t::const_iterator it = sys_presets.begin(); it != sys_presets.end(); ++it) + { + mSkyPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal()); + } - switch(option) + // Select current preset. + LLSD sky_map = LLEnvManagerNew::instance().getRegionSettings().getSkyMap(); + if (sky_map.size() == 1) // if the region is set to fixed sky { - case 0: - self->loadInvItem(item); - break; - default: - break; + std::string preset_name = sky_map.beginMap()->first; + mSkyPresetCombo->selectByValue(LLWLParamKey(preset_name, LLEnvKey::SCOPE_REGION).toStringVal()); } - return false; } -// static -void LLPanelEstateCovenant::resetCovenantID(void* userdata) +void LLPanelEnvironmentInfo::populateDayCyclesList() { - LLNotificationsUtil::add("EstateChangeCovenant", LLSD(), LLSD(), confirmResetCovenantCallback); -} + mDayCyclePresetCombo->removeall(); -// static -bool LLPanelEstateCovenant::confirmResetCovenantCallback(const LLSD& notification, const LLSD& response) -{ - LLPanelEstateCovenant* self = LLFloaterRegionInfo::getPanelCovenant(); - if (!self) return false; + // If the region already has env. settings, add its day cycle to the list. + const LLSD& cur_region_dc = LLEnvManagerNew::instance().getRegionSettings().getWLDayCycle(); + if (cur_region_dc.size() != 0) + { + LLViewerRegion* region = gAgent.getRegion(); + llassert(region != NULL); - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - switch(option) + LLWLParamKey key(region->getName(), LLEnvKey::SCOPE_REGION); + mDayCyclePresetCombo->add(region->getName(), key.toStringVal()); + mDayCyclePresetCombo->addSeparator(); + } + + // Add local user day cycles. + LLDayCycleManager::preset_name_list_t user_days, sys_days; + LLDayCycleManager::instance().getPresetNames(user_days, sys_days); + for (LLDayCycleManager::preset_name_list_t::const_iterator it = user_days.begin(); it != user_days.end(); ++it) { - case 0: - self->loadInvItem(NULL); - break; - default: - break; + mDayCyclePresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal()); } - return false; -} -void LLPanelEstateCovenant::loadInvItem(LLInventoryItem *itemp) -{ - const BOOL high_priority = TRUE; - if (itemp) + if (user_days.size() > 0) { - gAssetStorage->getInvItemAsset(gAgent.getRegionHost(), - gAgent.getID(), - gAgent.getSessionID(), - itemp->getPermissions().getOwner(), - LLUUID::null, - itemp->getUUID(), - itemp->getAssetUUID(), - itemp->getType(), - onLoadComplete, - (void*)this, - high_priority); - mAssetStatus = ASSET_LOADING; + mDayCyclePresetCombo->addSeparator(); } - else + + // Add local system day cycles. + for (LLDayCycleManager::preset_name_list_t::const_iterator it = sys_days.begin(); it != sys_days.end(); ++it) { - mAssetStatus = ASSET_LOADED; - setCovenantTextEditor(LLTrans::getString("RegionNoCovenant")); - sendChangeCovenantID(LLUUID::null); + mDayCyclePresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal()); } + + // Current day cycle is already selected. } -// static -void LLPanelEstateCovenant::onLoadComplete(LLVFS *vfs, - const LLUUID& asset_uuid, - LLAssetType::EType type, - void* user_data, S32 status, LLExtStat ext_status) +bool LLPanelEnvironmentInfo::getSelectedWaterParams(LLSD& water_params) { - LL_INFOS() << "LLPanelEstateCovenant::onLoadComplete()" << LL_ENDL; - LLPanelEstateCovenant* panelp = (LLPanelEstateCovenant*)user_data; - if( panelp ) + LLWLParamKey water_key(mWaterPresetCombo->getSelectedValue()); + + if (water_key.scope == LLEnvKey::SCOPE_REGION) { - if(0 == status) + water_params = LLEnvManagerNew::instance().getRegionSettings().getWaterParams(); + } + else + { + LLWaterParamSet param_set; + if (!LLWaterParamManager::instance().getParamSet(water_key.name, param_set)) { - LLVFile file(vfs, asset_uuid, type, LLVFile::READ); + LL_WARNS() << "Error getting water preset: " << water_key.name << LL_ENDL; + return false; + } - S32 file_length = file.getSize(); + water_params = param_set.getAll(); + } - std::vector<char> buffer(file_length+1); - file.read((U8*)&buffer[0], file_length); - // put a EOS at the end - buffer[file_length] = 0; + return true; +} - if( (file_length > 19) && !strncmp( &buffer[0], "Linden text version", 19 ) ) - { - if( !panelp->mEditor->importBuffer( &buffer[0], file_length+1 ) ) - { - LL_WARNS() << "Problem importing estate covenant." << LL_ENDL; - LLNotificationsUtil::add("ProblemImportingEstateCovenant"); - } - else - { - panelp->sendChangeCovenantID(asset_uuid); - } - } - else - { - // Version 0 (just text, doesn't include version number) - panelp->sendChangeCovenantID(asset_uuid); - } - } - else - { - if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status || - LL_ERR_FILE_EMPTY == status) - { - LLNotificationsUtil::add("MissingNotecardAssetID"); - } - else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status) - { - LLNotificationsUtil::add("NotAllowedToViewNotecard"); - } - else - { - LLNotificationsUtil::add("UnableToLoadNotecardAsset"); - } +bool LLPanelEnvironmentInfo::getSelectedSkyParams(LLSD& sky_params, std::string& preset_name) +{ + std::string preset_key(mSkyPresetCombo->getValue().asString()); + LLWLParamKey preset(preset_key); - LL_WARNS() << "Problem loading notecard: " << status << LL_ENDL; - } - panelp->mAssetStatus = ASSET_LOADED; - panelp->setCovenantID(asset_uuid); + // Get the preset sky params. + LLWLParamSet param_set; + if (!LLWLParamManager::instance().getParamSet(preset, param_set)) + { + LL_WARNS() << "Error getting sky params: " << preset.toLLSD() << LL_ENDL; + return false; } + + sky_params = param_set.getAll(); + preset_name = preset.name; + return true; } -// key = "estatechangecovenantid" -// strings[0] = str(estate_id) (added by simulator before relay - not here) -// strings[1] = str(covenant_id) -void LLPanelEstateCovenant::sendChangeCovenantID(const LLUUID &asset_id) +bool LLPanelEnvironmentInfo::getSelectedDayCycleParams(LLSD& day_cycle, LLSD& sky_map, short& scope) { - if (asset_id != getCovenantID()) + std::string preset_key(mDayCyclePresetCombo->getValue().asString()); + LLWLParamKey dc(preset_key); + LL_DEBUGS("Windlight") << "Use day cycle: " << dc.toLLSD() << LL_ENDL; + + if (dc.scope == LLEnvKey::SCOPE_REGION) // current region day cycle { - setCovenantID(asset_id); + const LLEnvironmentSettings& cur_region_settings = LLEnvManagerNew::instance().getRegionSettings(); + day_cycle = cur_region_settings.getWLDayCycle(); + sky_map = cur_region_settings.getSkyMap(); + } + else // a local day cycle + { + if (!LLDayCycleManager::instance().getPreset(dc.name, day_cycle)) + { + LL_WARNS() << "Error getting day cycle " << dc.name << LL_ENDL; + return false; + } - LLMessageSystem* msg = gMessageSystem; - msg->newMessage("EstateOwnerMessage"); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used + // Create sky map from the day cycle. + { + LLWLDayCycle tmp_day; + tmp_day.loadDayCycle(day_cycle, dc.scope); + tmp_day.getSkyMap(sky_map); + } + } - msg->nextBlock("MethodData"); - msg->addString("Method", "estatechangecovenantid"); - msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice()); + scope = dc.scope; - msg->nextBlock("ParamList"); - msg->addString("Parameter", getCovenantID().asString()); - gAgent.sendReliableMessage(); - } + return true; } - -// virtual -BOOL LLPanelEstateCovenant::sendUpdate() +void LLPanelEnvironmentInfo::onSwitchRegionSettings() { - return TRUE; -} + bool use_defaults = mRegionSettingsRadioGroup->getSelectedIndex() == 0; + getChild<LLView>("user_environment_settings")->setEnabled(!use_defaults); -std::string LLPanelEstateCovenant::getEstateName() const -{ - return mEstateNameText->getText(); -} + if (use_defaults) + { + LLEnvManagerNew::instance().useDefaults(); + } + else + { + onSelectWaterPreset(); + onSwitchDayCycle(); + } -void LLPanelEstateCovenant::setEstateName(const std::string& name) -{ - mEstateNameText->setText(name); + setDirty(true); } -// static -void LLPanelEstateCovenant::updateCovenantText(const std::string& string, const LLUUID& asset_id) +void LLPanelEnvironmentInfo::onSwitchDayCycle() { - LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant(); - if( panelp ) + bool is_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0; + + mSkyPresetCombo->setEnabled(is_fixed_sky); + mDayCyclePresetCombo->setEnabled(!is_fixed_sky); + + if (is_fixed_sky) { - panelp->mEditor->setText(string); - panelp->setCovenantID(asset_id); + onSelectSkyPreset(); + } + else + { + onSelectDayCycle(); } + + setDirty(true); } -// static -void LLPanelEstateCovenant::updateEstateName(const std::string& name) +void LLPanelEnvironmentInfo::onSelectWaterPreset() { - LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant(); - if( panelp ) + LLSD water_params; + + if (getSelectedWaterParams(water_params)) { - panelp->mEstateNameText->setText(name); + LLEnvManagerNew::instance().useWaterParams(water_params); } + + setDirty(true); } -// static -void LLPanelEstateCovenant::updateLastModified(const std::string& text) +void LLPanelEnvironmentInfo::onSelectSkyPreset() { - LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant(); - if( panelp ) + LLSD params; + std::string dummy; + + if (getSelectedSkyParams(params, dummy)) { - panelp->mLastModifiedText->setText(text); + LLEnvManagerNew::instance().useSkyParams(params); } + + setDirty(true); } -// static -void LLPanelEstateCovenant::updateEstateOwnerName(const std::string& name) +void LLPanelEnvironmentInfo::onSelectDayCycle() { - LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant(); - if( panelp ) + LLSD day_cycle; + LLSD sky_map; // unused + short scope; + + if (getSelectedDayCycleParams(day_cycle, sky_map, scope)) { - panelp->mEstateOwnerText->setText(name); + LLEnvManagerNew::instance().useDayCycleParams(day_cycle, (LLEnvKey::EScope) scope); } -} -std::string LLPanelEstateCovenant::getOwnerName() const -{ - return mEstateOwnerText->getText(); + setDirty(true); } -void LLPanelEstateCovenant::setOwnerName(const std::string& name) +void LLPanelEnvironmentInfo::onBtnApply() { - mEstateOwnerText->setText(name); -} + const bool use_defaults = mRegionSettingsRadioGroup->getSelectedIndex() == 0; + const bool use_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0; -void LLPanelEstateCovenant::setCovenantTextEditor(const std::string& text) -{ - mEditor->setText(text); -} + LLSD day_cycle; + LLSD sky_map; + LLSD water_params; -// key = "estateupdateinfo" -// strings[0] = estate name -// strings[1] = str(owner_id) -// strings[2] = str(estate_id) -// strings[3] = str(estate_flags) -// strings[4] = str((S32)(sun_hour * 1024)) -// strings[5] = str(parent_estate_id) -// strings[6] = str(covenant_id) -// strings[7] = str(covenant_timestamp) -// strings[8] = str(send_to_agent_only) -// strings[9] = str(abuse_email_addr) -bool LLDispatchEstateUpdateInfo::operator()( - const LLDispatcher* dispatcher, - const std::string& key, - const LLUUID& invoice, - const sparam_t& strings) -{ - LL_DEBUGS() << "Received estate update" << LL_ENDL; + if (use_defaults) + { + // settings will be empty + LL_DEBUGS("Windlight") << "Defaults" << LL_ENDL; + } + else // use custom region settings + { + if (use_fixed_sky) + { + LL_DEBUGS("Windlight") << "Use fixed sky" << LL_ENDL; - // Update estate info model. - // This will call LLPanelEstateInfo::refreshFromEstate(). - // *TODO: Move estate message handling stuff to llestateinfomodel.cpp. - LLEstateInfoModel::instance().update(strings); + // Get selected sky params. + LLSD params; + std::string preset_name; + if (!getSelectedSkyParams(params, preset_name)) + { + return; + } - return true; -} + // Create a day cycle consisting of a single sky preset. + LLSD key(LLSD::emptyArray()); + key.append(-1.0f); // indicate that user preference is actually fixed sky, not a day cycle + key.append(preset_name); + day_cycle.append(key); + // Create a sky map consisting of only the sky preset. + std::map<LLWLParamKey, LLWLParamSet> refs; + LLWLParamSet param_set; + param_set.setAll(params); + refs[LLWLParamKey(preset_name, LLEnvKey::SCOPE_LOCAL)] = param_set; // scope doesn't matter here + sky_map = LLWLParamManager::createSkyMap(refs); + } + else // use day cycle + { + LL_DEBUGS("Windlight") << "Use day cycle" << LL_ENDL; -// key = "setaccess" -// strings[0] = str(estate_id) -// strings[1] = str(packed_access_lists) -// strings[2] = str(num allowed agent ids) -// strings[3] = str(num allowed group ids) -// strings[4] = str(num banned agent ids) -// strings[5] = str(num estate manager agent ids) -// strings[6] = bin(uuid) -// strings[7] = bin(uuid) -// strings[8] = bin(uuid) -// ... -bool LLDispatchSetEstateAccess::operator()( - const LLDispatcher* dispatcher, - const std::string& key, - const LLUUID& invoice, - const sparam_t& strings) -{ - LLPanelEstateInfo* panel = LLFloaterRegionInfo::getPanelEstate(); - if (!panel) return true; + short scope; // unused + if (!getSelectedDayCycleParams(day_cycle, sky_map, scope)) + { + return; + } - S32 index = 1; // skip estate_id - U32 access_flags = strtoul(strings[index++].c_str(), NULL,10); - S32 num_allowed_agents = strtol(strings[index++].c_str(), NULL, 10); - S32 num_allowed_groups = strtol(strings[index++].c_str(), NULL, 10); - S32 num_banned_agents = strtol(strings[index++].c_str(), NULL, 10); - S32 num_estate_managers = strtol(strings[index++].c_str(), NULL, 10); + // If it's a special single-preset day cycle meaning using a fixed sky, + // reset the frame time to a non-negative value, + // so that the region setting is displayed in the floater as + // a day cycle, not a preset. (STORM-1289) + if (day_cycle.size() == 1 && day_cycle[0][0].asReal() < 0.0f) + { + LL_DEBUGS("Windlight") << "Fixing negative time" << LL_ENDL; + day_cycle[0][0] = 0.0f; + } + } - // sanity ckecks - if (num_allowed_agents > 0 - && !(access_flags & ESTATE_ACCESS_ALLOWED_AGENTS)) - { - LL_WARNS() << "non-zero count for allowed agents, but no corresponding flag" << LL_ENDL; + // Get water params. + if (!getSelectedWaterParams(water_params)) + { + // *TODO: show a notification? + return; + } } - if (num_allowed_groups > 0 - && !(access_flags & ESTATE_ACCESS_ALLOWED_GROUPS)) + + // Send settings apply request. + LLEnvironmentSettings new_region_settings; + new_region_settings.saveParams(day_cycle, sky_map, water_params, 0.0f); + if (!LLEnvManagerNew::instance().sendRegionSettings(new_region_settings)) { - LL_WARNS() << "non-zero count for allowed groups, but no corresponding flag" << LL_ENDL; + LL_WARNS() << "Error applying region environment settings" << LL_ENDL; + return; } - if (num_banned_agents > 0 - && !(access_flags & ESTATE_ACCESS_BANNED_AGENTS)) + + // When the settings get applied, we'll also send the region sun position update. + // To determine the sun angle we're going to need the new settings. + mNewRegionSettings = new_region_settings; + + // Start spinning the progress indicator. + setApplyProgress(true); +} + +void LLPanelEnvironmentInfo::onBtnCancel() +{ + // Reload last saved region settings. + refresh(); + + // Apply them. + LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance(); + const LLEnvironmentSettings& cur_settings = env_mgr.getRegionSettings(); + const LLSD& region_day_cycle = cur_settings.getWLDayCycle(); + const LLSD& region_water = cur_settings.getWaterParams(); + env_mgr.useWaterParams(region_water); + env_mgr.useDayCycleParams(region_day_cycle, LLEnvKey::SCOPE_REGION); +} + +void LLPanelEnvironmentInfo::onRegionSettingschange() +{ + LL_DEBUGS("Windlight") << "Region settings changed, refreshing" << LL_ENDL; + refresh(); + + // Stop applying progress indicator (it may be running if it's us who initiated settings update). + setApplyProgress(false); +} + +void LLPanelEnvironmentInfo::onRegionSettingsApplied(bool ok) +{ + // If applying new settings has failed, stop the indicator right away. + // Otherwise it will be stopped when we receive the updated settings from server. + if (ok) { - LL_WARNS() << "non-zero count for banned agents, but no corresponding flag" << LL_ENDL; + // Set the region sun phase/flags according to the chosen new preferences. + // + // If we do this earlier we may get jerky transition from fixed sky to a day cycle (STORM-1481). + // That is caused by the simulator re-sending the region info, which in turn makes us + // re-request and display old region environment settings while the new ones haven't been applied yet. + sendRegionSunUpdate(); + + // Switch estate to not using fixed sun for the region day cycle to work properly (STORM-1506). + fixEstateSun(); } - if (num_estate_managers > 0 - && !(access_flags & ESTATE_ACCESS_MANAGERS)) + else { - LL_WARNS() << "non-zero count for managers, but no corresponding flag" << LL_ENDL; - } + setApplyProgress(false); - // grab the UUID's out of the string fields - if (access_flags & ESTATE_ACCESS_ALLOWED_AGENTS) - { - LLNameListCtrl* allowed_agent_name_list; - allowed_agent_name_list = panel->getChild<LLNameListCtrl>("allowed_avatar_name_list"); + // We need to re-request environment setting here, + // otherwise our subsequent attempts to change region settings will fail with the following error: + // "Unable to update environment settings because the last update your viewer saw was not the same + // as the last update sent from the simulator. Try sending your update again, and if this + // does not work, try leaving and returning to the region." + LLEnvManagerNew::instance().requestRegionSettings(); + } +} - int totalAllowedAgents = num_allowed_agents; - - if (allowed_agent_name_list) - { - totalAllowedAgents += allowed_agent_name_list->getItemCount(); - } +BOOL LLPanelRegionExperiences::postBuild() +{ + mAllowed = setupList("panel_allowed", ESTATE_EXPERIENCE_ALLOWED_ADD, ESTATE_EXPERIENCE_ALLOWED_REMOVE); + mTrusted = setupList("panel_trusted", ESTATE_EXPERIENCE_TRUSTED_ADD, ESTATE_EXPERIENCE_TRUSTED_REMOVE); + mBlocked = setupList("panel_blocked", ESTATE_EXPERIENCE_BLOCKED_ADD, ESTATE_EXPERIENCE_BLOCKED_REMOVE); - LLStringUtil::format_map_t args; - args["[ALLOWEDAGENTS]"] = llformat ("%d", totalAllowedAgents); - args["[MAXACCESS]"] = llformat ("%d", ESTATE_MAX_ACCESS_IDS); - std::string msg = LLTrans::getString("RegionInfoAllowedResidents", args); - panel->getChild<LLUICtrl>("allow_resident_label")->setValue(LLSD(msg)); + getChild<LLLayoutPanel>("trusted_layout_panel")->setVisible(TRUE); + getChild<LLTextBox>("experiences_help_text")->setText(getString("estate_caption")); + getChild<LLTextBox>("trusted_text_help")->setText(getString("trusted_estate_text")); + getChild<LLTextBox>("allowed_text_help")->setText(getString("allowed_estate_text")); + getChild<LLTextBox>("blocked_text_help")->setText(getString("blocked_estate_text")); - if (allowed_agent_name_list) - { - // Don't sort these as we add them, sort them when we are done. - allowed_agent_name_list->clearSortOrder(); - for (S32 i = 0; i < num_allowed_agents && i < ESTATE_MAX_ACCESS_IDS; i++) - { - LLUUID id; - memcpy(id.mData, strings[index++].data(), UUID_BYTES); /* Flawfinder: ignore */ - allowed_agent_name_list->addNameItem(id); - } - allowed_agent_name_list->sortByName(TRUE); - } - } + return LLPanelRegionInfo::postBuild(); +} - if (access_flags & ESTATE_ACCESS_ALLOWED_GROUPS) +LLPanelExperienceListEditor* LLPanelRegionExperiences::setupList( const char* control_name, U32 add_id, U32 remove_id ) +{ + LLPanelExperienceListEditor* child = findChild<LLPanelExperienceListEditor>(control_name); + if(child) { - LLNameListCtrl* allowed_group_name_list; - allowed_group_name_list = panel->getChild<LLNameListCtrl>("allowed_group_name_list"); + child->getChild<LLTextBox>("text_name")->setText(child->getString(control_name)); + child->setMaxExperienceIDs(ESTATE_MAX_EXPERIENCE_IDS); + child->setAddedCallback( boost::bind(&LLPanelRegionExperiences::itemChanged, this, add_id, _1)); + child->setRemovedCallback(boost::bind(&LLPanelRegionExperiences::itemChanged, this, remove_id, _1)); + } - LLStringUtil::format_map_t args; - args["[ALLOWEDGROUPS]"] = llformat ("%d", num_allowed_groups); - args["[MAXACCESS]"] = llformat ("%d", ESTATE_MAX_GROUP_IDS); - std::string msg = LLTrans::getString("RegionInfoAllowedGroups", args); - panel->getChild<LLUICtrl>("allow_group_label")->setValue(LLSD(msg)); + return child; +} - if (allowed_group_name_list) - { - // Don't sort these as we add them, sort them when we are done. - allowed_group_name_list->clearSortOrder(); - allowed_group_name_list->deleteAllItems(); - for (S32 i = 0; i < num_allowed_groups && i < ESTATE_MAX_GROUP_IDS; i++) - { - LLUUID id; - memcpy(id.mData, strings[index++].data(), UUID_BYTES); /* Flawfinder: ignore */ - allowed_group_name_list->addGroupNameItem(id); - } - allowed_group_name_list->sortByName(TRUE); - } - } - if (access_flags & ESTATE_ACCESS_BANNED_AGENTS) +void LLPanelRegionExperiences::processResponse( const LLSD& content ) +{ + if(content.has("default")) { - LLNameListCtrl* banned_agent_name_list; - banned_agent_name_list = panel->getChild<LLNameListCtrl>("banned_avatar_name_list"); - - int totalBannedAgents = num_banned_agents; - - if (banned_agent_name_list) - { - totalBannedAgents += banned_agent_name_list->getItemCount(); - } + mDefaultExperience = content["default"].asUUID(); + } + mAllowed->setExperienceIds(content["allowed"]); + mBlocked->setExperienceIds(content["blocked"]); - LLStringUtil::format_map_t args; - args["[BANNEDAGENTS]"] = llformat("%d", totalBannedAgents); - args["[MAXBANNED]"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); - std::string msg = LLTrans::getString("RegionInfoBannedResidents", args); - panel->getChild<LLUICtrl>("ban_resident_label")->setValue(LLSD(msg)); + LLSD trusted = content["trusted"]; + if(mDefaultExperience.notNull()) + { + mTrusted->setStickyFunction(boost::bind(LLPanelExperiencePicker::FilterMatching, _1, mDefaultExperience)); + trusted.append(mDefaultExperience); + } - if (banned_agent_name_list) - { - // Don't sort these as we add them, sort them when we are done. - banned_agent_name_list->clearSortOrder(); + mTrusted->setExperienceIds(trusted); + + mAllowed->refreshExperienceCounter(); + mBlocked->refreshExperienceCounter(); + mTrusted->refreshExperienceCounter(); - for (S32 i = 0; i < num_banned_agents && i < ESTATE_MAX_ACCESS_IDS; i++) - { - LLUUID id; - memcpy(id.mData, strings[index++].data(), UUID_BYTES); /* Flawfinder: ignore */ - banned_agent_name_list->addNameItem(id); - } - banned_agent_name_list->sortByName(TRUE); - } - } +} - if (access_flags & ESTATE_ACCESS_MANAGERS) - { - LLStringUtil::format_map_t args; - args["[ESTATEMANAGERS]"] = llformat("%d", num_estate_managers); - args["[MAXMANAGERS]"] = llformat("%d", ESTATE_MAX_MANAGERS); - std::string msg = LLTrans::getString("RegionInfoEstateManagers", args); - panel->getChild<LLUICtrl>("estate_manager_label")->setValue(LLSD(msg)); +// Used for both access add and remove operations, depending on the flag +// passed in (ESTATE_EXPERIENCE_ALLOWED_ADD, ESTATE_EXPERIENCE_ALLOWED_REMOVE, etc.) +// static +bool LLPanelRegionExperiences::experienceCoreConfirm(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + const U32 originalFlags = (U32)notification["payload"]["operation"].asInteger(); - LLNameListCtrl* estate_manager_name_list = - panel->getChild<LLNameListCtrl>("estate_manager_name_list"); - if (estate_manager_name_list) - { - // Don't sort these as we add them, sort them when we are done. - estate_manager_name_list->clearSortOrder(); + LLViewerRegion* region = gAgent.getRegion(); + + LLSD::array_const_iterator end_it = notification["payload"]["allowed_ids"].endArray(); - estate_manager_name_list->deleteAllItems(); // Clear existing entries + for (LLSD::array_const_iterator iter = notification["payload"]["allowed_ids"].beginArray(); + iter != end_it; + iter++) + { + U32 flags = originalFlags; + if (iter + 1 != end_it) + flags |= ESTATE_ACCESS_NO_REPLY; - // There should be only ESTATE_MAX_MANAGERS people in the list, but if the database gets more (SL-46107) don't - // truncate the list unless it's really big. Go ahead and show the extras so the user doesn't get confused, - // and they can still remove them. - for (S32 i = 0; i < num_estate_managers && i < (ESTATE_MAX_MANAGERS * 4); i++) + const LLUUID id = iter->asUUID(); + switch(option) + { + case 0: + // This estate + sendEstateExperienceDelta(flags, id); + break; + case 1: { - LLUUID id; - memcpy(id.mData, strings[index++].data(), UUID_BYTES); /* Flawfinder: ignore */ - estate_manager_name_list->addNameItem(id); + // All estates, either than I own or manage for this owner. + // This will be verified on simulator. JC + if (!region) break; + if (region->getOwner() == gAgent.getID() + || gAgent.isGodlike()) + { + flags |= ESTATE_ACCESS_APPLY_TO_ALL_ESTATES; + sendEstateExperienceDelta(flags, id); + } + else if (region->isEstateManager()) + { + flags |= ESTATE_ACCESS_APPLY_TO_MANAGED_ESTATES; + sendEstateExperienceDelta(flags, id); + } + break; } - estate_manager_name_list->sortByName(TRUE); + case 2: + default: + break; } } - - // Update the buttons which may change based on the list contents but also needs to account for general access features. - panel->updateControls(gAgent.getRegion()); - - return true; + return false; } -LLSD LLDispatchSetEstateExperience::getIDs( sparam_t::const_iterator it, sparam_t::const_iterator end, S32 count ) + +// Send the actual "estateexperiencedelta" message +void LLPanelRegionExperiences::sendEstateExperienceDelta(U32 flags, const LLUUID& experience_id) { - LLSD idList = LLSD::emptyArray(); - LLUUID id; - while(count--> 0) + strings_t str(3, std::string()); + gAgent.getID().toString(str[0]); + str[1] = llformat("%u", flags); + experience_id.toString(str[2]); + + LLPanelRegionExperiences* panel = LLFloaterRegionInfo::getPanelExperiences(); + if (panel) { - memcpy(id.mData, (*(it++)).data(), UUID_BYTES); - idList.append(id); + panel->sendEstateOwnerMessage(gMessageSystem, "estateexperiencedelta", LLFloaterRegionInfo::getLastInvoice(), str); } - return idList; } -// key = "setexperience" -// strings[0] = str(estate_id) -// strings[1] = str(send_to_agent_only) -// strings[2] = str(num blocked) -// strings[3] = str(num trusted) -// strings[4] = str(num allowed) -// strings[8] = bin(uuid) ... -// ... -bool LLDispatchSetEstateExperience::operator()( - const LLDispatcher* dispatcher, - const std::string& key, - const LLUUID& invoice, - const sparam_t& strings) -{ - LLPanelRegionExperiences* panel = LLFloaterRegionInfo::getPanelExperiences(); - if (!panel) return true; - - sparam_t::const_iterator it = strings.begin(); - ++it; // U32 estate_id = strtol((*it).c_str(), NULL, 10); - ++it; // U32 send_to_agent_only = strtoul((*(++it)).c_str(), NULL, 10); - - LLUUID id; - S32 num_blocked = strtol((*(it++)).c_str(), NULL, 10); - S32 num_trusted = strtol((*(it++)).c_str(), NULL, 10); - S32 num_allowed = strtol((*(it++)).c_str(), NULL, 10); - - LLSD ids = LLSD::emptyMap() - .with("blocked", getIDs(it, strings.end(), num_blocked)) - .with("trusted", getIDs(it + (num_blocked), strings.end(), num_trusted)) - .with("allowed", getIDs(it + (num_blocked+num_trusted), strings.end(), num_allowed)); - panel->processResponse(ids); +void LLPanelRegionExperiences::infoCallback(LLHandle<LLPanelRegionExperiences> handle, const LLSD& content) +{ + if(handle.isDead()) + return; - return true; + LLPanelRegionExperiences* floater = handle.get(); + if (floater) + { + floater->processResponse(content); + } } - - -LLPanelEnvironmentInfo::LLPanelEnvironmentInfo() -: mEnableEditing(false), - mRegionSettingsRadioGroup(NULL), - mDayCycleSettingsRadioGroup(NULL), - mWaterPresetCombo(NULL), - mSkyPresetCombo(NULL), - mDayCyclePresetCombo(NULL) +/*static*/ +std::string LLPanelRegionExperiences::regionCapabilityQuery(LLViewerRegion* region, const std::string &cap) { + // region->getHandle() How to get a region * from a handle? + + return region->getCapability(cap); } -// virtual -BOOL LLPanelEnvironmentInfo::postBuild() +bool LLPanelRegionExperiences::refreshFromRegion(LLViewerRegion* region) { - mRegionSettingsRadioGroup = getChild<LLRadioGroup>("region_settings_radio_group"); - mRegionSettingsRadioGroup->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSwitchRegionSettings, this)); - - mDayCycleSettingsRadioGroup = getChild<LLRadioGroup>("sky_dayc_settings_radio_group"); - mDayCycleSettingsRadioGroup->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSwitchDayCycle, this)); - - mWaterPresetCombo = getChild<LLComboBox>("water_settings_preset_combo"); - mWaterPresetCombo->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSelectWaterPreset, this)); - - mSkyPresetCombo = getChild<LLComboBox>("sky_settings_preset_combo"); - mSkyPresetCombo->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSelectSkyPreset, this)); - - mDayCyclePresetCombo = getChild<LLComboBox>("dayc_settings_preset_combo"); - mDayCyclePresetCombo->setCommitCallback(boost::bind(&LLPanelEnvironmentInfo::onSelectDayCycle, this)); + BOOL allow_modify = gAgent.isGodlike() || (region && region->canManageEstate()); - childSetCommitCallback("apply_btn", boost::bind(&LLPanelEnvironmentInfo::onBtnApply, this), NULL); - getChild<LLButton>("apply_btn")->setRightMouseDownCallback(boost::bind(&LLEnvManagerNew::dumpUserPrefs, LLEnvManagerNew::getInstance())); - childSetCommitCallback("cancel_btn", boost::bind(&LLPanelEnvironmentInfo::onBtnCancel, this), NULL); - getChild<LLButton>("cancel_btn")->setRightMouseDownCallback(boost::bind(&LLEnvManagerNew::dumpPresets, LLEnvManagerNew::getInstance())); + mAllowed->loading(); + mAllowed->setReadonly(!allow_modify); + // remove grid-wide experiences + mAllowed->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithProperty, _1, LLExperienceCache::PROPERTY_GRID)); + // remove default experience + mAllowed->addFilter(boost::bind(LLPanelExperiencePicker::FilterMatching, _1, mDefaultExperience)); - LLEnvManagerNew::instance().setRegionSettingsChangeCallback(boost::bind(&LLPanelEnvironmentInfo::onRegionSettingschange, this)); - LLEnvManagerNew::instance().setRegionSettingsAppliedCallback(boost::bind(&LLPanelEnvironmentInfo::onRegionSettingsApplied, this, _1)); + mBlocked->loading(); + mBlocked->setReadonly(!allow_modify); + // only grid-wide experiences + mBlocked->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithoutProperty, _1, LLExperienceCache::PROPERTY_GRID)); + // but not privileged ones + mBlocked->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithProperty, _1, LLExperienceCache::PROPERTY_PRIVILEGED)); + // remove default experience + mBlocked->addFilter(boost::bind(LLPanelExperiencePicker::FilterMatching, _1, mDefaultExperience)); - LLDayCycleManager::instance().setModifyCallback(boost::bind(&LLPanelEnvironmentInfo::populateDayCyclesList, this)); - LLWLParamManager::instance().setPresetListChangeCallback(boost::bind(&LLPanelEnvironmentInfo::populateSkyPresetsList, this)); - LLWaterParamManager::instance().setPresetListChangeCallback(boost::bind(&LLPanelEnvironmentInfo::populateWaterPresetsList, this)); + mTrusted->loading(); + mTrusted->setReadonly(!allow_modify); - return TRUE; -} + LLExperienceCache::instance().getRegionExperiences(boost::bind(&LLPanelRegionExperiences::regionCapabilityQuery, region, _1), + boost::bind(&LLPanelRegionExperiences::infoCallback, getDerivedHandle<LLPanelRegionExperiences>(), _1)); -// virtual -void LLPanelEnvironmentInfo::onOpen(const LLSD& key) -{ - LL_DEBUGS("Windlight") << "Panel opened, refreshing" << LL_ENDL; - refresh(); + return LLPanelRegionInfo::refreshFromRegion(region); } -// virtual -void LLPanelEnvironmentInfo::onVisibilityChange(BOOL new_visibility) +LLSD LLPanelRegionExperiences::addIds(LLPanelExperienceListEditor* panel) { - // If hiding (user switched to another tab or closed the floater), - // display user's preferred environment. - if (!new_visibility) + LLSD ids; + const uuid_list_t& id_list = panel->getExperienceIds(); + for(uuid_list_t::const_iterator it = id_list.begin(); it != id_list.end(); ++it) { - LLEnvManagerNew::instance().usePrefs(); - } -} - -// virtual -bool LLPanelEnvironmentInfo::refreshFromRegion(LLViewerRegion* region) -{ - LL_DEBUGS("Windlight") << "Region updated, enabling/disabling controls" << LL_ENDL; - BOOL owner_or_god = gAgent.isGodlike() || (region && (region->getOwner() == gAgent.getID())); - BOOL owner_or_god_or_manager = owner_or_god || (region && region->isEstateManager()); - - // Don't refresh from region settings to avoid flicker after applying new region settings. - mEnableEditing = owner_or_god_or_manager; - setControlsEnabled(mEnableEditing); - - return LLPanelRegionInfo::refreshFromRegion(region); + ids.append(*it); + } + return ids; } -void LLPanelEnvironmentInfo::refresh() + +BOOL LLPanelRegionExperiences::sendUpdate() { - if(gDisconnected) - { - return; - } + LLViewerRegion* region = gAgent.getRegion(); - populateWaterPresetsList(); - populateSkyPresetsList(); - populateDayCyclesList(); + LLSD content; - // Init radio groups. - const LLEnvironmentSettings& settings = LLEnvManagerNew::instance().getRegionSettings(); - const LLSD& dc = settings.getWLDayCycle(); - LLSD::Real first_frame_time = dc.size() > 0 ? dc[0][0].asReal() : 0.0f; - const bool use_fixed_sky = dc.size() == 1 && first_frame_time < 0; - mRegionSettingsRadioGroup->setSelectedIndex(settings.getSkyMap().size() == 0 ? 0 : 1); - mDayCycleSettingsRadioGroup->setSelectedIndex(use_fixed_sky ? 0 : 1); + content["allowed"]=addIds(mAllowed); + content["blocked"]=addIds(mBlocked); + content["trusted"]=addIds(mTrusted); - setControlsEnabled(mEnableEditing); + LLExperienceCache::instance().setRegionExperiences(boost::bind(&LLPanelRegionExperiences::regionCapabilityQuery, region, _1), + content, boost::bind(&LLPanelRegionExperiences::infoCallback, getDerivedHandle<LLPanelRegionExperiences>(), _1)); - setDirty(false); + return TRUE; } -void LLPanelEnvironmentInfo::setControlsEnabled(bool enabled) +void LLPanelRegionExperiences::itemChanged( U32 event_type, const LLUUID& id ) { - mRegionSettingsRadioGroup->setEnabled(enabled); - mDayCycleSettingsRadioGroup->setEnabled(enabled); + std::string dialog_name; + switch (event_type) + { + case ESTATE_EXPERIENCE_ALLOWED_ADD: + dialog_name = "EstateAllowedExperienceAdd"; + break; - mWaterPresetCombo->setEnabled(enabled); - mSkyPresetCombo->setEnabled(enabled); - mDayCyclePresetCombo->setEnabled(enabled); + case ESTATE_EXPERIENCE_ALLOWED_REMOVE: + dialog_name = "EstateAllowedExperienceRemove"; + break; - getChildView("apply_btn")->setEnabled(enabled); - getChildView("cancel_btn")->setEnabled(enabled); + case ESTATE_EXPERIENCE_TRUSTED_ADD: + dialog_name = "EstateTrustedExperienceAdd"; + break; - if (enabled) - { - // Enable/disable some controls based on currently selected radio buttons. - bool use_defaults = mRegionSettingsRadioGroup->getSelectedIndex() == 0; - getChild<LLView>("user_environment_settings")->setEnabled(!use_defaults); + case ESTATE_EXPERIENCE_TRUSTED_REMOVE: + dialog_name = "EstateTrustedExperienceRemove"; + break; - bool is_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0; - mSkyPresetCombo->setEnabled(is_fixed_sky); - mDayCyclePresetCombo->setEnabled(!is_fixed_sky); + case ESTATE_EXPERIENCE_BLOCKED_ADD: + dialog_name = "EstateBlockedExperienceAdd"; + break; + + case ESTATE_EXPERIENCE_BLOCKED_REMOVE: + dialog_name = "EstateBlockedExperienceRemove"; + break; + + default: + return; } -} -void LLPanelEnvironmentInfo::setApplyProgress(bool started) -{ - LLLoadingIndicator* indicator = getChild<LLLoadingIndicator>("progress_indicator"); + LLSD payload; + payload["operation"] = (S32)event_type; + payload["dialog_name"] = dialog_name; + payload["allowed_ids"].append(id); - indicator->setVisible(started); + LLSD args; + args["ALL_ESTATES"] = all_estates_text(); - if (started) + LLNotification::Params params(dialog_name); + params.payload(payload) + .substitutions(args) + .functor.function(LLPanelRegionExperiences::experienceCoreConfirm); + if (LLPanelEstateInfo::isLindenEstate()) { - indicator->start(); + LLNotifications::instance().forceResponse(params, 0); } else { - indicator->stop(); + LLNotifications::instance().add(params); } -} -void LLPanelEnvironmentInfo::setDirty(bool dirty) -{ - getChildView("apply_btn")->setEnabled(dirty); - getChildView("cancel_btn")->setEnabled(dirty); + onChangeAnything(); } -void LLPanelEnvironmentInfo::sendRegionSunUpdate() -{ - LLRegionInfoModel& region_info = LLRegionInfoModel::instance(); - - // If the region is being switched to fixed sky, - // change the region's sun hour according to the (fixed) sun position. - // This is needed for llGetSunDirection() LSL function to work properly (STORM-1330). - const LLSD& sky_map = mNewRegionSettings.getSkyMap(); - bool region_use_fixed_sky = sky_map.size() == 1; - if (region_use_fixed_sky) - { - LLWLParamSet param_set; - llassert(sky_map.isMap()); - param_set.setAll(sky_map.beginMap()->second); - F32 sun_angle = param_set.getSunAngle(); - - LL_DEBUGS("WindlightSync") << "Old sun hour: " << region_info.mSunHour << LL_ENDL; - // convert value range from 0..2pi to 6..30 - region_info.mSunHour = fmodf((sun_angle / F_TWO_PI) * 24.f, 24.f) + 6.f; - } - - region_info.setUseFixedSun(region_use_fixed_sky); - region_info.mUseEstateSun = !region_use_fixed_sky; - LL_DEBUGS("WindlightSync") << "Sun hour: " << region_info.mSunHour << LL_ENDL; - region_info.sendRegionTerrain(LLFloaterRegionInfo::getLastInvoice()); -} +LLPanelEstateAccess::LLPanelEstateAccess() +: LLPanelRegionInfo(), mPendingUpdate(false) +{} -void LLPanelEnvironmentInfo::fixEstateSun() +BOOL LLPanelEstateAccess::postBuild() { - // We don't support fixed sun estates anymore and need to fix - // such estates for region day cycle to take effect. - // *NOTE: Assuming that current estate settings have arrived already. - LLEstateInfoModel& estate_info = LLEstateInfoModel::instance(); - if (estate_info.getUseFixedSun()) + getChild<LLUICtrl>("allowed_avatar_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1)); + LLNameListCtrl *avatar_name_list = getChild<LLNameListCtrl>("allowed_avatar_name_list"); + if (avatar_name_list) { - LL_INFOS() << "Switching estate to global sun" << LL_ENDL; - estate_info.setUseFixedSun(false); - estate_info.sendEstateInfo(); + avatar_name_list->setCommitOnSelectionChange(TRUE); + avatar_name_list->setMaxItemCount(ESTATE_MAX_ACCESS_IDS); } -} -void LLPanelEnvironmentInfo::populateWaterPresetsList() -{ - mWaterPresetCombo->removeall(); + getChild<LLUICtrl>("allowed_search_input")->setCommitCallback(boost::bind(&LLPanelEstateAccess::onAllowedSearchEdit, this, _2)); + childSetAction("add_allowed_avatar_btn", boost::bind(&LLPanelEstateAccess::onClickAddAllowedAgent, this)); + childSetAction("remove_allowed_avatar_btn", boost::bind(&LLPanelEstateAccess::onClickRemoveAllowedAgent, this)); + childSetAction("copy_allowed_list_btn", boost::bind(&LLPanelEstateAccess::onClickCopyAllowedList, this)); - // If the region already has water params, add them to the list. - const LLEnvironmentSettings& region_settings = LLEnvManagerNew::instance().getRegionSettings(); - if (region_settings.getWaterParams().size() != 0) + getChild<LLUICtrl>("allowed_group_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1)); + LLNameListCtrl* group_name_list = getChild<LLNameListCtrl>("allowed_group_name_list"); + if (group_name_list) { - const std::string& region_name = gAgent.getRegion()->getName(); - mWaterPresetCombo->add(region_name, LLWLParamKey(region_name, LLEnvKey::SCOPE_REGION).toLLSD()); - mWaterPresetCombo->addSeparator(); + group_name_list->setCommitOnSelectionChange(TRUE); + group_name_list->setMaxItemCount(ESTATE_MAX_ACCESS_IDS); } - std::list<std::string> user_presets, system_presets; - LLWaterParamManager::instance().getPresetNames(user_presets, system_presets); + getChild<LLUICtrl>("allowed_group_search_input")->setCommitCallback(boost::bind(&LLPanelEstateAccess::onAllowedGroupsSearchEdit, this, _2)); + getChild<LLUICtrl>("add_allowed_group_btn")->setCommitCallback(boost::bind(&LLPanelEstateAccess::onClickAddAllowedGroup, this)); + childSetAction("remove_allowed_group_btn", boost::bind(&LLPanelEstateAccess::onClickRemoveAllowedGroup, this)); + childSetAction("copy_allowed_group_list_btn", boost::bind(&LLPanelEstateAccess::onClickCopyAllowedGroupList, this)); - // Add local user presets first. - for (std::list<std::string>::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it) + getChild<LLUICtrl>("banned_avatar_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1)); + LLNameListCtrl* banned_name_list = getChild<LLNameListCtrl>("banned_avatar_name_list"); + if (banned_name_list) { - mWaterPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD()); + banned_name_list->setCommitOnSelectionChange(TRUE); + banned_name_list->setMaxItemCount(ESTATE_MAX_ACCESS_IDS); } - if (user_presets.size() > 0) - { - mWaterPresetCombo->addSeparator(); - } + getChild<LLUICtrl>("banned_search_input")->setCommitCallback(boost::bind(&LLPanelEstateAccess::onBannedSearchEdit, this, _2)); + childSetAction("add_banned_avatar_btn", boost::bind(&LLPanelEstateAccess::onClickAddBannedAgent, this)); + childSetAction("remove_banned_avatar_btn", boost::bind(&LLPanelEstateAccess::onClickRemoveBannedAgent, this)); + childSetAction("copy_banned_list_btn", boost::bind(&LLPanelEstateAccess::onClickCopyBannedList, this)); - // Add local system presets. - for (std::list<std::string>::const_iterator it = system_presets.begin(); it != system_presets.end(); ++it) + getChild<LLUICtrl>("estate_manager_name_list")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeChildCtrl, this, _1)); + LLNameListCtrl* manager_name_list = getChild<LLNameListCtrl>("estate_manager_name_list"); + if (manager_name_list) { - mWaterPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toLLSD()); + manager_name_list->setCommitOnSelectionChange(TRUE); + manager_name_list->setMaxItemCount(ESTATE_MAX_MANAGERS * 4); // Allow extras for dupe issue } - // There's no way to select current preset because its name is not stored on server. + childSetAction("add_estate_manager_btn", boost::bind(&LLPanelEstateAccess::onClickAddEstateManager, this)); + childSetAction("remove_estate_manager_btn", boost::bind(&LLPanelEstateAccess::onClickRemoveEstateManager, this)); + + return TRUE; } -void LLPanelEnvironmentInfo::populateSkyPresetsList() +void LLPanelEstateAccess::updateControls(LLViewerRegion* region) { - mSkyPresetCombo->removeall(); - - LLWLParamManager::preset_name_list_t region_presets; - LLWLParamManager::preset_name_list_t user_presets, sys_presets; - LLWLParamManager::instance().getPresetNames(region_presets, user_presets, sys_presets); - - // Add region presets. - std::string region_name = gAgent.getRegion() ? gAgent.getRegion()->getName() : LLTrans::getString("Unknown"); - for (LLWLParamManager::preset_name_list_t::const_iterator it = region_presets.begin(); it != region_presets.end(); ++it) - { - std::string preset_name = *it; - std::string item_title = preset_name + " (" + region_name + ")"; - mSkyPresetCombo->add(item_title, LLWLParamKey(preset_name, LLEnvKey::SCOPE_REGION).toStringVal()); - } + BOOL god = gAgent.isGodlike(); + BOOL owner = (region && (region->getOwner() == gAgent.getID())); + BOOL manager = (region && region->isEstateManager()); + BOOL enable_cotrols = god || owner || manager; + setCtrlsEnabled(enable_cotrols); + + BOOL has_allowed_avatar = getChild<LLNameListCtrl>("allowed_avatar_name_list")->getFirstSelected() ? TRUE : FALSE; + BOOL has_allowed_group = getChild<LLNameListCtrl>("allowed_group_name_list")->getFirstSelected() ? TRUE : FALSE; + BOOL has_banned_agent = getChild<LLNameListCtrl>("banned_avatar_name_list")->getFirstSelected() ? TRUE : FALSE; + BOOL has_estate_manager = getChild<LLNameListCtrl>("estate_manager_name_list")->getFirstSelected() ? TRUE : FALSE; - if (!region_presets.empty()) - { - mSkyPresetCombo->addSeparator(); - } + getChildView("add_allowed_avatar_btn")->setEnabled(enable_cotrols); + getChildView("remove_allowed_avatar_btn")->setEnabled(has_allowed_avatar && enable_cotrols); + getChildView("allowed_avatar_name_list")->setEnabled(enable_cotrols); - // Add user presets. - for (LLWLParamManager::preset_name_list_t::const_iterator it = user_presets.begin(); it != user_presets.end(); ++it) - { - mSkyPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal()); - } + getChildView("add_allowed_group_btn")->setEnabled(enable_cotrols); + getChildView("remove_allowed_group_btn")->setEnabled(has_allowed_group && enable_cotrols); + getChildView("allowed_group_name_list")->setEnabled(enable_cotrols); - if (!user_presets.empty()) - { - mSkyPresetCombo->addSeparator(); - } + // Can't ban people from mainland, orientation islands, etc. because this + // creates much network traffic and server load. + // Disable their accounts in CSR tool instead. + bool linden_estate = LLPanelEstateInfo::isLindenEstate(); + bool enable_ban = enable_cotrols && !linden_estate; + getChildView("add_banned_avatar_btn")->setEnabled(enable_ban); + getChildView("remove_banned_avatar_btn")->setEnabled(has_banned_agent && enable_ban); + getChildView("banned_avatar_name_list")->setEnabled(enable_cotrols); - // Add system presets. - for (LLWLParamManager::preset_name_list_t::const_iterator it = sys_presets.begin(); it != sys_presets.end(); ++it) - { - mSkyPresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal()); - } + // estate managers can't add estate managers + getChildView("add_estate_manager_btn")->setEnabled(god || owner); + getChildView("remove_estate_manager_btn")->setEnabled(has_estate_manager && (god || owner)); + getChildView("estate_manager_name_list")->setEnabled(god || owner); - // Select current preset. - LLSD sky_map = LLEnvManagerNew::instance().getRegionSettings().getSkyMap(); - if (sky_map.size() == 1) // if the region is set to fixed sky + if (enable_cotrols != mCtrlsEnabled) { - std::string preset_name = sky_map.beginMap()->first; - mSkyPresetCombo->selectByValue(LLWLParamKey(preset_name, LLEnvKey::SCOPE_REGION).toStringVal()); + mCtrlsEnabled = enable_cotrols; + updateLists(); // update the lists on the agent's access level change } } -void LLPanelEnvironmentInfo::populateDayCyclesList() +//--------------------------------------------------------------------------- +// Add/Remove estate access button callbacks +//--------------------------------------------------------------------------- +void LLPanelEstateAccess::onClickAddAllowedAgent() { - mDayCyclePresetCombo->removeall(); - - // If the region already has env. settings, add its day cycle to the list. - const LLSD& cur_region_dc = LLEnvManagerNew::instance().getRegionSettings().getWLDayCycle(); - if (cur_region_dc.size() != 0) + LLCtrlListInterface *list = childGetListInterface("allowed_avatar_name_list"); + if (!list) return; + if (list->getItemCount() >= ESTATE_MAX_ACCESS_IDS) { - LLViewerRegion* region = gAgent.getRegion(); - llassert(region != NULL); + //args - LLWLParamKey key(region->getName(), LLEnvKey::SCOPE_REGION); - mDayCyclePresetCombo->add(region->getName(), key.toStringVal()); - mDayCyclePresetCombo->addSeparator(); + LLSD args; + args["MAX_AGENTS"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); + LLNotificationsUtil::add("MaxAllowedAgentOnRegion", args); + return; } + accessAddCore(ESTATE_ACCESS_ALLOWED_AGENT_ADD, "EstateAllowedAgentAdd"); +} - // Add local user day cycles. - LLDayCycleManager::preset_name_list_t user_days, sys_days; - LLDayCycleManager::instance().getPresetNames(user_days, sys_days); - for (LLDayCycleManager::preset_name_list_t::const_iterator it = user_days.begin(); it != user_days.end(); ++it) +void LLPanelEstateAccess::onClickRemoveAllowedAgent() +{ + accessRemoveCore(ESTATE_ACCESS_ALLOWED_AGENT_REMOVE, "EstateAllowedAgentRemove", "allowed_avatar_name_list"); +} + +void LLPanelEstateAccess::onClickAddAllowedGroup() +{ + LLCtrlListInterface *list = childGetListInterface("allowed_group_name_list"); + if (!list) return; + if (list->getItemCount() >= ESTATE_MAX_ACCESS_IDS) { - mDayCyclePresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal()); + LLSD args; + args["MAX_GROUPS"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); + LLNotificationsUtil::add("MaxAllowedGroupsOnRegion", args); + return; } - if (user_days.size() > 0) + LLNotification::Params params("ChangeLindenAccess"); + params.functor.function(boost::bind(&LLPanelEstateAccess::addAllowedGroup, this, _1, _2)); + if (LLPanelEstateInfo::isLindenEstate()) { - mDayCyclePresetCombo->addSeparator(); + LLNotifications::instance().add(params); } - - // Add local system day cycles. - for (LLDayCycleManager::preset_name_list_t::const_iterator it = sys_days.begin(); it != sys_days.end(); ++it) + else { - mDayCyclePresetCombo->add(*it, LLWLParamKey(*it, LLEnvKey::SCOPE_LOCAL).toStringVal()); + LLNotifications::instance().forceResponse(params, 0); } - - // Current day cycle is already selected. } -bool LLPanelEnvironmentInfo::getSelectedWaterParams(LLSD& water_params) +bool LLPanelEstateAccess::addAllowedGroup(const LLSD& notification, const LLSD& response) { - LLWLParamKey water_key(mWaterPresetCombo->getSelectedValue()); + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if (option != 0) return false; - if (water_key.scope == LLEnvKey::SCOPE_REGION) - { - water_params = LLEnvManagerNew::instance().getRegionSettings().getWaterParams(); - } - else + LLFloater* parent_floater = gFloaterView->getParentFloater(this); + + LLFloaterGroupPicker* widget = LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(gAgent.getID())); + if (widget) { - LLWaterParamSet param_set; - if (!LLWaterParamManager::instance().getParamSet(water_key.name, param_set)) + widget->removeNoneOption(); + widget->setSelectGroupCallback(boost::bind(&LLPanelEstateAccess::addAllowedGroup2, this, _1)); + if (parent_floater) { - LL_WARNS() << "Error getting water preset: " << water_key.name << LL_ENDL; - return false; + LLRect new_rect = gFloaterView->findNeighboringPosition(parent_floater, widget); + widget->setOrigin(new_rect.mLeft, new_rect.mBottom); + parent_floater->addDependentFloater(widget); } - - water_params = param_set.getAll(); } - return true; + return false; } -bool LLPanelEnvironmentInfo::getSelectedSkyParams(LLSD& sky_params, std::string& preset_name) +void LLPanelEstateAccess::onClickRemoveAllowedGroup() { - std::string preset_key(mSkyPresetCombo->getValue().asString()); - LLWLParamKey preset(preset_key); + accessRemoveCore(ESTATE_ACCESS_ALLOWED_GROUP_REMOVE, "EstateAllowedGroupRemove", "allowed_group_name_list"); +} - // Get the preset sky params. - LLWLParamSet param_set; - if (!LLWLParamManager::instance().getParamSet(preset, param_set)) +void LLPanelEstateAccess::onClickAddBannedAgent() +{ + LLCtrlListInterface *list = childGetListInterface("banned_avatar_name_list"); + if (!list) return; + if (list->getItemCount() >= ESTATE_MAX_ACCESS_IDS) { - LL_WARNS() << "Error getting sky params: " << preset.toLLSD() << LL_ENDL; - return false; + LLSD args; + args["MAX_BANNED"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); + LLNotificationsUtil::add("MaxBannedAgentsOnRegion", args); + return; } + accessAddCore(ESTATE_ACCESS_BANNED_AGENT_ADD, "EstateBannedAgentAdd"); +} - sky_params = param_set.getAll(); - preset_name = preset.name; - return true; +void LLPanelEstateAccess::onClickRemoveBannedAgent() +{ + accessRemoveCore(ESTATE_ACCESS_BANNED_AGENT_REMOVE, "EstateBannedAgentRemove", "banned_avatar_name_list"); } -bool LLPanelEnvironmentInfo::getSelectedDayCycleParams(LLSD& day_cycle, LLSD& sky_map, short& scope) +void LLPanelEstateAccess::onClickCopyAllowedList() { - std::string preset_key(mDayCyclePresetCombo->getValue().asString()); - LLWLParamKey dc(preset_key); - LL_DEBUGS("Windlight") << "Use day cycle: " << dc.toLLSD() << LL_ENDL; + copyListToClipboard("allowed_avatar_name_list"); +} - if (dc.scope == LLEnvKey::SCOPE_REGION) // current region day cycle - { - const LLEnvironmentSettings& cur_region_settings = LLEnvManagerNew::instance().getRegionSettings(); - day_cycle = cur_region_settings.getWLDayCycle(); - sky_map = cur_region_settings.getSkyMap(); +void LLPanelEstateAccess::onClickCopyAllowedGroupList() +{ + copyListToClipboard("allowed_group_name_list"); +} + +void LLPanelEstateAccess::onClickCopyBannedList() +{ + copyListToClipboard("banned_avatar_name_list"); +} + +// static +void LLPanelEstateAccess::onClickAddEstateManager() +{ + LLCtrlListInterface *list = childGetListInterface("estate_manager_name_list"); + if (!list) return; + if (list->getItemCount() >= ESTATE_MAX_MANAGERS) + { // Tell user they can't add more managers + LLSD args; + args["MAX_MANAGER"] = llformat("%d", ESTATE_MAX_MANAGERS); + LLNotificationsUtil::add("MaxManagersOnRegion", args); } - else // a local day cycle - { - if (!LLDayCycleManager::instance().getPreset(dc.name, day_cycle)) - { - LL_WARNS() << "Error getting day cycle " << dc.name << LL_ENDL; - return false; - } + else + { // Go pick managers to add + accessAddCore(ESTATE_ACCESS_MANAGER_ADD, "EstateManagerAdd"); + } +} - // Create sky map from the day cycle. +// static +void LLPanelEstateAccess::onClickRemoveEstateManager() +{ + accessRemoveCore(ESTATE_ACCESS_MANAGER_REMOVE, "EstateManagerRemove", "estate_manager_name_list"); +} + + +// Special case callback for groups, since it has different callback format than names +void LLPanelEstateAccess::addAllowedGroup2(LLUUID id) +{ + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + if (panel) + { + LLNameListCtrl* group_list = panel->getChild<LLNameListCtrl>("allowed_group_name_list"); + LLScrollListItem* item = group_list->getNameItemByAgentId(id); + if (item) { - LLWLDayCycle tmp_day; - tmp_day.loadDayCycle(day_cycle, dc.scope); - tmp_day.getSkyMap(sky_map); + LLSD args; + args["GROUP"] = item->getColumn(0)->getValue().asString(); + LLNotificationsUtil::add("GroupIsAlreadyInList", args); + return; } } + + LLSD payload; + payload["operation"] = (S32)ESTATE_ACCESS_ALLOWED_GROUP_ADD; + payload["dialog_name"] = "EstateAllowedGroupAdd"; + payload["allowed_ids"].append(id); - scope = dc.scope; - - return true; -} -void LLPanelEnvironmentInfo::onSwitchRegionSettings() -{ - bool use_defaults = mRegionSettingsRadioGroup->getSelectedIndex() == 0; - getChild<LLView>("user_environment_settings")->setEnabled(!use_defaults); + LLSD args; + args["ALL_ESTATES"] = all_estates_text(); - if (use_defaults) + LLNotification::Params params("EstateAllowedGroupAdd"); + params.payload(payload) + .substitutions(args) + .functor.function(accessCoreConfirm); + if (LLPanelEstateInfo::isLindenEstate()) { - LLEnvManagerNew::instance().useDefaults(); + LLNotifications::instance().forceResponse(params, 0); } else { - onSelectWaterPreset(); - onSwitchDayCycle(); + LLNotifications::instance().add(params); } - - setDirty(true); } -void LLPanelEnvironmentInfo::onSwitchDayCycle() +// static +void LLPanelEstateAccess::accessAddCore(U32 operation_flag, const std::string& dialog_name) { - bool is_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0; + LLSD payload; + payload["operation"] = (S32)operation_flag; + payload["dialog_name"] = dialog_name; + // agent id filled in after avatar picker - mSkyPresetCombo->setEnabled(is_fixed_sky); - mDayCyclePresetCombo->setEnabled(!is_fixed_sky); + LLNotification::Params params("ChangeLindenAccess"); + params.payload(payload) + .functor.function(accessAddCore2); - if (is_fixed_sky) + if (LLPanelEstateInfo::isLindenEstate()) { - onSelectSkyPreset(); + LLNotifications::instance().add(params); } else { - onSelectDayCycle(); + // same as clicking "OK" + LLNotifications::instance().forceResponse(params, 0); } - - setDirty(true); } -void LLPanelEnvironmentInfo::onSelectWaterPreset() +// static +bool LLPanelEstateAccess::accessAddCore2(const LLSD& notification, const LLSD& response) { - LLSD water_params; - - if (getSelectedWaterParams(water_params)) + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if (option != 0) { - LLEnvManagerNew::instance().useWaterParams(water_params); + // abort change + return false; } - setDirty(true); -} + LLEstateAccessChangeInfo* change_info = new LLEstateAccessChangeInfo(notification["payload"]); + //Get parent floater name + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + LLFloater* parent_floater = panel ? gFloaterView->getParentFloater(panel) : NULL; + const std::string& parent_floater_name = parent_floater ? parent_floater->getName() : ""; + + //Determine the button that triggered opening of the avatar picker + //(so that a shadow frustum from the button to the avatar picker can be created) + LLView * button = NULL; + switch (change_info->mOperationFlag) + { + case ESTATE_ACCESS_ALLOWED_AGENT_ADD: + button = panel->findChild<LLButton>("add_allowed_avatar_btn"); + break; -void LLPanelEnvironmentInfo::onSelectSkyPreset() -{ - LLSD params; - std::string dummy; + case ESTATE_ACCESS_BANNED_AGENT_ADD: + button = panel->findChild<LLButton>("add_banned_avatar_btn"); + break; - if (getSelectedSkyParams(params, dummy)) - { - LLEnvManagerNew::instance().useSkyParams(params); + case ESTATE_ACCESS_MANAGER_ADD: + button = panel->findChild<LLButton>("add_estate_manager_btn"); + break; } - setDirty(true); -} - -void LLPanelEnvironmentInfo::onSelectDayCycle() -{ - LLSD day_cycle; - LLSD sky_map; // unused - short scope; + // avatar picker yes multi-select, yes close-on-select + LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateAccess::accessAddCore3, _1, _2, (void*)change_info), + TRUE, TRUE, FALSE, parent_floater_name, button); - if (getSelectedDayCycleParams(day_cycle, sky_map, scope)) + //Allows the closed parent floater to close the child floater (avatar picker) + if (child_floater) { - LLEnvManagerNew::instance().useDayCycleParams(day_cycle, (LLEnvKey::EScope) scope); + parent_floater->addDependentFloater(child_floater); } - setDirty(true); + return false; } -void LLPanelEnvironmentInfo::onBtnApply() +// static +void LLPanelEstateAccess::accessAddCore3(const uuid_vec_t& ids, std::vector<LLAvatarName> names, void* data) { - const bool use_defaults = mRegionSettingsRadioGroup->getSelectedIndex() == 0; - const bool use_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0; - - LLSD day_cycle; - LLSD sky_map; - LLSD water_params; + LLEstateAccessChangeInfo* change_info = (LLEstateAccessChangeInfo*)data; + if (!change_info) return; + if (ids.empty()) + { + // User didn't select a name. + delete change_info; + change_info = NULL; + return; + } + // User did select a name. + change_info->mAgentOrGroupIDs = ids; + // Can't put estate owner on ban list + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + if (!panel) return; + LLViewerRegion* region = gAgent.getRegion(); + if (!region) return; - if (use_defaults) + if (change_info->mOperationFlag & ESTATE_ACCESS_ALLOWED_AGENT_ADD) { - // settings will be empty - LL_DEBUGS("Windlight") << "Defaults" << LL_ENDL; + LLNameListCtrl* name_list = panel->getChild<LLNameListCtrl>("allowed_avatar_name_list"); + int currentCount = (name_list ? name_list->getItemCount() : 0); + if (ids.size() + currentCount > ESTATE_MAX_ACCESS_IDS) + { + LLSD args; + args["NUM_ADDED"] = llformat("%d", ids.size()); + args["MAX_AGENTS"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); + args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeAllowedAgents"); + args["NUM_EXCESS"] = llformat("%d", (ids.size() + currentCount) - ESTATE_MAX_ACCESS_IDS); + LLNotificationsUtil::add("MaxAgentOnRegionBatch", args); + delete change_info; + return; + } + + uuid_vec_t ids_allowed; + std::vector<LLAvatarName> names_allowed; + std::string already_allowed; + bool single = true; + for (U32 i = 0; i < ids.size(); ++i) + { + LLScrollListItem* item = name_list->getNameItemByAgentId(ids[i]); + if (item) + { + if (!already_allowed.empty()) + { + already_allowed += ", "; + single = false; + } + already_allowed += item->getColumn(0)->getValue().asString(); + } + else + { + ids_allowed.push_back(ids[i]); + names_allowed.push_back(names[i]); + } + } + if (!already_allowed.empty()) + { + LLSD args; + args["AGENT"] = already_allowed; + args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeAllowedAgents"); + LLNotificationsUtil::add(single ? "AgentIsAlreadyInList" : "AgentsAreAlreadyInList", args); + if (ids_allowed.empty()) + { + delete change_info; + return; + } + } + change_info->mAgentOrGroupIDs = ids_allowed; + change_info->mAgentNames = names_allowed; } - else // use custom region settings + if (change_info->mOperationFlag & ESTATE_ACCESS_BANNED_AGENT_ADD) { - if (use_fixed_sky) + LLNameListCtrl* name_list = panel->getChild<LLNameListCtrl>("banned_avatar_name_list"); + LLNameListCtrl* em_list = panel->getChild<LLNameListCtrl>("estate_manager_name_list"); + int currentCount = (name_list ? name_list->getItemCount() : 0); + if (ids.size() + currentCount > ESTATE_MAX_ACCESS_IDS) { - LL_DEBUGS("Windlight") << "Use fixed sky" << LL_ENDL; + LLSD args; + args["NUM_ADDED"] = llformat("%d", ids.size()); + args["MAX_AGENTS"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); + args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeBannedAgents"); + args["NUM_EXCESS"] = llformat("%d", (ids.size() + currentCount) - ESTATE_MAX_ACCESS_IDS); + LLNotificationsUtil::add("MaxAgentOnRegionBatch", args); + delete change_info; + return; + } - // Get selected sky params. - LLSD params; - std::string preset_name; - if (!getSelectedSkyParams(params, preset_name)) + uuid_vec_t ids_allowed; + std::vector<LLAvatarName> names_allowed; + std::string already_banned; + std::string em_ban; + bool single = true; + for (U32 i = 0; i < ids.size(); ++i) + { + bool is_allowed = true; + LLScrollListItem* em_item = em_list->getNameItemByAgentId(ids[i]); + if (em_item) { - return; + if (!em_ban.empty()) + { + em_ban += ", "; + } + em_ban += em_item->getColumn(0)->getValue().asString(); + is_allowed = false; } - // Create a day cycle consisting of a single sky preset. - LLSD key(LLSD::emptyArray()); - key.append(-1.0f); // indicate that user preference is actually fixed sky, not a day cycle - key.append(preset_name); - day_cycle.append(key); + LLScrollListItem* item = name_list->getNameItemByAgentId(ids[i]); + if (item) + { + if (!already_banned.empty()) + { + already_banned += ", "; + single = false; + } + already_banned += item->getColumn(0)->getValue().asString(); + is_allowed = false; + } - // Create a sky map consisting of only the sky preset. - std::map<LLWLParamKey, LLWLParamSet> refs; - LLWLParamSet param_set; - param_set.setAll(params); - refs[LLWLParamKey(preset_name, LLEnvKey::SCOPE_LOCAL)] = param_set; // scope doesn't matter here - sky_map = LLWLParamManager::createSkyMap(refs); + if (is_allowed) + { + ids_allowed.push_back(ids[i]); + names_allowed.push_back(names[i]); + } } - else // use day cycle + if (!em_ban.empty()) { - LL_DEBUGS("Windlight") << "Use day cycle" << LL_ENDL; - - short scope; // unused - if (!getSelectedDayCycleParams(day_cycle, sky_map, scope)) + LLSD args; + args["AGENT"] = em_ban; + LLNotificationsUtil::add("ProblemBanningEstateManager", args); + if (ids_allowed.empty()) { + delete change_info; return; } - - // If it's a special single-preset day cycle meaning using a fixed sky, - // reset the frame time to a non-negative value, - // so that the region setting is displayed in the floater as - // a day cycle, not a preset. (STORM-1289) - if (day_cycle.size() == 1 && day_cycle[0][0].asReal() < 0.0f) - { - LL_DEBUGS("Windlight") << "Fixing negative time" << LL_ENDL; - day_cycle[0][0] = 0.0f; - } } - - // Get water params. - if (!getSelectedWaterParams(water_params)) + if (!already_banned.empty()) { - // *TODO: show a notification? - return; + LLSD args; + args["AGENT"] = already_banned; + args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeBannedAgents"); + LLNotificationsUtil::add(single ? "AgentIsAlreadyInList" : "AgentsAreAlreadyInList", args); + if (ids_allowed.empty()) + { + delete change_info; + return; + } } + change_info->mAgentOrGroupIDs = ids_allowed; + change_info->mAgentNames = names_allowed; } - // Send settings apply request. - LLEnvironmentSettings new_region_settings; - new_region_settings.saveParams(day_cycle, sky_map, water_params, 0.0f); - if (!LLEnvManagerNew::instance().sendRegionSettings(new_region_settings)) + LLSD args; + args["ALL_ESTATES"] = all_estates_text(); + LLNotification::Params params(change_info->mDialogName); + params.substitutions(args) + .payload(change_info->asLLSD()) + .functor.function(accessCoreConfirm); + + if (LLPanelEstateInfo::isLindenEstate()) { - LL_WARNS() << "Error applying region environment settings" << LL_ENDL; - return; + // just apply to this estate + LLNotifications::instance().forceResponse(params, 0); + } + else + { + // ask if this estate or all estates with this owner + LLNotifications::instance().add(params); } - - // When the settings get applied, we'll also send the region sun position update. - // To determine the sun angle we're going to need the new settings. - mNewRegionSettings = new_region_settings; - - // Start spinning the progress indicator. - setApplyProgress(true); } -void LLPanelEnvironmentInfo::onBtnCancel() +// static +void LLPanelEstateAccess::accessRemoveCore(U32 operation_flag, const std::string& dialog_name, const std::string& list_ctrl_name) { - // Reload last saved region settings. - refresh(); - - // Apply them. - LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance(); - const LLEnvironmentSettings& cur_settings = env_mgr.getRegionSettings(); - const LLSD& region_day_cycle = cur_settings.getWLDayCycle(); - const LLSD& region_water = cur_settings.getWaterParams(); - env_mgr.useWaterParams(region_water); - env_mgr.useDayCycleParams(region_day_cycle, LLEnvKey::SCOPE_REGION); -} + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + if (!panel) return; + LLNameListCtrl* name_list = panel->getChild<LLNameListCtrl>(list_ctrl_name); + if (!name_list) return; -void LLPanelEnvironmentInfo::onRegionSettingschange() -{ - LL_DEBUGS("Windlight") << "Region settings changed, refreshing" << LL_ENDL; - refresh(); + std::vector<LLScrollListItem*> list_vector = name_list->getAllSelected(); + if (list_vector.size() == 0) + return; - // Stop applying progress indicator (it may be running if it's us who initiated settings update). - setApplyProgress(false); -} + LLSD payload; + payload["operation"] = (S32)operation_flag; + payload["dialog_name"] = dialog_name; -void LLPanelEnvironmentInfo::onRegionSettingsApplied(bool ok) -{ - // If applying new settings has failed, stop the indicator right away. - // Otherwise it will be stopped when we receive the updated settings from server. - if (ok) + for (std::vector<LLScrollListItem*>::const_iterator iter = list_vector.begin(); + iter != list_vector.end(); + iter++) { - // Set the region sun phase/flags according to the chosen new preferences. - // - // If we do this earlier we may get jerky transition from fixed sky to a day cycle (STORM-1481). - // That is caused by the simulator re-sending the region info, which in turn makes us - // re-request and display old region environment settings while the new ones haven't been applied yet. - sendRegionSunUpdate(); + LLScrollListItem *item = (*iter); + payload["allowed_ids"].append(item->getUUID()); + } - // Switch estate to not using fixed sun for the region day cycle to work properly (STORM-1506). - fixEstateSun(); + LLNotification::Params params("ChangeLindenAccess"); + params.payload(payload) + .functor.function(accessRemoveCore2); + + if (LLPanelEstateInfo::isLindenEstate()) + { + // warn on change linden estate + LLNotifications::instance().add(params); } else { - setApplyProgress(false); - - // We need to re-request environment setting here, - // otherwise our subsequent attempts to change region settings will fail with the following error: - // "Unable to update environment settings because the last update your viewer saw was not the same - // as the last update sent from the simulator. Try sending your update again, and if this - // does not work, try leaving and returning to the region." - LLEnvManagerNew::instance().requestRegionSettings(); + // just proceed, as if clicking OK + LLNotifications::instance().forceResponse(params, 0); } } -BOOL LLPanelRegionExperiences::postBuild() -{ - mAllowed = setupList("panel_allowed", ESTATE_EXPERIENCE_ALLOWED_ADD, ESTATE_EXPERIENCE_ALLOWED_REMOVE); - mTrusted = setupList("panel_trusted", ESTATE_EXPERIENCE_TRUSTED_ADD, ESTATE_EXPERIENCE_TRUSTED_REMOVE); - mBlocked = setupList("panel_blocked", ESTATE_EXPERIENCE_BLOCKED_ADD, ESTATE_EXPERIENCE_BLOCKED_REMOVE); - - getChild<LLLayoutPanel>("trusted_layout_panel")->setVisible(TRUE); - getChild<LLTextBox>("experiences_help_text")->setText(getString("estate_caption")); - getChild<LLTextBox>("trusted_text_help")->setText(getString("trusted_estate_text")); - getChild<LLTextBox>("allowed_text_help")->setText(getString("allowed_estate_text")); - getChild<LLTextBox>("blocked_text_help")->setText(getString("blocked_estate_text")); - - return LLPanelRegionInfo::postBuild(); -} - -LLPanelExperienceListEditor* LLPanelRegionExperiences::setupList( const char* control_name, U32 add_id, U32 remove_id ) +// static +bool LLPanelEstateAccess::accessRemoveCore2(const LLSD& notification, const LLSD& response) { - LLPanelExperienceListEditor* child = findChild<LLPanelExperienceListEditor>(control_name); - if(child) + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if (option != 0) { - child->getChild<LLTextBox>("text_name")->setText(child->getString(control_name)); - child->setMaxExperienceIDs(ESTATE_MAX_EXPERIENCE_IDS); - child->setAddedCallback( boost::bind(&LLPanelRegionExperiences::itemChanged, this, add_id, _1)); - child->setRemovedCallback(boost::bind(&LLPanelRegionExperiences::itemChanged, this, remove_id, _1)); + // abort + return false; } - return child; -} - - -void LLPanelRegionExperiences::processResponse( const LLSD& content ) -{ - if(content.has("default")) + // If Linden estate, can only apply to "this" estate, not all estates + // owned by NULL. + if (LLPanelEstateInfo::isLindenEstate()) { - mDefaultExperience = content["default"].asUUID(); + accessCoreConfirm(notification, response); } - - mAllowed->setExperienceIds(content["allowed"]); - mBlocked->setExperienceIds(content["blocked"]); - - LLSD trusted = content["trusted"]; - if(mDefaultExperience.notNull()) + else { - mTrusted->setStickyFunction(boost::bind(LLPanelExperiencePicker::FilterMatching, _1, mDefaultExperience)); - trusted.append(mDefaultExperience); + LLSD args; + args["ALL_ESTATES"] = all_estates_text(); + LLNotificationsUtil::add(notification["payload"]["dialog_name"], + args, + notification["payload"], + accessCoreConfirm); } - - mTrusted->setExperienceIds(trusted); - - mAllowed->refreshExperienceCounter(); - mBlocked->refreshExperienceCounter(); - mTrusted->refreshExperienceCounter(); - + return false; } -// Used for both access add and remove operations, depending on the flag -// passed in (ESTATE_EXPERIENCE_ALLOWED_ADD, ESTATE_EXPERIENCE_ALLOWED_REMOVE, etc.) +// Used for both access add and remove operations, depending on the mOperationFlag +// passed in (ESTATE_ACCESS_BANNED_AGENT_ADD, ESTATE_ACCESS_ALLOWED_AGENT_REMOVE, etc.) // static -bool LLPanelRegionExperiences::experienceCoreConfirm(const LLSD& notification, const LLSD& response) +bool LLPanelEstateAccess::accessCoreConfirm(const LLSD& notification, const LLSD& response) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); const U32 originalFlags = (U32)notification["payload"]["operation"].asInteger(); + U32 flags = originalFlags; LLViewerRegion* region = gAgent.getRegion(); - - LLSD::array_const_iterator end_it = notification["payload"]["allowed_ids"].endArray(); - for (LLSD::array_const_iterator iter = notification["payload"]["allowed_ids"].beginArray(); - iter != end_it; - iter++) + if (option == 2) // cancel + { + return false; + } + else if (option == 1) { - U32 flags = originalFlags; - if (iter + 1 != end_it) + // All estates, either than I own or manage for this owner. + // This will be verified on simulator. JC + if (!region) return false; + if (region->getOwner() == gAgent.getID() + || gAgent.isGodlike()) + { + flags |= ESTATE_ACCESS_APPLY_TO_ALL_ESTATES; + } + else if (region->isEstateManager()) + { + flags |= ESTATE_ACCESS_APPLY_TO_MANAGED_ESTATES; + } + } + + std::string names; + U32 listed_names = 0; + for (U32 i = 0; i < notification["payload"]["allowed_ids"].size(); ++i) + { + if (i + 1 != notification["payload"]["allowed_ids"].size()) + { flags |= ESTATE_ACCESS_NO_REPLY; + } + else + { + flags &= ~ESTATE_ACCESS_NO_REPLY; + } - const LLUUID id = iter->asUUID(); - switch(option) + const LLUUID id = notification["payload"]["allowed_ids"][i].asUUID(); + if (((U32)notification["payload"]["operation"].asInteger() & ESTATE_ACCESS_BANNED_AGENT_ADD) + && region && (region->getOwner() == id)) { - case 0: - // This estate - sendEstateExperienceDelta(flags, id); - break; - case 1: + LLNotificationsUtil::add("OwnerCanNotBeDenied"); + break; + } + + sendEstateAccessDelta(flags, id); + + if ((flags & (ESTATE_ACCESS_ALLOWED_GROUP_ADD | ESTATE_ACCESS_ALLOWED_GROUP_REMOVE)) == 0) + { + // fill the name list for confirmation + if (listed_names < MAX_LISTED_NAMES) { - // All estates, either than I own or manage for this owner. - // This will be verified on simulator. JC - if (!region) break; - if (region->getOwner() == gAgent.getID() - || gAgent.isGodlike()) + if (!names.empty()) { - flags |= ESTATE_ACCESS_APPLY_TO_ALL_ESTATES; - sendEstateExperienceDelta(flags, id); + names += ", "; } - else if (region->isEstateManager()) + if (!notification["payload"]["allowed_names"][i]["display_name"].asString().empty()) { - flags |= ESTATE_ACCESS_APPLY_TO_MANAGED_ESTATES; - sendEstateExperienceDelta(flags, id); + names += notification["payload"]["allowed_names"][i]["display_name"].asString(); } - break; + else + { //try to get an agent name from cache + LLAvatarName av_name; + if (LLAvatarNameCache::get(id, &av_name)) + { + names += av_name.getCompleteName(); + } + } + } - case 2: - default: - break; + listed_names++; } } - return false; -} - - -// Send the actual "estateexperiencedelta" message -void LLPanelRegionExperiences::sendEstateExperienceDelta(U32 flags, const LLUUID& experience_id) -{ - strings_t str(3, std::string()); - gAgent.getID().toString(str[0]); - str[1] = llformat("%u", flags); - experience_id.toString(str[2]); - - LLPanelRegionExperiences* panel = LLFloaterRegionInfo::getPanelExperiences(); - if (panel) + if (listed_names > MAX_LISTED_NAMES) { - panel->sendEstateOwnerMessage(gMessageSystem, "estateexperiencedelta", LLFloaterRegionInfo::getLastInvoice(), str); + LLSD args; + args["EXTRA_COUNT"] = llformat("%d", listed_names - MAX_LISTED_NAMES); + names += " " + LLTrans::getString("AndNMore", args); } -} + if (!names.empty()) // show the conirmation + { + LLSD args; + args["AGENT"] = names; -void LLPanelRegionExperiences::infoCallback(LLHandle<LLPanelRegionExperiences> handle, const LLSD& content) -{ - if(handle.isDead()) - return; + if (flags & (ESTATE_ACCESS_ALLOWED_AGENT_ADD | ESTATE_ACCESS_ALLOWED_AGENT_REMOVE)) + { + args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeAllowedAgents"); + } + else if (flags & (ESTATE_ACCESS_BANNED_AGENT_ADD | ESTATE_ACCESS_BANNED_AGENT_REMOVE)) + { + args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeBannedAgents"); + } - LLPanelRegionExperiences* floater = handle.get(); - if (floater) - { - floater->processResponse(content); + if (flags & ESTATE_ACCESS_APPLY_TO_ALL_ESTATES) + { + args["ESTATE"] = LLTrans::getString("RegionInfoAllEstates"); + } + else if (flags & ESTATE_ACCESS_APPLY_TO_MANAGED_ESTATES) + { + args["ESTATE"] = LLTrans::getString("RegionInfoManagedEstates"); + } + else + { + args["ESTATE"] = LLTrans::getString("RegionInfoThisEstate"); + } + + bool single = (listed_names == 1); + if (flags & (ESTATE_ACCESS_ALLOWED_AGENT_ADD | ESTATE_ACCESS_BANNED_AGENT_ADD)) + { + LLNotificationsUtil::add(single ? "AgentWasAddedToList" : "AgentsWereAddedToList", args); + } + else if (flags & (ESTATE_ACCESS_ALLOWED_AGENT_REMOVE | ESTATE_ACCESS_BANNED_AGENT_REMOVE)) + { + LLNotificationsUtil::add(single ? "AgentWasRemovedFromList" : "AgentsWereRemovedFromList", args); + } } -} -/*static*/ -std::string LLPanelRegionExperiences::regionCapabilityQuery(LLViewerRegion* region, const std::string &cap) -{ - // region->getHandle() How to get a region * from a handle? + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + if (panel) + { + panel->setPendingUpdate(true); + } - return region->getCapability(cap); + return false; } -bool LLPanelRegionExperiences::refreshFromRegion(LLViewerRegion* region) +// key = "estateaccessdelta" +// str(estate_id) will be added to front of list by forward_EstateOwnerRequest_to_dataserver +// str[0] = str(agent_id) requesting the change +// str[1] = str(flags) (ESTATE_ACCESS_DELTA_*) +// str[2] = str(agent_id) to add or remove +// static +void LLPanelEstateAccess::sendEstateAccessDelta(U32 flags, const LLUUID& agent_or_group_id) { - BOOL allow_modify = gAgent.isGodlike() || (region && region->canManageEstate()); + LLMessageSystem* msg = gMessageSystem; + msg->newMessage("EstateOwnerMessage"); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->addUUIDFast(_PREHASH_TransactionID, LLUUID::null); //not used - mAllowed->loading(); - mAllowed->setReadonly(!allow_modify); - // remove grid-wide experiences - mAllowed->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithProperty, _1, LLExperienceCache::PROPERTY_GRID)); - // remove default experience - mAllowed->addFilter(boost::bind(LLPanelExperiencePicker::FilterMatching, _1, mDefaultExperience)); + msg->nextBlock("MethodData"); + msg->addString("Method", "estateaccessdelta"); + msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice()); - mBlocked->loading(); - mBlocked->setReadonly(!allow_modify); - // only grid-wide experiences - mBlocked->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithoutProperty, _1, LLExperienceCache::PROPERTY_GRID)); - // but not privileged ones - mBlocked->addFilter(boost::bind(LLPanelExperiencePicker::FilterWithProperty, _1, LLExperienceCache::PROPERTY_PRIVILEGED)); - // remove default experience - mBlocked->addFilter(boost::bind(LLPanelExperiencePicker::FilterMatching, _1, mDefaultExperience)); + std::string buf; + gAgent.getID().toString(buf); + msg->nextBlock("ParamList"); + msg->addString("Parameter", buf); - mTrusted->loading(); - mTrusted->setReadonly(!allow_modify); + buf = llformat("%u", flags); + msg->nextBlock("ParamList"); + msg->addString("Parameter", buf); - LLExperienceCache::instance().getRegionExperiences(boost::bind(&LLPanelRegionExperiences::regionCapabilityQuery, region, _1), - boost::bind(&LLPanelRegionExperiences::infoCallback, getDerivedHandle<LLPanelRegionExperiences>(), _1)); + agent_or_group_id.toString(buf); + msg->nextBlock("ParamList"); + msg->addString("Parameter", buf); - return LLPanelRegionInfo::refreshFromRegion(region); + gAgent.sendReliableMessage(); } -LLSD LLPanelRegionExperiences::addIds(LLPanelExperienceListEditor* panel) +void LLPanelEstateAccess::updateChild(LLUICtrl* child_ctrl) { - LLSD ids; - const uuid_list_t& id_list = panel->getExperienceIds(); - for(uuid_list_t::const_iterator it = id_list.begin(); it != id_list.end(); ++it) + // Ensure appropriate state of the management ui. + updateControls(gAgent.getRegion()); +} + +void LLPanelEstateAccess::updateLists() +{ + std::string cap_url = gAgent.getRegionCapability("EstateAccess"); + if (!cap_url.empty()) { - ids.append(*it); + LLCoros::instance().launch("LLFloaterRegionInfo::requestEstateGetAccessCoro", boost::bind(LLPanelEstateAccess::requestEstateGetAccessCoro, cap_url)); } - return ids; } - -BOOL LLPanelRegionExperiences::sendUpdate() +void LLPanelEstateAccess::requestEstateGetAccessCoro(std::string url) { - LLViewerRegion* region = gAgent.getRegion(); + LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); + LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("requestEstateGetAccessoCoro", httpPolicy)); + LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - LLSD content; + LLSD result = httpAdapter->getAndSuspend(httpRequest, url); - content["allowed"]=addIds(mAllowed); - content["blocked"]=addIds(mBlocked); - content["trusted"]=addIds(mTrusted); + LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; + LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); - LLExperienceCache::instance().setRegionExperiences(boost::bind(&LLPanelRegionExperiences::regionCapabilityQuery, region, _1), - content, boost::bind(&LLPanelRegionExperiences::infoCallback, getDerivedHandle<LLPanelRegionExperiences>(), _1)); + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + if (!panel) return; + + LLNameListCtrl* allowed_agent_name_list = panel->getChild<LLNameListCtrl>("allowed_avatar_name_list"); + if (allowed_agent_name_list && result.has("AllowedAgents")) + { + LLStringUtil::format_map_t args; + args["[ALLOWEDAGENTS]"] = llformat("%d", result["AllowedAgents"].size()); + args["[MAXACCESS]"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); + std::string msg = LLTrans::getString("RegionInfoAllowedResidents", args); + panel->getChild<LLUICtrl>("allow_resident_label")->setValue(LLSD(msg)); - return TRUE; -} + allowed_agent_name_list->clearSortOrder(); + allowed_agent_name_list->deleteAllItems(); + for (LLSD::array_const_iterator it = result["AllowedAgents"].beginArray(); it != result["AllowedAgents"].endArray(); ++it) + { + LLUUID id = (*it)["id"].asUUID(); + allowed_agent_name_list->addNameItem(id); + } + allowed_agent_name_list->sortByName(TRUE); + } -void LLPanelRegionExperiences::itemChanged( U32 event_type, const LLUUID& id ) -{ - std::string dialog_name; - switch (event_type) + LLNameListCtrl* banned_agent_name_list = panel->getChild<LLNameListCtrl>("banned_avatar_name_list"); + if (banned_agent_name_list && result.has("BannedAgents")) { - case ESTATE_EXPERIENCE_ALLOWED_ADD: - dialog_name = "EstateAllowedExperienceAdd"; - break; + LLStringUtil::format_map_t args; + args["[BANNEDAGENTS]"] = llformat("%d", result["BannedAgents"].size()); + args["[MAXBANNED]"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); + std::string msg = LLTrans::getString("RegionInfoBannedResidents", args); + panel->getChild<LLUICtrl>("ban_resident_label")->setValue(LLSD(msg)); - case ESTATE_EXPERIENCE_ALLOWED_REMOVE: - dialog_name = "EstateAllowedExperienceRemove"; - break; + banned_agent_name_list->clearSortOrder(); + banned_agent_name_list->deleteAllItems(); + for (LLSD::array_const_iterator it = result["BannedAgents"].beginArray(); it != result["BannedAgents"].endArray(); ++it) + { + LLSD item; + item["id"] = (*it)["id"].asUUID(); + LLSD& columns = item["columns"]; - case ESTATE_EXPERIENCE_TRUSTED_ADD: - dialog_name = "EstateTrustedExperienceAdd"; - break; + columns[0]["column"] = "name"; // to be populated later - case ESTATE_EXPERIENCE_TRUSTED_REMOVE: - dialog_name = "EstateTrustedExperienceRemove"; - break; + columns[1]["column"] = "last_login_date"; + columns[1]["value"] = (*it)["last_login_date"].asString().substr(0, 16); // cut the seconds - case ESTATE_EXPERIENCE_BLOCKED_ADD: - dialog_name = "EstateBlockedExperienceAdd"; - break; + std::string ban_date = (*it)["ban_date"].asString(); + columns[2]["column"] = "ban_date"; + columns[2]["value"] = ban_date[0] != '0' ? ban_date.substr(0, 16) : LLTrans::getString("na"); // server returns the "0000-00-00 00:00:00" date in case it doesn't know it - case ESTATE_EXPERIENCE_BLOCKED_REMOVE: - dialog_name = "EstateBlockedExperienceRemove"; - break; + columns[3]["column"] = "bannedby"; + LLUUID banning_id = (*it)["banning_id"].asUUID(); + LLAvatarName av_name; + if (banning_id.isNull()) + { + columns[3]["value"] = LLTrans::getString("na"); + } + else if (LLAvatarNameCache::get(banning_id, &av_name)) + { + columns[3]["value"] = av_name.getCompleteName(); //TODO: fetch the name if it wasn't cached + } - default: - return; + banned_agent_name_list->addElement(item); + } + banned_agent_name_list->sortByName(TRUE); } - LLSD payload; - payload["operation"] = (S32)event_type; - payload["dialog_name"] = dialog_name; - payload["allowed_ids"].append(id); + LLNameListCtrl* allowed_group_name_list = panel->getChild<LLNameListCtrl>("allowed_group_name_list"); + if (allowed_group_name_list && result.has("AllowedGroups")) + { + LLStringUtil::format_map_t args; + args["[ALLOWEDGROUPS]"] = llformat("%d", result["AllowedGroups"].size()); + args["[MAXACCESS]"] = llformat("%d", ESTATE_MAX_GROUP_IDS); + std::string msg = LLTrans::getString("RegionInfoAllowedGroups", args); + panel->getChild<LLUICtrl>("allow_group_label")->setValue(LLSD(msg)); - LLSD args; - args["ALL_ESTATES"] = all_estates_text(); + allowed_group_name_list->clearSortOrder(); + allowed_group_name_list->deleteAllItems(); + for (LLSD::array_const_iterator it = result["AllowedGroups"].beginArray(); it != result["AllowedGroups"].endArray(); ++it) + { + LLUUID id = (*it)["id"].asUUID(); + allowed_group_name_list->addGroupNameItem(id); + } + allowed_group_name_list->sortByName(TRUE); + } - LLNotification::Params params(dialog_name); - params.payload(payload) - .substitutions(args) - .functor.function(LLPanelRegionExperiences::experienceCoreConfirm); - if (LLPanelEstateInfo::isLindenEstate()) + LLNameListCtrl* estate_manager_name_list = panel->getChild<LLNameListCtrl>("estate_manager_name_list"); + if (estate_manager_name_list && result.has("Managers")) { - LLNotifications::instance().forceResponse(params, 0); + LLStringUtil::format_map_t args; + args["[ESTATEMANAGERS]"] = llformat("%d", result["Managers"].size()); + args["[MAXMANAGERS]"] = llformat("%d", ESTATE_MAX_MANAGERS); + std::string msg = LLTrans::getString("RegionInfoEstateManagers", args); + panel->getChild<LLUICtrl>("estate_manager_label")->setValue(LLSD(msg)); + + estate_manager_name_list->clearSortOrder(); + estate_manager_name_list->deleteAllItems(); + for (LLSD::array_const_iterator it = result["Managers"].beginArray(); it != result["Managers"].endArray(); ++it) + { + LLUUID id = (*it)["agent_id"].asUUID(); + estate_manager_name_list->addNameItem(id); + } + estate_manager_name_list->sortByName(TRUE); + } + + + panel->updateControls(gAgent.getRegion()); +} + +//--------------------------------------------------------------------------- +// Access lists search +//--------------------------------------------------------------------------- +void LLPanelEstateAccess::onAllowedSearchEdit(const std::string& search_string) +{ + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + if (!panel) return; + LLNameListCtrl* allowed_agent_name_list = panel->getChild<LLNameListCtrl>("allowed_avatar_name_list"); + searchAgent(allowed_agent_name_list, search_string); +} + +void LLPanelEstateAccess::onAllowedGroupsSearchEdit(const std::string& search_string) +{ + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + if (!panel) return; + LLNameListCtrl* allowed_group_name_list = panel->getChild<LLNameListCtrl>("allowed_group_name_list"); + searchAgent(allowed_group_name_list, search_string); +} + +void LLPanelEstateAccess::onBannedSearchEdit(const std::string& search_string) +{ + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + if (!panel) return; + LLNameListCtrl* banned_agent_name_list = panel->getChild<LLNameListCtrl>("banned_avatar_name_list"); + searchAgent(banned_agent_name_list, search_string); +} + +void LLPanelEstateAccess::searchAgent(LLNameListCtrl* listCtrl, const std::string& search_string) +{ + if (!listCtrl) return; + + if (!search_string.empty()) + { + listCtrl->setSearchColumn(0); // name column + listCtrl->selectItemByPrefix(search_string, FALSE); } else { - LLNotifications::instance().add(params); + listCtrl->deselectAllItems(TRUE); } +} - onChangeAnything(); +void LLPanelEstateAccess::copyListToClipboard(std::string list_name) +{ + LLPanelEstateAccess* panel = LLFloaterRegionInfo::getPanelAccess(); + if (!panel) return; + LLNameListCtrl* name_list = panel->getChild<LLNameListCtrl>(list_name); + if (!name_list) return; + + std::vector<LLScrollListItem*> list_vector = name_list->getAllData(); + if (list_vector.size() == 0) return; + + LLSD::String list_to_copy; + for (std::vector<LLScrollListItem*>::const_iterator iter = list_vector.begin(); + iter != list_vector.end(); + iter++) + { + LLScrollListItem *item = (*iter); + if (item) + { + list_to_copy += item->getColumn(0)->getValue().asString(); + } + if (std::next(iter) != list_vector.end()) + { + list_to_copy += "\n"; + } + } + + LLClipboard::instance().copyToClipboard(utf8str_to_wstring(list_to_copy), 0, list_to_copy.length()); +} + +bool LLPanelEstateAccess::refreshFromRegion(LLViewerRegion* region) +{ + updateLists(); + return LLPanelRegionInfo::refreshFromRegion(region); } + diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index c9d0e516409c517d47fb901feb2289ff1d549cac..5d0f5fc6fc6aa296b74515aa0ab8606e5dae71d1 100644 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -29,6 +29,7 @@ #define LL_LLFLOATERREGIONINFO_H #include <vector> +#include "llagent.h" #include "llassettype.h" #include "llfloater.h" #include "llhost.h" @@ -64,6 +65,7 @@ class LLPanelEstateCovenant; class LLPanelExperienceListEditor; class LLPanelExperiences; class LLPanelRegionExperiences; +class LLPanelEstateAccess; class LLEventTimer; class LLEnvironmentSettings; @@ -79,6 +81,7 @@ class LLFloaterRegionInfo : public LLFloater /*virtual*/ void onOpen(const LLSD& key); + /*virtual*/ void onClose(bool app_quitting); /*virtual*/ BOOL postBuild(); static void processEstateOwnerRequest(LLMessageSystem* msg, void**); @@ -92,6 +95,7 @@ class LLFloaterRegionInfo : public LLFloater //static void incrementSerial() { sRequestSerial++; } static LLPanelEstateInfo* getPanelEstate(); + static LLPanelEstateAccess* getPanelAccess(); static LLPanelEstateCovenant* getPanelCovenant(); static LLPanelRegionTerrainInfo* getPanelRegionTerrain(); static LLPanelRegionExperiences* getPanelExperiences(); @@ -110,12 +114,11 @@ class LLFloaterRegionInfo : public LLFloater LLFloaterRegionInfo(const LLSD& seed); ~LLFloaterRegionInfo(); - - protected: void onTabSelected(const LLSD& param); void disableTabCtrls(); void refreshFromRegion(LLViewerRegion* region); + void onGodLevelChange(U8 god_level); // member data LLTabContainer* mTab; @@ -123,6 +126,10 @@ class LLFloaterRegionInfo : public LLFloater info_panels_t mInfoPanels; //static S32 sRequestSerial; // serial # of last EstateOwnerRequest static LLUUID sRequestInvoice; + +private: + LLAgent::god_level_change_slot_t mGodLevelChangeSlot; + }; @@ -163,6 +170,7 @@ class LLPanelRegionInfo : public LLPanel const LLUUID& invoice, const strings_t& strings); + // member data LLHost mHost; }; @@ -281,35 +289,11 @@ class LLPanelEstateInfo : public LLPanelRegionInfo void onClickEditDayCycle(); void onClickEditDayCycleHelp(); - void onClickAddAllowedAgent(); - void onClickRemoveAllowedAgent(); - void onClickAddAllowedGroup(); - void onClickRemoveAllowedGroup(); - void onClickAddBannedAgent(); - void onClickRemoveBannedAgent(); - void onClickAddEstateManager(); - void onClickRemoveEstateManager(); void onClickKickUser(); - // Group picker callback is different, can't use core methods below - bool addAllowedGroup(const LLSD& notification, const LLSD& response); - void addAllowedGroup2(LLUUID id); - // Core methods for all above add/remove button clicks - static void accessAddCore(U32 operation_flag, const std::string& dialog_name); - static bool accessAddCore2(const LLSD& notification, const LLSD& response); - static void accessAddCore3(const uuid_vec_t& ids, void* data); - - static void accessRemoveCore(U32 operation_flag, const std::string& dialog_name, const std::string& list_ctrl_name); - static bool accessRemoveCore2(const LLSD& notification, const LLSD& response); - - // used for both add and remove operations - static bool accessCoreConfirm(const LLSD& notification, const LLSD& response); bool kickUserConfirm(const LLSD& notification, const LLSD& response); - // Send the actual EstateOwnerRequest "estateaccessdelta" message - static void sendEstateAccessDelta(U32 flags, const LLUUID& agent_id); - void onKickUserCommit(const uuid_vec_t& ids); static void onClickMessageEstate(void* data); bool onMessageCommit(const LLSD& notification, const LLSD& response); @@ -345,7 +329,6 @@ class LLPanelEstateInfo : public LLPanelRegionInfo void commitEstateAccess(); void commitEstateManagers(); - void clearAccessLists(); BOOL checkSunHourSlider(LLUICtrl* child_ctrl); U32 mEstateID; @@ -507,4 +490,66 @@ class LLPanelRegionExperiences : public LLPanelRegionInfo LLUUID mDefaultExperience; }; + +class LLPanelEstateAccess : public LLPanelRegionInfo +{ + LOG_CLASS(LLPanelEnvironmentInfo); + +public: + LLPanelEstateAccess(); + + virtual BOOL postBuild(); + virtual void updateChild(LLUICtrl* child_ctrl); + + void updateControls(LLViewerRegion* region); + void updateLists(); + + void setPendingUpdate(bool pending) { mPendingUpdate = pending; } + bool getPendingUpdate() { return mPendingUpdate; } + + virtual bool refreshFromRegion(LLViewerRegion* region); + +private: + void onClickAddAllowedAgent(); + void onClickRemoveAllowedAgent(); + void onClickCopyAllowedList(); + void onClickAddAllowedGroup(); + void onClickRemoveAllowedGroup(); + void onClickCopyAllowedGroupList(); + void onClickAddBannedAgent(); + void onClickRemoveBannedAgent(); + void onClickCopyBannedList(); + void onClickAddEstateManager(); + void onClickRemoveEstateManager(); + void onAllowedSearchEdit(const std::string& search_string); + void onAllowedGroupsSearchEdit(const std::string& search_string); + void onBannedSearchEdit(const std::string& search_string); + + // Group picker callback is different, can't use core methods below + bool addAllowedGroup(const LLSD& notification, const LLSD& response); + void addAllowedGroup2(LLUUID id); + + // Core methods for all above add/remove button clicks + static void accessAddCore(U32 operation_flag, const std::string& dialog_name); + static bool accessAddCore2(const LLSD& notification, const LLSD& response); + static void accessAddCore3(const uuid_vec_t& ids, std::vector<LLAvatarName> names, void* data); + + static void accessRemoveCore(U32 operation_flag, const std::string& dialog_name, const std::string& list_ctrl_name); + static bool accessRemoveCore2(const LLSD& notification, const LLSD& response); + + // used for both add and remove operations + static bool accessCoreConfirm(const LLSD& notification, const LLSD& response); + + // Send the actual EstateOwnerRequest "estateaccessdelta" message + static void sendEstateAccessDelta(U32 flags, const LLUUID& agent_id); + + static void requestEstateGetAccessCoro(std::string url); + + void searchAgent(LLNameListCtrl* listCtrl, const std::string& search_string); + void copyListToClipboard(std::string list_name); + + bool mPendingUpdate; + BOOL mCtrlsEnabled; +}; + #endif diff --git a/indra/newview/llfloaterscriptlimits.cpp b/indra/newview/llfloaterscriptlimits.cpp index 21df769d0ce0ed50785e3c07ac6675b06b0a9fa5..3746b9b6c286709032e4ecb4c7ac4706c6b3e3d9 100644 --- a/indra/newview/llfloaterscriptlimits.cpp +++ b/indra/newview/llfloaterscriptlimits.cpp @@ -90,19 +90,6 @@ LLFloaterScriptLimits::LLFloaterScriptLimits(const LLSD& seed) BOOL LLFloaterScriptLimits::postBuild() { - // a little cheap and cheerful - if there's an about land panel open default to showing parcel info, - // otherwise default to showing attachments (avatar appearance) - bool selectParcelPanel = false; - - LLFloaterLand* instance = LLFloaterReg::getTypedInstance<LLFloaterLand>("about_land"); - if(instance) - { - if(instance->isShown()) - { - selectParcelPanel = true; - } - } - mTab = getChild<LLTabContainer>("scriptlimits_panels"); if(!mTab) @@ -111,28 +98,12 @@ BOOL LLFloaterScriptLimits::postBuild() return FALSE; } - // contruct the panels + // contruct the panel LLPanelScriptLimitsRegionMemory* panel_memory = new LLPanelScriptLimitsRegionMemory; mInfoPanels.push_back(panel_memory); panel_memory->buildFromFile( "panel_script_limits_region_memory.xml"); mTab->addTabPanel(panel_memory); - - LLPanelScriptLimitsAttachment* panel_attachments = new LLPanelScriptLimitsAttachment; - mInfoPanels.push_back(panel_attachments); - panel_attachments->buildFromFile("panel_script_limits_my_avatar.xml"); - mTab->addTabPanel(panel_attachments); - - - if(mInfoPanels.size() > 0) - { - mTab->selectTab(0); - } - - if(!selectParcelPanel && (mInfoPanels.size() > 1)) - { - mTab->selectTab(1); - } - + mTab->selectTab(0); return TRUE; } @@ -969,269 +940,3 @@ void LLPanelScriptLimitsRegionMemory::onClickReturn(void* userdata) } } -///---------------------------------------------------------------------------- -// Attachment Panel -///---------------------------------------------------------------------------- - -BOOL LLPanelScriptLimitsAttachment::requestAttachmentDetails() -{ - if (!gAgent.getRegion()) return FALSE; - - LLSD body; - std::string url = gAgent.getRegion()->getCapability("AttachmentResources"); - if (!url.empty()) - { - LLCoros::instance().launch("LLPanelScriptLimitsAttachment::getAttachmentLimitsCoro", - boost::bind(&LLPanelScriptLimitsAttachment::getAttachmentLimitsCoro, this, url)); - return TRUE; - } - else - { - return FALSE; - } -} - -void LLPanelScriptLimitsAttachment::getAttachmentLimitsCoro(std::string url) -{ - LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); - LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t - httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getAttachmentLimitsCoro", httpPolicy)); - LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); - - LLSD result = httpAdapter->getAndSuspend(httpRequest, url); - - LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; - LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); - - if (!status) - { - LL_WARNS() << "Unable to retrieve attachment limits." << LL_ENDL; - return; - } - - LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits"); - - if (!instance) - { - LL_WARNS() << "Failed to get llfloaterscriptlimits instance" << LL_ENDL; - return; - } - - LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels"); - if (!tab) - { - LL_WARNS() << "Failed to get scriptlimits_panels" << LL_ENDL; - return; - } - - LLPanelScriptLimitsAttachment* panel = (LLPanelScriptLimitsAttachment*)tab->getChild<LLPanel>("script_limits_my_avatar_panel"); - if (!panel) - { - LL_WARNS() << "Failed to get script_limits_my_avatar_panel" << LL_ENDL; - return; - } - - panel->getChild<LLUICtrl>("loading_text")->setValue(LLSD(std::string(""))); - - LLButton* btn = panel->getChild<LLButton>("refresh_list_btn"); - if (btn) - { - btn->setEnabled(true); - } - - result.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS); - panel->setAttachmentDetails(result); -} - - -void LLPanelScriptLimitsAttachment::setAttachmentDetails(LLSD content) -{ - LLScrollListCtrl *list = getChild<LLScrollListCtrl>("scripts_list"); - - if(!list) - { - return; - } - - S32 number_attachments = content["attachments"].size(); - - for(int i = 0; i < number_attachments; i++) - { - std::string humanReadableLocation = ""; - if(content["attachments"][i].has("location")) - { - std::string actualLocation = content["attachments"][i]["location"]; - humanReadableLocation = LLTrans::getString(actualLocation.c_str()); - } - - S32 number_objects = content["attachments"][i]["objects"].size(); - for(int j = 0; j < number_objects; j++) - { - LLUUID task_id = content["attachments"][i]["objects"][j]["id"].asUUID(); - S32 size = 0; - if(content["attachments"][i]["objects"][j]["resources"].has("memory")) - { - size = content["attachments"][i]["objects"][j]["resources"]["memory"].asInteger() / SIZE_OF_ONE_KB; - } - S32 urls = 0; - if(content["attachments"][i]["objects"][j]["resources"].has("urls")) - { - urls = content["attachments"][i]["objects"][j]["resources"]["urls"].asInteger(); - } - std::string name = content["attachments"][i]["objects"][j]["name"].asString(); - - LLSD element; - - element["id"] = task_id; - element["columns"][0]["column"] = "size"; - element["columns"][0]["value"] = llformat("%d", size); - element["columns"][0]["font"] = "SANSSERIF"; - element["columns"][0]["halign"] = LLFontGL::RIGHT; - - element["columns"][1]["column"] = "urls"; - element["columns"][1]["value"] = llformat("%d", urls); - element["columns"][1]["font"] = "SANSSERIF"; - element["columns"][1]["halign"] = LLFontGL::RIGHT; - - element["columns"][2]["column"] = "name"; - element["columns"][2]["value"] = name; - element["columns"][2]["font"] = "SANSSERIF"; - - element["columns"][3]["column"] = "location"; - element["columns"][3]["value"] = humanReadableLocation; - element["columns"][3]["font"] = "SANSSERIF"; - - list->addElement(element); - } - } - - setAttachmentSummary(content); - - getChild<LLUICtrl>("loading_text")->setValue(LLSD(std::string(""))); - - LLButton* btn = getChild<LLButton>("refresh_list_btn"); - if(btn) - { - btn->setEnabled(true); - } -} - -BOOL LLPanelScriptLimitsAttachment::postBuild() -{ - childSetAction("refresh_list_btn", onClickRefresh, this); - - std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestWaiting"); - getChild<LLUICtrl>("loading_text")->setValue(LLSD(msg_waiting)); - return requestAttachmentDetails(); -} - -void LLPanelScriptLimitsAttachment::clearList() -{ - LLCtrlListInterface *list = childGetListInterface("scripts_list"); - - if (list) - { - list->operateOnAll(LLCtrlListInterface::OP_DELETE); - } - - std::string msg_waiting = LLTrans::getString("ScriptLimitsRequestWaiting"); - getChild<LLUICtrl>("loading_text")->setValue(LLSD(msg_waiting)); -} - -void LLPanelScriptLimitsAttachment::setAttachmentSummary(LLSD content) -{ - if(content["summary"]["used"][0]["type"].asString() == std::string("memory")) - { - mAttachmentMemoryUsed = content["summary"]["used"][0]["amount"].asInteger() / SIZE_OF_ONE_KB; - mAttachmentMemoryMax = content["summary"]["available"][0]["amount"].asInteger() / SIZE_OF_ONE_KB; - mGotAttachmentMemoryUsed = true; - } - else if(content["summary"]["used"][1]["type"].asString() == std::string("memory")) - { - mAttachmentMemoryUsed = content["summary"]["used"][1]["amount"].asInteger() / SIZE_OF_ONE_KB; - mAttachmentMemoryMax = content["summary"]["available"][1]["amount"].asInteger() / SIZE_OF_ONE_KB; - mGotAttachmentMemoryUsed = true; - } - else - { - LL_WARNS() << "attachment details don't contain memory summary info" << LL_ENDL; - return; - } - - if(content["summary"]["used"][0]["type"].asString() == std::string("urls")) - { - mAttachmentURLsUsed = content["summary"]["used"][0]["amount"].asInteger(); - mAttachmentURLsMax = content["summary"]["available"][0]["amount"].asInteger(); - mGotAttachmentURLsUsed = true; - } - else if(content["summary"]["used"][1]["type"].asString() == std::string("urls")) - { - mAttachmentURLsUsed = content["summary"]["used"][1]["amount"].asInteger(); - mAttachmentURLsMax = content["summary"]["available"][1]["amount"].asInteger(); - mGotAttachmentURLsUsed = true; - } - else - { - LL_WARNS() << "attachment details don't contain urls summary info" << LL_ENDL; - return; - } - - if((mAttachmentMemoryUsed >= 0) && (mAttachmentMemoryMax >= 0)) - { - LLStringUtil::format_map_t args_attachment_memory; - args_attachment_memory["[COUNT]"] = llformat ("%d", mAttachmentMemoryUsed); - std::string translate_message = "ScriptLimitsMemoryUsedSimple"; - - if (0 < mAttachmentMemoryMax) - { - S32 attachment_memory_available = mAttachmentMemoryMax - mAttachmentMemoryUsed; - - args_attachment_memory["[MAX]"] = llformat ("%d", mAttachmentMemoryMax); - args_attachment_memory["[AVAILABLE]"] = llformat ("%d", attachment_memory_available); - translate_message = "ScriptLimitsMemoryUsed"; - } - - getChild<LLUICtrl>("memory_used")->setValue(LLTrans::getString(translate_message, args_attachment_memory)); - } - - if((mAttachmentURLsUsed >= 0) && (mAttachmentURLsMax >= 0)) - { - S32 attachment_urls_available = mAttachmentURLsMax - mAttachmentURLsUsed; - - LLStringUtil::format_map_t args_attachment_urls; - args_attachment_urls["[COUNT]"] = llformat ("%d", mAttachmentURLsUsed); - args_attachment_urls["[MAX]"] = llformat ("%d", mAttachmentURLsMax); - args_attachment_urls["[AVAILABLE]"] = llformat ("%d", attachment_urls_available); - std::string msg_attachment_urls = LLTrans::getString("ScriptLimitsURLsUsed", args_attachment_urls); - getChild<LLUICtrl>("urls_used")->setValue(LLSD(msg_attachment_urls)); - } -} - -// static -void LLPanelScriptLimitsAttachment::onClickRefresh(void* userdata) -{ - LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits"); - if(instance) - { - LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels"); - LLPanelScriptLimitsAttachment* panel_attachments = (LLPanelScriptLimitsAttachment*)tab->getChild<LLPanel>("script_limits_my_avatar_panel"); - LLButton* btn = panel_attachments->getChild<LLButton>("refresh_list_btn"); - - //To stop people from hammering the refesh button and accidentally dosing themselves - enough requests can crash the viewer! - //turn the button off, then turn it on when we get a response - if(btn) - { - btn->setEnabled(false); - } - panel_attachments->clearList(); - panel_attachments->requestAttachmentDetails(); - - return; - } - else - { - LL_WARNS() << "could not find LLPanelScriptLimitsRegionMemory instance after refresh button clicked" << LL_ENDL; - return; - } -} - diff --git a/indra/newview/llfloaterscriptlimits.h b/indra/newview/llfloaterscriptlimits.h index 16450c652733f370b366ede4e12b76ead37106e5..d2192f9d01e580baecf1e3bfa6f6fc7cba52e717 100644 --- a/indra/newview/llfloaterscriptlimits.h +++ b/indra/newview/llfloaterscriptlimits.h @@ -152,51 +152,4 @@ class LLPanelScriptLimitsRegionMemory : public LLPanelScriptLimitsInfo, LLRemote static void onClickReturn(void* userdata); }; -///////////////////////////////////////////////////////////////////////////// -// Attachment panel -///////////////////////////////////////////////////////////////////////////// - -class LLPanelScriptLimitsAttachment : public LLPanelScriptLimitsInfo -{ - -public: - LLPanelScriptLimitsAttachment() - : LLPanelScriptLimitsInfo(), - mGotAttachmentMemoryUsed(false), - mAttachmentMemoryMax(0), - mAttachmentMemoryUsed(0), - mGotAttachmentURLsUsed(false), - mAttachmentURLsMax(0), - mAttachmentURLsUsed(0) - {}; - - ~LLPanelScriptLimitsAttachment() - { - }; - - // LLPanel - virtual BOOL postBuild(); - - void setAttachmentDetails(LLSD content); - - void setAttachmentSummary(LLSD content); - BOOL requestAttachmentDetails(); - void clearList(); - -private: - void getAttachmentLimitsCoro(std::string url); - - bool mGotAttachmentMemoryUsed; - S32 mAttachmentMemoryMax; - S32 mAttachmentMemoryUsed; - - bool mGotAttachmentURLsUsed; - S32 mAttachmentURLsMax; - S32 mAttachmentURLsUsed; - -protected: - - static void onClickRefresh(void* userdata); -}; - #endif diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index c08aaf3f501dbeb0bce2c19ae450a05c12377801..2798e375c7c7cbeeb35cfcc44703f764ad8fcfc9 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -28,9 +28,7 @@ #include "llfloatersnapshot.h" -#include "llfacebookconnect.h" #include "llfloaterreg.h" -#include "llfloaterfacebook.h" #include "llfloaterflickr.h" #include "llfloatertwitter.h" #include "llimagefiltersmanager.h" @@ -784,6 +782,7 @@ void LLFloaterSnapshot::Impl::onCommitLayerTypes(LLUICtrl* ctrl, void*data) previewp->setSnapshotBufferType((LLSnapshotModel::ESnapshotLayerType)combobox->getCurrentIndex()); } view->impl->checkAutoSnapshot(previewp, TRUE); + previewp->updateSnapshot(TRUE, TRUE); } } @@ -1241,11 +1240,10 @@ BOOL LLFloaterSnapshot::isWaitingState() BOOL LLFloaterSnapshotBase::ImplBase::updatePreviewList(bool initialized) { - LLFloaterFacebook* floater_facebook = LLFloaterReg::findTypedInstance<LLFloaterFacebook>("facebook"); LLFloaterFlickr* floater_flickr = LLFloaterReg::findTypedInstance<LLFloaterFlickr>("flickr"); LLFloaterTwitter* floater_twitter = LLFloaterReg::findTypedInstance<LLFloaterTwitter>("twitter"); - if (!initialized && !floater_facebook && !floater_flickr && !floater_twitter) + if (!initialized && !floater_flickr && !floater_twitter) return FALSE; BOOL changed = FALSE; diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index ee4fdbe9a5ef3646a33fe33a1ec1b51803b36d35..c2c15ee12b59e7b597ae3754ba11ebe4b01b1cee 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -514,11 +514,6 @@ void LLFloaterTools::refresh() selection_info << getString("status_selectcount", selection_args); getChild<LLTextBox>("selection_count")->setText(selection_info.str()); - - bool have_selection = !LLSelectMgr::getInstance()->getSelection()->isEmpty(); - childSetVisible("selection_count", have_selection); - childSetVisible("remaining_capacity", have_selection); - childSetVisible("selection_empty", !have_selection); } diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp index 3e6fc3dc0d366cc7ed56e8e91dec4b6c2652187e..bd49405f34b41bb26e37ef2e54a7303fd0cada14 100644 --- a/indra/newview/llfloatertopobjects.cpp +++ b/indra/newview/llfloatertopobjects.cpp @@ -78,8 +78,6 @@ LLFloaterTopObjects::LLFloaterTopObjects(const LLSD& key) mCommitCallbackRegistrar.add("TopObjects.ShowBeacon", boost::bind(&LLFloaterTopObjects::onClickShowBeacon, this)); mCommitCallbackRegistrar.add("TopObjects.ReturnSelected", boost::bind(&LLFloaterTopObjects::onReturnSelected, this)); mCommitCallbackRegistrar.add("TopObjects.ReturnAll", boost::bind(&LLFloaterTopObjects::onReturnAll, this)); - mCommitCallbackRegistrar.add("TopObjects.DisableSelected", boost::bind(&LLFloaterTopObjects::onDisableSelected, this)); - mCommitCallbackRegistrar.add("TopObjects.DisableAll", boost::bind(&LLFloaterTopObjects::onDisableAll, this)); mCommitCallbackRegistrar.add("TopObjects.Refresh", boost::bind(&LLFloaterTopObjects::onRefresh, this)); mCommitCallbackRegistrar.add("TopObjects.GetByObjectName", boost::bind(&LLFloaterTopObjects::onGetByObjectName, this)); mCommitCallbackRegistrar.add("TopObjects.GetByOwnerName", boost::bind(&LLFloaterTopObjects::onGetByOwnerName, this)); @@ -145,6 +143,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data) { U32 request_flags; U32 total_count; + U64 total_memory = 0; msg->getU32Fast(_PREHASH_RequestData, _PREHASH_RequestFlags, request_flags); msg->getU32Fast(_PREHASH_RequestData, _PREHASH_TotalObjectCount, total_count); @@ -192,6 +191,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data) { parcel_buf = parcel_name; script_memory = script_size; + total_memory += script_size; } } @@ -265,8 +265,10 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data) { setTitle(getString("top_scripts_title")); list->setColumnLabel("score", getString("scripts_score_label")); - + LLUIString format = getString("top_scripts_text"); + total_memory /= 1024; + format.setArg("[MEMORY]", llformat("%ld", total_memory)); format.setArg("[COUNT]", llformat("%d", total_count)); format.setArg("[TIME]", llformat("%0.3f", mtotalScore)); getChild<LLUICtrl>("title_text")->setValue(LLSD(format)); @@ -332,7 +334,7 @@ void LLFloaterTopObjects::onClickShowBeacon() showBeacon(); } -void LLFloaterTopObjects::doToObjects(int action, bool all) +void LLFloaterTopObjects::returnObjects(bool all) { LLMessageSystem *msg = gMessageSystem; @@ -356,14 +358,7 @@ void LLFloaterTopObjects::doToObjects(int action, bool all) } if (start_message) { - if (action == ACTION_RETURN) - { - msg->newMessageFast(_PREHASH_ParcelReturnObjects); - } - else - { - msg->newMessageFast(_PREHASH_ParcelDisableObjects); - } + msg->newMessageFast(_PREHASH_ParcelReturnObjects); msg->nextBlockFast(_PREHASH_AgentData); msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID()); @@ -397,7 +392,7 @@ bool LLFloaterTopObjects::callbackReturnAll(const LLSD& notification, const LLSD if(!instance) return false; if (option == 0) { - instance->doToObjects(ACTION_RETURN, true); + instance->returnObjects(true); } return false; } @@ -410,31 +405,7 @@ void LLFloaterTopObjects::onReturnAll() void LLFloaterTopObjects::onReturnSelected() { - doToObjects(ACTION_RETURN, false); -} - - -//static -bool LLFloaterTopObjects::callbackDisableAll(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("top_objects"); - if(!instance) return false; - if (option == 0) - { - instance->doToObjects(ACTION_DISABLE, true); - } - return false; -} - -void LLFloaterTopObjects::onDisableAll() -{ - LLNotificationsUtil::add("DisableAllTopObjects", LLSD(), LLSD(), callbackDisableAll); -} - -void LLFloaterTopObjects::onDisableSelected() -{ - doToObjects(ACTION_DISABLE, false); + returnObjects(false); } diff --git a/indra/newview/llfloatertopobjects.h b/indra/newview/llfloatertopobjects.h index dbbe9ac52125ac743bb0338c8e1a14f7b867ff23..3138249c7ae1331b42226032f07f5baf25f29b63 100644 --- a/indra/newview/llfloatertopobjects.h +++ b/indra/newview/llfloatertopobjects.h @@ -78,15 +78,12 @@ class LLFloaterTopObjects : public LLFloater static void onDoubleClickObjectsList(void* data); void onClickShowBeacon(); - void doToObjects(int action, bool all); + void returnObjects(bool all); void onReturnAll(); void onReturnSelected(); - void onDisableAll(); - void onDisableSelected(); static bool callbackReturnAll(const LLSD& notification, const LLSD& response); - static bool callbackDisableAll(const LLSD& notification, const LLSD& response); void onGetByOwnerName(); void onGetByObjectName(); @@ -108,12 +105,6 @@ class LLFloaterTopObjects : public LLFloater F32 mtotalScore; - enum - { - ACTION_RETURN = 0, - ACTION_DISABLE - }; - static LLFloaterTopObjects* sInstance; }; diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index 76ad2146f19e8f20d0f8221858388f5399e309a6..db5a1922870c2768ecdc4cf214c36344451322ca 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -60,6 +60,7 @@ #include "llfloaterreg.h" #include "llscrollcontainer.h" // scroll container for overlapping elements #include "lllivefile.h" // live file poll/stat/reload +#include "llviewermenufile.h" // LLFilePickerReplyThread // Boost (for linux/unix command-line execv) #include <boost/tokenizer.hpp> @@ -206,7 +207,9 @@ class LLFloaterUIPreview : public LLFloater void onClickSaveAll(S32 id); void onClickEditFloater(); void onClickBrowseForEditor(); + void getExecutablePath(const std::vector<std::string>& filenames); void onClickBrowseForDiffs(); + void getDiffsFilePath(const std::vector<std::string>& filenames); void onClickToggleDiffHighlighting(); void onClickToggleOverlapping(); void onClickCloseDisplayedFloater(S32 id); @@ -1019,15 +1022,14 @@ void LLFloaterUIPreview::onClickEditFloater() // Respond to button click to browse for an executable with which to edit XML files void LLFloaterUIPreview::onClickBrowseForEditor() { - // Let the user choose an executable through the file picker dialog box - LLFilePicker& picker = LLFilePicker::instance(); - if (!picker.getOpenFile(LLFilePicker::FFLOAD_EXE)) - { - return; // user cancelled -- do nothing - } + // Let the user choose an executable through the file picker dialog box + (new LLFilePickerReplyThread(boost::bind(&LLFloaterUIPreview::getExecutablePath, this, _1), LLFilePicker::FFLOAD_EXE, false))->getFile(); +} +void LLFloaterUIPreview::getExecutablePath(const std::vector<std::string>& filenames) +{ // put the selected path into text field - const std::string chosen_path = picker.getFirstFile(); + const std::string chosen_path = filenames[0]; std::string executable_path = chosen_path; #if LL_DARWIN // on Mac, if it's an application bundle, figure out the actual path from the Info.plist file @@ -1075,15 +1077,13 @@ void LLFloaterUIPreview::onClickBrowseForEditor() void LLFloaterUIPreview::onClickBrowseForDiffs() { // create load dialog box - LLFilePicker::ELoadFilter type = (LLFilePicker::ELoadFilter)((intptr_t)((void*)LLFilePicker::FFLOAD_XML)); // nothing for *.exe so just use all - LLFilePicker& picker = LLFilePicker::instance(); - if (!picker.getOpenFile(type)) // user cancelled -- do nothing - { - return; - } + (new LLFilePickerReplyThread(boost::bind(&LLFloaterUIPreview::getDiffsFilePath, this, _1), LLFilePicker::FFLOAD_XML, false))->getFile(); +} +void LLFloaterUIPreview::getDiffsFilePath(const std::vector<std::string>& filenames) +{ // put the selected path into text field - const std::string chosen_path = picker.getFirstFile(); + const std::string chosen_path = filenames[0]; mDiffPathTextBox->setText(std::string(chosen_path)); // copy the path to the executable to the textfield for display and later fetching if(LLView::sHighlightingDiffs) // if we're already highlighting, toggle off and then on so we get the data from the new file { diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp index 3b17368445ae4911568132fa63df8dcb3616af16..13953d6be5b77942ebb16d0527ba8abf11af1cf2 100644 --- a/indra/newview/llfloaterwebcontent.cpp +++ b/indra/newview/llfloaterwebcontent.cpp @@ -30,7 +30,6 @@ #include "lliconctrl.h" #include "llfloaterreg.h" #include "llhttpconstants.h" -#include "llfacebookconnect.h" #include "llflickrconnect.h" #include "lltwitterconnect.h" #include "lllayoutstack.h" @@ -289,17 +288,7 @@ void LLFloaterWebContent::onOpen(const LLSD& key) //virtual void LLFloaterWebContent::onClose(bool app_quitting) { - // If we close the web browsing window showing the facebook login, we need to signal to this object that the connection will not happen - // MAINT-3440 note change here to use findInstance and not getInstance - latter creates an instance if it's not there which is bad. - LLFloater* fbc_web = LLFloaterReg::findInstance("fbc_web"); - if (fbc_web == this) - { - if (!LLFacebookConnect::instance().isConnected()) - { - LLFacebookConnect::instance().setConnectionState(LLFacebookConnect::FB_CONNECTION_FAILED); - } - } - // Same with Flickr + // If we close the web browsing window showing the Flickr login, we need to signal to this object that the connection will not happen // MAINT-3440 note change here to use findInstance and not getInstance - latter creates an instance if it's not there which is bad. LLFloater* flickr_web = LLFloaterReg::findInstance("flickr_web"); if (flickr_web == this) @@ -309,7 +298,7 @@ void LLFloaterWebContent::onClose(bool app_quitting) LLFlickrConnect::instance().setConnectionState(LLFlickrConnect::FLICKR_CONNECTION_FAILED); } } - // And Twitter + // Same with Twitter // MAINT-3440 note change here to use findInstance and not getInstance - latter creates an instance if it's not there which is bad. LLFloater* twitter_web = LLFloaterReg::findInstance("twitter_web"); if (twitter_web == this) @@ -380,13 +369,6 @@ void LLFloaterWebContent::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent // The browser instance wants its window closed. closeFloater(); } - else if(event == MEDIA_EVENT_GEOMETRY_CHANGE) - { - if (mCurrentURL.find("facebook.com/dialog/oauth") == std::string::npos) // HACK to fix ACME-1317 - Cho - { - geometryChanged(self->getGeometryX(), self->getGeometryY(), self->getGeometryWidth(), self->getGeometryHeight()); - } - } else if(event == MEDIA_EVENT_STATUS_TEXT_CHANGED ) { const std::string text = self->getStatusText(); diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index a9b15fc8b6296aa507bfd2759a6475a628db8aa2..fea01786f35796454d72091d74678fe6b9646242 100644 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -1005,7 +1005,10 @@ F32 gpu_benchmark() //number of samples to take const S32 samples = 64; - + + //time limit, allocation operations shouldn't take longer then 30 seconds, same for actual benchmark. + const F32 time_limit = 30; + ShaderProfileHelper initProfile; std::vector<LLRenderTarget> dest(count); @@ -1023,12 +1026,14 @@ F32 gpu_benchmark() gGL.setColorMask(true, true); LLGLDepthTest depth(GL_FALSE); + LLTimer alloc_timer; + alloc_timer.start(); for (U32 i = 0; i < count; ++i) { //allocate render targets and textures if (!dest[i].allocate(res, res, GL_RGBA, false, false, LLTexUnit::TT_TEXTURE, true)) { - LL_WARNS() << "Failed to allocate render target." << LL_ENDL; + LL_WARNS("Benchmark") << "Failed to allocate render target." << LL_ENDL; // abandon the benchmark test delete[] pixels; return -1.f; @@ -1040,12 +1045,20 @@ F32 gpu_benchmark() if (!texHolder.bind(i)) { // can use a dummy value mDummyTexUnit = new LLTexUnit(-1); - LL_WARNS() << "Failed to bind tex unit." << LL_ENDL; + LL_WARNS("Benchmark") << "Failed to bind tex unit." << LL_ENDL; // abandon the benchmark test delete[] pixels; return -1.f; } LLImageGL::setManualImage(GL_TEXTURE_2D, 0, GL_RGBA, res,res,GL_RGBA, GL_UNSIGNED_BYTE, pixels); + + if (alloc_timer.getElapsedTimeF32() > time_limit) + { + // abandon the benchmark test + LL_WARNS("Benchmark") << "Allocation operation took longer then 30 seconds, stopping." << LL_ENDL; + delete[] pixels; + return -1.f; + } } delete [] pixels; @@ -1055,7 +1068,7 @@ F32 gpu_benchmark() if (!buff->allocateBuffer(3, 0, true)) { - LL_WARNS() << "Failed to allocate buffer during benchmark." << LL_ENDL; + LL_WARNS("Benchmark") << "Failed to allocate buffer during benchmark." << LL_ENDL; // abandon the benchmark test return -1.f; } @@ -1065,7 +1078,7 @@ F32 gpu_benchmark() if (! buff->getVertexStrider(v)) { - LL_WARNS() << "GL LLVertexBuffer::getVertexStrider() returned false, " + LL_WARNS("Benchmark") << "GL LLVertexBuffer::getVertexStrider() returned false, " << "buff->getMappedData() is" << (buff->getMappedData()? " not" : "") << " NULL" << LL_ENDL; @@ -1086,7 +1099,8 @@ F32 gpu_benchmark() buff->setBuffer(LLVertexBuffer::MAP_VERTEX); glFinish(); - for (S32 c = -1; c < samples; ++c) + F32 time_passed = 0; // seconds + for (S32 c = -1; c < samples && time_passed < time_limit; ++c) { LLTimer timer; timer.start(); @@ -1103,6 +1117,7 @@ F32 gpu_benchmark() glFinish(); F32 time = timer.getElapsedTimeF32(); + time_passed += time; if (c >= 0) // <-- ignore the first sample as it tends to be artificially slow { @@ -1117,12 +1132,12 @@ F32 gpu_benchmark() F32 gbps = results[results.size()/2]; - LL_INFOS() << "Memory bandwidth is " << llformat("%.3f", gbps) << "GB/sec according to CPU timers" << LL_ENDL; - + LL_INFOS("Benchmark") << "Memory bandwidth is " << llformat("%.3f", gbps) << "GB/sec according to CPU timers, " << (F32)results.size() << " tests took " << time_passed << " seconds" << LL_ENDL; + #if LL_DARWIN if (gbps > 512.f) { - LL_WARNS() << "Memory bandwidth is improbably high and likely incorrect; discarding result." << LL_ENDL; + LL_WARNS("Benchmark") << "Memory bandwidth is improbably high and likely incorrect; discarding result." << LL_ENDL; //OSX is probably lying, discard result return -1.f; } @@ -1131,11 +1146,11 @@ F32 gpu_benchmark() F32 ms = gBenchmarkProgram.mTimeElapsed/1000000.f; F32 seconds = ms/1000.f; - F64 samples_drawn = res*res*count*samples; + F64 samples_drawn = res*res*count*results.size(); F32 samples_sec = (samples_drawn/1000000000.0)/seconds; gbps = samples_sec*8; - LL_INFOS() << "Memory bandwidth is " << llformat("%.3f", gbps) << "GB/sec according to ARB_timer_query" << LL_ENDL; + LL_INFOS("Benchmark") << "Memory bandwidth is " << llformat("%.3f", gbps) << "GB/sec according to ARB_timer_query, total time " << seconds << " seconds" << LL_ENDL; return gbps; } diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 152d0eddcd19202664dcc718e4d5048a0a9232a3..088d052533566f605d5e2b75d8fcf2af87a3b1a0 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -2137,6 +2137,7 @@ void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id) static U32 lastGroupMemberRequestFrame = 0; // Have we requested the information already this frame? + // Todo: make this per group, we can invite to one group and simultaneously be checking another one if ((lastGroupMemberRequestFrame == gFrameCount) || (mMemberRequestInFlight)) return; @@ -2166,6 +2167,9 @@ void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id) return; } + LLGroupMgrGroupData* group_datap = createGroupData(group_id); //make sure group exists + group_datap->mMemberRequestID.generate(); // mark as pending + lastGroupMemberRequestFrame = gFrameCount; LLCoros::instance().launch("LLGroupMgr::groupMembersRequestCoro", diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h index 940ef6eea13af48a80782c117585e3aed2235b8c..cf9735e38a0510ed0cb94ceb156f736501162ffa 100644 --- a/indra/newview/llgroupmgr.h +++ b/indra/newview/llgroupmgr.h @@ -258,6 +258,11 @@ friend class LLGroupMgr; bool isRoleMemberDataComplete() { return mRoleMemberDataComplete; } bool isGroupPropertiesDataComplete() { return mGroupPropertiesDataComplete; } + bool isMemberDataPending() { return mMemberRequestID.notNull(); } + bool isRoleDataPending() { return mRoleDataRequestID.notNull(); } + bool isRoleMemberDataPending() { return (mRoleMembersRequestID.notNull() || mPendingRoleMemberRequest); } + bool isGroupTitlePending() { return mTitlesRequestID.notNull(); } + bool isSingleMemberNotOwner(); F32 getAccessTime() const { return mAccessTime; } diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp index e76b3d118e324d90363e783bdbce877a4a1cd54d..d59c301210781965a77ff73f2754e08081168d05 100644 --- a/indra/newview/llimprocessing.cpp +++ b/indra/newview/llimprocessing.cpp @@ -854,15 +854,33 @@ void LLIMProcessing::processNewMessage(LLUUID from_id, } else // IM_TASK_INVENTORY_OFFERED { - if (sizeof(S8) != binary_bucket_size) + if (offline == IM_OFFLINE && session_id.isNull() && aux_id.notNull() && binary_bucket_size > sizeof(S8)* 5) { - LL_WARNS("Messaging") << "Malformed inventory offer from object" << LL_ENDL; - delete info; - break; + // cap received offline message + std::string str_bucket = ll_safe_string((char*)binary_bucket, binary_bucket_size); + typedef boost::tokenizer<boost::char_separator<char> > tokenizer; + boost::char_separator<char> sep("|", "", boost::keep_empty_tokens); + tokenizer tokens(str_bucket, sep); + tokenizer::iterator iter = tokens.begin(); + + info->mType = (LLAssetType::EType)(atoi((*(iter++)).c_str())); + // Note There is more elements in 'tokens' ... + + info->mObjectID = LLUUID::null; + info->mFromObject = TRUE; + } + else + { + if (sizeof(S8) != binary_bucket_size) + { + LL_WARNS("Messaging") << "Malformed inventory offer from object" << LL_ENDL; + delete info; + break; + } + info->mType = (LLAssetType::EType) binary_bucket[0]; + info->mObjectID = LLUUID::null; + info->mFromObject = TRUE; } - info->mType = (LLAssetType::EType) binary_bucket[0]; - info->mObjectID = LLUUID::null; - info->mFromObject = TRUE; } info->mIM = dialog; diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 1987e1585093548c5628c331d53704fb478ce915..a50a66a8ce9fdec6de5dae30cd26b5b64dc6a001 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -1399,13 +1399,6 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type, // Only should happen for broken links. new_listener = new LLLinkItemBridge(inventory, root, uuid); break; - case LLAssetType::AT_MESH: - if(!(inv_type == LLInventoryType::IT_MESH)) - { - LL_WARNS() << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << LL_ENDL; - } - new_listener = new LLMeshBridge(inventory, root, uuid); - break; case LLAssetType::AT_UNKNOWN: new_listener = new LLUnknownItemBridge(inventory, root, uuid); break; @@ -1415,7 +1408,7 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type, break; default: - LL_INFOS() << "Unhandled asset type (llassetstorage.h): " + LL_INFOS_ONCE() << "Unhandled asset type (llassetstorage.h): " << (S32)asset_type << " (" << LLAssetType::lookup(asset_type) << ")" << LL_ENDL; break; } @@ -2101,7 +2094,9 @@ BOOL LLItemBridge::isItemCopyable() const LLViewerInventoryItem* item = getItem(); if (item) { - // Can't copy worn objects. DEV-15183 + // Can't copy worn objects. + // Worn objects are tied to their inworld conterparts + // Copy of modified worn object will return object with obsolete asset and inventory if(get_is_item_worn(mUUID)) { return FALSE; @@ -6307,7 +6302,7 @@ bool confirm_attachment_rez(const LLSD& notification, const LLSD& response) if (!gAgentAvatarp->canAttachMoreObjects()) { LLSD args; - args["MAX_ATTACHMENTS"] = llformat("%d", MAX_AGENT_ATTACHMENTS); + args["MAX_ATTACHMENTS"] = llformat("%d", gAgentAvatarp->getMaxAttachments()); LLNotificationsUtil::add("MaxAttachmentsOnOutfit", args); return false; } @@ -6830,58 +6825,6 @@ void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags) hide_context_entries(menu, items, disabled_items); } -// +=================================================+ -// | LLMeshBridge | -// +=================================================+ - -LLUIImagePtr LLMeshBridge::getIcon() const -{ - return LLInventoryIcon::getIcon(LLAssetType::AT_MESH, LLInventoryType::IT_MESH, 0, FALSE); -} - -void LLMeshBridge::openItem() -{ - LLViewerInventoryItem* item = getItem(); - - if (item) - { - // open mesh - } -} - -void LLMeshBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - LL_DEBUGS() << "LLMeshBridge::buildContextMenu()" << LL_ENDL; - std::vector<std::string> items; - std::vector<std::string> disabled_items; - - if(isItemInTrash()) - { - items.push_back(std::string("Purge Item")); - if (!isItemRemovable()) - { - disabled_items.push_back(std::string("Purge Item")); - } - - items.push_back(std::string("Restore Item")); - } - else if (isMarketplaceListingsFolder()) - { - addMarketplaceContextMenuOptions(flags, items, disabled_items); - items.push_back(std::string("Properties")); - getClipboardEntries(false, items, disabled_items, flags); - } - else - { - items.push_back(std::string("Properties")); - - getClipboardEntries(true, items, disabled_items, flags); - } - - addLinkReplaceMenuOption(items, disabled_items); - hide_context_entries(menu, items, disabled_items); -} - // +=================================================+ // | LLLinkBridge | @@ -7344,7 +7287,10 @@ void LLFolderViewGroupedItemBridge::groupFilterContextMenu(folder_view_item_dequ { if (!LLAppearanceMgr::instance().canAddWearables(ids) && canWearSelected(ids)) { - disabled_items.push_back(std::string("Wearable Add")); + disabled_items.push_back(std::string("Wearable And Object Wear")); + disabled_items.push_back(std::string("Wearable Add")); + disabled_items.push_back(std::string("Attach To")); + disabled_items.push_back(std::string("Attach To HUD")); } } disable_context_entries_if_present(menu, disabled_items); @@ -7355,8 +7301,7 @@ bool LLFolderViewGroupedItemBridge::canWearSelected(uuid_vec_t item_ids) for (uuid_vec_t::const_iterator it = item_ids.begin(); it != item_ids.end(); ++it) { LLViewerInventoryItem* item = gInventory.getItem(*it); - LLAssetType::EType asset_type = item->getType(); - if (!item || (asset_type >= LLAssetType::AT_COUNT) || (asset_type <= LLAssetType::AT_NONE)) + if (!item || (item->getType() >= LLAssetType::AT_COUNT) || (item->getType() <= LLAssetType::AT_NONE)) { return false; } diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index ce06e8fffc81ece7d6909a42fde56d9acc4fae83..f4df566fa6d8e944abc9bb88417c95eb1faaf0a4 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -603,23 +603,6 @@ class LLLinkFolderBridge : public LLItemBridge static std::string sPrefix; }; - -class LLMeshBridge : public LLItemBridge -{ - friend class LLInvFVBridge; -public: - virtual LLUIImagePtr getIcon() const; - virtual void openItem(); - virtual void buildContextMenu(LLMenuGL& menu, U32 flags); - -protected: - LLMeshBridge(LLInventoryPanel* inventory, - LLFolderView* root, - const LLUUID& uuid) : - LLItemBridge(inventory, root, uuid) {} -}; - - //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLInvFVBridgeAction // @@ -650,17 +633,6 @@ class LLInvFVBridgeAction LLInventoryModel* mModel; }; -class LLMeshBridgeAction: public LLInvFVBridgeAction -{ - friend class LLInvFVBridgeAction; -public: - virtual void doIt() ; - virtual ~LLMeshBridgeAction(){} -protected: - LLMeshBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){} - -}; - //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Recent Inventory Panel related classes diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 9193613e9f2cd5cb5fbff8f6b4a33f96dbf84112..16385928b4d8e9e88d71289e5b48ef63d419956a 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -58,6 +58,7 @@ LLInventoryFilter::FilterOps::FilterOps(const Params& p) mHoursAgo(p.hours_ago), mDateSearchDirection(p.date_search_direction), mShowFolderState(p.show_folder_state), + mFilterCreatorType(p.creator_type), mPermissions(p.permissions), mFilterTypes(p.types), mFilterUUID(p.uuid), @@ -78,8 +79,7 @@ LLInventoryFilter::LLInventoryFilter(const Params& p) mCurrentGeneration(0), mFirstRequiredGeneration(0), mFirstSuccessGeneration(0), - mSearchType(SEARCHTYPE_NAME), - mFilterCreatorType(FILTERCREATOR_ALL) + mSearchType(SEARCHTYPE_NAME) { // copy mFilterOps into mDefaultFilterOps markDefault(); @@ -489,7 +489,7 @@ bool LLInventoryFilter::checkAgainstCreator(const LLFolderViewModelItemInventory { if (!listener) return TRUE; const BOOL is_folder = listener->getInventoryType() == LLInventoryType::IT_CATEGORY; - switch(mFilterCreatorType) + switch (mFilterOps.mFilterCreatorType) { case FILTERCREATOR_SELF: if(is_folder) return FALSE; @@ -601,9 +601,9 @@ void LLInventoryFilter::setSearchType(ESearchType type) void LLInventoryFilter::setFilterCreator(EFilterCreatorType type) { - if(mFilterCreatorType != type) + if (mFilterOps.mFilterCreatorType != type) { - mFilterCreatorType = type; + mFilterOps.mFilterCreatorType = type; setModified(); } } @@ -1194,6 +1194,7 @@ void LLInventoryFilter::toParams(Params& params) const params.filter_ops.hours_ago = getHoursAgo(); params.filter_ops.date_search_direction = getDateSearchDirection(); params.filter_ops.show_folder_state = getShowFolderState(); + params.filter_ops.creator_type = getFilterCreatorType(); params.filter_ops.permissions = getFilterPermissions(); params.substring = getFilterSubString(); params.since_logoff = isSinceLogoff(); @@ -1216,6 +1217,7 @@ void LLInventoryFilter::fromParams(const Params& params) setHoursAgo(params.filter_ops.hours_ago); setDateSearchDirection(params.filter_ops.date_search_direction); setShowFolderState(params.filter_ops.show_folder_state); + setFilterCreator(params.filter_ops.creator_type); setFilterPermissions(params.filter_ops.permissions); setFilterSubString(params.substring); setDateRangeLastLogoff(params.since_logoff); @@ -1278,6 +1280,11 @@ LLInventoryFilter::EFolderShow LLInventoryFilter::getShowFolderState() const return mFilterOps.mShowFolderState; } +LLInventoryFilter::EFilterCreatorType LLInventoryFilter::getFilterCreatorType() const +{ + return mFilterOps.mFilterCreatorType; +} + bool LLInventoryFilter::isTimedOut() { return mFilterTime.hasExpired(); diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index 01754ed0232435f894144c06595703f60840f8cc..4a1fec8454893963b0d2c338bbf95894742607bf 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -126,6 +126,7 @@ class LLInventoryFilter : public LLFolderViewFilter Optional<U32> date_search_direction; Optional<EFolderShow> show_folder_state; Optional<PermissionMask> permissions; + Optional<EFilterCreatorType> creator_type; Params() : types("filter_types", FILTERTYPE_OBJECT), @@ -138,6 +139,7 @@ class LLInventoryFilter : public LLFolderViewFilter hours_ago("hours_ago", 0), date_search_direction("date_search_direction", FILTERDATEDIRECTION_NEWER), show_folder_state("show_folder_state", SHOW_NON_EMPTY_FOLDERS), + creator_type("creator_type", FILTERCREATOR_ALL), permissions("permissions", PERM_NONE) {} }; @@ -156,8 +158,9 @@ class LLInventoryFilter : public LLFolderViewFilter U32 mHoursAgo; U32 mDateSearchDirection; - EFolderShow mShowFolderState; - PermissionMask mPermissions; + EFolderShow mShowFolderState; + PermissionMask mPermissions; + EFilterCreatorType mFilterCreatorType; }; struct Params : public LLInitParam::Block<Params> @@ -202,7 +205,6 @@ class LLInventoryFilter : public LLFolderViewFilter void setSearchType(ESearchType type); ESearchType getSearchType() { return mSearchType; } void setFilterCreator(EFilterCreatorType type); - EFilterCreatorType getFilterCreator() { return mFilterCreatorType; } void setFilterSubString(const std::string& string); const std::string& getFilterSubString(BOOL trim = FALSE) const; @@ -243,8 +245,9 @@ class LLInventoryFilter : public LLFolderViewFilter // +-------------------------------------------------------------------+ // + Presentation // +-------------------------------------------------------------------+ - void setShowFolderState( EFolderShow state); - EFolderShow getShowFolderState() const; + void setShowFolderState( EFolderShow state); + EFolderShow getShowFolderState() const; + EFilterCreatorType getFilterCreatorType() const; void setEmptyLookupMessage(const std::string& message); std::string getEmptyLookupMessage() const; @@ -324,7 +327,6 @@ class LLInventoryFilter : public LLFolderViewFilter std::string mEmptyLookupMessage; ESearchType mSearchType; - EFilterCreatorType mFilterCreatorType; }; #endif diff --git a/indra/newview/llinventoryicon.cpp b/indra/newview/llinventoryicon.cpp index d0df1c94d58df4b04c4ac294c4b673fff543394d..ee6e3dd384ada3e6813be5374ac59f25fd965cdf 100644 --- a/indra/newview/llinventoryicon.cpp +++ b/indra/newview/llinventoryicon.cpp @@ -83,6 +83,7 @@ LLIconDictionary::LLIconDictionary() addEntry(LLInventoryType::ICONNAME_CLOTHING_SKIRT, new IconEntry("Inv_Skirt")); addEntry(LLInventoryType::ICONNAME_CLOTHING_ALPHA, new IconEntry("Inv_Alpha")); addEntry(LLInventoryType::ICONNAME_CLOTHING_TATTOO, new IconEntry("Inv_Tattoo")); + addEntry(LLInventoryType::ICONNAME_CLOTHING_UNIVERSAL, new IconEntry("Inv_Universal")); addEntry(LLInventoryType::ICONNAME_ANIMATION, new IconEntry("Inv_Animation")); addEntry(LLInventoryType::ICONNAME_GESTURE, new IconEntry("Inv_Gesture")); diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index a520e0171ea0a39c132a1bbabedacdc31de0f8d9..c49d61df31128c59ea8bd066868057e6fdc5a560 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -888,14 +888,6 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item, U32 mask) return mask; } - // We're hiding mesh types -#if 0 - if (item->getType() == LLAssetType::AT_MESH) - { - return mask; - } -#endif - LLPointer<LLViewerInventoryItem> old_item = getItem(item->getUUID()); LLPointer<LLViewerInventoryItem> new_item; if(old_item) @@ -1820,9 +1812,19 @@ void LLInventoryModel::addItem(LLViewerInventoryItem* item) if (LLAssetType::lookup(item->getType()) == LLAssetType::badLookup()) { - LL_WARNS(LOG_INV) << "Got unknown asset type for item [ name: " << item->getName() - << " type: " << item->getType() - << " inv-type: " << item->getInventoryType() << " ]." << LL_ENDL; + if (item->getType() >= LLAssetType::AT_COUNT) + { + // Not yet supported. + LL_DEBUGS(LOG_INV) << "Got unknown asset type for item [ name: " << item->getName() + << " type: " << item->getType() + << " inv-type: " << item->getInventoryType() << " ]." << LL_ENDL; + } + else + { + LL_WARNS(LOG_INV) << "Got unknown asset type for item [ name: " << item->getName() + << " type: " << item->getType() + << " inv-type: " << item->getInventoryType() << " ]." << LL_ENDL; + } } // This condition means that we tried to add a link without the baseobj being in memory. diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 3992b506e9c4c9e12d8a28ed0e7c27d2bd969bf1..d4993a1091a2cfa225a031e016d1a69faccc55e5 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -871,7 +871,8 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id) if (objectp->getType() >= LLAssetType::AT_COUNT) { - LL_WARNS() << "LLInventoryPanel::buildNewViews called with unknown objectp->mType : " + // Example: Happens when we add assets of new, not yet supported type to library + LL_DEBUGS() << "LLInventoryPanel::buildNewViews called with unknown objectp->mType : " << ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID() << LL_ENDL; diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp index 760325b652a889c31006a047a3c4f9867c54c7cc..0243e2183e6d4a328758e5c3d338dbae122a23e8 100644 --- a/indra/newview/lllocalbitmaps.cpp +++ b/indra/newview/lllocalbitmaps.cpp @@ -381,6 +381,7 @@ void LLLocalBitmap::replaceIDs(LLUUID old_id, LLUUID new_id) updateUserLayers(old_id, new_id, LLWearableType::WT_SKIRT); updateUserLayers(old_id, new_id, LLWearableType::WT_SOCKS); updateUserLayers(old_id, new_id, LLWearableType::WT_TATTOO); + updateUserLayers(old_id, new_id, LLWearableType::WT_UNIVERSAL); updateUserLayers(old_id, new_id, LLWearableType::WT_UNDERPANTS); updateUserLayers(old_id, new_id, LLWearableType::WT_UNDERSHIRT); } @@ -512,7 +513,7 @@ void LLLocalBitmap::updateUserVolumes(LLUUID old_id, LLUUID new_id, U32 channel) { LLVOVolume* volobjp = (*old_texture->getVolumeList(channel))[volume_iter]; switch (channel) - { + { case LLRender::LIGHT_TEX: { if (volobjp->getLightTextureID() == old_id) @@ -526,19 +527,19 @@ void LLLocalBitmap::updateUserVolumes(LLUUID old_id, LLUUID new_id, U32 channel) LLViewerObject* object = (LLViewerObject*)volobjp; if (object) - { - if (object->isSculpted() && object->getVolume() && - object->getVolume()->getParams().getSculptID() == old_id) - { - LLSculptParams* old_params = (LLSculptParams*)object->getParameterEntry(LLNetworkData::PARAMS_SCULPT); - LLSculptParams new_params(*old_params); - new_params.setSculptTexture(new_id, (*old_params).getSculptType()); - object->setParameterEntry(LLNetworkData::PARAMS_SCULPT, new_params, TRUE); - } - } + { + if (object->isSculpted() && object->getVolume() && + object->getVolume()->getParams().getSculptID() == old_id) + { + LLSculptParams* old_params = (LLSculptParams*)object->getParameterEntry(LLNetworkData::PARAMS_SCULPT); + LLSculptParams new_params(*old_params); + new_params.setSculptTexture(new_id, (*old_params).getSculptType()); + object->setParameterEntry(LLNetworkData::PARAMS_SCULPT, new_params, TRUE); } } } + } + } } void LLLocalBitmap::updateUserLayers(LLUUID old_id, LLUUID new_id, LLWearableType::EType type) @@ -746,7 +747,7 @@ LLAvatarAppearanceDefines::ETextureIndex LLLocalBitmap::getTexIndex( case LLWearableType::WT_TATTOO: { - switch(baked_texind) + switch (baked_texind) { case LLAvatarAppearanceDefines::BAKED_HEAD: { @@ -764,6 +765,75 @@ LLAvatarAppearanceDefines::ETextureIndex LLLocalBitmap::getTexIndex( result = LLAvatarAppearanceDefines::TEX_UPPER_TATTOO; break; } + default: + { + break; + } + } + break; + + } + case LLWearableType::WT_UNIVERSAL: + { + switch (baked_texind) + { + + case LLAvatarAppearanceDefines::BAKED_SKIRT: + { + result = LLAvatarAppearanceDefines::TEX_SKIRT_TATTOO; + break; + } + case LLAvatarAppearanceDefines::BAKED_EYES: + { + result = LLAvatarAppearanceDefines::TEX_EYES_TATTOO; + break; + } + case LLAvatarAppearanceDefines::BAKED_HAIR: + { + result = LLAvatarAppearanceDefines::TEX_HAIR_TATTOO; + break; + } + case LLAvatarAppearanceDefines::BAKED_LEFT_ARM: + { + result = LLAvatarAppearanceDefines::TEX_LEFT_ARM_TATTOO; + break; + } + case LLAvatarAppearanceDefines::BAKED_LEFT_LEG: + { + result = LLAvatarAppearanceDefines::TEX_LEFT_LEG_TATTOO; + break; + } + case LLAvatarAppearanceDefines::BAKED_AUX1: + { + result = LLAvatarAppearanceDefines::TEX_AUX1_TATTOO; + break; + } + case LLAvatarAppearanceDefines::BAKED_AUX2: + { + result = LLAvatarAppearanceDefines::TEX_AUX2_TATTOO; + break; + } + case LLAvatarAppearanceDefines::BAKED_AUX3: + { + result = LLAvatarAppearanceDefines::TEX_AUX3_TATTOO; + break; + } + case LLAvatarAppearanceDefines::BAKED_UPPER: + { + result = LLAvatarAppearanceDefines::TEX_UPPER_UNIVERSAL_TATTOO; + break; + } + case LLAvatarAppearanceDefines::BAKED_LOWER: + { + result = LLAvatarAppearanceDefines::TEX_LOWER_UNIVERSAL_TATTOO; + break; + } + case LLAvatarAppearanceDefines::BAKED_HEAD: + { + result = LLAvatarAppearanceDefines::TEX_HEAD_UNIVERSAL_TATTOO; + break; + } + default: { diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index c535fc1cdf49bdd49ae253dec8d17d85784f761f..1bdeddbcfeb6c0447a838ffa50f764e5bd455833 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -516,7 +516,7 @@ LLMutex* LLLogChat::historyThreadsMutex() { if (sHistoryThreadsMutex == NULL) { - sHistoryThreadsMutex = new LLMutex(NULL); + sHistoryThreadsMutex = new LLMutex(); } return sHistoryThreadsMutex; } @@ -573,40 +573,10 @@ void LLLogChat::findTranscriptFiles(std::string pattern, std::vector<std::string while (iter.next(filename)) { std::string fullname = gDirUtilp->add(dirname, filename); - - LLFILE * filep = LLFile::fopen(fullname, "rb"); - if (NULL != filep) + if (isTranscriptFileFound(fullname)) { - if(makeLogFileName("chat")== fullname) - { - //Add Nearby chat history to the list of transcriptions - list_of_transcriptions.push_back(gDirUtilp->add(dirname, filename)); - LLFile::close(filep); - continue; - } - char buffer[LOG_RECALL_SIZE]; - - fseek(filep, 0, SEEK_END); // seek to end of file - S32 bytes_to_read = ftell(filep); // get current file pointer - fseek(filep, 0, SEEK_SET); // seek back to beginning of file - - // limit the number characters to read from file - if (bytes_to_read >= LOG_RECALL_SIZE) - { - bytes_to_read = LOG_RECALL_SIZE - 1; - } - - if (bytes_to_read > 0 && NULL != fgets(buffer, bytes_to_read, filep)) - { - //matching a timestamp - boost::match_results<std::string::const_iterator> matches; - if (boost::regex_match(std::string(buffer), matches, TIMESTAMP)) - { - list_of_transcriptions.push_back(gDirUtilp->add(dirname, filename)); - } - } - LLFile::close(filep); - } + list_of_transcriptions.push_back(fullname); + } } } @@ -756,75 +726,70 @@ void LLLogChat::deleteTranscripts() // static bool LLLogChat::isTranscriptExist(const LLUUID& avatar_id, bool is_group) { - std::vector<std::string> list_of_transcriptions; - LLLogChat::getListOfTranscriptFiles(list_of_transcriptions); - - if (list_of_transcriptions.size() > 0) + LLAvatarName avatar_name; + LLAvatarNameCache::get(avatar_id, &avatar_name); + std::string avatar_user_name = avatar_name.getAccountName(); + if(!is_group) { - LLAvatarName avatar_name; - LLAvatarNameCache::get(avatar_id, &avatar_name); - std::string avatar_user_name = avatar_name.getAccountName(); - if(!is_group) - { - std::replace(avatar_user_name.begin(), avatar_user_name.end(), '.', '_'); - BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions) - { - if (std::string::npos != transcript_file_name.find(avatar_user_name)) - { - return true; - } - } - } - else - { - std::string file_name; - gCacheName->getGroupName(avatar_id, file_name); - file_name = makeLogFileName(file_name); - BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions) - { - if (transcript_file_name == file_name) - { - return true; - } - } - } - + std::replace(avatar_user_name.begin(), avatar_user_name.end(), '.', '_'); + return isTranscriptFileFound(makeLogFileName(avatar_user_name)); + } + else + { + std::string file_name; + gCacheName->getGroupName(avatar_id, file_name); + file_name = makeLogFileName(file_name); + return isTranscriptFileFound(makeLogFileName(file_name)); } - return false; } bool LLLogChat::isNearbyTranscriptExist() { - std::vector<std::string> list_of_transcriptions; - LLLogChat::getListOfTranscriptFiles(list_of_transcriptions); - - std::string file_name; - file_name = makeLogFileName("chat"); - BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions) - { - if (transcript_file_name == file_name) - { - return true; - } - } - return false; + return isTranscriptFileFound(makeLogFileName("chat"));; } bool LLLogChat::isAdHocTranscriptExist(std::string file_name) { - std::vector<std::string> list_of_transcriptions; - LLLogChat::getListOfTranscriptFiles(list_of_transcriptions); + return isTranscriptFileFound(makeLogFileName(file_name));; +} - file_name = makeLogFileName(file_name); - BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions) +// static +bool LLLogChat::isTranscriptFileFound(std::string fullname) +{ + bool result = false; + LLFILE * filep = LLFile::fopen(fullname, "rb"); + if (NULL != filep) { - if (transcript_file_name == file_name) - { - return true; + if (makeLogFileName("chat") == fullname) + { + LLFile::close(filep); + return true; + } + char buffer[LOG_RECALL_SIZE]; + + fseek(filep, 0, SEEK_END); // seek to end of file + S32 bytes_to_read = ftell(filep); // get current file pointer + fseek(filep, 0, SEEK_SET); // seek back to beginning of file + + // limit the number characters to read from file + if (bytes_to_read >= LOG_RECALL_SIZE) + { + bytes_to_read = LOG_RECALL_SIZE - 1; } + + if (bytes_to_read > 0 && NULL != fgets(buffer, bytes_to_read, filep)) + { + //matching a timestamp + boost::match_results<std::string::const_iterator> matches; + if (boost::regex_match(std::string(buffer), matches, TIMESTAMP)) + { + result = true; + } + } + LLFile::close(filep); } - return false; + return result; } //*TODO mark object's names in a special way so that they will be distinguishable form avatar name @@ -1012,8 +977,8 @@ void LLDeleteHistoryThread::run() LLActionThread::LLActionThread(const std::string& name) : LLThread(name), - mMutex(NULL), - mRunCondition(NULL), + mMutex(), + mRunCondition(), mFinished(false) { } diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h index 6022e539a93ccdcb6c104a209d832e2a2d1550df..fcbd38a044627099f0297306064bcc8563f29b07 100644 --- a/indra/newview/lllogchat.h +++ b/indra/newview/lllogchat.h @@ -121,6 +121,7 @@ class LLLogChat static bool isTranscriptExist(const LLUUID& avatar_id, bool is_group=false); static bool isNearbyTranscriptExist(); static bool isAdHocTranscriptExist(std::string file_name); + static bool isTranscriptFileFound(std::string fullname); static bool historyThreadsFinished(LLUUID session_id); static LLLoadHistoryThread* getLoadHistoryThread(LLUUID session_id); diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index df040d8f13afe7d687624d4bd2579fe5ab2b4cd1..8a69acb8dcaeed94c5fe7e31b43028a73935890a 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -63,6 +63,9 @@ #include <sstream> const S32 LOGIN_MAX_RETRIES = 3; +const F32 LOGIN_SRV_TIMEOUT_MIN = 10; +const F32 LOGIN_SRV_TIMEOUT_MAX = 120; +const F32 LOGIN_DNS_TIMEOUT_FACTOR = 0.9; // make DNS wait shorter then retry time class LLLoginInstance::Disposable { public: @@ -237,8 +240,10 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia // Specify desired timeout/retry options LLSD http_params; - http_params["timeout"] = gSavedSettings.getF32("LoginSRVTimeout"); + F32 srv_timeout = llclamp(gSavedSettings.getF32("LoginSRVTimeout"), LOGIN_SRV_TIMEOUT_MIN, LOGIN_SRV_TIMEOUT_MAX); + http_params["timeout"] = srv_timeout; http_params["retries"] = LOGIN_MAX_RETRIES; + http_params["DNSCacheTimeout"] = srv_timeout * LOGIN_DNS_TIMEOUT_FACTOR; //Default: indefinite mRequestData.clear(); mRequestData["method"] = "login_to_simulator"; diff --git a/indra/newview/llmachineid.cpp b/indra/newview/llmachineid.cpp index b0ee8e7fcb628e26cac3eef2e550f19ec52fb81c..51127928d1271e9125fb4bb2b829991cb0bc2b5c 100644 --- a/indra/newview/llmachineid.cpp +++ b/indra/newview/llmachineid.cpp @@ -65,11 +65,11 @@ class LLComInitialize S32 LLMachineID::init() { - memset(static_unique_id,0,sizeof(static_unique_id)); + size_t len = sizeof(static_unique_id); + memset(static_unique_id, 0, len); S32 ret_code = 0; #if LL_WINDOWS # pragma comment(lib, "wbemuuid.lib") - size_t len = sizeof(static_unique_id); // algorithm to detect BIOS serial number found at: // http://msdn.microsoft.com/en-us/library/aa394077%28VS.85%29.aspx @@ -217,17 +217,27 @@ S32 LLMachineID::init() // Get the value of the Name property hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0); + if (FAILED(hr)) + { + LL_WARNS() << "Failed to get SerialNumber. Error code = 0x" << hex << hres << LL_ENDL; + pclsObj->Release(); + pclsObj = NULL; + continue; + } LL_INFOS("AppInit") << " Serial Number : " << vtProp.bstrVal << LL_ENDL; + // use characters in the returned Serial Number to create a byte array of size len BSTR serialNumber ( vtProp.bstrVal); + unsigned int serial_size = SysStringLen(serialNumber); unsigned int j = 0; - while( vtProp.bstrVal[j] != 0) + + while (j < serial_size && vtProp.bstrVal[j] != 0) { for (unsigned int i = 0; i < len; i++) { - if (vtProp.bstrVal[j] == 0) + if (j >= serial_size || vtProp.bstrVal[j] == 0) break; - + static_unique_id[i] = (unsigned int)(static_unique_id[i] + serialNumber[j]); j++; } @@ -254,16 +264,8 @@ S32 LLMachineID::init() ret_code = LLUUID::getNodeID(staticPtr); #endif has_static_unique_id = true; - return ret_code; -} - -S32 LLMachineID::getUniqueID(unsigned char *unique_id, size_t len) -{ - if (has_static_unique_id) - { - memcpy ( unique_id, &static_unique_id, len); - LL_INFOS_ONCE("AppInit") << "UniqueID: 0x"; + LL_INFOS("AppInit") << "UniqueID: 0x"; // Code between here and LL_ENDL is not executed unless the LL_DEBUGS // actually produces output for (size_t i = 0; i < len; ++i) @@ -271,11 +273,21 @@ S32 LLMachineID::getUniqueID(unsigned char *unique_id, size_t len) // Copy each char to unsigned int to hexify. Sending an unsigned // char to a std::ostream tries to represent it as a char, not // what we want here. - unsigned byte = unique_id[i]; + unsigned byte = static_unique_id[i]; LL_CONT << std::hex << std::setw(2) << std::setfill('0') << byte; } // Reset default output formatting to avoid nasty surprises! LL_CONT << std::dec << std::setw(0) << std::setfill(' ') << LL_ENDL; + + return ret_code; +} + + +S32 LLMachineID::getUniqueID(unsigned char *unique_id, size_t len) +{ + if (has_static_unique_id) + { + memcpy ( unique_id, &static_unique_id, len); return 1; } return 0; diff --git a/indra/newview/llmainlooprepeater.cpp b/indra/newview/llmainlooprepeater.cpp index db8d2e4edeaba9ac979d2931bf419f0b4674d8bc..6736e9a950d500d7d71aa119997e78d01a1e8bc3 100644 --- a/indra/newview/llmainlooprepeater.cpp +++ b/indra/newview/llmainlooprepeater.cpp @@ -46,7 +46,7 @@ void LLMainLoopRepeater::start(void) { if(mQueue != 0) return; - mQueue = new LLThreadSafeQueue<LLSD>(gAPRPoolp, 1024); + mQueue = new LLThreadSafeQueue<LLSD>(1024); mMainLoopConnection = LLEventPumps::instance(). obtain("mainloop").listen(LLEventPump::inventName(), boost::bind(&LLMainLoopRepeater::onMainLoop, this, _1)); mRepeaterConnection = LLEventPumps::instance(). diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp index 8567180dd618026ec5c0d81f48101a9fb1d7fbb7..6589aa477ff45971a8b1d2835d35d83d060a8c10 100644 --- a/indra/newview/llmanip.cpp +++ b/indra/newview/llmanip.cpp @@ -431,7 +431,6 @@ void LLManip::renderXYZ(const LLVector3 &vec) { const S32 PAD = 10; std::string feedback_string; - LLVector3 camera_pos = LLViewerCamera::getInstance()->getOrigin() + LLViewerCamera::getInstance()->getAtAxis(); S32 window_center_x = gViewerWindow->getWorldViewRectScaled().getWidth() / 2; S32 window_center_y = gViewerWindow->getWorldViewRectScaled().getHeight() / 2; S32 vertical_offset = window_center_y - VERTICAL_OFFSET; @@ -442,46 +441,55 @@ void LLManip::renderXYZ(const LLVector3 &vec) LLUIImagePtr imagep = LLUI::getUIImage("Rounded_Square"); gViewerWindow->setup2DRender(); const LLVector2& display_scale = gViewerWindow->getDisplayScale(); - gGL.scalef(display_scale.mV[VX], display_scale.mV[VY], 1.f); gGL.color4f(0.f, 0.f, 0.f, 0.7f); imagep->draw( - window_center_x - 115, - window_center_y + vertical_offset - PAD, - 235, - PAD * 2 + 10, + (window_center_x - 115) * display_scale.mV[VX], + (window_center_y + vertical_offset - PAD) * display_scale.mV[VY], + 235 * display_scale.mV[VX], + (PAD * 2 + 10) * display_scale.mV[VY], LLColor4(0.f, 0.f, 0.f, 0.7f) ); - } - gGL.popMatrix(); - - gViewerWindow->setup3DRender(); - { - LLFontGL* font = LLFontGL::getFontSansSerif(); - LLLocale locale(LLLocale::USER_LOCALE); - LLGLDepthTest gls_depth(GL_FALSE); - // render drop shadowed text - feedback_string = llformat("X: %.3f", vec.mV[VX]); - hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -102.f + 1.f, (F32)vertical_offset - 1.f, LLColor4::black, FALSE); - - feedback_string = llformat("Y: %.3f", vec.mV[VY]); - hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -27.f + 1.f, (F32)vertical_offset - 1.f, LLColor4::black, FALSE); - - feedback_string = llformat("Z: %.3f", vec.mV[VZ]); - hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, 48.f + 1.f, (F32)vertical_offset - 1.f, LLColor4::black, FALSE); - - // render text on top - feedback_string = llformat("X: %.3f", vec.mV[VX]); - hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -102.f, (F32)vertical_offset, LLColor4(1.f, 0.5f, 0.5f, 1.f), FALSE); - - gGL.diffuseColor3f(0.5f, 1.f, 0.5f); - feedback_string = llformat("Y: %.3f", vec.mV[VY]); - hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -27.f, (F32)vertical_offset, LLColor4(0.5f, 1.f, 0.5f, 1.f), FALSE); - - gGL.diffuseColor3f(0.5f, 0.5f, 1.f); - feedback_string = llformat("Z: %.3f", vec.mV[VZ]); - hud_render_text(utf8str_to_wstring(feedback_string), camera_pos, *font, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, 48.f, (F32)vertical_offset, LLColor4(0.5f, 0.5f, 1.f, 1.f), FALSE); - } + LLFontGL* font = LLFontGL::getFontSansSerif(); + LLLocale locale(LLLocale::USER_LOCALE); + LLGLDepthTest gls_depth(GL_FALSE); + + // render drop shadowed text (manually because of bigger 'distance') + F32 right_x; + feedback_string = llformat("X: %.3f", vec.mV[VX]); + font->render(utf8str_to_wstring(feedback_string), 0, window_center_x - 102.f + 1.f, window_center_y + vertical_offset - 2.f, LLColor4::black, + LLFontGL::LEFT, LLFontGL::BASELINE, + LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x); + + feedback_string = llformat("Y: %.3f", vec.mV[VY]); + font->render(utf8str_to_wstring(feedback_string), 0, window_center_x - 27.f + 1.f, window_center_y + vertical_offset - 2.f, LLColor4::black, + LLFontGL::LEFT, LLFontGL::BASELINE, + LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x); + + feedback_string = llformat("Z: %.3f", vec.mV[VZ]); + font->render(utf8str_to_wstring(feedback_string), 0, window_center_x + 48.f + 1.f, window_center_y + vertical_offset - 2.f, LLColor4::black, + LLFontGL::LEFT, LLFontGL::BASELINE, + LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x); + + // render text on top + feedback_string = llformat("X: %.3f", vec.mV[VX]); + font->render(utf8str_to_wstring(feedback_string), 0, window_center_x - 102.f, window_center_y + vertical_offset, LLColor4(1.f, 0.5f, 0.5f, 1.f), + LLFontGL::LEFT, LLFontGL::BASELINE, + LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x); + + feedback_string = llformat("Y: %.3f", vec.mV[VY]); + font->render(utf8str_to_wstring(feedback_string), 0, window_center_x - 27.f, window_center_y + vertical_offset, LLColor4(0.5f, 1.f, 0.5f, 1.f), + LLFontGL::LEFT, LLFontGL::BASELINE, + LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x); + + feedback_string = llformat("Z: %.3f", vec.mV[VZ]); + font->render(utf8str_to_wstring(feedback_string), 0, window_center_x + 48.f, window_center_y + vertical_offset, LLColor4(0.5f, 0.5f, 1.f, 1.f), + LLFontGL::LEFT, LLFontGL::BASELINE, + LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, 1000, &right_x); + } + gGL.popMatrix(); + + gViewerWindow->setup3DRender(); } void LLManip::renderTickText(const LLVector3& pos, const std::string& text, const LLColor4 &color) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index e38bd8846d2647c25133f597604641bc90104159..38fd2d777ebacecb8e3fbe9469218dc9a7501153 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -26,10 +26,11 @@ #include "llviewerprecompiledheaders.h" +#include "llapr.h" +#include "apr_portable.h" #include "apr_pools.h" #include "apr_dso.h" #include "llhttpconstants.h" -#include "llapr.h" #include "llmeshrepository.h" #include "llagent.h" @@ -830,9 +831,9 @@ LLMeshRepoThread::LLMeshRepoThread() { LLAppCoreHttp & app_core_http(LLAppViewer::instance()->getAppCoreHttp()); - mMutex = new LLMutex(NULL); - mHeaderMutex = new LLMutex(NULL); - mSignal = new LLCondition(NULL); + mMutex = new LLMutex(); + mHeaderMutex = new LLMutex(); + mSignal = new LLCondition(); mHttpRequest = new LLCore::HttpRequest; mHttpOptions = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions); mHttpOptions->setTransferTimeout(SMALL_MESH_XFER_TIMEOUT); @@ -1822,7 +1823,22 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat return false; } - header_size += stream.tellg(); + if (!header.isMap()) + { + LL_WARNS(LOG_MESH) << "Mesh header is invalid for ID: " << mesh_id << LL_ENDL; + return false; + } + + if (header.has("version") && header["version"].asInteger() > MAX_MESH_VERSION) + { + LL_INFOS(LOG_MESH) << "Wrong version in header for " << mesh_id << LL_ENDL; + header["404"] = 1; + } + // make sure there is at least one lod, function returns -1 and marks as 404 otherwise + else if (LLMeshRepository::getActualMeshLOD(header, 0) >= 0) + { + header_size += stream.tellg(); + } } else { @@ -2039,7 +2055,7 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, mUploadSkin = upload_skin; mUploadJoints = upload_joints; mLockScaleIfJointPosition = lock_scale_if_joint_position; - mMutex = new LLMutex(NULL); + mMutex = new LLMutex(); mPendingUploads = 0; mFinished = false; mOrigin = gAgent.getPositionAgent(); @@ -2174,7 +2190,6 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures) std::map<LLModel*,S32> mesh_index; std::string model_name; - std::string model_metric; S32 instance_num = 0; @@ -2204,11 +2219,6 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures) model_name = data.mBaseModel->getName(); } - if (model_metric.empty()) - { - model_metric = data.mBaseModel->getMetric(); - } - std::stringstream ostr; LLModel::Decomposition& decomp = @@ -2363,11 +2373,6 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures) model_name = data.mBaseModel->getName(); } - if (model_metric.empty()) - { - model_metric = data.mBaseModel->getMetric(); - } - std::stringstream ostr; LLModel::Decomposition& decomp = @@ -2498,8 +2503,7 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures) if (model_name.empty()) model_name = "mesh model"; result["name"] = model_name; - if (model_metric.empty()) model_metric = "MUT_Unspecified"; - res["metric"] = model_metric; + res["metric"] = "MUT_Unspecified"; result["asset_resources"] = res; dump_llsd_to_file(result,make_dump_name("whole_model_",dump_num)); @@ -2919,9 +2923,14 @@ S32 LLMeshRepository::getActualMeshLOD(LLSD& header, S32 lod) { lod = llclamp(lod, 0, 3); + if (header.has("404")) + { + return -1; + } + S32 version = header["version"]; - if (header.has("404") || version > MAX_MESH_VERSION) + if (version > MAX_MESH_VERSION) { return -1; } @@ -3168,8 +3177,7 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b if (header_bytes > 0 && !header.has("404") - && header.has("version") - && header["version"].asInteger() <= MAX_MESH_VERSION) + && (!header.has("version") || header["version"].asInteger() <= MAX_MESH_VERSION)) { std::stringstream str; @@ -3458,7 +3466,7 @@ LLMeshRepository::LLMeshRepository() void LLMeshRepository::init() { - mMeshMutex = new LLMutex(NULL); + mMeshMutex = new LLMutex(); LLConvexDecomposition::getInstance()->initSystem(); @@ -4302,10 +4310,13 @@ F32 LLMeshRepository::getStreamingCostLegacy(LLSD& header, F32 radius, S32* byte F32 dlow = llmin(radius/0.06f, max_distance); F32 dmid = llmin(radius/0.24f, max_distance); - F32 METADATA_DISCOUNT = (F32) gSavedSettings.getU32("MeshMetaDataDiscount"); //discount 128 bytes to cover the cost of LLSD tags and compression domain overhead - F32 MINIMUM_SIZE = (F32) gSavedSettings.getU32("MeshMinimumByteSize"); //make sure nothing is "free" + static LLCachedControl<U32> metadata_discount_ch(gSavedSettings, "MeshMetaDataDiscount", 384); //discount 128 bytes to cover the cost of LLSD tags and compression domain overhead + static LLCachedControl<U32> minimum_size_ch(gSavedSettings, "MeshMinimumByteSize", 16); //make sure nothing is "free" + static LLCachedControl<U32> bytes_per_triangle_ch(gSavedSettings, "MeshBytesPerTriangle", 16); - F32 bytes_per_triangle = (F32) gSavedSettings.getU32("MeshBytesPerTriangle"); + F32 metadata_discount = (F32)metadata_discount_ch; + F32 minimum_size = (F32)minimum_size_ch; + F32 bytes_per_triangle = (F32)bytes_per_triangle_ch; S32 bytes_lowest = header["lowest_lod"]["size"].asInteger(); S32 bytes_low = header["low_lod"]["size"].asInteger(); @@ -4332,10 +4343,10 @@ F32 LLMeshRepository::getStreamingCostLegacy(LLSD& header, F32 radius, S32* byte bytes_lowest = bytes_low; } - F32 triangles_lowest = llmax((F32) bytes_lowest-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle; - F32 triangles_low = llmax((F32) bytes_low-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle; - F32 triangles_mid = llmax((F32) bytes_mid-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle; - F32 triangles_high = llmax((F32) bytes_high-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle; + F32 triangles_lowest = llmax((F32) bytes_lowest-metadata_discount, minimum_size)/bytes_per_triangle; + F32 triangles_low = llmax((F32) bytes_low-metadata_discount, minimum_size)/bytes_per_triangle; + F32 triangles_mid = llmax((F32) bytes_mid-metadata_discount, minimum_size)/bytes_per_triangle; + F32 triangles_high = llmax((F32) bytes_high-metadata_discount, minimum_size)/bytes_per_triangle; if (bytes) { @@ -4429,13 +4440,13 @@ bool LLMeshCostData::init(const LLSD& header) mSizeByLOD[2] = bytes_med; mSizeByLOD[3] = bytes_high; - F32 METADATA_DISCOUNT = (F32) gSavedSettings.getU32("MeshMetaDataDiscount"); //discount 128 bytes to cover the cost of LLSD tags and compression domain overhead - F32 MINIMUM_SIZE = (F32) gSavedSettings.getU32("MeshMinimumByteSize"); //make sure nothing is "free" - F32 bytes_per_triangle = (F32) gSavedSettings.getU32("MeshBytesPerTriangle"); + static LLCachedControl<U32> metadata_discount(gSavedSettings, "MeshMetaDataDiscount", 384); //discount 128 bytes to cover the cost of LLSD tags and compression domain overhead + static LLCachedControl<U32> minimum_size(gSavedSettings, "MeshMinimumByteSize", 16); //make sure nothing is "free" + static LLCachedControl<U32> bytes_per_triangle(gSavedSettings, "MeshBytesPerTriangle", 16); for (S32 i=0; i<4; i++) { - mEstTrisByLOD[i] = llmax((F32) mSizeByLOD[i]-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle; + mEstTrisByLOD[i] = llmax((F32)mSizeByLOD[i] - (F32)metadata_discount, (F32)minimum_size) / (F32)bytes_per_triangle; } return true; @@ -4597,8 +4608,8 @@ LLPhysicsDecomp::LLPhysicsDecomp() mQuitting = false; mDone = false; - mSignal = new LLCondition(NULL); - mMutex = new LLMutex(NULL); + mSignal = new LLCondition(); + mMutex = new LLMutex(); } LLPhysicsDecomp::~LLPhysicsDecomp() diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index 301487b99464bffe75e2d4095fb5298bf292ba89..19f238d99a67aa3a717d927a1a0b50bae12ecd5c 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -702,11 +702,9 @@ void LLPanelStandStopFlying::updatePosition() { if (mAttached) return; - S32 y_pos = 0; S32 bottom_tb_center = 0; if (LLToolBar* toolbar_bottom = gToolBarView->getToolbar(LLToolBarEnums::TOOLBAR_BOTTOM)) { - y_pos = toolbar_bottom->getRect().getHeight(); bottom_tb_center = toolbar_bottom->getRect().getCenterX(); } @@ -716,20 +714,6 @@ void LLPanelStandStopFlying::updatePosition() left_tb_width = toolbar_left->getRect().getWidth(); } - if (!mStateManagementButtons.get()) // Obsolete?!! - { - LLPanel* panel_ssf_container = gToolBarView->getChild<LLPanel>("state_management_buttons_container"); - if (panel_ssf_container) - { - mStateManagementButtons = panel_ssf_container->getHandle(); - } - } - - if(LLPanel* panel_ssf_container = mStateManagementButtons.get()) - { - panel_ssf_container->setOrigin(0, y_pos); - } - if (gToolBarView != NULL && gToolBarView->getToolbar(LLToolBarEnums::TOOLBAR_LEFT)->hasButtons()) { S32 x_pos = bottom_tb_center - getRect().getWidth() / 2 - left_tb_width; diff --git a/indra/newview/llmoveview.h b/indra/newview/llmoveview.h index 4a31f2a8148d018affc43f6918e7e52933781086..e8b9a6fdb20fe94b8b9f0c8fdea7e7d28089b047 100644 --- a/indra/newview/llmoveview.h +++ b/indra/newview/llmoveview.h @@ -172,8 +172,6 @@ class LLPanelStandStopFlying : public LLPanel */ LLHandle<LLPanel> mOriginalParent; - LLHandle<LLPanel> mStateManagementButtons; - /** * True if the panel is currently attached to the movement controls floater. * diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index fe75ab8e5094d11b1f253f4b2d2481436ae2944b..d7c5364fba0e27ca162b2f542719e02e72ac5f10 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -32,7 +32,9 @@ #include "llavatarnamecache.h" #include "llcachename.h" +#include "llfloater.h" #include "llfloaterreg.h" +#include "llfloatersnapshot.h" // gSnapshotFloaterView #include "llinventory.h" #include "llscrolllistitem.h" #include "llscrolllistcell.h" @@ -212,7 +214,10 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask) BOOL handled = FALSE; S32 column_index = getColumnIndexFromOffset(x); LLNameListItem* hit_item = dynamic_cast<LLNameListItem*>(hitItem(x, y)); - if (hit_item + LLFloater* floater = gFloaterView->getParentFloater(this); + if (floater + && floater->isFrontmost() + && hit_item && column_index == mNameColumnIndex) { // ...this is the column with the avatar name @@ -232,24 +237,30 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask) // Spawn at right side of cell LLPointer<LLUIImage> icon = LLUI::getUIImage("Info_Small"); - LLCoordGL pos( sticky_rect.mRight - info_icon_size, sticky_rect.mTop - (sticky_rect.getHeight() - icon->getHeight())/2 ); - - // Should we show a group or an avatar inspector? - bool is_group = hit_item->isGroup(); - bool is_experience = hit_item->isExperience(); - - LLToolTip::Params params; - params.background_visible( false ); - params.click_callback( boost::bind(&LLNameListCtrl::showInspector, this, avatar_id, is_group, is_experience) ); - params.delay_time(0.0f); // spawn instantly on hover - params.image( icon ); - params.message(""); - params.padding(0); - params.pos(pos); - params.sticky_rect(sticky_rect); - - LLToolTipMgr::getInstance()->show(params); - handled = TRUE; + S32 screenX = sticky_rect.mRight - info_icon_size; + S32 screenY = sticky_rect.mTop - (sticky_rect.getHeight() - icon->getHeight()) / 2; + LLCoordGL pos(screenX, screenY); + + LLFloater* snapshot_floatr = gSnapshotFloaterView->getFrontmostClosableFloater(); + if (!snapshot_floatr || !snapshot_floatr->getRect().pointInRect(screenX + icon->getWidth(), screenY)) + { + // Should we show a group or an avatar inspector? + bool is_group = hit_item->isGroup(); + bool is_experience = hit_item->isExperience(); + + LLToolTip::Params params; + params.background_visible(false); + params.click_callback(boost::bind(&LLNameListCtrl::showInspector, this, avatar_id, is_group, is_experience)); + params.delay_time(0.0f); // spawn instantly on hover + params.image(icon); + params.message(""); + params.padding(0); + params.pos(pos); + params.sticky_rect(sticky_rect); + + LLToolTipMgr::getInstance()->show(params); + handled = TRUE; + } } } } @@ -313,8 +324,19 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow( switch(name_item.target) { case GROUP: - gCacheName->getGroupName(id, fullname); - // fullname will be "nobody" if group not found + if (!gCacheName->getGroupName(id, fullname)) + { + avatar_name_cache_connection_map_t::iterator it = mGroupNameCacheConnections.find(id); + if (it != mGroupNameCacheConnections.end()) + { + if (it->second.connected()) + { + it->second.disconnect(); + } + mGroupNameCacheConnections.erase(it); + } + mGroupNameCacheConnections[id] = gCacheName->getGroup(id, boost::bind(&LLNameListCtrl::onGroupNameCache, this, _1, _2, item->getHandle())); + } break; case SPECIAL: // just use supplied name @@ -415,6 +437,20 @@ void LLNameListCtrl::removeNameItem(const LLUUID& agent_id) } } +// public +LLScrollListItem* LLNameListCtrl::getNameItemByAgentId(const LLUUID& agent_id) +{ + for (item_list::iterator it = getItemList().begin(); it != getItemList().end(); it++) + { + LLScrollListItem* item = *it; + if (item && item->getUUID() == agent_id) + { + return item; + } + } + return NULL; +} + void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, std::string suffix, @@ -479,6 +515,31 @@ void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id, dirtyColumns(); } +void LLNameListCtrl::onGroupNameCache(const LLUUID& group_id, const std::string name, LLHandle<LLNameListItem> item) +{ + avatar_name_cache_connection_map_t::iterator it = mGroupNameCacheConnections.find(group_id); + if (it != mGroupNameCacheConnections.end()) + { + if (it->second.connected()) + { + it->second.disconnect(); + } + mGroupNameCacheConnections.erase(it); + } + + LLNameListItem* list_item = item.get(); + if (list_item && list_item->getUUID() == group_id) + { + LLScrollListCell* cell = list_item->getColumn(mNameColumnIndex); + if (cell) + { + cell->setValue(name); + setNeedsSort(); + } + } + + dirtyColumns(); +} void LLNameListCtrl::updateColumns(bool force_update) { diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h index 677b49e66764bb163e2703a41033520720798527..ef0be135e618e1c2b9473553700332eead2ef1d7 100644 --- a/indra/newview/llnamelistctrl.h +++ b/indra/newview/llnamelistctrl.h @@ -154,6 +154,8 @@ class LLNameListCtrl void removeNameItem(const LLUUID& agent_id); + LLScrollListItem* getNameItemByAgentId(const LLUUID& agent_id); + // LLView interface /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, @@ -171,6 +173,7 @@ class LLNameListCtrl private: void showInspector(const LLUUID& avatar_id, bool is_group, bool is_experience = false); void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name, std::string suffix, std::string prefix, LLHandle<LLNameListItem> item); + void onGroupNameCache(const LLUUID& group_id, const std::string name, LLHandle<LLNameListItem> item); private: S32 mNameColumnIndex; @@ -179,6 +182,7 @@ class LLNameListCtrl bool mShortNames; // display name only, no SLID typedef std::map<LLUUID, boost::signals2::connection> avatar_name_cache_connection_map_t; avatar_name_cache_connection_map_t mAvatarNameCacheConnections; + avatar_name_cache_connection_map_t mGroupNameCacheConnections; S32 mPendingLookupsRemaining; namelist_complete_signal_t mNameListCompleteSignal; diff --git a/indra/newview/llnotificationlistitem.cpp b/indra/newview/llnotificationlistitem.cpp index a5bc75e6bd51dfb4608249f3a6bbcdcee54d6a06..b405d3dca24ef96598dd8c2c0173a2f05dc2824a 100644 --- a/indra/newview/llnotificationlistitem.cpp +++ b/indra/newview/llnotificationlistitem.cpp @@ -135,7 +135,8 @@ std::string LLNotificationListItem::buildNotificationDate(const LLDate& time_sta +LLTrans::getString("TimeDay")+"]/[" +LLTrans::getString("TimeYear")+"] [" +LLTrans::getString("TimeHour")+"]:[" - +LLTrans::getString("TimeMin")+"]"; + +LLTrans::getString("TimeMin")+"] [" + +LLTrans::getString("TimeTimezone")+"]"; break; } LLSD substitution; @@ -376,13 +377,13 @@ BOOL LLGroupNoticeNotificationListItem::postBuild() mTitleBoxExp->setValue(mParams.subject); mNoticeTextExp->setValue(mParams.message); - mTimeBox->setValue(buildNotificationDate(mParams.time_stamp, UTC)); - mTimeBoxExp->setValue(buildNotificationDate(mParams.time_stamp, UTC)); + mTimeBox->setValue(buildNotificationDate(mParams.time_stamp)); + mTimeBoxExp->setValue(buildNotificationDate(mParams.time_stamp)); //Workaround: in case server timestamp is 0 - we use the time when notification was actually received if (mParams.time_stamp.isNull()) { - mTimeBox->setValue(buildNotificationDate(mParams.received_time, UTC)); - mTimeBoxExp->setValue(buildNotificationDate(mParams.received_time, UTC)); + mTimeBox->setValue(buildNotificationDate(mParams.received_time)); + mTimeBoxExp->setValue(buildNotificationDate(mParams.received_time)); } setSender(mParams.sender); diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp index fef0631fa6c3b8de4860be354b0a24dfb9cd645b..ba831ab2ed3cf9995e6222a1ed88bb202cf45cf2 100644 --- a/indra/newview/llnotificationscripthandler.cpp +++ b/indra/newview/llnotificationscripthandler.cpp @@ -35,7 +35,6 @@ #include "llnotificationmanager.h" #include "llnotifications.h" #include "llscriptfloater.h" -#include "llfacebookconnect.h" #include "llavatarname.h" #include "llavatarnamecache.h" diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 892fa385d7c5e44a12a45999b7ba5996f0fa3de5..f2a284a5618406c8584d9706b1863c93e3a48115 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -621,8 +621,14 @@ void LLOutfitsList::applyFilterToTab( bool LLOutfitsList::canWearSelected() { + if (!isAgentAvatarValid()) + { + return false; + } + uuid_vec_t selected_items; getSelectedItemsUUIDs(selected_items); + S32 nonreplacable_objects = 0; for (uuid_vec_t::const_iterator it = selected_items.begin(); it != selected_items.end(); ++it) { @@ -633,10 +639,21 @@ bool LLOutfitsList::canWearSelected() { return false; } + + const LLViewerInventoryItem* item = gInventory.getItem(id); + if (!item) + { + return false; + } + + if (item->getType() == LLAssetType::AT_OBJECT) + { + nonreplacable_objects++; + } } - // All selected items can be worn. - return true; + // All selected items can be worn. But do we have enough space for them? + return nonreplacable_objects == 0 || gAgentAvatarp->canAttachMoreObjects(nonreplacable_objects); } void LLOutfitsList::wearSelectedItems() diff --git a/indra/newview/lloutputmonitorctrl.cpp b/indra/newview/lloutputmonitorctrl.cpp index 6c26073d5baa7283fbdcb505fa145e4dd2494341..7f6c065bb9f8b3ba62d16d8e9a21b2d9e4e7fd0c 100644 --- a/indra/newview/lloutputmonitorctrl.cpp +++ b/indra/newview/lloutputmonitorctrl.cpp @@ -72,9 +72,11 @@ LLOutputMonitorCtrl::LLOutputMonitorCtrl(const LLOutputMonitorCtrl::Params& p) mImageLevel3(p.image_level_3), mAutoUpdate(p.auto_update), mSpeakerId(p.speaker_id), + mIsModeratorMuted(false), mIsAgentControl(false), mIndicatorToggled(false), - mShowParticipantsSpeaking(false) + mShowParticipantsSpeaking(false), + mChannelState(INACTIVE_CHANNEL) { //static LLUIColor output_monitor_muted_color = LLUIColorTable::instance().getColor("OutputMonitorMutedColor", LLColor4::orange); //static LLUIColor output_monitor_overdriven_color = LLUIColorTable::instance().getColor("OutputMonitorOverdrivenColor", LLColor4::red); @@ -124,7 +126,7 @@ void LLOutputMonitorCtrl::draw() const F32 LEVEL_1 = LLVoiceClient::OVERDRIVEN_POWER_LEVEL * 2.f / 3.f; const F32 LEVEL_2 = LLVoiceClient::OVERDRIVEN_POWER_LEVEL; - if (getVisible() && mAutoUpdate && !mIsMuted && mSpeakerId.notNull()) + if (getVisible() && mAutoUpdate && !getIsMuted() && mSpeakerId.notNull()) { setPower(LLVoiceClient::getInstance()->getCurrentPower(mSpeakerId)); if(mIsAgentControl) @@ -156,7 +158,7 @@ void LLOutputMonitorCtrl::draw() } LLPointer<LLUIImage> icon; - if (mIsMuted) + if (getIsMuted()) { icon = mImageMute; } @@ -255,6 +257,21 @@ BOOL LLOutputMonitorCtrl::handleMouseUp(S32 x, S32 y, MASK mask) return TRUE; } +void LLOutputMonitorCtrl::setIsActiveChannel(bool val) +{ + setChannelState(val ? ACTIVE_CHANNEL : INACTIVE_CHANNEL); +} + +void LLOutputMonitorCtrl::setChannelState(EChannelState state) +{ + mChannelState = state; + if (state == INACTIVE_CHANNEL) + { + // switchIndicator will set it to TRUE when channel becomes active + setVisible(FALSE); + } +} + void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id, const LLUUID& session_id/* = LLUUID::null*/, bool show_other_participants_speaking /* = false */) { if (speaker_id.isNull() && mSpeakerId.notNull()) @@ -304,8 +321,7 @@ void LLOutputMonitorCtrl::onChange() // virtual void LLOutputMonitorCtrl::switchIndicator(bool switch_on) { - - if(getVisible() != (BOOL)switch_on) + if ((mChannelState != INACTIVE_CHANNEL) && (getVisible() != (BOOL)switch_on)) { setVisible(switch_on); diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h index 0682af1278c95dda4fde4c44b32255d2f982893f..98966d39ee00fba411b5d8e666981fb0d4d79edc 100644 --- a/indra/newview/lloutputmonitorctrl.h +++ b/indra/newview/lloutputmonitorctrl.h @@ -72,13 +72,26 @@ class LLOutputMonitorCtrl void setPower(F32 val); F32 getPower(F32 val) const { return mPower; } - + + bool getIsMuted() const { return (mIsMuted || mIsModeratorMuted); } + void setIsModeratorMuted(bool val) { mIsModeratorMuted = val; } + // For the current user, need to know the PTT state to show // correct button image. void setIsAgentControl(bool val) { mIsAgentControl = val; } - void setIsTalking(bool val) { mIsTalking = val; } + enum EChannelState + { + ACTIVE_CHANNEL, + INACTIVE_CHANNEL, + UNDEFINED_CHANNEL + }; + + // switchIndicator controls visibility, 'active channel' governs if we are allowed to show indicator + void setIsActiveChannel(bool val); + void setChannelState(EChannelState state); + void setShowParticipantsSpeaking(bool show) { mShowParticipantsSpeaking = show; } /** @@ -131,6 +144,7 @@ class LLOutputMonitorCtrl F32 mPower; bool mIsAgentControl; + bool mIsModeratorMuted; bool mIsMuted; bool mIsTalking; bool mShowParticipantsSpeaking; @@ -148,6 +162,8 @@ class LLOutputMonitorCtrl LLUUID mSpeakerId; bool mIndicatorToggled; + + EChannelState mChannelState; }; #endif diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index b9b97f4cce68d230fd8e27879649ab549508daed..6d0c30fbf336917ddb1630503979178e3ff26464 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -628,12 +628,9 @@ BOOL LLPanelClassifiedEdit::postBuild() { LLPanelClassifiedInfo::postBuild(); - LLTextureCtrl* snapshot = getChild<LLTextureCtrl>("classified_snapshot"); - snapshot->setOnSelectCallback(boost::bind(&LLPanelClassifiedEdit::onChange, this)); - LLUICtrl* edit_icon = getChild<LLUICtrl>("edit_icon"); - snapshot->setMouseEnterCallback(boost::bind(&LLPanelClassifiedEdit::onTexturePickerMouseEnter, this, edit_icon)); - snapshot->setMouseLeaveCallback(boost::bind(&LLPanelClassifiedEdit::onTexturePickerMouseLeave, this, edit_icon)); + mSnapshotCtrl->setMouseEnterCallback(boost::bind(&LLPanelClassifiedEdit::onTexturePickerMouseEnter, this, edit_icon)); + mSnapshotCtrl->setMouseLeaveCallback(boost::bind(&LLPanelClassifiedEdit::onTexturePickerMouseLeave, this, edit_icon)); edit_icon->setVisible(false); LLLineEditor* line_edit = getChild<LLLineEditor>("classified_name"); @@ -1130,6 +1127,7 @@ void LLPanelClassifiedEdit::onTexturePickerMouseLeave(LLUICtrl* ctrl) void LLPanelClassifiedEdit::onTextureSelected() { setSnapshotId(mSnapshotCtrl->getValue().asUUID()); + onChange(); } ////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index 3a8378f8dfd00dda5bb7cb5069298f22ee842d03..6573be0aafcb4a5f48677acedc6266211778a283 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -97,6 +97,7 @@ enum ESubpart { SUBPART_SKIRT, SUBPART_ALPHA, SUBPART_TATTOO, + SUBPART_UNIVERSAL, SUBPART_PHYSICS_BREASTS_UPDOWN, SUBPART_PHYSICS_BREASTS_INOUT, SUBPART_PHYSICS_BREASTS_LEFTRIGHT, @@ -241,7 +242,8 @@ LLEditWearableDictionary::Wearables::Wearables() addEntry(LLWearableType::WT_SKIRT, new WearableEntry(LLWearableType::WT_SKIRT,"edit_skirt_title","skirt_desc_text", texture_vec_t{TEX_SKIRT}, texture_vec_t{TEX_SKIRT}, subpart_vec_t{SUBPART_SKIRT})); addEntry(LLWearableType::WT_ALPHA, new WearableEntry(LLWearableType::WT_ALPHA,"edit_alpha_title","alpha_desc_text", texture_vec_t(), texture_vec_t{TEX_LOWER_ALPHA, TEX_UPPER_ALPHA, TEX_HEAD_ALPHA, TEX_EYES_ALPHA, TEX_HAIR_ALPHA}, subpart_vec_t{SUBPART_ALPHA})); addEntry(LLWearableType::WT_TATTOO, new WearableEntry(LLWearableType::WT_TATTOO,"edit_tattoo_title","tattoo_desc_text", texture_vec_t{TEX_HEAD_TATTOO}, texture_vec_t{TEX_LOWER_TATTOO, TEX_UPPER_TATTOO, TEX_HEAD_TATTOO}, subpart_vec_t{SUBPART_TATTOO})); - addEntry(LLWearableType::WT_PHYSICS, new WearableEntry(LLWearableType::WT_PHYSICS,"edit_physics_title","physics_desc_text", texture_vec_t(), texture_vec_t(), subpart_vec_t{SUBPART_PHYSICS_BREASTS_UPDOWN, SUBPART_PHYSICS_BREASTS_INOUT, SUBPART_PHYSICS_BREASTS_LEFTRIGHT, SUBPART_PHYSICS_BELLY_UPDOWN, SUBPART_PHYSICS_BUTT_UPDOWN, SUBPART_PHYSICS_BUTT_LEFTRIGHT, SUBPART_PHYSICS_ADVANCED})); + addEntry(LLWearableType::WT_UNIVERSAL, new WearableEntry(LLWearableType::WT_UNIVERSAL, "edit_universal_title", "universal_desc_text", texture_vec_t{ TEX_HEAD_UNIVERSAL_TATTOO }, texture_vec_t{ TEX_HEAD_UNIVERSAL_TATTOO, TEX_UPPER_UNIVERSAL_TATTOO, TEX_LOWER_UNIVERSAL_TATTOO, TEX_SKIRT_TATTOO, TEX_HAIR_TATTOO, TEX_EYES_TATTOO, TEX_LEFT_ARM_TATTOO, TEX_LEFT_LEG_TATTOO, TEX_AUX1_TATTOO, TEX_AUX2_TATTOO, TEX_AUX3_TATTOO }, subpart_vec_t{ SUBPART_UNIVERSAL })); + addEntry(LLWearableType::WT_PHYSICS, new WearableEntry(LLWearableType::WT_PHYSICS,"edit_physics_title","physics_desc_text", texture_vec_t(), texture_vec_t(), subpart_vec_t{SUBPART_PHYSICS_BREASTS_UPDOWN, SUBPART_PHYSICS_BREASTS_INOUT, SUBPART_PHYSICS_BREASTS_LEFTRIGHT, SUBPART_PHYSICS_BELLY_UPDOWN, SUBPART_PHYSICS_BUTT_UPDOWN, SUBPART_PHYSICS_BUTT_LEFTRIGHT, SUBPART_PHYSICS_ADVANCED})); } LLEditWearableDictionary::WearableEntry::WearableEntry(LLWearableType::EType type, @@ -294,7 +296,9 @@ LLEditWearableDictionary::Subparts::Subparts() addEntry(SUBPART_UNDERPANTS, new SubpartEntry(SUBPART_UNDERPANTS, "mPelvis", "underpants", "underpants_main_param_list", "underpants_main_tab", LLVector3d(0.f, 0.f, -0.5f), LLVector3d(-1.6f, 0.15f, -0.5f),SEX_BOTH)); addEntry(SUBPART_ALPHA, new SubpartEntry(SUBPART_ALPHA, "mPelvis", "alpha", "alpha_main_param_list", "alpha_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH)); addEntry(SUBPART_TATTOO, new SubpartEntry(SUBPART_TATTOO, "mPelvis", "tattoo", "tattoo_main_param_list", "tattoo_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f),SEX_BOTH)); - addEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, "mTorso", "physics_breasts_updown", "physics_breasts_updown_param_list", "physics_breasts_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE)); + addEntry(SUBPART_UNIVERSAL, new SubpartEntry(SUBPART_UNIVERSAL, "mPelvis", "universal", "universal_main_param_list", "universal_main_tab", LLVector3d(0.f, 0.f, 0.1f), LLVector3d(-2.5f, 0.5f, 0.8f), SEX_BOTH)); + + addEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, "mTorso", "physics_breasts_updown", "physics_breasts_updown_param_list", "physics_breasts_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE)); addEntry(SUBPART_PHYSICS_BREASTS_INOUT, new SubpartEntry(SUBPART_PHYSICS_BREASTS_INOUT, "mTorso", "physics_breasts_inout", "physics_breasts_inout_param_list", "physics_breasts_inout_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE)); addEntry(SUBPART_PHYSICS_BREASTS_LEFTRIGHT, new SubpartEntry(SUBPART_PHYSICS_BREASTS_LEFTRIGHT, "mTorso", "physics_breasts_leftright", "physics_breasts_leftright_param_list", "physics_breasts_leftright_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE)); addEntry(SUBPART_PHYSICS_BELLY_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BELLY_UPDOWN, "mTorso", "physics_belly_updown", "physics_belly_updown_param_list", "physics_belly_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH)); @@ -335,6 +339,7 @@ LLEditWearableDictionary::ColorSwatchCtrls::ColorSwatchCtrls() addEntry ( TEX_UPPER_UNDERSHIRT, new PickerControlEntry (TEX_UPPER_UNDERSHIRT, "Color/Tint" )); addEntry ( TEX_LOWER_UNDERPANTS, new PickerControlEntry (TEX_LOWER_UNDERPANTS, "Color/Tint" )); addEntry ( TEX_HEAD_TATTOO, new PickerControlEntry(TEX_HEAD_TATTOO, "Color/Tint" )); + addEntry (TEX_HEAD_UNIVERSAL_TATTOO, new PickerControlEntry(TEX_HEAD_UNIVERSAL_TATTOO, "Color/Tint")); } LLEditWearableDictionary::TextureCtrls::TextureCtrls() @@ -362,6 +367,17 @@ LLEditWearableDictionary::TextureCtrls::TextureCtrls() addEntry ( TEX_LOWER_TATTOO, new PickerControlEntry (TEX_LOWER_TATTOO, "Lower Tattoo", LLUUID::null, TRUE )); addEntry ( TEX_UPPER_TATTOO, new PickerControlEntry (TEX_UPPER_TATTOO, "Upper Tattoo", LLUUID::null, TRUE )); addEntry ( TEX_HEAD_TATTOO, new PickerControlEntry (TEX_HEAD_TATTOO, "Head Tattoo", LLUUID::null, TRUE )); + addEntry ( TEX_LOWER_UNIVERSAL_TATTOO, new PickerControlEntry( TEX_LOWER_UNIVERSAL_TATTOO, "Lower Universal Tattoo", LLUUID::null, TRUE)); + addEntry ( TEX_UPPER_UNIVERSAL_TATTOO, new PickerControlEntry( TEX_UPPER_UNIVERSAL_TATTOO, "Upper Universal Tattoo", LLUUID::null, TRUE)); + addEntry ( TEX_HEAD_UNIVERSAL_TATTOO, new PickerControlEntry( TEX_HEAD_UNIVERSAL_TATTOO, "Head Universal Tattoo", LLUUID::null, TRUE)); + addEntry ( TEX_SKIRT_TATTOO, new PickerControlEntry(TEX_SKIRT_TATTOO, "Skirt Tattoo", LLUUID::null, TRUE)); + addEntry ( TEX_HAIR_TATTOO, new PickerControlEntry(TEX_HAIR_TATTOO, "Hair Tattoo", LLUUID::null, TRUE)); + addEntry ( TEX_EYES_TATTOO, new PickerControlEntry(TEX_EYES_TATTOO, "Eyes Tattoo", LLUUID::null, TRUE)); + addEntry (TEX_LEFT_ARM_TATTOO, new PickerControlEntry(TEX_LEFT_ARM_TATTOO, "Left Arm Tattoo", LLUUID::null, TRUE)); + addEntry (TEX_LEFT_LEG_TATTOO, new PickerControlEntry(TEX_LEFT_LEG_TATTOO, "Left Leg Tattoo", LLUUID::null, TRUE)); + addEntry (TEX_AUX1_TATTOO, new PickerControlEntry(TEX_AUX1_TATTOO, "Aux1 Tattoo", LLUUID::null, TRUE)); + addEntry (TEX_AUX2_TATTOO, new PickerControlEntry(TEX_AUX2_TATTOO, "Aux2 Tattoo", LLUUID::null, TRUE)); + addEntry (TEX_AUX3_TATTOO, new PickerControlEntry(TEX_AUX3_TATTOO, "Aux3 Tattoo", LLUUID::null, TRUE)); } LLEditWearableDictionary::PickerControlEntry::PickerControlEntry(ETextureIndex tex_index, @@ -739,6 +755,7 @@ BOOL LLPanelEditWearable::postBuild() mPanelSkirt = getChild<LLPanel>("edit_skirt_panel"); mPanelAlpha = getChild<LLPanel>("edit_alpha_panel"); mPanelTattoo = getChild<LLPanel>("edit_tattoo_panel"); + mPanelUniversal = getChild<LLPanel>("edit_universal_panel"); mPanelPhysics = getChild<LLPanel>("edit_physics_panel"); mTxtAvatarHeight = mPanelShape->getChild<LLTextBox>("avatar_height"); @@ -1442,6 +1459,10 @@ LLPanel* LLPanelEditWearable::getPanel(LLWearableType::EType type) case LLWearableType::WT_TATTOO: return mPanelTattoo; break; + + case LLWearableType::WT_UNIVERSAL: + return mPanelUniversal; + break; case LLWearableType::WT_PHYSICS: return mPanelPhysics; diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h index 81acc31863d42b356d1ba8f5942ab47e348baf28..43d6a3595fdc7eaca0e2f6934cf1b771c35b33fe 100644 --- a/indra/newview/llpaneleditwearable.h +++ b/indra/newview/llpaneleditwearable.h @@ -167,6 +167,7 @@ class LLPanelEditWearable : public LLPanel LLPanel *mPanelSkirt; LLPanel *mPanelAlpha; LLPanel *mPanelTattoo; + LLPanel *mPanelUniversal; LLPanel *mPanelPhysics; typedef std::map<std::string, LLAvatarAppearanceDefines::ETextureIndex> string_texture_index_map_t; diff --git a/indra/newview/llpanelexperiencepicker.cpp b/indra/newview/llpanelexperiencepicker.cpp index a7f2dbafa2d56a34ec9221548e225b0be429e727..80aeee6da1687b22a4ea6e3caac701919828b07b 100644 --- a/indra/newview/llpanelexperiencepicker.cpp +++ b/indra/newview/llpanelexperiencepicker.cpp @@ -89,7 +89,7 @@ BOOL LLPanelExperiencePicker::postBuild() childSetAction(BTN_PROFILE, boost::bind(&LLPanelExperiencePicker::onBtnProfile, this)); getChildView(BTN_PROFILE)->setEnabled(FALSE); - getChild<LLComboBox>(TEXT_MATURITY)->setCurrentByIndex(2); + getChild<LLComboBox>(TEXT_MATURITY)->setCurrentByIndex(gSavedPerAccountSettings.getU32("ExperienceSearchMaturity")); getChild<LLComboBox>(TEXT_MATURITY)->setCommitCallback(boost::bind(&LLPanelExperiencePicker::onMaturity, this)); getChild<LLUICtrl>(TEXT_EDIT)->setFocus(TRUE); @@ -381,6 +381,7 @@ void LLPanelExperiencePicker::filterContent() void LLPanelExperiencePicker::onMaturity() { + gSavedPerAccountSettings.setU32("ExperienceSearchMaturity", getChild<LLComboBox>(TEXT_MATURITY)->getCurrentIndex()); if(mResponse.has("experience_keys") && mResponse["experience_keys"].beginArray() != mResponse["experience_keys"].endArray()) { filterContent(); diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index 29994253c40178812a871395ea3b871a90368e27..1e0b1874f79b1e393a012ceb35db992b3cf9da1d 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -87,6 +87,8 @@ const S32 ALPHAMODE_MASK = 2; // Alpha masking mode const S32 BUMPY_TEXTURE = 18; // use supplied normal map const S32 SHINY_TEXTURE = 4; // use supplied specular map +BOOST_STATIC_ASSERT(MATTYPE_DIFFUSE == LLRender::DIFFUSE_MAP && MATTYPE_NORMAL == LLRender::NORMAL_MAP && MATTYPE_SPECULAR == LLRender::SPECULAR_MAP); + // // "Use texture" label for normal/specular type comboboxes // Filled in at initialization from translated strings @@ -159,6 +161,7 @@ BOOL LLPanelFace::postBuild() childSetCommitCallback("maskcutoff",&LLPanelFace::onCommitMaterialMaskCutoff, this); childSetAction("button align",&LLPanelFace::onClickAutoFix,this); + childSetAction("button align textures", &LLPanelFace::onAlignTexture, this); LLTextureCtrl* mTextureCtrl; LLTextureCtrl* mShinyTextureCtrl; @@ -467,11 +470,28 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor { BOOL valid; F32 value; - LLSpinCtrl* ctrlTexScaleS = mPanel->getChild<LLSpinCtrl>("TexScaleU"); - LLSpinCtrl* ctrlTexScaleT = mPanel->getChild<LLSpinCtrl>("TexScaleV"); - LLSpinCtrl* ctrlTexOffsetS = mPanel->getChild<LLSpinCtrl>("TexOffsetU"); - LLSpinCtrl* ctrlTexOffsetT = mPanel->getChild<LLSpinCtrl>("TexOffsetV"); - LLSpinCtrl* ctrlTexRotation = mPanel->getChild<LLSpinCtrl>("TexRot"); + + LLRadioGroup * radio_mat_type = mPanel->getChild<LLRadioGroup>("radio_material_type"); + std::string prefix; + switch (radio_mat_type->getSelectedIndex()) + { + case MATTYPE_DIFFUSE: + prefix = "Tex"; + break; + case MATTYPE_NORMAL: + prefix = "bumpy"; + break; + case MATTYPE_SPECULAR: + prefix = "shiny"; + break; + } + + LLSpinCtrl * ctrlTexScaleS = mPanel->getChild<LLSpinCtrl>(prefix + "ScaleU"); + LLSpinCtrl * ctrlTexScaleT = mPanel->getChild<LLSpinCtrl>(prefix + "ScaleV"); + LLSpinCtrl * ctrlTexOffsetS = mPanel->getChild<LLSpinCtrl>(prefix + "OffsetU"); + LLSpinCtrl * ctrlTexOffsetT = mPanel->getChild<LLSpinCtrl>(prefix + "OffsetV"); + LLSpinCtrl * ctrlTexRotation = mPanel->getChild<LLSpinCtrl>(prefix + "Rot"); + LLComboBox* comboTexGen = mPanel->getChild<LLComboBox>("combobox texgen"); LLCheckBoxCtrl* cb_planar_align = mPanel->getChild<LLCheckBoxCtrl>("checkbox planar align"); bool align_planar = (cb_planar_align && cb_planar_align->get()); @@ -494,8 +514,8 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor if (align_planar) { - LLPanelFace::LLSelectedTEMaterial::setNormalRepeatX(mPanel, value, te); - LLPanelFace::LLSelectedTEMaterial::setSpecularRepeatX(mPanel, value, te); + LLPanelFace::LLSelectedTEMaterial::setNormalRepeatX(mPanel, value, te, object->getID()); + LLPanelFace::LLSelectedTEMaterial::setSpecularRepeatX(mPanel, value, te, object->getID()); } } } @@ -519,8 +539,8 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor if (align_planar) { - LLPanelFace::LLSelectedTEMaterial::setNormalRepeatY(mPanel, value, te); - LLPanelFace::LLSelectedTEMaterial::setSpecularRepeatY(mPanel, value, te); + LLPanelFace::LLSelectedTEMaterial::setNormalRepeatY(mPanel, value, te, object->getID()); + LLPanelFace::LLSelectedTEMaterial::setSpecularRepeatY(mPanel, value, te, object->getID()); } } } @@ -535,8 +555,8 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor if (align_planar) { - LLPanelFace::LLSelectedTEMaterial::setNormalOffsetX(mPanel, value, te); - LLPanelFace::LLSelectedTEMaterial::setSpecularOffsetX(mPanel, value, te); + LLPanelFace::LLSelectedTEMaterial::setNormalOffsetX(mPanel, value, te, object->getID()); + LLPanelFace::LLSelectedTEMaterial::setSpecularOffsetX(mPanel, value, te, object->getID()); } } } @@ -551,8 +571,8 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor if (align_planar) { - LLPanelFace::LLSelectedTEMaterial::setNormalOffsetY(mPanel, value, te); - LLPanelFace::LLSelectedTEMaterial::setSpecularOffsetY(mPanel, value, te); + LLPanelFace::LLSelectedTEMaterial::setNormalOffsetY(mPanel, value, te, object->getID()); + LLPanelFace::LLSelectedTEMaterial::setSpecularOffsetY(mPanel, value, te, object->getID()); } } } @@ -567,8 +587,8 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor if (align_planar) { - LLPanelFace::LLSelectedTEMaterial::setNormalRotation(mPanel, value, te); - LLPanelFace::LLSelectedTEMaterial::setSpecularRotation(mPanel, value, te); + LLPanelFace::LLSelectedTEMaterial::setNormalRotation(mPanel, value, te, object->getID()); + LLPanelFace::LLSelectedTEMaterial::setSpecularRotation(mPanel, value, te, object->getID()); } } } @@ -640,6 +660,68 @@ struct LLPanelFaceSetAlignedTEFunctor : public LLSelectedTEFunctor LLFace* mCenterFace; }; +struct LLPanelFaceSetAlignedConcreteTEFunctor : public LLSelectedTEFunctor +{ + LLPanelFaceSetAlignedConcreteTEFunctor(LLPanelFace* panel, LLFace* center_face, LLRender::eTexIndex map) : + mPanel(panel), + mChefFace(center_face), + mMap(map) + {} + + virtual bool apply(LLViewerObject* object, S32 te) + { + LLFace* facep = object->mDrawable->getFace(te); + if (!facep) + { + return true; + } + + if (facep->getViewerObject()->getVolume()->getNumVolumeFaces() <= te) + { + return true; + } + + if (mChefFace != facep) + { + LLVector2 uv_offset, uv_scale; + F32 uv_rot; + if (facep->calcAlignedPlanarTE(mChefFace, &uv_offset, &uv_scale, &uv_rot, mMap)) + { + switch (mMap) + { + case LLRender::DIFFUSE_MAP: + object->setTEOffset(te, uv_offset.mV[VX], uv_offset.mV[VY]); + object->setTEScale(te, uv_scale.mV[VX], uv_scale.mV[VY]); + object->setTERotation(te, uv_rot); + break; + case LLRender::NORMAL_MAP: + LLPanelFace::LLSelectedTEMaterial::setNormalRotation(mPanel, uv_rot, te, object->getID()); + LLPanelFace::LLSelectedTEMaterial::setNormalOffsetX(mPanel, uv_offset.mV[VX], te, object->getID()); + LLPanelFace::LLSelectedTEMaterial::setNormalOffsetY(mPanel, uv_offset.mV[VY], te, object->getID()); + LLPanelFace::LLSelectedTEMaterial::setNormalRepeatX(mPanel, uv_scale.mV[VX], te, object->getID()); + LLPanelFace::LLSelectedTEMaterial::setNormalRepeatY(mPanel, uv_scale.mV[VY], te, object->getID()); + break; + case LLRender::SPECULAR_MAP: + LLPanelFace::LLSelectedTEMaterial::setSpecularRotation(mPanel, uv_rot, te, object->getID()); + LLPanelFace::LLSelectedTEMaterial::setSpecularOffsetX(mPanel, uv_offset.mV[VX], te, object->getID()); + LLPanelFace::LLSelectedTEMaterial::setSpecularOffsetY(mPanel, uv_offset.mV[VY], te, object->getID()); + LLPanelFace::LLSelectedTEMaterial::setSpecularRepeatX(mPanel, uv_scale.mV[VX], te, object->getID()); + LLPanelFace::LLSelectedTEMaterial::setSpecularRepeatY(mPanel, uv_scale.mV[VY], te, object->getID()); + break; + default: /*make compiler happy*/ + break; + } + } + } + + return true; + } +private: + LLPanelFace* mPanel; + LLFace* mChefFace; + LLRender::eTexIndex mMap; +}; + // Functor that tests if a face is aligned to mCenterFace struct LLPanelFaceGetIsAlignedTEFunctor : public LLSelectedTEFunctor { @@ -725,6 +807,17 @@ void LLPanelFace::sendTextureInfo() LLSelectMgr::getInstance()->getSelection()->applyToObjects(&sendfunc); } +void LLPanelFace::alignTestureLayer() +{ + LLFace* last_face = NULL; + bool identical_face = false; + LLSelectedTE::getFace(last_face, identical_face); + + LLRadioGroup * radio_mat_type = getChild<LLRadioGroup>("radio_material_type"); + LLPanelFaceSetAlignedConcreteTEFunctor setfunc(this, last_face, static_cast<LLRender::eTexIndex>(radio_mat_type->getSelectedIndex())); + LLSelectMgr::getInstance()->getSelection()->applyToTEs(&setfunc); +} + void LLPanelFace::getState() { updateUI(); @@ -949,41 +1042,75 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) } updateAlphaControls(); - - if(texture_ctrl) + + if (texture_ctrl) { if (identical_diffuse) { - texture_ctrl->setTentative( FALSE ); - texture_ctrl->setEnabled( editable ); - texture_ctrl->setImageAssetID( id ); + texture_ctrl->setTentative(FALSE); + texture_ctrl->setEnabled(editable); + texture_ctrl->setImageAssetID(id); getChildView("combobox alphamode")->setEnabled(editable && mIsAlpha && transparency <= 0.f); getChildView("label alphamode")->setEnabled(editable && mIsAlpha); getChildView("maskcutoff")->setEnabled(editable && mIsAlpha); getChildView("label maskcutoff")->setEnabled(editable && mIsAlpha); + + bool allAttachments = true; + for (LLObjectSelection::iterator iter = LLSelectMgr::getInstance()->getSelection()->begin(); + iter != LLSelectMgr::getInstance()->getSelection()->end();iter++) + { + LLSelectNode* node = *iter; + LLViewerObject* object = node->getObject(); + if (!object->isAttachment()) + { + allAttachments = false; + break; + } + } + + texture_ctrl->setBakeTextureEnabled(allAttachments); + } else if (id.isNull()) { // None selected - texture_ctrl->setTentative( FALSE ); - texture_ctrl->setEnabled( FALSE ); - texture_ctrl->setImageAssetID( LLUUID::null ); - getChildView("combobox alphamode")->setEnabled( FALSE ); - getChildView("label alphamode")->setEnabled( FALSE ); - getChildView("maskcutoff")->setEnabled( FALSE); - getChildView("label maskcutoff")->setEnabled( FALSE ); + texture_ctrl->setTentative(FALSE); + texture_ctrl->setEnabled(FALSE); + texture_ctrl->setImageAssetID(LLUUID::null); + getChildView("combobox alphamode")->setEnabled(FALSE); + getChildView("label alphamode")->setEnabled(FALSE); + getChildView("maskcutoff")->setEnabled(FALSE); + getChildView("label maskcutoff")->setEnabled(FALSE); + + texture_ctrl->setBakeTextureEnabled(false); } else { // Tentative: multiple selected with different textures - texture_ctrl->setTentative( TRUE ); - texture_ctrl->setEnabled( editable ); - texture_ctrl->setImageAssetID( id ); + texture_ctrl->setTentative(TRUE); + texture_ctrl->setEnabled(editable); + texture_ctrl->setImageAssetID(id); getChildView("combobox alphamode")->setEnabled(editable && mIsAlpha && transparency <= 0.f); getChildView("label alphamode")->setEnabled(editable && mIsAlpha); getChildView("maskcutoff")->setEnabled(editable && mIsAlpha); getChildView("label maskcutoff")->setEnabled(editable && mIsAlpha); + + bool allAttachments = true; + for (LLObjectSelection::iterator iter = LLSelectMgr::getInstance()->getSelection()->begin(); + iter != LLSelectMgr::getInstance()->getSelection()->end();iter++) + { + LLSelectNode* node = *iter; + LLViewerObject* object = node->getObject(); + if (!object->isAttachment()) + { + allAttachments = false; + break; + } + } + + texture_ctrl->setBakeTextureEnabled(allAttachments); } + } if (shinytexture_ctrl) @@ -1011,6 +1138,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) bool enabled = (editable && isIdenticalPlanarTexgen()); childSetValue("checkbox planar align", align_planar && enabled); childSetEnabled("checkbox planar align", enabled); + childSetEnabled("button align textures", enabled && LLSelectMgr::getInstance()->getSelection()->getObjectCount() > 1); if (align_planar && enabled) { @@ -1471,6 +1599,11 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/) mColorSwatch->setFallbackImage(LLUI::getUIImage("locked_image.j2c") ); mColorSwatch->setValid(FALSE); } + LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type"); + if (radio_mat_type) + { + radio_mat_type->setSelectedIndex(0); + } getChildView("color trans")->setEnabled(FALSE); getChildView("rptctrl")->setEnabled(FALSE); getChildView("tex gen")->setEnabled(FALSE); @@ -2161,7 +2294,18 @@ void LLPanelFace::onCommitMaterialBumpyRot(LLUICtrl* ctrl, void* userdata) } else { - LLSelectedTEMaterial::setNormalRotation(self,self->getCurrentBumpyRot() * DEG_TO_RAD); + if ((bool)self->childGetValue("checkbox planar align").asBoolean()) + { + LLFace* last_face = NULL; + bool identical_face = false; + LLSelectedTE::getFace(last_face, identical_face); + LLPanelFaceSetAlignedTEFunctor setfunc(self, last_face); + LLSelectMgr::getInstance()->getSelection()->applyToTEs(&setfunc); + } + else + { + LLSelectedTEMaterial::setNormalRotation(self, self->getCurrentBumpyRot() * DEG_TO_RAD); + } } } @@ -2178,7 +2322,18 @@ void LLPanelFace::onCommitMaterialShinyRot(LLUICtrl* ctrl, void* userdata) } else { - LLSelectedTEMaterial::setSpecularRotation(self,self->getCurrentShinyRot() * DEG_TO_RAD); + if ((bool)self->childGetValue("checkbox planar align").asBoolean()) + { + LLFace* last_face = NULL; + bool identical_face = false; + LLSelectedTE::getFace(last_face, identical_face); + LLPanelFaceSetAlignedTEFunctor setfunc(self, last_face); + LLSelectMgr::getInstance()->getSelection()->applyToTEs(&setfunc); + } + else + { + LLSelectedTEMaterial::setSpecularRotation(self, self->getCurrentShinyRot() * DEG_TO_RAD); + } } } @@ -2435,6 +2590,11 @@ void LLPanelFace::onClickAutoFix(void* userdata) LLSelectMgr::getInstance()->getSelection()->applyToObjects(&sendfunc); } +void LLPanelFace::onAlignTexture(void* userdata) +{ + LLPanelFace* self = (LLPanelFace*)userdata; + self->alignTestureLayer(); +} // TODO: I don't know who put these in or what these are for??? @@ -2546,6 +2706,16 @@ void LLPanelFace::LLSelectedTE::getTexId(LLUUID& id, bool& identical) { LLUUID get(LLViewerObject* object, S32 te_index) { + LLTextureEntry *te = object->getTE(te_index); + if (te) + { + if ((te->getID() == IMG_USE_BAKED_EYES) || (te->getID() == IMG_USE_BAKED_HAIR) || (te->getID() == IMG_USE_BAKED_HEAD) || (te->getID() == IMG_USE_BAKED_LOWER) || (te->getID() == IMG_USE_BAKED_SKIRT) || (te->getID() == IMG_USE_BAKED_UPPER) + || (te->getID() == IMG_USE_BAKED_LEFTARM) || (te->getID() == IMG_USE_BAKED_LEFTLEG) || (te->getID() == IMG_USE_BAKED_AUX1) || (te->getID() == IMG_USE_BAKED_AUX2) || (te->getID() == IMG_USE_BAKED_AUX3)) + { + return te->getID(); + } + } + LLUUID id; LLViewerTexture* image = object->getTEImage(te_index); if (image) @@ -2555,7 +2725,6 @@ void LLPanelFace::LLSelectedTE::getTexId(LLUUID& id, bool& identical) if (!id.isNull() && LLViewerMedia::textureHasMedia(id)) { - LLTextureEntry *te = object->getTE(te_index); if (te) { LLViewerTexture* tex = te->getID().notNull() ? gTextureList.findImage(te->getID(), TEX_LIST_STANDARD) : NULL; diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h index 064262a312eff4c058bacb49358a3c34c916a28e..76673c6444f0eaf59a145281c4bf5004483134e0 100644 --- a/indra/newview/llpanelface.h +++ b/indra/newview/llpanelface.h @@ -129,6 +129,7 @@ class LLPanelFace : public LLPanel void sendFullbright(); // applies and sends full bright void sendGlow(); void sendMedia(); + void alignTestureLayer(); // this function is to return TRUE if the drag should succeed. static BOOL onDragTexture(LLUICtrl* ctrl, LLInventoryItem* item); @@ -205,6 +206,7 @@ class LLPanelFace : public LLPanel static void onCommitPlanarAlign( LLUICtrl* ctrl, void* userdata); static void onCommitRepeatsPerMeter( LLUICtrl* ctrl, void* userinfo); static void onClickAutoFix(void*); + static void onAlignTexture(void*); void onCopyFaces(); void onPasteFaces(); diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index f85a2ffbc150be022b4d62c01faee2aa60c4e44a..b53cd222e7ea81d88f7f8e6ec0895aabda4f454b 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -461,11 +461,12 @@ bool LLPanelGroupGeneral::createGroupCallback(const LLSD& notification, const LL // Yay! We are making a new group! U32 enrollment_fee = (mCtrlEnrollmentFee->get() ? (U32) mSpinEnrollmentFee->get() : 0); - + LLUUID insignia_id = mInsignia->getImageItemID().isNull() ? LLUUID::null : mInsignia->getImageAssetID(); + LLGroupMgr::getInstance()->sendCreateGroupRequest(mGroupNameEditor->getText(), mEditCharter->getText(), mCtrlShowInGroupList->get(), - mInsignia->getImageAssetID(), + insignia_id, enrollment_fee, mCtrlOpenEnrollment->get(), false, diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index 82ea8377de684a9b91177d26c0d029e34b31177a..d6b66ee6225a7a961109a46f4bf688aafa326e39 100644 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -606,11 +606,30 @@ void LLPanelGroupInvite::updateLists() { if (!mPendingUpdate) { + // Note: this will partially fail if some requests are already in progress LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mImplementation->mGroupID); LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mImplementation->mGroupID); LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(mImplementation->mGroupID); LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mImplementation->mGroupID); } + else if (gdatap) + { + // restart requests that were interrupted/dropped/failed to start + if (!gdatap->isRoleDataPending() && !gdatap->isRoleDataComplete()) + { + LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mImplementation->mGroupID); + } + if (!gdatap->isRoleMemberDataPending() && !gdatap->isRoleMemberDataComplete()) + { + LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(mImplementation->mGroupID); + } + // sendCapGroupMembersRequest has a per frame send limitation that could have + // interrupted previous request + if (!gdatap->isMemberDataPending() && !gdatap->isMemberDataComplete()) + { + LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mImplementation->mGroupID); + } + } mPendingUpdate = TRUE; } else diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 52a13304df3418adb06679039e2d23efc6960665..0efb234015b52252f745b9798eefdd92ac554b3b 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -1962,6 +1962,7 @@ LLPanelGroupRolesSubTab::LLPanelGroupRolesSubTab() mRoleDescription(NULL), mMemberVisibleCheck(NULL), mDeleteRoleButton(NULL), + mCopyRoleButton(NULL), mCreateRoleButton(NULL), mFirstOpen(TRUE), mHasRoleChange(FALSE) @@ -2012,6 +2013,14 @@ BOOL LLPanelGroupRolesSubTab::postBuildSubTab(LLView* root) mCreateRoleButton->setClickedCallback(onCreateRole, this); mCreateRoleButton->setEnabled(FALSE); } + + mCopyRoleButton = + parent->getChild<LLButton>("role_copy", recurse); + if ( mCopyRoleButton ) + { + mCopyRoleButton->setClickedCallback(onCopyRole, this); + mCopyRoleButton->setEnabled(FALSE); + } mDeleteRoleButton = parent->getChild<LLButton>("role_delete", recurse); @@ -2226,6 +2235,7 @@ void LLPanelGroupRolesSubTab::update(LLGroupChange gc) mRoleTitle->clear(); setFooterEnabled(FALSE); mDeleteRoleButton->setEnabled(FALSE); + mCopyRoleButton->setEnabled(FALSE); } } @@ -2336,6 +2346,7 @@ void LLPanelGroupRolesSubTab::handleRoleSelect() mSelectedRole = item->getUUID(); buildMembersList(); + mCopyRoleButton->setEnabled(gAgent.hasPowerInGroup(mGroupID, GP_ROLE_CREATE)); can_delete = can_delete && gAgent.hasPowerInGroup(mGroupID, GP_ROLE_DELETE); mDeleteRoleButton->setEnabled(can_delete); @@ -2661,6 +2672,57 @@ void LLPanelGroupRolesSubTab::handleCreateRole() notifyObservers(); } +// static +void LLPanelGroupRolesSubTab::onCopyRole(void* user_data) +{ + LLPanelGroupRolesSubTab* self = static_cast<LLPanelGroupRolesSubTab*>(user_data); + if (!self) return; + + self->handleCopyRole(); +} + +void LLPanelGroupRolesSubTab::handleCopyRole() +{ + LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); + + if (!gdatap) return; + + LLScrollListItem* role_item = mRolesList->getFirstSelected(); + if (!role_item || role_item->getUUID().isNull()) + { + return; + } + + LLRoleData rd; + if (!gdatap->getRoleData(role_item->getUUID(), rd)) + { + return; + } + + LLUUID new_role_id; + new_role_id.generate(); + rd.mRoleName += "(Copy)"; + gdatap->createRole(new_role_id,rd); + + mRolesList->deselectAllItems(TRUE); + LLSD row; + row["id"] = new_role_id; + row["columns"][0]["column"] = "name"; + row["columns"][0]["value"] = rd.mRoleName; + mRolesList->addElement(row, ADD_BOTTOM, this); + mRolesList->selectByID(new_role_id); + + // put focus on name field and select its contents + if(mRoleName) + { + mRoleName->setFocus(TRUE); + mRoleName->onTabInto(); + gFocusMgr.triggerFocusFlash(); + } + + notifyObservers(); +} + // static void LLPanelGroupRolesSubTab::onDeleteRole(void* user_data) { diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h index aafbd242cbf98fec37e37c39ca8cee8dd7ba986f..459b77703f3729bde9b27e2edc77eed8844b102a 100644 --- a/indra/newview/llpanelgrouproles.h +++ b/indra/newview/llpanelgrouproles.h @@ -269,6 +269,9 @@ class LLPanelGroupRolesSubTab : public LLPanelGroupSubTab static void onCreateRole(void*); void handleCreateRole(); + static void onCopyRole(void*); + void handleCopyRole(); + static void onDeleteRole(void*); void handleDeleteRole(); @@ -296,6 +299,7 @@ class LLPanelGroupRolesSubTab : public LLPanelGroupSubTab LLCheckBoxCtrl* mMemberVisibleCheck; LLButton* mDeleteRoleButton; LLButton* mCreateRoleButton; + LLButton* mCopyRoleButton; LLUUID mSelectedRole; BOOL mHasRoleChange; diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 142dea83e2d2b9cf45760151223a2eec1057653f..e253557797de8c149132fbffcde1d8a1fce24e05 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -178,7 +178,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, mPasswordModified = FALSE; - LLPanelLogin::sInstance = this; + sInstance = this; LLView* login_holder = gViewerWindow->getLoginPanelHolder(); if (login_holder) @@ -234,29 +234,44 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, server_choice_combo->add(LLGridManager::getInstance()->getGridLabel(), current_grid, ADD_TOP); - server_choice_combo->selectFirstItem(); + server_choice_combo->selectFirstItem(); LLSLURL start_slurl(LLStartUp::getStartSLURL()); + // The StartSLURL might have been set either by an explicit command-line + // argument (CmdLineLoginLocation) or by default. + // current_grid might have been set either by an explicit command-line + // argument (CmdLineGridChoice) or by default. + // If the grid specified by StartSLURL is the same as current_grid, the + // distinction is moot. + // If we have an explicit command-line SLURL, use that. + // If we DON'T have an explicit command-line SLURL but we DO have an + // explicit command-line grid, which is different from the default SLURL's + // -- do NOT override the explicit command-line grid with the grid from + // the default SLURL! + bool force_grid{ start_slurl.getGrid() != current_grid && + gSavedSettings.getString("CmdLineLoginLocation").empty() && + ! gSavedSettings.getString("CmdLineGridChoice").empty() }; if ( !start_slurl.isSpatial() ) // has a start been established by the command line or NextLoginLocation ? { // no, so get the preference setting std::string defaultStartLocation = gSavedSettings.getString("LoginLocation"); LL_INFOS("AppInit")<<"default LoginLocation '"<<defaultStartLocation<<"'"<<LL_ENDL; LLSLURL defaultStart(defaultStartLocation); - if ( defaultStart.isSpatial() ) + if ( defaultStart.isSpatial() && ! force_grid ) { LLStartUp::setStartSLURL(defaultStart); } else { - LL_INFOS("AppInit")<<"no valid LoginLocation, using home"<<LL_ENDL; + LL_INFOS("AppInit") << (force_grid? "--grid specified" : "no valid LoginLocation") + << ", using home" << LL_ENDL; LLSLURL homeStart(LLSLURL::SIM_LOCATION_HOME); LLStartUp::setStartSLURL(homeStart); } } - else + else if (! force_grid) { - LLPanelLogin::onUpdateStartSLURL(start_slurl); // updates grid if needed + onUpdateStartSLURL(start_slurl); // updates grid if needed } childSetAction("connect_btn", onClickConnect, this); @@ -380,7 +395,7 @@ void LLPanelLogin::setFocus(BOOL b) { if(b) { - LLPanelLogin::giveFocus(); + giveFocus(); } else { @@ -748,7 +763,10 @@ void LLPanelLogin::closePanel() { if (sInstance) { - LLPanelLogin::sInstance->getParent()->removeChild( LLPanelLogin::sInstance ); + if (LLPanelLogin::sInstance->getParent()) + { + LLPanelLogin::sInstance->getParent()->removeChild(LLPanelLogin::sInstance); + } delete sInstance; sInstance = NULL; diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index db9d61c637bc13babd0ad935fd5a5545023dd6f6..f63e604927b75b9e9604b2b0ada2d934c5d0763a 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -885,7 +885,7 @@ void LLFloaterInventoryFinder::updateElementsFromFilter() U32 hours = mFilter->getHoursAgo(); U32 date_search_direction = mFilter->getDateSearchDirection(); - LLInventoryFilter::EFilterCreatorType filter_creator = mFilter->getFilterCreator(); + LLInventoryFilter::EFilterCreatorType filter_creator = mFilter->getFilterCreatorType(); bool show_created_by_me = ((filter_creator == LLInventoryFilter::FILTERCREATOR_ALL) || (filter_creator == LLInventoryFilter::FILTERCREATOR_SELF)); bool show_created_by_others = ((filter_creator == LLInventoryFilter::FILTERCREATOR_ALL) || (filter_creator == LLInventoryFilter::FILTERCREATOR_OTHERS)); @@ -898,7 +898,6 @@ void LLFloaterInventoryFinder::updateElementsFromFilter() getChild<LLUICtrl>("check_clothing")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE)); getChild<LLUICtrl>("check_gesture")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE)); getChild<LLUICtrl>("check_landmark")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK)); - getChild<LLUICtrl>("check_mesh")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_MESH)); getChild<LLUICtrl>("check_notecard")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD)); getChild<LLUICtrl>("check_object")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT)); getChild<LLUICtrl>("check_script")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_LSL)); @@ -954,12 +953,6 @@ void LLFloaterInventoryFinder::draw() filtered_by_all_types = FALSE; } - if (!getChild<LLUICtrl>("check_mesh")->getValue()) - { - filter &= ~(0x1 << LLInventoryType::IT_MESH); - filtered_by_all_types = FALSE; - } - if (!getChild<LLUICtrl>("check_notecard")->getValue()) { filter &= ~(0x1 << LLInventoryType::IT_NOTECARD); @@ -1108,7 +1101,6 @@ void LLFloaterInventoryFinder::selectAllTypes(void* user_data) self->getChild<LLUICtrl>("check_clothing")->setValue(TRUE); self->getChild<LLUICtrl>("check_gesture")->setValue(TRUE); self->getChild<LLUICtrl>("check_landmark")->setValue(TRUE); - self->getChild<LLUICtrl>("check_mesh")->setValue(TRUE); self->getChild<LLUICtrl>("check_notecard")->setValue(TRUE); self->getChild<LLUICtrl>("check_object")->setValue(TRUE); self->getChild<LLUICtrl>("check_script")->setValue(TRUE); @@ -1128,7 +1120,6 @@ void LLFloaterInventoryFinder::selectNoTypes(void* user_data) self->getChild<LLUICtrl>("check_clothing")->setValue(FALSE); self->getChild<LLUICtrl>("check_gesture")->setValue(FALSE); self->getChild<LLUICtrl>("check_landmark")->setValue(FALSE); - self->getChild<LLUICtrl>("check_mesh")->setValue(FALSE); self->getChild<LLUICtrl>("check_notecard")->setValue(FALSE); self->getChild<LLUICtrl>("check_object")->setValue(FALSE); self->getChild<LLUICtrl>("check_script")->setValue(FALSE); diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index e53f03785f6b1e6893c679d9e793db68fb02f2f8..a382813de65ffb530bd5274aa6ef48e8b8edb128 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -316,6 +316,7 @@ LLPanelObject::LLPanelObject() mSculptTextureRevert(LLUUID::null), mSculptTypeRevert(0), mSizeChanged(FALSE), + mHasParamsClipboard(FALSE), mHasPosClipboard(FALSE), mHasSizeClipboard(FALSE), mHasRotClipboard(FALSE), @@ -481,7 +482,7 @@ void LLPanelObject::getState( ) mBtnPasteRot->setEnabled( enable_rotate && mHasRotClipboard ); mBtnCopyParams->setEnabled( single_volume && enable_modify ); - mBtnPasteParams->setEnabled( single_volume && enable_modify ); + mBtnPasteParams->setEnabled( single_volume && enable_modify && mHasParamsClipboard ); mBtnPasteMenu->setEnabled( single_volume && enable_modify ); LLUUID owner_id; diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index cd1875e995898164d16d6f0b5048261f1c5a7c88..6702dae4d6cb73d0e6e0b6d324cce741f0879079 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -1121,92 +1121,6 @@ LLUIImagePtr LLTaskWearableBridge::getIcon() const return LLInventoryIcon::getIcon(mAssetType, mInventoryType, mFlags, FALSE ); } -///---------------------------------------------------------------------------- -/// Class LLTaskMeshBridge -///---------------------------------------------------------------------------- - -class LLTaskMeshBridge : public LLTaskInvFVBridge -{ -public: - LLTaskMeshBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name); - - virtual LLUIImagePtr getIcon() const; - virtual void openItem(); - virtual void performAction(LLInventoryModel* model, std::string action); - virtual void buildContextMenu(LLMenuGL& menu, U32 flags); -}; - -LLTaskMeshBridge::LLTaskMeshBridge( - LLPanelObjectInventory* panel, - const LLUUID& uuid, - const std::string& name) : - LLTaskInvFVBridge(panel, uuid, name) -{ -} - -LLUIImagePtr LLTaskMeshBridge::getIcon() const -{ - return LLInventoryIcon::getIcon(LLAssetType::AT_MESH, LLInventoryType::IT_MESH, 0, FALSE); -} - -void LLTaskMeshBridge::openItem() -{ - // open mesh -} - - -// virtual -void LLTaskMeshBridge::performAction(LLInventoryModel* model, std::string action) -{ - if (action == "mesh action") - { - LLInventoryItem* item = findItem(); - if(item) - { - // do action - } - } - LLTaskInvFVBridge::performAction(model, action); -} - -void LLTaskMeshBridge::buildContextMenu(LLMenuGL& menu, U32 flags) -{ - LLInventoryItem* item = findItem(); - std::vector<std::string> items; - std::vector<std::string> disabled_items; - if(!item) - { - hide_context_entries(menu, items, disabled_items); - return; - } - - items.push_back(std::string("Task Open")); - if (!isItemCopyable()) - { - disabled_items.push_back(std::string("Task Open")); - } - - items.push_back(std::string("Task Properties")); - if ((flags & FIRST_SELECTED_ITEM) == 0) - { - disabled_items.push_back(std::string("Task Properties")); - } - if(isItemRenameable()) - { - items.push_back(std::string("Task Rename")); - } - if(isItemRemovable()) - { - items.push_back(std::string("Task Remove")); - } - - - hide_context_entries(menu, items, disabled_items); -} - ///---------------------------------------------------------------------------- /// LLTaskInvFVBridge impl //---------------------------------------------------------------------------- @@ -1288,11 +1202,6 @@ LLTaskInvFVBridge* LLTaskInvFVBridge::createObjectBridge(LLPanelObjectInventory* object_id, object_name); break; - case LLAssetType::AT_MESH: - new_bridge = new LLTaskMeshBridge(panel, - object_id, - object_name); - break; default: LL_INFOS() << "Unhandled inventory type (llassetstorage.h): " << (S32)type << LL_ENDL; @@ -1498,7 +1407,14 @@ void LLPanelObjectInventory::updateInventory() mIsInventoryEmpty = TRUE; } - mHaveInventory = TRUE; + mHaveInventory = !mIsInventoryEmpty || !objectp->isInventoryDirty(); + if (objectp->isInventoryDirty()) + { + // Inventory is dirty, yet we received inventoryChanged() callback. + // User changed something during ongoing request. + // Rerequest. It will clear dirty flag and won't create dupplicate requests. + objectp->requestInventory(); + } } else { @@ -1768,7 +1684,7 @@ void LLPanelObjectInventory::deleteAllChildren() BOOL LLPanelObjectInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, std::string& tooltip_msg) { - if (mFolders && mHaveInventory) + if (mFolders) { LLFolderViewItem* folderp = mFolders->getNextFromChild(NULL); if (!folderp) diff --git a/indra/newview/llpanelobjectinventory.h b/indra/newview/llpanelobjectinventory.h index d700c8f4cfb73bf96edce26ec1c45912a1c246ab..7b9ecfb8f31d6914fc9c4b77f8fbe3f7cf138131 100644 --- a/indra/newview/llpanelobjectinventory.h +++ b/indra/newview/llpanelobjectinventory.h @@ -106,9 +106,9 @@ class LLPanelObjectInventory : public LLPanel, public LLVOInventoryListener LLUUID mTaskUUID; LLUUID mAttachmentUUID; - BOOL mHaveInventory; - BOOL mIsInventoryEmpty; - BOOL mInventoryNeedsUpdate; + BOOL mHaveInventory; // 'Loading' label and used for initial request + BOOL mIsInventoryEmpty; // 'Empty' label + BOOL mInventoryNeedsUpdate; // for idle, set on changed callback LLFolderViewModelInventory mInventoryViewModel; }; diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index c5bae9c52ea28bfee1ca653e6f958cb69fc970c6..1d87aa6f5d5a5ccd82e467a30055725de10515e6 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -467,6 +467,7 @@ BOOL LLPanelOutfitEdit::postBuild() mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("alpha"), new LLFindActualWearablesOfType(LLWearableType::WT_ALPHA))); mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("tattoo"), new LLFindActualWearablesOfType(LLWearableType::WT_TATTOO))); mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("physics"), new LLFindActualWearablesOfType(LLWearableType::WT_PHYSICS))); + mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("universal"), new LLFindActualWearablesOfType(LLWearableType::WT_UNIVERSAL))); mCurrentOutfitName = getChild<LLTextBox>("curr_outfit_name"); mStatus = getChild<LLTextBox>("status"); diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h index 2cc8b65001bc2f8a60cc28c548d8d40fb46136e2..3c6efac0e7be200d437c61ef957ec59da1386cc1 100644 --- a/indra/newview/llpaneloutfitedit.h +++ b/indra/newview/llpaneloutfitedit.h @@ -98,6 +98,7 @@ class LLPanelOutfitEdit : public LLPanel LVIT_ALPHA, LVIT_TATTOO, LVIT_PHYSICS, + LVIT_UNIVERSAL, NUM_LIST_VIEW_ITEM_TYPES } EListViewItemType; diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 1cbff372870d5fa7d2f65fd800b43c7db34a8595..be174475e18e4df9f60522763e46a1e0882b0e03 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -54,7 +54,6 @@ #include "llcallingcard.h" // for LLAvatarTracker #include "llcallbacklist.h" #include "llerror.h" -#include "llfacebookconnect.h" #include "llfloateravatarpicker.h" #include "llfriendcard.h" #include "llgroupactions.h" @@ -67,6 +66,7 @@ #include "llrecentpeople.h" #include "llviewercontrol.h" // for gSavedSettings #include "llviewermenu.h" // for gMenuHolder +#include "llviewerregion.h" #include "llvoiceclient.h" #include "llworld.h" #include "llspeakers.h" @@ -536,7 +536,6 @@ class LLRecentListUpdater : public LLAvatarListUpdater, public boost::signals2:: LLPanelPeople::LLPanelPeople() : LLPanel(), - mTryToConnectToFacebook(true), mTabContainer(NULL), mOnlineFriendList(NULL), mAllFriendList(NULL), @@ -613,12 +612,23 @@ void LLPanelPeople::removePicker() BOOL LLPanelPeople::postBuild() { + S32 max_premium = PREMIUM_MAX_AGENT_GROUPS; + if (gAgent.getRegion()) + { + LLSD features; + gAgent.getRegion()->getSimulatorFeatures(features); + if (features.has("MaxAgentGroupsPremium")) + { + max_premium = features["MaxAgentGroupsPremium"].asInteger(); + } + } + getChild<LLFilterEditor>("nearby_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2)); getChild<LLFilterEditor>("friends_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2)); getChild<LLFilterEditor>("groups_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2)); getChild<LLFilterEditor>("recent_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2)); - if(gMaxAgentGroups <= BASE_MAX_AGENT_GROUPS) + if(gMaxAgentGroups < max_premium) { getChild<LLTextBox>("groupcount")->setText(getString("GroupCountWithInfo")); getChild<LLTextBox>("groupcount")->setURLClickedCallback(boost::bind(&LLPanelPeople::onGroupLimitInfo, this)); @@ -633,11 +643,9 @@ BOOL LLPanelPeople::postBuild() // updater is active only if panel is visible to user. friends_tab->setVisibleCallback(boost::bind(&Updater::setActive, mFriendListUpdater, _2)); friends_tab->setVisibleCallback(boost::bind(&LLPanelPeople::removePicker, this)); - friends_tab->setVisibleCallback(boost::bind(&LLPanelPeople::updateFacebookList, this, _2)); mOnlineFriendList = friends_tab->getChild<LLAvatarList>("avatars_online"); mAllFriendList = friends_tab->getChild<LLAvatarList>("avatars_all"); - mSuggestedFriends = friends_tab->getChild<LLAvatarList>("suggested_friends"); mOnlineFriendList->setNoItemsCommentText(getString("no_friends_online")); mOnlineFriendList->setShowIcons("FriendsListShowIcons"); mOnlineFriendList->showPermissions("FriendsListShowPermissions"); @@ -673,7 +681,6 @@ BOOL LLPanelPeople::postBuild() mRecentList->setContextMenu(&LLPanelPeopleMenus::gPeopleContextMenu); mAllFriendList->setContextMenu(&LLPanelPeopleMenus::gPeopleContextMenu); mOnlineFriendList->setContextMenu(&LLPanelPeopleMenus::gPeopleContextMenu); - mSuggestedFriends->setContextMenu(&LLPanelPeopleMenus::gSuggestedFriendsContextMenu); setSortOrder(mRecentList, (ESortOrder)gSavedSettings.getU32("RecentPeopleSortOrder"), false); setSortOrder(mAllFriendList, (ESortOrder)gSavedSettings.getU32("FriendsSortOrder"), false); @@ -752,7 +759,7 @@ void LLPanelPeople::updateFriendListHelpText() // 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() || mSuggestedFriends->filterHasMatches(); + bool any_friend_exists = mAllFriendList->filterHasMatches() || mOnlineFriendList->filterHasMatches(); no_friends_text->setVisible(!any_friend_exists); if (no_friends_text->getVisible()) { @@ -819,40 +826,9 @@ void LLPanelPeople::updateFriendList() mAllFriendList->setDirty(true, !mAllFriendList->filterHasMatches()); //update trash and other buttons according to a selected item updateButtons(); - updateSuggestedFriendList(); showFriendsAccordionsIfNeeded(); } -bool LLPanelPeople::updateSuggestedFriendList() -{ - const LLAvatarTracker& av_tracker = LLAvatarTracker::instance(); - uuid_vec_t& suggested_friends = mSuggestedFriends->getIDs(); - suggested_friends.clear(); - - //Add suggested friends - LLSD friends = LLFacebookConnect::instance().getContent(); - for (LLSD::array_const_iterator i = friends.beginArray(); i != friends.endArray(); ++i) - { - LLUUID agent_id = (*i).asUUID(); - bool second_life_buddy = agent_id.notNull() ? av_tracker.isBuddy(agent_id) : false; - - if(!second_life_buddy) - { - //FB+SL but not SL friend - if (agent_id.notNull()) - { - suggested_friends.push_back(agent_id); - } - } - } - - //Force a refresh when there aren't any filter matches (prevent displaying content that shouldn't display) - mSuggestedFriends->setDirty(true, !mSuggestedFriends->filterHasMatches()); - showFriendsAccordionsIfNeeded(); - - return false; -} - void LLPanelPeople::updateNearbyList() { if (!mNearbyList) @@ -876,51 +852,6 @@ void LLPanelPeople::updateRecentList() mRecentList->setDirty(); } -bool LLPanelPeople::onConnectedToFacebook(const LLSD& data) -{ - LLSD::Integer connection_state = data.get("enum").asInteger(); - - if (connection_state == LLFacebookConnect::FB_CONNECTED) - { - LLFacebookConnect::instance().loadFacebookFriends(); - } - else if(connection_state == LLFacebookConnect::FB_NOT_CONNECTED) - { - updateSuggestedFriendList(); - }; - - return false; -} - -void LLPanelPeople::updateFacebookList(bool visible) -{ - if (visible) - { - LLEventPumps::instance().obtain("FacebookConnectContent").stopListening("LLPanelPeople"); // just in case it is already listening - LLEventPumps::instance().obtain("FacebookConnectContent").listen("LLPanelPeople", boost::bind(&LLPanelPeople::updateSuggestedFriendList, this)); - - LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLPanelPeople"); // just in case it is already listening - LLEventPumps::instance().obtain("FacebookConnectState").listen("LLPanelPeople", boost::bind(&LLPanelPeople::onConnectedToFacebook, this, _1)); - - if (LLFacebookConnect::instance().isConnected()) - { - LLFacebookConnect::instance().loadFacebookFriends(); - } - else if(mTryToConnectToFacebook) - { - LLFacebookConnect::instance().checkConnectionToFacebook(); - mTryToConnectToFacebook = false; - } - - updateSuggestedFriendList(); - } - else - { - LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLPanelPeople"); - LLEventPumps::instance().obtain("FacebookConnectContent").stopListening("LLPanelPeople"); - } -} - void LLPanelPeople::updateButtons() { std::string cur_tab = getActiveTabName(); @@ -1139,11 +1070,9 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string) mOnlineFriendList->setNameFilter(filter); mAllFriendList->setNameFilter(filter); - mSuggestedFriends->setNameFilter(filter); setAccordionCollapsedByUser("tab_online", false); setAccordionCollapsedByUser("tab_all", false); - setAccordionCollapsedByUser("tab_suggested_friends", false); showFriendsAccordionsIfNeeded(); // restore accordion tabs state _after_ all manipulations @@ -1165,8 +1094,25 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string) void LLPanelPeople::onGroupLimitInfo() { LLSD args; - args["MAX_BASIC"] = BASE_MAX_AGENT_GROUPS; - args["MAX_PREMIUM"] = PREMIUM_MAX_AGENT_GROUPS; + + S32 max_basic = BASE_MAX_AGENT_GROUPS; + S32 max_premium = PREMIUM_MAX_AGENT_GROUPS; + if (gAgent.getRegion()) + { + LLSD features; + gAgent.getRegion()->getSimulatorFeatures(features); + if (features.has("MaxAgentGroupsBasic")) + { + max_basic = features["MaxAgentGroupsBasic"].asInteger(); + } + if (features.has("MaxAgentGroupsPremium")) + { + max_premium = features["MaxAgentGroupsPremium"].asInteger(); + } + } + args["MAX_BASIC"] = max_basic; + args["MAX_PREMIUM"] = max_premium; + LLNotificationsUtil::add("GroupLimitInfo", args); } @@ -1571,7 +1517,6 @@ void LLPanelPeople::showFriendsAccordionsIfNeeded() // Expand and show accordions if needed, else - hide them showAccordion("tab_online", mOnlineFriendList->filterHasMatches()); showAccordion("tab_all", mAllFriendList->filterHasMatches()); - showAccordion("tab_suggested_friends", mSuggestedFriends->filterHasMatches()); // Rearrange accordions LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion"); diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h index c72c4fc08a2375fcc339e736509bad6f9d57b540..14205cebe2fd831f3daafcd098bf8fe431bf7622 100644 --- a/indra/newview/llpanelpeople.h +++ b/indra/newview/llpanelpeople.h @@ -57,8 +57,6 @@ class LLPanelPeople // when voice is available /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal); - bool mTryToConnectToFacebook; - // internals class Updater; @@ -80,10 +78,8 @@ class LLPanelPeople // methods indirectly called by the updaters void updateFriendListHelpText(); void updateFriendList(); - bool updateSuggestedFriendList(); void updateNearbyList(); void updateRecentList(); - void updateFacebookList(bool visible); bool isItemsFreeOfFriends(const uuid_vec_t& uuids); @@ -131,8 +127,6 @@ class LLPanelPeople void onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param); - bool onConnectedToFacebook(const LLSD& data); - void setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed); void setAccordionCollapsedByUser(const std::string& name, bool collapsed); bool isAccordionCollapsedByUser(LLUICtrl* acc_tab); @@ -141,7 +135,6 @@ class LLPanelPeople LLTabContainer* mTabContainer; LLAvatarList* mOnlineFriendList; LLAvatarList* mAllFriendList; - LLAvatarList* mSuggestedFriends; LLAvatarList* mNearbyList; LLAvatarList* mRecentList; LLGroupList* mGroupList; diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp index 65769ff526490982f8e6b07eb6d22f49ba67ae59..42cecc9986c7c17f3cc4daef16bfbbd7aa90d72f 100644 --- a/indra/newview/llpanelpeoplemenus.cpp +++ b/indra/newview/llpanelpeoplemenus.cpp @@ -52,7 +52,6 @@ namespace LLPanelPeopleMenus PeopleContextMenu gPeopleContextMenu; NearbyPeopleContextMenu gNearbyPeopleContextMenu; -SuggestedFriendsContextMenu gSuggestedFriendsContextMenu; //== PeopleContextMenu =============================================================== @@ -413,36 +412,4 @@ void NearbyPeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags) hide_context_entries(menu, items, disabled_items); } -//== SuggestedFriendsContextMenu =============================================================== - -LLContextMenu* SuggestedFriendsContextMenu::createMenu() -{ - // set up the callbacks for all of the avatar menu items - LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; - LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; - LLContextMenu* menu; - - // Set up for one person selected menu - const LLUUID& id = mUUIDs.front(); - registrar.add("Avatar.Profile", boost::bind(&LLAvatarActions::showProfile, id)); - registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, id)); - - // create the context menu from the XUI - menu = createFromFile("menu_people_nearby.xml"); - buildContextMenu(*menu, 0x0); - - return menu; -} - -void SuggestedFriendsContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags) -{ - menuentry_vec_t items; - menuentry_vec_t disabled_items; - - items.push_back(std::string("view_profile")); - items.push_back(std::string("add_friend")); - - hide_context_entries(menu, items, disabled_items); -} - } // namespace LLPanelPeopleMenus diff --git a/indra/newview/llpanelpeoplemenus.h b/indra/newview/llpanelpeoplemenus.h index 5ed20e00640c0d0ecac0ce68dae818e6f161f066..3bc1f8caf7da486cb889edcc82da13b673ea7919 100644 --- a/indra/newview/llpanelpeoplemenus.h +++ b/indra/newview/llpanelpeoplemenus.h @@ -62,21 +62,8 @@ class NearbyPeopleContextMenu : public PeopleContextMenu /*virtual*/ void buildContextMenu(class LLMenuGL& menu, U32 flags); }; -/** - * Menu used in the suggested friends list. - */ -class SuggestedFriendsContextMenu : public PeopleContextMenu -{ -public: - /*virtual*/ LLContextMenu * createMenu(); - -protected: - /*virtual*/ void buildContextMenu(class LLMenuGL& menu, U32 flags); -}; - extern PeopleContextMenu gPeopleContextMenu; extern NearbyPeopleContextMenu gNearbyPeopleContextMenu; -extern SuggestedFriendsContextMenu gSuggestedFriendsContextMenu; } // namespace LLPanelPeopleMenus diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index 610b3a6396068610a98a1d81737dd3249dbcd7bd..104316e2534bcf5d08e67534843f5bfaa1a800b4 100644 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -563,11 +563,8 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, mSaleToText->setText(getString("anyone")); } - const U8* sign = (U8*)getString("price_text").c_str(); - const U8* sqm = (U8*)getString("area_text").c_str(); - - mSalesPriceText->setText(llformat("%s%d ", sign, parcel->getSalePrice())); - mAreaText->setText(llformat("%d %s", area, sqm)); + mSalesPriceText->setText(llformat("%s%d ", getString("price_text").c_str(), parcel->getSalePrice())); + mAreaText->setText(llformat("%d %s", area, getString("area_text").c_str())); mTrafficText->setText(llformat("%.0f", dwell)); // Can't have more than region max tasks, regardless of parcel @@ -575,10 +572,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, S32 primitives = llmin(ll_round(parcel->getMaxPrimCapacity() * parcel->getParcelPrimBonus()), (S32)region->getMaxTasks()); - const U8* available = (U8*)getString("available").c_str(); - const U8* allocated = (U8*)getString("allocated").c_str(); - - mPrimitivesText->setText(llformat("%d %s, %d %s", primitives, available, parcel->getPrimCount(), allocated)); + mPrimitivesText->setText(llformat("%d %s, %d %s", primitives, getString("available").c_str(), parcel->getPrimCount(), getString("allocated").c_str())); if (parcel->getAllowOtherScripts()) { diff --git a/indra/newview/llpanelsnapshotoptions.cpp b/indra/newview/llpanelsnapshotoptions.cpp index 95c14e4226c9eef40b6093a70fd1895bbca43669..23747a8efdebb025ada0d9a20c7de5ea8962cd4a 100644 --- a/indra/newview/llpanelsnapshotoptions.cpp +++ b/indra/newview/llpanelsnapshotoptions.cpp @@ -32,7 +32,6 @@ #include "llfloatersnapshot.h" // FIXME: create a snapshot model #include "llfloaterreg.h" -#include "llfloaterfacebook.h" #include "llfloaterflickr.h" #include "llfloatertwitter.h" @@ -59,7 +58,6 @@ class LLPanelSnapshotOptions void onSaveToEmail(); void onSaveToInventory(); void onSaveToComputer(); - void onSendToFacebook(); void onSendToTwitter(); void onSendToFlickr(); @@ -74,7 +72,6 @@ LLPanelSnapshotOptions::LLPanelSnapshotOptions() mCommitCallbackRegistrar.add("Snapshot.SaveToEmail", boost::bind(&LLPanelSnapshotOptions::onSaveToEmail, this)); mCommitCallbackRegistrar.add("Snapshot.SaveToInventory", boost::bind(&LLPanelSnapshotOptions::onSaveToInventory, this)); mCommitCallbackRegistrar.add("Snapshot.SaveToComputer", boost::bind(&LLPanelSnapshotOptions::onSaveToComputer, this)); - mCommitCallbackRegistrar.add("Snapshot.SendToFacebook", boost::bind(&LLPanelSnapshotOptions::onSendToFacebook, this)); mCommitCallbackRegistrar.add("Snapshot.SendToTwitter", boost::bind(&LLPanelSnapshotOptions::onSendToTwitter, this)); mCommitCallbackRegistrar.add("Snapshot.SendToFlickr", boost::bind(&LLPanelSnapshotOptions::onSendToFlickr, this)); LLGlobalEconomy::getInstance()->addObserver(this); @@ -138,18 +135,6 @@ void LLPanelSnapshotOptions::onSaveToComputer() openPanel("panel_snapshot_local"); } -void LLPanelSnapshotOptions::onSendToFacebook() -{ - LLFloaterReg::hideInstance("snapshot"); - - LLFloaterFacebook* facebook_floater = dynamic_cast<LLFloaterFacebook*>(LLFloaterReg::getInstance("facebook")); - if (facebook_floater) - { - facebook_floater->showPhotoPanel(); - } - LLFloaterReg::showInstance("facebook"); -} - void LLPanelSnapshotOptions::onSendToTwitter() { LLFloaterReg::hideInstance("snapshot"); diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp index 96dd309fa49799577a293960b72e1f2a0334d6ca..735eaa423dc6a5f5ef2bf5fed0eec1d76b37ce8f 100644 --- a/indra/newview/llpanelvolume.cpp +++ b/indra/newview/llpanelvolume.cpp @@ -383,6 +383,29 @@ void LLPanelVolume::getState( ) } } getChildView("Animated Mesh Checkbox Ctrl")->setEnabled(enabled_animated_object_box); + + //refresh any bakes + if (root_volobjp) + { + root_volobjp->refreshBakeTexture(); + + LLViewerObject::const_child_list_t& child_list = root_volobjp->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); ++iter) + { + LLViewerObject* objectp = *iter; + if (objectp) + { + objectp->refreshBakeTexture(); + } + } + + if (gAgentAvatarp) + { + gAgentAvatarp->updateMeshVisibility(); + } + } + // Flexible properties BOOL is_flexible = volobjp && volobjp->isFlexible(); @@ -953,6 +976,28 @@ void LLPanelVolume::onCommitAnimatedMeshCheckbox(LLUICtrl *, void*) { volobjp->setExtendedMeshFlags(new_flags); } + + //refresh any bakes + if (volobjp) + { + volobjp->refreshBakeTexture(); + + LLViewerObject::const_child_list_t& child_list = volobjp->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); ++iter) + { + LLViewerObject* objectp = *iter; + if (objectp) + { + objectp->refreshBakeTexture(); + } + } + + if (gAgentAvatarp) + { + gAgentAvatarp->updateMeshVisibility(); + } + } } void LLPanelVolume::onCommitIsFlexible(LLUICtrl *, void*) diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index d4a8bbdf453242a8acfa3db06b16ddb38c6e0698..1533a2746952765787b5130195ce7b5467f7f691 100644 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -32,6 +32,7 @@ #include "llagent.h" #include "lldraghandle.h" +#include "llexternaleditor.h" #include "llviewerwindow.h" #include "llbutton.h" #include "llfloaterreg.h" @@ -43,6 +44,7 @@ #include "roles_constants.h" #include "llscrollbar.h" #include "llselectmgr.h" +#include "lltrans.h" #include "llviewertexteditor.h" #include "llvfile.h" #include "llviewerinventory.h" @@ -63,7 +65,8 @@ // Default constructor LLPreviewNotecard::LLPreviewNotecard(const LLSD& key) //const LLUUID& item_id, - : LLPreview( key ) + : LLPreview( key ), + mLiveFile(NULL) { const LLInventoryItem *item = getItem(); if (item) @@ -74,13 +77,14 @@ LLPreviewNotecard::LLPreviewNotecard(const LLSD& key) //const LLUUID& item_id, LLPreviewNotecard::~LLPreviewNotecard() { + delete mLiveFile; } BOOL LLPreviewNotecard::postBuild() { - LLViewerTextEditor *ed = getChild<LLViewerTextEditor>("Notecard Editor"); - ed->setNotecardInfo(mItemUUID, mObjectID, getKey()); - ed->makePristine(); + mEditor = getChild<LLViewerTextEditor>("Notecard Editor"); + mEditor->setNotecardInfo(mItemUUID, mObjectID, getKey()); + mEditor->makePristine(); childSetAction("Save", onClickSave, this); getChildView("lock")->setVisible( FALSE); @@ -88,6 +92,8 @@ BOOL LLPreviewNotecard::postBuild() childSetAction("Delete", onClickDelete, this); getChildView("Delete")->setEnabled(false); + childSetAction("Edit", onClickEdit, this); + const LLInventoryItem* item = getItem(); childSetCommitCallback("desc", LLPreview::onText, this); @@ -408,6 +414,16 @@ void LLPreviewNotecard::onClickDelete(void* user_data) } } +// static +void LLPreviewNotecard::onClickEdit(void* user_data) +{ + LLPreviewNotecard* preview = (LLPreviewNotecard*)user_data; + if (preview) + { + preview->openInExternalEditor(); + } +} + struct LLSaveNotecardInfo { LLPreviewNotecard* mSelf; @@ -468,7 +484,7 @@ void LLPreviewNotecard::finishTaskUpload(LLUUID itemId, LLUUID newAssetId, LLUUI } } -bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem) +bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem, bool sync) { LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("Notecard Editor"); @@ -487,7 +503,10 @@ bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem) } editor->makePristine(); - + if (sync) + { + syncExternal(); + } const LLInventoryItem* item = getItem(); // save it out to database if (item) @@ -566,6 +585,18 @@ bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem) return true; } +void LLPreviewNotecard::syncExternal() +{ + // Sync with external editor. + std::string tmp_file = getTmpFileName(); + llstat s; + if (LLFile::stat(tmp_file, &s) == 0) // file exists + { + if (mLiveFile) mLiveFile->ignoreNextUpdate(); + writeToFile(tmp_file); + } +} + void LLPreviewNotecard::deleteNotecard() { LLNotificationsUtil::add("DeleteNotecard", LLSD(), LLSD(), boost::bind(&LLPreviewNotecard::handleConfirmDeleteDialog,this, _1, _2)); @@ -714,4 +745,128 @@ bool LLPreviewNotecard::handleConfirmDeleteDialog(const LLSD& notification, cons return false; } +void LLPreviewNotecard::openInExternalEditor() +{ + delete mLiveFile; // deletes file + + // Save the notecard to a temporary file. + std::string filename = getTmpFileName(); + writeToFile(filename); + + // Start watching file changes. + mLiveFile = new LLLiveLSLFile(filename, boost::bind(&LLPreviewNotecard::onExternalChange, this, _1)); + mLiveFile->addToEventTimer(); + + // Open it in external editor. + { + LLExternalEditor ed; + LLExternalEditor::EErrorCode status; + std::string msg; + + status = ed.setCommand("LL_SCRIPT_EDITOR"); + if (status != LLExternalEditor::EC_SUCCESS) + { + if (status == LLExternalEditor::EC_NOT_SPECIFIED) // Use custom message for this error. + { + msg = LLTrans::getString("ExternalEditorNotSet"); + } + else + { + msg = LLExternalEditor::getErrorMessage(status); + } + + LLNotificationsUtil::add("GenericAlert", LLSD().with("MESSAGE", msg)); + return; + } + + status = ed.run(filename); + if (status != LLExternalEditor::EC_SUCCESS) + { + msg = LLExternalEditor::getErrorMessage(status); + LLNotificationsUtil::add("GenericAlert", LLSD().with("MESSAGE", msg)); + } + } +} + +bool LLPreviewNotecard::onExternalChange(const std::string& filename) +{ + if (!loadNotecardText(filename)) + { + return false; + } + + // Disable sync to avoid recursive load->save->load calls. + saveIfNeeded(NULL, false); + return true; +} + +bool LLPreviewNotecard::loadNotecardText(const std::string& filename) +{ + if (filename.empty()) + { + LL_WARNS() << "Empty file name" << LL_ENDL; + return false; + } + + LLFILE* file = LLFile::fopen(filename, "rb"); /*Flawfinder: ignore*/ + if (!file) + { + LL_WARNS() << "Error opening " << filename << LL_ENDL; + return false; + } + + // read in the whole file + fseek(file, 0L, SEEK_END); + size_t file_length = (size_t)ftell(file); + fseek(file, 0L, SEEK_SET); + char* buffer = new char[file_length + 1]; + size_t nread = fread(buffer, 1, file_length, file); + if (nread < file_length) + { + LL_WARNS() << "Short read" << LL_ENDL; + } + buffer[nread] = '\0'; + fclose(file); + + mEditor->setText(LLStringExplicit(buffer)); + delete[] buffer; + + return true; +} + +bool LLPreviewNotecard::writeToFile(const std::string& filename) +{ + LLFILE* fp = LLFile::fopen(filename, "wb"); + if (!fp) + { + LL_WARNS() << "Unable to write to " << filename << LL_ENDL; + return false; + } + + std::string utf8text = mEditor->getText(); + + if (utf8text.size() == 0) + { + utf8text = " "; + } + + fputs(utf8text.c_str(), fp); + fclose(fp); + return true; +} + + +std::string LLPreviewNotecard::getTmpFileName() +{ + std::string notecard_id = mObjectID.asString() + "_" + mItemUUID.asString(); + + // Use MD5 sum to make the file name shorter and not exceed maximum path length. + char notecard_id_hash_str[33]; /* Flawfinder: ignore */ + LLMD5 notecard_id_hash((const U8 *)notecard_id.c_str()); + notecard_id_hash.hex_digest(notecard_id_hash_str); + + return std::string(LLFile::tmpdir()) + "sl_notecard_" + notecard_id_hash_str + ".txt"; +} + + // EOF diff --git a/indra/newview/llpreviewnotecard.h b/indra/newview/llpreviewnotecard.h index 46a6d0ef501e0bc2b49d8de438106904bad6a903..d9c14815c177abcca0e2bd0a5c65b91af090c0d4 100644 --- a/indra/newview/llpreviewnotecard.h +++ b/indra/newview/llpreviewnotecard.h @@ -29,6 +29,7 @@ #include "llpreview.h" #include "llassetstorage.h" +#include "llpreviewscript.h" #include "lliconctrl.h" //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -47,18 +48,18 @@ class LLPreviewNotecard : public LLPreview virtual ~LLPreviewNotecard(); bool saveItem(); - void setObjectID(const LLUUID& object_id); + void setObjectID(const LLUUID& object_id) override; // llview - virtual void draw(); - virtual BOOL handleKeyHere(KEY key, MASK mask); - virtual void setEnabled( BOOL enabled ); + void draw() override; + BOOL handleKeyHere(KEY key, MASK mask) override; + void setEnabled( BOOL enabled ) override; // llfloater - virtual BOOL canClose(); + BOOL canClose() override; // llpanel - virtual BOOL postBuild(); + BOOL postBuild() override; // reach into the text editor, and grab the drag item const LLInventoryItem* getDragItem(); @@ -72,11 +73,13 @@ class LLPreviewNotecard : public LLPreview // asset system. :( void refreshFromInventory(const LLUUID& item_id = LLUUID::null); + void syncExternal(); + protected: - void updateTitleButtons(); - virtual void loadAsset(); - bool saveIfNeeded(LLInventoryItem* copyitem = NULL); + void updateTitleButtons() override; + void loadAsset() override; + bool saveIfNeeded(LLInventoryItem* copyitem = NULL, bool sync = true); void deleteNotecard(); @@ -89,6 +92,8 @@ class LLPreviewNotecard : public LLPreview static void onClickDelete(void* data); + static void onClickEdit(void* data); + static void onSaveComplete(const LLUUID& asset_uuid, void* user_data, S32 status, LLExtStat ext_status); @@ -99,6 +104,12 @@ class LLPreviewNotecard : public LLPreview static void finishInventoryUpload(LLUUID itemId, LLUUID newAssetId, LLUUID newItemId); static void finishTaskUpload(LLUUID itemId, LLUUID newAssetId, LLUUID taskId); + void openInExternalEditor(); + bool onExternalChange(const std::string& filename); + bool loadNotecardText(const std::string& filename); + bool writeToFile(const std::string& filename); + std::string getTmpFileName(); + protected: LLViewerTextEditor* mEditor; LLButton* mSaveBtn; @@ -106,6 +117,8 @@ class LLPreviewNotecard : public LLPreview LLUUID mAssetID; LLUUID mObjectID; + + LLLiveLSLFile* mLiveFile; }; diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 9431914ba376f205e8407b8d6726ec88c7e098b4..f1bb0bc27d011329cff83e7874a82ab2d1177021 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -41,7 +41,6 @@ #include "llinventorymodel.h" #include "llkeyboard.h" #include "lllineeditor.h" -#include "lllivefile.h" #include "llhelp.h" #include "llnotificationsutil.h" #include "llresmgr.h" @@ -120,22 +119,6 @@ static bool have_script_upload_cap(LLUUID& object_id) /// --------------------------------------------------------------------------- /// LLLiveLSLFile /// --------------------------------------------------------------------------- -class LLLiveLSLFile : public LLLiveFile -{ -public: - typedef boost::function<bool (const std::string& filename)> change_callback_t; - - LLLiveLSLFile(std::string file_path, change_callback_t change_cb); - ~LLLiveLSLFile(); - - void ignoreNextUpdate() { mIgnoreNextUpdate = true; } - -protected: - /*virtual*/ bool loadFile(); - - change_callback_t mOnChangeCallback; - bool mIgnoreNextUpdate; -}; LLLiveLSLFile::LLLiveLSLFile(std::string file_path, change_callback_t change_cb) : mOnChangeCallback(change_cb) @@ -1069,7 +1052,7 @@ void LLScriptEdCore::openInExternalEditor() { if (status == LLExternalEditor::EC_NOT_SPECIFIED) // Use custom message for this error. { - msg = getString("external_editor_not_set"); + msg = LLTrans::getString("ExternalEditorNotSet"); } else { diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index 69cf9d915838d21590edbb48f1fce80ea2f6dd2b..74e4c00d43bed537b9dd743ca37ec226f20c54c3 100644 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -34,6 +34,7 @@ #include "lliconctrl.h" #include "llframetimer.h" #include "llfloatergotoline.h" +#include "lllivefile.h" #include "llsyntaxid.h" class LLLiveLSLFile; @@ -53,6 +54,23 @@ class LLScriptEdContainer; class LLFloaterGotoLine; class LLFloaterExperienceProfile; +class LLLiveLSLFile : public LLLiveFile +{ +public: + typedef boost::function<bool(const std::string& filename)> change_callback_t; + + LLLiveLSLFile(std::string file_path, change_callback_t change_cb); + ~LLLiveLSLFile(); + + void ignoreNextUpdate() { mIgnoreNextUpdate = true; } + +protected: + /*virtual*/ bool loadFile(); + + change_callback_t mOnChangeCallback; + bool mIgnoreNextUpdate; +}; + // Inner, implementation class. LLPreviewScript and LLLiveLSLEditor each own one of these. class LLScriptEdCore : public LLPanel { diff --git a/indra/newview/llsearchableui.cpp b/indra/newview/llsearchableui.cpp new file mode 100644 index 0000000000000000000000000000000000000000..93143eb33fe6589ea898cbb0f21a23db81dd95b9 --- /dev/null +++ b/indra/newview/llsearchableui.cpp @@ -0,0 +1,160 @@ +/** +* @file llsearchableui.cpp +* +* $LicenseInfo:firstyear=2019&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2019, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +* $/LicenseInfo$ +*/ + +#include "llviewerprecompiledheaders.h" +#include "llsearchableui.h" + +#include "llview.h" +#include "lltabcontainer.h" +#include "llmenugl.h" + +ll::prefs::SearchableItem::~SearchableItem() +{} + +void ll::prefs::SearchableItem::setNotHighlighted() +{ + mCtrl->setHighlighted( false ); +} + +bool ll::prefs::SearchableItem::hightlightAndHide( LLWString const &aFilter ) +{ + if( mCtrl->getHighlighted() ) + return true; + + LLView const *pView = dynamic_cast< LLView const* >( mCtrl ); + if( pView && !pView->getVisible() ) + return false; + + if( aFilter.empty() ) + { + mCtrl->setHighlighted( false ); + return true; + } + + if( mLabel.find( aFilter ) != LLWString::npos ) + { + mCtrl->setHighlighted( true ); + return true; + } + + return false; +} + +ll::prefs::PanelData::~PanelData() +{} + +bool ll::prefs::PanelData::hightlightAndHide( LLWString const &aFilter ) +{ + for( tSearchableItemList::iterator itr = mChildren.begin(); itr != mChildren.end(); ++itr ) + (*itr)->setNotHighlighted( ); + + if (aFilter.empty()) + { + return true; + } + + bool bVisible(false); + for( tSearchableItemList::iterator itr = mChildren.begin(); itr != mChildren.end(); ++itr ) + bVisible |= (*itr)->hightlightAndHide( aFilter ); + + for( tPanelDataList::iterator itr = mChildPanel.begin(); itr != mChildPanel.end(); ++itr ) + bVisible |= (*itr)->hightlightAndHide( aFilter ); + + return bVisible; +} + +bool ll::prefs::TabContainerData::hightlightAndHide( LLWString const &aFilter ) +{ + for( tSearchableItemList::iterator itr = mChildren.begin(); itr != mChildren.end(); ++itr ) + (*itr)->setNotHighlighted( ); + + bool bVisible(false); + for( tSearchableItemList::iterator itr = mChildren.begin(); itr != mChildren.end(); ++itr ) + bVisible |= (*itr)->hightlightAndHide( aFilter ); + + for( tPanelDataList::iterator itr = mChildPanel.begin(); itr != mChildPanel.end(); ++itr ) + { + bool bPanelVisible = (*itr)->hightlightAndHide( aFilter ); + if( (*itr)->mPanel ) + mTabContainer->setTabVisibility( (*itr)->mPanel, bPanelVisible ); + bVisible |= bPanelVisible; + } + + return bVisible; +} + +ll::statusbar::SearchableItem::SearchableItem() + : mMenu(0) + , mCtrl(0) + , mWasHiddenBySearch( false ) +{ } + +void ll::statusbar::SearchableItem::setNotHighlighted( ) +{ + for( tSearchableItemList::iterator itr = mChildren.begin(); itr != mChildren.end(); ++itr ) + (*itr)->setNotHighlighted( ); + + if( mCtrl ) + { + mCtrl->setHighlighted( false ); + + if( mWasHiddenBySearch ) + mMenu->setVisible( TRUE ); + } +} + +bool ll::statusbar::SearchableItem::hightlightAndHide(LLWString const &aFilter, bool hide) +{ + if ((mMenu && !mMenu->getVisible() && !mWasHiddenBySearch) || dynamic_cast<LLMenuItemTearOffGL*>(mMenu)) + return false; + + setNotHighlighted( ); + + if( aFilter.empty() ) + { + if( mCtrl ) + mCtrl->setHighlighted( false ); + return true; + } + + bool bHighlighted(!hide); + if( mLabel.find( aFilter ) != LLWString::npos ) + { + if( mCtrl ) + mCtrl->setHighlighted( true ); + bHighlighted = true; + } + + bool bVisible(false); + for (tSearchableItemList::iterator itr = mChildren.begin(); itr != mChildren.end(); ++itr) + bVisible |= (*itr)->hightlightAndHide(aFilter, !bHighlighted); + + if (mCtrl && !bVisible && !bHighlighted) + { + mWasHiddenBySearch = true; + mMenu->setVisible(FALSE); + } + return bVisible || bHighlighted; +} diff --git a/indra/newview/llsearchableui.h b/indra/newview/llsearchableui.h new file mode 100644 index 0000000000000000000000000000000000000000..9741557e49ea7b113ec74ce281e2803c727ec28c --- /dev/null +++ b/indra/newview/llsearchableui.h @@ -0,0 +1,121 @@ +/** +* @file llsearchableui.h +* +* $LicenseInfo:firstyear=2019&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2019, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +* $/LicenseInfo$ +*/ + +#ifndef LL_SEARCHABLE_UI_H +#define LL_SEARCHABLE_UI_H + +class LLMenuItemGL; +class LLView; +class LLPanel; +class LLTabContainer; + +#include "llsearchablecontrol.h" + +namespace ll +{ + namespace prefs + { + struct SearchableItem; + struct PanelData; + struct TabContainerData; + + typedef boost::shared_ptr< SearchableItem > SearchableItemPtr; + typedef boost::shared_ptr< PanelData > PanelDataPtr; + typedef boost::shared_ptr< TabContainerData > TabContainerDataPtr; + + typedef std::vector< TabContainerData > tTabContainerDataList; + typedef std::vector< SearchableItemPtr > tSearchableItemList; + typedef std::vector< PanelDataPtr > tPanelDataList; + + struct SearchableItem + { + LLWString mLabel; + LLView const *mView; + ll::ui::SearchableControl const *mCtrl; + + std::vector< boost::shared_ptr< SearchableItem > > mChildren; + + virtual ~SearchableItem(); + + void setNotHighlighted(); + virtual bool hightlightAndHide( LLWString const &aFilter ); + }; + + struct PanelData + { + LLPanel const *mPanel; + std::string mLabel; + + std::vector< boost::shared_ptr< SearchableItem > > mChildren; + std::vector< boost::shared_ptr< PanelData > > mChildPanel; + + virtual ~PanelData(); + + virtual bool hightlightAndHide( LLWString const &aFilter ); + }; + + struct TabContainerData: public PanelData + { + LLTabContainer *mTabContainer; + virtual bool hightlightAndHide( LLWString const &aFilter ); + }; + + struct SearchData + { + TabContainerDataPtr mRootTab; + LLWString mLastFilter; + }; + } + namespace statusbar + { + struct SearchableItem; + + typedef boost::shared_ptr< SearchableItem > SearchableItemPtr; + + typedef std::vector< SearchableItemPtr > tSearchableItemList; + + struct SearchableItem + { + LLWString mLabel; + LLMenuItemGL *mMenu; + tSearchableItemList mChildren; + ll::ui::SearchableControl const *mCtrl; + bool mWasHiddenBySearch; + + SearchableItem(); + + void setNotHighlighted( ); + bool hightlightAndHide( LLWString const &aFilter, bool hide = true ); + }; + + struct SearchData + { + SearchableItemPtr mRootMenu; + LLWString mLastFilter; + }; + } +} + +#endif diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index b36df244f875f9ca6614da66622188e1c0a38146..90f8f84ea4c3081e5b994975f2538a4305391e50 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -96,6 +96,7 @@ #include "llviewershadermgr.h" #include "llpanelface.h" #include "llglheaders.h" +#include "llinventoryobserver.h" LLViewerObject* getSelectedParentObject(LLViewerObject *object) ; // @@ -180,7 +181,7 @@ LLSelectMgr::LLSelectMgr() sHighlightThickness = gSavedSettings.getF32("SelectionHighlightThickness"); sHighlightUScale = gSavedSettings.getF32("SelectionHighlightUScale"); sHighlightVScale = gSavedSettings.getF32("SelectionHighlightVScale"); - sHighlightAlpha = gSavedSettings.getF32("SelectionHighlightAlpha"); + sHighlightAlpha = gSavedSettings.getF32("SelectionHighlightAlpha") * 2; sHighlightAlphaTest = gSavedSettings.getF32("SelectionHighlightAlphaTest"); sHighlightUAnim = gSavedSettings.getF32("SelectionHighlightUAnim"); sHighlightVAnim = gSavedSettings.getF32("SelectionHighlightVAnim"); @@ -1656,6 +1657,7 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid) // * Can just apply the texture and be done with it. objectp->setTEImage(te, LLViewerTextureManager::getFetchedTexture(mImageID, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); } + return true; } }; @@ -1855,6 +1857,7 @@ BOOL LLSelectMgr::selectionRevertTextures() else { object->setTEImage(te, LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)); + } } } @@ -3861,6 +3864,14 @@ BOOL LLSelectMgr::selectGetAggregateTexturePermissions(LLAggregatePermissions& r return TRUE; } +BOOL LLSelectMgr::isSelfAvatarSelected() +{ + if (mAllowSelectAvatar) + { + return (getSelection()->getObjectCount() == 1) && (getSelection()->getFirstRootObject() == gAgentAvatarp); + } + return FALSE; +} //-------------------------------------------------------------------- // Duplicate objects @@ -3883,6 +3894,17 @@ void LLSelectMgr::selectDuplicate(const LLVector3& offset, BOOL select_copy) make_ui_sound("UISndInvalidOp"); return; } + if (!canDuplicate()) + { + LLSelectNode* node = getSelection()->getFirstRootNode(NULL, true); + if (node) + { + LLSD args; + args["OBJ_NAME"] = node->mName; + LLNotificationsUtil::add("NoCopyPermsNoObject", args); + return; + } + } LLDuplicateData data; data.offset = offset; @@ -5838,6 +5860,84 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud) gGL.scalef(cur_zoom, cur_zoom, cur_zoom); } + bool wireframe_selection = (gFloaterTools && gFloaterTools->getVisible()) || LLSelectMgr::sRenderHiddenSelections; + F32 fogCfx = (F32)llclamp((LLSelectMgr::getInstance()->getSelectionCenterGlobal() - gAgentCamera.getCameraPositionGlobal()).magVec() / (LLSelectMgr::getInstance()->getBBoxOfSelection().getExtentLocal().magVec() * 4), 0.0, 1.0); + + static LLColor4 sParentColor = LLColor4(sSilhouetteParentColor[VRED], sSilhouetteParentColor[VGREEN], sSilhouetteParentColor[VBLUE], LLSelectMgr::sHighlightAlpha); + static LLColor4 sChildColor = LLColor4(sSilhouetteChildColor[VRED], sSilhouetteChildColor[VGREEN], sSilhouetteChildColor[VBLUE], LLSelectMgr::sHighlightAlpha); + + auto renderMeshSelection_f = [fogCfx, wireframe_selection](LLSelectNode* node, LLViewerObject* objectp, LLColor4 hlColor) + { + //Need to because crash on ATI 3800 (and similar cards) MAINT-5018 + LLGLDisable multisample(LLPipeline::RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0); + + LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr; + + if (shader) + { + gDebugProgram.bind(); + } + + gGL.matrixMode(LLRender::MM_MODELVIEW); + gGL.pushMatrix(); + + BOOL is_hud_object = objectp->isHUDAttachment(); + + if (!is_hud_object) + { + gGL.loadIdentity(); + gGL.multMatrix(gGLModelView); + } + + if (objectp->mDrawable->isActive()) + { + gGL.multMatrix((F32*)objectp->getRenderMatrix().mMatrix); + } + else if (!is_hud_object) + { + LLVector3 trans = objectp->getRegion()->getOriginAgent(); + gGL.translatef(trans.mV[0], trans.mV[1], trans.mV[2]); + } + + bool bRenderHidenSelection = node->isTransient() ? false : LLSelectMgr::sRenderHiddenSelections; + + + LLVOVolume* vobj = objectp->mDrawable->getVOVolume(); + if (vobj) + { + LLVertexBuffer::unbind(); + gGL.pushMatrix(); + gGL.multMatrix((F32*)vobj->getRelativeXform().mMatrix); + + if (objectp->mDrawable->isState(LLDrawable::RIGGED)) + { + vobj->updateRiggedVolume(true); + } + } + + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + + S32 num_tes = llmin((S32)objectp->getNumTEs(), (S32)objectp->getNumFaces()); // avatars have TEs but no faces + for (S32 te = 0; te < num_tes; ++te) + { + if (node->isTESelected(te)) + { + objectp->mDrawable->getFace(te)->renderOneWireframe(hlColor, fogCfx, wireframe_selection, bRenderHidenSelection, nullptr != shader); + } + } + + gGL.popMatrix(); + gGL.popMatrix(); + + glLineWidth(1.f); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + + if (shader) + { + shader->bind(); + } + }; + if (mSelectedObjects->getNumNodes()) { LLUUID inspect_item_id= LLUUID::null; @@ -5855,9 +5955,6 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud) } } - bool wireframe_selection = (gFloaterTools && gFloaterTools->getVisible()) || LLSelectMgr::sRenderHiddenSelections; - F32 fogCfx = (F32)llclamp((LLSelectMgr::getInstance()->getSelectionCenterGlobal() - gAgentCamera.getCameraPositionGlobal()).magVec() / (LLSelectMgr::getInstance()->getBBoxOfSelection().getExtentLocal().magVec() * 4), 0.0, 1.0); - LLUUID focus_item_id = LLViewerMediaFocus::getInstance()->getFocusedObjectID(); for (S32 pass = 0; pass < 2; pass++) { @@ -5865,33 +5962,28 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud) iter != mSelectedObjects->end(); iter++) { LLSelectNode* node = *iter; + + if (getTEMode() && !node->hasSelectedTE()) + continue; + LLViewerObject* objectp = node->getObject(); if (!objectp) continue; - if(getTEMode() && !node->hasSelectedTE()) - continue; - if (objectp->mDrawable && objectp->mDrawable->getVOVolume() && objectp->mDrawable->getVOVolume()->isMesh()) { - S32 num_tes = llmin((S32)objectp->getNumTEs(), (S32)objectp->getNumFaces()); // avatars have TEs but no faces - for (S32 te = 0; te < num_tes; ++te) + LLColor4 hlColor = objectp->isRootEdit() ? sParentColor : sChildColor; + if (objectp->getID() == inspect_item_id) { - if (!getTEMode()) - { - objectp->mDrawable->getFace(te)->renderOneWireframe( - LLColor4(sSilhouetteParentColor[VRED], sSilhouetteParentColor[VGREEN], sSilhouetteParentColor[VBLUE], LLSelectMgr::sHighlightAlpha * 2) - , fogCfx, wireframe_selection, node->isTransient() ? FALSE : LLSelectMgr::sRenderHiddenSelections); - } - else if(node->isTESelected(te)) - { - objectp->mDrawable->getFace(te)->renderOneWireframe( - LLColor4(sSilhouetteParentColor[VRED], sSilhouetteParentColor[VGREEN], sSilhouetteParentColor[VBLUE], LLSelectMgr::sHighlightAlpha * 2) - , fogCfx, wireframe_selection, node->isTransient() ? FALSE : LLSelectMgr::sRenderHiddenSelections); - } + hlColor = sHighlightInspectColor; } + else if (node->isTransient()) + { + hlColor = sContextSilhouetteColor; + } + renderMeshSelection_f(node, objectp, hlColor); } else { @@ -5944,14 +6036,20 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud) { continue; } - - if (subtracting_from_selection) + + LLColor4 highlight_color = objectp->isRoot() ? sHighlightParentColor : sHighlightChildColor; + if (objectp->mDrawable + && objectp->mDrawable->getVOVolume() + && objectp->mDrawable->getVOVolume()->isMesh()) + { + renderMeshSelection_f(node, objectp, subtracting_from_selection ? LLColor4::red : highlight_color); + } + else if (subtracting_from_selection) { node->renderOneSilhouette(LLColor4::red); } else if (!objectp->isSelected()) { - LLColor4 highlight_color = objectp->isRoot() ? sHighlightParentColor : sHighlightChildColor; node->renderOneSilhouette(highlight_color); } } @@ -6450,7 +6548,7 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color) gGL.texCoord2fv(tc[0].mV); gGL.vertex3fv( v[0].mV ); - gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2); + gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha); gGL.texCoord2fv( tc[1].mV ); gGL.vertex3fv( v[1].mV ); @@ -6460,7 +6558,7 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color) gGL.vertex3fv( v[2].mV ); - gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2); + gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha); gGL.texCoord2fv( tc[1].mV ); gGL.vertex3fv( v[1].mV ); @@ -6686,8 +6784,28 @@ void LLSelectMgr::pauseAssociatedAvatars() mSelectedObjects->mSelectType = getSelectTypeForObject(object); + bool is_attached = false; if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT && - isAgentAvatarValid() && object->getParent() != NULL) + isAgentAvatarValid()) + { + // Selection can be obsolete, confirm that this is an attachment + LLViewerObject* parent = (LLViewerObject*)object->getParent(); + while (parent != NULL) + { + if (parent->isAvatar()) + { + is_attached = true; + break; + } + else + { + parent = (LLViewerObject*)parent->getParent(); + } + } + } + + + if (is_attached) { if (object->isAnimatedObject()) { @@ -6705,14 +6823,12 @@ void LLSelectMgr::pauseAssociatedAvatars() mPauseRequests.push_back(gAgentAvatarp->requestPause()); } } - else + else if (object && object->isAnimatedObject() && object->getControlAvatar()) { - if (object && object->isAnimatedObject() && object->getControlAvatar()) - { - // Is a non-attached animated object. Pause the control avatar. - mPauseRequests.push_back(object->getControlAvatar()->requestPause()); - } + // Is a non-attached animated object. Pause the control avatar. + mPauseRequests.push_back(object->getControlAvatar()->requestPause()); } + } } diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index ce0fee88036d80b5d45bec08e02b1c9b21353851..3e8bfdb00e597bf0953a493a2ab4c8542a7ce603 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -714,6 +714,8 @@ class LLSelectMgr : public LLEditMenuHandler, public LLSingleton<LLSelectMgr> LLPermissions* findObjectPermissions(const LLViewerObject* object); + BOOL isSelfAvatarSelected(); + void selectDelete(); // Delete on simulator void selectForceDelete(); // just delete, no into trash void selectDuplicate(const LLVector3& offset, BOOL select_copy); // Duplicate on simulator diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 689734e36ab936d43c3d070fd16ee92eb7aa183d..ea7e6497927e8155e6520b69d177300311a035fe 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -564,6 +564,7 @@ void LLSidepanelInventory::updateVerbs() mWearBtn->setEnabled(FALSE); mPlayBtn->setVisible(FALSE); mPlayBtn->setEnabled(FALSE); + mPlayBtn->setToolTip(std::string("")); mTeleportBtn->setVisible(FALSE); mTeleportBtn->setEnabled(FALSE); mShopBtn->setVisible(TRUE); @@ -588,11 +589,23 @@ void LLSidepanelInventory::updateVerbs() mShopBtn->setVisible(FALSE); break; case LLInventoryType::IT_SOUND: + mPlayBtn->setVisible(TRUE); + mPlayBtn->setEnabled(TRUE); + mPlayBtn->setToolTip(LLTrans::getString("InventoryPlaySoundTooltip")); + mShopBtn->setVisible(FALSE); + break; case LLInventoryType::IT_GESTURE: + mPlayBtn->setVisible(TRUE); + mPlayBtn->setEnabled(TRUE); + mPlayBtn->setToolTip(LLTrans::getString("InventoryPlayGestureTooltip")); + mShopBtn->setVisible(FALSE); + break; case LLInventoryType::IT_ANIMATION: mPlayBtn->setVisible(TRUE); mPlayBtn->setEnabled(TRUE); - mShopBtn->setVisible(FALSE); + mPlayBtn->setEnabled(TRUE); + mPlayBtn->setToolTip(LLTrans::getString("InventoryPlayAnimationTooltip")); + mShopBtn->setVisible(FALSE); break; case LLInventoryType::IT_LANDMARK: mTeleportBtn->setVisible(TRUE); diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp index 5a40af14a3c8239485915626280fa58aef838361..f5fea9decef5f9593eee9eef255b1064fe60f40c 100644 --- a/indra/newview/llsnapshotlivepreview.cpp +++ b/indra/newview/llsnapshotlivepreview.cpp @@ -34,7 +34,6 @@ #include "lleconomy.h" #include "llfloaterperms.h" #include "llfloaterreg.h" -#include "llfloaterfacebook.h" #include "llfloaterflickr.h" #include "llfloatertwitter.h" #include "llimagefilter.h" @@ -572,7 +571,7 @@ void LLSnapshotLivePreview::generateThumbnailImage(BOOL force_update) if (mThumbnailSubsampled) { - // The thumbnail is be a subsampled version of the preview (used in SL Share previews, i.e. Flickr, Twitter, Facebook) + // The thumbnail is be a subsampled version of the preview (used in SL Share previews, i.e. Flickr, Twitter) raw->resize( mPreviewImage->getWidth(), mPreviewImage->getHeight(), mPreviewImage->getComponents()); @@ -638,7 +637,7 @@ LLViewerTexture* LLSnapshotLivePreview::getBigThumbnailImage() if (raw) { - // The big thumbnail is a new filtered version of the preview (used in SL Share previews, i.e. Flickr, Twitter, Facebook) + // The big thumbnail is a new filtered version of the preview (used in SL Share previews, i.e. Flickr, Twitter) mBigThumbnailWidth = mPreviewImage->getWidth(); mBigThumbnailHeight = mPreviewImage->getHeight(); raw->resize( mBigThumbnailWidth, diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index 43c0fbd53acf2bca01ec63f426af5cd62f480563..f3c270a97be9a69c51f64742d842025d75318bc4 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -81,6 +81,8 @@ #include "llparcel.h" #include "llstring.h" #include "message.h" +#include "llsearchableui.h" +#include "llsearcheditor.h" // system includes #include <iomanip> @@ -113,7 +115,9 @@ LLStatusBar::LLStatusBar(const LLRect& rect) mBalance(0), mHealth(100), mSquareMetersCredit(0), - mSquareMetersCommitted(0) + mSquareMetersCommitted(0), + mFilterEdit(NULL), // Edit for filtering + mSearchPanel(NULL) // Panel for filtering { setRect(rect); @@ -239,6 +243,16 @@ BOOL LLStatusBar::postBuild() mPanelNearByMedia->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT); mPanelNearByMedia->setVisible(FALSE); + // Hook up and init for filtering + mFilterEdit = getChild<LLSearchEditor>( "search_menu_edit" ); + mSearchPanel = getChild<LLPanel>( "menu_search_panel" ); + + mSearchPanel->setVisible(gSavedSettings.getBOOL("MenuSearch")); + mFilterEdit->setKeystrokeCallback(boost::bind(&LLStatusBar::onUpdateFilterTerm, this)); + mFilterEdit->setCommitCallback(boost::bind(&LLStatusBar::onUpdateFilterTerm, this)); + collectSearchableItems(); + gSavedSettings.getControl("MenuSearch")->getCommitSignal()->connect(boost::bind(&LLStatusBar::updateMenuSearchVisibility, this, _2)); + return TRUE; } @@ -318,6 +332,7 @@ void LLStatusBar::setVisibleForMouselook(bool visible) mMediaToggle->setVisible(visible); mSGBandwidth->setVisible(visible); mSGPacketLoss->setVisible(visible); + mSearchPanel->setVisible(visible && gSavedSettings.getBOOL("MenuSearch")); setBackgroundVisible(visible); mIconPresets->setVisible(visible); } @@ -358,6 +373,12 @@ void LLStatusBar::setBalance(S32 balance) balance_bg_view->setShape(balance_bg_rect); } + // If the search panel is shown, move this according to the new balance width. Parcel text will reshape itself in setParcelInfoText + if (mSearchPanel && mSearchPanel->getVisible()) + { + updateMenuSearchPosition(); + } + if (mBalance && (fabs((F32)(mBalance - balance)) > gSavedSettings.getF32("UISndMoneyChangeThreshold"))) { if (mBalance > balance) @@ -570,6 +591,75 @@ void LLStatusBar::onVolumeChanged(const LLSD& newvalue) refresh(); } +void LLStatusBar::onUpdateFilterTerm() +{ + LLWString searchValue = utf8str_to_wstring( mFilterEdit->getValue() ); + LLWStringUtil::toLower( searchValue ); + + if( !mSearchData || mSearchData->mLastFilter == searchValue ) + return; + + mSearchData->mLastFilter = searchValue; + + mSearchData->mRootMenu->hightlightAndHide( searchValue ); + gMenuBarView->needsArrange(); +} + +void collectChildren( LLMenuGL *aMenu, ll::statusbar::SearchableItemPtr aParentMenu ) +{ + for( U32 i = 0; i < aMenu->getItemCount(); ++i ) + { + LLMenuItemGL *pMenu = aMenu->getItem( i ); + + ll::statusbar::SearchableItemPtr pItem( new ll::statusbar::SearchableItem ); + pItem->mCtrl = pMenu; + pItem->mMenu = pMenu; + pItem->mLabel = utf8str_to_wstring( pMenu->ll::ui::SearchableControl::getSearchText() ); + LLWStringUtil::toLower( pItem->mLabel ); + aParentMenu->mChildren.push_back( pItem ); + + LLMenuItemBranchGL *pBranch = dynamic_cast< LLMenuItemBranchGL* >( pMenu ); + if( pBranch ) + collectChildren( pBranch->getBranch(), pItem ); + } + +} + +void LLStatusBar::collectSearchableItems() +{ + mSearchData.reset( new ll::statusbar::SearchData ); + ll::statusbar::SearchableItemPtr pItem( new ll::statusbar::SearchableItem ); + mSearchData->mRootMenu = pItem; + collectChildren( gMenuBarView, pItem ); +} + +void LLStatusBar::updateMenuSearchVisibility(const LLSD& data) +{ + bool visible = data.asBoolean(); + mSearchPanel->setVisible(visible); + if (!visible) + { + mFilterEdit->setText(LLStringUtil::null); + onUpdateFilterTerm(); + } + else + { + updateMenuSearchPosition(); + } +} + +void LLStatusBar::updateMenuSearchPosition() +{ + const S32 HPAD = 12; + LLRect balanceRect = getChildView("balance_bg")->getRect(); + LLRect searchRect = mSearchPanel->getRect(); + S32 w = searchRect.getWidth(); + searchRect.mLeft = balanceRect.mLeft - w - HPAD; + searchRect.mRight = searchRect.mLeft + w; + mSearchPanel->setShape( searchRect ); +} + + // Implements secondlife:///app/balance/request to request a L$ balance // update via UDP message system. JC class LLBalanceHandler : public LLCommandHandler diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h index a3326e752a93f89e1ca4f0fcc022e2e67e6fe21e..403d590acacd2acef38f27b8281256448dc0ef78 100644 --- a/indra/newview/llstatusbar.h +++ b/indra/newview/llstatusbar.h @@ -45,7 +45,15 @@ class LLPanelPresetsPulldown; class LLPanelVolumePulldown; class LLPanelNearByMedia; class LLIconCtrl; +class LLSearchEditor; +namespace ll +{ + namespace statusbar + { + struct SearchData; + } +} class LLStatusBar : public LLPanel { @@ -99,6 +107,15 @@ class LLStatusBar static void onClickMediaToggle(void* data); static void onClickBalance(void* data); + LLSearchEditor *mFilterEdit; + LLPanel *mSearchPanel; + void onUpdateFilterTerm(); + + std::unique_ptr< ll::statusbar::SearchData > mSearchData; + void collectSearchableItems(); + void updateMenuSearchVisibility( const LLSD& data ); + void updateMenuSearchPosition(); + private: LLTextBox *mTextTime; diff --git a/indra/newview/llsurfacepatch.cpp b/indra/newview/llsurfacepatch.cpp index d28a7cc048859852fc0622d4d3f63881eeb52b17..f6cf714db4c8d7b34ab649c5adda311b7cd4c5bf 100644 --- a/indra/newview/llsurfacepatch.cpp +++ b/indra/newview/llsurfacepatch.cpp @@ -99,7 +99,7 @@ void LLSurfacePatch::dirty() } else { - LL_WARNS() << "No viewer object for this surface patch!" << LL_ENDL; + LL_WARNS("Terrain") << "No viewer object for this surface patch!" << LL_ENDL; } mDirtyZStats = TRUE; diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 633e0254789b32220fb1f5beb1f9c855d1149a14..e5af47ab6cb69111f161585c53e9700b2bd1bed7 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -825,10 +825,10 @@ void LLTextureCacheWorker::endWork(S32 param, bool aborted) LLTextureCache::LLTextureCache(bool threaded) : LLWorkerThread("TextureCache", threaded), - mWorkersMutex(NULL), - mHeaderMutex(NULL), - mListMutex(NULL), - mFastCacheMutex(NULL), + mWorkersMutex(), + mHeaderMutex(), + mListMutex(), + mFastCacheMutex(), mHeaderAPRFile(NULL), mReadOnly(TRUE), //do not allow to change the texture cache until setReadOnly() is called. mTexturesSizeTotal(0), @@ -1038,11 +1038,11 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL texture_cache { llassert_always(getPending() == 0) ; //should not start accessing the texture cache before initialized. - S64 header_size = (max_size / 100) * 36; //0.36 * max_size - S64 max_entries = header_size / (TEXTURE_CACHE_ENTRY_SIZE + TEXTURE_FAST_CACHE_ENTRY_SIZE); + S64 entries_size = (max_size * 36) / 100; //0.36 * max_size + S64 max_entries = entries_size / (TEXTURE_CACHE_ENTRY_SIZE + TEXTURE_FAST_CACHE_ENTRY_SIZE); sCacheMaxEntries = (S32)(llmin((S64)sCacheMaxEntries, max_entries)); - header_size = sCacheMaxEntries * TEXTURE_CACHE_ENTRY_SIZE; - max_size -= header_size; + entries_size = sCacheMaxEntries * (TEXTURE_CACHE_ENTRY_SIZE + TEXTURE_FAST_CACHE_ENTRY_SIZE); + max_size -= entries_size; if (sCacheMaxTexturesSize > 0) sCacheMaxTexturesSize = llmin(sCacheMaxTexturesSize, max_size); else diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h index 987b9375c04982132563524ccf670cf8686ba7b7..81ea7aeee2d98057c70f25b486bfc45b95af1d5e 100644 --- a/indra/newview/lltexturecache.h +++ b/indra/newview/lltexturecache.h @@ -221,7 +221,7 @@ class LLTextureCache : public LLWorkerThread typedef std::map<LLUUID,S32> size_map_t; size_map_t mTexturesSizeMap; S64 mTexturesSizeTotal; - LLAtomic32<BOOL> mDoPurge; + LLAtomicBool mDoPurge; typedef std::map<S32, Entry> idx_entry_map_t; idx_entry_map_t mUpdatedEntryMap; diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index a5a2eec24613cd99695fe3968b4a78de472f6fa3..8a2fc881a94c05240624266ccfbbb7071df2a7e1 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -32,6 +32,7 @@ #include "llrender.h" #include "llagent.h" #include "llviewertexturelist.h" +#include "llselectmgr.h" #include "llcheckboxctrl.h" #include "llcombobox.h" #include "llbutton.h" @@ -70,6 +71,8 @@ #include "lllocalbitmaps.h" #include "llerror.h" +#include "llavatarappearancedefines.h" + static const F32 CONTEXT_CONE_IN_ALPHA = 0.0f; static const F32 CONTEXT_CONE_OUT_ALPHA = 1.f; static const F32 CONTEXT_FADE_TIME = 0.08f; @@ -118,7 +121,8 @@ LLFloaterTexturePicker::LLFloaterTexturePicker( mOnFloaterCommitCallback(NULL), mOnFloaterCloseCallback(NULL), mSetImageAssetIDCallback(NULL), - mOnUpdateImageStatsCallback(NULL) + mOnUpdateImageStatsCallback(NULL), + mBakeTextureEnabled(FALSE) { buildFromFile("floater_texture_ctrl.xml"); mCanApplyImmediately = can_apply_immediately; @@ -131,31 +135,52 @@ LLFloaterTexturePicker::~LLFloaterTexturePicker() void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selection /*=true*/) { - if( mImageAssetID != image_id && mActive) + if( ((mImageAssetID != image_id) || mTentative) && mActive) { mNoCopyTextureSelected = FALSE; mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here? mImageAssetID = image_id; - LLUUID item_id = findItemID(mImageAssetID, FALSE); - if (item_id.isNull()) + + if (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(mImageAssetID)) { - mInventoryPanel->getRootFolder()->clearSelection(); + if ( mBakeTextureEnabled && mModeSelector->getSelectedIndex() != 2) + { + mModeSelector->setSelectedIndex(2, 0); + onModeSelect(0,this); + } } else { - LLInventoryItem* itemp = gInventory.getItem(image_id); - if (itemp && !itemp->getPermissions().allowCopyBy(gAgent.getID())) + if (mModeSelector->getSelectedIndex() == 2) { - // no copy texture - getChild<LLUICtrl>("apply_immediate_check")->setValue(FALSE); - mNoCopyTextureSelected = TRUE; + mModeSelector->setSelectedIndex(0, 0); + onModeSelect(0,this); + } + + LLUUID item_id = findItemID(mImageAssetID, FALSE); + if (item_id.isNull()) + { + mInventoryPanel->getRootFolder()->clearSelection(); + } + else + { + LLInventoryItem* itemp = gInventory.getItem(image_id); + if (itemp && !itemp->getPermissions().allowCopyBy(gAgent.getID())) + { + // no copy texture + getChild<LLUICtrl>("apply_immediate_check")->setValue(FALSE); + mNoCopyTextureSelected = TRUE; + } } - } - if (set_selection) - { - mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO); + if (set_selection) + { + mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO); + } } + + + } } @@ -341,6 +366,10 @@ BOOL LLFloaterTexturePicker::postBuild() mInventoryPanel = getChild<LLInventoryPanel>("inventory panel"); + mModeSelector = getChild<LLRadioGroup>("mode_selection"); + mModeSelector->setCommitCallback(onModeSelect, this); + mModeSelector->setSelectedIndex(0, 0); + if(mInventoryPanel) { U32 filter_types = 0x0; @@ -366,16 +395,15 @@ BOOL LLFloaterTexturePicker::postBuild() // don't put keyboard focus on selected item, because the selection callback // will assume that this was user input - if(!mImageAssetID.isNull()) + + + + if (!mImageAssetID.isNull()) { mInventoryPanel->setSelection(findItemID(mImageAssetID, FALSE), TAKE_FOCUS_NO); } } - mModeSelector = getChild<LLRadioGroup>("mode_selection"); - mModeSelector->setCommitCallback(onModeSelect, this); - mModeSelector->setSelectedIndex(0, 0); - childSetAction("l_add_btn", LLFloaterTexturePicker::onBtnAdd, this); childSetAction("l_rem_btn", LLFloaterTexturePicker::onBtnRemove, this); childSetAction("l_upl_btn", LLFloaterTexturePicker::onBtnUpload, this); @@ -404,6 +432,10 @@ BOOL LLFloaterTexturePicker::postBuild() LLToolPipette::getInstance()->setToolSelectCallback(boost::bind(&LLFloaterTexturePicker::onTextureSelect, this, _1)); + getChild<LLComboBox>("l_bake_use_texture_combo_box")->setCommitCallback(onBakeTextureSelect, this); + getChild<LLCheckBoxCtrl>("hide_base_mesh_region")->setCommitCallback(onHideBaseMeshRegionCheck, this); + + setBakeTextureEnabled(FALSE); return TRUE; } @@ -478,7 +510,24 @@ void LLFloaterTexturePicker::draw() mTexturep = NULL; if(mImageAssetID.notNull()) { - mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID); + LLPointer<LLViewerFetchedTexture> texture = NULL; + + if (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(mImageAssetID)) + { + LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getFirstObject(); + if (obj) + { + LLViewerTexture* viewerTexture = obj->getBakedTextureForMagicId(mImageAssetID); + texture = viewerTexture ? dynamic_cast<LLViewerFetchedTexture*>(viewerTexture) : NULL; + } + } + + if (texture.isNull()) + { + texture = LLViewerTextureManager::getFetchedTexture(mImageAssetID); + } + + mTexturep = texture; mTexturep->setBoostLevel(LLGLTexture::BOOST_PREVIEW); } @@ -697,6 +746,7 @@ void LLFloaterTexturePicker::onBtnSelect(void* userdata) local_id = LLLocalBitmapMgr::getWorldID(temp_id); } } + if (self->mOnFloaterCommitCallback) { self->mOnFloaterCommitCallback(LLTextureCtrl::TEXTURE_SELECT, local_id); @@ -760,22 +810,81 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem void LLFloaterTexturePicker::onModeSelect(LLUICtrl* ctrl, void *userdata) { LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata; - bool mode = (self->mModeSelector->getSelectedIndex() == 0); + int mode = self->mModeSelector->getSelectedIndex(); - self->getChild<LLButton>("Default")->setVisible(mode); - self->getChild<LLButton>("Blank")->setVisible(mode); - self->getChild<LLButton>("None")->setVisible(mode); - self->getChild<LLButton>("Pipette")->setVisible(mode); - self->getChild<LLFilterEditor>("inventory search editor")->setVisible(mode); - self->getChild<LLInventoryPanel>("inventory panel")->setVisible(mode); + self->getChild<LLButton>("Default")->setVisible(mode == 0); + self->getChild<LLButton>("Blank")->setVisible(mode == 0); + self->getChild<LLButton>("None")->setVisible(mode == 0); + self->getChild<LLButton>("Pipette")->setVisible(mode == 0); + self->getChild<LLFilterEditor>("inventory search editor")->setVisible(mode == 0); + self->getChild<LLInventoryPanel>("inventory panel")->setVisible(mode == 0); /*self->getChild<LLCheckBox>("show_folders_check")->setVisible(mode); no idea under which conditions the above is even shown, needs testing. */ - self->getChild<LLButton>("l_add_btn")->setVisible(!mode); - self->getChild<LLButton>("l_rem_btn")->setVisible(!mode); - self->getChild<LLButton>("l_upl_btn")->setVisible(!mode); - self->getChild<LLScrollListCtrl>("l_name_list")->setVisible(!mode); + self->getChild<LLButton>("l_add_btn")->setVisible(mode == 1); + self->getChild<LLButton>("l_rem_btn")->setVisible(mode == 1); + self->getChild<LLButton>("l_upl_btn")->setVisible(mode == 1); + self->getChild<LLScrollListCtrl>("l_name_list")->setVisible(mode == 1); + + self->getChild<LLComboBox>("l_bake_use_texture_combo_box")->setVisible(mode == 2); + self->getChild<LLCheckBoxCtrl>("hide_base_mesh_region")->setVisible(false);// mode == 2); + + if (mode == 2) + { + self->stopUsingPipette(); + + S8 val = -1; + + LLUUID imageID = self->mImageAssetID; + if (imageID == IMG_USE_BAKED_HEAD) + { + val = 0; + } + else if (imageID == IMG_USE_BAKED_UPPER) + { + val = 1; + } + else if (imageID == IMG_USE_BAKED_LOWER) + { + val = 2; + } + else if (imageID == IMG_USE_BAKED_EYES) + { + val = 3; + } + else if (imageID == IMG_USE_BAKED_SKIRT) + { + val = 4; + } + else if (imageID == IMG_USE_BAKED_HAIR) + { + val = 5; + } + else if (imageID == IMG_USE_BAKED_LEFTARM) + { + val = 6; + } + else if (imageID == IMG_USE_BAKED_LEFTLEG) + { + val = 7; + } + else if (imageID == IMG_USE_BAKED_AUX1) + { + val = 8; + } + else if (imageID == IMG_USE_BAKED_AUX2) + { + val = 9; + } + else if (imageID == IMG_USE_BAKED_AUX3) + { + val = 10; + } + + + self->getChild<LLComboBox>("l_bake_use_texture_combo_box")->setSelectedByValue(val, TRUE); + } } // static @@ -896,6 +1005,86 @@ void LLFloaterTexturePicker::onApplyImmediateCheck(LLUICtrl* ctrl, void *user_da picker->commitIfImmediateSet(); } +//static +void LLFloaterTexturePicker::onBakeTextureSelect(LLUICtrl* ctrl, void *user_data) +{ + LLFloaterTexturePicker* self = (LLFloaterTexturePicker*)user_data; + LLComboBox* combo_box = (LLComboBox*)ctrl; + + S8 type = combo_box->getValue().asInteger(); + + LLUUID imageID = self->mDefaultImageAssetID; + if (type == 0) + { + imageID = IMG_USE_BAKED_HEAD; + } + else if (type == 1) + { + imageID = IMG_USE_BAKED_UPPER; + } + else if (type == 2) + { + imageID = IMG_USE_BAKED_LOWER; + } + else if (type == 3) + { + imageID = IMG_USE_BAKED_EYES; + } + else if (type == 4) + { + imageID = IMG_USE_BAKED_SKIRT; + } + else if (type == 5) + { + imageID = IMG_USE_BAKED_HAIR; + } + else if (type == 6) + { + imageID = IMG_USE_BAKED_LEFTARM; + } + else if (type == 7) + { + imageID = IMG_USE_BAKED_LEFTLEG; + } + else if (type == 8) + { + imageID = IMG_USE_BAKED_AUX1; + } + else if (type == 9) + { + imageID = IMG_USE_BAKED_AUX2; + } + else if (type == 10) + { + imageID = IMG_USE_BAKED_AUX3; + } + + self->setImageID(imageID); + self->mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here? + + if (!self->mPreviewSettingChanged) + { + self->mCanPreview = gSavedSettings.getBOOL("TextureLivePreview"); + } + else + { + self->mPreviewSettingChanged = false; + } + + if (self->mCanPreview) + { + // only commit intentional selections, not implicit ones + self->commitIfImmediateSet(); + } +} + +//static +void LLFloaterTexturePicker::onHideBaseMeshRegionCheck(LLUICtrl* ctrl, void *user_data) +{ + //LLFloaterTexturePicker* picker = (LLFloaterTexturePicker*)user_data; + //LLCheckBoxCtrl* check_box = (LLCheckBoxCtrl*)ctrl; +} + void LLFloaterTexturePicker::updateFilterPermMask() { //mInventoryPanel->setFilterPermMask( getFilterPermMask() ); Commented out due to no-copy texture loss. @@ -951,6 +1140,28 @@ void LLFloaterTexturePicker::setLocalTextureEnabled(BOOL enabled) mModeSelector->setIndexEnabled(1,enabled); } +void LLFloaterTexturePicker::setBakeTextureEnabled(BOOL enabled) +{ + BOOL changed = (enabled != mBakeTextureEnabled); + + mBakeTextureEnabled = enabled; + mModeSelector->setIndexEnabled(2, enabled); + + if (!mBakeTextureEnabled && (mModeSelector->getSelectedIndex() == 2)) + { + mModeSelector->setSelectedIndex(0, 0); + } + + if (changed && mBakeTextureEnabled && LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(mImageAssetID)) + { + if (mModeSelector->getSelectedIndex() != 2) + { + mModeSelector->setSelectedIndex(2, 0); + } + } + onModeSelect(0, this); +} + void LLFloaterTexturePicker::onTextureSelect( const LLTextureEntry& te ) { LLUUID inventory_item_id = findItemID(te.getID(), TRUE); @@ -1000,7 +1211,8 @@ LLTextureCtrl::LLTextureCtrl(const LLTextureCtrl::Params& p) mImageAssetID(p.image_id), mDefaultImageAssetID(p.default_image_id), mDefaultImageName(p.default_image_name), - mFallbackImage(p.fallback_image) + mFallbackImage(p.fallback_image), + mBakeTextureEnabled(FALSE) { // Default of defaults is white image for diff tex @@ -1096,6 +1308,10 @@ void LLTextureCtrl::setVisible( BOOL visible ) void LLTextureCtrl::setEnabled( BOOL enabled ) { LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterHandle.get(); + if( floaterp ) + { + floaterp->setActive(enabled); + } if( enabled ) { std::string tooltip; @@ -1110,11 +1326,6 @@ void LLTextureCtrl::setEnabled( BOOL enabled ) closeDependentFloater(); } - if( floaterp ) - { - floaterp->setActive(enabled); - } - mCaption->setEnabled( enabled ); LLView::setEnabled( enabled ); @@ -1192,6 +1403,10 @@ void LLTextureCtrl::showPicker(BOOL take_focus) { texture_floaterp->setSetImageAssetIDCallback(boost::bind(&LLTextureCtrl::setImageAssetID, this, _1)); } + if (texture_floaterp) + { + texture_floaterp->setBakeTextureEnabled(mBakeTextureEnabled); + } LLFloater* root_floater = gFloaterView->getParentFloater(this); if (root_floater) @@ -1215,9 +1430,10 @@ void LLTextureCtrl::showPicker(BOOL take_focus) void LLTextureCtrl::closeDependentFloater() { LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterHandle.get(); - if( floaterp ) + if( floaterp && floaterp->isInVisibleChain()) { floaterp->setOwner(NULL); + floaterp->setVisible(FALSE); floaterp->closeFloater(); } } @@ -1366,6 +1582,16 @@ void LLTextureCtrl::setImageAssetID( const LLUUID& asset_id ) } } +void LLTextureCtrl::setBakeTextureEnabled(BOOL enabled) +{ + mBakeTextureEnabled = enabled; + LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterHandle.get(); + if (floaterp) + { + floaterp->setBakeTextureEnabled(enabled); + } +} + BOOL LLTextureCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, @@ -1420,7 +1646,23 @@ void LLTextureCtrl::draw() } else if (!mImageAssetID.isNull()) { - LLPointer<LLViewerFetchedTexture> texture = LLViewerTextureManager::getFetchedTexture(mImageAssetID, FTT_DEFAULT, MIPMAP_YES,LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + LLPointer<LLViewerFetchedTexture> texture = NULL; + + if (LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(mImageAssetID)) + { + LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getFirstObject(); + if (obj) + { + LLViewerTexture* viewerTexture = obj->getBakedTextureForMagicId(mImageAssetID); + texture = viewerTexture ? dynamic_cast<LLViewerFetchedTexture*>(viewerTexture) : NULL; + } + + } + + if (texture.isNull()) + { + texture = LLViewerTextureManager::getFetchedTexture(mImageAssetID, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + } texture->setBoostLevel(LLGLTexture::BOOST_PREVIEW); texture->forceToSaveRawImage(0) ; diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h index 6bcf9c3a7522ec7bc403db126562f0ce184d50db..b2a34a37c4809fa2746cd0343aa8b8884c6e2ff4 100644 --- a/indra/newview/lltexturectrl.h +++ b/indra/newview/lltexturectrl.h @@ -201,6 +201,8 @@ class LLTextureCtrl LLViewerFetchedTexture* getTexture() { return mTexturep; } + void setBakeTextureEnabled(BOOL enabled); + private: BOOL allowDrop(LLInventoryItem* item); BOOL doDrop(LLInventoryItem* item); @@ -237,6 +239,7 @@ class LLTextureCtrl BOOL mShowLoadingPlaceholder; std::string mLoadingPlaceholderString; S32 mLabelWidth; + BOOL mBakeTextureEnabled; }; ////////////////////////////////////////////////////////////////////////////////////////// @@ -326,7 +329,11 @@ class LLFloaterTexturePicker : public LLFloater static void onBtnUpload(void* userdata); static void onLocalScrollCommit(LLUICtrl* ctrl, void* userdata); + static void onBakeTextureSelect(LLUICtrl* ctrl, void *userdata); + static void onHideBaseMeshRegionCheck(LLUICtrl* ctrl, void *userdata); + void setLocalTextureEnabled(BOOL enabled); + void setBakeTextureEnabled(BOOL enabled); protected: LLPointer<LLViewerTexture> mTexturep; @@ -368,11 +375,14 @@ class LLFloaterTexturePicker : public LLFloater bool mCanPreview; bool mPreviewSettingChanged; + texture_selected_callback mTextureSelectedCallback; floater_close_callback mOnFloaterCloseCallback; floater_commit_callback mOnFloaterCommitCallback; set_image_asset_id_callback mSetImageAssetIDCallback; set_on_update_image_stats_callback mOnUpdateImageStatsCallback; + + BOOL mBakeTextureEnabled; }; #endif // LL_LLTEXTURECTRL_H diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index f8849bf9978633aed86db64afaa061340bcf7b2b..f6cb787156cdc8e742614c0ae7d29e3f4e1c54b6 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -66,6 +66,7 @@ bool LLTextureFetchDebugger::sDebuggerEnabled = false ; LLTrace::CountStatHandle<F64> LLTextureFetch::sCacheHit("texture_cache_hit"); LLTrace::CountStatHandle<F64> LLTextureFetch::sCacheAttempt("texture_cache_attempt"); +LLTrace::EventStatHandle<LLUnit<F32, LLUnits::Percent> > LLTextureFetch::sCacheHitRate("texture_cache_hits"); LLTrace::SampleStatHandle<F32Seconds> LLTextureFetch::sCacheReadLatency("texture_cache_read_latency"); LLTrace::SampleStatHandle<F32Seconds> LLTextureFetch::sTexDecodeLatency("texture_decode_latency"); @@ -936,7 +937,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher, mCanUseHTTP(true), mRetryAttempt(0), mActiveCount(0), - mWorkMutex(NULL), + mWorkMutex(), mFirstPacket(0), mLastPacket(-1), mTotalPackets(0), @@ -1311,6 +1312,7 @@ bool LLTextureFetchWorker::doWork(S32 param) LL_DEBUGS(LOG_TXT) << mID << ": Cached. Bytes: " << mFormattedImage->getDataSize() << " Size: " << llformat("%dx%d",mFormattedImage->getWidth(),mFormattedImage->getHeight()) << " Desired Discard: " << mDesiredDiscard << " Desired Size: " << mDesiredSize << LL_ENDL; + record(LLTextureFetch::sCacheHitRate, LLUnits::Ratio::fromValue(1)); } else { @@ -1326,7 +1328,7 @@ bool LLTextureFetchWorker::doWork(S32 param) LL_DEBUGS(LOG_TXT) << mID << ": Not in Cache" << LL_ENDL; setState(LOAD_FROM_NETWORK); } - + record(LLTextureFetch::sCacheHitRate, LLUnits::Ratio::fromValue(0)); // fall through } } @@ -2558,8 +2560,8 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image mDebugPause(FALSE), mPacketCount(0), mBadPacketCount(0), - mQueueMutex(getAPRPool()), - mNetworkQueueMutex(getAPRPool()), + mQueueMutex(), + mNetworkQueueMutex(), mTextureCache(cache), mImageDecodeThread(imagedecodethread), mTextureBandwidth(0), diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h index a2155bde1fbe9b8c970e1902cbc9f2e0d3bef8e8..cdf886859703e13267f87f562ba585ccba6743af 100644 --- a/indra/newview/lltexturefetch.h +++ b/indra/newview/lltexturefetch.h @@ -35,7 +35,6 @@ #include "lluuid.h" #include "llworkerthread.h" #include "lltextureinfo.h" -#include "llapr.h" #include "llimageworker.h" #include "httprequest.h" #include "httpoptions.h" @@ -313,6 +312,7 @@ class LLTextureFetch : public LLWorkerThread static LLTrace::SampleStatHandle<F32Seconds> sCacheReadLatency; static LLTrace::SampleStatHandle<F32Seconds> sTexDecodeLatency; static LLTrace::SampleStatHandle<F32Seconds> sTexFetchLatency; + static LLTrace::EventStatHandle<LLUnit<F32, LLUnits::Percent> > sCacheHitRate; private: LLMutex mQueueMutex; //to protect mRequestMap and mCommands only diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp index f7dc32d0d771cd28650beef6784a90de2a84f2e1..817d1dd7b43c1c0a604ef01931988c27ba608105 100644 --- a/indra/newview/lltoastgroupnotifypanel.cpp +++ b/indra/newview/lltoastgroupnotifypanel.cpp @@ -84,14 +84,14 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(const LLNotificationPtr& notifi //message body const std::string& message = payload["message"].asString(); - std::string timeStr = "["+LLTrans::getString("UTCTimeWeek")+"],[" - +LLTrans::getString("UTCTimeDay")+"] [" - +LLTrans::getString("UTCTimeMth")+"] [" - +LLTrans::getString("UTCTimeYr")+"] [" - +LLTrans::getString("UTCTimeHr")+"]:[" - +LLTrans::getString("UTCTimeMin")+"]:[" - +LLTrans::getString("UTCTimeSec")+"] [" - +LLTrans::getString("UTCTimeTimezone")+"]"; + std::string timeStr = "[" + LLTrans::getString("TimeWeek") + "], [" + + LLTrans::getString("TimeMonth") + "]/[" + + LLTrans::getString("TimeDay") + "]/[" + + LLTrans::getString("TimeYear") + "] [" + + LLTrans::getString("TimeHour") + "]:[" + + LLTrans::getString("TimeMin") + "] [" + + LLTrans::getString("TimeTimezone") + "]"; + const LLDate timeStamp = notification->getDate(); LLDate notice_date = timeStamp.notNull() ? timeStamp : payload["received_time"].asDate(); LLSD substitution; diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index e3a856be5cd7cde30109888f3b8dbdb00c1044bc..a2116817a245c69bbb31000b5d5e249773d14339 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -46,8 +46,6 @@ const S32 BOTTOM_PAD = VPAD * 3; const S32 IGNORE_BTN_TOP_DELTA = 3*VPAD;//additional ignore_btn padding S32 BUTTON_WIDTH = 90; -// *TODO: magic numbers - copied from llnotify.cpp(250) -const S32 MAX_LENGTH = 512 + 20 + DB_FIRST_NAME_BUF_SIZE + DB_LAST_NAME_BUF_SIZE + DB_INV_ITEM_NAME_BUF_SIZE; //static @@ -319,7 +317,7 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images ) mTextBox = getChild<LLTextEditor>("text_editor_box"); } - mTextBox->setMaxTextLength(MAX_LENGTH); + mTextBox->setMaxTextLength(LLToastPanel::MAX_TEXT_LENGTH); mTextBox->setVisible(TRUE); mTextBox->setPlainText(!show_images); mTextBox->setContentTrusted(is_content_trusted); @@ -411,7 +409,7 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images ) //.xml file intially makes info panel only follow left/right/top. This is so that when control buttons are added the info panel //can shift upward making room for the buttons inside mControlPanel. After the buttons are added, the info panel can then be set to follow 'all'. mInfoPanel->setFollowsAll(); - snapToMessageHeight(mTextBox, MAX_LENGTH); + snapToMessageHeight(mTextBox, LLToastPanel::MAX_TEXT_LENGTH); // reshape the panel to its previous size if (current_rect.notEmpty()) @@ -472,7 +470,7 @@ void LLIMToastNotifyPanel::snapToMessageHeight() //Add message height if it is visible if (mTextBox->getVisible()) { - S32 new_panel_height = computeSnappedToMessageHeight(mTextBox, MAX_LENGTH); + S32 new_panel_height = computeSnappedToMessageHeight(mTextBox, LLToastPanel::MAX_TEXT_LENGTH); //reshape the panel with new height if (new_panel_height != getRect().getHeight()) diff --git a/indra/newview/lltoastpanel.cpp b/indra/newview/lltoastpanel.cpp index e1b764a9438c541f142126bf9c2dd04fde1b0cab..7c624d5b50566518267ef5dd91aa9acf78b615e4 100644 --- a/indra/newview/lltoastpanel.cpp +++ b/indra/newview/lltoastpanel.cpp @@ -26,6 +26,7 @@ #include "llviewerprecompiledheaders.h" +#include "lldbstrings.h" #include "llpanelgenerictip.h" #include "llpanelonlinestatus.h" #include "llnotifications.h" @@ -35,6 +36,8 @@ //static const S32 LLToastPanel::MIN_PANEL_HEIGHT = 40; // VPAD(4)*2 + ICON_HEIGHT(32) +// 'magic numbers', consider initializing (512+20) part from xml/notifications +const S32 LLToastPanel::MAX_TEXT_LENGTH = 512 + 20 + DB_FIRST_NAME_BUF_SIZE + DB_LAST_NAME_BUF_SIZE + DB_INV_ITEM_NAME_BUF_SIZE; LLToastPanel::LLToastPanel(const LLNotificationPtr& notification) { diff --git a/indra/newview/lltoastpanel.h b/indra/newview/lltoastpanel.h index 51630381f2118ff899b298484a1cc80d21df40d4..6a9b72a5ae56e915417c784991659d80aaac037e 100644 --- a/indra/newview/lltoastpanel.h +++ b/indra/newview/lltoastpanel.h @@ -49,6 +49,7 @@ class LLToastPanel : public LLPanel { virtual const LLUUID& getID(); static const S32 MIN_PANEL_HEIGHT; + static const S32 MAX_TEXT_LENGTH; /** * Builder method for constructing notification specific panels. diff --git a/indra/newview/lltoastscripttextbox.cpp b/indra/newview/lltoastscripttextbox.cpp index 518c6c0ee4ded9f9ae1b812e391dd3930fd06b85..eb86a44055ce99199be30b54b6b50e99f610e1c3 100644 --- a/indra/newview/lltoastscripttextbox.cpp +++ b/indra/newview/lltoastscripttextbox.cpp @@ -36,8 +36,6 @@ #include "llviewertexteditor.h" const S32 LLToastScriptTextbox::DEFAULT_MESSAGE_MAX_LINE_COUNT= 14; -// *TODO: magic numbers - copied from lltoastnotifypanel.cpp(50) which was copied from llnotify.cpp(250) -const S32 MAX_LENGTH = 512 + 20 + DB_FIRST_NAME_BUF_SIZE + DB_LAST_NAME_BUF_SIZE + DB_INV_ITEM_NAME_BUF_SIZE; LLToastScriptTextbox::LLToastScriptTextbox(const LLNotificationPtr& notification) : LLToastPanel(notification) @@ -45,7 +43,7 @@ LLToastScriptTextbox::LLToastScriptTextbox(const LLNotificationPtr& notification buildFromFile( "panel_notify_textbox.xml"); mInfoText = getChild<LLTextEditor>("text_editor_box"); - mInfoText->setMaxTextLength(MAX_LENGTH); + mInfoText->setMaxTextLength(LLToastPanel::MAX_TEXT_LENGTH); mInfoText->setValue(notification->getMessage()); getChild<LLButton>("ignore_btn")->setClickedCallback(boost::bind(&LLToastScriptTextbox::onClickIgnore, this)); diff --git a/indra/newview/lltool.cpp b/indra/newview/lltool.cpp index 4aad650b680b44aab4bd28e53f1ec9e36e57fa52..b5d78f36548ebeb880dee7a62b8dc6bc249b7ef8 100644 --- a/indra/newview/lltool.cpp +++ b/indra/newview/lltool.cpp @@ -191,7 +191,9 @@ LLTool* LLTool::getOverrideTool(MASK mask) { return NULL; } - if (gSavedSettings.getBOOL("EnableAltZoom")) + + static LLCachedControl<bool> alt_zoom(gSavedSettings, "EnableAltZoom", true); + if (alt_zoom) { if (mask & MASK_ALT) { diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp index 392c103d7c2021ddcedc832c205ed7aa85d7c6e1..f9c327b46e8a7f511bd4f23333fe61e6e905b1c7 100644 --- a/indra/newview/lltoolcomp.cpp +++ b/indra/newview/lltoolcomp.cpp @@ -267,7 +267,7 @@ BOOL LLToolCompTranslate::handleHover(S32 x, S32 y, MASK mask) BOOL LLToolCompTranslate::handleMouseDown(S32 x, S32 y, MASK mask) { mMouseDown = TRUE; - gViewerWindow->pickAsync(x, y, mask, pickCallback, /*BOOL pick_transparent*/ TRUE); + gViewerWindow->pickAsync(x, y, mask, pickCallback, /*BOOL pick_transparent*/ TRUE, LLFloaterReg::instanceVisible("build")); return TRUE; } diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 9e37ca0394ebac8f4f0085375574f15155bf094c..2a87bce134c139eaa9c2d6d7cb0dee35b9b8d37a 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -111,11 +111,64 @@ BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask) mMouseOutsideSlop = FALSE; mMouseDownX = x; mMouseDownY = y; - LLTimer pick_timer; - BOOL pick_rigged = false; //gSavedSettings.getBOOL("AnimatedObjectsAllowLeftClick"); - //left mouse down always picks transparent (but see handleMouseUp) - mPick = gViewerWindow->pickImmediate(x, y, TRUE, pick_rigged); - LL_INFOS() << "pick_rigged is " << (S32) pick_rigged << " pick time elapsed " << pick_timer.getElapsedTimeF32() << LL_ENDL; + LLTimer pick_timer; + BOOL pick_rigged = false; //gSavedSettings.getBOOL("AnimatedObjectsAllowLeftClick"); + LLPickInfo transparent_pick = gViewerWindow->pickImmediate(x, y, TRUE /*includes transparent*/, pick_rigged); + LLPickInfo visible_pick = gViewerWindow->pickImmediate(x, y, FALSE, pick_rigged); + LLViewerObject *transp_object = transparent_pick.getObject(); + LLViewerObject *visible_object = visible_pick.getObject(); + + // Current set of priorities + // 1. Transparent attachment pick + // 2. Transparent actionable pick + // 3. Visible attachment pick (e.x we click on attachment under invisible floor) + // 4. Visible actionable pick + // 5. Transparent pick (e.x. movement on transparent object/floor, our default pick) + // left mouse down always picks transparent (but see handleMouseUp). + // Also see LLToolPie::handleHover() - priorities are a bit different there. + // Todo: we need a more consistent set of rules to work with + if (transp_object == visible_object || !visible_object) + { + // Note: if transparent object is null, then visible object is also null + // since transparent pick includes non-tranpsarent one. + // !transparent_object check will be covered by transparent_object == visible_object. + mPick = transparent_pick; + } + else + { + // Select between two non-null picks + LLViewerObject *transp_parent = transp_object->getRootEdit(); + LLViewerObject *visible_parent = visible_object->getRootEdit(); + if (transp_object->isAttachment()) + { + // 1. Transparent attachment + mPick = transparent_pick; + } + else if (transp_object->getClickAction() != CLICK_ACTION_DISABLED + && (useClickAction(mask, transp_object, transp_parent) || transp_object->flagHandleTouch() || (transp_parent && transp_parent->flagHandleTouch()))) + { + // 2. Transparent actionable pick + mPick = transparent_pick; + } + else if (visible_object->isAttachment()) + { + // 3. Visible attachment pick + mPick = visible_pick; + } + else if (visible_object->getClickAction() != CLICK_ACTION_DISABLED + && (useClickAction(mask, visible_object, visible_parent) || visible_object->flagHandleTouch() || (visible_parent && visible_parent->flagHandleTouch()))) + { + // 4. Visible actionable pick + mPick = visible_pick; + } + else + { + // 5. Default: transparent + mPick = transparent_pick; + } + } + LL_INFOS() << "pick_rigged is " << (S32) pick_rigged << " pick time elapsed " << pick_timer.getElapsedTimeF32() << LL_ENDL; + mPick.mKeyMask = mask; mMouseButtonDown = true; @@ -857,13 +910,11 @@ static bool needs_tooltip(LLSelectNode* nodep) BOOL LLToolPie::handleTooltipLand(std::string line, std::string tooltip_msg) { - LLViewerParcelMgr::getInstance()->setHoverParcel( mHoverPick.mPosGlobal ); - // - // Do not show hover for land unless prefs are set to allow it. - // - + // Do not show hover for land unless prefs are set to allow it. if (!gSavedSettings.getBOOL("ShowLandHoverTip")) return TRUE; - + + LLViewerParcelMgr::getInstance()->setHoverParcel( mHoverPick.mPosGlobal ); + // Didn't hit an object, but since we have a land point we // must be hovering over land. diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp index 1936e2476102ffc1b496b4cd6e200e66eb135686..e424983cf81668cfffa00a4b2a3af050969a511a 100644 --- a/indra/newview/lltranslate.cpp +++ b/indra/newview/lltranslate.cpp @@ -38,8 +38,12 @@ #include "llcoros.h" #include "reader.h" #include "llcorehttputil.h" +#include "llurlregistry.h" +static const std::string BING_NOTRANSLATE_OPENING_TAG("<div class=\"notranslate\">"); +static const std::string BING_NOTRANSLATE_CLOSING_TAG("</div>"); + /** * Handler of an HTTP machine translation service. * @@ -99,6 +103,8 @@ class LLTranslationAPIHandler */ virtual bool isConfigured() const = 0; + virtual LLTranslate::EService getCurrentService() = 0; + virtual void verifyKey(const std::string &key, LLTranslate::KeyVerificationResult_fn fnc) = 0; virtual void translateMessage(LanguagePair_t fromTo, std::string msg, LLTranslate::TranslationSuccess_fn success, LLTranslate::TranslationFailure_fn failure); @@ -248,6 +254,8 @@ class LLGoogleTranslationHandler : public LLTranslationAPIHandler std::string& err_msg) const; /*virtual*/ bool isConfigured() const; + /*virtual*/ LLTranslate::EService getCurrentService() { return LLTranslate::EService::SERVICE_GOOGLE; } + /*virtual*/ void verifyKey(const std::string &key, LLTranslate::KeyVerificationResult_fn fnc); private: @@ -409,6 +417,8 @@ class LLBingTranslationHandler : public LLTranslationAPIHandler std::string& err_msg) const; /*virtual*/ bool isConfigured() const; + /*virtual*/ LLTranslate::EService getCurrentService() { return LLTranslate::EService::SERVICE_BING; } + /*virtual*/ void verifyKey(const std::string &key, LLTranslate::KeyVerificationResult_fn fnc); private: static std::string getAPIKey(); @@ -520,7 +530,59 @@ void LLTranslate::translateMessage(const std::string &from_lang, const std::stri { LLTranslationAPIHandler& handler = getPreferredHandler(); - handler.translateMessage(LLTranslationAPIHandler::LanguagePair_t(from_lang, to_lang), mesg, success, failure); + handler.translateMessage(LLTranslationAPIHandler::LanguagePair_t(from_lang, to_lang), addNoTranslateTags(mesg), success, failure); +} + +std::string LLTranslate::addNoTranslateTags(std::string mesg) +{ + if (getPreferredHandler().getCurrentService() != SERVICE_BING) + { + return mesg; + } + + std::string upd_msg(mesg); + LLUrlMatch match; + S32 dif = 0; + //surround all links (including SLURLs) with 'no-translate' tags to prevent unnecessary translation + while (LLUrlRegistry::instance().findUrl(mesg, match)) + { + upd_msg.insert(dif + match.getStart(), BING_NOTRANSLATE_OPENING_TAG); + upd_msg.insert(dif + BING_NOTRANSLATE_OPENING_TAG.size() + match.getEnd() + 1, BING_NOTRANSLATE_CLOSING_TAG); + mesg.erase(match.getStart(), match.getEnd() - match.getStart()); + dif += match.getEnd() - match.getStart() + BING_NOTRANSLATE_OPENING_TAG.size() + BING_NOTRANSLATE_CLOSING_TAG.size(); + } + return upd_msg; +} + +std::string LLTranslate::removeNoTranslateTags(std::string mesg) +{ + if (getPreferredHandler().getCurrentService() != SERVICE_BING) + { + return mesg; + } + std::string upd_msg(mesg); + LLUrlMatch match; + S32 opening_tag_size = BING_NOTRANSLATE_OPENING_TAG.size(); + S32 closing_tag_size = BING_NOTRANSLATE_CLOSING_TAG.size(); + S32 dif = 0; + //remove 'no-translate' tags we added to the links before + while (LLUrlRegistry::instance().findUrl(mesg, match)) + { + if (upd_msg.substr(dif + match.getStart() - opening_tag_size, opening_tag_size) == BING_NOTRANSLATE_OPENING_TAG) + { + upd_msg.erase(dif + match.getStart() - opening_tag_size, opening_tag_size); + dif -= opening_tag_size; + + if (upd_msg.substr(dif + match.getEnd() + 1, closing_tag_size) == BING_NOTRANSLATE_CLOSING_TAG) + { + upd_msg.replace(dif + match.getEnd() + 1, closing_tag_size, " "); + dif -= closing_tag_size - 1; + } + } + mesg.erase(match.getStart(), match.getUrl().size()); + dif += match.getUrl().size(); + } + return upd_msg; } /*static*/ diff --git a/indra/newview/lltranslate.h b/indra/newview/lltranslate.h index bf431cdfbb23ca2d983cdb1bc779f2ee4f6c9e9e..e0722fbd83f92dce9b41c58012e19875893d6621 100644 --- a/indra/newview/lltranslate.h +++ b/indra/newview/lltranslate.h @@ -91,6 +91,9 @@ public : */ static bool isTranslationConfigured(); + static std::string addNoTranslateTags(std::string mesg); + static std::string removeNoTranslateTags(std::string mesg); + private: static LLTranslationAPIHandler& getPreferredHandler(); static LLTranslationAPIHandler& getHandler(EService service); diff --git a/indra/newview/lltwitterconnect.cpp b/indra/newview/lltwitterconnect.cpp index 5d598aaebe3ebd0369e685fb582fcb42ab02a646..b2d2fa9d77fbbec1baa0cef58745a87b5ea1c77e 100644 --- a/indra/newview/lltwitterconnect.cpp +++ b/indra/newview/lltwitterconnect.cpp @@ -28,6 +28,7 @@ #include "llviewerprecompiledheaders.h" #include "lltwitterconnect.h" +#include "llflickrconnect.h" #include "llagent.h" #include "llcallingcard.h" // for LLAvatarTracker @@ -65,6 +66,49 @@ void toast_user_for_twitter_success() LLNotificationsUtil::add("TwitterConnect", args); } +class LLTwitterConnectHandler : public LLCommandHandler +{ +public: + LLTwitterConnectHandler() : LLCommandHandler("fbc", UNTRUSTED_THROTTLE) {} + + bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web) + { + if (tokens.size() >= 1) + { + if (tokens[0].asString() == "connect") + { + if (tokens.size() >= 2 && tokens[1].asString() == "twitter") + { + // this command probably came from the twitter_web browser, so close it + LLFloaterReg::hideInstance("twitter_web"); + + // connect to twitter + if (query_map.has("oauth_token")) + { + LLTwitterConnect::instance().connectToTwitter(query_map["oauth_token"], query_map.get("oauth_verifier")); + } + return true; + } + else if (tokens.size() >= 2 && tokens[1].asString() == "flickr") + { + // this command probably came from the flickr_web browser, so close it + LLFloaterReg::hideInstance("flickr_web"); + + // connect to flickr + if (query_map.has("oauth_token")) + { + LLFlickrConnect::instance().connectToFlickr(query_map["oauth_token"], query_map.get("oauth_verifier")); + } + return true; + } + } + } + return false; + } +}; +LLTwitterConnectHandler gTwitterConnectHandler; + + /////////////////////////////////////////////////////////////////////////////// // void LLTwitterConnect::twitterConnectCoro(std::string requestToken, std::string oauthVerifier) diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index 78268944fc0aa28b1c580f006a4fd94e81bcae82..da31e4f54246beb9d90d9840fa26f96ed1875e40 100644 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -47,6 +47,7 @@ // library includes #include "llnotificationsutil.h" #include "llsd.h" +#include "stringize.h" static LLURLDispatcherListener sURLDispatcherListener; @@ -255,14 +256,23 @@ void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const LLSLURL& // Teleportation links are handled here because they are tightly coupled // to SLURL parsing and sim-fragment parsing -class LLTeleportHandler : public LLCommandHandler +class LLTeleportHandler : public LLCommandHandler, public LLEventAPI { public: // Teleport requests *must* come from a trusted browser // inside the app, otherwise a malicious web page could // cause a constant teleport loop. JC - LLTeleportHandler() : LLCommandHandler("teleport", UNTRUSTED_THROTTLE) { } - + LLTeleportHandler() : + LLCommandHandler("teleport", UNTRUSTED_THROTTLE), + LLEventAPI("LLTeleportHandler", "Low-level teleport API") + { + LLEventAPI::add("teleport", + "Teleport to specified [\"regionname\"] at\n" + "specified region-relative [\"x\"], [\"y\"], [\"z\"].\n" + "If [\"regionname\"] omitted, teleport to GLOBAL\n" + "coordinates [\"x\"], [\"y\"], [\"z\"].", + &LLTeleportHandler::from_event); + } bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web) @@ -293,6 +303,41 @@ class LLTeleportHandler : public LLCommandHandler return true; } + void from_event(const LLSD& params) const + { + Response response(LLSD(), params); + if (params.has("regionname")) + { + // region specified, coordinates (if any) are region-local + LLVector3 local_pos( + params.has("x")? params["x"].asReal() : 128, + params.has("y")? params["y"].asReal() : 128, + params.has("z")? params["z"].asReal() : 0); + std::string regionname(params["regionname"]); + std::string destination(LLSLURL(regionname, local_pos).getSLURLString()); + // have to resolve region's global coordinates first + teleport_via_slapp(regionname, destination); + response["message"] = "Teleporting to " + destination; + } + else // no regionname + { + // coordinates are global, and at least (x, y) are required + if (! (params.has("x") && params.has("y"))) + { + return response.error("Specify either regionname or global (x, y)"); + } + LLVector3d global_pos(params["x"].asReal(), params["y"].asReal(), + params["z"].asReal()); + gAgent.teleportViaLocation(global_pos); + LLFloaterWorldMap* instance = LLFloaterWorldMap::getInstance(); + if (instance) + { + instance->trackLocation(global_pos); + } + response["message"] = STRINGIZE("Teleporting to global " << global_pos); + } + } + static void teleport_via_slapp(std::string region_name, std::string callback_url) { diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 88984d518ab5fe18ae9eef12b5768574d86eea2e..a699491e1bfbca510a86823b93b8d05aacd125e7 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -219,20 +219,20 @@ static bool handleAnisotropicChanged(const LLSD& newvalue) static bool handleVolumeLODChanged(const LLSD& newvalue) { - LLVOVolume::sLODFactor = (F32) newvalue.asReal(); + LLVOVolume::sLODFactor = llclamp((F32) newvalue.asReal(), 0.01f, MAX_LOD_FACTOR); LLVOVolume::sDistanceFactor = 1.f-LLVOVolume::sLODFactor * 0.1f; return true; } static bool handleAvatarLODChanged(const LLSD& newvalue) { - LLVOAvatar::sLODFactor = (F32) newvalue.asReal(); + LLVOAvatar::sLODFactor = llclamp((F32) newvalue.asReal(), 0.f, MAX_AVATAR_LOD_FACTOR); return true; } static bool handleAvatarPhysicsLODChanged(const LLSD& newvalue) { - LLVOAvatar::sPhysicsLODFactor = (F32) newvalue.asReal(); + LLVOAvatar::sPhysicsLODFactor = llclamp((F32) newvalue.asReal(), 0.f, MAX_AVATAR_LOD_FACTOR); return true; } diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 64f6123f5dd5be698c69a4083ba6a3b411e41654..e2554bc9bc1c91509954c73adec3040142636f9f 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -237,6 +237,7 @@ void display_stats() static LLTrace::BlockTimerStatHandle FTM_PICK("Picking"); static LLTrace::BlockTimerStatHandle FTM_RENDER("Render"); +static LLTrace::BlockTimerStatHandle FTM_RENDER_HUD("Render HUD"); static LLTrace::BlockTimerStatHandle FTM_UPDATE_SKY("Update Sky"); static LLTrace::BlockTimerStatHandle FTM_UPDATE_DYNAMIC_TEXTURES("Update Dynamic Textures"); static LLTrace::BlockTimerStatHandle FTM_IMAGE_UPDATE("Update Images"); @@ -568,6 +569,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) if (gDisconnected) { LLAppViewer::instance()->pingMainloopTimeout("Display:Disconnected"); + LL_RECORD_BLOCK_TIME(FTM_RENDER_UI); render_ui(); swap(); } @@ -1293,7 +1295,8 @@ void render_ui(F32 zoom_factor, int subfield) { gPipeline.renderBloom(gSnapshot, zoom_factor, subfield); } - + + LL_RECORD_BLOCK_TIME(FTM_RENDER_HUD); render_hud_elements(); render_hud_attachments(); } @@ -1308,8 +1311,6 @@ void render_ui(F32 zoom_factor, int subfield) gGL.color4f(1,1,1,1); if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI)) { - LL_RECORD_BLOCK_TIME(FTM_RENDER_UI); - if (!gDisconnected) { render_ui_3d(); diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 0ebacddd9b175f98017d7bc58cc51b158e41f21c..f475ab7d6630248e13fda8a6be7e8d6adc46f678 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -40,6 +40,7 @@ #include "llfloateravatarpicker.h" #include "llfloateravatarrendersettings.h" #include "llfloateravatartextures.h" +#include "llfloaterbanduration.h" #include "llfloaterbigpreview.h" #include "llfloaterbeacons.h" #include "llfloaterbuildoptions.h" @@ -66,7 +67,6 @@ #include "llfloaterexperiences.h" #include "llfloaterexperiencepicker.h" #include "llfloaterevent.h" -#include "llfloaterfacebook.h" #include "llfloaterflickr.h" #include "llfloaterfonttest.h" #include "llfloatergesture.h" @@ -90,6 +90,7 @@ #include "llfloatermediasettings.h" #include "llfloatermemleak.h" #include "llfloatermodelpreview.h" +#include "llfloatermyscripts.h" #include "llfloaternamedesc.h" #include "llfloaternotificationsconsole.h" #include "llfloaternotificationstabbed.h" @@ -200,6 +201,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("avatar_render_settings", "floater_avatar_render_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarRenderSettings>); LLFloaterReg::add("avatar_textures", "floater_avatar_textures.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarTextures>); + LLFloaterReg::add("ban_duration", "floater_ban_duration.xml", &LLFloaterReg::build<LLFloaterBanDuration>); LLFloaterReg::add("beacons", "floater_beacons.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBeacons>); LLFloaterReg::add("bulk_perms", "floater_bulk_perms.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBulkPermission>); LLFloaterReg::add("buy_currency", "floater_buy_currency.xml", &LLFloaterBuyCurrency::buildFloater); @@ -335,6 +337,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("script_debug_output", "floater_script_debug_panel.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebugOutput>); LLFloaterReg::add("script_floater", "floater_script.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLScriptFloater>); LLFloaterReg::add("script_limits", "floater_script_limits.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptLimits>); + LLFloaterReg::add("my_scripts", "floater_my_scripts.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMyScripts>); LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater); LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>); LLFloaterReg::add("sound_devices", "floater_sound_devices.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundDevices>); @@ -349,11 +352,9 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("profile", "floater_web_profile.xml", (LLFloaterBuildFunc)&LLFloaterWebProfile::create); LLFloaterReg::add("how_to", "floater_how_to.xml", (LLFloaterBuildFunc)&LLFloaterWebContent::create); - LLFloaterReg::add("fbc_web", "floater_fbc_web.xml", (LLFloaterBuildFunc)&LLFloaterWebContent::create); LLFloaterReg::add("flickr_web", "floater_fbc_web.xml", (LLFloaterBuildFunc)&LLFloaterWebContent::create); LLFloaterReg::add("twitter_web", "floater_fbc_web.xml", (LLFloaterBuildFunc)&LLFloaterWebContent::create); - LLFloaterReg::add("facebook", "floater_facebook.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterFacebook>); LLFloaterReg::add("flickr", "floater_flickr.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterFlickr>); LLFloaterReg::add("twitter", "floater_twitter.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTwitter>); LLFloaterReg::add("big_preview", "floater_big_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBigPreview>); diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 1ab7ec0156d56b42020e622c245f45ec96978453..61857d6fb1afef1209f5db81a00e107c7672ecc0 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -138,6 +138,7 @@ LLLocalizedInventoryItemsDictionary::LLLocalizedInventoryItemsDictionary() mInventoryItemsDict["New Skirt"] = LLTrans::getString("New Skirt"); mInventoryItemsDict["New Alpha"] = LLTrans::getString("New Alpha"); mInventoryItemsDict["New Tattoo"] = LLTrans::getString("New Tattoo"); + mInventoryItemsDict["New Universal"] = LLTrans::getString("New Universal"); mInventoryItemsDict["New Physics"] = LLTrans::getString("New Physics"); mInventoryItemsDict["Invalid Wearable"] = LLTrans::getString("Invalid Wearable"); diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index b89e1497a188d1b5435e377275090c1faf340f5d..e930eb20d3cf185affae53bb182d622dc0a0b2d3 100644 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -64,7 +64,12 @@ LLViewerKeyboard gViewerKeyboard; void agent_jump( EKeystate s ) { - if( KEYSTATE_UP == s ) return; + static BOOL first_fly_attempt(TRUE); + if (KEYSTATE_UP == s) + { + first_fly_attempt = TRUE; + return; + } F32 time = gKeyboard->getCurKeyElapsedTime(); S32 frame_count = ll_round(gKeyboard->getCurKeyElapsedFrameCount()); @@ -77,7 +82,8 @@ void agent_jump( EKeystate s ) } else { - gAgent.setFlying(TRUE); + gAgent.setFlying(TRUE, first_fly_attempt); + first_fly_attempt = FALSE; gAgent.moveUp(1); } } diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 22a21c9ca3c60e3d0144804c93c3cf15bdc31daa..a27a083a2acf89e553aafc4091d70430b94b044b 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -682,8 +682,8 @@ void LLViewerMedia::updateMedia(void *dummy_arg) std::vector<LLViewerMediaImpl*> proximity_order; - bool inworld_media_enabled = gSavedSettings.getBOOL("AudioStreamingMedia"); - bool inworld_audio_enabled = gSavedSettings.getBOOL("AudioStreamingMusic"); + static LLCachedControl<bool> inworld_media_enabled(gSavedSettings, "AudioStreamingMedia", true); + static LLCachedControl<bool> inworld_audio_enabled(gSavedSettings, "AudioStreamingMusic", true); U32 max_instances = gSavedSettings.getU32("PluginInstancesTotal"); U32 max_normal = gSavedSettings.getU32("PluginInstancesNormal"); U32 max_low = gSavedSettings.getU32("PluginInstancesLow"); @@ -941,7 +941,8 @@ void LLViewerMedia::setAllMediaEnabled(bool val) LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel()); } - if (gSavedSettings.getBOOL("AudioStreamingMusic") && + static LLCachedControl<bool> audio_streaming_music(gSavedSettings, "AudioStreamingMusic", true); + if (audio_streaming_music && !LLViewerMedia::isParcelAudioPlaying() && gAudiop && LLViewerMedia::hasParcelAudio()) @@ -1012,7 +1013,8 @@ void LLViewerMedia::setAllMediaPaused(bool val) LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel()); } - if (gSavedSettings.getBOOL("AudioStreamingMusic") && + static LLCachedControl<bool> audio_streaming_music(gSavedSettings, "AudioStreamingMusic", true); + if (audio_streaming_music && !LLViewerMedia::isParcelAudioPlaying() && gAudiop && LLViewerMedia::hasParcelAudio()) @@ -1705,7 +1707,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_ // HACK: we always try to keep a spare running webkit plugin around to improve launch times. // If a spare was already created before PluginAttachDebuggerToPlugins was set, don't use it. - // Do not use a spare if launching with full viewer control (e.g. Facebook, Twitter and few others) + // Do not use a spare if launching with full viewer control (e.g. Twitter and few others) if ((plugin_basename == "media_plugin_cef") && !gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins") && !clean_browser) { @@ -1899,21 +1901,8 @@ void LLViewerMediaImpl::loadURI() // trim whitespace from front and back of URL - fixes EXT-5363 LLStringUtil::trim( mMediaURL ); - // *HACK: we don't know if the URI coming in is properly escaped - // (the contract doesn't specify whether it is escaped or not. - // but LLQtWebKit expects it to be, so we do our best to encode - // special characters) - // The strings below were taken right from http://www.ietf.org/rfc/rfc1738.txt - // Note especially that '%' and '/' are there. - std::string uri = LLURI::escape(mMediaURL, - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" - "0123456789" - "$-_.+" - "!*'()," - "{}|\\^~[]`" - "<>#%" - ";/?:@&=", - false); + // URI often comes unescaped + std::string uri = LLURI::escapePathAndData(mMediaURL); { // Do not log the query parts LLURI u(uri); @@ -3318,8 +3307,39 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla } else { - // Don't track redirects. - setNavState(MEDIANAVSTATE_NONE); + bool internal_nav = false; + if (url != mCurrentMediaURL) + { + // Check if it is internal navigation + // Note: Not sure if we should detect internal navigations as 'address change', + // but they are not redirects and do not cause NAVIGATE_BEGIN (also see SL-1005) + size_t pos = url.find("#"); + if (pos != std::string::npos) + { + // assume that new link always have '#', so this is either + // transfer from 'link#1' to 'link#2' or from link to 'link#2' + // filter out cases like 'redirect?link' + std::string base_url = url.substr(0, pos); + pos = mCurrentMediaURL.find(base_url); + if (pos == 0) + { + // base link hasn't changed + internal_nav = true; + } + } + } + + if (internal_nav) + { + // Internal navigation by '#' + mCurrentMediaURL = url; + setNavState(MEDIANAVSTATE_FIRST_LOCATION_CHANGED); + } + else + { + // Don't track redirects. + setNavState(MEDIANAVSTATE_NONE); + } } } break; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 6c52f118adf67262121980856af5a713f6dc11c5..52b2c631fa4755fe88f0220e709ac2d5f0e709ef 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -54,7 +54,6 @@ #include "lldaycyclemanager.h" #include "lldebugview.h" #include "llenvmanager.h" -#include "llfacebookconnect.h" #include "llfilepicker.h" #include "llfirstuse.h" #include "llfloaterabout.h" @@ -4066,10 +4065,8 @@ void near_sit_down_point(BOOL success, void *) if (success) { gAgent.setFlying(FALSE); + gAgent.clearControlFlags(AGENT_CONTROL_STAND_UP); // might have been set by autopilot gAgent.setControlFlags(AGENT_CONTROL_SIT_ON_GROUND); - - // Might be first sit - //LLFirstUse::useSit(); } } @@ -4754,6 +4751,12 @@ void handle_take() category_id.setNull(); } + // check inbox + const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX); + if (category_id == inbox_id || gInventory.isObjectDescendentOf(category_id, inbox_id)) + { + category_id.setNull(); + } } } if(category_id.isNull()) @@ -7068,25 +7071,19 @@ BOOL object_selected_and_point_valid() BOOL object_is_wearable() { - if (!object_selected_and_point_valid()) + if (!isAgentAvatarValid()) { return FALSE; } - if (sitting_on_selection()) + if (!object_selected_and_point_valid()) { return FALSE; } - LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); - for (LLObjectSelection::valid_root_iterator iter = LLSelectMgr::getInstance()->getSelection()->valid_root_begin(); - iter != LLSelectMgr::getInstance()->getSelection()->valid_root_end(); iter++) + if (sitting_on_selection()) { - LLSelectNode* node = *iter; - if (node->mPermissions->getOwner() == gAgent.getID()) - { - return TRUE; - } + return FALSE; } - return FALSE; + return gAgentAvatarp->canAttachMoreObjects(); } @@ -9207,13 +9204,12 @@ void initialize_menus() enable.add("Object.EnableOpen", boost::bind(&enable_object_open)); enable.add("Object.EnableTouch", boost::bind(&enable_object_touch, _1)); enable.add("Object.EnableDelete", boost::bind(&enable_object_delete)); - enable.add("Object.EnableWear", boost::bind(&object_selected_and_point_valid)); + enable.add("Object.EnableWear", boost::bind(&object_is_wearable)); enable.add("Object.EnableStandUp", boost::bind(&enable_object_stand_up)); enable.add("Object.EnableSit", boost::bind(&enable_object_sit, _1)); view_listener_t::addMenu(new LLObjectEnableReturn(), "Object.EnableReturn"); - enable.add("Object.EnableDuplicate", boost::bind(&LLSelectMgr::canDuplicate, LLSelectMgr::getInstance())); view_listener_t::addMenu(new LLObjectEnableReportAbuse(), "Object.EnableReportAbuse"); enable.add("Avatar.EnableMute", boost::bind(&enable_object_mute)); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index d2a55785684d2890a12c5fdca055610926fc53c7..a9a91b158b1b5b3aa98e431950ea42884957c3a4 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -175,7 +175,7 @@ void LLFilePickerThread::run() //static void LLFilePickerThread::initClass() { - sMutex = new LLMutex(NULL); + sMutex = new LLMutex(); } //static diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 981d226824a065793426863525ee3ada8d63246d..c8f75c79c4cd3784e788d13035812cf6a616e026 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2415,7 +2415,7 @@ void translateSuccess(LLChat chat, LLSD toastArgs, std::string originalMsg, std: && ((detected_language.empty()) || (expectLang != detected_language)) && (LLStringUtil::compareInsensitive(translation, originalMsg) != 0)) { - chat.mText += " (" + translation + ")"; + chat.mText += " (" + LLTranslate::removeNoTranslateTags(translation) + ")"; } LLNotificationsUI::LLNotificationManager::instance().onChat(chat, toastArgs); @@ -5531,17 +5531,6 @@ void notify_cautioned_script_question(const LLSD& notification, const LLSD& resp void script_question_mute(const LLUUID& item_id, const std::string& object_name); -bool unknown_script_question_cb(const LLSD& notification, const LLSD& response) -{ - // Only care if they muted the object here. - if ( response["Mute"] ) // mute - { - LLUUID task_id = notification["payload"]["task_id"].asUUID(); - script_question_mute(task_id,notification["payload"]["object_name"].asString()); - } - return false; -} - void experiencePermissionBlock(LLUUID experience, LLSD result) { LLSD permission; @@ -5647,8 +5636,7 @@ void script_question_mute(const LLUUID& task_id, const std::string& object_name) bool matches(const LLNotificationPtr notification) const { if (notification->getName() == "ScriptQuestionCaution" - || notification->getName() == "ScriptQuestion" - || notification->getName() == "UnknownScriptQuestion") + || notification->getName() == "ScriptQuestion") { return (notification->getPayload()["task_id"].asUUID() == blocked_id); } @@ -5665,7 +5653,6 @@ void script_question_mute(const LLUUID& task_id, const std::string& object_name) static LLNotificationFunctorRegistration script_question_cb_reg_1("ScriptQuestion", script_question_cb); static LLNotificationFunctorRegistration script_question_cb_reg_2("ScriptQuestionCaution", script_question_cb); static LLNotificationFunctorRegistration script_question_cb_reg_3("ScriptQuestionExperience", script_question_cb); -static LLNotificationFunctorRegistration unknown_script_question_cb_reg("UnknownScriptQuestion", unknown_script_question_cb); void process_script_experience_details(const LLSD& experience_details, LLSD args, LLSD payload) { @@ -5778,14 +5765,12 @@ void process_script_question(LLMessageSystem *msg, void **user_data) args["QUESTIONS"] = script_question; if (known_questions != questions) - { // This is in addition to the normal dialog. - LLSD payload; - payload["task_id"] = taskid; - payload["item_id"] = itemid; - payload["object_name"] = object_name; - - args["DOWNLOADURL"] = LLTrans::getString("ViewerDownloadURL"); - LLNotificationsUtil::add("UnknownScriptQuestion",args,payload); + { + // This is in addition to the normal dialog. + // Viewer got a request for not supported/implemented permission + LL_WARNS("Messaging") << "Object \"" << object_name << "\" requested " << script_question + << " permission. Permission is unknown and can't be granted. Item id: " << itemid + << " taskid:" << taskid << LL_ENDL; } if (known_questions) diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 1e46a1cf9e4b6efab70cfca15b636137fe17c27c..1353a27982337372ab8773a0511c78e608af297f 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -127,6 +127,7 @@ BOOL LLViewerObject::sUseSharedDrawables(FALSE); // TRUE // sMaxUpdateInterpolationTime must be greater than sPhaseOutUpdateInterpolationTime F64Seconds LLViewerObject::sMaxUpdateInterpolationTime(3.0); // For motion interpolation: after X seconds with no updates, don't predict object motion F64Seconds LLViewerObject::sPhaseOutUpdateInterpolationTime(2.0); // For motion interpolation: after Y seconds with no updates, taper off motion prediction +F64Seconds LLViewerObject::sMaxRegionCrossingInterpolationTime(1.0);// For motion interpolation: don't interpolate over this time on region crossing std::map<std::string, U32> LLViewerObject::sObjectDataMap; @@ -260,6 +261,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe mLastInterpUpdateSecs(0.f), mLastMessageUpdateSecs(0.f), mLatestRecvPacketID(0), + mRegionCrossExpire(0), mData(NULL), mAudioSourcep(NULL), mAudioGain(1.f), @@ -2487,7 +2489,7 @@ void LLViewerObject::loadFlags(U32 flags) return; } -void LLViewerObject::idleUpdate(LLAgent &agent, const F64 &time) +void LLViewerObject::idleUpdate(LLAgent &agent, const F64 &frame_time) { //static LLTrace::BlockTimerStatHandle ftm("Viewer Object"); //LL_RECORD_BLOCK_TIME(ftm); @@ -2498,19 +2500,19 @@ void LLViewerObject::idleUpdate(LLAgent &agent, const F64 &time) { // calculate dt from last update F32 time_dilation = mRegionp ? mRegionp->getTimeDilation() : 1.0f; - F32 dt_raw = ((F64Seconds)time - mLastInterpUpdateSecs).value(); + F32 dt_raw = ((F64Seconds)frame_time - mLastInterpUpdateSecs).value(); F32 dt = time_dilation * dt_raw; applyAngularVelocity(dt); if (isAttachment()) { - mLastInterpUpdateSecs = (F64Seconds)time; + mLastInterpUpdateSecs = (F64Seconds)frame_time; return; } else { // Move object based on it's velocity and rotation - interpolateLinearMotion(time, dt); + interpolateLinearMotion(frame_time, dt); } } @@ -2520,7 +2522,7 @@ void LLViewerObject::idleUpdate(LLAgent &agent, const F64 &time) // Move an object due to idle-time viewer side updates by interpolating motion -void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& time, const F32SecondsImplicit& dt_seconds) +void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& frame_time, const F32SecondsImplicit& dt_seconds) { // linear motion // PHYSICS_TIMESTEP is used below to correct for the fact that the velocity in object @@ -2532,7 +2534,7 @@ void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& time, con // zeroing it out F32 dt = dt_seconds; - F64Seconds time_since_last_update = time - mLastMessageUpdateSecs; + F64Seconds time_since_last_update = frame_time - mLastMessageUpdateSecs; if (time_since_last_update <= (F64Seconds)0.0 || dt <= 0.f) { return; @@ -2580,7 +2582,7 @@ void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& time, con (time_since_last_packet > sPhaseOutUpdateInterpolationTime)) { // Start to reduce motion interpolation since we haven't seen a server update in a while - F64Seconds time_since_last_interpolation = time - mLastInterpUpdateSecs; + F64Seconds time_since_last_interpolation = frame_time - mLastInterpUpdateSecs; F64 phase_out = 1.0; if (time_since_last_update > sMaxUpdateInterpolationTime) { // Past the time limit, so stop the object @@ -2635,7 +2637,7 @@ void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& time, con new_pos.mV[VZ] = llmax(min_height, new_pos.mV[VZ]); // Check to see if it's going off the region - LLVector3 temp(new_pos); + LLVector3 temp(new_pos.mV[VX], new_pos.mV[VY], 0.f); if (temp.clamp(0.f, mRegionp->getWidth())) { // Going off this region, so see if we might end up on another region LLVector3d old_pos_global = mRegionp->getPosGlobalFromRegion(getPositionRegion()); @@ -2644,21 +2646,47 @@ void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& time, con // Clip the positions to known regions LLVector3d clip_pos_global = LLWorld::getInstance()->clipToVisibleRegions(old_pos_global, new_pos_global); if (clip_pos_global != new_pos_global) - { // Was clipped, so this means we hit a edge where there is no region to enter - - //LL_INFOS() << "Hit empty region edge, clipped predicted position to " << mRegionp->getPosRegionFromGlobal(clip_pos_global) - // << " from " << new_pos << LL_ENDL; - new_pos = mRegionp->getPosRegionFromGlobal(clip_pos_global); + { + // Was clipped, so this means we hit a edge where there is no region to enter + LLVector3 clip_pos = mRegionp->getPosRegionFromGlobal(clip_pos_global); + LL_DEBUGS("Interpolate") << "Hit empty region edge, clipped predicted position to " + << clip_pos + << " from " << new_pos << LL_ENDL; + new_pos = clip_pos; // Stop motion and get server update for bouncing on the edge new_v.clear(); setAcceleration(LLVector3::zero); } else - { // Let predicted movement cross into another region - //LL_INFOS() << "Predicting region crossing to " << new_pos << LL_ENDL; + { + // Check for how long we are crossing. + // Note: theoretically we can find time from velocity, acceleration and + // distance from border to new position, but it is not going to work + // if 'phase_out' activates + if (mRegionCrossExpire == 0) + { + // Workaround: we can't accurately figure out time when we cross border + // so just write down time 'after the fact', it is far from optimal in + // case of lags, but for lags sMaxUpdateInterpolationTime will kick in first + LL_DEBUGS("Interpolate") << "Predicted region crossing, new position " << new_pos << LL_ENDL; + mRegionCrossExpire = frame_time + sMaxRegionCrossingInterpolationTime; + } + else if (frame_time > mRegionCrossExpire) + { + // Predicting crossing over 1s, stop motion + // Stop motion + LL_DEBUGS("Interpolate") << "Predicting region crossing for too long, stopping at " << new_pos << LL_ENDL; + new_v.clear(); + setAcceleration(LLVector3::zero); + mRegionCrossExpire = 0; + } } } + else + { + mRegionCrossExpire = 0; + } // Set new position and velocity setPositionRegion(new_pos); @@ -2669,7 +2697,7 @@ void LLViewerObject::interpolateLinearMotion(const F64SecondsImplicit& time, con } // Update the last time we did anything - mLastInterpUpdateSecs = time; + mLastInterpUpdateSecs = frame_time; } @@ -3072,6 +3100,7 @@ void LLViewerObject::unlinkControlAvatar() if (mControlAvatar) { mControlAvatar->markForDeath(); + mControlAvatar->mRootVolp = NULL; mControlAvatar = NULL; } } @@ -4678,13 +4707,76 @@ void LLViewerObject::sendTEUpdate() const msg->sendReliable( regionp->getHost() ); } +LLViewerTexture* LLViewerObject::getBakedTextureForMagicId(const LLUUID& id) +{ + if (!LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(id)) + { + return NULL; + } + + LLViewerObject *root = getRootEdit(); + if (root && root->isAnimatedObject()) + { + return LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + } + + LLVOAvatar* avatar = getAvatar(); + if (avatar) + { + LLAvatarAppearanceDefines::EBakedTextureIndex texIndex = LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::assetIdToBakedTextureIndex(id); + LLViewerTexture* bakedTexture = avatar->getBakedTexture(texIndex); + if (bakedTexture == NULL || bakedTexture->isMissingAsset()) + { + return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + } + else + { + return bakedTexture; + } + } + else + { + return LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + } + +} + +void LLViewerObject::updateAvatarMeshVisibility(const LLUUID& id, const LLUUID& old_id) +{ + if (id == old_id) + { + return; + } + + if (!LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(old_id) && !LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(id)) + { + return; + } + + LLVOAvatar* avatar = getAvatar(); + if (avatar) + { + avatar->updateMeshVisibility(); + } +} + void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry) { + LLUUID old_image_id; + if (getTE(te)) + { + old_image_id = getTE(te)->getID(); + } + LLPrimitive::setTE(te, texture_entry); const LLUUID& image_id = getTE(te)->getID(); - mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + LLViewerTexture* bakedTexture = getBakedTextureForMagicId(image_id); + mTEImages[te] = bakedTexture ? bakedTexture : LLViewerTextureManager::getFetchedTexture(image_id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + + updateAvatarMeshVisibility(image_id,old_image_id); + if (getTE(te)->getMaterialParams().notNull()) { const LLUUID& norm_id = getTE(te)->getMaterialParams()->getNormalID(); @@ -4695,12 +4787,31 @@ void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry) } } +void LLViewerObject::refreshBakeTexture() +{ + for (int face_index = 0; face_index < getNumTEs(); face_index++) + { + LLTextureEntry* tex_entry = getTE(face_index); + if (tex_entry && LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(tex_entry->getID())) + { + const LLUUID& image_id = tex_entry->getID(); + LLViewerTexture* bakedTexture = getBakedTextureForMagicId(image_id); + changeTEImage(face_index, bakedTexture); + } + } +} + void LLViewerObject::setTEImage(const U8 te, LLViewerTexture *imagep) { if (mTEImages[te] != imagep) { - mTEImages[te] = imagep; + LLUUID old_image_id = getTE(te) ? getTE(te)->getID() : LLUUID::null; + LLPrimitive::setTETexture(te, imagep->getID()); + + LLViewerTexture* baked_texture = getBakedTextureForMagicId(imagep->getID()); + mTEImages[te] = baked_texture ? baked_texture : imagep; + updateAvatarMeshVisibility(imagep->getID(), old_image_id); setChanged(TEXTURE); if (mDrawable.notNull()) { @@ -4711,13 +4822,16 @@ void LLViewerObject::setTEImage(const U8 te, LLViewerTexture *imagep) S32 LLViewerObject::setTETextureCore(const U8 te, LLViewerTexture *image) { + LLUUID old_image_id = getTE(te)->getID(); const LLUUID& uuid = image->getID(); S32 retval = 0; if (uuid != getTE(te)->getID() || uuid == LLUUID::null) { retval = LLPrimitive::setTETexture(te, uuid); - mTEImages[te] = image; + LLViewerTexture* baked_texture = getBakedTextureForMagicId(uuid); + mTEImages[te] = baked_texture ? baked_texture : image; + updateAvatarMeshVisibility(uuid,old_image_id); setChanged(TEXTURE); if (mDrawable.notNull()) { @@ -4808,7 +4922,7 @@ S32 LLViewerObject::setTETexture(const U8 te, const LLUUID& uuid) // Invalid host == get from the agent's sim LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture( uuid, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, LLHost()); - return setTETextureCore(te,image); + return setTETextureCore(te, image); } S32 LLViewerObject::setTENormalMap(const U8 te, const LLUUID& uuid) diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index d6c8b761479d7bd8101be4a1bd6aa6d1b9f94ade..873b300489bc8c609e96880f13075a91e2b4fd01 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -587,6 +587,10 @@ class LLViewerObject friend class LLViewerObjectList; friend class LLViewerMediaList; +public: + LLViewerTexture* getBakedTextureForMagicId(const LLUUID& id); + void updateAvatarMeshVisibility(const LLUUID& id, const LLUUID& old_id); + void refreshBakeTexture(); public: static void unpackVector3(LLDataPackerBinaryBuffer* dp, LLVector3& value, std::string name); static void unpackUUID(LLDataPackerBinaryBuffer* dp, LLUUID& value, std::string name); @@ -615,7 +619,7 @@ class LLViewerObject U32 checkMediaURL(const std::string &media_url); // Motion prediction between updates - void interpolateLinearMotion(const F64SecondsImplicit & time, const F32SecondsImplicit & dt); + void interpolateLinearMotion(const F64SecondsImplicit & frame_time, const F32SecondsImplicit & dt); static void initObjectDataMap(); @@ -772,6 +776,7 @@ class LLViewerObject F64Seconds mLastInterpUpdateSecs; // Last update for purposes of interpolation F64Seconds mLastMessageUpdateSecs; // Last update from a message from the simulator TPACKETID mLatestRecvPacketID; // Latest time stamp on message from simulator + F64SecondsImplicit mRegionCrossExpire; // frame time we detected region crossing in + wait time // extra data sent from the sim...currently only used for tree species info U8* mData; @@ -851,6 +856,7 @@ class LLViewerObject static void setPhaseOutUpdateInterpolationTime(F32 value) { sPhaseOutUpdateInterpolationTime = (F64Seconds) value; } static void setMaxUpdateInterpolationTime(F32 value) { sMaxUpdateInterpolationTime = (F64Seconds) value; } + static void setMaxRegionCrossingInterpolationTime(F32 value) { sMaxRegionCrossingInterpolationTime = (F64Seconds) value; } static void setVelocityInterpolate(BOOL value) { sVelocityInterpolate = value; } static void setPingInterpolate(BOOL value) { sPingInterpolate = value; } @@ -860,6 +866,7 @@ class LLViewerObject static F64Seconds sPhaseOutUpdateInterpolationTime; // For motion interpolation static F64Seconds sMaxUpdateInterpolationTime; // For motion interpolation + static F64Seconds sMaxRegionCrossingInterpolationTime; // For motion interpolation static BOOL sVelocityInterpolate; static BOOL sPingInterpolate; diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 2aff71367efe22b3b36039eac47bebf6a7266172..932759c86d3de47466c282f5d078f72c8674ff73 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -854,6 +854,7 @@ void LLViewerObjectList::update(LLAgent &agent) F32 interp_time = gSavedSettings.getF32("InterpolationTime"); F32 phase_out_time = gSavedSettings.getF32("InterpolationPhaseOut"); + F32 region_interp_time = llclamp(gSavedSettings.getF32("RegionCrossingInterpolationTime"), 0.5f, 5.f); if (interp_time < 0.0 || phase_out_time < 0.0 || phase_out_time > interp_time) @@ -864,6 +865,7 @@ void LLViewerObjectList::update(LLAgent &agent) } LLViewerObject::setPhaseOutUpdateInterpolationTime( interp_time ); LLViewerObject::setMaxUpdateInterpolationTime( phase_out_time ); + LLViewerObject::setMaxRegionCrossingInterpolationTime(region_interp_time); gAnimateTextures = gSavedSettings.getBOOL("AnimateTextures"); diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index f4d14a39fe8d26a87113c27c1b12a288c8071c31..416d5d8e2ef1bbca6dfd6d489adff5b6d37d4040 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -957,7 +957,7 @@ void LLViewerParcelMgr::sendParcelGodForceOwner(const LLUUID& owner_id) return; } - LL_INFOS() << "Claiming " << mWestSouth << " to " << mEastNorth << LL_ENDL; + LL_INFOS("ParcelMgr") << "Claiming " << mWestSouth << " to " << mEastNorth << LL_ENDL; // BUG: Only works for the region containing mWestSouthBottom LLVector3d east_north_region_check( mEastNorth ); @@ -980,7 +980,7 @@ void LLViewerParcelMgr::sendParcelGodForceOwner(const LLUUID& owner_id) return; } - LL_INFOS() << "Region " << region->getOriginGlobal() << LL_ENDL; + LL_INFOS("ParcelMgr") << "Region " << region->getOriginGlobal() << LL_ENDL; LLSD payload; payload["owner_id"] = owner_id; @@ -1120,8 +1120,8 @@ LLViewerParcelMgr::ParcelBuyInfo* LLViewerParcelMgr::setupParcelBuy( if (is_claim) { - LL_INFOS() << "Claiming " << mWestSouth << " to " << mEastNorth << LL_ENDL; - LL_INFOS() << "Region " << region->getOriginGlobal() << LL_ENDL; + LL_INFOS("ParcelMgr") << "Claiming " << mWestSouth << " to " << mEastNorth << LL_ENDL; + LL_INFOS("ParcelMgr") << "Region " << region->getOriginGlobal() << LL_ENDL; // BUG: Only works for the region containing mWestSouthBottom LLVector3d east_north_region_check( mEastNorth ); @@ -1294,8 +1294,6 @@ void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel, bool use_ag if (!region) return; - //LL_INFOS() << "found region: " << region->getName() << LL_ENDL; - LLSD body; std::string url = region->getCapability("ParcelPropertiesUpdate"); if (!url.empty()) @@ -1304,7 +1302,7 @@ void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel, bool use_ag U32 message_flags = 0x01; body["flags"] = ll_sd_from_U32(message_flags); parcel->packMessage(body); - LL_INFOS() << "Sending parcel properties update via capability to: " + LL_INFOS("ParcelMgr") << "Sending parcel properties update via capability to: " << url << LL_ENDL; LLCoreHttpUtil::HttpCoroutineAdapter::messageHttpPost(url, body, @@ -1333,22 +1331,18 @@ void LLViewerParcelMgr::sendParcelPropertiesUpdate(LLParcel* parcel, bool use_ag void LLViewerParcelMgr::setHoverParcel(const LLVector3d& pos) { static U32 last_west, last_south; - + static LLUUID last_region; // only request parcel info if position has changed outside of the // last parcel grid step - U32 west_parcel_step = (U32) floor( pos.mdV[VX] / PARCEL_GRID_STEP_METERS ); - U32 south_parcel_step = (U32) floor( pos.mdV[VY] / PARCEL_GRID_STEP_METERS ); - + const U32 west_parcel_step = (U32) floor( pos.mdV[VX] / PARCEL_GRID_STEP_METERS ); + const U32 south_parcel_step = (U32) floor( pos.mdV[VY] / PARCEL_GRID_STEP_METERS ); + if ((west_parcel_step == last_west) && (south_parcel_step == last_south)) { + // We are staying in same segment return; } - else - { - last_west = west_parcel_step; - last_south = south_parcel_step; - } LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal( pos ); if (!region) @@ -1356,34 +1350,95 @@ void LLViewerParcelMgr::setHoverParcel(const LLVector3d& pos) return; } + LLUUID region_id = region->getRegionID(); + LLVector3 pos_in_region = region->getPosRegionFromGlobal(pos); - // Send a rectangle around the point. - // This means the parcel sent back is at least a rectangle around the point, - // which is more efficient for public land. Fewer requests are sent. JC - LLVector3 wsb_region = region->getPosRegionFromGlobal( pos ); + bool request_properties = false; + if (region_id != last_region) + { + request_properties = true; + } + else + { + // Check if new position is in same parcel. + // This check is not ideal, since it checks by way of straight lines. + // So sometimes (small parcel in the middle of large one) it can + // decide that parcel actually changed, but it still allows to + // reduce amount of requests significantly - F32 west = PARCEL_GRID_STEP_METERS * floor( wsb_region.mV[VX] / PARCEL_GRID_STEP_METERS ); - F32 south = PARCEL_GRID_STEP_METERS * floor( wsb_region.mV[VY] / PARCEL_GRID_STEP_METERS ); + S32 west_parcel_local = (S32)(pos_in_region.mV[VX] / PARCEL_GRID_STEP_METERS); + S32 south_parcel_local = (S32)(pos_in_region.mV[VY] / PARCEL_GRID_STEP_METERS); - F32 east = west + PARCEL_GRID_STEP_METERS; - F32 north = south + PARCEL_GRID_STEP_METERS; + LLViewerParcelOverlay* overlay = region->getParcelOverlay(); + if (!overlay) + { + request_properties = true; + } + while (!request_properties && west_parcel_step < last_west) + { + S32 segment_shift = last_west - west_parcel_step; + request_properties = overlay->parcelLineFlags(south_parcel_local, west_parcel_local + segment_shift) & PARCEL_WEST_LINE; + last_west--; + } + while (!request_properties && south_parcel_step < last_south) + { + S32 segment_shift = last_south - south_parcel_step; + request_properties = overlay->parcelLineFlags(south_parcel_local + segment_shift, west_parcel_local) & PARCEL_SOUTH_LINE; + last_south--; + } + // Note: could have just swapped values, reused first two 'while' and set last_south, last_west separately, + // but this looks to be easier to understand/straightforward/less bulky + while (!request_properties && west_parcel_step > last_west) + { + S32 segment_shift = west_parcel_step - last_west; + request_properties = overlay->parcelLineFlags(south_parcel_local, west_parcel_local - segment_shift + 1) & PARCEL_WEST_LINE; + last_west++; + } + while (!request_properties && south_parcel_step > last_south) + { + S32 segment_shift = south_parcel_step - last_south; + request_properties = overlay->parcelLineFlags(south_parcel_local - segment_shift + 1, west_parcel_local) & PARCEL_SOUTH_LINE; + last_south++; + } - // Send request message - LLMessageSystem *msg = gMessageSystem; - msg->newMessageFast(_PREHASH_ParcelPropertiesRequest); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); - msg->nextBlockFast(_PREHASH_ParcelData); - msg->addS32Fast(_PREHASH_SequenceID, HOVERED_PARCEL_SEQ_ID ); - msg->addF32Fast(_PREHASH_West, west ); - msg->addF32Fast(_PREHASH_South, south ); - msg->addF32Fast(_PREHASH_East, east ); - msg->addF32Fast(_PREHASH_North, north ); - msg->addBOOL("SnapSelection", FALSE ); - msg->sendReliable( region->getHost() ); + // if (!request_properties) last_south and last_west will be equal to new values + } + + if (request_properties) + { + last_west = west_parcel_step; + last_south = south_parcel_step; + last_region = region_id; - mHoverRequestResult = PARCEL_RESULT_NO_DATA; + LL_DEBUGS("ParcelMgr") << "Requesting parcel properties on hover, for " << pos << LL_ENDL; + + + // Send a rectangle around the point. + // This means the parcel sent back is at least a rectangle around the point, + // which is more efficient for public land. Fewer requests are sent. JC + F32 west = PARCEL_GRID_STEP_METERS * floor(pos_in_region.mV[VX] / PARCEL_GRID_STEP_METERS); + F32 south = PARCEL_GRID_STEP_METERS * floor(pos_in_region.mV[VY] / PARCEL_GRID_STEP_METERS); + + F32 east = west + PARCEL_GRID_STEP_METERS; + F32 north = south + PARCEL_GRID_STEP_METERS; + + // Send request message + LLMessageSystem *msg = gMessageSystem; + msg->newMessageFast(_PREHASH_ParcelPropertiesRequest); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_ParcelData); + msg->addS32Fast(_PREHASH_SequenceID, HOVERED_PARCEL_SEQ_ID); + msg->addF32Fast(_PREHASH_West, west); + msg->addF32Fast(_PREHASH_South, south); + msg->addF32Fast(_PREHASH_East, east); + msg->addF32Fast(_PREHASH_North, north); + msg->addBOOL("SnapSelection", FALSE); + msg->sendReliable(region->getHost()); + + mHoverRequestResult = PARCEL_RESULT_NO_DATA; + } } @@ -1472,7 +1527,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use if (request_result == PARCEL_RESULT_NO_DATA) { // no valid parcel data - LL_INFOS() << "no valid parcel data" << LL_ENDL; + LL_INFOS("ParcelMgr") << "no valid parcel data" << LL_ENDL; return; } @@ -1504,7 +1559,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use } else { - LL_INFOS() << "out of order agent parcel sequence id " << sequence_id + LL_INFOS("ParcelMgr") << "out of order agent parcel sequence id " << sequence_id << " last good " << parcel_mgr.mAgentParcelSequenceID << LL_ENDL; return; @@ -1552,6 +1607,8 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use msg->getS32("ParcelData", "OtherCleanTime", other_clean_time ); + LL_DEBUGS("ParcelMgr") << "Processing parcel " << local_id << " update, target(sequence): " << sequence_id << LL_ENDL; + // Actually extract the data. if (parcel) { @@ -1790,7 +1847,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use } else { - LL_INFOS() << "Stopping parcel music (invalid audio stream URL)" << LL_ENDL; + LL_INFOS("ParcelMgr") << "Stopping parcel music (invalid audio stream URL)" << LL_ENDL; // clears the URL // null value causes fade out LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null); @@ -1798,7 +1855,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use } else if (!gAudiop->getInternetStreamURL().empty()) { - LL_INFOS() << "Stopping parcel music (parcel stream URL is empty)" << LL_ENDL; + LL_INFOS("ParcelMgr") << "Stopping parcel music (parcel stream URL is empty)" << LL_ENDL; // null value causes fade out LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null); } @@ -1827,7 +1884,7 @@ void LLViewerParcelMgr::optionally_start_music(const std::string& music_url) gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) && gSavedSettings.getBOOL("MediaTentativeAutoPlay"))) { - LL_INFOS() << "Starting parcel music " << music_url << LL_ENDL; + LL_INFOS("ParcelMgr") << "Starting parcel music " << music_url << LL_ENDL; LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(music_url); } else @@ -1855,7 +1912,7 @@ void LLViewerParcelMgr::processParcelAccessListReply(LLMessageSystem *msg, void if (parcel_id != parcel->getLocalID()) { - LL_WARNS_ONCE("") << "processParcelAccessListReply for parcel " << parcel_id + LL_WARNS_ONCE("ParcelMgr") << "processParcelAccessListReply for parcel " << parcel_id << " which isn't the selected parcel " << parcel->getLocalID()<< LL_ENDL; return; } diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp index 4fd423b6f4e40df75b45b0e1e2b96f4e6b392f46..7c3dd00e1a1ad88bf5b830461e8b4950f479a8bd 100644 --- a/indra/newview/llviewerparceloverlay.cpp +++ b/indra/newview/llviewerparceloverlay.cpp @@ -274,6 +274,23 @@ U8 LLViewerParcelOverlay::ownership( const LLVector3& pos) const return ownership(row, column); } +U8 LLViewerParcelOverlay::parcelLineFlags(const LLVector3& pos) const +{ + S32 row = S32(pos.mV[VY] / PARCEL_GRID_STEP_METERS); + S32 column = S32(pos.mV[VX] / PARCEL_GRID_STEP_METERS); + return parcelLineFlags(row, column); +} +U8 LLViewerParcelOverlay::parcelLineFlags(S32 row, S32 col) const +{ + U8 flags = PARCEL_WEST_LINE | PARCEL_SOUTH_LINE; + if (row > mParcelGridsPerEdge || col > mParcelGridsPerEdge) + { + LL_WARNS() << "Attempted to get ownership out of region's overlay, row: " << row << " col: " << col << LL_ENDL; + return flags; + } + return mOwnership[row * mParcelGridsPerEdge + col] & flags; +} + F32 LLViewerParcelOverlay::getOwnedRatio() const { S32 size = mParcelGridsPerEdge * mParcelGridsPerEdge; diff --git a/indra/newview/llviewerparceloverlay.h b/indra/newview/llviewerparceloverlay.h index 14a2af5354764a3fd6cdaf08e0e88710e65f4f08..e30dbf17b3ee01ce867e4979f2c324e1dc7ab2fc 100644 --- a/indra/newview/llviewerparceloverlay.h +++ b/indra/newview/llviewerparceloverlay.h @@ -71,6 +71,8 @@ class LLViewerParcelOverlay : public LLGLUpdate S32 renderPropertyLines(); U8 ownership( const LLVector3& pos) const; + U8 parcelLineFlags( const LLVector3& pos) const; + U8 parcelLineFlags(S32 row, S32 col) const; // MANIPULATE void uncompressLandOverlay(S32 chunk, U8 *compressed_overlay); diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 0d7e295b9ad41289484484f8e0d45af438790c19..5b227c641bcaf6273feae67e39119fedff736edb 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -2892,9 +2892,9 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames) capabilityNames.append("DispatchRegionInfo"); capabilityNames.append("DirectDelivery"); capabilityNames.append("EnvironmentSettings"); + capabilityNames.append("EstateAccess"); capabilityNames.append("EstateChangeInfo"); capabilityNames.append("EventQueueGet"); - capabilityNames.append("FacebookConnect"); capabilityNames.append("FlickrConnect"); capabilityNames.append("TwitterConnect"); @@ -3234,6 +3234,12 @@ bool LLViewerRegion::meshUploadEnabled() const mSimulatorFeatures["MeshUploadEnabled"].asBoolean()); } +bool LLViewerRegion::bakesOnMeshEnabled() const +{ + return (mSimulatorFeatures.has("BakesOnMeshEnabled") && + mSimulatorFeatures["BakesOnMeshEnabled"].asBoolean()); +} + bool LLViewerRegion::meshRezEnabled() const { return (mSimulatorFeatures.has("MeshRezEnabled") && diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index d5266ec873373f64413c9e859e762ffecbe3563b..2548ff14230387ac1ff2d9c39e722b04861e760f 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -304,6 +304,8 @@ class LLViewerRegion: public LLCapabilityProvider // implements this interface bool meshRezEnabled() const; bool meshUploadEnabled() const; + bool bakesOnMeshEnabled() const; + // has region received its simulator features list? Requires an additional query after caps received. void requestSimulatorFeatures(); void setSimulatorFeaturesReceived(bool); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index b3d561edd5196b6d52a76311bc97c9456c9abedb..6d8b27ff2d84f159033073b353c29d22f6f00c9e 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -407,7 +407,8 @@ void LLViewerShaderMgr::setShaders() return; } - LLGLSLShader::sIndexedTextureChannels = llmax(llmin(gGLManager.mNumTextureImageUnits, (S32) gSavedSettings.getU32("RenderMaxTextureIndex")), 1); + static LLCachedControl<U32> max_texture_index(gSavedSettings, "RenderMaxTextureIndex", 16); + LLGLSLShader::sIndexedTextureChannels = llmax(llmin(gGLManager.mNumTextureImageUnits, (S32) max_texture_index), 1); //NEVER use more than 16 texture channels (work around for prevalent driver bug) LLGLSLShader::sIndexedTextureChannels = llmin(LLGLSLShader::sIndexedTextureChannels, 16); diff --git a/indra/newview/llviewertexlayer.cpp b/indra/newview/llviewertexlayer.cpp index 66e5742911e85d03128fa23328f2b638d5dc94c0..7f7d190b92f7f773d39c48055dbd833eb174619a 100644 --- a/indra/newview/llviewertexlayer.cpp +++ b/indra/newview/llviewertexlayer.cpp @@ -58,6 +58,8 @@ LLViewerTexLayerSetBuffer::LLViewerTexLayerSetBuffer(LLTexLayerSet* const owner, mNeedsUpdate(TRUE), mNumLowresUpdates(0) { + mGLTexturep->setNeedsAlphaAndPickMask(FALSE); + LLViewerTexLayerSetBuffer::sGLByteCount += getSize(); mNeedsUpdateTimer.start(); } diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 092b51238e638137c083398553c0a5b36a62f51b..a81b3aaef999c4a335de43a23fd42de40ddc4af1 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -100,7 +100,7 @@ const S32 MAX_CACHED_RAW_TERRAIN_IMAGE_AREA = 128 * 128; const S32 DEFAULT_ICON_DIMENTIONS = 32; S32 LLViewerTexture::sMinLargeImageSize = 65536; //256 * 256. S32 LLViewerTexture::sMaxSmallImageSize = MAX_CACHED_RAW_IMAGE_AREA; -BOOL LLViewerTexture::sFreezeImageScalingDown = FALSE; +bool LLViewerTexture::sFreezeImageUpdates = false; F32 LLViewerTexture::sCurrentTime = 0.0f; F32 LLViewerTexture::sTexelPixelRatio = 1.0f; @@ -474,6 +474,7 @@ void LLViewerTexture::initClass() // tuning params const F32 discard_bias_delta = .25f; const F32 discard_delta_time = 0.5f; +const F32 GPU_MEMORY_CHECK_WAIT_TIME = 1.0f; // non-const (used externally F32 texmem_lower_bound_scale = 0.85f; F32 texmem_middle_bound_scale = 0.925f; @@ -483,53 +484,68 @@ static LLTrace::BlockTimerStatHandle FTM_TEXTURE_MEMORY_CHECK("Memory Check"); //static bool LLViewerTexture::isMemoryForTextureLow() { - const F32 WAIT_TIME = 1.0f; //second - static LLFrameTimer timer; + // Note: we need to figure out a better source for 'min' values, + // what is free for low end at minimal settings is 'nothing left' + // for higher end gpus at high settings. + const S32Megabytes MIN_FREE_TEXTURE_MEMORY(20); + const S32Megabytes MIN_FREE_MAIN_MEMORY(100); - if(timer.getElapsedTimeF32() < WAIT_TIME) //call this once per second. - { - return false; - } - timer.reset(); + S32Megabytes gpu; + S32Megabytes physical; + getGPUMemoryForTextures(gpu, physical); - LL_RECORD_BLOCK_TIME(FTM_TEXTURE_MEMORY_CHECK); + return (gpu < MIN_FREE_TEXTURE_MEMORY) || (physical < MIN_FREE_MAIN_MEMORY); +} - const S32Megabytes MIN_FREE_TEXTURE_MEMORY(20); //MB Changed to 20 MB per MAINT-6882 - const S32Megabytes MIN_FREE_MAIN_MEMORY(100); //MB +//static +bool LLViewerTexture::isMemoryForTextureSuficientlyFree() +{ + const S32Megabytes DESIRED_FREE_TEXTURE_MEMORY(50); + const S32Megabytes DESIRED_FREE_MAIN_MEMORY(200); - bool low_mem = false; - if (gGLManager.mHasATIMemInfo) - { - S32 meminfo[4]; - glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo); + S32Megabytes gpu; + S32Megabytes physical; + getGPUMemoryForTextures(gpu, physical); - if((S32Megabytes)meminfo[0] < MIN_FREE_TEXTURE_MEMORY) - { - low_mem = true; - } + return (gpu > DESIRED_FREE_TEXTURE_MEMORY) && (physical > DESIRED_FREE_MAIN_MEMORY); +} - if(!low_mem) //check main memory, only works for windows. - { - LLMemory::updateMemoryInfo(); - if(LLMemory::getAvailableMemKB() < MIN_FREE_TEXTURE_MEMORY) - { - low_mem = true; - } - } - } - //Enabled this branch per MAINT-6882 - else if (gGLManager.mHasNVXMemInfo) - { - S32 free_memory; - glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &free_memory); - - if ((S32Megabytes)(free_memory / 1024) < MIN_FREE_TEXTURE_MEMORY) - { - low_mem = true; - } - } +//static +void LLViewerTexture::getGPUMemoryForTextures(S32Megabytes &gpu, S32Megabytes &physical) +{ + static LLFrameTimer timer; + static S32Megabytes gpu_res = S32Megabytes(S32_MAX); + static S32Megabytes physical_res = S32Megabytes(S32_MAX); - return low_mem; + if (timer.getElapsedTimeF32() < GPU_MEMORY_CHECK_WAIT_TIME) //call this once per second. + { + gpu = gpu_res; + physical = physical_res; + return; + } + timer.reset(); + + LL_RECORD_BLOCK_TIME(FTM_TEXTURE_MEMORY_CHECK); + + if (gGLManager.mHasATIMemInfo) + { + S32 meminfo[4]; + glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo); + gpu_res = (S32Megabytes)meminfo[0]; + + //check main memory, only works for windows. + LLMemory::updateMemoryInfo(); + physical_res = LLMemory::getAvailableMemKB(); + } + else if (gGLManager.mHasNVXMemInfo) + { + S32 free_memory; + glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &free_memory); + gpu_res = (S32Megabytes)(free_memory / 1024); + } + + gpu = gpu_res; + physical = physical_res; } static LLTrace::BlockTimerStatHandle FTM_TEXTURE_UPDATE_MEDIA("Media"); @@ -572,15 +588,20 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity sEvaluationTimer.reset(); } } - else if(sEvaluationTimer.getElapsedTimeF32() > discard_delta_time && isMemoryForTextureLow()) + else if(isMemoryForTextureLow()) { - sDesiredDiscardBias += discard_bias_delta; - sEvaluationTimer.reset(); + // Note: isMemoryForTextureLow() uses 1s delay, make sure we waited enough for it to recheck + if (sEvaluationTimer.getElapsedTimeF32() > GPU_MEMORY_CHECK_WAIT_TIME) + { + sDesiredDiscardBias += discard_bias_delta; + sEvaluationTimer.reset(); + } } - else if (sDesiredDiscardBias > 0.0f && - sBoundTextureMemory < sMaxBoundTextureMemory * texmem_lower_bound_scale && - sTotalTextureMemory < sMaxTotalTextureMem * texmem_lower_bound_scale) - { + else if (sDesiredDiscardBias > 0.0f + && sBoundTextureMemory < sMaxBoundTextureMemory * texmem_lower_bound_scale + && sTotalTextureMemory < sMaxTotalTextureMem * texmem_lower_bound_scale + && isMemoryForTextureSuficientlyFree()) + { // If we are using less texture memory than we should, // scale down the desired discard level if (sEvaluationTimer.getElapsedTimeF32() > discard_delta_time) @@ -590,14 +611,8 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity } } sDesiredDiscardBias = llclamp(sDesiredDiscardBias, desired_discard_bias_min, desired_discard_bias_max); - - F32 camera_moving_speed = LLViewerCamera::getInstance()->getAverageSpeed(); - F32 camera_angular_speed = LLViewerCamera::getInstance()->getAverageAngularSpeed(); - sCameraMovingBias = llmax(0.2f * camera_moving_speed, 2.0f * camera_angular_speed - 1); - sCameraMovingDiscardBias = (S8)(sCameraMovingBias); - LLViewerTexture::sFreezeImageScalingDown = (sBoundTextureMemory < 0.75f * sMaxBoundTextureMemory * texmem_middle_bound_scale) && - (sTotalTextureMemory < 0.75f * sMaxTotalTextureMem * texmem_middle_bound_scale); + LLViewerTexture::sFreezeImageUpdates = sDesiredDiscardBias > (desired_discard_bias_max - 1.0f); } //end of static functions @@ -1204,6 +1219,7 @@ void LLViewerFetchedTexture::loadFromFastCache() F32 cachReadTime = fastCacheTimer.getElapsedTimeF32(); add(LLTextureFetch::sCacheHit, 1.0); + record(LLTextureFetch::sCacheHitRate, LLUnits::Ratio::fromValue(1)); sample(LLTextureFetch::sCacheReadLatency, cachReadTime); mFullWidth = mRawImage->getWidth() << mRawDiscardLevel; @@ -1236,6 +1252,10 @@ void LLViewerFetchedTexture::loadFromFastCache() addToCreateTexture(); } } + else + { + record(LLTextureFetch::sCacheHitRate, LLUnits::Ratio::fromValue(0)); + } } void LLViewerFetchedTexture::setForSculpt() @@ -3125,9 +3145,9 @@ S8 LLViewerLODTexture::getType() const return LLViewerTexture::LOD_TEXTURE; } -BOOL LLViewerLODTexture::isUpdateFrozen() +bool LLViewerLODTexture::isUpdateFrozen() { - return LLViewerTexture::sFreezeImageScalingDown && !getDiscardLevel(); + return LLViewerTexture::sFreezeImageUpdates; } // This is gauranteed to get called periodically for every texture @@ -3253,9 +3273,16 @@ void LLViewerLODTexture::processTextureStats() (!getBoundRecently() || mDesiredDiscardLevel >= mCachedRawDiscardLevel)) { scaleDown(); - } } + + if (isUpdateFrozen() // we are out of memory and nearing max allowed bias + && mBoostLevel < LLGLTexture::BOOST_SCULPTED + && mDesiredDiscardLevel < current_discard) + { + // stop requesting more + mDesiredDiscardLevel = current_discard; + } } if(mForceToSaveRawImage && mDesiredSavedRawDiscardLevel >= 0) diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 5d89f9f029badecedadc4cd38410c49f919cbbb1..7cbcc931b15436bf9f8da53b6c8050e0b4f42ee8 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -186,6 +186,9 @@ class LLViewerTexture : public LLGLTexture virtual void switchToCachedImage(); static bool isMemoryForTextureLow() ; + static bool isMemoryForTextureSuficientlyFree(); + static void getGPUMemoryForTextures(S32Megabytes &gpu, S32Megabytes &physical); + protected: LLUUID mID; S32 mTextureListType; // along with mID identifies where to search for this texture in TextureList @@ -227,7 +230,7 @@ class LLViewerTexture : public LLGLTexture static S32 sMaxSculptRez ; static S32 sMinLargeImageSize ; static S32 sMaxSmallImageSize ; - static BOOL sFreezeImageScalingDown ;//do not scale down image res if set. + static bool sFreezeImageUpdates; static F32 sCurrentTime ; enum EDebugTexels @@ -543,7 +546,7 @@ class LLViewerLODTexture : public LLViewerFetchedTexture /*virtual*/ S8 getType() const; // Process image stats to determine priority/quality requirements. /*virtual*/ void processTextureStats(); - BOOL isUpdateFrozen() ; + bool isUpdateFrozen() ; private: void init(bool firstinit) ; diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 4308405c64225ff186ad4059f0a2b6aab61986e3..06524847d1780783df9272812a8d2a33f24b2148 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -512,7 +512,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id, if (boost_priority != LLViewerTexture::BOOST_ALM && imagep->getBoostLevel() == LLViewerTexture::BOOST_ALM) { // Workaround: we need BOOST_ALM texture for something, 'rise' to NONE - imagep->setDecodePriority(LLViewerTexture::BOOST_NONE); + imagep->setBoostLevel(LLViewerTexture::BOOST_NONE); } LLViewerFetchedTexture *texture = imagep.get(); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index cc10d08f3a680b4fde030adaf05d50ff322039b9..4c6a3dd33d02026a52dad58320ca90e13d238216 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1763,9 +1763,19 @@ LLViewerWindow::LLViewerWindow(const Params& p) LLCoordScreen scr; mWindow->getSize(&scr); + // Reset UI scale factor on first run if OS's display scaling is not 100% + if (gSavedSettings.getBOOL("ResetUIScaleOnFirstRun")) + { + if (mWindow->getSystemUISize() != 1.f) + { + gSavedSettings.setF32("UIScaleFactor", 1.f); + } + gSavedSettings.setBOOL("ResetUIScaleOnFirstRun", FALSE); + } + // Get the real window rect the window was created with (since there are various OS-dependent reasons why // the size of a window or fullscreen context may have been adjusted slightly...) - F32 ui_scale_factor = llclamp(gSavedSettings.getF32("UIScaleFactor"), MIN_UI_SCALE, MAX_UI_SCALE) * mWindow->getSystemUISize(); + F32 ui_scale_factor = llclamp(gSavedSettings.getF32("UIScaleFactor") * mWindow->getSystemUISize(), MIN_UI_SCALE, MAX_UI_SCALE); mDisplayScale.setVec(llmax(1.f / mWindow->getPixelAspectRatio(), 1.f), llmax(mWindow->getPixelAspectRatio(), 1.f)); mDisplayScale *= ui_scale_factor; @@ -3809,7 +3819,7 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls, BOOL draw_handles = TRUE; - if (tool == LLToolCompTranslate::getInstance() && !all_selected_objects_move) + if (tool == LLToolCompTranslate::getInstance() && !all_selected_objects_move && !LLSelectMgr::getInstance()->isSelfAvatarSelected()) { draw_handles = FALSE; } @@ -4610,7 +4620,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei if ((image_width <= gGLManager.mGLMaxTextureSize && image_height <= gGLManager.mGLMaxTextureSize) && (image_width > window_width || image_height > window_height) && LLPipeline::sRenderDeferred && !show_ui) { - if (scratch_space.allocate(image_width, image_height, GL_RGBA, true, true)) + if (scratch_space.allocate(image_width, image_height, GL_DEPTH_COMPONENT, true, true)) { original_width = gPipeline.mDeferredScreen.getWidth(); original_height = gPipeline.mDeferredScreen.getHeight(); @@ -4724,6 +4734,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei { // Required for showing the GUI in snapshots and performing bloom composite overlay // Call even if show_ui is FALSE + LL_RECORD_BLOCK_TIME(FTM_RENDER_UI); render_ui(scale_factor, subfield); swap(); } @@ -5338,7 +5349,7 @@ F32 LLViewerWindow::getWorldViewAspectRatio() const void LLViewerWindow::calcDisplayScale() { - F32 ui_scale_factor = llclamp(gSavedSettings.getF32("UIScaleFactor"), MIN_UI_SCALE, MAX_UI_SCALE) * mWindow->getSystemUISize(); + F32 ui_scale_factor = llclamp(gSavedSettings.getF32("UIScaleFactor") * mWindow->getSystemUISize(), MIN_UI_SCALE, MAX_UI_SCALE); LLVector2 display_scale; display_scale.setVec(llmax(1.f / mWindow->getPixelAspectRatio(), 1.f), llmax(mWindow->getPixelAspectRatio(), 1.f)); display_scale *= ui_scale_factor; diff --git a/indra/newview/llvlcomposition.cpp b/indra/newview/llvlcomposition.cpp index c4430f4308933ad7022abde119912ccca1b723fa..c63c5f6b23b9ffd04961f49c1f1cc27f25fd2016 100644 --- a/indra/newview/llvlcomposition.cpp +++ b/indra/newview/llvlcomposition.cpp @@ -99,6 +99,8 @@ void LLVLComposition::setDetailTextureID(S32 corner, const LLUUID& id) { return; } + // This is terrain texture, but we are not setting it as BOOST_TERRAIN + // since we will be manipulating it later as needed. mDetailTextures[corner] = LLViewerTextureManager::getFetchedTexture(id); mDetailTextures[corner]->setNoDelete() ; mRawImages[corner] = NULL; @@ -241,6 +243,7 @@ BOOL LLVLComposition::generateComposition() } mDetailTextures[i]->setBoostLevel(LLGLTexture::BOOST_TERRAIN); // in case we are at low detail mDetailTextures[i]->setMinDiscardLevel(ddiscard); + mDetailTextures[i]->addTextureStats(BASE_SIZE*BASE_SIZE); // priority return FALSE; } } @@ -287,7 +290,7 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y, { mDetailTextures[i]->destroyRawImage() ; } - LL_DEBUGS() << "cached raw data for terrain detail texture is not ready yet: " << mDetailTextures[i]->getID() << LL_ENDL; + LL_DEBUGS("Terrain") << "cached raw data for terrain detail texture is not ready yet: " << mDetailTextures[i]->getID() << " Discard: " << ddiscard << LL_ENDL; return FALSE; } @@ -323,12 +326,12 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y, if (x_end > mWidth) { - LL_WARNS() << "x end > width" << LL_ENDL; + LL_WARNS("Terrain") << "x end > width" << LL_ENDL; x_end = mWidth; } if (y_end > mWidth) { - LL_WARNS() << "y end > width" << LL_ENDL; + LL_WARNS("Terrain") << "y end > width" << LL_ENDL; y_end = mWidth; } @@ -358,7 +361,7 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y, if (tex_comps != st_comps) { - LL_WARNS() << "Base texture comps != input texture comps" << LL_ENDL; + LL_WARNS("Terrain") << "Base texture comps != input texture comps" << LL_ENDL; return FALSE; } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 321f774210e640380a992ddbfe8f35db6172c61f..5584efeb7b1e077ad677b4cea74b74e0204cb028 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -751,8 +751,8 @@ std::string LLVOAvatar::avString() const } else { - std::string viz_string = LLVOAvatar::rezStatusToString(getRezzedStatus()); - return " Avatar '" + getFullname() + "' " + viz_string + " "; + std::string viz_string = LLVOAvatar::rezStatusToString(getRezzedStatus()); + return " Avatar '" + getFullname() + "' " + viz_string + " "; } } @@ -829,7 +829,8 @@ BOOL LLVOAvatar::isFullyBaked() for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { if (!isTextureDefined(mBakedTextureDatas[i].mTextureIndex) - && ( (i != BAKED_SKIRT) || isWearingWearableType(LLWearableType::WT_SKIRT) ) ) + && ((i != BAKED_SKIRT) || isWearingWearableType(LLWearableType::WT_SKIRT)) + && (i != BAKED_LEFT_ARM) && (i != BAKED_LEFT_LEG) && (i != BAKED_AUX1) && (i != BAKED_AUX2) && (i != BAKED_AUX3)) { return FALSE; } @@ -1322,7 +1323,7 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax) if (dist_vec(zero_pos, mPelvisp->getWorldPosition())<0.001) { // Don't use pelvis until av initialized - pos.load3(getRenderPosition().mV); + pos.load3(getRenderPosition().mV); } else { @@ -1336,16 +1337,16 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax) //displayed, can give inaccurate boxes due to joints stuck at (0,0,0). if ((box_detail>=1) && !isControlAvatar()) { - for (polymesh_map_t::iterator i = mPolyMeshes.begin(); i != mPolyMeshes.end(); ++i) - { - LLPolyMesh* mesh = i->second; - for (S32 joint_num = 0; joint_num < mesh->mJointRenderData.size(); joint_num++) - { - LLVector4a trans; - trans.load3( mesh->mJointRenderData[joint_num]->mWorldMatrix->getTranslation().mV); - update_min_max(newMin, newMax, trans); - } - } + for (polymesh_map_t::iterator i = mPolyMeshes.begin(); i != mPolyMeshes.end(); ++i) + { + LLPolyMesh* mesh = i->second; + for (S32 joint_num = 0; joint_num < mesh->mJointRenderData.size(); joint_num++) + { + LLVector4a trans; + trans.load3( mesh->mJointRenderData[joint_num]->mWorldMatrix->getTranslation().mV); + update_min_max(newMin, newMax, trans); + } + } } @@ -1362,22 +1363,22 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax) { float max_attachment_span = get_default_max_prim_scale() * 5.0f; - for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); - iter != mAttachmentPoints.end(); - ++iter) - { - LLViewerJointAttachment* attachment = iter->second; + for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); + iter != mAttachmentPoints.end(); + ++iter) + { + LLViewerJointAttachment* attachment = iter->second; - if (attachment->getValid()) - { - for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); - attachment_iter != attachment->mAttachedObjects.end(); - ++attachment_iter) - { + if (attachment->getValid()) + { + for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); + attachment_iter != attachment->mAttachedObjects.end(); + ++attachment_iter) + { // Don't we need to look at children of attached_object as well? - const LLViewerObject* attached_object = (*attachment_iter); - if (attached_object && !attached_object->isHUDAttachment()) - { + const LLViewerObject* attached_object = (*attachment_iter); + if (attached_object && !attached_object->isHUDAttachment()) + { const LLVOVolume *vol = dynamic_cast<const LLVOVolume*>(attached_object); if (vol && vol->isAnimatedObject()) { @@ -1399,33 +1400,33 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax) { continue; } - LLDrawable* drawable = attached_object->mDrawable; - if (drawable && !drawable->isState(LLDrawable::RIGGED)) - { - LLSpatialBridge* bridge = drawable->getSpatialBridge(); - if (bridge) - { - const LLVector4a* ext = bridge->getSpatialExtents(); - LLVector4a distance; - distance.setSub(ext[1], ext[0]); - LLVector4a max_span(max_attachment_span); + LLDrawable* drawable = attached_object->mDrawable; + if (drawable && !drawable->isState(LLDrawable::RIGGED)) + { + LLSpatialBridge* bridge = drawable->getSpatialBridge(); + if (bridge) + { + const LLVector4a* ext = bridge->getSpatialExtents(); + LLVector4a distance; + distance.setSub(ext[1], ext[0]); + LLVector4a max_span(max_attachment_span); - S32 lt = distance.lessThan(max_span).getGatheredBits() & 0x7; + S32 lt = distance.lessThan(max_span).getGatheredBits() & 0x7; - // Only add the prim to spatial extents calculations if it isn't a megaprim. - // max_attachment_span calculated at the start of the function - // (currently 5 times our max prim size) - if (lt == 0x7) - { - update_min_max(newMin,newMax,ext[0]); - update_min_max(newMin,newMax,ext[1]); - } - } - } - } - } - } - } + // Only add the prim to spatial extents calculations if it isn't a megaprim. + // max_attachment_span calculated at the start of the function + // (currently 5 times our max prim size) + if (lt == 0x7) + { + update_min_max(newMin,newMax,ext[0]); + update_min_max(newMin,newMax,ext[1]); + } + } + } + } + } + } + } } // Stretch bounding box by rigged mesh joint boxes @@ -1949,7 +1950,7 @@ void LLVOAvatar::buildCharacter() // Currently disabled for control avatars (animated objects), enabled for all others. if (mEnableDefaultMotions) { - startDefaultMotions(); + startDefaultMotions(); } //------------------------------------------------------------------------- @@ -2066,8 +2067,8 @@ void LLVOAvatar::resetSkeleton(bool reset_animations) // Reset tweakable params to preserved state if (mLastProcessedAppearance) { - bool slam_params = true; - applyParsedAppearanceMessage(*mLastProcessedAppearance, slam_params); + bool slam_params = true; + applyParsedAppearanceMessage(*mLastProcessedAppearance, slam_params); } updateVisualParams(); @@ -2119,15 +2120,15 @@ void LLVOAvatar::releaseMeshData() LLFace* facep = mDrawable->getFace(0); if (facep) { - facep->setSize(0, 0); - for(S32 i = mNumInitFaces ; i < mDrawable->getNumFaces(); i++) - { - facep = mDrawable->getFace(i); + facep->setSize(0, 0); + for(S32 i = mNumInitFaces ; i < mDrawable->getNumFaces(); i++) + { + facep = mDrawable->getFace(i); if (facep) { - facep->setSize(0, 0); - } - } + facep->setSize(0, 0); + } + } } } @@ -2385,6 +2386,7 @@ LLViewerFetchedTexture *LLVOAvatar::getBakedTextureImage(const U8 te, const LLUU { result->setIsMissingAsset(false); } + } return result; } @@ -2770,13 +2772,13 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update) if (mDrawable.notNull()) { - mDrawable->movePartition(); - - //force a move if sitting on an active object - if (getParent() && ((LLViewerObject*) getParent())->mDrawable->isActive()) - { - gPipeline.markMoved(mDrawable, TRUE); - } + mDrawable->movePartition(); + + //force a move if sitting on an active object + if (getParent() && ((LLViewerObject*) getParent())->mDrawable->isActive()) + { + gPipeline.markMoved(mDrawable, TRUE); + } } } @@ -3539,66 +3541,67 @@ bool LLVOAvatar::isInMuteList() void LLVOAvatar::updateAppearanceMessageDebugText() { - S32 central_bake_version = -1; - if (getRegion()) - { - central_bake_version = getRegion()->getCentralBakeVersion(); - } - bool all_baked_downloaded = allBakedTexturesCompletelyDownloaded(); - bool all_local_downloaded = allLocalTexturesCompletelyDownloaded(); - std::string debug_line = llformat("%s%s - mLocal: %d, mEdit: %d, mUSB: %d, CBV: %d", - isSelf() ? (all_local_downloaded ? "L" : "l") : "-", - all_baked_downloaded ? "B" : "b", - mUseLocalAppearance, mIsEditingAppearance, - 1, central_bake_version); - std::string origin_string = bakedTextureOriginInfo(); - debug_line += " [" + origin_string + "]"; - S32 curr_cof_version = LLAppearanceMgr::instance().getCOFVersion(); - S32 last_request_cof_version = mLastUpdateRequestCOFVersion; - S32 last_received_cof_version = mLastUpdateReceivedCOFVersion; - if (isSelf()) - { - debug_line += llformat(" - cof: %d req: %d rcv:%d", - curr_cof_version, last_request_cof_version, last_received_cof_version); - if (gSavedSettings.getBOOL("DebugForceAppearanceRequestFailure")) + S32 central_bake_version = -1; + if (getRegion()) + { + central_bake_version = getRegion()->getCentralBakeVersion(); + } + bool all_baked_downloaded = allBakedTexturesCompletelyDownloaded(); + bool all_local_downloaded = allLocalTexturesCompletelyDownloaded(); + std::string debug_line = llformat("%s%s - mLocal: %d, mEdit: %d, mUSB: %d, CBV: %d", + isSelf() ? (all_local_downloaded ? "L" : "l") : "-", + all_baked_downloaded ? "B" : "b", + mUseLocalAppearance, mIsEditingAppearance, + 1, central_bake_version); + std::string origin_string = bakedTextureOriginInfo(); + debug_line += " [" + origin_string + "]"; + S32 curr_cof_version = LLAppearanceMgr::instance().getCOFVersion(); + S32 last_request_cof_version = mLastUpdateRequestCOFVersion; + S32 last_received_cof_version = mLastUpdateReceivedCOFVersion; + if (isSelf()) + { + debug_line += llformat(" - cof: %d req: %d rcv:%d", + curr_cof_version, last_request_cof_version, last_received_cof_version); + if (gSavedSettings.getBOOL("DebugForceAppearanceRequestFailure")) + { + debug_line += " FORCING ERRS"; + } + } + else + { + debug_line += llformat(" - cof rcv:%d", last_received_cof_version); + } + debug_line += llformat(" bsz-z: %.3f", mBodySize[2]); + if (mAvatarOffset[2] != 0.0f) { - debug_line += " FORCING ERRS"; + debug_line += llformat("avofs-z: %.3f", mAvatarOffset[2]); } - } - else - { - debug_line += llformat(" - cof rcv:%d", last_received_cof_version); - } - debug_line += llformat(" bsz-z: %.3f", mBodySize[2]); - if (mAvatarOffset[2] != 0.0f) - { - debug_line += llformat("avofs-z: %.3f", mAvatarOffset[2]); - } - bool hover_enabled = getRegion() && getRegion()->avatarHoverHeightEnabled(); - debug_line += hover_enabled ? " H" : " h"; - const LLVector3& hover_offset = getHoverOffset(); - if (hover_offset[2] != 0.0) - { - debug_line += llformat(" hov_z: %.3f", hover_offset[2]); + bool hover_enabled = getRegion() && getRegion()->avatarHoverHeightEnabled(); + debug_line += hover_enabled ? " H" : " h"; + const LLVector3& hover_offset = getHoverOffset(); + if (hover_offset[2] != 0.0) + { + debug_line += llformat(" hov_z: %.3f", hover_offset[2]); debug_line += llformat(" %s", (isSitting() ? "S" : "T")); - debug_line += llformat("%s", (isMotionActive(ANIM_AGENT_SIT_GROUND_CONSTRAINED) ? "G" : "-")); - } - LLVector3 ankle_right_pos_agent = mFootRightp->getWorldPosition(); - LLVector3 normal; - LLVector3 ankle_right_ground_agent = ankle_right_pos_agent; - resolveHeightAgent(ankle_right_pos_agent, ankle_right_ground_agent, normal); - F32 rightElev = llmax(-0.2f, ankle_right_pos_agent.mV[VZ] - ankle_right_ground_agent.mV[VZ]); - debug_line += llformat(" relev %.3f", rightElev); + debug_line += llformat("%s", (isMotionActive(ANIM_AGENT_SIT_GROUND_CONSTRAINED) ? "G" : "-")); + } + + LLVector3 ankle_right_pos_agent = mFootRightp->getWorldPosition(); + LLVector3 normal; + LLVector3 ankle_right_ground_agent = ankle_right_pos_agent; + resolveHeightAgent(ankle_right_pos_agent, ankle_right_ground_agent, normal); + F32 rightElev = llmax(-0.2f, ankle_right_pos_agent.mV[VZ] - ankle_right_ground_agent.mV[VZ]); + debug_line += llformat(" relev %.3f", rightElev); - LLVector3 root_pos = mRoot->getPosition(); - LLVector3 pelvis_pos = mPelvisp->getPosition(); - debug_line += llformat(" rp %.3f pp %.3f", root_pos[2], pelvis_pos[2]); + LLVector3 root_pos = mRoot->getPosition(); + LLVector3 pelvis_pos = mPelvisp->getPosition(); + debug_line += llformat(" rp %.3f pp %.3f", root_pos[2], pelvis_pos[2]); S32 is_visible = (S32) isVisible(); S32 is_m_visible = (S32) mVisible; debug_line += llformat(" v %d/%d", is_visible, is_m_visible); - addDebugText(debug_line); + addDebugText(debug_line); } LLViewerInventoryItem* getObjectInventoryItem(LLViewerObject *vobj, LLUUID asset_id) @@ -3610,7 +3613,7 @@ LLViewerInventoryItem* getObjectInventoryItem(LLViewerObject *vobj, LLUUID asset if (vobj->getInventorySerial()<=0) { vobj->requestInventory(); - } + } item = vobj->getInventoryItemByAsset(asset_id); } return item; @@ -3628,23 +3631,23 @@ LLViewerInventoryItem* recursiveGetObjectInventoryItem(LLViewerObject *vobj, LLU LLViewerObject *childp = *it; item = getObjectInventoryItem(childp, asset_id); if (item) - { + { break; } } - } + } return item; } void LLVOAvatar::updateAnimationDebugText() { - for (LLMotionController::motion_list_t::iterator iter = mMotionController.getActiveMotions().begin(); - iter != mMotionController.getActiveMotions().end(); ++iter) - { - LLMotion* motionp = *iter; - if (motionp->getMinPixelArea() < getPixelArea()) - { - std::string output; + for (LLMotionController::motion_list_t::iterator iter = mMotionController.getActiveMotions().begin(); + iter != mMotionController.getActiveMotions().end(); ++iter) + { + LLMotion* motionp = *iter; + if (motionp->getMinPixelArea() < getPixelArea()) + { + std::string output; std::string motion_name = motionp->getName(); if (motion_name.empty()) { @@ -3661,73 +3664,73 @@ void LLVOAvatar::updateAnimationDebugText() } } if (motion_name.empty()) - { - std::string name; - if (gAgent.isGodlikeWithoutAdminMenuFakery() || isSelf()) - { - name = motionp->getID().asString(); - LLVOAvatar::AnimSourceIterator anim_it = mAnimationSources.begin(); - for (; anim_it != mAnimationSources.end(); ++anim_it) - { - if (anim_it->second == motionp->getID()) - { - LLViewerObject* object = gObjectList.findObject(anim_it->first); - if (!object) - { - break; - } - if (object->isAvatar()) - { - if (mMotionController.mIsSelf) - { - // Searching inventory by asset id is really long - // so just mark as inventory - // Also item is likely to be named by LLPreviewAnim - name += "(inventory)"; - } - } - else - { - LLViewerInventoryItem* item = NULL; - if (!object->isInventoryDirty()) - { - item = object->getInventoryItemByAsset(motionp->getID()); - } - if (item) - { - name = item->getName(); - } - else if (object->isAttachment()) - { - name += "(" + getAttachmentItemName() + ")"; - } - else - { - // in-world object, name or content unknown - name += "(in-world)"; - } - } - break; - } - } - } - else - { - name = LLUUID::null.asString(); - } - output = llformat("%s - %d", - name.c_str(), - (U32)motionp->getPriority()); - } - else - { - output = llformat("%s - %d", + { + std::string name; + if (gAgent.isGodlikeWithoutAdminMenuFakery() || isSelf()) + { + name = motionp->getID().asString(); + LLVOAvatar::AnimSourceIterator anim_it = mAnimationSources.begin(); + for (; anim_it != mAnimationSources.end(); ++anim_it) + { + if (anim_it->second == motionp->getID()) + { + LLViewerObject* object = gObjectList.findObject(anim_it->first); + if (!object) + { + break; + } + if (object->isAvatar()) + { + if (mMotionController.mIsSelf) + { + // Searching inventory by asset id is really long + // so just mark as inventory + // Also item is likely to be named by LLPreviewAnim + name += "(inventory)"; + } + } + else + { + LLViewerInventoryItem* item = NULL; + if (!object->isInventoryDirty()) + { + item = object->getInventoryItemByAsset(motionp->getID()); + } + if (item) + { + name = item->getName(); + } + else if (object->isAttachment()) + { + name += "(" + getAttachmentItemName() + ")"; + } + else + { + // in-world object, name or content unknown + name += "(in-world)"; + } + } + break; + } + } + } + else + { + name = LLUUID::null.asString(); + } + output = llformat("%s - %d", + name.c_str(), + (U32)motionp->getPriority()); + } + else + { + output = llformat("%s - %d", motion_name.c_str(), - (U32)motionp->getPriority()); - } - addDebugText(output); - } - } + (U32)motionp->getPriority()); + } + addDebugText(output); + } + } } void LLVOAvatar::updateDebugText() @@ -3760,7 +3763,7 @@ void LLVOAvatar::updateDebugText() { setDebugText(mDebugText); } - mDebugText.clear(); + mDebugText.clear(); } //------------------------------------------------------------------------ @@ -3774,7 +3777,7 @@ void LLVOAvatar::updateFootstepSounds() { return; } - + //------------------------------------------------------------------------- // Find the ground under each foot, these are used for a variety // of things that follow @@ -3799,7 +3802,7 @@ void LLVOAvatar::updateFootstepSounds() if (!mInAir) { if ((leftElev < 0.0f) || (rightElev < 0.0f)) - { + { ankle_left_pos_agent = mFootLeftp->getWorldPosition(); ankle_right_pos_agent = mFootRightp->getWorldPosition(); leftElev = ankle_left_pos_agent.mV[VZ] - ankle_left_ground_agent.mV[VZ]; @@ -3828,10 +3831,10 @@ void LLVOAvatar::updateFootstepSounds() // did right foot hit the ground? if ( onGroundRight && !mWasOnGroundRight ) - { + { foot_pos_agent = ankle_right_pos_agent; playSound = TRUE; - } + } mWasOnGroundLeft = onGroundLeft; mWasOnGroundRight = onGroundRight; @@ -3920,153 +3923,153 @@ void LLVOAvatar::computeUpdatePeriod() //------------------------------------------------------------------------ void LLVOAvatar::updateOrientation(LLAgent& agent, F32 speed, F32 delta_time) { - LLQuaternion iQ; - LLVector3 upDir( 0.0f, 0.0f, 1.0f ); + LLQuaternion iQ; + LLVector3 upDir( 0.0f, 0.0f, 1.0f ); - // Compute a forward direction vector derived from the primitive rotation - // and the velocity vector. When walking or jumping, don't let body deviate - // more than 90 from the view, if necessary, flip the velocity vector. + // Compute a forward direction vector derived from the primitive rotation + // and the velocity vector. When walking or jumping, don't let body deviate + // more than 90 from the view, if necessary, flip the velocity vector. - LLVector3 primDir; - if (isSelf()) - { - primDir = agent.getAtAxis() - projected_vec(agent.getAtAxis(), agent.getReferenceUpVector()); - primDir.normalize(); - } - else - { - primDir = getRotation().getMatrix3().getFwdRow(); - } - LLVector3 velDir = getVelocity(); - velDir.normalize(); - if ( mSignaledAnimations.find(ANIM_AGENT_WALK) != mSignaledAnimations.end()) - { - F32 vpD = velDir * primDir; - if (vpD < -0.5f) - { - velDir *= -1.0f; - } - } - LLVector3 fwdDir = lerp(primDir, velDir, clamp_rescale(speed, 0.5f, 2.0f, 0.0f, 1.0f)); - if (isSelf() && gAgentCamera.cameraMouselook()) - { - // make sure fwdDir stays in same general direction as primdir - if (gAgent.getFlying()) - { - fwdDir = LLViewerCamera::getInstance()->getAtAxis(); - } - else - { - LLVector3 at_axis = LLViewerCamera::getInstance()->getAtAxis(); - LLVector3 up_vector = gAgent.getReferenceUpVector(); - at_axis -= up_vector * (at_axis * up_vector); - at_axis.normalize(); + LLVector3 primDir; + if (isSelf()) + { + primDir = agent.getAtAxis() - projected_vec(agent.getAtAxis(), agent.getReferenceUpVector()); + primDir.normalize(); + } + else + { + primDir = getRotation().getMatrix3().getFwdRow(); + } + LLVector3 velDir = getVelocity(); + velDir.normalize(); + if ( mSignaledAnimations.find(ANIM_AGENT_WALK) != mSignaledAnimations.end()) + { + F32 vpD = velDir * primDir; + if (vpD < -0.5f) + { + velDir *= -1.0f; + } + } + LLVector3 fwdDir = lerp(primDir, velDir, clamp_rescale(speed, 0.5f, 2.0f, 0.0f, 1.0f)); + if (isSelf() && gAgentCamera.cameraMouselook()) + { + // make sure fwdDir stays in same general direction as primdir + if (gAgent.getFlying()) + { + fwdDir = LLViewerCamera::getInstance()->getAtAxis(); + } + else + { + LLVector3 at_axis = LLViewerCamera::getInstance()->getAtAxis(); + LLVector3 up_vector = gAgent.getReferenceUpVector(); + at_axis -= up_vector * (at_axis * up_vector); + at_axis.normalize(); - F32 dot = fwdDir * at_axis; - if (dot < 0.f) - { - fwdDir -= 2.f * at_axis * dot; - fwdDir.normalize(); - } - } - } + F32 dot = fwdDir * at_axis; + if (dot < 0.f) + { + fwdDir -= 2.f * at_axis * dot; + fwdDir.normalize(); + } + } + } - LLQuaternion root_rotation = mRoot->getWorldMatrix().quaternion(); - F32 root_roll, root_pitch, root_yaw; - root_rotation.getEulerAngles(&root_roll, &root_pitch, &root_yaw); + LLQuaternion root_rotation = mRoot->getWorldMatrix().quaternion(); + F32 root_roll, root_pitch, root_yaw; + root_rotation.getEulerAngles(&root_roll, &root_pitch, &root_yaw); - // When moving very slow, the pelvis is allowed to deviate from the + // When moving very slow, the pelvis is allowed to deviate from the // forward direction to allow it to hold its position while the torso - // and head turn. Once in motion, it must conform however. - BOOL self_in_mouselook = isSelf() && gAgentCamera.cameraMouselook(); + // and head turn. Once in motion, it must conform however. + BOOL self_in_mouselook = isSelf() && gAgentCamera.cameraMouselook(); - LLVector3 pelvisDir( mRoot->getWorldMatrix().getFwdRow4().mV ); + LLVector3 pelvisDir( mRoot->getWorldMatrix().getFwdRow4().mV ); - static LLCachedControl<F32> s_pelvis_rot_threshold_slow(gSavedSettings, "AvatarRotateThresholdSlow", 60.0); - static LLCachedControl<F32> s_pelvis_rot_threshold_fast(gSavedSettings, "AvatarRotateThresholdFast", 2.0); + static LLCachedControl<F32> s_pelvis_rot_threshold_slow(gSavedSettings, "AvatarRotateThresholdSlow", 60.0); + static LLCachedControl<F32> s_pelvis_rot_threshold_fast(gSavedSettings, "AvatarRotateThresholdFast", 2.0); - F32 pelvis_rot_threshold = clamp_rescale(speed, 0.1f, 1.0f, s_pelvis_rot_threshold_slow, s_pelvis_rot_threshold_fast); + F32 pelvis_rot_threshold = clamp_rescale(speed, 0.1f, 1.0f, s_pelvis_rot_threshold_slow, s_pelvis_rot_threshold_fast); - if (self_in_mouselook) - { - pelvis_rot_threshold *= MOUSELOOK_PELVIS_FOLLOW_FACTOR; - } - pelvis_rot_threshold *= DEG_TO_RAD; + if (self_in_mouselook) + { + pelvis_rot_threshold *= MOUSELOOK_PELVIS_FOLLOW_FACTOR; + } + pelvis_rot_threshold *= DEG_TO_RAD; - F32 angle = angle_between( pelvisDir, fwdDir ); + F32 angle = angle_between( pelvisDir, fwdDir ); - // The avatar's root is allowed to have a yaw that deviates widely - // from the forward direction, but if roll or pitch are off even - // a little bit we need to correct the rotation. - if(root_roll < 1.f * DEG_TO_RAD - && root_pitch < 5.f * DEG_TO_RAD) - { - // smaller correction vector means pelvis follows prim direction more closely - if (!mTurning && angle > pelvis_rot_threshold*0.75f) - { - mTurning = TRUE; - } + // The avatar's root is allowed to have a yaw that deviates widely + // from the forward direction, but if roll or pitch are off even + // a little bit we need to correct the rotation. + if(root_roll < 1.f * DEG_TO_RAD + && root_pitch < 5.f * DEG_TO_RAD) + { + // smaller correction vector means pelvis follows prim direction more closely + if (!mTurning && angle > pelvis_rot_threshold*0.75f) + { + mTurning = TRUE; + } - // use tighter threshold when turning - if (mTurning) - { - pelvis_rot_threshold *= 0.4f; - } + // use tighter threshold when turning + if (mTurning) + { + pelvis_rot_threshold *= 0.4f; + } - // am I done turning? - if (angle < pelvis_rot_threshold) - { - mTurning = FALSE; - } + // am I done turning? + if (angle < pelvis_rot_threshold) + { + mTurning = FALSE; + } - LLVector3 correction_vector = (pelvisDir - fwdDir) * clamp_rescale(angle, pelvis_rot_threshold*0.75f, pelvis_rot_threshold, 1.0f, 0.0f); - fwdDir += correction_vector; - } - else - { - mTurning = FALSE; - } + LLVector3 correction_vector = (pelvisDir - fwdDir) * clamp_rescale(angle, pelvis_rot_threshold*0.75f, pelvis_rot_threshold, 1.0f, 0.0f); + fwdDir += correction_vector; + } + else + { + mTurning = FALSE; + } - // Now compute the full world space rotation for the whole body (wQv) - LLVector3 leftDir = upDir % fwdDir; - leftDir.normalize(); - fwdDir = leftDir % upDir; - LLQuaternion wQv( fwdDir, leftDir, upDir ); + // Now compute the full world space rotation for the whole body (wQv) + LLVector3 leftDir = upDir % fwdDir; + leftDir.normalize(); + fwdDir = leftDir % upDir; + LLQuaternion wQv( fwdDir, leftDir, upDir ); - if (isSelf() && mTurning) - { - if ((fwdDir % pelvisDir) * upDir > 0.f) - { - gAgent.setControlFlags(AGENT_CONTROL_TURN_RIGHT); - } - else - { - gAgent.setControlFlags(AGENT_CONTROL_TURN_LEFT); - } - } + if (isSelf() && mTurning) + { + if ((fwdDir % pelvisDir) * upDir > 0.f) + { + gAgent.setControlFlags(AGENT_CONTROL_TURN_RIGHT); + } + else + { + gAgent.setControlFlags(AGENT_CONTROL_TURN_LEFT); + } + } - // Set the root rotation, but do so incrementally so that it - // lags in time by some fixed amount. - //F32 u = LLSmoothInterpolation::getInterpolant(PELVIS_LAG); - F32 pelvis_lag_time = 0.f; - if (self_in_mouselook) - { - pelvis_lag_time = PELVIS_LAG_MOUSELOOK; - } - else if (mInAir) - { - pelvis_lag_time = PELVIS_LAG_FLYING; - // increase pelvis lag time when moving slowly - pelvis_lag_time *= clamp_rescale(mSpeedAccum, 0.f, 15.f, 3.f, 1.f); - } - else - { - pelvis_lag_time = PELVIS_LAG_WALKING; - } + // Set the root rotation, but do so incrementally so that it + // lags in time by some fixed amount. + //F32 u = LLSmoothInterpolation::getInterpolant(PELVIS_LAG); + F32 pelvis_lag_time = 0.f; + if (self_in_mouselook) + { + pelvis_lag_time = PELVIS_LAG_MOUSELOOK; + } + else if (mInAir) + { + pelvis_lag_time = PELVIS_LAG_FLYING; + // increase pelvis lag time when moving slowly + pelvis_lag_time *= clamp_rescale(mSpeedAccum, 0.f, 15.f, 3.f, 1.f); + } + else + { + pelvis_lag_time = PELVIS_LAG_WALKING; + } F32 u = llclamp((delta_time / pelvis_lag_time), 0.0f, 1.0f); - mRoot->setWorldRotation( slerp(u, mRoot->getWorldRotation(), wQv) ); + mRoot->setWorldRotation( slerp(u, mRoot->getWorldRotation(), wQv) ); } //------------------------------------------------------------------------ @@ -4128,7 +4131,7 @@ void LLVOAvatar::updateRootPositionAndRotation(LLAgent& agent, F32 speed, bool w mRoot->setWorldPosition( getPositionAgent() ); // first frame mRoot->setWorldRotation( getRotation() ); } - + //-------------------------------------------------------------------- // dont' let dT get larger than 1/5th of a second //-------------------------------------------------------------------- @@ -4366,7 +4369,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) mRoot->updateWorldMatrixChildren(); // System avatar mesh vertices need to be reskinned. - mNeedsSkin = TRUE; + mNeedsSkin = TRUE; return TRUE; } @@ -4880,14 +4883,14 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass) first_pass = FALSE; } if (isTextureVisible(TEX_HAIR_BAKED)) - { - LLViewerJoint* hair_mesh = getViewerJoint(MESH_ID_HAIR); - if (hair_mesh) - { - num_indices += hair_mesh->render(mAdjustedPixelArea, first_pass, mIsDummy); - } - first_pass = FALSE; - } + { + LLViewerJoint* hair_mesh = getViewerJoint(MESH_ID_HAIR); + if (hair_mesh) + { + num_indices += hair_mesh->render(mAdjustedPixelArea, first_pass, mIsDummy); + } + first_pass = FALSE; + } if (LLPipeline::sImpostorRender) { gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); @@ -4995,22 +4998,22 @@ U32 LLVOAvatar::renderImpostor(LLColor4U color, S32 diffuse_channel) gGL.flush(); } { - LLGLEnable test(GL_ALPHA_TEST); - gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f); + LLGLEnable test(GL_ALPHA_TEST); + gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f); - gGL.color4ubv(color.mV); - gGL.getTexUnit(diffuse_channel)->bind(&mImpostor); - gGL.begin(LLRender::QUADS); - gGL.texCoord2f(0,0); - gGL.vertex3fv((pos+left-up).mV); - gGL.texCoord2f(1,0); - gGL.vertex3fv((pos-left-up).mV); - gGL.texCoord2f(1,1); - gGL.vertex3fv((pos-left+up).mV); - gGL.texCoord2f(0,1); - gGL.vertex3fv((pos+left+up).mV); - gGL.end(); - gGL.flush(); + gGL.color4ubv(color.mV); + gGL.getTexUnit(diffuse_channel)->bind(&mImpostor); + gGL.begin(LLRender::QUADS); + gGL.texCoord2f(0,0); + gGL.vertex3fv((pos+left-up).mV); + gGL.texCoord2f(1,0); + gGL.vertex3fv((pos-left-up).mV); + gGL.texCoord2f(1,1); + gGL.vertex3fv((pos-left+up).mV); + gGL.texCoord2f(0,1); + gGL.vertex3fv((pos+left+up).mV); + gGL.end(); + gGL.flush(); } return 6; @@ -5510,8 +5513,8 @@ void LLVOAvatar::processAnimationStateChanges() stopMotion(ANIM_AGENT_WALK_ADJUST); if (mEnableDefaultMotions) { - startMotion(ANIM_AGENT_FLY_ADJUST); - } + startMotion(ANIM_AGENT_FLY_ADJUST); + } } else { @@ -5523,7 +5526,7 @@ void LLVOAvatar::processAnimationStateChanges() { if (mEnableDefaultMotions) { - startMotion(ANIM_AGENT_TARGET); + startMotion(ANIM_AGENT_TARGET); } stopMotion(ANIM_AGENT_BODY_NOISE); } @@ -5532,8 +5535,8 @@ void LLVOAvatar::processAnimationStateChanges() stopMotion(ANIM_AGENT_TARGET); if (mEnableDefaultMotions) { - startMotion(ANIM_AGENT_BODY_NOISE); - } + startMotion(ANIM_AGENT_BODY_NOISE); + } } // clear all current animations @@ -5901,10 +5904,10 @@ bool LLVOAvatar::getRiggedMeshID(LLViewerObject* pVO, LLUUID& mesh_id) if (pSkinData && pSkinData->mJointNames.size() > JOINT_COUNT_REQUIRED_FOR_FULLRIG // full rig && pSkinData->mAlternateBindMatrix.size() > 0 ) - { - mesh_id = pSkinData->mMeshID; - return true; - } + { + mesh_id = pSkinData->mMeshID; + return true; + } } } return false; @@ -5913,14 +5916,14 @@ bool LLVOAvatar::getRiggedMeshID(LLViewerObject* pVO, LLUUID& mesh_id) bool LLVOAvatar::jointIsRiggedTo(const LLJoint *joint) const { if (joint) - { + { const LLJointRiggingInfoTab& tab = mJointRiggingInfoTab; S32 joint_num = joint->getJointNum(); if (joint_num < tab.size() && tab[joint_num].isRiggedTo()) - { - return true; + { + return true; + } } - } return false; } @@ -5929,25 +5932,25 @@ void LLVOAvatar::clearAttachmentOverrides() LLScopedContextString str("clearAttachmentOverrides " + getFullname()); for (S32 i=0; i<LL_CHARACTER_MAX_ANIMATED_JOINTS; i++) - { + { LLJoint *pJoint = getJoint(i); if (pJoint) { pJoint->clearAttachmentPosOverrides(); pJoint->clearAttachmentScaleOverrides(); } - } + } if (mPelvisFixups.count()>0) { mPelvisFixups.clear(); LLJoint* pJointPelvis = getJoint("mPelvis"); if (pJointPelvis) - { + { pJointPelvis->setPosition( LLVector3( 0.0f, 0.0f, 0.0f) ); } postPelvisSetRecalc(); - } + } mActiveOverrideMeshes.clear(); onActiveOverrideMeshesChanged(); @@ -5968,7 +5971,7 @@ void LLVOAvatar::rebuildAttachmentOverrides() // Handle the case that we're resetting the skeleton of an animated object. LLControlAvatar *control_av = dynamic_cast<LLControlAvatar*>(this); if (control_av) - { + { LLVOVolume *volp = control_av->mRootVolp; if (volp) { @@ -5992,7 +5995,7 @@ void LLVOAvatar::rebuildAttachmentOverrides() LLViewerObject *vo = *at_it; // Attached animated objects affect joints in their control // avs, not the avs to which they are attached. - if (!vo->isAnimatedObject()) + if (vo && !vo->isAnimatedObject()) { addAttachmentOverridesForObject(vo); } @@ -6043,7 +6046,7 @@ void LLVOAvatar::updateAttachmentOverrides() LLViewerObject *vo = *at_it; // Attached animated objects affect joints in their control // avs, not the avs to which they are attached. - if (!vo->isAnimatedObject()) + if (vo && !vo->isAnimatedObject()) { addAttachmentOverridesForObject(vo, &meshes_seen); } @@ -6105,9 +6108,9 @@ void LLVOAvatar::updateAttachmentOverrides() if (scale_overrides_by_joint[joint_num] != joint->m_attachmentScaleOverrides) { mismatched = true; - } } } + } if (pelvis_fixups != mPelvisFixups) { mismatched = true; @@ -6126,10 +6129,10 @@ void LLVOAvatar::updateAttachmentOverrides() void LLVOAvatar::addAttachmentOverridesForObject(LLViewerObject *vo, std::set<LLUUID>* meshes_seen, bool recursive) { if (vo->getAvatar() != this && vo->getAvatarAncestor() != this) - { + { LL_WARNS("Avatar") << "called with invalid avatar" << LL_ENDL; return; - } + } LLScopedContextString str("addAttachmentOverridesForObject " + getFullname()); @@ -6139,14 +6142,14 @@ void LLVOAvatar::addAttachmentOverridesForObject(LLViewerObject *vo, std::set<LL // Process all children if (recursive) { - LLViewerObject::const_child_list_t& children = vo->getChildren(); - for (LLViewerObject::const_child_list_t::const_iterator it = children.begin(); - it != children.end(); ++it) - { - LLViewerObject *childp = *it; + LLViewerObject::const_child_list_t& children = vo->getChildren(); + for (LLViewerObject::const_child_list_t::const_iterator it = children.begin(); + it != children.end(); ++it) + { + LLViewerObject *childp = *it; addAttachmentOverridesForObject(childp, meshes_seen, true); } - } + } LLVOVolume *vobj = dynamic_cast<LLVOVolume*>(vo); bool pelvisGotSet = false; @@ -6407,7 +6410,7 @@ void LLVOAvatar::removeAttachmentOverridesForObject(const LLUUID& mesh_id) LLJoint* pJointPelvis = getJoint("mPelvis"); const std::string av_string = avString(); for (S32 joint_num = 0; joint_num < LL_CHARACTER_MAX_ANIMATED_JOINTS; joint_num++) - { + { LLJoint *pJoint = getJoint(joint_num); if ( pJoint ) { @@ -7017,6 +7020,22 @@ const LLViewerJointAttachment *LLVOAvatar::attachObject(LLViewerObject *viewer_o LLSelectMgr::getInstance()->updatePointAt(); } + viewer_object->refreshBakeTexture(); + + + LLViewerObject::const_child_list_t& child_list = viewer_object->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); ++iter) + { + LLViewerObject* objectp = *iter; + if (objectp) + { + objectp->refreshBakeTexture(); + } + } + + updateMeshVisibility(); + return attachment; } @@ -7036,13 +7055,34 @@ U32 LLVOAvatar::getNumAttachments() const return num_attachments; } +//----------------------------------------------------------------------------- +// getMaxAttachments() +//----------------------------------------------------------------------------- +S32 LLVOAvatar::getMaxAttachments() const +{ + const S32 MAX_AGENT_ATTACHMENTS = 38; + + S32 max_attach = MAX_AGENT_ATTACHMENTS; + + if (gAgent.getRegion()) + { + LLSD features; + gAgent.getRegion()->getSimulatorFeatures(features); + if (features.has("MaxAgentAttachments")) + { + max_attach = features["MaxAgentAttachments"].asInteger(); + } + } + return max_attach; +} + //----------------------------------------------------------------------------- // canAttachMoreObjects() // Returns true if we can attach <n> more objects. //----------------------------------------------------------------------------- BOOL LLVOAvatar::canAttachMoreObjects(U32 n) const { - return (getNumAttachments() + n) <= MAX_AGENT_ATTACHMENTS; + return (getNumAttachments() + n) <= getMaxAttachments(); } //----------------------------------------------------------------------------- @@ -7070,7 +7110,7 @@ S32 LLVOAvatar::getMaxAnimatedObjectAttachments() const S32 max_attach = 0; if (gSavedSettings.getBOOL("AnimatedObjectsIgnoreLimits")) { - max_attach = MAX_AGENT_ATTACHMENTS; + max_attach = getMaxAttachments(); } else { @@ -7199,7 +7239,6 @@ void LLVOAvatar::cleanupAttachedMesh( LLViewerObject* pVO ) //----------------------------------------------------------------------------- BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object) { - for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); iter != mAttachmentPoints.end(); ++iter) @@ -7210,12 +7249,28 @@ BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object) { updateVisualComplexity(); bool is_animated_object = viewer_object->isAnimatedObject(); - cleanupAttachedMesh( viewer_object ); + cleanupAttachedMesh(viewer_object); + attachment->removeObject(viewer_object); if (!is_animated_object) { updateAttachmentOverrides(); } + viewer_object->refreshBakeTexture(); + + LLViewerObject::const_child_list_t& child_list = viewer_object->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter1 = child_list.begin(); + iter1 != child_list.end(); ++iter1) + { + LLViewerObject* objectp = *iter1; + if (objectp) + { + objectp->refreshBakeTexture(); + } + } + + updateMeshVisibility(); + LL_DEBUGS() << "Detaching object " << viewer_object->mID << " from " << attachment->getName() << LL_ENDL; return TRUE; } @@ -7351,7 +7406,7 @@ void LLVOAvatar::getOffObject() if (mEnableDefaultMotions) { - startMotion(ANIM_AGENT_BODY_NOISE); + startMotion(ANIM_AGENT_BODY_NOISE); } if (isSelf()) @@ -7817,8 +7872,8 @@ bool LLVOAvatar::isTooComplex() const // yes, this leaves them vulnerable to griefing objects... their choice too_complex = ( max_render_cost > 0 && (mVisualComplexity > max_render_cost - || (max_attachment_area > 0.0f && mAttachmentSurfaceArea > max_attachment_area) - )); + || (max_attachment_area > 0.0f && mAttachmentSurfaceArea > max_attachment_area) + )); } return too_complex; @@ -7851,6 +7906,115 @@ void LLVOAvatar::debugColorizeSubMeshes(U32 i, const LLColor4& color) } } + +//----------------------------------------------------------------------------- +// updateMeshVisibility() +// Hide the mesh joints if attachments are using baked textures +//----------------------------------------------------------------------------- +void LLVOAvatar::updateMeshVisibility() +{ + bool bake_flag[BAKED_NUM_INDICES]; + memset(bake_flag, 0, BAKED_NUM_INDICES*sizeof(bool)); + + for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); + iter != mAttachmentPoints.end(); + ++iter) + { + LLViewerJointAttachment* attachment = iter->second; + if (attachment) + { + for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); + attachment_iter != attachment->mAttachedObjects.end(); + ++attachment_iter) + { + LLViewerObject *objectp = (*attachment_iter); + if (objectp) + { + for (int face_index = 0; face_index < objectp->getNumTEs(); face_index++) + { + LLTextureEntry* tex_entry = objectp->getTE(face_index); + bake_flag[BAKED_HEAD] |= (tex_entry->getID() == IMG_USE_BAKED_HEAD); + bake_flag[BAKED_EYES] |= (tex_entry->getID() == IMG_USE_BAKED_EYES); + bake_flag[BAKED_HAIR] |= (tex_entry->getID() == IMG_USE_BAKED_HAIR); + bake_flag[BAKED_LOWER] |= (tex_entry->getID() == IMG_USE_BAKED_LOWER); + bake_flag[BAKED_UPPER] |= (tex_entry->getID() == IMG_USE_BAKED_UPPER); + bake_flag[BAKED_SKIRT] |= (tex_entry->getID() == IMG_USE_BAKED_SKIRT); + bake_flag[BAKED_LEFT_ARM] |= (tex_entry->getID() == IMG_USE_BAKED_LEFTARM); + bake_flag[BAKED_LEFT_LEG] |= (tex_entry->getID() == IMG_USE_BAKED_LEFTLEG); + bake_flag[BAKED_AUX1] |= (tex_entry->getID() == IMG_USE_BAKED_AUX1); + bake_flag[BAKED_AUX2] |= (tex_entry->getID() == IMG_USE_BAKED_AUX2); + bake_flag[BAKED_AUX3] |= (tex_entry->getID() == IMG_USE_BAKED_AUX3); + } + } + + LLViewerObject::const_child_list_t& child_list = objectp->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter1 = child_list.begin(); + iter1 != child_list.end(); ++iter1) + { + LLViewerObject* objectchild = *iter1; + if (objectchild) + { + for (int face_index = 0; face_index < objectchild->getNumTEs(); face_index++) + { + LLTextureEntry* tex_entry = objectchild->getTE(face_index); + bake_flag[BAKED_HEAD] |= (tex_entry->getID() == IMG_USE_BAKED_HEAD); + bake_flag[BAKED_EYES] |= (tex_entry->getID() == IMG_USE_BAKED_EYES); + bake_flag[BAKED_HAIR] |= (tex_entry->getID() == IMG_USE_BAKED_HAIR); + bake_flag[BAKED_LOWER] |= (tex_entry->getID() == IMG_USE_BAKED_LOWER); + bake_flag[BAKED_UPPER] |= (tex_entry->getID() == IMG_USE_BAKED_UPPER); + bake_flag[BAKED_SKIRT] |= (tex_entry->getID() == IMG_USE_BAKED_SKIRT); + bake_flag[BAKED_LEFT_ARM] |= (tex_entry->getID() == IMG_USE_BAKED_LEFTARM); + bake_flag[BAKED_LEFT_LEG] |= (tex_entry->getID() == IMG_USE_BAKED_LEFTLEG); + bake_flag[BAKED_AUX1] |= (tex_entry->getID() == IMG_USE_BAKED_AUX1); + bake_flag[BAKED_AUX2] |= (tex_entry->getID() == IMG_USE_BAKED_AUX2); + bake_flag[BAKED_AUX3] |= (tex_entry->getID() == IMG_USE_BAKED_AUX3); + } + } + } + } + } + } + + //LL_INFOS() << "head " << bake_flag[BAKED_HEAD] << "eyes " << bake_flag[BAKED_EYES] << "hair " << bake_flag[BAKED_HAIR] << "lower " << bake_flag[BAKED_LOWER] << "upper " << bake_flag[BAKED_UPPER] << "skirt " << bake_flag[BAKED_SKIRT] << LL_ENDL; + + for (S32 i = 0; i < mMeshLOD.size(); i++) + { + LLAvatarJoint* joint = mMeshLOD[i]; + if (i == MESH_ID_HAIR) + { + joint->setVisible(!bake_flag[BAKED_HAIR], TRUE); + } + else if (i == MESH_ID_HEAD) + { + joint->setVisible(!bake_flag[BAKED_HEAD], TRUE); + } + else if (i == MESH_ID_SKIRT) + { + joint->setVisible(!bake_flag[BAKED_SKIRT], TRUE); + } + else if (i == MESH_ID_UPPER_BODY) + { + joint->setVisible(!bake_flag[BAKED_UPPER], TRUE); + } + else if (i == MESH_ID_LOWER_BODY) + { + joint->setVisible(!bake_flag[BAKED_LOWER], TRUE); + } + else if (i == MESH_ID_EYEBALL_LEFT) + { + joint->setVisible(!bake_flag[BAKED_EYES], TRUE); + } + else if (i == MESH_ID_EYEBALL_RIGHT) + { + joint->setVisible(!bake_flag[BAKED_EYES], TRUE); + } + else if (i == MESH_ID_EYELASH) + { + joint->setVisible(!bake_flag[BAKED_HEAD], TRUE); + } + } +} + //----------------------------------------------------------------------------- // updateMeshTextures() // Uses the current TE values to set the meshes' and layersets' textures. @@ -8068,6 +8232,39 @@ void LLVOAvatar::updateMeshTextures() removeMissingBakedTextures(); // May call back into this function if anything is removed call_remove_missing = true; } + + //refresh bakes on any attached objects + for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); + iter != mAttachmentPoints.end(); + ++iter) + { + LLViewerJointAttachment* attachment = iter->second; + + for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); + attachment_iter != attachment->mAttachedObjects.end(); + ++attachment_iter) + { + LLViewerObject* attached_object = (*attachment_iter); + if (attached_object && !attached_object->isDead()) + { + attached_object->refreshBakeTexture(); + + LLViewerObject::const_child_list_t& child_list = attached_object->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); ++iter) + { + LLViewerObject* objectp = *iter; + if (objectp && !objectp->isDead()) + { + objectp->refreshBakeTexture(); + } + } + } + } + } + + + } // virtual @@ -8711,7 +8908,7 @@ void LLVOAvatar::applyParsedAppearanceMessage(LLAppearanceMessageContents& conte { if (!isTextureDefined(mBakedTextureDatas[baked_index].mTextureIndex) && mBakedTextureDatas[baked_index].mLastTextureID != IMG_DEFAULT - && baked_index != BAKED_SKIRT) + && baked_index != BAKED_SKIRT && baked_index != BAKED_LEFT_ARM && baked_index != BAKED_LEFT_LEG && baked_index != BAKED_AUX1 && baked_index != BAKED_AUX2 && baked_index != BAKED_AUX3) { LL_DEBUGS("Avatar") << avString() << " baked_index " << (S32) baked_index << " using mLastTextureID " << mBakedTextureDatas[baked_index].mLastTextureID << LL_ENDL; setTEImage(mBakedTextureDatas[baked_index].mTextureIndex, @@ -8844,6 +9041,39 @@ void LLVOAvatar::applyParsedAppearanceMessage(LLAppearanceMessageContents& conte } updateMeshTextures(); + updateMeshVisibility(); + +} + +LLViewerTexture* LLVOAvatar::getBakedTexture(const U8 te) +{ + if (te < 0 || te >= BAKED_NUM_INDICES) + { + return NULL; + } + + BOOL is_layer_baked = isTextureDefined(mBakedTextureDatas[te].mTextureIndex); + + LLViewerTexLayerSet* layerset = NULL; + layerset = getTexLayerSet(te); + + + if (!isEditingAppearance() && is_layer_baked) + { + LLViewerFetchedTexture* baked_img = LLViewerTextureManager::staticCastToFetchedTexture(getImage(mBakedTextureDatas[te].mTextureIndex, 0), TRUE); + return baked_img; + } + else if (layerset && isEditingAppearance()) + { + layerset->createComposite(); + layerset->setUpdatesEnabled(TRUE); + + return layerset->getViewerComposite(); + } + + return NULL; + + } // static @@ -9079,6 +9309,7 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id ) } } } + dirtyMesh(); } @@ -9951,122 +10182,122 @@ void LLVOAvatar::accountRenderComplexityForObject( hud_complexity_list_t& hud_complexity_list) { if (attached_object && !attached_object->isHUDAttachment()) - { + { mAttachmentVisibleTriangleCount += attached_object->recursiveGetTriangleCount(); mAttachmentEstTriangleCount += attached_object->recursiveGetEstTrianglesMax(); mAttachmentSurfaceArea += attached_object->recursiveGetScaledSurfaceArea(); - textures.clear(); - const LLDrawable* drawable = attached_object->mDrawable; - if (drawable) - { - const LLVOVolume* volume = drawable->getVOVolume(); - if (volume) - { - F32 attachment_total_cost = 0; - F32 attachment_volume_cost = 0; - F32 attachment_texture_cost = 0; - F32 attachment_children_cost = 0; + textures.clear(); + const LLDrawable* drawable = attached_object->mDrawable; + if (drawable) + { + const LLVOVolume* volume = drawable->getVOVolume(); + if (volume) + { + F32 attachment_total_cost = 0; + F32 attachment_volume_cost = 0; + F32 attachment_texture_cost = 0; + F32 attachment_children_cost = 0; const F32 animated_object_attachment_surcharge = 1000; if (attached_object->isAnimatedObject()) { attachment_volume_cost += animated_object_attachment_surcharge; } - attachment_volume_cost += volume->getRenderCost(textures); + attachment_volume_cost += volume->getRenderCost(textures); - const_child_list_t children = volume->getChildren(); - for (const_child_list_t::const_iterator child_iter = children.begin(); - child_iter != children.end(); - ++child_iter) - { - LLViewerObject* child_obj = *child_iter; - LLVOVolume *child = dynamic_cast<LLVOVolume*>( child_obj ); - if (child) - { - attachment_children_cost += child->getRenderCost(textures); - } - } + const_child_list_t children = volume->getChildren(); + for (const_child_list_t::const_iterator child_iter = children.begin(); + child_iter != children.end(); + ++child_iter) + { + LLViewerObject* child_obj = *child_iter; + LLVOVolume *child = dynamic_cast<LLVOVolume*>( child_obj ); + if (child) + { + attachment_children_cost += child->getRenderCost(textures); + } + } - for (LLVOVolume::texture_cost_t::iterator volume_texture = textures.begin(); - volume_texture != textures.end(); - ++volume_texture) + for (LLVOVolume::texture_cost_t::iterator volume_texture = textures.begin(); + volume_texture != textures.end(); + ++volume_texture) + { + // add the cost of each individual texture in the linkset + attachment_texture_cost += volume_texture->second; + } + attachment_total_cost = attachment_volume_cost + attachment_texture_cost + attachment_children_cost; + LL_DEBUGS("ARCdetail") << "Attachment costs " << attached_object->getAttachmentItemID() + << " total: " << attachment_total_cost + << ", volume: " << attachment_volume_cost + << ", textures: " << attachment_texture_cost + << ", " << volume->numChildren() + << " children: " << attachment_children_cost + << LL_ENDL; + // Limit attachment complexity to avoid signed integer flipping of the wearer's ACI + cost += (U32)llclamp(attachment_total_cost, MIN_ATTACHMENT_COMPLEXITY, max_attachment_complexity); + } + } + } + if (isSelf() + && attached_object + && attached_object->isHUDAttachment() + && !attached_object->isTempAttachment() + && attached_object->mDrawable) { - // add the cost of each individual texture in the linkset - attachment_texture_cost += volume_texture->second; - } - attachment_total_cost = attachment_volume_cost + attachment_texture_cost + attachment_children_cost; - LL_DEBUGS("ARCdetail") << "Attachment costs " << attached_object->getAttachmentItemID() - << " total: " << attachment_total_cost - << ", volume: " << attachment_volume_cost - << ", textures: " << attachment_texture_cost - << ", " << volume->numChildren() - << " children: " << attachment_children_cost - << LL_ENDL; - // Limit attachment complexity to avoid signed integer flipping of the wearer's ACI - cost += (U32)llclamp(attachment_total_cost, MIN_ATTACHMENT_COMPLEXITY, max_attachment_complexity); - } - } - } - if (isSelf() - && attached_object - && attached_object->isHUDAttachment() - && !attached_object->isTempAttachment() - && attached_object->mDrawable) - { - textures.clear(); + textures.clear(); mAttachmentSurfaceArea += attached_object->recursiveGetScaledSurfaceArea(); - const LLVOVolume* volume = attached_object->mDrawable->getVOVolume(); - if (volume) - { - LLHUDComplexity hud_object_complexity; - hud_object_complexity.objectName = attached_object->getAttachmentItemName(); - hud_object_complexity.objectId = attached_object->getAttachmentItemID(); - std::string joint_name; - gAgentAvatarp->getAttachedPointName(attached_object->getAttachmentItemID(), joint_name); - hud_object_complexity.jointName = joint_name; - // get cost and individual textures - hud_object_complexity.objectsCost += volume->getRenderCost(textures); - hud_object_complexity.objectsCount++; - - LLViewerObject::const_child_list_t& child_list = attached_object->getChildren(); - for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); - iter != child_list.end(); ++iter) - { - LLViewerObject* childp = *iter; - const LLVOVolume* chld_volume = dynamic_cast<LLVOVolume*>(childp); - if (chld_volume) - { - // get cost and individual textures - hud_object_complexity.objectsCost += chld_volume->getRenderCost(textures); - hud_object_complexity.objectsCount++; - } - } + const LLVOVolume* volume = attached_object->mDrawable->getVOVolume(); + if (volume) + { + LLHUDComplexity hud_object_complexity; + hud_object_complexity.objectName = attached_object->getAttachmentItemName(); + hud_object_complexity.objectId = attached_object->getAttachmentItemID(); + std::string joint_name; + gAgentAvatarp->getAttachedPointName(attached_object->getAttachmentItemID(), joint_name); + hud_object_complexity.jointName = joint_name; + // get cost and individual textures + hud_object_complexity.objectsCost += volume->getRenderCost(textures); + hud_object_complexity.objectsCount++; + + LLViewerObject::const_child_list_t& child_list = attached_object->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); ++iter) + { + LLViewerObject* childp = *iter; + const LLVOVolume* chld_volume = dynamic_cast<LLVOVolume*>(childp); + if (chld_volume) + { + // get cost and individual textures + hud_object_complexity.objectsCost += chld_volume->getRenderCost(textures); + hud_object_complexity.objectsCount++; + } + } - hud_object_complexity.texturesCount += textures.size(); + hud_object_complexity.texturesCount += textures.size(); - for (LLVOVolume::texture_cost_t::iterator volume_texture = textures.begin(); - volume_texture != textures.end(); - ++volume_texture) - { - // add the cost of each individual texture (ignores duplicates) - hud_object_complexity.texturesCost += volume_texture->second; - LLViewerFetchedTexture *tex = LLViewerTextureManager::getFetchedTexture(volume_texture->first); - if (tex) - { - // Note: Texture memory might be incorect since texture might be still loading. - hud_object_complexity.texturesMemoryTotal += tex->getTextureMemory(); - if (tex->getOriginalHeight() * tex->getOriginalWidth() >= HUD_OVERSIZED_TEXTURE_DATA_SIZE) - { - hud_object_complexity.largeTexturesCount++; + for (LLVOVolume::texture_cost_t::iterator volume_texture = textures.begin(); + volume_texture != textures.end(); + ++volume_texture) + { + // add the cost of each individual texture (ignores duplicates) + hud_object_complexity.texturesCost += volume_texture->second; + LLViewerFetchedTexture *tex = LLViewerTextureManager::getFetchedTexture(volume_texture->first); + if (tex) + { + // Note: Texture memory might be incorect since texture might be still loading. + hud_object_complexity.texturesMemoryTotal += tex->getTextureMemory(); + if (tex->getOriginalHeight() * tex->getOriginalWidth() >= HUD_OVERSIZED_TEXTURE_DATA_SIZE) + { + hud_object_complexity.largeTexturesCount++; + } + } + } + hud_complexity_list.push_back(hud_object_complexity); } } - } - hud_complexity_list.push_back(hud_object_complexity); - } - } } // Calculations for mVisualComplexity value diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index deb22617a41765e6094390a563956b6da7b99597..00dccc5d1215c66a7503f61109583bb79b96c403 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -75,6 +75,8 @@ class LLTexGlobalColor; struct LLAppearanceMessageContents; class LLViewerJointMesh; +const F32 MAX_AVATAR_LOD_FACTOR = 1.0f; + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // LLVOAvatar @@ -615,6 +617,7 @@ class LLVOAvatar : public: /*virtual*/ LLTexLayerSet* createTexLayerSet(); // Return LLViewerTexLayerSet void releaseComponentTextures(); // ! BACKWARDS COMPATIBILITY ! + protected: static void onBakedTextureMasksLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); static void onInitialBakedTextureLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); @@ -699,6 +702,9 @@ class LLVOAvatar : void updateSexDependentLayerSets(); virtual void dirtyMesh(); // Dirty the avatar mesh void updateMeshData(); + void updateMeshVisibility(); + LLViewerTexture* getBakedTexture(const U8 te); + protected: void releaseMeshData(); virtual void restoreMeshData(); @@ -809,6 +815,7 @@ class LLVOAvatar : BOOL hasHUDAttachment() const; LLBBox getHUDBBox() const; void resetHUDAttachments(); + S32 getMaxAttachments() const; BOOL canAttachMoreObjects(U32 n=1) const; S32 getMaxAnimatedObjectAttachments() const; BOOL canAttachMoreAnimatedObjects(U32 n=1) const; diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index cf40058c34a7debc6062e0c226ddd1a532b79c54..e10ba77e16ba71883ffdb7ab8e6e95ef75d0ac49 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -658,6 +658,8 @@ void LLVivoxVoiceClient::voiceControlCoro() mIsCoroutineActive = true; LLCoros::set_consuming(true); + U32 retry = 0; + while (gAgent.getTeleportState() != LLAgent::TELEPORT_NONE) { LL_DEBUGS("Voice") << "Suspending voiceControlCoro() momentarily for teleport. Tuning: " << mTuningMode << ". Relog: " << mRelogRequested << LL_ENDL; @@ -666,7 +668,8 @@ void LLVivoxVoiceClient::voiceControlCoro() do { - if (startAndConnectSession()) + bool success = startAndConnectSession(); + if (success) { if (mTuningMode) { @@ -677,6 +680,7 @@ void LLVivoxVoiceClient::voiceControlCoro() LL_DEBUGS("Voice") << "lost channel RelogRequested=" << mRelogRequested << LL_ENDL; endAndDisconnectSession(); + retry = 0; } // if we hit this and mRelogRequested is true, that indicates @@ -689,7 +693,19 @@ void LLVivoxVoiceClient::voiceControlCoro() << LL_ENDL; if (mRelogRequested) { - LL_INFOS("Voice") << "will attempt to reconnect to voice" << LL_ENDL; + if (!success) + { + // We failed to connect, give it a bit time before retrying. + retry++; + F32 delay = llmin(5.f * (F32)retry, 60.f); + llcoro::suspendUntilTimeout(delay); + LL_INFOS("Voice") << "Voice failed to establish session after " << retry << " tries. Will attempt to reconnect." << LL_ENDL; + } + else + { + LL_INFOS("Voice") << "will attempt to reconnect to voice" << LL_ENDL; + } + while (isGatewayRunning() || gAgent.getTeleportState() != LLAgent::TELEPORT_NONE) { LL_INFOS("Voice") << "waiting for SLVoice to exit" << LL_ENDL; @@ -770,12 +786,16 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon() { #ifndef VIVOXDAEMON_REMOTEHOST // Launch the voice daemon - std::string exe_path = gDirUtilp->getAppRODataDir(); #if LL_WINDOWS + // On windows use exe (not work or RO) directory + std::string exe_path = gDirUtilp->getExecutableDir(); gDirUtilp->append(exe_path, "SLVoice.exe"); #elif LL_DARWIN + // On MAC use resource directory + std::string exe_path = gDirUtilp->getAppRODataDir(); gDirUtilp->append(exe_path, "SLVoice"); #else + std::string exe_path = gDirUtilp->getExecutableDir(); gDirUtilp->append(exe_path, "SLVoice"); #endif // See if the vivox executable exists @@ -1460,6 +1480,11 @@ bool LLVivoxVoiceClient::addAndJoinSession(const sessionStatePtr_t &nextSession) LLSD timeoutResult(LLSDMap("session", "timeout")); + // We are about to start a whole new session. Anything that MIGHT still be in our + // maildrop is going to be stale and cause us much wailing and gnashing of teeth. + // Just flush it all out and start new. + voicePump.flush(); + // It appears that I need to wait for BOTH the SessionGroup.AddSession response and the SessionStateChangeEvent with state 4 // before continuing from this state. They can happen in either order, and if I don't wait for both, things can get stuck. // For now, the SessionGroup.AddSession response handler sets mSessionHandle and the SessionStateChangeEvent handler transitions to stateSessionJoined. diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 976ced7d3e44dd38f24f5f3f64a21b2853081e98..33a9c771eab5c5e55c21df7ba60b8c7398804e2a 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -85,6 +85,7 @@ #include "llviewerinventory.h" #include "llcallstack.h" #include "llsculptidsize.h" +#include "llavatarappearancedefines.h" const F32 FORCE_SIMPLE_RENDER_AREA = 512.f; const F32 FORCE_CULL_AREA = 8.f; @@ -1380,7 +1381,8 @@ BOOL LLVOVolume::calcLOD() mLODDistance = distance; mLODRadius = radius; - if (gSavedSettings.getBOOL("DebugObjectLODs")) + static LLCachedControl<bool> debug_lods(gSavedSettings, "DebugObjectLODs", false); + if (debug_lods) { if (getAvatar() && isRootEdit()) { @@ -2444,7 +2446,13 @@ S32 LLVOVolume::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialPa case LLMaterial::DIFFUSE_ALPHA_MODE_EMISSIVE: case LLMaterial::DIFFUSE_ALPHA_MODE_MASK: { //all of them modes available only for 32 bit textures - if(GL_RGBA != img_diffuse->getPrimaryFormat()) + LLTextureEntry* tex_entry = getTE(te); + bool bIsBakedImageId = false; + if (tex_entry && LLAvatarAppearanceDefines::LLAvatarAppearanceDictionary::isBakedImageId(tex_entry->getID())) + { + bIsBakedImageId = true; + } + if (GL_RGBA != img_diffuse->getPrimaryFormat() && !bIsBakedImageId) { bSetDiffuseNone = true; } @@ -4276,10 +4284,16 @@ F32 LLVOVolume::getBinRadius() F32 scale = 1.f; - S32 size_factor = llmax(gSavedSettings.getS32("OctreeStaticObjectSizeFactor"), 1); - S32 attachment_size_factor = llmax(gSavedSettings.getS32("OctreeAttachmentSizeFactor"), 1); - LLVector3 distance_factor = gSavedSettings.getVector3("OctreeDistanceFactor"); - LLVector3 alpha_distance_factor = gSavedSettings.getVector3("OctreeAlphaDistanceFactor"); + static LLCachedControl<S32> octree_size_factor(gSavedSettings, "OctreeStaticObjectSizeFactor", 3); + static LLCachedControl<S32> octree_attachment_size_factor(gSavedSettings, "OctreeAttachmentSizeFactor", 4); + static LLCachedControl<LLVector3> octree_distance_factor(gSavedSettings, "OctreeDistanceFactor", LLVector3(0.01f, 0.f, 0.f)); + static LLCachedControl<LLVector3> octree_alpha_distance_factor(gSavedSettings, "OctreeAlphaDistanceFactor", LLVector3(0.1f, 0.f, 0.f)); + + S32 size_factor = llmax((S32)octree_size_factor, 1); + S32 attachment_size_factor = llmax((S32)octree_attachment_size_factor, 1); + LLVector3 distance_factor = octree_distance_factor; + LLVector3 alpha_distance_factor = octree_alpha_distance_factor; + const LLVector4a* ext = mDrawable->getSpatialExtents(); BOOL shrink_wrap = mDrawable->isAnimating(); @@ -5355,8 +5369,10 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) U32 useage = group->getSpatialPartition()->mBufferUsage; - U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask); - U32 max_total = (gSavedSettings.getS32("RenderMaxNodeSize")*1024)/LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask); + LLCachedControl<S32> max_vbo_size(gSavedSettings, "RenderMaxVBOSize", 512); + LLCachedControl<S32> max_node_size(gSavedSettings, "RenderMaxNodeSize", 65536); + U32 max_vertices = (max_vbo_size * 1024)/LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask); + U32 max_total = (max_node_size * 1024) / LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask); max_vertices = llmin(max_vertices, (U32) 65535); U32 cur_total = 0; @@ -5522,6 +5538,11 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) U32 mask = mat->getShaderMask(alpha_mode); pool->addRiggedFace(facep, mask); } + + if(vobj->isAnimatedObject() && vobj->isRiggedMesh()) + { + pool->updateRiggedVertexBuffers(vobj->getAvatar()); + } } else if (mat) { @@ -6109,7 +6130,8 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace #endif //calculate maximum number of vertices to store in a single buffer - U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask); + LLCachedControl<S32> max_vbo_size(gSavedSettings, "RenderMaxVBOSize", 512); + U32 max_vertices = (max_vbo_size * 1024)/LLVertexBuffer::calcVertexSize(group->getSpatialPartition()->mVertexDataMask); max_vertices = llmin(max_vertices, (U32) 65535); { @@ -6152,7 +6174,8 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace texture_index_channels = gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels; } - texture_index_channels = llmin(texture_index_channels, (S32) gSavedSettings.getU32("RenderMaxTextureIndex")); + static LLCachedControl<U32> max_texture_index(gSavedSettings, "RenderMaxTextureIndex", 16); + texture_index_channels = llmin(texture_index_channels, (S32) max_texture_index); //NEVER use more than 16 texture index channels (workaround for prevalent driver bug) texture_index_channels = llmin(texture_index_channels, 16); diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index 0882fc095dee8f60bb5c7559808003c690c2a081..13db9c39b75bd965de5bc0ff8d68c76d09754f91 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -54,6 +54,8 @@ enum LLVolumeInterfaceType INTERFACE_FLEXIBLE = 1, }; +const F32 MAX_LOD_FACTOR = 4.0f; + class LLRiggedVolume : public LLVolume { diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp index 3b9b96e9f158cf14c7f18955e888c30a01899e60..2cb5fc81b0fa53f48e15d4e6929533850ec7bbc0 100644 --- a/indra/newview/llvowlsky.cpp +++ b/indra/newview/llvowlsky.cpp @@ -335,7 +335,8 @@ BOOL LLVOWLSky::updateGeometry(LLDrawable * drawable) } { - const U32 max_buffer_bytes = gSavedSettings.getS32("RenderMaxVBOSize")*1024; + LLCachedControl<S32> max_vbo_size(gSavedSettings, "RenderMaxVBOSize", 512); + const U32 max_buffer_bytes = max_vbo_size * 1024; const U32 data_mask = LLDrawPoolWLSky::SKY_VERTEX_DATA_MASK; const U32 max_verts = max_buffer_bytes / LLVertexBuffer::calcVertexSize(data_mask); diff --git a/indra/newview/llwatchdog.cpp b/indra/newview/llwatchdog.cpp index 2782cd954572471e0448512e7aba9f6d64033b82..dd6c77ca7d1ace427a03bb199197812f1fd293e7 100644 --- a/indra/newview/llwatchdog.cpp +++ b/indra/newview/llwatchdog.cpp @@ -155,7 +155,7 @@ void LLWatchdogTimeout::ping(const std::string& state) // LLWatchdog LLWatchdog::LLWatchdog() : - mSuspectsAccessMutex(NULL), + mSuspectsAccessMutex(), mTimer(NULL), mLastClockCount(0), mKillerCallback(&default_killer_callback) @@ -185,7 +185,7 @@ void LLWatchdog::init(killer_event_callback func) mKillerCallback = func; if(!mSuspectsAccessMutex && !mTimer) { - mSuspectsAccessMutex = new LLMutex(NULL); + mSuspectsAccessMutex = new LLMutex(); mTimer = new LLWatchdogTimerThread(); mTimer->setSleepTime(WATCHDOG_SLEEP_TIME_USEC / 1000); mLastClockCount = LLTimer::getTotalTime(); diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index ee2270c3236fa0faac9a3a741f6f4d88d21511ea..e7bbee5efd9b9f3d1edda598b32de3c42b02f781 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -455,6 +455,7 @@ clothing_to_string_map_t init_clothing_string_map() w_map.insert(std::make_pair(LLWearableType::WT_SKIRT, "skirt_not_worn")); w_map.insert(std::make_pair(LLWearableType::WT_ALPHA, "alpha_not_worn")); w_map.insert(std::make_pair(LLWearableType::WT_TATTOO, "tattoo_not_worn")); + w_map.insert(std::make_pair(LLWearableType::WT_UNIVERSAL, "universal_not_worn")); w_map.insert(std::make_pair(LLWearableType::WT_PHYSICS, "physics_not_worn")); return w_map; } diff --git a/indra/newview/llwlparamset.cpp b/indra/newview/llwlparamset.cpp index 066cb9a0ace352fa61aca7f4204323633b77d652..986f167d8d07487d631b581f22d4ac5035e1cc31 100644 --- a/indra/newview/llwlparamset.cpp +++ b/indra/newview/llwlparamset.cpp @@ -337,14 +337,19 @@ void LLWLParamSet::mix(LLWLParamSet& src, LLWLParamSet& dest, F32 weight) setStarBrightness((1 - weight) * (F32) src.getStarBrightness() + weight * (F32) dest.getStarBrightness()); - llassert(src.getSunAngle() >= - F_PI && - src.getSunAngle() <= 3 * F_PI); - llassert(dest.getSunAngle() >= - F_PI && - dest.getSunAngle() <= 3 * F_PI); - llassert(src.getEastAngle() >= 0 && - src.getEastAngle() <= 4 * F_PI); - llassert(dest.getEastAngle() >= 0 && - dest.getEastAngle() <= 4 * F_PI); + // FIXME: we have established that this assert fails + // frequently. Someone who understands the code needs to figure + // out if it matters. In the meantime, disabling the checks so we + // can stop interfering with other development. + + //llassert(src.getSunAngle() >= - F_PI && + // src.getSunAngle() <= 3 * F_PI); + //llassert(dest.getSunAngle() >= - F_PI && + // dest.getSunAngle() <= 3 * F_PI); + //llassert(src.getEastAngle() >= 0 && + // src.getEastAngle() <= 4 * F_PI); + //llassert(dest.getEastAngle() >= 0 && + // dest.getEastAngle() <= 4 * F_PI); // sun angle and east angle require some handling to make sure // they go in circles. Yes quaternions would work better. diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 93d1dacf1fa01f829ddbe1204e87412bd5870acc..86249badaa35e11323792464a3028faecaef1f19 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -465,7 +465,11 @@ void LLWorldMapView::draw() mesg, 0, llfloor(left + 3), llfloor(bottom + 2), LLColor4::white, - LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW); + LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW, + S32_MAX, //max_chars + sMapScale, //max_pixels + NULL, + TRUE); //use ellipses } } } @@ -883,14 +887,8 @@ void LLWorldMapView::drawFrustum() F32 half_width_pixels = half_width_meters * meters_to_pixels; // Compute the frustum coordinates. Take the UI scale into account. -#if defined(LL_DARWIN) - F32 ui_scale_factor = gSavedSettings.getF32("UIScaleFactor"); - F32 ctr_x = ((getLocalRect().getWidth() * 0.5f + sPanX) * ui_scale_factor) * LLUI::getScaleFactor().mV[VX]; - F32 ctr_y = ((getLocalRect().getHeight() * 0.5f + sPanY) * ui_scale_factor) * LLUI::getScaleFactor().mV[VY]; -#else F32 ctr_x = ((getLocalRect().getWidth() * 0.5f + sPanX) * LLUI::getScaleFactor().mV[VX]); F32 ctr_y = ((getLocalRect().getHeight() * 0.5f + sPanY) * LLUI::getScaleFactor().mV[VY]); -#endif gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); @@ -1756,9 +1754,12 @@ BOOL LLWorldMapView::handleDoubleClick( S32 x, S32 y, MASK mask ) case MAP_ITEM_LAND_FOR_SALE_ADULT: { LLVector3d pos_global = viewPosToGlobal(x, y); - LLSimInfo* info = LLWorldMap::getInstance()->simInfoFromPosGlobal(pos_global); - LLFloaterReg::hideInstance("world_map"); - LLFloaterReg::showInstance("search", LLSD().with("category", "land").with("query", info->getName())); + std::string sim_name; + if (LLWorldMap::getInstance()->simNameFromPosGlobal(pos_global, sim_name)) + { + LLFloaterReg::hideInstance("world_map"); + LLFloaterReg::showInstance("search", LLSD().with("category", "land").with("query", sim_name)); + } break; } case MAP_ITEM_CLASSIFIED: diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index 143c97fca45150fa0e8ab2729a363f3d29f3eb6a..8e2539606bf8b1c76bbef88cf297c48959dc404b 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -362,6 +362,10 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip, const { httpOpts->setRetries(httpParams["retries"].asInteger()); } + if (httpParams.has("DNSCacheTimeout")) + { + httpOpts->setDNSCacheTimeout(httpParams["DNSCacheTimeout"].asInteger()); + } bool vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert"); mCertStore = gSavedSettings.getString("CertStore"); @@ -483,38 +487,24 @@ void LLXMLRPCTransaction::Impl::setHttpStatus(const LLCore::HttpStatus &status) { CURLcode code = static_cast<CURLcode>(status.toULong()); std::string message; - std::string uri = "http://secondlife.com/community/support.php"; + std::string uri = "http://support.secondlife.com"; LLURI failuri(mURI); - + LLStringUtil::format_map_t args; switch (code) { case CURLE_COULDNT_RESOLVE_HOST: - message = - std::string("DNS could not resolve the host name(") + failuri.hostName() + ").\n" - "Please verify that you can connect to the www.secondlife.com\n" - "web site. If you can, but continue to receive this error,\n" - "please go to the support section and report this problem."; + args["[HOSTNAME]"] = failuri.hostName(); + message = LLTrans::getString("couldnt_resolve_host", args); break; case CURLE_SSL_PEER_CERTIFICATE: - message = - "The login server couldn't verify itself via SSL.\n" - "If you continue to receive this error, please go\n" - "to the Support section of the SecondLife.com web site\n" - "and report the problem."; + message = LLTrans::getString("ssl_peer_certificate"); break; case CURLE_SSL_CACERT: - case CURLE_SSL_CONNECT_ERROR: - message = - "Often this means that your computer\'s clock is set incorrectly.\n" - "Please go to Control Panels and make sure the time and date\n" - "are set correctly.\n" - "Also check that your network and firewall are set up correctly.\n" - "If you continue to receive this error, please go\n" - "to the Support section of the SecondLife.com web site\n" - "and report the problem."; + case CURLE_SSL_CONNECT_ERROR: + message = LLTrans::getString("ssl_connect_error"); break; default: diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index e8c9909f8cace5eb618251de21a3b318b00a10cf..bd73c234a6a40d2f90fdcd13f702eea8937b2ce9 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -4062,7 +4062,6 @@ void LLPipeline::postSort(LLCamera& camera) void render_hud_elements() { - LL_RECORD_BLOCK_TIME(FTM_RENDER_UI); gPipeline.disableLights(); LLGLDisable fog(GL_FOG); @@ -4139,7 +4138,12 @@ void LLPipeline::renderHighlights() glStencilFunc(GL_ALWAYS, 0, 0xFFFFFFFF); glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); - + + if (canUseVertexShaders()) + { + gHighlightProgram.bind(); + } + gGL.setColorMask(false, false); for (std::set<HighlightItem>::iterator iter = mHighlightSet.begin(); iter != mHighlightSet.end(); ++iter) { @@ -10507,6 +10511,11 @@ void LLPipeline::generateHighlight(LLCamera& camera) gGL.setColorMask(true, true); mHighlight.clear(); + if (canUseVertexShaders()) + { + gHighlightProgram.bind(); + } + gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep); for (std::set<HighlightItem>::iterator iter = mHighlightSet.begin(); iter != mHighlightSet.end(); ) { diff --git a/indra/newview/skins/default/default_languages.xml b/indra/newview/skins/default/default_languages.xml new file mode 100644 index 0000000000000000000000000000000000000000..357930e1c539c615e2604325c6cc0e950ecfef69 --- /dev/null +++ b/indra/newview/skins/default/default_languages.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<labels> + <label + name="en" + value="System default" /> + <label + name="it" + value="Default di sistema" /> + <label + name="ja" + value="システムデフォルト" /> + <label + name="pl" + value="DomyÅ›lny" /> + <label + name="pt" + value="Padrão" /> + <label + name="ru" + value="Язык ÑиÑтемы" /> + <label + name="tr" + value="Sistem varsayılanı" /> + <label + name="zh" + value="系統é è¨" /> + <label + name="da" + value="System standard" /> + <label + name="de" + value="Systemvorgabe" /> + <label + name="es" + value="Predeterminado del sistema" /> + <label + name="fr" + value="Choix par défaut" /> +</labels> diff --git a/indra/newview/skins/default/textures/icons/Inv_Universal.png b/indra/newview/skins/default/textures/icons/Inv_Universal.png new file mode 100644 index 0000000000000000000000000000000000000000..470febb9b53579fc03f35445f2fc61b72f83192e Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Inv_Universal.png differ diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index c3cc4e83d030aebb89df09fbc37753d9af82fb07..a3f5515d6fc6810ee53b9dad223035ab1e1893c2 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -133,7 +133,6 @@ with the same filename but different name <texture name="Command_Chat_Icon" file_name="toolbar_icons/chat.png" preload="true" /> <texture name="Command_Compass_Icon" file_name="toolbar_icons/land.png" preload="true" /> <texture name="Command_Destinations_Icon" file_name="toolbar_icons/destinations.png" preload="true" /> - <texture name="Command_Facebook_Icon" file_name="toolbar_icons/facebook.png" preload="true" /> <texture name="Command_Flickr_Icon" file_name="toolbar_icons/flickr.png" preload="true" /> <texture name="Command_Gestures_Icon" file_name="toolbar_icons/gestures.png" preload="true" /> <texture name="Command_Grid_Status_Icon" file_name="toolbar_icons/grid_status.png" preload="true" /> @@ -206,8 +205,6 @@ with the same filename but different name <texture name="ExternalBrowser_Off" file_name="icons/ExternalBrowser_Off.png" preload="false" /> <texture name="Edit_Wrench" file_name="icons/Edit_Wrench.png" preload="false" /> - <texture name="Facebook_Icon" file_name="icons/Facebook.png" preload="false" /> - <texture name="Presets_Icon" file_name="icons/Presets_Icon.png" preload="true" /> <texture name="Favorite_Star_Active" file_name="navbar/Favorite_Star_Active.png" preload="false" /> @@ -317,6 +314,7 @@ with the same filename but different name <texture name="Inv_SysClosed" file_name="icons/Inv_SysClosed.png" preload="false" /> <texture name="Inv_SysOpen" file_name="icons/Inv_SysOpen.png" preload="false" /> <texture name="Inv_Tattoo" file_name="icons/Inv_Tattoo.png" preload="false" /> + <texture name="Inv_Universal" file_name="icons/Inv_Universal.png" preload="false" /> <texture name="Inv_Physics" file_name="icons/Inv_Physics.png" preload="false" /> <texture name="Inv_Texture" file_name="icons/Inv_Texture.png" preload="false" /> <texture name="Inv_TrashClosed" file_name="icons/Inv_TrashClosed.png" preload="false" /> @@ -593,7 +591,6 @@ with the same filename but different name <texture name="Snapshot_Email" file_name="snapshot_email.png" preload="false" /> <texture name="Snapshot_Inventory" file_name="toolbar_icons/inventory.png" preload="false" /> <texture name="Snapshot_Profile" file_name="toolbar_icons/profile.png" preload="false" /> - <texture name="Snapshot_Facebook" file_name="toolbar_icons/facebook.png" preload="false" /> <texture name="startup_logo" file_name="windows/startup_logo.png" preload="true" /> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_general.xml b/indra/newview/skins/default/xui/da/panel_preferences_general.xml index 5702d48e979712abd76c24771c280b23cb300704..624c6634ccd39dd698fd555ee81c61876ee2d23f 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_general.xml @@ -4,7 +4,6 @@ Sprog: </text> <combo_box name="language_combobox"> - <combo_box.item label="System standard" name="System Default Language"/> <combo_box.item label="English (Engelsk)" name="English"/> <combo_box.item label="Dansk - Beta" name="Danish"/> <combo_box.item label="Deutsch (Tysk) - Beta" name="Deutsch(German)"/> diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml index 74d160dfaec1ccb5cb20e1bac7f5a6edc0da5f63..eee3dc2c77792f04b43cf10feb96fbcc3373f503 100644 --- a/indra/newview/skins/default/xui/da/strings.xml +++ b/indra/newview/skins/default/xui/da/strings.xml @@ -432,7 +432,7 @@ Prøv venligst om lidt igen. Noter om version </string> <string name="RELEASE_NOTES_BASE_URL"> - http://wiki.secondlife.com/wiki/Release_Notes/ + https://releasenotes.secondlife.com/viewer/ </string> <string name="LoadingData"> Henter... 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 1e18ab20e8266f5411017cf06f9b83bb0f72c205..2bff6d3e2fdf9a4b0d97c80325be9a252e8fbd2a 100644 --- a/indra/newview/skins/default/xui/de/floater_about_land.xml +++ b/indra/newview/skins/default/xui/de/floater_about_land.xml @@ -21,7 +21,7 @@ <floater.string name="Remaining"> Restzeit </floater.string> - <tab_container name="landtab" tab_min_width="40" width="489"> + <tab_container name="landtab" tab_min_width="40"> <panel label="ALLGEMEIN" name="land_general_panel"> <panel.string name="new users only"> Nur neue Benutzer @@ -361,8 +361,8 @@ Nur große Parzellen können in der Suche aufgeführt werden. <text name="landing_point"> Landepunkt: [LANDING] </text> - <button label="Festlegen" label_selected="Festlegen" left="234" name="Set" right="-88" tool_tip="Legt Ihren Standort als Landepunkt fest, an dem Besucher ankommen. Legt die Position Ihres Avatars innerhalb dieser Parzelle fest." width="70"/> - <button label="Löschen" label_selected="Löschen" left="312" name="Clear" tool_tip="Landepunkt löschen" width="70"/> + <button label="Festlegen" label_selected="Festlegen" name="Set" tool_tip="Legt Ihren Standort als Landepunkt fest, an dem Besucher ankommen. Legt die Position Ihres Avatars innerhalb dieser Parzelle fest." width="70"/> + <button label="Löschen" label_selected="Löschen" name="Clear" tool_tip="Landepunkt löschen" width="70"/> <text name="Teleport Routing: "> Teleport-Route: </text> @@ -433,7 +433,7 @@ Nur große Parzellen können in der Suche aufgeführt werden. <panel.string name="estate_override"> Eine oder mehrere dieser Optionen gelten auf Grundbesitzebene </panel.string> - <check_box label="Alle Besucher sind zugelassen (Bei Deaktivierung dieser Option werden Bannlinien generiert)" name="public_access"/> + <check_box label="Alle Besucher sind zugelassen" tool_tip="Bei Deaktivierung dieser Option werden Bannlinien generiert" name="public_access"/> <check_box label="Muss 18+ sein [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Nur Einwohner, die mindestens 18 Jahre alt sind, können diese Parzelle betreten. Weitere Informationen finden Sie unter [SUPPORT_SITE]."/> <check_box label="Muss über Zahlungsinfo in Datei [ESTATE_PAYMENT_LIMIT] verfügen" name="limit_payment" tool_tip="Um diese Parzelle besuchen zu können, müssen Einwohner Zahlungsinformationen hinterlegt haben. Weitere Informationen finden Sie auf [SUPPORT_SITE]."/> <check_box label="Gruppe [GROUP] ohne Beschränkungen zulassen" name="GroupCheck" tool_tip="Gruppe im Register „Allgemein“ festlegen."/> diff --git a/indra/newview/skins/default/xui/de/floater_auction.xml b/indra/newview/skins/default/xui/de/floater_auction.xml index 8ededff319a83f9e4a16aa474c2e89b5ab01f8c4..4a0b136235b88ded5e9d5c3c437af0d09ff6e2bd 100644 --- a/indra/newview/skins/default/xui/de/floater_auction.xml +++ b/indra/newview/skins/default/xui/de/floater_auction.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_auction" title="LINDEN LAND VERKAUF STARTEN"> +<floater name="floater_auction" title="LINDEN-LANDVERKAUF STARTEN"> <floater.string name="already for sale"> Parzellen, die bereits zum Verkauf stehen, können nicht auktioniert werden. </floater.string> <check_box initial_value="true" label="Gelben Auswahlrahmen einschließen" name="fence_check"/> - <button label="Foto" label_selected="Foto" name="snapshot_btn"/> + <button label="Screenshot" label_selected="Screenshot" name="snapshot_btn"/> <button label="An jeden verkaufen" label_selected="An jeden verkaufen" name="sell_to_anyone_btn"/> <button label="Einstellungen löschen" label_selected="Einstellungen löschen" name="reset_parcel_btn"/> <button label="Auktion beginnen" label_selected="Auktion beginnen" name="start_auction_btn"/> diff --git a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml index 27a74c874ea4eff9f2d2909e9baca2a66c2de445..9454933264ea0fb99f982fc7d9bd09f4ed034e37 100644 --- a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml @@ -38,17 +38,17 @@ <text name="GroupLabel"> Gruppe: </text> - <check_box label="Teilen" name="share_with_group"/> + <check_box label="Teilen" name="share_with_group" tool_tip="Erlauben Sie allen Mitgliedern der zugeordneten Gruppe, Ihre Änderungsberechtigungen für dieses Objekt zu teilen. Sie müssen eine Ãœbereignung durchführen, um Rollenbeschränkungen zu aktivieren."/> <text name="AnyoneLabel"> Jeder: </text> - <check_box label="Kopieren" name="everyone_copy"/> + <check_box label="Kopieren" name="everyone_copy" tool_tip="Jeder Benutzer kann eine Kopie des Objekts erhalten. Das Objekt sowie alle seine Inhalte müssen kopier- und übertragbar sein."/> <text name="NextOwnerLabel"> Nächster Eigentümer: </text> - <check_box label="Bearbeiten" name="next_owner_modify"/> - <check_box label="Kopieren" name="next_owner_copy"/> - <check_box initial_value="true" label="Transferieren" name="next_owner_transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/> + <check_box label="Bearbeiten" name="next_owner_modify" tool_tip="Der nächste Eigentümer kann Eigenschaften wie den Artikelnamen oder den Maßstab dieses Objekts bearbeiten."/> + <check_box label="Kopieren" name="next_owner_copy" tool_tip="Der nächste Eigentümer kann unbegrenzt viele Kopien dieses Objekts erstellen. Die Kopien enthalten Informationen zum Ersteller und können niemals mehr Berechtigungen enthalten als der kopierte Artikel."/> + <check_box initial_value="true" label="Transferieren" name="next_owner_transfer" tool_tip="Der nächste Eigentümer kann dieses Objekt weitergeben oder verkaufen."/> <button label="OK" name="ok"/> <button label="Anwenden" name="apply"/> <button label="Abbrechen" name="close"/> diff --git a/indra/newview/skins/default/xui/de/floater_my_scripts.xml b/indra/newview/skins/default/xui/de/floater_my_scripts.xml new file mode 100644 index 0000000000000000000000000000000000000000..b4c2ba8b630f565da7b6a11443a5cd771f5eae3a --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_my_scripts.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="myscripts" title="Meine Skripte"/> diff --git a/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml index 27c6b739677b83b19cb29251954d899552748a82..2422e414e0e6eef57613ab1c176ae9f3548c387a 100644 --- a/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml @@ -96,7 +96,7 @@ </combo_box> <check_box label="Begehbare Objekte" name="show_walkables"/> <check_box label="Materialvolumen" name="show_material_volumes"/> - <check_box label="Statische Hinternisse" name="show_static_obstacles"/> + <check_box label="Statische Hindernisse" name="show_static_obstacles"/> <check_box label="Ausschlussvolumen" name="show_exclusion_volumes"/> <check_box label="Wasserebene" name="show_water_plane"/> <check_box label="Mit Röntgenblick" name="show_xray"/> diff --git a/indra/newview/skins/default/xui/de/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/de/floater_pathfinding_linksets.xml index a423f3efea41db73d4f59d6a4b1efb3c4130040b..6729e242ac3edc0dcbafbbb30dd29413fcac250a 100644 --- a/indra/newview/skins/default/xui/de/floater_pathfinding_linksets.xml +++ b/indra/newview/skins/default/xui/de/floater_pathfinding_linksets.xml @@ -61,10 +61,10 @@ Begehbar </floater.string> <floater.string name="linkset_use_static_obstacle"> - Statisches Hinternis + Statisches Hindernis </floater.string> <floater.string name="linkset_use_dynamic_obstacle"> - Bewegliches Hinternis + Bewegliches Hindernis </floater.string> <floater.string name="linkset_use_material_volume"> Materialvolumen @@ -103,8 +103,8 @@ <combo_box name="filter_by_linkset_use"> <combo_box.item label="Nach Linkset-Nutzung filtern..." name="filter_by_linkset_use_none"/> <combo_box.item label="Begehbar" name="filter_by_linkset_use_walkable"/> - <combo_box.item label="Statisches Hinternis" name="filter_by_linkset_use_static_obstacle"/> - <combo_box.item label="Bewegliches Hinternis" name="filter_by_linkset_use_dynamic_obstacle"/> + <combo_box.item label="Statisches Hindernis" name="filter_by_linkset_use_static_obstacle"/> + <combo_box.item label="Bewegliches Hindernis" name="filter_by_linkset_use_dynamic_obstacle"/> <combo_box.item label="Materialvolumen" name="filter_by_linkset_use_material_volume"/> <combo_box.item label="Ausschlussvolumen" name="filter_by_linkset_use_exclusion_volume"/> <combo_box.item label="Bewegliches Phantom" name="filter_by_linkset_use_dynamic_phantom"/> diff --git a/indra/newview/skins/default/xui/de/floater_preferences.xml b/indra/newview/skins/default/xui/de/floater_preferences.xml index 159f65be30ecdb5cf67c3f15ec963d6fda305d5a..623308f87430ee26f4f6a94d3926e1c2c2284e84 100644 --- a/indra/newview/skins/default/xui/de/floater_preferences.xml +++ b/indra/newview/skins/default/xui/de/floater_preferences.xml @@ -5,6 +5,9 @@ </floater.string> <button label="OK" label_selected="OK" name="OK"/> <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/> + <panel name="search_panel"> + <search_editor label="Sucheinstellungen" name="search_prefs_edit" tool_tip="Geben Sie hier den gewünschten Suchbegriff ein. Die Ergebnisse werden für teilweise Volltext-Treffer innerhalb des Einstellungsnamens oder Kommentars angezeigt."/> + </panel> <tab_container name="pref core"> <panel label="Allgemein" name="general"/> <panel label="Grafik" name="display"/> diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml index 563d179d4ca8a52413e08ca8df82a82ca2252f7f..a4dfde66bcccd4d942b72d4e9c830eb4ae443cf7 100644 --- a/indra/newview/skins/default/xui/de/floater_tools.xml +++ b/indra/newview/skins/default/xui/de/floater_tools.xml @@ -172,9 +172,11 @@ <text name="Name:"> Name: </text> + <line_editor name="Object Name" tool_tip="Der Name ist auf 63 Zeichen begrenzt. Längere formelle Namen werden gekürzt. Die Namen dürfen ausschließlich aus druckbaren Zeichen des (nicht erweiterten) ASCII-7-Zeichensatzes bestehen, mit Ausnahme des Senkrechtstrichs "|"."/> <text name="Description:"> Beschreibung: </text> + <line_editor name="Object Description" tool_tip="Bei Auswahl der Option "Mauszeiger-Tipps zu allen Objekten" in den Viewer-Einstellungen wird für alle Objekte das Popup mit der Objektbeschreibung unter dem Mauszeiger eingeblendet. Die formelle Beschreibung ist auf 127 Byte begrenzt, und alle längeren Zeichenketten werden gekürzt."/> <text name="Creator:"> Ersteller: </text> @@ -191,17 +193,18 @@ <text name="label click action"> Bei Linksklick: </text> - <combo_box name="clickaction"> + <combo_box name="clickaction" tool_tip="Eine Klickaktion ermöglicht Ihnen die Interaktion mit einem Objekt mithilfe eines einzelnen Linksklicks. Jede Klickaktion verfügt über einen speziellen Cursor, der die Aktion verdeutlicht. Für manche Klickaktionen müssen Anforderungen erfüllt sein, damit die Funktion gewährleistet ist. Für die Funktion Touch and Pay (Berühren und Bezahlen) sind Skripte erforderlich."> <combo_box.item label="Berühren (Standard)" name="Touch/grab(default)"/> <combo_box.item label="Auf Objekt sitzen" name="Sitonobject"/> <combo_box.item label="Objekt kaufen" name="Buyobject"/> <combo_box.item label="Objekt bezahlen" name="Payobject"/> <combo_box.item label="Öffnen" name="Open"/> <combo_box.item label="Zoom" name="Zoom"/> + <combo_box.item label="Keine" name="None"/> </combo_box> - <check_box label="Zum Verkauf:" name="checkbox for sale"/> - <spinner label="L$" name="Edit Cost"/> - <combo_box name="sale type"> + <check_box label="Zum Verkauf:" name="checkbox for sale" tool_tip="Ermöglicht, dass Einwohner dieses Objekt, seine Inhalte oder eine Kopie zum angegebenen Preis inworld erwerben."/> + <spinner label="L$" name="Edit Cost" tool_tip="Objektkosten."/> + <combo_box name="sale type" tool_tip="Wählen Sie aus, ob der Käufer eine Kopie, eine Kopie der Inhalte oder den Artikel selbst erhält."> <combo_box.item label="Kopie" name="Copy"/> <combo_box.item label="Inhalt" name="Contents"/> <combo_box.item label="Original" name="Original"/> @@ -214,14 +217,14 @@ <text name="Anyone can:"> Jeder: </text> - <check_box label="Bewegen" name="checkbox allow everyone move"/> - <check_box label="Kopieren" name="checkbox allow everyone copy"/> + <check_box label="Bewegen" name="checkbox allow everyone move" tool_tip="Jeder Benutzer kann das Objekt bewegen."/> + <check_box label="Kopieren" name="checkbox allow everyone copy" tool_tip="Jeder Benutzer kann eine Kopie des Objekts erhalten. Das Objekt sowie alle seine Inhalte müssen kopier- und übertragbar sein."/> <text name="Next owner can:"> Nächster Eigentümer: </text> - <check_box label="Ändern" name="checkbox next owner can modify"/> - <check_box label="Kopieren" name="checkbox next owner can copy"/> - <check_box label="Transferieren" name="checkbox next owner can transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/> + <check_box label="Ändern" name="checkbox next owner can modify" tool_tip="Der nächste Eigentümer kann Eigenschaften wie den Artikelnamen oder den Maßstab dieses Objekts bearbeiten."/> + <check_box label="Kopieren" name="checkbox next owner can copy" tool_tip="Der nächste Eigentümer kann unbegrenzt viele Kopien dieses Objekts erstellen. Die Kopien enthalten Informationen zum Ersteller und können niemals mehr Berechtigungen enthalten als der kopierte Artikel."/> + <check_box label="Transferieren" name="checkbox next owner can transfer" tool_tip="Der nächste Eigentümer kann dieses Objekt weitergeben oder verkaufen."/> <text name="B:"> B: </text> diff --git a/indra/newview/skins/default/xui/de/floater_top_objects.xml b/indra/newview/skins/default/xui/de/floater_top_objects.xml index d01b4640c2e76cd2fb315f15a2311d7941714eb7..7a8f57803abb7efc4e43ee2a8aebcdb1a49b6760 100644 --- a/indra/newview/skins/default/xui/de/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/de/floater_top_objects.xml @@ -4,7 +4,7 @@ Top-Skripts </floater.string> <floater.string name="top_scripts_text"> - [COUNT] Skripts benötigen insgesamt [TIME] ms + [COUNT] Skripte benötigen insgesamt [TIME] ms und [MEMORY] KB </floater.string> <floater.string name="scripts_score_label"> Zeit diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml index a71b9b8ef90d6591831b5be15cdc3816de7a2acc..5917a0b529e3de12cb634bc301d9503fba01370f 100644 --- a/indra/newview/skins/default/xui/de/menu_viewer.xml +++ b/indra/newview/skins/default/xui/de/menu_viewer.xml @@ -9,9 +9,11 @@ <menu_item_call label="Orte..." name="Places"/> <menu_item_call label="Auswahlen..." name="Picks"/> <menu_item_call label="Erlebnisse..." name="Experiences"/> + <menu_item_call label="Meine Skripte..." name="MyScripts"/> <menu_item_call label="Kamerasteuerungen..." name="Camera Controls"/> <menu label="Bewegung" name="Movement"> <menu_item_call label="Hinsetzen" name="Sit Down Here"/> + <menu_item_call label="Aufstehen" name="Stand up"/> <menu_item_check label="Fliegen" name="Fly"/> <menu_item_check label="Immer rennen" name="Always Run"/> <menu_item_call label="Animation meines Avatars stoppen" name="Stop Animating My Avatar"/> diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index 94ec441b15c08571547db2aac583f336062807dc..17ed6a53850ca113828679e40b884584d8abb9fa 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -244,6 +244,10 @@ Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. Hinweis: Bei Aktivierung dieser Option sehen alle Personen, die diesen Computer benutzen, Ihre Lieblingsorte. <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="AllowMultipleViewers"> + Das Starten mehrerer Second Life Viewer wird nicht unterstützt. Dies kann zu Kollisionen des Textur-Caches, Fehlern sowie verschlechterter Grafik und Leistung führen. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="GrantModifyRights"> Wenn Sie einem anderen Einwohner Änderungsrechte gewähren, dann kann dieser JEDES Objekt, das Sie inworld besitzen, ändern, löschen oder an sich nehmen. Seien Sie daher beim Gewähren dieser Rechte sehr vorsichtig! Möchten Sie [NAME] Änderungsrechte gewähren? @@ -725,9 +729,9 @@ Sie können die Grafikqualität unter Einstellungen > Grafik wieder erhöhen. Sie sind nicht zum Terraformen der Parzelle „[PARCEL]“ berechtigt. </notification> <notification name="CannotCopyWarning"> - Sie sind nicht berechtigt, die folgenden Objekte zu kopieren: -[ITEMS] -Wenn Sie diese weitergeben, werden sie aus Ihrem Inventar entfernt. Möchten Sie diese Objekte wirklich weggeben? + Sie sind nicht berechtigt, die folgenden Objekte zu kopieren: +<nolink>[ITEMS]</nolink> +und die Objekte werden aus Ihrem Inventar gelöscht, wenn Sie diese weggeben. Möchten Sie diese Objekte wirklich weggeben? <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> </notification> <notification name="CannotGiveItem"> @@ -1584,6 +1588,30 @@ Ersetzen Sie die Textur [TEXTURE_NUM] mit einer Bilddatei von maximal 512x512 un <notification name="ProblemAddingEstateManagerBanned"> Verbannter Einwohner kann nicht zur Grundbesitzverwalterliste hinzugefügt werden. </notification> + <notification name="ProblemBanningEstateManager"> + Grundbesitzverwalter [AGENT] kann nicht zur Bannliste hinzugefügt werden. + </notification> + <notification name="GroupIsAlreadyInList"> + <nolink>[GROUP]</nolink> befindet sich bereits auf der Liste der zulässigen Gruppen. + </notification> + <notification name="AgentIsAlreadyInList"> + [AGENT] befindet sich bereits auf Ihrer [LIST_TYPE]-Liste. + </notification> + <notification name="AgentsAreAlreadyInList"> + [AGENT] befinden sich bereits auf Ihrer [LIST_TYPE]-Liste. + </notification> + <notification name="AgentWasAddedToList"> + [AGENT] wurde der [LIST_TYPE]-Liste von [ESTATE] hinzugefügt. + </notification> + <notification name="AgentsWereAddedToList"> + [AGENT] wurden zur [LIST_TYPE]-Liste von [ESTATE] hinzugefügt. + </notification> + <notification name="AgentWasRemovedFromList"> + [AGENT] wurden von der [LIST_TYPE]-Liste von [ESTATE] entfernt. + </notification> + <notification name="AgentsWereRemovedFromList"> + [AGENT] wurden von der [LIST_TYPE]-Liste von [ESTATE] entfernt. + </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> Das Aussehen lässt sich erst ändern, wenn Kleider und Form/Gestalt geladen sind. </notification> @@ -1599,9 +1627,25 @@ Geben Sie das Objekt zum Verkauf frei und versuchen Sie es erneut. [DOWNLOAD_PATH]. </notification> <notification name="RequiredUpdate"> - Für die Anmeldung ist Version [VERSION] erforderlich. Diese sollte für Sie aktualisiert worden sein, was offenbar nicht geschehen ist. Bitte laden Sie die Datei unter https://secondlife.com/support/downloads/ herunter. + Für die Anmeldung ist Version [VERSION] erforderlich. +Bitte laden Sie die Datei unter https://secondlife.com/support/downloads/ herunter. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PauseForUpdate"> + Für die Anmeldung ist Version [VERSION] erforderlich. +Klicken Sie zum Herunterladen und Installieren auf OK. <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="OptionalUpdateReady"> + Version [VERSION] wurde heruntergeladen und ist bereit zur Installation. +Klicken Sie zur Installation auf OK. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PromptOptionalUpdate"> + Version [VERSION] wurde heruntergeladen und ist bereit zur Installation. +Fortfahren? + <usetemplate canceltext="Nicht jetzt" name="yesnocancelbuttons" notext="Ãœberspringen" yestext="Installieren"/> + </notification> <notification name="LoginFailedUnknown"> Die Anmeldung ist aus nicht bekannten Gründen leider fehlgeschlagen. Falls diese Meldung weiterhin angezeigt wird, besuchen Sie bitte die [SUPPORT_SITE]. <usetemplate name="okbutton" yestext="Beenden"/> @@ -1885,7 +1929,7 @@ Tausende Regionen werden verändert und der Spaceserver wird dadurch stark belas <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Diesen Grundbesitz"/> </notification> <notification label="Grundbesitz wählen" name="EstateBannedAgentRemove"> - Einwohner nur für diesen Grundbesitz oder für alle [ALL_ESTATES] von der Bannliste entfernen? + Den Einwohner nur für diesen Grundbesitz oder für [ALL_ESTATES] von der Bannliste entfernen? <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Diesen Grundbesitz"/> </notification> <notification label="Grundbesitz wählen" name="EstateManagerAdd"> @@ -3063,15 +3107,6 @@ Gewähren Sie dem Objekt nur dann Zugriff, wenn Sie genau verstehen, wieso ein s <button name="Deny" text="Verweigern"/> </form> </notification> - <notification name="UnknownScriptQuestion"> - Die Runtime-Skript-Berechtigung, die von „<nolink>[OBJECTNAME]</nolink>“ (Besitzer: „[NAME]“) angefordert wurde, wird vom Viewer nicht erkannt und kann nicht gewährt werden. - -Um diese Berechtigung zu gewähren, laden Sie die neueste Version des Viewers von [DOWNLOADURL] herunter. - <form name="form"> - <button name="Deny" text="OK"/> - <button name="Mute" text="Blockieren"/> - </form> - </notification> <notification name="ScriptDialog"> „<nolink>[TITLE]</nolink>“ von [NAME] [MESSAGE] @@ -3177,16 +3212,22 @@ Klicken Sie auf 'Akzeptieren ', um dem Chat beizutreten, oder auf &a Verbindung zu [VOICE_CHANNEL_NAME] nicht möglich. Bitte versuchen Sie es später. Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden. </notification> <notification name="VoiceEffectsExpired"> - Ein oder mehrere Ihrer Voice-Morph-Abos ist/sind abgelaufen. -[[URL] Hier klicken], um Ihr Abo zu erneuern. + Ein oder mehrere Ihrer Voice-Morph-Abos sind abgelaufen. +[[URL] Klicken Sie hier], um Ihr Abo zu erneuern. + +Wenn Sie Premium-Mitglied sind, [[PREMIUM_URL] klicken Sie hier], um Ihren Voice-Morphing-Vorteil zu nutzen. </notification> <notification name="VoiceEffectsExpiredInUse"> - Das aktive Voice-Morph-Abo ist abgelaufen. Ihre normalen Voice-Einstellungen werden angewendet. -[[URL] Hier klicken], um Ihr Abo zu erneuern. + Das aktive Voice-Morph-Abo ist abgelaufen. Ihre normalen Voice-Einstellungen werden angewendet. +[[URL] Klicken Sie hier], um Ihr Abo zu erneuern. + +Wenn Sie Premium-Mitglied sind, [[PREMIUM_URL] klicken Sie hier], um Ihren Voice-Morphing-Vorteil zu nutzen. </notification> <notification name="VoiceEffectsWillExpire"> - Ein oder mehrere Ihrer Voice-Morph-Abos werden in weniger als [INTERVAL] Tagen ablaufen. -[[URL] Hier klicken], um Ihr Abo zu erneuern. + Ein oder mehrere Ihrer Voice-Morph-Abos laufen in weniger als [INTERVAL] Tagen ab. +[[URL] Klicken Sie hier], um Ihr Abo zu erneuern. + +Wenn Sie Premium-Mitglied sind, [[PREMIUM_URL] klicken Sie hier], um Ihren Voice-Morphing-Vorteil zu nutzen. </notification> <notification name="VoiceEffectsNew"> Neue Voice-Morph-Effekte sind erhältlich! @@ -3238,6 +3279,9 @@ Diese werden für ein paar Sekunden sicherheitshalber gesperrt. <notification name="SnapshotToComputerFailed"> Fehler beim Speichern des Bildes unter [PATH]: Zu wenig Speicherplatz auf dem Medium. [NEED_MEMORY]KB werden benötigt, es stehen jedoch nur [FREE_MEMORY]KB zur Verfügung. </notification> + <notification name="SnapshotToLocalDirNotExist"> + Fehler beim Speichern des Bildes unter [PATH]: Verzeichnis nicht vorhanden. + </notification> <notification name="PresetNotSaved"> Fehler beim Speichern der Voreinstellung [NAME]. </notification> @@ -3726,13 +3770,13 @@ es sich nicht in der gleichen Region befindet wie Sie. Auf Land, das Sie nicht besitzen, können Sie keine Bäume und Gräser erstellen. </notification> <notification name="NoCopyPermsNoObject"> - Kopieren fehlgeschlagen, da Sie keine Berechtigung zum Kopieren des Objekts „OBJ_NAME]“ besitzen. + Kopieren fehlgeschlagen, da Sie nicht über die Berechtigung zum Kopieren des Objekts <nolink>'[OBJ_NAME]'</nolink> verfügen. </notification> <notification name="NoTransPermsNoObject"> - Kopieren fehlgeschlagen, weil Objekt „[OBJ_NAME]“ nicht an Sie übertragen werden kann. + Kopieren fehlgeschlagen, da das Objekt <nolink>'[OBJ_NAME]'</nolink> nicht an Sie übertragen werden kann. </notification> <notification name="AddToNavMeshNoCopy"> - Kopieren fehlgeschlagen, weil Objekt „[OBJ_NAME]“ zum Navmesh beiträgt. + Kopieren fehlgeschlagen, da das Objekt <nolink>'[OBJ_NAME]'</nolink> zum Navmesh beiträgt. </notification> <notification name="DupeWithNoRootsSelected"> Ohne ausgewählte Hauptobjekte duplizieren. @@ -3777,34 +3821,34 @@ Warten Sie kurz und versuchen Sie es noch einmal. Erneutes Speichern im Inventar ist deaktiviert. </notification> <notification name="NoExistNoSaveToContents"> - „[OBJ_NAME]“ kann nicht im Objektinhalt gespeichert werden, da das Objekt, aus dem es gerezzt wurde, nicht mehr existiert. + <nolink>'[OBJ_NAME]'</nolink> kann nicht im Objektinhalt gespeichert werden, da das Objekt, aus dem es gerezzt wurde, nicht mehr existiert. </notification> <notification name="NoModNoSaveToContents"> - „[OBJ_NAME]“ kann nicht in Objektinhalt gespeichert werden, da Sie nicht die Berechtigung zum Modifizieren des Objekts „[DEST_NAME]“ besitzen. + <nolink>'[OBJ_NAME]'</nolink> kann nicht in Objektinhalt gespeichert werden, da Sie nicht über die Berechtigung zum Modifizieren des Objekts <nolink>'[DEST_NAME]'</nolink> verfügen. </notification> <notification name="NoSaveBackToInvDisabled"> - „[OBJ_NAME]“ kann nicht erneut im Inventar gespeichert werden – dieser Vorgang wurde deaktiviert. + <nolink>'[OBJ_NAME]'</nolink> kann nicht erneut im Inventar gespeichert werden – dieser Vorgang wurde deaktiviert. </notification> <notification name="NoCopyNoSelCopy"> - Sie können Ihre Auswahl nicht kopieren, da Sie nicht die Berechtigung zum Kopieren des Objekts „[OBJ_NAME]“ haben. + Sie können Ihre Auswahl nicht kopieren, da Sie nicht über die Berechtigung zum Kopieren des Objekts <nolink>'[OBJ_NAME]'</nolink> verfügen. </notification> <notification name="NoTransNoSelCopy"> - Sie können Ihre Auswahl nicht kopieren, da das Objekt „[OBJ_NAME]“ nicht übertragbar ist. + Sie können Ihre Auswahl nicht kopieren, da das Objekt <nolink>'[OBJ_NAME]'</nolink> nicht übertragbar ist. </notification> <notification name="NoTransNoCopy"> - Sie können Ihre Auswahl nicht kopieren, da das Objekt „[OBJ_NAME]“ nicht übertragbar ist. + Sie können Ihre Auswahl nicht kopieren, da das Objekt <nolink>'[OBJ_NAME]'</nolink> nicht übertragbar ist. </notification> <notification name="NoPermsNoRemoval"> - Entfernen des Objekts „[OBJ_NAME]“ aus dem Simulator wird vom Berechtigungssystem nicht gestattet. + Entfernen des Objekts <nolink>'[OBJ_NAME]'</nolink> aus dem Simulator wird vom Berechtigungssystem nicht gestattet. </notification> <notification name="NoModNoSaveSelection"> - Sie können Ihre Auswahl nicht speichern, da Sie keine Berechtigung zum Modifizieren des Objekts „[OBJ_NAME]“ besitzen. + Sie können Ihre Auswahl nicht speichern, da Sie nicht über die Berechtigung zum Modifizieren des Objekts <nolink>'[OBJ_NAME]'</nolink> verfügen. </notification> <notification name="NoCopyNoSaveSelection"> - Ihre Auswahl kann nicht gespeichert werden, da das Objekt „[OBJ_NAME]“ nicht kopiert werden kann. + Ihre Auswahl kann nicht gespeichert werden, da das Objekt <nolink>'[OBJ_NAME]'</nolink> nicht kopiert werden kann. </notification> <notification name="NoModNoTaking"> - Sie können Ihre Auswahl nicht in Empfang nehmen, da Sie nicht die Berechtigung zum Modifizieren des Objekts „[OBJ_NAME]“ haben. + Sie können Ihre Auswahl nicht in Empfang nehmen, da Sie nicht über die Berechtigung zum Modifizieren des Objekts <nolink>'[OBJ_NAME]'</nolink> verfügen. </notification> <notification name="RezDestInternalError"> Interner Fehler: Unbekannter Zielttyp. diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml index 32c9598edfe0ac71a94765c7a1040a0e337218a0..287f55a127e5900314b99ab522e27ffa9363a280 100644 --- a/indra/newview/skins/default/xui/de/panel_login.xml +++ b/indra/newview/skins/default/xui/de/panel_login.xml @@ -1,6 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <panel name="panel_login"> - <panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=de</panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php?lang=de + </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="ui_stack"> <layout_panel name="ui_container"> <combo_box label="Benutzername" name="username_combo" tool_tip="Bei der Registrierung gewählter Benutzername wie „berndschmidt12“ oder „Liebe Sonne“"/> @@ -11,8 +16,13 @@ </combo_box> <button label="Anmelden" name="connect_btn"/> <check_box label="Details speichern" name="remember_check"/> - <text name="forgot_password_text">Kennwort vergessen</text> + <text name="forgot_password_text"> + Kennwort vergessen + </text> <combo_box label="Grid auswählen" name="server_combo"/> + <text name="sign_up_text"> + Registrieren + </text> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_login_first.xml b/indra/newview/skins/default/xui/de/panel_login_first.xml index 44637d5159766321fb929887c2c772dc0b2ee265..038001157e811f138cd10c2ad11585e5eba32e69 100644 --- a/indra/newview/skins/default/xui/de/panel_login_first.xml +++ b/indra/newview/skins/default/xui/de/panel_login_first.xml @@ -3,6 +3,9 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php?lang=de </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="logo_stack"> <layout_panel name="parent_panel2"> <layout_stack name="widget_stack"> @@ -14,6 +17,9 @@ <text name="forgot_password_text"> Kennwort vergessen </text> + <text name="sign_up_text"> + Registrieren + </text> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_general.xml b/indra/newview/skins/default/xui/de/panel_preferences_general.xml index 201998f220c36c983a0caa7b7dff58a50d16707d..c4705d7283ce6d8331b3907597e900fa0a0a5208 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_general.xml @@ -4,7 +4,6 @@ Sprache: </text> <combo_box name="language_combobox"> - <combo_box.item label="Systemvorgabe" name="System Default Language"/> <combo_box.item label="English (Englisch)" name="English"/> <combo_box.item label="Dansk (Dänisch) - Beta" name="Danish"/> <combo_box.item label="Deutsch - Beta" name="Deutsch(German)"/> diff --git a/indra/newview/skins/default/xui/de/panel_region_access.xml b/indra/newview/skins/default/xui/de/panel_region_access.xml new file mode 100644 index 0000000000000000000000000000000000000000..4ebc4867fb81f72af256f2ab0adcf84ae5c76ecb --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_region_access.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Zugang" name="Access"> + <tab_container name="tabs"> + <panel label="GRUNDBESITZVERWALTER" name="estate_managers_panel"> + <text name="estate_manager_label"> + Grundbesitzverwalter: + </text> + <name_list name="estate_manager_name_list"> + <columns label="Name" name="name"/> + </name_list> + <button label="Hinzufügen..." name="add_estate_manager_btn"/> + <button label="Entfernen..." name="remove_estate_manager_btn"/> + </panel> + <panel label="ZULÄSSIG" name="allowed_panel"> + <panel label="top_panel" name="allowed_search_panel"> + <filter_editor label="Zulässige Agenten suchen" name="allowed_search_input"/> + </panel> + <text name="allow_resident_label"> + Immer zugelassen: + </text> + <name_list name="allowed_avatar_name_list"> + <columns label="Name" name="name"/> + </name_list> + <button label="Hinzufügen..." name="add_allowed_avatar_btn"/> + <button label="Entfernen..." name="remove_allowed_avatar_btn"/> + </panel> + <panel label="ZULÄSSIGE GRUPPEN" name="allowed_groups_panel"> + <panel label="top_panel" name="allowed_group_search_panel"> + <filter_editor label="Zulässige Gruppen Suchen" name="allowed_group_search_input"/> + </panel> + <text name="allow_group_label"> + Immer zugelassene Gruppen: + </text> + <name_list name="allowed_group_name_list"> + <columns label="Name" name="name"/> + </name_list> + <button label="Hinzufügen..." name="add_allowed_group_btn"/> + <button label="Entfernen..." name="remove_allowed_group_btn"/> + </panel> + <panel label="VERBANNT" name="banned_panel"> + <panel label="top_panel" name="banned_search_panel"> + <filter_editor label="Verbannte Agenten suchen" name="banned_search_input"/> + </panel> + <text name="ban_resident_label"> + Immer verbannt: + </text> + <name_list name="banned_avatar_name_list"> + <columns label="Name" name="name"/> + <columns label="Letztes Login-Datum" name="last_login_date"/> + <columns label="Datum der Verbannung" name="ban_date"/> + <columns label="Verbannt von" name="bannedby"/> + </name_list> + <button label="Hinzufügen..." name="add_banned_avatar_btn"/> + <button label="Entfernen..." name="remove_banned_avatar_btn"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_region_estate.xml b/indra/newview/skins/default/xui/de/panel_region_estate.xml index 2a7b65495458f7ce22f9113d4da5b2997284fe31..b713dd58d02f1b6c92de8145887dc1cd51baf371 100644 --- a/indra/newview/skins/default/xui/de/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/de/panel_region_estate.xml @@ -16,7 +16,7 @@ (unbekannt) </text> <radio_group name="externally_visible_radio"> - <radio_item label="Nur nachstehend aufgelistete Einwohner und Gruppen zulassen" name="estate_restricted_access"/> + <radio_item label="Nur Einwohner und Gruppen zulassen, die im Reiter "Zugang" aufgelistet sind." name="estate_restricted_access"/> <radio_item label="Alle Besucher zugelassen" name="estate_public_access"/> </radio_group> <check_box label="Muss 18+ sein" name="limit_age_verified" tool_tip="Nur Einwohner, die mindestens 18 Jahre alt sind, können diesen Grundbesitz betreten. Weitere Informationen finden Sie unter [SUPPORT_SITE]."/> diff --git a/indra/newview/skins/default/xui/de/panel_status_bar.xml b/indra/newview/skins/default/xui/de/panel_status_bar.xml index b0cb1e0592f41f4a535681b5e2e2d9078b97f921..0829814220e6ca59d11f5ed1d99e9b2e9e61e5cc 100644 --- a/indra/newview/skins/default/xui/de/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/de/panel_status_bar.xml @@ -1,16 +1,31 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="status"> - <panel.string name="packet_loss_tooltip">Paketverlust</panel.string> - <panel.string name="bandwidth_tooltip">Bandbreite</panel.string> - <panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string> - <panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string> - <panel.string name="buycurrencylabel">[AMT] L$</panel.string> + <panel.string name="packet_loss_tooltip"> + Paketverlust + </panel.string> + <panel.string name="bandwidth_tooltip"> + Bandbreite + </panel.string> + <panel.string name="time"> + [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> + [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] + </panel.string> + <panel.string name="buycurrencylabel"> + [AMT] L$ + </panel.string> + <panel name="menu_search_panel"> + <search_editor label="Suchmenüs" name="search_menu_edit" tool_tip="Geben Sie hier den gewünschten Suchbegriff ein. Die Ergebnisse werden für teilweise Volltext-Treffer innerhalb des Menüs angezeigt."/> + </panel> <panel left="-436" name="balance_bg" width="205"> <text name="balance" tool_tip="Klicken, um L$-Guthaben zu aktualisieren" value="L$ ??"/> <button label="L$ kaufen" name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/> <button label="Einkaufen" name="goShop" tool_tip="Second Life-Marktplatz öffnen" width="85"/> </panel> - <text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)">24:00 H PST</text> + <text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)"> + 24:00 H PST + </text> <button name="media_toggle_btn" tool_tip="Alle Medien starten/stoppen (Musik, Video, Webseiten)"/> <button name="volume_btn" tool_tip="Steuerung der Gesamtlautstärke"/> </panel> diff --git a/indra/newview/skins/default/xui/de/sidepanel_item_info.xml b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml index f7dc265cf45f9a264e21d7f18b23faa76a444798..168bb1424830de6ff4a38d1aaf35e3a59a12fc92 100644 --- a/indra/newview/skins/default/xui/de/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/de/sidepanel_item_info.xml @@ -34,9 +34,11 @@ <text name="LabelItemNameTitle"> Name: </text> + <line_editor name="LabelItemName" tool_tip="Der Name ist auf 63 Zeichen begrenzt. Längere formelle Namen werden gekürzt. Die Namen dürfen ausschließlich aus druckbaren Zeichen des (nicht erweiterten) ASCII-7-Zeichensatzes bestehen, mit Ausnahme des Senkrechtstrichs "|"."/> <text name="LabelItemDescTitle"> Beschreibung: </text> + <line_editor name="LabelItemDesc" tool_tip="Bei Auswahl der Option "Mauszeiger-Tipps zu allen Objekten" in den Viewer-Einstellungen wird für alle Objekte das Popup mit der Objektbeschreibung unter dem Mauszeiger eingeblendet. Die formelle Beschreibung ist auf 127 Byte begrenzt, und alle längeren Zeichenketten werden gekürzt."/> <text name="LabelCreatorTitle"> Ersteller: </text> @@ -59,7 +61,7 @@ <text name="AnyoneLabel"> Jeder: </text> - <check_box label="Kopieren" name="CheckEveryoneCopy"/> + <check_box label="Kopieren" name="CheckEveryoneCopy" tool_tip="Jeder Benutzer kann eine Kopie des Objekts erhalten. Das Objekt sowie alle seine Inhalte müssen kopier- und übertragbar sein."/> <text name="GroupLabel"> Gruppe: </text> @@ -67,17 +69,17 @@ <text name="NextOwnerLabel"> Nächster Eigentümer: </text> - <check_box label="Bearbeiten" name="CheckNextOwnerModify"/> - <check_box label="Kopieren" name="CheckNextOwnerCopy"/> - <check_box label="Ãœbertragen" name="CheckNextOwnerTransfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/> + <check_box label="Bearbeiten" name="CheckNextOwnerModify" tool_tip="Der nächste Eigentümer kann Eigenschaften wie den Artikelnamen oder den Maßstab dieses Objekts bearbeiten."/> + <check_box label="Kopieren" name="CheckNextOwnerCopy" tool_tip="Der nächste Eigentümer kann unbegrenzt viele Kopien dieses Objekts erstellen. Die Kopien enthalten Informationen zum Ersteller und können niemals mehr Berechtigungen enthalten als der kopierte Artikel."/> + <check_box label="Ãœbertragen" name="CheckNextOwnerTransfer" tool_tip="Der nächste Eigentümer kann dieses Objekt weitergeben oder verkaufen."/> </panel> - <check_box label="Zum Verkauf" name="CheckPurchase"/> - <combo_box name="ComboBoxSaleType"> + <check_box label="Zum Verkauf" name="CheckPurchase" tool_tip="Ermöglicht, dass Einwohner dieses Objekt, seine Inhalte oder eine Kopie zum angegebenen Preis inworld erwerben."/> + <combo_box name="ComboBoxSaleType" tool_tip="Wählen Sie aus, ob der Käufer eine Kopie, eine Kopie der Inhalte oder den Artikel selbst erhält."> <combo_box.item label="Kopie" name="Copy"/> <combo_box.item label="Inhalt" name="Contents"/> <combo_box.item label="Original" name="Original"/> </combo_box> - <spinner label="Preis: L$" name="Edit Cost"/> + <spinner label="Preis: L$" name="Edit Cost" tool_tip="Objektkosten."/> </panel> </scroll_container> <panel name="button_panel"> diff --git a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml index c30611c66c09d3f5fcaf39d569a2e8eb3331d56b..3ae76fd9c99c48bc97abc2f56d2c27ca8f9d5e08 100644 --- a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml @@ -1,71 +1,136 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="object properties" title="Objektprofil"> - <panel.string name="text deed continued">Ãœbertragung</panel.string> - <panel.string name="text deed">Ãœbertragung</panel.string> - <panel.string name="text modify info 1">Sie können dieses Objekt bearbeiten.</panel.string> - <panel.string name="text modify info 2">Sie können diese Objekte bearbeiten.</panel.string> - <panel.string name="text modify info 3">Sie können dieses Objekt nicht bearbeiten.</panel.string> - <panel.string name="text modify info 4">Sie können diese Objekte nicht bearbeiten.</panel.string> - <panel.string name="text modify info 5">Dieses Objekt kann nicht über eine Regionsgrenze hinweg geändert werden</panel.string> - <panel.string name="text modify info 6">Diese Objekte können nicht über eine Regionsgrenze hinweg geändert werden</panel.string> - <panel.string name="text modify warning">Diese Objekt verfügt über verknüpfte Teile</panel.string> - <panel.string name="Cost Default">Preis: L$</panel.string> - <panel.string name="Cost Total">Summenpreis: L$</panel.string> - <panel.string name="Cost Per Unit">Stückpreis: L$</panel.string> - <panel.string name="Cost Mixed">Mischpreis</panel.string> - <panel.string name="Sale Mixed">Mischverkauf</panel.string> + <panel.string name="text deed continued"> + Ãœbertragung + </panel.string> + <panel.string name="text deed"> + Ãœbertragung + </panel.string> + <panel.string name="text modify info 1"> + Sie können dieses Objekt bearbeiten. + </panel.string> + <panel.string name="text modify info 2"> + Sie können diese Objekte bearbeiten. + </panel.string> + <panel.string name="text modify info 3"> + Sie können dieses Objekt nicht bearbeiten. + </panel.string> + <panel.string name="text modify info 4"> + Sie können diese Objekte nicht bearbeiten. + </panel.string> + <panel.string name="text modify info 5"> + Dieses Objekt kann nicht über eine Regionsgrenze hinweg geändert werden + </panel.string> + <panel.string name="text modify info 6"> + Diese Objekte können nicht über eine Regionsgrenze hinweg geändert werden + </panel.string> + <panel.string name="text modify warning"> + Diese Objekt verfügt über verknüpfte Teile + </panel.string> + <panel.string name="Cost Default"> + Preis: L$ + </panel.string> + <panel.string name="Cost Total"> + Summenpreis: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Stückpreis: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Mischpreis + </panel.string> + <panel.string name="Sale Mixed"> + Mischverkauf + </panel.string> <text name="title" value="Objektprofil"/> <text name="where" value="(Inworld)"/> <panel label="" name="properties_panel"> - <text name="Name:">Name:</text> - <text name="Description:">Beschreibung:</text> - <text name="CreatorNameLabel">Ersteller:</text> - <text name="Owner:">Eigentümer:</text> - <text name="Group_label">Gruppe:</text> + <text name="Name:"> + Name: + </text> + <line_editor name="Object Name" tool_tip="Der Name ist auf 63 Zeichen begrenzt. Längere formelle Namen werden gekürzt. Die Namen dürfen ausschließlich aus druckbaren Zeichen des (nicht erweiterten) ASCII-7-Zeichensatzes bestehen, mit Ausnahme des Senkrechtstrichs "|"."/> + <text name="Description:"> + Beschreibung: + </text> + <line_editor name="Object Description" tool_tip="Bei Auswahl der Option "Mauszeiger-Tipps zu allen Objekten" in den Viewer-Einstellungen wird für alle Objekte das Popup mit der Objektbeschreibung unter dem Mauszeiger eingeblendet. Die formelle Beschreibung ist auf 127 Byte begrenzt, und alle längeren Zeichenketten werden gekürzt."/> + <text name="CreatorNameLabel"> + Ersteller: + </text> + <text name="Owner:"> + Eigentümer: + </text> + <text name="Group_label"> + Gruppe: + </text> <button name="button set group" tool_tip="Eine Gruppe auswählen, um die Berechtigungen des Objekts zu teilen."/> <name_box initial_value="Wird geladen..." name="Group Name Proxy"/> <button label="Ãœbertragung" label_selected="Ãœbertragung" name="button deed" tool_tip="Eine Ãœbertragung bedeutet, dass das Objekt mit den Berechtigungen „Nächster Eigentümer“ weitergegeben wird. Mit der Gruppe geteilte Objekte können von einem Gruppen-Officer übertragen werden."/> - <text name="label click action">Bei Linksklick:</text> - <combo_box name="clickaction"> + <text name="label click action"> + Bei Linksklick: + </text> + <combo_box name="clickaction" tool_tip="Eine Klickaktion ermöglicht Ihnen die Interaktion mit einem Objekt mithilfe eines einzelnen Linksklicks. Jede Klickaktion verfügt über einen speziellen Cursor, der die Aktion verdeutlicht. Für manche Klickaktionen müssen Anforderungen erfüllt sein, damit die Funktion gewährleistet ist. Für die Funktion Touch and Pay (Berühren und Bezahlen) sind Skripte erforderlich."> <combo_box.item label="Berühren (Standard)" name="Touch/grab(default)"/> <combo_box.item label="Auf Objekt setzen" name="Sitonobject"/> <combo_box.item label="Objekt kaufen" name="Buyobject"/> <combo_box.item label="Objekt bezahlen" name="Payobject"/> <combo_box.item label="Öffnen" name="Open"/> <combo_box.item label="Zoomen" name="Zoom"/> + <combo_box.item label="Keine" name="None"/> </combo_box> <panel name="perms_inv"> - <text name="perm_modify">Sie können dieses Objekt bearbeiten.</text> - <text name="Anyone can:">Jeder:</text> - <check_box label="Kopieren" name="checkbox allow everyone copy"/> - <check_box label="Bewegen" name="checkbox allow everyone move"/> - <text name="GroupLabel">Gruppe:</text> + <text name="perm_modify"> + Sie können dieses Objekt bearbeiten. + </text> + <text name="Anyone can:"> + Jeder: + </text> + <check_box label="Kopieren" name="checkbox allow everyone copy" tool_tip="Jeder Benutzer kann eine Kopie des Objekts erhalten. Das Objekt sowie alle seine Inhalte müssen kopier- und übertragbar sein."/> + <check_box label="Bewegen" name="checkbox allow everyone move" tool_tip="Jeder Benutzer kann das Objekt bewegen."/> + <text name="GroupLabel"> + Gruppe: + </text> <check_box label="Teilen" name="checkbox share with group" tool_tip="Mit allen Mitgliedern der zugeordneten Gruppe, Ihre Berechtigungen dieses Objekt zu ändern, teilen. Sie müssen Ãœbereignen, um Rollenbeschränkungen zu aktivieren."/> - <text name="NextOwnerLabel">Nächster Eigentümer:</text> - <check_box label="Bearbeiten" name="checkbox next owner can modify"/> - <check_box label="Kopieren" name="checkbox next owner can copy"/> + <text name="NextOwnerLabel"> + Nächster Eigentümer: + </text> + <check_box label="Bearbeiten" name="checkbox next owner can modify" tool_tip="Der nächste Eigentümer kann Eigenschaften wie den Artikelnamen oder den Maßstab dieses Objekts bearbeiten."/> + <check_box label="Kopieren" name="checkbox next owner can copy" tool_tip="Der nächste Eigentümer kann unbegrenzt viele Kopien dieses Objekts erstellen. Die Kopien enthalten Informationen zum Ersteller und können niemals mehr Berechtigungen enthalten als der kopierte Artikel."/> <check_box label="Transferieren" name="checkbox next owner can transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/> </panel> - <check_box label="Zum Verkauf" name="checkbox for sale"/> - <combo_box name="sale type"> + <check_box label="Zum Verkauf" name="checkbox for sale" tool_tip="Ermöglicht, dass Einwohner dieses Objekt, seine Inhalte oder eine Kopie zum angegebenen Preis inworld erwerben."/> + <combo_box name="sale type" tool_tip="Wählen Sie aus, ob der Käufer eine Kopie, eine Kopie der Inhalte oder den Artikel selbst erhält."> <combo_box.item label="Kopieren" name="Copy"/> <combo_box.item label="Inhalt" name="Contents"/> <combo_box.item label="Original" name="Original"/> </combo_box> - <spinner label="Preis: L$" name="Edit Cost"/> + <spinner label="Preis: L$" name="Edit Cost" tool_tip="Objektkosten."/> <check_box label="In Suche anzeigen" name="search_check" tool_tip="Dieses Objekt in Suchergebnissen anzeigen"/> - <text name="pathfinding_attributes_label">Pathfinding-Attribute:</text> - <text name="B:">B:</text> - <text name="O:">O:</text> - <text name="G:">G:</text> - <text name="E:">E:</text> - <text name="N:">N:</text> - <text name="F:">F:</text> + <text name="pathfinding_attributes_label"> + Pathfinding-Attribute: + </text> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> </panel> <panel name="button_panel"> - <button label="Öffnen" name="open_btn"/> - <button label="Bezahlen" name="pay_btn"/> - <button label="Kaufen" name="buy_btn"/> - <button label="Details" name="details_btn"/> + <button label="Öffnen" name="open_btn" tool_tip="Öffnen, um die Objektinhalte zu sehen."/> + <button label="Bezahlen" name="pay_btn" tool_tip="Öffnen Sie das Zahlungsfenster. Das Objekt muss über ein Zahlungs-Skript verfügen, um diese Funktion nutzen zu können."/> + <button label="Kaufen" name="buy_btn" tool_tip="Kauf-Fenster öffnen. Das Objekt muss als zu verkaufen gekennzeichnet sein."/> + <button label="Details" name="details_btn" tool_tip="Öffnen Sie das Fenster "Objekt prüfen"."/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index cde04d8d692f64fd4852777f5ea64aab044932b7..95eb88614b123387d43221397e06b0a6a661a7e9 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -648,7 +648,7 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. Versionshinweise </string> <string name="RELEASE_NOTES_BASE_URL"> - http://wiki.secondlife.com/wiki/Release_Notes/ + https://releasenotes.secondlife.com/viewer/ </string> <string name="LoadingData"> Wird geladen... @@ -2228,6 +2228,18 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich unter http://suppo <string name="RegionInfoListTypeBannedAgents"> Immer verbannt </string> + <string name="RegionInfoAllEstates"> + alle Grundbesitze + </string> + <string name="RegionInfoManagedEstates"> + verwaltete Grundbesitze + </string> + <string name="RegionInfoThisEstate"> + dieser Grundbesitz + </string> + <string name="AndNMore"> + und [EXTRA_COUNT] weitere + </string> <string name="ScriptLimitsParcelScriptMemory"> Parzellenskript-Speicher </string> @@ -2271,7 +2283,7 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich unter http://suppo Brust </string> <string name="ATTACH_HEAD"> - Kopf + Schädel </string> <string name="ATTACH_LSHOULDER"> Linke Schulter @@ -2292,7 +2304,7 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich unter http://suppo Rechter Fuß </string> <string name="ATTACH_BACK"> - Hinten + Wirbelsäule </string> <string name="ATTACH_PELVIS"> Becken @@ -5740,4 +5752,25 @@ Setzen Sie den Editorpfad in Anführungszeichen <string name="Mav_Details_MAV_UNKNOWN_VERSION"> Die Physikform hat keine korrekte Version. Legen Sie die korrekte Version für das Physikmodell fest. </string> + <string name="couldnt_resolve_host"> + Der DNS konnte den Hostnamen ([HOSTNAME]) nicht auflösen Prüfen +Sie bitte, ob Sie die Website www.secondlife.com aufrufen können. Wenn Sie die +Website aufrufen können, jedoch weiterhin diese Fehlermeldung erhalten, +besuchen Sie bitte den Support-Bereich und melden Sie das Problem. + </string> + <string name="ssl_peer_certificate"> + Der Anmeldeserver konnte sich nicht per SSL verifizieren. +Wenn Sie diese Fehlermeldung weiterhin erhalten, besuchen +Sie bitte den Support-Bereich der Website Secondlife.com +und melden Sie das Problem. + </string> + <string name="ssl_connect_error"> + Die Ursache hierfür ist häufig eine falsch eingestellte Uhrzeit auf Ihrem Computer. +Bitte vergewissern Sie sich, dass Datum und Uhrzeit in der Systemsteuerung korrekt +eingestellt sind. Ãœberprüfen Sie außerdem, ob Ihre Netzwerk- und Firewall-Einstellungen +korrekt sind. Wenn Sie diese Fehlermeldung weiterhin erhalten, besuchen Sie bitte den +Support-Bereich der Website Secondlife.com und melden Sie das Problem. + +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Knowledge-Base] + </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 535af317d991f072f4f72567655aa0fa09c2fd54..9f853fd960032489b51aa10169fd5cff2818da9b 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -21,6 +21,14 @@ name="maturity_icon_adult"> "Parcel_R_Dark" </floater.string> + <floater.string + name="Hours"> + [HOURS] hrs. + </floater.string> + <floater.string + name="Hour"> + hr. + </floater.string> <floater.string name="Minutes"> [MINUTES] min. @@ -37,6 +45,10 @@ name="Remaining"> remaining </floater.string> + <floater.string + name="Always"> + Always + </floater.string> <tab_container follows="all" halign="left" @@ -151,6 +163,7 @@ layout="topleft" left_pad="2" name="Description" + spellcheck="true" top_delta="0" width="365" word_wrap="true" /> @@ -1256,6 +1269,7 @@ Only large parcels can be listed in search. layout="topleft" left_pad="2" name="edit objects check" + tool_tip="If checked, Residents can create and rez objects on your land." width="130" /> <check_box height="16" @@ -1263,6 +1277,7 @@ Only large parcels can be listed in search. layout="topleft" left_pad="2" name="edit group objects check" + tool_tip="If checked, parcel group members can create and rez objects on your land." width="70" /> <text type="string" @@ -1281,6 +1296,7 @@ Only large parcels can be listed in search. layout="topleft" left_pad="2" name="all object entry check" + tool_tip="If checked, Residents can move existing objects from other parcels onto this parcel." top_delta="0" width="130" /> <check_box @@ -1289,6 +1305,7 @@ Only large parcels can be listed in search. layout="topleft" left_pad="2" name="group object entry check" + tool_tip="If checked, parcel group members can move existing objects from other parcels onto this parcel." top_delta="0" width="70" /> <text @@ -1308,6 +1325,7 @@ Only large parcels can be listed in search. layout="topleft" left_pad="2" name="check other scripts" + tool_tip="If checked, Residents can run scripts on your parcel, including attachments." top_delta="0" width="130" /> <check_box @@ -1316,6 +1334,7 @@ Only large parcels can be listed in search. layout="topleft" left_pad="2" name="check group scripts" + tool_tip="If checked, parcel group members can run scripts on your parcel, including attachments." top_delta="0" width="70" /> <panel @@ -1454,11 +1473,12 @@ Only large parcels can be listed in search. length="1" follows="left|top" text_color="LtGray" + text_readonly_color="LabelDisabledColor" height="32" layout="topleft" left="274" top="150" - name="allow_label5" + name="allow_see_label" width="205" word_wrap="true"> Avatars on other parcels can see and chat with avatars on this parcel @@ -1896,6 +1916,7 @@ Only large parcels can be listed in search. layout="topleft" left="8" name="public_access" + tool_tip="" label="Anyone can visit (Unchecking this will create ban lines)" top_pad="10" width="278" /> @@ -2063,19 +2084,29 @@ Only large parcels can be listed in search. name="BanCheck" top="0" width="200"> - Always banned ([COUNT], max [MAX]) + Banned ([COUNT], max [MAX]) </text> <name_list column_padding="0" follows="top|bottom" - heading_height="14" + heading_height="16" height="125" layout="topleft" left="0" multi_select="true" + draw_heading="true" name="BannedList" tool_tip="([LISTED] listed, [MAX] max)" - width="230" /> + width="230"> + <columns + label="Name" + name="name" + width="155" /> + <columns + label="Duration" + name="duration" + width="75" /> + </name_list> <button follows="bottom" height="23" diff --git a/indra/newview/skins/default/xui/en/floater_ban_duration.xml b/indra/newview/skins/default/xui/en/floater_ban_duration.xml new file mode 100644 index 0000000000000000000000000000000000000000..6c537cc08d140b23dc111175c6f862a73aae9431 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_ban_duration.xml @@ -0,0 +1,100 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + can_minimize="false" + can_tear_off="false" + can_resize="false" + can_drag_on_left="false" + can_close="true" + height="150" + layout="topleft" + name="ban_duration" + title="Ban duration" + single_instance="true" + width="180"> + <text + type="string" + length="1" + follows="left|top" + height="15" + layout="topleft" + left="15" + name="duration_textbox" + top="10" + width="75"> + Ban duration: + </text> + + <radio_group + draw_border="false" + enabled="true" + follows="left|top" + height="47" + left="20" + mouse_opaque="true" + name="ban_duration_radio" + tab_stop="true" + width="150"> + <radio_item + type="string" + follows="left|top" + height="20" + width="200" + label="Always" + name="always_radio"> + Always + </radio_item> + <radio_item + type="string" + follows="left|top" + height="20" + width="200" + label="Temporary" + name="temporary_radio"> + Temporary + </radio_item> + </radio_group> + + <spinner + allow_digits_only="true" + decimal_digits="0" + follows="left|top" + height="20" + increment="1" + max_val="8766" + min_val="1" + initial_val="1" + name="ban_hours" + top_delta="50" + left="40" + width="60"/> + <text + type="string" + length="1" + follows="left|top" + height="15" + left_delta="70" + name="hours_textbox" + top_delta="5" + width="70"> + hours. + </text> + + <button + follows="left|top" + height="23" + label="Ok" + left="15" + name="ok_btn" + top_delta="30" + width="75"> + </button> + <button + follows="left|top" + height="23" + label="Cancel" + left_pad="0" + name="cancel_btn" + top_delta="0" + width="75"> + </button> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml index e7ab3cacdc4439086e723e68c0e079c540de60e0..9fa93b640fe9ef0db451c9a6b190d50af8113ebe 100644 --- a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml @@ -213,6 +213,7 @@ layout="topleft" top_pad="0" name="share_with_group" + tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions." width="92" /> <text type="string" @@ -234,6 +235,7 @@ layout="topleft" top_pad="0" name="everyone_copy" + tool_tip="Anyone can take a copy of the object. Object and all of its contents must be copy and transfer permissive" width="92" /> <text type="string" @@ -254,6 +256,7 @@ label="Modify" layout="topleft" name="next_owner_modify" + tool_tip="Next owner can edit properties like item name or scale of this object." top_pad="0" width="92" /> <check_box @@ -263,6 +266,7 @@ layout="topleft" top_pad="0" name="next_owner_copy" + tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied." width="92"> <check_box.commit_callback function="BulkPermission.CommitCopy"/> @@ -276,7 +280,7 @@ label="Transfer" layout="topleft" name="next_owner_transfer" - tool_tip="Next owner can give away or resell this object" + tool_tip="Next owner can give away or resell this object." width="92" /> <scroll_list enabled="false" diff --git a/indra/newview/skins/default/xui/en/floater_experienceprofile.xml b/indra/newview/skins/default/xui/en/floater_experienceprofile.xml index 2dfba1ac448e8f71123e97f54715d565a2860946..f275fec066e6968bd33f70a7517701e625a9c0b4 100644 --- a/indra/newview/skins/default/xui/en/floater_experienceprofile.xml +++ b/indra/newview/skins/default/xui/en/floater_experienceprofile.xml @@ -493,6 +493,7 @@ layout="topleft" left="11" name="edit_experience_description" + spellcheck="true" max_length="2048" text_color="black" right="-11" diff --git a/indra/newview/skins/default/xui/en/floater_facebook.xml b/indra/newview/skins/default/xui/en/floater_facebook.xml deleted file mode 100644 index b34d70516af376f85194e33f6e92e75e67f72df9..0000000000000000000000000000000000000000 --- a/indra/newview/skins/default/xui/en/floater_facebook.xml +++ /dev/null @@ -1,95 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> -<floater - positioning="cascading" - can_close="true" - help_topic="floater_facebook" - layout="topleft" - name="floater_facebook" - save_rect="true" - single_instance="true" - reuse_instance="true" - title="POST TO FACEBOOK" - min_height="462" - min_width="304" - height="462" - width="272"> - <tab_container - name="tabs" - tab_group="1" - tab_min_width="64" - tab_height="21" - tab_position="top" - top="7" - height="437" - follows="all" - halign="center"> - <panel - filename="panel_facebook_status.xml" - class="llfacebookstatuspanel" - follows="all" - label="STATUS" - name="panel_facebook_status"/> - <panel - filename="panel_facebook_photo.xml" - class="llfacebookphotopanel" - follows="all" - label="PHOTO" - name="panel_facebook_photo"/> - <panel - filename="panel_facebook_place.xml" - class="llfacebookcheckinpanel" - follows="all" - label="CHECK IN" - name="panel_facebook_place"/> - <panel - filename="panel_facebook_friends.xml" - class="llfacebookfriendspanel" - follows="all" - label="FRIENDS" - name="panel_facebook_friends"/> - <!--<panel - filename="panel_facebook_account.xml" - class="llfacebookaccountpanel" - follows="all" - label="ACCOUNT" - name="panel_facebook_account"/>--> - </tab_container> - <text - name="connection_error_text" - type="string" - follows="left|bottom|right" - bottom="-5" - left="10" - width="250" - height="20" - wrap="true" - halign="left" - valign="center" - text_color="DrYellow" - font="SansSerif"> - Error - </text> - <loading_indicator - follows="left|bottom" - height="24" - width="24" - name="connection_loading_indicator" - top_delta="-2" - left="10" - visible="true"/> - <text - name="connection_loading_text" - type="string" - follows="left|bottom|right" - top_delta="2" - left_pad="5" - width="250" - height="20" - wrap="true" - halign="left" - valign="center" - text_color="EmphasisColor" - font="SansSerif"> - Loading... - </text> -</floater> diff --git a/indra/newview/skins/default/xui/en/floater_fast_timers.xml b/indra/newview/skins/default/xui/en/floater_fast_timers.xml index fa7147d9cae52884a43cba37550959d98ccee93d..645003cc14e07613b6490e2d1f0a7cf7e37453ad 100644 --- a/indra/newview/skins/default/xui/en/floater_fast_timers.xml +++ b/indra/newview/skins/default/xui/en/floater_fast_timers.xml @@ -60,10 +60,21 @@ min_width="100"> <panel top="0" left="0" - width="220" + width="204" height="440" name="legend" follows="all"/> + <scroll_bar + top ="0" + right="-1" + height="440" + width="15" + follows="top|right|bottom" + name="scroll_vert" + orientation="vertical" + step_size="16" + doc_size="3000" + /> </layout_panel> <layout_panel name="timers_panel" auto_resize="true" diff --git a/indra/newview/skins/default/xui/en/floater_gesture.xml b/indra/newview/skins/default/xui/en/floater_gesture.xml index 200e9b9537c2228ad07e799201ce8c3b84b999d4..9f051d9f8d8de9daea1e4a6044543bc9392df032 100644 --- a/indra/newview/skins/default/xui/en/floater_gesture.xml +++ b/indra/newview/skins/default/xui/en/floater_gesture.xml @@ -119,6 +119,7 @@ follows="left|bottom" height="23" label="Edit" + tool_tip="Open window for editing selected gesture." layout="topleft" left="6" name="edit_btn" @@ -128,6 +129,7 @@ follows="left|bottom" height="23" label="Play" + tool_tip="Execute selected gesture in-world." layout="topleft" left_pad="6" name="play_btn" diff --git a/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml index 1b4992b4ca50d44baf53a8ce2741e38567df73fb..ca1d299553b81813f363901bc20b8f46697499eb 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml @@ -2,7 +2,7 @@ <floater legacy_header_height="18" can_minimize="false" - height="468" + height="448" layout="topleft" name="Inventory Finder" help_topic="inventory_finder" @@ -110,23 +110,6 @@ name="check_notecard" top_delta="0" width="126" /> - <icon - height="16" - image_name="Inv_Mesh" - layout="topleft" - left="8" - mouse_opaque="true" - name="icon_mesh" - top="142" - width="16" /> - <check_box - height="16" - label="Meshes" - layout="topleft" - left_pad="2" - name="check_mesh" - top_delta="0" - width="126" /> <icon height="16" image_name="Inv_Object" @@ -134,7 +117,7 @@ left="8" mouse_opaque="true" name="icon_object" - top="162" + top="142" width="16" /> <check_box height="16" @@ -151,7 +134,7 @@ left="8" mouse_opaque="true" name="icon_script" - top="182" + top="162" width="16" /> <check_box height="16" @@ -168,7 +151,7 @@ left="8" mouse_opaque="true" name="icon_sound" - top="202" + top="182" width="16" /> <check_box height="16" @@ -185,7 +168,7 @@ left="8" mouse_opaque="true" name="icon_texture" - top="222" + top="202" width="16" /> <check_box height="16" @@ -202,7 +185,7 @@ left="8" mouse_opaque="true" name="icon_snapshot" - top="242" + top="222" width="16" /> <check_box height="16" @@ -220,7 +203,7 @@ layout="topleft" left="8" name="All" - top="262" + top="242" width="100" /> <button height="20" @@ -274,7 +257,7 @@ width="260"/> <check_box height="16" - top="352" + top="332" label="Since Logoff" layout="topleft" left_delta="0" @@ -290,7 +273,7 @@ layout="topleft" left_delta="0" name="- OR -" - top="370" + top="350" width="144"> - OR - </text> @@ -298,7 +281,7 @@ height="16" layout="topleft" name="date_search_direction" - top="388" + top="368" left="8" width="270"> <radio_item @@ -368,6 +351,6 @@ layout="topleft" name="Close" right="-6" - top="434" + top="414" width="76" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index 3db431de1b4855ff316210cec8ef79596feb462e..5a86eb06fbf018858912c5cda924c3ed24ab8978 100644 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -73,35 +73,6 @@ prevalidate_callback="ascii" top_pad="5" width="290" /> - <text - follows="left|top" - height="15" - layout="topleft" - left_pad="15" - name="model_category_label" - text_color="White" - top="0" - width="200"> - This model represents... - </text> - <combo_box - follows="left|top" - height="23" - left_pad="10" - name="model_category_combo" - top_pad="10" - width="200"> - <combo_box.drop_down_button - label_color="White"/> - <combo_item name="Choose one" label="Choose One..." value="MUT_Unspecified"/> - <combo_item name="Avatar shape" label="Avatar shape" value="MUT_AvatarShape"/> - <combo_item name="Avatar attachment" label="Avatar attachment" value="MUT_AvatarAttachment"/> - <combo_item name="Moving object (vehicle, animal)" label="Moving object (vehicle, animal)" value="MUT_MovingObject"/> - <combo_item name="Building Component" label="Building Component" value="MUT_BuildingComponent"/> - <combo_item name="Large, non moving etc" label="Large, non moving etc" value="MUT_LargeStationary"/> - <combo_item name="Smaller, non-moving etc" label="Smaller, non-moving etc" value="MUT_SmallStationary"/> - <combo_item name="Not really any of these" label="Not really any of these" value="MUT_Other"/> - </combo_box> </panel> <tab_container follows="top|left" diff --git a/indra/newview/skins/default/xui/en/floater_my_scripts.xml b/indra/newview/skins/default/xui/en/floater_my_scripts.xml new file mode 100644 index 0000000000000000000000000000000000000000..3b0b6723c7e941187001c51aeea968f138e0d8af --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_my_scripts.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + can_resize="true" + height="570" + help_topic="scriptlimits" + layout="topleft" + name="myscripts" + save_rect="true" + title="My Scripts" + min_width="620" + width="620"> + <panel + filename="panel_script_limits_my_avatar.xml" + follows="all" + bottom="555" + layout="topleft" + left="3" + right="-2" + name="script_limits_my_avatar_panel" + top="20"/> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index 845c1efe4d2fb2b9a599872a27857ce4ebaef1e6..0e62d50072eb1940726e1c00a3fa296340d97419 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -3,7 +3,7 @@ legacy_header_height="18" positioning="centered" default_tab_group="1" - height="512" + height="530" layout="topleft" name="Preferences" help_topic="preferences" @@ -25,7 +25,7 @@ https://accounts.secondlife.com/change_email/ layout="topleft" right="-105" name="OK" - top="473" + top="492" width="90"> <button.commit_callback function="Pref.OK" /> @@ -43,6 +43,42 @@ https://accounts.secondlife.com/change_email/ <button.commit_callback function="Pref.Cancel" /> </button> + + <panel + name="search_panel" + layout="topleft" + follows="left|top|right" + left="4" + right="-4" + top="21" + height="18" + tab_group="2"> + <search_editor + clear_button_visible="true" + follows="left|top|right" + height="18" + label="Search Settings" + layout="topleft" + left="0" + max_length_bytes="255" + name="search_prefs_edit" + right="-1" + text_pad_left="6" + tool_tip="Type the search term you are interested in here. Results will be displayed for partial fulltext matches within the setting's name or comment." + top="0"> + <search_editor.commit_callback + function="UpdateFilter" /> + <search_editor.clear_button + rect.height="18" + rect.width="18" + rect.bottom="-1" /> + <search_editor.search_button + rect.height="12" + rect.width="12" + rect.bottom="-1" /> + </search_editor> + </panel> + <tab_container follows="all" halign="left" @@ -54,7 +90,7 @@ https://accounts.secondlife.com/change_email/ tab_position="left" tab_width="140" tab_padding_right="0" - top="21" + top="40" width="658"> <panel class="panel_preference" diff --git a/indra/newview/skins/default/xui/en/floater_preferences_proxy.xml b/indra/newview/skins/default/xui/en/floater_preferences_proxy.xml index 93bfe53aae9193531c539f04310cbfd2b74018db..659033efd4192a40128586e6c3571dcb072cc801 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences_proxy.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences_proxy.xml @@ -58,12 +58,12 @@ label_width="95" layout="topleft" left_delta="210" - max_val="12000" + max_val="65535" min_val="10" name="web_proxy_port" top_delta="0" tool_tip="The port of the HTTP proxy you would like to use." - width="145" /> + width="150" /> <check_box control_name="Socks5ProxyEnabled" height="16" @@ -111,11 +111,11 @@ label_width="95" layout="topleft" left_delta="210" - max_val="12000" + max_val="65535" min_val="10" name="socks_proxy_port" top_delta="0" - width="145" + width="150" tool_tip="The port of the SOCKS 5 proxy you would like to use." commit_callback.function="Proxy.Change" /> <text diff --git a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml index 2e1c8ce6707354e69c065b7f5b4a779aadc76ea3..dcbdfa8794dc52ae23eff12b7d99f457b0fb6ebc 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml @@ -6,7 +6,7 @@ height="361" layout="topleft" min_height="243" - min_width="234" + min_width="330" name="preview notecard" help_topic="preview_notecard" title="NOTECARD:" @@ -77,6 +77,16 @@ word_wrap="true"> Loading... </text_editor> + <button + follows="left|bottom" + height="22" + label="Edit..." + label_selected="Edit" + layout="topleft" + left="4" + name="Edit" + top="332" + width="100" /> <button follows="right|bottom" height="22" diff --git a/indra/newview/skins/default/xui/en/floater_report_abuse.xml b/indra/newview/skins/default/xui/en/floater_report_abuse.xml index 8fa5b49573527a5eb922fe4ecb574f8fda3feb45..d07e3cb31b20a5f03571220e85c5418dfb8b4bc5 100644 --- a/indra/newview/skins/default/xui/en/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/en/floater_report_abuse.xml @@ -246,7 +246,7 @@ name="Land__Encroachment__Objects_textures" value="63" /> <combo_box.item - label="Gaming Policy Violation" + label="Skill Gaming Policy Violation" name="Wagering_gambling" value="67" /> </combo_box> diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index e50747cb5fea035bc6f13fabb9aa48ad23674e75..832c2ee7da62bfcb0c439653c4bc87d69a3987b4 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -23,10 +23,6 @@ name="postcard_progress_str"> Sending Email </string> - <string - name="facebook_progress_str"> - Posting to Facebook - </string> <string name="profile_progress_str"> Posting @@ -39,10 +35,6 @@ name="local_progress_str"> Saving to Computer </string> - <string - name="facebook_succeeded_str"> - Image uploaded - </string> <string name="profile_succeeded_str"> Image uploaded @@ -60,10 +52,6 @@ Saved to Computer! </string> <string - name="facebook_failed_str"> - Failed to upload image to your Facebook timeline. - </string> - <string name="profile_failed_str"> Failed to upload image to your Profile Feed. </string> diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml index 53618b684bb6e2ac4b84be6bc67207206ca06ecf..d122d7491cfaa83e4d725743afff349054c78623 100644 --- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml @@ -52,7 +52,7 @@ control_name="mode_selection" height="20" layout="topleft" - left="18" + left="0" top_pad="80" name="mode_selection" follows="left|top"> @@ -64,7 +64,7 @@ height="16" left="0" value="0" - width="80" /> + width="70" /> <radio_item label="Local" left_pad="0" @@ -73,7 +73,16 @@ height="16" name="local" value="1" - width="75" /> + width="50" /> + <radio_item + label="Bake" + left_pad="0" + layout="topleft" + top_delta="0" + height="16" + name="bake" + value="2" + width="50" /> </radio_group> <!-- --> @@ -83,7 +92,7 @@ follows="left|top" height="14" layout="topleft" - left_delta="-12" + left_delta="12" name="unknown" top_pad="4"> Size: [DIMENSIONS] @@ -225,7 +234,80 @@ <column name="unit_name" label="Name" dynamicwidth="true" /> <column name="unit_id_HIDDEN" label="ID" width="0" /> </scroll_list> - + +<!-- middle: bake mode --> + <combo_box + left="180" + top="30" + height="19" + top_delta="15" + layout="topleft" + follows="left|top" + name="l_bake_use_texture_combo_box" + tool_tip="Choose the bake texture" + width="118" + visible="false"> + <combo_box.item + label="None" + name="None" + value="-1" /> + <combo_box.item + label="BAKED_HEAD" + name="BAKED_HEAD" + value="0" /> + <combo_box.item + label="BAKED_UPPER" + name="BAKED_UPPER" + value="1" /> + <combo_box.item + label="BAKED_LOWER" + name="BAKED_LOWER" + value="2" /> + <combo_box.item + label="BAKED_EYES" + name="BAKED_EYES" + value="3" /> + <combo_box.item + label="BAKED_SKIRT" + name="BAKED_SKIRT" + value="4" /> + <combo_box.item + label="BAKED_HAIR" + name="BAKED_HAIR" + value="5" /> + <combo_box.item + label="BAKED_LEFTARM" + name="BAKED_LEFTARM" + value="6" /> + <combo_box.item + label="BAKED_LEFTLEG" + name="BAKED_LEFTLEG" + value="7" /> + <combo_box.item + label="BAKED_AUX1" + name="BAKED_AUX1" + value="8" /> + <combo_box.item + label="BAKED_AUX2" + name="BAKED_AUX2" + value="9" /> + <combo_box.item + label="BAKED_AUX3" + name="BAKED_AUX3" + value="10" /> + </combo_box> + <check_box + follows="left|top" + height="20" + initial_value="false" + label="Hide Base Mesh Region" + layout="topleft" + name="hide_base_mesh_region" + left_delta="0" + top_pad="10" + top_delta="0" + width="120" + visible="false"/> <!-- bottom static --> <button follows="bottom" diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index 3032ad50b3d3b5411895dac243c8fee0b328ad18..425af16261721c19fd448aef6fdd6908582dff58 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -915,7 +915,8 @@ name="Object Name" select_on_focus="true" top_delta="0" - width="170" /> + width="170" + tool_tip="The name is limited to 63 characters. Longer prim names are cut short. Names can only consist of printable characters found in the ASCII-7 (non-extended) character set, with the exception of the vertical bar/pipe '|'." /> <text follows="left|top" height="10" @@ -933,7 +934,8 @@ name="Object Description" select_on_focus="true" top_delta="0" - width="170" /> + width="170" + tool_tip="When people have 'Hover Tips on All Objects' selected in the viewer's settings, they'll see the object description pop-up for any object under their mouse pointer. The prim description is limited to 127 bytes any string longer then that will be truncated." /> <text type="string" left="10" @@ -1090,7 +1092,8 @@ layout="topleft" name="clickaction" width="130" - left_pad="10"> + left_pad="10" + tool_tip="A click action enables you to interact with an object with a single left click. Each click action has a special cursor indicating what it does. Some click actions have requirements to function. For example Touch and Pay require scripts" > <combo_box.item label="Touch (default)" name="Touch/grab(default)" @@ -1126,7 +1129,8 @@ layout="topleft" name="checkbox for sale" left="7" - width="97" /> + width="97" + tool_tip="Lets people buy this object, its content or it copy inworld for specified price." /> <!-- NEW PRICE SPINNER Objects are allowed to be for sale for L$0 to invoke buy UI behavior even though the user gets a free copy. @@ -1144,7 +1148,8 @@ even though the user gets a free copy. width="85" min_val="0" height="20" - max_val="999999999" /> + max_val="999999999" + tool_tip="Object cost." /> <!-- NEW SALE TYPE COMBO BOX --> <combo_box left_pad="8" @@ -1157,7 +1162,8 @@ even though the user gets a free copy. max_chars="20" mouse_opaque="true" name="sale type" - width="89"> + width="89" + tool_tip="Select whether purchaser will receive a copy, copy of the content or item itself." > <combo_box.item name="Copy" label="Copy" @@ -1219,6 +1225,7 @@ even though the user gets a free copy. label="Move" layout="topleft" name="checkbox allow everyone move" + tool_tip="Anyone can move the object." left="10" width="85" /> <check_box @@ -1227,6 +1234,7 @@ even though the user gets a free copy. layout="topleft" left_pad="0" name="checkbox allow everyone copy" + tool_tip="Anyone can take a copy of the object. Object and all of its contents must be copy and transfer permissive." width="90" /> <text type="string" @@ -1244,6 +1252,7 @@ even though the user gets a free copy. left="10" height="10" name="checkbox next owner can modify" + tool_tip="Next owner can edit properties like item name or scale of this object." width="85" /> <check_box follows="left|top|right" @@ -1252,6 +1261,7 @@ even though the user gets a free copy. layout="topleft" left_pad="0" name="checkbox next owner can copy" + tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied." width="80" /> <check_box follows="left|top|right" @@ -1261,7 +1271,7 @@ even though the user gets a free copy. name="checkbox next owner can transfer" left_pad="0" top_delta="0" - tool_tip="Next owner can give away or resell this object" + tool_tip="Next owner can give away or resell this object." width="100" /> <!-- *NOTE: These "B/O/G/E/N/F fields may overlap "perm_modify" above, but that's OK, this is used only for debugging. --> diff --git a/indra/newview/skins/default/xui/en/floater_top_objects.xml b/indra/newview/skins/default/xui/en/floater_top_objects.xml index 36ceddd30501d4fa56d3b6fdc2b7d6e112eb6efc..b82fe43e74dd0270154551011399b6f67236e081 100644 --- a/indra/newview/skins/default/xui/en/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/en/floater_top_objects.xml @@ -2,7 +2,7 @@ <floater legacy_header_height="18" can_resize="true" - height="372" + height="350" layout="topleft" min_height="300" min_width="450" @@ -16,7 +16,7 @@ </floater.string> <floater.string name="top_scripts_text"> - [COUNT] scripts taking a total of [TIME] ms + [COUNT] scripts taking a total of [TIME] ms and using [MEMORY] KB </floater.string> <floater.string name="scripts_score_label"> @@ -273,28 +273,4 @@ <button.commit_callback function="TopObjects.ReturnAll" /> </button> - <button - follows="bottom|left" - height="23" - label="Disable Selected" - layout="topleft" - - left="112" - name="disable_selected_btn" - width="130"> - <button.commit_callback - function="TopObjects.DisableSelected" /> - </button> - <button - follows="bottom|left" - height="23" - label="Disable All" - layout="topleft" - left_pad="10" - name="disable_all_btn" - top_delta="0" - width="130"> - <button.commit_callback - function="TopObjects.DisableAll" /> - </button> </floater> diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml index 82027d9e7c154f400cbda2f48f2e073c3d0e30d0..2d5263b78f7067538af627ce1110af0192e63686 100644 --- a/indra/newview/skins/default/xui/en/fonts.xml +++ b/indra/newview/skins/default/xui/en/fonts.xml @@ -9,6 +9,9 @@ <file>gulim.ttc</file> <file>simhei.ttf</file> <file>ArialUni.ttf</file> + <file>msyh.ttc</file> + <file load_collection="true">Cambria.ttc</file> + <file>malgun.ttf</file> </os> <os name="Mac"> <file>ヒラギノ角ゴシック W3.ttc</file> @@ -19,6 +22,8 @@ <file>AppleGothic.ttf</file> <file>AppleSDGothicNeo-Regular.otf</file> <file>åŽæ–‡ç»†é»‘.ttf</file> + <file>PingFang.ttc</file> + <file>STIXGeneral.otf</file> </os> </font> diff --git a/indra/newview/skins/default/xui/en/language_settings.xml b/indra/newview/skins/default/xui/en/language_settings.xml index 51779e4bfd2658f2c149537b31519cb378c134c2..d418fc38e3ace08ffb601f44d6ed96c94caafc3a 100644 --- a/indra/newview/skins/default/xui/en/language_settings.xml +++ b/indra/newview/skins/default/xui/en/language_settings.xml @@ -42,6 +42,7 @@ <string name="TimeWeek">wkday,datetime,slt</string> <string name="TimeAMPM">ampm,datetime,slt</string> <string name="TimeHour12">hour12,datetime,slt</string> + <string name="TimeTimezone">timezone,datetime,slt</string> <string name="LTimeMthNum">mthnum,datetime,local</string> <string name="LTimeWeek">wkday,datetime,local</string> diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index 3ea9e77a039178d54a5c04a72100d0b47ff7dd27..3bdbbb04d78e5646bbc979c32f8f479d4157b003 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -267,6 +267,14 @@ function="Inventory.DoCreate" parameter="tattoo" /> </menu_item_call> + <menu_item_call + label="New Universal" + layout="topleft" + name="New Universal"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="universal" /> + </menu_item_call> <menu_item_call label="New Physics" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_inventory_add.xml b/indra/newview/skins/default/xui/en/menu_inventory_add.xml index afeb1bf2261a889f23f7d07c1b11ff568730a573..29724b0270e5446e1f6a789c160a2ad152fa9c23 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory_add.xml @@ -194,6 +194,14 @@ function="Inventory.DoCreate" parameter="tattoo" /> </menu_item_call> + <menu_item_call + label="New Universal" + layout="topleft" + name="New Universal"> + <menu_item_call.on_click + function="Inventory.DoCreate" + parameter="universal" /> + </menu_item_call> <menu_item_call label="New Physics" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml index 7faa4f3d71f1b9aff2af82e18aa77a7bb33070a2..61cb74f2304c9de6a139ae8191e5973463e25307 100644 --- a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml @@ -175,6 +175,14 @@ function="Gear.Create" parameter="tattoo" /> </menu_item_call> + <menu_item_call + label="New Universal" + layout="topleft" + name="New Universal"> + <menu_item_call.on_click + function="Gear.Create" + parameter="universal" /> + </menu_item_call> </menu> <menu height="85" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 42744b561ffa95b8de1539bbd1d571761ea5c72d..7bb7b5d62cf2f0b2aa13be6aac1934435420cb65 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -73,6 +73,13 @@ function="Floater.ToggleOrBringToFront" parameter="experiences"/> </menu_item_call> + <menu_item_call + label="My Scripts..." + name="MyScripts"> + <menu_item_call.on_click + function="Floater.ToggleOrBringToFront" + parameter="my_scripts"/> + </menu_item_call> <menu_item_separator/> <menu_item_call label="Camera Controls..." @@ -299,13 +306,6 @@ parameter="conversation" /> </menu_item_check> <menu_item_separator/> - <menu_item_call - label="Facebook..." - name="Facebook"> - <menu_item_call.on_click - function="Floater.Toggle" - parameter="facebook"/> - </menu_item_call> <menu_item_call label="Twitter..." name="Twitter"> @@ -1044,8 +1044,7 @@ shortcut="control|D"> <menu_item_call.on_click function="Object.Duplicate" /> - <menu_item_call.on_enable - function="Object.EnableDuplicate" /> + </menu_item_call> </menu> <menu @@ -1500,8 +1499,7 @@ </menu_item_call> <menu_item_call label="Set UI Size to Default" - name="Set UI Size to Default" - shortcut="control|alt|shift|R"> + name="Set UI Size to Default" shortcut="control|alt|shift|R"> <menu_item_call.on_click function="View.DefaultUISize" /> </menu_item_call> @@ -4005,6 +4003,16 @@ function="Edit.EnableTakeOff" parameter="tattoo" /> </menu_item_call> + <menu_item_call + label="Universal" + name="Universal"> + <menu_item_call.on_click + function="Edit.TakeOff" + parameter="tattoo" /> + <menu_item_call.on_enable + function="Edit.EnableTakeOff" + parameter="universal" /> + </menu_item_call> <menu_item_call label="Physics" name="Physics"> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index d521074453ce9caa58256acc65c2e5fca8bd4fc2..053c04184974d553b55c0f342029283c3f696e74 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -1845,7 +1845,7 @@ You are not allowed to terraform parcel [PARCEL]. name="CannotCopyWarning" type="alertmodal"> You do not have permission to copy the following items: -[ITEMS] +<nolink>[ITEMS]</nolink> and will lose it from your inventory if you give it away. Do you really want to offer these items? <tag>confirm</tag> <usetemplate @@ -3815,6 +3815,62 @@ Can't add estate owner to estate 'Banned Resident' list. type="alertmodal"> Unable to add banned resident to estate manager list. </notification> + + <notification + icon="alertmodal.tga" + name="ProblemBanningEstateManager" + type="alertmodal"> +Unable to add estate manager [AGENT] to banned list. + </notification> + + <notification + icon="alertmodal.tga" + name="GroupIsAlreadyInList" + type="alertmodal"> +<nolink>[GROUP]</nolink> is already in the Allowed Groups list. + </notification> + + <notification + icon="alertmodal.tga" + name="AgentIsAlreadyInList" + type="alertmodal"> +[AGENT] is already in your [LIST_TYPE] list. + </notification> + + <notification + icon="alertmodal.tga" + name="AgentsAreAlreadyInList" + type="alertmodal"> +[AGENT] are already in your [LIST_TYPE] list. + </notification> + + <notification + icon="alertmodal.tga" + name="AgentWasAddedToList" + type="alertmodal"> +[AGENT] was added to [LIST_TYPE] list of [ESTATE]. + </notification> + + <notification + icon="alertmodal.tga" + name="AgentsWereAddedToList" + type="alertmodal"> +[AGENT] were added to [LIST_TYPE] list of [ESTATE]. + + </notification> + <notification + icon="alertmodal.tga" + name="AgentWasRemovedFromList" + type="alertmodal"> +[AGENT] was removed from [LIST_TYPE] list of [ESTATE]. + </notification> + + <notification + icon="alertmodal.tga" + name="AgentsWereRemovedFromList" + type="alertmodal"> +[AGENT] were removed from [LIST_TYPE] list of [ESTATE]. + </notification> <notification icon="alertmodal.tga" @@ -4616,7 +4672,8 @@ Add to allowed list for this estate only or for [ALL_ESTATES]? icon="alert.tga" label="Select estate" name="EstateAllowedAgentRemove" - type="alert"> + type="alertmodal"> + <unique/> Remove from allowed list for this estate only or for [ALL_ESTATES]? <tag>confirm</tag> <usetemplate @@ -4645,7 +4702,8 @@ Add to group allowed list for this estate only or for [ALL_ESTATES]? icon="alert.tga" label="Select estate" name="EstateAllowedGroupRemove" - type="alert"> + type="alertmodal"> + <unique/> Remove from group allowed list for this estate only or [ALL_ESTATES]? <tag>group</tag> <tag>confirm</tag> @@ -4674,8 +4732,9 @@ Deny access for this estate only or for [ALL_ESTATES]? icon="alert.tga" label="Select estate" name="EstateBannedAgentRemove" - type="alert"> -Remove this Resident from the ban list for access for this estate only or for [ALL_ESTATES]? + type="alertmodal"> + <unique/> +Remove this Resident from the ban list for access for this estate only or for [ALL_ESTATES]? <tag>confirm</tag> <usetemplate canceltext="Cancel" @@ -4702,7 +4761,8 @@ Add estate manager for this estate only or for [ALL_ESTATES]? icon="alert.tga" label="Select estate" name="EstateManagerRemove" - type="alert"> + type="alertmodal"> + <unique/> Remove estate manager for this estate only or for [ALL_ESTATES]? <tag>confirm</tag> <usetemplate @@ -6645,13 +6705,6 @@ Please select at least one type of content to search (General, Moderate, or Adul [MESSAGE] </notification> - <notification - icon="notify.tga" - name="FacebookConnect" - type="notifytip"> -[MESSAGE] - </notification> - <notification icon="notify.tga" name="FlickrConnect" @@ -7791,28 +7844,6 @@ Do not allow access if you do not fully understand why it wants access to your a </footer> </notification> - <notification - icon="notify.tga" - name="UnknownScriptQuestion" - persist="false" - type="notify"> -The runtime script permission requested by '<nolink>[OBJECTNAME]</nolink>', an object owned by '[NAME]', isn't recognized by the viewer and can't be granted. - -To grant this permission please update your viewer to the latest version from [DOWNLOADURL]. - <tag>confirm</tag> - <form name="form"> - <button - default="true" - index="1" - name="Deny" - text="Ok"/> - <button - index="2" - name="Mute" - text="Block"/> - </form> - </notification> - <notification icon="notify.tga" name="ScriptDialog" @@ -8601,6 +8632,7 @@ Please check your network and firewall setup. icon="alertmodal.tga" name="NoVoiceConnect" type="alertmodal"> + <unique/> We are unable to connect to the voice server: [HOSTID] @@ -9504,7 +9536,7 @@ You Can't create trees and grass on land you don't own. name="NoCopyPermsNoObject" type="notify"> <tag>fail</tag> -Copy failed because you lack permission to copy the object '[OBJ_NAME]'. +Copy failed because you lack permission to copy the object <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification @@ -9512,7 +9544,7 @@ Copy failed because you lack permission to copy the object '[OBJ_NAME]'. name="NoTransPermsNoObject" type="notify"> <tag>fail</tag> -Copy failed because the object '[OBJ_NAME]' cannot be transferred to you. +Copy failed because the object <nolink>'[OBJ_NAME]'</nolink> cannot be transferred to you. </notification> <notification @@ -9520,7 +9552,7 @@ Copy failed because the object '[OBJ_NAME]' cannot be transferred to you. name="AddToNavMeshNoCopy" type="notify"> <tag>fail</tag> -Copy failed because the object '[OBJ_NAME]' contributes to navmesh. +Copy failed because the object <nolink>'[OBJ_NAME]'</nolink> contributes to navmesh. </notification> <notification @@ -9644,7 +9676,7 @@ Save Back To Inventory has been disabled. name="NoExistNoSaveToContents" type="notify"> <tag>fail</tag> -Cannot save '[OBJ_NAME]' to object contents because the object it was rezzed from no longer exists. +Cannot save <nolink>'[OBJ_NAME]'</nolink> to object contents because the object it was rezzed from no longer exists. </notification> <notification @@ -9652,7 +9684,7 @@ Cannot save '[OBJ_NAME]' to object contents because the object it was rezzed fro name="NoModNoSaveToContents" type="notify"> <tag>fail</tag> -Cannot save '[OBJ_NAME]' to object contents because you do not have permission to modify the object '[DEST_NAME]'. +Cannot save <nolink>'[OBJ_NAME]'</nolink> to object contents because you do not have permission to modify the object <nolink>'[DEST_NAME]'</nolink>. </notification> <notification @@ -9660,7 +9692,7 @@ Cannot save '[OBJ_NAME]' to object contents because you do not have permission t name="NoSaveBackToInvDisabled" type="notify"> <tag>fail</tag> -Cannot save '[OBJ_NAME]' back to inventory -- this operation has been disabled. +Cannot save <nolink>'[OBJ_NAME]'</nolink> back to inventory -- this operation has been disabled. </notification> <notification @@ -9668,7 +9700,7 @@ Cannot save '[OBJ_NAME]' back to inventory -- this operation has been disabled. name="NoCopyNoSelCopy" type="notify"> <tag>fail</tag> -You cannot copy your selection because you do not have permission to copy the object '[OBJ_NAME]'. +You cannot copy your selection because you do not have permission to copy the object <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification @@ -9676,7 +9708,7 @@ You cannot copy your selection because you do not have permission to copy the ob name="NoTransNoSelCopy" type="notify"> <tag>fail</tag> -You cannot copy your selection because the object '[OBJ_NAME]' is not transferrable. +You cannot copy your selection because the object <nolink>'[OBJ_NAME]'</nolink> is not transferrable. </notification> <notification @@ -9684,7 +9716,7 @@ You cannot copy your selection because the object '[OBJ_NAME]' is not transferra name="NoTransNoCopy" type="notify"> <tag>fail</tag> -You cannot copy your selection because the object '[OBJ_NAME]' is not transferrable. +You cannot copy your selection because the object <nolink>'[OBJ_NAME]'</nolink> is not transferrable. </notification> <notification @@ -9692,7 +9724,7 @@ You cannot copy your selection because the object '[OBJ_NAME]' is not transferra name="NoPermsNoRemoval" type="notify"> <tag>fail</tag> -Removal of the object '[OBJ_NAME]' from the simulator is disallowed by the permissions system. +Removal of the object <nolink>'[OBJ_NAME]'</nolink> from the simulator is disallowed by the permissions system. </notification> <notification @@ -9700,7 +9732,7 @@ Removal of the object '[OBJ_NAME]' from the simulator is disallowed by the permi name="NoModNoSaveSelection" type="notify"> <tag>fail</tag> -Cannot save your selection because you do not have permission to modify the object '[OBJ_NAME]'. +Cannot save your selection because you do not have permission to modify the object <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification @@ -9708,7 +9740,7 @@ Cannot save your selection because you do not have permission to modify the obje name="NoCopyNoSaveSelection" type="notify"> <tag>fail</tag> -Cannot save your selection because the object '[OBJ_NAME]' is not copyable. +Cannot save your selection because the object <nolink>'[OBJ_NAME]'</nolink> is not copyable. </notification> <notification @@ -9716,7 +9748,7 @@ Cannot save your selection because the object '[OBJ_NAME]' is not copyable. name="NoModNoTaking" type="notify"> <tag>fail</tag> -You cannot take your selection because you do not have permission to modify the object '[OBJ_NAME]'. +You cannot take your selection because you do not have permission to modify the object <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification diff --git a/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml index 97f1a1a6589bbd8b5de6e3a56f254ea92a617095..8fa85dce5f2d4dcb72d17965873c5eac2685f4b2 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml @@ -1,85 +1,98 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> - <panel - background_visible="true" - follows="all" - height="400" - layout="topleft" - left="0" - name="edit_tattoo_panel" - top_pad="10" - width="333" > - <panel - border="false" - bg_alpha_color="DkGray2" - bg_opaque_color="DkGray2" - background_visible="true" - background_opaque="true" - follows="all" - height="400" - left="10" - layout="topleft" - name="avatar_tattoo_color_panel" - top="0" - width="313" > - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="115" - label="Head Tattoo" - layout="topleft" - left="20" - name="Head Tattoo" - tool_tip="Click to choose a picture" - top="10" - width="115" > - <texture_picker.commit_callback - function="TexturePicker.Commit" /> - </texture_picker> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="115" - label="Upper Tattoo" - layout="topleft" - left_pad="30" - name="Upper Tattoo" - tool_tip="Click to choose a picture" - top="10" - width="115" > - <texture_picker.commit_callback - function="TexturePicker.Commit" /> - </texture_picker> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="115" - label="Lower Tattoo" - layout="topleft" - left="20" - name="Lower Tattoo" - tool_tip="Click to choose a picture" - top_pad="10" - width="115" > - <texture_picker.commit_callback - function="TexturePicker.Commit" /> - </texture_picker> - <color_swatch - can_apply_immediately="true" - follows="left|top" - height="115" - label="Color/Tint" - layout="topleft" - left_pad="30" - name="Color/Tint" - tool_tip="Click to open color picker" - top_delta="0" - width="115" > - <color_swatch.commit_callback - function="ColorSwatch.Commit" /> - </color_swatch> - </panel> +<panel + background_visible="true" + follows="all" + height="400" + layout="topleft" + left="0" + name="edit_tattoo_panel" + top_pad="10" + width="333" > + <scroll_container + color="DkGray2" + follows="all" + height="400" + layout="topleft" + left="9" + name="avatar_tattoo_scroll" + opaque="true" + top_pad="10" + width="314"> + <panel + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="all" + height="800" + left="10" + layout="topleft" + name="avatar_tattoo_color_panel" + top="0" + width="313" > + <texture_picker + can_apply_immediately="true" + default_image_name="Default" + follows="left|top" + height="115" + label="Head Tattoo" + layout="topleft" + left="20" + name="Head Tattoo" + tool_tip="Click to choose a picture" + top="10" + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + <texture_picker + can_apply_immediately="true" + default_image_name="Default" + follows="left|top" + height="115" + label="Upper Tattoo" + layout="topleft" + left_pad="30" + name="Upper Tattoo" + tool_tip="Click to choose a picture" + top="10" + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + <texture_picker + can_apply_immediately="true" + default_image_name="Default" + follows="left|top" + height="115" + label="Lower Tattoo" + layout="topleft" + left="20" + name="Lower Tattoo" + tool_tip="Click to choose a picture" + top_pad="10" + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + + + <color_swatch + can_apply_immediately="true" + follows="left|top" + height="115" + label="Color/Tint" + layout="topleft" + left_pad="30" + name="Color/Tint" + tool_tip="Click to open color picker" + top_delta="0" + width="115" > + <color_swatch.commit_callback + function="ColorSwatch.Commit" /> + </color_swatch> + </panel> + </scroll_container> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_universal.xml b/indra/newview/skins/default/xui/en/panel_edit_universal.xml new file mode 100644 index 0000000000000000000000000000000000000000..11cabdfe6ee342cd292a31ea8ed523ea1cbadbd8 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_edit_universal.xml @@ -0,0 +1,231 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + follows="all" + height="400" + layout="topleft" + left="0" + name="edit_universal_panel" + top_pad="10" + width="333" > + <scroll_container + color="DkGray2" + follows="all" + height="380" + layout="topleft" + left="9" + name="avatar_universal_scroll" + opaque="true" + top_pad="10" + width="323"> + <panel + border="false" + bg_alpha_color="DkGray2" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + follows="all" + height="800" + left="10" + layout="topleft" + name="avatar_universal_color_panel" + top="0" + width="313" > + <texture_picker + can_apply_immediately="true" + default_image_name="Default" + follows="left|top" + height="115" + label="Head Tattoo" + layout="topleft" + left="20" + top_pad="10" + name="Head Universal Tattoo" + tool_tip="Click to choose a picture" + + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + <texture_picker + can_apply_immediately="true" + default_image_name="Default" + follows="left|top" + height="115" + label="Upper Tattoo" + layout="topleft" + left_pad="30" + top_delta="0" + name="Upper Universal Tattoo" + tool_tip="Click to choose a picture" + + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + <texture_picker + can_apply_immediately="true" + default_image_name="Default" + follows="left|top" + height="115" + label="Lower Tattoo" + layout="topleft" + left="20" + top_pad="10" + name="Lower Universal Tattoo" + tool_tip="Click to choose a picture" + + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + + <texture_picker + can_apply_immediately="true" + default_image_name="Default" + follows="left|top" + height="115" + label="Skirt Tattoo" + layout="topleft" + left_pad="30" + top_delta="0" + name="Skirt Tattoo" + tool_tip="Click to choose a picture" + + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + + <texture_picker + can_apply_immediately="true" + default_image_name="Default" + follows="left|top" + height="115" + label="Hair Tattoo" + layout="topleft" + left="20" + top_pad="10" + name="Hair Tattoo" + tool_tip="Click to choose a picture" + + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + <texture_picker + can_apply_immediately="true" + default_image_name="Default" + follows="left|top" + height="115" + label="Eyes Tattoo" + layout="topleft" + left_pad="30" + top_delta="0" + name="Eyes Tattoo" + tool_tip="Click to choose a picture" + + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + <texture_picker + can_apply_immediately="true" + default_image_name="Default" + follows="left|top" + height="115" + label="Left Arm Tattoo" + layout="topleft" + left="20" + top_pad="10" + name="Left Arm Tattoo" + tool_tip="Click to choose a picture" + + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + <texture_picker + can_apply_immediately="true" + default_image_name="Default" + follows="left|top" + height="115" + label="Left Leg Tattoo" + layout="topleft" + left_pad="30" + top_delta="0" + name="Left Leg Tattoo" + tool_tip="Click to choose a picture" + + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + <texture_picker + can_apply_immediately="true" + default_image_name="Default" + follows="left|top" + height="115" + label="Aux1 Tattoo" + layout="topleft" + left="20" + top_pad="10" + name="Aux1 Tattoo" + tool_tip="Click to choose a picture" + + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + <texture_picker + can_apply_immediately="true" + default_image_name="Default" + follows="left|top" + height="115" + label="Aux2 Tattoo" + layout="topleft" + left_pad="30" + top_delta="0" + name="Aux2 Tattoo" + tool_tip="Click to choose a picture" + + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + <texture_picker + can_apply_immediately="true" + default_image_name="Default" + follows="left|top" + height="115" + label="Aux3 Tattoo" + layout="topleft" + left="20" + top_pad="10" + name="Aux3 Tattoo" + tool_tip="Click to choose a picture" + + width="115" > + <texture_picker.commit_callback + function="TexturePicker.Commit" /> + </texture_picker> + + <color_swatch + can_apply_immediately="true" + follows="left|top" + height="115" + label="Color/Tint" + layout="topleft" + left_pad="30" + top_delta="0" + name="Color/Tint" + tool_tip="Click to open color picker" + + width="115" > + <color_swatch.commit_callback + function="ColorSwatch.Commit" /> + </color_swatch> + </panel> + </scroll_container> +</panel> + diff --git a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml index f34b9132189318f140e331877f2089df1f05ffef..dc1553e6a30757a83cbdde600761d6f6ff840c74 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml @@ -71,6 +71,10 @@ name="edit_tattoo_title"> Editing Tattoo </string> + <string + name="edit_universal_title"> + Editing Universal + </string> <string name="edit_physics_title"> Editing Physics @@ -135,6 +139,10 @@ name="tattoo_desc_text"> Tattoo: </string> + <string + name="universal_desc_text"> + Universal: + </string> <string name="physics_desc_text"> Physics: @@ -418,6 +426,16 @@ top="8" visible="false" width="333" /> + <panel + filename="panel_edit_universal.xml" + follows="all" + height="425" + layout="topleft" + left="0" + name="edit_universal_panel" + top="8" + visible="false" + width="333" /> <panel filename="panel_edit_physics.xml" follows="all" diff --git a/indra/newview/skins/default/xui/en/panel_facebook_friends.xml b/indra/newview/skins/default/xui/en/panel_facebook_friends.xml deleted file mode 100644 index 97994fb08b6c3d05141d2e823af0228f01d07a59..0000000000000000000000000000000000000000 --- a/indra/newview/skins/default/xui/en/panel_facebook_friends.xml +++ /dev/null @@ -1,73 +0,0 @@ -<panel - height="400" - width="272" - layout="topleft" - follows="all" - name="panel_facebook_friends"> - <string - name="facebook_friends_empty" - value="You currently do not have any Facebook friends who are also Second Life residents. Ask your Facebook friends to join Second Life today!" /> - <string - name="facebook_friends_no_connected" - value="You're currently not connected to Facebook. Please go to the Status tab to connect and enable this feature." /> - <accordion - background_visible="false" - bg_alpha_color="DkGray2" - bg_opaque_color="DkGray2" - follows="all" - height="383" - layout="topleft" - left="10" - name="friends_accordion" - right="-10" - top_pad="2"> - <accordion_tab - layout="topleft" - height="173" - name="tab_second_life_friends" - title="SL friends"> - <avatar_list - ignore_online_status="true" - allow_select="true" - follows="all" - height="173" - layout="topleft" - left="0" - name="second_life_friends" - show_permissions_granted="true" - top="0" - width="272" /> - </accordion_tab> - <accordion_tab - layout="topleft" - height="173" - name="tab_suggested_friends" - title="Add these people as SL friends"> - <avatar_list - ignore_online_status="true" - allow_select="true" - follows="all" - height="173" - layout="topleft" - left="0" - name="suggested_friends" - show_permissions_granted="true" - top="0" - width="272" /> - </accordion_tab> - </accordion> - <text - layout="topleft" - word_wrap="true" - height="64" - width="250" - follows="top|left|right" - font="SansSerif" - left="10" - right="-10" - name="facebook_friends_status" - top="5" - type="string"> - Not connected to Facebook. - </text> -</panel> diff --git a/indra/newview/skins/default/xui/en/panel_facebook_photo.xml b/indra/newview/skins/default/xui/en/panel_facebook_photo.xml deleted file mode 100644 index 22e6598352714a4b700c12bc4fa7e23e3beb05f1..0000000000000000000000000000000000000000 --- a/indra/newview/skins/default/xui/en/panel_facebook_photo.xml +++ /dev/null @@ -1,168 +0,0 @@ - <panel - height="400" - width="272" - layout="topleft" - follows="all" - name="panel_facebook_photo"> - <combo_box - control_name="FacebookPhotoResolution" - follows="left|top" - layout="topleft" - top="7" - left="10" - name="resolution_combobox" - tool_tip="Image resolution" - height="21" - width="124"> - <combo_box.item - label="Current Window" - name="CurrentWindow" - value="[i0,i0]" /> - <combo_box.item - label="640x480" - name="640x480" - value="[i640,i480]" /> - <combo_box.item - label="800x600" - name="800x600" - value="[i800,i600]" /> - <combo_box.item - label="1024x768" - name="1024x768" - value="[i1024,i768]" /> - <combo_box.item - label="1200x630" - name="1200x630" - value="[i1200,i630]" /> - </combo_box> - <combo_box - control_name="FacebookPhotoFilters" - follows="left|top" - layout="topleft" - name="filters_combobox" - tool_tip="Image filters" - top="7" - left_pad="4" - height="21" - width="124"> - <combo_box.item - label="No Filter" - name="NoFilter" - value="NoFilter" /> - </combo_box> - <panel - height="150" - width="252" - visible="true" - layout="topleft" - name="thumbnail_placeholder" - top_pad="5" - follows="left|top|rith" - right="-10" - left="10"> - </panel> - <text - follows="left|top" - layout="topleft" - font="SansSerif" - text_color="EmphasisColor" - height="14" - top_pad="2" - left="10" - length="1" - halign="center" - name="working_lbl" - translate="false" - type="string" - visible="true" - width="251"> - Refreshing... - </text> - <view_border - bevel_style="in" - follows="left|top" - layout="topleft" - height="1" - left="10" - name="refresh_border" - width="250" - top_pad="0"/> - <button - follows="left|top" - layout="topleft" - height="23" - label="Refresh" - left="10" - top_pad="5" - name="new_snapshot_btn" - tool_tip="Click to refresh" - visible="true" - width="100" > - <button.commit_callback - function="SocialSharing.RefreshPhoto" /> - </button> - <button - follows="right|top" - layout="topleft" - height="23" - label="Preview" - right="-10" - top_delta="0" - name="big_preview_btn" - tool_tip="Click to toggle preview" - is_toggle="true" - visible="true" - width="100" > - <button.commit_callback - function="SocialSharing.BigPreview" /> - </button> - <text - length="1" - follows="top|left|right" - layout="topleft" - font="SansSerif" - height="16" - left="10" - name="caption_label" - top_pad="20" - type="string"> - Comment (optional): - </text> - <text_editor - follows="left|top|right|bottom" - layout="topleft" - height="87" - width="250" - left="10" - right="-10" - length="1" - max_length="700" - name="photo_caption" - type="string" - word_wrap="true"> - </text_editor> - <button - follows="left|top" - layout="topleft" - top_pad="22" - left="10" - height="23" - label="Post" - name="post_photo_btn" - width="100"> - <button.commit_callback - function="SocialSharing.SendPhoto" /> - </button> - <button - follows="right|top" - layout="topleft" - height="23" - label="Cancel" - name="cancel_photo_btn" - right="-10" - top_delta="0" - width="100"> - <button.commit_callback - function="SocialSharing.Cancel" /> - </button> - </panel> diff --git a/indra/newview/skins/default/xui/en/panel_facebook_place.xml b/indra/newview/skins/default/xui/en/panel_facebook_place.xml deleted file mode 100644 index f87b008c4ec53b7ef98655622d99fbf828c1baad..0000000000000000000000000000000000000000 --- a/indra/newview/skins/default/xui/en/panel_facebook_place.xml +++ /dev/null @@ -1,113 +0,0 @@ - <panel - height="400" - width="272" - layout="topleft" - follows="all" - name="panel_facebook_place"> - <text - length="1" - follows="top|left|right" - layout="topleft" - font="SansSerif" - height="16" - left="10" - name="place_caption_label" - top="5" - type="string"> - Say something about where you are: - </text> - <text_editor - follows="top|left|right" - layout="topleft" - height="70" - width="250" - left="10" - right="-10" - length="1" - max_length="700" - name="place_caption" - type="string" - word_wrap="true"> - </text_editor> - <check_box - follows="left|top" - layout="topleft" - initial_value="false" - height="16" - top_pad="8" - width="8" - label="Include overhead view of location" - name="add_place_view_cb" - left="10"/> - <panel - follows="left|top" - layout="topleft" - height="243" - width="250" - background_visible="true" - bg_opaque_color="Black" - bg_alpha_color="Black" - top_pad="8" - left="10" - right="-12" - visible="true" - name="map_border"> - </panel> - <icon - follows="left|top" - layout="topleft" - height="243" - width="250" - image_name="Map_Placeholder_Icon" - top_delta="0" - right="-12" - left="10" - visible="true" - name="map_placeholder"> - </icon> - <icon - follows="left|top" - layout="topleft" - height="243" - width="250" - image_name="Map_Placeholder_Icon" - top_delta="0" - left="10" - right="-12" - visible="true" - name="map_default"> - </icon> - <loading_indicator - follows="left|top" - layout="topleft" - height="24" - width="24" - name="map_loading_indicator" - top_delta="116" - left="126" - visible="false"/> - <button - follows="left|bottom" - layout="topleft" - top_pad="95" - left="10" - height="23" - label="Post" - name="post_place_btn" - width="100"> - <button.commit_callback - function="SocialSharing.SendCheckin" /> - </button> - <button - follows="right|bottom" - layout="topleft" - height="23" - label="Cancel" - name="cancel_place_btn" - right="-10" - top_delta="0" - width="100"> - <button.commit_callback - function="SocialSharing.Cancel" /> - </button> - </panel> diff --git a/indra/newview/skins/default/xui/en/panel_facebook_status.xml b/indra/newview/skins/default/xui/en/panel_facebook_status.xml deleted file mode 100644 index fe0f3c9279f75bf4a5d7fb29049bd4969f8ead8f..0000000000000000000000000000000000000000 --- a/indra/newview/skins/default/xui/en/panel_facebook_status.xml +++ /dev/null @@ -1,130 +0,0 @@ - <panel - height="400" - width="272" - follows="all" - layout="topleft" - name="panel_facebook_status"> - <string - name="facebook_connected" - value="You are connected to Facebook as:" /> - <string - name="facebook_disconnected" - value="Not connected to Facebook" /> - <text - layout="topleft" - length="1" - follows="top|left" - font="SansSerif" - height="16" - left="10" - name="account_caption_label" - top="5" - type="string"> - Not connected to Facebook. - </text> - <text - layout="topleft" - top_pad="2" - length="1" - follows="top|left" - font="SansSerif" - height="16" - left="10" - name="account_name_label" - parse_urls="true" - type="string"/> - <panel - layout="topleft" - follows="left|top" - name="panel_buttons" - height="60" - left="0"> - <button - layout="topleft" - follows="left|top" - top_pad="9" - left="10" - visible="true" - height="23" - label="Connect..." - name="connect_btn" - width="251"> - <commit_callback function="SocialSharing.Connect"/> - </button> - - <button - layout="topleft" - follows="left|top|right" - top_delta="0" - left="10" - right="-10" - height="23" - label="Disconnect" - name="disconnect_btn" - width="210" - visible="false"> - <commit_callback function="SocialSharing.Disconnect"/> - </button> - <text - layout="topleft" - length="1" - follows="top|left|right" - left="10" - right="-10" - height="16" - name="account_learn_more_label" - top_pad="5" - type="string"> - [http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 Learn about posting to Facebook] - </text> - </panel> - - <text - length="1" - layout="topleft" - follows="top|left|right" - font="SansSerif" - height="16" - left="10" - name="status_caption_label" - top_pad="5" - type="string"> - What's on your mind? - </text> - <text_editor - follows="left|top|right" - layout="topleft" - height="150" - width="252" - left="10" - length="1" - max_length="700" - name="status_message" - type="string" - word_wrap="true"> - </text_editor> - <button - follows="left|top" - layout="topleft" - top_pad="6" - left="10" - height="23" - label="Post" - name="post_status_btn" - width="100"> - <button.commit_callback - function="SocialSharing.SendStatus" /> - </button> - <button - follows="right|top" - layout="topleft" - height="23" - label="Cancel" - name="cancel_status_btn" - right="-10" - top_delta="0" - width="100"> - <button.commit_callback - function="SocialSharing.Cancel" /> - </button> - </panel> diff --git a/indra/newview/skins/default/xui/en/panel_flickr_photo.xml b/indra/newview/skins/default/xui/en/panel_flickr_photo.xml index 6074ab9ef6c4e0fe07e6500fef5de1c58e26883b..7fb2291423bd1e838870563872f1e80bfd049f39 100644 --- a/indra/newview/skins/default/xui/en/panel_flickr_photo.xml +++ b/indra/newview/skins/default/xui/en/panel_flickr_photo.xml @@ -158,6 +158,7 @@ length="1" max_length="700" name="photo_description" + spellcheck="true" type="string" word_wrap="true"> </text_editor> diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml index 26f54bacbccf516f2c5bd72103ae23d5dd63e5fd..e34335a2afcd2e7e696d3cee8805cfe3adfe4d0b 100644 --- a/indra/newview/skins/default/xui/en/panel_group_general.xml +++ b/indra/newview/skins/default/xui/en/panel_group_general.xml @@ -214,7 +214,7 @@ Hover your mouse over the options for more help. layout="topleft" left="10" name="group_mature_check" - tool_tip="Sets whether your group contains information rated as Moderate" + tool_tip="Maturity ratings designate the type of content and behavior allowed in a group" top_pad="4" width="190"> <combo_item name="select_mature" value="Select"> diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index 714d4166c05396c8696738394e02174dc6c1fdad..f15f79e9aaffbd42686d2fd774766e338891f4a8 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -212,7 +212,15 @@ clicking on their names. layout="topleft" left="0" name="role_create" - width="120" /> + width="100" /> + <button + follows="top|left" + height="23" + label="Copy Role" + layout="topleft" + left_pad="10" + name="role_copy" + width="100" /> <button height="23" follows="top|left" @@ -220,7 +228,7 @@ clicking on their names. layout="topleft" left_pad="10" name="role_delete" - width="120" /> + width="100" /> </panel> <panel border="false" diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml index fd6e96b9a7e1255972ac801a8fcfcabdeac0accd..13986c40308f5a505000e54d74296e77569f3a15 100644 --- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -277,6 +277,7 @@ max_length="127" name="notes_editor" read_only="true" + spellcheck="true" text_readonly_color="white" text_type="ascii_with_newline" top_pad="5" diff --git a/indra/newview/skins/default/xui/en/panel_login_first.xml b/indra/newview/skins/default/xui/en/panel_login_first.xml index 213f9a6b0cc2f85273ac4358ffa38f6928e941d9..726e7135956acfef98b084cb44d21e8b2d7a93e3 100644 --- a/indra/newview/skins/default/xui/en/panel_login_first.xml +++ b/indra/newview/skins/default/xui/en/panel_login_first.xml @@ -111,7 +111,6 @@ combo_editor.font="SansSerifLarge" max_chars="128" top="0" - commit_on_focus_lost="false" combo_editor.prevalidate_callback="ascii" tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine" name="username_combo" @@ -141,7 +140,7 @@ follows="left|top" image_unselected="PushButton_Login" image_pressed="PushButton_Login_Pressed" - image_hover="PushButton_Login_Over" + image_hover_unselected="PushButton_Login_Over" label="Log In" label_color="White" font="SansSerifLarge" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 8fc0f6f642baf20cfa487b73df41d56127eab5e7..a47121ae995f848269bd4ae29c3c105aaaf4e33a 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -367,24 +367,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M show_permissions_granted="true" top="0" width="307" /> - </accordion_tab> - <accordion_tab - layout="topleft" - height="173" - name="tab_suggested_friends" - title="People you may want to friend"> - <avatar_list - ignore_online_status="true" - allow_select="true" - follows="all" - height="173" - layout="topleft" - left="0" - name="suggested_friends" - show_permissions_granted="true" - top="0" - width="307" /> - </accordion_tab> + </accordion_tab> </accordion> <text follows="all" diff --git a/indra/newview/skins/default/xui/en/panel_postcard_message.xml b/indra/newview/skins/default/xui/en/panel_postcard_message.xml index 331a08b4bbf5cf4f85364e5b197c6b5d78a1bf2d..63c7259878687f5727a6bceb0d416430a7c1d155 100644 --- a/indra/newview/skins/default/xui/en/panel_postcard_message.xml +++ b/indra/newview/skins/default/xui/en/panel_postcard_message.xml @@ -80,6 +80,7 @@ left="5" max_length="700" name="msg_form" + spellcheck="true" right="-4" top_pad="5" word_wrap="true"> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml index 9da044ab64d2e6dbd12e0331c782b762a668dafa..335d7caa5112e2c5ebac828358061649ce744ce0 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -30,11 +30,6 @@ max_chars="135" name="language_combobox" width="200"> - <combo_box.item - enabled="true" - label="System default" - name="System Default Language" - value="default" /> <combo_box.item enabled="true" label="English" diff --git a/indra/newview/skins/default/xui/en/panel_region_access.xml b/indra/newview/skins/default/xui/en/panel_region_access.xml new file mode 100644 index 0000000000000000000000000000000000000000..4be073195b7c4dda226a2fead884374e700e9d93 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_region_access.xml @@ -0,0 +1,421 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + border="true" + follows="top|left" + height="510" + help_topic="panel_region_access_tab" + label="Access" + layout="topleft" + left="0" + name="Access" + top="320" + width="530"> + + +<tab_container + bottom="-10" + follows="all" + layout="topleft" + left="3" + name="tabs" + tab_min_width="70" + tab_height="30" + tab_position="top" + top="10" + halign="center" + right="-5"> + +<!-- ============================= ESTATE MANAGERS tab ====================== --> + <panel + background_opaque="true" + background_visible="true" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" + bottom="-1" + follows="all" + label="ESTATE MANAGERS" + layout="topleft" + left="0" + help_topic="estate_managers_tab" + name="estate_managers_panel" + right="-1" + top="0"> + <text + type="string" + length="1" + bottom="34" + follows="left|top" + height="20" + layout="topleft" + name="estate_manager_label" + top_pad="10" + left="10" + width="200"> + Estate Managers: + </text> + <!-- Estate Managers box --> + <view_border + bevel_style="none" + follows="top|left" + height="400" + layout="topleft" + left="10" + top_pad="-5" + width="498" /> + <name_list + follows="left|top" + height="400" + layout="topleft" + left_delta="0" + multi_select="true" + draw_heading="true" + name="estate_manager_name_list" + top_delta="0" + width="498"> + <columns + label="Name" + name="name" + width="498" /> + </name_list> + <!-- Estate Managers buttons --> + <button + follows="left|top" + height="23" + label="Add..." + layout="topleft" + left="10" + name="add_estate_manager_btn" + top_pad="6" + width="114" /> + <button + follows="left|top" + height="23" + label="Remove..." + layout="topleft" + name="remove_estate_manager_btn" + left_pad="6" + width="114" /> + </panel> + + +<!-- ================================ ALLOWED tab =========================== --> + <panel + background_opaque="true" + background_visible="true" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" + bottom="-1" + follows="all" + label="ALLOWED" + layout="topleft" + left="0" + help_topic="allowed_tab" + name="allowed_panel" + right="-1" + top="0"> + <panel + follows="left|top|right" + height="27" + label="top_panel" + layout="topleft" + left="0" + name="allowed_search_panel" + right="-1" + top="0"> + <filter_editor + follows="left|top|right" + height="23" + layout="topleft" + left="6" + label="Search allowed agents" + max_length_chars="300" + name="allowed_search_input" + text_color="Black" + text_pad_left="10" + top="4" + width="440" /> + <button + follows="left|top" + height="23" + label="Copy" + layout="topleft" + left_pad="10" + name="copy_allowed_list_btn" + width="40" /> + </panel> + <text + type="string" + length="1" + bottom="34" + follows="left|top" + height="20" + layout="topleft" + name="allow_resident_label" + top_pad="10" + left="10" + width="200"> + Always allowed: + </text> + <!-- Always allowed box --> + <view_border + bevel_style="none" + follows="top|left" + height="370" + layout="topleft" + left="10" + top_pad="-5" + width="498" /> + <name_list + follows="left|top" + height="370" + layout="topleft" + left_delta="0" + multi_select="true" + draw_heading="true" + name="allowed_avatar_name_list" + top_delta="0" + width="498"> + <columns + label="Name" + name="name" + width="498" /> + </name_list> + <!-- Always allowed buttons --> + <button + follows="left|top" + height="23" + label="Add..." + layout="topleft" + left="10" + name="add_allowed_avatar_btn" + top_pad="6" + width="114" /> + <button + follows="left|top" + height="23" + label="Remove..." + layout="topleft" + name="remove_allowed_avatar_btn" + left_pad="6" + width="114" /> + </panel> + + <!-- ============================= ALLOWED GROUPS tab ======================= --> + <panel + background_opaque="true" + background_visible="true" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" + bottom="-1" + follows="all" + label="ALLOWED GROUPS" + layout="topleft" + left="0" + help_topic="allowed_groups_tab" + name="allowed_groups_panel" + right="-1" + top="0"> + <panel + follows="left|top|right" + height="27" + label="top_panel" + layout="topleft" + left="0" + name="allowed_group_search_panel" + right="-1" + top="0"> + <filter_editor + follows="left|top|right" + height="23" + layout="topleft" + left="6" + label="Search allowed groups" + max_length_chars="300" + name="allowed_group_search_input" + text_color="Black" + text_pad_left="10" + top="4" + width="440" /> + <button + follows="left|top" + height="23" + label="Copy" + layout="topleft" + left_pad="10" + name="copy_allowed_group_list_btn" + width="40" /> + </panel> + <text + type="string" + length="1" + follows="left|top" + height="20" + layout="topleft" + left="10" + name="allow_group_label" + top_pad="10" + width="200"> + Groups always allowed: + </text> + <!-- Groups always allowed box --> + <view_border + bevel_style="none" + follows="top|left" + height="370" + layout="topleft" + left="10" + top_pad="-5" + width="498" /> + <name_list + follows="left|top" + height="370" + layout="topleft" + left_delta="0" + multi_select="true" + draw_heading="true" + name="allowed_group_name_list" + top_delta="0" + width="498"> + <columns + label="Name" + name="name" + width="498" /> + </name_list> + <!-- Groups always allowed buttons --> + <button + follows="left|top" + height="23" + label="Add..." + layout="topleft" + left="10" + name="add_allowed_group_btn" + top_pad="6" + width="114" /> + <button + follows="left|top" + height="23" + label="Remove..." + layout="topleft" + name="remove_allowed_group_btn" + left_pad="6" + top_delta="0" + width="114" /> + </panel> + + <!-- ================================ BANNED tab ============================ --> + <panel + background_opaque="true" + background_visible="true" + bg_alpha_color="DkGray" + bg_opaque_color="DkGray" + bottom="-1" + follows="all" + label="BANNED" + layout="topleft" + left="0" + help_topic="banned_tab" + name="banned_panel" + right="-1" + top="0"> + <panel + follows="left|top|right" + height="27" + label="top_panel" + layout="topleft" + left="0" + name="banned_search_panel" + right="-1" + top="0"> + <filter_editor + follows="left|top|right" + height="23" + layout="topleft" + left="6" + label="Search banned agents" + max_length_chars="300" + name="banned_search_input" + text_color="Black" + text_pad_left="10" + top="4" + width="440" /> + <button + follows="left|top" + height="23" + label="Copy" + layout="topleft" + left_pad="10" + name="copy_banned_list_btn" + width="40" /> + </panel> + <text + type="string" + length="1" + follows="left|top" + height="20" + layout="topleft" + left="10" + name="ban_resident_label" + top_pad="10" + width="200"> + Always banned: + </text> + <!-- Always banned box --> + <view_border + bevel_style="none" + follows="top|left" + height="370" + layout="topleft" + left="10" + top_pad="-5" + width="498" /> + <name_list + follows="left|top" + height="370" + layout="topleft" + left_delta="0" + multi_select="true" + draw_heading="true" + name="banned_avatar_name_list" + top_delta="0" + width="498"> + <columns + label="Name" + name="name" + width="140" /> + <columns + label="Last login date" + name="last_login_date" + width="100" /> + <columns + label="Date banned" + name="ban_date" + width="100" /> + <columns + label="Banned by" + name="bannedby" + width="140" /> + </name_list> + <!-- Always banned buttons --> + <button + follows="left|top" + height="23" + label="Add..." + layout="topleft" + left="10" + name="add_banned_avatar_btn" + top_pad="6" + width="114" /> + <button + follows="left|top" + height="23" + label="Remove..." + layout="topleft" + name="remove_banned_avatar_btn" + left_pad="6" + top_delta="0" + width="114" /> + </panel> + + +</tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml index a0c1dd0be6872f1d82c41ef68324727e08500cad..9b9c870c49f384ebd8a41ef55652b567df02232a 100644 --- a/indra/newview/skins/default/xui/en/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml @@ -82,7 +82,7 @@ <view_border bevel_style="none" follows="top|left" - height="105" + height="185" layout="topleft" left="10" top_pad="5" @@ -96,7 +96,7 @@ width="200"> <radio_item height="16" - label="Allow only residents and groups listed below" + label="Allow only residents and groups listed on the Access tab" layout="topleft" name="estate_restricted_access" /> <radio_item @@ -137,10 +137,10 @@ height="18" label="Allow Voice Chat" layout="topleft" - left="290" + left="20" name="voice_chat_check" - top_delta="-78" - width="200" /> + top_pad="2" + width="240" /> <check_box height="18" label="Allow Direct Teleport" @@ -148,7 +148,7 @@ left_delta="0" name="allow_direct_teleport" top_pad="2" - width="80" /> + width="240" /> <button enabled="false" follows="left|top" @@ -156,215 +156,9 @@ label="Apply" layout="topleft" name="apply_btn" - top_pad="30" - left_delta="0" - width="97" /> - - <text - type="string" - length="1" - bottom="34" - follows="left|top" - height="20" - layout="topleft" - name="estate_manager_label" - top_pad="25" - left="10" - width="200"> - Estate Managers: - </text> - <text - type="string" - length="1" - follows="left|top" - height="20" - layout="topleft" - left="280" - name="allow_resident_label" - top_delta="0" - width="200"> - Always allowed: - </text> - - <!-- Estate Managers box --> - <view_border - bevel_style="none" - follows="top|left" - height="71" - layout="topleft" - left="10" - top_pad="-5" - width="235" /> - <name_list - follows="left|top" - height="71" - layout="topleft" - left_delta="0" - multi_select="true" - name="estate_manager_name_list" - top_delta="0" - width="235" /> - - <!-- Always allowed box --> - <view_border - bevel_style="none" - follows="top|left" - height="71" - layout="topleft" - left="280" - top_delta="0" - width="235" /> - <name_list - follows="left|top" - height="71" - layout="topleft" - left_delta="0" - multi_select="true" - name="allowed_avatar_name_list" - top_delta="0" - width="235" /> - - <!-- Estate Managers buttons --> - <button - follows="left|top" - height="23" - label="Add..." - layout="topleft" - left="10" - name="add_estate_manager_btn" - top_pad="6" - width="114" /> - <button - follows="left|top" - height="23" - label="Remove..." - layout="topleft" - name="remove_estate_manager_btn" - left_pad="6" - width="114" /> - - <!-- Always allowed buttons --> - <button - follows="left|top" - height="23" - left="280" - label="Add..." - layout="topleft" - name="add_allowed_avatar_btn" - top_delta="0" - width="114" /> - <button - follows="left|top" - height="23" - label="Remove..." - layout="topleft" - name="remove_allowed_avatar_btn" - left_pad="6" - top_delta="0" - width="114" /> - - <text - type="string" - length="1" - follows="left|top" - height="20" - layout="topleft" - left="10" - name="allow_group_label" top_pad="10" - width="200"> - Groups always allowed: - </text> - <text - type="string" - length="1" - follows="left|top" - height="20" - layout="topleft" - left="280" - name="ban_resident_label" - top_delta="0" - width="200"> - Always banned: - </text> - - <!-- Groups always allowed box --> - <view_border - bevel_style="none" - follows="top|left" - height="71" - layout="topleft" - left="10" - top_pad="-5" - width="235" /> - <name_list - follows="left|top" - height="71" - layout="topleft" left_delta="0" - multi_select="true" - name="allowed_group_name_list" - top_delta="0" - width="235" /> - - <!-- Always banned box --> - <view_border - bevel_style="none" - follows="top|left" - height="71" - layout="topleft" - left="280" - top_delta="0" - width="235" /> - <name_list - follows="left|top" - height="71" - layout="topleft" - left_delta="0" - multi_select="true" - name="banned_avatar_name_list" - top_delta="0" - width="235" /> - - <!-- Groups always allowed buttons --> - <button - follows="left|top" - height="23" - label="Add..." - layout="topleft" - left="10" - name="add_allowed_group_btn" - top_pad="6" - width="114" /> - <button - follows="left|top" - height="23" - label="Remove..." - layout="topleft" - name="remove_allowed_group_btn" - left_pad="6" - top_delta="0" - width="114" /> - - <!-- Always banned buttons --> - <button - follows="left|top" - height="23" - label="Add..." - layout="topleft" - left="280" - name="add_banned_avatar_btn" - top_delta="0" - width="114" /> - <button - follows="left|top" - height="23" - label="Remove..." - layout="topleft" - name="remove_banned_avatar_btn" - top_delta="0" - left_pad="6" - width="114" /> + width="97" /> <button follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_region_terrain.xml b/indra/newview/skins/default/xui/en/panel_region_terrain.xml index 5d060c0a0dcdda1acedabc5dc56d491cf048477d..8243c2715df910b8ff89730a8bccd242c9eb07be 100644 --- a/indra/newview/skins/default/xui/en/panel_region_terrain.xml +++ b/indra/newview/skins/default/xui/en/panel_region_terrain.xml @@ -94,6 +94,7 @@ layout="topleft" left_delta="0" name="texture_detail_0" + default_image_id="0bc58228-74a0-7e83-89bc-5c23464bcec5" top_delta="20" width="100" /> <texture_picker @@ -102,6 +103,7 @@ layout="topleft" left_pad="10" name="texture_detail_1" + default_image_id="63338ede-0037-c4fd-855b-015d77112fc8" top_delta="0" width="100" /> <texture_picker @@ -110,6 +112,7 @@ layout="topleft" left_pad="10" name="texture_detail_2" + default_image_id="303cd381-8560-7579-23f1-f0a880799740" top_delta="0" width="100" /> <texture_picker @@ -118,6 +121,7 @@ layout="topleft" left_pad="10" name="texture_detail_3" + default_image_id="53a2f406-4895-1d13-d541-d2e3b86bc19c" top_delta="0" width="100" /> <text diff --git a/indra/newview/skins/default/xui/en/panel_script_ed.xml b/indra/newview/skins/default/xui/en/panel_script_ed.xml index c56a5e17cdd53c46a2c7f7a3ca5009b2f59ed335..ed37e9e2ccdf8844e315518f90213eb73ad60768 100644 --- a/indra/newview/skins/default/xui/en/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml @@ -28,10 +28,6 @@ name="Title"> Script: [NAME] </panel.string> - <panel.string - name="external_editor_not_set"> - Select an editor by setting the environment variable LL_SCRIPT_EDITOR or the ExternalEditor setting. - </panel.string> <menu_bar bg_visible="false" follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml index 305cce1cbe722f7ecabd4cb4ed3be344dd98516a..981b9ab8816799776e4dc377a11272898fe6f109 100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml @@ -56,23 +56,6 @@ <button.commit_callback function="Snapshot.SaveToProfile" /> </button> - <button - follows="left|top" - font="SansSerif" - halign="left" - height="22" - image_overlay="Snapshot_Facebook" - image_overlay_alignment="left" - image_top_pad="0" - imgoverlay_label_space="10" - label="Share to Facebook" - layout="topleft" - left_delta="0" - name="send_to_facebook_btn" - top_pad="5"> - <button.commit_callback - function="Snapshot.SendToFacebook"/> - </button> <button follows="left|top" font="SansSerif" diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml index d86cb92981040bc1ad28386c9b31b2b3fcdcb976..2fdbee49f0389991f64fa5be59baf009550160b3 100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml @@ -126,6 +126,7 @@ length="1" max_length="700" name="caption" + spellcheck="true" width="200" top_pad="2" type="string" diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index 998f1ce59979d460145ba9747201e77f45cdda28..52bcce01f7d7311471b2d1e3a1a7bf3ce975116d 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -33,6 +33,46 @@ name="buycurrencylabel"> L$ [AMT] </panel.string> + <panel + height="18" + left="-458" + top="0" + width="120" + follows="right|top" + name="menu_search_panel" + background_opaque="true" + background_visible="true" + bg_opaque_color="MouseGray"> + <search_editor + clear_button_visible="true" + follows="left|top" + height="18" + label="Search Menus" + layout="topleft" + left="0" + max_length_bytes="255" + name="search_menu_edit" + right="-1" + text_pad_left="6" + tool_tip="Type the search term you are interested in here. Results will be displayed for partial fulltext matches within the menu." + top="0"> + <search_button + top_pad="4" + left_pad="4" + width="12" + height="12" + image_unselected="Search" + image_selected="Search"/> + <clear_button + bottom="2" + height="12" + image_unselected="Icon_Close_Foreground" + image_selected="Icon_Close_Press" + pad_right="4" + pad_left="4" + width="12"/> + </search_editor> + </panel> <panel height="18" left="-416" diff --git a/indra/newview/skins/default/xui/en/panel_tools_texture.xml b/indra/newview/skins/default/xui/en/panel_tools_texture.xml index a658676b51c461e6eb0f220fdc1090194c7945ef..ec610758cc063c7a0b64860ef81c2fb7e57df96d 100644 --- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml +++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml @@ -805,6 +805,17 @@ tool_tip="Align textures on all selected faces with the last selected face. Requires Planar texture mapping." top_delta="16" width="260" /> + <button + left="10" + top="222" + height="20" + label="Align" + label_selected="Align current texture layers" + layout="topleft" + name="button align textures" + top_delta="0" + tool_tip="Align current texture layers" + width="66" /> <web_browser visible="false" enabled="false" diff --git a/indra/newview/skins/default/xui/en/panel_twitter_photo.xml b/indra/newview/skins/default/xui/en/panel_twitter_photo.xml index 9a460ceead7e6d9d09ca75413c824e7a682961ed..8774d09a03ea1e11a18bdfa896e3f58adf5ac30c 100644 --- a/indra/newview/skins/default/xui/en/panel_twitter_photo.xml +++ b/indra/newview/skins/default/xui/en/panel_twitter_photo.xml @@ -39,6 +39,7 @@ length="1" max_length="140" name="photo_status" + spellcheck="true" type="string" word_wrap="true"> </text_editor> diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml index fd14b13ed6fe6dea56649d5e9fd2321b3d4fe352..acb6f5b42ae260c34da92cb7781668f12b024283 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -130,7 +130,8 @@ max_length_bytes="63" name="LabelItemName" top_delta="0" - width="210" /> + width="210" + tool_tip="The name is limited to 63 characters. Longer prim names are cut short. Names can only consist of printable characters found in the ASCII-7 (non-extended) character set, with the exception of the vertical bar/pipe '|'." /> <text type="string" length="1" @@ -153,7 +154,8 @@ max_length_bytes="127" name="LabelItemDesc" top_delta="-5" - width="210" /> + width="210" + tool_tip="When people have 'Hover Tips on All Objects' selected in the viewer's settings, they'll see the object description pop-up for any object under their mouse pointer. The prim description is limited to 127 bytes any string longer then that will be truncated." /> <text type="string" length="1" @@ -351,6 +353,7 @@ layout="topleft" left_pad="0" name="CheckEveryoneCopy" + tool_tip="Anyone can take a copy of the object . Object and all of its contents must be copy and transfer permissive." top_delta="-2" width="150" /> <text @@ -394,6 +397,7 @@ left="20" top_pad="0" name="CheckNextOwnerModify" + tool_tip="Next owner can edit properties like item name or scale of this object." width="90" /> <check_box height="18" @@ -401,6 +405,7 @@ layout="topleft" left_pad="0" name="CheckNextOwnerCopy" + tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied." width="90" /> <check_box height="18" @@ -408,7 +413,7 @@ layout="topleft" left_pad="0" name="CheckNextOwnerTransfer" - tool_tip="Next owner can give away or resell this object" + tool_tip="Next owner can give away or resell this object." width="106" /> </panel> <check_box @@ -418,14 +423,16 @@ left="20" name="CheckPurchase" top_pad="20" - width="100" /> + width="100" + tool_tip="Lets people buy this object, its content or it copy inworld for specified price." /> <combo_box height="23" left_pad="0" layout="topleft" follows="left|top" name="ComboBoxSaleType" - width="170"> + width="170" + tool_tip="Select whether purchaser will receive a copy, copy of the content or item itself." > <combo_box.item name="Copy" label="Copy" @@ -452,7 +459,8 @@ min_val="0" height="23" max_val="999999999" - top_pad="10"/> + top_pad="10" + tool_tip="Object cost." /> </panel> </scroll_container> diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml index efedb9559ef11d0654f9deb802c1db62365b6180..8a3e18707fc03a265b42f6a9ecafb2b2418bbfbf 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml @@ -130,7 +130,8 @@ max_length_bytes="63" name="Object Name" top_delta="0" - width="225" /> + width="225" + tool_tip="The name is limited to 63 characters. Longer prim names are cut short. Names can only consist of printable characters found in the ASCII-7 (non-extended) character set, with the exception of the vertical bar/pipe '|'." /> <text type="string" length="1" @@ -154,7 +155,8 @@ left_delta="78" max_length_bytes="127" top_delta="-5" - width="225"/> + width="225" + tool_tip="When people have 'Hover Tips on All Objects' selected in the viewer's settings, they'll see the object description pop-up for any object under their mouse pointer. The prim description is limited to 127 bytes any string longer then that will be truncated." /> <text type="string" length="1" @@ -271,23 +273,24 @@ layout="topleft" name="clickaction" width="168" - left="81"> + left="81" + tool_tip="A click action enables you to interact with an object with a single left click. Each click action has a special cursor indicating what it does. Some click actions have requirements to function. For example Touch and Pay require scripts" > <combo_box.item label="Touch (default)" name="Touch/grab(default)" - value="Touch" /> + value="Touch" /> <combo_box.item label="Sit on object" name="Sitonobject" - value="Sit" /> + value="Sit" /> <combo_box.item label="Buy object" name="Buyobject" - value="Buy" /> + value="Buy" /> <combo_box.item label="Pay object" name="Payobject" - value="Pay" /> + value="Pay" /> <combo_box.item label="Open" name="Open" @@ -344,6 +347,7 @@ layout="topleft" left_pad="0" name="checkbox allow everyone copy" + tool_tip="Anyone can take a copy of the object. Object and all of its contents must be copy and transfer permissive." top_delta="-2" width="90" /> <check_box @@ -351,6 +355,7 @@ label="Move" layout="topleft" name="checkbox allow everyone move" + tool_tip="Anyone can move the object." left_pad="0" width="150" /> <text @@ -394,6 +399,7 @@ left="20" top_pad="0" name="checkbox next owner can modify" + tool_tip="Next owner can edit properties like item name or scale of this object." width="90" /> <check_box height="18" @@ -401,6 +407,7 @@ layout="topleft" left_pad="0" name="checkbox next owner can copy" + tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied." width="90" /> <check_box height="18" @@ -418,14 +425,16 @@ left="20" name="checkbox for sale" top_pad="10" - width="100" /> + width="100" + tool_tip="Lets people buy this object, its content or it copy inworld for specified price." /> <combo_box height="23" left_pad="0" layout="topleft" follows="left|top" - name="sale type" - width="170"> + name="sale type" + width="170" + tool_tip="Select whether purchaser will receive a copy, copy of the content or item itself."> <combo_box.item name="Copy" label="Copy" @@ -452,7 +461,8 @@ width="150" min_val="1" height="20" - max_val="999999999" /> + max_val="999999999" + tool_tip="Object cost." /> <check_box height="20" width="110" @@ -569,7 +579,8 @@ left="5" name="open_btn" top="0" - width="73" /> + width="73" + tool_tip="Open to view the Object Contents." /> <button follows="bottom|left" height="23" @@ -578,7 +589,8 @@ left_pad="5" name="pay_btn" top="0" - width="73" /> + width="73" + tool_tip="Open Pay Window. Object must have pay script for this to work." /> <button follows="bottom|left" height="23" @@ -587,7 +599,8 @@ left_pad="5" name="buy_btn" top="0" - width="73" /> + width="73" + tool_tip="Open Buy Window. Requires the object to be set for sale." /> <button follows="bottom|left" height="23" @@ -596,7 +609,8 @@ left_pad="5" name="details_btn" top="0" - width="74" /> + width="74" + tool_tip="Open Inspect Object Window." /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index f5f4b4acab64ad46b2eed27a0b5bdf3cc373709f..c386cb94577370b93fa9aa7749406b3aa03c7918 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -57,6 +57,9 @@ Render quality: [RENDER_QUALITY] Advanced Lighting Model: [GPU_SHADERS] Texture memory: [TEXTURE_MEMORY]MB VFS (cache) creation time: [VFS_TIME] + </string> + <string name="AboutOSXHiDPI"> +HiDPI display mode: [HIDPI] </string> <string name="AboutLibs"> J2C Decoder Version: [J2C_VERSION] @@ -199,13 +202,7 @@ Please try logging in again in a minute.</string> <string name="SentToInvalidRegion">You were sent to an invalid region.</string> <string name="TestingDisconnect">Testing viewer disconnect</string> - <!-- SLShare: Facebook, Flickr, and Twitter --> - <string name="SocialFacebookConnecting">Connecting to Facebook...</string> - <string name="SocialFacebookPosting">Posting...</string> - <string name="SocialFacebookDisconnecting">Disconnecting from Facebook...</string> - <string name="SocialFacebookErrorConnecting">Problem connecting to Facebook</string> - <string name="SocialFacebookErrorPosting">Problem posting to Facebook</string> - <string name="SocialFacebookErrorDisconnecting">Problem disconnecting from Facebook</string> + <!-- SLShare: Flickr and Twitter --> <string name="SocialFlickrConnecting">Connecting to Flickr...</string> <string name="SocialFlickrPosting">Posting...</string> <string name="SocialFlickrDisconnecting">Disconnecting from Flickr...</string> @@ -324,7 +321,7 @@ Please try logging in again in a minute.</string> <string name="ReleaseNotes">Release Notes</string> <!-- Always mark translate="false" for strings that are nothing but URLs, as they don't need translation. --> - <string name="RELEASE_NOTES_BASE_URL" translate="false">http://wiki.secondlife.com/wiki/Release_Notes/</string> + <string name="RELEASE_NOTES_BASE_URL" translate="false">https://releasenotes.secondlife.com/viewer/</string> <!-- Indicates something is being loaded. Maybe should be merged with RetrievingData --> <string name="LoadingData">Loading...</string> @@ -2209,6 +2206,7 @@ For AI Character: Get the closest navigable point to the point provided. <string name="skirt">Skirt</string> <string name="alpha">Alpha</string> <string name="tattoo">Tattoo</string> + <string name="universal">Universal</string> <string name="physics">Physics</string> <string name="invalid">invalid</string> <string name="none">none</string> @@ -2225,6 +2223,7 @@ For AI Character: Get the closest navigable point to the point provided. <string name="skirt_not_worn">Skirt not worn</string> <string name="alpha_not_worn">Alpha not worn</string> <string name="tattoo_not_worn">Tattoo not worn</string> + <string name="universal_not_worn">Universal not worn</string> <string name="physics_not_worn">Physics not worn</string> <string name="invalid_not_worn">invalid</string> @@ -2244,6 +2243,7 @@ For AI Character: Get the closest navigable point to the point provided. <string name="create_new_skirt">Create new skirt</string> <string name="create_new_alpha">Create new alpha</string> <string name="create_new_tattoo">Create new tattoo</string> + <string name="create_new_universal">Create new universal</string> <string name="create_new_physics">Create new physics</string> <string name="create_new_invalid">invalid</string> @@ -2299,6 +2299,9 @@ For AI Character: Get the closest navigable point to the point provided. <string name="MarketplaceURL_Dashboard">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard</string> <string name="MarketplaceURL_Imports">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports</string> <string name="MarketplaceURL_LearnMore">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more</string> + <string name="InventoryPlayAnimationTooltip">Open window with Play options.</string> + <string name="InventoryPlayGestureTooltip">Execute selected gesture in-world.</string> + <string name="InventoryPlaySoundTooltip">Open window with Play options.</string> <string name="InventoryOutboxNotMerchantTitle">Anyone can sell items on the Marketplace.</string> <string name="InventoryOutboxNotMerchantTooltip"></string> <string name="InventoryOutboxNotMerchant"> @@ -2658,6 +2661,10 @@ If you continue to receive this message, please contact Second Life support for <string name="RegionInfoBannedResidents">Always banned: ([BANNEDAGENTS], max [MAXBANNED])</string> <string name="RegionInfoListTypeAllowedAgents">Always allowed</string> <string name="RegionInfoListTypeBannedAgents">Always banned</string> + <string name="RegionInfoAllEstates">all estates</string> + <string name="RegionInfoManagedEstates">managed estates</string> + <string name="RegionInfoThisEstate">this estate</string> + <string name="AndNMore">and [EXTRA_COUNT] more</string> <!-- script limits floater --> <string name="ScriptLimitsParcelScriptMemory">Parcel Script Memory</string> @@ -2675,14 +2682,14 @@ If you continue to receive this message, please contact Second Life support for <string name="SITTING_ON">Sitting On</string> <string name="ATTACH_CHEST">Chest</string> - <string name="ATTACH_HEAD">Head</string> + <string name="ATTACH_HEAD">Skull</string> <string name="ATTACH_LSHOULDER">Left Shoulder</string> <string name="ATTACH_RSHOULDER">Right Shoulder</string> <string name="ATTACH_LHAND">Left Hand</string> <string name="ATTACH_RHAND">Right Hand</string> <string name="ATTACH_LFOOT">Left Foot</string> <string name="ATTACH_RFOOT">Right Foot</string> - <string name="ATTACH_BACK">Back</string> + <string name="ATTACH_BACK">Spine</string> <string name="ATTACH_PELVIS">Pelvis</string> <string name="ATTACH_MOUTH">Mouth</string> <string name="ATTACH_CHIN">Chin</string> @@ -2692,16 +2699,16 @@ If you continue to receive this message, please contact Second Life support for <string name="ATTACH_REYE">Right Eye</string> <string name="ATTACH_NOSE">Nose</string> <string name="ATTACH_RUARM">Right Upper Arm</string> - <string name="ATTACH_RLARM">Right Lower Arm</string> + <string name="ATTACH_RLARM">Right Forearm</string> <string name="ATTACH_LUARM">Left Upper Arm</string> - <string name="ATTACH_LLARM">Left Lower Arm</string> + <string name="ATTACH_LLARM">Left Forearm</string> <string name="ATTACH_RHIP">Right Hip</string> <string name="ATTACH_RULEG">Right Upper Leg</string> <string name="ATTACH_RLLEG">Right Lower Leg</string> <string name="ATTACH_LHIP">Left Hip</string> <string name="ATTACH_LULEG">Left Upper Leg</string> <string name="ATTACH_LLLEG">Left Lower Leg</string> - <string name="ATTACH_BELLY">Belly</string> + <string name="ATTACH_BELLY">Stomach</string> <string name="ATTACH_LEFT_PEC">Left Pec</string> <string name="ATTACH_RIGHT_PEC">Right Pec</string> <string name="ATTACH_HUD_CENTER_2">HUD Center 2</string> @@ -3646,9 +3653,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. Drag items from inventory here </string> - <string name="facebook_post_success"> - You posted to Facebook. - </string> <string name="flickr_post_success"> You posted to Flickr. </string> @@ -3805,6 +3809,7 @@ Abuse Report</string> <string name="New Skirt">New Skirt</string> <string name="New Alpha">New Alpha</string> <string name="New Tattoo">New Tattoo</string> + <string name="New Universal">New Universal</string> <string name="New Physics">New Physics</string> <string name="Invalid Wearable">Invalid Wearable</string> <string name="New Gesture">New Gesture</string> @@ -3935,7 +3940,7 @@ Please check http://status.secondlifegrid.net to see if there is a known problem <string name="EmptyOutfitText">There are no items in this outfit</string> <!-- External editor status codes --> - <string name="ExternalEditorNotSet">Select an editor using the ExternalEditor setting.</string> + <string name="ExternalEditorNotSet">Select an editor by setting the environment variable LL_SCRIPT_EDITOR or the ExternalEditor setting.</string> <string name="ExternalEditorNotFound">Cannot find the external editor you specified. Try enclosing path to the editor with double quotes. (e.g. "/path to my/editor" "%s")</string> @@ -4080,7 +4085,6 @@ Try enclosing path to the editor with double quotes. <string name="Command_Conversations_Label">Conversations</string> <string name="Command_Compass_Label">Compass</string> <string name="Command_Destinations_Label">Destinations</string> - <string name="Command_Facebook_Label">Facebook</string> <string name="Command_Flickr_Label">Flickr</string> <string name="Command_Gestures_Label">Gestures</string> <string name="Command_Grid_Status_Label">Grid status</string> @@ -4113,7 +4117,6 @@ Try enclosing path to the editor with double quotes. <string name="Command_Conversations_Tooltip">Converse with everyone</string> <string name="Command_Compass_Tooltip">Compass</string> <string name="Command_Destinations_Tooltip">Destinations of interest</string> - <string name="Command_Facebook_Tooltip">Post to Facebook</string> <string name="Command_Flickr_Tooltip">Upload to Flickr</string> <string name="Command_Gestures_Tooltip">Gestures for your avatar</string> <string name="Command_Grid_Status_Tooltip">Show current Grid status</string> @@ -4233,4 +4236,29 @@ Try enclosing path to the editor with double quotes. The physics shape does not have correct version. Set the correct version for the physics model. </string> + <!-- CURL error messages --> + <string name="couldnt_resolve_host"> +DNS could not resolve the host name([HOSTNAME]). +Please verify that you can connect to the www.secondlife.com +web site. If you can, but continue to receive this error, +please go to the support section and report this problem. + </string> + <string name="ssl_peer_certificate"> +The login server couldn't verify itself via SSL. +If you continue to receive this error, please go +to the Support section of the SecondLife.com web site +and report the problem. + </string> + <string name="ssl_connect_error"> +Often this means that your computer's clock is set incorrectly. +Please go to Control Panels and make sure the time and date +are set correctly. +Also check that your network and firewall are set up correctly. +If you continue to receive this error, please go +to the Support section of the SecondLife.com web site +and report the problem. + +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Knowledge Base] + </string> + </strings> diff --git a/indra/newview/skins/default/xui/en/widgets/person_view.xml b/indra/newview/skins/default/xui/en/widgets/person_view.xml index 46c1b7ff75f2807041d70325accc847198427ad7..bfe6941a8a8b96fbe25c961b25e9b8d384800bef 100644 --- a/indra/newview/skins/default/xui/en/widgets/person_view.xml +++ b/indra/newview/skins/default/xui/en/widgets/person_view.xml @@ -13,16 +13,6 @@ text_pad_right="4" arrow_size="10" max_folder_item_overlap="2"> - <facebook_icon - follows="left" - height="14" - image_name="Facebook_Icon" - left="5" - bottom="6" - name="facebook_icon" - tool_tip="Facebook User" - visible="false" - width="14" /> <avatar_icon follows="left" layout="topleft" diff --git a/indra/newview/skins/default/xui/es/floater_auction.xml b/indra/newview/skins/default/xui/es/floater_auction.xml index 6faf19dbb570d83830305500ca0904e38d156b65..cbafe92cdfa1ca46d034f88229c2684f3001559d 100644 --- a/indra/newview/skins/default/xui/es/floater_auction.xml +++ b/indra/newview/skins/default/xui/es/floater_auction.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_auction" title="COMENZAR LA VENTA DE TERRENO LINDEN"> <floater.string name="already for sale"> - No puede subastar parcelas que ya están en venta. + No puedes ofertar en parcelas que ya están en venta. </floater.string> - <check_box initial_value="true" label="Incluir la valla amarilla de selección" name="fence_check"/> + <check_box initial_value="true" label="Incluir la cerca de selección amarilla" name="fence_check"/> <button label="Foto" label_selected="Foto" name="snapshot_btn"/> <button label="Vender a cualquiera" label_selected="Vender a cualquiera" name="sell_to_anyone_btn"/> - <button label="Limpiar las configuraciones" label_selected="Limpiar las configuraciones" name="reset_parcel_btn"/> + <button label="Borrar las configuraciones" label_selected="Borrar las configuraciones" name="reset_parcel_btn"/> <button label="Comenzar subasta" label_selected="Comenzar subasta" name="start_auction_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_bulk_perms.xml b/indra/newview/skins/default/xui/es/floater_bulk_perms.xml index 5cd8b3c01f76c0dc7cbd96581f4fc0b5de50668b..75e324c7efe354de69adb5fbd2a62e78ac0579cb 100644 --- a/indra/newview/skins/default/xui/es/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/es/floater_bulk_perms.xml @@ -38,17 +38,17 @@ <text name="GroupLabel"> Grupo: </text> - <check_box label="Compartir" name="share_with_group"/> + <check_box label="Compartir" name="share_with_group" tool_tip="Permite que todos los miembros del grupo compartan tus permisos de modificación de este objeto. Debes transferirlo para activar las restricciones según los roles."/> <text name="AnyoneLabel"> Cualquiera: </text> - <check_box label="Copiarlo" name="everyone_copy"/> + <check_box label="Copiarlo" name="everyone_copy" tool_tip="Todos pueden tomar una copia del objeto. El objeto y todos sus contenidos deben tener un permiso para copiar y transferir."/> <text name="NextOwnerLabel"> Próximo propietario: </text> - <check_box label="Modificarlo" name="next_owner_modify"/> - <check_box label="Copiarlo" name="next_owner_copy"/> - <check_box initial_value="true" label="Transferirlo" name="next_owner_transfer" tool_tip="El próximo propietario puede dar o revender este objeto"/> + <check_box label="Modificarlo" name="next_owner_modify" tool_tip="El próximo propietario puede editar ciertas propiedades como el nombre o la escala del objeto."/> + <check_box label="Copiarlo" name="next_owner_copy" tool_tip="El próximo propietario puede realizar copias ilimitadas de este objeto. Las copias mantienen la información del creador y nunca pueden ser más permisivas que el objeto que se está copiando."/> + <check_box initial_value="true" label="Transferirlo" name="next_owner_transfer" tool_tip="El próximo propietario puede dar o revender este objeto."/> <button label="OK" name="ok"/> <button label="Aplicar" name="apply"/> <button label="Cancelar" name="close"/> diff --git a/indra/newview/skins/default/xui/es/floater_my_scripts.xml b/indra/newview/skins/default/xui/es/floater_my_scripts.xml new file mode 100644 index 0000000000000000000000000000000000000000..92711c5ea6391750039bb188e379a2e890acde39 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_my_scripts.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="myscripts" title="Mis Scripts"/> diff --git a/indra/newview/skins/default/xui/es/floater_preferences.xml b/indra/newview/skins/default/xui/es/floater_preferences.xml index edd0824e5799a7fd10b83aea811c52e3f347099c..70eb5a193e164d77ac3c7ecc35dda3eb94e7395d 100644 --- a/indra/newview/skins/default/xui/es/floater_preferences.xml +++ b/indra/newview/skins/default/xui/es/floater_preferences.xml @@ -5,6 +5,9 @@ </floater.string> <button label="OK" label_selected="OK" name="OK"/> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> + <panel name="search_panel"> + <search_editor label="Parámetros de Búsqueda" name="search_prefs_edit" tool_tip="Ingresa el término de búsqueda que te interesa aquÃ. Los resultados aparecerán para coincidencias parciales de texto completo en el nombre o comentario del parámetro."/> + </panel> <tab_container name="pref core"> <panel label="General" name="general"/> <panel label="Gráficos" name="display"/> diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml index d95b2e41afebea01b85291321bfa710acf90ce85..6fce98472d1d5715a76f457dfdd3256e86c2180b 100644 --- a/indra/newview/skins/default/xui/es/floater_tools.xml +++ b/indra/newview/skins/default/xui/es/floater_tools.xml @@ -152,9 +152,11 @@ <text name="Name:"> Nombre: </text> + <line_editor name="Object Name" tool_tip="El nombre está limitado a 63 caracteres. Los nombres de prim más largos deberán abreviarse. Los nombres solo pueden tener caracteres imprimibles que formen parte del código de caracteres ASCII-7 (no extendido), exceptuando la barra vertical «|»."/> <text name="Description:"> Descripción: </text> + <line_editor name="Object Description" tool_tip="Cuando la opción «Mostrar Consejos al pasar el cursor en Todos los objetos» en los parámetros del visor esté seleccionada, cada vez que coloques el cursor del mouse sobre un objeto aparecerá su descripción. La descripción del prim está limitada a 127 bytes, cualquier string más larga quedará recortada."/> <text name="Creator:"> Creador: </text> @@ -171,17 +173,18 @@ <text name="label click action"> Al tocarlo: </text> - <combo_box name="clickaction"> + <combo_box name="clickaction" tool_tip="Si haces clic izquierdo podrás interactuar con un objeto. Cada vez que hagas clic aparecerá un cursor indicando en qué consiste. Algunas acciones de clic tienen ciertos requerimientos para poder funcionar. Por ejemplo Tocar y Pagar requiere scripts"> <combo_box.item label="Tocarlo (por defecto)" name="Touch/grab(default)"/> <combo_box.item label="Sentarse en el objeto" name="Sitonobject"/> <combo_box.item label="Comprar el objeto" name="Buyobject"/> <combo_box.item label="Pagar al objeto" name="Payobject"/> <combo_box.item label="Abrirlo" name="Open"/> <combo_box.item label="Zoom" name="Zoom"/> + <combo_box.item label="Ninguno" name="None"/> </combo_box> - <check_box label="En venta:" name="checkbox for sale"/> - <spinner label="L$" name="Edit Cost"/> - <combo_box name="sale type"> + <check_box label="En venta:" name="checkbox for sale" tool_tip="Permite a las personas comprar este objeto, su contenido o su copia en el mundo virtual al precio indicado."/> + <spinner label="L$" name="Edit Cost" tool_tip="Precio del objeto."/> + <combo_box name="sale type" tool_tip="Selecciona si el comprador recibirá una copia, una copia del contenido o el objeto propiamente dicho."> <combo_box.item label="Copia" name="Copy"/> <combo_box.item label="Contenidos" name="Contents"/> <combo_box.item label="Original" name="Original"/> @@ -194,14 +197,14 @@ <text name="Anyone can:"> Cualquiera: </text> - <check_box label="Moverlo" name="checkbox allow everyone move"/> - <check_box label="Copiarlo" name="checkbox allow everyone copy"/> + <check_box label="Moverlo" name="checkbox allow everyone move" tool_tip="Todos pueden mover el objeto."/> + <check_box label="Copiarlo" name="checkbox allow everyone copy" tool_tip="Todos pueden tomar una copia del objeto. El objeto y todos sus contenidos deben tener un permiso para copiar y transferir."/> <text name="Next owner can:"> Próximo propietario: </text> - <check_box label="Modificarlo" name="checkbox next owner can modify"/> - <check_box label="Copiarlo" left_delta="80" name="checkbox next owner can copy"/> - <check_box label="Transferirlo" left_delta="67" name="checkbox next owner can transfer" tool_tip="El próximo propietario puede dar o revender este objeto"/> + <check_box label="Modificarlo" name="checkbox next owner can modify" tool_tip="El próximo propietario puede editar ciertas propiedades como el nombre o la escala del objeto."/> + <check_box label="Copiarlo" left_delta="80" name="checkbox next owner can copy" tool_tip="El próximo propietario puede realizar copias ilimitadas de este objeto. Las copias mantienen la información del creador y nunca pueden ser más permisivas que el objeto que se está copiando."/> + <check_box label="Transferirlo" left_delta="67" name="checkbox next owner can transfer" tool_tip="El próximo propietario puede dar o revender este objeto."/> <text name="B:"> B: </text> diff --git a/indra/newview/skins/default/xui/es/floater_top_objects.xml b/indra/newview/skins/default/xui/es/floater_top_objects.xml index 4eaa552fda1bffba955bd3070f4fdb85bc97c78b..4f5d551eefbc8447086e74287a27bffa766867cc 100644 --- a/indra/newview/skins/default/xui/es/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/es/floater_top_objects.xml @@ -4,7 +4,7 @@ Scripts según su uso </floater.string> <floater.string name="top_scripts_text"> - [COUNT] scripts con un total de [TIME] ms + Scripts [COUNT] que toman un total de [TIME] ms y usan [MEMORY] KB </floater.string> <floater.string name="scripts_score_label"> Tiempo diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml index beb6c76c273410bade53efcea54274835b324037..7cc3c0320a7780de114b4cff9caa03690da400cf 100644 --- a/indra/newview/skins/default/xui/es/menu_viewer.xml +++ b/indra/newview/skins/default/xui/es/menu_viewer.xml @@ -9,9 +9,11 @@ <menu_item_call label="Lugares..." name="Places"/> <menu_item_call label="Destacados..." name="Picks"/> <menu_item_call label="Experiencias..." name="Experiences"/> + <menu_item_call label="Mis Scripts..." name="MyScripts"/> <menu_item_call label="Controles de la cámara..." name="Camera Controls"/> <menu label="Movimiento" name="Movement"> <menu_item_call label="Sentarte" name="Sit Down Here"/> + <menu_item_call label="Levantarme" name="Stand up"/> <menu_item_check label="Volar" name="Fly"/> <menu_item_check label="Correr siempre" name="Always Run"/> <menu_item_call label="Parar mis animaciones" name="Stop Animating My Avatar"/> diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 18703761ec0a803d86c49cca4b5e8120b0979dd5..eac09b767b6e070fe3c091e50a19f56818628179 100644 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -243,6 +243,10 @@ La inicialización del mercado ha fallado por un error del sistema o de la red. Nota: Al activar esta opción, cualquiera que utilice este ordenador podrá ver tu lista de lugares favoritos. <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="AllowMultipleViewers"> + No es posible ejecutar varios visores Second Life ya que esta funcionalidad no es compatible. Puede provocar problemas de caché en la textura, imágenes degradadas o alteradas y un bajo rendimiento. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="GrantModifyRights"> Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar, borrar o tomar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso. ¿Quieres conceder permisos de modificación a [NAME]? @@ -713,8 +717,9 @@ La calidad gráfica puede ajustarse en Preferencias > Gráficos. No tienes permiso para modificar el terreno de la parcela [PARCEL]. </notification> <notification name="CannotCopyWarning"> - No tienes permiso para copiar los elementos siguientes: -[ITEMS] y, si los das, los perderás del inventario. ¿Seguro que quieres ofrecerlos? + No tienes permiso para copiar los elementos siguientes: +<nolink>[ITEMS]</nolink> +y, si los das, los perderás del inventario. ¿Seguro que quieres ofrecerlos? <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> </notification> <notification name="CannotGiveItem"> @@ -1574,6 +1579,30 @@ Se superan en [NUM_EXCESS] los [MAX_AGENTS] permitidos en [LIST_TYPE]. <notification name="ProblemAddingEstateManagerBanned"> No se puede añadir un residente expulsado a la lista de administradores de estado. </notification> + <notification name="ProblemBanningEstateManager"> + No fue posible agregar al administrador de estado [AGENT] a la lista de prohibidos. + </notification> + <notification name="GroupIsAlreadyInList"> + <nolink>[GROUP]</nolink> ya está en la lista de Grupos autorizados. + </notification> + <notification name="AgentIsAlreadyInList"> + [AGENT] ya está en tu lista [LIST_TYPE]. + </notification> + <notification name="AgentsAreAlreadyInList"> + [AGENT] ya está en tu lista [LIST_TYPE]. + </notification> + <notification name="AgentWasAddedToList"> + [AGENT] fue añadido a la lista [LIST_TYPE] de [ESTATE]. + </notification> + <notification name="AgentsWereAddedToList"> + [AGENT] fueron añadidos a la lista [LIST_TYPE] de [ESTATE]. + </notification> + <notification name="AgentWasRemovedFromList"> + [AGENT] fue eliminado de la lista [LIST_TYPE] de [ESTATE]. + </notification> + <notification name="AgentsWereRemovedFromList"> + [AGENT] fueron eliminados de la lista [LIST_TYPE] de [ESTATE]. + </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> No puedes cambiar la apariencia hasta que no se carguen la ropa y la forma. </notification> @@ -1589,9 +1618,25 @@ Por favor, pon en venta el objeto y vuelve a intentarlo. [DOWNLOAD_PATH]. </notification> <notification name="RequiredUpdate"> - La versión [VERSION] es necesaria para iniciar sesión. Esto deberÃa haber sido actualizado, pero parece que no fue asÃ. Por favor, descarga desde https://secondlife.com/support/downloads/ + La versión [VERSION] es necesaria para iniciar sesión. +Por favor, realiza la descarga desde https://secondlife.com/support/downloads/ <usetemplate name="okbutton" yestext="Aceptar"/> </notification> + <notification name="PauseForUpdate"> + La versión [VERSION] es necesaria para iniciar sesión. +Haz clic en OK para descargar e instalar. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="OptionalUpdateReady"> + La versión [VERSION] ha sido descargada y está lista para instalar. +Haz clic en OK para instalar. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PromptOptionalUpdate"> + La versión [VERSION] ha sido descargada y está lista para instalar. +¿Deseas continuar? + <usetemplate canceltext="Ahora no" name="yesnocancelbuttons" notext="Saltear" yestext="Instalar"/> + </notification> <notification name="LoginFailedUnknown"> Lo sentimos, error en el inicio de sesión, motivo desconocido. Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE]. <usetemplate name="okbutton" yestext="Salir"/> @@ -1876,7 +1921,7 @@ Se cambiarán miles de regiones, y se provocará un colapso en el espacio del se <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/> </notification> <notification label="Seleccionar el estado" name="EstateBannedAgentRemove"> - ¿Quitar de la lista de prohibición de acceso a este residente para que acceda sólo a este estado o a [ALL_ESTATES]? + ¿Quitar a este Residente de la lista de acceso prohibido para este estado únicamente o para [ALL_ESTATES]? <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todos los estados" yestext="Este estado"/> </notification> <notification label="Seleccionar el estado" name="EstateManagerAdd"> @@ -3054,15 +3099,6 @@ No autorices el acceso a tu cuenta si no conoces cuál es la razón exacta. <button name="Deny" text="Denegar"/> </form> </notification> - <notification name="UnknownScriptQuestion"> - '<nolink>[OBJECTNAME]</nolink>', un objeto propiedad de '[NAME]', ha solicitado un permiso de script en tiempo de ejecución que el visor no reconoce ni puede conceder. - -Para obtener el permiso, descárgate aquà la última versión: [DOWNLOADURL]. - <form name="form"> - <button name="Deny" text="Aceptar"/> - <button name="Mute" text="Ignorar"/> - </form> - </notification> <notification name="ScriptDialog"> '<nolink>[TITLE]</nolink>' de [NAME] [MESSAGE] @@ -3160,16 +3196,22 @@ Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar a Fallo al conectar a [VOICE_CHANNEL_NAME]; por favor, inténtalo más tarde. Vas a ser reconectado al chat de voz. </notification> <notification name="VoiceEffectsExpired"> - Una o más de las transformaciones de voz a las que estás suscrito han caducado. -[Pulsa aquà [URL]] para renovar la suscripción. + Una o más de las transformaciones de voz a las que estás suscrito han caducado. +[[URL] Pulsa aquÃ] para renovar la suscripción. + +Si eres un miembro Premium [[PREMIUM_URL] pulsa aquÃ] para recibir tu beneficio de transformación de voz. </notification> <notification name="VoiceEffectsExpiredInUse"> - La transformación de voz activa ha caducado y se ha aplicado tu configuración de voz normal. -[Pulsa aquà [URL]] para renovar la suscripción. + La transformación de voz activa ha caducado y se ha aplicado tu configuración de voz normal. +[[URL] Pulsa aquÃ] para renovar la suscripción. + +Si eres un miembro Premium [[PREMIUM_URL] pulsa aquÃ] para recibir tu beneficio de transformación de voz. </notification> <notification name="VoiceEffectsWillExpire"> - Una o más de tus transformaciones de voz caducarán en menos de [INTERVAL] dÃas. -[Pulsa aquà [URL]] para renovar la suscripción. + Una o más de tus transformaciones de voz caducarán en menos de [INTERVAL] dÃas. +[[URL] Pulsa aquÃ] para renovar la suscripción + +Si eres un miembro Premium [[PREMIUM_URL] pulsa aquÃ] para recibir tu beneficio de transformación de voz. </notification> <notification name="VoiceEffectsNew"> Están disponibles nuevas transformaciones de voz. @@ -3221,6 +3263,9 @@ Por tu seguridad, serán bloqueadas durante unos segundos. <notification name="SnapshotToComputerFailed"> Error al guardar la foto en [PATH]: Disco lleno. Se requieren [NEED_MEMORY]KB pero solo hay [FREE_MEMORY]KB libres. </notification> + <notification name="SnapshotToLocalDirNotExist"> + Error al guardar la foto en [PATH]: El directorio no existe. + </notification> <notification name="PresetNotSaved"> Error al guardar el valor predefinido [NAME]. </notification> @@ -3708,13 +3753,13 @@ no está en la misma región que tú. No puedes crear árboles y hierba en un terreno que no es tuyo. </notification> <notification name="NoCopyPermsNoObject"> - Error al copiar: careces de permiso para copiar el objeto '[OBJ_NAME]'. + Error al copiar porque no tienes permiso para copiar el objeto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoTransPermsNoObject"> - Error al copiar: no se te puede transferir el objeto '[OBJ_NAME]'. + Error al copiar porque no puedes recibir una transferencia del objeto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="AddToNavMeshNoCopy"> - Error al copiar porque el objeto '[OBJ_NAME]' contribuye al navmesh. + Error al copiar porque el objeto <nolink>'[OBJ_NAME]'</nolink> contribuye a navmesh. </notification> <notification name="DupeWithNoRootsSelected"> Duplicación sin objetos raÃz seleccionados. @@ -3759,34 +3804,34 @@ Prueba otra vez dentro de un minuto. Se ha deshabilitado Devolver el objeto a mi inventario. </notification> <notification name="NoExistNoSaveToContents"> - No se puede guardar '[OBJ_NAME]' en el contenido del objeto porque el objeto desde el cual ha sido colocado ya no existe. + No se puede guardar <nolink>'[OBJ_NAME]'</nolink> en los contenidos del objeto porque el objeto a partir del cual fue creado ya no existe. </notification> <notification name="NoModNoSaveToContents"> - No se puede guardar '[OBJ_NAME]' en el contenido del objeto porque no tienes permiso para modificar el objeto '[DEST_NAME]'. + No se puede guardar <nolink>'[OBJ_NAME]'</nolink> en los contenidos del objeto porque no tienes permiso para modificar el objeto <nolink>'[DEST_NAME]'</nolink>. </notification> <notification name="NoSaveBackToInvDisabled"> - No se puede guardar '[OBJ_NAME]' de nuevo en el inventario; esta operación está desactivada. + No se puede volver a guardar <nolink>'[OBJ_NAME]'</nolink> en el inventario. Esta operación fue desactivada. </notification> <notification name="NoCopyNoSelCopy"> - No se puede copiar tu selección porque no tienes permiso para copiar el objeto '[OBJ_NAME]'. + No puedes copiar el elemento seleccionado porque no tienes permiso para copiar el objeto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoTransNoSelCopy"> - No se puede copiar tu selección porque el objeto '[OBJ_NAME]' es intransferible. + No puedes copiar el elemento seleccionado porque el objeto <nolink>'[OBJ_NAME]'</nolink> no es transferible. </notification> <notification name="NoTransNoCopy"> - No se puede copiar tu selección porque el objeto '[OBJ_NAME]' es intransferible. + No puedes copiar el elemento seleccionado porque el objeto <nolink>'[OBJ_NAME]'</nolink> no es transferible. </notification> <notification name="NoPermsNoRemoval"> - El sistema de permisos no admite la eliminación del objeto '[OBJ_NAME]' del simulador. + El sistema de permisos no autoriza quitar el objeto <nolink>'[OBJ_NAME]'</nolink> del simulador. </notification> <notification name="NoModNoSaveSelection"> - No se puede guardar tu selección porque no tienes permiso para modificar el objeto '[OBJ_NAME]'. + No puedes guardar el elemento seleccionado porque no tienes permiso para modificar el objeto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoCopyNoSaveSelection"> - No se puede guardar tu selección porque el objeto '[OBJ_NAME]' no se puede copiar. + No puedes guardar el elemento seleccionado porque el objeto <nolink>'[OBJ_NAME]'</nolink> no puede ser copiado. </notification> <notification name="NoModNoTaking"> - No se puede aceptar tu selección porque no tienes permiso para modificar el objeto '[OBJ_NAME]'. + No puedes tomar el elemento seleccionado porque no tienes permiso para modificar el objeto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="RezDestInternalError"> Error interno: tipo de destino desconocido. diff --git a/indra/newview/skins/default/xui/es/panel_login.xml b/indra/newview/skins/default/xui/es/panel_login.xml index 5300fce153171b3eccbd31263bae4863d9fcba26..f79d3b94222a1cfe2fa6b028d1c92b8348457c1a 100644 --- a/indra/newview/skins/default/xui/es/panel_login.xml +++ b/indra/newview/skins/default/xui/es/panel_login.xml @@ -1,6 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <panel name="panel_login"> - <panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=es</panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php?lang=es + </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="ui_stack"> <layout_panel name="ui_container"> <combo_box label="Nombre de usuario" name="username_combo" tool_tip="El nombre de usuario que elegiste al registrarte, como bobsmith12 o Steller Sunshine"/> @@ -11,8 +16,13 @@ </combo_box> <button label="Iniciar sesión" name="connect_btn"/> <check_box label="Recordarme" name="remember_check"/> - <text name="forgot_password_text">Contraseña olvidada</text> + <text name="forgot_password_text"> + Contraseña olvidada + </text> <combo_box label="Seleccionar cuadrÃcula" name="server_combo"/> + <text name="sign_up_text"> + RegÃstrate + </text> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_login_first.xml b/indra/newview/skins/default/xui/es/panel_login_first.xml index 7787c6526f13088b549b13ebd80fd965eeaeac4a..ccb685835191db3b6f4fdfdf5eb4eb33a0c21500 100644 --- a/indra/newview/skins/default/xui/es/panel_login_first.xml +++ b/indra/newview/skins/default/xui/es/panel_login_first.xml @@ -3,6 +3,9 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php?lang=es </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="logo_stack"> <layout_panel name="parent_panel2"> <layout_stack name="widget_stack"> @@ -14,6 +17,9 @@ <text name="forgot_password_text"> Contraseña olvidada </text> + <text name="sign_up_text"> + RegÃstrate + </text> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_general.xml b/indra/newview/skins/default/xui/es/panel_preferences_general.xml index 7d3c33a781ab6894a862b875b5ed7f1b79084aba..d2246630d86bbc03456e3655c15abf6091562eb0 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml @@ -4,7 +4,6 @@ Idioma: </text> <combo_box name="language_combobox"> - <combo_box.item label="Predeterminado del sistema" name="System Default Language"/> <combo_box.item label="English (Inglés)" name="English"/> <combo_box.item label="Dansk (danés) - Beta" name="Danish"/> <combo_box.item label="Deutsch (Alemán) - Beta" name="Deutsch(German)"/> diff --git a/indra/newview/skins/default/xui/es/panel_region_access.xml b/indra/newview/skins/default/xui/es/panel_region_access.xml new file mode 100644 index 0000000000000000000000000000000000000000..3177aa2ab24f154053c60954b7be2ab030add4c6 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_region_access.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Acceso" name="Access"> + <tab_container name="tabs"> + <panel label="ADMINISTRADORES DE ESTADO" name="estate_managers_panel"> + <text name="estate_manager_label"> + Administradores de estado: + </text> + <name_list name="estate_manager_name_list"> + <columns label="Nombre" name="name"/> + </name_list> + <button label="Añadir..." name="add_estate_manager_btn"/> + <button label="Quitar..." name="remove_estate_manager_btn"/> + </panel> + <panel label="PERMITIDO" name="allowed_panel"> + <panel label="top_panel" name="allowed_search_panel"> + <filter_editor label="Buscar agentes autorizados" name="allowed_search_input"/> + </panel> + <text name="allow_resident_label"> + Siempre autorizado: + </text> + <name_list name="allowed_avatar_name_list"> + <columns label="Nombre" name="name"/> + </name_list> + <button label="Añadir..." name="add_allowed_avatar_btn"/> + <button label="Quitar..." name="remove_allowed_avatar_btn"/> + </panel> + <panel label="GRUPOS AUTORIZADOS:" name="allowed_groups_panel"> + <panel label="top_panel" name="allowed_group_search_panel"> + <filter_editor label="Buscar grupos autorizados" name="allowed_group_search_input"/> + </panel> + <text name="allow_group_label"> + Grupos siempre autorizados: + </text> + <name_list name="allowed_group_name_list"> + <columns label="Nombre" name="name"/> + </name_list> + <button label="Añadir..." name="add_allowed_group_btn"/> + <button label="Quitar..." name="remove_allowed_group_btn"/> + </panel> + <panel label="PROHIBIDO" name="banned_panel"> + <panel label="top_panel" name="banned_search_panel"> + <filter_editor label="Buscar agentes prohibidos" name="banned_search_input"/> + </panel> + <text name="ban_resident_label"> + Siempre prohibido: + </text> + <name_list name="banned_avatar_name_list"> + <columns label="Nombre" name="name"/> + <columns label="Última fecha de inicio de sesión" name="last_login_date"/> + <columns label="Fecha de prohibición" name="ban_date"/> + <columns label="Prohibido por" name="bannedby"/> + </name_list> + <button label="Añadir..." name="add_banned_avatar_btn"/> + <button label="Quitar..." name="remove_banned_avatar_btn"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_region_estate.xml b/indra/newview/skins/default/xui/es/panel_region_estate.xml index 7e12b0e599f5d376aedd7fbe0effb0f911f24cbf..b3ee34bbfd228ef4c710e1cfddae49b6194c5b77 100644 --- a/indra/newview/skins/default/xui/es/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/es/panel_region_estate.xml @@ -16,7 +16,7 @@ (desconocido) </text> <radio_group name="externally_visible_radio"> - <radio_item label="Permitir únicamente a los residentes y grupos indicados a continuación" name="estate_restricted_access"/> + <radio_item label="Permitir únicamente a los residentes y grupos indicados en la pestaña Acceso" name="estate_restricted_access"/> <radio_item label="Cualquiera puede visitar" name="estate_public_access"/> </radio_group> <check_box label="Debe ser mayor de 18" name="limit_age_verified" tool_tip="Para poder acceder a este estado, los Residentes deben ser mayores de 18 años. Para más información, consulta [SUPPORT_SITE]."/> diff --git a/indra/newview/skins/default/xui/es/panel_status_bar.xml b/indra/newview/skins/default/xui/es/panel_status_bar.xml index 8aaa236475fee4626c99070a8be2b5e828cfe48b..bdedd04cc894a17b536ed676e67e1d93cbf1655d 100644 --- a/indra/newview/skins/default/xui/es/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/es/panel_status_bar.xml @@ -1,16 +1,31 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="status"> - <panel.string name="packet_loss_tooltip">Pérdida de paquetes</panel.string> - <panel.string name="bandwidth_tooltip">Ancho de banda</panel.string> - <panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string> - <panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string> - <panel.string name="buycurrencylabel">[AMT] L$</panel.string> + <panel.string name="packet_loss_tooltip"> + Pérdida de paquetes + </panel.string> + <panel.string name="bandwidth_tooltip"> + Ancho de banda + </panel.string> + <panel.string name="time"> + [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> + [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] + </panel.string> + <panel.string name="buycurrencylabel"> + [AMT] L$ + </panel.string> + <panel name="menu_search_panel"> + <search_editor label="Menús de Búsqueda" name="search_menu_edit" tool_tip="Ingresa el término de búsqueda que te interesa aquÃ. Los resultados aparecerán para coincidencias parciales de texto completo en el menú."/> + </panel> <panel left="-431" name="balance_bg" width="200"> <text name="balance" tool_tip="Haz clic para actualizar tu saldo en L$" value="L$??"/> <button label="Comprar L$" name="buyL" tool_tip="Pulsa para comprar más L$"/> <button label="Comprar" name="goShop" tool_tip="Abrir el mercado de Second Life" width="80"/> </panel> - <text name="TimeText" tool_tip="Hora actual (PacÃfico)">24:00 AM PST</text> + <text name="TimeText" tool_tip="Hora actual (PacÃfico)"> + 24:00 AM PST + </text> <button name="media_toggle_btn" tool_tip="Iniciar/Parar todos los media (música, vÃdeo, páginas web)"/> <button name="volume_btn" tool_tip="Control general del volumen"/> </panel> diff --git a/indra/newview/skins/default/xui/es/sidepanel_item_info.xml b/indra/newview/skins/default/xui/es/sidepanel_item_info.xml index 8132bbdb1bfba73c4256dbd27dff336a3addf4ff..0734e9c4175bb17098ad09291b1d335ed104b609 100644 --- a/indra/newview/skins/default/xui/es/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/es/sidepanel_item_info.xml @@ -34,9 +34,11 @@ <text name="LabelItemNameTitle"> Nombre: </text> + <line_editor name="LabelItemName" tool_tip="El nombre está limitado a 63 caracteres. Los nombres de prim más largos deberán abreviarse. Los nombres solo pueden tener caracteres imprimibles que formen parte del código de caracteres ASCII-7 (no extendido), exceptuando la barra vertical «|»."/> <text name="LabelItemDescTitle"> Descripción: </text> + <line_editor name="LabelItemDesc" tool_tip="Cuando la opción «Mostrar Consejos al pasar el cursor en Todos los objetos» en los parámetros del visor esté seleccionada, cada vez que coloques el cursor del mouse sobre un objeto aparecerá su descripción. La descripción del prim está limitada a 127 bytes, cualquier string más larga quedará recortada."/> <text name="LabelCreatorTitle"> Creador: </text> @@ -59,7 +61,7 @@ <text name="AnyoneLabel"> Cualquiera: </text> - <check_box label="Copiar" name="CheckEveryoneCopy"/> + <check_box label="Copiar" name="CheckEveryoneCopy" tool_tip="Todos pueden tomar una copia del objeto. El objeto y todos sus contenidos deben tener un permiso para copiar y transferir."/> <text name="GroupLabel"> Grupo: </text> @@ -67,17 +69,17 @@ <text name="NextOwnerLabel"> Próximo propietario: </text> - <check_box label="Modificar" name="CheckNextOwnerModify"/> - <check_box label="Copiar" name="CheckNextOwnerCopy"/> - <check_box label="Transferir" name="CheckNextOwnerTransfer" tool_tip="El próximo propietario puede dar o revender este objeto"/> + <check_box label="Modificar" name="CheckNextOwnerModify" tool_tip="El próximo propietario puede editar ciertas propiedades como el nombre o la escala del objeto."/> + <check_box label="Copiar" name="CheckNextOwnerCopy" tool_tip="El próximo propietario puede realizar copias ilimitadas de este objeto. Las copias mantienen la información del creador y nunca pueden ser más permisivas que el objeto que se está copiando."/> + <check_box label="Transferir" name="CheckNextOwnerTransfer" tool_tip="El próximo propietario puede dar o revender este objeto."/> </panel> - <check_box label="En venta" name="CheckPurchase"/> - <combo_box name="ComboBoxSaleType"> + <check_box label="En venta" name="CheckPurchase" tool_tip="Permite a las personas comprar este objeto, su contenido o su copia en el mundo virtual al precio indicado."/> + <combo_box name="ComboBoxSaleType" tool_tip="Selecciona si el comprador recibirá una copia, una copia del contenido o el objeto propiamente dicho."> <combo_box.item label="Copiar" name="Copy"/> <combo_box.item label="Contenidos" name="Contents"/> <combo_box.item label="Original" name="Original"/> </combo_box> - <spinner label="Precio: L$" name="Edit Cost"/> + <spinner label="Precio: L$" name="Edit Cost" tool_tip="Precio del objeto."/> </panel> </scroll_container> <panel name="button_panel"> diff --git a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml index b9c8139f1615b1176632cd328127127af4985c43..3470416e61f442af9709aa4c37901881d17d6c89 100644 --- a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml @@ -1,71 +1,136 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="object properties" title="Perfil del objeto"> - <panel.string name="text deed continued">Transferir</panel.string> - <panel.string name="text deed">Transferir</panel.string> - <panel.string name="text modify info 1">Puedes modificar este objeto</panel.string> - <panel.string name="text modify info 2">Puedes modificar estos objetos</panel.string> - <panel.string name="text modify info 3">No puedes modificar este objeto</panel.string> - <panel.string name="text modify info 4">No puedes modificar estos objetos</panel.string> - <panel.string name="text modify info 5">No se puede modificar este objeto a través del lÃmite de una región</panel.string> - <panel.string name="text modify info 6">No se pueden modificar estos objetos a través del lÃmite de una región</panel.string> - <panel.string name="text modify warning">Este objeto tiene partes enlazadas</panel.string> - <panel.string name="Cost Default">Precio: L$</panel.string> - <panel.string name="Cost Total">Precio total: L$</panel.string> - <panel.string name="Cost Per Unit">Price Per: L$</panel.string> - <panel.string name="Cost Mixed">Mixed Price</panel.string> - <panel.string name="Sale Mixed">Mixed Sale</panel.string> + <panel.string name="text deed continued"> + Transferir + </panel.string> + <panel.string name="text deed"> + Transferir + </panel.string> + <panel.string name="text modify info 1"> + Puedes modificar este objeto + </panel.string> + <panel.string name="text modify info 2"> + Puedes modificar estos objetos + </panel.string> + <panel.string name="text modify info 3"> + No puedes modificar este objeto + </panel.string> + <panel.string name="text modify info 4"> + No puedes modificar estos objetos + </panel.string> + <panel.string name="text modify info 5"> + No se puede modificar este objeto a través del lÃmite de una región + </panel.string> + <panel.string name="text modify info 6"> + No se pueden modificar estos objetos a través del lÃmite de una región + </panel.string> + <panel.string name="text modify warning"> + Este objeto tiene partes enlazadas + </panel.string> + <panel.string name="Cost Default"> + Precio: L$ + </panel.string> + <panel.string name="Cost Total"> + Precio total: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Price Per: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Mixed Price + </panel.string> + <panel.string name="Sale Mixed"> + Mixed Sale + </panel.string> <text name="title" value="Perfil del objeto"/> <text name="where" value="(En el mundo)"/> <panel label="" name="properties_panel"> - <text name="Name:">Nombre:</text> - <text name="Description:">Descripción:</text> - <text name="CreatorNameLabel">Creador:</text> - <text name="Owner:">Propietario:</text> - <text name="Group_label">Grupo:</text> + <text name="Name:"> + Nombre: + </text> + <line_editor name="Object Name" tool_tip="El nombre está limitado a 63 caracteres. Los nombres de prim más largos deberán abreviarse. Los nombres solo pueden tener caracteres imprimibles que formen parte del código de caracteres ASCII-7 (no extendido), exceptuando la barra vertical «|»."/> + <text name="Description:"> + Descripción: + </text> + <line_editor name="Object Description" tool_tip="Cuando la opción «Mostrar Consejos al pasar el cursor en Todos los objetos» en los parámetros del visor esté seleccionada, cada vez que coloques el cursor del mouse sobre un objeto aparecerá su descripción. La descripción del prim está limitada a 127 bytes, cualquier string más larga quedará recortada."/> + <text name="CreatorNameLabel"> + Creador: + </text> + <text name="Owner:"> + Propietario: + </text> + <text name="Group_label"> + Grupo: + </text> <button name="button set group" tool_tip="Elige un grupo con el que compartir los permisos de este objeto"/> <name_box initial_value="Cargando..." name="Group Name Proxy"/> <button label="Transferir" label_selected="Transferir" name="button deed" tool_tip="La transferencia entrega este objeto con los permisos del próximo propietario. Los objetos compartidos por el grupo pueden ser transferidos por un oficial del grupo."/> - <text name="label click action">Pulsa para:</text> - <combo_box name="clickaction"> + <text name="label click action"> + Pulsa para: + </text> + <combo_box name="clickaction" tool_tip="Si haces clic izquierdo podrás interactuar con un objeto. Cada vez que hagas clic aparecerá un cursor indicando en qué consiste. Algunas acciones de clic tienen ciertos requerimientos para poder funcionar. Por ejemplo Tocar y Pagar requiere scripts"> <combo_box.item label="Tocarlo (por defecto)" name="Touch/grab(default)"/> <combo_box.item label="Sentarme en el objeto" name="Sitonobject"/> <combo_box.item label="Comprar el objeto" name="Buyobject"/> <combo_box.item label="Pagar el objeto" name="Payobject"/> <combo_box.item label="Abrir" name="Open"/> <combo_box.item label="Zoom" name="Zoom"/> + <combo_box.item label="Ninguno" name="None"/> </combo_box> <panel name="perms_inv"> - <text name="perm_modify">Puedes modificar este objeto</text> - <text name="Anyone can:">Cualquiera:</text> - <check_box label="Copiar" name="checkbox allow everyone copy"/> - <check_box label="Mover" name="checkbox allow everyone move"/> - <text name="GroupLabel">Grupo:</text> + <text name="perm_modify"> + Puedes modificar este objeto + </text> + <text name="Anyone can:"> + Cualquiera: + </text> + <check_box label="Copiar" name="checkbox allow everyone copy" tool_tip="Todos pueden tomar una copia del objeto. El objeto y todos sus contenidos deben tener un permiso para copiar y transferir."/> + <check_box label="Mover" name="checkbox allow everyone move" tool_tip="Todos pueden mover el objeto."/> + <text name="GroupLabel"> + Grupo: + </text> <check_box label="Compartir" name="checkbox share with group" tool_tip="Permite que todos los miembros del grupo compartan tus permisos de modificación de este objeto. Debes transferirlo para activar las restricciones según los roles."/> - <text name="NextOwnerLabel">Próximo propietario:</text> - <check_box label="Modificar" name="checkbox next owner can modify"/> - <check_box label="Copiar" name="checkbox next owner can copy"/> + <text name="NextOwnerLabel"> + Próximo propietario: + </text> + <check_box label="Modificar" name="checkbox next owner can modify" tool_tip="El próximo propietario puede editar ciertas propiedades como el nombre o la escala del objeto."/> + <check_box label="Copiar" name="checkbox next owner can copy" tool_tip="El próximo propietario puede realizar copias ilimitadas de este objeto. Las copias mantienen la información del creador y nunca pueden ser más permisivas que el objeto que se está copiando."/> <check_box label="Transferir" name="checkbox next owner can transfer" tool_tip="El próximo propietario puede dar o revender este objeto"/> </panel> - <check_box label="En venta" name="checkbox for sale"/> - <combo_box name="sale type"> + <check_box label="En venta" name="checkbox for sale" tool_tip="Permite a las personas comprar este objeto, su contenido o su copia en el mundo virtual al precio indicado."/> + <combo_box name="sale type" tool_tip="Selecciona si el comprador recibirá una copia, una copia del contenido o el objeto propiamente dicho."> <combo_box.item label="Copiar" name="Copy"/> <combo_box.item label="Contenidos" name="Contents"/> <combo_box.item label="Original" name="Original"/> </combo_box> - <spinner label="Precio: L$" name="Edit Cost"/> + <spinner label="Precio: L$" name="Edit Cost" tool_tip="Precio del objeto."/> <check_box label="Mostrar en la búsqueda" name="search_check" tool_tip="Permitir que la gente vea este objeto en los resultados de la búsqueda"/> - <text name="pathfinding_attributes_label">Atributos de pathfinding:</text> - <text name="B:">B:</text> - <text name="O:">O:</text> - <text name="G:">G:</text> - <text name="E:">E:</text> - <text name="N:">N:</text> - <text name="F:">F:</text> + <text name="pathfinding_attributes_label"> + Atributos de pathfinding: + </text> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> </panel> <panel name="button_panel"> - <button label="Abrir" name="open_btn"/> - <button label="Pagar" name="pay_btn"/> - <button label="Comprar" name="buy_btn"/> - <button label="Detalles" name="details_btn"/> + <button label="Abrir" name="open_btn" tool_tip="Abre para ver los Contenidos del Objeto."/> + <button label="Pagar" name="pay_btn" tool_tip="Abre la Ventana Comprar. Los objetos deben tener un script relativo al pago para que esto funcione."/> + <button label="Comprar" name="buy_btn" tool_tip="Abre la Ventana Comprar. El objeto debe estar a la venta."/> + <button label="Detalles" name="details_btn" tool_tip="Abre la Ventana Inspeccionar Objeto."/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 36a2711a5cabced46c723c6e6b538aa02dcc6d71..1b066756708ce930379adef2c08a621429431ae1 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -640,7 +640,7 @@ Intenta iniciar sesión de nuevo en unos instantes. Notas de la versión </string> <string name="RELEASE_NOTES_BASE_URL"> - http://wiki.secondlife.com/wiki/Release_Notes/ + https://releasenotes.secondlife.com/viewer/ </string> <string name="LoadingData"> Cargando... @@ -2205,6 +2205,18 @@ Si sigues recibiendo el mismo mensaje, solicita ayuda al personal de asistencia <string name="RegionInfoListTypeBannedAgents"> Siempre prohibido </string> + <string name="RegionInfoAllEstates"> + todos los estados + </string> + <string name="RegionInfoManagedEstates"> + estados administrados + </string> + <string name="RegionInfoThisEstate"> + este estado + </string> + <string name="AndNMore"> + y [EXTRA_COUNT] más + </string> <string name="ScriptLimitsParcelScriptMemory"> Memoria de los scripts de la parcela </string> @@ -2248,7 +2260,7 @@ Si sigues recibiendo el mismo mensaje, solicita ayuda al personal de asistencia Tórax </string> <string name="ATTACH_HEAD"> - Cabeza + Cráneo </string> <string name="ATTACH_LSHOULDER"> Hombro izquierdo @@ -2269,7 +2281,7 @@ Si sigues recibiendo el mismo mensaje, solicita ayuda al personal de asistencia Pie der. </string> <string name="ATTACH_BACK"> - Anterior + Columna </string> <string name="ATTACH_PELVIS"> Pelvis @@ -2299,13 +2311,13 @@ Si sigues recibiendo el mismo mensaje, solicita ayuda al personal de asistencia Brazo der. </string> <string name="ATTACH_RLARM"> - Antebrazo der. + Antebrazo derecho </string> <string name="ATTACH_LUARM"> Brazo izq. </string> <string name="ATTACH_LLARM"> - Antebrazo izq. + Antebrazo izquierdo </string> <string name="ATTACH_RHIP"> Cadera der. @@ -2326,7 +2338,7 @@ Si sigues recibiendo el mismo mensaje, solicita ayuda al personal de asistencia Pantorrilla izq. </string> <string name="ATTACH_BELLY"> - Vientre + Abdomen </string> <string name="ATTACH_LEFT_PEC"> Pectoral izquierdo @@ -5651,4 +5663,25 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas <string name="Mav_Details_MAV_UNKNOWN_VERSION"> La versión de la forma fÃsica no es correcta. Configura la versión correcta del modelo fÃsico. </string> + <string name="couldnt_resolve_host"> + Error de DNS al resolver el nombre del host([HOSTNAME]). +Por favor verifica si puedes conectarte al sitio web www.secondlife.com. +Si puedes conectarte, pero aún recibes este error, por favor accede a +la sección Soporte y genera un informe del problema. + </string> + <string name="ssl_peer_certificate"> + El servidor de inicio de sesión no pudo verificarse vÃa SSL. +Si aún recibes este error, por favor accede a +la sección Soporte del sitio web Secondlife.com +y genera un informe del problema. + </string> + <string name="ssl_connect_error"> + En general esto significa que el horario de tu computadora no está bien configurado. +Por favor accede al Panel de control y asegúrate de que la hora y la fecha estén +bien configurados. Verifica también que tu red y tu cortafuegos estén bien +configurados. Si aún recibes este error, por favor accede a la sección Soporte +del sitio web Secondlife.com y genera un informe del problema. + +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de conocimientos] + </string> </strings> diff --git a/indra/newview/skins/default/xui/fr/floater_auction.xml b/indra/newview/skins/default/xui/fr/floater_auction.xml index 6cef2a3591872ada1303487bc41203e3853c1b2e..b1bd2cdd2ff3223acde09d576eaf5bfeb1957035 100644 --- a/indra/newview/skins/default/xui/fr/floater_auction.xml +++ b/indra/newview/skins/default/xui/fr/floater_auction.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_auction" title="COMMENCER LA VENTE DE TERRAINS LINDEN"> +<floater name="floater_auction" title="COMMENCER LA VENTE DES TERRAINS LINDEN"> <floater.string name="already for sale"> Vous ne pouvez pas mettre aux enchères des parcelles déjà en vente. </floater.string> - <check_box initial_value="true" label="Inclure le marquage de sélection jaune" name="fence_check"/> - <button label="Capture d'écran" label_selected="Capture d'écran" name="snapshot_btn" width="110"/> - <button label="Vendre à n'importe qui" label_selected="Vendre à n'importe qui" name="sell_to_anyone_btn"/> + <check_box initial_value="true" label="Inclure la cloison jaune de sélection" name="fence_check"/> + <button label="Photo" label_selected="Photo" name="snapshot_btn" width="110"/> + <button label="Vendre à n’importe qui" label_selected="Vendre à n’importe qui" name="sell_to_anyone_btn"/> <button label="Effacer les paramètres" label_selected="Effacer les paramètres" name="reset_parcel_btn"/> <button label="Commencer les enchères" label_selected="Commencer les enchères" name="start_auction_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml b/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml index 7ee444175861897e7eb5e81d02126195791dd5d7..02b58f9b36028e6901f86da6258d45631bcbfedf 100644 --- a/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml @@ -38,17 +38,17 @@ <text name="GroupLabel"> Groupe : </text> - <check_box label="Partager" name="share_with_group"/> + <check_box label="Partager" name="share_with_group" tool_tip="Autoriser tous les membres du groupe choisi à partager vos droits de modification pour cet objet. Pour activer les restrictions de rôles, vous devez d'abord cliquer sur Autoriser."/> <text name="AnyoneLabel"> N'importe qui : </text> - <check_box label="Copier" name="everyone_copy"/> + <check_box label="Copier" name="everyone_copy" tool_tip="Tout le monde peut prendre une copie de l'objet. L'objet et tout son contenu doit être autorisé à être copié et transféré."/> <text name="NextOwnerLabel"> Prochain propr. : </text> - <check_box label="Modifier" name="next_owner_modify"/> - <check_box label="Copier" name="next_owner_copy"/> - <check_box initial_value="true" label="Transférer" name="next_owner_transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/> + <check_box label="Modifier" name="next_owner_modify" tool_tip="Le prochain propriétaire peut modifier des propriétés telles que le libellé de l'élément ou l'échelle de cet objet."/> + <check_box label="Copier" name="next_owner_copy" tool_tip="Le prochain propriétaire peut faire des copies illimitées de cet objet. Les copies conservent les informations sur le créateur et ne peuvent jamais être plus permissives que l'élément qui est copié."/> + <check_box initial_value="true" label="Transférer" name="next_owner_transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet."/> <button label="OK" name="ok"/> <button label="Appliquer" name="apply"/> <button label="Annuler" name="close"/> diff --git a/indra/newview/skins/default/xui/fr/floater_my_scripts.xml b/indra/newview/skins/default/xui/fr/floater_my_scripts.xml new file mode 100644 index 0000000000000000000000000000000000000000..84ef7b2623a4c3afe5d8a4c91a65c74b3c4485bc --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_my_scripts.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="myscripts" title="Mes scripts"/> diff --git a/indra/newview/skins/default/xui/fr/floater_preferences.xml b/indra/newview/skins/default/xui/fr/floater_preferences.xml index 17302020316d4e45a6a2c2586827552984acf8f8..564f77e5d34abbedbbcb461a6f33fcbb07156d4d 100644 --- a/indra/newview/skins/default/xui/fr/floater_preferences.xml +++ b/indra/newview/skins/default/xui/fr/floater_preferences.xml @@ -5,6 +5,9 @@ </floater.string> <button label="OK" label_selected="OK" name="OK"/> <button label="Annuler" label_selected="Annuler" name="Cancel"/> + <panel name="search_panel"> + <search_editor label="Paramètres de recherche" name="search_prefs_edit" tool_tip="Tapez le terme de recherche qui vous intéresse ici. Les résultats seront affichés pour les correspondances partielles de texte intégral dans le nom ou le commentaire du paramètre."/> + </panel> <tab_container name="pref core"> <panel label="Général" name="general"/> <panel label="Graphiques" name="display"/> diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml index 90c2bde6f40730492b15b135a3c4c4022713ac68..9597d38dcab206587c333bbc9541d552daea738d 100644 --- a/indra/newview/skins/default/xui/fr/floater_tools.xml +++ b/indra/newview/skins/default/xui/fr/floater_tools.xml @@ -172,9 +172,11 @@ <text name="Name:"> Nom : </text> + <line_editor name="Object Name" tool_tip="Le nom est limité à 63 caractères. Les noms de prim plus longs sont écourtés. Les noms ne peuvent contenir que des caractères imprimables trouvés dans le jeu de caractères ASCII-7 (non étendu), à l'exception de la barre / pipe verticale '|'."/> <text name="Description:"> Description : </text> + <line_editor name="Object Description" tool_tip="Lorsque les utilisateurs sélectionnent 'Conseils de survol sur tous les objets' dans les paramètres de la visionneuse, la description contextuelle de chaque objet apparaît sous le pointeur de la souris. La description de la prim est limitée à 127 octets, toute chaîne supérieure à cette limite sera tronquée."/> <text name="Creator:"> Créateur : </text> @@ -191,17 +193,18 @@ <text name="label click action"> Cliquer pour : </text> - <combo_box name="clickaction"> + <combo_box name="clickaction" tool_tip="Une action de clic vous permet d'interagir avec un objet avec un simple clic gauche. Chaque action de clic a un curseur spécial indiquant ce qu'il fait. Certaines actions de clic ont des exigences pour fonctionner. Par exemple, Toucher and Payer nécessitent des scripts"> <combo_box.item label="Toucher (par défaut)" name="Touch/grab(default)"/> <combo_box.item label="S'asseoir sur l'objet" name="Sitonobject"/> <combo_box.item label="Acheter l'objet" name="Buyobject"/> <combo_box.item label="Payer l'objet" name="Payobject"/> <combo_box.item label="Ouvrir" name="Open"/> <combo_box.item label="Zoomer" name="Zoom"/> + <combo_box.item label="Aucun" name="None"/> </combo_box> - <check_box label="À vendre :" name="checkbox for sale"/> - <spinner label="L$" name="Edit Cost"/> - <combo_box name="sale type"> + <check_box label="À vendre :" name="checkbox for sale" tool_tip="Permet aux gens d'acheter cet objet, son contenu ou de le copier dans Second Life à un prix donné."/> + <spinner label="L$" name="Edit Cost" tool_tip="Coût de l'objet."/> + <combo_box name="sale type" tool_tip="Indiquez si l’acheteur recevra une copie, une copie du contenu ou l’article lui-même."> <combo_box.item label="Copie" name="Copy"/> <combo_box.item label="Contenus" name="Contents"/> <combo_box.item label="Original" name="Original"/> @@ -214,14 +217,14 @@ <text name="Anyone can:"> N'importe qui : </text> - <check_box label="Bouger" name="checkbox allow everyone move"/> - <check_box label="Copier" name="checkbox allow everyone copy"/> + <check_box label="Bouger" name="checkbox allow everyone move" tool_tip="Tout le monde peut déplacer l'objet."/> + <check_box label="Copier" name="checkbox allow everyone copy" tool_tip="Tout le monde peut prendre une copie de l'objet. L'objet et tout son contenu doit être autorisé à être copié et transféré."/> <text name="Next owner can:"> Le prochain propriétaire : </text> - <check_box label="Modifier" name="checkbox next owner can modify"/> - <check_box label="Copier" left_delta="66" name="checkbox next owner can copy"/> - <check_box label="Transférer" name="checkbox next owner can transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/> + <check_box label="Modifier" name="checkbox next owner can modify" tool_tip="Le prochain propriétaire peut modifier des propriétés telles que le libellé de l'élément ou l'échelle de cet objet."/> + <check_box label="Copier" left_delta="66" name="checkbox next owner can copy" tool_tip="Le prochain propriétaire peut faire des copies illimitées de cet objet. Les copies conservent les informations sur le créateur et ne peuvent jamais être plus permissives que l'élément qui est copié."/> + <check_box label="Transférer" name="checkbox next owner can transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet."/> <text name="B:"> B : </text> diff --git a/indra/newview/skins/default/xui/fr/floater_top_objects.xml b/indra/newview/skins/default/xui/fr/floater_top_objects.xml index 2c411933a88cfe557c97fcc3aff540a3224dfed5..cc63ece093d0f53ae835c704094d3adb54202d3d 100644 --- a/indra/newview/skins/default/xui/fr/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/fr/floater_top_objects.xml @@ -4,7 +4,7 @@ Scripts les plus consommateurs </floater.string> <floater.string name="top_scripts_text"> - [COUNT] scripts prenant un total de [TIME] ms + Scripts [COUNT] prenant un total de [TIME] ms et utilisant [MEMORY] KB </floater.string> <floater.string name="scripts_score_label"> Temps diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml index 3980ca8e028743c2734194b79741a134f48d5421..12c50464da1920c52b03d74ea9c50f700baa087d 100644 --- a/indra/newview/skins/default/xui/fr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml @@ -9,9 +9,11 @@ <menu_item_call label="Endroits..." name="Places"/> <menu_item_call label="Favoris..." name="Picks"/> <menu_item_call label="Expériences..." name="Experiences"/> + <menu_item_call label="Mes scripts..." name="MyScripts"/> <menu_item_call label="Contrôles de la caméra..." name="Camera Controls"/> <menu label="Déplacement" name="Movement"> <menu_item_call label="M'asseoir" name="Sit Down Here"/> + <menu_item_call label="Se lever" name="Stand up"/> <menu_item_check label="Voler" name="Fly"/> <menu_item_check label="Toujours courir" name="Always Run"/> <menu_item_call label="Arrêter mon animation" name="Stop Animating My Avatar"/> diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index 62237221dd45633ba36da354178205037d3ca2a5..4239c949fdc624e5d7257a3a3d9ed4bcd1f1c6d0 100644 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -244,6 +244,10 @@ Veuillez ne sélectionner qu'un seul objet. Remarque : si vous activez cette option, toutes les personnes utilisant cet ordinateur pourront voir votre liste d'endroits favoris. <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="AllowMultipleViewers"> + L'exécution de plusieurs visualiseurs Second Life n'est pas prise en charge. Cela peut entraîner des collisions de cache de texture, une corruption et une dégradation des visuels et des performances. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="GrantModifyRights"> Lorsque vous accordez des droits de modification à un autre résident, vous lui permettez de changer, supprimer ou prendre n'importe lequel de vos objets dans Second Life. Réfléchissez bien avant d'accorder ces droits. Voulez-vous vraiment accorder des droits de modification à [NAME] ? @@ -717,9 +721,9 @@ La qualité des graphiques peut être augmentée à la section Préférences > Vous n'êtes pas autorisé(e) à terraformer la parcelle [PARCEL]. </notification> <notification name="CannotCopyWarning"> - Vous n'êtes pas autorisé à copier les articles suivants : -[ITEMS]. -Ceux-ci disparaîtront donc de votre inventaire si vous les donnez. Voulez-vous vraiment offrir ces articles ? + Vous n'êtes pas autorisé à copier les objets suivants : +<nolink>[ITEMS]</nolink> +et il disparaîtra de votre inventaire si vous le donnez. Voulez-vous vraiment offrir ces articles ? <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> </notification> <notification name="CannotGiveItem"> @@ -1567,6 +1571,30 @@ Dépasse la limite fixée à [MAX_AGENTS] [LIST_TYPE] de [NUM_EXCESS]. <notification name="ProblemAddingEstateManagerBanned"> Impossible d’ajouter un résident banni à la liste des gérants de domaine. </notification> + <notification name="ProblemBanningEstateManager"> + Impossible d'ajouter le gérant de domaine à la liste interdite. + </notification> + <notification name="GroupIsAlreadyInList"> + <nolink>[GROUP]</nolink> est déjà dans la liste des groupes autorisés. + </notification> + <notification name="AgentIsAlreadyInList"> + [AGENT] est déjà dans votre liste [LIST_TYPE]. + </notification> + <notification name="AgentsAreAlreadyInList"> + [AGENT] sont déjà dans votre liste [LIST_TYPE]. + </notification> + <notification name="AgentWasAddedToList"> + [AGENT] a été ajouté à la liste [LIST_TYPE] de [ESTATE]. + </notification> + <notification name="AgentsWereAddedToList"> + [AGENT] ont été ajoutéq à la liste [LIST_TYPE] de [ESTATE]. + </notification> + <notification name="AgentWasRemovedFromList"> + [AGENT] a été supprimé de la liste [LIST_TYPE] de [ESTATE]. + </notification> + <notification name="AgentsWereRemovedFromList"> + [AGENT] ont été supprimés de la liste [LIST_TYPE] de [ESTATE]. + </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> Impossible de changer d'apparence jusqu'à ce que les habits et la silhouette soient chargés. </notification> @@ -1582,9 +1610,25 @@ Veuillez choisir un objet à vendre et réessayer. [DOWNLOAD_PATH]. </notification> <notification name="RequiredUpdate"> - La version [VERSION] est nécessaire pour vous connecter. Cette version aurait dû être mise à jour, mais visiblement, elle ne l'a pas été. Veuillez télécharger la dernière version sur https://secondlife.com/support/downloads/ + La version [VERSION] est nécessaire pour vous connecter. +Veuillez télécharger la dernière version sur https://secondlife.com/support/downloads/ + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PauseForUpdate"> + La version [VERSION] est nécessaire pour vous connecter. +Cliquez sur OK pour télécharger et installer. <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="OptionalUpdateReady"> + La version [VERSION] a été téléchargée et est prête à être installée. +Cliquez sur OK pour installer. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PromptOptionalUpdate"> + La version [VERSION] a été téléchargée et est prête à être installée. +Continuer ? + <usetemplate canceltext="Pas maintenant" name="yesnocancelbuttons" notext="Ignorer" yestext="Installer"/> + </notification> <notification name="LoginFailedUnknown"> Désolé, la connexion a échoué pour un raison non reconnue. Si ce message persiste, veuillez consulter la page [SUPPORT_SITE]. <usetemplate name="okbutton" yestext="Quitter"/> @@ -1868,7 +1912,7 @@ Cette action modifiera des milliers de régions et sera difficile à digérer po <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> </notification> <notification label="Choisir le domaine" name="EstateBannedAgentRemove"> - Supprimer ce résident de la liste des résidents bannis pour ce domaine uniquement ou pour [ALL_ESTATES] ? + Supprimer ce résident de la liste des résidents interdits pour ce domaine uniquement ou pour [ALL_ESTATES] ? <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Tous les domaines" yestext="Ce domaine"/> </notification> <notification label="Choisir le domaine" name="EstateManagerAdd"> @@ -2943,7 +2987,7 @@ Si vous restez dans cette région, vous serez déconnecté(e). Si vous restez dans cette région, vous serez déconnecté(e). </notification> <notification name="LoadWebPage"> - Charger la page Web [URL] ? +Charger la page Web [URL] ? [MESSAGE] @@ -3048,15 +3092,6 @@ N'autorisez pas cet accès si vous ne comprenez pas entièrement pourquoi l <button name="Deny" text="Refuser"/> </form> </notification> - <notification name="UnknownScriptQuestion"> - Le client ne reconnaît pas le droit de script à l'exécution demandé par <nolink>[OBJECTNAME]</nolink>, objet appartenant à [NAME], et ne peut donc pas l'accorder. - -Pour accorder ce droit, mettez votre client à jour pour passer à la version la plus récente, à partir de [DOWNLOADURL]. - <form name="form"> - <button name="Deny" text="OK"/> - <button name="Mute" text="Ignorer"/> - </form> - </notification> <notification name="ScriptDialog"> <nolink>[TITLE]</nolink> de [NAME] [MESSAGE] @@ -3161,16 +3196,22 @@ Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignore Échec de la connexion avec [VOICE_CHANNEL_NAME], veuillez réessayer ultérieurement. Vous allez maintenant être reconnecté(e) au chat vocal près de vous. </notification> <notification name="VoiceEffectsExpired"> - Au moins l'un des effets de voix auxquels vous êtes abonné a expiré. -[[URL] Cliquez ici] pour renouveler votre abonnement. + Au moins l'un des effets de voix auxquels vous êtes abonné a expiré. +[[URL] Cliquez ici] pour renouveler votre abonnement. + +Si vous êtes un membre Premium, [[PREMIUM_URL] cliquez ici] pour recevoir votre effet de voix. </notification> <notification name="VoiceEffectsExpiredInUse"> L'effet de voix actif a expiré. Vos paramètres de voix normaux ont été rétablis. -[[URL] Cliquez ici] pour renouveler votre abonnement. +[[URL] Cliquez ici] pour renouveler votre abonnement. + +Si vous êtes un membre Premium, [[PREMIUM_URL] cliquez ici] pour recevoir votre effet de voix. </notification> <notification name="VoiceEffectsWillExpire"> - Au moins l'un de vos effets de voix expirera dans moins de [INTERVAL] jours. -[[URL] Cliquez ici] pour renouveler votre abonnement. + Au moins l'un de vos effets de voix expirera dans moins de [INTERVAL] jours. +[[URL] Cliquez ici] pour renouveler votre abonnement. + +Si vous êtes un membre Premium, [[PREMIUM_URL] cliquez ici] pour recevoir votre effet de voix. </notification> <notification name="VoiceEffectsNew"> De nouveaux effets de voix sont disponibles ! @@ -3222,6 +3263,9 @@ Elles vont être bloquées pendant quelques secondes pour votre sécurité. <notification name="SnapshotToComputerFailed"> Échec d’enregistrement de la photo dans [PATH] : Le disque est plein. [NEED_MEMORY]KB est nécessaire mais l'espace libre est de seulement [FREE_MEMORY]KB. </notification> + <notification name="SnapshotToLocalDirNotExist"> + Échec d’enregistrement de la photo dans [PATH] : Le répertoire n'existe pas. + </notification> <notification name="PresetNotSaved"> Erreur d’enregistrement du préréglage [NAME]. </notification> @@ -3711,13 +3755,13 @@ il ne se trouve pas dans la même région que vous. Vous ne pouvez pas créer d'arbres ni d'herbe sur un terrain qui ne vous appartient pas. </notification> <notification name="NoCopyPermsNoObject"> - Échec de la copie car vous ne disposez pas des droits requis pour copier l'objet [OBJ_NAME]. + La copie a échoué car vous ne disposez pas de l'autorisation nécessaire pour copier l'objet <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoTransPermsNoObject"> - Échec de la copie car l'objet [OBJ_NAME] ne peut pas vous être transféré. + La copie a échoué car l'objet <nolink>'[OBJ_NAME]'</nolink> ne peut pas vous être transféré. </notification> <notification name="AddToNavMeshNoCopy"> - Échec de la copie car l'objet [OBJ_NAME] contribue au maillage de navigation. + La copie a échoué car l'objet <nolink>'[OBJ_NAME]'</nolink> contribue à navmesh. </notification> <notification name="DupeWithNoRootsSelected"> Dupliquer sans objet racine sélectionné @@ -3762,34 +3806,34 @@ Veuillez réessayer dans une minute. Le réenregistrement dans l'inventaire a été désactivé. </notification> <notification name="NoExistNoSaveToContents"> - Impossible d'enregistrer [OBJ_NAME] dans le contenu des objets car l'objet à partir duquel il a été rezzé n'existe plus. + Impossible de sauvegarder <nolink>'[OBJ_NAME]'</nolink> dans le contenu de l'objet car l'objet à partir duquel il a été rezzé n'existe plus. </notification> <notification name="NoModNoSaveToContents"> - Impossible d'enregistrer [OBJ_NAME] dans le contenu des objets car vous ne disposez pas des droits requis pour modifier l'objet [DEST_NAME]. + Impossible de sauvegarder<nolink>'[OBJ_NAME]'</nolink> dans le contenu de l'objet car vous n'êtes pas autorisé à modifier l'objet <nolink>'[DEST_NAME]'</nolink>. </notification> <notification name="NoSaveBackToInvDisabled"> - Impossible de réenregistrer [OBJ_NAME] dans l'inventaire -- cette opération a été désactivée. + Impossible de sauvegarder <nolink>'[OBJ_NAME]'</nolink> dans l'inventaire - cette opération a été désactivée. </notification> <notification name="NoCopyNoSelCopy"> - Vous ne pouvez pas copier votre sélection car vous n'avez pas le droit de copier l'objet [OBJ_NAME]. + Vous ne pouvez pas copier votre sélection parce que vous n'êtes pas autorisé à copier l'objet <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoTransNoSelCopy"> - Vous ne pouvez pas copier votre sélection car l'objet [OBJ_NAME] n'est pas transférable. + Vous ne pouvez pas copier votre sélection parce que l'objet <nolink>'[OBJ_NAME]'</nolink> n'est pas transférable. </notification> <notification name="NoTransNoCopy"> - Vous ne pouvez pas copier votre sélection car l'objet [OBJ_NAME] n'est pas transférable. + Vous ne pouvez pas copier votre sélection parce que l'objet <nolink>'[OBJ_NAME]'</nolink> n'est pas transférable. </notification> <notification name="NoPermsNoRemoval"> - La suppression de l'objet [OBJ_NAME] du simulateur n'est pas autorisée par le système de droits. + La suppression de l'objet <nolink>'[OBJ_NAME]'</nolink> du simulateur n'est pas autorisée par le système d'autorisations. </notification> <notification name="NoModNoSaveSelection"> - Vous ne pouvez pas enregistrer votre sélection car vous n'avez pas le droit de modifier l'objet [OBJ_NAME]. + Impossible de sauvegarder votre sélection parce que vous n'êtes pas autorisé à modifier l'objet <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoCopyNoSaveSelection"> - Vous ne pouvez pas enregistrer votre sélection car l'objet [OBJ_NAME] ne peut pas être copié. + Impossible d'enregistrer votre sélection car l'objet <nolink>'[OBJ_NAME]'</nolink> n'est pas copiable. </notification> <notification name="NoModNoTaking"> - Vous ne pouvez pas prendre votre sélection car vous n'avez pas le droit de modifier l'objet [OBJ_NAME]. + Vous ne pouvez pas sauvegarder votre sélection parce que vous n'êtes pas autorisé à modifier l'objet <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="RezDestInternalError"> Erreur interne : type de destination inconnue. diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml index 2b8249c8a95a2495347190810e8e9cecf32a451c..a4f0ff7061378fec83df375592b6dc208996b9e2 100644 --- a/indra/newview/skins/default/xui/fr/panel_login.xml +++ b/indra/newview/skins/default/xui/fr/panel_login.xml @@ -1,6 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <panel name="panel_login"> - <panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=fr</panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php?lang=fr + </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="ui_stack"> <layout_panel name="ui_container"> <combo_box label="Nom d'utilisateur" name="username_combo" tool_tip="Nom d'utilisateur que vous avez choisi lors de votre inscription (par exemple, bobsmith12 ou Steller Sunshine)."/> @@ -11,8 +16,13 @@ </combo_box> <button label="Connexion" name="connect_btn"/> <check_box label="Mémoriser mes informations" name="remember_check"/> - <text name="forgot_password_text">Mot de passe oublié</text> - <combo_box label="Sélectionner la grille" name="server_combo" left_pad="20"/> + <text name="forgot_password_text"> + Mot de passe oublié + </text> + <combo_box label="Sélectionner la grille" left_pad="20" name="server_combo"/> + <text name="sign_up_text"> + S'inscrire + </text> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_login_first.xml b/indra/newview/skins/default/xui/fr/panel_login_first.xml index 9534ac7b83e4082fb41addf5141c40a4dbab5be7..8f40d0230ce904cf28fbad2d646679752338f8dc 100644 --- a/indra/newview/skins/default/xui/fr/panel_login_first.xml +++ b/indra/newview/skins/default/xui/fr/panel_login_first.xml @@ -3,6 +3,9 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php?lang=fr </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="logo_stack"> <layout_panel name="parent_panel2"> <layout_stack name="widget_stack"> @@ -10,10 +13,13 @@ <combo_box label="Nom d'utilisateur" name="username_combo" tool_tip="Nom d'utilisateur que vous avez choisi lors de votre inscription (par exemple, bobsmith12 ou Steller Sunshine)."/> <line_editor label="Mot de passe" name="password_edit"/> <button label="Connexion" name="connect_btn"/> - <check_box label="Mémoriser mes informations" name="remember_check" font="SansSerifSmall"/> + <check_box font="SansSerifSmall" label="Mémoriser mes informations" name="remember_check"/> <text name="forgot_password_text"> Mot de passe oublié </text> + <text name="sign_up_text"> + S'inscrire + </text> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml index 11b1bd9b879c86e97214d5a3910160a88a1f38bb..b75567a40f56ef43906b73001044dc56e1959455 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml @@ -4,7 +4,6 @@ Langue : </text> <combo_box name="language_combobox"> - <combo_box.item label="Choix par défaut" name="System Default Language"/> <combo_box.item label="English (Anglais)" name="English"/> <combo_box.item label="Dansk (Danois) - Bêta" name="Danish"/> <combo_box.item label="Deutsch (Allemand) - Bêta" name="Deutsch(German)"/> diff --git a/indra/newview/skins/default/xui/fr/panel_region_access.xml b/indra/newview/skins/default/xui/fr/panel_region_access.xml new file mode 100644 index 0000000000000000000000000000000000000000..db77f3b8f145ce57e9ba84b91b441c1b9543aba0 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_region_access.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="ACCÈS" name="Access"> + <tab_container name="tabs"> + <panel label="GÉRANTS DU DOMAINE" name="estate_managers_panel"> + <text name="estate_manager_label"> + Gérants du domaine : + </text> + <name_list name="estate_manager_name_list"> + <columns label="Nom" name="name"/> + </name_list> + <button label="Ajouter..." name="add_estate_manager_btn"/> + <button label="Supprimer..." name="remove_estate_manager_btn"/> + </panel> + <panel label="AUTORISÉ" name="allowed_panel"> + <panel label="top_panel" name="allowed_search_panel"> + <filter_editor label="Rechercher des agents autorisés" name="allowed_search_input"/> + </panel> + <text name="allow_resident_label"> + Toujours autorisé : + </text> + <name_list name="allowed_avatar_name_list"> + <columns label="Nom" name="name"/> + </name_list> + <button label="Ajouter..." name="add_allowed_avatar_btn"/> + <button label="Supprimer..." name="remove_allowed_avatar_btn"/> + </panel> + <panel label="GROUPES AUTORISÉS" name="allowed_groups_panel"> + <panel label="top_panel" name="allowed_group_search_panel"> + <filter_editor label="Rechercher des groupes autorisés" name="allowed_group_search_input"/> + </panel> + <text name="allow_group_label"> + Groupes toujours autorisés : + </text> + <name_list name="allowed_group_name_list"> + <columns label="Nom" name="name"/> + </name_list> + <button label="Ajouter..." name="add_allowed_group_btn"/> + <button label="Supprimer" name="remove_allowed_group_btn"/> + </panel> + <panel label="INTERDIT" name="banned_panel"> + <panel label="top_panel" name="banned_search_panel"> + <filter_editor label="Rechercher des agents interdits" name="banned_search_input"/> + </panel> + <text name="ban_resident_label"> + Toujours interdit : + </text> + <name_list name="banned_avatar_name_list"> + <columns label="Nom" name="name"/> + <columns label="Date de la dernière connexion" name="last_login_date"/> + <columns label="Date d'interdiction" name="ban_date"/> + <columns label="Interdit par" name="bannedby"/> + </name_list> + <button label="Ajouter..." name="add_banned_avatar_btn"/> + <button label="Supprimer..." name="remove_banned_avatar_btn"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_region_estate.xml b/indra/newview/skins/default/xui/fr/panel_region_estate.xml index 9bf3fdfc96e861d1bbabcaaee8b081acd0ad6f35..0987ef3fa35f661b99e607d5f574dfa65146a694 100644 --- a/indra/newview/skins/default/xui/fr/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/fr/panel_region_estate.xml @@ -18,7 +18,7 @@ domaine. (inconnu) </text> <radio_group name="externally_visible_radio"> - <radio_item label="Autoriser uniquement les résidents et les groupes indiqués ci-dessous" name="estate_restricted_access"/> + <radio_item label="Autoriser uniquement les résidents et les groupes indiqués dans l'onglet Accès" name="estate_restricted_access"/> <radio_item label="Visite ouverte à tous" name="estate_public_access"/> </radio_group> <check_box label="Doit avoir plus de 18 ans" name="limit_age_verified" tool_tip="Pour accéder à ce domaine, les résidents doivent avoir au moins 18 ans. Consultez le [SUPPORT_SITE] pour plus d'informations."/> diff --git a/indra/newview/skins/default/xui/fr/panel_status_bar.xml b/indra/newview/skins/default/xui/fr/panel_status_bar.xml index fef0379c2ceccbdbb31792f5c61366decc521597..84c6dda4b4dbe12dae0ae6ffd6fdee14d928a3af 100644 --- a/indra/newview/skins/default/xui/fr/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/fr/panel_status_bar.xml @@ -1,16 +1,31 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="status"> - <panel.string name="packet_loss_tooltip">Perte de paquets</panel.string> - <panel.string name="bandwidth_tooltip">Bande passante</panel.string> - <panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string> - <panel.string name="timeTooltip">[weekday, datetime, slt] [sday, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string> - <panel.string name="buycurrencylabel">[AMT] L$</panel.string> + <panel.string name="packet_loss_tooltip"> + Perte de paquets + </panel.string> + <panel.string name="bandwidth_tooltip"> + Bande passante + </panel.string> + <panel.string name="time"> + [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> + [weekday, datetime, slt] [sday, datetime, slt] [month, datetime, slt] [year, datetime, slt] + </panel.string> + <panel.string name="buycurrencylabel"> + [AMT] L$ + </panel.string> + <panel name="menu_search_panel"> + <search_editor label="Menus de recherche" name="search_menu_edit" tool_tip="Tapez le terme de recherche qui vous intéresse ici. Les résultats seront affichés pour les correspondances partielles en texte intégral dans le menu."/> + </panel> <panel left="-426" name="balance_bg" width="195"> <text name="balance" tool_tip="Cliquer sur ce bouton pour actualiser votre solde en L$." value="L$ ??"/> <button label="Acheter L$" name="buyL" tool_tip="Cliquer pour acheter plus de L$."/> <button label="Achats" name="goShop" tool_tip="Ouvrir la Place du marché Second Life." width="75"/> </panel> - <text name="TimeText" tool_tip="Heure actuelle (Pacifique)">00h00 PST</text> + <text name="TimeText" tool_tip="Heure actuelle (Pacifique)"> + 00h00 PST + </text> <button name="media_toggle_btn" tool_tip="Arrêter tous les médias (musique, vidéo, pages web)."/> <button name="volume_btn" tool_tip="Régler le volume global."/> </panel> diff --git a/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml b/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml index ede5ec08afe5bdd22943619f3dda969fbef0a7db..caeb1f85891b577e32548cb5154056024673bf01 100644 --- a/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/fr/sidepanel_item_info.xml @@ -34,9 +34,11 @@ <text name="LabelItemNameTitle"> Nom : </text> + <line_editor name="LabelItemName" tool_tip="Le nom est limité à 63 caractères. Les noms de prim plus longs sont écourtés. Les noms ne peuvent contenir que des caractères imprimables trouvés dans le jeu de caractères ASCII-7 (non étendu), à l'exception de la barre / pipe verticale '|'."/> <text name="LabelItemDescTitle"> Description : </text> + <line_editor name="LabelItemDesc" tool_tip="Lorsque les utilisateurs sélectionnent 'Conseils de survol sur tous les objets' dans les paramètres de la visionneuse, la description contextuelle de chaque objet apparaît sous le pointeur de la souris. La description de la prim est limitée à 127 octets, toute chaîne supérieure à cette limite sera tronquée."/> <text name="LabelCreatorTitle"> Créateur : </text> @@ -59,7 +61,7 @@ <text name="AnyoneLabel"> N'importe qui : </text> - <check_box label="Copier" name="CheckEveryoneCopy"/> + <check_box label="Copier" name="CheckEveryoneCopy" tool_tip="Tout le monde peut prendre une copie de l'objet. L'objet et tout son contenu doit être autorisé à être copié et transféré."/> <text name="GroupLabel"> Groupe : </text> @@ -67,17 +69,17 @@ <text name="NextOwnerLabel"> Prochain propriétaire : </text> - <check_box label="Modifier" name="CheckNextOwnerModify"/> - <check_box label="Copier" name="CheckNextOwnerCopy"/> + <check_box label="Modifier" name="CheckNextOwnerModify" tool_tip="Le prochain propriétaire peut modifier des propriétés telles que le libellé de l'élément ou l'échelle de cet objet."/> + <check_box label="Copier" name="CheckNextOwnerCopy" tool_tip="Le prochain propriétaire peut faire des copies illimitées de cet objet. Les copies conservent les informations sur le créateur et ne peuvent jamais être plus permissives que l'élément qui est copié."/> <check_box label="Transférer" name="CheckNextOwnerTransfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet."/> </panel> - <check_box label="À vendre" name="CheckPurchase"/> - <combo_box name="ComboBoxSaleType"> + <check_box label="À vendre" name="CheckPurchase" tool_tip="Permet aux gens d'acheter cet objet, son contenu ou de le copier dans Second Life à un prix donné."/> + <combo_box name="ComboBoxSaleType" tool_tip="Indiquez si l’acheteur recevra une copie, une copie du contenu ou l’article lui-même."> <combo_box.item label="Copier" name="Copy"/> <combo_box.item label="Contenu" name="Contents"/> <combo_box.item label="Original" name="Original"/> </combo_box> - <spinner label="Prix : L$" name="Edit Cost"/> + <spinner label="Prix : L$" name="Edit Cost" tool_tip="Coût de l'objet."/> </panel> </scroll_container> <panel name="button_panel"> diff --git a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml index f6b4f2804678cd833d8d745a2ef7337a9b0bc60f..737ecb7ac54aa235bf8801a721227ddf66b817d7 100644 --- a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml @@ -1,71 +1,136 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="object properties" title="Profil de l'objet"> - <panel.string name="text deed continued">Céder</panel.string> - <panel.string name="text deed">Céder</panel.string> - <panel.string name="text modify info 1">Vous pouvez modifier cet objet</panel.string> - <panel.string name="text modify info 2">Vous pouvez modifier ces objets</panel.string> - <panel.string name="text modify info 3">Vous ne pouvez pas modifier cet objet</panel.string> - <panel.string name="text modify info 4">Vous ne pouvez pas modifier ces objets</panel.string> - <panel.string name="text modify info 5">Impossible de modifier cet objet au-delà de la frontière d'une région</panel.string> - <panel.string name="text modify info 6">Impossible de modifier ces objets au-delà de la frontière d'une région</panel.string> - <panel.string name="text modify warning">Cet objet comprend des parties liées</panel.string> - <panel.string name="Cost Default">Prix : L$</panel.string> - <panel.string name="Cost Total">Prix total : L$</panel.string> - <panel.string name="Cost Per Unit">Prix par : L$</panel.string> - <panel.string name="Cost Mixed">Prix mixte</panel.string> - <panel.string name="Sale Mixed">Vente mixte</panel.string> + <panel.string name="text deed continued"> + Céder + </panel.string> + <panel.string name="text deed"> + Céder + </panel.string> + <panel.string name="text modify info 1"> + Vous pouvez modifier cet objet + </panel.string> + <panel.string name="text modify info 2"> + Vous pouvez modifier ces objets + </panel.string> + <panel.string name="text modify info 3"> + Vous ne pouvez pas modifier cet objet + </panel.string> + <panel.string name="text modify info 4"> + Vous ne pouvez pas modifier ces objets + </panel.string> + <panel.string name="text modify info 5"> + Impossible de modifier cet objet au-delà de la frontière d'une région + </panel.string> + <panel.string name="text modify info 6"> + Impossible de modifier ces objets au-delà de la frontière d'une région + </panel.string> + <panel.string name="text modify warning"> + Cet objet comprend des parties liées + </panel.string> + <panel.string name="Cost Default"> + Prix : L$ + </panel.string> + <panel.string name="Cost Total"> + Prix total : L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Prix par : L$ + </panel.string> + <panel.string name="Cost Mixed"> + Prix mixte + </panel.string> + <panel.string name="Sale Mixed"> + Vente mixte + </panel.string> <text name="title" value="Profil de l'objet"/> <text name="where" value="(dans Second Life)"/> <panel label="" name="properties_panel"> - <text name="Name:">Nom :</text> - <text name="Description:">Description :</text> - <text name="CreatorNameLabel">Créateur :</text> - <text name="Owner:">Propriétaire :</text> - <text name="Group_label">Groupe :</text> + <text name="Name:"> + Nom : + </text> + <line_editor name="Object Name" tool_tip="Le nom est limité à 63 caractères. Les noms de prim plus longs sont écourtés. Les noms ne peuvent contenir que des caractères imprimables trouvés dans le jeu de caractères ASCII-7 (non étendu), à l'exception de la barre / pipe verticale '|'."/> + <text name="Description:"> + Description : + </text> + <line_editor name="Object Description" tool_tip="Lorsque les utilisateurs sélectionnent 'Conseils de survol sur tous les objets' dans les paramètres de la visionneuse, la description contextuelle de chaque objet apparaît sous le pointeur de la souris. La description de la prim est limitée à 127 octets, toute chaîne supérieure à cette limite sera tronquée."/> + <text name="CreatorNameLabel"> + Créateur : + </text> + <text name="Owner:"> + Propriétaire : + </text> + <text name="Group_label"> + Groupe : + </text> <button name="button set group" tool_tip="Choisir un groupe pour partager les droits relatifs à cet objet"/> <name_box initial_value="Chargement…" name="Group Name Proxy"/> <button label="Céder" label_selected="Céder" name="button deed" tool_tip="En cédant un objet, vous donnez aussi les droits au prochain propriétaire. Seul un officier peut céder les objets partagés d'un groupe."/> - <text name="label click action">Cliquer pour :</text> - <combo_box name="clickaction"> + <text name="label click action"> + Cliquer pour : + </text> + <combo_box name="clickaction" tool_tip="Une action de clic vous permet d'interagir avec un objet avec un simple clic gauche. Chaque action de clic a un curseur spécial indiquant ce qu'il fait. Certaines actions de clic ont des exigences pour fonctionner. Par exemple, Toucher and Payer nécessitent des scripts"> <combo_box.item label="Toucher (défaut)" name="Touch/grab(default)"/> <combo_box.item label="S'asseoir sur l'objet" name="Sitonobject"/> <combo_box.item label="Acheter l'objet" name="Buyobject"/> <combo_box.item label="Payer l'objet" name="Payobject"/> <combo_box.item label="Ouvrir" name="Open"/> <combo_box.item label="Zoom" name="Zoom"/> + <combo_box.item label="Aucun" name="None"/> </combo_box> <panel name="perms_inv"> - <text name="perm_modify">Vous pouvez modifier cet objet</text> - <text name="Anyone can:">N'importe qui :</text> - <check_box label="Copier" name="checkbox allow everyone copy"/> - <check_box label="Bouger" name="checkbox allow everyone move"/> - <text name="GroupLabel">Groupe :</text> + <text name="perm_modify"> + Vous pouvez modifier cet objet + </text> + <text name="Anyone can:"> + N'importe qui : + </text> + <check_box label="Copier" name="checkbox allow everyone copy" tool_tip="Tout le monde peut prendre une copie de l'objet. L'objet et tout son contenu doit être autorisé à être copié et transféré."/> + <check_box label="Bouger" name="checkbox allow everyone move" tool_tip="Tout le monde peut déplacer l'objet."/> + <text name="GroupLabel"> + Groupe : + </text> <check_box label="Partager" name="checkbox share with group" tool_tip="Autoriser tous les membres du groupe choisi à partager vos droits de modification pour cet objet. Pour activer les restrictions de rôles, vous devez d'abord cliquer sur Céder."/> - <text name="NextOwnerLabel">Le prochain propriétaire :</text> - <check_box label="Modifier" name="checkbox next owner can modify"/> - <check_box label="Copier" name="checkbox next owner can copy"/> + <text name="NextOwnerLabel"> + Le prochain propriétaire : + </text> + <check_box label="Modifier" name="checkbox next owner can modify" tool_tip="Le prochain propriétaire peut modifier des propriétés telles que le libellé de l'élément ou l'échelle de cet objet."/> + <check_box label="Copier" name="checkbox next owner can copy" tool_tip="Le prochain propriétaire peut faire des copies illimitées de cet objet. Les copies conservent les informations sur le créateur et ne peuvent jamais être plus permissives que l'élément qui est copié."/> <check_box label="Transférer" name="checkbox next owner can transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/> </panel> - <check_box label="À vendre" name="checkbox for sale"/> - <combo_box name="sale type"> + <check_box label="À vendre" name="checkbox for sale" tool_tip="Permet aux gens d'acheter cet objet, son contenu ou de le copier dans Second Life à un prix donné."/> + <combo_box name="sale type" tool_tip="Indiquez si l’acheteur recevra une copie, une copie du contenu ou l’article lui-même."> <combo_box.item label="Copier" name="Copy"/> <combo_box.item label="Contenus" name="Contents"/> <combo_box.item label="Original" name="Original"/> </combo_box> - <spinner label="Prix : L$" name="Edit Cost"/> + <spinner label="Prix : L$" name="Edit Cost" tool_tip="Coût de l'objet."/> <check_box label="Afficher avec la recherche" name="search_check" tool_tip="Permettre aux autres résidents de voir cet objet dans les résultats de recherche"/> - <text name="pathfinding_attributes_label">Attributs de recherche de chemin :</text> - <text name="B:">B :</text> - <text name="O:">O :</text> - <text name="G:">G :</text> - <text name="E:">E :</text> - <text name="N:">N :</text> - <text name="F:">F :</text> + <text name="pathfinding_attributes_label"> + Attributs de recherche de chemin : + </text> + <text name="B:"> + B : + </text> + <text name="O:"> + O : + </text> + <text name="G:"> + G : + </text> + <text name="E:"> + E : + </text> + <text name="N:"> + N : + </text> + <text name="F:"> + F : + </text> </panel> <panel name="button_panel"> - <button label="Ouvrir" name="open_btn"/> - <button label="Payer" name="pay_btn"/> - <button label="Acheter" name="buy_btn"/> - <button label="Détails" name="details_btn"/> + <button label="Ouvrir" name="open_btn" tool_tip="Ouvrir pour afficher le contenu de l'objet."/> + <button label="Payer" name="pay_btn" tool_tip="Ouvrir la fenêtre Payer. L'objet doit avoir un script payant pour que cela fonctionne."/> + <button label="Acheter" name="buy_btn" tool_tip="Ouvrir la fenêtre Acheter Nécessite que l'objet soit mis en vente."/> + <button label="Détails" name="details_btn" tool_tip="Ouvrir la fenêtre Inspecter l'objet"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 7f5851b51d15f85abca2023a79efc12ba74b6ce2..dbd5cc3bf46df07698706f920add5967aad85df5 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -649,7 +649,7 @@ Veuillez réessayer de vous connecter dans une minute. Notes de version </string> <string name="RELEASE_NOTES_BASE_URL"> - http://wiki.secondlife.com/wiki/Release_Notes/ + https://releasenotes.secondlife.com/viewer/ </string> <string name="LoadingData"> Chargement... @@ -2229,6 +2229,18 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life <string name="RegionInfoListTypeBannedAgents"> Toujours interdit </string> + <string name="RegionInfoAllEstates"> + tous les domaines + </string> + <string name="RegionInfoManagedEstates"> + domaines gérés + </string> + <string name="RegionInfoThisEstate"> + ce domaine + </string> + <string name="AndNMore"> + et [EXTRA_COUNT] plus + </string> <string name="ScriptLimitsParcelScriptMemory"> Mémoire des scripts de parcelles </string> @@ -2272,7 +2284,7 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life Poitrine </string> <string name="ATTACH_HEAD"> - Tête + Crâne </string> <string name="ATTACH_LSHOULDER"> Épaule gauche @@ -2293,7 +2305,7 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life Pied droit </string> <string name="ATTACH_BACK"> - Précédent + Colonne vertébrale </string> <string name="ATTACH_PELVIS"> Bassin @@ -2350,7 +2362,7 @@ Si vous continuez de recevoir ce message, contactez l’assistance Second Life Jambe gauche </string> <string name="ATTACH_BELLY"> - Ventre + Estomac </string> <string name="ATTACH_LEFT_PEC"> Pectoral gauche @@ -5741,4 +5753,25 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles <string name="Mav_Details_MAV_UNKNOWN_VERSION"> La forme physique n’a pas la version correcte. Configurez la version correcte pour le modèle physique. </string> + <string name="couldnt_resolve_host"> + DNS n'a pas pu résoudre le nom d'hôte([HOSTNAME]). +Veuillez vérifier que vous parvenez à vous connecter au site www.secondlife.com. +Si c'est le cas, et que vous continuez à recevoir ce message d'erreur, veuillez vous +rendre à la section Support et signaler ce problème + </string> + <string name="ssl_peer_certificate"> + Le serveur d'identification a rencontré une erreur de connexion SSL. +Si vous continuez à recevoir ce message d'erreur, +veuillez vous rendre à la section Support du site web +SecondLife.com et signaler ce problème + </string> + <string name="ssl_connect_error"> + Ceci est souvent dû à un mauvais réglage de l'horloge de votre ordinateur. +Veuillez aller à Tableaux de bord et assurez-vous que l'heure et la date sont réglés +correctement. Vérifiez également que votre réseau et votre pare-feu sont configurés +correctement. Si vous continuez à recevoir ce message d'erreur, veuillez vous rendre +à la section Support du site web SecondLife.com et signaler ce problème. + +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de connaissances] + </string> </strings> diff --git a/indra/newview/skins/default/xui/it/floater_auction.xml b/indra/newview/skins/default/xui/it/floater_auction.xml index 4cad8b744d10bffaf553d3408e07cd941eafe676..ea524a153c43cc1098263e026155f111b33f7173 100644 --- a/indra/newview/skins/default/xui/it/floater_auction.xml +++ b/indra/newview/skins/default/xui/it/floater_auction.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_auction" title="INIZIA LA VENDITA DI TERRENO LINDEN"> <floater.string name="already for sale"> - Non puoi mettere in asta terreni che sono già in vendita. + Non puoi mettere all’asta terreni che sono già in vendita. </floater.string> - <check_box initial_value="true" label="Includi barriere di selezione gialle" name="fence_check"/> - <button label="Fotografia" label_selected="Fotografia" name="snapshot_btn"/> + <check_box initial_value="true" label="Includi la parte selezionata in giallo" name="fence_check"/> + <button label="Istantanea" label_selected="Istantanea" name="snapshot_btn"/> <button label="Vendi a chiunque" label_selected="Vendi a chiunque" name="sell_to_anyone_btn"/> <button label="Cancella impostazioni" label_selected="Cancella impostazioni" name="reset_parcel_btn"/> <button label="Inizia l'asta" label_selected="Inizia l'asta" name="start_auction_btn"/> diff --git a/indra/newview/skins/default/xui/it/floater_bulk_perms.xml b/indra/newview/skins/default/xui/it/floater_bulk_perms.xml index 399eb15802973675845bc69cb70ac04c52bdf66f..10bbe933e33e0c1d19911c080c989bd86ab23912 100644 --- a/indra/newview/skins/default/xui/it/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/it/floater_bulk_perms.xml @@ -38,17 +38,17 @@ <text name="GroupLabel"> Gruppo: </text> - <check_box label="Condividi" name="share_with_group"/> + <check_box label="Condividi" name="share_with_group" tool_tip="Consenti a tutti i membri del gruppo selezionato di condividere i tuoi diritti di modifica per questo oggetto. Per attivare le restrizioni per ruolo devi prima effettuare la cessione."/> <text name="AnyoneLabel"> Chiunque: </text> - <check_box label="Copia" name="everyone_copy"/> + <check_box label="Copia" name="everyone_copy" tool_tip="Chiunque può prendere una copia di questo oggetto. L'oggetto e tutti i suoi contenuti devono avere il permesso di copia e trasferimento."/> <text name="NextOwnerLabel"> Proprietario successivo: </text> - <check_box label="Modificare" name="next_owner_modify"/> - <check_box label="Copiare" name="next_owner_copy"/> - <check_box initial_value="true" label="Trasferisci" name="next_owner_transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/> + <check_box label="Modificare" name="next_owner_modify" tool_tip="Il prossimo proprietario può modificare le proprietà dell'oggetto come il nome o la scala."/> + <check_box label="Copiare" name="next_owner_copy" tool_tip="Il proprietario successivo può prendere infinite copie di questo oggetto. Le copie mantengono le informazioni sul creatore, e non possono avere permessi maggiori di quelli posseduti dall'oggetto copiato."/> + <check_box initial_value="true" label="Trasferisci" name="next_owner_transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto."/> <button label="OK" name="ok"/> <button label="Applica" name="apply"/> <button label="Annulla" name="close"/> diff --git a/indra/newview/skins/default/xui/it/floater_my_scripts.xml b/indra/newview/skins/default/xui/it/floater_my_scripts.xml new file mode 100644 index 0000000000000000000000000000000000000000..a75f7f3f6f7725de25b7cf86ba7f0a2c84fbdc8e --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_my_scripts.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="myscripts" title="I miei Script"/> diff --git a/indra/newview/skins/default/xui/it/floater_preferences.xml b/indra/newview/skins/default/xui/it/floater_preferences.xml index 895b6eef3cc178a3a68d6937055e83aae323e64e..094b2de19fee340b221787762c5eb53d19f3c646 100644 --- a/indra/newview/skins/default/xui/it/floater_preferences.xml +++ b/indra/newview/skins/default/xui/it/floater_preferences.xml @@ -5,6 +5,9 @@ </floater.string> <button label="OK" label_selected="OK" name="OK"/> <button label="Annulla" label_selected="Annulla" name="Cancel"/> + <panel name="search_panel"> + <search_editor label="Ricerca Impostazioni" name="search_prefs_edit" tool_tip="Digita qui il termine della tua ricerca. I risultati verranno mostrati secondo la concordanza parziale o totale con il nome dell'impostazione."/> + </panel> <tab_container name="pref core" tab_width="100"> <panel label="Generale" name="general"/> <panel label="Grafica" name="display"/> diff --git a/indra/newview/skins/default/xui/it/floater_tools.xml b/indra/newview/skins/default/xui/it/floater_tools.xml index 1ebb45d02be87bfcba72b6aceca0e59cf44d6cfc..a21ae9a485ad110fac397d7888d49c694463c902 100644 --- a/indra/newview/skins/default/xui/it/floater_tools.xml +++ b/indra/newview/skins/default/xui/it/floater_tools.xml @@ -173,9 +173,11 @@ <text name="Name:"> Nome: </text> + <line_editor name="Object Name" tool_tip="Il nome è limitato a 63 caratteri. Prim con nomi più lunghi verranno accorciati. I nomi possono avere solamente caratteri stampabili facenti parte del codice ASCII-7 (non esteso), con l'eccezione della barra verticale '|'."/> <text name="Description:"> Descrizione: </text> + <line_editor name="Object Description" tool_tip="Quando la dicitura "Vedi suggerimenti su tutti gli oggetti" è selezionata nelle impostazioni del Viewer, passando il mouse sopra un oggetto si vedrà la sua descrizione. La descrizione dei Prim è limitata a 127 bytes. Se più lunga, verrá troncata."/> <text name="Creator:"> Creatore: </text> @@ -198,17 +200,18 @@ <text name="label click action"> Fai clic per: </text> - <combo_box name="clickaction"> + <combo_box name="clickaction" tool_tip="Con l'azione "clic singolo" puoi interagire con un oggetto semplicemente cliccandolo una volta. Ogni azione "clic singolo" ha un cursore speciale che indica il suo effetto. Alcune azioni "clic singolo" hanno dei requisiti per funzionare. Ad esempio per il comando "Touch and Pay" sono necessari degli script."> <combo_box.item label="Tocca (predefinito)" name="Touch/grab(default)"/> <combo_box.item label="Siediti sull'oggetto" name="Sitonobject"/> <combo_box.item label="Compra l'oggetto" name="Buyobject"/> <combo_box.item label="Paga l'oggetto" name="Payobject"/> <combo_box.item label="Apri" name="Open"/> <combo_box.item label="Ingrandisci" name="Zoom"/> + <combo_box.item label="Nessuno" name="None"/> </combo_box> - <check_box label="In vendita:" name="checkbox for sale"/> - <spinner label="L$" name="Edit Cost"/> - <combo_box name="sale type"> + <check_box label="In vendita:" name="checkbox for sale" tool_tip="Permette alla gente di comprare questo oggetto, il suo contenuto o la sua copia virtuale ad un prezzo stabilito."/> + <spinner label="L$" name="Edit Cost" tool_tip="Costo oggetto."/> + <combo_box name="sale type" tool_tip="Decidi se vuoi che il compratore riceva una copia, una copia del contenuto o l'oggetto stesso."> <combo_box.item label="Copia" name="Copy"/> <combo_box.item label="Contenuto" name="Contents"/> <combo_box.item label="Originale" name="Original"/> @@ -221,14 +224,14 @@ <text name="Anyone can:"> Chiunque: </text> - <check_box label="Sposta" name="checkbox allow everyone move"/> - <check_box label="Copia" name="checkbox allow everyone copy"/> + <check_box label="Sposta" name="checkbox allow everyone move" tool_tip="Chiunque può muovere l'oggetto."/> + <check_box label="Copia" name="checkbox allow everyone copy" tool_tip="Chiunque può prendere una copia di questo oggetto. L'oggetto e tutti i suoi contenuti devono avere il permesso di copia e trasferimento."/> <text name="Next owner can:"> Proprietario successivo: </text> - <check_box label="Modificare" name="checkbox next owner can modify"/> - <check_box label="Copiare" name="checkbox next owner can copy"/> - <check_box label="Trasferisci" name="checkbox next owner can transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/> + <check_box label="Modificare" name="checkbox next owner can modify" tool_tip="Il prossimo proprietario può modificare le proprietà dell'oggetto come il nome o la scala."/> + <check_box label="Copiare" name="checkbox next owner can copy" tool_tip="Il proprietario successivo può prendere infinite copie di questo oggetto. Le copie mantengono le informazioni sul creatore, e non possono avere permessi maggiori di quelli posseduti dall'oggetto copiato."/> + <check_box label="Trasferisci" name="checkbox next owner can transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto."/> <text name="B:"> B: </text> diff --git a/indra/newview/skins/default/xui/it/floater_top_objects.xml b/indra/newview/skins/default/xui/it/floater_top_objects.xml index afd6a87646c59e5185f43eed16c4898e2ef7b425..f01ff2e1aa70bb5360d492d878fe8e911fbd0c44 100644 --- a/indra/newview/skins/default/xui/it/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/it/floater_top_objects.xml @@ -4,7 +4,7 @@ Script pesanti </floater.string> <floater.string name="top_scripts_text"> - [COUNT] script richiedono un totale di [TIME] ms + [COUNT] script che impiegano un totale di [TIME] ms e utilizzano [MEMORY] KB </floater.string> <floater.string name="scripts_score_label"> Ora diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml index 825d127287d8752d68561102fb1c5c3e9db82dcb..ae82a89d28d98086e2ea3fbc9a494629389757cf 100644 --- a/indra/newview/skins/default/xui/it/menu_viewer.xml +++ b/indra/newview/skins/default/xui/it/menu_viewer.xml @@ -9,9 +9,11 @@ <menu_item_call label="Luoghi..." name="Places"/> <menu_item_call label="Preferiti..." name="Picks"/> <menu_item_call label="Esperienze..." name="Experiences"/> + <menu_item_call label="I miei Script..." name="MyScripts"/> <menu_item_call label="Controlli fotocamera..." name="Camera Controls"/> <menu label="Spostamento" name="Movement"> <menu_item_call label="Siedi" name="Sit Down Here"/> + <menu_item_call label="Alzati" name="Stand up"/> <menu_item_check label="Vola" name="Fly"/> <menu_item_check label="Corri sempre" name="Always Run"/> <menu_item_call label="Ferma animazione" name="Stop Animating My Avatar"/> diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml index 0abcde80e0cd5efd7f39beafa9ea891e863ce3d6..07a3eb5095ac57a8684b986396d760d99ba12170 100644 --- a/indra/newview/skins/default/xui/it/notifications.xml +++ b/indra/newview/skins/default/xui/it/notifications.xml @@ -244,6 +244,10 @@ Scegli solo un oggetto e riprova. Nota: Se attivi questa opzione, chiunque usa questo computer può vedere l'elenco di luoghi preferiti. <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="AllowMultipleViewers"> + Non è possibile utilizzare più di un viewer Second Life contemporaneamente. L’utilizzo simultaneo potrebbe portare a collisioni o corruzione della cache texture, e ad un peggioramento nelle immagini e nella performance. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="GrantModifyRights"> Quando concedi i diritti di modifica ad un altro residente, gli permetti di modificare, eliminare o prendere QUALSIASI oggetto che possiedi in Second Life. Pertanto ti consigliamo di essere ben sicuro quando concedi questo diritto. Vuoi concedere i diritti di modifica a [NAME]? @@ -716,8 +720,8 @@ La qualità grafica può essere aumentata in Preferenze > Grafica. </notification> <notification name="CannotCopyWarning"> Non hai l'autorizzazione a copiare i seguenti oggetti: -[ITEMS] -e se li dai via, verranno eliminati dal tuo inventario. Sicuro di volere offrire questi oggetti? +<nolink>[ITEMS]</nolink> +e se li dai via, verranno eliminati dal tuo inventario. Sicuro di voler offrire questi oggetti? <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/> </notification> <notification name="CannotGiveItem"> @@ -1569,6 +1573,30 @@ Eccede il [MAX_AGENTS] [LIST_TYPE] limite di [NUM_EXCESS]. <notification name="ProblemAddingEstateManagerBanned"> Impossibile aggiungere il residente espulso alla lista dei gestori delle proprietà . </notification> + <notification name="ProblemBanningEstateManager"> + Impossibile aggiunere il gestore della proprietà immobiliare [AGENT] all’elenco degli espulsi. + </notification> + <notification name="GroupIsAlreadyInList"> + <nolink>[GROUP]</nolink> si trova già nell’elenco dei Gruppi ammessi. + </notification> + <notification name="AgentIsAlreadyInList"> + [AGENT] è gia nel tuo elenco [LIST_TYPE]. + </notification> + <notification name="AgentsAreAlreadyInList"> + [AGENT] è gia nel tuo elenco [LIST_TYPE]. + </notification> + <notification name="AgentWasAddedToList"> + [AGENT] è stato aggiunto all’elenco [LIST_TYPE] di [ESTATE]. + </notification> + <notification name="AgentsWereAddedToList"> + [AGENT] è stato aggiunto all’elenco [LIST_TYPE] di [ESTATE]. + </notification> + <notification name="AgentWasRemovedFromList"> + [AGENT] è stato rimosso dall’elenco [LIST_TYPE] di [ESTATE]. + </notification> + <notification name="AgentsWereRemovedFromList"> + [AGENT] è stato rimosso dall’elenco [LIST_TYPE] di [ESTATE]. + </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> Impossibile cambiare l'aspetto fisico finchè gli abiti e i vestiti non sono caricati. </notification> @@ -1585,9 +1613,25 @@ Imposta l'oggetto per la vendita e riprova. [DOWNLOAD_PATH]. </notification> <notification name="RequiredUpdate"> - É richiesta la versione [VERSION] per l’accesso. Sembra che dovresti avere la versione aggiornata, ma cosà non é. Scaricala da https://secondlife.com/support/downloads/ + Per effettuare l'accesso è richiesta la versione [VERSION]. +Scaricala dal sito https://secondlife.com/support/downloads/ + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PauseForUpdate"> + Per effettuare l'accesso è richiesta la versione [VERSION]. +Fai clic su OK per scaricarla e installarla. <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="OptionalUpdateReady"> + La versione [VERSION] è stata scaricata ed è pronta per essere installata. +Fai clic su OK per installarla. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PromptOptionalUpdate"> + La versione [VERSION] è stata scaricata ed è pronta per essere installata. +Vuoi procedere? + <usetemplate canceltext="Non adesso" name="yesnocancelbuttons" notext="Salta" yestext="Installa"/> + </notification> <notification name="LoginFailedUnknown"> Spiacenti, accesso non riuscito per ragioni sconosciute. Se continui a visualizzare questo messaggio, visita il [SUPPORT_SITE]. <usetemplate name="okbutton" yestext="Chiudi"/> @@ -1872,7 +1916,7 @@ Cambierà migliaia di regioni e produrrà seri problemi ai vari server. <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà " yestext="Questa proprietà "/> </notification> <notification label="Seleziona la proprietà " name="EstateBannedAgentRemove"> - Rimuovi questo residente dalla lista dei residenti bloccati nell'accesso solo a questa proprietà oppure per [ALL_ESTATES]? + Rimuovi questo Residente dall’elenco degli espulsi solo per questa proprietà immobiliare oppure per [ALL_ESTATES]? <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà " yestext="Questa proprietà "/> </notification> <notification label="Seleziona la proprietà " name="EstateManagerAdd"> @@ -3051,15 +3095,6 @@ Non consentire l'accesso se non comprendi perfettamente il motivo per cui d <button name="Deny" text="Nega"/> </form> </notification> - <notification name="UnknownScriptQuestion"> - L'autorizzazione per script runtime richiesta da '<nolink>[OBJECTNAME]</nolink>', un oggetto di proprietà di '[NAME]', non è stata riconosciuta nel viewer e non può essere concessa. - -Per concedere questa autorizzazione è necessario che il viewer venga aggiornato alla versione più recente da [DOWNLOADURL]. - <form name="form"> - <button name="Deny" text="Ok"/> - <button name="Mute" text="Blocca"/> - </form> - </notification> <notification name="ScriptDialog"> '<nolink>[TITLE]</nolink>' di [NAME] [MESSAGE] @@ -3164,16 +3199,22 @@ Clicca su Accetta per unirti alla chat oppure su Declina per declinare l'in Collegamento a [VOICE_CHANNEL_NAME] non riuscito, riprova più tardi. Verrai ora ricollegato alla chat vocale nei dintorni. </notification> <notification name="VoiceEffectsExpired"> - Almeno una delle manipolazioni vocali alle quali sei iscritto è scaduta. -[[URL] Fai clic qui] per rinnovare l'abbonamento. + Almeno una delle manipolazioni vocali alle quali sei iscritto è scaduta. +[[URL] Fai clic qui] per rinnovare l'abbonamento. + +Se sei un membro Premium, [[PREMIUM_URL] fai clic qui] per ricevere in regalo la manipolazione vocale. </notification> <notification name="VoiceEffectsExpiredInUse"> - Poiché la manipolazione vocale attiva è scaduta, sono state applicate le tue impostazioni normali. -[[URL] Fai clic qui] per rinnovare l'abbonamento. + Poiché la manipolazione vocale attiva è scaduta, sono state applicate le tue impostazioni normali. +[[URL] Fai clic qui] per rinnovare l'abbonamento. + +Se sei un membro Premium, [[PREMIUM_URL] fai clic qui] per ricevere in regalo la manipolazione vocale. </notification> <notification name="VoiceEffectsWillExpire"> - Almeno una delle tue manipolazioni vocali scadrà tra meno di [INTERVAL] giorni. -[[URL] Fai clic qui] per rinnovare l'abbonamento. + Almeno una delle tue manipolazioni vocali scadrà tra meno di [INTERVAL] giorni. +[[URL] Fai clic qui] per rinnovare l'abbonamento. + +Se sei un membro Premium, [[PREMIUM_URL] fai clic qui] per ricevere in regalo la manipolazione vocale. </notification> <notification name="VoiceEffectsNew"> Sono disponibili nuove manipolazioni vocali. @@ -3225,6 +3266,9 @@ Per sicurezza, verranno bloccati per alcuni secondi. <notification name="SnapshotToComputerFailed"> Salvataggio istantanea in [PATH] non riuscito: Il disco è pieno. Sono necessari [NEED_MEMORY] KB ma sono disponibili solo [FREE_MEMORY] KB . </notification> + <notification name="SnapshotToLocalDirNotExist"> + Salvataggio istantanea in [PATH] non riuscito: La cartella non esiste. + </notification> <notification name="PresetNotSaved"> Errore durante il salvataggio del valore predefinito [NAME]. </notification> @@ -3715,13 +3759,13 @@ non è nella stessa regione in cui ti trovi. Non puoi creare alberi ed erba su terreni che non sono di tua proprietà . </notification> <notification name="NoCopyPermsNoObject"> - Copia non riuscita perché non hai l'autorizzazione necessaria per copiare l'oggetto '[OBJ_NAME]'. + Copia non riuscita perché non hai il permesso per copiare l’oggetto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoTransPermsNoObject"> - La copia non è riuscita perché '[OBJ_NAME]' non può essere trasferito a te. + Copia non riuscita perché l’oggetto <nolink>'[OBJ_NAME]'</nolink> non può esserti trasferito. </notification> <notification name="AddToNavMeshNoCopy"> - La copia non è riuscita perché '[OBJ_NAME]' contribuisce al navmesh. + Copia non riuscita perché l’oggetto <nolink>'[OBJ_NAME]'</nolink> contribuisce al navmesh. </notification> <notification name="DupeWithNoRootsSelected"> Duplicato senza oggetto principale selezionato. @@ -3766,34 +3810,34 @@ Riprova tra un minuto. Opzione Salva nell'inventario disattivata </notification> <notification name="NoExistNoSaveToContents"> - Impossibile salvare '[OBJ_NAME]' nei contenuti dell'oggetto perché l'oggetto da cui è stato razzato non esiste più. + Impossibile salvare <nolink>'[OBJ_NAME]'</nolink> in contenuti oggetto perché l’oggetto da cui è stato rezzato non esiste più. </notification> <notification name="NoModNoSaveToContents"> - Impossibile salvare '[OBJ_NAME]' nei contenuti dell'oggetto perché non hai l'autorizzazione necessaria per modificare l'oggetto '[DEST_NAME]'. + Impossibile salvare <nolink>'[OBJ_NAME]'</nolink> in contenuti oggetto perché non hai i permessi per modificare l’oggetto <nolink>'[DEST_NAME]’</nolink>. </notification> <notification name="NoSaveBackToInvDisabled"> - Impossibile riportare '[OBJ_NAME]' nell'inventario -- questa operazione è stata disattivata. + Impossibile salvare <nolink>'[OBJ_NAME]'</nolink> nell’inventario: questa operazione è stata disabilitata. </notification> <notification name="NoCopyNoSelCopy"> - Non puoi copiare l'elemento selezionato perché non hai l'autorizzazione necessaria per copiare l'oggetto '[OBJ_NAME]'. + Non puoi copiare la selezione perché non hai il permesso di copiare l’oggetto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoTransNoSelCopy"> - Non puoi copiare la selezione perché l'oggetto '[OBJ_NAME]' non può essere trasferito. + Non puoi copiare la selezione perché l’oggetto <nolink>'[OBJ_NAME]'</nolink> non è trasferibile. </notification> <notification name="NoTransNoCopy"> - Non puoi copiare la selezione perché l'oggetto '[OBJ_NAME]' non può essere trasferito. + Non puoi copiare la selezione perché l’oggetto <nolink>'[OBJ_NAME]'</nolink> non è trasferibile. </notification> <notification name="NoPermsNoRemoval"> - La rimozione dell'oggetto '[OBJ_NAME]' dal simulatore non è consentita dal sistema delle autorizzazioni. + La rimozione dell’oggetto <nolink>'[OBJ_NAME]'</nolink> dal simulatore è disattivata dal sistema dei permessi. </notification> <notification name="NoModNoSaveSelection"> - Non puoi salvare l'elemento selezionato perché non hai l'autorizzazione necessaria per modificare l'oggetto '[OBJ_NAME]'. + Non puoi copiare la selezione perché non hai il permesso di modificare l’oggetto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoCopyNoSaveSelection"> - Non puoi salvare la selezione perché l'oggetto '[OBJ_NAME]' non può essere copiato. + Non puoi copiare la selezione perché l’oggetto <nolink>'[OBJ_NAME]'</nolink> non è copiabile. </notification> <notification name="NoModNoTaking"> - Non puoi prendere l'elemento selezionato perché non hai l'autorizzazione necessaria per modificare l'oggetto '[OBJ_NAME]'. + Non puoi prendere ciò che hai selezionato perché non hai il permesso di modificare l’oggetto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="RezDestInternalError"> Errore interno: Tipo di destinazione sconosciuto. diff --git a/indra/newview/skins/default/xui/it/panel_login.xml b/indra/newview/skins/default/xui/it/panel_login.xml index 6c1777163cd56f860498fd45fa99d27db64faf4b..228bebd92ae3aa620869f9df99c7489636d58c46 100644 --- a/indra/newview/skins/default/xui/it/panel_login.xml +++ b/indra/newview/skins/default/xui/it/panel_login.xml @@ -1,6 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <panel name="panel_login"> - <panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=it</panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php?lang=it + </panel.string> + <panel.string name="sign_up_url"> + http://join.secondlife.com/ + </panel.string> <layout_stack name="ui_stack"> <layout_panel name="ui_container"> <combo_box label="Nome utente" name="username_combo" tool_tip="Il nome utente che hai scelto durante la registrazione, come roby12 o Stella Solare"/> @@ -11,8 +16,13 @@ </combo_box> <button label="Accedi" name="connect_btn"/> <check_box label="Ricordami" name="remember_check"/> - <text name="forgot_password_text">Password dimenticata</text> + <text name="forgot_password_text"> + Password dimenticata + </text> <combo_box label="Seleziona griglia" name="server_combo"/> + <text name="sign_up_text"> + Registrati + </text> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/it/panel_login_first.xml b/indra/newview/skins/default/xui/it/panel_login_first.xml index 6f120a17fca4db15e9bba21ed1a16f4e74f377f8..5b04fd411a82ec332a892bbf69970c9582e66cdd 100644 --- a/indra/newview/skins/default/xui/it/panel_login_first.xml +++ b/indra/newview/skins/default/xui/it/panel_login_first.xml @@ -3,6 +3,9 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php?lang=it </panel.string> + <panel.string name="sign_up_url"> + http://join.secondlife.com/ + </panel.string> <layout_stack name="logo_stack"> <layout_panel name="parent_panel2"> <layout_stack name="widget_stack"> @@ -14,6 +17,9 @@ <text name="forgot_password_text"> Password dimenticata </text> + <text name="sign_up_text"> + Registrati + </text> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_general.xml b/indra/newview/skins/default/xui/it/panel_preferences_general.xml index ef999d03c0f089f965f941dc16c822a3d6cb0c8b..49edc0aa12f06a4b33bf8a179f71b0dd1b46dbc3 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_general.xml @@ -4,7 +4,6 @@ Lingua: </text> <combo_box name="language_combobox"> - <combo_box.item label="Default di sistema" name="System Default Language"/> <combo_box.item label="English" name="English"/> <combo_box.item label="Dansk (Danese) - Beta" name="Danish"/> <combo_box.item label="Deutsch (Tedesco) - Beta" name="Deutsch(German)"/> diff --git a/indra/newview/skins/default/xui/it/panel_region_access.xml b/indra/newview/skins/default/xui/it/panel_region_access.xml new file mode 100644 index 0000000000000000000000000000000000000000..06ab2b40e79850bbf6d236ea62bc08266bb373d7 --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_region_access.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="ACCESSO" name="Access"> + <tab_container name="tabs"> + <panel label="GESTORI DELLE PROPRIETÀ IMMOBILIARI" name="estate_managers_panel"> + <text name="estate_manager_label"> + Gestori delle proprietà immobiliari + </text> + <name_list name="estate_manager_name_list"> + <columns label="Nome" name="name"/> + </name_list> + <button label="Aggiungi..." name="add_estate_manager_btn"/> + <button label="Rimuovi..." name="remove_estate_manager_btn"/> + </panel> + <panel label="AMMESSO" name="allowed_panel"> + <panel label="top_panel" name="allowed_search_panel"> + <filter_editor label="Cerca agenti ammessi" name="allowed_search_input"/> + </panel> + <text name="allow_resident_label"> + Sempre ammesso: + </text> + <name_list name="allowed_avatar_name_list"> + <columns label="Nome" name="name"/> + </name_list> + <button label="Aggiungi..." name="add_allowed_avatar_btn"/> + <button label="Rimuovi..." name="remove_allowed_avatar_btn"/> + </panel> + <panel label="GRUPPI AMMESSI" name="allowed_groups_panel"> + <panel label="top_panel" name="allowed_group_search_panel"> + <filter_editor label="Cerca gruppi consentiti" name="allowed_group_search_input"/> + </panel> + <text name="allow_group_label"> + Gruppi sempre consentiti: + </text> + <name_list name="allowed_group_name_list"> + <columns label="Nome" name="name"/> + </name_list> + <button label="Aggiungi..." name="add_allowed_group_btn"/> + <button label="Rimuovi..." name="remove_allowed_group_btn"/> + </panel> + <panel label="ESPULSI" name="banned_panel"> + <panel label="top_panel" name="banned_search_panel"> + <filter_editor label="Cerca agenti espulsi" name="banned_search_input"/> + </panel> + <text name="ban_resident_label"> + Sempre espulsi: + </text> + <name_list name="banned_avatar_name_list"> + <columns label="Nome" name="name"/> + <columns label="Ultima data di accesso" name="last_login_date"/> + <columns label="Data espulsione" name="ban_date"/> + <columns label="Espulso da" name="bannedby"/> + </name_list> + <button label="Aggiungi..." name="add_banned_avatar_btn"/> + <button label="Rimuovi..." name="remove_banned_avatar_btn"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/it/panel_region_estate.xml b/indra/newview/skins/default/xui/it/panel_region_estate.xml index 3983d251115a31cc94969abb530f30619c86e8ed..b4422e4c609598059f2560d5b48e92cc3376a021 100644 --- a/indra/newview/skins/default/xui/it/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/it/panel_region_estate.xml @@ -16,7 +16,7 @@ (sconosciuto) </text> <radio_group name="externally_visible_radio"> - <radio_item label="Consenti solo residenti e gruppi elencati qui sotto" name="estate_restricted_access"/> + <radio_item label="Consenti accesso solo ai residenti e ai gruppi elencati nella scheda di Accesso" name="estate_restricted_access"/> <radio_item label="Chiunque può visitare" name="estate_public_access"/> </radio_group> <check_box label="È necessario avere più di 18 anni" name="limit_age_verified" tool_tip="Per poter visitare questa proprietà immobiliare i Residenti devono avere almeno 18 anni. Vedi [SUPPORT_SITE] per maggiori informazioni."/> diff --git a/indra/newview/skins/default/xui/it/panel_status_bar.xml b/indra/newview/skins/default/xui/it/panel_status_bar.xml index 295ca8d9f2df0f47afc939559477eda0e1b078ba..160fd4e1809bdb8b20aabfc9139743fabe97bdf2 100644 --- a/indra/newview/skins/default/xui/it/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/it/panel_status_bar.xml @@ -1,16 +1,31 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="status"> - <panel.string name="packet_loss_tooltip">Perdita di pacchetti</panel.string> - <panel.string name="bandwidth_tooltip">Larghezza di banda</panel.string> - <panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string> - <panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string> - <panel.string name="buycurrencylabel">L$ [AMT]</panel.string> + <panel.string name="packet_loss_tooltip"> + Perdita di pacchetti + </panel.string> + <panel.string name="bandwidth_tooltip"> + Larghezza di banda + </panel.string> + <panel.string name="time"> + [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> + [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] + </panel.string> + <panel.string name="buycurrencylabel"> + L$ [AMT] + </panel.string> + <panel name="menu_search_panel"> + <search_editor label="Ricerca Menu" name="search_menu_edit" tool_tip="Digita qui il termine della tua ricerca. I risultati verranno mostrati secondo la concordanza parziale o totale con il menú."/> + </panel> <panel left="-426" name="balance_bg" width="195"> <text name="balance" tool_tip="Clicca per aggiornare il tuo saldo in L$" value="L$ ??"/> <button label="Acquista L$" name="buyL" tool_tip="Clicca per acquistare più L$"/> <button label="Acquisti" name="goShop" tool_tip="Apri Mercato Second Life" width="75"/> </panel> - <text name="TimeText" tool_tip="Orario attuale (Pacifico)">24:00, ora del Pacifico</text> + <text name="TimeText" tool_tip="Orario attuale (Pacifico)"> + 24:00, ora del Pacifico + </text> <button name="media_toggle_btn" tool_tip="Attiva/ferma tutti i media (musica, video, pagine Web)"/> <button name="volume_btn" tool_tip="Regolazione del volume globale"/> </panel> diff --git a/indra/newview/skins/default/xui/it/sidepanel_item_info.xml b/indra/newview/skins/default/xui/it/sidepanel_item_info.xml index 14c1c43816115e387b49cbb256f80981cb0d4be1..9d659bb50dcd12d92ab260c1d044fb5c415af217 100644 --- a/indra/newview/skins/default/xui/it/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/it/sidepanel_item_info.xml @@ -34,9 +34,11 @@ <text name="LabelItemNameTitle"> Nome: </text> + <line_editor name="LabelItemName" tool_tip="Il nome è limitato a 63 caratteri. Prim con nomi più lunghi verranno accorciati. I nomi possono avere solamente caratteri stampabili facenti parte del codice ASCII-7 (non esteso), con l'eccezione della barra verticale '|'."/> <text name="LabelItemDescTitle"> Descrizione: </text> + <line_editor name="LabelItemDesc" tool_tip="Quando la dicitura "Vedi suggerimenti su tutti gli oggetti" è selezionata nelle impostazioni del Viewer, passando il mouse sopra un oggetto si vedrà la sua descrizione. La descrizione dei Prim è limitata a 127 bytes. Se più lunga, verrá troncata."/> <text name="LabelCreatorTitle"> Ideatore: </text> @@ -59,7 +61,7 @@ <text name="AnyoneLabel"> Chiunque: </text> - <check_box label="Copia" name="CheckEveryoneCopy"/> + <check_box label="Copia" name="CheckEveryoneCopy" tool_tip="Chiunque può prendere una copia di questo oggetto. L'oggetto e tutti i suoi contenuti devono avere il permesso di copia e trasferimento."/> <text name="GroupLabel"> Gruppo: </text> @@ -67,17 +69,17 @@ <text name="NextOwnerLabel"> Proprietario successivo: </text> - <check_box label="Modifica" name="CheckNextOwnerModify"/> - <check_box label="Copia" name="CheckNextOwnerCopy"/> - <check_box label="Trasferisci" name="CheckNextOwnerTransfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/> + <check_box label="Modifica" name="CheckNextOwnerModify" tool_tip="Il prossimo proprietario può modificare le proprietà dell'oggetto come il nome o la scala."/> + <check_box label="Copia" name="CheckNextOwnerCopy" tool_tip="Il proprietario successivo può prendere infinite copie di questo oggetto. Le copie mantengono le informazioni sul creatore, e non possono avere permessi maggiori di quelli posseduti dall'oggetto copiato."/> + <check_box label="Trasferisci" name="CheckNextOwnerTransfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto."/> </panel> - <check_box label="In vendita" name="CheckPurchase"/> - <combo_box name="ComboBoxSaleType"> + <check_box label="In vendita" name="CheckPurchase" tool_tip="Permette alla gente di comprare questo oggetto, il suo contenuto o la sua copia virtuale ad un prezzo stabilito."/> + <combo_box name="ComboBoxSaleType" tool_tip="Decidi se vuoi che il compratore riceva una copia, una copia del contenuto o l'oggetto stesso."> <combo_box.item label="Copia" name="Copy"/> <combo_box.item label="Contenuti" name="Contents"/> <combo_box.item label="Originale" name="Original"/> </combo_box> - <spinner label="Prezzo: L$" name="Edit Cost"/> + <spinner label="Prezzo: L$" name="Edit Cost" tool_tip="Costo oggetto."/> </panel> </scroll_container> <panel name="button_panel"> diff --git a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml index aabefd7d3c97bbe4ce31e7a267cecddc6ec60204..a96bb153995de61d58bcedaa8dca6be70380c8fd 100644 --- a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml @@ -1,71 +1,136 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="object properties" title="Profilo dell'oggetto"> - <panel.string name="text deed continued">Cessione</panel.string> - <panel.string name="text deed">Cessione</panel.string> - <panel.string name="text modify info 1">Tu puoi modificare questo oggetto</panel.string> - <panel.string name="text modify info 2">Tu puoi modificare questi oggetti</panel.string> - <panel.string name="text modify info 3">Non puoi modificare questo oggetto</panel.string> - <panel.string name="text modify info 4">Non puoi modificare questi oggetti</panel.string> - <panel.string name="text modify info 5">Questo oggetto non può essere modificato attraverso il confine di una regione</panel.string> - <panel.string name="text modify info 6">Questi oggetti non possono essere modificati attraverso il confine di una regione</panel.string> - <panel.string name="text modify warning">Questo oggetto ha parti collegate</panel.string> - <panel.string name="Cost Default">Prezzo: L$</panel.string> - <panel.string name="Cost Total">Prezzo totale: L$</panel.string> - <panel.string name="Cost Per Unit">Prezzo per: L$</panel.string> - <panel.string name="Cost Mixed">Prezzo misto</panel.string> - <panel.string name="Sale Mixed">Vendita mista</panel.string> + <panel.string name="text deed continued"> + Cessione + </panel.string> + <panel.string name="text deed"> + Cessione + </panel.string> + <panel.string name="text modify info 1"> + Tu puoi modificare questo oggetto + </panel.string> + <panel.string name="text modify info 2"> + Tu puoi modificare questi oggetti + </panel.string> + <panel.string name="text modify info 3"> + Non puoi modificare questo oggetto + </panel.string> + <panel.string name="text modify info 4"> + Non puoi modificare questi oggetti + </panel.string> + <panel.string name="text modify info 5"> + Questo oggetto non può essere modificato attraverso il confine di una regione + </panel.string> + <panel.string name="text modify info 6"> + Questi oggetti non possono essere modificati attraverso il confine di una regione + </panel.string> + <panel.string name="text modify warning"> + Questo oggetto ha parti collegate + </panel.string> + <panel.string name="Cost Default"> + Prezzo: L$ + </panel.string> + <panel.string name="Cost Total"> + Prezzo totale: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Prezzo per: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Prezzo misto + </panel.string> + <panel.string name="Sale Mixed"> + Vendita mista + </panel.string> <text name="title" value="Profilo dell'oggetto"/> <text name="where" value="(in Second Life)"/> <panel label="" name="properties_panel"> - <text name="Name:">Nome:</text> - <text name="Description:">Descrizione:</text> - <text name="CreatorNameLabel">Ideatore:</text> - <text name="Owner:">Proprietario:</text> - <text name="Group_label">Gruppo:</text> + <text name="Name:"> + Nome: + </text> + <line_editor name="Object Name" tool_tip="Il nome è limitato a 63 caratteri. Prim con nomi più lunghi verranno accorciati. I nomi possono avere solamente caratteri stampabili facenti parte del codice ASCII-7 (non esteso), con l'eccezione della barra verticale '|'."/> + <text name="Description:"> + Descrizione: + </text> + <line_editor name="Object Description" tool_tip="Quando la dicitura "Vedi suggerimenti su tutti gli oggetti" è selezionata nelle impostazioni del Viewer, passando il mouse sopra un oggetto si vedrà la sua descrizione. La descrizione dei Prim è limitata a 127 bytes. Se più lunga, verrá troncata."/> + <text name="CreatorNameLabel"> + Ideatore: + </text> + <text name="Owner:"> + Proprietario: + </text> + <text name="Group_label"> + Gruppo: + </text> <button name="button set group" tool_tip="Scegli un gruppo con cui condividere i diritti relativi all'oggetto"/> <name_box initial_value="Caricamento in corso..." name="Group Name Proxy"/> <button label="Cessione" label_selected="Cessione" name="button deed" tool_tip="Con una cessione si trasferisce il bene con i diritti al proprietario successivo Gli oggetti in proprietà condivisa di gruppo possono essere ceduti soltanto da un funzionario del gruppo."/> - <text name="label click action">Fai clic per:</text> - <combo_box name="clickaction"> + <text name="label click action"> + Fai clic per: + </text> + <combo_box name="clickaction" tool_tip="Con l'azione "clic singolo" puoi interagire con un oggetto semplicemente cliccandolo una volta. Ogni azione "clic singolo" ha un cursore speciale che indica il suo effetto. Alcune azioni "clic singolo" hanno dei requisiti per funzionare. Ad esempio per il comando "Touch and Pay" sono necessari degli script."> <combo_box.item label="Tocca (predefinito)" name="Touch/grab(default)"/> <combo_box.item label="Siediti sull'oggetto" name="Sitonobject"/> <combo_box.item label="Acquista oggetto" name="Buyobject"/> <combo_box.item label="Paga oggetto" name="Payobject"/> <combo_box.item label="Apri" name="Open"/> <combo_box.item label="Ingrandisci" name="Zoom"/> + <combo_box.item label="Nessuno" name="None"/> </combo_box> <panel name="perms_inv"> - <text name="perm_modify">Tu puoi modificare questo oggetto</text> - <text name="Anyone can:">Chiunque:</text> - <check_box label="Copia" name="checkbox allow everyone copy"/> - <check_box label="Sposta" name="checkbox allow everyone move"/> - <text name="GroupLabel">Gruppo:</text> + <text name="perm_modify"> + Tu puoi modificare questo oggetto + </text> + <text name="Anyone can:"> + Chiunque: + </text> + <check_box label="Copia" name="checkbox allow everyone copy" tool_tip="Chiunque può prendere una copia di questo oggetto. L'oggetto e tutti i suoi contenuti devono avere il permesso di copia e trasferimento."/> + <check_box label="Sposta" name="checkbox allow everyone move" tool_tip="Chiunque può muovere l'oggetto."/> + <text name="GroupLabel"> + Gruppo: + </text> <check_box label="Condividi" name="checkbox share with group" tool_tip="Consenti a tutti i membri del gruppo selezionato di condividere i tuoi diritti di modifica di questo oggetto. Per attivare le restrizioni per ruolo devi prima effettuare la cessione."/> - <text name="NextOwnerLabel">Proprietario successivo:</text> - <check_box label="Modifica" name="checkbox next owner can modify"/> - <check_box label="Copia" name="checkbox next owner can copy"/> + <text name="NextOwnerLabel"> + Proprietario successivo: + </text> + <check_box label="Modifica" name="checkbox next owner can modify" tool_tip="Il prossimo proprietario può modificare le proprietà dell'oggetto come il nome o la scala."/> + <check_box label="Copia" name="checkbox next owner can copy" tool_tip="Il proprietario successivo può prendere infinite copie di questo oggetto. Le copie mantengono le informazioni sul creatore, e non possono avere permessi maggiori di quelli posseduti dall'oggetto copiato."/> <check_box label="Trasferisci" name="checkbox next owner can transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/> </panel> - <check_box label="In vendita" name="checkbox for sale"/> - <combo_box name="sale type"> + <check_box label="In vendita" name="checkbox for sale" tool_tip="Permette alla gente di comprare questo oggetto, il suo contenuto o la sua copia virtuale ad un prezzo stabilito."/> + <combo_box name="sale type" tool_tip="Decidi se vuoi che il compratore riceva una copia, una copia del contenuto o l'oggetto stesso."> <combo_box.item label="Copia" name="Copy"/> <combo_box.item label="Contenuto" name="Contents"/> <combo_box.item label="Originale" name="Original"/> </combo_box> - <spinner label="Prezzo: L$" name="Edit Cost"/> + <spinner label="Prezzo: L$" name="Edit Cost" tool_tip="Costo oggetto."/> <check_box label="Mostra nella ricerca" name="search_check" tool_tip="Permetti alle persone di vedere questo oggetto nei risultati della ricerca"/> - <text name="pathfinding_attributes_label">Attributi pathfinding:</text> - <text name="B:">B:</text> - <text name="O:">O:</text> - <text name="G:">G:</text> - <text name="E:">E:</text> - <text name="N:">N:</text> - <text name="F:">F:</text> + <text name="pathfinding_attributes_label"> + Attributi pathfinding: + </text> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> </panel> <panel name="button_panel"> - <button label="Apri" name="open_btn"/> - <button label="Paga" name="pay_btn"/> - <button label="Acquista" name="buy_btn"/> - <button label="Dettagli" name="details_btn"/> + <button label="Apri" name="open_btn" tool_tip="Apri per vedere i Contenuti dell'Oggetto."/> + <button label="Paga" name="pay_btn" tool_tip="Apri finestra di Pagamento. L'oggetto deve avere uno script di pagamento affinchè tutto ciò funzioni."/> + <button label="Acquista" name="buy_btn" tool_tip="Apri finestra Acquisto. È necessario che l'oggetto sia impostato per la vendita."/> + <button label="Dettagli" name="details_btn" tool_tip="Apri finestra Ispezione oggetto."/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index 918e655ab6ca91d10339a53bdcfc650198f0b263..9492d062c3a162a5e8b704880d56c1500224f255 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -645,7 +645,7 @@ Prova ad accedere nuovamente tra un minuto. Note sulla versione </string> <string name="RELEASE_NOTES_BASE_URL"> - http://wiki.secondlife.com/wiki/Release_Notes/ + https://releasenotes.secondlife.com/viewer/ </string> <string name="LoadingData"> In caricamento... @@ -2213,6 +2213,18 @@ Se continui a ricevere questo messaggio, contatta l'assistenza Second Life <string name="RegionInfoListTypeBannedAgents"> Sempre esclusi: </string> + <string name="RegionInfoAllEstates"> + tutte le proprietà immobiliari + </string> + <string name="RegionInfoManagedEstates"> + proprietà immobiliari che gestisci + </string> + <string name="RegionInfoThisEstate"> + questa proprietà immobiliare + </string> + <string name="AndNMore"> + e [EXTRA_COUNT] ancora + </string> <string name="ScriptLimitsParcelScriptMemory"> Memoria dello script del lotto </string> @@ -2256,7 +2268,7 @@ Se continui a ricevere questo messaggio, contatta l'assistenza Second Life Petto </string> <string name="ATTACH_HEAD"> - Testa + Cranio </string> <string name="ATTACH_LSHOULDER"> Spalla sinistra @@ -2277,7 +2289,7 @@ Se continui a ricevere questo messaggio, contatta l'assistenza Second Life Piede destro </string> <string name="ATTACH_BACK"> - Indietro + Spina dorsale </string> <string name="ATTACH_PELVIS"> Pelvi @@ -2334,7 +2346,7 @@ Se continui a ricevere questo messaggio, contatta l'assistenza Second Life Polpaccio sinistro </string> <string name="ATTACH_BELLY"> - Addome + Stomaco </string> <string name="ATTACH_LEFT_PEC"> Petto sinistro @@ -5656,4 +5668,25 @@ Prova a racchiudere il percorso dell'editor in doppie virgolette. <string name="Mav_Details_MAV_UNKNOWN_VERSION"> La versione della forma fisica non è corretta. Imposta la versione corretta per il modello della fisica. </string> + <string name="couldnt_resolve_host"> + Il DNS non ha potuto risolvere il nome dell’host([HOSTNAME]). +Verifica di riuscire a connetterti al sito web www.secondlife.com. +Se riesci ma continui a ricevere questo errore, visita la sezione +Assistenza e segnala il problema. + </string> + <string name="ssl_peer_certificate"> + Il server per il login non ha potuto effettuare la verifica tramite SSL. +Se continui a ricevere questo errore, visita +la sezione Assistenza nel sito SecondLife.com +e segnala il problema. + </string> + <string name="ssl_connect_error"> + Spesso l’errore è dovuto all’orologio del computer, impostato incorrettamente. +Vai al Pannello di Controllo e assicurati che data e ora siano +esatte. Controlla anche che il network e il firewall siano impostati +correttamente. Se continui a ricevere questo errore, visita la sezione +Assistenza nel sito SecondLife.com e segnala il problema. + +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base conoscenze] + </string> </strings> diff --git a/indra/newview/skins/default/xui/ja/floater_auction.xml b/indra/newview/skins/default/xui/ja/floater_auction.xml index e9aa287f2c35804b5ac262e9a26333b2970017ff..21c8d90b01139e25e4770f2bb4718db6b7bb2c81 100644 --- a/indra/newview/skins/default/xui/ja/floater_auction.xml +++ b/indra/newview/skins/default/xui/ja/floater_auction.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="floater_auction" title="リンデンランドã®è²©å£²é–‹å§‹"> <floater.string name="already for sale"> - 売り出ã—ä¸ã®åŒºç”»ã¯ã€ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«å‡ºå“ã§ãã¾ã›ã‚“。 + 販売ä¸ã®åŒºç”»ã‚’オークションã«å‡ºå“ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 </floater.string> - <check_box initial_value="true" label="黄色ã®é¸æŠžãƒ•ã‚§ãƒ³ã‚¹ã‚’å«ã‚ã‚‹" name="fence_check"/> + <check_box initial_value="true" label="黄色ã®ã‚»ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ãƒ•ã‚§ãƒ³ã‚¹ã‚’å«ã‚ã‚‹" name="fence_check"/> <button label="スナップショット" label_selected="スナップショット" name="snapshot_btn"/> <button label="誰ã«ã§ã‚‚販売" label_selected="誰ã«ã§ã‚‚販売" name="sell_to_anyone_btn"/> <button label="è¨å®šã‚’クリア" label_selected="è¨å®šã‚’クリア" name="reset_parcel_btn"/> diff --git a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml index 1b5a745cc46bb633c66413ff8ca3ef744c641dd0..b34fd192a926750e455feacfcb25b6009a28497f 100644 --- a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml @@ -38,17 +38,17 @@ <text name="GroupLabel"> グループ: </text> - <check_box label="共有" name="share_with_group"/> + <check_box label="共有" name="share_with_group" tool_tip="è¨å®šã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼å…¨å“¡ã«ã“ã®ã‚ªãƒ–ジェクトã®ä¿®æ£æ¨©é™ã‚’与ãˆã¾ã™ã€‚è²æ¸¡ã—ãªã„é™ã‚Šã€å½¹å‰²åˆ¶é™ã‚’有効ã«ã¯ã§ãã¾ã›ã‚“。"/> <text name="AnyoneLabel"> 全員: </text> - <check_box label="コピー" name="everyone_copy"/> + <check_box label="コピー" name="everyone_copy" tool_tip="オブジェクトã®ã‚³ãƒ”ーã¯èª°ã§ã‚‚å—ã‘å–ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚オブジェクトã¨ãã®ã‚ªãƒ–ジェクトã®ä¸èº«ã¯ã™ã¹ã¦ã€ã‚³ãƒ”ーã¾ãŸã¯è²æ¸¡ã§ãるよã†ã«è¨å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™"/> <text name="NextOwnerLabel"> 次ã®æ‰€æœ‰è€…: </text> - <check_box label="ä¿®æ£" name="next_owner_modify"/> - <check_box label="コピー" name="next_owner_copy"/> - <check_box initial_value="true" label="å†è²©ãƒ»ãƒ—レゼント" name="next_owner_transfer" tool_tip="次ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"/> + <check_box label="ä¿®æ£" name="next_owner_modify" tool_tip="次ã®æ‰€æœ‰è€…ã¯ã€ã‚¢ã‚¤ãƒ†ãƒ åãªã©ã®ãƒ—ãƒãƒ‘ティ内容を編集ã—ãŸã‚Šã€ã“ã®ã‚ªãƒ–ジェクトã®ã‚µã‚¤ã‚ºã‚’変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/> + <check_box label="コピー" name="next_owner_copy" tool_tip="次ã®æ‰€æœ‰è€…ã¯ã€ã“ã®ã‚ªãƒ–ジェクトを無制é™ã«ã‚³ãƒ”ーã§ãã¾ã™ã€‚コピーã«ã¯åˆ¶ä½œè€…ã®æƒ…å ±ãŒå«ã¾ã‚Œã€ã‚³ãƒ”ー元ã®ã‚¢ã‚¤ãƒ†ãƒ ã¨é•ã£ã¦è¨±å¯ãªã©ã«é–¢ã—制é™ãŒã‚ã‚Šã¾ã™ã€‚"/> + <check_box initial_value="true" label="å†è²©ãƒ»ãƒ—レゼント" name="next_owner_transfer" tool_tip="次ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã§ãã¾ã™ã€‚"/> <button label="OK" name="ok"/> <button label="é©ç”¨" name="apply"/> <button label="ã‚ャンセル" name="close"/> diff --git a/indra/newview/skins/default/xui/ja/floater_my_scripts.xml b/indra/newview/skins/default/xui/ja/floater_my_scripts.xml new file mode 100644 index 0000000000000000000000000000000000000000..c691e37613f404087ff53e448b71b2784140ebc6 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_my_scripts.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="myscripts" title="スクリプト"/> diff --git a/indra/newview/skins/default/xui/ja/floater_preferences.xml b/indra/newview/skins/default/xui/ja/floater_preferences.xml index 7482c4772a2054d6d7e470a627ca8c8f4e66807c..4a316ef6068d5c87a91072bd0c60d1cb77384306 100644 --- a/indra/newview/skins/default/xui/ja/floater_preferences.xml +++ b/indra/newview/skins/default/xui/ja/floater_preferences.xml @@ -5,6 +5,9 @@ </floater.string> <button label="OK" label_selected="OK" name="OK"/> <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/> + <panel name="search_panel"> + <search_editor label="è¨å®šã®æ¤œç´¢" name="search_prefs_edit" tool_tip="検索ã—ãŸã„内容をã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„。è¨å®šã®åå‰ã¾ãŸã¯ã‚³ãƒ¡ãƒ³ãƒˆã«éƒ¨åˆ†çš„ã«ä¸€è‡´ã™ã‚‹çµæžœãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"/> + </panel> <tab_container name="pref core"> <panel label="一般" name="general"/> <panel label="グラフィック" name="display"/> diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml index a67916b50fac00ad18adcd5073d98c9ddbbe3f3e..aec0dbdb555fa9cb77d5564eeba240b5ce7b9bbf 100644 --- a/indra/newview/skins/default/xui/ja/floater_tools.xml +++ b/indra/newview/skins/default/xui/ja/floater_tools.xml @@ -172,9 +172,11 @@ <text name="Name:"> åå‰ï¼š </text> + <line_editor name="Object Name" tool_tip="使用ã§ãã‚‹åå‰ã®æ–‡å—æ•°ã¯æœ€å¤§ 63 æ–‡å—ã¾ã§ã§ã™ã€‚é•·ã„プリムåã¯çŸç¸®ã•ã‚Œã¾ã™ã€‚åå‰ã«ä½¿ç”¨ã§ãã‚‹æ–‡å—㯠ASCII-7 (éžæ‹¡å¼µï¼‰ã«å«ã¾ã‚Œã‚‹å°å—å¯èƒ½ãªæ–‡å—ã®ã¿ã§ã™ï¼ˆç¸¦ç·šã€Œ|ã€ã¯ä¾‹å¤–)。"/> <text name="Description:"> 説明: </text> + <line_editor name="Object Description" tool_tip="ビューワã®è¨å®šã§ [ã™ã¹ã¦ã®ã‚ªãƒ–ジェクト上ã§ãƒ’ントを表示] ãŒé¸æŠžã•ã‚Œã¦ã„ã‚‹å ´åˆã€ã‚ªãƒ–ジェクトã«ãƒžã‚¦ã‚¹ã®ãƒã‚¤ãƒ³ã‚¿ã‚’ã‹ã–ã™ã¨ãã®ã‚ªãƒ–ジェクトã®èª¬æ˜ŽãŒãƒãƒƒãƒ—アップ表示ã•ã‚Œã¾ã™ã€‚プリムã®èª¬æ˜Žã¯æœ€å¤§ 127 ãƒã‚¤ãƒˆã¾ã§ã«åˆ¶é™ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ãれよりも長ã„æ–‡å—列ã¯åˆ‡ã‚Šæ¨ã¦ã‚‰ã‚Œã¾ã™ã€‚"/> <text name="Creator:"> 制作者: </text> @@ -197,17 +199,18 @@ <text name="label click action"> クリックã§ï¼š </text> - <combo_box name="clickaction"> + <combo_box name="clickaction" tool_tip="マウスを 1 回左クリックã™ã‚‹ã¨ã€ã‚ªãƒ–ジェクトã«å¯¾ã—ã¦ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’èµ·ã“ã›ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚å„クリックアクションã«ã¯ã€ä½•ãŒã§ãã‚‹ã‹ã‚’示ã™ç‰¹åˆ¥ãªã‚«ãƒ¼ã‚½ãƒ«ãŒã‚ã‚Šã¾ã™ã€‚クリックアクションã«ã‚ˆã£ã¦ã¯ã€å‹•ä½œè¦ä»¶ãŒå¿…è¦ãªã‚‚ã®ã‚‚ã‚ã‚Šã¾ã™ã€‚ãŸã¨ãˆã°ã€[タッãƒ] ã‚„ [支払ã„] ã«ã¯ã‚¹ã‚¯ãƒªãƒ—トãŒå¿…è¦ã«ãªã‚‹ãªã©ã§ã™"> <combo_box.item label="触る(デフォルト)" name="Touch/grab(default)"/> <combo_box.item label="オブジェクトã«åº§ã‚‹" name="Sitonobject"/> <combo_box.item label="オブジェクトを購入ã™ã‚‹" name="Buyobject"/> <combo_box.item label="オブジェクトã«æ”¯æ‰•ã†" name="Payobject"/> <combo_box.item label="é–‹ã" name="Open"/> <combo_box.item label="ズームã™ã‚‹" name="Zoom"/> + <combo_box.item label="ãªã—" name="None"/> </combo_box> - <check_box label="販売対象:" name="checkbox for sale"/> - <spinner label="L$" name="Edit Cost"/> - <combo_box name="sale type"> + <check_box label="販売対象:" name="checkbox for sale" tool_tip="ã“ã®ã‚ªãƒ–ジェクトやオブジェクトã®ä¸èº«ãŒè³¼å…¥ã§ãるよã†ã«ãªã‚‹ã‹ã€æŒ‡å®šä¾¡æ ¼ã§ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã«ã‚³ãƒ”ーã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚"/> + <spinner label="L$" name="Edit Cost" tool_tip="オブジェクトã®ä¾¡æ ¼ã€‚"/> + <combo_box name="sale type" tool_tip="購入者ãŒã‚³ãƒ”ーã€ã‚³ãƒ”ーã®ä¸èº«ã€ã¾ãŸã¯ã‚¢ã‚¤ãƒ†ãƒ 自体をå—ã‘å–ã‚‹ã®ã‹é¸æŠžã—ã¦ãã ã•ã„。"> <combo_box.item label="コピー" name="Copy"/> <combo_box.item label="ä¸èº«" name="Contents"/> <combo_box.item label="オリジナル" name="Original"/> @@ -220,14 +223,14 @@ <text name="Anyone can:"> 全員: </text> - <check_box label="移動" name="checkbox allow everyone move"/> - <check_box label="コピー" name="checkbox allow everyone copy"/> + <check_box label="移動" name="checkbox allow everyone move" tool_tip="オブジェクトã¯èª°ã§ã‚‚å‹•ã‹ã™ã“ã¨ãŒã§ãã¾ã™ã€‚"/> + <check_box label="コピー" name="checkbox allow everyone copy" tool_tip="オブジェクトã®ã‚³ãƒ”ーã¯èª°ã§ã‚‚å—ã‘å–ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚オブジェクトã¨ãã®ã‚ªãƒ–ジェクトã®ä¸èº«ã¯ã™ã¹ã¦ã€ã‚³ãƒ”ーã¾ãŸã¯è²æ¸¡ã§ãるよã†ã«è¨å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"/> <text name="Next owner can:"> 次ã®æ‰€æœ‰è€…: </text> - <check_box label="ä¿®æ£" name="checkbox next owner can modify"/> - <check_box label="コピー" name="checkbox next owner can copy"/> - <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="checkbox next owner can transfer" tool_tip="次ã«æ‰€æœ‰ã™ã‚‹äººã¯ã€ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã§ãã¾ã™"/> + <check_box label="ä¿®æ£" name="checkbox next owner can modify" tool_tip="次ã®æ‰€æœ‰è€…ã¯ã€ã‚¢ã‚¤ãƒ†ãƒ åãªã©ã®ãƒ—ãƒãƒ‘ティ内容を編集ã—ãŸã‚Šã€ã“ã®ã‚ªãƒ–ジェクトã®ã‚µã‚¤ã‚ºã‚’変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/> + <check_box label="コピー" name="checkbox next owner can copy" tool_tip="次ã®æ‰€æœ‰è€…ã¯ã€ã“ã®ã‚ªãƒ–ジェクトを無制é™ã«ã‚³ãƒ”ーã§ãã¾ã™ã€‚コピーã«ã¯åˆ¶ä½œè€…ã®æƒ…å ±ãŒå«ã¾ã‚Œã€ã‚³ãƒ”ー元ã®ã‚¢ã‚¤ãƒ†ãƒ ã¨é•ã£ã¦è¨±å¯ãªã©ã«é–¢ã—制é™ãŒã‚ã‚Šã¾ã™ã€‚"/> + <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="checkbox next owner can transfer" tool_tip="次ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã§ãã¾ã™ã€‚"/> <text name="B:"> B: </text> diff --git a/indra/newview/skins/default/xui/ja/floater_top_objects.xml b/indra/newview/skins/default/xui/ja/floater_top_objects.xml index cc81ead11632e11b6147a56b6b3702f9f81f844f..c57f91f6190b709efa47b55f458ad997745365c6 100644 --- a/indra/newview/skins/default/xui/ja/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/ja/floater_top_objects.xml @@ -4,7 +4,7 @@ トップ・スクリプト </floater.string> <floater.string name="top_scripts_text"> - [COUNT]スクリプト全体ã®å®Ÿè¡Œæ™‚é–“ã¯[TIME]ミリ秒。 + [COUNT] スクリプトã«ã¯åˆè¨ˆã§ [TIME] 分ã‹ã‹ã‚Šã€[MEMORY] KB 使用ã—ã¦ã„ã¾ã™ã€‚ </floater.string> <floater.string name="scripts_score_label"> 時間 diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml index 93d15517cdc13a8a6979eb19c838fb87b831c670..7810094823014ab7fb42043430632a857cd7ccf2 100644 --- a/indra/newview/skins/default/xui/ja/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml @@ -9,9 +9,11 @@ <menu_item_call label="å ´æ‰€..." name="Places"/> <menu_item_call label="ピック..." name="Picks"/> <menu_item_call label="体験..." name="Experiences"/> + <menu_item_call label="スクリプト…" name="MyScripts"/> <menu_item_call label="カメラコントãƒãƒ¼ãƒ«..." name="Camera Controls"/> <menu label="ムーブメント" name="Movement"> <menu_item_call label="座る" name="Sit Down Here"/> + <menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="Stand up"/> <menu_item_check label="飛ã¶" name="Fly"/> <menu_item_check label="常ã«èµ°ã‚‹" name="Always Run"/> <menu_item_call label="ç§ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åœæ¢ã™ã‚‹" name="Stop Animating My Avatar"/> diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index abd9515e3427f1db40e4b2cc1fb74c0230133ae2..16aeb4dcd7ece1fe6fb63c4f635aac79b6f1cbae 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -244,6 +244,10 @@ 注æ„:ã“ã®ã‚ªãƒ—ションを有効ã«ã™ã‚‹ã¨ã€ã“ã®ãƒ‘ソコンを使ã†ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯èª°ã§ã‚‚ã€ã‚ãªãŸã®ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="AllowMultipleViewers"> + 複数㮠Second Life ビューワを実行ã™ã‚‹ã“ã¨ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã›ã‚“。テクスãƒãƒ£ã‚ャッシュã®ã‚³ãƒªã‚¸ãƒ§ãƒ³ã‚„ç ´æã€ãŠã‚ˆã³ãƒ“ジュアルã¨ãƒ‘フォーマンスã®ä½Žä¸‹ã«ã¤ãªãŒã‚‹æã‚ŒãŒã‚ã‚Šã¾ã™ã€‚ + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="GrantModifyRights"> 他人ã«ä¿®æ£æ¨©é™ã‚’与ãˆã‚‹ã¨ã€æ¨©é™ã‚’与ãˆã‚‰ã‚ŒãŸäººã¯ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã®ã‚ªãƒ–ジェクトを変更ã€å‰Šé™¤ã€æŒã¡å¸°ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®æ¨©é™ã‚’与ãˆã‚‹éš›ã«ã¯å分ã«æ³¨æ„ã—ã¦ãã ã•ã„。 [NAME] ã«ä¿®æ£æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ @@ -735,7 +739,9 @@ L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚åŠ ã™ã‚‹ã“ã¨ãŒã§ã ã‚ãªãŸã«ã¯ [PARCEL] 区画を地形編集ã™ã‚‹è¨±å¯ãŒã‚ã‚Šã¾ã›ã‚“。 </notification> <notification name="CannotCopyWarning"> - ã‚ãªãŸã«ã¯[ITEMS]ã¨ã„ã†ã‚¢ã‚¤ãƒ†ãƒ をコピーã™ã‚‹è¨±å¯ãŒã‚ã‚Šã¾ã›ã‚“。他ã®ä½äººã«æä¾›ã™ã‚‹ã¨ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚ãªãŸã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã™ã€‚本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’è²ã‚Šã¾ã™ã‹ï¼Ÿ + ã‚ãªãŸã«ã¯æ¬¡ã‚¢ã‚¤ãƒ†ãƒ をコピーã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“: +<nolink>[ITEMS]</nolink> +ä»–ã®ä½äººã«è²ã‚‹ã¨ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã™ã€‚本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’è²ã‚Šã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> <notification name="CannotGiveItem"> @@ -1599,6 +1605,30 @@ SHA1 フィンガープリント: [MD5_DIGEST] <notification name="ProblemAddingEstateManagerBanned"> 追放ã•ã‚ŒãŸä½äººã‚’ä¸å‹•ç”£ç®¡ç†è€…リストã«è¿½åŠ ã§ãã¾ã›ã‚“。 </notification> + <notification name="ProblemBanningEstateManager"> + ç¦æ¢ãƒªã‚¹ãƒˆã«ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ [AGENT] ã‚’è¿½åŠ ã§ãã¾ã›ã‚“。 + </notification> + <notification name="GroupIsAlreadyInList"> + <nolink>[GROUP]</nolink> ã¯ã™ã§ã«è¨±å¯ã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒªã‚¹ãƒˆã«è¿½åŠ ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="AgentIsAlreadyInList"> + [AGENT] ã¯ã™ã§ã«ã‚ãªãŸã® [LIST_TYPE] リストã«è¿½åŠ ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="AgentsAreAlreadyInList"> + [AGENT] ã¯ã™ã§ã«ã‚ãªãŸã® [LIST_TYPE] リストã«è¿½åŠ ã•ã‚Œã¦ã„ã¾ã™ã€‚ + </notification> + <notification name="AgentWasAddedToList"> + [AGENT] ㌠[ESTATE] ã® [LIST_TYPE] リストã«è¿½åŠ ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="AgentsWereAddedToList"> + [AGENT] ㌠[ESTATE] ã® [LIST_TYPE] リストã«è¿½åŠ ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="AgentWasRemovedFromList"> + [AGENT] ㌠[ESTATE] ã® [LIST_TYPE] リストã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚ + </notification> + <notification name="AgentsWereRemovedFromList"> + [AGENT] ㌠[ESTATE] ã® [LIST_TYPE] リストã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚ + </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> 衣類ãŠã‚ˆã³ã‚·ã‚§ã‚¤ãƒ—ãŒèªã¿è¾¼ã¾ã‚Œã‚‹ã¾ã§ã¯ã€å®¹å§¿ã®å¤‰æ›´ã¯ã§ãã¾ã›ã‚“。 </notification> @@ -1614,9 +1644,25 @@ SHA1 フィンガープリント: [MD5_DIGEST] [DOWNLOAD_PATH] </notification> <notification name="RequiredUpdate"> - ãƒã‚°ã‚¤ãƒ³ã™ã‚‹ã«ã¯ã€ãƒãƒ¼ã‚¸ãƒ§ãƒ³ [VERSION] ãŒå¿…è¦ã§ã™ã€‚ã“ã®ã‚¢ãƒƒãƒ—デートã¯è‡ªå‹•çš„ã«è¡Œã‚れるもã®ã§ã™ãŒã€ã¾ã 実行ã•ã‚Œã¦ãªã„よã†ã§ã™ã€‚https://secondlife.com/support/downloads/ ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¦ãã ã•ã„。 + ãƒã‚°ã‚¤ãƒ³ã™ã‚‹ã«ã¯ã€ãƒãƒ¼ã‚¸ãƒ§ãƒ³ [VERSION] ãŒå¿…è¦ã§ã™ã€‚ +https://secondlife.com/support/downloads/ ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¦ãã ã•ã„。 <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="PauseForUpdate"> + ãƒã‚°ã‚¤ãƒ³ã™ã‚‹ã«ã¯ã€ãƒãƒ¼ã‚¸ãƒ§ãƒ³ [VERSION] ãŒå¿…è¦ã§ã™ã€‚ +[OK] をクリックã—ã¦ã€ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã¨ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’開始ã—ã¾ã™ã€‚ + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="OptionalUpdateReady"> + ãƒãƒ¼ã‚¸ãƒ§ãƒ³ [VERSION] ã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ãŒå®Œäº†ã—ã€ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã®æº–å‚™ãŒã§ãã¾ã—ãŸã€‚ +[OK] をクリックã—ã¦ã€ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’開始ã—ã¾ã™ã€‚ + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PromptOptionalUpdate"> + ãƒãƒ¼ã‚¸ãƒ§ãƒ³ [VERSION] ã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ãŒå®Œäº†ã—ã€ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã®æº–å‚™ãŒã§ãã¾ã—ãŸã€‚ +続ã‘ã¾ã™ã‹ï¼Ÿ + <usetemplate canceltext="ã‚ã¨ã§" name="yesnocancelbuttons" notext="スã‚ップ" yestext="インストール"/> + </notification> <notification name="LoginFailedUnknown"> 申ã—訳ã‚ã‚Šã¾ã›ã‚“ãŒã€ä¸æ˜Žãªç†ç”±ã«ã‚ˆã£ã¦ãƒã‚°ã‚¤ãƒ³ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•åº¦ã‚‚å‡ºã‚‹å ´åˆã¯ã€[SUPPORT_SITE] ã‚’ã”確èªãã ã•ã„。 <usetemplate name="okbutton" yestext="終了"/> @@ -1903,7 +1949,7 @@ http://wiki.secondlife.com/wiki/Setting_your_display_name ã‚’å‚ç…§ã—ã¦ãã <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•ç”£" yestext="ã“ã®ä¸å‹•ç”£"/> </notification> <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateBannedAgentRemove"> - ã“ã®ä½äººãŒã€ã“ã®ä¸å‹•ç”£é™å®šã€ã¾ãŸã¯ [ALL_ESTATES] ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãるよã†ã«ã€ç¦æ¢ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ + ã“ã®ä½äººã‚’ã“ã®ä¸å‹•ç”£ã®ç«‹å…¥ç¦æ¢ãƒªã‚¹ãƒˆã‹ã‚‰ã®ã¿å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿãã‚Œã¨ã‚‚ [ALL_ESTATES] ã®ç«‹å…¥ç¦æ¢ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•ç”£" yestext="ã“ã®ä¸å‹•ç”£"/> </notification> <notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateManagerAdd"> @@ -3092,15 +3138,6 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚» <button name="Deny" text="æ‹’å¦"/> </form> </notification> - <notification name="UnknownScriptQuestion"> - '[NAME]' ãŒæ‰€æœ‰ã™ã‚‹ '<nolink>[OBJECTNAME]</nolink>' ã«ã‚ˆã£ã¦ãƒªã‚¯ã‚¨ã‚¹ãƒˆã•ã‚ŒãŸãƒ©ãƒ³ã‚¿ã‚¤ãƒ スクリプト権é™ãŒãƒ“ューアã«ã‚ˆã£ã¦èªè˜ã•ã‚Œãªã„ãŸã‚ã€è¨±å¯ã§ãã¾ã›ã‚“。 - -ã“ã®æ¨©é™ã‚’許å¯ã™ã‚‹ã«ã¯ã€ãƒ“ューアを [DOWNLOADURL] ã‹ã‚‰ã®æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã‚¢ãƒƒãƒ—デートã—ã¦ãã ã•ã„。 - <form name="form"> - <button name="Deny" text="Ok"/> - <button name="Mute" text="ブãƒãƒƒã‚¯"/> - </form> - </notification> <notification name="ScriptDialog"> [NAME] ã®ã€Œ<nolink>[TITLE]</nolink>〠[MESSAGE] @@ -3205,13 +3242,22 @@ M ã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ [VOICE_CHANNEL_NAME] ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚ã¨ã§å†åº¦ãŠè©¦ã—ãã ã•ã„。 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•ã‚Œã¾ã™ã€‚ </notification> <notification name="VoiceEffectsExpired"> - ボイスモーフィング効果ã®1ã¤ã¾ãŸã¯è¤‡æ•°ã®æœ‰åŠ¹æœŸé™ãŒçµ‚了ã—ã¾ã—ãŸã€‚期é™ã‚’延長・更新ã™ã‚‹ã«ã¯[[URL]ã“ã¡ã‚‰ã‚’クリック]ã—ã¦ãã ã•ã„。 + ボイスモーフィング効果ã®1ã¤ã¾ãŸã¯è¤‡æ•°ã®æœ‰åŠ¹æœŸé™ãŒçµ‚了ã—ã¾ã—ãŸã€‚ +期é™ã‚’延長・更新ã™ã‚‹ã«ã¯ [[URL] Click here] をクリックã—ã¦ãã ã•ã„。 + +プレミアム会員ã®æ–¹ã¯ã€ [[PREMIUM_URL] click here] をクリックã—ã¦ãƒœã‚¤ã‚¹ãƒ¢ãƒ¼ãƒ•ã‚£ãƒ³ã‚°ç‰¹å…¸ã‚’ãŠå—ã‘å–ã‚Šãã ã•ã„。 </notification> <notification name="VoiceEffectsExpiredInUse"> - ボイスモーフィング効果ã®æœ‰åŠ¹æœŸé™ãŒçµ‚了ã—ãŸãŸã‚ã€ã‚ãªãŸã®é€šå¸¸ã®ãƒœã‚¤ã‚¹è¨å®šãŒé©ç”¨ã•ã‚Œã¾ã—ãŸã€‚期é™ã‚’延長・更新ã™ã‚‹ã«ã¯[[URL]ã“ã¡ã‚‰ã‚’クリック]ã—ã¦ãã ã•ã„。 + ボイスモーフィング効果ã®æœ‰åŠ¹æœŸé™ãŒçµ‚了ã—ãŸãŸã‚ã€ã‚ãªãŸã®é€šå¸¸ã®ãƒœã‚¤ã‚¹è¨å®šãŒé©ç”¨ã•ã‚Œã¾ã—ãŸã€‚ +期é™ã‚’延長・更新ã™ã‚‹ã«ã¯ [[URL] Click here] をクリックã—ã¦ãã ã•ã„。 + +プレミアム会員ã®æ–¹ã¯ã€ [[PREMIUM_URL] click here] をクリックã—ã¦ãƒœã‚¤ã‚¹ãƒ¢ãƒ¼ãƒ•ã‚£ãƒ³ã‚°ç‰¹å…¸ã‚’ãŠå—ã‘å–ã‚Šãã ã•ã„。 </notification> <notification name="VoiceEffectsWillExpire"> - ボイスモーフィング効果ã®1ã¤ã¾ãŸã¯è¤‡æ•°ã®æœ‰åŠ¹æœŸé™ãŒ[INTERVAL]日以内ã«çµ‚了ã—ã¾ã™ã€‚期é™ã‚’延長・更新ã™ã‚‹ã«ã¯[[URL]ã“ã¡ã‚‰ã‚’クリック]ã—ã¦ãã ã•ã„。 + ボイスモーフィング効果ã®1ã¤ã¾ãŸã¯è¤‡æ•°ã®æœ‰åŠ¹æœŸé™ãŒ [INTERVAL] 日以内ã«çµ‚了ã—ã¾ã™ã€‚ +期é™ã‚’延長・更新ã™ã‚‹ã«ã¯ [[URL] Click here] をクリックã—ã¦ãã ã•ã„。 + +プレミアム会員ã®æ–¹ã¯ã€ [[PREMIUM_URL] click here] をクリックã—ã¦ãƒœã‚¤ã‚¹ãƒ¢ãƒ¼ãƒ•ã‚£ãƒ³ã‚°ç‰¹å…¸ã‚’ãŠå—ã‘å–ã‚Šãã ã•ã„。 </notification> <notification name="VoiceEffectsNew"> æ–°ã—ã„ボイスモーフィング効果ãŒç™»å ´ï¼ @@ -3263,6 +3309,9 @@ M ã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ <notification name="SnapshotToComputerFailed"> スナップショットを [PATH] ã«ä¿å˜ã§ãã¾ã›ã‚“ã§ã—ãŸ:ディスクã®ç©ºã容é‡ãŒä¸è¶³ã—ã¦ã„ã¾ã™ã€‚[NEED_MEMORY]KB ãŒå¿…è¦ã§ã™ãŒã€[FREE_MEMORY]KB ã—ã‹ã‚ã‚Šã¾ã›ã‚“。 </notification> + <notification name="SnapshotToLocalDirNotExist"> + スナップショットを [PATH] ã«ä¿å˜ã§ãã¾ã›ã‚“ã§ã—ãŸ:ディレクトリã¯å˜åœ¨ã—ã¾ã›ã‚“。 + </notification> <notification name="PresetNotSaved"> プリセット [NAME] ã®ä¿å˜ã‚¨ãƒ©ãƒ¼ã€‚ </notification> @@ -3752,13 +3801,13 @@ M ã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ 所有ã—ã¦ã„ãªã„土地ã«æœ¨ã‚„è‰ã‚’æ¤ãˆã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 </notification> <notification name="NoCopyPermsNoObject"> - オブジェクト '[OBJ_NAME]' をコピーã™ã‚‹æ¨©é™ãŒãªã„ãŸã‚ã€ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + ã‚ãªãŸã«ã¯ã‚ªãƒ–ジェクト <nolink>'[OBJ_NAME]'</nolink> をコピーã™ã‚‹æ¨©é™ãŒãªã„ãŸã‚ã€ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—ãŸã€‚ </notification> <notification name="NoTransPermsNoObject"> - オブジェクト '[OBJ_NAME]' ã‚’ã‚ãªãŸã«è»¢é€ã§ããªã„ãŸã‚ã€ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + オブジェクト <nolink>'[OBJ_NAME]'</nolink> ã¯ã‚ãªãŸã«è²æ¸¡ã§ããªã„ãŸã‚ã€ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—ãŸã€‚ </notification> <notification name="AddToNavMeshNoCopy"> - オブジェクト '[OBJ_NAME]' ãŒãƒŠãƒ“メッシュã«è²¢çŒ®ã—ã¦ã„ã‚‹ãŸã‚ã€ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + オブジェクト <nolink>'[OBJ_NAME]'</nolink> 㯠navmesh ã«é–¢é€£ãŒã‚ã‚‹ãŸã‚ã€ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—ãŸã€‚ </notification> <notification name="DupeWithNoRootsSelected"> ルートオブジェクトをé¸æŠžã›ãšã«è¤‡è£½ã—ã¾ã™ã€‚ @@ -3803,34 +3852,34 @@ M ã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ 「「æŒã¡ç‰©ã€ã«ä¿å˜ã€ãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚ </notification> <notification name="NoExistNoSaveToContents"> - '[OBJ_NAME]' ã® Rez å…ƒã§ã‚るオブジェクトãŒå˜åœ¨ã—ãªã„ãŸã‚ã€ã“ã®ã‚ªãƒ–ジェクトをオブジェクトコンテンツã«ä¿å˜ã§ãã¾ã›ã‚“。 + 「å˜åœ¨ã—ã¾ã›ã‚“ã€ã‹ã‚‰ rez ã•ã‚ŒãŸãŸã‚ã€<nolink>'[OBJ_NAME]'</nolink> をオブジェクトã®ä¸èº«ã«ä¿å˜ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ </notification> <notification name="NoModNoSaveToContents"> - オブジェクト '[DEST_NAME]' ã‚’ä¿®æ£ã™ã‚‹æ¨©é™ãŒãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã« '[OBJ_NAME]' ã‚’ä¿å˜ã§ãã¾ã›ã‚“。 + ã‚ãªãŸã«ã¯ã‚ªãƒ–ジェクト <nolink>'[DEST_NAME]'</nolink> ã‚’ä¿®æ£ã™ã‚‹æ¨©é™ãŒãªã„ãŸã‚ã€<nolink>'[OBJ_NAME]'</nolink>をオブジェクトã®ä¸èº«ã«ä¿å˜ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ </notification> <notification name="NoSaveBackToInvDisabled"> - インベントリ㫠'[OBJ_NAME]' ã‚’ä¿å˜ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ - ã“ã®æ“作ãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚ + <nolink>'[OBJ_NAME]'</nolink> をインベントリã«ä¿å˜ã§ãã¾ã›ã‚“。ã“ã®æ“作ã¯ç„¡åŠ¹ã«ãªã‚Šã¾ã—ãŸã€‚ </notification> <notification name="NoCopyNoSelCopy"> - オブジェクト '[OBJ_NAME]' を変更ã™ã‚‹æ¨©é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€é¸æŠžã—ãŸã‚‚ã®ã‚’コピーã§ãã¾ã›ã‚“。 + ã‚ãªãŸã«ã¯ã‚ªãƒ–ジェクト <nolink>'[OBJ_NAME]'</nolink> をコピーã™ã‚‹æ¨©é™ãŒãªã„ãŸã‚ã€é¸æŠžå†…容をコピーã§ãã¾ã›ã‚“。 </notification> <notification name="NoTransNoSelCopy"> - オブジェクト '[OBJ_NAME]' を転é€ã§ããªã„ãŸã‚ã€é¸æŠžã—ãŸã‚‚ã®ã‚’コピーã§ãã¾ã›ã‚“。 + オブジェクト <nolink>'[OBJ_NAME]'</nolink> ã‚’è²æ¸¡ã§ããªã„ãŸã‚ã€é¸æŠžå†…容をコピーã§ãã¾ã›ã‚“。 </notification> <notification name="NoTransNoCopy"> - オブジェクト '[OBJ_NAME]' を転é€ã§ããªã„ãŸã‚ã€é¸æŠžã—ãŸã‚‚ã®ã‚’コピーã§ãã¾ã›ã‚“。 + オブジェクト <nolink>'[OBJ_NAME]'</nolink> ã‚’è²æ¸¡ã§ããªã„ãŸã‚ã€é¸æŠžå†…容をコピーã§ãã¾ã›ã‚“。 </notification> <notification name="NoPermsNoRemoval"> - シミュレータã‹ã‚‰ã®ã‚ªãƒ–ジェクト '[OBJ_NAME]' ã®å‰Šé™¤ã¯ã€æ¨©é™ã‚·ã‚¹ãƒ†ãƒ ã«ã‚ˆã£ã¦ç„¡åŠ¹ã«ã•ã‚Œã¦ã„ã¾ã™ã€‚ + オブジェクト <nolink>'[OBJ_NAME]'</nolink> をシミュレーターã‹ã‚‰å‰Šé™¤ã™ã‚‹ã“ã¨ã¯ã€æ¨©é™ã®ã‚·ã‚¹ãƒ†ãƒ ã«ã‚ˆã‚Šè¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“。 </notification> <notification name="NoModNoSaveSelection"> - オブジェクト '[OBJ_NAME]' を変更ã™ã‚‹æ¨©é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€é¸æŠžã—ãŸã‚‚ã®ã‚’ä¿å˜ã§ãã¾ã›ã‚“。 + ã‚ãªãŸã«ã¯ã‚ªãƒ–ジェクト <nolink>'[OBJ_NAME]'</nolink> ã‚’ä¿®æ£ã™ã‚‹æ¨©é™ãŒãªã„ãŸã‚ã€é¸æŠžå†…容をä¿å˜ã§ãã¾ã›ã‚“。 </notification> <notification name="NoCopyNoSaveSelection"> - オブジェクト '[OBJ_NAME]' をコピーã§ããªã„ãŸã‚ã€é¸æŠžã—ãŸã‚‚ã®ã‚’ä¿å˜ã§ãã¾ã›ã‚“。 + オブジェクト <nolink>'[OBJ_NAME]'</nolink> ã¯ã‚³ãƒ”ーä¸å¯ãªãŸã‚ã€é¸æŠžå†…容をä¿å˜ã§ãã¾ã›ã‚“。 </notification> <notification name="NoModNoTaking"> - オブジェクト '[OBJ_NAME]' を変更ã™ã‚‹æ¨©é™ã‚’æŒã£ã¦ã„ãªã„ãŸã‚ã€é¸æŠžã—ãŸã‚‚ã®ã‚’å–å¾—ã§ãã¾ã›ã‚“。 + ã‚ãªãŸã«ã¯ã‚ªãƒ–ジェクト <nolink>'[OBJ_NAME]'</nolink> ã‚’ä¿®æ£ã™ã‚‹æ¨©é™ãŒãªã„ãŸã‚ã€é¸æŠžå†…容をé¸ã¶ã“ã¨ã¯ã§ãã¾ã›ã‚“。 </notification> <notification name="RezDestInternalError"> 内部エラー: ä¸æ˜Žãªå®›å…ˆã‚¿ã‚¤ãƒ—。 diff --git a/indra/newview/skins/default/xui/ja/panel_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml index 5f2007e0da8a0d2c5e1de51e1ad0d05150c26aec..86e7e9dac41805351c9e3ae9cb14dfb034c9da66 100644 --- a/indra/newview/skins/default/xui/ja/panel_login.xml +++ b/indra/newview/skins/default/xui/ja/panel_login.xml @@ -1,6 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <panel name="panel_login"> - <panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=ja</panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php?lang=ja + </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="ui_stack"> <layout_panel name="ui_container"> <combo_box label="ユーザーå" name="username_combo" tool_tip="登録時ã«è‡ªåˆ†ã§é¸ã‚“ã ユーザーå(例:bobsmith12ã€Steller Sunshineãªã©ï¼‰"/> @@ -11,8 +16,13 @@ </combo_box> <button label="ãƒã‚°ã‚¤ãƒ³" name="connect_btn"/> <check_box label="記憶ã™ã‚‹" name="remember_check"/> - <text name="forgot_password_text">パスワードを忘れãŸå ´åˆ</text> + <text name="forgot_password_text"> + パスワードを忘れãŸå ´åˆ + </text> <combo_box label="グリッドをé¸æŠž" name="server_combo"/> + <text name="sign_up_text"> + 登録 + </text> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_login_first.xml b/indra/newview/skins/default/xui/ja/panel_login_first.xml index d350e2f9a2264f849c59578dea7ae05b60ee8211..644cee25f255cb63e64ab2021ac6bb0f38475ae9 100644 --- a/indra/newview/skins/default/xui/ja/panel_login_first.xml +++ b/indra/newview/skins/default/xui/ja/panel_login_first.xml @@ -3,6 +3,9 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php?lang=ja </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="logo_stack"> <layout_panel name="parent_panel2"> <layout_stack name="widget_stack"> @@ -14,6 +17,9 @@ <text name="forgot_password_text"> パスワードを忘れãŸå ´åˆ </text> + <text name="sign_up_text"> + 登録 + </text> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml index e2b74354fa5089d5523d49bcae8bae0693c478aa..378cf8652e3649c76d79d94663d4fe773a201b6a 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml @@ -4,7 +4,6 @@ 言語: </text> <combo_box name="language_combobox"> - <combo_box.item label="システムデフォルト" name="System Default Language"/> <combo_box.item label="English (英語)" name="English"/> <combo_box.item label="Dansk (デンマーク語) - ベータ" name="Danish"/> <combo_box.item label="Deutsch (ドイツ語) – ベータ" name="Deutsch(German)"/> diff --git a/indra/newview/skins/default/xui/ja/panel_region_access.xml b/indra/newview/skins/default/xui/ja/panel_region_access.xml new file mode 100644 index 0000000000000000000000000000000000000000..c0612dd1506dd609c985c7fb380e5d22abf0fe02 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_region_access.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="アクセス" name="Access"> + <tab_container name="tabs"> + <panel label="ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼" name="estate_managers_panel"> + <text name="estate_manager_label"> + ä¸å‹•ç”£ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼: + </text> + <name_list name="estate_manager_name_list"> + <columns label="åå‰" name="name"/> + </name_list> + <button label="è¿½åŠ ..." name="add_estate_manager_btn"/> + <button label="削除…" name="remove_estate_manager_btn"/> + </panel> + <panel label="許å¯" name="allowed_panel"> + <panel label="top_panel" name="allowed_search_panel"> + <filter_editor label="許å¯ã•ã‚ŒãŸã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’検索" name="allowed_search_input"/> + </panel> + <text name="allow_resident_label"> + 常ã«è¨±å¯ï¼š + </text> + <name_list name="allowed_avatar_name_list"> + <columns label="åå‰" name="name"/> + </name_list> + <button label="è¿½åŠ ..." name="add_allowed_avatar_btn"/> + <button label="削除…" name="remove_allowed_avatar_btn"/> + </panel> + <panel label="許å¯ã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—" name="allowed_groups_panel"> + <panel label="top_panel" name="allowed_group_search_panel"> + <filter_editor label="許å¯ã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—を検索" name="allowed_group_search_input"/> + </panel> + <text name="allow_group_label"> + 常ã«è¨±å¯ã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—: + </text> + <name_list name="allowed_group_name_list"> + <columns label="åå‰" name="name"/> + </name_list> + <button label="è¿½åŠ ..." name="add_allowed_group_btn"/> + <button label="削除…" name="remove_allowed_group_btn"/> + </panel> + <panel label="ç¦æ¢" name="banned_panel"> + <panel label="top_panel" name="banned_search_panel"> + <filter_editor label="ç¦æ¢ã•ã‚ŒãŸã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’検索" name="banned_search_input"/> + </panel> + <text name="ban_resident_label"> + 常ã«ç¦æ¢ï¼š + </text> + <name_list name="banned_avatar_name_list"> + <columns label="åå‰" name="name"/> + <columns label="最後ã«ãƒã‚°ã‚¤ãƒ³ã—ãŸæ—¥" name="last_login_date"/> + <columns label="ç¦æ¢ã•ã‚ŒãŸæ—¥ä»˜" name="ban_date"/> + <columns label="ç¦æ¢ã—ãŸäººï¼š" name="bannedby"/> + </name_list> + <button label="è¿½åŠ ..." name="add_banned_avatar_btn"/> + <button label="削除…" name="remove_banned_avatar_btn"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_region_estate.xml b/indra/newview/skins/default/xui/ja/panel_region_estate.xml index 77c74069528cd42e0458259857c07adff64aee84..6464a65feb0ae05c92f340b54ab8381593d9aa6e 100644 --- a/indra/newview/skins/default/xui/ja/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/ja/panel_region_estate.xml @@ -16,7 +16,7 @@ (ä¸æ˜Žï¼‰ </text> <radio_group name="externally_visible_radio"> - <radio_item label="下記ã®ä½äººã¨ã‚°ãƒ«ãƒ¼ãƒ—ã®ã¿è¨±å¯ã™ã‚‹" name="estate_restricted_access"/> + <radio_item label="アクセスタブã«è¨˜è¼‰ã•ã‚ŒãŸä½äººã¨ã‚°ãƒ«ãƒ¼ãƒ—ã®ã¿è¨±å¯ã™ã‚‹" name="estate_restricted_access"/> <radio_item label="誰ã§ã‚‚訪å•å¯" name="estate_public_access"/> </radio_group> <check_box label="18 æ³ä»¥ä¸Šã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™" name="limit_age_verified" tool_tip="ã“ã®ä¸å‹•ç”£ï¼ˆã‚¨ã‚¹ãƒ†ãƒ¼ãƒˆï¼‰ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€18 æ‰ä»¥ä¸Šã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。詳細ã«ã¤ã„ã¦ã¯ã€[SUPPORT_SITE] ã‚’ã”覧ãã ã•ã„。"/> diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml index ebaab7c1220ce5973ee9857f1bbf42df653f949d..04dfc0176dca9b55d7c2849eb927ad558a9fc260 100644 --- a/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="panel_snapshot_options"> <button label="ディスクã«ä¿å˜" name="save_to_computer_btn"/> - <button label="æŒã¡ç‰©ã«ä¿å˜ï¼ˆL$[Amount])" name="save_to_inventory_btn"/> + <button label="æŒã¡ç‰©ã«ä¿å˜ï¼ˆL$[AMOUNT])" name="save_to_inventory_btn"/> <button label="プãƒãƒ•ã‚£ãƒ¼ãƒ«ãƒ•ã‚£ãƒ¼ãƒ‰ã§å…±æœ‰ã™ã‚‹" name="save_to_profile_btn"/> <button label="Facebook ã§å…±æœ‰ã™ã‚‹" name="send_to_facebook_btn"/> <button label="Twitter ã§å…±æœ‰ã™ã‚‹" name="send_to_twitter_btn"/> diff --git a/indra/newview/skins/default/xui/ja/panel_status_bar.xml b/indra/newview/skins/default/xui/ja/panel_status_bar.xml index 3f3845e491bdcd4454e6343c5f1c228bf36eec01..139c4d7fddf22ab186e0cc3640639961d076d9e8 100644 --- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml @@ -1,16 +1,31 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="status"> - <panel.string name="packet_loss_tooltip">パケットæ失</panel.string> - <panel.string name="bandwidth_tooltip">帯域幅</panel.string> - <panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string> - <panel.string name="timeTooltip">[year, datetime, slt] [month, datetime, slt] [day, datetime, slt] ([weekday, datetime, slt])</panel.string> - <panel.string name="buycurrencylabel">L$ [AMT]</panel.string> + <panel.string name="packet_loss_tooltip"> + パケットæ失 + </panel.string> + <panel.string name="bandwidth_tooltip"> + 帯域幅 + </panel.string> + <panel.string name="time"> + [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> + [year, datetime, slt] [month, datetime, slt] [day, datetime, slt] ([weekday, datetime, slt]) + </panel.string> + <panel.string name="buycurrencylabel"> + L$ [AMT] + </panel.string> + <panel name="menu_search_panel"> + <search_editor label="メニューã®æ¤œç´¢" name="search_menu_edit" tool_tip="検索ã—ãŸã„内容をã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„。メニューã«éƒ¨åˆ†çš„ã«ä¸€è‡´ã™ã‚‹çµæžœãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"/> + </panel> <panel left="-391" name="balance_bg" width="160"> <text name="balance" tool_tip="クリックã—㦠L$ 残高を更新" value="L$??"/> <button label="L$ ã®è³¼å…¥" name="buyL" tool_tip="クリックã—㦠L$ を購入ã—ã¾ã™"/> <button label="店" name="goShop" tool_tip="Second Life マーケットプレイスを開ã" width="40"/> </panel> - <text name="TimeText" tool_tip="ç¾åœ¨æ™‚刻(太平洋)">24:00 AM PST</text> + <text name="TimeText" tool_tip="ç¾åœ¨æ™‚刻(太平洋)"> + 24:00 AM PST + </text> <button name="media_toggle_btn" tool_tip="ã™ã¹ã¦ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’開始・åœæ¢ï¼ˆéŸ³æ¥½ã€ãƒ“デオã€Web ページ)"/> <button name="volume_btn" tool_tip="ã‚°ãƒãƒ¼ãƒãƒ«éŸ³é‡è¨å®š"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml index 35e9b66bc8879f78bb5c1acdd8112259841a1580..3bdf8405e786aecf389dd5accd227407c726bd0a 100644 --- a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml @@ -34,9 +34,11 @@ <text name="LabelItemNameTitle"> åå‰ï¼š </text> + <line_editor name="LabelItemName" tool_tip="使用ã§ãã‚‹åå‰ã®æ–‡å—æ•°ã¯æœ€å¤§ 63 æ–‡å—ã¾ã§ã§ã™ã€‚é•·ã„プリムåã¯çŸç¸®ã•ã‚Œã¾ã™ã€‚åå‰ã«ä½¿ç”¨ã§ãã‚‹æ–‡å—㯠ASCII-7 (éžæ‹¡å¼µï¼‰ã«å«ã¾ã‚Œã‚‹å°å—å¯èƒ½ãªæ–‡å—ã®ã¿ã§ã™ï¼ˆç¸¦ç·šã€Œ|ã€ã¯ä¾‹å¤–)。"/> <text name="LabelItemDescTitle"> 説明: </text> + <line_editor name="LabelItemDesc" tool_tip="ビューワã®è¨å®šã§ [ã™ã¹ã¦ã®ã‚ªãƒ–ジェクト上ã§ãƒ’ントを表示] ãŒé¸æŠžã•ã‚Œã¦ã„ã‚‹å ´åˆã€ã‚ªãƒ–ジェクトã«ãƒžã‚¦ã‚¹ã®ãƒã‚¤ãƒ³ã‚¿ã‚’ã‹ã–ã™ã¨ãã®ã‚ªãƒ–ジェクトã®èª¬æ˜ŽãŒãƒãƒƒãƒ—アップ表示ã•ã‚Œã¾ã™ã€‚プリムã®èª¬æ˜Žã¯æœ€å¤§ 127 ãƒã‚¤ãƒˆã¾ã§ã«åˆ¶é™ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ãれよりも長ã„æ–‡å—列ã¯åˆ‡ã‚Šæ¨ã¦ã‚‰ã‚Œã¾ã™ã€‚"/> <text name="LabelCreatorTitle"> 制作者: </text> @@ -59,7 +61,7 @@ <text name="AnyoneLabel"> 全員: </text> - <check_box label="コピー" name="CheckEveryoneCopy"/> + <check_box label="コピー" name="CheckEveryoneCopy" tool_tip="オブジェクトã®ã‚³ãƒ”ーã¯èª°ã§ã‚‚å—ã‘å–ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚オブジェクトã¨ãã®ã‚ªãƒ–ジェクトã®ä¸èº«ã¯ã™ã¹ã¦ã€ã‚³ãƒ”ーã¾ãŸã¯è²æ¸¡ã§ãるよã†ã«è¨å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"/> <text name="GroupLabel"> グループ: </text> @@ -67,17 +69,17 @@ <text name="NextOwnerLabel"> 次ã®æ‰€æœ‰è€…: </text> - <check_box label="ä¿®æ£" name="CheckNextOwnerModify"/> - <check_box label="コピー" name="CheckNextOwnerCopy"/> - <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="CheckNextOwnerTransfer" tool_tip="次ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã§ãã¾ã™"/> + <check_box label="ä¿®æ£" name="CheckNextOwnerModify" tool_tip="次ã®æ‰€æœ‰è€…ã¯ã€ã‚¢ã‚¤ãƒ†ãƒ åãªã©ã®ãƒ—ãƒãƒ‘ティ内容を編集ã—ãŸã‚Šã€ã“ã®ã‚ªãƒ–ジェクトã®ã‚µã‚¤ã‚ºã‚’変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/> + <check_box label="コピー" name="CheckNextOwnerCopy" tool_tip="次ã®æ‰€æœ‰è€…ã¯ã€ã“ã®ã‚ªãƒ–ジェクトを無制é™ã«ã‚³ãƒ”ーã§ãã¾ã™ã€‚コピーã«ã¯åˆ¶ä½œè€…ã®æƒ…å ±ãŒå«ã¾ã‚Œã€ã‚³ãƒ”ー元ã®ã‚¢ã‚¤ãƒ†ãƒ ã¨é•ã£ã¦è¨±å¯ãªã©ã«é–¢ã—制é™ãŒã‚ã‚Šã¾ã™ã€‚"/> + <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="CheckNextOwnerTransfer" tool_tip="次ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã§ãã¾ã™ã€‚"/> </panel> - <check_box label="販売ä¸" name="CheckPurchase"/> - <combo_box name="ComboBoxSaleType"> + <check_box label="販売ä¸" name="CheckPurchase" tool_tip="ã“ã®ã‚ªãƒ–ジェクトやオブジェクトã®ä¸èº«ãŒè³¼å…¥ã§ãるよã†ã«ãªã‚‹ã‹ã€æŒ‡å®šä¾¡æ ¼ã§ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã«ã‚³ãƒ”ーã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚"/> + <combo_box name="ComboBoxSaleType" tool_tip="購入者ãŒã‚³ãƒ”ーã€ã‚³ãƒ”ーã®ä¸èº«ã€ã¾ãŸã¯ã‚¢ã‚¤ãƒ†ãƒ 自体をå—ã‘å–ã‚‹ã®ã‹é¸æŠžã—ã¦ãã ã•ã„。"> <combo_box.item label="コピー" name="Copy"/> <combo_box.item label="コンテンツ" name="Contents"/> <combo_box.item label="オリジナル" name="Original"/> </combo_box> - <spinner label="ä¾¡æ ¼ï¼š L$" name="Edit Cost"/> + <spinner label="ä¾¡æ ¼ï¼š L$" name="Edit Cost" tool_tip="オブジェクトã®ä¾¡æ ¼ã€‚"/> </panel> </scroll_container> <panel name="button_panel"> diff --git a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml index 858307800b6f8b50b1078324b0f0ac372330bf75..d8325d8dc0b1de84108ddcba749b5c2ffbd963af 100644 --- a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml @@ -1,71 +1,136 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="object properties" title="オブジェクトã®ãƒ—ãƒãƒ•ã‚£ãƒ¼ãƒ«"> - <panel.string name="text deed continued">è²æ¸¡</panel.string> - <panel.string name="text deed">è²æ¸¡</panel.string> - <panel.string name="text modify info 1">ã“ã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã™</panel.string> - <panel.string name="text modify info 2">ã“れらã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã™</panel.string> - <panel.string name="text modify info 3">ã“ã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã›ã‚“</panel.string> - <panel.string name="text modify info 4">ã“れらã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã›ã‚“</panel.string> - <panel.string name="text modify info 5">地域(リージョン)ã®å¢ƒç•Œã‚’越ãˆã¦ã“ã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã›ã‚“</panel.string> - <panel.string name="text modify info 6">地域(リージョン)ã®å¢ƒç•Œã‚’越ãˆã¦ã“れらã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã›ã‚“</panel.string> - <panel.string name="text modify warning">ã“ã®ã‚ªãƒ–ジェクトã«ã¯ã€ãƒ‘ーツãŒãƒªãƒ³ã‚¯ã•ã‚Œã¦ã„ã¾ã™</panel.string> - <panel.string name="Cost Default">ä¾¡æ ¼ï¼š L$</panel.string> - <panel.string name="Cost Total">åˆè¨ˆä¾¡æ ¼: L$</panel.string> - <panel.string name="Cost Per Unit">Price Per: L$</panel.string> - <panel.string name="Cost Mixed">Mixed Price</panel.string> - <panel.string name="Sale Mixed">Mixed Sale</panel.string> + <panel.string name="text deed continued"> + è²æ¸¡ + </panel.string> + <panel.string name="text deed"> + è²æ¸¡ + </panel.string> + <panel.string name="text modify info 1"> + ã“ã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã™ + </panel.string> + <panel.string name="text modify info 2"> + ã“れらã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã™ + </panel.string> + <panel.string name="text modify info 3"> + ã“ã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã›ã‚“ + </panel.string> + <panel.string name="text modify info 4"> + ã“れらã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã›ã‚“ + </panel.string> + <panel.string name="text modify info 5"> + 地域(リージョン)ã®å¢ƒç•Œã‚’越ãˆã¦ã“ã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã›ã‚“ + </panel.string> + <panel.string name="text modify info 6"> + 地域(リージョン)ã®å¢ƒç•Œã‚’越ãˆã¦ã“れらã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã›ã‚“ + </panel.string> + <panel.string name="text modify warning"> + ã“ã®ã‚ªãƒ–ジェクトã«ã¯ã€ãƒ‘ーツãŒãƒªãƒ³ã‚¯ã•ã‚Œã¦ã„ã¾ã™ + </panel.string> + <panel.string name="Cost Default"> + ä¾¡æ ¼ï¼š L$ + </panel.string> + <panel.string name="Cost Total"> + åˆè¨ˆä¾¡æ ¼: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Price Per: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Mixed Price + </panel.string> + <panel.string name="Sale Mixed"> + Mixed Sale + </panel.string> <text name="title" value="オブジェクトã®ãƒ—ãƒãƒ•ã‚£ãƒ¼ãƒ«"/> <text name="where" value="(インワールド)"/> <panel label="" name="properties_panel"> - <text name="Name:">åå‰ï¼š</text> - <text name="Description:">説明:</text> - <text name="CreatorNameLabel">制作者:</text> - <text name="Owner:">所有者:</text> - <text name="Group_label">グループ:</text> + <text name="Name:"> + åå‰ï¼š + </text> + <line_editor name="Object Name" tool_tip="使用ã§ãã‚‹åå‰ã®æ–‡å—æ•°ã¯æœ€å¤§ 63 æ–‡å—ã¾ã§ã§ã™ã€‚é•·ã„プリムåã¯çŸç¸®ã•ã‚Œã¾ã™ã€‚åå‰ã«ä½¿ç”¨ã§ãã‚‹æ–‡å—㯠ASCII-7 (éžæ‹¡å¼µï¼‰ã«å«ã¾ã‚Œã‚‹å°å—å¯èƒ½ãªæ–‡å—ã®ã¿ã§ã™ï¼ˆç¸¦ç·šã€Œ|ã€ã¯ä¾‹å¤–)。"/> + <text name="Description:"> + 説明: + </text> + <line_editor name="Object Description" tool_tip="ビューワã®è¨å®šã§ [ã™ã¹ã¦ã®ã‚ªãƒ–ジェクト上ã§ãƒ’ントを表示] ãŒé¸æŠžã•ã‚Œã¦ã„ã‚‹å ´åˆã€ã‚ªãƒ–ジェクトã«ãƒžã‚¦ã‚¹ã®ãƒã‚¤ãƒ³ã‚¿ã‚’ã‹ã–ã™ã¨ãã®ã‚ªãƒ–ジェクトã®èª¬æ˜ŽãŒãƒãƒƒãƒ—アップ表示ã•ã‚Œã¾ã™ã€‚プリムã®èª¬æ˜Žã¯æœ€å¤§ 127 ãƒã‚¤ãƒˆã¾ã§ã«åˆ¶é™ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ãれよりも長ã„æ–‡å—列ã¯åˆ‡ã‚Šæ¨ã¦ã‚‰ã‚Œã¾ã™ã€‚"/> + <text name="CreatorNameLabel"> + 制作者: + </text> + <text name="Owner:"> + 所有者: + </text> + <text name="Group_label"> + グループ: + </text> <button name="button set group" tool_tip="ã“ã®ã‚ªãƒ–ジェクト権é™ã‚’共有ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¾ã™"/> <name_box initial_value="ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°..." name="Group Name Proxy"/> <button label="è²æ¸¡" label_selected="è²æ¸¡" name="button deed" tool_tip="ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’è²æ¸¡ã™ã‚‹ã¨ã€Œæ¬¡ã®æ‰€æœ‰è€…ã€ã®æ¨©é™ãŒé©ç”¨ã•ã‚Œã¾ã™ã€‚ グループ共有オブジェクトã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ•ã‚£ã‚µãƒ¼ãŒè²æ¸¡ã§ãã¾ã™ã€‚"/> - <text name="label click action">クリックã§ï¼š</text> - <combo_box name="clickaction"> + <text name="label click action"> + クリックã§ï¼š + </text> + <combo_box name="clickaction" tool_tip="マウスを 1 回左クリックã™ã‚‹ã¨ã€ã‚ªãƒ–ジェクトã«å¯¾ã—ã¦ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’èµ·ã“ã›ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚å„クリックアクションã«ã¯ã€ä½•ãŒã§ãã‚‹ã‹ã‚’示ã™ç‰¹åˆ¥ãªã‚«ãƒ¼ã‚½ãƒ«ãŒã‚ã‚Šã¾ã™ã€‚クリックアクションã«ã‚ˆã£ã¦ã¯ã€å‹•ä½œè¦ä»¶ãŒå¿…è¦ãªã‚‚ã®ã‚‚ã‚ã‚Šã¾ã™ã€‚ãŸã¨ãˆã°ã€[タッãƒ] ã‚„ [支払ã„] ã«ã¯ã‚¹ã‚¯ãƒªãƒ—トãŒå¿…è¦ã«ãªã‚‹ãªã©ã§ã™"> <combo_box.item label="触る(デフォルト)" name="Touch/grab(default)"/> <combo_box.item label="オブジェクトã«åº§ã‚‹" name="Sitonobject"/> <combo_box.item label="オブジェクトを買ã†" name="Buyobject"/> <combo_box.item label="オブジェクトã«æ”¯æ‰•ã†" name="Payobject"/> <combo_box.item label="é–‹ã" name="Open"/> <combo_box.item label="ズーム" name="Zoom"/> + <combo_box.item label="ãªã—" name="None"/> </combo_box> <panel name="perms_inv"> - <text name="perm_modify">ã“ã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã™</text> - <text name="Anyone can:">全員:</text> - <check_box label="コピー" name="checkbox allow everyone copy"/> - <check_box label="移動" name="checkbox allow everyone move"/> - <text name="GroupLabel">グループ:</text> + <text name="perm_modify"> + ã“ã®ã‚ªãƒ–ジェクトを修æ£ã§ãã¾ã™ + </text> + <text name="Anyone can:"> + 全員: + </text> + <check_box label="コピー" name="checkbox allow everyone copy" tool_tip="オブジェクトã®ã‚³ãƒ”ーã¯èª°ã§ã‚‚å—ã‘å–ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚オブジェクトã¨ãã®ã‚ªãƒ–ジェクトã®ä¸èº«ã¯ã™ã¹ã¦ã€ã‚³ãƒ”ーã¾ãŸã¯è²æ¸¡ã§ãるよã†ã«è¨å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"/> + <check_box label="移動" name="checkbox allow everyone move" tool_tip="オブジェクトã¯èª°ã§ã‚‚å‹•ã‹ã™ã“ã¨ãŒã§ãã¾ã™ã€‚"/> + <text name="GroupLabel"> + グループ: + </text> <check_box label="共有" name="checkbox share with group" tool_tip="è¨å®šã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼å…¨å“¡ã«ã“ã®ã‚ªãƒ–ジェクトã®ä¿®æ£æ¨©é™ã‚’与ãˆã¾ã™ã€‚ è²æ¸¡ã—ãªã„é™ã‚Šã€å½¹å‰²åˆ¶é™ã‚’有効ã«ã¯ã§ãã¾ã›ã‚“。"/> - <text name="NextOwnerLabel">次ã®æ‰€æœ‰è€…:</text> - <check_box label="ä¿®æ£" name="checkbox next owner can modify"/> - <check_box label="コピー" name="checkbox next owner can copy"/> + <text name="NextOwnerLabel"> + 次ã®æ‰€æœ‰è€…: + </text> + <check_box label="ä¿®æ£" name="checkbox next owner can modify" tool_tip="次ã®æ‰€æœ‰è€…ã¯ã€ã‚¢ã‚¤ãƒ†ãƒ åãªã©ã®ãƒ—ãƒãƒ‘ティ内容を編集ã—ãŸã‚Šã€ã“ã®ã‚ªãƒ–ジェクトã®ã‚µã‚¤ã‚ºã‚’変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/> + <check_box label="コピー" name="checkbox next owner can copy" tool_tip="次ã®æ‰€æœ‰è€…ã¯ã€ã“ã®ã‚ªãƒ–ジェクトを無制é™ã«ã‚³ãƒ”ーã§ãã¾ã™ã€‚コピーã«ã¯åˆ¶ä½œè€…ã®æƒ…å ±ãŒå«ã¾ã‚Œã€ã‚³ãƒ”ー元ã®ã‚¢ã‚¤ãƒ†ãƒ ã¨é•ã£ã¦è¨±å¯ãªã©ã«é–¢ã—制é™ãŒã‚ã‚Šã¾ã™ã€‚"/> <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="checkbox next owner can transfer" tool_tip="次ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã§ãã¾ã™"/> </panel> - <check_box label="販売ä¸" name="checkbox for sale"/> - <combo_box name="sale type"> + <check_box label="販売ä¸" name="checkbox for sale" tool_tip="ã“ã®ã‚ªãƒ–ジェクトやオブジェクトã®ä¸èº«ãŒè³¼å…¥ã§ãるよã†ã«ãªã‚‹ã‹ã€æŒ‡å®šä¾¡æ ¼ã§ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã«ã‚³ãƒ”ーã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚"/> + <combo_box name="sale type" tool_tip="購入者ãŒã‚³ãƒ”ーをå—ã‘å–ã‚‹ã®ã‹ã€ã‚³ãƒ”ーã®ä¸èº«ã‚’å—ã‘å–ã‚‹ã®ã‹ã€ã¾ãŸã¯ã‚¢ã‚¤ãƒ†ãƒ 自体をå—ã‘å–ã‚‹ã®ã‹ã‚’é¸æŠžã—ã¦ãã ã•ã„。"> <combo_box.item label="コピー" name="Copy"/> <combo_box.item label="ä¸èº«" name="Contents"/> <combo_box.item label="オリジナル" name="Original"/> </combo_box> - <spinner label="ä¾¡æ ¼ï¼š L$" name="Edit Cost"/> + <spinner label="ä¾¡æ ¼ï¼š L$" name="Edit Cost" tool_tip="オブジェクトã®ä¾¡æ ¼ã€‚"/> <check_box label="検索ã«è¡¨ç¤º" name="search_check" tool_tip="ã“ã®ã‚ªãƒ–ジェクトを検索çµæžœã«è¡¨ç¤ºã—ã¾ã™"/> - <text name="pathfinding_attributes_label">パスファインディング属性:</text> - <text name="B:">B.</text> - <text name="O:">O:</text> - <text name="G:">G:</text> - <text name="E:">E:</text> - <text name="N:">N:</text> - <text name="F:">F:</text> + <text name="pathfinding_attributes_label"> + パスファインディング属性: + </text> + <text name="B:"> + B. + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> </panel> <panel name="button_panel"> - <button label="é–‹ã" name="open_btn"/> - <button label="支払ã†" name="pay_btn"/> - <button label="è²·ã†" name="buy_btn"/> - <button label="詳細" name="details_btn"/> + <button label="é–‹ã" name="open_btn" tool_tip="[オブジェクトã®ä¸èº«] ã‚’é–‹ã„ã¦ç¢ºèªã—ã¾ã™ã€‚"/> + <button label="支払ã†" name="pay_btn" tool_tip="[支払ã„] ウィンドウを開ãã¾ã™ã€‚オブジェクトã§ã“ã®å‹•ä½œã‚’実行ã™ã‚‹ã«ã¯ã€æ”¯æ‰•ã„用ã®ã‚¹ã‚¯ãƒªãƒ—トãŒå¿…è¦ã§ã™ã€‚"/> + <button label="è²·ã†" name="buy_btn" tool_tip="[購入] ウィンドウを開ãã¾ã™ã€‚オブジェクトã¯è²©å£²ç”¨ã«è¨å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"/> + <button label="詳細" name="details_btn" tool_tip="[オブジェクトを調ã¹ã‚‹] ウィンドウを開ãã¾ã™ã€‚"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index bcf4698bb0aff7dc7163d6f4328d5b49c5fdf6b6..91d31faa766061914755ee71a47c3183cde1dc5e 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -648,7 +648,7 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 リリースノート </string> <string name="RELEASE_NOTES_BASE_URL"> - http://wiki.secondlife.com/wiki/Release_Notes/ + https://releasenotes.secondlife.com/viewer/ </string> <string name="LoadingData"> ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°... @@ -2227,6 +2227,18 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 <string name="RegionInfoListTypeBannedAgents"> 常ã«ç¦æ¢ </string> + <string name="RegionInfoAllEstates"> + ã™ã¹ã¦ã®ä¸å‹•ç”£ + </string> + <string name="RegionInfoManagedEstates"> + 管ç†ã•ã‚Œã¦ã„ã‚‹ä¸å‹•ç”£ + </string> + <string name="RegionInfoThisEstate"> + ã“ã®ä¸å‹•ç”£ + </string> + <string name="AndNMore"> + ãŠã‚ˆã³ [EXTRA_COUNT] ã¤ã®ä¸å‹•ç”£ + </string> <string name="ScriptLimitsParcelScriptMemory"> 区画スクリプトメモリ </string> @@ -2270,7 +2282,7 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 胸部 </string> <string name="ATTACH_HEAD"> - é + é è“‹ </string> <string name="ATTACH_LSHOULDER"> 左肩 @@ -2291,7 +2303,7 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 å³è¶³ </string> <string name="ATTACH_BACK"> - èƒŒä¸ + 背骨 </string> <string name="ATTACH_PELVIS"> 骨盤 @@ -2321,13 +2333,13 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 å³è…•ï¼ˆä¸Šï¼‰ </string> <string name="ATTACH_RLARM"> - å³è…•ï¼ˆä¸‹ï¼‰ + å³å‰è…• </string> <string name="ATTACH_LUARM"> 左腕(上) </string> <string name="ATTACH_LLARM"> - 左腕(下) + å·¦å‰è…• </string> <string name="ATTACH_RHIP"> å³è…° @@ -2348,7 +2360,7 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 左脚(下) </string> <string name="ATTACH_BELLY"> - ãŠè…¹ + è…¹ </string> <string name="ATTACH_LEFT_PEC"> å·¦èƒ¸ç‹ @@ -5739,4 +5751,25 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã <string name="Mav_Details_MAV_UNKNOWN_VERSION"> 物ç†å½¢çŠ¶ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒæ£ã—ãã‚ã‚Šã¾ã›ã‚“。物ç†ãƒ¢ãƒ‡ãƒ«ã«æ£ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’è¨å®šã—ã¦ãã ã•ã„。 </string> + <string name="couldnt_resolve_host"> + DNS ãŒãƒ›ã‚¹ãƒˆå ([HOSTNAME]) を解決ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ +www.secondlife.com ã®ã‚¦ã‚§ãƒ–サイトã«æŽ¥ç¶šã§ãã‚‹ã‹ã”確èªãã ã•ã„。 +接続ã§ãã¦ã‚‚ã€ã“ã®ã‚¨ãƒ©ãƒ¼ãŒç¶™ç¶šçš„ã«èµ·ã“ã‚‹å ´åˆã¯ã€ +サãƒãƒ¼ãƒˆã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‹ã‚‰å•é¡Œã‚’å ±å‘Šã—ã¦ãã ã•ã„。 + </string> + <string name="ssl_peer_certificate"> + ãƒã‚°ã‚¤ãƒ³ã‚µãƒ¼ãƒãƒ¼ãŒ SSL 経由ã§ç¢ºèªã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ +ã“ã®ã‚¨ãƒ©ãƒ¼ãŒç¶™ç¶šçš„ã«èµ·ã“ã‚‹å ´åˆã¯ã€ +Secondlife.com ã®ã‚µãƒãƒ¼ãƒˆã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‹ã‚‰ +å•é¡Œã‚’å ±å‘Šã—ã¦ãã ã•ã„。 + </string> + <string name="ssl_connect_error"> + ã“ã®å•é¡Œã®å¤šãã¯ã€ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ュータã®æ™‚計ãŒæ£ã—ãè¨å®šã•ã‚Œã¦ã„ãªã„ãŸã‚ã«èµ·ã“ã‚Šã¾ã™ã€‚ +コントãƒãƒ¼ãƒ«ãƒ‘ãƒãƒ«ã‹ã‚‰æ™‚刻ã¨æ—¥ä»˜ãŒæ£ã—ãè¨å®šã•ã‚Œã¦ã„ã‚‹ã‹ã”確èªãã ã•ã„。 +ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¨ãƒ•ã‚¡ã‚¤ã‚¢ã‚¦ã‚©ãƒ¼ãƒ«ã‚‚æ£ã—ãè¨å®šã•ã‚Œã¦ã„ã‚‹ã‹ãŠç¢ºã‹ã‚ãã ã•ã„。 +ã“ã®ã‚¨ãƒ©ãƒ¼ãŒç¶™ç¶šçš„ã«èµ·ã“ã‚‹å ´åˆã¯ã€Secondlife.com ã®ã‚µãƒãƒ¼ãƒˆã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‹ã‚‰ +å•é¡Œã‚’å ±å‘Šã—ã¦ãã ã•ã„。 + +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 ナレッジベース] + </string> </strings> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml index 082dc0687ea8edf4da7ddea8998e949de004d6b0..55df13e7ac1943fd9d48533fd5a7cf22c5276ca9 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml @@ -4,7 +4,6 @@ JÄ™zyk: </text> <combo_box name="language_combobox"> - <combo_box.item label="DomyÅ›lny" name="System Default Language" /> <combo_box.item label="English (Angielski)" name="English" /> <combo_box.item label="Dansk (DuÅ„ski) - Beta" name="Danish" /> <combo_box.item label="Deutsch (Niemiecki) - Beta" name="Deutsch(German)" /> diff --git a/indra/newview/skins/default/xui/pt/floater_auction.xml b/indra/newview/skins/default/xui/pt/floater_auction.xml index 074f7bf0013ea2a93ea1503a5f3d05f4e7f6ab99..92b983169d641ae6b2b1db86be6dd49d70875926 100644 --- a/indra/newview/skins/default/xui/pt/floater_auction.xml +++ b/indra/newview/skins/default/xui/pt/floater_auction.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_auction" title="INICIAR VENDA DE TERRENO LINDEN START"> +<floater name="floater_auction" title="INICIAR VENDA DE TERRENO LINDEN"> <floater.string name="already for sale"> - Você não pode leiloar terrenos que já estão configurados para venda. + Você não pode leiloar terrenos que já estão para venda. </floater.string> - <check_box initial_value="true" label="Incluir marcador de seleção amarelo" name="fence_check"/> + <check_box initial_value="true" label="Incluir uma cerca de seleção amarela" name="fence_check"/> <button label="Foto" label_selected="Foto" name="snapshot_btn"/> <button label="Vender a qualquer um" label_selected="Vender a qualquer um" name="sell_to_anyone_btn"/> - <button label="Clear Settings" label_selected="Limpar configurações" name="reset_parcel_btn"/> - <button label="Iniciar Leilão" label_selected="Iniciar Leilão" name="start_auction_btn"/> + <button label="Limpar configurações" label_selected="Limpar configurações" name="reset_parcel_btn"/> + <button label="Iniciar leilão" label_selected="Iniciar leilão" name="start_auction_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml b/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml index 998fa8b2d6df778f8d7dcccb8238c9a2ca3fd21f..a31b049345c5ca186333fa19bd063c9fd3c7e345 100644 --- a/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml @@ -38,16 +38,16 @@ <text name="GroupLabel"> Grupo: </text> - <check_box label="Compartilhar" name="share_with_group"/> + <check_box label="Compartilhar" name="share_with_group" tool_tip="Permitir que todos os membros do grupo tenhas suas permissões de modificação para este objeto. Faça uma doação para ativar restrições de função."/> <text name="AnyoneLabel"> Todos: </text> - <check_box label="Copiar" name="everyone_copy"/> + <check_box label="Copiar" name="everyone_copy" tool_tip="Qualquer um pode fazer uma cópia do objeto. O objeto e todos os conteúdos devem ter permissão para cópia e transferência."/> <text name="NextOwnerLabel"> Próximo proprietário: </text> - <check_box label="Modificar" name="next_owner_modify"/> - <check_box label="Copiar" name="next_owner_copy"/> + <check_box label="Modificar" name="next_owner_modify" tool_tip="O próximo proprietário pode editar as propriedades, como o nome do item ou escala desse objeto."/> + <check_box label="Copiar" name="next_owner_copy" tool_tip="O próximo proprietário pode fazer cópias ilimitadas desse objeto. As cópias mantêm as informações do criador e nunca podem ser mais permissivo do que o item copiado."/> <check_box initial_value="true" label="Transferir" name="next_owner_transfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/> <button label="OK" name="ok"/> <button label="Aplicar" name="apply"/> diff --git a/indra/newview/skins/default/xui/pt/floater_my_scripts.xml b/indra/newview/skins/default/xui/pt/floater_my_scripts.xml new file mode 100644 index 0000000000000000000000000000000000000000..a355ad12423622830c8541c75e09ebf165e1f0d9 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_my_scripts.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="myscripts" title="Meus Scripts"/> diff --git a/indra/newview/skins/default/xui/pt/floater_preferences.xml b/indra/newview/skins/default/xui/pt/floater_preferences.xml index 8a2ef83a3b47d19b29d0032d853721509091bc79..b219e8cec983699adaa0e9febd2f218bb46b2fa0 100644 --- a/indra/newview/skins/default/xui/pt/floater_preferences.xml +++ b/indra/newview/skins/default/xui/pt/floater_preferences.xml @@ -5,6 +5,9 @@ </floater.string> <button label="OK" label_selected="OK" name="OK"/> <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> + <panel name="search_panel"> + <search_editor label="Buscar configurações" name="search_prefs_edit" tool_tip="Digite o termo de busca que você se interessar aqui. Os resultados serão exibidos para correspondências parciais de texto completo no nome ou no comentário da configuração."/> + </panel> <tab_container name="pref core"> <panel label="Geral" name="general"/> <panel label="VÃdeo" name="display"/> diff --git a/indra/newview/skins/default/xui/pt/floater_tools.xml b/indra/newview/skins/default/xui/pt/floater_tools.xml index 0c17624aa5f0a754df41826bc5f633d545408529..0882f485a6e652b0911328b5b1dc385430b29b51 100644 --- a/indra/newview/skins/default/xui/pt/floater_tools.xml +++ b/indra/newview/skins/default/xui/pt/floater_tools.xml @@ -172,9 +172,11 @@ <text name="Name:"> Nome: </text> + <line_editor name="Object Name" tool_tip="O nome está limitado em 63 caracteres. Nomes prim maior são cortados. Os nomes podem consistir em caracteres impressos encontrados no conjunto de caracteres ASCII-7 (não estendido), com a exceção da barra/tupo vertical ‘|’."/> <text name="Description:"> Descrição: </text> + <line_editor name="Object Description" tool_tip="Quando as pessoas selecionam 'Passe o mouse em todos os objetos’ na configuração de visualização, eles verão a descrição dos objetos em uma janela pop-up sempre que passar o mouse por cima. A descrição prim é limitada em 127 bytes, qualquer string maior ficará truncada."/> <text name="Creator:"> Criador: </text> @@ -191,17 +193,18 @@ <text name="label click action"> Clique para: </text> - <combo_box name="clickaction"> + <combo_box name="clickaction" tool_tip="Ao clicar, você pode interagir com um objeto com um clique no botão esquerdo do mouse. Cada ação de clicar tem um cursor especial indicador. Algumas ações de clique tem exigências para a função. Por exemplo, Tocar e Pagar exige scripts."> <combo_box.item label="Tocar (padrão)" name="Touch/grab(default)"/> <combo_box.item label="Sentar no objeto" name="Sitonobject"/> <combo_box.item label="Comprar objeto" name="Buyobject"/> <combo_box.item label="Pagar objeto" name="Payobject"/> <combo_box.item label="Abrir" name="Open"/> <combo_box.item label="Zoom" name="Zoom"/> + <combo_box.item label="Nenhum" name="None"/> </combo_box> - <check_box label="À venda" name="checkbox for sale"/> - <spinner label="L$" name="Edit Cost"/> - <combo_box name="sale type"> + <check_box label="À venda" name="checkbox for sale" tool_tip="Permita que as pessoas comprem esse objeto, seu conteúdo ou copiá-lo no mundo virtual por um preço especÃfico."/> + <spinner label="L$" name="Edit Cost" tool_tip="Custo do objeto."/> + <combo_box name="sale type" tool_tip="Selecione se o comprador receberá uma cópia. A cópia do conteúdo ou o próprio item."> <combo_box.item label="Cópia" name="Copy"/> <combo_box.item label="Conteúdo" name="Contents"/> <combo_box.item label="Original" name="Original"/> @@ -214,13 +217,13 @@ <text name="Anyone can:"> Todos: </text> - <check_box label="Movimentar" name="checkbox allow everyone move"/> - <check_box label="Copiar" name="checkbox allow everyone copy"/> + <check_box label="Movimentar" name="checkbox allow everyone move" tool_tip="Qualquer pessoa pode mover o objeto."/> + <check_box label="Copiar" name="checkbox allow everyone copy" tool_tip="Qualquer um pode fazer uma cópia do objeto. O objeto e todos os conteúdos devem ter permissão para cópia e transferência."/> <text name="Next owner can:"> Próximo proprietário: </text> - <check_box label="Modificar" name="checkbox next owner can modify"/> - <check_box label="Copiar" left_delta="80" name="checkbox next owner can copy"/> + <check_box label="Modificar" name="checkbox next owner can modify" tool_tip="O próximo proprietário pode editar as propriedades, como o nome do item ou escala desse objeto."/> + <check_box label="Copiar" left_delta="80" name="checkbox next owner can copy" tool_tip="O próximo proprietário pode fazer cópias ilimitadas desse objeto. As cópias mantêm as informações do criador e nunca podem ser mais permissivo do que o item copiado."/> <check_box label="Transferir" left_delta="67" name="checkbox next owner can transfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/> <text name="B:"> B: diff --git a/indra/newview/skins/default/xui/pt/floater_top_objects.xml b/indra/newview/skins/default/xui/pt/floater_top_objects.xml index f37b5be23f0876c0b00e03eaf85704dd271c2103..b55fa10c0d09222ffdc0bd3ac07013b9aadd8084 100644 --- a/indra/newview/skins/default/xui/pt/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/pt/floater_top_objects.xml @@ -4,7 +4,7 @@ Principais Scripts </floater.string> <floater.string name="top_scripts_text"> - [COUNT] scripts tomando um total de [TIME] ms + [COUNT] scripts levam um total de [TIME] ms e usando [MEMORY] KB </floater.string> <floater.string name="scripts_score_label"> Tempo diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml index 1d0953e756adfd2111e1feb809c93689c79d3110..e82b7bc62a58a5c614ab8f08b211502b4bcd59b3 100644 --- a/indra/newview/skins/default/xui/pt/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml @@ -9,9 +9,11 @@ <menu_item_call label="Lugares..." name="Places"/> <menu_item_call label="Destaques..." name="Picks"/> <menu_item_call label="Experiências..." name="Experiences"/> + <menu_item_call label="Meus Scripts..." name="MyScripts"/> <menu_item_call label="Controles da câmera..." name="Camera Controls"/> <menu label="Movimentos" name="Movement"> <menu_item_call label="Sentar" name="Sit Down Here"/> + <menu_item_call label="Ficar de pé" name="Stand up"/> <menu_item_check label="Voar" name="Fly"/> <menu_item_check label="Correr sempre" name="Always Run"/> <menu_item_call label="Parar minha animação" name="Stop Animating My Avatar"/> diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index fde883131a02d5097dd57d182b8316ea5518169b..478af96e95565fc935f11db21f52e88a75333d24 100644 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -243,6 +243,10 @@ Por favor, selecione apenas um objeto e tente novamente. Nota: Ao ativar esta opção, qualquer pessoa que utilizar este computador poderá ver a sua lista de lugares preferidos. <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="AllowMultipleViewers"> + Não é possÃvel executar múltiplos visualizadores Second Life. Pode levar a uma falha, um corrompimento, visuais alterados e falha no desempenho no cache de textura. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="GrantModifyRights"> Conceder direitos de modificação a outros residentes vai autorizá-los a mudar, apagar ou pegar TODOS os seus objetos. Seja MUITO cuidadoso ao conceder esta autorização. Deseja dar direitos de modificação a [NAME]? @@ -711,9 +715,9 @@ Para aumentar a qualidade do vÃdeo, vá para Preferências > VÃdeo. Você não está autorizado a terraplanar o terreno [PARCEL]. </notification> <notification name="CannotCopyWarning"> - Você não tem autorização para copiar os itens abaixo: -[ITEMS] -ao dá-los, você ficará sem eles no seu inventário. Deseja realmente dar estes itens? + Não existe autorização para copiar os itens abaixo: +<nolink>[ITEMS]</nolink> +e eles sairão do inverntário se sair. Deseja realmente dar estes itens? <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> </notification> <notification name="CannotGiveItem"> @@ -1561,6 +1565,30 @@ Ultrapassa o limite de [MAX_AGENTS] [LIST_TYPE] de [NUM_EXCESS]. <notification name="ProblemAddingEstateManagerBanned"> Não foi possÃvel adicionar residentes banidos à lista de gerentes de propriedades. </notification> + <notification name="ProblemBanningEstateManager"> + Não foi possÃvel adicionar o gerente [AGENT] à lista de banimento. + </notification> + <notification name="GroupIsAlreadyInList"> + <nolink>[GROUP]</nolink> já está na lista de Grupos permitidos. + </notification> + <notification name="AgentIsAlreadyInList"> + [AGENT] já está na sua [LIST_TYPE] lista. + </notification> + <notification name="AgentsAreAlreadyInList"> + [AGENT] já está na sua [LIST_TYPE] lista. + </notification> + <notification name="AgentWasAddedToList"> + [AGENT] foi adicionado na [LIST_TYPE] lista de [ESTATE]. + </notification> + <notification name="AgentsWereAddedToList"> + [AGENT] foi adicionado na [LIST_TYPE] lista de [ESTATE]. + </notification> + <notification name="AgentWasRemovedFromList"> + [AGENT] foi removido da [LIST_TYPE] lista de [ESTATE]. + </notification> + <notification name="AgentsWereRemovedFromList"> + [AGENT] foi removido da [LIST_TYPE] lista de [ESTATE]. + </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> Não é possÃvel alterar a aparência até que as roupas e formas estejam carregadas. </notification> @@ -1576,9 +1604,25 @@ Por favor, ponha o objeto à venda e tente novamente. [DOWNLOAD_PATH] </notification> <notification name="RequiredUpdate"> - Versão [VERSION] é obrigatório para efetuar login. Isto deveria ter sido atualizado por você, mas aparentemente não foi. Baixe a versão mais recente em https://secondlife.com/support/downloads/ + Versão [VERSION] é obrigatório para efetuar login. +Baixe a versão mais recente em https://secondlife.com/support/downloads/ <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="PauseForUpdate"> + Versão [VERSION] é obrigatório para efetuar login. +Clique em OK para baixar e instalar + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="OptionalUpdateReady"> + A versão [VERSION] foi baixada e está pronta para ser instalada. +Clique em OK para instalar + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PromptOptionalUpdate"> + A versão [VERSION] foi baixada e está pronta para ser instalada. +Deseja prosseguir? + <usetemplate canceltext="Ainda não" name="yesnocancelbuttons" notext="Ignorar" yestext="Instalar"/> + </notification> <notification name="LoginFailedUnknown"> Desculpe, motivo de falha de login desconhecido. Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE]. <usetemplate name="okbutton" yestext="Sair"/> @@ -1860,7 +1904,7 @@ Isto mudará milhares de regiões e fará o spaceserver soluçar. <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todas as Propriedades" yestext="Esta Propriedade"/> </notification> <notification label="Selecione a propriedade" name="EstateBannedAgentRemove"> - Remover este residente da lista de banidos para acesso a esta propriedade apenas ou para [ALL_ESTATES]? + Remover este Residente da lista de banimento para acessar este estado somente ou para [ALL_ESTATES]? <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Todas as Propriedades" yestext="Esta Propriedade"/> </notification> <notification label="Selecione a propriedade" name="EstateManagerAdd"> @@ -3036,15 +3080,6 @@ Não conceda acesso se você não entender completamente por que ele deseja aces <button name="Deny" text="Negar"/> </form> </notification> - <notification name="UnknownScriptQuestion"> - A permissão de script de tempo de execução solicitada por '<nolink>[OBJECTNAME]</nolink>', um objeto de '[NAME]', não é reconhecida pelo visualizador e não pode ser concedida. - -Para conceder essa permissão, atualize seu visualizador para a versão mais recente em [DOWNLOADURL]. - <form name="form"> - <button name="Deny" text="Ok"/> - <button name="Mute" text="Bloquear"/> - </form> - </notification> <notification name="ScriptDialog"> '<nolink>[TITLE]</nolink>' de [NAME] [MESSAGE] @@ -3149,16 +3184,22 @@ Clique em Aceitar para atender ou em Recusar para recusar este convite. Clique Falha de conexão com [VOICE_CHANNEL_NAME]. Tente novamente mais tarde. Agora você será reconectado ao bate-papo local. </notification> <notification name="VoiceEffectsExpired"> - Um ou mais serviços de distorção de voz que você assinou veceu. -[[URL] Clique aqui] para renovar o serviço. + Um ou mais serviços de distorção de voz que você assinou venceu. +[[URL] Clique aqui] para renovar o serviço. + +Se você é um Membro Premium, [[PREMIUM_URL] clique aqui] para receber o seu app de distorção de voz. </notification> <notification name="VoiceEffectsExpiredInUse"> - A Distorção de voz ativa expirou. Suas configurações de voz padrão foram ativadas. -[[URL] Clique aqui] para renovar o serviço. + A Distorção de voz ativa expirou. Suas configurações de voz padrão foram ativadas. +[[URL] Clique aqui] para renovar o serviço. + +Se você é um Membro Premium, [[PREMIUM_URL] clique aqui] para receber o seu app de distorção de voz. </notification> <notification name="VoiceEffectsWillExpire"> - Uma ou mais das suas distorções de voz tem vencimento em menos de [INTERVAL] dias. -[[URL] Clique aqui] para renovar o serviço. + Uma ou mais das suas distorções de voz tem vencimento em menos de [INTERVAL] dias. +[[URL] Clique aqui] para renovar o serviço. + +Se você é um Membro Premium, [[PREMIUM_URL] clique aqui] para receber o seu app de distorção de voz. </notification> <notification name="VoiceEffectsNew"> Novas Distorções de voz! @@ -3210,6 +3251,9 @@ Para sua segurança, os SLurls serão bloqueados por alguns instantes. <notification name="SnapshotToComputerFailed"> Falha ao salvar fotografia em [PATH]: Disco cheio. [NEED_MEMORY]KB é necessário, mas somente [FREE_MEMORY]KB está livre. </notification> + <notification name="SnapshotToLocalDirNotExist"> + Falha ao salvar fotografia em [PATH]: O diretório não existe. + </notification> <notification name="PresetNotSaved"> Erro ao salvar predefinição [NAME]. </notification> @@ -3698,13 +3742,13 @@ ele não está na mesma região que você. Você não pode criar árvores e grama em terrenos que não são sua propriedade. </notification> <notification name="NoCopyPermsNoObject"> - A cópia falhou porque você não está autorizado a copiar o objeto '[OBJ_NAME]'. + Falha na cópia por falta de permissão para copiar o objeto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoTransPermsNoObject"> - A cópia falhou porque o objeto '[OBJ_NAME]' não pode ser transferido para você. + Falha na cópia, porque o objeto <nolink>'[OBJ_NAME]'</nolink> não pode ser transferido para você. </notification> <notification name="AddToNavMeshNoCopy"> - A cópia falhou porque o objeto '[OBJ_NAME]' contribui para o navmesh. + Falha na cópia, porque o objeto <nolink>'[OBJ_NAME]'</nolink> contribui para o Navmesh. </notification> <notification name="DupeWithNoRootsSelected"> Duplicar sem objetos raiz selecionados. @@ -3749,34 +3793,34 @@ Tente novamente em instantes. Salvar no inventário foi desativado. </notification> <notification name="NoExistNoSaveToContents"> - Não é possÃvel salvar '[OBJ_NAME]' no conteúdo do objeto porque o objeto do qual ele foi renderizado não existe mais. + Não foi possÃvel salvar <nolink>'[OBJ_NAME]'</nolink> para os conteúdos do objeto, porque o objeto foi utilizado e não existe mais. </notification> <notification name="NoModNoSaveToContents"> - Não é possÃvel salvar '[OBJ_NAME]' no conteúdo do objeto porque você não tem permissão para modificar o objeto '[DEST_NAME]'. + Não foi possÃvel salvar <nolink>'[OBJ_NAME]'</nolink> para os conteúdos do objeto, porque você não tem permissão para modificar o objeto <nolink>'[DEST_NAME]'</nolink>. </notification> <notification name="NoSaveBackToInvDisabled"> - Não é possÃvel salvar '[OBJ_NAME]' no inventário -- essa operação foi desativada. + Não é possÃvel salvar <nolink>'[OBJ_NAME]'</nolink> no inventário outra vez -- esta operação foi desabilitada. </notification> <notification name="NoCopyNoSelCopy"> - Você não pode copiar sua seleção porque não está autorizado a copiar o objeto '[OBJ_NAME]'. + Não é possÃvel copiar a seleção porque você não tem permissão para copiar o objeto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoTransNoSelCopy"> - Você não pode copiar a seleção porque o objeto '[OBJ_NAME]' não é transferÃvel. + Não é possÃvel copiar a seleção porque o objeto <nolink>'[OBJ_NAME]'</nolink> não é transferÃvel. </notification> <notification name="NoTransNoCopy"> - Você não pode copiar a seleção porque o objeto '[OBJ_NAME]' não é transferÃvel. + Não é possÃvel copiar a seleção porque o objeto <nolink>'[OBJ_NAME]'</nolink> não é transferÃvel. </notification> <notification name="NoPermsNoRemoval"> - A remoção do objeto '[OBJ_NAME]' do simulador é proibida pelo sistema de permissões. + A remoção do objeto <nolink>'[OBJ_NAME]'</nolink> do simulador não é permitida pelo sistema de permissão. </notification> <notification name="NoModNoSaveSelection"> - Você não pode salvar sua seleção porque não está autorizado a modificar o objeto '[OBJ_NAME]'. + Não é possÃvel salvar a seleção porque você não tem permissão para modificar o objeto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoCopyNoSaveSelection"> - Não é possÃvel salvar sua seleção porque o objeto '[OBJ_NAME]' não é copiável. + Não é possÃvel salvar a seleção porque o objeto <nolink>'[OBJ_NAME]'</nolink> não é copiável. </notification> <notification name="NoModNoTaking"> - Você não pode levar sua seleção porque não está autorizado a modificar o objeto '[OBJ_NAME]'. + Não é possÃvel realizar a seleção porque você não tem permissão para modificar o objeto <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="RezDestInternalError"> Erro interno: tipo de destino desconhecido. diff --git a/indra/newview/skins/default/xui/pt/panel_login.xml b/indra/newview/skins/default/xui/pt/panel_login.xml index ffcf72b1b4d840159f6f8926d9ecd68526617328..ffe637b3c1c01a517e134da35bd2f6c8748da9e8 100644 --- a/indra/newview/skins/default/xui/pt/panel_login.xml +++ b/indra/newview/skins/default/xui/pt/panel_login.xml @@ -1,6 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <panel name="panel_login"> - <panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=pt</panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php?lang=pt + </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="ui_stack"> <layout_panel name="ui_container"> <combo_box label="Nome de usuário" name="username_combo" tool_tip="O nome de usuário que você escolheu ao fazer seu cadastro, como zecazc12 ou Magia Solar"/> @@ -11,8 +16,13 @@ </combo_box> <button label="Login" name="connect_btn"/> <check_box label="Lembrar-me" name="remember_check"/> - <text name="forgot_password_text">Senha esquecida</text> + <text name="forgot_password_text"> + Senha esquecida + </text> <combo_box label="Selecionar grade" name="server_combo"/> + <text name="sign_up_text"> + Cadastre-se + </text> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_login_first.xml b/indra/newview/skins/default/xui/pt/panel_login_first.xml index 6e4ef65beabc9cd19bb1900838a175f6ffc072bb..86c61163bc9104a227d861e3378469e1a4fcea75 100644 --- a/indra/newview/skins/default/xui/pt/panel_login_first.xml +++ b/indra/newview/skins/default/xui/pt/panel_login_first.xml @@ -3,6 +3,9 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php?lang=pt </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="logo_stack"> <layout_panel name="parent_panel2"> <layout_stack name="widget_stack"> @@ -14,6 +17,9 @@ <text name="forgot_password_text"> Senha esquecida </text> + <text name="sign_up_text"> + Cadastre-se + </text> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml index 68fbd049b1d930299046e93ee0382e33ae3e1ef9..915d69560501d9578855390c72bcaf480c765044 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml @@ -4,7 +4,6 @@ Idioma: </text> <combo_box name="language_combobox"> - <combo_box.item label="Padrão" name="System Default Language"/> <combo_box.item label="English (Inglês)" name="English"/> <combo_box.item label="Dansk (Dinamarquês) - Beta" name="Danish"/> <combo_box.item label="Deutsch (Alemão) - Beta" name="Deutsch(German)"/> diff --git a/indra/newview/skins/default/xui/pt/panel_region_access.xml b/indra/newview/skins/default/xui/pt/panel_region_access.xml new file mode 100644 index 0000000000000000000000000000000000000000..cc2136a4598e23bf66f2672f230d50db38436e9e --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_region_access.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Acesso" name="Access"> + <tab_container name="tabs"> + <panel label="GERENTES" name="estate_managers_panel"> + <text name="estate_manager_label"> + Gerentes: + </text> + <name_list name="estate_manager_name_list"> + <columns label="Nome" name="name"/> + </name_list> + <button label="Adicionar..." name="add_estate_manager_btn"/> + <button label="Remover..." name="remove_estate_manager_btn"/> + </panel> + <panel label="PERMITIDO" name="allowed_panel"> + <panel label="top_panel" name="allowed_search_panel"> + <filter_editor label="Buscar agentes permitidos" name="allowed_search_input"/> + </panel> + <text name="allow_resident_label"> + Sempre permitido: + </text> + <name_list name="allowed_avatar_name_list"> + <columns label="Nome" name="name"/> + </name_list> + <button label="Adicionar..." name="add_allowed_avatar_btn"/> + <button label="Remover..." name="remove_allowed_avatar_btn"/> + </panel> + <panel label="GRUPOS PERMITIDOS" name="allowed_groups_panel"> + <panel label="top_panel" name="allowed_group_search_panel"> + <filter_editor label="Buscar grupos permitidos" name="allowed_group_search_input"/> + </panel> + <text name="allow_group_label"> + Grupos sempre permitidos: + </text> + <name_list name="allowed_group_name_list"> + <columns label="Nome" name="name"/> + </name_list> + <button label="Adicionar..." name="add_allowed_group_btn"/> + <button label="Remover..." name="remove_allowed_group_btn"/> + </panel> + <panel label="BANIDO" name="banned_panel"> + <panel label="top_panel" name="banned_search_panel"> + <filter_editor label="Buscar agentes banidos" name="banned_search_input"/> + </panel> + <text name="ban_resident_label"> + Sempre banido: + </text> + <name_list name="banned_avatar_name_list"> + <columns label="Nome" name="name"/> + <columns label="Último acesso" name="last_login_date"/> + <columns label="Data do banimento" name="ban_date"/> + <columns label="Banido por" name="bannedby"/> + </name_list> + <button label="Adicionar..." name="add_banned_avatar_btn"/> + <button label="Remover..." name="remove_banned_avatar_btn"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_region_estate.xml b/indra/newview/skins/default/xui/pt/panel_region_estate.xml index 8b405f601a5f5e205ccc33744790f5c8f1960c64..ac864ebb4b93c5eac5e4145b5eaa73928de19f5c 100644 --- a/indra/newview/skins/default/xui/pt/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/pt/panel_region_estate.xml @@ -16,7 +16,7 @@ (desconhecido) </text> <radio_group name="externally_visible_radio"> - <radio_item label="Permitir somente os residentes e os grupos listados abaixo" name="estate_restricted_access"/> + <radio_item label="Permitir somente residentes e grupos listados na aba Acesso" name="estate_restricted_access"/> <radio_item label="Qualquer um pode visitar" name="estate_public_access"/> </radio_group> <check_box label="Deve ser maior de 18 anos" name="limit_age_verified" tool_tip="Os residentes devem ter 18 anos ou mais para acessar esta propriedade. Consulte o [SUPPORT_SITE] para obter mais informações."/> diff --git a/indra/newview/skins/default/xui/pt/panel_status_bar.xml b/indra/newview/skins/default/xui/pt/panel_status_bar.xml index c35863734fb2a0f50826861290b93799904b3799..9e15f9a02c85d8e8662ecb21f8125efb199b98c8 100644 --- a/indra/newview/skins/default/xui/pt/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/pt/panel_status_bar.xml @@ -1,16 +1,31 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="status"> - <panel.string name="packet_loss_tooltip">Perda de pacote</panel.string> - <panel.string name="bandwidth_tooltip">Banda</panel.string> - <panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string> - <panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string> - <panel.string name="buycurrencylabel">L$ [AMT]</panel.string> + <panel.string name="packet_loss_tooltip"> + Perda de pacote + </panel.string> + <panel.string name="bandwidth_tooltip"> + Banda + </panel.string> + <panel.string name="time"> + [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> + [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] + </panel.string> + <panel.string name="buycurrencylabel"> + L$ [AMT] + </panel.string> + <panel name="menu_search_panel"> + <search_editor label="Buscar Menus" name="search_menu_edit" tool_tip="Digite o termo de busca que você se interessar aqui. Os resultados serão exibidos para correspondências parciais de texto completo no menu."/> + </panel> <panel left="-431" name="balance_bg" width="200"> <text name="balance" tool_tip="Atualizar saldo de L$" value="L$??"/> <button label="Comprar L$" name="buyL" tool_tip="Comprar mais L$"/> <button label="Comprar" name="goShop" tool_tip="Abrir Mercado do Second Life" width="80"/> </panel> - <text name="TimeText" tool_tip="Hora atual (PacÃfico)">24:00 AM PST</text> + <text name="TimeText" tool_tip="Hora atual (PacÃfico)"> + 24:00 AM PST + </text> <button name="media_toggle_btn" tool_tip="Tocar/Pausar todas mÃdias (música, vÃdeo, páginas web)"/> <button name="volume_btn" tool_tip="Volume geral"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml index 47ffffaf15fd5c84360e2fbeeab3658a4002ee0f..9afcb67d3dfa6378c6d2507133562a40bceeaece 100644 --- a/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml @@ -34,9 +34,11 @@ <text name="LabelItemNameTitle"> Nome: </text> + <line_editor name="LabelItemName" tool_tip="O nome está limitado em 63 caracteres. Nomes prim maior são cortados. Os nomes podem consistir em caracteres impressos encontrados no conjunto de caracteres ASCII-7 (não estendido), com a exceção da barra/tupo vertical ‘|’."/> <text name="LabelItemDescTitle"> Descrição: </text> + <line_editor name="LabelItemDesc" tool_tip="Quando as pessoas selecionam 'Passe o mouse em todos os objetos’ na configuração de visualização, eles verão a descrição dos objetos em uma janela pop-up sempre que passar o mouse por cima. A descrição prim é limitada em 127 bytes, qualquer string maior ficará truncada."/> <text name="LabelCreatorTitle"> Criador: </text> @@ -59,7 +61,7 @@ <text name="AnyoneLabel"> Todos: </text> - <check_box label="Copiar" name="CheckEveryoneCopy"/> + <check_box label="Copiar" name="CheckEveryoneCopy" tool_tip="Qualquer um pode fazer uma cópia do objeto. O objeto e todos os conteúdos devem ter permissão para cópia e transferência."/> <text name="GroupLabel"> Grupo: </text> @@ -67,17 +69,17 @@ <text name="NextOwnerLabel"> Próximo proprietário: </text> - <check_box label="Modificar" name="CheckNextOwnerModify"/> - <check_box label="Copiar" name="CheckNextOwnerCopy"/> + <check_box label="Modificar" name="CheckNextOwnerModify" tool_tip="O próximo proprietário pode editar as propriedades, como o nome do item ou escala desse objeto."/> + <check_box label="Copiar" name="CheckNextOwnerCopy" tool_tip="O próximo proprietário pode fazer cópias ilimitadas desse objeto. As cópias mantêm as informações do criador e nunca podem ser mais permissivo do que o item copiado."/> <check_box label="Transferir" name="CheckNextOwnerTransfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/> </panel> - <check_box label="À venda" name="CheckPurchase"/> - <combo_box name="ComboBoxSaleType"> + <check_box label="À venda" name="CheckPurchase" tool_tip="Permita que as pessoas comprem esse objeto, seu conteúdo ou copiá-lo no mundo virtual por um preço especÃfico."/> + <combo_box name="ComboBoxSaleType" tool_tip="Selecione se o comprador receberá uma cópia. A cópia do conteúdo ou o próprio item."> <combo_box.item label="Cortar" name="Copy"/> <combo_box.item label="Conteúdo" name="Contents"/> <combo_box.item label="Original" name="Original"/> </combo_box> - <spinner label="Preço: L$" name="Edit Cost"/> + <spinner label="Preço: L$" name="Edit Cost" tool_tip="Custo do objeto."/> </panel> </scroll_container> <panel name="button_panel"> diff --git a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml index bbfaa4a4f5ad8a59fe8db8963e029b81c1bfda6f..578d8761d101562c0a985194d90ea717b89e79f0 100644 --- a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml @@ -1,71 +1,136 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="object properties" title="Perfil do objeto"> - <panel.string name="text deed continued">Doar</panel.string> - <panel.string name="text deed">Doar</panel.string> - <panel.string name="text modify info 1">Você pode modificar este objeto</panel.string> - <panel.string name="text modify info 2">Você pode modificar estes objetos</panel.string> - <panel.string name="text modify info 3">Você não pode modificar este objeto</panel.string> - <panel.string name="text modify info 4">Você não pode modificar estes objetos</panel.string> - <panel.string name="text modify info 5">Não é possÃvel modificar este objeto através de uma demarcação da região</panel.string> - <panel.string name="text modify info 6">Não é possÃvel modificar estes objetos através de uma demarcação da região</panel.string> - <panel.string name="text modify warning">O objeto contém links ligando suas partes</panel.string> - <panel.string name="Cost Default">Preço: L$</panel.string> - <panel.string name="Cost Total">Preço total: L$</panel.string> - <panel.string name="Cost Per Unit">Preço unitário: L$</panel.string> - <panel.string name="Cost Mixed">Preço misto</panel.string> - <panel.string name="Sale Mixed">Venda mista</panel.string> + <panel.string name="text deed continued"> + Doar + </panel.string> + <panel.string name="text deed"> + Doar + </panel.string> + <panel.string name="text modify info 1"> + Você pode modificar este objeto + </panel.string> + <panel.string name="text modify info 2"> + Você pode modificar estes objetos + </panel.string> + <panel.string name="text modify info 3"> + Você não pode modificar este objeto + </panel.string> + <panel.string name="text modify info 4"> + Você não pode modificar estes objetos + </panel.string> + <panel.string name="text modify info 5"> + Não é possÃvel modificar este objeto através de uma demarcação da região + </panel.string> + <panel.string name="text modify info 6"> + Não é possÃvel modificar estes objetos através de uma demarcação da região + </panel.string> + <panel.string name="text modify warning"> + O objeto contém links ligando suas partes + </panel.string> + <panel.string name="Cost Default"> + Preço: L$ + </panel.string> + <panel.string name="Cost Total"> + Preço total: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Preço unitário: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Preço misto + </panel.string> + <panel.string name="Sale Mixed"> + Venda mista + </panel.string> <text name="title" value="Perfil do objeto"/> <text name="where" value="(Inworld)"/> <panel label="" name="properties_panel"> - <text name="Name:">Nome:</text> - <text name="Description:">Descrição:</text> - <text name="CreatorNameLabel">Criador:</text> - <text name="Owner:">Proprietário:</text> - <text name="Group_label">Grupo:</text> + <text name="Name:"> + Nome: + </text> + <line_editor name="Object Name" tool_tip="O nome está limitado em 63 caracteres. Nomes prim maior são cortados. Os nomes podem consistir em caracteres impressos encontrados no conjunto de caracteres ASCII-7 (não estendido), com a exceção da barra/tupo vertical ‘|’."/> + <text name="Description:"> + Descrição: + </text> + <line_editor name="Object Description" tool_tip="Quando as pessoas selecionam 'Passe o mouse em todos os objetos’ na configuração de visualização, eles verão a descrição dos objetos em uma janela pop-up sempre que passar o mouse por cima. A descrição prim é limitada em 127 bytes, qualquer string maior ficará truncada."/> + <text name="CreatorNameLabel"> + Criador: + </text> + <text name="Owner:"> + Proprietário: + </text> + <text name="Group_label"> + Grupo: + </text> <button name="button set group" tool_tip="Selecione o grupo que terá acesso à autorização do objeto"/> <name_box initial_value="Carregando..." name="Group Name Proxy"/> <button label="Doar" label_selected="Doar" name="button deed" tool_tip="Ao doar este item, o próximo dono terá permissões de próximo dono. Objetos de grupos podem ser doados por um oficial do grupo."/> - <text name="label click action">Clique para:</text> - <combo_box name="clickaction"> + <text name="label click action"> + Clique para: + </text> + <combo_box name="clickaction" tool_tip="Ao clicar, você pode interagir com um objeto com um clique no botão esquerdo do mouse. Cada ação de clicar tem um cursor especial indicador. Algumas ações de clique tem exigências para a função. Por exemplo, Tocar e Pagar exige scripts."> <combo_box.item label="Tocar (padrão)" name="Touch/grab(default)"/> <combo_box.item label="Sentar em objeto" name="Sitonobject"/> <combo_box.item label="Comprar objeto" name="Buyobject"/> <combo_box.item label="Pagar por objeto" name="Payobject"/> <combo_box.item label="Abrir" name="Open"/> <combo_box.item label="Zoom" name="Zoom"/> + <combo_box.item label="Nenhum" name="None"/> </combo_box> <panel name="perms_inv"> - <text name="perm_modify">Você pode modificar este objeto</text> - <text name="Anyone can:">Todos:</text> - <check_box label="Copiar" name="checkbox allow everyone copy"/> - <check_box label="Movimentar" name="checkbox allow everyone move"/> - <text name="GroupLabel">Grupo:</text> + <text name="perm_modify"> + Você pode modificar este objeto + </text> + <text name="Anyone can:"> + Todos: + </text> + <check_box label="Copiar" name="checkbox allow everyone copy" tool_tip="Qualquer um pode fazer uma cópia do objeto. O objeto e todos os conteúdos devem ter permissão para cópia e transferência."/> + <check_box label="Movimentar" name="checkbox allow everyone move" tool_tip="Qualquer pessoa pode mover o objeto."/> + <text name="GroupLabel"> + Grupo: + </text> <check_box label="Compartilhar" name="checkbox share with group" tool_tip="Permitir que todos os membros do grupo tenham o seu nÃvel de modificação para este objeto. Faça uma doação para ativar restrições de função."/> - <text name="NextOwnerLabel">Próximo proprietário:</text> - <check_box label="Modificar" name="checkbox next owner can modify"/> - <check_box label="Copiar" name="checkbox next owner can copy"/> + <text name="NextOwnerLabel"> + Próximo proprietário: + </text> + <check_box label="Modificar" name="checkbox next owner can modify" tool_tip="O próximo proprietário pode editar as propriedades, como o nome do item ou escala desse objeto."/> + <check_box label="Copiar" name="checkbox next owner can copy" tool_tip="O próximo proprietário pode fazer cópias ilimitadas desse objeto. As cópias mantêm as informações do criador e nunca podem ser mais permissivo do que o item copiado."/> <check_box label="Transferir" name="checkbox next owner can transfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/> </panel> - <check_box label="À venda" name="checkbox for sale"/> - <combo_box name="sale type"> + <check_box label="À venda" name="checkbox for sale" tool_tip="Permita que as pessoas comprem esse objeto, seu conteúdo ou copiá-lo no mundo virtual por um preço especÃfico."/> + <combo_box name="sale type" tool_tip="Selecione se o comprador receberá uma cópia. A cópia do conteúdo ou o próprio item."> <combo_box.item label="Copiar" name="Copy"/> <combo_box.item label="Conteúdo" name="Contents"/> <combo_box.item label="Original" name="Original"/> </combo_box> - <spinner label="Preço: L$" name="Edit Cost"/> + <spinner label="Preço: L$" name="Edit Cost" tool_tip="Custo do objeto."/> <check_box label="Mostrar nos resultados de busca" name="search_check" tool_tip="Incluir o objeto nos resultados de busca"/> - <text name="pathfinding_attributes_label">Atributos do pathfinding:</text> - <text name="B:">B:</text> - <text name="O:">O:</text> - <text name="G:">G:</text> - <text name="E:">E:</text> - <text name="N:">N:</text> - <text name="F:">F:</text> + <text name="pathfinding_attributes_label"> + Atributos do pathfinding: + </text> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> </panel> <panel name="button_panel"> - <button label="Abrir" name="open_btn"/> - <button label="Pagar" name="pay_btn"/> - <button label="Comprar" name="buy_btn"/> - <button label="Detalhes" name="details_btn"/> + <button label="Abrir" name="open_btn" tool_tip="Abrir para visualizar os Conteúdos do Objeto."/> + <button label="Pagar" name="pay_btn" tool_tip="Abrir janela Pagar O objeto deve ter um script de pagamento para que funcione."/> + <button label="Comprar" name="buy_btn" tool_tip="Abrir janela Comprar É necessário que o objeto seja definido como para venda."/> + <button label="Detalhes" name="details_btn" tool_tip="Abrir a janela Inspecionar Objeto."/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index ecf90ef787efc884130c34116b9fd26c74245a89..c4fbf1f4c99b92c4e09de96ec7f813802805edcd 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -605,7 +605,7 @@ Aguarde um minuto antes que tentar logar-se novamente. Notas de versão </string> <string name="RELEASE_NOTES_BASE_URL"> - http://wiki.secondlife.com/wiki/Release_Notes/ + https://releasenotes.secondlife.com/viewer/ </string> <string name="LoadingData"> Carregando... @@ -2173,6 +2173,18 @@ Se você continuar a receber essa mensagem, entre em contato com o suporte do Se <string name="RegionInfoListTypeBannedAgents"> Sempre banido </string> + <string name="RegionInfoAllEstates"> + todos os terrenos + </string> + <string name="RegionInfoManagedEstates"> + administre terrenos + </string> + <string name="RegionInfoThisEstate"> + este terreno + </string> + <string name="AndNMore"> + e [EXTRA_COUNT] mais + </string> <string name="ScriptLimitsParcelScriptMemory"> Memória de scripts no lote </string> @@ -2216,7 +2228,7 @@ Se você continuar a receber essa mensagem, entre em contato com o suporte do Se Peito </string> <string name="ATTACH_HEAD"> - Cabeça + Crânio </string> <string name="ATTACH_LSHOULDER"> Ombro esquerdo @@ -2237,7 +2249,7 @@ Se você continuar a receber essa mensagem, entre em contato com o suporte do Se Pé direito </string> <string name="ATTACH_BACK"> - Atrás + Coluna </string> <string name="ATTACH_PELVIS"> Pélvis @@ -2294,7 +2306,7 @@ Se você continuar a receber essa mensagem, entre em contato com o suporte do Se Perna esquerda </string> <string name="ATTACH_BELLY"> - Barriga + Estômago </string> <string name="ATTACH_LEFT_PEC"> Peitorais E @@ -5615,4 +5627,25 @@ Tente colocar o caminho do editor entre aspas. <string name="Mav_Details_MAV_UNKNOWN_VERSION"> A forma fÃsica não tem a versão correta. Defina a versão correta para o modelo fÃsico. </string> + <string name="couldnt_resolve_host"> + O DNS não pode resolver o nome do host([HOSTNAME]). +Verifique se você pode conectar ao site www.secondlife.com . Se você +puder, mas se continuar recebendo esta mensagem de erro, vá à sessão +Suporte no site Secondlife.com e informe o problema. + </string> + <string name="ssl_peer_certificate"> + O servidor de acesso não pôde verificá-lo pelo SSL. +Se você continuar recebendo esta mensagem de erro, +vá à sessão Suporte no site Secondlife.com +e informe o problema. + </string> + <string name="ssl_connect_error"> + Geralmente, esse erro significa que o relógio do seu computador não está com o horário correto. +Vá em Painel de Controles e certifique-se de que a hora e data estejam corretos. +Além disso, verifique se a sua rede e firewall estejam corretos. Se você continuar +recebendo esta mensagem de erro, vá à sessão Suporte no site Secondlife.com +e informe o problema. + +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Base de conhecimento] + </string> </strings> diff --git a/indra/newview/skins/default/xui/ru/floater_auction.xml b/indra/newview/skins/default/xui/ru/floater_auction.xml index 105c75c919f96bafdadd5c1806c2e16338bc286d..e6cc7000245d45deaaa830f0c5194ba9896e3b73 100644 --- a/indra/newview/skins/default/xui/ru/floater_auction.xml +++ b/indra/newview/skins/default/xui/ru/floater_auction.xml @@ -1,10 +1,10 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_auction" title="ÐÐЧÐТЬ ПРОДÐЖУ ЗЕМЛИ ЛИÐДЕÐОВ"> +<floater name="floater_auction" title="ÐÐЧÐТЬ ПРОДÐЖУ ЗЕМЛИ LINDEN"> <floater.string name="already for sale"> ÐÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ñтавить на аукцион учаÑтки, которые уже продаютÑÑ. </floater.string> <check_box initial_value="true" label="Ð’ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¶ÐµÐ»Ñ‚ÑƒÑŽ ограду вокруг выбранного учаÑтка" name="fence_check"/> - <button label="Снимок" label_selected="Снимок" name="snapshot_btn"/> + <button label="Моментальный Ñнимок" label_selected="Моментальный Ñнимок" name="snapshot_btn"/> <button label="Купить может каждый" label_selected="Купить может каждый" name="sell_to_anyone_btn"/> <button label="ОчиÑтить наÑтройки" label_selected="ОчиÑтить наÑтройки" name="reset_parcel_btn"/> <button label="Ðачать аукцион" label_selected="Ðачать аукцион" name="start_auction_btn"/> diff --git a/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml b/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml index 304bf97dc1b11721474616d37464016495f24005..55b0e0c3bd6bdd240659e5fb8b087387091451f2 100644 --- a/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml @@ -29,17 +29,17 @@ <text name="GroupLabel"> Группа: </text> - <check_box label="ПоделитьÑÑ" name="share_with_group"/> + <check_box label="ПоделитьÑÑ" name="share_with_group" tool_tip="Позволить вÑем учаÑтникам выбранной группы получить уÑтановленные вам права на Ñтот объект. Ð”Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ€Ð¾Ð»ÐµÐ²Ñ‹Ñ… ограничений необходимо произвеÑти Ñделку."/> <text name="AnyoneLabel"> Ð’Ñе: </text> - <check_box label="Копировать" name="everyone_copy"/> + <check_box label="Копировать" name="everyone_copy" tool_tip="Копию объекта может взÑÑ‚ÑŒ любой желающий. Объект и вÑе его Ñодержимое должны копироватьÑÑ Ð¸ передаватьÑÑ."/> <text name="NextOwnerLabel"> Следующий владелец: </text> - <check_box label="ИзменÑÑ‚ÑŒ" name="next_owner_modify"/> - <check_box label="Копировать" name="next_owner_copy"/> - <check_box initial_value="true" label="Передать" name="next_owner_transfer" tool_tip="Следующий владелец может отдать или перепродать объект"/> + <check_box label="ИзменÑÑ‚ÑŒ" name="next_owner_modify" tool_tip="Следующий владелец может отредактировать ÑвойÑтва, такие как Ð¸Ð¼Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ предмета или маÑштаб Ñтого объекта."/> + <check_box label="Копировать" name="next_owner_copy" tool_tip="Следующий владелец может Ñделать неограниченное количеÑтво копий Ñтого объекта. Копии Ñодержат информацию о Ñоздателе и никогда не могут быть более разрешительными, чем копируемый предмет."/> + <check_box initial_value="true" label="Передать" name="next_owner_transfer" tool_tip="Следующий владелец может отдать или перепродать Ñтот объект."/> <button label="OK" name="ok"/> <button label="Применить" name="apply"/> <button label="Отмена" name="close"/> diff --git a/indra/newview/skins/default/xui/ru/floater_my_scripts.xml b/indra/newview/skins/default/xui/ru/floater_my_scripts.xml new file mode 100644 index 0000000000000000000000000000000000000000..4c73893085110a9a91b98d308ee889469e9a1ad9 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_my_scripts.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="myscripts" title="Мои Ñкрипты"/> diff --git a/indra/newview/skins/default/xui/ru/floater_preferences.xml b/indra/newview/skins/default/xui/ru/floater_preferences.xml index 1f04eabaf71521c58e2f331cde4be5eab04d7b2f..0c1cbd9dcaaf24ed7413f1dff3ebcc826e8552e9 100644 --- a/indra/newview/skins/default/xui/ru/floater_preferences.xml +++ b/indra/newview/skins/default/xui/ru/floater_preferences.xml @@ -5,6 +5,9 @@ </floater.string> <button label="ОК" label_selected="ОК" name="OK"/> <button label="Отмена" label_selected="Отмена" name="Cancel"/> + <panel name="search_panel"> + <search_editor label="ÐаÑтройки поиÑка" name="search_prefs_edit" tool_tip="Введите интереÑующий Ð²Ð°Ñ Ñ‚ÐµÑ€Ð¼Ð¸Ð½ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка здеÑÑŒ. Результаты будут отображены Ð´Ð»Ñ Ñ‡Ð°Ñтичного ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ текÑта в названии параметра или комментариÑÑ…."/> + </panel> <tab_container name="pref core"> <panel label="Общие" name="general"/> <panel label="Графика" name="display"/> diff --git a/indra/newview/skins/default/xui/ru/floater_tools.xml b/indra/newview/skins/default/xui/ru/floater_tools.xml index 74c27ce1622800292a19cd63717a706b73e3ea73..82ee3c49ae112976ff71d58d94935659a4b0c69c 100644 --- a/indra/newview/skins/default/xui/ru/floater_tools.xml +++ b/indra/newview/skins/default/xui/ru/floater_tools.xml @@ -175,9 +175,11 @@ <text name="Name:"> Ðазвание: </text> + <line_editor name="Object Name" tool_tip="Ðазвание ограничено 63 Ñимволами. Более длинные имена примитива ÑокращаютÑÑ. Имена могут ÑоÑтоÑÑ‚ÑŒ только из печатаемых Ñимволов, ÑодержащихÑÑ Ð² ASCII-7 (нераÑширенном) наборе Ñимволов, за иÑключением вертикальной черты/линии "|"."/> <text name="Description:"> ОпиÑание: </text> + <line_editor name="Object Description" tool_tip="Когда в наÑтройках окна проÑмотра выбрано 'Ð’Ñплывающие подÑказки на вÑех объектах', у игроков поÑвлÑетÑÑ Ð²Ñплывающее окошко Ñ Ð¾Ð¿Ð¸Ñанием объекта при наведении мыши на любой объект. ОпиÑание примитива ограничиваетÑÑ 127 байтами и Ñтрока Ñо значением, превышающим Ñтот размер, уÑекаетÑÑ."/> <text name="Creator:"> Создатель: </text> @@ -194,17 +196,18 @@ <text name="label click action"> По щелчку: </text> - <combo_box name="clickaction"> + <combo_box name="clickaction" tool_tip="ВзаимодейÑтвие Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð¼ производитьÑÑ Ð½Ð°Ð¶Ð°Ñ‚Ð¸ÐµÐ¼ на левую кнопку мыши. При каждом клике поÑвлÑетÑÑ Ñпециальный курÑор, указывающий на производимое дейÑтвие. Ðекоторые клики имеют функциональные требованиÑ. Ðапример, Ð´Ð»Ñ Touch and Pay требуютÑÑ Ñкрипты"> <combo_box.item label="КоÑнутьÑÑ (по умолчанию)" name="Touch/grab(default)"/> <combo_box.item label="СеÑÑ‚ÑŒ на объект" name="Sitonobject"/> <combo_box.item label="Купить объект" name="Buyobject"/> <combo_box.item label="Заплатить за объект" name="Payobject"/> <combo_box.item label="Открыть" name="Open"/> <combo_box.item label="Увеличение" name="Zoom"/> + <combo_box.item label="Ðет" name="None"/> </combo_box> - <check_box label="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸:" name="checkbox for sale"/> - <spinner label="L$" name="Edit Cost"/> - <combo_box name="sale type"> + <check_box label="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸:" name="checkbox for sale" tool_tip="ПозволÑет игрокам покупать Ñтот объект, его Ñодержимое или копировать его в игровом мире по указанной цене."/> + <spinner label="L$" name="Edit Cost" tool_tip="СтоимоÑÑ‚ÑŒ объекта."/> + <combo_box name="sale type" tool_tip="Выберите, получит ли покупатель копию, копию Ñодержимого или Ñам предмет."> <combo_box.item label="Копировать" name="Copy"/> <combo_box.item label="Контент" name="Contents"/> <combo_box.item label="Оригинал" name="Original"/> @@ -217,14 +220,14 @@ <text name="Anyone can:"> Ð’Ñе: </text> - <check_box label="ПеремеÑтить" name="checkbox allow everyone move"/> - <check_box label="Копировать" name="checkbox allow everyone copy"/> + <check_box label="ПеремеÑтить" name="checkbox allow everyone move" tool_tip="Любой игрок может перемеÑтить объект."/> + <check_box label="Копировать" name="checkbox allow everyone copy" tool_tip="Копию объекта может взÑÑ‚ÑŒ любой желающий. Объект и вÑе его Ñодержимое должны копироватьÑÑ Ð¸ передаватьÑÑ."/> <text name="Next owner can:"> Следующий владелец: </text> - <check_box label="ИзменÑÑ‚ÑŒ" name="checkbox next owner can modify"/> - <check_box label="Копировать" name="checkbox next owner can copy"/> - <check_box label="Передать" name="checkbox next owner can transfer" tool_tip="Следующий владелец может отдать или перепродать объект"/> + <check_box label="ИзменÑÑ‚ÑŒ" name="checkbox next owner can modify" tool_tip="Следующий владелец может отредактировать ÑвойÑтва, такие как Ð¸Ð¼Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ предмета или маÑштаб Ñтого объекта."/> + <check_box label="Копировать" name="checkbox next owner can copy" tool_tip="Следующий владелец может Ñделать неограниченное количеÑтво копий Ñтого объекта. Копии Ñодержат информацию о Ñоздателе и никогда не могут быть более разрешительными, чем копируемый предмет."/> + <check_box label="Передать" name="checkbox next owner can transfer" tool_tip="Следующий владелец может отдать или перепродать Ñтот объект."/> <text name="B:"> Ð: </text> diff --git a/indra/newview/skins/default/xui/ru/floater_top_objects.xml b/indra/newview/skins/default/xui/ru/floater_top_objects.xml index b045c5bff3359737b54526fe50d76a8aca647afe..39eae1e8d11aee4518dec0655dd884c005bacfee 100644 --- a/indra/newview/skins/default/xui/ru/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/ru/floater_top_objects.xml @@ -4,7 +4,7 @@ Лучшие Ñкрипты </floater.string> <floater.string name="top_scripts_text"> - [COUNT] Ñкриптов длительноÑтью [TIME] Ð¼Ñ + [COUNT] Ñкриптов длительноÑтью [TIME] Ð¼Ñ Ð¸ размером \[MEMORY] Кбайт </floater.string> <floater.string name="scripts_score_label"> Ð’Ñ€ÐµÐ¼Ñ diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml index 67ebda684aaf7d7ac6c9ed0964a3db08869da0dc..876972ba2444e26592a48aacdf09a1c7ee6f7a52 100644 --- a/indra/newview/skins/default/xui/ru/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml @@ -9,9 +9,11 @@ <menu_item_call label="МеÑта..." name="Places"/> <menu_item_call label="Подборка..." name="Picks"/> <menu_item_call label="ПриключениÑ..." name="Experiences"/> + <menu_item_call label="Мои Ñкрипты..." name="MyScripts"/> <menu_item_call label="Управление камерой..." name="Camera Controls"/> <menu label="Движение" name="Movement"> <menu_item_call label="СеÑÑ‚ÑŒ" name="Sit Down Here"/> + <menu_item_call label="Ð’Ñтать" name="Stand up"/> <menu_item_check label="Полет" name="Fly"/> <menu_item_check label="Ð’Ñегда бегать" name="Always Run"/> <menu_item_call label="ОÑтановить анимацию" name="Stop Animating My Avatar"/> diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml index 85314638c56746714d3e921f0b09882e260cd136..08accc39fe949d6663fddd941776a76e1656176e 100644 --- a/indra/newview/skins/default/xui/ru/notifications.xml +++ b/indra/newview/skins/default/xui/ru/notifications.xml @@ -244,6 +244,10 @@ Примечание. ПоÑле Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñтой опции вÑе пользователи данного компьютера Ñмогут увидеть ÑпиÑок ваших избранных меÑÑ‚. <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="AllowMultipleViewers"> + ЗапуÑк неÑкольких приложений Second Life Viewer не поддерживаетÑÑ. Ðто может привеÑти к конфликтам кÑша текÑтур, повреждению и Ñнижению производительноÑти и визуального отображениÑ. + <usetemplate name="okbutton" yestext="ОК"/> + </notification> <notification name="GrantModifyRights"> ПредоÑтавление другому жителю прав на изменение позволит ему изменÑÑ‚ÑŒ, удалÑÑ‚ÑŒ или брать ЛЮБЫЕ ваши объекты. Будьте ОЧЕÐЬ оÑторожны Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñтавлением такого разрешениÑ. Дать пользователю [NAME] права на изменение? @@ -717,9 +721,9 @@ Вам не разрешено терраформировать учаÑток [PARCEL]. </notification> <notification name="CannotCopyWarning"> - У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° копирование Ñледующих предметов: -[ITEMS] -ЕÑли вы отдадите Ñти вещи, их больше не будет в вашем инвентаре. Ð’Ñ‹ дейÑтвительно хотите предложить Ñти предметы? + У Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° копирование Ñледующих предметов: +<nolink>[ITEMS]</nolink> +и они пропадут из вашего инвентарÑ, еÑли вы их отдадите. Ð’Ñ‹ дейÑтвительно хотите предложить Ñти предметы? <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/> </notification> <notification name="CannotGiveItem"> @@ -1569,6 +1573,30 @@ <notification name="ProblemAddingEstateManagerBanned"> Ðевозможно добавить заблокированного Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð² ÑпиÑок менеджеров землевладениÑ. </notification> + <notification name="ProblemBanningEstateManager"> + Ðевозможно добавить заблокированного Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð² ÑпиÑок менеджеров Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ [AGENT]. + </notification> + <notification name="GroupIsAlreadyInList"> + <nolink>\[GROUP]</nolink> уже находитÑÑ Ð² ÑпиÑке допущенных групп. + </notification> + <notification name="AgentIsAlreadyInList"> + [AGENT] уже находитÑÑ Ð½Ð° вашем [LIST_TYPE] лиÑте. + </notification> + <notification name="AgentsAreAlreadyInList"> + [AGENT] уже находитÑÑ Ð½Ð° вашем [LIST_TYPE] лиÑте. + </notification> + <notification name="AgentWasAddedToList"> + [AGENT] был добавлен в [LIST_TYPE] лиÑÑ‚ [ESTATE]. + </notification> + <notification name="AgentsWereAddedToList"> + [AGENT] был добавлен в [LIST_TYPE] лиÑÑ‚ [ESTATE]. + </notification> + <notification name="AgentWasRemovedFromList"> + [AGENT] был удален из [LIST_TYPE] лиÑта [ESTATE]. + </notification> + <notification name="AgentsWereRemovedFromList"> + [AGENT] был удален из [LIST_TYPE] лиÑта [ESTATE]. + </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> ÐÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ внешноÑÑ‚ÑŒ, пока загружаютÑÑ Ð¾Ð´ÐµÐ¶Ð´Ð° и фигура. </notification> @@ -1584,9 +1612,25 @@ [DOWNLOAD_PATH]. </notification> <notification name="RequiredUpdate"> - Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° необходима верÑÐ¸Ñ \[VERSION]. Ð”Ð»Ñ Ð²Ð°Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ должно было произведено автоматичеÑки, но по какой-то причине Ñтого не произошло. Скачайте обновление Ñ Ð²ÐµÐ±-Ñайта https://secondlife.com/support/downloads/ + Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° необходима верÑÐ¸Ñ \[VERSION]. +Скачайте обновление Ñ Ð²ÐµÐ±-Ñайта https://secondlife.com/support/downloads/ + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="PauseForUpdate"> + Ð”Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° необходима верÑÐ¸Ñ \[VERSION]. +Ðажмите OK Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ и уÑтановки. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="OptionalUpdateReady"> + ВерÑÐ¸Ñ \[VERSION] загружена и готова к уÑтановке. +Ðажмите OK Ð´Ð»Ñ ÑƒÑтановки. <usetemplate name="okbutton" yestext="OK"/> </notification> + <notification name="PromptOptionalUpdate"> + ВерÑÐ¸Ñ \[VERSION] загружена и готова к уÑтановке. +Продолжить? + <usetemplate canceltext="Ðе ÑейчаÑ" name="yesnocancelbuttons" notext="ПропуÑтить" yestext="УÑтановить"/> + </notification> <notification name="LoginFailedUnknown"> Извините, ошибка входа по неуÑтановленной причине. ЕÑли данное Ñообщение повторитÑÑ, поÑетите веб-Ñайт [SUPPORT_SITE]. <usetemplate name="okbutton" yestext="Выйти"/> @@ -1868,7 +1912,7 @@ <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ð”Ð»Ñ Ð²Ñех землевладений" yestext="Ð”Ð»Ñ Ñтого землевладениÑ"/> </notification> <notification label="Выбрать землевладение" name="EstateBannedAgentRemove"> - Удалить Ñтого Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð· ÑпиÑка запрета доÑтупа только Ð´Ð»Ñ Ñтого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð´Ð»Ñ [ALL_ESTATES]? + Удалить Ñтого Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð· ÑпиÑка заблокированного доÑтупа только Ð´Ð»Ñ Ñтого Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð´Ð»Ñ [ALL_ESTATES]? <usetemplate canceltext="Отмена" name="yesnocancelbuttons" notext="Ð”Ð»Ñ Ð²Ñех землевладений" yestext="Ð”Ð»Ñ Ñтого землевладениÑ"/> </notification> <notification label="Выбрать землевладение" name="EstateManagerAdd"> @@ -3047,15 +3091,6 @@ <button name="Deny" text="Отклонить"/> </form> </notification> - <notification name="UnknownScriptQuestion"> - Объект <nolink>[OBJECTNAME]</nolink>» владельца «[NAME]» требует Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° выполнение Ñкрипта; разрешение не раÑпознаетÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð¼ и не будет предоÑтавлено - -Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñтого Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ ÑƒÑтановите поÑледнюю верÑию клиента из [DOWNLOADURL]. - <form name="form"> - <button name="Deny" text="OK"/> - <button name="Mute" text="Заблокировать"/> - </form> - </notification> <notification name="ScriptDialog"> [NAME] – «<nolink>[TITLE]</nolink>» [MESSAGE] @@ -3160,16 +3195,22 @@ Ðе удалоÑÑŒ подключитьÑÑ Ðº [VOICE_CHANNEL_NAME], повторите попытку позже. Будет уÑтановлено подключение к локальному голоÑовому чату. </notification> <notification name="VoiceEffectsExpired"> - ИÑтек Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ или неÑкольких типов Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа, на которые вы подпиÑаны. -[[URL] Щелкните здеÑÑŒ], чтобы обновить подпиÑку. + ИÑтек Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки на один или неÑколько типов анимационного Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа. +[[URL] Щелкните здеÑÑŒ], чтобы обновить подпиÑку. + +ЕÑли вы - владелец премиум-аккаунта, [[PREMIUM_URL] щелкните здеÑÑŒ], чтобы получить право на анимационное изменение голоÑа. </notification> <notification name="VoiceEffectsExpiredInUse"> - ИÑтек Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ типа Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа, применены наÑтройки вашего обычного голоÑа. -[[URL] Щелкните здеÑÑŒ], чтобы обновить подпиÑку. + ИÑтек Ñрок дейÑÑ‚Ð²Ð¸Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð¾Ð³Ð¾ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа, дейÑтвуют наÑтройки вашего обычного голоÑа. +[[URL] Щелкните здеÑÑŒ], чтобы обновить подпиÑку. + +ЕÑли вы - владелец премиум-аккаунта, [[PREMIUM_URL] щелкните здеÑÑŒ], чтобы получить право на анимационное изменение голоÑа. </notification> <notification name="VoiceEffectsWillExpire"> - Срок дейÑÑ‚Ð²Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ или неÑкольких ваших типов Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа иÑтекает через [INTERVAL] дней или раньше. -[[URL] Щелкните здеÑÑŒ], чтобы обновить подпиÑку. + Срок дейÑÑ‚Ð²Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ или неÑкольких ваших типов анимационного Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа иÑтекает через [INTERVAL] дней или раньше. +[[URL] Щелкните здеÑÑŒ], чтобы обновить подпиÑку. + +ЕÑли вы - владелец премиум-аккаунта, [[PREMIUM_URL] щелкните здеÑÑŒ], чтобы получить право на анимационное изменение голоÑа. </notification> <notification name="VoiceEffectsNew"> ПоÑвилиÑÑŒ новые типы Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа! @@ -3221,6 +3262,9 @@ <notification name="SnapshotToComputerFailed"> Ðе удалоÑÑŒ Ñохранить моментальный Ñнимок на [PATH]: ДиÑк переполнен. Ðеобходимо [NEED_MEMORY] Кбайт, но доÑтупно только [FREE_MEMORY] Кбайт. </notification> + <notification name="SnapshotToLocalDirNotExist"> + Ðе удалоÑÑŒ Ñохранить моментальный Ñнимок на [PATH]: Каталог не ÑущеÑтвует. + </notification> <notification name="PresetNotSaved"> Ошибка при Ñохранении преÑета [NAME]. </notification> @@ -3711,13 +3755,13 @@ Ð’Ñ‹ не можете Ñоздавать Ð´ÐµÑ€ÐµÐ²ÑŒÑ Ð¸ траву на чужой земле. </notification> <notification name="NoCopyPermsNoObject"> - Ðе удалоÑÑŒ Ñкопировать: вам не разрешено копировать объект «[OBJ_NAME]». + Ðе удалоÑÑŒ Ñкопировать, потому что у Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° копирование Ñтого предмета <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoTransPermsNoObject"> - Ðе удалоÑÑŒ Ñкопировать: объект «[OBJ_NAME]» Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ½ÐµÑти к вам. + Ðе удалоÑÑŒ Ñкопировать, потому что предмет <nolink>'[OBJ_NAME]'</nolink> не может быть перемещён к вам. </notification> <notification name="AddToNavMeshNoCopy"> - Ðе удалоÑÑŒ Ñкопировать: объект «[OBJ_NAME]» отноÑитÑÑ Ðº навигационной Ñетке. + Ðе удалоÑÑŒ Ñкопировать, потому что предмет <nolink>'[OBJ_NAME]'</nolink> отноÑитÑÑ Ðº навигационной Ñетке. </notification> <notification name="DupeWithNoRootsSelected"> Выбран дубликат без корневых объектов. @@ -3762,34 +3806,34 @@ Сохранение в инвентаре отключено. </notification> <notification name="NoExistNoSaveToContents"> - ÐÐµÐ»ÑŒÐ·Ñ Ñохранить «[OBJ_NAME]» в Ñодержимом объекта: объект, из которого оно было выложено, уже не ÑущеÑтвует. + Ðе удалоÑÑŒ Ñохранить <nolink>'[OBJ_NAME]'</nolink> в Ñодержимом предмета, потому что меÑто, в котором был Ñоздан предмет, больше не ÑущеÑтвует. </notification> <notification name="NoModNoSaveToContents"> - ÐÐµÐ»ÑŒÐ·Ñ Ñохранить «[OBJ_NAME]» в Ñодержимом объекта: вам не разрешено изменÑÑ‚ÑŒ объект «[DEST_NAME]». + Ðе удалоÑÑŒ Ñохранить <nolink>'[OBJ_NAME]'</nolink> в Ñодержимом предмета, потому что у Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° модификацию предмета <nolink>'[DEST_NAME]'</nolink>. </notification> <notification name="NoSaveBackToInvDisabled"> - Ðевозможно Ñохранить «[OBJ_NAME]» в инвентаре: Ñта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½Ð°. + Ðе удалоÑÑŒ Ñохранить <nolink>'[OBJ_NAME]'</nolink> обратно в инвентаре – Ñта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð°. </notification> <notification name="NoCopyNoSelCopy"> - ÐÐµÐ»ÑŒÐ·Ñ Ñкопировать выбранное: вам не разрешено копировать объект «[OBJ_NAME]». + Ð’Ñ‹ не можете Ñкопировать выбор, потому что у Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° копирование Ñтого предмета <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoTransNoSelCopy"> - Ðевозможно Ñкопировать выбранный предмет: объект «[OBJ_NAME]» не переноÑитÑÑ. + Ð’Ñ‹ не можете Ñкопировать Ñвой выбор, потому что предмет <nolink>'[OBJ_NAME]'</nolink> не может быть перемещён. </notification> <notification name="NoTransNoCopy"> - Ðевозможно Ñкопировать выбранный предмет: объект «[OBJ_NAME]» не переноÑитÑÑ. + Ð’Ñ‹ не можете Ñкопировать Ñвой выбор, потому что предмет <nolink>'[OBJ_NAME]'</nolink> не может быть перемещён. </notification> <notification name="NoPermsNoRemoval"> - Удаление объекта «[OBJ_NAME]» из ÑимулÑтора запрещено ÑиÑтемой разрешений. + Удаление предмета <nolink>'[OBJ_NAME]'</nolink> из ÑимулÑтора не допущено ÑиÑтемой прав доÑтупа. </notification> <notification name="NoModNoSaveSelection"> - ÐÐµÐ»ÑŒÐ·Ñ Ñохранить выбранное: вам не разрешено изменÑÑ‚ÑŒ объект «[OBJ_NAME]». + Копирование выбора невозможно, потому что у Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° модифицирование Ñтого предмета <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="NoCopyNoSaveSelection"> - Ðевозможно Ñохранить выбранный предмет: объект «[OBJ_NAME]» не копируетÑÑ. + Ð’Ñ‹ не можете Ñохранить Ñвой выбор, потому что предмет <nolink>'[OBJ_NAME]'</nolink> не поддаётÑÑ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸ÑŽ. </notification> <notification name="NoModNoTaking"> - ÐÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð±Ñ€Ð°Ñ‚ÑŒ выбранное: вам не разрешено изменÑÑ‚ÑŒ объект «[OBJ_NAME]». + Ð’Ñ‹ не можете Ñкопировать Ñвой выбор, потому что у Ð²Ð°Ñ Ð½ÐµÑ‚ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° модифицирование Ñтого предмета <nolink>'[OBJ_NAME]'</nolink>. </notification> <notification name="RezDestInternalError"> ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: неизвеÑтный тип меÑта назначениÑ. diff --git a/indra/newview/skins/default/xui/ru/panel_login.xml b/indra/newview/skins/default/xui/ru/panel_login.xml index 2e0ae89b286745d9903c41b44108a70fcda741a8..14107286e59222599171a67225c08b4426fd502f 100644 --- a/indra/newview/skins/default/xui/ru/panel_login.xml +++ b/indra/newview/skins/default/xui/ru/panel_login.xml @@ -1,6 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <panel name="panel_login"> - <panel.string name="forgot_password_url">http://secondlife.com/account/request.php</panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php + </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="ui_stack"> <layout_panel name="ui_container"> <combo_box label="Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" name="username_combo" tool_tip="Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, которое вы выбрали при региÑтрации, например, «bobsmith12» или «Steller Sunshine»"/> @@ -11,8 +16,13 @@ </combo_box> <button label="Войти" name="connect_btn"/> <check_box label="Запомнить менÑ" name="remember_check"/> - <text name="forgot_password_text">Забыли пароль?</text> + <text name="forgot_password_text"> + Забыли пароль? + </text> <combo_box label="Выберите Ñетку" name="server_combo"/> + <text name="sign_up_text"> + РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ + </text> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_login_first.xml b/indra/newview/skins/default/xui/ru/panel_login_first.xml index bb4875373a251f57e6e522425dde964c3c220ab6..5db81ea7ca518eda66cb768df44b5e75b440c1a4 100644 --- a/indra/newview/skins/default/xui/ru/panel_login_first.xml +++ b/indra/newview/skins/default/xui/ru/panel_login_first.xml @@ -3,6 +3,9 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="logo_stack"> <layout_panel name="parent_panel2"> <layout_stack name="widget_stack"> @@ -14,6 +17,9 @@ <text name="forgot_password_text"> Забытый пароль </text> + <text name="sign_up_text"> + РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ + </text> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_general.xml b/indra/newview/skins/default/xui/ru/panel_preferences_general.xml index b15d0e3abf97bedc442d233106edba697132b480..918b042dd7bf34a7bb812307ca83424794d11d1d 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_general.xml @@ -4,7 +4,6 @@ Язык: </text> <combo_box name="language_combobox"> - <combo_box.item label="Язык ÑиÑтемы" name="System Default Language"/> <combo_box.item label="English - ÐнглийÑкий" name="English"/> <combo_box.item label="Dansk – датÑкий (бета-верÑиÑ)" name="Danish"/> <combo_box.item label="Deutsch – немецкий (бета-верÑиÑ)" name="Deutsch(German)"/> diff --git a/indra/newview/skins/default/xui/ru/panel_region_access.xml b/indra/newview/skins/default/xui/ru/panel_region_access.xml new file mode 100644 index 0000000000000000000000000000000000000000..48adfbcd95e4e006ab7ff1d6f9c3da78e303b1c9 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/panel_region_access.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="ДоÑтуп" name="Access"> + <tab_container name="tabs"> + <panel label="МЕÐЕДЖЕРЫ ЗЕМЛЕВЛÐДЕÐИЯ" name="estate_managers_panel"> + <text name="estate_manager_label"> + Менеджеры землевладениÑ: + </text> + <name_list name="estate_manager_name_list"> + <columns label="ИмÑ" name="name"/> + </name_list> + <button label="Добавить..." name="add_estate_manager_btn"/> + <button label="Удалить..." name="remove_estate_manager_btn"/> + </panel> + <panel label="Ð ÐЗРЕШЕÐÐЫЕ" name="allowed_panel"> + <panel label="top_panel" name="allowed_search_panel"> + <filter_editor label="ПоиÑк допущенных агентов" name="allowed_search_input"/> + </panel> + <text name="allow_resident_label"> + Разрешено вÑегда: + </text> + <name_list name="allowed_avatar_name_list"> + <columns label="ИмÑ" name="name"/> + </name_list> + <button label="Добавить..." name="add_allowed_avatar_btn"/> + <button label="Удалить..." name="remove_allowed_avatar_btn"/> + </panel> + <panel label="ДОПУЩЕÐÐЫЕ ГРУППЫ" name="allowed_groups_panel"> + <panel label="top_panel" name="allowed_group_search_panel"> + <filter_editor label="ПоиÑк допущенных групп" name="allowed_group_search_input"/> + </panel> + <text name="allow_group_label"> + ДопуÑк групп вÑегда разрешен: + </text> + <name_list name="allowed_group_name_list"> + <columns label="ИмÑ" name="name"/> + </name_list> + <button label="Добавить..." name="add_allowed_group_btn"/> + <button label="Удалить..." name="remove_allowed_group_btn"/> + </panel> + <panel label="ЗÐБЛОКИРОВÐÐЫ" name="banned_panel"> + <panel label="top_panel" name="banned_search_panel"> + <filter_editor label="ПоиÑк заблокированных агентов" name="banned_search_input"/> + </panel> + <text name="ban_resident_label"> + Ð’Ñегда заблокированы: + </text> + <name_list name="banned_avatar_name_list"> + <columns label="ИмÑ" name="name"/> + <columns label="Дата поÑледнего входа" name="last_login_date"/> + <columns label="Дата блокировки" name="ban_date"/> + <columns label="Заблокированы по инициативе" name="bannedby"/> + </name_list> + <button label="Добавить..." name="add_banned_avatar_btn"/> + <button label="Удалить..." name="remove_banned_avatar_btn"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/ru/panel_region_estate.xml b/indra/newview/skins/default/xui/ru/panel_region_estate.xml index be93edf73007121274df2afa934b29f62e6899db..5789058b3b25f5529a152b102e2b18a2a312fe32 100644 --- a/indra/newview/skins/default/xui/ru/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/ru/panel_region_estate.xml @@ -16,7 +16,7 @@ (неизвеÑтно) </text> <radio_group name="externally_visible_radio"> - <radio_item label="Разрешено только нижеперечиÑленным жителÑм и группам" name="estate_restricted_access"/> + <radio_item label="Разрешено только жителÑм и группам, перечиÑленным на вкладке доÑтупа" name="estate_restricted_access"/> <radio_item label="ДоÑтуп открыт Ð´Ð»Ñ Ð²Ñех" name="estate_public_access"/> </radio_group> <check_box label="Должен быть 18 и Ñтарше" name="limit_age_verified" tool_tip="ДоÑтуп к Ñтому землевладению имеют только жители 18 лет и Ñтарше. Более Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð°Ñ…Ð¾Ð´Ð¸Ñ‚ÑÑ Ð·Ð´ÐµÑÑŒ: [SUPPORT_SITE]."/> diff --git a/indra/newview/skins/default/xui/ru/panel_status_bar.xml b/indra/newview/skins/default/xui/ru/panel_status_bar.xml index 49c48ae6545618ec910b36426122ae28978494d1..124b8f2cff212a02fef792a88983b9b480dd4ae7 100644 --- a/indra/newview/skins/default/xui/ru/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/ru/panel_status_bar.xml @@ -1,16 +1,31 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="status"> - <panel.string name="packet_loss_tooltip">Потери пакетов</panel.string> - <panel.string name="bandwidth_tooltip">Ширина канала</panel.string> - <panel.string name="time">[hour, datetime, slt]:[min, datetime, slt] [timezone,datetime, slt]</panel.string> - <panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string> - <panel.string name="buycurrencylabel">L$ [AMT]</panel.string> + <panel.string name="packet_loss_tooltip"> + Потери пакетов + </panel.string> + <panel.string name="bandwidth_tooltip"> + Ширина канала + </panel.string> + <panel.string name="time"> + [hour, datetime, slt]:[min, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> + [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] + </panel.string> + <panel.string name="buycurrencylabel"> + L$ [AMT] + </panel.string> + <panel name="menu_search_panel"> + <search_editor label="Меню поиÑка" name="search_menu_edit" tool_tip="Введите интереÑующий Ð²Ð°Ñ Ñ‚ÐµÑ€Ð¼Ð¸Ð½ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка здеÑÑŒ. Результаты будут отображены Ð´Ð»Ñ Ñ‡Ð°Ñтичного ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ текÑта в меню."/> + </panel> <panel left="-471" name="balance_bg" width="240"> <text name="balance" tool_tip="Щелкните Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ баланÑа L$" value="L$??"/> <button label="Купить L$" name="buyL" tool_tip="Щелкните Ð´Ð»Ñ Ð¿Ð¾ÐºÑƒÐ¿ÐºÐ¸ L$"/> <button label="Торговый центр" name="goShop" tool_tip="Открыть торговый центр Second Life" width="121"/> </panel> - <text name="TimeText" tool_tip="Текущее Ð²Ñ€ÐµÐ¼Ñ (тихоокеанÑкое)">00:00 (тихоокеанÑкое времÑ)</text> + <text name="TimeText" tool_tip="Текущее Ð²Ñ€ÐµÐ¼Ñ (тихоокеанÑкое)"> + 00:00 (тихоокеанÑкое времÑ) + </text> <button name="media_toggle_btn" tool_tip="ЗапуÑк/оÑтановка вÑех медиа (музыка, видео, веб-Ñтраницы)"/> <button name="volume_btn" tool_tip="РегулÑтор громкоÑти"/> </panel> diff --git a/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml b/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml index c434dcd6a8ddb3c5ca2def7a166db0f0e2df0853..79a645f53636a31bdf87172eedb9e107a4d90208 100644 --- a/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/ru/sidepanel_item_info.xml @@ -34,9 +34,11 @@ <text name="LabelItemNameTitle"> Ðазвание: </text> + <line_editor name="LabelItemName" tool_tip="Ðазвание ограничено 63 Ñимволами. Более длинные имена примитива ÑокращаютÑÑ. Имена могут ÑоÑтоÑÑ‚ÑŒ только из печатаемых Ñимволов, ÑодержащихÑÑ Ð² ASCII-7 (нераÑширенном) наборе Ñимволов, за иÑключением вертикальной черты/линии "|"."/> <text name="LabelItemDescTitle"> ОпиÑание: </text> + <line_editor name="LabelItemDesc" tool_tip="Когда в наÑтройках окна проÑмотра выбрано 'Ð’Ñплывающие подÑказки на вÑех объектах', у игроков поÑвлÑетÑÑ Ð²Ñплывающее окошко Ñ Ð¾Ð¿Ð¸Ñанием объекта при наведении мыши на любой объект. ОпиÑание примитива ограничиваетÑÑ 127 байтами и Ñтрока Ñо значением, превышающим Ñтот размер, уÑекаетÑÑ."/> <text name="LabelCreatorTitle"> Создатель: </text> @@ -59,7 +61,7 @@ <text name="AnyoneLabel"> Ð’Ñе: </text> - <check_box label="Копировать" name="CheckEveryoneCopy"/> + <check_box label="Копировать" name="CheckEveryoneCopy" tool_tip="Копию объекта может взÑÑ‚ÑŒ любой желающий. Объект и вÑе его Ñодержимое должны копироватьÑÑ Ð¸ передаватьÑÑ."/> <text name="GroupLabel"> Группа: </text> @@ -67,17 +69,17 @@ <text name="NextOwnerLabel"> Следующий владелец: </text> - <check_box label="ИзменÑÑ‚ÑŒ" name="CheckNextOwnerModify"/> - <check_box label="Копировать" name="CheckNextOwnerCopy"/> - <check_box label="Передать" name="CheckNextOwnerTransfer" tool_tip="Следующий владелец может отдать или перепродать объект"/> + <check_box label="ИзменÑÑ‚ÑŒ" name="CheckNextOwnerModify" tool_tip="Следующий владелец может отредактировать ÑвойÑтва, такие как Ð¸Ð¼Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ предмета или маÑштаб Ñтого объекта."/> + <check_box label="Копировать" name="CheckNextOwnerCopy" tool_tip="Следующий владелец может Ñделать неограниченное количеÑтво копий Ñтого объекта. Копии Ñодержат информацию о Ñоздателе и никогда не могут быть более разрешительными, чем копируемый предмет."/> + <check_box label="Передать" name="CheckNextOwnerTransfer" tool_tip="Следующий владелец может отдать или перепродать Ñтот объект."/> </panel> - <check_box label="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸" name="CheckPurchase"/> - <combo_box name="ComboBoxSaleType"> + <check_box label="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸" name="CheckPurchase" tool_tip="ПозволÑет игрокам покупать Ñтот объект, его Ñодержимое или копировать его в игровом мире по указанной цене."/> + <combo_box name="ComboBoxSaleType" tool_tip="Выберите, получит ли покупатель копию, копию Ñодержимого или Ñам предмет."> <combo_box.item label="Копировать" name="Copy"/> <combo_box.item label="Содержимое" name="Contents"/> <combo_box.item label="Оригинал" name="Original"/> </combo_box> - <spinner label="Цена: L$" name="Edit Cost"/> + <spinner label="Цена: L$" name="Edit Cost" tool_tip="СтоимоÑÑ‚ÑŒ объекта."/> </panel> </scroll_container> <panel name="button_panel"> diff --git a/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml index 4059a800f065d0a8d0f04ee8e726ebe58c6831a0..28afb79a080793064f4131e5414d8dafed6f465a 100644 --- a/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/ru/sidepanel_task_info.xml @@ -1,71 +1,136 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="object properties" title="Профиль объекта"> - <panel.string name="text deed continued">Сделка</panel.string> - <panel.string name="text deed">Сделка</panel.string> - <panel.string name="text modify info 1">Ðтот объект можно изменÑÑ‚ÑŒ</panel.string> - <panel.string name="text modify info 2">Ðти объекты можно изменÑÑ‚ÑŒ</panel.string> - <panel.string name="text modify info 3">Ðтот объект Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ</panel.string> - <panel.string name="text modify info 4">Ðти объекты Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ</panel.string> - <panel.string name="text modify info 5">Ðтот объект Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ через границу региона</panel.string> - <panel.string name="text modify info 6">Ðти объекты Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ через границу региона</panel.string> - <panel.string name="text modify warning">Ðтот объект Ñодержит объединенные чаÑти</panel.string> - <panel.string name="Cost Default">Цена: L$</panel.string> - <panel.string name="Cost Total">Ð˜Ñ‚Ð¾Ð³Ð¾Ð²Ð°Ñ Ñ†ÐµÐ½Ð°: L$</panel.string> - <panel.string name="Cost Per Unit">Цена за: L$</panel.string> - <panel.string name="Cost Mixed">Ð¡Ð¼ÐµÑˆÐ°Ð½Ð½Ð°Ñ Ñ†ÐµÐ½Ð°</panel.string> - <panel.string name="Sale Mixed">Ð¡Ð¼ÐµÑˆÐ°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð°</panel.string> + <panel.string name="text deed continued"> + Сделка + </panel.string> + <panel.string name="text deed"> + Сделка + </panel.string> + <panel.string name="text modify info 1"> + Ðтот объект можно изменÑÑ‚ÑŒ + </panel.string> + <panel.string name="text modify info 2"> + Ðти объекты можно изменÑÑ‚ÑŒ + </panel.string> + <panel.string name="text modify info 3"> + Ðтот объект Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ + </panel.string> + <panel.string name="text modify info 4"> + Ðти объекты Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ + </panel.string> + <panel.string name="text modify info 5"> + Ðтот объект Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ через границу региона + </panel.string> + <panel.string name="text modify info 6"> + Ðти объекты Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑ‚ÑŒ через границу региона + </panel.string> + <panel.string name="text modify warning"> + Ðтот объект Ñодержит объединенные чаÑти + </panel.string> + <panel.string name="Cost Default"> + Цена: L$ + </panel.string> + <panel.string name="Cost Total"> + Ð˜Ñ‚Ð¾Ð³Ð¾Ð²Ð°Ñ Ñ†ÐµÐ½Ð°: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Цена за: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Ð¡Ð¼ÐµÑˆÐ°Ð½Ð½Ð°Ñ Ñ†ÐµÐ½Ð° + </panel.string> + <panel.string name="Sale Mixed"> + Ð¡Ð¼ÐµÑˆÐ°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð° + </panel.string> <text name="title" value="Профиль объекта"/> <text name="where" value="(в мире)"/> <panel label="" name="properties_panel"> - <text name="Name:">Ðазвание:</text> - <text name="Description:">ОпиÑание:</text> - <text name="CreatorNameLabel">Создатель:</text> - <text name="Owner:">Владелец:</text> - <text name="Group_label">Группа:</text> + <text name="Name:"> + Ðазвание: + </text> + <line_editor name="Object Name" tool_tip="Ðазвание ограничено 63 Ñимволами. Более длинные имена примитива ÑокращаютÑÑ. Имена могут ÑоÑтоÑÑ‚ÑŒ только из печатаемых Ñимволов, ÑодержащихÑÑ Ð² ASCII-7 (нераÑширенном) наборе Ñимволов, за иÑключением вертикальной черты/линии "|"."/> + <text name="Description:"> + ОпиÑание: + </text> + <line_editor name="Object Description" tool_tip="Когда в наÑтройках окна проÑмотра выбрано 'Ð’Ñплывающие подÑказки на вÑех объектах', у игроков поÑвлÑетÑÑ Ð²Ñплывающее окошко Ñ Ð¾Ð¿Ð¸Ñанием объекта при наведении мыши на любой объект. ОпиÑание примитива ограничиваетÑÑ 127 байтами и Ñтрока Ñо значением, превышающим Ñтот размер, уÑекаетÑÑ."/> + <text name="CreatorNameLabel"> + Создатель: + </text> + <text name="Owner:"> + Владелец: + </text> + <text name="Group_label"> + Группа: + </text> <button name="button set group" tool_tip="Выберите группу Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ ей прав доÑтупа к объекту"/> <name_box initial_value="Загрузка..." name="Group Name Proxy"/> <button label="Сделка" label_selected="Сделка" name="button deed" tool_tip="Ð’ результате Ñделки объект передаетÑÑ Ð³Ñ€ÑƒÐ¿Ð¿Ðµ, при Ñтом права на него будут ÑоответÑтвовать правам Ñледующего владельца. Переданный группе объект может передаватьÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð¾Ñтным лицом группы."/> - <text name="label click action">ДейÑтвие по щелчку:</text> - <combo_box name="clickaction"> + <text name="label click action"> + ДейÑтвие по щелчку: + </text> + <combo_box name="clickaction" tool_tip="ВзаимодейÑтвие Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð¼ производитьÑÑ Ð½Ð°Ð¶Ð°Ñ‚Ð¸ÐµÐ¼ на левую кнопку мыши. При каждом клике поÑвлÑетÑÑ Ñпециальный курÑор, указывающий на производимое дейÑтвие. Ðекоторые клики имеют функциональные требованиÑ. Ðапример, Ð´Ð»Ñ Touch and Pay требуютÑÑ Ñкрипты"> <combo_box.item label="КоÑнутьÑÑ (по умолчанию)" name="Touch/grab(default)"/> <combo_box.item label="СеÑÑ‚ÑŒ на объект" name="Sitonobject"/> <combo_box.item label="Купить объект" name="Buyobject"/> <combo_box.item label="Заплатить за объект" name="Payobject"/> <combo_box.item label="Открыть" name="Open"/> <combo_box.item label="Приблизить" name="Zoom"/> + <combo_box.item label="Ðет" name="None"/> </combo_box> <panel name="perms_inv"> - <text name="perm_modify">Ðтот объект можно изменÑÑ‚ÑŒ</text> - <text name="Anyone can:">Ð’Ñе:</text> - <check_box label="Копировать" name="checkbox allow everyone copy"/> - <check_box label="ПеремеÑтить" name="checkbox allow everyone move"/> - <text name="GroupLabel">Группа:</text> + <text name="perm_modify"> + Ðтот объект можно изменÑÑ‚ÑŒ + </text> + <text name="Anyone can:"> + Ð’Ñе: + </text> + <check_box label="Копировать" name="checkbox allow everyone copy" tool_tip="Копию объекта может взÑÑ‚ÑŒ любой желающий. Объект и вÑе его Ñодержимое должны копироватьÑÑ Ð¸ передаватьÑÑ."/> + <check_box label="ПеремеÑтить" name="checkbox allow everyone move" tool_tip="Любой игрок может перемеÑтить объект."/> + <text name="GroupLabel"> + Группа: + </text> <check_box label="ПоделитьÑÑ" name="checkbox share with group" tool_tip="Позволить вÑем учаÑтникам выбранной группы получить уÑтановленные вам права на Ñтот объект. Ð”Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ€Ð¾Ð»ÐµÐ²Ñ‹Ñ… ограничений необходимо произвеÑти Ñделку."/> - <text name="NextOwnerLabel">Следующий владелец:</text> - <check_box label="ИзменÑÑ‚ÑŒ" name="checkbox next owner can modify"/> - <check_box label="Копировать" name="checkbox next owner can copy"/> + <text name="NextOwnerLabel"> + Следующий владелец: + </text> + <check_box label="ИзменÑÑ‚ÑŒ" name="checkbox next owner can modify" tool_tip="Следующий владелец может отредактировать ÑвойÑтва, такие как Ð¸Ð¼Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ предмета или маÑштаб Ñтого объекта."/> + <check_box label="Копировать" name="checkbox next owner can copy" tool_tip="Следующий владелец может Ñделать неограниченное количеÑтво копий Ñтого объекта. Копии Ñодержат информацию о Ñоздателе и никогда не могут быть более разрешительными, чем копируемый предмет."/> <check_box label="Передать" name="checkbox next owner can transfer" tool_tip="Следующий владелец может отдать или перепродать объект"/> </panel> - <check_box label="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸" name="checkbox for sale"/> - <combo_box name="sale type"> + <check_box label="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸" name="checkbox for sale" tool_tip="ПозволÑет игрокам покупать Ñтот объект, его Ñодержимое или копировать его в игровом мире по указанной цене."/> + <combo_box name="sale type" tool_tip="Выберите, получит ли покупатель копию, копию Ñодержимого или Ñам предмет."> <combo_box.item label="Копировать" name="Copy"/> <combo_box.item label="Контент" name="Contents"/> <combo_box.item label="Оригинал" name="Original"/> </combo_box> - <spinner label="Цена: L$" name="Edit Cost"/> + <spinner label="Цена: L$" name="Edit Cost" tool_tip="СтоимоÑÑ‚ÑŒ объекта."/> <check_box label="Показать в результатах поиÑка" name="search_check" tool_tip="Показывать объект в результатах поиÑка"/> - <text name="pathfinding_attributes_label">Ðтрибуты поиÑка пути:</text> - <text name="B:">Ð:</text> - <text name="O:">O:</text> - <text name="G:">G:</text> - <text name="E:">Ð’:</text> - <text name="N:">С:</text> - <text name="F:">F:</text> + <text name="pathfinding_attributes_label"> + Ðтрибуты поиÑка пути: + </text> + <text name="B:"> + Ð: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + Ð’: + </text> + <text name="N:"> + С: + </text> + <text name="F:"> + F: + </text> </panel> <panel name="button_panel"> - <button label="Открыть" name="open_btn"/> - <button label="Заплатить" name="pay_btn"/> - <button label="Купить" name="buy_btn"/> - <button label="ПодробноÑти" name="details_btn"/> + <button label="Открыть" name="open_btn" tool_tip="Откройте Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñодержимого объекта."/> + <button label="Заплатить" name="pay_btn" tool_tip="Откройте окно Оплатить. Чтобы оплатить за объект, он должен иметь Ñкрипт Ð´Ð»Ñ Ð¾Ð¿Ð»Ð°Ñ‚Ñ‹."/> + <button label="Купить" name="buy_btn" tool_tip="Откройте окно Купить. ТребуетÑÑ, чтобы объект был выÑтавлен на продажу."/> + <button label="ПодробноÑти" name="details_btn" tool_tip="Откройте окно оÑмотра объекта."/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index 267c7171898972982994c6a5adafaed95818f0e2..9192ebf60190a5a43b9ff85af860987b34905cc7 100644 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -2226,6 +2226,18 @@ support@secondlife.com. <string name="RegionInfoListTypeBannedAgents"> Ð’Ñегда заблокированы </string> + <string name="RegionInfoAllEstates"> + вÑе Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ + </string> + <string name="RegionInfoManagedEstates"> + управлÑемые Ð·ÐµÐ¼Ð»ÐµÐ²Ð»Ð°Ð´ÐµÐ½Ð¸Ñ + </string> + <string name="RegionInfoThisEstate"> + Ñто землевладение + </string> + <string name="AndNMore"> + и \[EXTRA_COUNT] более + </string> <string name="ScriptLimitsParcelScriptMemory"> ПамÑÑ‚ÑŒ под Ñкрипты на учаÑтке </string> @@ -2269,7 +2281,7 @@ support@secondlife.com. Грудь </string> <string name="ATTACH_HEAD"> - Голова + Череп </string> <string name="ATTACH_LSHOULDER"> Левое плечо @@ -2290,7 +2302,7 @@ support@secondlife.com. ÐŸÑ€Ð°Ð²Ð°Ñ ÑÑ‚ÑƒÐ¿Ð½Ñ </string> <string name="ATTACH_BACK"> - Спина + Позвоночник </string> <string name="ATTACH_PELVIS"> Таз @@ -5747,4 +5759,25 @@ support@secondlife.com. <string name="Mav_Details_MAV_UNKNOWN_VERSION"> У физичеÑкой формы нет правильной верÑии. Задайте правильную верÑию Ð´Ð»Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑкой модели. </string> + <string name="couldnt_resolve_host"> + DNS не удалоÑÑŒ разрешить Ð¸Ð¼Ñ ÑƒÐ·Ð»Ð°([HOSTNAME]). +Проверьте возможноÑÑ‚ÑŒ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº веб-Ñайту www.secondlife.com. +ЕÑли вы продолжаете получать Ñту ошибку, перейдите в раздел +поддержки и Ñообщите о проблеме. + </string> + <string name="ssl_peer_certificate"> + Серверу входа в ÑиÑтему не удалоÑÑŒ пройти аутентификацию Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ +протокола SSL. ЕÑли вы продолжаете получать Ñту ошибку, +перейдите в раздел поддержки на веб-Ñайте SecondLife.com +и Ñообщите о проблеме. + </string> + <string name="ssl_connect_error"> + ЧаÑто Ñто означает, что чаÑÑ‹ компьютера уÑтановлены неправильно. +Перейдите, пожалуйÑта, на Панели ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ убедитеÑÑŒ в правильной +уÑтановке времени и даты. Также проверьте правильноÑÑ‚ÑŒ наÑтройки Ñети +и брандмауÑра. ЕÑли вы продолжаете получать Ñту ошибку, перейдите в +раздел поддержки на веб-Ñайте SecondLife.com и Ñообщите о проблеме. + +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 База знаний] + </string> </strings> diff --git a/indra/newview/skins/default/xui/tr/floater_auction.xml b/indra/newview/skins/default/xui/tr/floater_auction.xml index 3c945a9c964e414d3b35be0145de814ef1b6fe38..dccf47d81986f74667fa562cb2d1e0940ba628b4 100644 --- a/indra/newview/skins/default/xui/tr/floater_auction.xml +++ b/indra/newview/skins/default/xui/tr/floater_auction.xml @@ -3,8 +3,8 @@ <floater.string name="already for sale"> Zaten satışa çıkarılmış olan parselleri açık artırmaya sunamazsınız. </floater.string> - <check_box initial_value="true" label="Sarı seçim çiti dahil edilsin" name="fence_check"/> - <button label="Anlık Görüntü" label_selected="Anlık Görüntü" name="snapshot_btn"/> + <check_box initial_value="true" label="Sarı seçim çitini dahil et" name="fence_check"/> + <button label="Anlık görüntü" label_selected="Anlık görüntü" name="snapshot_btn"/> <button label="Herkese Sat" label_selected="Herkese Sat" name="sell_to_anyone_btn"/> <button label="Ayarları Temizle" label_selected="Ayarları Temizle" name="reset_parcel_btn"/> <button label="Açık Artırmayı BaÅŸlat" label_selected="Açık Artırmayı BaÅŸlat" name="start_auction_btn"/> diff --git a/indra/newview/skins/default/xui/tr/floater_bulk_perms.xml b/indra/newview/skins/default/xui/tr/floater_bulk_perms.xml index bf4473ce1fc24ed523292af5b62bb5deb3c07b1d..a7708b58827a2f0d348026f61b1b1ed311828ef2 100644 --- a/indra/newview/skins/default/xui/tr/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/tr/floater_bulk_perms.xml @@ -29,17 +29,17 @@ <text name="GroupLabel"> Grup: </text> - <check_box label="PaylaÅŸ" name="share_with_group"/> + <check_box label="PaylaÅŸ" name="share_with_group" tool_tip="Ayarlanan grubun tüm üyelerinin, bu nesne için deÄŸiÅŸtirme izinlerinizi paylaÅŸmasına izin verir. Rol kısıtlamalarını etkinleÅŸtirmek için Devretmeniz gerekiyor."/> <text name="AnyoneLabel"> Herkes: </text> - <check_box label="Kopyala" name="everyone_copy"/> + <check_box label="Kopyala" name="everyone_copy" tool_tip="Herkes nesnenin bir kopyasını alabilir. Nesne ve sahip olduÄŸu tüm içerikler kopyalamaya ve aktarıma izin vermelidir."/> <text name="NextOwnerLabel"> Sonraki sahip: </text> - <check_box label="DeÄŸiÅŸtir" name="next_owner_modify"/> - <check_box label="Kopyala" name="next_owner_copy"/> - <check_box initial_value="true" label="Aktar" name="next_owner_transfer" tool_tip="Sonraki sahibi bu nesneyi verebilir veya tekrar satabilir"/> + <check_box label="DeÄŸiÅŸtir" name="next_owner_modify" tool_tip="Sonraki sahip öğe adı veya bu nesnenin büyüklüğü gibi özellikleri düzenleyebilir."/> + <check_box label="Kopyala" name="next_owner_copy" tool_tip="Sonraki sahip bu nesnenin sınırsız sayıda kopyasını oluÅŸturabilir. Kopyalar oluÅŸturucu bilgisini içerir ve asla kopyalanan öğeden daha fazla izin veren bir özellikte olamaz."/> + <check_box initial_value="true" label="Aktar" name="next_owner_transfer" tool_tip="Sonraki sahibi bu nesneyi hediye edebilir veya tekrar satabilir."/> <button label="Tamam" name="ok"/> <button label="Uygula" name="apply"/> <button label="Ä°ptal" name="close"/> diff --git a/indra/newview/skins/default/xui/tr/floater_my_scripts.xml b/indra/newview/skins/default/xui/tr/floater_my_scripts.xml new file mode 100644 index 0000000000000000000000000000000000000000..2a4ad5560615568bd3323544ee1ac2c6310dc365 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_my_scripts.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="myscripts" title="Komut Dosyalarım"/> diff --git a/indra/newview/skins/default/xui/tr/floater_preferences.xml b/indra/newview/skins/default/xui/tr/floater_preferences.xml index c9d509c86817817b75f568ae802527a81f1a51ac..03e95b46811f4dc9a521ebed153115b9d21284aa 100644 --- a/indra/newview/skins/default/xui/tr/floater_preferences.xml +++ b/indra/newview/skins/default/xui/tr/floater_preferences.xml @@ -5,6 +5,9 @@ </floater.string> <button label="Tamam" label_selected="Tamam" name="OK"/> <button label="Ä°ptal" label_selected="Ä°ptal" name="Cancel"/> + <panel name="search_panel"> + <search_editor label="Ayarlarda Ara" name="search_prefs_edit" tool_tip="Merak ettiÄŸiniz arama terimini buraya yazın. Sonuçlar, ayar adı veya açıklaması içindeki kısmi tam metin eÅŸleÅŸmeleri ÅŸeklinde görüntülenir."/> + </panel> <tab_container name="pref core"> <panel label="Genel" name="general"/> <panel label="Grafikler" name="display"/> diff --git a/indra/newview/skins/default/xui/tr/floater_tools.xml b/indra/newview/skins/default/xui/tr/floater_tools.xml index 0c26f717afe67048b05dd69371395271f8a65d19..d6b9a4a533f79d4cb91b938908ec906dbfaa41c8 100644 --- a/indra/newview/skins/default/xui/tr/floater_tools.xml +++ b/indra/newview/skins/default/xui/tr/floater_tools.xml @@ -175,9 +175,11 @@ <text name="Name:"> Ad: </text> + <line_editor name="Object Name" tool_tip="Ad, 63 karakter ile sınırlıdır. Daha uzun prim adları kesilerek kısaltılır. Adlar, dikey çubuk '|' hariç olmak üzere, sadece ASCII-7 (geniÅŸletilmemiÅŸ) karakter kümesinde bulunan yazdırılabilir karakterlerden oluÅŸabilir."/> <text name="Description:"> Açıklama: </text> + <line_editor name="Object Description" tool_tip="Görüntüleyici ayarlarında 'Ä°puçlarını Tüm Nesnelerin Ãœzerine Getir' seçildiÄŸinde, fare imlecinin altındaki herhangi bir nesneye ait nesne açıklaması açılır penceresi görülür. Prim (temel öğe) açıklaması 127 bayt ile sınırlıdır ve bundan daha uzun her dize kesilir."/> <text name="Creator:"> OluÅŸturan: </text> @@ -194,17 +196,18 @@ <text name="label click action"> Åžu eylem için tıklayın: </text> - <combo_box name="clickaction"> + <combo_box name="clickaction" tool_tip="Tıklama eylemi, tek bir sol tıklama yoluyla bir nesne ile etkileÅŸime girmenize olanak saÄŸlar. Her tıklama eylemi, ne iÅŸe yaradığını gösteren özel bir imlece sahiptir. Bazı tıklama eylemlerinin iÅŸlevlerini yerine getirmesi için belirli gereklilikler vardır. ÖrneÄŸin, Dokun ve Öde komut dosyaları gerektirir"> <combo_box.item label="Dokun (varsayılan)" name="Touch/grab(default)"/> <combo_box.item label="Nesnenin üzerine otur" name="Sitonobject"/> <combo_box.item label="Nesneyi satın al" name="Buyobject"/> <combo_box.item label="Nesneye ödeme yap" name="Payobject"/> <combo_box.item label="Aç" name="Open"/> <combo_box.item label="YakınlaÅŸtır" name="Zoom"/> + <combo_box.item label="Yok" name="None"/> </combo_box> - <check_box label="Satılık:" name="checkbox for sale"/> - <spinner label="L$" name="Edit Cost"/> - <combo_box name="sale type"> + <check_box label="Satılık:" name="checkbox for sale" tool_tip="Ä°nsanların bu nesneyi, içeriÄŸini veya SL dünyasındaki kopyasını satın almasına izin verin."/> + <spinner label="L$" name="Edit Cost" tool_tip="Nesne maliyeti."/> + <combo_box name="sale type" tool_tip="Alıcının bir kopya mı, yani içeriÄŸin kopyasını mı yoksa öğenin kendisini mi alacağını seçin."> <combo_box.item label="Kopyala" name="Copy"/> <combo_box.item label="İçerik" name="Contents"/> <combo_box.item label="Orijinal" name="Original"/> @@ -217,14 +220,14 @@ <text name="Anyone can:"> Herkes: </text> - <check_box label="Hareket Et" name="checkbox allow everyone move"/> - <check_box label="Kopyala" name="checkbox allow everyone copy"/> + <check_box label="Hareket Et" name="checkbox allow everyone move" tool_tip="Herkes nesneyi hareket ettirebilir."/> + <check_box label="Kopyala" name="checkbox allow everyone copy" tool_tip="Herkes nesnenin bir kopyasını alabilir. Nesne ve sahip olduÄŸu tüm içerikler kopyalamaya ve aktarıma izin vermelidir."/> <text name="Next owner can:"> Sonraki sahip: </text> - <check_box label="DeÄŸiÅŸtir" name="checkbox next owner can modify"/> - <check_box label="Kopyala" name="checkbox next owner can copy"/> - <check_box label="Aktar" name="checkbox next owner can transfer" tool_tip="Sonraki sahibi bu nesneyi verebilir veya tekrar satabilir"/> + <check_box label="DeÄŸiÅŸtir" name="checkbox next owner can modify" tool_tip="Sonraki sahip öğe adı veya bu nesnenin büyüklüğü gibi özellikleri düzenleyebilir."/> + <check_box label="Kopyala" name="checkbox next owner can copy" tool_tip="Sonraki sahip bu nesnenin sınırsız sayıda kopyasını oluÅŸturabilir. Kopyalar oluÅŸturucu bilgisini içerir ve asla kopyalanan öğeden daha fazla izin veren bir özellikte olamaz."/> + <check_box label="Aktar" name="checkbox next owner can transfer" tool_tip="Sonraki sahibi bu nesneyi hediye edebilir veya tekrar satabilir."/> <text name="B:"> B: </text> diff --git a/indra/newview/skins/default/xui/tr/floater_top_objects.xml b/indra/newview/skins/default/xui/tr/floater_top_objects.xml index 013e8d7ce1969cb412af6ac9640a8a3c157d17d2..35cecd92cf8f33e93327535120864abdbeafd3cf 100644 --- a/indra/newview/skins/default/xui/tr/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/tr/floater_top_objects.xml @@ -4,7 +4,7 @@ Top Komut Dosyaları </floater.string> <floater.string name="top_scripts_text"> - [COUNT] komut tosyası toplam [TIME] ms sürüyor + [COUNT] komut dosyası toplam [TIME] ms zaman alıyor ve [MEMORY] KB bellek kullanıyor </floater.string> <floater.string name="scripts_score_label"> Süre diff --git a/indra/newview/skins/default/xui/tr/menu_viewer.xml b/indra/newview/skins/default/xui/tr/menu_viewer.xml index e43ca504f79bc55141838975f90b8f78ea377c02..b83847a013e2e9a9484ce531da6fd7e516c499fb 100644 --- a/indra/newview/skins/default/xui/tr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/tr/menu_viewer.xml @@ -9,9 +9,11 @@ <menu_item_call label="Yerler..." name="Places"/> <menu_item_call label="Favoriler..." name="Picks"/> <menu_item_call label="Deneyimler..." name="Experiences"/> + <menu_item_call label="Komut Dosyalarım..." name="MyScripts"/> <menu_item_call label="Kamera Denetimleri..." name="Camera Controls"/> <menu label="Hareket" name="Movement"> <menu_item_call label="Otur" name="Sit Down Here"/> + <menu_item_call label="Kalk" name="Stand up"/> <menu_item_check label="Uç" name="Fly"/> <menu_item_check label="Daima KoÅŸ" name="Always Run"/> <menu_item_call label="Beni Anime Etmeyi Durdur" name="Stop Animating My Avatar"/> diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml index 187638d488c138e619632d6d61a05cb3d223d5c7..13867cf5b8e6774e8287bb9c3227febbf92d62b6 100644 --- a/indra/newview/skins/default/xui/tr/notifications.xml +++ b/indra/newview/skins/default/xui/tr/notifications.xml @@ -244,6 +244,10 @@ Lütfen sadece bir nesne seçin ve tekrar deneyin. Not: Bu seçeneÄŸi etkinleÅŸtirdiÄŸinizde, bu bilgisayarı kullanan herkes en sevdiÄŸiniz konumlar listenizi görebilecek. <usetemplate name="okbutton" yestext="Tamam"/> </notification> + <notification name="AllowMultipleViewers"> + Birden çok Second Life görüntüleyiciyi çalıştırma özelliÄŸi desteklenmiyor. Bu durum doku önbelleÄŸi çakışmalarına, görsellerin bozulmasına ve performansın düşmesine yol açabilir. + <usetemplate name="okbutton" yestext="Tamam"/> + </notification> <notification name="GrantModifyRights"> BaÅŸka bir Sakine deÄŸiÅŸiklik yapma hakkı verdiÄŸinizde, SL dünyasında sahip olduÄŸunuz HERHANGÄ° BÄ°R nesneyi deÄŸiÅŸtirebilme, silebilme veya alabilmelerine izin vermiÅŸ olursunuz. Bu izni verirken ÇOK dikkatli olun. [NAME] adlı kiÅŸiye deÄŸiÅŸiklik yapma hakkı vermek istiyor musunuz? @@ -718,9 +722,9 @@ Grafik Kalitesi, Tercihler > Grafikler sekmesinden yükseltilebilir. [PARCEL] parseli üzerinde yer ÅŸekillendirmesi yapma izniniz bulunmuyor. </notification> <notification name="CannotCopyWarning"> - AÅŸağıdaki öğeleri kopyalamak için gerekli izne sahip deÄŸilsiniz: -[ITEMS] -Bu öğeleri verdiÄŸiniz takdirde envanterinizden çıkacaklar. Bu öğeleri teklif etmeyi gerçekten istiyor musunuz? + AÅŸağıdaki öğeleri kopyalama izniniz yok: +<nolink>[ITEMS]</nolink> +ve bunları elden çıkardığınız takdirde envanterinizden kaybolacaktır. Bu öğeleri sunmayı gerçekten istiyor musunuz? <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/> </notification> <notification name="CannotGiveItem"> @@ -1570,6 +1574,30 @@ Lütfen sadece bir nesne seçin ve tekrar deneyin. <notification name="ProblemAddingEstateManagerBanned"> EngellenmiÅŸ sakin, gayrimenkul yöneticisi listesine eklenemez. </notification> + <notification name="ProblemBanningEstateManager"> + Gayrimenkul yöneticisi [AGENT] engellenen listesine eklenemiyor. + </notification> + <notification name="GroupIsAlreadyInList"> + <nolink>[GROUP]</nolink> zaten Ä°zin Verilen Gruplar listesinde yer alıyor. + </notification> + <notification name="AgentIsAlreadyInList"> + [AGENT] zaten [LIST_TYPE] listenizde yer alıyor. + </notification> + <notification name="AgentsAreAlreadyInList"> + [AGENT] zaten [LIST_TYPE] listenizde yer alıyor. + </notification> + <notification name="AgentWasAddedToList"> + [AGENT], [ESTATE] [LIST_TYPE] listesine eklendi. + </notification> + <notification name="AgentsWereAddedToList"> + [AGENT], [ESTATE] [LIST_TYPE] listesine eklendi. + </notification> + <notification name="AgentWasRemovedFromList"> + [AGENT], [ESTATE] [LIST_TYPE] listesinden kaldırıldı. + </notification> + <notification name="AgentsWereRemovedFromList"> + [AGENT], [ESTATE] [LIST_TYPE] listesinden kaldırıldı. + </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> Giysi ve ÅŸekil yüklenene kadar görünüm deÄŸiÅŸtirilemez. </notification> @@ -1585,9 +1613,25 @@ Nesneyi satılık olarak ayarlayıp tekrar deneyin. [DOWNLOAD_PATH]. </notification> <notification name="RequiredUpdate"> - Oturum açma için [VERSION] sürümü gerekli. Bu sizin için güncellenmiÅŸ olmalıydı ancak görünüşe göre güncellenmemiÅŸ. Lütfen www.secondlife.com adresinden indirin. + Oturum açmak için [VERSION] sürümü gerekli. +Lütfen https://secondlife.com/support/downloads/ adresinden indirin <usetemplate name="okbutton" yestext="Tamam"/> </notification> + <notification name="PauseForUpdate"> + Oturum açmak için [VERSION] sürümü gerekli. +Ä°ndirmek ve yüklemek için Tamam'a tıklayın. + <usetemplate name="okbutton" yestext="Tamam"/> + </notification> + <notification name="OptionalUpdateReady"> + [VERSION] sürümü indirildi ve yüklenmeye hazır. +Yüklemek için Tamam'a tıklayın. + <usetemplate name="okbutton" yestext="Tamam"/> + </notification> + <notification name="PromptOptionalUpdate"> + [VERSION] sürümü indirildi ve yüklenmeye hazır. +Devam edilsin mi? + <usetemplate canceltext="Åžimdi DeÄŸil" name="yesnocancelbuttons" notext="Atla" yestext="Yükle"/> + </notification> <notification name="LoginFailedUnknown"> Ãœzgünüz, oturum açma bilinmeyen bir nedenden dolayı baÅŸarısız oldu. Bu mesajı almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne baÅŸvurun. <usetemplate name="okbutton" yestext="Çık"/> @@ -1869,7 +1913,7 @@ Binlerce bölgeyi deÄŸiÅŸtirecek ve alan sunucusunu kesintiye uÄŸratacaktır. <usetemplate canceltext="Ä°ptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/> </notification> <notification label="Gayrimenkul seç" name="EstateBannedAgentRemove"> - Bu Sakin sadece bu gayrimenkul için mi yasaklı listesinden çıkarılsın, yoksa [ALL_ESTATES] için mi? + Bu Sakin sadece bu gayrimenkul için mi yoksa [ALL_ESTATES] için mi eriÅŸim yasağı listesinden çıkarılsın? <usetemplate canceltext="Ä°ptal" name="yesnocancelbuttons" notext="Tüm Gayrimenkuller" yestext="Bu Gayrimenkul"/> </notification> <notification label="Gayrimenkul seç" name="EstateManagerAdd"> @@ -3047,15 +3091,6 @@ EÄŸer hesabınıza neden eriÅŸmek istediÄŸini tam olarak anlamıyorsanız, eriÅŸ <button name="Deny" text="Reddet"/> </form> </notification> - <notification name="UnknownScriptQuestion"> - '[NAME]' tarafından sahip olunan bir nesne olan '<nolink>[OBJECTNAME]</nolink>' tarafından istenen çalışma zamanı komut dosyası izni görüntüleyici tarafından tanınmadı ve verilemez. - -Bu izni vermek için lütfen [DOWNLOADURL] adresinden görüntüleyicinizi en son sürüme güncelleyin. - <form name="form"> - <button name="Deny" text="Tamam"/> - <button name="Mute" text="Engelle"/> - </form> - </notification> <notification name="ScriptDialog"> [NAME] adlı kiÅŸiye ait '<nolink>[TITLE]</nolink>' [MESSAGE] @@ -3160,16 +3195,22 @@ Sohbete katılmak için Kabul Et'i, daveti geri çevirmek için ise Reddet& [VOICE_CHANNEL_NAME] ile baÄŸlantı kurulamadı, lütfen daha sonra tekrar deneyin. Åžimdi Yakındaki bir Sesli Sohbete yeniden baÄŸlanılacaksınız. </notification> <notification name="VoiceEffectsExpired"> - Abone olduÄŸunuz Ses Åžekillerinden birinin ya da daha fazlasının süresi dolmuÅŸ. -AboneliÄŸinizi yenilemek için [[URL] burayı tıklatın]. + Abone olduÄŸunuz Ses Dönüşümlerinden birinin ya da daha fazlasının süresi dolmuÅŸ. +AboneliÄŸinizi yenilemek için [[URL] buraya tıklayın]. + +Özel Ãœye iseniz, ses dönüştürme özelliÄŸini almak için [[PREMIUM_URL] buraya tıklayın]. </notification> <notification name="VoiceEffectsExpiredInUse"> - Etkin Ses Åžeklinin süresi dolmuÅŸ, normal ses ayarlarınız uygulandı. -AboneliÄŸinizi yenilemek için [[URL] burayı tıklatın]. + Etkin Ses Dönüşümünün süresi dolmuÅŸ, normal ses ayarlarınız uygulandı. +AboneliÄŸinizi yenilemek için [[URL] buraya tıklayın]. + +Özel Ãœye iseniz, ses dönüştürme özelliÄŸini almak için [[PREMIUM_URL] buraya tıklayın]. </notification> <notification name="VoiceEffectsWillExpire"> - Abone olduÄŸunuz Ses Åžekillerinden birinin ya da daha fazlasının süresi [INTERVAL] gün içinde dolacak. -AboneliÄŸinizi yenilemek için [[URL] burayı tıklatın]. + Ses Dönüşümlerinizden birinin ya da daha fazlasının süresi [INTERVAL] günden daha az bir zamanda dolacak. +AboneliÄŸinizi yenilemek için [[URL] buraya tıklayın]. + +Özel Ãœye iseniz, ses dönüştürme özelliÄŸini almak için [[PREMIUM_URL] buraya tıklayın]. </notification> <notification name="VoiceEffectsNew"> Yeni Ses Åžekilleri kullanılabilir! @@ -3221,6 +3262,9 @@ GüvenliÄŸiniz için birkaç saniye engellenecek. <notification name="SnapshotToComputerFailed"> Anlık görüntü [PATH] yoluna kaydedilemedi: Disk dolu. [NEED_MEMORY]KB gerekli ancak yalnızca [FREE_MEMORY]KB boÅŸ. </notification> + <notification name="SnapshotToLocalDirNotExist"> + Anlık görüntü [PATH] yoluna kaydedilemedi: Dizin mevcut deÄŸil. + </notification> <notification name="PresetNotSaved"> Ön ayar ([NAME]) kaydedilirken hata oluÅŸtu. </notification> @@ -3710,13 +3754,13 @@ GiriÅŸim iptal edildi. Sahibi olmadığınız arazide aÄŸaçlar ve çimen oluÅŸturamazsınız. </notification> <notification name="NoCopyPermsNoObject"> - '[OBJ_NAME]' nesnesini kopyalama izniniz olmadığı için kopyalama baÅŸarılamadı. + <nolink>'[OBJ_NAME]'</nolink> nesnesini kopyalama izniniz olmadığından kopyalama baÅŸarısız oldu. </notification> <notification name="NoTransPermsNoObject"> - '[OBJ_NAME]' nesnesi size aktarılamadığı için kopyalama baÅŸarılamadı. + <nolink>'[OBJ_NAME]'</nolink> nesnesi size devredilemediÄŸinden kopyalama baÅŸarısız oldu. </notification> <notification name="AddToNavMeshNoCopy"> - '[OBJ_NAME]' nesnesi navmesh'e katkıda bulunduÄŸu için kopyalama baÅŸarılamadı. + <nolink>'[OBJ_NAME]'</nolink> nesnesi navigasyon örgüsüne katkıda bulunduÄŸundan kopyalama baÅŸarısız oldu. </notification> <notification name="DupeWithNoRootsSelected"> Kök nesne seçili olmayan kopya. @@ -3761,34 +3805,34 @@ Lütfen bir dakika sonra tekrar deneyin. Envantere Geri Kaydet devre dışı bırakıldı. </notification> <notification name="NoExistNoSaveToContents"> - '[OBJ_NAME]' nesne içeriÄŸine kaydedilemedi, çünkü oluÅŸturulurken temel alınan nesne artık mevcut deÄŸil. + Yeniden canlandırıldığı nesne artık mevcut olmadığından <nolink>'[OBJ_NAME]'</nolink> nesne içeriklerine kaydedilemiyor. </notification> <notification name="NoModNoSaveToContents"> - '[DEST_NAME]' nesnesini deÄŸiÅŸtirme izniniz olmadığı için '[OBJ_NAME]' nesne içeriÄŸine kaydedilemedi. + <nolink>'[DEST_NAME]'</nolink> nesnesini deÄŸiÅŸtirme izniniz olmadığından <nolink>'[OBJ_NAME]'</nolink> nesne içeriklerine kaydedilemiyor. </notification> <notification name="NoSaveBackToInvDisabled"> - '[OBJ_NAME]' envantere geri kaydedilemez -- bu iÅŸlem devre dışı bırakıldı. + <nolink>'[OBJ_NAME]'</nolink> envantere tekrar kaydedilemiyor -- bu iÅŸlem devre dışı bırakılmış. </notification> <notification name="NoCopyNoSelCopy"> - '[OBJ_NAME]' nesnesini kopyalama izniniz olmadığı için seçiminizi kopyalamayazsınız. + <nolink>'[OBJ_NAME]'</nolink> nesnesini kopyalama izniniz olmadığından seçiminizi kopyalayamazsınız. </notification> <notification name="NoTransNoSelCopy"> - '[OBJ_NAME]' nesnesi aktarılamaz olduÄŸu için seçiminizi kopyalayamazsınız. + <nolink>'[OBJ_NAME]'</nolink> nesnesi devredilebilir olmadığından seçiminizi kopyalayamazsınız. </notification> <notification name="NoTransNoCopy"> - '[OBJ_NAME]' nesnesi aktarılamaz olduÄŸu için seçiminizi kopyalayamazsınız. + <nolink>'[OBJ_NAME]'</nolink> nesnesi devredilebilir olmadığından seçiminizi kopyalayamazsınız. </notification> <notification name="NoPermsNoRemoval"> - Benzeticiden '[OBJ_NAME]' nesnesinin kaldırılmasına izinler sistemi izin vermiyor. + <nolink>'[OBJ_NAME]'</nolink> nesnesinin simülatörden kaldırılmasına izin sistemi tarafından izin verilmiyor. </notification> <notification name="NoModNoSaveSelection"> - '[OBJ_NAME]' nesnesini deÄŸiÅŸtirme izniniz olmadığı için seçiminizi kaydedemezsiniz. + <nolink>'[OBJ_NAME]'</nolink> nesnesini deÄŸiÅŸtirme izniniz olmadığından seçiminiz kaydedilemiyor. </notification> <notification name="NoCopyNoSaveSelection"> - '[OBJ_NAME]' nesnesi kopyalanamaz olduÄŸu için seçiminizi kaydedemezsiniz. + <nolink>'[OBJ_NAME]'</nolink> nesnesi kopyalanabilir olmadığından seçiminiz kaydedilemiyor. </notification> <notification name="NoModNoTaking"> - '[OBJ_NAME]' nesnesini deÄŸiÅŸtirme izniniz olmadığı için seçiminizi alamazsınız. + <nolink>'[OBJ_NAME]'</nolink> nesnesini deÄŸiÅŸtirme izniniz olmadığından seçiminizi alamazsınız. </notification> <notification name="RezDestInternalError"> Dahili Hata: Bilinmeyen hedef türü. diff --git a/indra/newview/skins/default/xui/tr/panel_login.xml b/indra/newview/skins/default/xui/tr/panel_login.xml index 8b320ce9aa68c97f3a71408e1d8991167b5b9ec6..e9fec9783f176c32aa14adcf056782a108565f49 100644 --- a/indra/newview/skins/default/xui/tr/panel_login.xml +++ b/indra/newview/skins/default/xui/tr/panel_login.xml @@ -1,6 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <panel name="panel_login"> - <panel.string name="forgot_password_url">http://secondlife.com/account/request.php</panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php + </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="ui_stack"> <layout_panel name="ui_container"> <combo_box label="Kullanıcı Adı" name="username_combo" tool_tip="KaydolduÄŸunuzda seçtiÄŸiniz kullanıcı adı, örn. mustafayalcin12 veya Faruk Gungoren"/> @@ -11,8 +16,13 @@ </combo_box> <button label="Oturum Aç" name="connect_btn"/> <check_box label="Beni hatırla" name="remember_check"/> - <text name="forgot_password_text">Parolamı unuttum</text> + <text name="forgot_password_text"> + Parolamı unuttum + </text> <combo_box label="AÄŸ seç" name="server_combo"/> + <text name="sign_up_text"> + Kaydol + </text> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/tr/panel_login_first.xml b/indra/newview/skins/default/xui/tr/panel_login_first.xml index 622edd0a8d22e5650d1d1ce8a3a238f77c220bf0..1fc80c2b977624e99d7e7248a777b3d8917eae3a 100644 --- a/indra/newview/skins/default/xui/tr/panel_login_first.xml +++ b/indra/newview/skins/default/xui/tr/panel_login_first.xml @@ -3,6 +3,9 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="logo_stack"> <layout_panel name="parent_panel2"> <layout_stack name="widget_stack"> @@ -14,6 +17,9 @@ <text name="forgot_password_text"> Parolamı unuttum </text> + <text name="sign_up_text"> + Kaydol + </text> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_general.xml b/indra/newview/skins/default/xui/tr/panel_preferences_general.xml index 2c05e8a47a3bd6aa3e0a9d382325344061ff90f3..cec7a67f2f927a8e4338d82ebef92eea2fa1769d 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_general.xml @@ -4,7 +4,6 @@ Dil: </text> <combo_box name="language_combobox"> - <combo_box.item label="Sistem varsayılanı" name="System Default Language"/> <combo_box.item label="English (Ä°ngilizce)" name="English"/> <combo_box.item label="Dansk (Danca) - Beta" name="Danish"/> <combo_box.item label="Deutsch (Almanca) - Beta" name="Deutsch(German)"/> diff --git a/indra/newview/skins/default/xui/tr/panel_region_access.xml b/indra/newview/skins/default/xui/tr/panel_region_access.xml new file mode 100644 index 0000000000000000000000000000000000000000..57e721bc04e6c08e0b8d4ccf3a71543fb6dfbf33 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/panel_region_access.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="EriÅŸim" name="Access"> + <tab_container name="tabs"> + <panel label="GAYRÄ°MENKUL YÖNETÄ°CÄ°LERÄ°" name="estate_managers_panel"> + <text name="estate_manager_label"> + Gayrimenkul Yöneticileri: + </text> + <name_list name="estate_manager_name_list"> + <columns label="Ad" name="name"/> + </name_list> + <button label="Ekle..." name="add_estate_manager_btn"/> + <button label="Kaldır..." name="remove_estate_manager_btn"/> + </panel> + <panel label="Ä°ZÄ°N VERÄ°LEN" name="allowed_panel"> + <panel label="top_panel" name="allowed_search_panel"> + <filter_editor label="Ä°zin verilen aracıları ara" name="allowed_search_input"/> + </panel> + <text name="allow_resident_label"> + Her zaman izin verilen: + </text> + <name_list name="allowed_avatar_name_list"> + <columns label="Ad" name="name"/> + </name_list> + <button label="Ekle..." name="add_allowed_avatar_btn"/> + <button label="Kaldır..." name="remove_allowed_avatar_btn"/> + </panel> + <panel label="Ä°ZÄ°N VERÄ°LEN GRUPLAR" name="allowed_groups_panel"> + <panel label="top_panel" name="allowed_group_search_panel"> + <filter_editor label="Ä°zin verilen grupları ara" name="allowed_group_search_input"/> + </panel> + <text name="allow_group_label"> + Her zaman izin verilen gruplar: + </text> + <name_list name="allowed_group_name_list"> + <columns label="Ad" name="name"/> + </name_list> + <button label="Ekle..." name="add_allowed_group_btn"/> + <button label="Kaldır..." name="remove_allowed_group_btn"/> + </panel> + <panel label="ENGELLENEN" name="banned_panel"> + <panel label="top_panel" name="banned_search_panel"> + <filter_editor label="Engellenen aracıları ara" name="banned_search_input"/> + </panel> + <text name="ban_resident_label"> + Her zaman engellenen: + </text> + <name_list name="banned_avatar_name_list"> + <columns label="Ad" name="name"/> + <columns label="Son oturum açma tarihi" name="last_login_date"/> + <columns label="Engellenme tarihi" name="ban_date"/> + <columns label="Engelleyen" name="bannedby"/> + </name_list> + <button label="Ekle..." name="add_banned_avatar_btn"/> + <button label="Kaldır..." name="remove_banned_avatar_btn"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/tr/panel_region_estate.xml b/indra/newview/skins/default/xui/tr/panel_region_estate.xml index fc8dab9c69375b8bca545fc9b8842b291fb97fde..ad5553c5820c4adfbd25ba30ba54518ce661dd86 100644 --- a/indra/newview/skins/default/xui/tr/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/tr/panel_region_estate.xml @@ -16,7 +16,7 @@ (bilinmiyor) </text> <radio_group name="externally_visible_radio"> - <radio_item label="Yalnızca aÅŸağıda listelenen sakinlere ve gruplara izin ver" name="estate_restricted_access"/> + <radio_item label="Sadece EriÅŸim sekmesinde listelenen sakinlere ve gruplara izin ver" name="estate_restricted_access"/> <radio_item label="Herkes ziyaret edebilir" name="estate_public_access"/> </radio_group> <check_box label="18 yaşından büyük olmalıdır" name="limit_age_verified" tool_tip="Sakinlerin bu gayrimenkule eriÅŸebilmesi için 18 veya üzeri bir yaÅŸta olmaları gerekir. Daha fazla bilgi için [SUPPORT_SITE] adresini ziyaret edin."/> diff --git a/indra/newview/skins/default/xui/tr/panel_status_bar.xml b/indra/newview/skins/default/xui/tr/panel_status_bar.xml index 7c7bfc7e144061af06e7c33ae4013898bd5dea2c..616960ffb445ca52d7fb671e1649182cdef04d2d 100644 --- a/indra/newview/skins/default/xui/tr/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/tr/panel_status_bar.xml @@ -1,16 +1,31 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="status"> - <panel.string name="packet_loss_tooltip">Paket Kaybı</panel.string> - <panel.string name="bandwidth_tooltip">Bant geniÅŸliÄŸi</panel.string> - <panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string> - <panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string> - <panel.string name="buycurrencylabel">L$ [AMT]</panel.string> + <panel.string name="packet_loss_tooltip"> + Paket Kaybı + </panel.string> + <panel.string name="bandwidth_tooltip"> + Bant geniÅŸliÄŸi + </panel.string> + <panel.string name="time"> + [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> + [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] + </panel.string> + <panel.string name="buycurrencylabel"> + L$ [AMT] + </panel.string> + <panel name="menu_search_panel"> + <search_editor label="Menülerde Ara" name="search_menu_edit" tool_tip="Merak ettiÄŸiniz arama terimini buraya yazın. Sonuçlar, menü içindeki kısmi tam metin eÅŸleÅŸmeleri ÅŸeklinde görüntülenir."/> + </panel> <panel left="-446" name="balance_bg" width="215"> <text name="balance" tool_tip="L$ bakiyenizi yenilemek için buraya tıklayın" value="L$??"/> <button label="L$ Satın Al" name="buyL" tool_tip="Daha fazla L$ satın almak için tıklayın"/> <button label="AlışveriÅŸ yap" name="goShop" tool_tip="Second Life Pazaryeri Aç" width="95"/> </panel> - <text name="TimeText" tool_tip="Geçerli zaman (Pasifik)">24:00 AM PST</text> + <text name="TimeText" tool_tip="Geçerli zaman (Pasifik)"> + 24:00 AM PST + </text> <button name="media_toggle_btn" tool_tip="Tüm Ortam Öğelerini BaÅŸlat/Durdur (Müzik, Video, Web sayfaları)"/> <button name="volume_btn" tool_tip="Küresel Ses Kontrolü"/> </panel> diff --git a/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml b/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml index 92d57deb1216978712ec0424a23f65f629563a16..9c1b6a8dfd951221e4f5544347bda45fcd6f4d85 100644 --- a/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/tr/sidepanel_item_info.xml @@ -34,9 +34,11 @@ <text name="LabelItemNameTitle"> Ad: </text> + <line_editor name="LabelItemName" tool_tip="Ad, 63 karakter ile sınırlıdır. Daha uzun prim adları kesilerek kısaltılır. Adlar, dikey çubuk '|' hariç olmak üzere, sadece ASCII-7 (geniÅŸletilmemiÅŸ) karakter kümesinde bulunan yazdırılabilir karakterlerden oluÅŸabilir."/> <text name="LabelItemDescTitle"> Açıklama: </text> + <line_editor name="LabelItemDesc" tool_tip="Görüntüleyici ayarlarında 'Ä°puçlarını Tüm Nesnelerin Ãœzerine Getir' seçildiÄŸinde, fare imlecinin altındaki herhangi bir nesneye ait nesne açıklaması açılır penceresi görülür. Prim (temel öğe) açıklaması 127 bayt ile sınırlıdır ve bundan daha uzun her dize kesilir."/> <text name="LabelCreatorTitle"> OluÅŸturan: </text> @@ -59,7 +61,7 @@ <text name="AnyoneLabel"> Herkes: </text> - <check_box label="Kopyala" name="CheckEveryoneCopy"/> + <check_box label="Kopyala" name="CheckEveryoneCopy" tool_tip="Herkes nesnenin bir kopyasını alabilir. Nesne ve sahip olduÄŸu tüm içerikler kopyalamaya ve aktarıma izin vermelidir."/> <text name="GroupLabel"> Grup: </text> @@ -67,17 +69,17 @@ <text name="NextOwnerLabel"> Sonraki sahip: </text> - <check_box label="DeÄŸiÅŸtir" name="CheckNextOwnerModify"/> - <check_box label="Kopyala" name="CheckNextOwnerCopy"/> - <check_box label="Aktar" name="CheckNextOwnerTransfer" tool_tip="Sonraki sahibi bu nesneyi verebilir veya tekrar satabilir"/> + <check_box label="DeÄŸiÅŸtir" name="CheckNextOwnerModify" tool_tip="Sonraki sahip öğe adı veya bu nesnenin büyüklüğü gibi özellikleri düzenleyebilir."/> + <check_box label="Kopyala" name="CheckNextOwnerCopy" tool_tip="Sonraki sahip bu nesnenin sınırsız sayıda kopyasını oluÅŸturabilir. Kopyalar oluÅŸturucu bilgisini içerir ve asla kopyalanan öğeden daha fazla izin veren bir özellikte olamaz."/> + <check_box label="Aktar" name="CheckNextOwnerTransfer" tool_tip="Sonraki sahibi bu nesneyi hediye edebilir veya tekrar satabilir."/> </panel> - <check_box label="Satılık" name="CheckPurchase"/> - <combo_box name="ComboBoxSaleType"> + <check_box label="Satılık" name="CheckPurchase" tool_tip="Ä°nsanların bu nesneyi, içeriÄŸini veya SL dünyasındaki kopyasını satın almasına izin verin."/> + <combo_box name="ComboBoxSaleType" tool_tip="Alıcının bir kopya mı, yani içeriÄŸin kopyasını mı yoksa öğenin kendisini mi alacağını seçin."> <combo_box.item label="Kopyala" name="Copy"/> <combo_box.item label="İçerik" name="Contents"/> <combo_box.item label="Orijinal" name="Original"/> </combo_box> - <spinner label="Fiyat: L$" name="Edit Cost"/> + <spinner label="Fiyat: L$" name="Edit Cost" tool_tip="Nesne maliyeti."/> </panel> </scroll_container> <panel name="button_panel"> diff --git a/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml index ddb4bbf160dffa391566f48b9f5ff99d4e24dfae..c1b42ecbb56968d2fee267f9cf93d30cf8882873 100644 --- a/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/tr/sidepanel_task_info.xml @@ -1,71 +1,136 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="object properties" title="Nesne Profili"> - <panel.string name="text deed continued">Devret</panel.string> - <panel.string name="text deed">Devret</panel.string> - <panel.string name="text modify info 1">Bu nesneyi deÄŸiÅŸtirebilirsiniz</panel.string> - <panel.string name="text modify info 2">Bu nesneleri deÄŸiÅŸtirebilirsiniz</panel.string> - <panel.string name="text modify info 3">Bu nesneyi deÄŸiÅŸtiremezsiniz</panel.string> - <panel.string name="text modify info 4">Bu nesneleri deÄŸiÅŸtiremezsiniz</panel.string> - <panel.string name="text modify info 5">Bir bölge sınırı üzerinden bu nesneyi deÄŸiÅŸtiremezsiniz</panel.string> - <panel.string name="text modify info 6">Bir bölge sınırı üzerinden bu nesneleri deÄŸiÅŸtiremezsiniz</panel.string> - <panel.string name="text modify warning">Bu nesne baÄŸlantılı parçalara sahip</panel.string> - <panel.string name="Cost Default">Fiyat: L$</panel.string> - <panel.string name="Cost Total">Toplam Fiyat: L$</panel.string> - <panel.string name="Cost Per Unit">Birim Fiyatı: L$</panel.string> - <panel.string name="Cost Mixed">Karma Fiyat</panel.string> - <panel.string name="Sale Mixed">Karma Satış</panel.string> + <panel.string name="text deed continued"> + Devret + </panel.string> + <panel.string name="text deed"> + Devret + </panel.string> + <panel.string name="text modify info 1"> + Bu nesneyi deÄŸiÅŸtirebilirsiniz + </panel.string> + <panel.string name="text modify info 2"> + Bu nesneleri deÄŸiÅŸtirebilirsiniz + </panel.string> + <panel.string name="text modify info 3"> + Bu nesneyi deÄŸiÅŸtiremezsiniz + </panel.string> + <panel.string name="text modify info 4"> + Bu nesneleri deÄŸiÅŸtiremezsiniz + </panel.string> + <panel.string name="text modify info 5"> + Bir bölge sınırı üzerinden bu nesneyi deÄŸiÅŸtiremezsiniz + </panel.string> + <panel.string name="text modify info 6"> + Bir bölge sınırı üzerinden bu nesneleri deÄŸiÅŸtiremezsiniz + </panel.string> + <panel.string name="text modify warning"> + Bu nesne baÄŸlantılı parçalara sahip + </panel.string> + <panel.string name="Cost Default"> + Fiyat: L$ + </panel.string> + <panel.string name="Cost Total"> + Toplam Fiyat: L$ + </panel.string> + <panel.string name="Cost Per Unit"> + Birim Fiyatı: L$ + </panel.string> + <panel.string name="Cost Mixed"> + Karma Fiyat + </panel.string> + <panel.string name="Sale Mixed"> + Karma Satış + </panel.string> <text name="title" value="Nesne Profili"/> <text name="where" value="(SL Dünyası)"/> <panel label="" name="properties_panel"> - <text name="Name:">Ad:</text> - <text name="Description:">Açıklama:</text> - <text name="CreatorNameLabel">OluÅŸturan:</text> - <text name="Owner:">Sahip:</text> - <text name="Group_label">Grup:</text> + <text name="Name:"> + Ad: + </text> + <line_editor name="Object Name" tool_tip="Ad, 63 karakter ile sınırlıdır. Daha uzun prim adları kesilerek kısaltılır. Adlar, dikey çubuk '|' hariç olmak üzere, sadece ASCII-7 (geniÅŸletilmemiÅŸ) karakter kümesinde bulunan yazdırılabilir karakterlerden oluÅŸabilir."/> + <text name="Description:"> + Açıklama: + </text> + <line_editor name="Object Description" tool_tip="Görüntüleyici ayarlarında 'Ä°puçlarını Tüm Nesnelerin Ãœzerine Getir' seçildiÄŸinde, fare imlecinin altındaki herhangi bir nesneye ait nesne açıklaması açılır penceresi görülür. Prim (temel öğe) açıklaması 127 bayt ile sınırlıdır ve bundan daha uzun her dize kesilir."/> + <text name="CreatorNameLabel"> + OluÅŸturan: + </text> + <text name="Owner:"> + Sahip: + </text> + <text name="Group_label"> + Grup: + </text> <button name="button set group" tool_tip="Bu nesnenin izinlerini paylaÅŸmak için bir grup seçin"/> <name_box initial_value="Yükleniyor..." name="Group Name Proxy"/> <button label="Devret" label_selected="Devret" name="button deed" tool_tip="Bu nesne devredilerek verildiÄŸinde, nesnenin sonraki sahibi için izinler geçerli olur. Grup içerisinde paylaşılan nesneler bir grup yetkilisi tarafından devredilebilir."/> - <text name="label click action">Åžu eylem için tıklayın:</text> - <combo_box name="clickaction"> + <text name="label click action"> + Åžu eylem için tıklayın: + </text> + <combo_box name="clickaction" tool_tip="Tıklama eylemi, tek bir sol tıklama yoluyla bir nesne ile etkileÅŸime girmenize olanak saÄŸlar. Her tıklama eylemi, ne iÅŸe yaradığını gösteren özel bir imlece sahiptir. Bazı tıklama eylemlerinin iÅŸlevlerini yerine getirmesi için belirli gereklilikler vardır. ÖrneÄŸin, Dokun ve Öde komut dosyaları gerektirir"> <combo_box.item label="Dokun (varsayılan)" name="Touch/grab(default)"/> <combo_box.item label="Nesnenin üzerine otur" name="Sitonobject"/> <combo_box.item label="Nesneyi satın al" name="Buyobject"/> <combo_box.item label="Nesneye ödeme yap" name="Payobject"/> <combo_box.item label="Aç" name="Open"/> <combo_box.item label="YakınlaÅŸtır" name="Zoom"/> + <combo_box.item label="Yok" name="None"/> </combo_box> <panel name="perms_inv"> - <text name="perm_modify">Bu nesneyi deÄŸiÅŸtirebilirsiniz</text> - <text name="Anyone can:">Herkes:</text> - <check_box label="Kopyala" name="checkbox allow everyone copy"/> - <check_box label="Hareket Et" name="checkbox allow everyone move"/> - <text name="GroupLabel">Grup:</text> + <text name="perm_modify"> + Bu nesneyi deÄŸiÅŸtirebilirsiniz + </text> + <text name="Anyone can:"> + Herkes: + </text> + <check_box label="Kopyala" name="checkbox allow everyone copy" tool_tip="Herkes nesnenin bir kopyasını alabilir. Nesne ve sahip olduÄŸu tüm içerikler kopyalamaya ve aktarıma izin vermelidir."/> + <check_box label="Hareket Et" name="checkbox allow everyone move" tool_tip="Herkes nesneyi hareket ettirebilir."/> + <text name="GroupLabel"> + Grup: + </text> <check_box label="PaylaÅŸ" name="checkbox share with group" tool_tip="Ayarlanan grubun tüm üyelerinin, bu nesne için deÄŸiÅŸtirme izinlerinizi paylaÅŸmasına izin verir. Rol kısıtlamalarını etkinleÅŸtirmek için Devretme yapmalısınız."/> - <text name="NextOwnerLabel">Sonraki sahip:</text> - <check_box label="DeÄŸiÅŸtir" name="checkbox next owner can modify"/> - <check_box label="Kopyala" name="checkbox next owner can copy"/> + <text name="NextOwnerLabel"> + Sonraki sahip: + </text> + <check_box label="DeÄŸiÅŸtir" name="checkbox next owner can modify" tool_tip="Sonraki sahip öğe adı veya bu nesnenin büyüklüğü gibi özellikleri düzenleyebilir."/> + <check_box label="Kopyala" name="checkbox next owner can copy" tool_tip="Sonraki sahip bu nesnenin sınırsız sayıda kopyasını oluÅŸturabilir. Kopyalar oluÅŸturucu bilgisini içerir ve asla kopyalanan öğeden daha fazla izin veren bir özellikte olamaz."/> <check_box label="Aktar" name="checkbox next owner can transfer" tool_tip="Sonraki sahibi bu nesneyi verebilir veya tekrar satabilir"/> </panel> - <check_box label="Satılık" name="checkbox for sale"/> - <combo_box name="sale type"> + <check_box label="Satılık" name="checkbox for sale" tool_tip="Ä°nsanların bu nesneyi, içeriÄŸini veya SL dünyasındaki kopyasını satın almasına izin verin."/> + <combo_box name="sale type" tool_tip="Alıcının bir kopya mı, yani içeriÄŸin kopyasını mı yoksa öğenin kendisini mi alacağını seçin."> <combo_box.item label="Kopyala" name="Copy"/> <combo_box.item label="İçerik" name="Contents"/> <combo_box.item label="Orijinal" name="Original"/> </combo_box> - <spinner label="Fiyat: L$" name="Edit Cost"/> + <spinner label="Fiyat: L$" name="Edit Cost" tool_tip="Nesne maliyeti."/> <check_box label="Aramada göster" name="search_check" tool_tip="KiÅŸiler arama sonuçlarında bu nesneyi görebilsin"/> - <text name="pathfinding_attributes_label">Yol bulma özellikleri:</text> - <text name="B:">B:</text> - <text name="O:">O:</text> - <text name="G:">G:</text> - <text name="E:">E:</text> - <text name="N:">N:</text> - <text name="F:">F:</text> + <text name="pathfinding_attributes_label"> + Yol bulma özellikleri: + </text> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> </panel> <panel name="button_panel"> - <button label="Aç" name="open_btn"/> - <button label="Öde" name="pay_btn"/> - <button label="Satın Al" name="buy_btn"/> - <button label="Ayrıntl" name="details_btn"/> + <button label="Aç" name="open_btn" tool_tip="Nesne İçeriklerini görüntülemek için açın."/> + <button label="Öde" name="pay_btn" tool_tip="Ödeme Penceresini Aç. Bunun iÅŸe yaraması için nesnenin ödeme komut dosyasına sahip olması gerekir."/> + <button label="Satın Al" name="buy_btn" tool_tip="Alım Penceresini Aç. Nesnenin satışa çıkarılmasını gerektirir."/> + <button label="Ayrıntl" name="details_btn" tool_tip="Nesneyi Ä°ncele Penceresini Aç."/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml index b57442079335e78092c67e4d019607796160ef9c..dddf2365ab46052bb5f5b4c12b09af072582e905 100644 --- a/indra/newview/skins/default/xui/tr/strings.xml +++ b/indra/newview/skins/default/xui/tr/strings.xml @@ -2226,6 +2226,18 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin <string name="RegionInfoListTypeBannedAgents"> Her zaman engellenen </string> + <string name="RegionInfoAllEstates"> + tüm gayrimenkuller + </string> + <string name="RegionInfoManagedEstates"> + yönetilen gayrimenkuller + </string> + <string name="RegionInfoThisEstate"> + bu gayrimenkul + </string> + <string name="AndNMore"> + ve [EXTRA_COUNT] tane daha + </string> <string name="ScriptLimitsParcelScriptMemory"> Parsel Komut Dosyası BelleÄŸi </string> @@ -2269,7 +2281,7 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin Göğüs </string> <string name="ATTACH_HEAD"> - BaÅŸ + Kafatası </string> <string name="ATTACH_LSHOULDER"> Sol Omuz @@ -2290,7 +2302,7 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin SaÄŸ Ayak </string> <string name="ATTACH_BACK"> - Geri + Omurga </string> <string name="ATTACH_PELVIS"> LeÄŸen KemiÄŸi @@ -2320,13 +2332,13 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin Sol Ãœst Kol </string> <string name="ATTACH_RLARM"> - SaÄŸ Alt Kol + SaÄŸ Ön Kol </string> <string name="ATTACH_LUARM"> Sol Ãœst Kol </string> <string name="ATTACH_LLARM"> - Sol Alt Kol + Sol Ön Kol </string> <string name="ATTACH_RHIP"> SaÄŸ Kalça @@ -2347,7 +2359,7 @@ Bu mesaj size gelmeye devam ederse lütfen http://support.secondlife.com adresin Sol Alt Bacak </string> <string name="ATTACH_BELLY"> - Göbek + Karın </string> <string name="ATTACH_LEFT_PEC"> Sol Göğüs @@ -5748,4 +5760,25 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin. <string name="Mav_Details_MAV_UNKNOWN_VERSION"> Fiziksel ÅŸekil doÄŸru sürüme sahip deÄŸil. Fiziksel model için doÄŸru sürümü ayarlayın. </string> + <string name="couldnt_resolve_host"> + DNS sunucusu ana bilgisayar adını çözümleyemedi ([HOSTNAME]). +Lütfen www.secondlife.com web sitesine baÄŸlanabildiÄŸinizi doÄŸrulayın. +BaÄŸlanabiliyor, ancak bu hatayı almaya devam ediyorsanız, lütfen +destek bölümüne gidin ve bu sorunu bildirin. + </string> + <string name="ssl_peer_certificate"> + Oturum açma sunucusu SSL aracılığıyla kendini doÄŸrulayamadı. +Bu hatayı almaya devam ederseniz, lütfen +SecondLife.com web sitesinin Destek +bölümüne gidin ve sorunu bildirin. + </string> + <string name="ssl_connect_error"> + ÇoÄŸunlukla, bu durum, bilgisayarınızın saatinin yanlış ayarlandığı anlamına gelir. +Lütfen Denetim Masası'na gidin ve tarih ve saat ayarlarının doÄŸru yapıldığından emin olun. +Ayrıca, ağınızın ve güvenlik duvarınızın doÄŸru ÅŸekilde ayarlanıp ayarlanmadığını kontrol edin. +Bu hatayı almaya devam ederseniz, lütfen SecondLife.com web sitesinin Destek bölümüne +gidin ve sorunu bildirin. + +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Bilgi Bankası] + </string> </strings> diff --git a/indra/newview/skins/default/xui/zh/floater_auction.xml b/indra/newview/skins/default/xui/zh/floater_auction.xml index 1b589a92ccf7327daf5b787bfbebf9bfef295009..0ab94160c25273338fd47534ae2caa9de8224488 100644 --- a/indra/newview/skins/default/xui/zh/floater_auction.xml +++ b/indra/newview/skins/default/xui/zh/floater_auction.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_auction" title="開始 Linden 土地出售"> +<floater name="floater_auction" title="開始Linden土地出售"> <floater.string name="already for sale"> 出售ä¸çš„地段無法進行æ‹è³£ã€‚ </floater.string> diff --git a/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml b/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml index c103ea938fc4155987dd5fd7a8a3dde4b433f67e..dbf4a21416b978cb46b418fcfd403a354d0c1122 100644 --- a/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml @@ -29,17 +29,17 @@ <text name="GroupLabel"> 群組: </text> - <check_box label="分享" name="share_with_group"/> + <check_box label="分享" name="share_with_group" tool_tip="å…許æ¤ç¾¤çµ„所有æˆå“¡å…±äº«ä½ 修改æ¤ç‰©ä»¶çš„權é™ã€‚ ä½ å¿…é ˆè®“æ¸¡æ‰èƒ½å•Ÿå‹•è§’色é™åˆ¶ã€‚"/> <text name="AnyoneLabel"> 任何人: </text> - <check_box label="æšåº¨" name="everyone_copy"/> + <check_box label="複製" name="everyone_copy" tool_tip="任何人都å¯å–用本物件的複本。 ç‰©ä»¶å’Œå…¶æ‰€æœ‰å…§å®¹éƒ½å¿…é ˆå…許複製和轉移"/> <text name="NextOwnerLabel"> 下一個所有人: </text> - <check_box label="修改" name="next_owner_modify"/> - <check_box label="æšåº¨" name="next_owner_copy"/> - <check_box initial_value="true" label="轉移" name="next_owner_transfer" tool_tip="下一個所有人å¯è´ˆé€æˆ–轉售這個物件"/> + <check_box label="修改" name="next_owner_modify" tool_tip="下一個所有人å¯ä»¥ç·¨è¼¯æœ¬ç‰©ä»¶çš„性質,如å稱或尺寸。"/> + <check_box label="複製" name="next_owner_copy" tool_tip="下一個所有人å¯ç„¡é™è¤‡è£½æœ¬ç‰©ä»¶ã€‚ 複本將ä¿ç•™å‰µä½œäººçš„資料,其å…許è¨å®šä¸èƒ½æ¯”åŽŸæœ¬ç‰©ä»¶æ›´åŠ æ”¾å¯¬ã€‚"/> + <check_box initial_value="true" label="轉移" name="next_owner_transfer" tool_tip="下一個所有人å¯è´ˆé€æˆ–轉售這個物件。"/> <button label="確定" name="ok"/> <button label="套用" name="apply"/> <button label="å–消" name="close"/> diff --git a/indra/newview/skins/default/xui/zh/floater_my_scripts.xml b/indra/newview/skins/default/xui/zh/floater_my_scripts.xml new file mode 100644 index 0000000000000000000000000000000000000000..0c68dd0e886d144c23ee536a71099a087e8b7fee --- /dev/null +++ b/indra/newview/skins/default/xui/zh/floater_my_scripts.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="myscripts" title="我的腳本"/> diff --git a/indra/newview/skins/default/xui/zh/floater_preferences.xml b/indra/newview/skins/default/xui/zh/floater_preferences.xml index 7f35f40b9e8e1185083ab0faf2ace84359f7b9d4..fd640ca63da8f0e357f73caec71b419769caf2dc 100644 --- a/indra/newview/skins/default/xui/zh/floater_preferences.xml +++ b/indra/newview/skins/default/xui/zh/floater_preferences.xml @@ -6,6 +6,9 @@ https://accounts.secondlife.com/change_email/ </floater.string> <button label="確定" label_selected="確定" name="OK"/> <button label="å–消" label_selected="å–消" name="Cancel"/> + <panel name="search_panel"> + <search_editor label="æœå°‹è¨å®š" name="search_prefs_edit" tool_tip="åœ¨é€™è£¡è¼¸å…¥ä½ æƒ³æœç´¢çš„å—詞。 若在è¨å®šçš„å稱或評論ä¸æœ‰å…¨æ–‡é…å°çµæžœï¼Œå°‡æœƒé¡¯ç¤ºéƒ¨åˆ†çµæžœã€‚"/> + </panel> <tab_container name="pref core"> <panel label="基本è¨å®š" name="general"/> <panel label="顯åƒ" name="display"/> diff --git a/indra/newview/skins/default/xui/zh/floater_tools.xml b/indra/newview/skins/default/xui/zh/floater_tools.xml index f51f7a8ae2835dbf1763f9c83b9da65d669068bd..539c7454f1506453509da5697584e2a3bdceabb0 100644 --- a/indra/newview/skins/default/xui/zh/floater_tools.xml +++ b/indra/newview/skins/default/xui/zh/floater_tools.xml @@ -175,9 +175,11 @@ <text name="Name:"> å稱: </text> + <line_editor name="Object Name" tool_tip="å稱é™é•·63å—元。 幾何元件å稱超éŽé™é•·ï¼Œæœƒè¢«æˆªçŸã€‚ å稱僅å¯ä½¿ç”¨ASCII-7å—元集(éžå»¶ä¼¸ç‰ˆï¼‰çš„å¯åˆ—å°å—元,唯一的例外是垂直槓å—元「|ã€ã€‚"/> <text name="Description:"> æ述: </text> + <line_editor name="Object Description" tool_tip="當人們在ç€è¦½å™¨è¨å®šä¸é¸æ“‡äº†ã€Œé‡å°æ‰€æœ‰ç‰©ä»¶æ‡¸ç½®é¡¯ç¤ºæ醒ã€æ™‚ï¼Œä»–å€‘æ»‘é¼ æ‰€æŒ‡çš„ç‰©ä»¶å°‡æœƒå½ˆå‡ºæ述該物件的內容。 幾何元件的æ述內容ä¸å¾—超éŽ127ä½å…ƒçµ„,å¦å‰‡æœƒè¢«æˆªçŸã€‚"/> <text name="Creator:"> å‰µé€ è€…ï¼š </text> @@ -194,17 +196,18 @@ <text name="label click action"> 點按以: </text> - <combo_box name="clickaction"> + <combo_box name="clickaction" tool_tip="é»žæŒ‰çš„å‹•ä½œè®“ä½ é»žä¸€ä¸‹æ»‘é¼ å·¦éµï¼Œå°±å¯ä»¥èˆ‡ç‰©ä»¶äº’動。 æ¯ä¸€å€‹å‹•ä½œéƒ½æœ‰ç‰¹æ®Šçš„游標,顯示它的作用。 有些點按動作需é…åˆå…¶ä»–æ¢ä»¶æ‰å¯æ£å¸¸é‹ä½œã€‚ 例如,觸摸和付款動作è¦æœ‰é…åˆè…³æœ¬"> <combo_box.item label="觸碰(é è¨ï¼‰" name="Touch/grab(default)"/> <combo_box.item label="å在物件上" name="Sitonobject"/> <combo_box.item label="購買物件" name="Buyobject"/> <combo_box.item label="支付物件" name="Payobject"/> <combo_box.item label="打開" name="Open"/> <combo_box.item label="縮放" name="Zoom"/> + <combo_box.item label="ç„¡" name="None"/> </combo_box> - <check_box label="出售ä¸ï¼š" name="checkbox for sale"/> - <spinner label="L$" name="Edit Cost"/> - <combo_box name="sale type"> + <check_box label="出售ä¸ï¼š" name="checkbox for sale" tool_tip="å…è¨±åˆ¥äººåœ¨è™›æ“¬ä¸–ç•Œè£¡ä»¥ç‰¹å®šçš„åƒ¹æ ¼è³¼è²·æ¤ç‰©ä»¶ã€å…¶å…§å®¹æˆ–其複本。"/> + <spinner label="L$" name="Edit Cost" tool_tip="物件æˆæœ¬ã€‚"/> + <combo_box name="sale type" tool_tip="決定購買者會收到物件複本ã€ç‰©ä»¶å…§å®¹è¤‡æœ¬ã€é‚„是物件本身。"> <combo_box.item label="æšåº¨" name="Copy"/> <combo_box.item label="內容" name="Contents"/> <combo_box.item label="原件" name="Original"/> @@ -217,14 +220,14 @@ <text name="Anyone can:"> 任何人: </text> - <check_box label="移動" name="checkbox allow everyone move"/> - <check_box label="æšåº¨" name="checkbox allow everyone copy"/> + <check_box label="移動" name="checkbox allow everyone move" tool_tip="任何人皆å¯ç§»å‹•è©²ç‰©ä»¶ã€‚"/> + <check_box label="æšåº¨" name="checkbox allow everyone copy" tool_tip="任何人都å¯å–用本物件的複本。 ç‰©ä»¶å’Œå…¶æ‰€æœ‰å…§å®¹éƒ½å¿…é ˆå…許複製和轉移。"/> <text name="Next owner can:"> 下一個所有人: </text> - <check_box label="修改" name="checkbox next owner can modify"/> - <check_box label="æšåº¨" name="checkbox next owner can copy"/> - <check_box label="轉移" name="checkbox next owner can transfer" tool_tip="下一個所有人å¯è´ˆé€æˆ–轉售這個物件"/> + <check_box label="修改" name="checkbox next owner can modify" tool_tip="下一個所有人å¯ä»¥ç·¨è¼¯æœ¬ç‰©ä»¶çš„性質,如å稱或尺寸。"/> + <check_box label="æšåº¨" name="checkbox next owner can copy" tool_tip="下一個所有人å¯ç„¡é™è¤‡è£½æœ¬ç‰©ä»¶ã€‚ 複本將ä¿ç•™å‰µä½œäººçš„資料,其å…許è¨å®šä¸èƒ½æ¯”åŽŸæœ¬ç‰©ä»¶æ›´åŠ æ”¾å¯¬ã€‚"/> + <check_box label="轉移" name="checkbox next owner can transfer" tool_tip="下一個所有人å¯è´ˆé€æˆ–轉售這個物件。"/> <text name="B:"> B: </text> diff --git a/indra/newview/skins/default/xui/zh/floater_top_objects.xml b/indra/newview/skins/default/xui/zh/floater_top_objects.xml index 58530f00c17fa1d10cde9512a31bc696cc9fd60d..d42ae5bc8f8dbc2b1e9feffca7c72932a6f6aa76 100644 --- a/indra/newview/skins/default/xui/zh/floater_top_objects.xml +++ b/indra/newview/skins/default/xui/zh/floater_top_objects.xml @@ -4,7 +4,7 @@ 排行最高的腳本 </floater.string> <floater.string name="top_scripts_text"> - [COUNT] 個腳本共需時 [TIME] 毫秒 + [COUNT]個腳本共需時[TIME]毫秒,耗用[MEMORY]KB </floater.string> <floater.string name="scripts_score_label"> 時間 diff --git a/indra/newview/skins/default/xui/zh/floater_tos.xml b/indra/newview/skins/default/xui/zh/floater_tos.xml index 4cac07cd218de2e04ddd9aaca1593ddee49ae7af..2f02316fc0a04526f10dc9702e2d53f530730af8 100644 --- a/indra/newview/skins/default/xui/zh/floater_tos.xml +++ b/indra/newview/skins/default/xui/zh/floater_tos.xml @@ -4,7 +4,7 @@ http://secondlife.com/app/tos/ </floater.string> <floater.string name="loading_url"> - data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E æ£åœ¨è¼‰å…¥ %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E + data:text/html;charset=utf-8,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E æ£åœ¨è¼‰å…¥ %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E </floater.string> <text name="tos_heading"> 請閱讀並éµå®ˆSecond Life使用æ¢æ¬¾ã€éš±ç§æ”¿ç–ã€æœå‹™æ¢æ¬¾ï¼ŒåŒ…括åŒæ„在發生çˆè°æ™‚接å—仲è£ä¸¦æ”¾æ£„採å–集體或群體求訴的è¦å®šã€‚ 繼續登入[SECOND_LIFE]å‰ï¼Œä½ å¿…é ˆåŒæ„這些æ¢æ¬¾ã€‚ diff --git a/indra/newview/skins/default/xui/zh/menu_viewer.xml b/indra/newview/skins/default/xui/zh/menu_viewer.xml index a8ac7cbf0e2e7234816af31e48f0b45ead575b2c..a5c96849737f9f981836fd9cdf0d8c151238e381 100644 --- a/indra/newview/skins/default/xui/zh/menu_viewer.xml +++ b/indra/newview/skins/default/xui/zh/menu_viewer.xml @@ -9,9 +9,11 @@ <menu_item_call label="地點…" name="Places"/> <menu_item_call label="ç²¾é¸åœ°é»žâ€¦" name="Picks"/> <menu_item_call label="體驗…" name="Experiences"/> + <menu_item_call label="我的腳本…" name="MyScripts"/> <menu_item_call label="æ”影機控制…" name="Camera Controls"/> <menu label="動作" name="Movement"> <menu_item_call label="å下" name="Sit Down Here"/> + <menu_item_call label="èµ·ç«‹" name="Stand up"/> <menu_item_check label="飛行" name="Fly"/> <menu_item_check label="以跑代æ¥" name="Always Run"/> <menu_item_call label="åœæ¢æˆ‘身上的動作" name="Stop Animating My Avatar"/> diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml index ea635d0e5dbe54d0ceb66fc8831f75e15cf67a0f..d304e95b09d7fff15253aabddff4ee85fc895c4b 100644 --- a/indra/newview/skins/default/xui/zh/notifications.xml +++ b/indra/newview/skins/default/xui/zh/notifications.xml @@ -244,6 +244,10 @@ 注æ„ï¼šä½ ä¸€æ—¦åŒæ„這é¸é …,任何使用這部電腦的人都å¯çœ‹åˆ°ä½ 有哪些「最愛ã€åœ°é»žã€‚ <usetemplate name="okbutton" yestext="確定"/> </notification> + <notification name="AllowMultipleViewers"> + ä¸æ”¯æ´åŒæ™‚執行多個Second Lifeç€è¦½å™¨ã€‚ 這麼åšå¯èƒ½å°Žè‡´æ質快å–相互碰撞ã€æ¯€æ,並é™ä½Žè¦–覺效果åŠæ€§èƒ½ã€‚ + <usetemplate name="okbutton" yestext="確定"/> + </notification> <notification name="GrantModifyRights"> 賦予å¦ä¸€å±…民「修改ã€æ¬Šï¼Œå°‡å…許他更改ã€åˆªé™¤æˆ–æ‹¿å–ä½ åœ¨è™›æ“¬ä¸–ç•Œè£¡æ“有的任何物件。 è³¦äºˆé€™é …æ¬Šé™æ™‚,敬請慎é‡è€ƒæ…®ã€‚ ä½ ä»è¦è³¦äºˆ [NAME] 修改權嗎? @@ -719,7 +723,7 @@ </notification> <notification name="CannotCopyWarning"> ä½ æ²’æœ‰æ¬Šé™è¤‡è£½ä»¥ä¸‹é …目: -[ITEMS] +<nolink>[ITEMS]</nolink> å¦‚æžœä½ å°‡å®ƒé€äººï¼Œå®ƒå°‡ç„¡æ³•çºŒç•™åœ¨æ”¶ç´å€ã€‚ ä½ ç¢ºå®šè¦é€å‡ºé€™äº›æ±è¥¿å—Žï¼Ÿ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/> </notification> @@ -1563,6 +1567,30 @@ SHA1 指紋:[MD5_DIGEST] <notification name="ProblemAddingEstateManagerBanned"> 無法把被å°éŽ–çš„å±…æ°‘åŠ å…¥é ˜åœ°çš„ç®¡ç†äººå單。 </notification> + <notification name="ProblemBanningEstateManager"> + ç„¡æ³•å°‡é ˜åœ°ç®¡ç†äºº[AGENT]åŠ å…¥å°éŽ–å單。 + </notification> + <notification name="GroupIsAlreadyInList"> + <nolink>[GROUP]</nolink>已在ç²å‡†ç¾¤çµ„åå–®ä¸ã€‚ + </notification> + <notification name="AgentIsAlreadyInList"> + [AGENT]å·²åœ¨ä½ çš„[LIST_TYPE]å單。 + </notification> + <notification name="AgentsAreAlreadyInList"> + [AGENT]å·²åœ¨ä½ çš„[LIST_TYPE]å單。 + </notification> + <notification name="AgentWasAddedToList"> + [AGENT]已新增到[ESTATE]çš„[LIST_TYPE]å單。 + </notification> + <notification name="AgentsWereAddedToList"> + [AGENT]已新增到[ESTATE]çš„[LIST_TYPE]å單。 + </notification> + <notification name="AgentWasRemovedFromList"> + [AGENT]已從[ESTATE]çš„[LIST_TYPE]åå–®ä¸è¢«ç§»é™¤ã€‚ + </notification> + <notification name="AgentsWereRemovedFromList"> + [AGENT]已從[ESTATE]çš„[LIST_TYPE]åå–®ä¸è¢«ç§»é™¤ã€‚ + </notification> <notification name="CanNotChangeAppearanceUntilLoaded"> 無法變更外觀,直到æœè£èˆ‡é«”形下載完畢。 </notification> @@ -1579,10 +1607,24 @@ SHA1 指紋:[MD5_DIGEST] </notification> <notification name="RequiredUpdate"> å¿…é ˆç”¨[VERSION]版本登入。 -本來應該已經完æˆæ›´æ–°ï¼Œä½†çœ‹ä¾†ä½ 的尚未更新。 請到 http://secondlife.com/support/ 下載更新版 <usetemplate name="okbutton" yestext="確定"/> </notification> + <notification name="PauseForUpdate"> + å¿…é ˆç”¨[VERSION]版本登入。 +點按「確定ã€é–‹å§‹ä¸‹è¼‰ä¸¦å®‰è£ã€‚ + <usetemplate name="okbutton" yestext="確定"/> + </notification> + <notification name="OptionalUpdateReady"> + 版本[VERSION]已下載,å¯ä»¥é–‹å§‹å®‰è£ã€‚ +點按「確定ã€é–‹å§‹å®‰è£ã€‚ + <usetemplate name="okbutton" yestext="確定"/> + </notification> + <notification name="PromptOptionalUpdate"> + 版本[VERSION]已下載,å¯ä»¥é–‹å§‹å®‰è£ã€‚ +繼續? + <usetemplate canceltext="暫時ä¸è¦" name="yesnocancelbuttons" notext="ç•¥éŽ" yestext="安è£"/> + </notification> <notification name="LoginFailedUnknown"> 抱æ‰ï¼Œç™»å…¥å¤±æ•—ï¼ŒåŽŸå› ä¸æ˜Žã€‚ å¦‚æžœä½ ä¸€ç›´çœ‹åˆ°æ¤è¨Šæ¯ï¼Œè«‹æŸ¥é–± [SUPPORT_SITE]。 @@ -3043,15 +3085,6 @@ SHA1 指紋:[MD5_DIGEST] <button name="Deny" text="拒絕"/> </form> </notification> - <notification name="UnknownScriptQuestion"> - ç”± '[NAME]' 所æ“有的物件 '<nolink>[OBJECTNAME]</nolink>' æ£è«‹æ±‚æŸé …執行時期腳本權é™ï¼Œä½†æœ¬ç€è¦½å™¨ç„¡æ³•è¾¨è˜è©²æ¬Šé™ï¼Œæ•…ä¸å…准。 - -欲准許æ¤æ¬Šé™ï¼Œè«‹å¾ž [DOWNLOADURL] 下載並更新為最新版ç€è¦½å™¨ã€‚ - <form name="form"> - <button name="Deny" text="確定"/> - <button name="Mute" text="å°éŽ–"/> - </form> - </notification> <notification name="ScriptDialog"> [NAME] çš„ '<nolink>[TITLE]</nolink>' [MESSAGE] @@ -3158,14 +3191,20 @@ SHA1 指紋:[MD5_DIGEST] <notification name="VoiceEffectsExpired"> è‡³å°‘ä¸€å€‹ä½ è¨‚ç”¨çš„è®Šè²æ•ˆæžœå·²ç¶“éŽæœŸã€‚ [[URL] 點按這裡] 繼續訂用。 + +付費用戶請[[PREMIUM_URL] 點按這裡]é ˜å–å…費變è²å·¥å…·ã€‚ </notification> <notification name="VoiceEffectsExpiredInUse"> 使用ä¸çš„變è²æ•ˆæžœå·²ç¶“éŽæœŸï¼Œå·²ç”¨ä½ 平時的è²éŸ³è¨å®šå–代。 -[[URL] 點按這裡] 繼續訂用。 +[[URL] 點按這裡]繼續訂用。 + +付費用戶請[[PREMIUM_URL] 點按這裡]é ˜å–å…費變è²å·¥å…·ã€‚ </notification> <notification name="VoiceEffectsWillExpire"> è‡³å°‘ä¸€å€‹ä½ è¨‚ç”¨çš„è®Šè²æ•ˆæžœå°‡åœ¨ [INTERVAL] 天後到期。 -[[URL] 點按這裡] 繼續訂用。 +[[URL] 點按這裡]繼續訂用。 + +付費用戶請[[PREMIUM_URL] 點按這裡]é ˜å–å…費變è²å·¥å…·ã€‚ </notification> <notification name="VoiceEffectsNew"> 新的變è²æ•ˆæžœä¸Šå¸‚äº†ï¼ @@ -3217,6 +3256,9 @@ SHA1 指紋:[MD5_DIGEST] <notification name="SnapshotToComputerFailed"> 將快照儲å˜æ–¼[PATH]時失敗:ç£ç¢Ÿå·²æ»¿ã€‚ 需è¦[NEED_MEMORY]KB的空間,但åªå‰©[FREE_MEMORY]KB空間。 </notification> + <notification name="SnapshotToLocalDirNotExist"> + 將快照儲å˜æ–¼[PATH]時失敗:目錄ä¸å˜åœ¨ã€‚ + </notification> <notification name="PresetNotSaved"> 儲å˜é è¨å稱[NAME]時出錯。 </notification> @@ -3710,13 +3752,13 @@ SHA1 指紋:[MD5_DIGEST] ä½ ç„¡æ³•åœ¨åˆ¥äººçš„åœŸåœ°ä¸Šå»ºç«‹æ¨¹å’Œè‰ã€‚ </notification> <notification name="NoCopyPermsNoObject"> - è¤‡è£½å¤±æ•—ï¼Œä½ ç„¡æ¬Šè¤‡è£½ç‰©ä»¶ '[OBJ_NAME]'。 + è¤‡è£½å¤±æ•—ï¼Œä½ ç„¡æ¬Šè¤‡è£½ç‰©ä»¶<nolink>'[OBJ_NAME]'</nolink>。 </notification> <notification name="NoTransPermsNoObject"> - è¤‡è£½å¤±æ•—ï¼Œå› ç‚ºç‰©ä»¶ '[OBJ_NAME]' ç„¡æ³•è½‰ç§»çµ¦ä½ ã€‚ + è¤‡è£½å¤±æ•—ï¼Œå› ç‚ºç‰©ä»¶<nolink>'[OBJ_NAME]'</nolink>ç„¡æ³•è½‰ç§»çµ¦ä½ ã€‚ </notification> <notification name="AddToNavMeshNoCopy"> - è¤‡è£½å¤±æ•—ï¼Œå› ç‚ºç‰©ä»¶ '[OBJ_NAME]' å°å°Žèˆªç¶²é¢æœ‰è²¢ç»ã€‚ + è¤‡è£½å¤±æ•—ï¼Œå› ç‚ºç‰©ä»¶<nolink>'[OBJ_NAME]'</nolink>å°å°Žèˆªç¶²é¢æœ‰è²¢ç»ã€‚ </notification> <notification name="DupeWithNoRootsSelected"> é¸å–äº†æ²’æœ‰æ ¹çš„é‡è¦†ç‰©ä»¶ã€‚ @@ -3761,34 +3803,34 @@ SHA1 指紋:[MD5_DIGEST] 「儲å˜å›žæ”¶ç´å€ã€åŠŸèƒ½å·²è¢«åœç”¨ã€‚ </notification> <notification name="NoExistNoSaveToContents"> - 無法將 '[OBJ_NAME]' 儲å˜åˆ°ç‰©ä»¶å…§å®¹ï¼Œå› 為產生它的來æºç‰©ä»¶å·²ä¸å˜åœ¨ã€‚ + 無法將<nolink>'[OBJ_NAME]'</nolink>儲å˜åˆ°ç‰©ä»¶å…§å®¹ï¼Œå› 為產生它的來æºç‰©ä»¶å·²ä¸å˜åœ¨ã€‚ </notification> <notification name="NoModNoSaveToContents"> - ç„¡æ³•å„²å˜ [OBJ_NAME] åˆ°ç‰©ä»¶å…§å®¹ï¼Œä½ ç„¡æ¬Šä¿®æ”¹ '[DEST_NAME]' 物件。 + 無法儲å˜<nolink>'[OBJ_NAME]'</nolink>åˆ°ç‰©ä»¶å…§å®¹ï¼Œå› çˆ²ä½ ç„¡æ¬Šä¿®æ”¹<nolink>'[DEST_NAME]'</nolink>物件。 </notification> <notification name="NoSaveBackToInvDisabled"> - 無法將 '[OBJ_NAME]' 儲å˜å›žæ”¶ç´å€ï¼Œæ¤å‹•ä½œå·²è¢«åœç”¨ã€‚ + 無法將<nolink>'[OBJ_NAME]'</nolink>儲å˜å›žæ”¶ç´å€ï¼Œæ¤å‹•ä½œå·²è¢«åœç”¨ã€‚ </notification> <notification name="NoCopyNoSelCopy"> - ç„¡æ³•è¤‡è£½ä½ æ‰€é¸çš„ï¼Œå› ç‚ºä½ ç„¡æ¬Šè¤‡è£½ç‰©ä»¶ '[OBJ_NAME]'。 + ç„¡æ³•è¤‡è£½ä½ æ‰€é¸çš„ï¼Œå› ç‚ºä½ ç„¡æ¬Šè¤‡è£½ç‰©ä»¶<nolink>'[OBJ_NAME]'</nolink>。 </notification> <notification name="NoTransNoSelCopy"> - 無法é¸å–è¤‡è£½ï¼Œå› ç‚ºç‰©ä»¶ '[OBJ_NAME]' ä¸å¯è½‰ç§»ã€‚ + 無法é¸å–è¤‡è£½ï¼Œå› ç‚ºç‰©ä»¶<nolink>'[OBJ_NAME]'</nolink>ä¸å¯è½‰ç§»ã€‚ </notification> <notification name="NoTransNoCopy"> - 無法é¸å–è¤‡è£½ï¼Œå› ç‚ºç‰©ä»¶ '[OBJ_NAME]' ä¸å¯è½‰ç§»ã€‚ + 無法é¸å–è¤‡è£½ï¼Œå› ç‚ºç‰©ä»¶<nolink>'[OBJ_NAME]'</nolink>ä¸å¯è½‰ç§»ã€‚ </notification> <notification name="NoPermsNoRemoval"> - 權é™ç³»çµ±ä¸å…許從模擬器移除物件 '[OBJ_NAME]'。 + 權é™ç³»çµ±ä¸å…許從模擬器移除物件<nolink>'[OBJ_NAME]'</nolink>。 </notification> <notification name="NoModNoSaveSelection"> - 無法儲å˜ä½ 所é¸çš„ï¼Œå› ç‚ºä½ ç„¡æ¬Šä¿®æ”¹ '[OBJ_NAME]' 物件。 + 無法儲å˜ä½ 所é¸çš„ï¼Œå› ç‚ºä½ ç„¡æ¬Šä¿®æ”¹<nolink>'[OBJ_NAME]'</nolink>物件。 </notification> <notification name="NoCopyNoSaveSelection"> - 無法儲å˜ä½ 所é¸çš„ï¼Œå› ç‚ºç‰©ä»¶ '[OBJ_NAME]' ä¸å¯è¤‡è£½ã€‚ + 無法儲å˜ä½ 所é¸çš„ï¼Œå› ç‚ºç‰©ä»¶<nolink>'[OBJ_NAME]'</nolink>ä¸å¯è¤‡è£½ã€‚ </notification> <notification name="NoModNoTaking"> - 無法拿å–ä½ æ‰€é¸çš„ï¼Œå› ç‚ºä½ ç„¡æ¬Šä¿®æ”¹ '[OBJ_NAME]' 物件。 + 無法å–ç”¨ä½ æ‰€é¸çš„ï¼Œå› ç‚ºä½ ç„¡æ¬Šä¿®æ”¹ç‰©ä»¶<nolink>'[OBJ_NAME]'</nolink>。 </notification> <notification name="RezDestInternalError"> 內部錯誤:未知的目的地類型。 diff --git a/indra/newview/skins/default/xui/zh/panel_login.xml b/indra/newview/skins/default/xui/zh/panel_login.xml index 5292e5fc38ff3317740a528c50e97a99bbe6ee5a..59618972af1b83953a37b85ab57fc2221870aaa3 100644 --- a/indra/newview/skins/default/xui/zh/panel_login.xml +++ b/indra/newview/skins/default/xui/zh/panel_login.xml @@ -1,6 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> <panel name="panel_login"> - <panel.string name="forgot_password_url">http://secondlife.com/account/request.php</panel.string> + <panel.string name="forgot_password_url"> + http://secondlife.com/account/request.php + </panel.string> + <panel.string name="sign_up_url"> + https://join.secondlife.com/ + </panel.string> <layout_stack name="ui_stack"> <layout_panel name="ui_container"> <combo_box label="使用者å稱" name="username_combo" tool_tip="使用者åç¨±æ˜¯ä½ è¨»å†Šæ™‚æ‰€æŒ‘é¸çš„,例如 bobsmith12 或 Steller Sunshine"/> @@ -11,8 +16,13 @@ </combo_box> <button label="登入" name="connect_btn"/> <check_box label="記得我" name="remember_check"/> - <text name="forgot_password_text">忘記密碼</text> + <text name="forgot_password_text"> + 忘記密碼 + </text> <combo_box label="é¸æ“‡æ¨¡æ“¬ä¸–ç•Œ" name="server_combo"/> + <text name="sign_up_text"> + 註冊 + </text> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/zh/panel_login_first.xml b/indra/newview/skins/default/xui/zh/panel_login_first.xml index a8af615b7cd46fb3053c93693beb99838983d4c5..4d72fcdd0354b1882bafc54ac0bd4294f862762d 100644 --- a/indra/newview/skins/default/xui/zh/panel_login_first.xml +++ b/indra/newview/skins/default/xui/zh/panel_login_first.xml @@ -3,6 +3,9 @@ <panel.string name="forgot_password_url"> http://secondlife.com/account/request.php </panel.string> + <panel.string name="sign_up_url"> + http://join.secondlife.com/ + </panel.string> <layout_stack name="logo_stack"> <layout_panel name="parent_panel2"> <layout_stack name="widget_stack"> @@ -14,6 +17,9 @@ <text name="forgot_password_text"> 忘記密碼 </text> + <text name="sign_up_text"> + 註冊 + </text> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_general.xml b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml index 20335d82aedf39479f3c11982e3580619f40146d..87c38e43461d7dd9ff733d652a4fd8a1e6da049b 100644 --- a/indra/newview/skins/default/xui/zh/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_general.xml @@ -4,7 +4,6 @@ 語言: </text> <combo_box name="language_combobox"> - <combo_box.item label="系統é è¨" name="System Default Language"/> <combo_box.item label="英語" name="English"/> <combo_box.item label="Dansk(丹麥語)- 試用版" name="Danish"/> <combo_box.item label="Deutsch(德語)- 試用版" name="Deutsch(German)"/> diff --git a/indra/newview/skins/default/xui/zh/panel_region_access.xml b/indra/newview/skins/default/xui/zh/panel_region_access.xml new file mode 100644 index 0000000000000000000000000000000000000000..7842d26321886101d324ecf2ba8da1ad46bb6279 --- /dev/null +++ b/indra/newview/skins/default/xui/zh/panel_region_access.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="出入許å¯" name="Access"> + <tab_container name="tabs"> + <panel label="é ˜åœ°ç®¡ç†å“¡" name="estate_managers_panel"> + <text name="estate_manager_label"> + é ˜åœ°ç®¡ç†å“¡ï¼š + </text> + <name_list name="estate_manager_name_list"> + <columns label="å稱" name="name"/> + </name_list> + <button label="新增…" name="add_estate_manager_btn"/> + <button label="移除…" name="remove_estate_manager_btn"/> + </panel> + <panel label="ç²å‡†" name="allowed_panel"> + <panel label="top_panel" name="allowed_search_panel"> + <filter_editor label="æœå°‹ç²å‡†çš„用戶" name="allowed_search_input"/> + </panel> + <text name="allow_resident_label"> + æ°¸é 准許: + </text> + <name_list name="allowed_avatar_name_list"> + <columns label="å稱" name="name"/> + </name_list> + <button label="新增…" name="add_allowed_avatar_btn"/> + <button label="移除…" name="remove_allowed_avatar_btn"/> + </panel> + <panel label="准許的群組" name="allowed_groups_panel"> + <panel label="top_panel" name="allowed_group_search_panel"> + <filter_editor label="æœå°‹ç²å‡†çš„群組" name="allowed_group_search_input"/> + </panel> + <text name="allow_group_label"> + æ°¸é 准許的群組: + </text> + <name_list name="allowed_group_name_list"> + <columns label="å稱" name="name"/> + </name_list> + <button label="新增…" name="add_allowed_group_btn"/> + <button label="移除…" name="remove_allowed_group_btn"/> + </panel> + <panel label="ç¦å…¥çš„" name="banned_panel"> + <panel label="top_panel" name="banned_search_panel"> + <filter_editor label="æœå°‹ç¦å…¥çš„用戶" name="banned_search_input"/> + </panel> + <text name="ban_resident_label"> + æ°¸é ç¦å…¥ï¼š + </text> + <name_list name="banned_avatar_name_list"> + <columns label="å稱" name="name"/> + <columns label="上次登入日期" name="last_login_date"/> + <columns label="éç¦æ—¥æœŸ" name="ban_date"/> + <columns label="å°éŽ–者:" name="bannedby"/> + </name_list> + <button label="新增…" name="add_banned_avatar_btn"/> + <button label="移除…" name="remove_banned_avatar_btn"/> + </panel> + </tab_container> +</panel> diff --git a/indra/newview/skins/default/xui/zh/panel_region_estate.xml b/indra/newview/skins/default/xui/zh/panel_region_estate.xml index 3825e7ab2386015cfac750463e4802f7abc3772b..b25f6975c93f698a138728a3aed5a2446540cdb9 100644 --- a/indra/newview/skins/default/xui/zh/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/zh/panel_region_estate.xml @@ -16,7 +16,7 @@ (未知) </text> <radio_group name="externally_visible_radio"> - <radio_item label="åªå…許下列的居民和群組" name="estate_restricted_access"/> + <radio_item label="åªå…許å列於「准入ã€é 籤的居民和群組" name="estate_restricted_access"/> <radio_item label="任何人都å¯é€ 訪" name="estate_public_access"/> </radio_group> <check_box label="å¿…é ˆæ»¿18æ²" name="limit_age_verified" tool_tip="å±…æ°‘å¿…é ˆå¹´æ»¿ 18 æ²æ‰èƒ½é€²å…¥é€™é ˜åœ°ã€‚ åƒé–± [SUPPORT_SITE] ç²å–進一æ¥è³‡è¨Šã€‚"/> diff --git a/indra/newview/skins/default/xui/zh/panel_status_bar.xml b/indra/newview/skins/default/xui/zh/panel_status_bar.xml index 2de31eb526f3d777037ab7c331dc5dc91170a689..0d6fcea4517a369ec085880d867cf82e411bee10 100644 --- a/indra/newview/skins/default/xui/zh/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/zh/panel_status_bar.xml @@ -1,16 +1,31 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="status"> - <panel.string name="packet_loss_tooltip">å°åŒ…æ失</panel.string> - <panel.string name="bandwidth_tooltip">é »å¯¬</panel.string> - <panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string> - <panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string> - <panel.string name="buycurrencylabel">L$ [AMT]</panel.string> + <panel.string name="packet_loss_tooltip"> + å°åŒ…æ失 + </panel.string> + <panel.string name="bandwidth_tooltip"> + é »å¯¬ + </panel.string> + <panel.string name="time"> + [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt] + </panel.string> + <panel.string name="timeTooltip"> + [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt] + </panel.string> + <panel.string name="buycurrencylabel"> + L$ [AMT] + </panel.string> + <panel name="menu_search_panel"> + <search_editor label="æœå°‹é¸å–®" name="search_menu_edit" tool_tip="åœ¨é€™è£¡è¼¸å…¥ä½ æƒ³æœç´¢çš„å—詞。 若在é¸å–®ä¸æœ‰å…¨æ–‡é…å°åˆ°çµæžœï¼Œå°‡æœƒé¡¯ç¤ºéƒ¨åˆ†çµæžœã€‚"/> + </panel> <panel name="balance_bg"> <text name="balance" tool_tip="點按以é‡æ–°æ›´æ–°ä½ çš„ L$ 帳戶餘é¡" value="L$??"/> <button label="購買 L$" name="buyL" tool_tip="點按以購買更多 L$"/> <button label="購物" name="goShop" tool_tip="打開第二人生購物市集"/> </panel> - <text name="TimeText" tool_tip="ç›®å‰æ™‚å€ï¼ˆå¤ªå¹³æ´‹ï¼‰">24:00 AM PST</text> + <text name="TimeText" tool_tip="ç›®å‰æ™‚å€ï¼ˆå¤ªå¹³æ´‹ï¼‰"> + 24:00 AM PST + </text> <button name="media_toggle_btn" tool_tip="開始/åœæ¢å…¨éƒ¨åª’體(音樂ã€å½±ç‰‡ã€ç¶²é )"/> <button name="volume_btn" tool_tip="全域音é‡æŽ§åˆ¶"/> </panel> diff --git a/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml b/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml index 9c5798d256998a61ae6ebe4118eb558855cf11bf..61c52066d02a2b48b8786db4b636d3346aff3fd7 100644 --- a/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/zh/sidepanel_item_info.xml @@ -34,9 +34,11 @@ <text name="LabelItemNameTitle"> å稱: </text> + <line_editor name="LabelItemName" tool_tip="å稱é™é•·63å—元。 幾何元件å稱超éŽé™é•·ï¼Œæœƒè¢«æˆªçŸã€‚ å稱僅å¯ä½¿ç”¨ASCII-7å—元集(éžå»¶ä¼¸ç‰ˆï¼‰çš„å¯åˆ—å°å—元,唯一的例外是垂直槓å—元「|ã€ã€‚"/> <text name="LabelItemDescTitle"> æ述: </text> + <line_editor name="LabelItemDesc" tool_tip="當人們在ç€è¦½å™¨è¨å®šä¸é¸æ“‡äº†ã€Œé‡å°æ‰€æœ‰ç‰©ä»¶æ‡¸ç½®é¡¯ç¤ºæ醒ã€æ™‚ï¼Œä»–å€‘æ»‘é¼ æ‰€æŒ‡çš„ç‰©ä»¶å°‡æœƒå½ˆå‡ºæ述該物件的內容。 幾何元件的æ述內容ä¸å¾—超éŽ127ä½å…ƒçµ„,å¦å‰‡æœƒè¢«æˆªçŸã€‚"/> <text name="LabelCreatorTitle"> å‰µé€ è€…ï¼š </text> @@ -59,7 +61,7 @@ <text name="AnyoneLabel"> 任何人: </text> - <check_box label="複製" name="CheckEveryoneCopy"/> + <check_box label="複製" name="CheckEveryoneCopy" tool_tip="任何人都å¯å–用本物件的複本。 ç‰©ä»¶å’Œå…¶æ‰€æœ‰å…§å®¹éƒ½å¿…é ˆå…許複製和轉移。"/> <text name="GroupLabel"> 群組: </text> @@ -67,17 +69,17 @@ <text name="NextOwnerLabel"> 下一個所有人: </text> - <check_box label="修改" name="CheckNextOwnerModify"/> - <check_box label="複製" name="CheckNextOwnerCopy"/> - <check_box label="轉移" name="CheckNextOwnerTransfer" tool_tip="下一個所有人å¯è´ˆé€æˆ–轉售這個物件"/> + <check_box label="修改" name="CheckNextOwnerModify" tool_tip="下一個所有人å¯ä»¥ç·¨è¼¯æœ¬ç‰©ä»¶çš„性質,如å稱或尺寸。"/> + <check_box label="複製" name="CheckNextOwnerCopy" tool_tip="下一個所有人å¯ç„¡é™è¤‡è£½æœ¬ç‰©ä»¶ã€‚ 複本將ä¿ç•™å‰µä½œäººçš„資料,其å…許è¨å®šä¸èƒ½æ¯”åŽŸæœ¬ç‰©ä»¶æ›´åŠ æ”¾å¯¬ã€‚"/> + <check_box label="轉移" name="CheckNextOwnerTransfer" tool_tip="下一個所有人å¯è´ˆé€æˆ–轉售這個物件。"/> </panel> - <check_box label="出售" name="CheckPurchase"/> - <combo_box name="ComboBoxSaleType"> + <check_box label="出售" name="CheckPurchase" tool_tip="å…è¨±åˆ¥äººåœ¨è™›æ“¬ä¸–ç•Œè£¡ä»¥ç‰¹å®šçš„åƒ¹æ ¼è³¼è²·æ¤ç‰©ä»¶ã€å…¶å…§å®¹æˆ–其複本。"/> + <combo_box name="ComboBoxSaleType" tool_tip="決定購買者會收到物件複本ã€ç‰©ä»¶å…§å®¹è¤‡æœ¬ã€é‚„是物件本身。"> <combo_box.item label="複製" name="Copy"/> <combo_box.item label="內容" name="Contents"/> <combo_box.item label="原件" name="Original"/> </combo_box> - <spinner label="åƒ¹æ ¼ï¼š L$" name="Edit Cost"/> + <spinner label="åƒ¹æ ¼ï¼š L$" name="Edit Cost" tool_tip="物件æˆæœ¬ã€‚"/> </panel> </scroll_container> <panel name="button_panel"> diff --git a/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml index 0884f1789b0daaa91581ab743c1a56c26b531d1c..4b6ffefc5249e886d996441f238e3537fb11ed2f 100644 --- a/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/zh/sidepanel_task_info.xml @@ -1,71 +1,136 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="object properties" title="物件檔案"> - <panel.string name="text deed continued">讓渡</panel.string> - <panel.string name="text deed">讓渡</panel.string> - <panel.string name="text modify info 1">ä½ èƒ½ä¿®æ”¹é€™å€‹ç‰©ä»¶</panel.string> - <panel.string name="text modify info 2">ä½ èƒ½ä¿®æ”¹é€™äº›ç‰©ä»¶</panel.string> - <panel.string name="text modify info 3">ä½ ä¸èƒ½ä¿®æ”¹é€™å€‹ç‰©ä»¶</panel.string> - <panel.string name="text modify info 4">ä½ ä¸èƒ½ä¿®æ”¹é€™äº›ç‰©ä»¶</panel.string> - <panel.string name="text modify info 5">無法跨地å€ä¿®æ”¹é€™å€‹ç‰©ä»¶</panel.string> - <panel.string name="text modify info 6">無法跨地å€ä¿®æ”¹é€™äº›ç‰©ä»¶</panel.string> - <panel.string name="text modify warning">這個物件å«æœ‰è¯çµçš„部分</panel.string> - <panel.string name="Cost Default">åƒ¹æ ¼ï¼š L$</panel.string> - <panel.string name="Cost Total">ç¸½åƒ¹æ ¼ï¼šL$</panel.string> - <panel.string name="Cost Per Unit">單價:L$</panel.string> - <panel.string name="Cost Mixed">æ··åˆåƒ¹æ ¼</panel.string> - <panel.string name="Sale Mixed">æ··åˆéŠ·å”®</panel.string> + <panel.string name="text deed continued"> + 讓渡 + </panel.string> + <panel.string name="text deed"> + 讓渡 + </panel.string> + <panel.string name="text modify info 1"> + ä½ èƒ½ä¿®æ”¹é€™å€‹ç‰©ä»¶ + </panel.string> + <panel.string name="text modify info 2"> + ä½ èƒ½ä¿®æ”¹é€™äº›ç‰©ä»¶ + </panel.string> + <panel.string name="text modify info 3"> + ä½ ä¸èƒ½ä¿®æ”¹é€™å€‹ç‰©ä»¶ + </panel.string> + <panel.string name="text modify info 4"> + ä½ ä¸èƒ½ä¿®æ”¹é€™äº›ç‰©ä»¶ + </panel.string> + <panel.string name="text modify info 5"> + 無法跨地å€ä¿®æ”¹é€™å€‹ç‰©ä»¶ + </panel.string> + <panel.string name="text modify info 6"> + 無法跨地å€ä¿®æ”¹é€™äº›ç‰©ä»¶ + </panel.string> + <panel.string name="text modify warning"> + 這個物件å«æœ‰è¯çµçš„部分 + </panel.string> + <panel.string name="Cost Default"> + åƒ¹æ ¼ï¼š L$ + </panel.string> + <panel.string name="Cost Total"> + ç¸½åƒ¹æ ¼ï¼šL$ + </panel.string> + <panel.string name="Cost Per Unit"> + 單價:L$ + </panel.string> + <panel.string name="Cost Mixed"> + æ··åˆåƒ¹æ ¼ + </panel.string> + <panel.string name="Sale Mixed"> + æ··åˆéŠ·å”® + </panel.string> <text name="title" value="物件檔案"/> <text name="where" value="(在虛擬世界)"/> <panel label="" name="properties_panel"> - <text name="Name:">å稱:</text> - <text name="Description:">æ述:</text> - <text name="CreatorNameLabel">å‰µé€ è€…ï¼š</text> - <text name="Owner:">所有人:</text> - <text name="Group_label">群組:</text> + <text name="Name:"> + å稱: + </text> + <line_editor name="Object Name" tool_tip="å稱é™é•·63å—元。 幾何元件å稱超éŽé™é•·ï¼Œæœƒè¢«æˆªçŸã€‚ å稱僅å¯ä½¿ç”¨ASCII-7å—元集(éžå»¶ä¼¸ç‰ˆï¼‰çš„å¯åˆ—å°å—元,唯一的例外是垂直槓å—元「|ã€ã€‚"/> + <text name="Description:"> + æ述: + </text> + <line_editor name="Object Description" tool_tip="當人們在ç€è¦½å™¨è¨å®šä¸é¸æ“‡äº†ã€Œé‡å°æ‰€æœ‰ç‰©ä»¶æ‡¸ç½®é¡¯ç¤ºæ醒ã€æ™‚ï¼Œä»–å€‘æ»‘é¼ æ‰€æŒ‡çš„ç‰©ä»¶å°‡æœƒå½ˆå‡ºæ述該物件的內容。 幾何元件的æ述內容ä¸å¾—超éŽ127ä½å…ƒçµ„,å¦å‰‡æœƒè¢«æˆªçŸã€‚"/> + <text name="CreatorNameLabel"> + å‰µé€ è€…ï¼š + </text> + <text name="Owner:"> + 所有人: + </text> + <text name="Group_label"> + 群組: + </text> <button name="button set group" tool_tip="é¸æ“‡ä¸€å€‹ç¾¤çµ„以分享這物件的權é™"/> <name_box initial_value="載入ä¸..." name="Group Name Proxy"/> <button label="讓渡" label_selected="讓渡" name="button deed" tool_tip="「讓渡ã€æœƒæŠŠé€™ç‰©ä»¶è´ˆé€å‡ºåŽ»ä¸¦è³¦äºˆã€Œä¸‹ä¸€å€‹æ‰€æœ‰äººã€æ¬Šé™ã€‚ 群組所分享的物件å¯ç”±ç¾¤çµ„è·å“¡åŠ 以讓渡。"/> - <text name="label click action">點按以:</text> - <combo_box name="clickaction"> + <text name="label click action"> + 點按以: + </text> + <combo_box name="clickaction" tool_tip="é»žæŒ‰çš„å‹•ä½œè®“ä½ é»žä¸€ä¸‹æ»‘é¼ å·¦éµï¼Œå°±å¯ä»¥èˆ‡ç‰©ä»¶äº’動。 æ¯ä¸€å€‹å‹•ä½œéƒ½æœ‰ç‰¹æ®Šçš„游標,顯示它的作用。 有些點按動作需é…åˆå…¶ä»–æ¢ä»¶æ‰å¯æ£å¸¸é‹ä½œã€‚ 例如,觸摸和付款動作è¦æœ‰é…åˆè…³æœ¬"> <combo_box.item label="觸碰(é è¨ï¼‰" name="Touch/grab(default)"/> <combo_box.item label="å在物件上" name="Sitonobject"/> <combo_box.item label="購買物件" name="Buyobject"/> <combo_box.item label="支付物件" name="Payobject"/> <combo_box.item label="打開" name="Open"/> <combo_box.item label="縮放" name="Zoom"/> + <combo_box.item label="ç„¡" name="None"/> </combo_box> <panel name="perms_inv"> - <text name="perm_modify">ä½ èƒ½ä¿®æ”¹é€™å€‹ç‰©ä»¶</text> - <text name="Anyone can:">任何人:</text> - <check_box label="æšåº¨" name="checkbox allow everyone copy"/> - <check_box label="移動" name="checkbox allow everyone move"/> - <text name="GroupLabel">群組:</text> + <text name="perm_modify"> + ä½ èƒ½ä¿®æ”¹é€™å€‹ç‰©ä»¶ + </text> + <text name="Anyone can:"> + 任何人: + </text> + <check_box label="æšåº¨" name="checkbox allow everyone copy" tool_tip="任何人都å¯å–用本物件的複本。 ç‰©ä»¶å’Œå…¶æ‰€æœ‰å…§å®¹éƒ½å¿…é ˆå…許複製和轉移。"/> + <check_box label="移動" name="checkbox allow everyone move" tool_tip="任何人皆å¯ç§»å‹•è©²ç‰©ä»¶ã€‚"/> + <text name="GroupLabel"> + 群組: + </text> <check_box label="分享" name="checkbox share with group" tool_tip="å…許æ¤ç¾¤çµ„所有æˆå“¡å…±äº«ä½ 修改æ¤ç‰©ä»¶çš„權é™ã€‚ ä½ å¿…é ˆè®“æ¸¡æ‰èƒ½å•Ÿå‹•è§’色é™åˆ¶ã€‚"/> - <text name="NextOwnerLabel">下一個所有人:</text> - <check_box label="修改" name="checkbox next owner can modify"/> - <check_box label="æšåº¨" name="checkbox next owner can copy"/> + <text name="NextOwnerLabel"> + 下一個所有人: + </text> + <check_box label="修改" name="checkbox next owner can modify" tool_tip="下一個所有人å¯ä»¥ç·¨è¼¯æœ¬ç‰©ä»¶çš„性質,如å稱或尺寸。"/> + <check_box label="æšåº¨" name="checkbox next owner can copy" tool_tip="下一個所有人å¯ç„¡é™è¤‡è£½æœ¬ç‰©ä»¶ã€‚ 複本將ä¿ç•™å‰µä½œäººçš„資料,其å…許è¨å®šä¸èƒ½æ¯”åŽŸæœ¬ç‰©ä»¶æ›´åŠ æ”¾å¯¬ã€‚"/> <check_box label="轉移" name="checkbox next owner can transfer" tool_tip="下一個所有人å¯è´ˆé€æˆ–轉售這個物件"/> </panel> - <check_box label="出售" name="checkbox for sale"/> - <combo_box name="sale type"> + <check_box label="出售" name="checkbox for sale" tool_tip="å…è¨±åˆ¥äººåœ¨è™›æ“¬ä¸–ç•Œè£¡ä»¥ç‰¹å®šçš„åƒ¹æ ¼è³¼è²·æ¤ç‰©ä»¶ã€å…¶å…§å®¹æˆ–其複本。"/> + <combo_box name="sale type" tool_tip="決定購買者會收到物件複本ã€ç‰©ä»¶å…§å®¹è¤‡æœ¬ã€é‚„是物件本身。"> <combo_box.item label="æšåº¨" name="Copy"/> <combo_box.item label="內容" name="Contents"/> <combo_box.item label="原件" name="Original"/> </combo_box> - <spinner label="åƒ¹æ ¼ï¼š L$" name="Edit Cost"/> + <spinner label="åƒ¹æ ¼ï¼š L$" name="Edit Cost" tool_tip="物件æˆæœ¬ã€‚"/> <check_box label="顯示在æœå°‹ä¸" name="search_check" tool_tip="讓其他人å¯ä»¥åœ¨æœå°‹çµæžœä¸å¯Ÿçœ‹åˆ°æ¤ç‰©ä»¶"/> - <text name="pathfinding_attributes_label">尋徑屬性:</text> - <text name="B:">B:</text> - <text name="O:">O:</text> - <text name="G:">G:</text> - <text name="E:">E:</text> - <text name="N:">N:</text> - <text name="F:">F:</text> + <text name="pathfinding_attributes_label"> + 尋徑屬性: + </text> + <text name="B:"> + B: + </text> + <text name="O:"> + O: + </text> + <text name="G:"> + G: + </text> + <text name="E:"> + E: + </text> + <text name="N:"> + N: + </text> + <text name="F:"> + F: + </text> </panel> <panel name="button_panel"> - <button label="打開" name="open_btn"/> - <button label="支付" name="pay_btn"/> - <button label="購買" name="buy_btn"/> - <button label="細節" name="details_btn"/> + <button label="打開" name="open_btn" tool_tip="開啓後å¯ç€è¦½ç‰©ä»¶å…§å®¹ã€‚"/> + <button label="支付" name="pay_btn" tool_tip="開啟付款視窗。 ç‰©ä»¶å¿…é ˆæœ‰ä»˜æ¬¾è…³æœ¬ï¼Œé€™åŠŸèƒ½æ‰èƒ½æ£å¸¸é‹ä½œã€‚"/> + <button label="購買" name="buy_btn" tool_tip="開啟購買視窗。 物件需è¦è¨å®šç‚ºå¾…售。"/> + <button label="細節" name="details_btn" tool_tip="開啟檢驗物件視窗。"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml index 24d8dc60cba341e96115a6ddedc04c4249796d8e..d14eac88ef21de7a063ef1f57537a5952b72bf3f 100644 --- a/indra/newview/skins/default/xui/zh/strings.xml +++ b/indra/newview/skins/default/xui/zh/strings.xml @@ -2222,6 +2222,18 @@ http://secondlife.com/support 求助解決å•é¡Œã€‚ <string name="RegionInfoListTypeBannedAgents"> æ°¸é å°éŽ– </string> + <string name="RegionInfoAllEstates"> + å…¨éƒ¨é ˜åœ° + </string> + <string name="RegionInfoManagedEstates"> + å—ç®¡é ˜åœ° + </string> + <string name="RegionInfoThisEstate"> + é€™å€‹é ˜åœ° + </string> + <string name="AndNMore"> + åŠå…¶ä»–[EXTRA_COUNT]個 + </string> <string name="ScriptLimitsParcelScriptMemory"> 地段腳本記憶體 </string> @@ -2265,7 +2277,7 @@ http://secondlife.com/support 求助解決å•é¡Œã€‚ 胸部 </string> <string name="ATTACH_HEAD"> - é 部 + é 顱 </string> <string name="ATTACH_LSHOULDER"> 左肩 @@ -2286,7 +2298,7 @@ http://secondlife.com/support 求助解決å•é¡Œã€‚ å³è…³ </string> <string name="ATTACH_BACK"> - 背部 + 脊椎 </string> <string name="ATTACH_PELVIS"> 骨盆 @@ -5746,4 +5758,25 @@ http://secondlife.com/support 求助解決å•é¡Œã€‚ <string name="Mav_Details_MAV_UNKNOWN_VERSION"> 物ç†å½¢ç‹€çš„版本ä¸æ£ç¢ºã€‚ è«‹è¨æˆæ£ç¢ºçš„物ç†æ¨¡åž‹ç‰ˆæœ¬ã€‚ </string> + <string name="couldnt_resolve_host"> + DNS無法解決主機å稱([HOSTNAME])。 +請確èªä½ èƒ½å¤ é€£é€š www.secondlife.com +網站。 如能連通,但繼續看到這個錯誤, +請到「支æ´ã€éƒ¨åˆ†é€šå ±å•é¡Œã€‚ + </string> + <string name="ssl_peer_certificate"> + 登入伺æœå™¨ç„¡æ³•é€éŽSSL自我確èªã€‚ +å¦‚æžœä½ ç¹¼çºŒçœ‹åˆ°é€™å€‹éŒ¯èª¤ï¼Œè«‹å‰å¾€ +SecondLife.com網站的「支æ´ã€éƒ¨åˆ† +æå ±å•é¡Œã€‚ + </string> + <string name="ssl_connect_error"> + 這通常æ„å‘³ä½ é›»è…¦çš„æ™‚é˜è¨å®šä¸æ£ç¢ºã€‚ +請到控制å°ç¢ºå®šæ™‚間和日期è¨å®šæ£ç¢ºã€‚ +ä¸¦æª¢æŸ¥ç¢ºå®šä½ çš„ç¶²è·¯å’Œé˜²ç«ç‰†è¨å®šæ£ç¢ºã€‚ +å¦‚æžœä½ ç¹¼çºŒçœ‹åˆ°é€™å€‹éŒ¯èª¤ï¼Œè«‹å‰å¾€SecondLife.com +網站的「支æ´ã€éƒ¨åˆ†æå ±å•é¡Œã€‚ + +[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 知è˜åº«] + </string> </strings>