diff options
Diffstat (limited to 'indra/newview')
142 files changed, 3729 insertions, 1107 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 546f8268d0..917513587c 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -13,6 +13,7 @@ include(ELFIO) include(FMOD) include(OPENAL) include(FindOpenGL) +include(JsonCpp) include(LLAudio) include(LLCharacter) include(LLCommon) @@ -44,6 +45,7 @@ include(CMakeCopyIfDifferent) include_directories( ${DBUSGLIB_INCLUDE_DIRS} ${ELFIO_INCLUDE_DIR} + ${JSONCPP_INCLUDE_DIRS} ${LLAUDIO_INCLUDE_DIRS} ${LLCHARACTER_INCLUDE_DIRS} ${LLCOMMON_INCLUDE_DIRS} @@ -82,6 +84,7 @@ set(viewer_SOURCE_FILES llappviewerlistener.cpp llassetuploadqueue.cpp llassetuploadresponders.cpp + llattachmentsmgr.cpp llaudiosourcevo.cpp llavataractions.cpp llavatariconctrl.cpp @@ -203,6 +206,7 @@ set(viewer_SOURCE_FILES llfloatersearch.cpp llfloatersellland.cpp llfloatersettingsdebug.cpp + llfloatersidetraytab.cpp llfloatersnapshot.cpp llfloatertelehub.cpp llfloatertestinspectors.cpp @@ -307,6 +311,7 @@ set(viewer_SOURCE_FILES lloutfitslist.cpp lloutfitobserver.cpp lloutputmonitorctrl.cpp + llpanelappearancetab.cpp llpanelavatar.cpp llpanelavatartag.cpp llpanelblockedlist.cpp @@ -455,6 +460,7 @@ set(viewer_SOURCE_FILES lltracker.cpp lltransientdockablefloater.cpp lltransientfloatermgr.cpp + lltranslate.cpp lluilistener.cpp lluploaddialog.cpp llurl.cpp @@ -603,6 +609,7 @@ set(viewer_HEADER_FILES llappviewerlistener.h llassetuploadqueue.h llassetuploadresponders.h + llattachmentsmgr.h llaudiosourcevo.h llavataractions.h llavatariconctrl.h @@ -726,6 +733,7 @@ set(viewer_HEADER_FILES llfloatersearch.h llfloatersellland.h llfloatersettingsdebug.h + llfloatersidetraytab.h llfloatersnapshot.h llfloatertelehub.h llfloatertestinspectors.h @@ -977,6 +985,7 @@ set(viewer_HEADER_FILES lltracker.h lltransientdockablefloater.h lltransientfloatermgr.h + lltranslate.h lluiconstants.h lluilistener.h lluploaddialog.h @@ -1474,6 +1483,7 @@ if (WINDOWS) ${GOOGLE_PERF_TOOLS_SOURCE} ${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt ${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt + ${CMAKE_CURRENT_SOURCE_DIR}/featuretable_xp.txt ${CMAKE_CURRENT_SOURCE_DIR}/dbghelp.dll ${CMAKE_CURRENT_SOURCE_DIR}/fmod.dll ${ARCH_PREBUILT_DIRS_RELEASE}/libeay32.dll @@ -1646,6 +1656,7 @@ target_link_libraries(${VIEWER_BINARY_NAME} ${OPENGL_LIBRARIES} ${FMODWRAPPER_LIBRARY} # must come after LLAudio ${OPENGL_LIBRARIES} + ${JSONCPP_LIBRARIES} ${SDL_LIBRARY} ${SMARTHEAP_LIBRARY} ${UI_LIBRARIES} diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 6285df31c0..2a0e23b1dc 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1147,6 +1147,17 @@ <key>Value</key> <string /> </map> + <key>CacheNumberOfRegionsForObjects</key> + <map> + <key>Comment</key> + <string>Controls number of regions to be cached for objects, ranges from 16 to 128.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>128</integer> + </map> <key>CacheSize</key> <map> <key>Comment</key> @@ -2677,6 +2688,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>DoubleClickTeleport</key> + <map> + <key>Comment</key> + <string>Enable double-click to teleport where allowed</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>DragAndDropToolTipDelay</key> <map> <key>Comment</key> @@ -8890,6 +8912,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>FriendsListShowPermissions</key> + <map> + <key>Comment</key> + <string>Show/hide permission icons in the friend list</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>NearbyListShowIcons</key> <map> <key>Comment</key> @@ -9847,6 +9880,28 @@ <key>Value</key> <integer>1</integer> </map> + <key>TranslateLanguage</key> + <map> + <key>Comment</key> + <string>Translate Language specifier</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>default</string> + </map> + <key>TranslateChat</key> + <map> + <key>Comment</key> + <string>Translate incoming chat messages</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>TutorialURL</key> <map> <key>Comment</key> diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index 9440e877df..e3fc9d4949 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -1,4 +1,4 @@ -version 22 +version 23 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences // Should be combined into one table @@ -81,7 +81,7 @@ RenderTerrainDetail 1 0 RenderTerrainLODFactor 1 1 RenderTreeLODFactor 1 0 RenderUseImpostors 1 1 -RenderVolumeLODFactor 1 0 +RenderVolumeLODFactor 1 0.5 VertexShaderEnable 1 0 WindLightUseAtmosShaders 1 0 WLSkyDetail 1 48 diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index 85b8564138..1bad7e5260 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -1,4 +1,4 @@ -version 21 +version 22 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences // Should be combined into one table @@ -80,7 +80,7 @@ RenderTerrainDetail 1 0 RenderTerrainLODFactor 1 1 RenderTreeLODFactor 1 0 RenderUseImpostors 1 1 -RenderVolumeLODFactor 1 0 +RenderVolumeLODFactor 1 0.5 VertexShaderEnable 1 0 WindLightUseAtmosShaders 1 0 WLSkyDetail 1 48 diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index 2095f3a81d..4fba47e3df 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -1,4 +1,4 @@ -version 21 +version 22 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences // Should be combined into one table @@ -81,7 +81,7 @@ RenderTerrainDetail 1 0 RenderTerrainLODFactor 1 1 RenderTreeLODFactor 1 0 RenderUseImpostors 1 1 -RenderVolumeLODFactor 1 0 +RenderVolumeLODFactor 1 0.5 RenderWaterReflections 1 0 VertexShaderEnable 1 0 WindLightUseAtmosShaders 1 0 diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt new file mode 100644 index 0000000000..9b901022c4 --- /dev/null +++ b/indra/newview/featuretable_xp.txt @@ -0,0 +1,554 @@ +version 23 + +// NOTE: This is mostly identical to featuretable_mac.txt with a few differences +// Should be combined into one table + +// +// Generates lists of feature mask that can be applied on top of each other. +// +// // Begin comments +// list <name> +// Starts a feature list named <name> +// <name> <available> <recommended> +// <name> is the name of a feature +// <available> is 0 or 1, whether the feature is available +// <recommended> is an F32 which is the recommended value +// +// For now, the first list read sets up all of the default values +// + + +// +// All contains everything at their default settings for high end machines +// NOTE: All settings are set to the MIN of applied values, including 'all'! +// +list all +RenderAnisotropic 1 1 +RenderAvatarCloth 1 1 +RenderAvatarLODFactor 1 1.0 +RenderAvatarMaxVisible 1 12 +RenderAvatarVP 1 1 +RenderCubeMap 1 1 +RenderDelayVBUpdate 1 0 +RenderFarClip 1 256 +RenderFlexTimeFactor 1 1.0 +RenderFogRatio 1 4.0 +RenderGamma 1 0 +RenderGlowResolutionPow 1 9 +RenderGround 1 1 +RenderMaxPartCount 1 8192 +RenderNightBrightness 1 1.0 +RenderObjectBump 1 1 +RenderReflectionDetail 1 4 +RenderTerrainDetail 1 1 +RenderTerrainLODFactor 1 2.0 +RenderTreeLODFactor 1 1.0 +RenderUseImpostors 1 1 +RenderVBOEnable 1 1 +RenderVolumeLODFactor 1 2.0 +UseStartScreen 1 1 +UseOcclusion 1 1 +VertexShaderEnable 1 1 +WindLightUseAtmosShaders 1 1 +WLSkyDetail 1 128 +Disregard128DefaultDrawDistance 1 1 +Disregard96DefaultDrawDistance 1 1 +RenderTextureMemoryMultiple 1 1.0 +RenderShaderLightingMaxLevel 1 3 +SkyUseClassicClouds 1 1 +RenderDeferred 1 0 +RenderDeferredSSAO 1 0 +RenderShadowDetail 1 0 +WatchdogDisabled 1 1 +RenderUseStreamVBO 1 1 + +// +// Low Graphics Settings +// +list Low +RenderAnisotropic 1 0 +RenderAvatarCloth 1 0 +RenderAvatarLODFactor 1 0 +RenderAvatarMaxVisible 1 3 +RenderAvatarVP 1 0 +RenderFarClip 1 64 +RenderFlexTimeFactor 1 0 +RenderGlowResolutionPow 1 8 +RenderMaxPartCount 1 0 +RenderObjectBump 1 0 +RenderReflectionDetail 1 0 +RenderTerrainDetail 1 0 +RenderTerrainLODFactor 1 1 +RenderTreeLODFactor 1 0 +RenderUseImpostors 1 1 +RenderVolumeLODFactor 1 0.5 +VertexShaderEnable 1 0 +WindLightUseAtmosShaders 1 0 +WLSkyDetail 1 48 +SkyUseClassicClouds 1 0 +RenderDeferred 1 0 +RenderDeferredSSAO 1 0 +RenderShadowDetail 1 0 + + +// +// Mid Graphics Settings +// +list Mid +RenderAnisotropic 1 0 +RenderAvatarCloth 1 0 +RenderAvatarLODFactor 1 0.5 +RenderAvatarVP 1 1 +RenderFarClip 1 96 +RenderFlexTimeFactor 1 1.0 +RenderGlowResolutionPow 1 8 +RenderMaxPartCount 1 2048 +RenderObjectBump 1 1 +RenderReflectionDetail 1 0 +RenderTerrainDetail 1 1 +RenderTerrainLODFactor 1 1.0 +RenderTreeLODFactor 1 0.5 +RenderUseImpostors 1 1 +RenderVolumeLODFactor 1 1.125 +VertexShaderEnable 1 1 +WindLightUseAtmosShaders 1 0 +WLSkyDetail 1 48 +RenderDeferred 1 0 +RenderDeferredSSAO 1 0 +RenderShadowDetail 1 0 + + +// +// High Graphics Settings (purty) +// +list High +RenderAnisotropic 1 1 +RenderAvatarCloth 1 0 +RenderAvatarLODFactor 1 1.0 +RenderAvatarVP 1 1 +RenderFarClip 1 128 +RenderFlexTimeFactor 1 1.0 +RenderGlowResolutionPow 1 9 +RenderMaxPartCount 1 4096 +RenderObjectBump 1 1 +RenderReflectionDetail 1 2 +RenderTerrainDetail 1 1 +RenderTerrainLODFactor 1 2.0 +RenderTreeLODFactor 1 0.5 +RenderUseImpostors 1 1 +RenderVolumeLODFactor 1 1.125 +VertexShaderEnable 1 1 +WindLightUseAtmosShaders 1 1 +WLSkyDetail 1 48 +RenderDeferred 1 0 +RenderDeferredSSAO 1 0 +RenderShadowDetail 1 0 + + +// +// Ultra graphics (REALLY PURTY!) +// +list Ultra +RenderAnisotropic 1 1 +RenderAvatarCloth 1 1 +RenderAvatarLODFactor 1 1.0 +RenderAvatarVP 1 1 +RenderFarClip 1 256 +RenderFlexTimeFactor 1 1.0 +RenderGlowResolutionPow 1 9 +RenderMaxPartCount 1 8192 +RenderObjectBump 1 1 +RenderReflectionDetail 1 4 +RenderTerrainDetail 1 1 +RenderTerrainLODFactor 1 2.0 +RenderTreeLODFactor 1 1.0 +RenderUseImpostors 1 1 +RenderVolumeLODFactor 1 2.0 +VertexShaderEnable 1 1 +WindLightUseAtmosShaders 1 1 +WLSkyDetail 1 128 +RenderDeferred 1 0 +RenderDeferredSSAO 1 0 +RenderShadowDetail 1 0 + +// +// Class Unknown Hardware (unknown) +// +list Unknown +RenderVBOEnable 1 0 + +// +// Class 0 Hardware (just old) +// +list Class0 +RenderVBOEnable 1 1 + +// +// Class 1 Hardware +// +list Class1 +RenderVBOEnable 1 1 + +// +// Class 2 Hardware (make it purty) +// +list Class2 +RenderVBOEnable 1 1 + +// +// Class 3 Hardware (make it purty) +// +list Class3 +RenderVBOEnable 1 1 + +// +// No Pixel Shaders available +// +list NoPixelShaders +RenderAvatarVP 0 0 +RenderAvatarCloth 0 0 +RenderReflectionDetail 0 0 +VertexShaderEnable 0 0 +WindLightUseAtmosShaders 0 0 +RenderDeferred 0 0 +RenderDeferredSSAO 0 0 +RenderShadowDetail 0 0 + +// +// No Vertex Shaders available +// +list NoVertexShaders +RenderAvatarVP 0 0 +RenderAvatarCloth 0 0 +RenderReflectionDetail 0 0 +VertexShaderEnable 0 0 +WindLightUseAtmosShaders 0 0 +RenderDeferred 0 0 +RenderDeferredSSAO 0 0 +RenderShadowDetail 0 0 + +// +// "Default" setups for safe, low, medium, high +// +list safe +RenderAnisotropic 1 0 +RenderAvatarCloth 0 0 +RenderAvatarVP 0 0 +RenderObjectBump 0 0 +RenderMaxPartCount 1 1024 +RenderTerrainDetail 1 0 +RenderUseImpostors 0 0 +RenderVBOEnable 1 0 +RenderReflectionDetail 0 0 +WindLightUseAtmosShaders 0 0 +RenderDeferred 0 0 +RenderDeferredSSAO 0 0 +RenderShadowDetail 0 0 + +// +// CPU based feature masks +// + +// 1Ghz or less (equiv) +list CPUSlow +RenderMaxPartCount 1 1024 + +// +// RAM based feature masks +// +list RAM256MB +RenderObjectBump 0 0 + +// +// Graphics card based feature masks +// +list OpenGLPre15 +RenderVBOEnable 1 0 + +list Intel +RenderAnisotropic 1 0 + +list GeForce2 +RenderAnisotropic 1 0 +RenderMaxPartCount 1 2048 +RenderTerrainDetail 1 0 +RenderVBOEnable 1 1 + +list SiS +UseOcclusion 0 0 + + +list Intel_830M +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 +RenderUseImpostors 0 0 + +list Intel_845G +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 +RenderUseImpostors 0 0 + +list Intel_855GM +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 +RenderUseImpostors 0 0 + +list Intel_865G +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 +RenderUseImpostors 0 0 + +list Intel_900 +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 +RenderUseImpostors 0 0 + +list Intel_915GM +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 +RenderUseImpostors 0 0 + +list Intel_915G +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 +RenderUseImpostors 0 0 + +list Intel_945GM +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_945G +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_950 +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_965 +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 +RenderUseImpostors 1 0 +UseOcclusion 0 0 + +list Intel_G33 +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_G45 +WindLightUseAtmosShaders 0 0 + +list Intel_Bear_Lake +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_Broadwater +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_Brookdale +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_Eaglelake +WindLightUseAtmosShaders 0 0 + +list Intel_Montara +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_Springdale +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + + +list ATI_FireGL_5200 +RenderVBOEnable 1 0 +WindLightUseAtmosShaders 0 0 + + +list ATI_Mobility_Radeon_7xxx +RenderVBOEnable 0 0 + +list ATI_Radeon_7xxx +RenderVBOEnable 0 0 + +list ATI_All-in-Wonder_Radeon +RenderVBOEnable 0 0 + +list ATI_All-in-Wonder_7500 +RenderVBOEnable 0 0 + +list ATI_Mobility_Radeon_9600 +Disregard96DefaultDrawDistance 1 0 + + +/// tweaked ATI to 96 Draw distance + +list ATI_Radeon_9000 +Disregard96DefaultDrawDistance 1 0 +list ATI_Radeon_9200 +Disregard96DefaultDrawDistance 1 0 +list ATI_Radeon_9500 +Disregard96DefaultDrawDistance 1 0 +list ATI_Radeon_9600 +Disregard96DefaultDrawDistance 1 0 + +/// tweaked ATI to 128 draw distance + +list ATI_Radeon_X300 +Disregard128DefaultDrawDistance 1 0 +RenderVBOEnable 1 0 +list ATI_Radeon_X400 +Disregard128DefaultDrawDistance 1 0 +RenderVBOEnable 1 0 +list ATI_Radeon_X500 +Disregard128DefaultDrawDistance 1 0 +RenderVBOEnable 1 0 +list ATI_Radeon_X600 +Disregard128DefaultDrawDistance 1 0 +RenderVBOEnable 1 0 +list ATI_Radeon_X700 +Disregard128DefaultDrawDistance 1 0 +RenderVBOEnable 1 0 +list ATI_Radeon_X1300 +Disregard128DefaultDrawDistance 1 0 +RenderVBOEnable 1 0 +UseStartScreen 0 0 +list ATI_Radeon_X1400 +Disregard128DefaultDrawDistance 1 0 +RenderVBOEnable 1 0 +list ATI_Radeon_X1500 +Disregard128DefaultDrawDistance 1 0 +RenderVBOEnable 1 0 +UseStartScreen 0 0 +list ATI_Radeon_X1600 +Disregard128DefaultDrawDistance 1 0 +RenderVBOEnable 1 0 +list ATI_Radeon_X1700 +Disregard128DefaultDrawDistance 1 0 +RenderVBOEnable 1 0 +list ATI_Mobility_Radeon_X1xxx +Disregard128DefaultDrawDistance 1 0 +RenderVBOEnable 1 0 + +list ATI_Radeon_HD_2300 +Disregard128DefaultDrawDistance 1 0 +list ATI_Radeon_HD_2400 +Disregard128DefaultDrawDistance 1 0 +list ATI_ASUS_AH24xx +Disregard128DefaultDrawDistance 1 0 + + +// Avatar hardware skinning causes invisible avatars +// on various ATI chipsets on drivers before 8.2 + +list ATIOldDriver +RenderAvatarVP 0 0 +RenderAvatarCloth 0 0 + +// ATI cards generally perform better when not using VBOs for streaming data + +list ATI +RenderUseStreamVBO 1 0 + +/// Tweaked NVIDIA + +list NVIDIA_GeForce_FX_5100 +Disregard96DefaultDrawDistance 1 0 +list NVIDIA_GeForce_FX_5200 +Disregard96DefaultDrawDistance 1 0 +list NVIDIA_GeForce_FX_5500 +Disregard96DefaultDrawDistance 1 0 +list NVIDIA_GeForce_FX_5600 +Disregard96DefaultDrawDistance 1 0 + +list NVIDIA_GeForce_FX_Go5100 +Disregard96DefaultDrawDistance 1 0 +list NVIDIA_GeForce_FX_Go5200 +Disregard96DefaultDrawDistance 1 0 +list NVIDIA_GeForce_FX_Go5300 +Disregard96DefaultDrawDistance 1 0 +list NVIDIA_GeForce_FX_Go5500 +Disregard96DefaultDrawDistance 1 0 +list NVIDIA_GeForce_FX_Go5600 +Disregard96DefaultDrawDistance 1 0 + +list NVIDIA_GeForce_6100 +Disregard128DefaultDrawDistance 1 0 +list NVIDIA_GeForce_6200 +Disregard128DefaultDrawDistance 1 0 +list NVIDIA_GeForce_6500 +Disregard128DefaultDrawDistance 1 0 +list NVIDIA_GeForce_6600 +Disregard128DefaultDrawDistance 1 0 + +list NVIDIA_G73 +Disregard128DefaultDrawDistance 1 0 + +list NVIDIA_GeForce_Go_6100 +RenderVBOEnable 1 0 +Disregard128DefaultDrawDistance 1 0 +list NVIDIA_GeForce_Go_6200 +RenderVBOEnable 1 0 +Disregard128DefaultDrawDistance 1 0 +list NVIDIA_GeForce_Go_6500 +RenderVBOEnable 1 0 +Disregard128DefaultDrawDistance 1 0 +list NVIDIA_GeForce_Go_6600 +RenderVBOEnable 1 0 +Disregard128DefaultDrawDistance 1 0 +list NVIDIA_GeForce_Go_6700 +RenderVBOEnable 1 0 +Disregard128DefaultDrawDistance 1 0 +list NVIDIA_GeForce_Go_6800 +RenderVBOEnable 1 0 +Disregard128DefaultDrawDistance 1 0 +list NVIDIA_GeForce_Go_6 +RenderVBOEnable 1 0 +Disregard128DefaultDrawDistance 1 0 + +list NVIDIA_GeForce_7000 +RenderShaderLightingMaxLevel 1 2 +list NVIDIA_GeForce_7100 +RenderShaderLightingMaxLevel 1 2 +list NVIDIA_GeForce_7200 +Disregard128DefaultDrawDistance 1 0 +RenderShaderLightingMaxLevel 1 2 +list NVIDIA_GeForce_7300 +Disregard128DefaultDrawDistance 1 0 +RenderShaderLightingMaxLevel 1 2 +list NVIDIA_GeForce_7400 +Disregard128DefaultDrawDistance 1 0 +RenderShaderLightingMaxLevel 1 2 +list NVIDIA_GeForce_7500 +RenderShaderLightingMaxLevel 1 2 +list NVIDIA_GeForce_7600 +RenderShaderLightingMaxLevel 1 2 +list NVIDIA_GeForce_7700 +RenderShaderLightingMaxLevel 1 2 +list NVIDIA_GeForce_7800 +RenderShaderLightingMaxLevel 1 2 +list NVIDIA_GeForce_7900 +RenderShaderLightingMaxLevel 1 2 + +list NVIDIA_GeForce_Go_7200 +Disregard128DefaultDrawDistance 1 0 +RenderShaderLightingMaxLevel 1 2 +list NVIDIA_GeForce_Go_7300 +Disregard128DefaultDrawDistance 1 0 +RenderShaderLightingMaxLevel 1 2 +list NVIDIA_GeForce_Go_7300_LE +RenderShaderLightingMaxLevel 1 2 +list NVIDIA_GeForce_Go_7400 +Disregard128DefaultDrawDistance 1 0 +RenderShaderLightingMaxLevel 1 2 +list NVIDIA_GeForce_Go_7600 +RenderShaderLightingMaxLevel 1 2 +list NVIDIA_GeForce_Go_7700 +RenderShaderLightingMaxLevel 1 2 +list NVIDIA_GeForce_Go_7800 +RenderShaderLightingMaxLevel 1 2 +list NVIDIA_GeForce_Go_7900 +RenderShaderLightingMaxLevel 1 2 + diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index fe7e883d83..b202cb5098 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -167,6 +167,7 @@ LLAgent::LLAgent() : mbAlwaysRun(false), mbRunning(false), + mbTeleportKeepsLookAt(false), mAgentAccess(gSavedSettings), mTeleportState( TELEPORT_NONE ), @@ -3249,7 +3250,11 @@ bool LLAgent::teleportCore(bool is_local) // local logic LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TELEPORT_COUNT); - if (!is_local) + if (is_local) + { + gAgent.setTeleportState( LLAgent::TELEPORT_LOCAL ); + } + else { gTeleportDisplay = TRUE; gAgent.setTeleportState( LLAgent::TELEPORT_START ); @@ -3268,13 +3273,15 @@ bool LLAgent::teleportCore(bool is_local) void LLAgent::teleportRequest( const U64& region_handle, - const LLVector3& pos_local) + const LLVector3& pos_local, + bool look_at_from_camera) { LLViewerRegion* regionp = getRegion(); - if(regionp && teleportCore()) + bool is_local = (region_handle == to_region_handle(getPositionGlobal())); + if(regionp && teleportCore(is_local)) { - llinfos << "TeleportRequest: '" << region_handle << "':" << pos_local - << llendl; + LL_INFOS("") << "TeleportLocationRequest: '" << region_handle << "':" + << pos_local << LL_ENDL; LLMessageSystem* msg = gMessageSystem; msg->newMessage("TeleportLocationRequest"); msg->nextBlockFast(_PREHASH_AgentData); @@ -3284,6 +3291,10 @@ void LLAgent::teleportRequest( msg->addU64("RegionHandle", region_handle); msg->addVector3("Position", pos_local); LLVector3 look_at(0,1,0); + if (look_at_from_camera) + { + look_at = LLViewerCamera::getInstance()->getAtAxis(); + } msg->addVector3("LookAt", look_at); sendReliableMessage(); } @@ -3395,6 +3406,16 @@ void LLAgent::teleportViaLocation(const LLVector3d& pos_global) } } +// Teleport to global position, but keep facing in the same direction +void LLAgent::teleportViaLocationLookAt(const LLVector3d& pos_global) +{ + mbTeleportKeepsLookAt = true; + gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); // detach camera form avatar, so it keeps direction + U64 region_handle = to_region_handle(pos_global); + LLVector3 pos_local = (LLVector3)(pos_global - from_region_handle(region_handle)); + teleportRequest(region_handle, pos_local, getTeleportKeepsLookAt()); +} + void LLAgent::setTeleportState(ETeleportState state) { mTeleportState = state; @@ -3402,18 +3423,28 @@ void LLAgent::setTeleportState(ETeleportState state) { LLFloaterReg::hideInstance("snapshot"); } - if (mTeleportState == TELEPORT_MOVING) - { - // We're outa here. Save "back" slurl. - LLAgentUI::buildSLURL(mTeleportSourceSLURL); - } - else if(mTeleportState == TELEPORT_ARRIVING) + + switch (mTeleportState) { - // First two position updates after a teleport tend to be weird - LLViewerStats::getInstance()->mAgentPositionSnaps.mCountOfNextUpdatesToIgnore = 2; + case TELEPORT_NONE: + mbTeleportKeepsLookAt = false; + break; + + case TELEPORT_MOVING: + // We're outa here. Save "back" slurl. + LLAgentUI::buildSLURL(mTeleportSourceSLURL); + break; - // Let the interested parties know we've teleported. - LLViewerParcelMgr::getInstance()->onTeleportFinished(false, getPositionGlobal()); + case TELEPORT_ARRIVING: + // First two position updates after a teleport tend to be weird + LLViewerStats::getInstance()->mAgentPositionSnaps.mCountOfNextUpdatesToIgnore = 2; + + // Let the interested parties know we've teleported. + LLViewerParcelMgr::getInstance()->onTeleportFinished(false, getPositionGlobal()); + break; + + default: + break; } } diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index c643cef78f..30685461b9 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -339,6 +339,7 @@ public: private: bool mbAlwaysRun; // Should the avatar run by default rather than walk? bool mbRunning; // Is the avatar trying to run right now? + bool mbTeleportKeepsLookAt; // Try to keep look-at after teleport is complete //-------------------------------------------------------------------- // Sit and stand @@ -506,7 +507,8 @@ public: TELEPORT_REQUESTED = 2, // Waiting for source simulator to respond TELEPORT_MOVING = 3, // Viewer has received destination location from source simulator TELEPORT_START_ARRIVAL = 4, // Transition to ARRIVING. Viewer has received avatar update, etc., from destination simulator - TELEPORT_ARRIVING = 5 // Make the user wait while content "pre-caches" + TELEPORT_ARRIVING = 5, // Make the user wait while content "pre-caches" + TELEPORT_LOCAL = 6 // Teleporting in-sim without showing the progress screen }; public: @@ -524,12 +526,15 @@ private: //-------------------------------------------------------------------- public: void teleportRequest(const U64& region_handle, - const LLVector3& pos_local); // Go to a named location home + const LLVector3& pos_local, // Go to a named location home + bool look_at_from_camera = false); void teleportViaLandmark(const LLUUID& landmark_id); // Teleport to a landmark void teleportHome() { teleportViaLandmark(LLUUID::null); } // Go home void teleportViaLure(const LLUUID& lure_id, BOOL godlike); // To an invited location void teleportViaLocation(const LLVector3d& pos_global); // To a global location - this will probably need to be deprecated + void teleportViaLocationLookAt(const LLVector3d& pos_global);// To a global location, preserving camera rotation void teleportCancel(); // May or may not be allowed by server + bool getTeleportKeepsLookAt() { return mbTeleportKeepsLookAt; } // Whether look-at reset after teleport protected: bool teleportCore(bool is_local = false); // Stuff for all teleports; returns true if the teleport can proceed diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index dd08e6c49a..055be4cae2 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -1882,7 +1882,7 @@ void LLAgentWearables::userAttachMultipleAttachments(LLInventoryModel::item_arra msg->nextBlockFast(_PREHASH_ObjectData ); msg->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID()); msg->addUUIDFast(_PREHASH_OwnerID, item->getPermissions().getOwner()); - msg->addU8Fast(_PREHASH_AttachmentPt, 0 ); // Wear at the previous or default attachment point + msg->addU8Fast(_PREHASH_AttachmentPt, 0 | ATTACHMENT_ADD); // Wear at the previous or default attachment point pack_permissions_slam(msg, item->getFlags(), item->getPermissions()); msg->addStringFast(_PREHASH_Name, item->getName()); msg->addStringFast(_PREHASH_Description, item->getDescription()); diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 7159d89d21..ed5e8ceee3 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -31,6 +31,7 @@ #include "llagentcamera.h" #include "llagentwearables.h" #include "llappearancemgr.h" +#include "llattachmentsmgr.h" #include "llcommandhandler.h" #include "lleventtimer.h" #include "llgesturemgr.h" @@ -2644,6 +2645,8 @@ LLAppearanceMgr::LLAppearanceMgr(): mUnlockOutfitTimer.reset(new LLOutfitUnLockTimer(gSavedSettings.getS32( "OutfitOperationsTimeout"))); + + gIdleCallbacks.addFunction(&LLAttachmentsMgr::onIdle,NULL); } LLAppearanceMgr::~LLAppearanceMgr() diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index d383c9adbc..5e75237180 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -929,8 +929,9 @@ bool LLAppViewer::init() //EXT-7013 - On windows for some locale (Japanese) standard //datetime formatting functions didn't support some parameters such as "weekday". + //Names for days and months localized in xml are also useful for Polish locale(STORM-107). std::string language = LLControlGroup::getInstance(sGlobalSettingsName)->getString("Language"); - if(language == "ja") + if(language == "ja" || language == "pl") { LLStringOps::setupWeekDaysNames(LLTrans::getString("dateTimeWeekdaysNames")); LLStringOps::setupWeekDaysShortNames(LLTrans::getString("dateTimeWeekdaysShortNames")); @@ -3026,14 +3027,6 @@ void LLAppViewer::migrateCacheDirectory() #endif // LL_WINDOWS || LL_DARWIN } -//static -S32 LLAppViewer::getCacheVersion() -{ - static const S32 cache_version = 7; - - return cache_version ; -} - void dumpVFSCaches() { llinfos << "======= Static VFS ========" << llendl; @@ -3072,23 +3065,40 @@ void dumpVFSCaches() SetCurrentDirectory(w_str); #endif } + +//static +U32 LLAppViewer::getTextureCacheVersion() +{ + //viewer texture cache version, change if the texture cache format changes. + const U32 TEXTURE_CACHE_VERSION = 7; + + return TEXTURE_CACHE_VERSION ; +} + +//static +U32 LLAppViewer::getObjectCacheVersion() +{ + // Viewer object cache version, change if object update + // format changes. JC + const U32 INDRA_OBJECT_CACHE_VERSION = 14; + + return INDRA_OBJECT_CACHE_VERSION; +} + bool LLAppViewer::initCache() { mPurgeCache = false; - BOOL disable_texture_cache = FALSE ; BOOL read_only = mSecondInstance ? TRUE : FALSE; LLAppViewer::getTextureCache()->setReadOnly(read_only) ; + LLVOCache::getInstance()->setReadOnly(read_only); - if (gSavedSettings.getS32("LocalCacheVersion") != LLAppViewer::getCacheVersion()) + BOOL texture_cache_mismatch = FALSE ; + if (gSavedSettings.getS32("LocalCacheVersion") != LLAppViewer::getTextureCacheVersion()) { - if(read_only) + texture_cache_mismatch = TRUE ; + if(!read_only) { - disable_texture_cache = TRUE ; //if the cache version of this viewer is different from the running one, this viewer can not use the texture cache. - } - else - { - mPurgeCache = true; // Purge cache if the version number is different. - gSavedSettings.setS32("LocalCacheVersion", LLAppViewer::getCacheVersion()); + gSavedSettings.setS32("LocalCacheVersion", LLAppViewer::getTextureCacheVersion()); } } @@ -3139,9 +3149,11 @@ bool LLAppViewer::initCache() const S64 MAX_CACHE_SIZE = 1024*MB; cache_size = llmin(cache_size, MAX_CACHE_SIZE); S64 texture_cache_size = ((cache_size * 8)/10); - S64 extra = LLAppViewer::getTextureCache()->initCache(LL_PATH_CACHE, texture_cache_size, disable_texture_cache); + S64 extra = LLAppViewer::getTextureCache()->initCache(LL_PATH_CACHE, texture_cache_size, texture_cache_mismatch); texture_cache_size -= extra; + LLVOCache::getInstance()->initCache(LL_PATH_CACHE, gSavedSettings.getU32("CacheNumberOfRegionsForObjects"), getObjectCacheVersion()) ; + LLSplashScreen::update(LLTrans::getString("StartupInitializingVFS")); // Init the VFS @@ -3304,6 +3316,7 @@ void LLAppViewer::purgeCache() { LL_INFOS("AppCache") << "Purging Cache and Texture Cache..." << llendl; LLAppViewer::getTextureCache()->purgeCache(LL_PATH_CACHE); + LLVOCache::getInstance()->removeCache(LL_PATH_CACHE); std::string mask = gDirUtilp->getDirDelimiter() + "*.*"; gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""),mask); } diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 1fcf38d18a..c5cac6827c 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -94,7 +94,8 @@ public: static LLImageDecodeThread* getImageDecodeThread() { return sImageDecodeThread; } static LLTextureFetch* getTextureFetch() { return sTextureFetch; } - static S32 getCacheVersion() ; + static U32 getTextureCacheVersion() ; + static U32 getObjectCacheVersion() ; const std::string& getSerialNumber() { return mSerialNumber; } diff --git a/indra/newview/llattachmentsmgr.cpp b/indra/newview/llattachmentsmgr.cpp new file mode 100644 index 0000000000..c9543988a6 --- /dev/null +++ b/indra/newview/llattachmentsmgr.cpp @@ -0,0 +1,131 @@ +/** + * @file llattachmentsmgr.cpp + * @brief Manager for initiating attachments changes on the viewer + * + * $LicenseInfo:firstyear=2004&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, 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 "llattachmentsmgr.h" + +#include "llagent.h" +#include "llinventorymodel.h" +#include "lltooldraganddrop.h" // pack_permissions_slam +#include "llviewerinventory.h" +#include "llviewerregion.h" +#include "message.h" + + +LLAttachmentsMgr::LLAttachmentsMgr() +{ +} + +LLAttachmentsMgr::~LLAttachmentsMgr() +{ +} + +void LLAttachmentsMgr::addAttachment(const LLUUID& item_id, + const U8 attachment_pt, + const BOOL add) +{ + AttachmentsInfo attachment; + attachment.mItemID = item_id; + attachment.mAttachmentPt = attachment_pt; + attachment.mAdd = add; + mPendingAttachments.push_back(attachment); +} + +// static +void LLAttachmentsMgr::onIdle(void *) +{ + LLAttachmentsMgr::instance().onIdle(); +} + +void LLAttachmentsMgr::onIdle() +{ + S32 obj_count = mPendingAttachments.size(); + if (obj_count == 0) + { + return; + } + + // Limit number of packets to send + const S32 MAX_PACKETS_TO_SEND = 10; + const S32 OBJECTS_PER_PACKET = 4; + const S32 MAX_OBJECTS_TO_SEND = MAX_PACKETS_TO_SEND * OBJECTS_PER_PACKET; + if( obj_count > MAX_OBJECTS_TO_SEND ) + { + obj_count = MAX_OBJECTS_TO_SEND; + } + + LLUUID compound_msg_id; + compound_msg_id.generate(); + LLMessageSystem* msg = gMessageSystem; + + + S32 i = 0; + for (attachments_vec_t::const_iterator iter = mPendingAttachments.begin(); + iter != mPendingAttachments.end(); + ++iter) + { + if( 0 == (i % OBJECTS_PER_PACKET) ) + { + // Start a new message chunk + msg->newMessageFast(_PREHASH_RezMultipleAttachmentsFromInv); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_HeaderData); + msg->addUUIDFast(_PREHASH_CompoundMsgID, compound_msg_id ); + msg->addU8Fast(_PREHASH_TotalObjects, obj_count ); + msg->addBOOLFast(_PREHASH_FirstDetachAll, false ); + } + + const AttachmentsInfo &attachment = (*iter); + LLViewerInventoryItem* item = gInventory.getItem(attachment.mItemID); + if (!item) + { + llinfos << "Attempted to add non-existant item ID:" << attachment.mItemID << llendl; + continue; + } + S32 attachment_pt = attachment.mAttachmentPt; + if (attachment.mAdd) + attachment_pt |= ATTACHMENT_ADD; + + msg->nextBlockFast(_PREHASH_ObjectData ); + msg->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID()); + msg->addUUIDFast(_PREHASH_OwnerID, item->getPermissions().getOwner()); + msg->addU8Fast(_PREHASH_AttachmentPt, attachment_pt); + pack_permissions_slam(msg, item->getFlags(), item->getPermissions()); + msg->addStringFast(_PREHASH_Name, item->getName()); + msg->addStringFast(_PREHASH_Description, item->getDescription()); + + if( (i+1 == obj_count) || ((OBJECTS_PER_PACKET-1) == (i % OBJECTS_PER_PACKET)) ) + { + // End of message chunk + msg->sendReliable( gAgent.getRegion()->getHost() ); + } + i++; + } + + mPendingAttachments.clear(); +} diff --git a/indra/newview/llattachmentsmgr.h b/indra/newview/llattachmentsmgr.h new file mode 100644 index 0000000000..1d8ab74dfd --- /dev/null +++ b/indra/newview/llattachmentsmgr.h @@ -0,0 +1,73 @@ +/** + * @file llattachmentsmgr.h + * @brief Batches up attachment requests and sends them all + * in one message. + * + * $LicenseInfo:firstyear=2004&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, 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_LLATTACHMENTSMGR_H +#define LL_LLATTACHMENTSMGR_H + +#include "llsingleton.h" + +class LLViewerInventoryItem; + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// LLAttachmentsMgr +// +// The sole purpose of this class is to take attachment +// requests, queue them up, and send them all at once. +// This handles situations where the viewer may request +// a bunch of attachments at once in a short period of +// time, where each of the requests would normally be +// sent as a separate message versus being batched into +// one single message. +// +// The intent of this batching is to reduce viewer->server +// traffic. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLAttachmentsMgr: public LLSingleton<LLAttachmentsMgr> +{ +public: + LLAttachmentsMgr(); + virtual ~LLAttachmentsMgr(); + + void addAttachment(const LLUUID& item_id, + const U8 attachment_pt, + const BOOL add); + static void onIdle(void *); +protected: + void onIdle(); +private: + struct AttachmentsInfo + { + LLUUID mItemID; + U8 mAttachmentPt; + BOOL mAdd; + }; + + typedef std::vector<AttachmentsInfo> attachments_vec_t; + attachments_vec_t mPendingAttachments; +}; + +#endif diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 1cd705c2f9..5241f20c0e 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -90,6 +90,20 @@ void LLAvatarList::setSpeakingIndicatorsVisible(bool visible) } } +void LLAvatarList::showPermissions(bool visible) +{ + // Save the value for new items to use. + mShowPermissions = visible; + + // Enable or disable showing permissions icons for all existing items. + std::vector<LLPanel*> items; + getItems(items); + for(std::vector<LLPanel*>::const_iterator it = items.begin(), end_it = items.end(); it != end_it; ++it) + { + static_cast<LLAvatarListItem*>(*it)->setShowPermissions(mShowPermissions); + } +} + static bool findInsensitive(std::string haystack, const std::string& needle_upper) { LLStringUtil::toUpper(haystack); @@ -107,6 +121,7 @@ LLAvatarList::Params::Params() , show_info_btn("show_info_btn", true) , show_profile_btn("show_profile_btn", true) , show_speaking_indicator("show_speaking_indicator", true) +, show_permissions_granted("show_permissions_granted", false) { } @@ -121,6 +136,7 @@ LLAvatarList::LLAvatarList(const Params& p) , mShowInfoBtn(p.show_info_btn) , mShowProfileBtn(p.show_profile_btn) , mShowSpeakingIndicator(p.show_speaking_indicator) +, mShowPermissions(p.show_permissions_granted) { setCommitOnSelectionChange(true); @@ -377,6 +393,7 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is item->setShowInfoBtn(mShowInfoBtn); item->setShowProfileBtn(mShowProfileBtn); item->showSpeakingIndicator(mShowSpeakingIndicator); + item->setShowPermissions(mShowPermissions); item->setDoubleClickCallback(boost::bind(&LLAvatarList::onItemDoubleClicked, this, _1, _2, _3, _4)); diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index 83faa53c28..9d3dcb75f3 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -54,7 +54,8 @@ public: show_last_interaction_time, // show most recent interaction time. *HACK: move this to a derived class show_info_btn, show_profile_btn, - show_speaking_indicator; + show_speaking_indicator, + show_permissions_granted; Params(); }; @@ -78,6 +79,7 @@ public: void toggleIcons(); void setSpeakingIndicatorsVisible(bool visible); + void showPermissions(bool visible); void sortByName(); void setShowIcons(std::string param_name); bool getIconsVisible() const { return mShowIcons; } @@ -115,6 +117,7 @@ private: bool mShowInfoBtn; bool mShowProfileBtn; bool mShowSpeakingIndicator; + bool mShowPermissions; LLTimer* mLITUpdateTimer; // last interaction time update timer std::string mIconParamName; diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index 341913edf7..8fc4ad6763 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -60,12 +60,17 @@ LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/) mAvatarIcon(NULL), mAvatarName(NULL), mLastInteractionTime(NULL), + mIconPermissionOnline(NULL), + mIconPermissionMap(NULL), + mIconPermissionEditMine(NULL), + mIconPermissionEditTheirs(NULL), mSpeakingIndicator(NULL), mInfoBtn(NULL), mProfileBtn(NULL), mOnlineStatus(E_UNKNOWN), mShowInfoBtn(true), - mShowProfileBtn(true) + mShowProfileBtn(true), + mShowPermissions(false) { if (not_from_ui_factory) { @@ -86,7 +91,16 @@ BOOL LLAvatarListItem::postBuild() mAvatarIcon = getChild<LLAvatarIconCtrl>("avatar_icon"); mAvatarName = getChild<LLTextBox>("avatar_name"); mLastInteractionTime = getChild<LLTextBox>("last_interaction"); - + + mIconPermissionOnline = getChild<LLIconCtrl>("permission_online_icon"); + mIconPermissionMap = getChild<LLIconCtrl>("permission_map_icon"); + mIconPermissionEditMine = getChild<LLIconCtrl>("permission_edit_mine_icon"); + mIconPermissionEditTheirs = getChild<LLIconCtrl>("permission_edit_theirs_icon"); + mIconPermissionOnline->setVisible(false); + mIconPermissionMap->setVisible(false); + mIconPermissionEditMine->setVisible(false); + mIconPermissionEditTheirs->setVisible(false); + mSpeakingIndicator = getChild<LLOutputMonitorCtrl>("speaking_indicator"); mInfoBtn = getChild<LLButton>("info_btn"); mProfileBtn = getChild<LLButton>("profile_btn"); @@ -125,8 +139,10 @@ void LLAvatarListItem::onMouseEnter(S32 x, S32 y, MASK mask) mInfoBtn->setVisible(mShowInfoBtn); mProfileBtn->setVisible(mShowProfileBtn); + mHovered = true; LLPanel::onMouseEnter(x, y, mask); + showPermissions(mShowPermissions); updateChildren(); } @@ -136,8 +152,10 @@ void LLAvatarListItem::onMouseLeave(S32 x, S32 y, MASK mask) mInfoBtn->setVisible(false); mProfileBtn->setVisible(false); + mHovered = false; LLPanel::onMouseLeave(x, y, mask); + showPermissions(false); updateChildren(); } @@ -146,6 +164,12 @@ void LLAvatarListItem::changed(U32 mask) { // no need to check mAvatarId for null in this case setOnline(LLAvatarTracker::instance().isBuddyOnline(mAvatarId)); + + if (mask & LLFriendObserver::POWERS) + { + showPermissions(mShowPermissions && mHovered); + updateChildren(); + } } void LLAvatarListItem::setOnline(bool online) @@ -230,10 +254,7 @@ void LLAvatarListItem::setAvatarId(const LLUUID& id, const LLUUID& session_id, b void LLAvatarListItem::showLastInteractionTime(bool show) { - if (show) - return; - - mLastInteractionTime->setVisible(false); + mLastInteractionTime->setVisible(show); updateChildren(); } @@ -244,17 +265,11 @@ void LLAvatarListItem::setLastInteractionTime(U32 secs_since) void LLAvatarListItem::setShowInfoBtn(bool show) { - // Already done? Then do nothing. - if(mShowInfoBtn == show) - return; mShowInfoBtn = show; } void LLAvatarListItem::setShowProfileBtn(bool show) { - // Already done? Then do nothing. - if(mShowProfileBtn == show) - return; mShowProfileBtn = show; } @@ -273,7 +288,9 @@ void LLAvatarListItem::setAvatarIconVisible(bool visible) { // Already done? Then do nothing. if (mAvatarIcon->getVisible() == (BOOL)visible) + { return; + } // Show/hide avatar icon. mAvatarIcon->setVisible(visible); @@ -322,7 +339,7 @@ const std::string LLAvatarListItem::getAvatarName() const return mAvatarName->getValue(); } -//== PRIVATE SECITON ========================================================== +//== PRIVATE SECTION ========================================================== void LLAvatarListItem::setNameInternal(const std::string& name, const std::string& highlight) { @@ -432,10 +449,22 @@ void LLAvatarListItem::initChildrenWidths(LLAvatarListItem* avatar_item) //info btn width + padding S32 info_btn_width = avatar_item->mProfileBtn->getRect().mLeft - avatar_item->mInfoBtn->getRect().mLeft; + // edit their objects permission icon width + padding + S32 permission_edit_theirs_width = avatar_item->mInfoBtn->getRect().mLeft - avatar_item->mIconPermissionEditTheirs->getRect().mLeft; + + // edit my objects permission icon width + padding + S32 permission_edit_mine_width = avatar_item->mIconPermissionEditTheirs->getRect().mLeft - avatar_item->mIconPermissionEditMine->getRect().mLeft; + + // map permission icon width + padding + S32 permission_map_width = avatar_item->mIconPermissionEditMine->getRect().mLeft - avatar_item->mIconPermissionMap->getRect().mLeft; + + // online permission icon width + padding + S32 permission_online_width = avatar_item->mIconPermissionMap->getRect().mLeft - avatar_item->mIconPermissionOnline->getRect().mLeft; + // last interaction time textbox width + padding - S32 last_interaction_time_width = avatar_item->mInfoBtn->getRect().mLeft - avatar_item->mLastInteractionTime->getRect().mLeft; + S32 last_interaction_time_width = avatar_item->mIconPermissionOnline->getRect().mLeft - avatar_item->mLastInteractionTime->getRect().mLeft; - // icon width + padding + // avatar icon width + padding S32 icon_width = avatar_item->mAvatarName->getRect().mLeft - avatar_item->mAvatarIcon->getRect().mLeft; sLeftPadding = avatar_item->mAvatarIcon->getRect().mLeft; @@ -445,9 +474,14 @@ void LLAvatarListItem::initChildrenWidths(LLAvatarListItem* avatar_item) sChildrenWidths[--index] = icon_width; sChildrenWidths[--index] = 0; // for avatar name we don't need its width, it will be calculated as "left available space" sChildrenWidths[--index] = last_interaction_time_width; + sChildrenWidths[--index] = permission_online_width; + sChildrenWidths[--index] = permission_map_width; + sChildrenWidths[--index] = permission_edit_mine_width; + sChildrenWidths[--index] = permission_edit_theirs_width; sChildrenWidths[--index] = info_btn_width; sChildrenWidths[--index] = profile_btn_width; sChildrenWidths[--index] = speaking_indicator_width; + llassert(index == 0); } void LLAvatarListItem::updateChildren() @@ -526,6 +560,27 @@ void LLAvatarListItem::updateChildren() LL_DEBUGS("AvatarItemReshape") << "name rect after: " << name_view_rect << LL_ENDL; } +bool LLAvatarListItem::showPermissions(bool visible) +{ + const LLRelationship* relation = LLAvatarTracker::instance().getBuddyInfo(getAvatarId()); + if(relation && visible) + { + mIconPermissionOnline->setVisible(relation->isRightGrantedTo(LLRelationship::GRANT_ONLINE_STATUS)); + mIconPermissionMap->setVisible(relation->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION)); + mIconPermissionEditMine->setVisible(relation->isRightGrantedTo(LLRelationship::GRANT_MODIFY_OBJECTS)); + mIconPermissionEditTheirs->setVisible(relation->isRightGrantedFrom(LLRelationship::GRANT_MODIFY_OBJECTS)); + } + else + { + mIconPermissionOnline->setVisible(false); + mIconPermissionMap->setVisible(false); + mIconPermissionEditMine->setVisible(false); + mIconPermissionEditTheirs->setVisible(false); + } + + return NULL != relation; +} + LLView* LLAvatarListItem::getItemChildView(EAvatarListItemChildIndex child_view_index) { LLView* child_view = mAvatarName; @@ -542,7 +597,19 @@ LLView* LLAvatarListItem::getItemChildView(EAvatarListItemChildIndex child_view_ child_view = mLastInteractionTime; break; case ALIC_SPEAKER_INDICATOR: - child_view = mSpeakingIndicator; + child_view = mSpeakingIndicator; + break; + case ALIC_PERMISSION_ONLINE: + child_view = mIconPermissionOnline; + break; + case ALIC_PERMISSION_MAP: + child_view = mIconPermissionMap; + break; + case ALIC_PERMISSION_EDIT_MINE: + child_view = mIconPermissionEditMine; + break; + case ALIC_PERMISSION_EDIT_THEIRS: + child_view = mIconPermissionEditTheirs; break; case ALIC_INFO_BUTTON: child_view = mInfoBtn; diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h index e252e69ea9..ffb988b2ab 100644 --- a/indra/newview/llavatarlistitem.h +++ b/indra/newview/llavatarlistitem.h @@ -36,6 +36,7 @@ #include "llcallingcard.h" // for LLFriendObserver class LLAvatarIconCtrl; +class LLIconCtrl; class LLAvatarListItem : public LLPanel, public LLFriendObserver { @@ -94,6 +95,7 @@ public: void setShowProfileBtn(bool show); void setShowInfoBtn(bool show); void showSpeakingIndicator(bool show); + void setShowPermissions(bool show) { mShowPermissions = show; }; void showLastInteractionTime(bool show); void setAvatarIconVisible(bool visible); @@ -113,6 +115,15 @@ protected: LLAvatarIconCtrl* mAvatarIcon; + /// Indicator for permission to see me online. + LLIconCtrl* mIconPermissionOnline; + /// Indicator for permission to see my position on the map. + LLIconCtrl* mIconPermissionMap; + /// Indicator for permission to edit my objects. + LLIconCtrl* mIconPermissionEditMine; + /// Indicator for permission to edit their objects. + LLIconCtrl* mIconPermissionEditTheirs; + private: typedef enum e_online_status { @@ -132,6 +143,10 @@ private: ALIC_SPEAKER_INDICATOR, ALIC_PROFILE_BUTTON, ALIC_INFO_BUTTON, + ALIC_PERMISSION_EDIT_THEIRS, + ALIC_PERMISSION_EDIT_MINE, + ALIC_PERMISSION_MAP, + ALIC_PERMISSION_ONLINE, ALIC_INTERACTION_TIME, ALIC_NAME, ALIC_ICON, @@ -159,6 +174,13 @@ private: void updateChildren(); /** + * Update visibility of active permissions icons. + * + * Need to call updateChildren() afterwards to sort out their layout. + */ + bool showPermissions(bool visible); + + /** * Gets child view specified by index. * * This method implemented via switch by all EAvatarListItemChildIndex values. @@ -181,6 +203,12 @@ private: bool mShowInfoBtn; bool mShowProfileBtn; + /// indicates whether to show icons representing permissions granted + bool mShowPermissions; + + /// true when the mouse pointer is hovering over this item + bool mHovered; + static bool sStaticInitialized; // this variable is introduced to improve code readability static S32 sLeftPadding; // padding to first left visible child (icon or name) static S32 sRightNamePadding; // right padding from name to next visible child diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index f3ade83d00..29f4311ea4 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -67,7 +67,7 @@ BOOL LLBottomtrayButton::handleHover(S32 x, S32 y, MASK mask) S32 screenX, screenY; localPointToScreen(x, y, &screenX, &screenY); // pass hover to bottomtray - LLBottomTray::getInstance()->handleHover(screenX, screenY, mask); + LLBottomTray::getInstance()->onDraggableButtonHover(screenX, screenY); return FALSE; } //virtual @@ -76,7 +76,7 @@ BOOL LLBottomtrayButton::handleMouseUp(S32 x, S32 y, MASK mask) S32 screenX, screenY; localPointToScreen(x, y, &screenX, &screenY); // pass mouse up to bottomtray - LLBottomTray::getInstance()->onDraggableButtonMouseUp(this,screenX, screenY, mask); + LLBottomTray::getInstance()->onDraggableButtonMouseUp(this, screenX, screenY); LLButton::handleMouseUp(x, y, mask); return FALSE; } @@ -86,7 +86,7 @@ BOOL LLBottomtrayButton::handleMouseDown(S32 x, S32 y, MASK mask) S32 screenX, screenY; localPointToScreen(x, y, &screenX, &screenY); // pass mouse up to bottomtray - LLBottomTray::getInstance()->onDraggableButtonMouseDown(this,screenX, screenY, mask); + LLBottomTray::getInstance()->onDraggableButtonMouseDown(this, screenX, screenY); LLButton::handleMouseDown(x, y, mask); return FALSE; } @@ -561,7 +561,7 @@ BOOL LLBottomTray::postBuild() //Drag-n-drop -void LLBottomTray::onDraggableButtonMouseDown(LLUICtrl* ctrl, S32 x, S32 y, MASK mask) +void LLBottomTray::onDraggableButtonMouseDown(LLUICtrl* ctrl, S32 x, S32 y) { if (ctrl == NULL) return; LLView* parent_view = ctrl->getParent(); @@ -607,7 +607,7 @@ LLPanel* LLBottomTray::findChildPanelByLocalCoords(S32 x, S32 y) return ctrl; } -BOOL LLBottomTray::handleHover(S32 x, S32 y, MASK mask) +void LLBottomTray::onDraggableButtonHover(S32 x, S32 y) { // if mouse down on draggable item was done, check whether we should start DnD if (mCheckForDrag) @@ -634,8 +634,6 @@ BOOL LLBottomTray::handleHover(S32 x, S32 y, MASK mask) gViewerWindow->getWindow()->setCursor(UI_CURSOR_NO); } } - - return TRUE; } bool LLBottomTray::isCursorOverDraggableArea(S32 x, S32 y) @@ -767,7 +765,7 @@ void LLBottomTray::loadButtonsOrder() mToolbarStack->movePanel(mNearbyChatBar, NULL, true); } -void LLBottomTray::onDraggableButtonMouseUp(LLUICtrl* ctrl, S32 x, S32 y, MASK mask) +void LLBottomTray::onDraggableButtonMouseUp(LLUICtrl* ctrl, S32 x, S32 y) { //if mouse up happened over area where drop is possible, change order of buttons if (mLandingTab != NULL && mDraggedItem != NULL && mDragStarted) @@ -1526,7 +1524,7 @@ void LLBottomTray::setButtonsControlsAndListeners() // set control name for Build button. It is not enough to link it with Button.SetFloaterToggle in xml std::string vis_control_name = LLFloaterReg::declareVisibilityControl("build"); // Set the button control value (toggle state) to the floater visibility control (Sets the value as well) - build_btn->setControlVariable(LLUI::sSettingGroups["floater"]->getControl(vis_control_name)); + build_btn->setControlVariable(LLFloater::getControlGroup()->getControl(vis_control_name)); } bool LLBottomTray::toggleShowButton(LLBottomTray::EResizeState button_type, const LLSD& new_visibility) diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index 14a29895f5..1197c5a10a 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -131,10 +131,12 @@ public: /** * These three methods handle drag'n'drop, they may be called directly from child buttons. + * handleHover and other virtual handle* couldn't be used here, because we should call LLPanel::handle*, + * but x and y here are often outside of bottomtray. */ - /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); - void onDraggableButtonMouseDown(LLUICtrl* button, S32 x, S32 y, MASK mask); - void onDraggableButtonMouseUp(LLUICtrl* button, S32 x, S32 y, MASK mask); + void onDraggableButtonHover(S32 x, S32 y); + void onDraggableButtonMouseDown(LLUICtrl* button, S32 x, S32 y); + void onDraggableButtonMouseUp(LLUICtrl* button, S32 x, S32 y); private: diff --git a/indra/newview/llcallingcard.h b/indra/newview/llcallingcard.h index 617f8fe27b..15ca51743a 100644 --- a/indra/newview/llcallingcard.h +++ b/indra/newview/llcallingcard.h @@ -45,7 +45,7 @@ class LLFriendObserver public: // This enumeration is a way to refer to what changed in a more // human readable format. You can mask the value provided by - // chaged() to see if the observer is interested in the change. + // changed() to see if the observer is interested in the change. enum { NONE = 0, diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp index 7d82ec3a71..d251931eca 100644 --- a/indra/newview/llchatbar.cpp +++ b/indra/newview/llchatbar.cpp @@ -126,7 +126,7 @@ BOOL LLChatBar::postBuild() mInputEditor->setPassDelete(TRUE); mInputEditor->setReplaceNewlinesWithSpaces(FALSE); - mInputEditor->setMaxTextLength(1023); + mInputEditor->setMaxTextLength(DB_CHAT_MSG_STR_LEN); mInputEditor->setEnableLineHistory(TRUE); mIsBuilt = TRUE; @@ -569,8 +569,12 @@ void LLChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL S32 channel = 0; LLWString out_text = stripChannelNumber(wtext, &channel); std::string utf8_out_text = wstring_to_utf8str(out_text); - std::string utf8_text = wstring_to_utf8str(wtext); + if (!utf8_out_text.empty()) + { + utf8_out_text = utf8str_truncate(utf8_out_text, MAX_MSG_STR_LEN); + } + std::string utf8_text = wstring_to_utf8str(wtext); utf8_text = utf8str_trim(utf8_text); if (!utf8_text.empty()) { diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 1f67a659bd..dfb1db523d 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -760,7 +760,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL if (notification != NULL) { LLIMToastNotifyPanel* notify_box = new LLIMToastNotifyPanel( - notification, chat.mSessionID); + notification, chat.mSessionID, LLRect::null, !use_plain_text_chat_history); //we can't set follows in xml since it broke toasts behavior notify_box->setFollowsLeft(); notify_box->setFollowsRight(); diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp index b1e11e1a2a..84c560639e 100644 --- a/indra/newview/llcofwearables.cpp +++ b/indra/newview/llcofwearables.cpp @@ -397,12 +397,20 @@ void LLCOFWearables::refresh() mCOFVersion = catp->getVersion(); + // Save current scrollbar position. + typedef std::map<LLFlatListView*, LLRect> scroll_pos_map_t; + scroll_pos_map_t saved_scroll_pos; + + saved_scroll_pos[mAttachments] = mAttachments->getVisibleContentRect(); + saved_scroll_pos[mClothing] = mClothing->getVisibleContentRect(); + saved_scroll_pos[mBodyParts] = mBodyParts->getVisibleContentRect(); + + // Save current selection. typedef std::vector<LLSD> values_vector_t; typedef std::map<LLFlatListView*, values_vector_t> selection_map_t; selection_map_t preserve_selection; - // Save current selection mAttachments->getSelectedValues(preserve_selection[mAttachments]); mClothing->getSelectedValues(preserve_selection[mClothing]); mBodyParts->getSelectedValues(preserve_selection[mBodyParts]); @@ -450,6 +458,15 @@ void LLCOFWearables::refresh() list->setCommitOnSelectionChange(true); } + + // Restore previous scrollbar position. + for (scroll_pos_map_t::const_iterator it = saved_scroll_pos.begin(); it != saved_scroll_pos.end(); ++it) + { + LLFlatListView* list = it->first; + LLRect scroll_pos = it->second; + + list->scrollToShowRect(scroll_pos); + } } diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp index ed35546ca3..a3d2941114 100644 --- a/indra/newview/lldynamictexture.cpp +++ b/indra/newview/lldynamictexture.cpp @@ -54,6 +54,13 @@ LLViewerDynamicTexture::LLViewerDynamicTexture(S32 width, S32 height, S32 compon { llassert((1 <= components) && (components <= 4)); + if(gGLManager.mDebugGPU) + { + if(components == 3) + { + mComponents = 4 ; //convert to 32bits. + } + } generateGLTexture(); llassert( 0 <= order && order < ORDER_COUNT ); diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp index f0c2469977..5e10f60aba 100644 --- a/indra/newview/llexpandabletextbox.cpp +++ b/indra/newview/llexpandabletextbox.cpp @@ -121,7 +121,6 @@ LLExpandableTextBox::LLTextBoxEx::LLTextBoxEx(const Params& p) void LLExpandableTextBox::LLTextBoxEx::reshape(S32 width, S32 height, BOOL called_from_parent) { - hideExpandText(); LLTextEditor::reshape(width, height, called_from_parent); if (getTextPixelHeight() > getRect().getHeight()) diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index 03cfc6764a..ca2ef5f5b8 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -67,8 +67,8 @@ const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_linux.%s.txt"; const char FEATURE_TABLE_FILENAME[] = "featuretable_solaris.txt"; const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_solaris.%s.txt"; #else -const char FEATURE_TABLE_FILENAME[] = "featuretable.txt"; -const char FEATURE_TABLE_VER_FILENAME[] = "featuretable.%s.txt"; +const char FEATURE_TABLE_FILENAME[] = "featuretable%s.txt"; +const char FEATURE_TABLE_VER_FILENAME[] = "featuretable%s.%s.txt"; #endif const char GPU_TABLE_FILENAME[] = "gpu_table.txt"; @@ -220,10 +220,30 @@ BOOL LLFeatureManager::loadFeatureTables() // first table is install with app std::string app_path = gDirUtilp->getAppRODataDir(); app_path += gDirUtilp->getDirDelimiter(); - app_path += FEATURE_TABLE_FILENAME; + std::string filename; + std::string http_filename; +#if LL_WINDOWS + std::string os_string = LLAppViewer::instance()->getOSInfo().getOSStringSimple(); + if (os_string.find("Microsoft Windows XP") == 0) + { + filename = llformat(FEATURE_TABLE_FILENAME, "_xp"); + http_filename = llformat(FEATURE_TABLE_VER_FILENAME, "_xp", LLVersionInfo::getVersion().c_str()); + } + else + { + filename = llformat(FEATURE_TABLE_FILENAME, ""); + http_filename = llformat(FEATURE_TABLE_VER_FILENAME, "", LLVersionInfo::getVersion().c_str()); + } +#else + filename = FEATURE_TABLE_FILENAME; + http_filename = llformat(FEATURE_TABLE_VER_FILENAME, LLVersionInfo::getVersion().c_str()); +#endif + + app_path += filename; + + // second table is downloaded with HTTP - std::string http_filename = llformat(FEATURE_TABLE_VER_FILENAME, LLVersionInfo::getVersion().c_str()); std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename); // use HTTP table if it exists @@ -488,7 +508,35 @@ private: std::string mFilename; }; -void fetch_table(std::string table) +void fetch_feature_table(std::string table) +{ + const std::string base = gSavedSettings.getString("FeatureManagerHTTPTable"); + +#if LL_WINDOWS + std::string os_string = LLAppViewer::instance()->getOSInfo().getOSStringSimple(); + std::string filename; + if (os_string.find("Microsoft Windows XP") == 0) + { + filename = llformat(table.c_str(), "_xp", LLVersionInfo::getVersion().c_str()); + } + else + { + filename = llformat(table.c_str(), "", LLVersionInfo::getVersion().c_str()); + } +#else + const std::string filename = llformat(table.c_str(), LLVersionInfo::getVersion().c_str()); +#endif + + const std::string url = base + "/" + filename; + + const std::string path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename); + + llinfos << "LLFeatureManager fetching " << url << " into " << path << llendl; + + LLHTTPClient::get(url, new LLHTTPFeatureTableResponder(path)); +} + +void fetch_gpu_table(std::string table) { const std::string base = gSavedSettings.getString("FeatureManagerHTTPTable"); @@ -506,8 +554,8 @@ void fetch_table(std::string table) // fetch table(s) from a website (S3) void LLFeatureManager::fetchHTTPTables() { - fetch_table(FEATURE_TABLE_VER_FILENAME); - fetch_table(GPU_TABLE_VER_FILENAME); + fetch_feature_table(FEATURE_TABLE_VER_FILENAME); + fetch_gpu_table(GPU_TABLE_VER_FILENAME); } diff --git a/indra/newview/llfloatersidetraytab.cpp b/indra/newview/llfloatersidetraytab.cpp new file mode 100644 index 0000000000..f13b4db3a0 --- /dev/null +++ b/indra/newview/llfloatersidetraytab.cpp @@ -0,0 +1,45 @@ +/** + * @file llfloatersidetraytab.cpp + * @brief LLFloaterSideTrayTab class definition + * + * $LicenseInfo:firstyear=2010&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, 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 "llfloatersidetraytab.h" + +// newview includes +#include "lltransientfloatermgr.h" + +LLFloaterSideTrayTab::LLFloaterSideTrayTab(const LLSD& key, const Params& params) +: LLFloater(key, params) +{ + // Prevent transient floaters (e.g. IM windows) from hiding + // when this floater is clicked. + LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::GLOBAL, this); +} + +LLFloaterSideTrayTab::~LLFloaterSideTrayTab() +{ + LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::GLOBAL, this); +} diff --git a/indra/newview/llfloatersidetraytab.h b/indra/newview/llfloatersidetraytab.h new file mode 100644 index 0000000000..e47f82e8ba --- /dev/null +++ b/indra/newview/llfloatersidetraytab.h @@ -0,0 +1,47 @@ +/** + * @file llfloatersidetraytab.h + * @brief LLFloaterSideTrayTab class definition + * + * $LicenseInfo:firstyear=2010&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, 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_LLFLOATERSIDETRAYTAB_H +#define LL_LLFLOATERSIDETRAYTAB_H + +#include "llfloater.h" + +/** + * When a side tray tab gets detached, it's wrapped in an instance of this class. + * + * This class helps to make sure that clicking a detached side tray tab doesn't + * make transient floaters (e.g. IM windows) hide, so that it's possible to + * drag an inventory item from detached My Inventory window to a docked IM window, + * i.e. share the item (see VWR-22891). + */ +class LLFloaterSideTrayTab : public LLFloater +{ +public: + LLFloaterSideTrayTab(const LLSD& key, const Params& params = getDefaultParams()); + ~LLFloaterSideTrayTab(); +}; + +#endif // LL_LLFLOATERSIDETRAYTAB_H diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index 85e45d012b..7546c070ea 100644 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -1175,8 +1175,8 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data) } else { - if (!rd) llwarns << "Received role data for unkown role " << role_id << " in group " << group_id << llendl; - if (!md) llwarns << "Received role data for unkown member " << member_id << " in group " << group_id << llendl; + if (!rd) llwarns << "Received role data for unknown role " << role_id << " in group " << group_id << llendl; + if (!md) llwarns << "Received role data for unknown member " << member_id << " in group " << group_id << llendl; } } } diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index 5f7d1a2ffa..b3b0c93b99 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -168,7 +168,7 @@ LLFloaterIMPanel::LLFloaterIMPanel(const std::string& session_label, LLUICtrlFactory::getInstance()->buildFloater(this, xml_filename, NULL); setTitle(mSessionLabel); - mInputEditor->setMaxTextLength(1023); + mInputEditor->setMaxTextLength(DB_IM_MSG_STR_LEN); // enable line history support for instant message bar mInputEditor->setEnableLineHistory(TRUE); diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index aff0bc4099..02e7f0b9e2 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -28,19 +28,20 @@ #include "llinventorybridge.h" // external projects -#include "lltransfersourceasset.h" +#include "lltransfersourceasset.h" #include "llagent.h" #include "llagentcamera.h" #include "llagentwearables.h" #include "llappearancemgr.h" -#include "llavataractions.h" +#include "llattachmentsmgr.h" +#include "llavataractions.h" #include "llfloateropenobject.h" #include "llfloaterreg.h" #include "llfloaterworldmap.h" #include "llfriendcard.h" #include "llgesturemgr.h" -#include "llgiveinventory.h" +#include "llgiveinventory.h" #include "llimfloater.h" #include "llimview.h" #include "llinventoryclipboard.h" @@ -100,7 +101,7 @@ void dec_busy_count() void remove_inventory_category_from_avatar(LLInventoryCategory* category); void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id); bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*); -bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response); +bool confirm_attachment_rez(const LLSD& notification, const LLSD& response); void teleport_via_landmark(const LLUUID& asset_id); // +=================================================+ @@ -3978,22 +3979,22 @@ std::string LLObjectBridge::getLabelSuffix() const { if (get_is_item_worn(mUUID)) { - if (!isAgentAvatarValid()) + if (!isAgentAvatarValid()) // Error condition, can't figure out attach point { return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn"); } - std::string attachment_point_name = gAgentAvatarp->getAttachedPointName(mUUID); - + if (attachment_point_name == LLStringUtil::null) // Error condition, invalid attach point + { + attachment_point_name = "Invalid Attachment"; + } // e.g. "(worn on ...)" / "(attached to ...)" LLStringUtil::format_map_t args; args["[ATTACHMENT_POINT]"] = LLTrans::getString(attachment_point_name); + return LLItemBridge::getLabelSuffix() + LLTrans::getString("WornOnAttachmentPoint", args); } - else - { - return LLItemBridge::getLabelSuffix(); - } + return LLItemBridge::getLabelSuffix(); } void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attachment, bool replace) @@ -4024,19 +4025,15 @@ void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attach } } - if (!replace) - { - attach_pt |= ATTACHMENT_ADD; - } - LLSD payload; payload["item_id"] = item_id; // Wear the base object in case this is a link. payload["attachment_point"] = attach_pt; + payload["is_add"] = !replace; if (replace && (attachment && attachment->getNumObjects() > 0)) { - LLNotificationsUtil::add("ReplaceAttachment", LLSD(), payload, confirm_replace_attachment_rez); + LLNotificationsUtil::add("ReplaceAttachment", LLSD(), payload, confirm_attachment_rez); } else { @@ -4044,7 +4041,7 @@ void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attach } } -bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response) +bool confirm_attachment_rez(const LLSD& notification, const LLSD& response) { if (!gAgentAvatarp->canAttachMoreObjects()) { @@ -4062,27 +4059,41 @@ bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& respon if (itemp) { + /* + { + U8 attachment_pt = notification["payload"]["attachment_point"].asInteger(); + + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_RezSingleAttachmentFromInv); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_ObjectData); + msg->addUUIDFast(_PREHASH_ItemID, itemp->getUUID()); + msg->addUUIDFast(_PREHASH_OwnerID, itemp->getPermissions().getOwner()); + msg->addU8Fast(_PREHASH_AttachmentPt, attachment_pt); + pack_permissions_slam(msg, itemp->getFlags(), itemp->getPermissions()); + msg->addStringFast(_PREHASH_Name, itemp->getName()); + msg->addStringFast(_PREHASH_Description, itemp->getDescription()); + msg->sendReliable(gAgent.getRegion()->getHost()); + return false; + } + */ + + // Queue up attachments to be sent in next idle tick, this way the + // attachments are batched up all into one message versus each attachment + // being sent in its own separate attachments message. U8 attachment_pt = notification["payload"]["attachment_point"].asInteger(); - + BOOL is_add = notification["payload"]["is_add"].asBoolean(); - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_RezSingleAttachmentFromInv); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_ObjectData); - msg->addUUIDFast(_PREHASH_ItemID, itemp->getUUID()); - msg->addUUIDFast(_PREHASH_OwnerID, itemp->getPermissions().getOwner()); - msg->addU8Fast(_PREHASH_AttachmentPt, attachment_pt); - pack_permissions_slam(msg, itemp->getFlags(), itemp->getPermissions()); - msg->addStringFast(_PREHASH_Name, itemp->getName()); - msg->addStringFast(_PREHASH_Description, itemp->getDescription()); - msg->sendReliable(gAgent.getRegion()->getHost()); + LLAttachmentsMgr::instance().addAttachment(item_id, + attachment_pt, + is_add); } } return false; } -static LLNotificationFunctorRegistration confirm_replace_attachment_rez_reg("ReplaceAttachment", confirm_replace_attachment_rez); +static LLNotificationFunctorRegistration confirm_replace_attachment_rez_reg("ReplaceAttachment", confirm_attachment_rez); void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags) { diff --git a/indra/newview/llinventoryicon.cpp b/indra/newview/llinventoryicon.cpp index 021790648d..7216d61e7f 100644 --- a/indra/newview/llinventoryicon.cpp +++ b/indra/newview/llinventoryicon.cpp @@ -85,6 +85,8 @@ LLIconDictionary::LLIconDictionary() addEntry(LLInventoryIcon::ICONNAME_LINKITEM, new IconEntry("Inv_LinkItem")); addEntry(LLInventoryIcon::ICONNAME_LINKFOLDER, new IconEntry("Inv_LinkItem")); + addEntry(LLInventoryIcon::ICONNAME_INVALID, new IconEntry("Inv_Invalid")); + addEntry(LLInventoryIcon::ICONNAME_NONE, new IconEntry("NONE")); } diff --git a/indra/newview/llinventoryicon.h b/indra/newview/llinventoryicon.h index 3c7ac7f609..9a2cc08095 100644 --- a/indra/newview/llinventoryicon.h +++ b/indra/newview/llinventoryicon.h @@ -73,8 +73,8 @@ public: ICONNAME_LINKITEM, ICONNAME_LINKFOLDER, + ICONNAME_INVALID, ICONNAME_COUNT, - ICONNAME_NONE = -1 }; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 820520df9e..50adae09c0 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -916,6 +916,8 @@ BOOL is_inventorysp_active() // static LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open) { + S32 z_min = S32_MAX; + LLInventoryPanel* res = NULL; // A. If the inventory side panel is open, use that preferably. if (is_inventorysp_active()) { @@ -925,11 +927,26 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open) return inventorySP->getActivePanel(); } } + // or if it is in floater undocked from sidetray get it and remember z order of floater to later compare it + // with other inventory floaters order. + else if (!LLSideTray::getInstance()->isTabAttached("sidebar_inventory")) + { + LLSidepanelInventory *inventorySP = + dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->getPanel("sidepanel_inventory")); + LLFloater* inv_floater = LLFloaterReg::findInstance("side_bar_tab", LLSD("sidebar_inventory")); + if (inventorySP && inv_floater) + { + res = inventorySP->getActivePanel(); + z_min = gFloaterView->getZOrder(inv_floater); + } + else + { + llwarns << "Inventory tab is detached from sidetray, but either panel or floater were not found!" << llendl; + } + } // B. Iterate through the inventory floaters and return whichever is on top. LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory"); - S32 z_min = S32_MAX; - LLInventoryPanel* res = NULL; for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) { LLFloaterInventory* iv = dynamic_cast<LLFloaterInventory*>(*iter); diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 5f71d7100b..28aea7ae3d 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -115,7 +115,7 @@ void LLNearbyChat::applySavedVariables() { if (mRectControl.size() > 1) { - const LLRect& rect = LLUI::sSettingGroups["floater"]->getRect(mRectControl); + const LLRect& rect = LLFloater::getControlGroup()->getRect(mRectControl); if(!rect.isEmpty() && rect.isValid()) { reshape(rect.getWidth(), rect.getHeight()); @@ -124,7 +124,7 @@ void LLNearbyChat::applySavedVariables() } - if(!LLUI::sSettingGroups["floater"]->controlExists(mDocStateControl)) + if(!LLFloater::getControlGroup()->controlExists(mDocStateControl)) { setDocked(true); } @@ -132,7 +132,7 @@ void LLNearbyChat::applySavedVariables() { if (mDocStateControl.size() > 1) { - bool dockState = LLUI::sSettingGroups["floater"]->getBOOL(mDocStateControl); + bool dockState = LLFloater::getControlGroup()->getBOOL(mDocStateControl); setDocked(dockState); } } diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp index b5683296eb..4231a73af1 100644 --- a/indra/newview/llnotificationhandlerutil.cpp +++ b/indra/newview/llnotificationhandlerutil.cpp @@ -353,7 +353,7 @@ void LLHandlerUtil::logGroupNoticeToIMGroup( if (!gAgent.getGroupData(payload["group_id"].asUUID(), groupData)) { llwarns - << "Group notice for unkown group: " + << "Group notice for unknown group: " << payload["group_id"].asUUID() << llendl; return; } diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index 51f9a03a9c..c0f7fa4abf 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -85,7 +85,7 @@ public: registrar.add("Gear.WearAdd", boost::bind(&LLOutfitListGearMenu::onAdd, this)); - enable_registrar.add("Gear.OnEnable", boost::bind(&LLOutfitsList::isActionEnabled, mOutfitList, _2)); + enable_registrar.add("Gear.OnEnable", boost::bind(&LLOutfitListGearMenu::onEnable, this, _2)); enable_registrar.add("Gear.OnVisible", boost::bind(&LLOutfitListGearMenu::onVisible, this, _2)); mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>( @@ -155,27 +155,11 @@ private: void onTakeOff() { - // Take off selected items if there are any - if (mOutfitList->hasItemSelected()) - { - uuid_vec_t selected_uuids; - mOutfitList->getSelectedItemsUUIDs(selected_uuids); - - for (uuid_vec_t::const_iterator it=selected_uuids.begin(); it != selected_uuids.end(); ++it) - { - if (get_is_item_worn(*it)) - { - LLAppearanceMgr::instance().removeItemFromAvatar(*it); - } - } - } - else // or take off the whole selected outfit if no items specified. + // Take off selected outfit. + const LLUUID& selected_outfit_id = getSelectedOutfitID(); + if (selected_outfit_id.notNull()) { - const LLUUID& selected_outfit_id = getSelectedOutfitID(); - if (selected_outfit_id.notNull()) - { - LLAppearanceMgr::instance().takeOffOutfit(selected_outfit_id); - } + LLAppearanceMgr::instance().takeOffOutfit(selected_outfit_id); } } @@ -209,6 +193,20 @@ private: LLAgentWearables::createWearable(type, true); } + bool onEnable(LLSD::String param) + { + // Handle the "Wear - Replace Current Outfit" menu option specially + // because LLOutfitList::isActionEnabled() checks whether it's allowed + // to wear selected outfit OR selected items, while we're only + // interested in the outfit (STORM-183). + if ("wear" == param) + { + return LLAppearanceMgr::instance().getCanReplaceCOF(mOutfitList->getSelectedOutfitUUID()); + } + + return mOutfitList->isActionEnabled(param); + } + bool onVisible(LLSD::String param) { const LLUUID& selected_outfit_id = getSelectedOutfitID(); @@ -439,6 +437,7 @@ void LLOutfitsList::refreshList(const LLUUID& category_id) static LLXMLNodePtr accordionXmlNode = getAccordionTabXMLNode(); LLAccordionCtrlTab* tab = LLUICtrlFactory::defaultBuilder<LLAccordionCtrlTab>(accordionXmlNode, NULL, NULL); + if (!tab) continue; tab->setName(name); tab->setTitle(name); @@ -455,10 +454,7 @@ void LLOutfitsList::refreshList(const LLUUID& category_id) mAccordion->removeCollapsibleCtrl(tab); // kill removed tab - if (tab != NULL) - { - tab->die(); - } + tab->die(); continue; } @@ -974,23 +970,6 @@ void LLOutfitsList::applyFilterToTab( } } -bool LLOutfitsList::canTakeOffSelected() -{ - uuid_vec_t selected_uuids; - getSelectedItemsUUIDs(selected_uuids); - - LLFindWearablesEx is_worn(/*is_worn=*/ true, /*include_body_parts=*/ false); - - for (uuid_vec_t::const_iterator it=selected_uuids.begin(); it != selected_uuids.end(); ++it) - { - LLViewerInventoryItem* item = gInventory.getItem(*it); - if (!item) continue; - - if (is_worn(NULL, item)) return true; - } - return false; -} - bool LLOutfitsList::canWearSelected() { uuid_vec_t selected_items; diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h index 37b909c93e..faf6f7ce1e 100644 --- a/indra/newview/lloutfitslist.h +++ b/indra/newview/lloutfitslist.h @@ -98,7 +98,7 @@ public: const LLUUID& getSelectedOutfitUUID() const { return mSelectedOutfitUUID; } - void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const; + /*virtual*/ void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const; boost::signals2::connection setSelectionChangeCallback(selection_change_callback_t cb); @@ -174,11 +174,6 @@ private: void applyFilterToTab(const LLUUID& category_id, LLAccordionCtrlTab* tab, const std::string& filter_substring); /** - * Returns true if there are any items that can be taken off among currently selected, otherwise false. - */ - bool canTakeOffSelected(); - - /** * Returns true if all selected items can be worn. */ bool canWearSelected(); diff --git a/indra/newview/llpanelappearancetab.cpp b/indra/newview/llpanelappearancetab.cpp new file mode 100644 index 0000000000..9910a3a2ac --- /dev/null +++ b/indra/newview/llpanelappearancetab.cpp @@ -0,0 +1,51 @@ +/** + * @file llpanelappearancetab.h + * @brief Tabs interface for Side Bar "My Appearance" panel + * + * $LicenseInfo:firstyear=2010&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, 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 "llpanelappearancetab.h" + + +#include "llinventoryfunctions.h" +#include "llinventorymodel.h" + +//virtual +bool LLPanelAppearanceTab::canTakeOffSelected() +{ + uuid_vec_t selected_uuids; + getSelectedItemsUUIDs(selected_uuids); + + LLFindWearablesEx is_worn(/*is_worn=*/ true, /*include_body_parts=*/ false); + + for (uuid_vec_t::const_iterator it=selected_uuids.begin(); it != selected_uuids.end(); ++it) + { + LLViewerInventoryItem* item = gInventory.getItem(*it); + if (!item) continue; + + if (is_worn(NULL, item)) return true; + } + return false; +} diff --git a/indra/newview/llpanelappearancetab.h b/indra/newview/llpanelappearancetab.h index fa929aac0a..81366c5db4 100644 --- a/indra/newview/llpanelappearancetab.h +++ b/indra/newview/llpanelappearancetab.h @@ -41,9 +41,17 @@ public: virtual void showGearMenu(LLView* spawning_view) = 0; + virtual void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const {} + static const std::string& getFilterSubString() { return sFilterSubString; } protected: + + /** + * Returns true if there are any items that can be taken off among currently selected, otherwise false. + */ + bool canTakeOffSelected(); + static std::string sFilterSubString; }; diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index e42057e93a..62ed7acb15 100644 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -112,6 +112,7 @@ void LLPanelGroup::onOpen(const LLSD& key) if(!key.has("action")) { setGroupID(group_id); + getChild<LLAccordionCtrl>("groups_accordion")->expandDefaultTab(); return; } @@ -176,11 +177,6 @@ BOOL LLPanelGroup::postBuild() LLPanelGroupTab* panel_notices = findChild<LLPanelGroupTab>("group_notices_tab_panel"); LLPanelGroupTab* panel_land = findChild<LLPanelGroupTab>("group_land_tab_panel"); - if (LLAccordionCtrl* accordion_ctrl = getChild<LLAccordionCtrl>("groups_accordion")) - { - setVisibleCallback(boost::bind(&LLPanelGroup::onVisibilityChange, this, _2, accordion_ctrl)); - } - if(panel_general) mTabs.push_back(panel_general); if(panel_roles) mTabs.push_back(panel_roles); if(panel_notices) mTabs.push_back(panel_notices); @@ -304,14 +300,6 @@ void LLPanelGroup::onBtnCancel() onBackBtnClick(); } -void LLPanelGroup::onVisibilityChange(const LLSD &in_visible_chain, LLAccordionCtrl* accordion_ctrl) -{ - if (in_visible_chain.asBoolean() && accordion_ctrl != NULL) - { - accordion_ctrl->expandDefaultTab(); - } -} - void LLPanelGroup::changed(LLGroupChange gc) { for(std::vector<LLPanelGroupTab* >::iterator it = mTabs.begin();it!=mTabs.end();++it) diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h index 86875d2da3..b494c7d403 100644 --- a/indra/newview/llpanelgroup.h +++ b/indra/newview/llpanelgroup.h @@ -36,7 +36,6 @@ class LLOfferInfo; const S32 UPDATE_MEMBERS_PER_FRAME = 500; // Forward declares -class LLAccordionCtrl; class LLPanelGroupTab; class LLTabContainer; class LLAgent; @@ -97,7 +96,6 @@ protected: void onBackBtnClick(); void onBtnJoin(); void onBtnCancel(); - void onVisibilityChange(const LLSD &in_visible_chain, LLAccordionCtrl* accordion_ctrl); static void onBtnApply(void*); static void onBtnRefresh(void*); diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index ff15e3f08e..24bf67a000 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -965,12 +965,32 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const || "expand" == command_name ) { - return canSelectedBeModified(command_name); + if (!root_folder_view) return false; + + std::set<LLUUID> selected_uuids = root_folder_view->getSelectionList(); + + // Allow to execute the command only if it can be applied to all selected items. + for (std::set<LLUUID>::const_iterator iter = selected_uuids.begin(); iter != selected_uuids.end(); ++iter) + { + LLFolderViewItem* item = root_folder_view->getItemByID(*iter); + + // If no item is found it might be a folder id. + if (!item) + { + item = root_folder_view->getFolderByID(*iter); + } + if (!item) return false; + + if (!canItemBeModified(command_name, item)) return false; + } + + return true; } else if ( "teleport" == command_name || "more_info" == command_name || "show_on_map" == command_name || "copy_slurl" == command_name + || "rename" == command_name ) { // disable some commands for multi-selection. EXT-1757 @@ -994,13 +1014,16 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const // Disable "Show on Map" if landmark loading is in progress. return !gLandmarkList.isAssetInLoadedCallbackMap(asset_uuid); } + else if ("rename" == command_name) + { + LLFolderViewItem* selected_item = getCurSelectedItem(); + if (!selected_item) return false; + + return canItemBeModified(command_name, selected_item); + } return true; } - else if ("rename" == command_name) - { - return root_folder_view && root_folder_view->getSelectedCount() == 1 && canSelectedBeModified(command_name); - } else if("category" == command_name) { // we can add folder only in Landmarks Accordion @@ -1065,12 +1088,11 @@ Rules: 4. We can not paste folders from Clipboard (processed by LLFolderView::canPaste()) 5. Check LLFolderView/Inventory Bridges rules */ -bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) const +bool LLLandmarksPanel::canItemBeModified(const std::string& command_name, LLFolderViewItem* item) const { // validate own rules first - LLFolderViewItem* selected = getCurSelectedItem(); - if (!selected) return false; + if (!item) return false; // nothing can be modified in Library if (mLibraryInventoryPanel == mCurrentSelectedList) return false; @@ -1078,7 +1100,7 @@ bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) co bool can_be_modified = false; // landmarks can be modified in any other accordion... - if (isLandmarkSelected()) + if (item->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK) { can_be_modified = true; @@ -1107,16 +1129,16 @@ bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) co } else if ("collapse" == command_name) { - return selected->isOpen(); + return item->isOpen(); } else if ("expand" == command_name) { - return !selected->isOpen(); + return !item->isOpen(); } if (can_be_modified) { - LLFolderViewEventListener* listenerp = selected->getListener(); + LLFolderViewEventListener* listenerp = item->getListener(); if ("cut" == command_name) { diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h index 2b398decce..0d4402d8cb 100644 --- a/indra/newview/llpanellandmarks.h +++ b/indra/newview/llpanellandmarks.h @@ -127,12 +127,12 @@ private: void onCustomAction(const LLSD& command_name); /** - * Determines if selected item can be modified via context/gear menu. + * Determines if an item can be modified via context/gear menu. * * It validates Places Landmarks rules first. And then LLFolderView permissions. * For now it checks cut/rename/delete/paste actions. */ - bool canSelectedBeModified(const std::string& command_name) const; + bool canItemBeModified(const std::string& command_name, LLFolderViewItem* item) const; void onPickPanelExit( LLPanelPickEdit* pick_panel, LLView* owner, const LLSD& params); /** diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 06ba08b51c..d096b17145 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -522,8 +522,10 @@ BOOL LLPanelPeople::postBuild() mAllFriendList = friends_tab->getChild<LLAvatarList>("avatars_all"); mOnlineFriendList->setNoItemsCommentText(getString("no_friends_online")); mOnlineFriendList->setShowIcons("FriendsListShowIcons"); + mOnlineFriendList->showPermissions("FriendsListShowPermissions"); mAllFriendList->setNoItemsCommentText(getString("no_friends")); mAllFriendList->setShowIcons("FriendsListShowIcons"); + mAllFriendList->showPermissions("FriendsListShowPermissions"); LLPanel* nearby_tab = getChild<LLPanel>(NEARBY_TAB_NAME); nearby_tab->setVisibleCallback(boost::bind(&Updater::setActive, mNearbyListUpdater, _2)); @@ -1205,6 +1207,14 @@ void LLPanelPeople::onFriendsViewSortMenuItemClicked(const LLSD& userdata) mAllFriendList->toggleIcons(); mOnlineFriendList->toggleIcons(); } + else if (chosen_item == "view_permissions") + { + bool show_permissions = !gSavedSettings.getBOOL("FriendsListShowPermissions"); + gSavedSettings.setBOOL("FriendsListShowPermissions", show_permissions); + + mAllFriendList->showPermissions(show_permissions); + mOnlineFriendList->showPermissions(show_permissions); + } } void LLPanelPeople::onGroupsViewSortMenuItemClicked(const LLSD& userdata) diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index ee30c928c2..801db1e741 100644 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -230,6 +230,11 @@ void LLPanelPlaceProfile::setInfoType(EInfoType type) break; } + if (mAccordionCtrl != NULL) + { + mAccordionCtrl->expandDefaultTab(); + } + LLPanelPlaceInfo::setInfoType(type); } @@ -274,11 +279,6 @@ void LLPanelPlaceProfile::handleVisibilityChange(BOOL new_visibility) parcel_mgr->deselectUnused(); } } - - if (mAccordionCtrl != NULL) - { - mAccordionCtrl->expandDefaultTab(); - } } void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp index a6bc34c62e..860470cd73 100644 --- a/indra/newview/llpanelwearing.cpp +++ b/indra/newview/llpanelwearing.cpp @@ -29,6 +29,7 @@ #include "llpanelwearing.h" #include "llappearancemgr.h" +#include "llinventoryfunctions.h" #include "llinventorymodel.h" #include "llinventoryobserver.h" #include "llsidetray.h" @@ -46,12 +47,16 @@ static void edit_outfit() class LLWearingGearMenu { public: - LLWearingGearMenu() - : mMenu(NULL) + LLWearingGearMenu(LLPanelWearing* panel_wearing) + : mMenu(NULL), mPanelWearing(panel_wearing) { LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; registrar.add("Gear.Edit", boost::bind(&edit_outfit)); + registrar.add("Gear.TakeOff", boost::bind(&LLWearingGearMenu::onTakeOff, this)); + + enable_registrar.add("Gear.OnEnable", boost::bind(&LLPanelWearing::isActionEnabled, mPanelWearing, _2)); mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>( "menu_wearing_gear.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); @@ -70,7 +75,20 @@ public: } private: + + void onTakeOff() + { + uuid_vec_t selected_uuids; + mPanelWearing->getSelectedItemsUUIDs(selected_uuids); + + for (uuid_vec_t::const_iterator it=selected_uuids.begin(); it != selected_uuids.end(); ++it) + { + LLAppearanceMgr::instance().removeItemFromAvatar(*it); + } + } + LLMenuGL* mMenu; + LLPanelWearing* mPanelWearing; }; ////////////////////////////////////////////////////////////////////////// @@ -150,7 +168,7 @@ LLPanelWearing::LLPanelWearing() { mCategoriesObserver = new LLInventoryCategoriesObserver(); - mGearMenu = new LLWearingGearMenu(); + mGearMenu = new LLWearingGearMenu(this); mContextMenu = new LLWearingContextMenu(); } @@ -226,6 +244,12 @@ bool LLPanelWearing::isActionEnabled(const LLSD& userdata) // allow save only if outfit isn't locked and is dirty return !outfit_locked && outfit_dirty; } + + if (command_name == "take_off") + { + return hasItemSelected() && canTakeOffSelected(); + } + return false; } @@ -255,4 +279,14 @@ void LLPanelWearing::onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y) mContextMenu->show(ctrl, selected_uuids, x, y); } +bool LLPanelWearing::hasItemSelected() +{ + return mCOFItemsList->getSelectedItem() != NULL; +} + +void LLPanelWearing::getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const +{ + mCOFItemsList->getSelectedUUIDs(selected_uuids); +} + // EOF diff --git a/indra/newview/llpanelwearing.h b/indra/newview/llpanelwearing.h index 6ae8efef99..1fa97735b1 100644 --- a/indra/newview/llpanelwearing.h +++ b/indra/newview/llpanelwearing.h @@ -60,8 +60,12 @@ public: /*virtual*/ void showGearMenu(LLView* spawning_view); + /*virtual*/ void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const; + boost::signals2::connection setSelectionChangeCallback(commit_callback_t cb); + bool hasItemSelected(); + private: void onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y); diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 7206e4fcaf..a3c6a7b6f1 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -286,6 +286,8 @@ void LLSidepanelAppearance::showOutfitsInventoryPanel() void LLSidepanelAppearance::showOutfitEditPanel() { + if (mOutfitEdit && mOutfitEdit->getVisible()) return; + // Accordion's state must be reset in all cases except the one when user // is returning back to the mOutfitEdit panel from the mEditWearable panel. // The simplest way to control this is to check the visibility state of the mEditWearable diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index 731079fb5d..e41bbe43df 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -75,7 +75,40 @@ void LLItemPropertiesObserver::changed(U32 mask) } } +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLObjectInventoryObserver +// +// Helper class to watch for changes in an object inventory. +// Used to update item properties in LLSidepanelItemInfo. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLObjectInventoryObserver : public LLVOInventoryListener +{ +public: + LLObjectInventoryObserver(LLSidepanelItemInfo* floater, LLViewerObject* object) + : mFloater(floater) + { + registerVOInventoryListener(object, NULL); + } + virtual ~LLObjectInventoryObserver() + { + removeVOInventoryListener(); + } + /*virtual*/ void inventoryChanged(LLViewerObject* object, + LLInventoryObject::object_list_t* inventory, + S32 serial_num, + void* user_data); +private: + LLSidepanelItemInfo* mFloater; +}; +/*virtual*/ +void LLObjectInventoryObserver::inventoryChanged(LLViewerObject* object, + LLInventoryObject::object_list_t* inventory, + S32 serial_num, + void* user_data) +{ + mFloater->dirty(); +} ///---------------------------------------------------------------------------- /// Class LLSidepanelItemInfo @@ -86,6 +119,7 @@ static LLRegisterPanelClassWrapper<LLSidepanelItemInfo> t_item_info("sidepanel_i // Default constructor LLSidepanelItemInfo::LLSidepanelItemInfo() : mItemID(LLUUID::null) + , mObjectInventoryObserver(NULL) { mPropertiesObserver = new LLItemPropertiesObserver(this); @@ -97,6 +131,8 @@ LLSidepanelItemInfo::~LLSidepanelItemInfo() { delete mPropertiesObserver; mPropertiesObserver = NULL; + + stopObjectInventoryObserver(); } // virtual @@ -134,6 +170,10 @@ BOOL LLSidepanelItemInfo::postBuild() void LLSidepanelItemInfo::setObjectID(const LLUUID& object_id) { mObjectID = object_id; + + // Start monitoring changes in the object inventory to update + // selected inventory item properties in Item Profile panel. See STORM-148. + startObjectInventoryObserver(); } void LLSidepanelItemInfo::setItemID(const LLUUID& item_id) @@ -147,6 +187,8 @@ void LLSidepanelItemInfo::reset() mObjectID = LLUUID::null; mItemID = LLUUID::null; + + stopObjectInventoryObserver(); } void LLSidepanelItemInfo::refresh() @@ -600,6 +642,33 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item) } } +void LLSidepanelItemInfo::startObjectInventoryObserver() +{ + if (!mObjectInventoryObserver) + { + stopObjectInventoryObserver(); + + // Previous object observer should be removed before starting to observe a new object. + llassert(mObjectInventoryObserver == NULL); + } + + if (mObjectID.isNull()) + { + llwarns << "Empty object id passed to inventory observer" << llendl; + return; + } + + LLViewerObject* object = gObjectList.findObject(mObjectID); + + mObjectInventoryObserver = new LLObjectInventoryObserver(this, object); +} + +void LLSidepanelItemInfo::stopObjectInventoryObserver() +{ + delete mObjectInventoryObserver; + mObjectInventoryObserver = NULL; +} + void LLSidepanelItemInfo::onClickCreator() { LLViewerInventoryItem* item = findItem(); diff --git a/indra/newview/llsidepaneliteminfo.h b/indra/newview/llsidepaneliteminfo.h index 82ebbfa7ec..10e93dd7de 100644 --- a/indra/newview/llsidepaneliteminfo.h +++ b/indra/newview/llsidepaneliteminfo.h @@ -37,6 +37,7 @@ class LLButton; class LLViewerInventoryItem; class LLItemPropertiesObserver; +class LLObjectInventoryObserver; class LLViewerObject; class LLPermissions; @@ -63,9 +64,13 @@ protected: void refreshFromItem(LLViewerInventoryItem* item); private: + void startObjectInventoryObserver(); + void stopObjectInventoryObserver(); + LLUUID mItemID; // inventory UUID for the inventory item. LLUUID mObjectID; // in-world task UUID, or null if in agent inventory. LLItemPropertiesObserver* mPropertiesObserver; // for syncing changes to item + LLObjectInventoryObserver* mObjectInventoryObserver; // for syncing changes to items inside an object // // UI Elements diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 7af3ad9896..9ee504cc4c 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -244,9 +244,7 @@ void LLSideTrayTab::toggleTabDocked() LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name); if (!floater_tab) return; - LLFloaterReg::toggleInstance("side_bar_tab", tab_name); - - bool docking = !LLFloater::isShown(floater_tab); + bool docking = LLFloater::isShown(floater_tab); // Hide the "Tear Off" button when a tab gets undocked // and show "Dock" button instead. @@ -261,6 +259,10 @@ void LLSideTrayTab::toggleTabDocked() { undock(floater_tab); } + + // Open/close the floater *after* we reparent the tab panel, + // so that it doesn't receive redundant visibility change notifications. + LLFloaterReg::toggleInstance("side_bar_tab", tab_name); } void LLSideTrayTab::dock() @@ -282,7 +284,7 @@ void LLSideTrayTab::dock() if (side_tray->getCollapsed()) { - side_tray->expandSideBar(); + side_tray->expandSideBar(false); } } @@ -291,6 +293,10 @@ void LLSideTrayTab::undock(LLFloater* floater_tab) LLSideTray* side_tray = getSideTray(); if (!side_tray) return; + // Remember whether the tab have been active before detaching + // because removeTab() will change active tab. + bool was_active = side_tray->getActiveTab() == this; + // Remove the tab from Side Tray's tabs list. // We have to do it despite removing the tab from Side Tray's child view tree // by addChild(). Otherwise the tab could be accessed by the pointer in LLSideTray::mTabs. @@ -300,9 +306,15 @@ void LLSideTrayTab::undock(LLFloater* floater_tab) return; } - setVisible(true); // *HACK: restore visibility after being hidden by LLSideTray::selectTabByName(). + // If we're undocking while side tray is collapsed we need to explicitly show the panel. + if (!getVisible()) + { + setVisible(true); + } + floater_tab->addChild(this); floater_tab->setTitle(mTabTitle); + floater_tab->setName(getName()); // Reshape the floater if needed. LLRect floater_rect; @@ -334,7 +346,7 @@ void LLSideTrayTab::undock(LLFloater* floater_tab) side_tray->collapseSideBar(); } - if (side_tray->getActiveTab() != this) + if (!was_active) { // When a tab other then current active tab is detached from Side Tray // onOpen() should be called as tab visibility is changed. @@ -556,8 +568,9 @@ void LLSideTray::toggleTabButton(LLSideTrayTab* tab) { LLButton* btn = it->second; bool new_state = !btn->getToggleState(); - btn->setToggleState(new_state); - btn->setImageOverlay( new_state ? tab->mImageSelected : tab->mImage ); + btn->setToggleState(new_state); + // Only highlight the tab if side tray is expanded (STORM-157). + btn->setImageOverlay( new_state && !getCollapsed() ? tab->mImageSelected : tab->mImage ); } } @@ -618,8 +631,9 @@ bool LLSideTray::selectTabByIndex(size_t index) return selectTabByName(sidebar_tab->getName()); } -bool LLSideTray::selectTabByName (const std::string& name) +bool LLSideTray::selectTabByName(const std::string& name, bool keep_prev_visible) { + LLSideTrayTab* tab_to_keep_visible = NULL; LLSideTrayTab* new_tab = getTab(name); if (!new_tab) return false; @@ -630,6 +644,8 @@ bool LLSideTray::selectTabByName (const std::string& name) //deselect old tab if (mActiveTab) { + // Keep previously active tab visible if requested. + if (keep_prev_visible) tab_to_keep_visible = mActiveTab; toggleTabButton(mActiveTab); } @@ -650,9 +666,17 @@ bool LLSideTray::selectTabByName (const std::string& name) for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) { LLSideTrayTab* sidebar_tab = *child_it; + + bool vis = sidebar_tab == mActiveTab; + + // Force keeping the tab visible if requested. + vis |= sidebar_tab == tab_to_keep_visible; + // When the last tab gets detached, for a short moment the "Toggle Sidebar" pseudo-tab // is shown. So, to avoid the flicker we make sure it never gets visible. - sidebar_tab->setVisible(sidebar_tab == mActiveTab && (*child_it)->getName() != "sidebar_openclose"); + vis &= (*child_it)->getName() != "sidebar_openclose"; + + sidebar_tab->setVisible(vis); } return true; } @@ -739,9 +763,16 @@ bool LLSideTray::removeTab(LLSideTrayTab* tab) // Deselect the tab. if (mActiveTab == tab) { - child_vector_iter_t next_tab_it = - (tab_it < (mTabs.end() - 1)) ? tab_it + 1 : mTabs.begin(); - selectTabByName((*next_tab_it)->getName()); + // Select the next tab (or first one, if we're removing the last tab), + // skipping the fake open/close tab (STORM-155). + child_vector_iter_t next_tab_it = tab_it; + do + { + next_tab_it = (next_tab_it < (mTabs.end() - 1)) ? next_tab_it + 1 : mTabs.begin(); + } + while ((*next_tab_it)->getName() == "sidebar_openclose"); + + selectTabByName((*next_tab_it)->getName(), true); // Don't hide the tab being removed. } // Remove the tab. @@ -976,9 +1007,9 @@ void LLSideTray::detachTabs() std::string floater_ctrl_name = LLFloater::getControlName("side_bar_tab", LLSD(tab->getName())); std::string vis_ctrl_name = LLFloaterReg::getVisibilityControlName(floater_ctrl_name); - if (!LLUI::sSettingGroups["floater"]->controlExists(vis_ctrl_name)) continue; + if (!LLFloater::getControlGroup()->controlExists(vis_ctrl_name)) continue; - bool is_visible = LLUI::sSettingGroups["floater"]->getBOOL(vis_ctrl_name); + bool is_visible = LLFloater::getControlGroup()->getBOOL(vis_ctrl_name); if (!is_visible) continue; llassert(isTabAttached(tab->getName())); @@ -1016,7 +1047,7 @@ void LLSideTray::collapseSideBar() setFocus( FALSE ); } -void LLSideTray::expandSideBar() +void LLSideTray::expandSideBar(bool open_active) { mCollapsed = false; LLSideTrayTab* openclose_tab = getTab("sidebar_openclose"); @@ -1024,8 +1055,11 @@ void LLSideTray::expandSideBar() { mCollapseButton->setImageOverlay( openclose_tab->mImageSelected ); } - LLSD key;//empty - mActiveTab->onOpen(key); + + if (open_active) + { + mActiveTab->onOpen(LLSD()); + } reflectCollapseChange(); diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 248def8e3d..4e79007c13 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -76,9 +76,12 @@ public: // interface functions /** - * Select tab with specific name and set it active - */ - bool selectTabByName (const std::string& name); + * Select tab with specific name and set it active + * + * @param name Tab to switch to. + * @param keep_prev_visible Whether to keep the previously selected tab visible. + */ + bool selectTabByName (const std::string& name, bool keep_prev_visible = false); /** * Select tab with specific index and set it active @@ -119,8 +122,10 @@ public: /* * expand SideBar + * + * @param open_active Whether to call onOpen() for the active tab. */ - void expandSideBar (); + void expandSideBar(bool open_active = true); /** diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 2fd0a22f80..6a213309a0 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -927,7 +927,7 @@ void LLTextureCache::setReadOnly(BOOL read_only) } //called in the main thread. -S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL disable_texture_cache) +S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL texture_cache_mismatch) { llassert_always(getPending() == 0) ; //should not start accessing the texture cache before initialized. @@ -942,20 +942,23 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL disable_textu sCacheMaxTexturesSize = max_size; max_size -= sCacheMaxTexturesSize; - if(disable_texture_cache) //the texture cache is disabled - { - llinfos << "The texture cache is disabled!" << llendl ; - setReadOnly(TRUE) ; - purgeAllTextures(true); - - return max_size ; - } - LL_INFOS("TextureCache") << "Headers: " << sCacheMaxEntries << " Textures size: " << sCacheMaxTexturesSize/(1024*1024) << " MB" << LL_ENDL; setDirNames(location); + if(texture_cache_mismatch) + { + //if readonly, disable the texture cache, + //otherwise wipe out the texture cache. + purgeAllTextures(true); + + if(mReadOnly) + { + return max_size ; + } + } + if (!mReadOnly) { LLFile::mkdir(mTexturesDirName); diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h index 7f1bba56fb..64e3a2658c 100644 --- a/indra/newview/lltexturecache.h +++ b/indra/newview/lltexturecache.h @@ -105,7 +105,7 @@ public: void purgeCache(ELLPath location); void setReadOnly(BOOL read_only) ; - S64 initCache(ELLPath location, S64 maxsize, BOOL disable_texture_cache); + S64 initCache(ELLPath location, S64 maxsize, BOOL texture_cache_mismatch); handle_t readFromCache(const std::string& local_filename, const LLUUID& id, U32 priority, S32 offset, S32 size, ReadResponder* responder); diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 6a75e4b009..c87aff022f 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -48,6 +48,7 @@ #include "llviewertexture.h" #include "llviewertexturelist.h" #include "llvovolume.h" +#include "llviewerstats.h" // For avatar texture view #include "llvoavatarself.h" @@ -513,6 +514,7 @@ void LLGLTexMemBar::draw() F32 cache_max_usage = (F32)BYTES_TO_MEGA_BYTES(LLAppViewer::getTextureCache()->getMaxUsage()) ; S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f); S32 v_offset = (S32)((texture_bar_height + 2.2f) * mTextureView->mNumTextureBars + 2.0f); + S32 total_downloaded = BYTES_TO_MEGA_BYTES(gTotalTextureBytes); //---------------------------------------------------------------------------- LLGLSUIDefault gls_ui; LLColor4 text_color(1.f, 1.f, 1.f, 0.75f); @@ -523,13 +525,13 @@ void LLGLTexMemBar::draw() LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*6, text_color, LLFontGL::LEFT, LLFontGL::TOP); - text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB Raw Tot: %d MB Bias: %.2f Cache: %.1f/%.1f MB", + text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB Raw Tot: %d MB Bias: %.2f Cache: %.1f/%.1f MB Net Tot: %d MB", total_mem, max_total_mem, bound_mem, max_bound_mem, - LLImageRaw::sGlobalRawMemory >> 20, discard_bias, - cache_usage, cache_max_usage); + LLImageRaw::sGlobalRawMemory >> 20, discard_bias, + cache_usage, cache_max_usage, total_downloaded); //, cache_entries, cache_max_entries LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*3, diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index ca6efa9d2f..1a1c94674b 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -51,7 +51,7 @@ const LLFontGL* LLToastNotifyPanel::sFontSmall = NULL; LLToastNotifyPanel::button_click_signal_t LLToastNotifyPanel::sButtonClickSignal; -LLToastNotifyPanel::LLToastNotifyPanel(LLNotificationPtr& notification, const LLRect& rect) : +LLToastNotifyPanel::LLToastNotifyPanel(LLNotificationPtr& notification, const LLRect& rect, bool show_images) : LLToastPanel(notification), mTextBox(NULL), mInfoPanel(NULL), @@ -120,6 +120,7 @@ mCloseNotificationOnDestroy(true) mTextBox->setMaxTextLength(MAX_LENGTH); mTextBox->setVisible(TRUE); + mTextBox->setPlainText(!show_images); mTextBox->setValue(notification->getMessage()); // add buttons for a script notification @@ -523,8 +524,9 @@ void LLToastNotifyPanel::disableRespondedOptions(LLNotificationPtr& notification ////////////////////////////////////////////////////////////////////////// -LLIMToastNotifyPanel::LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLUUID& session_id, const LLRect& rect /* = LLRect::null */) - : mSessionID(session_id), LLToastNotifyPanel(pNotification, rect) +LLIMToastNotifyPanel::LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLUUID& session_id, const LLRect& rect /* = LLRect::null */, + bool show_images /* = true */) + : mSessionID(session_id), LLToastNotifyPanel(pNotification, rect, show_images) { mTextBox->setFollowsAll(); } diff --git a/indra/newview/lltoastnotifypanel.h b/indra/newview/lltoastnotifypanel.h index 9e1eac90b3..57711b3d80 100644 --- a/indra/newview/lltoastnotifypanel.h +++ b/indra/newview/lltoastnotifypanel.h @@ -60,7 +60,7 @@ public: * @deprecated if you intend to instantiate LLToastNotifyPanel - it's point to * implement right class for desired toast panel. @see LLGenericTipPanel as example. */ - LLToastNotifyPanel(LLNotificationPtr& pNotification, const LLRect& rect = LLRect::null); + LLToastNotifyPanel(LLNotificationPtr& pNotification, const LLRect& rect = LLRect::null, bool show_images = true); virtual ~LLToastNotifyPanel(); LLPanel * getControlPanel() { return mControlPanel; } @@ -137,7 +137,7 @@ class LLIMToastNotifyPanel : public LLToastNotifyPanel { public: - LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLUUID& session_id, const LLRect& rect = LLRect::null); + LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLUUID& session_id, const LLRect& rect = LLRect::null, bool show_images = true); ~LLIMToastNotifyPanel(); diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index d8be70e546..864de018e0 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -619,6 +619,25 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask) return TRUE; } } + else if (gSavedSettings.getBOOL("DoubleClickTeleport")) + { + LLViewerObject* objp = mPick.getObject(); + LLViewerObject* parentp = objp ? objp->getRootEdit() : NULL; + + bool is_in_world = mPick.mObjectID.notNull() && objp && !objp->isHUDAttachment(); + bool is_land = mPick.mPickType == LLPickInfo::PICK_LAND; + bool pos_non_zero = !mPick.mPosGlobal.isExactlyZero(); + bool has_touch_handler = (objp && objp->flagHandleTouch()) || (parentp && parentp->flagHandleTouch()); + bool has_click_action = final_click_action(objp); + + if (pos_non_zero && (is_land || (is_in_world && !has_touch_handler && !has_click_action))) + { + LLVector3d pos = mPick.mPosGlobal; + pos.mdV[VZ] += gAgentAvatarp->getPelvisToFoot(); + gAgent.teleportViaLocationLookAt(pos); + return TRUE; + } + } return FALSE; } diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp new file mode 100644 index 0000000000..050e34ade9 --- /dev/null +++ b/indra/newview/lltranslate.cpp @@ -0,0 +1,123 @@ +/** +* @file lltranslate.cpp +* @brief Functions for translating text via Google Translate. +* +* $LicenseInfo:firstyear=2009&license=viewergpl$ +* +* Copyright (c) 2009-2010, Linden Research, Inc. +* +* Second Life Viewer Source Code +* The source code in this file ("Source Code") is provided by Linden Lab +* to you under the terms of the GNU General Public License, version 2.0 +* ("GPL"), unless you have obtained a separate licensing agreement +* ("Other License"), formally executed by you and Linden Lab. Terms of +* the GPL can be found in doc/GPL-license.txt in this distribution, or +* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 +* +* There are special exceptions to the terms and conditions of the GPL as +* it is applied to this Source Code. View the full text of the exception +* in the file doc/FLOSS-exception.txt in this software distribution, or +* online at +* http://secondlifegrid.net/programs/open_source/licensing/flossexception +* +* By copying, modifying or distributing this software, you acknowledge +* that you have read and understood your obligations described above, +* and agree to abide by those obligations. +* +* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO +* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, +* COMPLETENESS OR PERFORMANCE. +* $/LicenseInfo$ +*/ + +#include "llviewerprecompiledheaders.h" + +#include "lltranslate.h" + +#include "llbufferstream.h" +#include "llui.h" +#include "llversionviewer.h" +#include "llviewercontrol.h" + +#include "jsoncpp/reader.h" + +// These two are concatenated with the language specifiers to form a complete Google Translate URL +const char* LLTranslate::m_GoogleURL = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q="; +const char* LLTranslate::m_GoogleLangSpec = "&langpair="; +float LLTranslate::m_GoogleTimeout = 5; + +LLSD LLTranslate::m_Header; +// These constants are for the GET header. +const char* LLTranslate::m_AcceptHeader = "Accept"; +const char* LLTranslate::m_AcceptType = "text/plain"; +const char* LLTranslate::m_AgentHeader = "User-Agent"; + +// These constants are in the JSON returned from Google +const char* LLTranslate::m_GoogleData = "responseData"; +const char* LLTranslate::m_GoogleTranslation = "translatedText"; +const char* LLTranslate::m_GoogleLanguage = "detectedSourceLanguage"; + +//static +void LLTranslate::translateMessage(LLHTTPClient::ResponderPtr &result, const std::string &from_lang, const std::string &to_lang, const std::string &mesg) +{ + std::string url; + getTranslateUrl(url, from_lang, to_lang, mesg); + + std::string user_agent = llformat("%s %d.%d.%d (%d)", + LL_CHANNEL, + LL_VERSION_MAJOR, + LL_VERSION_MINOR, + LL_VERSION_PATCH, + LL_VERSION_BUILD ); + + if (!m_Header.size()) + { + m_Header.insert(m_AcceptHeader, LLSD(m_AcceptType)); + m_Header.insert(m_AgentHeader, LLSD(user_agent)); + } + + LLHTTPClient::get(url, result, m_Header, m_GoogleTimeout); +} + +//static +void LLTranslate::getTranslateUrl(std::string &translate_url, const std::string &from_lang, const std::string &to_lang, const std::string &mesg) +{ + std::string escaped_mesg = curl_escape(mesg.c_str(), mesg.size()); + + translate_url = m_GoogleURL + + escaped_mesg + m_GoogleLangSpec + + from_lang // 'from' language; empty string for auto + + "%7C" // | + + to_lang; // 'to' language +} + +//static +bool LLTranslate::parseGoogleTranslate(const std::string& body, std::string &translation, std::string &detected_language) +{ + Json::Value root; + Json::Reader reader; + + bool success = reader.parse(body, root); + if (!success) + { + LL_WARNS("Translate") << "Non valid response from Google Translate API: '" << reader.getFormatedErrorMessages() << "'" << LL_ENDL; + return false; + } + + translation = root[m_GoogleData].get(m_GoogleTranslation, "").asString(); + detected_language = root[m_GoogleData].get(m_GoogleLanguage, "").asString(); + return true; +} + +//static +std::string LLTranslate::getTranslateLanguage() +{ + std::string language = gSavedSettings.getString("TranslateLanguage"); + if (language.empty() || language == "default") + { + language = LLUI::getLanguage(); + } + language = language.substr(0,2); + return language; +} + diff --git a/indra/newview/lltranslate.h b/indra/newview/lltranslate.h new file mode 100644 index 0000000000..0786dc0ca3 --- /dev/null +++ b/indra/newview/lltranslate.h @@ -0,0 +1,124 @@ +/** +* @file lltranslate.h +* @brief Human language translation class and JSON response receiver. +* +* $LicenseInfo:firstyear=2009&license=viewergpl$ +* +* Copyright (c) 2009-2010, Linden Research, Inc. +* +* Second Life Viewer Source Code +* The source code in this file ("Source Code") is provided by Linden Lab +* to you under the terms of the GNU General Public License, version 2.0 +* ("GPL"), unless you have obtained a separate licensing agreement +* ("Other License"), formally executed by you and Linden Lab. Terms of +* the GPL can be found in doc/GPL-license.txt in this distribution, or +* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 +* +* There are special exceptions to the terms and conditions of the GPL as +* it is applied to this Source Code. View the full text of the exception +* in the file doc/FLOSS-exception.txt in this software distribution, or +* online at +* http://secondlifegrid.net/programs/open_source/licensing/flossexception +* +* By copying, modifying or distributing this software, you acknowledge +* that you have read and understood your obligations described above, +* and agree to abide by those obligations. +* +* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO +* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, +* COMPLETENESS OR PERFORMANCE. +* $/LicenseInfo$ +*/ + +#ifndef LL_LLTRANSLATE_H +#define LL_LLTRANSLATE_H + +#include "llhttpclient.h" +#include "llbufferstream.h" + +class LLTranslate +{ + LOG_CLASS(LLTranslate); +public : + class TranslationReceiver: public LLHTTPClient::Responder + { + protected: + TranslationReceiver(const std::string &from_lang, const std::string &to_lang) + : m_fromLang(from_lang), + m_toLang(to_lang) + { + } + + virtual void handleResponse(const std::string &translation, const std::string &recognized_lang) {}; + virtual void handleFailure() {}; + + public: + ~TranslationReceiver() + { + } + + virtual void completedRaw( U32 status, + const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer) + { + if (200 <= status && status < 300) + { + LLBufferStream istr(channels, buffer.get()); + std::stringstream strstrm; + strstrm << istr.rdbuf(); + + const std::string result = strstrm.str(); + std::string translation; + std::string detected_language; + + if (!parseGoogleTranslate(result, translation, detected_language)) + { + handleFailure(); + return; + } + + // Fix up the response + LLStringUtil::replaceString(translation, "<", "<"); + LLStringUtil::replaceString(translation, ">",">"); + LLStringUtil::replaceString(translation, ""","\""); + LLStringUtil::replaceString(translation, "'","'"); + LLStringUtil::replaceString(translation, "&","&"); + LLStringUtil::replaceString(translation, "'","'"); + + handleResponse(translation, detected_language); + } + else + { + LL_WARNS("Translate") << "HTTP request for Google Translate failed with status " << status << ", reason: " << reason << LL_ENDL; + handleFailure(); + } + } + + protected: + const std::string m_toLang; + const std::string m_fromLang; + }; + + static void translateMessage(LLHTTPClient::ResponderPtr &result, const std::string &from_lang, const std::string &to_lang, const std::string &mesg); + static float m_GoogleTimeout; + static std::string getTranslateLanguage(); + +private: + static void getTranslateUrl(std::string &translate_url, const std::string &from_lang, const std::string &to_lang, const std::string &text); + static bool parseGoogleTranslate(const std::string& body, std::string &translation, std::string &detected_language); + + static LLSD m_Header; + static const char* m_GoogleURL; + static const char* m_GoogleLangSpec; + static const char* m_AcceptHeader; + static const char* m_AcceptType; + static const char* m_AgentHeader; + static const char* m_UserAgent; + + static const char* m_GoogleData; + static const char* m_GoogleTranslation; + static const char* m_GoogleLanguage; +}; + +#endif diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index d0ad918c58..916cbe2267 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -85,6 +85,7 @@ LLPointer<LLViewerTexture> gDisconnectedImagep = NULL; // used to toggle renderer back on after teleport const F32 TELEPORT_RENDER_DELAY = 20.f; // Max time a teleport is allowed to take before we raise the curtain const F32 TELEPORT_ARRIVAL_DELAY = 2.f; // Time to preload the world before raising the curtain after we've actually already arrived. +const F32 TELEPORT_LOCAL_DELAY = 1.0f; // Delay to prevent teleports after starting an in-sim teleport. BOOL gTeleportDisplay = FALSE; LLFrameTimer gTeleportDisplayTimer; LLFrameTimer gTeleportArrivalTimer; @@ -406,6 +407,18 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) } break; + case LLAgent::TELEPORT_LOCAL: + // Short delay when teleporting in the same sim (progress screen active but not shown - did not + // fall-through from TELEPORT_START) + { + if( gTeleportDisplayTimer.getElapsedTimeF32() > TELEPORT_LOCAL_DELAY ) + { + //LLFirstUse::useTeleport(); + gAgent.setTeleportState( LLAgent::TELEPORT_NONE ); + } + } + break; + case LLAgent::TELEPORT_NONE: // No teleport in progress gViewerWindow->setShowProgress(FALSE); diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 8728298575..b6f2d34663 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -86,6 +86,7 @@ #include "llfloaterscriptlimits.h" #include "llfloatersellland.h" #include "llfloatersettingsdebug.h" +#include "llfloatersidetraytab.h" #include "llfloatersnapshot.h" #include "llfloatertelehub.h" #include "llfloatertestinspectors.h" @@ -234,7 +235,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("script_limits", "floater_script_limits.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptLimits>); LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater); LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>); - LLFloaterReg::add("side_bar_tab", "floater_side_bar_tab.xml",&LLFloaterReg::build<LLFloater>); + LLFloaterReg::add("side_bar_tab", "floater_side_bar_tab.xml", &LLFloaterReg::build<LLFloaterSideTrayTab>); LLFloaterReg::add("stats", "floater_stats.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloater>); LLFloaterReg::add("start_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRunQueue>); LLFloaterReg::add("stop_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotRunQueue>); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index daeace0ec5..f62223a38d 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -6573,6 +6573,16 @@ class LLToggleControl : public view_listener_t std::string control_name = userdata.asString(); BOOL checked = gSavedSettings.getBOOL( control_name ); gSavedSettings.setBOOL( control_name, !checked ); + + // Doubleclick actions - there can be only one + if ((control_name == "DoubleClickAutoPilot") && !checked) + { + gSavedSettings.setBOOL( "DoubleClickTeleport", FALSE ); + } + else if ((control_name == "DoubleClickTeleport") && !checked) + { + gSavedSettings.setBOOL( "DoubleClickAutoPilot", FALSE ); + } return true; } }; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 781e324e25..c35173a7d4 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -77,10 +77,12 @@ #include "llimview.h" #include "llspeakers.h" #include "lltrans.h" +#include "lltranslate.h" #include "llviewerfoldertype.h" #include "lluri.h" #include "llviewergenericmessage.h" #include "llviewermenu.h" +#include "llviewerjoystick.h" #include "llviewerobjectlist.h" #include "llviewerparcelmgr.h" #include "llviewerstats.h" @@ -2909,6 +2911,50 @@ void process_decline_callingcard(LLMessageSystem* msg, void**) LLNotificationsUtil::add("CallingCardDeclined"); } +class ChatTranslationReceiver : public LLTranslate::TranslationReceiver +{ +public : + ChatTranslationReceiver(const std::string &from_lang, const std::string &to_lang, const std::string &mesg, + const LLChat &chat, const LLSD &toast_args) + : LLTranslate::TranslationReceiver(from_lang, to_lang), + m_chat(chat), + m_toastArgs(toast_args), + m_origMesg(mesg) + { + } + + static boost::intrusive_ptr<ChatTranslationReceiver> build(const std::string &from_lang, const std::string &to_lang, const std::string &mesg, const LLChat &chat, const LLSD &toast_args) + { + return boost::intrusive_ptr<ChatTranslationReceiver>(new ChatTranslationReceiver(from_lang, to_lang, mesg, chat, toast_args)); + } + +protected: + void handleResponse(const std::string &translation, const std::string &detected_language) + { + // filter out non-interesting responeses + if ( !translation.empty() + && (m_toLang != detected_language) + && (LLStringUtil::compareInsensitive(translation, m_origMesg) != 0) ) + { + m_chat.mText += " (" + translation + ")"; + } + + LLNotificationsUI::LLNotificationManager::instance().onChat(m_chat, m_toastArgs); + } + + void handleFailure() + { + LLTranslate::TranslationReceiver::handleFailure(); + m_chat.mText += " (?)"; + + LLNotificationsUI::LLNotificationManager::instance().onChat(m_chat, m_toastArgs); + } + +private: + LLChat m_chat; + std::string m_origMesg; + LLSD m_toastArgs; +}; void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) { @@ -3113,7 +3159,22 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) args["type"] = LLNotificationsUI::NT_NEARBYCHAT; chat.mOwnerID = owner_id; - LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args); + if (gSavedSettings.getBOOL("TranslateChat") && chat.mSourceType != CHAT_SOURCE_SYSTEM) + { + if (chat.mChatStyle == CHAT_STYLE_IRC) + { + mesg = mesg.substr(4, std::string::npos); + } + const std::string from_lang = ""; // leave empty to trigger autodetect + const std::string to_lang = LLTranslate::getTranslateLanguage(); + + LLHTTPClient::ResponderPtr result = ChatTranslationReceiver::build(from_lang, to_lang, mesg, chat, args); + LLTranslate::translateMessage(result, from_lang, to_lang, mesg); + } + else + { + LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args); + } } } @@ -3129,6 +3190,8 @@ void process_teleport_start(LLMessageSystem *msg, void**) U32 teleport_flags = 0x0; msg->getU32("Info", "TeleportFlags", teleport_flags); + LL_DEBUGS("Messaging") << "Got TeleportStart with TeleportFlags=" << teleport_flags << ". gTeleportDisplay: " << gTeleportDisplay << ", gAgent.mTeleportState: " << gAgent.getTeleportState() << LL_ENDL; + if (teleport_flags & TELEPORT_FLAGS_DISABLE_CANCEL) { gViewerWindow->setProgressCancelButtonVisible(FALSE); @@ -3147,6 +3210,7 @@ void process_teleport_start(LLMessageSystem *msg, void**) gAgent.setTeleportState( LLAgent::TELEPORT_START ); make_ui_sound("UISndTeleportOut"); + LL_INFOS("Messaging") << "Teleport initiated by remote TeleportStart message with TeleportFlags: " << teleport_flags << LL_ENDL; // Don't call LLFirstUse::useTeleport here because this could be // due to being killed, which would send you home, not to a Telehub } @@ -3488,6 +3552,12 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) if( is_teleport ) { + if (gAgent.getTeleportKeepsLookAt()) + { + // *NOTE: the LookAt data we get from the sim here doesn't + // seem to be useful, so get it from the camera instead + look_at = LLViewerCamera::getInstance()->getAtAxis(); + } // Force the camera back onto the agent, don't animate. gAgentCamera.setFocusOnAvatar(TRUE, FALSE); gAgentCamera.slamLookAt(look_at); @@ -3534,7 +3604,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) { LLTracker::stopTracking(NULL); } - else if ( is_teleport ) + else if ( is_teleport && !gAgent.getTeleportKeepsLookAt() ) { //look at the beacon LLVector3 global_agent_pos = agent_pos; @@ -5806,7 +5876,18 @@ void process_teleport_local(LLMessageSystem *msg,void**) if( gAgent.getTeleportState() != LLAgent::TELEPORT_NONE ) { - gAgent.setTeleportState( LLAgent::TELEPORT_NONE ); + if( gAgent.getTeleportState() == LLAgent::TELEPORT_LOCAL ) + { + // To prevent TeleportStart messages re-activating the progress screen right + // after tp, keep the teleport state and let progress screen clear it after a short delay + // (progress screen is active but not visible) *TODO: remove when SVC-5290 is fixed + gTeleportDisplayTimer.reset(); + gTeleportDisplay = TRUE; + } + else + { + gAgent.setTeleportState( LLAgent::TELEPORT_NONE ); + } } // Sim tells us whether the new position is off the ground @@ -5822,8 +5903,10 @@ void process_teleport_local(LLMessageSystem *msg,void**) gAgent.setPositionAgent(pos); gAgentCamera.slamLookAt(look_at); - // likewise make sure the camera is behind the avatar - gAgentCamera.resetView(TRUE, TRUE); + if ( !(gAgent.getTeleportKeepsLookAt() && LLViewerJoystick::getInstance()->getOverrideCamera()) ) + { + gAgentCamera.resetView(TRUE, TRUE); + } // send camera update to new region gAgentCamera.updateCamera(); diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index a86efa215b..98f16757b2 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -69,13 +69,6 @@ #pragma warning(disable:4355) #endif -// Viewer object cache version, change if object update -// format changes. JC -const U32 INDRA_OBJECT_CACHE_VERSION = 14; - -// Format string used to construct filename for the object cache -static const char OBJECT_CACHE_FILENAME[] = "objects_%d_%d.slc"; - extern BOOL gNoRender; const F32 WATER_TEXTURE_SCALE = 8.f; // Number of times to repeat the water texture across a region @@ -214,7 +207,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, mProductName("unknown"), mHttpUrl(""), mCacheLoaded(FALSE), - mCacheEntriesCount(0), + mCacheDirty(FALSE), mCacheID(), mEventPoll(NULL), mReleaseNotesRequested(FALSE), @@ -264,8 +257,6 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, // Create the object lists initStats(); - mCacheStart.append(mCacheEnd); - //create object partitions //MUST MATCH declaration of eObjectPartitions mObjectPartition.push_back(new LLHUDPartition()); //PARTITION_HUD @@ -324,19 +315,6 @@ LLViewerRegion::~LLViewerRegion() std::for_each(mObjectPartition.begin(), mObjectPartition.end(), DeletePointer()); } - -const std::string LLViewerRegion::getObjectCacheFilename(U64 mHandle) const -{ - std::string filename; - U32 region_x, region_y; - - grid_from_region_handle(mHandle, ®ion_x, ®ion_y); - filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, - llformat(OBJECT_CACHE_FILENAME, region_x, region_y)); - - return filename; -} - void LLViewerRegion::loadObjectCache() { if (mCacheLoaded) @@ -347,77 +325,10 @@ void LLViewerRegion::loadObjectCache() // Presume success. If it fails, we don't want to try again. mCacheLoaded = TRUE; - LLVOCacheEntry *entry; - - std::string filename = getObjectCacheFilename(mHandle); - LL_DEBUGS("ObjectCache") << filename << LL_ENDL; - - LLFILE* fp = LLFile::fopen(filename, "rb"); /* Flawfinder: ignore */ - if (!fp) - { - // might not have a file, which is normal - return; - } - - U32 zero; - size_t nread; - nread = fread(&zero, sizeof(U32), 1, fp); - if (nread != 1 || zero) - { - // a non-zero value here means bad things! - // skip reading the cached values - llinfos << "Cache file invalid" << llendl; - fclose(fp); - return; - } - - U32 version; - nread = fread(&version, sizeof(U32), 1, fp); - if (nread != 1 || version != INDRA_OBJECT_CACHE_VERSION) + if(LLVOCache::hasInstance()) { - // a version mismatch here means we've changed the binary format! - // skip reading the cached values - llinfos << "Cache version changed, discarding" << llendl; - fclose(fp); - return; - } - - LLUUID cache_id; - nread = fread(&cache_id.mData, 1, UUID_BYTES, fp); - if (nread != (size_t)UUID_BYTES || mCacheID != cache_id) - { - llinfos << "Cache ID doesn't match for this region, discarding" - << llendl; - fclose(fp); - return; - } - - S32 num_entries; - nread = fread(&num_entries, sizeof(S32), 1, fp); - if (nread != 1) - { - llinfos << "Short read, discarding" << llendl; - fclose(fp); - return; + LLVOCache::getInstance()->readFromCache(mHandle, mCacheID, mCacheMap) ; } - - S32 i; - for (i = 0; i < num_entries; i++) - { - entry = new LLVOCacheEntry(fp); - if (!entry->getLocalID()) - { - llwarns << "Aborting cache file load for " << filename << ", cache file corruption!" << llendl; - delete entry; - entry = NULL; - break; - } - mCacheEnd.insert(*entry); - mCacheMap[entry->getLocalID()] = entry; - mCacheEntriesCount++; - } - - fclose(fp); } @@ -428,61 +339,22 @@ void LLViewerRegion::saveObjectCache() return; } - S32 num_entries = mCacheEntriesCount; - if (0 == num_entries) + if (mCacheMap.empty()) { return; } - std::string filename = getObjectCacheFilename(mHandle); - LL_DEBUGS("ObjectCache") << filename << LL_ENDL; - - LLFILE* fp = LLFile::fopen(filename, "wb"); /* Flawfinder: ignore */ - if (!fp) + if(LLVOCache::hasInstance()) { - llwarns << "Unable to write cache file " << filename << llendl; - return; + LLVOCache::getInstance()->writeToCache(mHandle, mCacheID, mCacheMap, mCacheDirty) ; + mCacheDirty = FALSE; } - // write out zero to indicate a version cache file - U32 zero = 0; - if (fwrite(&zero, sizeof(U32), 1, fp) != 1) + for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mCacheMap.begin(); iter != mCacheMap.end(); ++iter) { - llwarns << "Short write" << llendl; + delete iter->second; } - - // write out version number - U32 version = INDRA_OBJECT_CACHE_VERSION; - if (fwrite(&version, sizeof(U32), 1, fp) != 1) - { - llwarns << "Short write" << llendl; - } - - // write the cache id for this sim - if (fwrite(&mCacheID.mData, 1, UUID_BYTES, fp) != (size_t)UUID_BYTES) - { - llwarns << "Short write" << llendl; - } - - if (fwrite(&num_entries, sizeof(S32), 1, fp) != 1) - { - llwarns << "Short write" << llendl; - } - - LLVOCacheEntry *entry; - - for (entry = mCacheStart.getNext(); entry && (entry != &mCacheEnd); entry = entry->getNext()) - { - entry->writeToFile(fp); - } - mCacheMap.clear(); - mCacheEnd.unlink(); - mCacheEnd.init(); - mCacheStart.deleteAll(); - mCacheStart.init(); - - fclose(fp); } void LLViewerRegion::sendMessage() @@ -1175,7 +1047,6 @@ void LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinary mCacheMap.erase(local_id); delete entry; entry = new LLVOCacheEntry(local_id, crc, dp); - mCacheEnd.insert(*entry); mCacheMap[local_id] = entry; } } @@ -1184,18 +1055,13 @@ void LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinary // we haven't seen this object before // Create new entry and add to map - if (mCacheEntriesCount > MAX_OBJECT_CACHE_ENTRIES) + if (mCacheMap.size() > MAX_OBJECT_CACHE_ENTRIES) { - entry = mCacheStart.getNext(); - mCacheMap.erase(entry->getLocalID()); - delete entry; - mCacheEntriesCount--; + mCacheMap.erase(mCacheMap.begin()); } entry = new LLVOCacheEntry(local_id, crc, dp); - mCacheEnd.insert(*entry); mCacheMap[local_id] = entry; - mCacheEntriesCount++; } return ; } @@ -1310,6 +1176,7 @@ void LLViewerRegion::requestCacheMisses() mCacheMissFull.reset(); mCacheMissCRC.reset(); + mCacheDirty = TRUE ; // llinfos << "KILLDEBUG Sent cache miss full " << full_count << " crc " << crc_count << llendl; } @@ -1327,9 +1194,10 @@ void LLViewerRegion::dumpCache() } LLVOCacheEntry *entry; - - for (entry = mCacheStart.getNext(); entry && (entry != &mCacheEnd); entry = entry->getNext()) + for(LLVOCacheEntry::vocache_entry_map_t::iterator iter = mCacheMap.begin(); iter != mCacheMap.end(); ++iter) { + entry = iter->second ; + S32 hits = entry->getHitCount(); S32 changes = entry->getCRCChangeCount(); @@ -1340,7 +1208,7 @@ void LLViewerRegion::dumpCache() change_bin[changes]++; } - llinfos << "Count " << mCacheEntriesCount << llendl; + llinfos << "Count " << mCacheMap.size() << llendl; for (i = 0; i < BINS; i++) { llinfos << "Hits " << i << " " << hit_bin[i] << llendl; diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 361ae87e1b..038c831e59 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -323,9 +323,6 @@ public: LLDynamicArray<LLUUID> mMapAvatarIDs; private: - // determine the cache filename for the region from the region handle - const std::string getObjectCacheFilename(U64 mHandle) const; - // The surfaces and other layers LLSurface* mLandp; @@ -387,11 +384,8 @@ private: // Regions can have order 10,000 objects, so assume // a structure of size 2^14 = 16,000 BOOL mCacheLoaded; - typedef std::map<U32, LLVOCacheEntry *> cache_map_t; - cache_map_t mCacheMap; - LLVOCacheEntry mCacheStart; - LLVOCacheEntry mCacheEnd; - U32 mCacheEntriesCount; + BOOL mCacheDirty; + LLVOCacheEntry::vocache_entry_map_t mCacheMap; LLDynamicArray<U32> mCacheMissFull; LLDynamicArray<U32> mCacheMissCRC; // time? diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h index 5d8f58d5e9..ca977d4599 100644 --- a/indra/newview/llviewerstats.h +++ b/indra/newview/llviewerstats.h @@ -263,5 +263,5 @@ void send_stats(); extern std::map<S32,LLFrameTimer> gDebugTimers; extern std::map<S32,std::string> gDebugTimerLabel; - +extern U32 gTotalTextureBytes; #endif // LL_LLVIEWERSTATS_H diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 556451e390..43d18c6d83 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -3911,7 +3911,14 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei image_buffer_x = llfloor(snapshot_width*scale_factor) ; image_buffer_y = llfloor(snapshot_height *scale_factor) ; } - raw->resize(image_buffer_x, image_buffer_y, 3); + if(image_buffer_x > 0 && image_buffer_y > 0) + { + raw->resize(image_buffer_x, image_buffer_y, 3); + } + else + { + return FALSE ; + } if(raw->isBufferInvalid()) { return FALSE ; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index f985ee0c15..46d8f65d23 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -176,7 +176,7 @@ const F32 TIME_BEFORE_MESH_CLEANUP = 5.f; // seconds const S32 AVATAR_RELEASE_THRESHOLD = 10; // number of avatar instances before releasing memory const F32 FOOT_GROUND_COLLISION_TOLERANCE = 0.25f; const F32 AVATAR_LOD_TWEAK_RANGE = 0.7f; -const S32 MAX_BUBBLE_CHAT_LENGTH = 1023; +const S32 MAX_BUBBLE_CHAT_LENGTH = DB_CHAT_MSG_STR_LEN; const S32 MAX_BUBBLE_CHAT_UTTERANCES = 12; const F32 CHAT_FADE_TIME = 8.0; const F32 BUBBLE_CHAT_TIME = CHAT_FADE_TIME * 3.f; @@ -6835,12 +6835,14 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) llinfos << "AvatarAppearance msg received without any parameters, object: " << getID() << llendl; } + const F32 LOADING_TIMEOUT_SECONDS = 60.f; // this isn't really a problem if we already have a non-default shape - if (visualParamWeightsAreDefault()) + if (visualParamWeightsAreDefault() && mRuthTimer.getElapsedTimeF32() > LOADING_TIMEOUT_SECONDS) { // re-request appearance, hoping that it comes back with a shape next time llinfos << "Re-requesting AvatarAppearance for object: " << getID() << llendl; LLAvatarPropertiesProcessor::getInstance()->sendAvatarTexturesRequest(getID()); + mRuthTimer.reset(); } else { diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index a231afad3f..ec5c95469e 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -1163,12 +1163,24 @@ BOOL LLVOAvatarSelf::detachAttachmentIntoInventory(const LLUUID &item_id) gMessageSystem->addUUIDFast(_PREHASH_ItemID, item_id); gMessageSystem->sendReliable(gAgent.getRegion()->getHost()); - // this object might have been selected, so let the selection manager know it's gone now + // This object might have been selected, so let the selection manager know it's gone now LLViewerObject *found_obj = gObjectList.findObject(item_id); if (found_obj) { LLSelectMgr::getInstance()->remove(found_obj); } + + // Error checking in case this object was attached to an invalid point + // In that case, just remove the item from COF preemptively since detach + // will fail. + if (isAgentAvatarValid()) + { + const LLViewerObject *attached_obj = gAgentAvatarp->getWornAttachment(item_id); + if (!attached_obj) + { + LLAppearanceMgr::instance().removeCOFItemLinks(item_id, false); + } + } return TRUE; } return FALSE; diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index eb2475f666..23a799ea3a 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -33,6 +33,7 @@ struct LocalTextureData; + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // LLVOAvatarSelf // diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index 4e6d630ed8..0b903e62b1 100644 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -25,10 +25,19 @@ */ #include "llviewerprecompiledheaders.h" - #include "llvocache.h" - #include "llerror.h" +#include "llregionhandle.h" + +BOOL check_read(LLAPRFile* apr_file, void* src, S32 n_bytes) +{ + return apr_file->read(src, n_bytes) == n_bytes ; +} + +BOOL check_write(LLAPRFile* apr_file, void* src, S32 n_bytes) +{ + return apr_file->write(src, n_bytes) == n_bytes ; +} //--------------------------------------------------------------------------- // LLVOCacheEntry @@ -57,26 +66,31 @@ LLVOCacheEntry::LLVOCacheEntry() mDP.assignBuffer(mBuffer, 0); } +LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file) +{ + S32 size = -1; + BOOL success; -static inline void checkedRead(LLFILE *fp, void *data, size_t nbytes) + success = check_read(apr_file, &mLocalID, sizeof(U32)); + if(success) { - if (fread(data, 1, nbytes, fp) != nbytes) + success = check_read(apr_file, &mCRC, sizeof(U32)); + } + if(success) { - llwarns << "Short read" << llendl; - memset(data, 0, nbytes); + success = check_read(apr_file, &mHitCount, sizeof(S32)); } + if(success) + { + success = check_read(apr_file, &mDupeCount, sizeof(S32)); } - -LLVOCacheEntry::LLVOCacheEntry(LLFILE *fp) + if(success) { - S32 size; - checkedRead(fp, &mLocalID, sizeof(U32)); - checkedRead(fp, &mCRC, sizeof(U32)); - checkedRead(fp, &mHitCount, sizeof(S32)); - checkedRead(fp, &mDupeCount, sizeof(S32)); - checkedRead(fp, &mCRCChangeCount, sizeof(S32)); - - checkedRead(fp, &size, sizeof(S32)); + success = check_read(apr_file, &mCRCChangeCount, sizeof(S32)); + } + if(success) + { + success = check_read(apr_file, &size, sizeof(S32)); // Corruption in the cache entries if ((size > 10000) || (size < 1)) @@ -90,11 +104,30 @@ LLVOCacheEntry::LLVOCacheEntry(LLFILE *fp) mBuffer = NULL; return; } + } + if(success && size > 0) + { + mBuffer = new U8[size]; + success = check_read(apr_file, mBuffer, size); - mBuffer = new U8[size]; - checkedRead(fp, mBuffer, size); + if(success) + { mDP.assignBuffer(mBuffer, size); } + else + { + delete[] mBuffer ; + mBuffer = NULL ; + } + } + + if(!success) + { + mLocalID = 0; + mCRC = 0; + mBuffer = NULL; + } +} LLVOCacheEntry::~LLVOCacheEntry() { @@ -148,22 +181,467 @@ void LLVOCacheEntry::dump() const << llendl; } -static inline void checkedWrite(LLFILE *fp, const void *data, size_t nbytes) +BOOL LLVOCacheEntry::writeToFile(LLAPRFile* apr_file) const +{ + BOOL success; + success = check_write(apr_file, (void*)&mLocalID, sizeof(U32)); + if(success) + { + success = check_write(apr_file, (void*)&mCRC, sizeof(U32)); + } + if(success) + { + success = check_write(apr_file, (void*)&mHitCount, sizeof(S32)); + } + if(success) + { + success = check_write(apr_file, (void*)&mDupeCount, sizeof(S32)); + } + if(success) + { + success = check_write(apr_file, (void*)&mCRCChangeCount, sizeof(S32)); + } + if(success) + { + S32 size = mDP.getBufferSize(); + success = check_write(apr_file, (void*)&size, sizeof(S32)); + + if(success) + { + success = check_write(apr_file, (void*)mBuffer, size); + } +} + + return success ; +} + +//------------------------------------------------------------------- +//LLVOCache +//------------------------------------------------------------------- +// Format string used to construct filename for the object cache +static const char OBJECT_CACHE_FILENAME[] = "objects_%d_%d.slc"; + +const U32 MAX_NUM_OBJECT_ENTRIES = 128 ; +const U32 NUM_ENTRIES_TO_PURGE = 16 ; +const char* object_cache_dirname = "objectcache"; +const char* header_filename = "object.cache"; + +LLVOCache* LLVOCache::sInstance = NULL; + +//static +LLVOCache* LLVOCache::getInstance() +{ + if(!sInstance) + { + sInstance = new LLVOCache() ; +} + return sInstance ; +} + +//static +BOOL LLVOCache::hasInstance() +{ + return sInstance != NULL ; +} + +//static +void LLVOCache::destroyClass() +{ + if(sInstance) + { + delete sInstance ; + sInstance = NULL ; + } +} + +LLVOCache::LLVOCache(): + mInitialized(FALSE), + mReadOnly(TRUE), + mNumEntries(0) +{ + mLocalAPRFilePoolp = new LLVolatileAPRPool() ; +} + +LLVOCache::~LLVOCache() +{ + writeCacheHeader(); + clearCacheInMemory(); + delete mLocalAPRFilePoolp; +} + +void LLVOCache::setDirNames(ELLPath location) +{ + std::string delem = gDirUtilp->getDirDelimiter(); + + mHeaderFileName = gDirUtilp->getExpandedFilename(location, object_cache_dirname, header_filename); + mObjectCacheDirName = gDirUtilp->getExpandedFilename(location, object_cache_dirname); +} + +void LLVOCache::initCache(ELLPath location, U32 size, U32 cache_version) +{ + if(mInitialized) + { + return ; + } + + setDirNames(location); + if (!mReadOnly) + { + LLFile::mkdir(mObjectCacheDirName); + } + mCacheSize = llmin(size, MAX_NUM_OBJECT_ENTRIES) ; + mCacheSize = llmax(mCacheSize, NUM_ENTRIES_TO_PURGE); + + mMetaInfo.mVersion = cache_version; + readCacheHeader(); + mInitialized = TRUE ; + + if(mMetaInfo.mVersion != cache_version) + { + mMetaInfo.mVersion = cache_version ; + if(mReadOnly) //disable cache + { + clearCacheInMemory(); + } + else //delete the current cache if the format does not match. + { + removeCache(); + } + } +} + +void LLVOCache::removeCache(ELLPath location) +{ + if(mReadOnly) + { + return ; + } + + std::string delem = gDirUtilp->getDirDelimiter(); + std::string mask = delem + "*"; + std::string cache_dir = gDirUtilp->getExpandedFilename(location, object_cache_dirname); + gDirUtilp->deleteFilesInDir(cache_dir, mask); //delete all files + LLFile::rmdir(cache_dir); + + clearCacheInMemory(); + mInitialized = FALSE ; +} + +void LLVOCache::removeCache() +{ + llassert_always(mInitialized) ; + if(mReadOnly) + { + return ; + } + + std::string delem = gDirUtilp->getDirDelimiter(); + std::string mask = delem + "*"; + gDirUtilp->deleteFilesInDir(mObjectCacheDirName, mask); + + clearCacheInMemory() ; + writeCacheHeader(); +} + +void LLVOCache::clearCacheInMemory() +{ + if(!mHeaderEntryQueue.empty()) + { + for(header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin(); iter != mHeaderEntryQueue.end(); ++iter) + { + delete *iter ; + } + mHeaderEntryQueue.clear(); + mHandleEntryMap.clear(); + mNumEntries = 0 ; + } +} + +void LLVOCache::getObjectCacheFilename(U64 handle, std::string& filename) +{ + U32 region_x, region_y; + + grid_from_region_handle(handle, ®ion_x, ®ion_y); + filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, object_cache_dirname, + llformat(OBJECT_CACHE_FILENAME, region_x, region_y)); + + return ; +} + +void LLVOCache::removeFromCache(U64 handle) +{ + if(mReadOnly) + { + return ; + } + + std::string filename; + getObjectCacheFilename(handle, filename); + LLAPRFile::remove(filename, mLocalAPRFilePoolp); +} + +BOOL LLVOCache::checkRead(LLAPRFile* apr_file, void* src, S32 n_bytes) +{ + if(!check_read(apr_file, src, n_bytes)) + { + delete apr_file ; + removeCache() ; + return FALSE ; + } + + return TRUE ; +} + +BOOL LLVOCache::checkWrite(LLAPRFile* apr_file, void* src, S32 n_bytes) +{ + if(!check_write(apr_file, src, n_bytes)) + { + delete apr_file ; + removeCache() ; + return FALSE ; + } + + return TRUE ; +} + +void LLVOCache::readCacheHeader() +{ + //clear stale info. + clearCacheInMemory(); + + if (LLAPRFile::isExist(mHeaderFileName, mLocalAPRFilePoolp)) + { + LLAPRFile* apr_file = new LLAPRFile(mHeaderFileName, APR_READ|APR_BINARY, mLocalAPRFilePoolp); + + //read the meta element + if(!checkRead(apr_file, &mMetaInfo, sizeof(HeaderMetaInfo))) + { + return ; + } + + HeaderEntryInfo* entry ; + mNumEntries = 0 ; + while(mNumEntries < MAX_NUM_OBJECT_ENTRIES) + { + entry = new HeaderEntryInfo() ; + if(!checkRead(apr_file, entry, sizeof(HeaderEntryInfo))) + { + delete entry ; + return ; + } + else if(!entry->mTime) //end of the cache. + { + delete entry ; + return ; + } + + entry->mIndex = mNumEntries++ ; + mHeaderEntryQueue.insert(entry) ; + mHandleEntryMap[entry->mHandle] = entry ; + } + + delete apr_file ; + } + else + { + writeCacheHeader() ; + } +} + +void LLVOCache::writeCacheHeader() { - if (fwrite(data, 1, nbytes, fp) != nbytes) + if(mReadOnly) + { + return ; + } + + LLAPRFile* apr_file = new LLAPRFile(mHeaderFileName, APR_CREATE|APR_WRITE|APR_BINARY, mLocalAPRFilePoolp); + + //write the meta element + if(!checkWrite(apr_file, &mMetaInfo, sizeof(HeaderMetaInfo))) { - llwarns << "Short write" << llendl; + return ; } + + mNumEntries = 0 ; + for(header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin() ; iter != mHeaderEntryQueue.end(); ++iter) + { + (*iter)->mIndex = mNumEntries++ ; + if(!checkWrite(apr_file, (void*)*iter, sizeof(HeaderEntryInfo))) + { + return ; + } + } + + mNumEntries = mHeaderEntryQueue.size() ; + if(mNumEntries < MAX_NUM_OBJECT_ENTRIES) + { + HeaderEntryInfo* entry = new HeaderEntryInfo() ; + for(S32 i = mNumEntries ; i < MAX_NUM_OBJECT_ENTRIES ; i++) + { + //fill the cache with the default entry. + if(!checkWrite(apr_file, entry, sizeof(HeaderEntryInfo))) + { + mReadOnly = TRUE ; //disable the cache. + return ; + } + } + delete entry ; + } + delete apr_file ; } -void LLVOCacheEntry::writeToFile(LLFILE *fp) const +BOOL LLVOCache::updateEntry(const HeaderEntryInfo* entry) { - checkedWrite(fp, &mLocalID, sizeof(U32)); - checkedWrite(fp, &mCRC, sizeof(U32)); - checkedWrite(fp, &mHitCount, sizeof(S32)); - checkedWrite(fp, &mDupeCount, sizeof(S32)); - checkedWrite(fp, &mCRCChangeCount, sizeof(S32)); - S32 size = mDP.getBufferSize(); - checkedWrite(fp, &size, sizeof(S32)); - checkedWrite(fp, mBuffer, size); + LLAPRFile* apr_file = new LLAPRFile(mHeaderFileName, APR_WRITE|APR_BINARY, mLocalAPRFilePoolp); + apr_file->seek(APR_SET, entry->mIndex * sizeof(HeaderEntryInfo) + sizeof(HeaderMetaInfo)) ; + + return checkWrite(apr_file, (void*)entry, sizeof(HeaderEntryInfo)) ; } + +void LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_entry_map_t& cache_entry_map) +{ + llassert_always(mInitialized); + + handle_entry_map_t::iterator iter = mHandleEntryMap.find(handle) ; + if(iter == mHandleEntryMap.end()) //no cache + { + return ; + } + + std::string filename; + getObjectCacheFilename(handle, filename); + LLAPRFile* apr_file = new LLAPRFile(filename, APR_READ|APR_BINARY, mLocalAPRFilePoolp); + + LLUUID cache_id ; + if(!checkRead(apr_file, cache_id.mData, UUID_BYTES)) + { + return ; + } + if(cache_id != id) + { + llinfos << "Cache ID doesn't match for this region, discarding"<< llendl; + + delete apr_file ; + return ; + } + + S32 num_entries; + if(!checkRead(apr_file, &num_entries, sizeof(S32))) + { + return ; + } + + for (S32 i = 0; i < num_entries; i++) + { + LLVOCacheEntry* entry = new LLVOCacheEntry(apr_file); + if (!entry->getLocalID()) + { + llwarns << "Aborting cache file load for " << filename << ", cache file corruption!" << llendl; + delete entry ; + break; + } + cache_entry_map[entry->getLocalID()] = entry; + } + num_entries = cache_entry_map.size() ; + + delete apr_file ; + return ; +} + +void LLVOCache::purgeEntries() +{ + U32 limit = mCacheSize - NUM_ENTRIES_TO_PURGE ; + while(mHeaderEntryQueue.size() > limit) + { + header_entry_queue_t::iterator iter = mHeaderEntryQueue.begin() ; + HeaderEntryInfo* entry = *iter ; + + removeFromCache(entry->mHandle) ; + mHandleEntryMap.erase(entry->mHandle) ; + mHeaderEntryQueue.erase(iter) ; + delete entry ; + } + + writeCacheHeader() ; + readCacheHeader() ; + mNumEntries = mHandleEntryMap.size() ; +} + +void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry::vocache_entry_map_t& cache_entry_map, BOOL dirty_cache) +{ + llassert_always(mInitialized); + + if(mReadOnly) + { + return ; + } + + HeaderEntryInfo* entry; + handle_entry_map_t::iterator iter = mHandleEntryMap.find(handle) ; + if(iter == mHandleEntryMap.end()) //new entry + { + if(mNumEntries >= mCacheSize) + { + purgeEntries() ; + } + + entry = new HeaderEntryInfo(); + entry->mHandle = handle ; + entry->mTime = time(NULL) ; + entry->mIndex = mNumEntries++ ; + mHeaderEntryQueue.insert(entry) ; + mHandleEntryMap[handle] = entry ; + } + else + { + entry = iter->second ; + entry->mTime = time(NULL) ; + + //resort + mHeaderEntryQueue.erase(entry) ; + mHeaderEntryQueue.insert(entry) ; + } + + //update cache header + if(!updateEntry(entry)) + { + return ; //update failed. + } + + if(!dirty_cache) + { + return ; //nothing changed, no need to update. + } + + //write to cache file + std::string filename; + getObjectCacheFilename(handle, filename); + LLAPRFile* apr_file = new LLAPRFile(filename, APR_CREATE|APR_WRITE|APR_BINARY, mLocalAPRFilePoolp); + + if(!checkWrite(apr_file, (void*)id.mData, UUID_BYTES)) + { + return ; + } + + S32 num_entries = cache_entry_map.size() ; + if(!checkWrite(apr_file, &num_entries, sizeof(S32))) + { + return ; + } + + for (LLVOCacheEntry::vocache_entry_map_t::const_iterator iter = cache_entry_map.begin(); iter != cache_entry_map.end(); ++iter) + { + if(!iter->second->writeToFile(apr_file)) + { + //failed + delete apr_file ; + removeCache() ; + return ; + } + } + + delete apr_file ; + return ; +} + diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h index 7a4572b399..56b48ef705 100644 --- a/indra/newview/llvocache.h +++ b/indra/newview/llvocache.h @@ -36,11 +36,11 @@ // Cache entries class LLVOCacheEntry; -class LLVOCacheEntry : public LLDLinked<LLVOCacheEntry> +class LLVOCacheEntry { public: LLVOCacheEntry(U32 local_id, U32 crc, LLDataPackerBinaryBuffer &dp); - LLVOCacheEntry(LLFILE *fp); + LLVOCacheEntry(LLAPRFile* apr_file); LLVOCacheEntry(); ~LLVOCacheEntry(); @@ -50,12 +50,15 @@ public: S32 getCRCChangeCount() const { return mCRCChangeCount; } void dump() const; - void writeToFile(LLFILE *fp) const; + BOOL writeToFile(LLAPRFile* apr_file) const; void assignCRC(U32 crc, LLDataPackerBinaryBuffer &dp); LLDataPackerBinaryBuffer *getDP(U32 crc); void recordHit(); void recordDupe() { mDupeCount++; } +public: + typedef std::map<U32, LLVOCacheEntry*> vocache_entry_map_t; + protected: U32 mLocalID; U32 mCRC; @@ -66,4 +69,81 @@ protected: U8 *mBuffer; }; +// +//Note: LLVOCache is not thread-safe +// +class LLVOCache +{ +private: + struct HeaderEntryInfo + { + HeaderEntryInfo() : mIndex(0), mHandle(0), mTime(0) {} + S32 mIndex; + U64 mHandle ; + U32 mTime ; + }; + + struct HeaderMetaInfo + { + HeaderMetaInfo() : mVersion(0){} + + U32 mVersion; + }; + + struct header_entry_less + { + bool operator()(const HeaderEntryInfo* lhs, const HeaderEntryInfo* rhs) const + { + return lhs->mTime < rhs->mTime; // older entry in front of queue (set) + } + }; + typedef std::set<HeaderEntryInfo*, header_entry_less> header_entry_queue_t; + typedef std::map<U64, HeaderEntryInfo*> handle_entry_map_t; +private: + LLVOCache() ; + +public: + ~LLVOCache() ; + + void initCache(ELLPath location, U32 size, U32 cache_version) ; + void removeCache(ELLPath location) ; + + void readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_entry_map_t& cache_entry_map) ; + void writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry::vocache_entry_map_t& cache_entry_map, BOOL dirty_cache) ; + + void setReadOnly(BOOL read_only) {mReadOnly = read_only;} + +private: + void setDirNames(ELLPath location); + // determine the cache filename for the region from the region handle + void getObjectCacheFilename(U64 handle, std::string& filename); + void removeFromCache(U64 handle); + void readCacheHeader(); + void writeCacheHeader(); + void clearCacheInMemory(); + void removeCache() ; + void purgeEntries(); + BOOL updateEntry(const HeaderEntryInfo* entry); + BOOL checkRead(LLAPRFile* apr_file, void* src, S32 n_bytes) ; + BOOL checkWrite(LLAPRFile* apr_file, void* src, S32 n_bytes) ; + +private: + BOOL mInitialized ; + BOOL mReadOnly ; + HeaderMetaInfo mMetaInfo; + U32 mCacheSize; + U32 mNumEntries; + std::string mHeaderFileName ; + std::string mObjectCacheDirName; + LLVolatileAPRPool* mLocalAPRFilePoolp ; + header_entry_queue_t mHeaderEntryQueue; + handle_entry_map_t mHandleEntryMap; + + static LLVOCache* sInstance ; +public: + static LLVOCache* getInstance() ; + static BOOL hasInstance() ; + static void destroyClass() ; +}; + #endif diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 2e003dd2b8..e674fec053 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -386,7 +386,7 @@ LLVivoxVoiceClient::~LLVivoxVoiceClient() { } -//---------------------------------------------- +//--------------------------------------------------- void LLVivoxVoiceClient::init(LLPumpIO *pump) { @@ -400,7 +400,8 @@ void LLVivoxVoiceClient::terminate() { logout(); connectorShutdown(); - closeSocket(); // Need to do this now -- bad things happen if the destructor does it later. + closeSocket(); // Need to do this now -- bad things happen if the destructor does it later. + cleanUp(); } else { @@ -408,6 +409,18 @@ void LLVivoxVoiceClient::terminate() } } +//--------------------------------------------------- + +void LLVivoxVoiceClient::cleanUp() +{ + deleteAllSessions(); + deleteAllBuddies(); + deleteAllVoiceFonts(); + deleteVoiceFontTemplates(); +} + +//--------------------------------------------------- + const LLVoiceVersionInfo& LLVivoxVoiceClient::getVersion() { return mVoiceVersion; @@ -776,14 +789,10 @@ void LLVivoxVoiceClient::stateMachine() { //MARK: stateDisableCleanup case stateDisableCleanup: - // Clean up and reset everything. + // Clean up and reset everything. closeSocket(); - deleteAllSessions(); - deleteAllBuddies(); - deleteAllVoiceFonts(); - deleteVoiceFontTemplates(); + cleanUp(); - mConnectorHandle.clear(); mAccountHandle.clear(); mAccountPassword.clear(); mVoiceAccountServerURI.clear(); @@ -1675,12 +1684,9 @@ void LLVivoxVoiceClient::stateMachine() //MARK: stateLoggedOut case stateLoggedOut: // logout response received - // Once we're logged out, all these things are invalid. + // Once we're logged out, these things are invalid. mAccountHandle.clear(); - deleteAllSessions(); - deleteAllBuddies(); - deleteAllVoiceFonts(); - deleteVoiceFontTemplates(); + cleanUp(); if(mVoiceEnabled && !mRelogRequested) { @@ -1778,6 +1784,8 @@ void LLVivoxVoiceClient::closeSocket(void) { mSocket.reset(); mConnected = false; + mConnectorHandle.clear(); + mAccountHandle.clear(); } void LLVivoxVoiceClient::loginSendMessage() @@ -2370,8 +2378,7 @@ void LLVivoxVoiceClient::giveUp() { // All has failed. Clean up and stop trying. closeSocket(); - deleteAllSessions(); - deleteAllBuddies(); + cleanUp(); setState(stateJail); } diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h index d10a562616..08f2f75a39 100644 --- a/indra/newview/llvoicevivox.h +++ b/indra/newview/llvoicevivox.h @@ -668,7 +668,10 @@ protected: private: LLVoiceVersionInfo mVoiceVersion; - + + /// Clean up objects created during a voice session. + void cleanUp(); + state mState; bool mSessionTerminateRequested; bool mRelogRequested; diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h index 0ac6b9117b..6b3e7873a1 100644 --- a/indra/newview/llvosky.h +++ b/indra/newview/llvosky.h @@ -139,10 +139,10 @@ protected: ~LLSkyTex(); - static S32 getResolution() { return sResolution; } + static S32 getResolution() { return sResolution; } static S32 getCurrent() { return sCurrent; } - static S32 stepCurrent() { return (sCurrent = (sCurrent + 1) % 2); } - static S32 getNext() { return ((sCurrent+1) % 2); } + static S32 stepCurrent() { sCurrent++; sCurrent &= 1; return sCurrent; } + static S32 getNext() { return ((sCurrent+1) & 1); } static S32 getWhich(const BOOL curr) { return curr ? sCurrent : getNext(); } void initEmpty(const S32 tex); diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h index 2b05273dc7..b060c9f076 100644 --- a/indra/newview/llwearableitemslist.h +++ b/indra/newview/llwearableitemslist.h @@ -361,7 +361,7 @@ private: bool mSortWearableTypeByName; LLWearableTypeOrder(ETypeListOrder order_priority, bool sort_asset_by_name, bool sort_wearable_by_name); - LLWearableTypeOrder(){}; + LLWearableTypeOrder() : mOrderPriority(ORDER_RANK_UNKNOWN), mSortAssetTypeByName(false), mSortWearableTypeByName(false) {}; }; ETypeListOrder getTypeListOrder(LLAssetType::EType item_type) const; diff --git a/indra/newview/llwearabletype.cpp b/indra/newview/llwearabletype.cpp index d2e62c86ab..0d707d65bf 100644 --- a/indra/newview/llwearabletype.cpp +++ b/indra/newview/llwearabletype.cpp @@ -77,8 +77,8 @@ LLWearableDictionary::LLWearableDictionary() addEntry(LLWearableType::WT_SKIRT, new WearableEntry("skirt", "New Skirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SKIRT)); addEntry(LLWearableType::WT_ALPHA, new WearableEntry("alpha", "New Alpha", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_ALPHA)); addEntry(LLWearableType::WT_TATTOO, new WearableEntry("tattoo", "New Tattoo", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_TATTOO)); - addEntry(LLWearableType::WT_INVALID, new WearableEntry("invalid", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE)); - addEntry(LLWearableType::WT_NONE, new WearableEntry("none", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE)); + addEntry(LLWearableType::WT_INVALID, new WearableEntry("invalid", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_INVALID)); + addEntry(LLWearableType::WT_NONE, new WearableEntry("none", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_INVALID)); } // static @@ -94,6 +94,7 @@ const std::string& LLWearableType::getTypeName(LLWearableType::EType type) { const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); const WearableEntry *entry = dict->lookup(type); + if (!entry) return getTypeName(WT_INVALID); return entry->mName; } @@ -102,6 +103,7 @@ const std::string& LLWearableType::getTypeDefaultNewName(LLWearableType::EType t { const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); const WearableEntry *entry = dict->lookup(type); + if (!entry) return getTypeDefaultNewName(WT_INVALID); return entry->mDefaultNewName; } @@ -110,6 +112,7 @@ const std::string& LLWearableType::getTypeLabel(LLWearableType::EType type) { const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); const WearableEntry *entry = dict->lookup(type); + if (!entry) return getTypeLabel(WT_INVALID); return entry->mLabel; } @@ -118,6 +121,7 @@ LLAssetType::EType LLWearableType::getAssetType(LLWearableType::EType type) { const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); const WearableEntry *entry = dict->lookup(type); + if (!entry) return getAssetType(WT_INVALID); return entry->mAssetType; } @@ -126,6 +130,7 @@ LLInventoryIcon::EIconName LLWearableType::getIconName(LLWearableType::EType typ { const LLWearableDictionary *dict = LLWearableDictionary::getInstance(); const WearableEntry *entry = dict->lookup(type); + if (!entry) return getIconName(WT_INVALID); return entry->mIconName; -} +} diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 2ad43ff394..5760d04a08 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -121,6 +121,7 @@ void LLWorld::destroyClass() LLViewerRegion* region_to_delete = *region_it++; removeRegion(region_to_delete->getHost()); } + LLVOCache::getInstance()->destroyClass() ; LLViewerPartSim::getInstance()->destroyClass(); } @@ -256,6 +257,8 @@ void LLWorld::removeRegion(const LLHost &host) llwarns << "Disabling region " << regionp->getName() << " that agent is in!" << llendl; LLAppViewer::instance()->forceDisconnect(LLTrans::getString("YouHaveBeenDisconnected")); + + regionp->saveObjectCache() ; //force to save objects here in case that the object cache is about to be destroyed. return; } diff --git a/indra/newview/noise.cpp b/indra/newview/noise.cpp index 00d04f7be4..5f2c718b49 100644 --- a/indra/newview/noise.cpp +++ b/indra/newview/noise.cpp @@ -30,6 +30,7 @@ #include "llrand.h" + // static #define B 0x100 S32 p[B + B + 2]; diff --git a/indra/newview/skins/default/textures/icons/Generic_Group_Large.png b/indra/newview/skins/default/textures/icons/Generic_Group_Large.png Binary files differindex de8a39fc8a..75833eccf3 100644 --- a/indra/newview/skins/default/textures/icons/Generic_Group_Large.png +++ b/indra/newview/skins/default/textures/icons/Generic_Group_Large.png diff --git a/indra/newview/skins/default/textures/icons/Generic_Person_Large.png b/indra/newview/skins/default/textures/icons/Generic_Person_Large.png Binary files differindex 65b0ce8b67..532288b430 100644 --- a/indra/newview/skins/default/textures/icons/Generic_Person_Large.png +++ b/indra/newview/skins/default/textures/icons/Generic_Person_Large.png diff --git a/indra/newview/skins/default/textures/icons/Inv_Invalid.png b/indra/newview/skins/default/textures/icons/Inv_Invalid.png Binary files differnew file mode 100644 index 0000000000..328be104ee --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Inv_Invalid.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index ce67cf0083..273531f9b2 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -229,7 +229,8 @@ with the same filename but different name <texture name="Inv_Underpants" file_name="icons/Inv_Underpants.png" preload="false" /> <texture name="Inv_Undershirt" file_name="icons/Inv_Undershirt.png" preload="false" /> <texture name="Inv_Link" file_name="icons/Inv_Link.png" preload="false" /> - + <texture name="Inv_Invalid" file_name="icons/Inv_Invalid.png" preload="false" /> + <texture name="Linden_Dollar_Alert" file_name="widgets/Linden_Dollar_Alert.png"/> <texture name="Linden_Dollar_Background" file_name="widgets/Linden_Dollar_Background.png"/> @@ -358,11 +359,16 @@ with the same filename but different name <texture name="Pause_Off" file_name="icons/Pause_Off.png" preload="false" /> <texture name="Pause_Over" file_name="icons/Pause_Over.png" preload="false" /> <texture name="Pause_Press" file_name="icons/Pause_Press.png" preload="false" /> + + <texture name="Permission_Visible_Online" file_name="ff_visible_online_button.tga" preload="false" /> + <texture name="Permission_Visible_Map" file_name="ff_visible_map_button.tga" preload="false" /> + <texture name="Permission_Edit_Objects_Mine" file_name="ff_edit_mine_button.tga" preload="false" /> + <texture name="Permission_Edit_Objects_Theirs" file_name="ff_edit_theirs_button.tga" preload="false" /> + <texture name="Play_Off" file_name="icons/Play_Off.png" preload="false" /> <texture name="Play_Over" file_name="icons/Play_Over.png" preload="false" /> <texture name="Play_Press" file_name="icons/Play_Press.png" preload="false" /> - <texture name="ProgressBar" file_name="widgets/ProgressBar.png" preload="true" scale.left="4" scale.top="10" scale.right="48" scale.bottom="2" /> <texture name="ProgressTrack" file_name="widgets/ProgressTrack.png" preload="true" scale.left="4" scale.top="13" scale.right="148" scale.bottom="2" /> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml index 20a376f152..bea106bf28 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml @@ -56,4 +56,27 @@ <radio_item label="Separate vinduer" name="radio" value="0"/> <radio_item label="Faner" name="radio2" value="1"/> </radio_group> + <check_box label="Oversæt Chat" name="translate_chat_checkbox" /> + <text name="translate_language_text" width="110"> + Chat Sprog: + </text> + <combo_box name="translate_language_combobox" width="146"> + <combo_box.item label="System standard" name="System Default Language"/> + <combo_box.item label="English (Engelsk)" name="English"/> + <combo_box.item label="Dansk" name="Danish"/> + <combo_box.item label="Deutsch (Tysk)" name="German"/> + <combo_box.item label="Español (Spansk)" name="Spanish"/> + <combo_box.item label="Français (Fransk)" name="French"/> + <combo_box.item label="Italiano (Italiensk)" name="Italian" /> + <combo_box.item label="Magyar (Ungarsk)" name="Hungarian" /> + <combo_box.item label="Nederlands (Hollandsk)" name="Dutch" /> + <combo_box.item label="Polski (Polsk)" name="Polish" /> + <combo_box.item label="Português (Portugisisk)" name="Portugese" /> + <combo_box.item label="Русский (Russisk)" name="Russian" /> + <combo_box.item label="Türkçe (Tyrkisk)" name="Turkish" /> + <combo_box.item label="Українська (Ukrainsk)" name="Ukrainian" /> + <combo_box.item label="中文 (简体) (Kinesisk)" name="Chinese" /> + <combo_box.item label="日本語 (Japansk)" name="Japanese" /> + <combo_box.item label="한국어 (Koreansk)" name="Korean" /> + </combo_box> </panel> 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 e70cb48262..6a85cf4aae 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_general.xml @@ -11,7 +11,7 @@ <combo_box.item label="Español (Spansk) - Beta" name="Spanish"/> <combo_box.item label="Français (Fransk) - Beta" name="French"/> <combo_box.item label="Polski (Polsk) - Beta" name="Polish"/> - <combo_box.item label="Portugués (Portugisisk) - Beta" name="Portugese"/> + <combo_box.item label="Português (Portugisisk) - Beta" name="Portugese"/> <combo_box.item label="日本語 (Japansk) - Beta" name="(Japanese)"/> </combo_box> <text name="language_textbox2"> diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml index 3152661fd4..712f6f8b50 100644 --- a/indra/newview/skins/default/xui/da/strings.xml +++ b/indra/newview/skins/default/xui/da/strings.xml @@ -1117,6 +1117,9 @@ <string name="InvFolder Favorite"> Favoritter </string> + <string name="InvFolder favorite"> + Favoritter + </string> <string name="InvFolder Current Outfit"> Nuværende sæt </string> 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 5f00fc4f77..f9169ed748 100644 --- a/indra/newview/skins/default/xui/de/floater_about_land.xml +++ b/indra/newview/skins/default/xui/de/floater_about_land.xml @@ -259,18 +259,18 @@ werden. <text left="204" name="other_objects_text" width="48"> [COUNT] </text> - <button label="Anzeigen" label_selected="Anzeigen" name="ShowOther" right="-135" width="60"/> - <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnOther..." right="-10" tool_tip="Objekte an ihre Eigentümer zurückgeben." width="119"/> - <text left="14" name="Selected / sat upon:" width="140"> + <button label="Anzeigen" label_selected="Anzeigen" name="ShowOther"/> + <button label="Zurückgeben" label_selected="Zurückgeben..." name="ReturnOther..." tool_tip="Objekte an ihre Eigentümer zurückgeben."/> + <text name="Selected / sat upon:"> Ausgewählt/gesessen auf: </text> - <text left="204" name="selected_objects_text" width="48"> + <text name="selected_objects_text"> [COUNT] </text> <text name="Autoreturn"> Objekte anderer Einwohner automatisch zurückgeben (Minuten, 0 für aus): </text> - <line_editor name="clean other time" right="-10" width="56"/> + <line_editor name="clean other time"/> <text name="Object Owners:"> Objekteigentümer: </text> @@ -279,7 +279,7 @@ werden. <name_list name="owner list"> <name_list.columns label="Typ" name="type"/> <name_list.columns label="Name" name="name"/> - <name_list.columns label="Anzahl" name="count" width="80"/> + <name_list.columns label="Anzahl" name="count"/> <name_list.columns label="Aktuellstes" name="mostrecent"/> </name_list> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml index 5c91b34a21..064eb3895b 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml @@ -56,4 +56,27 @@ <radio_item label="Getrennte Fenster" name="radio" value="0"/> <radio_item label="Registerkarten" name="radio2" value="1"/> </radio_group> + <check_box label="Ãbersetzen Chat" name="translate_chat_checkbox" /> + <text name="translate_language_text"> + Chat-Sprache: + </text> + <combo_box name="translate_language_combobox" width="200"> + <combo_box.item name="System Default Language" label="Betriebssystem-Einstellung" /> + <combo_box.item name="English" label="English (Englisch)" /> + <combo_box.item name="Danish" label="Danks (Dänisch)" /> + <combo_box.item name="German" label="Deutsch" /> + <combo_box.item name="Spanish" label="Español (Spanisch)" /> + <combo_box.item name="French" label="Français (Französisch)" /> + <combo_box.item name="Italian" label="Italiano (Italienisch)" /> + <combo_box.item name="Hungarian" label="Magyar (Ungarisch)" /> + <combo_box.item name="Dutch" label="Nederlands (Niederländisch)" /> + <combo_box.item name="Polish" label="Polski (Polnisch)" /> + <combo_box.item name="Portugese" label="Português (Portugiesisch)" /> + <combo_box.item name="Russian" label="Русский (Russian)" /> + <combo_box.item name="Turkish" label="Türkçe (Türkisch)" /> + <combo_box.item name="Ukrainian" label="Українська (Ukrainisch)" /> + <combo_box.item name="Chinese" label="中文 (简体) (Chinesisch)" /> + <combo_box.item name="Japanese" label="日本語 (Japanisch)" /> + <combo_box.item name="Korean" label="한국어 (Koreanisch)" /> + </combo_box> </panel> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index bf7d2ef3b3..1adc4e3db1 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -1147,6 +1147,9 @@ <string name="InvFolder Favorite"> Favoriten </string> + <string name="InvFolder favorite"> + Favoriten + </string> <string name="InvFolder Current Outfit"> Aktuelles Outfit </string> 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 99bf3e6bc1..e6f11cac60 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -1044,7 +1044,7 @@ Leyla Linden </text> left="28" name="Selected / sat upon:" top_pad="5" - width="176"> + width="230"> Selected / sat upon: </text> <text @@ -1053,7 +1053,7 @@ Leyla Linden </text> follows="left|top" height="23" layout="topleft" - left_delta="172" + left_delta="220" name="selected_objects_text" top_delta="0" width="48"> @@ -1143,11 +1143,11 @@ Leyla Linden </text> <name_list.columns label="Count" name="count" - width="60" /> + width="67" /> <name_list.columns label="Most Recent" name="mostrecent" - width="170" /> + width="163" /> </name_list> </panel> <panel diff --git a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml index 42a9ff551e..65e2462ef8 100644 --- a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml @@ -359,9 +359,9 @@ increment="1" initial_value="0" label="Hour" - label_width="30" + label_width="35" layout="topleft" - left_delta="25" + left_delta="20" max_val="100" name="WLCurKeyHour" top_pad="4" @@ -374,13 +374,13 @@ increment="5" initial_value="0" label="Min" - label_width="20" + label_width="45" layout="topleft" left_pad="5" max_val="55" name="WLCurKeyMin" top_delta="0" - width="60" /> + width="85" /> <text type="string" length="1" @@ -456,9 +456,9 @@ increment="1" initial_value="0" label="Hour" - label_width="30" + label_width="33" layout="topleft" - left_delta="0" + left_delta="-3" max_val="100" name="WLLengthOfDayHour" top_pad="4" @@ -471,13 +471,13 @@ increment="1" initial_value="0" label="Min" - label_width="20" + label_width="25" layout="topleft" - left_pad="5" + left_pad="2" max_val="59" name="WLLengthOfDayMin" top_delta="0" - width="60" /> + width="65" /> <spinner control_name="WLLengthOfDaySec" decimal_digits="0" @@ -486,13 +486,13 @@ increment="1" initial_value="24" label="Sec" - label_width="20" + label_width="25" layout="topleft" - left_pad="5" + left_pad="2" max_val="59" name="WLLengthOfDaySec" top_delta="0" - width="60"/> + width="65"/> <text type="string" halign="right" diff --git a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml index 3b26c2ab59..4c5113aa55 100644 --- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml @@ -14,7 +14,7 @@ can_dock="true" bevel_style="in" height="300" - min_width="150" + min_width="235" layout="topleft" name="nearby_chat" help_topic="nearby_chat" @@ -24,15 +24,25 @@ save_visibility="true" single_instance="true" width="320"> + <check_box + bottom_delta="36" + control_name="TranslateChat" + enabled="true" + height="16" + label="Translate chat (powered by Google)" + layout="topleft" + left="5" + name="translate_chat_checkbox" + width="230" /> <chat_history parse_urls="true" bg_readonly_color="ChatHistoryBgColor" bg_writeable_color="ChatHistoryBgColor" follows="all" left="5" - top="20" + top_delta="17" layout="topleft" - height="275" + height="260" name="chat_history" parse_highlights="true" text_color="ChatHistoryTextColor" diff --git a/indra/newview/skins/default/xui/en/floater_side_bar_tab.xml b/indra/newview/skins/default/xui/en/floater_side_bar_tab.xml index bf0913fde7..9f14e9ae0a 100644 --- a/indra/newview/skins/default/xui/en/floater_side_bar_tab.xml +++ b/indra/newview/skins/default/xui/en/floater_side_bar_tab.xml @@ -2,7 +2,8 @@ <floater can_close="false" can_resize="true" - min_width="150" + min_width="333" + min_height="440" save_rect="true" save_visibility="true" > diff --git a/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml index 92752a0fee..22796f7b68 100644 --- a/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml +++ b/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml @@ -31,6 +31,14 @@ function="CheckControl" parameter="FriendsListShowIcons" /> </menu_item_check> + <menu_item_check name="view_permissions" label="View Permissions Granted"> + <menu_item_check.on_click + function="People.Friends.ViewSort.Action" + parameter="view_permissions" /> + <menu_item_check.on_check + function="CheckControl" + parameter="FriendsListShowPermissions" /> + </menu_item_check> <menu_item_separator layout="topleft" /> <menu_item_call name="show_blocked_list" label="Show Blocked Residents & Objects"> <menu_item_call.on_click function="SideTray.ShowPanel" parameter="panel_block_list_sidetray" /> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index c79a484ef6..19707c1bc9 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -1669,8 +1669,8 @@ </menu_item_call> <menu_item_separator visible="false"/> - <!-- Made invisible to avoid a dissonance: menu item toggle menu where it is located. EXT-8069. - Can't be removed to keep sortcut workable. + <!-- Made invisible to avoid a dissonance: menu item toggles the menu where it is located. EXT-8069. + Can't be removed, to keep shortcut workable. --> <menu_item_check label="Show Advanced Menu" @@ -2629,8 +2629,8 @@ function="Advanced.PrintTextureMemoryStats" /> </menu_item_call> <menu_item_check - label="Double-ClickAuto-Pilot" - name="Double-ClickAuto-Pilot"> + label="Double-Click Auto-Pilot" + name="Double-Click Auto-Pilot"> <menu_item_check.on_check function="CheckControl" parameter="DoubleClickAutoPilot" /> @@ -2638,6 +2638,16 @@ function="ToggleControl" parameter="DoubleClickAutoPilot" /> </menu_item_check> + <menu_item_check + label="Double-Click Teleport" + name="DoubleClick Teleport"> + <menu_item_check.on_check + function="CheckControl" + parameter="DoubleClickTeleport" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="DoubleClickTeleport" /> + </menu_item_check> <menu_item_separator /> diff --git a/indra/newview/skins/default/xui/en/menu_wearing_gear.xml b/indra/newview/skins/default/xui/en/menu_wearing_gear.xml index 747352cb29..84ab16c709 100644 --- a/indra/newview/skins/default/xui/en/menu_wearing_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_wearing_gear.xml @@ -10,4 +10,14 @@ <on_click function="Gear.Edit" /> </menu_item_call> + <menu_item_call + label="Take Off" + layout="topleft" + name="takeoff"> + <on_click + function="Gear.TakeOff" /> + <on_enable + function="Gear.OnEnable" + parameter="take_off" /> + </menu_item_call> </menu> diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml index f58715be56..b385654010 100644 --- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml @@ -65,11 +65,55 @@ height="15" layout="topleft" left_pad="5" - right="-72" + right="-164" name="last_interaction" text_color="LtGray_50" value="0s" width="35" /> + <icon + height="20" + follows="right" + image_name="Permission_Visible_Online" + layout="topleft" + left_pad="3" + right="-141" + name="permission_online_icon" + tool_tip="This friend can see when you're online" + top="2" + width="20" /> + <icon + height="20" + follows="right" + image_name="Permission_Visible_Map" + layout="topleft" + left_pad="3" + tool_tip="This friend can locate you on the map" + right="-118" + name="permission_map_icon" + top_delta="0" + width="20" /> + <icon + height="20" + follows="right" + image_name="Permission_Edit_Objects_Mine" + layout="topleft" + left_pad="3" + right="-95" + name="permission_edit_mine_icon" + tool_tip="This friend can edit, delete or take your objects" + top_delta="0" + width="20" /> + <icon + height="20" + follows="right" + image_name="Permission_Edit_Objects_Theirs" + layout="topleft" + left_pad="3" + right="-72" + name="permission_edit_theirs_icon" + tool_tip="You can edit this friend's objects" + top_delta="0" + width="20" /> <button follows="right" height="16" @@ -80,7 +124,7 @@ right="-53" name="info_btn" tab_stop="false" - top_delta="-2" + top_delta="2" width="16" /> <button follows="right" diff --git a/indra/newview/skins/default/xui/en/panel_edit_profile.xml b/indra/newview/skins/default/xui/en/panel_edit_profile.xml index 8715a3a7a8..903dcd4c24 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_profile.xml @@ -320,7 +320,7 @@ left="10" name="partner_edit_link" value="[[URL] Edit]" - width="50" /> + width="70" /> </panel> </panel> </scroll_container> diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml index eb02d4104b..2a3add161a 100644 --- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml @@ -84,7 +84,7 @@ background_visible="true" follows="all" left="8" top_pad="0" - height="536" + height="506" width="292" border_size="0"> <layout_panel @@ -176,15 +176,27 @@ background_visible="true" </accordion_tab> </accordion> </layout_panel> - <layout_panel + </layout_stack> + + <layout_stack + name="layout" + orientation="horizontal" + follows="bottom|left|right" + left="8" + top_pad="0" + height="30" + width="292" + border_size="0"> + + <layout_panel height="30" layout="topleft" auto_resize="false" left="0" top_pad="0" - name="button_row" - follows="bottom|left|right" - width="313"> + name="button_row" + follows="bottom|left|right" + width="313"> <layout_stack follows="bottom|left|right" @@ -307,5 +319,7 @@ background_visible="true" visible="false" width="65" />--> </layout_panel> - </layout_stack> + + </layout_stack> + </panel> 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 c5d6aced7a..f8ae238148 100644 --- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -57,7 +57,7 @@ translate="false" value="Parcel_R_Dark" /> <button - follows="top|right" + follows="top|left" height="24" image_hover_unselected="BackButton_Over" image_pressed="BackButton_Press" diff --git a/indra/newview/skins/default/xui/en/panel_me.xml b/indra/newview/skins/default/xui/en/panel_me.xml index 63c522ac69..84b5d11ba7 100644 --- a/indra/newview/skins/default/xui/en/panel_me.xml +++ b/indra/newview/skins/default/xui/en/panel_me.xml @@ -26,7 +26,7 @@ </text> --> <tab_container follows="all" - height="575" + height="555" halign="center" layout="topleft" left="5" diff --git a/indra/newview/skins/default/xui/en/panel_my_profile.xml b/indra/newview/skins/default/xui/en/panel_my_profile.xml index 684d38146a..37a1ed3048 100644 --- a/indra/newview/skins/default/xui/en/panel_my_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml @@ -41,7 +41,7 @@ layout="topleft" left="0" top="0" - height="522" + height="510" width="315" border_size="0"> <layout_panel @@ -324,82 +324,25 @@ </panel> </scroll_container> </layout_panel> - <!-- <layout_panel - follows="bottom|left" + </layout_stack> + <panel + follows="bottom|left|right" + height="23" layout="topleft" left="0" - name="profile_buttons_panel" - height="28" - width="313"> - <button - follows="bottom|left" - height="23" - label="Add Friend" - layout="topleft" - left="0" - mouse_opaque="false" - name="add_friend" - tool_tip="Offer friendship to the Resident" - top="5" - width="80" /> - <button - follows="bottom|left" - height="23" - label="IM" - layout="topleft" - name="im" - top="5" - left_pad="3" - width="45" /> - <button - follows="bottom|left" - height="23" - label="Call" - layout="topleft" - name="call" - left_pad="3" - top="5" - width="45" /> - <button - enabled="false" - follows="bottom|left" - height="23" - label="Map" - layout="topleft" - name="show_on_map_btn" - top="5" - left_pad="3" - width="45" /> - <button - follows="bottom|left" - height="23" - label="Teleport" - layout="topleft" - name="teleport" - left_pad="3" - top="5" - width="85" /> - </panel>--> - <layout_panel - follows="bottom|left" - layout="topleft" - left="0" - top_pad="0" + top_pad="1" name="profile_me_buttons_panel" visible="false" - user_resize="false" - auto_resize="false" - height="28" width="315"> <button follows="bottom" height="23" left="6" - top="1" + top="1" label="Edit Profile" name="edit_profile_btn" tool_tip="Edit your personal information" width="152" /> - </layout_panel> -</layout_stack> + </panel> + </panel> diff --git a/indra/newview/skins/default/xui/en/panel_notes.xml b/indra/newview/skins/default/xui/en/panel_notes.xml index 530e191952..124b1cfc6b 100644 --- a/indra/newview/skins/default/xui/en/panel_notes.xml +++ b/indra/newview/skins/default/xui/en/panel_notes.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel follows="all" - height="533" + height="515" label="Notes & Privacy" layout="topleft" left="0" diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml index 1cbdecab9d..883cbb30c6 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml @@ -295,7 +295,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap auto_resize="true" default_tab_group="3" height="450" - min_height="73" + min_height="80" name="add_wearables_panel" width="313" tab_group="2" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 059283ce09..ab8930c967 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -192,6 +192,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M left="0" multi_select="true" name="avatars_online" + show_permissions_granted="true" top="0" width="307" /> </accordion_tab> @@ -208,6 +209,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M left="0" multi_select="true" name="avatars_all" + show_permissions_granted="true" top="0" width="307" /> </accordion_tab> diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml index 647be28a62..4f7c4fa9b2 100644 --- a/indra/newview/skins/default/xui/en/panel_picks.xml +++ b/indra/newview/skins/default/xui/en/panel_picks.xml @@ -30,7 +30,7 @@ bg_opaque_color="DkGray2" <accordion fit_parent="true" follows="all" - height="470" + height="485" layout="topleft" left="0" name="accordion" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index ba967d3e2c..31e160ec33 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -104,7 +104,7 @@ layout="topleft" left="190" name="agent" - top_pad="-17" + top_pad="-15" width="44" > <color_swatch.init_callback function="Pref.getUIColor" @@ -135,7 +135,7 @@ layout="topleft" left="360" name="im" - top_pad="-17" + top_pad="-15" width="44"> <color_swatch.init_callback function="Pref.getUIColor" @@ -166,7 +166,7 @@ layout="topleft" left="40" name="system" - top_pad="40" + top_pad="22" width="44" > <color_swatch.init_callback function="Pref.getUIColor" @@ -196,7 +196,7 @@ layout="topleft" left="190" name="script_error" - top_pad="-17" + top_pad="-15" width="44"> <color_swatch.init_callback function="Pref.getUIColor" @@ -226,7 +226,7 @@ layout="topleft" left="360" name="objects" - top_pad="-17" + top_pad="-15" width="44" > <color_swatch.init_callback function="Pref.getUIColor" @@ -256,7 +256,7 @@ layout="topleft" left="40" name="owner" - top_pad="40" + top_pad="22" width="44" > <color_swatch.init_callback function="Pref.getUIColor" @@ -286,7 +286,7 @@ layout="topleft" left="190" name="links" - top_pad="-17" + top_pad="-15" width="44" > <color_swatch.init_callback function="Pref.getUIColor" @@ -316,7 +316,7 @@ layout="topleft" left="30" name="play_typing_animation" - top_pad="40" + top_pad="32" width="400" /> <check_box enabled="false" @@ -343,7 +343,7 @@ left="30" height="20" width="170" - top_pad="20"> + top_pad="14"> Show IMs in: </text> <text @@ -386,4 +386,106 @@ top_pad="5" width="150" /> </radio_group> + <check_box + control_name="TranslateChat" + enabled="true" + height="16" + label="Use machine translation while chatting (powered by Google)" + layout="topleft" + left="30" + name="translate_chat_checkbox" + bottom_delta="40" + width="400" /> + <text + bottom_delta="30" + name="translate_language_text" + follows="left|top" + layout="topleft" + left_delta="20" + height="20" + width="110"> + Translate chat into: + </text> + <combo_box + allow_text_entry="true" + bottom_delta="3" + control_name="TranslateLanguage" + enabled="true" + follows="left|top" + height="23" + left_delta="110" + max_chars="135" + mouse_opaque="true" + name="translate_language_combobox" + width="146"> + <combo_box.item + label="System Default" + name="System Default Language" + value="default" /> + <combo_box.item + label="English" + name="English" + value="en" /> + <!-- After "System Default" and "English", please keep the rest of these combo_box.items in alphabetical order by the first character in the string. --> + <combo_box.item + label="Dansk (Danish)" + name="Danish" + value="da" /> + <combo_box.item + label="Deutsch (German)" + name="German" + value="de" /> + <combo_box.item + label="Español (Spanish)" + name="Spanish" + value="es" /> + <combo_box.item + label="Français (French)" + name="French" + value="fr" /> + <combo_box.item + label="Italiano (Italian)" + name="Italian" + value="it" /> + <combo_box.item + label="Magyar (Hungarian)" + name="Hungarian" + value="hu" /> + <combo_box.item + label="Nederlands (Dutch)" + name="Dutch" + value="nl" /> + <combo_box.item + label="Polski (Polish)" + name="Polish" + value="pl" /> + <combo_box.item + label="Português (Portuguese)" + name="Portugese" + value="pt" /> + <combo_box.item + label="Русский (Russian)" + name="Russian" + value="ru" /> + <combo_box.item + label="Türkçe (Turkish)" + name="Turkish" + value="tr" /> + <combo_box.item + label="Українська (Ukrainian)" + name="Ukrainian" + value="uk" /> + <combo_box.item + label="中文 (简体) (Chinese)" + name="Chinese" + value="zh" /> + <combo_box.item + label="日本語 (Japanese)" + name="Japanese" + value="ja" /> + <combo_box.item + label="한국어 (Korean)" + name="Korean" + value="ko" /> + </combo_box> </panel> 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 a69e8d29b0..17eebffa02 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -77,7 +77,7 @@ value="pl" /> <combo_box.item enabled="true" - label="Portugués (Portuguese) - Beta" + label="Português (Portuguese) - Beta" name="Portugese" value="pt" /> <combo_box.item diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index 88d7e68894..e2cd27c419 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel follows="all" - height="540" + height="430" label="Profile" layout="topleft" left="0" @@ -41,7 +41,7 @@ layout="topleft" left="0" top="0" - height="524" + height="400" width="317" border_size="0"> <layout_panel @@ -50,7 +50,7 @@ layout="topleft" top="0" left="0" - height="524" + height="400" width="317"> <scroll_container color="DkGray2" @@ -304,11 +304,25 @@ </panel> </scroll_container> </layout_panel> - <layout_panel + +</layout_stack> + + <layout_stack + name="layout_verb_buttons" + orientation="horizontal" + follows="bottom|left|right" + layout="topleft" + left="2" + top_pad="1" + height="30" + width="315" + border_size="0"> + <layout_panel follows="bottom|left" height="30" layout="topleft" name="profile_buttons_panel" + top="0" auto_resize="false" width="317"> @@ -448,6 +462,6 @@ tool_tip="Edit your personal information" width="130" /> </layout_panel> + </layout_stack> -</layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml index 41c7b95c9f..3b4d6ae58d 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml @@ -56,7 +56,7 @@ width="150" /> <tab_container follows="all" - height="538" + height="515" halign="center" layout="topleft" left="5" 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 4f923f411c..182bc29e27 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -79,333 +79,342 @@ use_ellipses="true" value="(Inventory)" width="275" /> - <panel - follows="all" - height="493" - help_topic="" - label="" - layout="topleft" - left="9" - name="item_profile" - top="45" - width="313" - background_visible="true" - bg_alpha_color="DkGray2"> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="5" - name="LabelItemNameTitle" - top="10" - width="78"> - Name: - </text> - <line_editor - border_style="line" - border_thickness="1" - follows="left|top|right" - height="20" - layout="topleft" - left_delta="78" - max_length="63" - name="LabelItemName" - top_delta="0" - width="225" /> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="5" - name="LabelItemDescTitle" - top_pad="10" - width="78"> - Description: - </text> - <line_editor - border_style="line" - border_thickness="1" - follows="left|top|right" - height="23" - layout="topleft" - left_delta="78" - max_length="127" - name="LabelItemDesc" - top_delta="-5" - width="225" /> - <text - type="string" - length="1" - follows="left|top" - height="23" - layout="topleft" - left="5" - name="LabelCreatorTitle" - top_pad="10" - width="78"> - Creator: - </text> - <avatar_icon - follows="top|left" - height="20" - default_icon_name="Generic_Person" - layout="topleft" - left_pad="0" - top_delta="-6" - mouse_opaque="true" - width="20" /> - <text - type="string" - follows="left|right|top" - font="SansSerifSmall" - height="15" + <scroll_container + color="DkGray2" + follows="all" layout="topleft" - left_pad="5" - name="LabelCreatorName" - top_delta="6" - width="140"> - </text> - <button - follows="top|right" - height="16" - image_selected="Inspector_I" - image_unselected="Inspector_I" - layout="topleft" - right="-5" - name="BtnCreator" - top_delta="-6" - width="16" /> - <text - type="string" - length="1" - follows="left|top" - height="23" - layout="topleft" - left="5" - name="LabelOwnerTitle" - top_pad="10" - width="78"> - Owner: - </text> - <avatar_icon - follows="top|left" - height="20" - default_icon_name="Generic_Person" - layout="topleft" - left_pad="0" - top_delta="-6" - mouse_opaque="true" - width="20" /> - <text - type="string" - follows="left|right|top" - font="SansSerifSmall" - height="15" - layout="topleft" - left_pad="5" - name="LabelOwnerName" - top_delta="6" - width="140"> - </text> - <button - follows="top|right" - height="16" - image_selected="Inspector_I" - image_unselected="Inspector_I" - layout="topleft" - right="-5" - name="BtnOwner" - top_delta="-3" - width="16" /> - <text - type="string" - length="1" - follows="left|top" - height="23" - layout="topleft" - left="5" - name="LabelAcquiredTitle" -top_pad="10" - width="78"> - Acquired: - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="23" - layout="topleft" - left_delta="78" - name="LabelAcquiredDate" - top_delta="0" - width="222"> - </text> - <panel - border="false" - follows="left|top|right" + left="9" + name="item_profile_scroll" + opaque="true" + height="493" + width="313" + top="45"> + <panel + follows="left|top|right" + height="390" + help_topic="" + label="" + layout="topleft" + left="0" + name="item_profile" + top="0" + width="295"> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="5" + name="LabelItemNameTitle" + top="10" + width="78"> + Name: + </text> + <line_editor + border_style="line" + border_thickness="1" + follows="left|top|right" + height="20" + layout="topleft" + left_delta="78" + max_length="63" + name="LabelItemName" + top_delta="0" + width="210" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left="5" + name="LabelItemDescTitle" + top_pad="10" + width="78"> + Description: + </text> + <line_editor + border_style="line" + border_thickness="1" + follows="left|top|right" + height="23" + layout="topleft" + left_delta="78" + max_length="127" + name="LabelItemDesc" + top_delta="-5" + width="210" /> + <text + type="string" + length="1" + follows="left|top" + height="23" + layout="topleft" + left="5" + name="LabelCreatorTitle" + top_pad="10" + width="78"> + Creator: + </text> + <avatar_icon + follows="top|left" + height="20" + default_icon_name="Generic_Person" layout="topleft" - mouse_opaque="false" - name="perms_inv" - left="0" - top_pad="25" - height="155" - width="313"> - <text - type="string" - length="1" - left="10" - top_pad="13" - text_color="EmphasisColor" - height="15" + left_pad="0" + top_delta="-6" + mouse_opaque="true" + width="20" /> + <text + type="string" + follows="left|right|top" + font="SansSerifSmall" + height="15" + layout="topleft" + left_pad="5" + name="LabelCreatorName" + top_delta="6" + width="140"> + </text> + <button + follows="top|right" + height="16" + image_selected="Inspector_I" + image_unselected="Inspector_I" + layout="topleft" + right="-5" + name="BtnCreator" + top_delta="-6" + width="16" /> + <text + type="string" + length="1" + follows="left|top" + height="23" + layout="topleft" + left="5" + name="LabelOwnerTitle" + top_pad="10" + width="78"> + Owner: + </text> + <avatar_icon + follows="top|left" + height="20" + default_icon_name="Generic_Person" + layout="topleft" + left_pad="0" + top_delta="-6" + mouse_opaque="true" + width="20" /> + <text + type="string" + follows="left|right|top" + font="SansSerifSmall" + height="15" + layout="topleft" + left_pad="5" + name="LabelOwnerName" + top_delta="6" + width="140"> + </text> + <button + follows="top|right" + height="16" + image_selected="Inspector_I" + image_unselected="Inspector_I" + layout="topleft" + right="-5" + name="BtnOwner" + top_delta="-3" + width="16" /> + <text + type="string" + length="1" + follows="left|top" + height="23" + layout="topleft" + left="5" + name="LabelAcquiredTitle" + top_pad="10" + width="78"> + Acquired: + </text> + <text + type="string" + length="1" + follows="left|top|right" + height="23" + layout="topleft" + left_delta="78" + name="LabelAcquiredDate" + top_delta="0" + width="210"> + </text> + <panel + border="false" follows="left|top|right" layout="topleft" - name="perm_modify" - width="200"> - You can: + mouse_opaque="false" + name="perms_inv" + left="0" + top_pad="25" + height="155" + width="313"> + <text + type="string" + length="1" + left="10" + top_pad="13" + text_color="EmphasisColor" + height="15" + follows="left|top|right" + layout="topleft" + name="perm_modify" + width="200"> + You can: + </text> + <check_box + height="18" + label="Modify" + layout="topleft" + left="20" + name="CheckOwnerModify" + top_pad="0" + width="90" /> + <check_box + height="18" + label="Copy" + layout="topleft" + left_pad="0" + name="CheckOwnerCopy" + width="90" /> + <check_box + height="18" + label="Transfer" + layout="topleft" + left_pad="0" + name="CheckOwnerTransfer" + width="106" /> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="10" + name="AnyoneLabel" + top_pad="8" + width="100"> + Anyone: </text> - <check_box - height="18" - label="Modify" - layout="topleft" - left="20" - name="CheckOwnerModify" - top_pad="0" - width="90" /> - <check_box - height="18" - label="Copy" - layout="topleft" - left_pad="0" - name="CheckOwnerCopy" - width="90" /> - <check_box - height="18" - label="Transfer" - layout="topleft" - left_pad="0" - name="CheckOwnerTransfer" - width="106" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - name="AnyoneLabel" - top_pad="8" - width="100"> - Anyone: - </text> - <check_box - height="18" - label="Copy" - layout="topleft" - left_pad="0" - name="CheckEveryoneCopy" - top_delta="-2" - width="150" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - name="GroupLabel" - top_pad="8" - width="100"> - Group: - </text> - <check_box - height="18" - label="Share" - layout="topleft" - left_pad="0" - top_delta="-2" - name="CheckShareWithGroup" - 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="150" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - name="NextOwnerLabel" - top_pad="8" - width="200" - word_wrap="true"> - Next owner: - </text> - <check_box - height="18" - label="Modify" - layout="topleft" - left="20" - top_pad="0" - name="CheckNextOwnerModify" - width="90" /> - <check_box - height="18" - label="Copy" - layout="topleft" - left_pad="0" - name="CheckNextOwnerCopy" - width="90" /> - <check_box - height="18" - label="Transfer" - layout="topleft" - left_pad="0" - name="CheckNextOwnerTransfer" - tool_tip="Next owner can give away or resell this object" - width="106" /> - </panel> - <check_box - height="18" - label="For Sale" - layout="topleft" - left="20" - name="CheckPurchase" - top_pad="20" - width="100" /> - <combo_box - height="23" - left_pad="0" - layout="topleft" - follows="left|top" - name="combobox sale copy" - width="170"> - <combo_box.item - label="Copy" - name="Copy" - value="Copy" /> - <combo_box.item - label="Original" - name="Original" - value="Original" /> - </combo_box> - <spinner - follows="left|top" - decimal_digits="0" - increment="1" - control_name="Edit Cost" - name="Edit Cost" - label="Price: L$" - label_width="75" - left="120" - width="170" - min_val="0" - height="23" - max_val="999999999" - top_pad="10"/> - </panel> + <check_box + height="18" + label="Copy" + layout="topleft" + left_pad="0" + name="CheckEveryoneCopy" + top_delta="-2" + width="150" /> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="10" + name="GroupLabel" + top_pad="8" + width="100"> + Group: + </text> + <check_box + height="18" + label="Share" + layout="topleft" + left_pad="0" + top_delta="-2" + name="CheckShareWithGroup" + 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="150" /> + <text + type="string" + length="1" + follows="left|top" + height="16" + layout="topleft" + left="10" + name="NextOwnerLabel" + top_pad="8" + width="200" + word_wrap="true"> + Next owner: + </text> + <check_box + height="18" + label="Modify" + layout="topleft" + left="20" + top_pad="0" + name="CheckNextOwnerModify" + width="90" /> + <check_box + height="18" + label="Copy" + layout="topleft" + left_pad="0" + name="CheckNextOwnerCopy" + width="90" /> + <check_box + height="18" + label="Transfer" + layout="topleft" + left_pad="0" + name="CheckNextOwnerTransfer" + tool_tip="Next owner can give away or resell this object" + width="106" /> + </panel> + <check_box + height="18" + label="For Sale" + layout="topleft" + left="20" + name="CheckPurchase" + top_pad="20" + width="100" /> + <combo_box + height="23" + left_pad="0" + layout="topleft" + follows="left|top" + name="combobox sale copy" + width="170"> + <combo_box.item + label="Copy" + name="Copy" + value="Copy" /> + <combo_box.item + label="Original" + name="Original" + value="Original" /> + </combo_box> + <spinner + follows="left|top" + decimal_digits="0" + increment="1" + control_name="Edit Cost" + name="Edit Cost" + label="Price: L$" + label_width="75" + left="120" + width="170" + min_val="0" + height="23" + max_val="999999999" + top_pad="10"/> + </panel> + </scroll_container> <panel height="30" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index cf040b10c7..3fa5c7afec 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2019,6 +2019,7 @@ Clears (deletes) the media and all params from the given face. <string name="Stomach">Stomach</string> <string name="Left Pec">Left Pec</string> <string name="Right Pec">Right Pec</string> + <string name="Invalid Attachment">Invalid Attachment Point</string> <!-- Avatar age computation, see LLDateUtil::ageFromDate --> <string name="YearsMonthsOld">[AGEYEARS] [AGEMONTHS] old</string> @@ -2182,7 +2183,6 @@ Clears (deletes) the media and all params from the given face. <string name="ATTACH_HUD_BOTTOM_LEFT">HUD Bottom Left</string> <string name="ATTACH_HUD_BOTTOM">HUD Bottom</string> <string name="ATTACH_HUD_BOTTOM_RIGHT">HUD Bottom Right</string> - <string name="Bad attachment point">Invalid Attachment Point</string> <!-- script editor --> <string name="CursorPos">Line [LINE], Column [COLUMN]</string> @@ -2225,7 +2225,7 @@ Clears (deletes) the media and all params from the given face. <!-- panel picks --> <string name="NoPicksClassifiedsText">You haven't created any Picks or Classifieds. Click the Plus button below to create a Pick or Classified.</string> - <string name="NoAvatarPicksClassifiedsText">User has no picks or classfields</string> + <string name="NoAvatarPicksClassifiedsText">User has no picks or classifieds</string> <string name="PicksClassifiedsLoadingText">Loading...</string> <!-- Multi Preview Floater --> diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml index c672f68c5c..92831cc21c 100644 --- a/indra/newview/skins/default/xui/es/floater_about_land.xml +++ b/indra/newview/skins/default/xui/es/floater_about_land.xml @@ -221,60 +221,60 @@ Vaya al menú Mundo > Acerca del terreno o seleccione otra parcela para ver s <text name="Simulator primitive usage:"> Uso de primitivas: </text> - <text left="204" name="objects_available" width="250"> + <text name="objects_available"> [COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles) </text> - <text name="Primitives parcel supports:" width="200"> + <text name="Primitives parcel supports:"> Prims que admite la parcela: </text> - <text left="204" name="object_contrib_text" width="152"> + <text name="object_contrib_text"> [COUNT] </text> <text name="Primitives on parcel:"> Prims en la parcela: </text> - <text left="204" name="total_objects_text" width="48"> + <text name="total_objects_text"> [COUNT] </text> - <text left="14" name="Owned by parcel owner:" width="180"> + <text name="Owned by parcel owner:"> Del propietario de la parcela: </text> - <text left="204" name="owner_objects_text" width="48"> + <text name="owner_objects_text"> [COUNT] </text> - <button label="Mostrar" label_selected="Mostrar" name="ShowOwner" right="-135" width="60"/> - <button label="Devolver" name="ReturnOwner..." right="-10" tool_tip="Devolver los objetos a sus propietarios." width="119"/> - <text left="14" name="Set to group:" width="180"> + <button label="Mostrar" label_selected="Mostrar" name="ShowOwner"/> + <button label="Devolver" name="ReturnOwner..." tool_tip="Devolver los objetos a sus propietarios."/> + <text name="Set to group:"> Del grupo: </text> - <text left="204" name="group_objects_text" width="48"> + <text name="group_objects_text"> [COUNT] </text> - <button label="Mostrar" label_selected="Mostrar" name="ShowGroup" right="-135" width="60"/> - <button label="Devolver" name="ReturnGroup..." right="-10" tool_tip="Devolver los objetos a sus propietarios." width="119"/> - <text left="14" name="Owned by others:" width="128"> + <button label="Mostrar" label_selected="Mostrar" name="ShowGroup"/> + <button label="Devolver" name="ReturnGroup..." tool_tip="Devolver los objetos a sus propietarios."/> + <text name="Owned by others:"> Propiedad de otros: </text> - <text left="204" name="other_objects_text" width="48"> + <text name="other_objects_text"> [COUNT] </text> - <button label="Mostrar" label_selected="Mostrar" name="ShowOther" right="-135" width="60"/> - <button label="Devolver" name="ReturnOther..." right="-10" tool_tip="Devolver los objetos a sus propietarios." width="119"/> - <text left="14" name="Selected / sat upon:" width="193"> + <button label="Mostrar" label_selected="Mostrar" name="ShowOther"/> + <button label="Devolver" name="ReturnOther..." tool_tip="Devolver los objetos a sus propietarios."/> + <text name="Selected / sat upon:"> Seleccionados / con gente sentada: </text> - <text left="204" name="selected_objects_text" width="48"> + <text name="selected_objects_text"> [COUNT] </text> <text name="Autoreturn"> Devolución automát. de objetos de otros (en min., 0 la desactiva): </text> - <line_editor name="clean other time" right="-20"/> - <text name="Object Owners:" width="150"> + <line_editor name="clean other time"/> + <text name="Object Owners:"> Propietarios de los objetos: </text> - <button label="Actualizar la lista" label_selected="Actualizar la lista" left="158" name="Refresh List" tool_tip="Refresh Object List"/> - <button label="Devolver los objetos" left="270" name="Return objects..." width="164"/> + <button label="Actualizar la lista" label_selected="Actualizar la lista" name="Refresh List" tool_tip="Refresh Object List"/> + <button label="Devolver los objetos" name="Return objects..."/> <name_list name="owner list"> <name_list.columns label="Tipo" name="type"/> <name_list.columns label="Nombre" name="name"/> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml index fc8c908788..22f967afe6 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml @@ -56,4 +56,27 @@ <radio_item label="Varias ventanas" name="radio" value="0"/> <radio_item label="Pestañas" name="radio2" value="1"/> </radio_group> + <check_box label="Traducir Chat" name="translate_chat_checkbox" /> + <text name="translate_language_text"> + Idioma de chat: + </text> + <combo_box name="translate_language_combobox"> + <combo_box.item name="System Default Language" label="Predeterminado del sistema" /> + <combo_box.item name="English" label="English (Inglés)" /> + <combo_box.item name="Danish" label="Dansk (Danés)" /> + <combo_box.item name="German" label="Deutsch (Alemán)" /> + <combo_box.item name="Spanish" label="Español" /> + <combo_box.item name="French" label="Français (Francés)" /> + <combo_box.item name="Italian" label="Italiano" /> + <combo_box.item name="Hungarian" label="Magyar (Húngaro)" /> + <combo_box.item name="Dutch" label="Nederlands (Neerlandés)" /> + <combo_box.item name="Polish" label="Polski (Polaco)" /> + <combo_box.item name="Portugese" label="Português (Portugués)" /> + <combo_box.item name="Russian" label="Русский (Ruso)" /> + <combo_box.item name="Turkish" label="Türkçe (Turco)" /> + <combo_box.item name="Ukrainian" label="Українська (Ucraniano)" /> + <combo_box.item name="Chinese" label="中文 (简体) (Chino)" /> + <combo_box.item name="Japanese" label="日本語 (Japonés)" /> + <combo_box.item name="Korean" label="한국어 (Coreano)" /> + </combo_box> </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 ca157314aa..20109cf2c5 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml @@ -13,7 +13,7 @@ <combo_box.item label="Italiano - Beta" name="Italian"/> <combo_box.item label="Nederlands (Neerlandés) - Beta" name="Dutch"/> <combo_box.item label="Polski (Polaco) - Beta" name="Polish"/> - <combo_box.item label="Portugués (Portugués) - Beta" name="Portugese"/> + <combo_box.item label="Português (Portugués) - Beta" name="Portugese"/> <combo_box.item label="日本語 (Japonés) - Beta" name="(Japanese)"/> </combo_box> <text name="language_textbox2"> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 9f5f1f99e7..a6404bf14c 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -1120,6 +1120,9 @@ <string name="InvFolder Favorite"> Favoritos </string> + <string name="InvFolder favorite"> + Favoritos + </string> <string name="InvFolder Current Outfit"> Vestuario actual </string> @@ -1657,7 +1660,7 @@ Script nuevo </string> <string name="BusyModeResponseDefault"> - El Residente al que has enviado un mensaje ha solicitado que no se le moleste porque está en modo ocupado. Podrá ver tu mensaje más adelante, ya que éste aparecerá en su panel de MI. + El Residente al que has enviado un mensaje ha solicitado que no se le moleste porque está en modo ocupado. Podrá ver tu mensaje más adelante, ya que éste aparecerá en su panel de MI. </string> <string name="NoOutfits"> Todavía no tienes vestuario. Intenta con [secondlife:///app/search/all/ Buscar] @@ -3799,7 +3802,7 @@ Denuncia de infracción PM </string> <string name="LocalEstimateUSD"> - [AMOUNT] dólares estadounidenses + [AMOUNT] US$ </string> <string name="Membership"> Membresía diff --git a/indra/newview/skins/default/xui/fr/floater_about_land.xml b/indra/newview/skins/default/xui/fr/floater_about_land.xml index 5263de4532..b0ef1cf8df 100644 --- a/indra/newview/skins/default/xui/fr/floater_about_land.xml +++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml @@ -225,55 +225,55 @@ ou divisé. <text name="Simulator primitive usage:"> Utilisation des primitives : </text> - <text left="214" name="objects_available" width="230"> + <text name="objects_available"> [COUNT] sur [MAX] ([AVAILABLE] disponibles) </text> - <text name="Primitives parcel supports:" width="200"> + <text name="Primitives parcel supports:"> Prims max. sur la parcelle : </text> - <text left="214" name="object_contrib_text" width="152"> + <text name="object_contrib_text"> [COUNT] </text> <text name="Primitives on parcel:"> Prims sur la parcelle : </text> - <text left="214" name="total_objects_text" width="48"> + <text name="total_objects_text"> [COUNT] </text> - <text left="14" name="Owned by parcel owner:" width="180"> + <text name="Owned by parcel owner:"> Appartenant au propriétaire : </text> - <text left="214" name="owner_objects_text" width="48"> + <text name="owner_objects_text"> [COUNT] </text> - <button label="Afficher" label_selected="Afficher" name="ShowOwner" right="-135" width="60"/> - <button label="Retour" label_selected="Renvoyer..." name="ReturnOwner..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/> - <text left="14" name="Set to group:" width="180"> + <button label="Afficher" label_selected="Afficher" name="ShowOwner"/> + <button label="Retour" label_selected="Renvoyer..." name="ReturnOwner..." tool_tip="Renvoyer les objets à leurs propriétaires."/> + <text name="Set to group:"> Données au groupe : </text> - <text left="214" name="group_objects_text" width="48"> + <text name="group_objects_text"> [COUNT] </text> - <button label="Afficher" label_selected="Afficher" name="ShowGroup" right="-135" width="60"/> - <button label="Retour" label_selected="Renvoyer..." name="ReturnGroup..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/> - <text left="14" name="Owned by others:" width="128"> + <button label="Afficher" label_selected="Afficher" name="ShowGroup" /> + <button label="Retour" label_selected="Renvoyer..." name="ReturnGroup..." tool_tip="Renvoyer les objets à leurs propriétaires."/> + <text name="Owned by others:"> Appartenant à d'autres : </text> - <text left="214" name="other_objects_text" width="48"> + <text name="other_objects_text"> [COUNT] </text> - <button label="Afficher" label_selected="Afficher" name="ShowOther" right="-135" width="60"/> - <button label="Retour" label_selected="Renvoyer..." name="ReturnOther..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/> - <text left="14" name="Selected / sat upon:" width="220"> + <button label="Afficher" label_selected="Afficher" name="ShowOther"/> + <button label="Retour" label_selected="Renvoyer..." name="ReturnOther..." tool_tip="Renvoyer les objets à leurs propriétaires."/> + <text name="Selected / sat upon:"> Sélectionnées/où quelqu'un est assis : </text> - <text left_delta="214" name="selected_objects_text" width="48"> + <text name="selected_objects_text"> [COUNT] </text> <text name="Autoreturn"> Renvoi automatique des objets d'autres résidents (minutes, 0 pour désactiver) : </text> - <line_editor name="clean other time" right="-6" width="36"/> + <line_editor name="clean other time"/> <text name="Object Owners:"> Propriétaires : </text> @@ -281,10 +281,9 @@ ou divisé. <button label="Renvoi des objets" label_selected="Renvoyer les objets..." name="Return objects..."/> <name_list label="Plus récents" name="owner list"> <name_list.columns label="Type" name="type"/> - <name_list.columns name="online_status"/> - <name_list.columns label="Nom" name="name" width="100"/> - <name_list.columns label="Nombre" name="count" width="100"/> - <name_list.columns label="Plus récents" name="mostrecent" width="120"/> + <name_list.columns label="Nom" name="name"/> + <name_list.columns label="Nombre" name="count"/> + <name_list.columns label="Plus récents" name="mostrecent"/> </name_list> </panel> <panel label="OPTIONS" name="land_options_panel"> @@ -343,9 +342,9 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche. Options du terrain : </text> <check_box label="Sécurisé (pas de dégâts)" name="check safe" tool_tip="Si cette option est cochée, le terrain est sécurisé et il n'y pas de risques de dommages causés par des combats. Si elle est décochée, des dommages causés par les combats peuvent avoir lieu."/> - <check_box bottom="-140" label="Pas de bousculades" left="14" name="PushRestrictCheck" tool_tip="Empêche l'utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/> - <check_box bottom="-160" label="Afficher le lieu dans la recherche (30 L$/semaine)" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/> - <combo_box bottom="-160" left="286" name="land category with adult" width="146"> + <check_box label="Pas de bousculades" name="PushRestrictCheck" tool_tip="Empêche l'utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/> + <check_box label="Afficher le lieu dans la recherche (30 L$/semaine)" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/> + <combo_box name="land category with adult"> <combo_box.item label="Toutes catégories" name="item0"/> <combo_box.item label="Appartenant aux Lindens" name="item1"/> <combo_box.item label="Adult" name="item2"/> @@ -360,7 +359,7 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche. <combo_box.item label="Shopping" name="item11"/> <combo_box.item label="Autre" name="item12"/> </combo_box> - <combo_box bottom="-160" left="286" name="land category" width="146"> + <combo_box name="land category"> <combo_box.item label="Toutes catégories" name="item0"/> <combo_box.item label="Appartenant aux Lindens" name="item1"/> <combo_box.item label="Art et Culture" name="item3"/> @@ -374,20 +373,20 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche. <combo_box.item label="Shopping" name="item11"/> <combo_box.item label="Autre" name="item12"/> </combo_box> - <check_box bottom="-180" label="Contenu Modéré" name="MatureCheck" tool_tip=""/> - <text bottom="-200" name="Snapshot:"> + <check_box label="Contenu Modéré" name="MatureCheck" tool_tip=""/> + <text name="Snapshot:"> Photo : </text> - <texture_picker bottom="-319" label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/> + <texture_picker label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/> <text name="landing_point"> Lieu d'arrivée : [LANDING] </text> <button label="Définir" label_selected="Définir" name="Set" tool_tip="Définit le point d'arrivée des visiteurs. Définit l'emplacement de votre avatar sur ce terrain."/> <button label="Annuler" label_selected="Annuler" name="Clear" tool_tip="Effacer le lieu d'arrivée"/> - <text bottom="-343" name="Teleport Routing: "> + <text name="Teleport Routing: "> Règles de téléportation : </text> - <combo_box bottom="-343" left="140" name="landing type" tool_tip="Règles de téléportation - Choisissez les règles de téléportation sur votre terrain" width="140"> + <combo_box name="landing type" tool_tip="Règles de téléportation - Choisissez les règles de téléportation sur votre terrain" width="140"> <combo_box.item label="Bloqué" name="Blocked"/> <combo_box.item label="Lieu d'arrivée fixe" name="LandingPoint"/> <combo_box.item label="Lieu d'arrivée libre" name="Anywhere"/> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml index 76f3319525..ed1107f5e6 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml @@ -56,4 +56,27 @@ <radio_item label="Plusieurs fenêtres" name="radio" value="0"/> <radio_item label="Onglets" name="radio2" value="1"/> </radio_group> + <check_box label="Traduire Chat" name="translate_chat_checkbox" /> + <text name="translate_language_text"> + Langue de chat : + </text> + <combo_box name="translate_language_combobox"> + <combo_box.item name="System Default Language" label="Choix par défaut" /> + <combo_box.item name="English" label="English (Anglais)" /> + <combo_box.item name="Danish" label="Dansk (Danois)" /> + <combo_box.item name="German" label="Deutsch (Allemand)" /> + <combo_box.item name="Spanish" label="Español (Espagnol)" /> + <combo_box.item name="French" label="Français" /> + <combo_box.item name="Italian" label="Italiano (Italien)" /> + <combo_box.item name="Hungarian" label="Magyar (Hongrois)" /> + <combo_box.item name="Dutch" label="Nederlands (Néerlandais)" /> + <combo_box.item name="Polish" label="Polski (Polonais)" /> + <combo_box.item name="Portugese" label="Português (Portugais)" /> + <combo_box.item name="Russian" label="Русский (Russe)" /> + <combo_box.item name="Turkish" label="Türkçe (Turc)" /> + <combo_box.item name="Ukrainian" label="Українська (Ukrainien)" /> + <combo_box.item name="Chinese" label="中文 (简体) (Chinois)" /> + <combo_box.item name="Japanese" label="日本語 (Japonais)" /> + <combo_box.item name="Korean" label="한국어 (Coréen)" /> + </combo_box> </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 3245132972..20d5f754ce 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml @@ -13,7 +13,7 @@ <combo_box.item label="Italiano (Italien) - Bêta" name="Italian"/> <combo_box.item label="Nederlands (Néerlandais) - Bêta" name="Dutch"/> <combo_box.item label="Polski (Polonais) - Bêta" name="Polish"/> - <combo_box.item label="Portugués (Portugais) - Bêta" name="Portugese"/> + <combo_box.item label="Português (Portugais) - Bêta" name="Portugese"/> <combo_box.item label="日本語 (Japonais) - Bêta" name="(Japanese)"/> </combo_box> <text name="language_textbox2"> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index f221e42e9a..159281f97f 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -1147,6 +1147,9 @@ <string name="InvFolder Favorite"> Favoris </string> + <string name="InvFolder favorite"> + Favoris + </string> <string name="InvFolder Current Outfit"> Tenue actuelle </string> diff --git a/indra/newview/skins/default/xui/it/floater_about_land.xml b/indra/newview/skins/default/xui/it/floater_about_land.xml index af83a38746..d6834fa70a 100644 --- a/indra/newview/skins/default/xui/it/floater_about_land.xml +++ b/indra/newview/skins/default/xui/it/floater_about_land.xml @@ -224,60 +224,60 @@ o suddivisa. <text name="Simulator primitive usage:"> Uso delle primitive: </text> - <text left="214" name="objects_available" width="230"> + <text name="objects_available"> [COUNT] dei [MAX] ([AVAILABLE] dsponibili) </text> - <text name="Primitives parcel supports:" width="200"> + <text name="Primitives parcel supports:"> Oggetti che il terreno supporta: </text> - <text left="214" name="object_contrib_text" width="152"> + <text name="object_contrib_text"> [COUNT] </text> <text name="Primitives on parcel:"> Oggetti sul terreno: </text> - <text left="214" name="total_objects_text" width="48"> + <text name="total_objects_text"> [COUNT] </text> - <text left="14" name="Owned by parcel owner:" width="180"> + <text name="Owned by parcel owner:"> Posseduti dal proprietario: </text> - <text left="214" name="owner_objects_text" width="48"> + <text name="owner_objects_text"> [COUNT] </text> - <button label="Mostra" label_selected="Mostra" name="ShowOwner" right="-135" width="60"/> - <button label="Restituisci" name="ReturnOwner..." right="-10" tool_tip="Restituisci gli oggetti ai loro proprietari." width="119"/> - <text left="14" name="Set to group:" width="180"> + <button label="Mostra" label_selected="Mostra" name="ShowOwner"/> + <button label="Restituisci" name="ReturnOwner..." tool_tip="Restituisci gli oggetti ai loro proprietari."/> + <text name="Set to group:"> Imposta al gruppo: </text> - <text left="214" name="group_objects_text" width="48"> + <text name="group_objects_text"> [COUNT] </text> - <button label="Mostra" label_selected="Mostra" name="ShowGroup" right="-135" width="60"/> - <button label="Restituisci" name="ReturnGroup..." right="-10" tool_tip="Restituisci gli oggetti ai loro proprietari." width="119"/> - <text left="14" name="Owned by others:" width="180"> + <button label="Mostra" label_selected="Mostra" name="ShowGroup"/> + <button label="Restituisci" name="ReturnGroup..." tool_tip="Restituisci gli oggetti ai loro proprietari."/> + <text name="Owned by others:"> Posseduti da altri: </text> - <text left="214" name="other_objects_text" width="48"> + <text name="other_objects_text"> [COUNT] </text> - <button label="Mostra" label_selected="Mostra" name="ShowOther" right="-135" width="60"/> - <button label="Restituisci" name="ReturnOther..." right="-10" tool_tip="Restituisci gli oggetti ai loro proprietari." width="119"/> - <text left="14" name="Selected / sat upon:" width="193"> + <button label="Mostra" label_selected="Mostra" name="ShowOther"/> + <button label="Restituisci" name="ReturnOther..." tool_tip="Restituisci gli oggetti ai loro proprietari."/> + <text name="Selected / sat upon:"> Selezionati / sui quali sei sopra: </text> - <text left="214" name="selected_objects_text" width="48"> + <text name="selected_objects_text"> [COUNT] </text> <text name="Autoreturn"> Restituzione automatica degli oggetti di altri residenti (minuti, 0 per disattivarla): </text> - <line_editor name="clean other time" right="-20"/> - <text name="Object Owners:" width="150"> + <line_editor name="clean other time"/> + <text name="Object Owners:"> Proprietari degli oggetti: </text> - <button label="Aggiorna Elenco" label_selected="Aggiorna Elenco" left="158" name="Refresh List" tool_tip="Refresh Object List"/> - <button label="Restituisci oggetti..." label_selected="Restituisci oggetti..." left="270" name="Return objects..." width="164"/> + <button label="Aggiorna Elenco" label_selected="Aggiorna Elenco" name="Refresh List" tool_tip="Refresh Object List"/> + <button label="Restituisci oggetti..." label_selected="Restituisci oggetti..." name="Return objects..."/> <name_list name="owner list"> <name_list.columns label="Tipo" name="type"/> <name_list.columns label="Nome" name="name"/> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml index fb8ddf607d..d28ed41698 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml @@ -56,4 +56,27 @@ <radio_item label="Finestre separate" name="radio" value="0"/> <radio_item label="Schede" name="radio2" value="1"/> </radio_group> + <check_box label="Traduci Chat" name="translate_chat_checkbox" /> + <text name="translate_language_text" width="110"> + Chat Lingua: + </text> + <combo_box name="translate_language_combobox" width="146"> + <combo_box.item name="System Default Language" label="Default di sistema" /> + <combo_box.item name="English" label="English" /> + <combo_box.item name="Danish" label="Dansk (Danese)" /> + <combo_box.item name="German" label="Deutsch (Tedesco)" /> + <combo_box.item name="Spanish" label="Español (Spagnolo)" /> + <combo_box.item name="French" label="Français (Francese)" /> + <combo_box.item name="Italian" label="Italiano" /> + <combo_box.item name="Hungarian" label="Magyar (Ungherese)" /> + <combo_box.item name="Dutch" label="Nederlands (Olandese)" /> + <combo_box.item name="Polish" label="Polski (Polacco)" /> + <combo_box.item name="Portugese" label="Português (Portoghese)" /> + <combo_box.item name="Russian" label="Русский (Russo)" /> + <combo_box.item name="Turkish" label="Türkçe (Turco)" /> + <combo_box.item name="Ukrainian" label="Українська (Ukraino)" /> + <combo_box.item name="Chinese" label="中文 (简体) (Cinese)" /> + <combo_box.item name="Japanese" label="日本語 (Giapponese)" /> + <combo_box.item name="Korean" label="한국어 (Coreano)" /> + </combo_box> </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 e8c826609c..60c4ed5211 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_general.xml @@ -13,7 +13,7 @@ <combo_box.item label="Italiano - Beta" name="Italian"/> <combo_box.item label="Nederlands (Olandese) - Beta" name="Dutch"/> <combo_box.item label="Polski (Polacco) - Beta" name="Polish"/> - <combo_box.item label="Portugués (Portoghese) - Beta" name="Portugese"/> + <combo_box.item label="Português (Portoghese) - Beta" name="Portugese"/> <combo_box.item label="日本語 (Giapponese) - Beta" name="(Japanese)"/> </combo_box> <text name="language_textbox2"> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index fb479b4653..fa465ee9c2 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -1126,6 +1126,9 @@ <string name="InvFolder Favorite"> Preferiti </string> + <string name="InvFolder favorite"> + Preferiti + </string> <string name="InvFolder Current Outfit"> Abbigliamento attuale </string> diff --git a/indra/newview/skins/default/xui/ja/floater_about_land.xml b/indra/newview/skins/default/xui/ja/floater_about_land.xml index 2f5065c05f..2de9e781d4 100644 --- a/indra/newview/skins/default/xui/ja/floater_about_land.xml +++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml @@ -109,7 +109,7 @@ <text name="For Sale: Price L$[PRICE]."> 価格: L$ [PRICE] (L$ [PRICE_PER_SQM] / 平方メートル) </text> - <button label="土地を売る" label_selected="土地を販売..." name="Sell Land..." width="100"/> + <button label="土地を売る" label_selected="土地を販売..." name="Sell Land..."/> <text name="For sale to"> 販売先:[BUYER] </text> @@ -119,7 +119,7 @@ <text name="Selling with no objects in parcel."> オブジェクトは販売しない </text> - <button label="土地販売の取り消し" label_selected="土地販売の取り消し" name="Cancel Land Sale" width="100"/> + <button label="土地販売の取り消し" label_selected="土地販売の取り消し" name="Cancel Land Sale"/> <text name="Claimed:"> 取得日時: </text> @@ -210,72 +210,72 @@ </text> </panel> <panel label="オブジェクト" name="land_objects_panel"> - <panel.string left="200" name="objects_available_text"> + <panel.string name="objects_available_text"> [MAX] の内 [COUNT]([AVAILABLE] 利用可能) </panel.string> - <panel.string left="200" name="objects_deleted_text"> + <panel.string name="objects_deleted_text"> [MAX] の内 [COUNT]([DELETED] を削除) </panel.string> <text name="parcel_object_bonus"> オブジェクトボーナス: [BONUS] </text> - <text name="Simulator primitive usage:" width="500"> + <text name="Simulator primitive usage:"> プリム使用状況: </text> - <text left="200" name="objects_available"> + <text name="objects_available"> [MAX] の内 [COUNT] ([AVAILABLE] 利用可能) </text> - <text name="Primitives parcel supports:" width="200"> + <text name="Primitives parcel supports:"> 区画でサポートされるプリム数: </text> - <text left="200" name="object_contrib_text"> + <text name="object_contrib_text"> [COUNT] </text> <text name="Primitives on parcel:"> 区画上のプリム数: </text> - <text left="200" name="total_objects_text"> + <text name="total_objects_text"> [COUNT] </text> - <text name="Owned by parcel owner:" width="300"> + <text name="Owned by parcel owner:"> 区画所有者の所有物: </text> - <text left="200" name="owner_objects_text"> + <text name="owner_objects_text"> [COUNT] </text> - <button label="表示" label_selected="表示" name="ShowOwner" right="-145"/> - <button label="返却" label_selected="返却..." name="ReturnOwner..." right="-15" tool_tip="オブジェクトを所有者に返却します"/> + <button label="表示" label_selected="表示" name="ShowOwner"/> + <button label="返却" label_selected="返却..." name="ReturnOwner..." tool_tip="オブジェクトを所有者に返却します"/> <text name="Set to group:"> グループに設定: </text> - <text left="200" name="group_objects_text"> + <text name="group_objects_text"> [COUNT] </text> - <button label="表示" label_selected="表示" name="ShowGroup" right="-145"/> - <button label="返却" label_selected="返却..." name="ReturnGroup..." right="-15" tool_tip="オブジェクトを所有者に返却します"/> + <button label="表示" label_selected="表示" name="ShowGroup"/> + <button label="返却" label_selected="返却..." name="ReturnGroup..." tool_tip="オブジェクトを所有者に返却します"/> <text name="Owned by others:"> 他人の所有物: </text> - <text left="200" name="other_objects_text"> + <text name="other_objects_text"> [COUNT] </text> - <button label="表示" label_selected="表示" name="ShowOther" right="-145"/> - <button label="返却" label_selected="返却..." name="ReturnOther..." right="-15" tool_tip="オブジェクトを所有者に返却します"/> + <button label="表示" label_selected="表示" name="ShowOther"/> + <button label="返却" label_selected="返却..." name="ReturnOther..." tool_tip="オブジェクトを所有者に返却します"/> <text name="Selected / sat upon:"> 選択済み・決定済み: </text> - <text left="200" name="selected_objects_text"> + <text name="selected_objects_text"> [COUNT] </text> <text name="Autoreturn"> 他人のオブジェクトを自動返却(分単位、0 で自動返却なし): </text> - <line_editor left_delta="5" name="clean other time" right="-80"/> - <text name="Object Owners:" width="150"> + <line_editor left_delta="5" name="clean other time"/> + <text name="Object Owners:"> オブジェクトの所有者: </text> - <button label="リスト更新" label_selected="リスト更新" left="146" name="Refresh List" tool_tip="オブジェクトのリストを更新します"/> - <button label="オブジェクトを返却する" label_selected="オブジェクトの返却..." left="256" name="Return objects..."/> + <button label="リスト更新" label_selected="リスト更新" name="Refresh List" tool_tip="オブジェクトのリストを更新します"/> + <button label="オブジェクトを返却する" label_selected="オブジェクトの返却..." name="Return objects..."/> <name_list label="カウント" name="owner list"> <name_list.columns label="タイプ" name="type"/> <name_list.columns name="online_status"/> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml index 86f880de09..4082f71a76 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml @@ -56,4 +56,27 @@ <radio_item label="別々のウィンドウ" name="radio" value="0"/> <radio_item label="タブ" name="radio2" value="1"/> </radio_group> + <check_box label="翻訳チャット" name="translate_chat_checkbox" /> + <text name="translate_language_text"> + チャット言語: + </text> + <combo_box name="translate_language_combobox"> + <combo_box.item name="System Default Language" label="システム・デフォルト" /> + <combo_box.item name="English" label="English (英語)" /> + <combo_box.item name="Danish" label="Dansk (デンマーク語)" /> + <combo_box.item name="German" label="Deutsch (ドイツ語)" /> + <combo_box.item name="Spanish" label="Español (スペイン語)" /> + <combo_box.item name="French" label="Français (フランス語)" /> + <combo_box.item name="Italian" label="Italiano (イタリア語)" /> + <combo_box.item name="Hungarian" label="Magyar (ハンガリー語)" /> + <combo_box.item name="Dutch" label="Nederlands (オランダ語)" /> + <combo_box.item name="Polish" label="Polski (ポーランド語)" /> + <combo_box.item name="Portugese" label="Português (ポルトガル語)" /> + <combo_box.item name="Russian" label="Русский (ロシア語)" /> + <combo_box.item name="Turkish" label="Türkçe (トルコ語)" /> + <combo_box.item name="Ukrainian" label="Українська (ウクライナ語)" /> + <combo_box.item name="Chinese" label="中文 (简体) (中国語)" /> + <combo_box.item name="Japanese" label="日本語" /> + <combo_box.item name="Korean" label="한국어 (韓国語)" /> + </combo_box> </panel> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index b68b68a4f8..dd59065a9d 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -1147,6 +1147,9 @@ <string name="InvFolder Favorite"> お気に入り </string> + <string name="InvFolder favorite"> + お気に入り + </string> <string name="InvFolder Current Outfit"> 着用中のアウトフィット </string> diff --git a/indra/newview/skins/default/xui/nl/floater_about_land.xml b/indra/newview/skins/default/xui/nl/floater_about_land.xml index 7b8f1b42ab..4271ad5b82 100644 --- a/indra/newview/skins/default/xui/nl/floater_about_land.xml +++ b/indra/newview/skins/default/xui/nl/floater_about_land.xml @@ -147,31 +147,31 @@ <text name="region_name_lbl"> Naam: </text> - <text name="region_name_text" left="114"> + <text name="region_name_text"> leyla </text> <text name="region_landtype_lbl"> Type: </text> - <text name="region_landtype_text" left="114"> + <text name="region_landtype_text"> Mainland / Homestead </text> <text name="region_maturity_lbl"> Inhoudscategorie: </text> - <text name="region_maturity_text" left="114"> + <text name="region_maturity_text"> Adult </text> <text name="resellable_lbl"> Doorverkopen: </text> - <text name="resellable_clause" left="114"> + <text name="resellable_clause"> Land in deze regio mag niet worden doorverkocht. </text> <text name="changeable_lbl"> Opsplitsen: </text> - <text name="changeable_clause" left="114" width="340"> + <text name="changeable_clause"> Land in deze regio mag niet worden samengevoegd/opgesplitst. </text> <panel.string name="can_resell"> @@ -196,7 +196,7 @@ of opgedeeld. <text name="Simulator primitive usage:"> Simulator primitieven gebruik: </text> - <text name="objects_available" left="214" width="230"> + <text name="objects_available"> [COUNT] van [MAX] ([AVAILABLE] beschikbaar) </text> <panel.string name="objects_available_text"> @@ -205,59 +205,59 @@ of opgedeeld. <panel.string name="objects_deleted_text"> [COUNT] van [MAX] ([DELETED] zullen worden verwijderd) </panel.string> - <text name="Primitives parcel supports:" width="200"> + <text name="Primitives parcel supports:"> Primitieven ondersteund door perceel: </text> - <text name="object_contrib_text" left="214" width="152"> + <text name="object_contrib_text"> [COUNT] </text> <text name="Primitives on parcel:"> Primitieven op perceel: </text> - <text name="total_objects_text" left="214" width="48"> + <text name="total_objects_text" > [COUNT] </text> - <text name="Owned by parcel owner:" left="14" width="180" > + <text name="Owned by parcel owner:" > Eigendom van perceeleigenaar: </text> - <text name="owner_objects_text" left="214" width="48"> + <text name="owner_objects_text" > [COUNT] </text> - <button label="Toon" label_selected="Toon" name="ShowOwner" right="-135" width="60"/> - <button label="Retourneren" name="ReturnOwner..." tool_tip="Retourneer objecten naar hun eigenaren." right="-10" width="119"/> - <text name="Set to group:" left="14" width="180"> + <button label="Toon" label_selected="Toon" name="ShowOwner"/> + <button label="Retourneren" name="ReturnOwner..." tool_tip="Retourneer objecten naar hun eigenaren."/> + <text name="Set to group:" > Groep toewijzen: </text> - <text name="group_objects_text" left="214" width="48"> + <text name="group_objects_text" > [COUNT] </text> - <button label="Toon" label_selected="Toon" name="ShowGroup" right="-135" width="60"/> - <button label="Retourneren" name="ReturnGroup..." tool_tip="Retourneer objecten naar hun eigenaren." right="-10" width="119"/> - <text name="Owned by others:" left="14" width="128"> + <button label="Toon" label_selected="Toon" name="ShowGroup"/> + <button label="Retourneren" name="ReturnGroup..." tool_tip="Retourneer objecten naar hun eigenaren."/> + <text name="Owned by others:"> Eigendom van anderen: </text> - <text name="other_objects_text" left="214" width="48"> + <text name="other_objects_text" > [COUNT] </text> - <button label="Toon" label_selected="Toon" name="ShowOther" right="-135" width="60"/> - <button label="Retourneren" name="ReturnOther..." tool_tip="Retourneer objecten naar hun eigenaren." right="-10" width="119"/> - <text name="Selected / sat upon:" left="14" width="193"> + <button label="Toon" label_selected="Toon" name="ShowOther"/> + <button label="Retourneren" name="ReturnOther..." tool_tip="Retourneer objecten naar hun eigenaren."/> + <text name="Selected / sat upon:"> Geselecteerd/Er op gezeten </text> - <text name="selected_objects_text" left="214" width="48"> + <text name="selected_objects_text" > [COUNT] </text> - <text name="Autoreturn" left="4" width="412" height="32" bottom="-196"> + <text name="Autoreturn"> Objecten van andere inwoners automatisch retourneren (minuten): (0 om uit te schakelen) </text> - <line_editor name="clean other time" right="-50" bottom="-179"/> - <text name="Object Owners:" bottom="-213"> + <line_editor name="clean other time"/> + <text name="Object Owners:"> Objecteigenaren: </text> - <button label="Ververs lijst" label_selected="Ververs lijst" name="Refresh List" bottom="-213"/> - <button label="Retourneer objecten" name="Return objects..." width="164" bottom="-213"/> - <name_list name="owner list" height="104"> + <button label="Ververs lijst" label_selected="Ververs lijst" name="Refresh List"/> + <button label="Retourneer objecten" name="Return objects..."/> + <name_list name="owner list"> <column label="Type" name="type"/> <column label="Naam" name="name"/> <column label="Aantal" name="count"/> @@ -271,20 +271,20 @@ of opgedeeld. <check_box label="Terrein bewerken" name="edit land check" tool_tip="Indien aangevinkt, kan iedereen uw terrein bewerken. Het is het beste om dit uit te laten staan, omdat u zelf altijd uw eigen land kunt bewerken."/> <check_box label="Maak landmarkering" name="check landmark"/> <check_box label="Vliegen" name="check fly" tool_tip="Indien aangevinkt, kunnen inwoners op uw land vliegen. Indien niet aangevinkt, kunnen ze alleen het land binnenvliegen of eroverheen vliegen."/> - <text name="allow_label2" left="162"> + <text name="allow_label2"> Maak objecten: </text> - <check_box label="Alle inwoners" name="edit objects check" left="275"/> + <check_box label="Alle inwoners" name="edit objects check"/> <check_box label="Groep" name="edit group objects check"/> - <text name="allow_label3" left="162"> + <text name="allow_label3"> Objecten binnenlaten: </text> - <check_box label="Alle inwoners" name="all object entry check" left="275"/> + <check_box label="Alle inwoners" name="all object entry check"/> <check_box label="Groep" name="group object entry check"/> - <text name="allow_label4" left="162"> + <text name="allow_label4"> Scripts uitvoeren: </text> - <check_box label="Alle inwoners" name="check other scripts" left="275"/> + <check_box label="Alle inwoners" name="check other scripts"/> <check_box label="Groep" name="check group scripts"/> <text name="land_options_label"> Landopties: @@ -379,8 +379,8 @@ of opgedeeld. <panel.string name="landing_point_none"> (none) </panel.string> - <button width="70" label="Instellen" label_selected="Instellen" name="Set" tool_tip="Stelt het landingspunt in waar bezoekers arriveren. Wordt ingesteld op uw avatar's positie binnen dit perceel."/> - <button width="80" left="311" label="Opschonen" label_selected="Opschonen" name="Clear" tool_tip="Landingspunt leegmaken"/> + <button label="Instellen" label_selected="Instellen" name="Set" tool_tip="Stelt het landingspunt in waar bezoekers arriveren. Wordt ingesteld op uw avatar's positie binnen dit perceel."/> + <button label="Opschonen" label_selected="Opschonen" name="Clear" tool_tip="Landingspunt leegmaken"/> <text name="Teleport Routing: "> Teleport routering: </text> @@ -473,8 +473,8 @@ hebt geklikt.) <combo_box.item name="Group" label="Groep" /> </combo_box> - <spinner label="Prijs in L$:" name="PriceSpin" label_width="168" width="228" /> - <spinner label="Toegangsuren" name="HoursSpin" label_width="168" width="228" /> + <spinner label="Prijs in L$:" name="PriceSpin" label_width="168" /> + <spinner label="Toegangsuren" name="HoursSpin" label_width="168" /> <text label="Altijd toestaan" name="AllowedText"> Toegestane inwoners </text> diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_general.xml b/indra/newview/skins/default/xui/nl/panel_preferences_general.xml index 9d9010a349..7be570b27f 100644 --- a/indra/newview/skins/default/xui/nl/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/nl/panel_preferences_general.xml @@ -78,7 +78,7 @@ <combo_box.item name="Hungarian" label="Magyar (Hongaars) - Bèta"/> <combo_box.item name="Dutch" label="Nederlands - Bèta"/> <combo_box.item name="Polish" label="Polski (Pools) - Bèta"/> - <combo_box.item name="Portugese" label="Portugués (Portugees) - Bèta"/> + <combo_box.item name="Portugese" label="Português (Portugees) - Bèta"/> <combo_box.item name="Russian" label="Русский (Russisch) - Bèta"/> <combo_box.item name="Turkish" label="Türkçe (Turks) - Bèta"/> <combo_box.item name="Ukrainian" label="Українська (Oekraïens) - Bèta"/> diff --git a/indra/newview/skins/default/xui/nl/strings.xml b/indra/newview/skins/default/xui/nl/strings.xml index 25071b5460..1ee26c3f24 100644 --- a/indra/newview/skins/default/xui/nl/strings.xml +++ b/indra/newview/skins/default/xui/nl/strings.xml @@ -912,6 +912,9 @@ <string name="InvFolder Favorite"> Favoriten </string> + <string name="InvFolder favorite"> + Favoriten + </string> <string name="InvFolder Current Outfit"> Huidige Uitrusting </string> diff --git a/indra/newview/skins/default/xui/pl/floater_about_land.xml b/indra/newview/skins/default/xui/pl/floater_about_land.xml index c68e1c72ce..0974518a1f 100644 --- a/indra/newview/skins/default/xui/pl/floater_about_land.xml +++ b/indra/newview/skins/default/xui/pl/floater_about_land.xml @@ -223,7 +223,7 @@ Idź do Świat > O Posiadłości albo wybierz inną posiadłość żeby pokaz <text name="Simulator primitive usage:"> Ilość używanych primów: </text> - <text name="objects_available" width="230"> + <text name="objects_available"> [COUNT] z [MAX] ([AVAILABLE] jest dostępne) </text> <text name="Primitives parcel supports:"> @@ -271,11 +271,11 @@ Idź do Świat > O Posiadłości albo wybierz inną posiadłość żeby pokaz <text name="Autoreturn"> Zwracaj obiekty innych Rezydentów (minut, 0 = wyłącz): </text> - <text name="Object Owners:" width="108"> + <text name="Object Owners:"> Właściciel obiektów: </text> - <button label="Odśwież listę" label_selected="Odśwież listę" left="112" name="Refresh List" tool_tip="Refresh Object List"/> - <button label="Zwróć obiekty..." label_selected="Zwróć obiekty..." left="224" name="Return objects..."/> + <button label="Odśwież listę" label_selected="Odśwież listę" name="Refresh List" tool_tip="Refresh Object List"/> + <button label="Zwróć obiekty..." label_selected="Zwróć obiekty..." name="Return objects..."/> <name_list name="owner list"> <name_list.columns label="Typ" name="type"/> <name_list.columns name="online_status"/> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml index 5805df402c..e980d71ce4 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml @@ -56,4 +56,27 @@ <radio_item label="Osobne okna" name="radio" value="0"/> <radio_item label="Etykiety" name="radio2" value="1"/> </radio_group> + <check_box label="Przetłumacz Czat" name="translate_chat_checkbox" /> + <text name="translate_language_text"> + Czat Język: + </text> + <combo_box name="translate_language_combobox"> + <combo_box.item name="System Default Language" label="Domyślny" /> + <combo_box.item name="English" label="English (Angielski)" /> + <combo_box.item name="Danish" label="Dansk (Duński)" /> + <combo_box.item name="German" label="Deutsch (Niemiecki)" /> + <combo_box.item name="Spanish" label="Español (Hiszpański)" /> + <combo_box.item name="French" label="Français (Francuski)" /> + <combo_box.item name="Italian" label="Italiano (Włoski)" /> + <combo_box.item name="Hungarian" label="Magyar (Węgierski)" /> + <combo_box.item name="Dutch" label="Nederlands (Niderlandzki)" /> + <combo_box.item name="Polish" label="Polski" /> + <combo_box.item name="Portugese" label="Português (Portugalski)" /> + <combo_box.item name="Russian" label="Русский (Rosyjski)" /> + <combo_box.item name="Turkish" label="Türkçe (Turecki)" /> + <combo_box.item name="Ukrainian" label="Українська (Ukraiński)" /> + <combo_box.item name="Chinese" label="中文 (简体) (Chiński)" /> + <combo_box.item name="Japanese" label="日本語 (Japoński)" /> + <combo_box.item name="Korean" label="한국어 (Koreański)" /> + </combo_box> </panel> 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 69686bcdbc..65ea349aec 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml @@ -13,7 +13,7 @@ <combo_box.item label="Italiano (Włoski) - Beta" name="Italian"/> <combo_box.item label="Nederlands (Niderlandzki) - Beta" name="Dutch"/> <combo_box.item label="Polski - Beta" name="Polish"/> - <combo_box.item label="Portugués (Portugalski) - Beta" name="Portugese"/> + <combo_box.item label="Português (Portugalski) - Beta" name="Portugese"/> <combo_box.item label="日本語 (Japoński) - Beta" name="(Japanese)"/> </combo_box> <text name="language_textbox2"> diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index e2689720bf..f90e357373 100644 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml @@ -1114,6 +1114,12 @@ <string name="InvFolder Gestures"> Gesturki </string> + <string name="InvFolder Favorite"> + Ulubione + </string> + <string name="InvFolder favorite"> + Ulubione + </string> <string name="InvFolder Current Outfit"> Obecny strój </string> diff --git a/indra/newview/skins/default/xui/pt/floater_about_land.xml b/indra/newview/skins/default/xui/pt/floater_about_land.xml index 1767a31496..a6b255d432 100644 --- a/indra/newview/skins/default/xui/pt/floater_about_land.xml +++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml @@ -221,60 +221,60 @@ Vá para o menu Mundo > Sobre o terreno ou selecione outro lote para mostrar <text name="Simulator primitive usage:"> Uso de prims: </text> - <text left="214" name="objects_available" width="230"> + <text name="objects_available"> [COUNT] de [MAX] ([AVAILABLE] disponíveis) </text> - <text name="Primitives parcel supports:" width="200"> + <text name="Primitives parcel supports:"> Prims suportados pelo lote: </text> - <text left="214" name="object_contrib_text" width="152"> + <text name="object_contrib_text"> [COUNT] </text> <text name="Primitives on parcel:"> Prims no lote: </text> - <text left="214" name="total_objects_text" width="48"> + <text name="total_objects_text"> [COUNT] </text> - <text left="14" name="Owned by parcel owner:" width="180"> + <text name="Owned by parcel owner:"> Pertencentes ao dono do lote: </text> - <text left="214" name="owner_objects_text" width="48"> + <text name="owner_objects_text"> [COUNT] </text> - <button label="Mostrar" label_selected="Mostrar" name="ShowOwner" right="-135" width="60"/> - <button label="Devolver" name="ReturnOwner..." right="-10" tool_tip="Devolver objetos a seus donos." width="119"/> - <text left="14" name="Set to group:" width="180"> + <button label="Mostrar" label_selected="Mostrar" name="ShowOwner"/> + <button label="Devolver" name="ReturnOwner..." tool_tip="Devolver objetos a seus donos."/> + <text name="Set to group:"> Reservado para o grupo: </text> - <text left="214" name="group_objects_text" width="48"> + <text name="group_objects_text"> [COUNT] </text> - <button label="Mostrar" label_selected="Mostrar" name="ShowGroup" right="-135" width="60"/> - <button label="Devolver" name="ReturnGroup..." right="-10" tool_tip="Devolver objetos a seus donos." width="119"/> - <text left="14" name="Owned by others:" width="128"> + <button label="Mostrar" label_selected="Mostrar" name="ShowGroup"/> + <button label="Devolver" name="ReturnGroup..." tool_tip="Devolver objetos a seus donos."/> + <text name="Owned by others:"> Propriedade de outros: </text> - <text left="214" name="other_objects_text" width="48"> + <text name="other_objects_text"> [COUNT] </text> - <button label="Mostrar" label_selected="Mostrar" name="ShowOther" right="-135" width="60"/> - <button label="Devolver" name="ReturnOther..." right="-10" tool_tip="Devolver objetos a seus donos." width="119"/> - <text left="14" name="Selected / sat upon:" width="193"> + <button label="Mostrar" label_selected="Mostrar" name="ShowOther"/> + <button label="Devolver" name="ReturnOther..." tool_tip="Devolver objetos a seus donos."/> + <text name="Selected / sat upon:"> Selecionado/Sentado: </text> - <text left="214" name="selected_objects_text" width="48"> + <text name="selected_objects_text"> [COUNT] </text> <text name="Autoreturn"> Devolver objetos de outros residentes (p/ desligar tecle 0) </text> - <line_editor name="clean other time" right="-10"/> + <line_editor name="clean other time"/> <text name="Object Owners:"> Donos dos objetos: </text> - <button label="Atualizar lista" label_selected="Atualizar lista" left="118" name="Refresh List" tool_tip="Refresh Object List"/> - <button label="Devolver objetos..." label_selected="Devolver objetos..." left="230" name="Return objects..."/> + <button label="Atualizar lista" label_selected="Atualizar lista" name="Refresh List" tool_tip="Refresh Object List"/> + <button label="Devolver objetos..." label_selected="Devolver objetos..." name="Return objects..."/> <name_list name="owner list"> <name_list.columns label="Tipo" name="type"/> <name_list.columns label="Nome" name="name"/> @@ -340,7 +340,7 @@ Apenas lotes maiores podem ser listados na busca. <check_box label="Seguro (sem danos)" name="check safe" tool_tip="Se ativado, ajusta o terreno para Seguro, impedindo lutas com danos. Se não ativado, lutas com danos é habilitado."/> <check_box label="Proibido empurrar" name="PushRestrictCheck" tool_tip="Evita scripts que empurram. Ativar essa opção ajuda a prevenir comportamentos desordeiros no seu terreno."/> <check_box label="Mostrar terreno nos resultados de busca (L$30/semana)" name="ShowDirectoryCheck" tool_tip="Permitir que as pessoas vejam este terreno nos resultados de busca"/> - <combo_box left="265" name="land category with adult" width="155"> + <combo_box name="land category with adult"> <combo_box.item label="Qualquer categoria" name="item0"/> <combo_box.item label="Locação Linden" name="item1"/> <combo_box.item label="Adulto" name="item2"/> @@ -355,7 +355,7 @@ Apenas lotes maiores podem ser listados na busca. <combo_box.item label="Compras" name="item11"/> <combo_box.item label="Outros" name="item12"/> </combo_box> - <combo_box left="265" name="land category" width="155"> + <combo_box name="land category"> <combo_box.item label="Qualquer categoria" name="item0"/> <combo_box.item label="Locação Linden" name="item1"/> <combo_box.item label="Artes e cultura" name="item3"/> @@ -382,7 +382,7 @@ Apenas lotes maiores podem ser listados na busca. <text name="Teleport Routing: "> Rota de teletransporte: </text> - <combo_box left="140" name="landing type" tool_tip="Rota de Teletransporte -- Selecione como tratar os teletransportes no seu lote." width="160"> + <combo_box name="landing type" tool_tip="Rota de Teletransporte -- Selecione como tratar os teletransportes no seu lote." width="160"> <combo_box.item label="Bloqueado" name="Blocked"/> <combo_box.item label="Ponto de aterrissagem" name="LandingPoint"/> <combo_box.item label="Qualquer lugar" name="Anywhere"/> diff --git a/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml index 306487939e..9560a3b418 100644 --- a/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml @@ -52,8 +52,8 @@ Duração do Ciclo: </text> <spinner label="Hora" name="WLLengthOfDayHour"/> - <spinner label="Minuto" name="WLLengthOfDayMin"/> - <spinner label="Segundo" name="WLLengthOfDaySec"/> + <spinner label="Min." name="WLLengthOfDayMin"/> + <spinner label="Seg." name="WLLengthOfDaySec"/> <text name="DayCycleText3"> Visualizar </text> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml index 02b0ef35fe..1ec674e2e2 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml @@ -56,4 +56,27 @@ <radio_item label="Janelas separadas" name="radio" value="0"/> <radio_item label="Guias" name="radio2" value="1"/> </radio_group> + <check_box label="Traduzir Chat" name="translate_chat_checkbox" /> + <text name="translate_language_text"> + Chat Língua: + </text> + <combo_box name="translate_language_combobox"> + <combo_box.item name="System Default Language" label="Padrão do Sistema" /> + <combo_box.item name="English" label="English (Inglês)" /> + <combo_box.item name="Danish" label="Dansk (Dinamarquês)" /> + <combo_box.item name="German" label="Deutsch (Alemão)" /> + <combo_box.item name="Spanish" label="Español (Espanhol)" /> + <combo_box.item name="French" label="Français (Francês)" /> + <combo_box.item name="Italian" label="Italiano" /> + <combo_box.item name="Hungarian" label="Magyar (Húngaro)" /> + <combo_box.item name="Dutch" label="Nederlands (Holandês)" /> + <combo_box.item name="Polish" label="Polski (Polonês)" /> + <combo_box.item name="Portugese" label="Português" /> + <combo_box.item name="Russian" label="Русский (Russo)" /> + <combo_box.item name="Turkish" label="Türkçe (Turco)" /> + <combo_box.item name="Ukrainian" label="Українська (Ucraniano)" /> + <combo_box.item name="Chinese" label="中文 (简体) (Chinês)" /> + <combo_box.item name="Japanese" label="日本語 (Japonês)" /> + <combo_box.item name="Korean" label="한국어 (Coreano)" /> + </combo_box> </panel> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 4bf2bda248..b6ecc9347b 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -1120,6 +1120,9 @@ <string name="InvFolder Favorite"> Favoritos </string> + <string name="InvFolder favorite"> + Favoritos + </string> <string name="InvFolder Current Outfit"> Look atual </string> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index c447a977f0..949fa3cc1c 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -310,6 +310,7 @@ class WindowsManifest(ViewerManifest): self.path(src="licenses-win32.txt", dst="licenses.txt") self.path("featuretable.txt") + self.path("featuretable_xp.txt") # For use in crash reporting (generates minidumps) self.path("dbghelp.dll") @@ -922,6 +923,7 @@ class Linux_i686Manifest(LinuxManifest): self.path("libcrypto.so.0.9.7") self.path("libexpat.so.1") self.path("libssl.so.0.9.7") + self.path("libuuid.so.1") self.path("libSDL-1.2.so.0") self.path("libELFIO.so") self.path("libopenjpeg.so.1.3.0", "libopenjpeg.so.1.3") |